layouts.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * NVMEM layout bus handling
  4. *
  5. * Copyright (C) 2023 Bootlin
  6. * Author: Miquel Raynal <miquel.raynal@bootlin.com
  7. */
  8. #include <linux/device.h>
  9. #include <linux/dma-mapping.h>
  10. #include <linux/nvmem-consumer.h>
  11. #include <linux/nvmem-provider.h>
  12. #include <linux/of.h>
  13. #include <linux/of_device.h>
  14. #include <linux/of_irq.h>
  15. #include "internals.h"
  16. #define to_nvmem_layout_driver(drv) \
  17. (container_of_const((drv), struct nvmem_layout_driver, driver))
  18. #define to_nvmem_layout_device(_dev) \
  19. container_of((_dev), struct nvmem_layout, dev)
  20. static int nvmem_layout_bus_match(struct device *dev, const struct device_driver *drv)
  21. {
  22. return of_driver_match_device(dev, drv);
  23. }
  24. static int nvmem_layout_bus_probe(struct device *dev)
  25. {
  26. struct nvmem_layout_driver *drv = to_nvmem_layout_driver(dev->driver);
  27. struct nvmem_layout *layout = to_nvmem_layout_device(dev);
  28. if (!drv->probe || !drv->remove)
  29. return -EINVAL;
  30. return drv->probe(layout);
  31. }
  32. static void nvmem_layout_bus_remove(struct device *dev)
  33. {
  34. struct nvmem_layout_driver *drv = to_nvmem_layout_driver(dev->driver);
  35. struct nvmem_layout *layout = to_nvmem_layout_device(dev);
  36. return drv->remove(layout);
  37. }
  38. static int nvmem_layout_bus_uevent(const struct device *dev,
  39. struct kobj_uevent_env *env)
  40. {
  41. int ret;
  42. ret = of_device_uevent_modalias(dev, env);
  43. if (ret != ENODEV)
  44. return ret;
  45. return 0;
  46. }
  47. static const struct bus_type nvmem_layout_bus_type = {
  48. .name = "nvmem-layout",
  49. .match = nvmem_layout_bus_match,
  50. .probe = nvmem_layout_bus_probe,
  51. .remove = nvmem_layout_bus_remove,
  52. .uevent = nvmem_layout_bus_uevent,
  53. };
  54. int __nvmem_layout_driver_register(struct nvmem_layout_driver *drv,
  55. struct module *owner)
  56. {
  57. drv->driver.bus = &nvmem_layout_bus_type;
  58. drv->driver.owner = owner;
  59. return driver_register(&drv->driver);
  60. }
  61. EXPORT_SYMBOL_GPL(__nvmem_layout_driver_register);
  62. void nvmem_layout_driver_unregister(struct nvmem_layout_driver *drv)
  63. {
  64. driver_unregister(&drv->driver);
  65. }
  66. EXPORT_SYMBOL_GPL(nvmem_layout_driver_unregister);
  67. static void nvmem_layout_release_device(struct device *dev)
  68. {
  69. struct nvmem_layout *layout = to_nvmem_layout_device(dev);
  70. of_node_put(layout->dev.of_node);
  71. kfree(layout);
  72. }
  73. static int nvmem_layout_create_device(struct nvmem_device *nvmem,
  74. struct device_node *np)
  75. {
  76. struct nvmem_layout *layout;
  77. struct device *dev;
  78. int ret;
  79. layout = kzalloc(sizeof(*layout), GFP_KERNEL);
  80. if (!layout)
  81. return -ENOMEM;
  82. /* Create a bidirectional link */
  83. layout->nvmem = nvmem;
  84. nvmem->layout = layout;
  85. /* Device model registration */
  86. dev = &layout->dev;
  87. device_initialize(dev);
  88. dev->parent = &nvmem->dev;
  89. dev->bus = &nvmem_layout_bus_type;
  90. dev->release = nvmem_layout_release_device;
  91. dev->coherent_dma_mask = DMA_BIT_MASK(32);
  92. dev->dma_mask = &dev->coherent_dma_mask;
  93. device_set_node(dev, of_fwnode_handle(of_node_get(np)));
  94. of_device_make_bus_id(dev);
  95. of_msi_configure(dev, dev->of_node);
  96. ret = device_add(dev);
  97. if (ret) {
  98. put_device(dev);
  99. return ret;
  100. }
  101. return 0;
  102. }
  103. static const struct of_device_id of_nvmem_layout_skip_table[] = {
  104. { .compatible = "fixed-layout", },
  105. {}
  106. };
  107. static int nvmem_layout_bus_populate(struct nvmem_device *nvmem,
  108. struct device_node *layout_dn)
  109. {
  110. int ret;
  111. /* Make sure it has a compatible property */
  112. if (!of_property_present(layout_dn, "compatible")) {
  113. pr_debug("%s() - skipping %pOF, no compatible prop\n",
  114. __func__, layout_dn);
  115. return 0;
  116. }
  117. /* Fixed layouts are parsed manually somewhere else for now */
  118. if (of_match_node(of_nvmem_layout_skip_table, layout_dn)) {
  119. pr_debug("%s() - skipping %pOF node\n", __func__, layout_dn);
  120. return 0;
  121. }
  122. if (of_node_check_flag(layout_dn, OF_POPULATED_BUS)) {
  123. pr_debug("%s() - skipping %pOF, already populated\n",
  124. __func__, layout_dn);
  125. return 0;
  126. }
  127. /* NVMEM layout buses expect only a single device representing the layout */
  128. ret = nvmem_layout_create_device(nvmem, layout_dn);
  129. if (ret)
  130. return ret;
  131. of_node_set_flag(layout_dn, OF_POPULATED_BUS);
  132. return 0;
  133. }
  134. struct device_node *of_nvmem_layout_get_container(struct nvmem_device *nvmem)
  135. {
  136. return of_get_child_by_name(nvmem->dev.of_node, "nvmem-layout");
  137. }
  138. EXPORT_SYMBOL_GPL(of_nvmem_layout_get_container);
  139. /*
  140. * Returns the number of devices populated, 0 if the operation was not relevant
  141. * for this nvmem device, an error code otherwise.
  142. */
  143. int nvmem_populate_layout(struct nvmem_device *nvmem)
  144. {
  145. struct device_node *layout_dn;
  146. int ret;
  147. layout_dn = of_nvmem_layout_get_container(nvmem);
  148. if (!layout_dn)
  149. return 0;
  150. /* Populate the layout device */
  151. device_links_supplier_sync_state_pause();
  152. ret = nvmem_layout_bus_populate(nvmem, layout_dn);
  153. device_links_supplier_sync_state_resume();
  154. of_node_put(layout_dn);
  155. return ret;
  156. }
  157. void nvmem_destroy_layout(struct nvmem_device *nvmem)
  158. {
  159. struct device *dev;
  160. if (!nvmem->layout)
  161. return;
  162. dev = &nvmem->layout->dev;
  163. of_node_clear_flag(dev->of_node, OF_POPULATED_BUS);
  164. device_unregister(dev);
  165. }
  166. int nvmem_layout_bus_register(void)
  167. {
  168. return bus_register(&nvmem_layout_bus_type);
  169. }
  170. void nvmem_layout_bus_unregister(void)
  171. {
  172. bus_unregister(&nvmem_layout_bus_type);
  173. }