diff options
| author | Alexandre Belloni <alexandre.belloni@free-electrons.com> | 2014-07-08 12:21:12 -0400 |
|---|---|---|
| committer | Maxime Ripard <maxime.ripard@free-electrons.com> | 2014-07-15 05:43:42 -0400 |
| commit | e81b6abebc87ec40a434ada4ca8d1f2aa16cea9d (patch) | |
| tree | e9621fa31ba8e9285641daffa24136d3b5e5fd9f /drivers/memory | |
| parent | 017b5522d5e31a0b2c2f54f566aa8887838bccc7 (diff) | |
memory: add a driver for atmel ram controllers
Atmel SoCs have one or multiple RAM controllers that need one or multiple clocks
to run.
This driver handle those clocks.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Diffstat (limited to 'drivers/memory')
| -rw-r--r-- | drivers/memory/Kconfig | 10 | ||||
| -rw-r--r-- | drivers/memory/Makefile | 1 | ||||
| -rw-r--r-- | drivers/memory/atmel-sdramc.c | 98 |
3 files changed, 109 insertions, 0 deletions
diff --git a/drivers/memory/Kconfig b/drivers/memory/Kconfig index c59e9c96e86d..257061c3c816 100644 --- a/drivers/memory/Kconfig +++ b/drivers/memory/Kconfig | |||
| @@ -7,6 +7,16 @@ menuconfig MEMORY | |||
| 7 | 7 | ||
| 8 | if MEMORY | 8 | if MEMORY |
| 9 | 9 | ||
| 10 | config ATMEL_SDRAMC | ||
| 11 | bool "Atmel (Multi-port DDR-)SDRAM Controller" | ||
| 12 | default y | ||
| 13 | depends on ARCH_AT91 && OF | ||
| 14 | help | ||
| 15 | This driver is for Atmel SDRAM Controller or Atmel Multi-port | ||
| 16 | DDR-SDRAM Controller available on Atmel AT91SAM9 and SAMA5 SoCs. | ||
| 17 | Starting with the at91sam9g45, this controller supports SDR, DDR and | ||
| 18 | LP-DDR memories. | ||
| 19 | |||
| 10 | config TI_AEMIF | 20 | config TI_AEMIF |
| 11 | tristate "Texas Instruments AEMIF driver" | 21 | tristate "Texas Instruments AEMIF driver" |
| 12 | depends on (ARCH_DAVINCI || ARCH_KEYSTONE) && OF | 22 | depends on (ARCH_DAVINCI || ARCH_KEYSTONE) && OF |
diff --git a/drivers/memory/Makefile b/drivers/memory/Makefile index 71160a2b7313..b8637261e1a1 100644 --- a/drivers/memory/Makefile +++ b/drivers/memory/Makefile | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | ifeq ($(CONFIG_DDR),y) | 5 | ifeq ($(CONFIG_DDR),y) |
| 6 | obj-$(CONFIG_OF) += of_memory.o | 6 | obj-$(CONFIG_OF) += of_memory.o |
| 7 | endif | 7 | endif |
| 8 | obj-$(CONFIG_ATMEL_SDRAMC) += atmel-sdramc.o | ||
| 8 | obj-$(CONFIG_TI_AEMIF) += ti-aemif.o | 9 | obj-$(CONFIG_TI_AEMIF) += ti-aemif.o |
| 9 | obj-$(CONFIG_TI_EMIF) += emif.o | 10 | obj-$(CONFIG_TI_EMIF) += emif.o |
| 10 | obj-$(CONFIG_FSL_IFC) += fsl_ifc.o | 11 | obj-$(CONFIG_FSL_IFC) += fsl_ifc.o |
diff --git a/drivers/memory/atmel-sdramc.c b/drivers/memory/atmel-sdramc.c new file mode 100644 index 000000000000..fed04e8efe75 --- /dev/null +++ b/drivers/memory/atmel-sdramc.c | |||
| @@ -0,0 +1,98 @@ | |||
| 1 | /* | ||
| 2 | * Atmel (Multi-port DDR-)SDRAM Controller driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2014 Atmel | ||
| 5 | * | ||
| 6 | * This program is free software: you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation version 2 of the License. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 17 | * | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/clk.h> | ||
| 21 | #include <linux/err.h> | ||
| 22 | #include <linux/kernel.h> | ||
| 23 | #include <linux/module.h> | ||
| 24 | #include <linux/of_platform.h> | ||
| 25 | #include <linux/platform_device.h> | ||
| 26 | |||
| 27 | struct at91_ramc_caps { | ||
| 28 | bool has_ddrck; | ||
| 29 | bool has_mpddr_clk; | ||
| 30 | }; | ||
| 31 | |||
| 32 | static const struct at91_ramc_caps at91rm9200_caps = { }; | ||
| 33 | |||
| 34 | static const struct at91_ramc_caps at91sam9g45_caps = { | ||
| 35 | .has_ddrck = 1, | ||
| 36 | .has_mpddr_clk = 0, | ||
| 37 | }; | ||
| 38 | |||
| 39 | static const struct at91_ramc_caps sama5d3_caps = { | ||
| 40 | .has_ddrck = 1, | ||
| 41 | .has_mpddr_clk = 1, | ||
| 42 | }; | ||
| 43 | |||
| 44 | static const struct of_device_id atmel_ramc_of_match[] = { | ||
| 45 | { .compatible = "atmel,at91rm9200-sdramc", .data = &at91rm9200_caps, }, | ||
| 46 | { .compatible = "atmel,at91sam9260-sdramc", .data = &at91rm9200_caps, }, | ||
| 47 | { .compatible = "atmel,at91sam9g45-ddramc", .data = &at91sam9g45_caps, }, | ||
| 48 | { .compatible = "atmel,sama5d3-ddramc", .data = &sama5d3_caps, }, | ||
| 49 | {}, | ||
| 50 | }; | ||
| 51 | MODULE_DEVICE_TABLE(of, atmel_ramc_of_match); | ||
| 52 | |||
| 53 | static int atmel_ramc_probe(struct platform_device *pdev) | ||
| 54 | { | ||
| 55 | const struct of_device_id *match; | ||
| 56 | const struct at91_ramc_caps *caps; | ||
| 57 | struct clk *clk; | ||
| 58 | |||
| 59 | match = of_match_device(atmel_ramc_of_match, &pdev->dev); | ||
| 60 | caps = match->data; | ||
| 61 | |||
| 62 | if (caps->has_ddrck) { | ||
| 63 | clk = devm_clk_get(&pdev->dev, "ddrck"); | ||
| 64 | if (IS_ERR(clk)) | ||
| 65 | return PTR_ERR(clk); | ||
| 66 | clk_prepare_enable(clk); | ||
| 67 | } | ||
| 68 | |||
| 69 | if (caps->has_mpddr_clk) { | ||
| 70 | clk = devm_clk_get(&pdev->dev, "mpddr"); | ||
| 71 | if (IS_ERR(clk)) { | ||
| 72 | pr_err("AT91 RAMC: couldn't get mpddr clock\n"); | ||
| 73 | return PTR_ERR(clk); | ||
| 74 | } | ||
| 75 | clk_prepare_enable(clk); | ||
| 76 | } | ||
| 77 | |||
| 78 | return 0; | ||
| 79 | } | ||
| 80 | |||
| 81 | static struct platform_driver atmel_ramc_driver = { | ||
| 82 | .probe = atmel_ramc_probe, | ||
| 83 | .driver = { | ||
| 84 | .name = "atmel-ramc", | ||
| 85 | .owner = THIS_MODULE, | ||
| 86 | .of_match_table = atmel_ramc_of_match, | ||
| 87 | }, | ||
| 88 | }; | ||
| 89 | |||
| 90 | static int __init atmel_ramc_init(void) | ||
| 91 | { | ||
| 92 | return platform_driver_register(&atmel_ramc_driver); | ||
| 93 | } | ||
| 94 | module_init(atmel_ramc_init); | ||
| 95 | |||
| 96 | MODULE_LICENSE("GPL v2"); | ||
| 97 | MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@free-electrons.com>"); | ||
| 98 | MODULE_DESCRIPTION("Atmel (Multi-port DDR-)SDRAM Controller"); | ||
