clk-raspberrypi.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Raspberry Pi driver for firmware controlled clocks
  4. *
  5. * Even though clk-bcm2835 provides an interface to the hardware registers for
  6. * the system clocks we've had to factor out 'pllb' as the firmware 'owns' it.
  7. * We're not allowed to change it directly as we might race with the
  8. * over-temperature and under-voltage protections provided by the firmware.
  9. *
  10. * Copyright (C) 2019 Nicolas Saenz Julienne <[email protected]>
  11. */
  12. #include <linux/clkdev.h>
  13. #include <linux/clk-provider.h>
  14. #include <linux/io.h>
  15. #include <linux/module.h>
  16. #include <linux/platform_device.h>
  17. #include <soc/bcm2835/raspberrypi-firmware.h>
  18. enum rpi_firmware_clk_id {
  19. RPI_FIRMWARE_EMMC_CLK_ID = 1,
  20. RPI_FIRMWARE_UART_CLK_ID,
  21. RPI_FIRMWARE_ARM_CLK_ID,
  22. RPI_FIRMWARE_CORE_CLK_ID,
  23. RPI_FIRMWARE_V3D_CLK_ID,
  24. RPI_FIRMWARE_H264_CLK_ID,
  25. RPI_FIRMWARE_ISP_CLK_ID,
  26. RPI_FIRMWARE_SDRAM_CLK_ID,
  27. RPI_FIRMWARE_PIXEL_CLK_ID,
  28. RPI_FIRMWARE_PWM_CLK_ID,
  29. RPI_FIRMWARE_HEVC_CLK_ID,
  30. RPI_FIRMWARE_EMMC2_CLK_ID,
  31. RPI_FIRMWARE_M2MC_CLK_ID,
  32. RPI_FIRMWARE_PIXEL_BVB_CLK_ID,
  33. RPI_FIRMWARE_VEC_CLK_ID,
  34. RPI_FIRMWARE_NUM_CLK_ID,
  35. };
  36. static char *rpi_firmware_clk_names[] = {
  37. [RPI_FIRMWARE_EMMC_CLK_ID] = "emmc",
  38. [RPI_FIRMWARE_UART_CLK_ID] = "uart",
  39. [RPI_FIRMWARE_ARM_CLK_ID] = "arm",
  40. [RPI_FIRMWARE_CORE_CLK_ID] = "core",
  41. [RPI_FIRMWARE_V3D_CLK_ID] = "v3d",
  42. [RPI_FIRMWARE_H264_CLK_ID] = "h264",
  43. [RPI_FIRMWARE_ISP_CLK_ID] = "isp",
  44. [RPI_FIRMWARE_SDRAM_CLK_ID] = "sdram",
  45. [RPI_FIRMWARE_PIXEL_CLK_ID] = "pixel",
  46. [RPI_FIRMWARE_PWM_CLK_ID] = "pwm",
  47. [RPI_FIRMWARE_HEVC_CLK_ID] = "hevc",
  48. [RPI_FIRMWARE_EMMC2_CLK_ID] = "emmc2",
  49. [RPI_FIRMWARE_M2MC_CLK_ID] = "m2mc",
  50. [RPI_FIRMWARE_PIXEL_BVB_CLK_ID] = "pixel-bvb",
  51. [RPI_FIRMWARE_VEC_CLK_ID] = "vec",
  52. };
  53. #define RPI_FIRMWARE_STATE_ENABLE_BIT BIT(0)
  54. #define RPI_FIRMWARE_STATE_WAIT_BIT BIT(1)
  55. struct raspberrypi_clk_variant;
  56. struct raspberrypi_clk {
  57. struct device *dev;
  58. struct rpi_firmware *firmware;
  59. struct platform_device *cpufreq;
  60. };
  61. struct raspberrypi_clk_data {
  62. struct clk_hw hw;
  63. unsigned int id;
  64. struct raspberrypi_clk_variant *variant;
  65. struct raspberrypi_clk *rpi;
  66. };
  67. struct raspberrypi_clk_variant {
  68. bool export;
  69. char *clkdev;
  70. unsigned long min_rate;
  71. bool minimize;
  72. };
  73. static struct raspberrypi_clk_variant
  74. raspberrypi_clk_variants[RPI_FIRMWARE_NUM_CLK_ID] = {
  75. [RPI_FIRMWARE_ARM_CLK_ID] = {
  76. .export = true,
  77. .clkdev = "cpu0",
  78. },
  79. [RPI_FIRMWARE_CORE_CLK_ID] = {
  80. .export = true,
  81. /*
  82. * The clock is shared between the HVS and the CSI
  83. * controllers, on the BCM2711 and will change depending
  84. * on the pixels composited on the HVS and the capture
  85. * resolution on Unicam.
  86. *
  87. * Since the rate can get quite large, and we need to
  88. * coordinate between both driver instances, let's
  89. * always use the minimum the drivers will let us.
  90. */
  91. .minimize = true,
  92. },
  93. [RPI_FIRMWARE_M2MC_CLK_ID] = {
  94. .export = true,
  95. /*
  96. * If we boot without any cable connected to any of the
  97. * HDMI connector, the firmware will skip the HSM
  98. * initialization and leave it with a rate of 0,
  99. * resulting in a bus lockup when we're accessing the
  100. * registers even if it's enabled.
  101. *
  102. * Let's put a sensible default so that we don't end up
  103. * in this situation.
  104. */
  105. .min_rate = 120000000,
  106. /*
  107. * The clock is shared between the two HDMI controllers
  108. * on the BCM2711 and will change depending on the
  109. * resolution output on each. Since the rate can get
  110. * quite large, and we need to coordinate between both
  111. * driver instances, let's always use the minimum the
  112. * drivers will let us.
  113. */
  114. .minimize = true,
  115. },
  116. [RPI_FIRMWARE_V3D_CLK_ID] = {
  117. .export = true,
  118. },
  119. [RPI_FIRMWARE_PIXEL_CLK_ID] = {
  120. .export = true,
  121. },
  122. [RPI_FIRMWARE_HEVC_CLK_ID] = {
  123. .export = true,
  124. },
  125. [RPI_FIRMWARE_PIXEL_BVB_CLK_ID] = {
  126. .export = true,
  127. },
  128. [RPI_FIRMWARE_VEC_CLK_ID] = {
  129. .export = true,
  130. },
  131. };
  132. /*
  133. * Structure of the message passed to Raspberry Pi's firmware in order to
  134. * change clock rates. The 'disable_turbo' option is only available to the ARM
  135. * clock (pllb) which we enable by default as turbo mode will alter multiple
  136. * clocks at once.
  137. *
  138. * Even though we're able to access the clock registers directly we're bound to
  139. * use the firmware interface as the firmware ultimately takes care of
  140. * mitigating overheating/undervoltage situations and we would be changing
  141. * frequencies behind his back.
  142. *
  143. * For more information on the firmware interface check:
  144. * https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface
  145. */
  146. struct raspberrypi_firmware_prop {
  147. __le32 id;
  148. __le32 val;
  149. __le32 disable_turbo;
  150. } __packed;
  151. static int raspberrypi_clock_property(struct rpi_firmware *firmware,
  152. const struct raspberrypi_clk_data *data,
  153. u32 tag, u32 *val)
  154. {
  155. struct raspberrypi_firmware_prop msg = {
  156. .id = cpu_to_le32(data->id),
  157. .val = cpu_to_le32(*val),
  158. .disable_turbo = cpu_to_le32(1),
  159. };
  160. int ret;
  161. ret = rpi_firmware_property(firmware, tag, &msg, sizeof(msg));
  162. if (ret)
  163. return ret;
  164. *val = le32_to_cpu(msg.val);
  165. return 0;
  166. }
  167. static int raspberrypi_fw_is_prepared(struct clk_hw *hw)
  168. {
  169. struct raspberrypi_clk_data *data =
  170. container_of(hw, struct raspberrypi_clk_data, hw);
  171. struct raspberrypi_clk *rpi = data->rpi;
  172. u32 val = 0;
  173. int ret;
  174. ret = raspberrypi_clock_property(rpi->firmware, data,
  175. RPI_FIRMWARE_GET_CLOCK_STATE, &val);
  176. if (ret)
  177. return 0;
  178. return !!(val & RPI_FIRMWARE_STATE_ENABLE_BIT);
  179. }
  180. static unsigned long raspberrypi_fw_get_rate(struct clk_hw *hw,
  181. unsigned long parent_rate)
  182. {
  183. struct raspberrypi_clk_data *data =
  184. container_of(hw, struct raspberrypi_clk_data, hw);
  185. struct raspberrypi_clk *rpi = data->rpi;
  186. u32 val = 0;
  187. int ret;
  188. ret = raspberrypi_clock_property(rpi->firmware, data,
  189. RPI_FIRMWARE_GET_CLOCK_RATE, &val);
  190. if (ret)
  191. return 0;
  192. return val;
  193. }
  194. static int raspberrypi_fw_set_rate(struct clk_hw *hw, unsigned long rate,
  195. unsigned long parent_rate)
  196. {
  197. struct raspberrypi_clk_data *data =
  198. container_of(hw, struct raspberrypi_clk_data, hw);
  199. struct raspberrypi_clk *rpi = data->rpi;
  200. u32 _rate = rate;
  201. int ret;
  202. ret = raspberrypi_clock_property(rpi->firmware, data,
  203. RPI_FIRMWARE_SET_CLOCK_RATE, &_rate);
  204. if (ret)
  205. dev_err_ratelimited(rpi->dev, "Failed to change %s frequency: %d\n",
  206. clk_hw_get_name(hw), ret);
  207. return ret;
  208. }
  209. static int raspberrypi_fw_dumb_determine_rate(struct clk_hw *hw,
  210. struct clk_rate_request *req)
  211. {
  212. struct raspberrypi_clk_data *data =
  213. container_of(hw, struct raspberrypi_clk_data, hw);
  214. struct raspberrypi_clk_variant *variant = data->variant;
  215. /*
  216. * The firmware will do the rounding but that isn't part of
  217. * the interface with the firmware, so we just do our best
  218. * here.
  219. */
  220. req->rate = clamp(req->rate, req->min_rate, req->max_rate);
  221. /*
  222. * We want to aggressively reduce the clock rate here, so let's
  223. * just ignore the requested rate and return the bare minimum
  224. * rate we can get away with.
  225. */
  226. if (variant->minimize && req->min_rate > 0)
  227. req->rate = req->min_rate;
  228. return 0;
  229. }
  230. static const struct clk_ops raspberrypi_firmware_clk_ops = {
  231. .is_prepared = raspberrypi_fw_is_prepared,
  232. .recalc_rate = raspberrypi_fw_get_rate,
  233. .determine_rate = raspberrypi_fw_dumb_determine_rate,
  234. .set_rate = raspberrypi_fw_set_rate,
  235. };
  236. static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
  237. unsigned int parent,
  238. unsigned int id,
  239. struct raspberrypi_clk_variant *variant)
  240. {
  241. struct raspberrypi_clk_data *data;
  242. struct clk_init_data init = {};
  243. u32 min_rate, max_rate;
  244. int ret;
  245. data = devm_kzalloc(rpi->dev, sizeof(*data), GFP_KERNEL);
  246. if (!data)
  247. return ERR_PTR(-ENOMEM);
  248. data->rpi = rpi;
  249. data->id = id;
  250. data->variant = variant;
  251. init.name = devm_kasprintf(rpi->dev, GFP_KERNEL,
  252. "fw-clk-%s",
  253. rpi_firmware_clk_names[id]);
  254. init.ops = &raspberrypi_firmware_clk_ops;
  255. init.flags = CLK_GET_RATE_NOCACHE;
  256. data->hw.init = &init;
  257. ret = raspberrypi_clock_property(rpi->firmware, data,
  258. RPI_FIRMWARE_GET_MIN_CLOCK_RATE,
  259. &min_rate);
  260. if (ret) {
  261. dev_err(rpi->dev, "Failed to get clock %d min freq: %d\n",
  262. id, ret);
  263. return ERR_PTR(ret);
  264. }
  265. ret = raspberrypi_clock_property(rpi->firmware, data,
  266. RPI_FIRMWARE_GET_MAX_CLOCK_RATE,
  267. &max_rate);
  268. if (ret) {
  269. dev_err(rpi->dev, "Failed to get clock %d max freq: %d\n",
  270. id, ret);
  271. return ERR_PTR(ret);
  272. }
  273. ret = devm_clk_hw_register(rpi->dev, &data->hw);
  274. if (ret)
  275. return ERR_PTR(ret);
  276. clk_hw_set_rate_range(&data->hw, min_rate, max_rate);
  277. if (variant->clkdev) {
  278. ret = devm_clk_hw_register_clkdev(rpi->dev, &data->hw,
  279. NULL, variant->clkdev);
  280. if (ret) {
  281. dev_err(rpi->dev, "Failed to initialize clkdev\n");
  282. return ERR_PTR(ret);
  283. }
  284. }
  285. if (variant->min_rate) {
  286. unsigned long rate;
  287. clk_hw_set_rate_range(&data->hw, variant->min_rate, max_rate);
  288. rate = raspberrypi_fw_get_rate(&data->hw, 0);
  289. if (rate < variant->min_rate) {
  290. ret = raspberrypi_fw_set_rate(&data->hw, variant->min_rate, 0);
  291. if (ret)
  292. return ERR_PTR(ret);
  293. }
  294. }
  295. return &data->hw;
  296. }
  297. struct rpi_firmware_get_clocks_response {
  298. u32 parent;
  299. u32 id;
  300. };
  301. static int raspberrypi_discover_clocks(struct raspberrypi_clk *rpi,
  302. struct clk_hw_onecell_data *data)
  303. {
  304. struct rpi_firmware_get_clocks_response *clks;
  305. int ret;
  306. /*
  307. * The firmware doesn't guarantee that the last element of
  308. * RPI_FIRMWARE_GET_CLOCKS is zeroed. So allocate an additional
  309. * zero element as sentinel.
  310. */
  311. clks = devm_kcalloc(rpi->dev,
  312. RPI_FIRMWARE_NUM_CLK_ID + 1, sizeof(*clks),
  313. GFP_KERNEL);
  314. if (!clks)
  315. return -ENOMEM;
  316. ret = rpi_firmware_property(rpi->firmware, RPI_FIRMWARE_GET_CLOCKS,
  317. clks,
  318. sizeof(*clks) * RPI_FIRMWARE_NUM_CLK_ID);
  319. if (ret)
  320. return ret;
  321. while (clks->id) {
  322. struct raspberrypi_clk_variant *variant;
  323. if (clks->id >= RPI_FIRMWARE_NUM_CLK_ID) {
  324. dev_err(rpi->dev, "Unknown clock id: %u (max: %u)\n",
  325. clks->id, RPI_FIRMWARE_NUM_CLK_ID - 1);
  326. return -EINVAL;
  327. }
  328. variant = &raspberrypi_clk_variants[clks->id];
  329. if (variant->export) {
  330. struct clk_hw *hw;
  331. hw = raspberrypi_clk_register(rpi, clks->parent,
  332. clks->id, variant);
  333. if (IS_ERR(hw))
  334. return PTR_ERR(hw);
  335. data->hws[clks->id] = hw;
  336. data->num = clks->id + 1;
  337. }
  338. clks++;
  339. }
  340. return 0;
  341. }
  342. static int raspberrypi_clk_probe(struct platform_device *pdev)
  343. {
  344. struct clk_hw_onecell_data *clk_data;
  345. struct device_node *firmware_node;
  346. struct device *dev = &pdev->dev;
  347. struct rpi_firmware *firmware;
  348. struct raspberrypi_clk *rpi;
  349. int ret;
  350. /*
  351. * We can be probed either through the an old-fashioned
  352. * platform device registration or through a DT node that is a
  353. * child of the firmware node. Handle both cases.
  354. */
  355. if (dev->of_node)
  356. firmware_node = of_get_parent(dev->of_node);
  357. else
  358. firmware_node = of_find_compatible_node(NULL, NULL,
  359. "raspberrypi,bcm2835-firmware");
  360. if (!firmware_node) {
  361. dev_err(dev, "Missing firmware node\n");
  362. return -ENOENT;
  363. }
  364. firmware = devm_rpi_firmware_get(&pdev->dev, firmware_node);
  365. of_node_put(firmware_node);
  366. if (!firmware)
  367. return -EPROBE_DEFER;
  368. rpi = devm_kzalloc(dev, sizeof(*rpi), GFP_KERNEL);
  369. if (!rpi)
  370. return -ENOMEM;
  371. rpi->dev = dev;
  372. rpi->firmware = firmware;
  373. platform_set_drvdata(pdev, rpi);
  374. clk_data = devm_kzalloc(dev, struct_size(clk_data, hws,
  375. RPI_FIRMWARE_NUM_CLK_ID),
  376. GFP_KERNEL);
  377. if (!clk_data)
  378. return -ENOMEM;
  379. ret = raspberrypi_discover_clocks(rpi, clk_data);
  380. if (ret)
  381. return ret;
  382. ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
  383. clk_data);
  384. if (ret)
  385. return ret;
  386. rpi->cpufreq = platform_device_register_data(dev, "raspberrypi-cpufreq",
  387. -1, NULL, 0);
  388. return 0;
  389. }
  390. static int raspberrypi_clk_remove(struct platform_device *pdev)
  391. {
  392. struct raspberrypi_clk *rpi = platform_get_drvdata(pdev);
  393. platform_device_unregister(rpi->cpufreq);
  394. return 0;
  395. }
  396. static const struct of_device_id raspberrypi_clk_match[] = {
  397. { .compatible = "raspberrypi,firmware-clocks" },
  398. { },
  399. };
  400. MODULE_DEVICE_TABLE(of, raspberrypi_clk_match);
  401. static struct platform_driver raspberrypi_clk_driver = {
  402. .driver = {
  403. .name = "raspberrypi-clk",
  404. .of_match_table = raspberrypi_clk_match,
  405. },
  406. .probe = raspberrypi_clk_probe,
  407. .remove = raspberrypi_clk_remove,
  408. };
  409. module_platform_driver(raspberrypi_clk_driver);
  410. MODULE_AUTHOR("Nicolas Saenz Julienne <[email protected]>");
  411. MODULE_DESCRIPTION("Raspberry Pi firmware clock driver");
  412. MODULE_LICENSE("GPL");
  413. MODULE_ALIAS("platform:raspberrypi-clk");