zynqmp_nvmem.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2019 Xilinx, Inc.
  4. */
  5. #include <linux/module.h>
  6. #include <linux/nvmem-provider.h>
  7. #include <linux/of.h>
  8. #include <linux/platform_device.h>
  9. #include <linux/firmware/xlnx-zynqmp.h>
  10. #define SILICON_REVISION_MASK 0xF
  11. struct zynqmp_nvmem_data {
  12. struct device *dev;
  13. struct nvmem_device *nvmem;
  14. };
  15. static int zynqmp_nvmem_read(void *context, unsigned int offset,
  16. void *val, size_t bytes)
  17. {
  18. int ret;
  19. int idcode, version;
  20. struct zynqmp_nvmem_data *priv = context;
  21. ret = zynqmp_pm_get_chipid(&idcode, &version);
  22. if (ret < 0)
  23. return ret;
  24. dev_dbg(priv->dev, "Read chipid val %x %x\n", idcode, version);
  25. *(int *)val = version & SILICON_REVISION_MASK;
  26. return 0;
  27. }
  28. static struct nvmem_config econfig = {
  29. .name = "zynqmp-nvmem",
  30. .owner = THIS_MODULE,
  31. .word_size = 1,
  32. .size = 1,
  33. .read_only = true,
  34. };
  35. static const struct of_device_id zynqmp_nvmem_match[] = {
  36. { .compatible = "xlnx,zynqmp-nvmem-fw", },
  37. { /* sentinel */ },
  38. };
  39. MODULE_DEVICE_TABLE(of, zynqmp_nvmem_match);
  40. static int zynqmp_nvmem_probe(struct platform_device *pdev)
  41. {
  42. struct device *dev = &pdev->dev;
  43. struct zynqmp_nvmem_data *priv;
  44. priv = devm_kzalloc(dev, sizeof(struct zynqmp_nvmem_data), GFP_KERNEL);
  45. if (!priv)
  46. return -ENOMEM;
  47. priv->dev = dev;
  48. econfig.dev = dev;
  49. econfig.reg_read = zynqmp_nvmem_read;
  50. econfig.priv = priv;
  51. priv->nvmem = devm_nvmem_register(dev, &econfig);
  52. return PTR_ERR_OR_ZERO(priv->nvmem);
  53. }
  54. static struct platform_driver zynqmp_nvmem_driver = {
  55. .probe = zynqmp_nvmem_probe,
  56. .driver = {
  57. .name = "zynqmp-nvmem",
  58. .of_match_table = zynqmp_nvmem_match,
  59. },
  60. };
  61. module_platform_driver(zynqmp_nvmem_driver);
  62. MODULE_AUTHOR("Michal Simek <[email protected]>, Nava kishore Manne <[email protected]>");
  63. MODULE_DESCRIPTION("ZynqMP NVMEM driver");
  64. MODULE_LICENSE("GPL");