0078-clk-qcom-Consolidate-common-probe-code.patch 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. From d79cb0c583772f38a9367af106d61bcf8bfa08e4 Mon Sep 17 00:00:00 2001
  2. From: Stephen Boyd <[email protected]>
  3. Date: Fri, 21 Mar 2014 17:59:37 -0700
  4. Subject: [PATCH 078/182] clk: qcom: Consolidate common probe code
  5. Most of the probe code is the same between all the different
  6. clock controllers. Consolidate the code into a common.c file.
  7. This makes changes to the common probe parts easier and reduces
  8. chances for bugs.
  9. Signed-off-by: Stephen Boyd <[email protected]>
  10. Signed-off-by: Kumar Gala <[email protected]>
  11. ---
  12. drivers/clk/qcom/Makefile | 1 +
  13. drivers/clk/qcom/common.c | 99 +++++++++++++++++++++++++++++++++++++++
  14. drivers/clk/qcom/common.h | 34 ++++++++++++++
  15. drivers/clk/qcom/gcc-msm8660.c | 87 +++++-----------------------------
  16. drivers/clk/qcom/gcc-msm8960.c | 77 +++++-------------------------
  17. drivers/clk/qcom/gcc-msm8974.c | 77 +++++-------------------------
  18. drivers/clk/qcom/mmcc-msm8960.c | 78 +++++-------------------------
  19. drivers/clk/qcom/mmcc-msm8974.c | 80 +++++++------------------------
  20. 8 files changed, 196 insertions(+), 337 deletions(-)
  21. create mode 100644 drivers/clk/qcom/common.c
  22. create mode 100644 drivers/clk/qcom/common.h
  23. --- a/drivers/clk/qcom/Makefile
  24. +++ b/drivers/clk/qcom/Makefile
  25. @@ -1,5 +1,6 @@
  26. obj-$(CONFIG_COMMON_CLK_QCOM) += clk-qcom.o
  27. +clk-qcom-y += common.o
  28. clk-qcom-y += clk-regmap.o
  29. clk-qcom-y += clk-pll.o
  30. clk-qcom-y += clk-rcg.o
  31. --- /dev/null
  32. +++ b/drivers/clk/qcom/common.c
  33. @@ -0,0 +1,99 @@
  34. +/*
  35. + * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
  36. + *
  37. + * This software is licensed under the terms of the GNU General Public
  38. + * License version 2, as published by the Free Software Foundation, and
  39. + * may be copied, distributed, and modified under those terms.
  40. + *
  41. + * This program is distributed in the hope that it will be useful,
  42. + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  43. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  44. + * GNU General Public License for more details.
  45. + */
  46. +
  47. +#include <linux/export.h>
  48. +#include <linux/regmap.h>
  49. +#include <linux/platform_device.h>
  50. +#include <linux/clk-provider.h>
  51. +#include <linux/reset-controller.h>
  52. +
  53. +#include "common.h"
  54. +#include "clk-regmap.h"
  55. +#include "reset.h"
  56. +
  57. +struct qcom_cc {
  58. + struct qcom_reset_controller reset;
  59. + struct clk_onecell_data data;
  60. + struct clk *clks[];
  61. +};
  62. +
  63. +int qcom_cc_probe(struct platform_device *pdev, const struct qcom_cc_desc *desc)
  64. +{
  65. + void __iomem *base;
  66. + struct resource *res;
  67. + int i, ret;
  68. + struct device *dev = &pdev->dev;
  69. + struct clk *clk;
  70. + struct clk_onecell_data *data;
  71. + struct clk **clks;
  72. + struct regmap *regmap;
  73. + struct qcom_reset_controller *reset;
  74. + struct qcom_cc *cc;
  75. + size_t num_clks = desc->num_clks;
  76. + struct clk_regmap **rclks = desc->clks;
  77. +
  78. + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  79. + base = devm_ioremap_resource(dev, res);
  80. + if (IS_ERR(base))
  81. + return PTR_ERR(base);
  82. +
  83. + regmap = devm_regmap_init_mmio(dev, base, desc->config);
  84. + if (IS_ERR(regmap))
  85. + return PTR_ERR(regmap);
  86. +
  87. + cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
  88. + GFP_KERNEL);
  89. + if (!cc)
  90. + return -ENOMEM;
  91. +
  92. + clks = cc->clks;
  93. + data = &cc->data;
  94. + data->clks = clks;
  95. + data->clk_num = num_clks;
  96. +
  97. + for (i = 0; i < num_clks; i++) {
  98. + if (!rclks[i])
  99. + continue;
  100. + clk = devm_clk_register_regmap(dev, rclks[i]);
  101. + if (IS_ERR(clk))
  102. + return PTR_ERR(clk);
  103. + clks[i] = clk;
  104. + }
  105. +
  106. + ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
  107. + if (ret)
  108. + return ret;
  109. +
  110. + reset = &cc->reset;
  111. + reset->rcdev.of_node = dev->of_node;
  112. + reset->rcdev.ops = &qcom_reset_ops;
  113. + reset->rcdev.owner = dev->driver->owner;
  114. + reset->rcdev.nr_resets = desc->num_resets;
  115. + reset->regmap = regmap;
  116. + reset->reset_map = desc->resets;
  117. + platform_set_drvdata(pdev, &reset->rcdev);
  118. +
  119. + ret = reset_controller_register(&reset->rcdev);
  120. + if (ret)
  121. + of_clk_del_provider(dev->of_node);
  122. +
  123. + return ret;
  124. +}
  125. +EXPORT_SYMBOL_GPL(qcom_cc_probe);
  126. +
  127. +void qcom_cc_remove(struct platform_device *pdev)
  128. +{
  129. + of_clk_del_provider(pdev->dev.of_node);
  130. + reset_controller_unregister(platform_get_drvdata(pdev));
  131. +}
  132. +EXPORT_SYMBOL_GPL(qcom_cc_remove);
  133. --- /dev/null
  134. +++ b/drivers/clk/qcom/common.h
  135. @@ -0,0 +1,34 @@
  136. +/*
  137. + * Copyright (c) 2014, The Linux Foundation. All rights reserved.
  138. + *
  139. + * This software is licensed under the terms of the GNU General Public
  140. + * License version 2, as published by the Free Software Foundation, and
  141. + * may be copied, distributed, and modified under those terms.
  142. + *
  143. + * This program is distributed in the hope that it will be useful,
  144. + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  145. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  146. + * GNU General Public License for more details.
  147. + */
  148. +#ifndef __QCOM_CLK_COMMON_H__
  149. +#define __QCOM_CLK_COMMON_H__
  150. +
  151. +struct platform_device;
  152. +struct regmap_config;
  153. +struct clk_regmap;
  154. +struct qcom_reset_map;
  155. +
  156. +struct qcom_cc_desc {
  157. + const struct regmap_config *config;
  158. + struct clk_regmap **clks;
  159. + size_t num_clks;
  160. + const struct qcom_reset_map *resets;
  161. + size_t num_resets;
  162. +};
  163. +
  164. +extern int qcom_cc_probe(struct platform_device *pdev,
  165. + const struct qcom_cc_desc *desc);
  166. +
  167. +extern void qcom_cc_remove(struct platform_device *pdev);
  168. +
  169. +#endif
  170. --- a/drivers/clk/qcom/gcc-msm8660.c
  171. +++ b/drivers/clk/qcom/gcc-msm8660.c
  172. @@ -25,6 +25,7 @@
  173. #include <dt-bindings/clock/qcom,gcc-msm8660.h>
  174. #include <dt-bindings/reset/qcom,gcc-msm8660.h>
  175. +#include "common.h"
  176. #include "clk-regmap.h"
  177. #include "clk-pll.h"
  178. #include "clk-rcg.h"
  179. @@ -2701,94 +2702,28 @@ static const struct regmap_config gcc_ms
  180. .fast_io = true,
  181. };
  182. +static const struct qcom_cc_desc gcc_msm8660_desc = {
  183. + .config = &gcc_msm8660_regmap_config,
  184. + .clks = gcc_msm8660_clks,
  185. + .num_clks = ARRAY_SIZE(gcc_msm8660_clks),
  186. + .resets = gcc_msm8660_resets,
  187. + .num_resets = ARRAY_SIZE(gcc_msm8660_resets),
  188. +};
  189. +
  190. static const struct of_device_id gcc_msm8660_match_table[] = {
  191. { .compatible = "qcom,gcc-msm8660" },
  192. { }
  193. };
  194. MODULE_DEVICE_TABLE(of, gcc_msm8660_match_table);
  195. -struct qcom_cc {
  196. - struct qcom_reset_controller reset;
  197. - struct clk_onecell_data data;
  198. - struct clk *clks[];
  199. -};
  200. -
  201. static int gcc_msm8660_probe(struct platform_device *pdev)
  202. {
  203. - void __iomem *base;
  204. - struct resource *res;
  205. - int i, ret;
  206. - struct device *dev = &pdev->dev;
  207. - struct clk *clk;
  208. - struct clk_onecell_data *data;
  209. - struct clk **clks;
  210. - struct regmap *regmap;
  211. - size_t num_clks;
  212. - struct qcom_reset_controller *reset;
  213. - struct qcom_cc *cc;
  214. -
  215. - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  216. - base = devm_ioremap_resource(dev, res);
  217. - if (IS_ERR(base))
  218. - return PTR_ERR(base);
  219. -
  220. - regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8660_regmap_config);
  221. - if (IS_ERR(regmap))
  222. - return PTR_ERR(regmap);
  223. -
  224. - num_clks = ARRAY_SIZE(gcc_msm8660_clks);
  225. - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
  226. - GFP_KERNEL);
  227. - if (!cc)
  228. - return -ENOMEM;
  229. -
  230. - clks = cc->clks;
  231. - data = &cc->data;
  232. - data->clks = clks;
  233. - data->clk_num = num_clks;
  234. -
  235. - /* Temporary until RPM clocks supported */
  236. - clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000);
  237. - if (IS_ERR(clk))
  238. - return PTR_ERR(clk);
  239. -
  240. - clk = clk_register_fixed_rate(dev, "pxo", NULL, CLK_IS_ROOT, 27000000);
  241. - if (IS_ERR(clk))
  242. - return PTR_ERR(clk);
  243. -
  244. - for (i = 0; i < num_clks; i++) {
  245. - if (!gcc_msm8660_clks[i])
  246. - continue;
  247. - clk = devm_clk_register_regmap(dev, gcc_msm8660_clks[i]);
  248. - if (IS_ERR(clk))
  249. - return PTR_ERR(clk);
  250. - clks[i] = clk;
  251. - }
  252. -
  253. - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
  254. - if (ret)
  255. - return ret;
  256. -
  257. - reset = &cc->reset;
  258. - reset->rcdev.of_node = dev->of_node;
  259. - reset->rcdev.ops = &qcom_reset_ops,
  260. - reset->rcdev.owner = THIS_MODULE,
  261. - reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8660_resets),
  262. - reset->regmap = regmap;
  263. - reset->reset_map = gcc_msm8660_resets,
  264. - platform_set_drvdata(pdev, &reset->rcdev);
  265. -
  266. - ret = reset_controller_register(&reset->rcdev);
  267. - if (ret)
  268. - of_clk_del_provider(dev->of_node);
  269. -
  270. - return ret;
  271. + return qcom_cc_probe(pdev, &gcc_msm8660_desc);
  272. }
  273. static int gcc_msm8660_remove(struct platform_device *pdev)
  274. {
  275. - of_clk_del_provider(pdev->dev.of_node);
  276. - reset_controller_unregister(platform_get_drvdata(pdev));
  277. + qcom_cc_remove(pdev);
  278. return 0;
  279. }
  280. --- a/drivers/clk/qcom/gcc-msm8960.c
  281. +++ b/drivers/clk/qcom/gcc-msm8960.c
  282. @@ -25,6 +25,7 @@
  283. #include <dt-bindings/clock/qcom,gcc-msm8960.h>
  284. #include <dt-bindings/reset/qcom,gcc-msm8960.h>
  285. +#include "common.h"
  286. #include "clk-regmap.h"
  287. #include "clk-pll.h"
  288. #include "clk-rcg.h"
  289. @@ -2875,51 +2876,24 @@ static const struct regmap_config gcc_ms
  290. .fast_io = true,
  291. };
  292. +static const struct qcom_cc_desc gcc_msm8960_desc = {
  293. + .config = &gcc_msm8960_regmap_config,
  294. + .clks = gcc_msm8960_clks,
  295. + .num_clks = ARRAY_SIZE(gcc_msm8960_clks),
  296. + .resets = gcc_msm8960_resets,
  297. + .num_resets = ARRAY_SIZE(gcc_msm8960_resets),
  298. +};
  299. +
  300. static const struct of_device_id gcc_msm8960_match_table[] = {
  301. { .compatible = "qcom,gcc-msm8960" },
  302. { }
  303. };
  304. MODULE_DEVICE_TABLE(of, gcc_msm8960_match_table);
  305. -struct qcom_cc {
  306. - struct qcom_reset_controller reset;
  307. - struct clk_onecell_data data;
  308. - struct clk *clks[];
  309. -};
  310. -
  311. static int gcc_msm8960_probe(struct platform_device *pdev)
  312. {
  313. - void __iomem *base;
  314. - struct resource *res;
  315. - int i, ret;
  316. - struct device *dev = &pdev->dev;
  317. struct clk *clk;
  318. - struct clk_onecell_data *data;
  319. - struct clk **clks;
  320. - struct regmap *regmap;
  321. - size_t num_clks;
  322. - struct qcom_reset_controller *reset;
  323. - struct qcom_cc *cc;
  324. -
  325. - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  326. - base = devm_ioremap_resource(dev, res);
  327. - if (IS_ERR(base))
  328. - return PTR_ERR(base);
  329. -
  330. - regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8960_regmap_config);
  331. - if (IS_ERR(regmap))
  332. - return PTR_ERR(regmap);
  333. -
  334. - num_clks = ARRAY_SIZE(gcc_msm8960_clks);
  335. - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
  336. - GFP_KERNEL);
  337. - if (!cc)
  338. - return -ENOMEM;
  339. -
  340. - clks = cc->clks;
  341. - data = &cc->data;
  342. - data->clks = clks;
  343. - data->clk_num = num_clks;
  344. + struct device *dev = &pdev->dev;
  345. /* Temporary until RPM clocks supported */
  346. clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000);
  347. @@ -2930,39 +2904,12 @@ static int gcc_msm8960_probe(struct plat
  348. if (IS_ERR(clk))
  349. return PTR_ERR(clk);
  350. - for (i = 0; i < num_clks; i++) {
  351. - if (!gcc_msm8960_clks[i])
  352. - continue;
  353. - clk = devm_clk_register_regmap(dev, gcc_msm8960_clks[i]);
  354. - if (IS_ERR(clk))
  355. - return PTR_ERR(clk);
  356. - clks[i] = clk;
  357. - }
  358. -
  359. - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
  360. - if (ret)
  361. - return ret;
  362. -
  363. - reset = &cc->reset;
  364. - reset->rcdev.of_node = dev->of_node;
  365. - reset->rcdev.ops = &qcom_reset_ops,
  366. - reset->rcdev.owner = THIS_MODULE,
  367. - reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8960_resets),
  368. - reset->regmap = regmap;
  369. - reset->reset_map = gcc_msm8960_resets,
  370. - platform_set_drvdata(pdev, &reset->rcdev);
  371. -
  372. - ret = reset_controller_register(&reset->rcdev);
  373. - if (ret)
  374. - of_clk_del_provider(dev->of_node);
  375. -
  376. - return ret;
  377. + return qcom_cc_probe(pdev, &gcc_msm8960_desc);
  378. }
  379. static int gcc_msm8960_remove(struct platform_device *pdev)
  380. {
  381. - of_clk_del_provider(pdev->dev.of_node);
  382. - reset_controller_unregister(platform_get_drvdata(pdev));
  383. + qcom_cc_remove(pdev);
  384. return 0;
  385. }
  386. --- a/drivers/clk/qcom/gcc-msm8974.c
  387. +++ b/drivers/clk/qcom/gcc-msm8974.c
  388. @@ -25,6 +25,7 @@
  389. #include <dt-bindings/clock/qcom,gcc-msm8974.h>
  390. #include <dt-bindings/reset/qcom,gcc-msm8974.h>
  391. +#include "common.h"
  392. #include "clk-regmap.h"
  393. #include "clk-pll.h"
  394. #include "clk-rcg.h"
  395. @@ -2574,51 +2575,24 @@ static const struct regmap_config gcc_ms
  396. .fast_io = true,
  397. };
  398. +static const struct qcom_cc_desc gcc_msm8974_desc = {
  399. + .config = &gcc_msm8974_regmap_config,
  400. + .clks = gcc_msm8974_clocks,
  401. + .num_clks = ARRAY_SIZE(gcc_msm8974_clocks),
  402. + .resets = gcc_msm8974_resets,
  403. + .num_resets = ARRAY_SIZE(gcc_msm8974_resets),
  404. +};
  405. +
  406. static const struct of_device_id gcc_msm8974_match_table[] = {
  407. { .compatible = "qcom,gcc-msm8974" },
  408. { }
  409. };
  410. MODULE_DEVICE_TABLE(of, gcc_msm8974_match_table);
  411. -struct qcom_cc {
  412. - struct qcom_reset_controller reset;
  413. - struct clk_onecell_data data;
  414. - struct clk *clks[];
  415. -};
  416. -
  417. static int gcc_msm8974_probe(struct platform_device *pdev)
  418. {
  419. - void __iomem *base;
  420. - struct resource *res;
  421. - int i, ret;
  422. - struct device *dev = &pdev->dev;
  423. struct clk *clk;
  424. - struct clk_onecell_data *data;
  425. - struct clk **clks;
  426. - struct regmap *regmap;
  427. - size_t num_clks;
  428. - struct qcom_reset_controller *reset;
  429. - struct qcom_cc *cc;
  430. -
  431. - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  432. - base = devm_ioremap_resource(dev, res);
  433. - if (IS_ERR(base))
  434. - return PTR_ERR(base);
  435. -
  436. - regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8974_regmap_config);
  437. - if (IS_ERR(regmap))
  438. - return PTR_ERR(regmap);
  439. -
  440. - num_clks = ARRAY_SIZE(gcc_msm8974_clocks);
  441. - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
  442. - GFP_KERNEL);
  443. - if (!cc)
  444. - return -ENOMEM;
  445. -
  446. - clks = cc->clks;
  447. - data = &cc->data;
  448. - data->clks = clks;
  449. - data->clk_num = num_clks;
  450. + struct device *dev = &pdev->dev;
  451. /* Temporary until RPM clocks supported */
  452. clk = clk_register_fixed_rate(dev, "xo", NULL, CLK_IS_ROOT, 19200000);
  453. @@ -2631,39 +2605,12 @@ static int gcc_msm8974_probe(struct plat
  454. if (IS_ERR(clk))
  455. return PTR_ERR(clk);
  456. - for (i = 0; i < num_clks; i++) {
  457. - if (!gcc_msm8974_clocks[i])
  458. - continue;
  459. - clk = devm_clk_register_regmap(dev, gcc_msm8974_clocks[i]);
  460. - if (IS_ERR(clk))
  461. - return PTR_ERR(clk);
  462. - clks[i] = clk;
  463. - }
  464. -
  465. - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
  466. - if (ret)
  467. - return ret;
  468. -
  469. - reset = &cc->reset;
  470. - reset->rcdev.of_node = dev->of_node;
  471. - reset->rcdev.ops = &qcom_reset_ops,
  472. - reset->rcdev.owner = THIS_MODULE,
  473. - reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8974_resets),
  474. - reset->regmap = regmap;
  475. - reset->reset_map = gcc_msm8974_resets,
  476. - platform_set_drvdata(pdev, &reset->rcdev);
  477. -
  478. - ret = reset_controller_register(&reset->rcdev);
  479. - if (ret)
  480. - of_clk_del_provider(dev->of_node);
  481. -
  482. - return ret;
  483. + return qcom_cc_probe(pdev, &gcc_msm8974_desc);
  484. }
  485. static int gcc_msm8974_remove(struct platform_device *pdev)
  486. {
  487. - of_clk_del_provider(pdev->dev.of_node);
  488. - reset_controller_unregister(platform_get_drvdata(pdev));
  489. + qcom_cc_remove(pdev);
  490. return 0;
  491. }
  492. --- a/drivers/clk/qcom/mmcc-msm8960.c
  493. +++ b/drivers/clk/qcom/mmcc-msm8960.c
  494. @@ -26,6 +26,7 @@
  495. #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
  496. #include <dt-bindings/reset/qcom,mmcc-msm8960.h>
  497. +#include "common.h"
  498. #include "clk-regmap.h"
  499. #include "clk-pll.h"
  500. #include "clk-rcg.h"
  501. @@ -2222,85 +2223,28 @@ static const struct regmap_config mmcc_m
  502. .fast_io = true,
  503. };
  504. +static const struct qcom_cc_desc mmcc_msm8960_desc = {
  505. + .config = &mmcc_msm8960_regmap_config,
  506. + .clks = mmcc_msm8960_clks,
  507. + .num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
  508. + .resets = mmcc_msm8960_resets,
  509. + .num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
  510. +};
  511. +
  512. static const struct of_device_id mmcc_msm8960_match_table[] = {
  513. { .compatible = "qcom,mmcc-msm8960" },
  514. { }
  515. };
  516. MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
  517. -struct qcom_cc {
  518. - struct qcom_reset_controller reset;
  519. - struct clk_onecell_data data;
  520. - struct clk *clks[];
  521. -};
  522. -
  523. static int mmcc_msm8960_probe(struct platform_device *pdev)
  524. {
  525. - void __iomem *base;
  526. - struct resource *res;
  527. - int i, ret;
  528. - struct device *dev = &pdev->dev;
  529. - struct clk *clk;
  530. - struct clk_onecell_data *data;
  531. - struct clk **clks;
  532. - struct regmap *regmap;
  533. - size_t num_clks;
  534. - struct qcom_reset_controller *reset;
  535. - struct qcom_cc *cc;
  536. -
  537. - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  538. - base = devm_ioremap_resource(dev, res);
  539. - if (IS_ERR(base))
  540. - return PTR_ERR(base);
  541. -
  542. - regmap = devm_regmap_init_mmio(dev, base, &mmcc_msm8960_regmap_config);
  543. - if (IS_ERR(regmap))
  544. - return PTR_ERR(regmap);
  545. -
  546. - num_clks = ARRAY_SIZE(mmcc_msm8960_clks);
  547. - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
  548. - GFP_KERNEL);
  549. - if (!cc)
  550. - return -ENOMEM;
  551. -
  552. - clks = cc->clks;
  553. - data = &cc->data;
  554. - data->clks = clks;
  555. - data->clk_num = num_clks;
  556. -
  557. - for (i = 0; i < num_clks; i++) {
  558. - if (!mmcc_msm8960_clks[i])
  559. - continue;
  560. - clk = devm_clk_register_regmap(dev, mmcc_msm8960_clks[i]);
  561. - if (IS_ERR(clk))
  562. - return PTR_ERR(clk);
  563. - clks[i] = clk;
  564. - }
  565. -
  566. - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
  567. - if (ret)
  568. - return ret;
  569. -
  570. - reset = &cc->reset;
  571. - reset->rcdev.of_node = dev->of_node;
  572. - reset->rcdev.ops = &qcom_reset_ops,
  573. - reset->rcdev.owner = THIS_MODULE,
  574. - reset->rcdev.nr_resets = ARRAY_SIZE(mmcc_msm8960_resets),
  575. - reset->regmap = regmap;
  576. - reset->reset_map = mmcc_msm8960_resets,
  577. - platform_set_drvdata(pdev, &reset->rcdev);
  578. -
  579. - ret = reset_controller_register(&reset->rcdev);
  580. - if (ret)
  581. - of_clk_del_provider(dev->of_node);
  582. -
  583. - return ret;
  584. + return qcom_cc_probe(pdev, &mmcc_msm8960_desc);
  585. }
  586. static int mmcc_msm8960_remove(struct platform_device *pdev)
  587. {
  588. - of_clk_del_provider(pdev->dev.of_node);
  589. - reset_controller_unregister(platform_get_drvdata(pdev));
  590. + qcom_cc_remove(pdev);
  591. return 0;
  592. }
  593. --- a/drivers/clk/qcom/mmcc-msm8974.c
  594. +++ b/drivers/clk/qcom/mmcc-msm8974.c
  595. @@ -25,6 +25,7 @@
  596. #include <dt-bindings/clock/qcom,mmcc-msm8974.h>
  597. #include <dt-bindings/reset/qcom,mmcc-msm8974.h>
  598. +#include "common.h"
  599. #include "clk-regmap.h"
  600. #include "clk-pll.h"
  601. #include "clk-rcg.h"
  602. @@ -2527,88 +2528,39 @@ static const struct regmap_config mmcc_m
  603. .fast_io = true,
  604. };
  605. +static const struct qcom_cc_desc mmcc_msm8974_desc = {
  606. + .config = &mmcc_msm8974_regmap_config,
  607. + .clks = mmcc_msm8974_clocks,
  608. + .num_clks = ARRAY_SIZE(mmcc_msm8974_clocks),
  609. + .resets = mmcc_msm8974_resets,
  610. + .num_resets = ARRAY_SIZE(mmcc_msm8974_resets),
  611. +};
  612. +
  613. static const struct of_device_id mmcc_msm8974_match_table[] = {
  614. { .compatible = "qcom,mmcc-msm8974" },
  615. { }
  616. };
  617. MODULE_DEVICE_TABLE(of, mmcc_msm8974_match_table);
  618. -struct qcom_cc {
  619. - struct qcom_reset_controller reset;
  620. - struct clk_onecell_data data;
  621. - struct clk *clks[];
  622. -};
  623. -
  624. static int mmcc_msm8974_probe(struct platform_device *pdev)
  625. {
  626. - void __iomem *base;
  627. - struct resource *res;
  628. - int i, ret;
  629. - struct device *dev = &pdev->dev;
  630. - struct clk *clk;
  631. - struct clk_onecell_data *data;
  632. - struct clk **clks;
  633. + int ret;
  634. struct regmap *regmap;
  635. - size_t num_clks;
  636. - struct qcom_reset_controller *reset;
  637. - struct qcom_cc *cc;
  638. -
  639. - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  640. - base = devm_ioremap_resource(dev, res);
  641. - if (IS_ERR(base))
  642. - return PTR_ERR(base);
  643. -
  644. - regmap = devm_regmap_init_mmio(dev, base, &mmcc_msm8974_regmap_config);
  645. - if (IS_ERR(regmap))
  646. - return PTR_ERR(regmap);
  647. -
  648. - num_clks = ARRAY_SIZE(mmcc_msm8974_clocks);
  649. - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
  650. - GFP_KERNEL);
  651. - if (!cc)
  652. - return -ENOMEM;
  653. -
  654. - clks = cc->clks;
  655. - data = &cc->data;
  656. - data->clks = clks;
  657. - data->clk_num = num_clks;
  658. -
  659. - clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true);
  660. - clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false);
  661. - for (i = 0; i < num_clks; i++) {
  662. - if (!mmcc_msm8974_clocks[i])
  663. - continue;
  664. - clk = devm_clk_register_regmap(dev, mmcc_msm8974_clocks[i]);
  665. - if (IS_ERR(clk))
  666. - return PTR_ERR(clk);
  667. - clks[i] = clk;
  668. - }
  669. -
  670. - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
  671. + ret = qcom_cc_probe(pdev, &mmcc_msm8974_desc);
  672. if (ret)
  673. return ret;
  674. - reset = &cc->reset;
  675. - reset->rcdev.of_node = dev->of_node;
  676. - reset->rcdev.ops = &qcom_reset_ops,
  677. - reset->rcdev.owner = THIS_MODULE,
  678. - reset->rcdev.nr_resets = ARRAY_SIZE(mmcc_msm8974_resets),
  679. - reset->regmap = regmap;
  680. - reset->reset_map = mmcc_msm8974_resets,
  681. - platform_set_drvdata(pdev, &reset->rcdev);
  682. -
  683. - ret = reset_controller_register(&reset->rcdev);
  684. - if (ret)
  685. - of_clk_del_provider(dev->of_node);
  686. + regmap = dev_get_regmap(&pdev->dev, NULL);
  687. + clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true);
  688. + clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false);
  689. - return ret;
  690. + return 0;
  691. }
  692. static int mmcc_msm8974_remove(struct platform_device *pdev)
  693. {
  694. - of_clk_del_provider(pdev->dev.of_node);
  695. - reset_controller_unregister(platform_get_drvdata(pdev));
  696. + qcom_cc_remove(pdev);
  697. return 0;
  698. }