1 From d79cb0c583772f38a9367af106d61bcf8bfa08e4 Mon Sep 17 00:00:00 2001
2 From: Stephen Boyd <sboyd@codeaurora.org>
3 Date: Fri, 21 Mar 2014 17:59:37 -0700
4 Subject: [PATCH 078/182] clk: qcom: Consolidate common probe code
6 Most of the probe code is the same between all the different
7 clock controllers. Consolidate the code into a common.c file.
8 This makes changes to the common probe parts easier and reduces
11 Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
12 Signed-off-by: Kumar Gala <galak@codeaurora.org>
14 drivers/clk/qcom/Makefile | 1 +
15 drivers/clk/qcom/common.c | 99 +++++++++++++++++++++++++++++++++++++++
16 drivers/clk/qcom/common.h | 34 ++++++++++++++
17 drivers/clk/qcom/gcc-msm8660.c | 87 +++++-----------------------------
18 drivers/clk/qcom/gcc-msm8960.c | 77 +++++-------------------------
19 drivers/clk/qcom/gcc-msm8974.c | 77 +++++-------------------------
20 drivers/clk/qcom/mmcc-msm8960.c | 78 +++++-------------------------
21 drivers/clk/qcom/mmcc-msm8974.c | 80 +++++++------------------------
22 8 files changed, 196 insertions(+), 337 deletions(-)
23 create mode 100644 drivers/clk/qcom/common.c
24 create mode 100644 drivers/clk/qcom/common.h
26 diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
27 index f60db2e..689e05b 100644
28 --- a/drivers/clk/qcom/Makefile
29 +++ b/drivers/clk/qcom/Makefile
31 obj-$(CONFIG_COMMON_CLK_QCOM) += clk-qcom.o
33 +clk-qcom-y += common.o
34 clk-qcom-y += clk-regmap.o
35 clk-qcom-y += clk-pll.o
36 clk-qcom-y += clk-rcg.o
37 diff --git a/drivers/clk/qcom/common.c b/drivers/clk/qcom/common.c
39 index 0000000..86b45fb
41 +++ b/drivers/clk/qcom/common.c
44 + * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
46 + * This software is licensed under the terms of the GNU General Public
47 + * License version 2, as published by the Free Software Foundation, and
48 + * may be copied, distributed, and modified under those terms.
50 + * This program is distributed in the hope that it will be useful,
51 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
52 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53 + * GNU General Public License for more details.
56 +#include <linux/export.h>
57 +#include <linux/regmap.h>
58 +#include <linux/platform_device.h>
59 +#include <linux/clk-provider.h>
60 +#include <linux/reset-controller.h>
63 +#include "clk-regmap.h"
67 + struct qcom_reset_controller reset;
68 + struct clk_onecell_data data;
72 +int qcom_cc_probe(struct platform_device *pdev, const struct qcom_cc_desc *desc)
75 + struct resource *res;
77 + struct device *dev = &pdev->dev;
79 + struct clk_onecell_data *data;
81 + struct regmap *regmap;
82 + struct qcom_reset_controller *reset;
84 + size_t num_clks = desc->num_clks;
85 + struct clk_regmap **rclks = desc->clks;
87 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
88 + base = devm_ioremap_resource(dev, res);
90 + return PTR_ERR(base);
92 + regmap = devm_regmap_init_mmio(dev, base, desc->config);
94 + return PTR_ERR(regmap);
96 + cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
104 + data->clk_num = num_clks;
106 + for (i = 0; i < num_clks; i++) {
109 + clk = devm_clk_register_regmap(dev, rclks[i]);
111 + return PTR_ERR(clk);
115 + ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
119 + reset = &cc->reset;
120 + reset->rcdev.of_node = dev->of_node;
121 + reset->rcdev.ops = &qcom_reset_ops;
122 + reset->rcdev.owner = dev->driver->owner;
123 + reset->rcdev.nr_resets = desc->num_resets;
124 + reset->regmap = regmap;
125 + reset->reset_map = desc->resets;
126 + platform_set_drvdata(pdev, &reset->rcdev);
128 + ret = reset_controller_register(&reset->rcdev);
130 + of_clk_del_provider(dev->of_node);
134 +EXPORT_SYMBOL_GPL(qcom_cc_probe);
136 +void qcom_cc_remove(struct platform_device *pdev)
138 + of_clk_del_provider(pdev->dev.of_node);
139 + reset_controller_unregister(platform_get_drvdata(pdev));
141 +EXPORT_SYMBOL_GPL(qcom_cc_remove);
142 diff --git a/drivers/clk/qcom/common.h b/drivers/clk/qcom/common.h
144 index 0000000..2c3cfc8
146 +++ b/drivers/clk/qcom/common.h
149 + * Copyright (c) 2014, The Linux Foundation. All rights reserved.
151 + * This software is licensed under the terms of the GNU General Public
152 + * License version 2, as published by the Free Software Foundation, and
153 + * may be copied, distributed, and modified under those terms.
155 + * This program is distributed in the hope that it will be useful,
156 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
157 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
158 + * GNU General Public License for more details.
160 +#ifndef __QCOM_CLK_COMMON_H__
161 +#define __QCOM_CLK_COMMON_H__
163 +struct platform_device;
164 +struct regmap_config;
166 +struct qcom_reset_map;
168 +struct qcom_cc_desc {
169 + const struct regmap_config *config;
170 + struct clk_regmap **clks;
172 + const struct qcom_reset_map *resets;
176 +extern int qcom_cc_probe(struct platform_device *pdev,
177 + const struct qcom_cc_desc *desc);
179 +extern void qcom_cc_remove(struct platform_device *pdev);
182 diff --git a/drivers/clk/qcom/gcc-msm8660.c b/drivers/clk/qcom/gcc-msm8660.c
183 index bc0b7f1..44bc6fa 100644
184 --- a/drivers/clk/qcom/gcc-msm8660.c
185 +++ b/drivers/clk/qcom/gcc-msm8660.c
187 #include <dt-bindings/clock/qcom,gcc-msm8660.h>
188 #include <dt-bindings/reset/qcom,gcc-msm8660.h>
191 #include "clk-regmap.h"
194 @@ -2701,94 +2702,28 @@ static const struct regmap_config gcc_msm8660_regmap_config = {
198 +static const struct qcom_cc_desc gcc_msm8660_desc = {
199 + .config = &gcc_msm8660_regmap_config,
200 + .clks = gcc_msm8660_clks,
201 + .num_clks = ARRAY_SIZE(gcc_msm8660_clks),
202 + .resets = gcc_msm8660_resets,
203 + .num_resets = ARRAY_SIZE(gcc_msm8660_resets),
206 static const struct of_device_id gcc_msm8660_match_table[] = {
207 { .compatible = "qcom,gcc-msm8660" },
210 MODULE_DEVICE_TABLE(of, gcc_msm8660_match_table);
213 - struct qcom_reset_controller reset;
214 - struct clk_onecell_data data;
215 - struct clk *clks[];
218 static int gcc_msm8660_probe(struct platform_device *pdev)
220 - void __iomem *base;
221 - struct resource *res;
223 - struct device *dev = &pdev->dev;
225 - struct clk_onecell_data *data;
227 - struct regmap *regmap;
229 - struct qcom_reset_controller *reset;
230 - struct qcom_cc *cc;
232 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
233 - base = devm_ioremap_resource(dev, res);
235 - return PTR_ERR(base);
237 - regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8660_regmap_config);
238 - if (IS_ERR(regmap))
239 - return PTR_ERR(regmap);
241 - num_clks = ARRAY_SIZE(gcc_msm8660_clks);
242 - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
250 - data->clk_num = num_clks;
252 - /* Temporary until RPM clocks supported */
253 - clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000);
255 - return PTR_ERR(clk);
257 - clk = clk_register_fixed_rate(dev, "pxo", NULL, CLK_IS_ROOT, 27000000);
259 - return PTR_ERR(clk);
261 - for (i = 0; i < num_clks; i++) {
262 - if (!gcc_msm8660_clks[i])
264 - clk = devm_clk_register_regmap(dev, gcc_msm8660_clks[i]);
266 - return PTR_ERR(clk);
270 - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
274 - reset = &cc->reset;
275 - reset->rcdev.of_node = dev->of_node;
276 - reset->rcdev.ops = &qcom_reset_ops,
277 - reset->rcdev.owner = THIS_MODULE,
278 - reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8660_resets),
279 - reset->regmap = regmap;
280 - reset->reset_map = gcc_msm8660_resets,
281 - platform_set_drvdata(pdev, &reset->rcdev);
283 - ret = reset_controller_register(&reset->rcdev);
285 - of_clk_del_provider(dev->of_node);
288 + return qcom_cc_probe(pdev, &gcc_msm8660_desc);
291 static int gcc_msm8660_remove(struct platform_device *pdev)
293 - of_clk_del_provider(pdev->dev.of_node);
294 - reset_controller_unregister(platform_get_drvdata(pdev));
295 + qcom_cc_remove(pdev);
299 diff --git a/drivers/clk/qcom/gcc-msm8960.c b/drivers/clk/qcom/gcc-msm8960.c
300 index fd446ab..633b019 100644
301 --- a/drivers/clk/qcom/gcc-msm8960.c
302 +++ b/drivers/clk/qcom/gcc-msm8960.c
304 #include <dt-bindings/clock/qcom,gcc-msm8960.h>
305 #include <dt-bindings/reset/qcom,gcc-msm8960.h>
308 #include "clk-regmap.h"
311 @@ -2875,51 +2876,24 @@ static const struct regmap_config gcc_msm8960_regmap_config = {
315 +static const struct qcom_cc_desc gcc_msm8960_desc = {
316 + .config = &gcc_msm8960_regmap_config,
317 + .clks = gcc_msm8960_clks,
318 + .num_clks = ARRAY_SIZE(gcc_msm8960_clks),
319 + .resets = gcc_msm8960_resets,
320 + .num_resets = ARRAY_SIZE(gcc_msm8960_resets),
323 static const struct of_device_id gcc_msm8960_match_table[] = {
324 { .compatible = "qcom,gcc-msm8960" },
327 MODULE_DEVICE_TABLE(of, gcc_msm8960_match_table);
330 - struct qcom_reset_controller reset;
331 - struct clk_onecell_data data;
332 - struct clk *clks[];
335 static int gcc_msm8960_probe(struct platform_device *pdev)
337 - void __iomem *base;
338 - struct resource *res;
340 - struct device *dev = &pdev->dev;
342 - struct clk_onecell_data *data;
344 - struct regmap *regmap;
346 - struct qcom_reset_controller *reset;
347 - struct qcom_cc *cc;
349 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
350 - base = devm_ioremap_resource(dev, res);
352 - return PTR_ERR(base);
354 - regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8960_regmap_config);
355 - if (IS_ERR(regmap))
356 - return PTR_ERR(regmap);
358 - num_clks = ARRAY_SIZE(gcc_msm8960_clks);
359 - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
367 - data->clk_num = num_clks;
368 + struct device *dev = &pdev->dev;
370 /* Temporary until RPM clocks supported */
371 clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000);
372 @@ -2930,39 +2904,12 @@ static int gcc_msm8960_probe(struct platform_device *pdev)
376 - for (i = 0; i < num_clks; i++) {
377 - if (!gcc_msm8960_clks[i])
379 - clk = devm_clk_register_regmap(dev, gcc_msm8960_clks[i]);
381 - return PTR_ERR(clk);
385 - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
389 - reset = &cc->reset;
390 - reset->rcdev.of_node = dev->of_node;
391 - reset->rcdev.ops = &qcom_reset_ops,
392 - reset->rcdev.owner = THIS_MODULE,
393 - reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8960_resets),
394 - reset->regmap = regmap;
395 - reset->reset_map = gcc_msm8960_resets,
396 - platform_set_drvdata(pdev, &reset->rcdev);
398 - ret = reset_controller_register(&reset->rcdev);
400 - of_clk_del_provider(dev->of_node);
403 + return qcom_cc_probe(pdev, &gcc_msm8960_desc);
406 static int gcc_msm8960_remove(struct platform_device *pdev)
408 - of_clk_del_provider(pdev->dev.of_node);
409 - reset_controller_unregister(platform_get_drvdata(pdev));
410 + qcom_cc_remove(pdev);
414 diff --git a/drivers/clk/qcom/gcc-msm8974.c b/drivers/clk/qcom/gcc-msm8974.c
415 index 51d457e..0d1edc1 100644
416 --- a/drivers/clk/qcom/gcc-msm8974.c
417 +++ b/drivers/clk/qcom/gcc-msm8974.c
419 #include <dt-bindings/clock/qcom,gcc-msm8974.h>
420 #include <dt-bindings/reset/qcom,gcc-msm8974.h>
423 #include "clk-regmap.h"
426 @@ -2574,51 +2575,24 @@ static const struct regmap_config gcc_msm8974_regmap_config = {
430 +static const struct qcom_cc_desc gcc_msm8974_desc = {
431 + .config = &gcc_msm8974_regmap_config,
432 + .clks = gcc_msm8974_clocks,
433 + .num_clks = ARRAY_SIZE(gcc_msm8974_clocks),
434 + .resets = gcc_msm8974_resets,
435 + .num_resets = ARRAY_SIZE(gcc_msm8974_resets),
438 static const struct of_device_id gcc_msm8974_match_table[] = {
439 { .compatible = "qcom,gcc-msm8974" },
442 MODULE_DEVICE_TABLE(of, gcc_msm8974_match_table);
445 - struct qcom_reset_controller reset;
446 - struct clk_onecell_data data;
447 - struct clk *clks[];
450 static int gcc_msm8974_probe(struct platform_device *pdev)
452 - void __iomem *base;
453 - struct resource *res;
455 - struct device *dev = &pdev->dev;
457 - struct clk_onecell_data *data;
459 - struct regmap *regmap;
461 - struct qcom_reset_controller *reset;
462 - struct qcom_cc *cc;
464 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
465 - base = devm_ioremap_resource(dev, res);
467 - return PTR_ERR(base);
469 - regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8974_regmap_config);
470 - if (IS_ERR(regmap))
471 - return PTR_ERR(regmap);
473 - num_clks = ARRAY_SIZE(gcc_msm8974_clocks);
474 - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
482 - data->clk_num = num_clks;
483 + struct device *dev = &pdev->dev;
485 /* Temporary until RPM clocks supported */
486 clk = clk_register_fixed_rate(dev, "xo", NULL, CLK_IS_ROOT, 19200000);
487 @@ -2631,39 +2605,12 @@ static int gcc_msm8974_probe(struct platform_device *pdev)
491 - for (i = 0; i < num_clks; i++) {
492 - if (!gcc_msm8974_clocks[i])
494 - clk = devm_clk_register_regmap(dev, gcc_msm8974_clocks[i]);
496 - return PTR_ERR(clk);
500 - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
504 - reset = &cc->reset;
505 - reset->rcdev.of_node = dev->of_node;
506 - reset->rcdev.ops = &qcom_reset_ops,
507 - reset->rcdev.owner = THIS_MODULE,
508 - reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8974_resets),
509 - reset->regmap = regmap;
510 - reset->reset_map = gcc_msm8974_resets,
511 - platform_set_drvdata(pdev, &reset->rcdev);
513 - ret = reset_controller_register(&reset->rcdev);
515 - of_clk_del_provider(dev->of_node);
518 + return qcom_cc_probe(pdev, &gcc_msm8974_desc);
521 static int gcc_msm8974_remove(struct platform_device *pdev)
523 - of_clk_del_provider(pdev->dev.of_node);
524 - reset_controller_unregister(platform_get_drvdata(pdev));
525 + qcom_cc_remove(pdev);
529 diff --git a/drivers/clk/qcom/mmcc-msm8960.c b/drivers/clk/qcom/mmcc-msm8960.c
530 index f9b59c7..12f3c0b 100644
531 --- a/drivers/clk/qcom/mmcc-msm8960.c
532 +++ b/drivers/clk/qcom/mmcc-msm8960.c
534 #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
535 #include <dt-bindings/reset/qcom,mmcc-msm8960.h>
538 #include "clk-regmap.h"
541 @@ -2222,85 +2223,28 @@ static const struct regmap_config mmcc_msm8960_regmap_config = {
545 +static const struct qcom_cc_desc mmcc_msm8960_desc = {
546 + .config = &mmcc_msm8960_regmap_config,
547 + .clks = mmcc_msm8960_clks,
548 + .num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
549 + .resets = mmcc_msm8960_resets,
550 + .num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
553 static const struct of_device_id mmcc_msm8960_match_table[] = {
554 { .compatible = "qcom,mmcc-msm8960" },
557 MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
560 - struct qcom_reset_controller reset;
561 - struct clk_onecell_data data;
562 - struct clk *clks[];
565 static int mmcc_msm8960_probe(struct platform_device *pdev)
567 - void __iomem *base;
568 - struct resource *res;
570 - struct device *dev = &pdev->dev;
572 - struct clk_onecell_data *data;
574 - struct regmap *regmap;
576 - struct qcom_reset_controller *reset;
577 - struct qcom_cc *cc;
579 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
580 - base = devm_ioremap_resource(dev, res);
582 - return PTR_ERR(base);
584 - regmap = devm_regmap_init_mmio(dev, base, &mmcc_msm8960_regmap_config);
585 - if (IS_ERR(regmap))
586 - return PTR_ERR(regmap);
588 - num_clks = ARRAY_SIZE(mmcc_msm8960_clks);
589 - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
597 - data->clk_num = num_clks;
599 - for (i = 0; i < num_clks; i++) {
600 - if (!mmcc_msm8960_clks[i])
602 - clk = devm_clk_register_regmap(dev, mmcc_msm8960_clks[i]);
604 - return PTR_ERR(clk);
608 - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
612 - reset = &cc->reset;
613 - reset->rcdev.of_node = dev->of_node;
614 - reset->rcdev.ops = &qcom_reset_ops,
615 - reset->rcdev.owner = THIS_MODULE,
616 - reset->rcdev.nr_resets = ARRAY_SIZE(mmcc_msm8960_resets),
617 - reset->regmap = regmap;
618 - reset->reset_map = mmcc_msm8960_resets,
619 - platform_set_drvdata(pdev, &reset->rcdev);
621 - ret = reset_controller_register(&reset->rcdev);
623 - of_clk_del_provider(dev->of_node);
626 + return qcom_cc_probe(pdev, &mmcc_msm8960_desc);
629 static int mmcc_msm8960_remove(struct platform_device *pdev)
631 - of_clk_del_provider(pdev->dev.of_node);
632 - reset_controller_unregister(platform_get_drvdata(pdev));
633 + qcom_cc_remove(pdev);
637 diff --git a/drivers/clk/qcom/mmcc-msm8974.c b/drivers/clk/qcom/mmcc-msm8974.c
638 index c957745..60b7c24 100644
639 --- a/drivers/clk/qcom/mmcc-msm8974.c
640 +++ b/drivers/clk/qcom/mmcc-msm8974.c
642 #include <dt-bindings/clock/qcom,mmcc-msm8974.h>
643 #include <dt-bindings/reset/qcom,mmcc-msm8974.h>
646 #include "clk-regmap.h"
649 @@ -2524,88 +2525,39 @@ static const struct regmap_config mmcc_msm8974_regmap_config = {
653 +static const struct qcom_cc_desc mmcc_msm8974_desc = {
654 + .config = &mmcc_msm8974_regmap_config,
655 + .clks = mmcc_msm8974_clocks,
656 + .num_clks = ARRAY_SIZE(mmcc_msm8974_clocks),
657 + .resets = mmcc_msm8974_resets,
658 + .num_resets = ARRAY_SIZE(mmcc_msm8974_resets),
661 static const struct of_device_id mmcc_msm8974_match_table[] = {
662 { .compatible = "qcom,mmcc-msm8974" },
665 MODULE_DEVICE_TABLE(of, mmcc_msm8974_match_table);
668 - struct qcom_reset_controller reset;
669 - struct clk_onecell_data data;
670 - struct clk *clks[];
673 static int mmcc_msm8974_probe(struct platform_device *pdev)
675 - void __iomem *base;
676 - struct resource *res;
678 - struct device *dev = &pdev->dev;
680 - struct clk_onecell_data *data;
683 struct regmap *regmap;
685 - struct qcom_reset_controller *reset;
686 - struct qcom_cc *cc;
688 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
689 - base = devm_ioremap_resource(dev, res);
691 - return PTR_ERR(base);
693 - regmap = devm_regmap_init_mmio(dev, base, &mmcc_msm8974_regmap_config);
694 - if (IS_ERR(regmap))
695 - return PTR_ERR(regmap);
697 - num_clks = ARRAY_SIZE(mmcc_msm8974_clocks);
698 - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
706 - data->clk_num = num_clks;
708 - clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true);
709 - clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false);
711 - for (i = 0; i < num_clks; i++) {
712 - if (!mmcc_msm8974_clocks[i])
714 - clk = devm_clk_register_regmap(dev, mmcc_msm8974_clocks[i]);
716 - return PTR_ERR(clk);
720 - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
721 + ret = qcom_cc_probe(pdev, &mmcc_msm8974_desc);
725 - reset = &cc->reset;
726 - reset->rcdev.of_node = dev->of_node;
727 - reset->rcdev.ops = &qcom_reset_ops,
728 - reset->rcdev.owner = THIS_MODULE,
729 - reset->rcdev.nr_resets = ARRAY_SIZE(mmcc_msm8974_resets),
730 - reset->regmap = regmap;
731 - reset->reset_map = mmcc_msm8974_resets,
732 - platform_set_drvdata(pdev, &reset->rcdev);
734 - ret = reset_controller_register(&reset->rcdev);
736 - of_clk_del_provider(dev->of_node);
737 + regmap = dev_get_regmap(&pdev->dev, NULL);
738 + clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true);
739 + clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false);
745 static int mmcc_msm8974_remove(struct platform_device *pdev)
747 - of_clk_del_provider(pdev->dev.of_node);
748 - reset_controller_unregister(platform_get_drvdata(pdev));
749 + qcom_cc_remove(pdev);