Lines Matching +full:mt8183 +full:- +full:cci

1 // SPDX-License-Identifier: GPL-2.0-only
41 const struct mtk_ccifreq_platform_data *soc_data = drv->soc_data; in mtk_ccifreq_set_voltage()
42 struct device *dev = drv->dev; in mtk_ccifreq_set_voltage()
44 int retry_max = drv->vtrack_max; in mtk_ccifreq_set_voltage()
46 if (!drv->sram_reg) { in mtk_ccifreq_set_voltage()
47 ret = regulator_set_voltage(drv->proc_reg, new_voltage, in mtk_ccifreq_set_voltage()
48 drv->soc_data->proc_max_volt); in mtk_ccifreq_set_voltage()
52 pre_voltage = regulator_get_voltage(drv->proc_reg); in mtk_ccifreq_set_voltage()
58 pre_vsram = regulator_get_voltage(drv->sram_reg); in mtk_ccifreq_set_voltage()
64 new_vsram = clamp(new_voltage + soc_data->min_volt_shift, in mtk_ccifreq_set_voltage()
65 soc_data->sram_min_volt, soc_data->sram_max_volt); in mtk_ccifreq_set_voltage()
69 vsram = clamp(pre_voltage + soc_data->max_volt_shift, in mtk_ccifreq_set_voltage()
70 soc_data->sram_min_volt, new_vsram); in mtk_ccifreq_set_voltage()
71 ret = regulator_set_voltage(drv->sram_reg, vsram, in mtk_ccifreq_set_voltage()
72 soc_data->sram_max_volt); in mtk_ccifreq_set_voltage()
76 if (vsram == soc_data->sram_max_volt || in mtk_ccifreq_set_voltage()
77 new_vsram == soc_data->sram_min_volt) in mtk_ccifreq_set_voltage()
80 voltage = vsram - soc_data->min_volt_shift; in mtk_ccifreq_set_voltage()
82 ret = regulator_set_voltage(drv->proc_reg, voltage, in mtk_ccifreq_set_voltage()
83 soc_data->proc_max_volt); in mtk_ccifreq_set_voltage()
85 regulator_set_voltage(drv->sram_reg, pre_vsram, in mtk_ccifreq_set_voltage()
86 soc_data->sram_max_volt); in mtk_ccifreq_set_voltage()
91 pre_vsram - soc_data->max_volt_shift); in mtk_ccifreq_set_voltage()
92 ret = regulator_set_voltage(drv->proc_reg, voltage, in mtk_ccifreq_set_voltage()
93 soc_data->proc_max_volt); in mtk_ccifreq_set_voltage()
101 voltage + soc_data->min_volt_shift); in mtk_ccifreq_set_voltage()
103 ret = regulator_set_voltage(drv->sram_reg, vsram, in mtk_ccifreq_set_voltage()
104 soc_data->sram_max_volt); in mtk_ccifreq_set_voltage()
106 regulator_set_voltage(drv->proc_reg, pre_voltage, in mtk_ccifreq_set_voltage()
107 soc_data->proc_max_volt); in mtk_ccifreq_set_voltage()
115 if (--retry_max < 0) { in mtk_ccifreq_set_voltage()
118 return -EINVAL; in mtk_ccifreq_set_voltage()
135 return -EINVAL; in mtk_ccifreq_target()
137 if (drv->pre_freq == *freq) in mtk_ccifreq_target()
140 inter_voltage = drv->inter_voltage; in mtk_ccifreq_target()
141 cci_pll = clk_get_parent(drv->cci_clk); in mtk_ccifreq_target()
150 mutex_lock(&drv->reg_lock); in mtk_ccifreq_target()
155 pre_voltage = regulator_get_voltage(drv->proc_reg); in mtk_ccifreq_target()
172 /* switch the cci clock to intermediate clock source. */ in mtk_ccifreq_target()
173 ret = clk_set_parent(drv->cci_clk, drv->inter_clk); in mtk_ccifreq_target()
175 dev_err(dev, "failed to re-parent cci clock\n"); in mtk_ccifreq_target()
182 dev_err(dev, "failed to set cci pll rate: %d\n", ret); in mtk_ccifreq_target()
183 clk_set_parent(drv->cci_clk, cci_pll); in mtk_ccifreq_target()
187 /* switch the cci clock back to the original clock source. */ in mtk_ccifreq_target()
188 ret = clk_set_parent(drv->cci_clk, cci_pll); in mtk_ccifreq_target()
190 dev_err(dev, "failed to re-parent cci clock\n"); in mtk_ccifreq_target()
207 drv->pre_freq = *freq; in mtk_ccifreq_target()
208 mutex_unlock(&drv->reg_lock); in mtk_ccifreq_target()
216 mutex_unlock(&drv->reg_lock); in mtk_ccifreq_target()
232 mutex_lock(&drv->reg_lock); in mtk_ccifreq_opp_notifier()
234 if (freq == drv->pre_freq) { in mtk_ccifreq_opp_notifier()
238 mutex_unlock(&drv->reg_lock); in mtk_ccifreq_opp_notifier()
250 struct device *dev = &pdev->dev; in mtk_ccifreq_probe()
259 return -ENOMEM; in mtk_ccifreq_probe()
261 drv->dev = dev; in mtk_ccifreq_probe()
262 drv->soc_data = (const struct mtk_ccifreq_platform_data *) in mtk_ccifreq_probe()
263 of_device_get_match_data(&pdev->dev); in mtk_ccifreq_probe()
264 mutex_init(&drv->reg_lock); in mtk_ccifreq_probe()
267 drv->cci_clk = devm_clk_get(dev, "cci"); in mtk_ccifreq_probe()
268 if (IS_ERR(drv->cci_clk)) { in mtk_ccifreq_probe()
269 ret = PTR_ERR(drv->cci_clk); in mtk_ccifreq_probe()
270 return dev_err_probe(dev, ret, "failed to get cci clk\n"); in mtk_ccifreq_probe()
273 drv->inter_clk = devm_clk_get(dev, "intermediate"); in mtk_ccifreq_probe()
274 if (IS_ERR(drv->inter_clk)) { in mtk_ccifreq_probe()
275 ret = PTR_ERR(drv->inter_clk); in mtk_ccifreq_probe()
280 drv->proc_reg = devm_regulator_get_optional(dev, "proc"); in mtk_ccifreq_probe()
281 if (IS_ERR(drv->proc_reg)) { in mtk_ccifreq_probe()
282 ret = PTR_ERR(drv->proc_reg); in mtk_ccifreq_probe()
287 ret = regulator_enable(drv->proc_reg); in mtk_ccifreq_probe()
293 drv->sram_reg = devm_regulator_get_optional(dev, "sram"); in mtk_ccifreq_probe()
294 if (IS_ERR(drv->sram_reg)) { in mtk_ccifreq_probe()
295 ret = PTR_ERR(drv->sram_reg); in mtk_ccifreq_probe()
296 if (ret == -EPROBE_DEFER) in mtk_ccifreq_probe()
299 drv->sram_reg = NULL; in mtk_ccifreq_probe()
301 ret = regulator_enable(drv->sram_reg); in mtk_ccifreq_probe()
313 drv->vtrack_max = 3 * DIV_ROUND_UP(max(drv->soc_data->sram_max_volt, in mtk_ccifreq_probe()
314 drv->soc_data->proc_max_volt), in mtk_ccifreq_probe()
315 drv->soc_data->min_volt_shift); in mtk_ccifreq_probe()
317 ret = clk_prepare_enable(drv->cci_clk); in mtk_ccifreq_probe()
327 rate = clk_get_rate(drv->inter_clk); in mtk_ccifreq_probe()
334 drv->inter_voltage = dev_pm_opp_get_voltage(opp); in mtk_ccifreq_probe()
338 opp = dev_pm_opp_find_freq_floor(drv->dev, &rate); in mtk_ccifreq_probe()
356 ret = -ENOMEM; in mtk_ccifreq_probe()
360 passive_data->parent_type = CPUFREQ_PARENT_DEV; in mtk_ccifreq_probe()
361 drv->devfreq = devm_devfreq_add_device(dev, &mtk_ccifreq_profile, in mtk_ccifreq_probe()
364 if (IS_ERR(drv->devfreq)) { in mtk_ccifreq_probe()
365 ret = -EPROBE_DEFER; in mtk_ccifreq_probe()
367 PTR_ERR(drv->devfreq)); in mtk_ccifreq_probe()
371 drv->opp_nb.notifier_call = mtk_ccifreq_opp_notifier; in mtk_ccifreq_probe()
372 ret = dev_pm_opp_register_notifier(dev, &drv->opp_nb); in mtk_ccifreq_probe()
383 clk_disable_unprepare(drv->cci_clk); in mtk_ccifreq_probe()
386 if (regulator_is_enabled(drv->proc_reg)) in mtk_ccifreq_probe()
387 regulator_disable(drv->proc_reg); in mtk_ccifreq_probe()
388 if (drv->sram_reg && regulator_is_enabled(drv->sram_reg)) in mtk_ccifreq_probe()
389 regulator_disable(drv->sram_reg); in mtk_ccifreq_probe()
396 struct device *dev = &pdev->dev; in mtk_ccifreq_remove()
401 dev_pm_opp_unregister_notifier(dev, &drv->opp_nb); in mtk_ccifreq_remove()
403 clk_disable_unprepare(drv->cci_clk); in mtk_ccifreq_remove()
404 regulator_disable(drv->proc_reg); in mtk_ccifreq_remove()
405 if (drv->sram_reg) in mtk_ccifreq_remove()
406 regulator_disable(drv->sram_reg); in mtk_ccifreq_remove()
426 { .compatible = "mediatek,mt8183-cci", .data = &mt8183_platform_data },
427 { .compatible = "mediatek,mt8186-cci", .data = &mt8186_platform_data },
436 .name = "mtk-ccifreq",
442 MODULE_DESCRIPTION("MediaTek CCI devfreq driver");
443 MODULE_AUTHOR("Jia-Wei Chang <jia-wei.chang@mediatek.com>");