Lines Matching +full:init +full:- +full:delay

1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/delay.h>
17 #include <linux/clk-provider.h>
60 static void rockchip_clock_pvtm_delay(unsigned int delay) in rockchip_clock_pvtm_delay() argument
62 unsigned int ms = delay / 1000; in rockchip_clock_pvtm_delay()
63 unsigned int us = delay % 1000; in rockchip_clock_pvtm_delay()
82 ret = regmap_write(pvtm->grf, pvtm->info->sel_con, in rockchip_clock_sel_internal_pvtm()
83 wr_msk_bit(pvtm->info->sel_value, in rockchip_clock_sel_internal_pvtm()
84 pvtm->info->sel_shift, in rockchip_clock_sel_internal_pvtm()
85 pvtm->info->sel_mask)); in rockchip_clock_sel_internal_pvtm()
96 const struct rockchip_clock_pvtm_info *info = pvtm->info; in rockchip_clock_pvtm_get_value()
103 regmap_write(pvtm->grf, info->con + 0x4, clk_cnt); in rockchip_clock_pvtm_get_value()
104 regmap_write(pvtm->grf, info->con, wr_msk_bit(3, 0, 0x3)); in rockchip_clock_pvtm_get_value()
110 regmap_read(pvtm->grf, info->sta, &sta); in rockchip_clock_pvtm_get_value()
114 check_cnt--; in rockchip_clock_pvtm_get_value()
118 regmap_read(pvtm->grf, info->sta + 0x4, &val); in rockchip_clock_pvtm_get_value()
124 regmap_write(pvtm->grf, info->con, wr_msk_bit(0, 0, 0x3)); in rockchip_clock_pvtm_get_value()
136 pvtm_cnt = pvtm->info->get_value(pvtm, time_us); in rockchip_clock_pvtm_init_freq()
140 div = DIV_ROUND_UP(1000 * pvtm_cnt, pvtm->rate); in rockchip_clock_pvtm_init_freq()
141 if (div > pvtm->info->div_mask) { in rockchip_clock_pvtm_init_freq()
143 div = pvtm->info->div_mask; in rockchip_clock_pvtm_init_freq()
146 pr_debug("set div %d, rate %luKHZ\n", div, pvtm->rate); in rockchip_clock_pvtm_init_freq()
147 ret = regmap_write(pvtm->grf, pvtm->info->con, in rockchip_clock_pvtm_init_freq()
148 wr_msk_bit(div, pvtm->info->div_shift, in rockchip_clock_pvtm_init_freq()
149 pvtm->info->div_mask)); in rockchip_clock_pvtm_init_freq()
154 ret = regmap_write(pvtm->grf, pvtm->info->con, in rockchip_clock_pvtm_init_freq()
159 ret = pvtm->info->sel_enable(pvtm); in rockchip_clock_pvtm_init_freq()
170 struct clk_init_data init = {}; in clock_pvtm_regitstor() local
173 /* Init the xin32k_pvtm */ in clock_pvtm_regitstor()
174 pvtm->info->init_freq(pvtm); in clock_pvtm_regitstor()
176 init.parent_names = NULL; in clock_pvtm_regitstor()
177 init.num_parents = 0; in clock_pvtm_regitstor()
178 init.name = "xin32k_pvtm"; in clock_pvtm_regitstor()
179 init.ops = &xin32k_pvtm; in clock_pvtm_regitstor()
183 return -ENOMEM; in clock_pvtm_regitstor()
184 clk_hw->init = &init; in clock_pvtm_regitstor()
187 of_property_read_string_index(dev->of_node, "clock-output-names", in clock_pvtm_regitstor()
188 0, &init.name); in clock_pvtm_regitstor()
189 pvtm->clk = devm_clk_register(dev, clk_hw); in clock_pvtm_regitstor()
190 if (IS_ERR(pvtm->clk)) in clock_pvtm_regitstor()
191 return PTR_ERR(pvtm->clk); in clock_pvtm_regitstor()
193 return of_clk_add_provider(dev->of_node, of_clk_src_simple_get, in clock_pvtm_regitstor()
194 pvtm->clk); in clock_pvtm_regitstor()
214 .compatible = "rockchip,rk3368-pvtm-clock",
223 struct device *dev = &pdev->dev; in rockchip_clock_pvtm_probe()
224 struct device_node *np = pdev->dev.of_node; in rockchip_clock_pvtm_probe()
232 return -ENOMEM; in rockchip_clock_pvtm_probe()
236 return -ENXIO; in rockchip_clock_pvtm_probe()
238 pvtm->info = (const struct rockchip_clock_pvtm_info *)match->data; in rockchip_clock_pvtm_probe()
239 if (!pvtm->info) in rockchip_clock_pvtm_probe()
240 return -EINVAL; in rockchip_clock_pvtm_probe()
242 if (!dev->parent || !dev->parent->of_node) in rockchip_clock_pvtm_probe()
243 return -EINVAL; in rockchip_clock_pvtm_probe()
245 pvtm->grf = syscon_node_to_regmap(dev->parent->of_node); in rockchip_clock_pvtm_probe()
246 if (IS_ERR(pvtm->grf)) in rockchip_clock_pvtm_probe()
247 return PTR_ERR(pvtm->grf); in rockchip_clock_pvtm_probe()
249 if (!of_property_read_u32(np, "pvtm-rate", &rate)) in rockchip_clock_pvtm_probe()
250 pvtm->rate = rate; in rockchip_clock_pvtm_probe()
252 pvtm->rate = 32768; in rockchip_clock_pvtm_probe()
254 pvtm->pvtm_clk = devm_clk_get(&pdev->dev, "pvtm_pmu_clk"); in rockchip_clock_pvtm_probe()
255 if (IS_ERR(pvtm->pvtm_clk)) { in rockchip_clock_pvtm_probe()
256 error = PTR_ERR(pvtm->pvtm_clk); in rockchip_clock_pvtm_probe()
257 if (error != -EPROBE_DEFER) in rockchip_clock_pvtm_probe()
258 dev_err(&pdev->dev, in rockchip_clock_pvtm_probe()
264 error = clk_prepare_enable(pvtm->pvtm_clk); in rockchip_clock_pvtm_probe()
266 dev_err(&pdev->dev, "failed to enable the clock: %d\n", in rockchip_clock_pvtm_probe()
273 error = clock_pvtm_regitstor(&pdev->dev, pvtm); in rockchip_clock_pvtm_probe()
275 dev_err(&pdev->dev, "failed to registor clock: %d\n", in rockchip_clock_pvtm_probe()
283 clk_disable_unprepare(pvtm->pvtm_clk); in rockchip_clock_pvtm_probe()
291 struct device_node *np = pdev->dev.of_node; in rockchip_clock_pvtm_remove()
294 clk_disable_unprepare(pvtm->pvtm_clk); in rockchip_clock_pvtm_remove()
301 .name = "rockchip-clcok-pvtm",