| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734 |
- From d79cb0c583772f38a9367af106d61bcf8bfa08e4 Mon Sep 17 00:00:00 2001
- From: Stephen Boyd <[email protected]>
- Date: Fri, 21 Mar 2014 17:59:37 -0700
- Subject: [PATCH 078/182] clk: qcom: Consolidate common probe code
- Most of the probe code is the same between all the different
- clock controllers. Consolidate the code into a common.c file.
- This makes changes to the common probe parts easier and reduces
- chances for bugs.
- Signed-off-by: Stephen Boyd <[email protected]>
- Signed-off-by: Kumar Gala <[email protected]>
- ---
- drivers/clk/qcom/Makefile | 1 +
- drivers/clk/qcom/common.c | 99 +++++++++++++++++++++++++++++++++++++++
- drivers/clk/qcom/common.h | 34 ++++++++++++++
- drivers/clk/qcom/gcc-msm8660.c | 87 +++++-----------------------------
- drivers/clk/qcom/gcc-msm8960.c | 77 +++++-------------------------
- drivers/clk/qcom/gcc-msm8974.c | 77 +++++-------------------------
- drivers/clk/qcom/mmcc-msm8960.c | 78 +++++-------------------------
- drivers/clk/qcom/mmcc-msm8974.c | 80 +++++++------------------------
- 8 files changed, 196 insertions(+), 337 deletions(-)
- create mode 100644 drivers/clk/qcom/common.c
- create mode 100644 drivers/clk/qcom/common.h
- --- a/drivers/clk/qcom/Makefile
- +++ b/drivers/clk/qcom/Makefile
- @@ -1,5 +1,6 @@
- obj-$(CONFIG_COMMON_CLK_QCOM) += clk-qcom.o
-
- +clk-qcom-y += common.o
- clk-qcom-y += clk-regmap.o
- clk-qcom-y += clk-pll.o
- clk-qcom-y += clk-rcg.o
- --- /dev/null
- +++ b/drivers/clk/qcom/common.c
- @@ -0,0 +1,99 @@
- +/*
- + * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
- + *
- + * This software is licensed under the terms of the GNU General Public
- + * License version 2, as published by the Free Software Foundation, and
- + * may be copied, distributed, and modified under those terms.
- + *
- + * This program is distributed in the hope that it will be useful,
- + * but WITHOUT ANY WARRANTY; without even the implied warranty of
- + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- + * GNU General Public License for more details.
- + */
- +
- +#include <linux/export.h>
- +#include <linux/regmap.h>
- +#include <linux/platform_device.h>
- +#include <linux/clk-provider.h>
- +#include <linux/reset-controller.h>
- +
- +#include "common.h"
- +#include "clk-regmap.h"
- +#include "reset.h"
- +
- +struct qcom_cc {
- + struct qcom_reset_controller reset;
- + struct clk_onecell_data data;
- + struct clk *clks[];
- +};
- +
- +int qcom_cc_probe(struct platform_device *pdev, const struct qcom_cc_desc *desc)
- +{
- + void __iomem *base;
- + struct resource *res;
- + int i, ret;
- + struct device *dev = &pdev->dev;
- + struct clk *clk;
- + struct clk_onecell_data *data;
- + struct clk **clks;
- + struct regmap *regmap;
- + struct qcom_reset_controller *reset;
- + struct qcom_cc *cc;
- + size_t num_clks = desc->num_clks;
- + struct clk_regmap **rclks = desc->clks;
- +
- + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- + base = devm_ioremap_resource(dev, res);
- + if (IS_ERR(base))
- + return PTR_ERR(base);
- +
- + regmap = devm_regmap_init_mmio(dev, base, desc->config);
- + if (IS_ERR(regmap))
- + return PTR_ERR(regmap);
- +
- + cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
- + GFP_KERNEL);
- + if (!cc)
- + return -ENOMEM;
- +
- + clks = cc->clks;
- + data = &cc->data;
- + data->clks = clks;
- + data->clk_num = num_clks;
- +
- + for (i = 0; i < num_clks; i++) {
- + if (!rclks[i])
- + continue;
- + clk = devm_clk_register_regmap(dev, rclks[i]);
- + if (IS_ERR(clk))
- + return PTR_ERR(clk);
- + clks[i] = clk;
- + }
- +
- + ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
- + if (ret)
- + return ret;
- +
- + reset = &cc->reset;
- + reset->rcdev.of_node = dev->of_node;
- + reset->rcdev.ops = &qcom_reset_ops;
- + reset->rcdev.owner = dev->driver->owner;
- + reset->rcdev.nr_resets = desc->num_resets;
- + reset->regmap = regmap;
- + reset->reset_map = desc->resets;
- + platform_set_drvdata(pdev, &reset->rcdev);
- +
- + ret = reset_controller_register(&reset->rcdev);
- + if (ret)
- + of_clk_del_provider(dev->of_node);
- +
- + return ret;
- +}
- +EXPORT_SYMBOL_GPL(qcom_cc_probe);
- +
- +void qcom_cc_remove(struct platform_device *pdev)
- +{
- + of_clk_del_provider(pdev->dev.of_node);
- + reset_controller_unregister(platform_get_drvdata(pdev));
- +}
- +EXPORT_SYMBOL_GPL(qcom_cc_remove);
- --- /dev/null
- +++ b/drivers/clk/qcom/common.h
- @@ -0,0 +1,34 @@
- +/*
- + * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- + *
- + * This software is licensed under the terms of the GNU General Public
- + * License version 2, as published by the Free Software Foundation, and
- + * may be copied, distributed, and modified under those terms.
- + *
- + * This program is distributed in the hope that it will be useful,
- + * but WITHOUT ANY WARRANTY; without even the implied warranty of
- + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- + * GNU General Public License for more details.
- + */
- +#ifndef __QCOM_CLK_COMMON_H__
- +#define __QCOM_CLK_COMMON_H__
- +
- +struct platform_device;
- +struct regmap_config;
- +struct clk_regmap;
- +struct qcom_reset_map;
- +
- +struct qcom_cc_desc {
- + const struct regmap_config *config;
- + struct clk_regmap **clks;
- + size_t num_clks;
- + const struct qcom_reset_map *resets;
- + size_t num_resets;
- +};
- +
- +extern int qcom_cc_probe(struct platform_device *pdev,
- + const struct qcom_cc_desc *desc);
- +
- +extern void qcom_cc_remove(struct platform_device *pdev);
- +
- +#endif
- --- a/drivers/clk/qcom/gcc-msm8660.c
- +++ b/drivers/clk/qcom/gcc-msm8660.c
- @@ -25,6 +25,7 @@
- #include <dt-bindings/clock/qcom,gcc-msm8660.h>
- #include <dt-bindings/reset/qcom,gcc-msm8660.h>
-
- +#include "common.h"
- #include "clk-regmap.h"
- #include "clk-pll.h"
- #include "clk-rcg.h"
- @@ -2701,94 +2702,28 @@ static const struct regmap_config gcc_ms
- .fast_io = true,
- };
-
- +static const struct qcom_cc_desc gcc_msm8660_desc = {
- + .config = &gcc_msm8660_regmap_config,
- + .clks = gcc_msm8660_clks,
- + .num_clks = ARRAY_SIZE(gcc_msm8660_clks),
- + .resets = gcc_msm8660_resets,
- + .num_resets = ARRAY_SIZE(gcc_msm8660_resets),
- +};
- +
- static const struct of_device_id gcc_msm8660_match_table[] = {
- { .compatible = "qcom,gcc-msm8660" },
- { }
- };
- MODULE_DEVICE_TABLE(of, gcc_msm8660_match_table);
-
- -struct qcom_cc {
- - struct qcom_reset_controller reset;
- - struct clk_onecell_data data;
- - struct clk *clks[];
- -};
- -
- static int gcc_msm8660_probe(struct platform_device *pdev)
- {
- - void __iomem *base;
- - struct resource *res;
- - int i, ret;
- - struct device *dev = &pdev->dev;
- - struct clk *clk;
- - struct clk_onecell_data *data;
- - struct clk **clks;
- - struct regmap *regmap;
- - size_t num_clks;
- - struct qcom_reset_controller *reset;
- - struct qcom_cc *cc;
- -
- - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- - base = devm_ioremap_resource(dev, res);
- - if (IS_ERR(base))
- - return PTR_ERR(base);
- -
- - regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8660_regmap_config);
- - if (IS_ERR(regmap))
- - return PTR_ERR(regmap);
- -
- - num_clks = ARRAY_SIZE(gcc_msm8660_clks);
- - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
- - GFP_KERNEL);
- - if (!cc)
- - return -ENOMEM;
- -
- - clks = cc->clks;
- - data = &cc->data;
- - data->clks = clks;
- - data->clk_num = num_clks;
- -
- - /* Temporary until RPM clocks supported */
- - clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000);
- - if (IS_ERR(clk))
- - return PTR_ERR(clk);
- -
- - clk = clk_register_fixed_rate(dev, "pxo", NULL, CLK_IS_ROOT, 27000000);
- - if (IS_ERR(clk))
- - return PTR_ERR(clk);
- -
- - for (i = 0; i < num_clks; i++) {
- - if (!gcc_msm8660_clks[i])
- - continue;
- - clk = devm_clk_register_regmap(dev, gcc_msm8660_clks[i]);
- - if (IS_ERR(clk))
- - return PTR_ERR(clk);
- - clks[i] = clk;
- - }
- -
- - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
- - if (ret)
- - return ret;
- -
- - reset = &cc->reset;
- - reset->rcdev.of_node = dev->of_node;
- - reset->rcdev.ops = &qcom_reset_ops,
- - reset->rcdev.owner = THIS_MODULE,
- - reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8660_resets),
- - reset->regmap = regmap;
- - reset->reset_map = gcc_msm8660_resets,
- - platform_set_drvdata(pdev, &reset->rcdev);
- -
- - ret = reset_controller_register(&reset->rcdev);
- - if (ret)
- - of_clk_del_provider(dev->of_node);
- -
- - return ret;
- + return qcom_cc_probe(pdev, &gcc_msm8660_desc);
- }
-
- static int gcc_msm8660_remove(struct platform_device *pdev)
- {
- - of_clk_del_provider(pdev->dev.of_node);
- - reset_controller_unregister(platform_get_drvdata(pdev));
- + qcom_cc_remove(pdev);
- return 0;
- }
-
- --- a/drivers/clk/qcom/gcc-msm8960.c
- +++ b/drivers/clk/qcom/gcc-msm8960.c
- @@ -25,6 +25,7 @@
- #include <dt-bindings/clock/qcom,gcc-msm8960.h>
- #include <dt-bindings/reset/qcom,gcc-msm8960.h>
-
- +#include "common.h"
- #include "clk-regmap.h"
- #include "clk-pll.h"
- #include "clk-rcg.h"
- @@ -2875,51 +2876,24 @@ static const struct regmap_config gcc_ms
- .fast_io = true,
- };
-
- +static const struct qcom_cc_desc gcc_msm8960_desc = {
- + .config = &gcc_msm8960_regmap_config,
- + .clks = gcc_msm8960_clks,
- + .num_clks = ARRAY_SIZE(gcc_msm8960_clks),
- + .resets = gcc_msm8960_resets,
- + .num_resets = ARRAY_SIZE(gcc_msm8960_resets),
- +};
- +
- static const struct of_device_id gcc_msm8960_match_table[] = {
- { .compatible = "qcom,gcc-msm8960" },
- { }
- };
- MODULE_DEVICE_TABLE(of, gcc_msm8960_match_table);
-
- -struct qcom_cc {
- - struct qcom_reset_controller reset;
- - struct clk_onecell_data data;
- - struct clk *clks[];
- -};
- -
- static int gcc_msm8960_probe(struct platform_device *pdev)
- {
- - void __iomem *base;
- - struct resource *res;
- - int i, ret;
- - struct device *dev = &pdev->dev;
- struct clk *clk;
- - struct clk_onecell_data *data;
- - struct clk **clks;
- - struct regmap *regmap;
- - size_t num_clks;
- - struct qcom_reset_controller *reset;
- - struct qcom_cc *cc;
- -
- - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- - base = devm_ioremap_resource(dev, res);
- - if (IS_ERR(base))
- - return PTR_ERR(base);
- -
- - regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8960_regmap_config);
- - if (IS_ERR(regmap))
- - return PTR_ERR(regmap);
- -
- - num_clks = ARRAY_SIZE(gcc_msm8960_clks);
- - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
- - GFP_KERNEL);
- - if (!cc)
- - return -ENOMEM;
- -
- - clks = cc->clks;
- - data = &cc->data;
- - data->clks = clks;
- - data->clk_num = num_clks;
- + struct device *dev = &pdev->dev;
-
- /* Temporary until RPM clocks supported */
- clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000);
- @@ -2930,39 +2904,12 @@ static int gcc_msm8960_probe(struct plat
- if (IS_ERR(clk))
- return PTR_ERR(clk);
-
- - for (i = 0; i < num_clks; i++) {
- - if (!gcc_msm8960_clks[i])
- - continue;
- - clk = devm_clk_register_regmap(dev, gcc_msm8960_clks[i]);
- - if (IS_ERR(clk))
- - return PTR_ERR(clk);
- - clks[i] = clk;
- - }
- -
- - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
- - if (ret)
- - return ret;
- -
- - reset = &cc->reset;
- - reset->rcdev.of_node = dev->of_node;
- - reset->rcdev.ops = &qcom_reset_ops,
- - reset->rcdev.owner = THIS_MODULE,
- - reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8960_resets),
- - reset->regmap = regmap;
- - reset->reset_map = gcc_msm8960_resets,
- - platform_set_drvdata(pdev, &reset->rcdev);
- -
- - ret = reset_controller_register(&reset->rcdev);
- - if (ret)
- - of_clk_del_provider(dev->of_node);
- -
- - return ret;
- + return qcom_cc_probe(pdev, &gcc_msm8960_desc);
- }
-
- static int gcc_msm8960_remove(struct platform_device *pdev)
- {
- - of_clk_del_provider(pdev->dev.of_node);
- - reset_controller_unregister(platform_get_drvdata(pdev));
- + qcom_cc_remove(pdev);
- return 0;
- }
-
- --- a/drivers/clk/qcom/gcc-msm8974.c
- +++ b/drivers/clk/qcom/gcc-msm8974.c
- @@ -25,6 +25,7 @@
- #include <dt-bindings/clock/qcom,gcc-msm8974.h>
- #include <dt-bindings/reset/qcom,gcc-msm8974.h>
-
- +#include "common.h"
- #include "clk-regmap.h"
- #include "clk-pll.h"
- #include "clk-rcg.h"
- @@ -2574,51 +2575,24 @@ static const struct regmap_config gcc_ms
- .fast_io = true,
- };
-
- +static const struct qcom_cc_desc gcc_msm8974_desc = {
- + .config = &gcc_msm8974_regmap_config,
- + .clks = gcc_msm8974_clocks,
- + .num_clks = ARRAY_SIZE(gcc_msm8974_clocks),
- + .resets = gcc_msm8974_resets,
- + .num_resets = ARRAY_SIZE(gcc_msm8974_resets),
- +};
- +
- static const struct of_device_id gcc_msm8974_match_table[] = {
- { .compatible = "qcom,gcc-msm8974" },
- { }
- };
- MODULE_DEVICE_TABLE(of, gcc_msm8974_match_table);
-
- -struct qcom_cc {
- - struct qcom_reset_controller reset;
- - struct clk_onecell_data data;
- - struct clk *clks[];
- -};
- -
- static int gcc_msm8974_probe(struct platform_device *pdev)
- {
- - void __iomem *base;
- - struct resource *res;
- - int i, ret;
- - struct device *dev = &pdev->dev;
- struct clk *clk;
- - struct clk_onecell_data *data;
- - struct clk **clks;
- - struct regmap *regmap;
- - size_t num_clks;
- - struct qcom_reset_controller *reset;
- - struct qcom_cc *cc;
- -
- - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- - base = devm_ioremap_resource(dev, res);
- - if (IS_ERR(base))
- - return PTR_ERR(base);
- -
- - regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8974_regmap_config);
- - if (IS_ERR(regmap))
- - return PTR_ERR(regmap);
- -
- - num_clks = ARRAY_SIZE(gcc_msm8974_clocks);
- - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
- - GFP_KERNEL);
- - if (!cc)
- - return -ENOMEM;
- -
- - clks = cc->clks;
- - data = &cc->data;
- - data->clks = clks;
- - data->clk_num = num_clks;
- + struct device *dev = &pdev->dev;
-
- /* Temporary until RPM clocks supported */
- clk = clk_register_fixed_rate(dev, "xo", NULL, CLK_IS_ROOT, 19200000);
- @@ -2631,39 +2605,12 @@ static int gcc_msm8974_probe(struct plat
- if (IS_ERR(clk))
- return PTR_ERR(clk);
-
- - for (i = 0; i < num_clks; i++) {
- - if (!gcc_msm8974_clocks[i])
- - continue;
- - clk = devm_clk_register_regmap(dev, gcc_msm8974_clocks[i]);
- - if (IS_ERR(clk))
- - return PTR_ERR(clk);
- - clks[i] = clk;
- - }
- -
- - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
- - if (ret)
- - return ret;
- -
- - reset = &cc->reset;
- - reset->rcdev.of_node = dev->of_node;
- - reset->rcdev.ops = &qcom_reset_ops,
- - reset->rcdev.owner = THIS_MODULE,
- - reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8974_resets),
- - reset->regmap = regmap;
- - reset->reset_map = gcc_msm8974_resets,
- - platform_set_drvdata(pdev, &reset->rcdev);
- -
- - ret = reset_controller_register(&reset->rcdev);
- - if (ret)
- - of_clk_del_provider(dev->of_node);
- -
- - return ret;
- + return qcom_cc_probe(pdev, &gcc_msm8974_desc);
- }
-
- static int gcc_msm8974_remove(struct platform_device *pdev)
- {
- - of_clk_del_provider(pdev->dev.of_node);
- - reset_controller_unregister(platform_get_drvdata(pdev));
- + qcom_cc_remove(pdev);
- return 0;
- }
-
- --- a/drivers/clk/qcom/mmcc-msm8960.c
- +++ b/drivers/clk/qcom/mmcc-msm8960.c
- @@ -26,6 +26,7 @@
- #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
- #include <dt-bindings/reset/qcom,mmcc-msm8960.h>
-
- +#include "common.h"
- #include "clk-regmap.h"
- #include "clk-pll.h"
- #include "clk-rcg.h"
- @@ -2222,85 +2223,28 @@ static const struct regmap_config mmcc_m
- .fast_io = true,
- };
-
- +static const struct qcom_cc_desc mmcc_msm8960_desc = {
- + .config = &mmcc_msm8960_regmap_config,
- + .clks = mmcc_msm8960_clks,
- + .num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
- + .resets = mmcc_msm8960_resets,
- + .num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
- +};
- +
- static const struct of_device_id mmcc_msm8960_match_table[] = {
- { .compatible = "qcom,mmcc-msm8960" },
- { }
- };
- MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
-
- -struct qcom_cc {
- - struct qcom_reset_controller reset;
- - struct clk_onecell_data data;
- - struct clk *clks[];
- -};
- -
- static int mmcc_msm8960_probe(struct platform_device *pdev)
- {
- - void __iomem *base;
- - struct resource *res;
- - int i, ret;
- - struct device *dev = &pdev->dev;
- - struct clk *clk;
- - struct clk_onecell_data *data;
- - struct clk **clks;
- - struct regmap *regmap;
- - size_t num_clks;
- - struct qcom_reset_controller *reset;
- - struct qcom_cc *cc;
- -
- - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- - base = devm_ioremap_resource(dev, res);
- - if (IS_ERR(base))
- - return PTR_ERR(base);
- -
- - regmap = devm_regmap_init_mmio(dev, base, &mmcc_msm8960_regmap_config);
- - if (IS_ERR(regmap))
- - return PTR_ERR(regmap);
- -
- - num_clks = ARRAY_SIZE(mmcc_msm8960_clks);
- - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
- - GFP_KERNEL);
- - if (!cc)
- - return -ENOMEM;
- -
- - clks = cc->clks;
- - data = &cc->data;
- - data->clks = clks;
- - data->clk_num = num_clks;
- -
- - for (i = 0; i < num_clks; i++) {
- - if (!mmcc_msm8960_clks[i])
- - continue;
- - clk = devm_clk_register_regmap(dev, mmcc_msm8960_clks[i]);
- - if (IS_ERR(clk))
- - return PTR_ERR(clk);
- - clks[i] = clk;
- - }
- -
- - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
- - if (ret)
- - return ret;
- -
- - reset = &cc->reset;
- - reset->rcdev.of_node = dev->of_node;
- - reset->rcdev.ops = &qcom_reset_ops,
- - reset->rcdev.owner = THIS_MODULE,
- - reset->rcdev.nr_resets = ARRAY_SIZE(mmcc_msm8960_resets),
- - reset->regmap = regmap;
- - reset->reset_map = mmcc_msm8960_resets,
- - platform_set_drvdata(pdev, &reset->rcdev);
- -
- - ret = reset_controller_register(&reset->rcdev);
- - if (ret)
- - of_clk_del_provider(dev->of_node);
- -
- - return ret;
- + return qcom_cc_probe(pdev, &mmcc_msm8960_desc);
- }
-
- static int mmcc_msm8960_remove(struct platform_device *pdev)
- {
- - of_clk_del_provider(pdev->dev.of_node);
- - reset_controller_unregister(platform_get_drvdata(pdev));
- + qcom_cc_remove(pdev);
- return 0;
- }
-
- --- a/drivers/clk/qcom/mmcc-msm8974.c
- +++ b/drivers/clk/qcom/mmcc-msm8974.c
- @@ -25,6 +25,7 @@
- #include <dt-bindings/clock/qcom,mmcc-msm8974.h>
- #include <dt-bindings/reset/qcom,mmcc-msm8974.h>
-
- +#include "common.h"
- #include "clk-regmap.h"
- #include "clk-pll.h"
- #include "clk-rcg.h"
- @@ -2527,88 +2528,39 @@ static const struct regmap_config mmcc_m
- .fast_io = true,
- };
-
- +static const struct qcom_cc_desc mmcc_msm8974_desc = {
- + .config = &mmcc_msm8974_regmap_config,
- + .clks = mmcc_msm8974_clocks,
- + .num_clks = ARRAY_SIZE(mmcc_msm8974_clocks),
- + .resets = mmcc_msm8974_resets,
- + .num_resets = ARRAY_SIZE(mmcc_msm8974_resets),
- +};
- +
- static const struct of_device_id mmcc_msm8974_match_table[] = {
- { .compatible = "qcom,mmcc-msm8974" },
- { }
- };
- MODULE_DEVICE_TABLE(of, mmcc_msm8974_match_table);
-
- -struct qcom_cc {
- - struct qcom_reset_controller reset;
- - struct clk_onecell_data data;
- - struct clk *clks[];
- -};
- -
- static int mmcc_msm8974_probe(struct platform_device *pdev)
- {
- - void __iomem *base;
- - struct resource *res;
- - int i, ret;
- - struct device *dev = &pdev->dev;
- - struct clk *clk;
- - struct clk_onecell_data *data;
- - struct clk **clks;
- + int ret;
- struct regmap *regmap;
- - size_t num_clks;
- - struct qcom_reset_controller *reset;
- - struct qcom_cc *cc;
- -
- - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- - base = devm_ioremap_resource(dev, res);
- - if (IS_ERR(base))
- - return PTR_ERR(base);
- -
- - regmap = devm_regmap_init_mmio(dev, base, &mmcc_msm8974_regmap_config);
- - if (IS_ERR(regmap))
- - return PTR_ERR(regmap);
- -
- - num_clks = ARRAY_SIZE(mmcc_msm8974_clocks);
- - cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
- - GFP_KERNEL);
- - if (!cc)
- - return -ENOMEM;
- -
- - clks = cc->clks;
- - data = &cc->data;
- - data->clks = clks;
- - data->clk_num = num_clks;
- -
- - clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true);
- - clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false);
-
- - for (i = 0; i < num_clks; i++) {
- - if (!mmcc_msm8974_clocks[i])
- - continue;
- - clk = devm_clk_register_regmap(dev, mmcc_msm8974_clocks[i]);
- - if (IS_ERR(clk))
- - return PTR_ERR(clk);
- - clks[i] = clk;
- - }
- -
- - ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
- + ret = qcom_cc_probe(pdev, &mmcc_msm8974_desc);
- if (ret)
- return ret;
-
- - reset = &cc->reset;
- - reset->rcdev.of_node = dev->of_node;
- - reset->rcdev.ops = &qcom_reset_ops,
- - reset->rcdev.owner = THIS_MODULE,
- - reset->rcdev.nr_resets = ARRAY_SIZE(mmcc_msm8974_resets),
- - reset->regmap = regmap;
- - reset->reset_map = mmcc_msm8974_resets,
- - platform_set_drvdata(pdev, &reset->rcdev);
- -
- - ret = reset_controller_register(&reset->rcdev);
- - if (ret)
- - of_clk_del_provider(dev->of_node);
- + regmap = dev_get_regmap(&pdev->dev, NULL);
- + clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true);
- + clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false);
-
- - return ret;
- + return 0;
- }
-
- static int mmcc_msm8974_remove(struct platform_device *pdev)
- {
- - of_clk_del_provider(pdev->dev.of_node);
- - reset_controller_unregister(platform_get_drvdata(pdev));
- + qcom_cc_remove(pdev);
- return 0;
- }
-
|