clk-raspberrypi.c 14 KB

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