atmel-sdramc.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. #include <linux/clk.h>
  10. #include <linux/err.h>
  11. #include <linux/kernel.h>
  12. #include <linux/init.h>
  13. #include <linux/of_platform.h>
  14. #include <linux/platform_device.h>
  15. struct at91_ramc_caps {
  16. bool has_ddrck;
  17. bool has_mpddr_clk;
  18. };
  19. static const struct at91_ramc_caps at91rm9200_caps = { };
  20. static const struct at91_ramc_caps at91sam9g45_caps = {
  21. .has_ddrck = 1,
  22. .has_mpddr_clk = 0,
  23. };
  24. static const struct at91_ramc_caps sama5d3_caps = {
  25. .has_ddrck = 1,
  26. .has_mpddr_clk = 1,
  27. };
  28. static const struct of_device_id atmel_ramc_of_match[] = {
  29. { .compatible = "atmel,at91rm9200-sdramc", .data = &at91rm9200_caps, },
  30. { .compatible = "atmel,at91sam9260-sdramc", .data = &at91rm9200_caps, },
  31. { .compatible = "atmel,at91sam9g45-ddramc", .data = &at91sam9g45_caps, },
  32. { .compatible = "atmel,sama5d3-ddramc", .data = &sama5d3_caps, },
  33. {},
  34. };
  35. static int atmel_ramc_probe(struct platform_device *pdev)
  36. {
  37. const struct at91_ramc_caps *caps;
  38. struct clk *clk;
  39. caps = of_device_get_match_data(&pdev->dev);
  40. if (caps->has_ddrck) {
  41. clk = devm_clk_get(&pdev->dev, "ddrck");
  42. if (IS_ERR(clk))
  43. return PTR_ERR(clk);
  44. clk_prepare_enable(clk);
  45. }
  46. if (caps->has_mpddr_clk) {
  47. clk = devm_clk_get(&pdev->dev, "mpddr");
  48. if (IS_ERR(clk)) {
  49. pr_err("AT91 RAMC: couldn't get mpddr clock\n");
  50. return PTR_ERR(clk);
  51. }
  52. clk_prepare_enable(clk);
  53. }
  54. return 0;
  55. }
  56. static struct platform_driver atmel_ramc_driver = {
  57. .probe = atmel_ramc_probe,
  58. .driver = {
  59. .name = "atmel-ramc",
  60. .of_match_table = atmel_ramc_of_match,
  61. },
  62. };
  63. builtin_platform_driver(atmel_ramc_driver);