Commit | Line | Data |
---|---|---|
2b72c9e3 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
e81b6abe AB |
2 | /* |
3 | * Atmel (Multi-port DDR-)SDRAM Controller driver | |
4 | * | |
563b41c9 PG |
5 | * Author: Alexandre Belloni <alexandre.belloni@free-electrons.com> |
6 | * | |
e81b6abe | 7 | * Copyright (C) 2014 Atmel |
e81b6abe AB |
8 | */ |
9 | ||
10 | #include <linux/clk.h> | |
11 | #include <linux/err.h> | |
12 | #include <linux/kernel.h> | |
563b41c9 | 13 | #include <linux/init.h> |
e81b6abe AB |
14 | #include <linux/of_platform.h> |
15 | #include <linux/platform_device.h> | |
16 | ||
17 | struct at91_ramc_caps { | |
18 | bool has_ddrck; | |
19 | bool has_mpddr_clk; | |
20 | }; | |
21 | ||
22 | static const struct at91_ramc_caps at91rm9200_caps = { }; | |
23 | ||
24 | static const struct at91_ramc_caps at91sam9g45_caps = { | |
25 | .has_ddrck = 1, | |
26 | .has_mpddr_clk = 0, | |
27 | }; | |
28 | ||
29 | static const struct at91_ramc_caps sama5d3_caps = { | |
30 | .has_ddrck = 1, | |
31 | .has_mpddr_clk = 1, | |
32 | }; | |
33 | ||
34 | static const struct of_device_id atmel_ramc_of_match[] = { | |
35 | { .compatible = "atmel,at91rm9200-sdramc", .data = &at91rm9200_caps, }, | |
36 | { .compatible = "atmel,at91sam9260-sdramc", .data = &at91rm9200_caps, }, | |
37 | { .compatible = "atmel,at91sam9g45-ddramc", .data = &at91sam9g45_caps, }, | |
38 | { .compatible = "atmel,sama5d3-ddramc", .data = &sama5d3_caps, }, | |
39 | {}, | |
40 | }; | |
e81b6abe AB |
41 | |
42 | static int atmel_ramc_probe(struct platform_device *pdev) | |
43 | { | |
e81b6abe AB |
44 | const struct at91_ramc_caps *caps; |
45 | struct clk *clk; | |
46 | ||
7922118f | 47 | caps = of_device_get_match_data(&pdev->dev); |
e81b6abe AB |
48 | |
49 | if (caps->has_ddrck) { | |
50 | clk = devm_clk_get(&pdev->dev, "ddrck"); | |
51 | if (IS_ERR(clk)) | |
52 | return PTR_ERR(clk); | |
53 | clk_prepare_enable(clk); | |
54 | } | |
55 | ||
56 | if (caps->has_mpddr_clk) { | |
57 | clk = devm_clk_get(&pdev->dev, "mpddr"); | |
58 | if (IS_ERR(clk)) { | |
59 | pr_err("AT91 RAMC: couldn't get mpddr clock\n"); | |
60 | return PTR_ERR(clk); | |
61 | } | |
62 | clk_prepare_enable(clk); | |
63 | } | |
64 | ||
65 | return 0; | |
66 | } | |
67 | ||
68 | static struct platform_driver atmel_ramc_driver = { | |
69 | .probe = atmel_ramc_probe, | |
70 | .driver = { | |
71 | .name = "atmel-ramc", | |
e81b6abe AB |
72 | .of_match_table = atmel_ramc_of_match, |
73 | }, | |
74 | }; | |
75 | ||
af692400 | 76 | builtin_platform_driver(atmel_ramc_driver); |