2 * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/export.h>
15 #include <linux/regmap.h>
16 #include <linux/platform_device.h>
17 #include <linux/clk-provider.h>
18 #include <linux/reset-controller.h>
22 #include "clk-regmap.h"
26 struct qcom_reset_controller reset
;
27 struct clk_onecell_data data
;
32 struct freq_tbl
*qcom_find_freq(const struct freq_tbl
*f
, unsigned long rate
)
41 /* Default to our fastest rate */
44 EXPORT_SYMBOL_GPL(qcom_find_freq
);
47 qcom_cc_map(struct platform_device
*pdev
, const struct qcom_cc_desc
*desc
)
51 struct device
*dev
= &pdev
->dev
;
53 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
54 base
= devm_ioremap_resource(dev
, res
);
56 return ERR_CAST(base
);
58 return devm_regmap_init_mmio(dev
, base
, desc
->config
);
60 EXPORT_SYMBOL_GPL(qcom_cc_map
);
62 int qcom_cc_really_probe(struct platform_device
*pdev
,
63 const struct qcom_cc_desc
*desc
, struct regmap
*regmap
)
66 struct device
*dev
= &pdev
->dev
;
68 struct clk_onecell_data
*data
;
70 struct qcom_reset_controller
*reset
;
72 size_t num_clks
= desc
->num_clks
;
73 struct clk_regmap
**rclks
= desc
->clks
;
75 cc
= devm_kzalloc(dev
, sizeof(*cc
) + sizeof(*clks
) * num_clks
,
83 data
->clk_num
= num_clks
;
85 for (i
= 0; i
< num_clks
; i
++) {
87 clks
[i
] = ERR_PTR(-ENOENT
);
90 clk
= devm_clk_register_regmap(dev
, rclks
[i
]);
96 ret
= of_clk_add_provider(dev
->of_node
, of_clk_src_onecell_get
, data
);
101 reset
->rcdev
.of_node
= dev
->of_node
;
102 reset
->rcdev
.ops
= &qcom_reset_ops
;
103 reset
->rcdev
.owner
= dev
->driver
->owner
;
104 reset
->rcdev
.nr_resets
= desc
->num_resets
;
105 reset
->regmap
= regmap
;
106 reset
->reset_map
= desc
->resets
;
107 platform_set_drvdata(pdev
, &reset
->rcdev
);
109 ret
= reset_controller_register(&reset
->rcdev
);
111 of_clk_del_provider(dev
->of_node
);
115 EXPORT_SYMBOL_GPL(qcom_cc_really_probe
);
117 int qcom_cc_probe(struct platform_device
*pdev
, const struct qcom_cc_desc
*desc
)
119 struct regmap
*regmap
;
121 regmap
= qcom_cc_map(pdev
, desc
);
123 return PTR_ERR(regmap
);
125 return qcom_cc_really_probe(pdev
, desc
, regmap
);
127 EXPORT_SYMBOL_GPL(qcom_cc_probe
);
129 void qcom_cc_remove(struct platform_device
*pdev
)
131 of_clk_del_provider(pdev
->dev
.of_node
);
132 reset_controller_unregister(platform_get_drvdata(pdev
));
134 EXPORT_SYMBOL_GPL(qcom_cc_remove
);