atmel-sdramc.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Atmel (Multi-port DDR-)SDRAM Controller driver
  4. *
  5. * Author: Alexandre Belloni <[email protected]>
  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_enabled(&pdev->dev, "ddrck");
  42. if (IS_ERR(clk))
  43. return PTR_ERR(clk);
  44. }
  45. if (caps->has_mpddr_clk) {
  46. clk = devm_clk_get_enabled(&pdev->dev, "mpddr");
  47. if (IS_ERR(clk)) {
  48. pr_err("AT91 RAMC: couldn't get mpddr clock\n");
  49. return PTR_ERR(clk);
  50. }
  51. }
  52. return 0;
  53. }
  54. static struct platform_driver atmel_ramc_driver = {
  55. .probe = atmel_ramc_probe,
  56. .driver = {
  57. .name = "atmel-ramc",
  58. .of_match_table = atmel_ramc_of_match,
  59. },
  60. };
  61. builtin_platform_driver(atmel_ramc_driver);