atmel-sdramc.c (1770B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Atmel (Multi-port DDR-)SDRAM Controller driver 4 * 5 * Author: Alexandre Belloni <alexandre.belloni@free-electrons.com> 6 * 7 * Copyright (C) 2014 Atmel 8 */ 9 10#include <linux/clk.h> 11#include <linux/err.h> 12#include <linux/kernel.h> 13#include <linux/init.h> 14#include <linux/of_platform.h> 15#include <linux/platform_device.h> 16 17struct at91_ramc_caps { 18 bool has_ddrck; 19 bool has_mpddr_clk; 20}; 21 22static const struct at91_ramc_caps at91rm9200_caps = { }; 23 24static const struct at91_ramc_caps at91sam9g45_caps = { 25 .has_ddrck = 1, 26 .has_mpddr_clk = 0, 27}; 28 29static const struct at91_ramc_caps sama5d3_caps = { 30 .has_ddrck = 1, 31 .has_mpddr_clk = 1, 32}; 33 34static 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}; 41 42static int atmel_ramc_probe(struct platform_device *pdev) 43{ 44 const struct at91_ramc_caps *caps; 45 struct clk *clk; 46 47 caps = of_device_get_match_data(&pdev->dev); 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 68static struct platform_driver atmel_ramc_driver = { 69 .probe = atmel_ramc_probe, 70 .driver = { 71 .name = "atmel-ramc", 72 .of_match_table = atmel_ramc_of_match, 73 }, 74}; 75 76builtin_platform_driver(atmel_ramc_driver);