• Home
  • Raw
  • Download

Lines Matching +full:rpm +full:- +full:requests

1 // SPDX-License-Identifier: GPL-2.0-only
7 #include <linux/clk-provider.h>
19 #include <dt-bindings/mfd/qcom-rpm.h>
20 #include <dt-bindings/clock/qcom,rpmcc.h>
145 struct qcom_rpm *rpm; member
150 struct qcom_rpm *rpm; member
171 * RPM clock. in clk_rpm_handoff()
173 if (r->rpm_clk_id == QCOM_RPM_PLL_4 || in clk_rpm_handoff()
174 r->rpm_clk_id == QCOM_RPM_CXO_BUFFERS) in clk_rpm_handoff()
177 ret = qcom_rpm_write(r->rpm, QCOM_RPM_ACTIVE_STATE, in clk_rpm_handoff()
178 r->rpm_clk_id, &value, 1); in clk_rpm_handoff()
181 ret = qcom_rpm_write(r->rpm, QCOM_RPM_SLEEP_STATE, in clk_rpm_handoff()
182 r->rpm_clk_id, &value, 1); in clk_rpm_handoff()
193 return qcom_rpm_write(r->rpm, QCOM_RPM_ACTIVE_STATE, in clk_rpm_set_rate_active()
194 r->rpm_clk_id, &value, 1); in clk_rpm_set_rate_active()
201 return qcom_rpm_write(r->rpm, QCOM_RPM_SLEEP_STATE, in clk_rpm_set_rate_sleep()
202 r->rpm_clk_id, &value, 1); in clk_rpm_set_rate_sleep()
211 * Active-only clocks don't care what the rate is during sleep. So, in to_active_sleep()
214 if (r->active_only) in to_active_sleep()
223 struct clk_rpm *peer = r->peer; in clk_rpm_prepare()
231 /* Don't send requests to the RPM if the rate has not been set. */ in clk_rpm_prepare()
232 if (!r->rate) in clk_rpm_prepare()
235 to_active_sleep(r, r->rate, &this_rate, &this_sleep_rate); in clk_rpm_prepare()
238 if (peer->enabled) in clk_rpm_prepare()
239 to_active_sleep(peer, peer->rate, in clk_rpm_prepare()
244 if (r->branch) in clk_rpm_prepare()
252 if (r->branch) in clk_rpm_prepare()
262 r->enabled = true; in clk_rpm_prepare()
272 struct clk_rpm *peer = r->peer; in clk_rpm_unprepare()
279 if (!r->rate) in clk_rpm_unprepare()
283 if (peer->enabled) in clk_rpm_unprepare()
284 to_active_sleep(peer, peer->rate, &peer_rate, in clk_rpm_unprepare()
287 active_rate = r->branch ? !!peer_rate : peer_rate; in clk_rpm_unprepare()
292 sleep_rate = r->branch ? !!peer_sleep_rate : peer_sleep_rate; in clk_rpm_unprepare()
297 r->enabled = false; in clk_rpm_unprepare()
306 struct rpm_cc *rcc = r->rpm_cc; in clk_rpm_xo_prepare()
307 int ret, clk_id = r->rpm_clk_id; in clk_rpm_xo_prepare()
310 mutex_lock(&rcc->xo_lock); in clk_rpm_xo_prepare()
312 value = rcc->xo_buffer_value | (QCOM_RPM_XO_MODE_ON << r->xo_offset); in clk_rpm_xo_prepare()
313 ret = qcom_rpm_write(r->rpm, QCOM_RPM_ACTIVE_STATE, clk_id, &value, 1); in clk_rpm_xo_prepare()
315 r->enabled = true; in clk_rpm_xo_prepare()
316 rcc->xo_buffer_value = value; in clk_rpm_xo_prepare()
319 mutex_unlock(&rcc->xo_lock); in clk_rpm_xo_prepare()
327 struct rpm_cc *rcc = r->rpm_cc; in clk_rpm_xo_unprepare()
328 int ret, clk_id = r->rpm_clk_id; in clk_rpm_xo_unprepare()
331 mutex_lock(&rcc->xo_lock); in clk_rpm_xo_unprepare()
333 value = rcc->xo_buffer_value & ~(QCOM_RPM_XO_MODE_ON << r->xo_offset); in clk_rpm_xo_unprepare()
334 ret = qcom_rpm_write(r->rpm, QCOM_RPM_ACTIVE_STATE, clk_id, &value, 1); in clk_rpm_xo_unprepare()
336 r->enabled = false; in clk_rpm_xo_unprepare()
337 rcc->xo_buffer_value = value; in clk_rpm_xo_unprepare()
340 mutex_unlock(&rcc->xo_lock); in clk_rpm_xo_unprepare()
349 ret = qcom_rpm_write(r->rpm, QCOM_RPM_ACTIVE_STATE, in clk_rpm_fixed_prepare()
350 r->rpm_clk_id, &value, 1); in clk_rpm_fixed_prepare()
352 r->enabled = true; in clk_rpm_fixed_prepare()
363 ret = qcom_rpm_write(r->rpm, QCOM_RPM_ACTIVE_STATE, in clk_rpm_fixed_unprepare()
364 r->rpm_clk_id, &value, 1); in clk_rpm_fixed_unprepare()
366 r->enabled = false; in clk_rpm_fixed_unprepare()
373 struct clk_rpm *peer = r->peer; in clk_rpm_set_rate()
381 if (!r->enabled) in clk_rpm_set_rate()
387 if (peer->enabled) in clk_rpm_set_rate()
388 to_active_sleep(peer, peer->rate, in clk_rpm_set_rate()
401 r->rate = rate; in clk_rpm_set_rate()
413 * RPM handles rate rounding and we don't have a way to in clk_rpm_round_rate()
426 * RPM handles rate rounding and we don't have a way to in clk_rpm_recalc_rate()
430 return r->rate; in clk_rpm_recalc_rate()
581 { .compatible = "qcom,rpmcc-msm8660", .data = &rpm_clk_msm8660 },
582 { .compatible = "qcom,rpmcc-apq8060", .data = &rpm_clk_msm8660 },
583 { .compatible = "qcom,rpmcc-apq8064", .data = &rpm_clk_apq8064 },
584 { .compatible = "qcom,rpmcc-ipq806x", .data = &rpm_clk_ipq806x },
593 unsigned int idx = clkspec->args[0]; in qcom_rpm_clk_hw_get()
595 if (idx >= rcc->num_clks) { in qcom_rpm_clk_hw_get()
597 return ERR_PTR(-EINVAL); in qcom_rpm_clk_hw_get()
600 return rcc->clks[idx] ? &rcc->clks[idx]->hw : ERR_PTR(-ENOENT); in qcom_rpm_clk_hw_get()
608 struct qcom_rpm *rpm; in rpm_clk_probe() local
612 rpm = dev_get_drvdata(pdev->dev.parent); in rpm_clk_probe()
613 if (!rpm) { in rpm_clk_probe()
614 dev_err(&pdev->dev, "Unable to retrieve handle to RPM\n"); in rpm_clk_probe()
615 return -ENODEV; in rpm_clk_probe()
618 desc = of_device_get_match_data(&pdev->dev); in rpm_clk_probe()
620 return -EINVAL; in rpm_clk_probe()
622 rpm_clks = desc->clks; in rpm_clk_probe()
623 num_clks = desc->num_clks; in rpm_clk_probe()
625 rcc = devm_kzalloc(&pdev->dev, sizeof(*rcc), GFP_KERNEL); in rpm_clk_probe()
627 return -ENOMEM; in rpm_clk_probe()
629 rcc->clks = rpm_clks; in rpm_clk_probe()
630 rcc->num_clks = num_clks; in rpm_clk_probe()
631 mutex_init(&rcc->xo_lock); in rpm_clk_probe()
637 rpm_clks[i]->rpm = rpm; in rpm_clk_probe()
638 rpm_clks[i]->rpm_cc = rcc; in rpm_clk_probe()
649 ret = devm_clk_hw_register(&pdev->dev, &rpm_clks[i]->hw); in rpm_clk_probe()
654 ret = of_clk_add_hw_provider(pdev->dev.of_node, qcom_rpm_clk_hw_get, in rpm_clk_probe()
661 dev_err(&pdev->dev, "Error registering RPM Clock driver (%d)\n", ret); in rpm_clk_probe()
667 of_clk_del_provider(pdev->dev.of_node); in rpm_clk_remove()
673 .name = "qcom-clk-rpm",
692 MODULE_DESCRIPTION("Qualcomm RPM Clock Controller Driver");
694 MODULE_ALIAS("platform:qcom-clk-rpm");