stm32_omm.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) STMicroelectronics 2025 - All Rights Reserved
  4. * Author(s): Patrice Chotard <patrice.chotard@foss.st.com> for STMicroelectronics.
  5. */
  6. #include <linux/bitfield.h>
  7. #include <linux/bus/stm32_firewall_device.h>
  8. #include <linux/clk.h>
  9. #include <linux/err.h>
  10. #include <linux/mfd/syscon.h>
  11. #include <linux/mod_devicetable.h>
  12. #include <linux/module.h>
  13. #include <linux/of_address.h>
  14. #include <linux/of_platform.h>
  15. #include <linux/pinctrl/consumer.h>
  16. #include <linux/pm_runtime.h>
  17. #include <linux/regmap.h>
  18. #include <linux/reset.h>
  19. #define OMM_CR 0
  20. #define CR_MUXEN BIT(0)
  21. #define CR_MUXENMODE_MASK GENMASK(1, 0)
  22. #define CR_CSSEL_OVR_EN BIT(4)
  23. #define CR_CSSEL_OVR_MASK GENMASK(6, 5)
  24. #define CR_REQ2ACK_MASK GENMASK(23, 16)
  25. #define OMM_CHILD_NB 2
  26. #define OMM_CLK_NB 3
  27. struct stm32_omm {
  28. struct resource *mm_res;
  29. struct clk_bulk_data clk_bulk[OMM_CLK_NB];
  30. struct reset_control *child_reset[OMM_CHILD_NB];
  31. void __iomem *io_base;
  32. u32 cr;
  33. u8 nb_child;
  34. bool restore_omm;
  35. };
  36. static int stm32_omm_set_amcr(struct device *dev, bool set)
  37. {
  38. struct stm32_omm *omm = dev_get_drvdata(dev);
  39. resource_size_t mm_ospi2_size = 0;
  40. static const char * const mm_name[] = { "ospi1", "ospi2" };
  41. struct regmap *syscfg_regmap;
  42. struct device_node *node;
  43. struct resource res, res1;
  44. unsigned int syscon_args[2];
  45. int ret, idx;
  46. unsigned int i, amcr, read_amcr;
  47. for (i = 0; i < omm->nb_child; i++) {
  48. idx = of_property_match_string(dev->of_node,
  49. "memory-region-names",
  50. mm_name[i]);
  51. if (idx < 0)
  52. continue;
  53. /* res1 only used on second loop iteration */
  54. res1.start = res.start;
  55. res1.end = res.end;
  56. node = of_parse_phandle(dev->of_node, "memory-region", idx);
  57. if (!node)
  58. continue;
  59. ret = of_address_to_resource(node, 0, &res);
  60. if (ret) {
  61. of_node_put(node);
  62. dev_err(dev, "unable to resolve memory region\n");
  63. return ret;
  64. }
  65. /* check that memory region fits inside OMM memory map area */
  66. if (!resource_contains(omm->mm_res, &res)) {
  67. dev_err(dev, "%s doesn't fit inside OMM memory map area\n",
  68. mm_name[i]);
  69. dev_err(dev, "%pR doesn't fit inside %pR\n", &res, omm->mm_res);
  70. of_node_put(node);
  71. return -EFAULT;
  72. }
  73. if (i == 1) {
  74. mm_ospi2_size = resource_size(&res);
  75. /* check that OMM memory region 1 doesn't overlap memory region 2 */
  76. if (resource_overlaps(&res, &res1)) {
  77. dev_err(dev, "OMM memory-region %s overlaps memory region %s\n",
  78. mm_name[0], mm_name[1]);
  79. dev_err(dev, "%pR overlaps %pR\n", &res1, &res);
  80. of_node_put(node);
  81. return -EFAULT;
  82. }
  83. }
  84. of_node_put(node);
  85. }
  86. syscfg_regmap = syscon_regmap_lookup_by_phandle_args(dev->of_node, "st,syscfg-amcr",
  87. 2, syscon_args);
  88. if (IS_ERR(syscfg_regmap))
  89. return dev_err_probe(dev, PTR_ERR(syscfg_regmap),
  90. "Failed to get st,syscfg-amcr property\n");
  91. amcr = mm_ospi2_size / SZ_64M;
  92. if (set)
  93. regmap_update_bits(syscfg_regmap, syscon_args[0], syscon_args[1], amcr);
  94. /* read AMCR and check coherency with memory-map areas defined in DT */
  95. regmap_read(syscfg_regmap, syscon_args[0], &read_amcr);
  96. read_amcr = read_amcr >> (ffs(syscon_args[1]) - 1);
  97. if (amcr != read_amcr) {
  98. dev_err(dev, "AMCR value not coherent with DT memory-map areas\n");
  99. ret = -EINVAL;
  100. }
  101. return ret;
  102. }
  103. static int stm32_omm_toggle_child_clock(struct device *dev, bool enable)
  104. {
  105. struct stm32_omm *omm = dev_get_drvdata(dev);
  106. int i, ret;
  107. for (i = 0; i < omm->nb_child; i++) {
  108. if (enable) {
  109. ret = clk_prepare_enable(omm->clk_bulk[i + 1].clk);
  110. if (ret) {
  111. dev_err(dev, "Can not enable clock\n");
  112. goto clk_error;
  113. }
  114. } else {
  115. clk_disable_unprepare(omm->clk_bulk[i + 1].clk);
  116. }
  117. }
  118. return 0;
  119. clk_error:
  120. while (i--)
  121. clk_disable_unprepare(omm->clk_bulk[i + 1].clk);
  122. return ret;
  123. }
  124. static int stm32_omm_disable_child(struct device *dev)
  125. {
  126. struct stm32_omm *omm = dev_get_drvdata(dev);
  127. struct reset_control *reset;
  128. int ret;
  129. u8 i;
  130. ret = stm32_omm_toggle_child_clock(dev, true);
  131. if (ret)
  132. return ret;
  133. for (i = 0; i < omm->nb_child; i++) {
  134. /* reset OSPI to ensure CR_EN bit is set to 0 */
  135. reset = omm->child_reset[i];
  136. ret = reset_control_acquire(reset);
  137. if (ret) {
  138. stm32_omm_toggle_child_clock(dev, false);
  139. dev_err(dev, "Can not acquire reset %d\n", ret);
  140. return ret;
  141. }
  142. reset_control_assert(reset);
  143. udelay(2);
  144. reset_control_deassert(reset);
  145. reset_control_release(reset);
  146. }
  147. return stm32_omm_toggle_child_clock(dev, false);
  148. }
  149. static int stm32_omm_configure(struct device *dev)
  150. {
  151. static const char * const clocks_name[] = {"omm", "ospi1", "ospi2"};
  152. struct stm32_omm *omm = dev_get_drvdata(dev);
  153. unsigned long clk_rate_max = 0;
  154. u32 mux = 0;
  155. u32 cssel_ovr = 0;
  156. u32 req2ack = 0;
  157. struct reset_control *rstc;
  158. unsigned long clk_rate;
  159. int ret;
  160. u8 i;
  161. for (i = 0; i < OMM_CLK_NB; i++)
  162. omm->clk_bulk[i].id = clocks_name[i];
  163. /* retrieve OMM, OSPI1 and OSPI2 clocks */
  164. ret = devm_clk_bulk_get(dev, OMM_CLK_NB, omm->clk_bulk);
  165. if (ret)
  166. return dev_err_probe(dev, ret, "Failed to get OMM/OSPI's clocks\n");
  167. /* Ensure both OSPI instance are disabled before configuring OMM */
  168. ret = stm32_omm_disable_child(dev);
  169. if (ret)
  170. return ret;
  171. ret = pm_runtime_resume_and_get(dev);
  172. if (ret < 0)
  173. return ret;
  174. /* parse children's clock */
  175. for (i = 1; i <= omm->nb_child; i++) {
  176. clk_rate = clk_get_rate(omm->clk_bulk[i].clk);
  177. if (!clk_rate) {
  178. dev_err(dev, "Invalid clock rate\n");
  179. ret = -EINVAL;
  180. goto error;
  181. }
  182. if (clk_rate > clk_rate_max)
  183. clk_rate_max = clk_rate;
  184. }
  185. rstc = devm_reset_control_get_exclusive(dev, "omm");
  186. if (IS_ERR(rstc)) {
  187. ret = dev_err_probe(dev, PTR_ERR(rstc), "reset get failed\n");
  188. goto error;
  189. }
  190. reset_control_assert(rstc);
  191. udelay(2);
  192. reset_control_deassert(rstc);
  193. omm->cr = readl_relaxed(omm->io_base + OMM_CR);
  194. /* optional */
  195. ret = of_property_read_u32(dev->of_node, "st,omm-mux", &mux);
  196. if (!ret) {
  197. if (mux & CR_MUXEN) {
  198. ret = of_property_read_u32(dev->of_node, "st,omm-req2ack-ns",
  199. &req2ack);
  200. if (!ret && req2ack) {
  201. req2ack = DIV_ROUND_UP(req2ack, NSEC_PER_SEC / clk_rate_max) - 1;
  202. if (req2ack > 256)
  203. req2ack = 256;
  204. }
  205. req2ack = FIELD_PREP(CR_REQ2ACK_MASK, req2ack);
  206. omm->cr &= ~CR_REQ2ACK_MASK;
  207. omm->cr |= FIELD_PREP(CR_REQ2ACK_MASK, req2ack);
  208. /*
  209. * If the mux is enabled, the 2 OSPI clocks have to be
  210. * always enabled
  211. */
  212. ret = stm32_omm_toggle_child_clock(dev, true);
  213. if (ret)
  214. goto error;
  215. }
  216. omm->cr &= ~CR_MUXENMODE_MASK;
  217. omm->cr |= FIELD_PREP(CR_MUXENMODE_MASK, mux);
  218. }
  219. /* optional */
  220. ret = of_property_read_u32(dev->of_node, "st,omm-cssel-ovr", &cssel_ovr);
  221. if (!ret) {
  222. omm->cr &= ~CR_CSSEL_OVR_MASK;
  223. omm->cr |= FIELD_PREP(CR_CSSEL_OVR_MASK, cssel_ovr);
  224. omm->cr |= CR_CSSEL_OVR_EN;
  225. }
  226. omm->restore_omm = true;
  227. writel_relaxed(omm->cr, omm->io_base + OMM_CR);
  228. ret = stm32_omm_set_amcr(dev, true);
  229. error:
  230. pm_runtime_put_sync_suspend(dev);
  231. return ret;
  232. }
  233. static int stm32_omm_check_access(struct device_node *np)
  234. {
  235. struct stm32_firewall firewall;
  236. int ret;
  237. ret = stm32_firewall_get_firewall(np, &firewall, 1);
  238. if (ret)
  239. return ret;
  240. return stm32_firewall_grant_access(&firewall);
  241. }
  242. static int stm32_omm_probe(struct platform_device *pdev)
  243. {
  244. static const char * const resets_name[] = {"ospi1", "ospi2"};
  245. struct device *dev = &pdev->dev;
  246. u8 child_access_granted = 0;
  247. struct stm32_omm *omm;
  248. int i, ret;
  249. omm = devm_kzalloc(dev, sizeof(*omm), GFP_KERNEL);
  250. if (!omm)
  251. return -ENOMEM;
  252. omm->io_base = devm_platform_ioremap_resource_byname(pdev, "regs");
  253. if (IS_ERR(omm->io_base))
  254. return PTR_ERR(omm->io_base);
  255. omm->mm_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "memory_map");
  256. if (!omm->mm_res)
  257. return -ENODEV;
  258. /* check child's access */
  259. for_each_child_of_node_scoped(dev->of_node, child) {
  260. if (omm->nb_child >= OMM_CHILD_NB) {
  261. dev_err(dev, "Bad DT, found too much children\n");
  262. return -E2BIG;
  263. }
  264. ret = stm32_omm_check_access(child);
  265. if (ret < 0 && ret != -EACCES)
  266. return ret;
  267. if (!ret)
  268. child_access_granted++;
  269. omm->nb_child++;
  270. }
  271. if (omm->nb_child != OMM_CHILD_NB)
  272. return -EINVAL;
  273. platform_set_drvdata(pdev, omm);
  274. devm_pm_runtime_enable(dev);
  275. /* check if OMM's resource access is granted */
  276. ret = stm32_omm_check_access(dev->of_node);
  277. if (ret < 0 && ret != -EACCES)
  278. return ret;
  279. for (i = 0; i < omm->nb_child; i++) {
  280. omm->child_reset[i] = devm_reset_control_get_exclusive_released(dev,
  281. resets_name[i]);
  282. if (IS_ERR(omm->child_reset[i]))
  283. return dev_err_probe(dev, PTR_ERR(omm->child_reset[i]),
  284. "Can't get %s reset\n", resets_name[i]);
  285. }
  286. if (!ret && child_access_granted == OMM_CHILD_NB) {
  287. ret = stm32_omm_configure(dev);
  288. if (ret)
  289. return ret;
  290. } else {
  291. dev_dbg(dev, "Octo Memory Manager resource's access not granted\n");
  292. /*
  293. * AMCR can't be set, so check if current value is coherent
  294. * with memory-map areas defined in DT
  295. */
  296. ret = stm32_omm_set_amcr(dev, false);
  297. if (ret)
  298. return ret;
  299. }
  300. ret = devm_of_platform_populate(dev);
  301. if (ret) {
  302. if (omm->cr & CR_MUXEN)
  303. stm32_omm_toggle_child_clock(&pdev->dev, false);
  304. return dev_err_probe(dev, ret, "Failed to create Octo Memory Manager child\n");
  305. }
  306. return 0;
  307. }
  308. static void stm32_omm_remove(struct platform_device *pdev)
  309. {
  310. struct stm32_omm *omm = platform_get_drvdata(pdev);
  311. if (omm->cr & CR_MUXEN)
  312. stm32_omm_toggle_child_clock(&pdev->dev, false);
  313. }
  314. static const struct of_device_id stm32_omm_of_match[] = {
  315. { .compatible = "st,stm32mp25-omm", },
  316. {}
  317. };
  318. MODULE_DEVICE_TABLE(of, stm32_omm_of_match);
  319. static int __maybe_unused stm32_omm_runtime_suspend(struct device *dev)
  320. {
  321. struct stm32_omm *omm = dev_get_drvdata(dev);
  322. clk_disable_unprepare(omm->clk_bulk[0].clk);
  323. return 0;
  324. }
  325. static int __maybe_unused stm32_omm_runtime_resume(struct device *dev)
  326. {
  327. struct stm32_omm *omm = dev_get_drvdata(dev);
  328. return clk_prepare_enable(omm->clk_bulk[0].clk);
  329. }
  330. static int __maybe_unused stm32_omm_suspend(struct device *dev)
  331. {
  332. struct stm32_omm *omm = dev_get_drvdata(dev);
  333. if (omm->restore_omm && omm->cr & CR_MUXEN)
  334. stm32_omm_toggle_child_clock(dev, false);
  335. return pinctrl_pm_select_sleep_state(dev);
  336. }
  337. static int __maybe_unused stm32_omm_resume(struct device *dev)
  338. {
  339. struct stm32_omm *omm = dev_get_drvdata(dev);
  340. int ret;
  341. pinctrl_pm_select_default_state(dev);
  342. if (!omm->restore_omm)
  343. return 0;
  344. /* Ensure both OSPI instance are disabled before configuring OMM */
  345. ret = stm32_omm_disable_child(dev);
  346. if (ret)
  347. return ret;
  348. ret = pm_runtime_resume_and_get(dev);
  349. if (ret < 0)
  350. return ret;
  351. writel_relaxed(omm->cr, omm->io_base + OMM_CR);
  352. ret = stm32_omm_set_amcr(dev, true);
  353. pm_runtime_put_sync_suspend(dev);
  354. if (ret)
  355. return ret;
  356. if (omm->cr & CR_MUXEN)
  357. ret = stm32_omm_toggle_child_clock(dev, true);
  358. return ret;
  359. }
  360. static const struct dev_pm_ops stm32_omm_pm_ops = {
  361. SET_RUNTIME_PM_OPS(stm32_omm_runtime_suspend,
  362. stm32_omm_runtime_resume, NULL)
  363. SET_SYSTEM_SLEEP_PM_OPS(stm32_omm_suspend, stm32_omm_resume)
  364. };
  365. static struct platform_driver stm32_omm_driver = {
  366. .probe = stm32_omm_probe,
  367. .remove = stm32_omm_remove,
  368. .driver = {
  369. .name = "stm32-omm",
  370. .of_match_table = stm32_omm_of_match,
  371. .pm = &stm32_omm_pm_ops,
  372. },
  373. };
  374. module_platform_driver(stm32_omm_driver);
  375. MODULE_DESCRIPTION("STMicroelectronics Octo Memory Manager driver");
  376. MODULE_LICENSE("GPL");