Lines Matching +full:msm8996 +full:- +full:rpmpd
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. */
14 #include <linux/soc/qcom/smd-rpm.h>
16 #include <dt-bindings/power/qcom-rpmpd.h>
18 #define domain_to_rpmpd(domain) container_of(domain, struct rpmpd, pd)
21 * RPMPD_X is X encoded as a little-endian, lower-case, ASCII string */
44 static struct rpmpd _platform##_##_active; \
45 static struct rpmpd _platform##_##_name = { \
52 static struct rpmpd _platform##_##_active = { \
62 static struct rpmpd _platform##_##_name = { \
70 static struct rpmpd _platform##_##_name = { \
78 static struct rpmpd _platform##_##_name = { \
86 static struct rpmpd _platform##_##_name = { \
99 struct rpmpd { struct
101 struct rpmpd *peer; argument
114 struct rpmpd **rpmpds; argument
127 static struct rpmpd *mdm9607_rpmpds[] = {
151 static struct rpmpd *msm8939_rpmpds[] = {
174 static struct rpmpd *msm8916_rpmpds[] = {
195 static struct rpmpd *msm8976_rpmpds[] = {
219 static struct rpmpd *msm8994_rpmpds[] = {
235 /* msm8996 RPM Power domains */
236 DEFINE_RPMPD_PAIR(msm8996, vddcx, vddcx_ao, SMPA, CORNER, 1);
237 DEFINE_RPMPD_PAIR(msm8996, vddmx, vddmx_ao, SMPA, CORNER, 2);
238 DEFINE_RPMPD_CORNER(msm8996, vddsscx, LDOA, 26);
240 DEFINE_RPMPD_VFC(msm8996, vddcx_vfc, SMPA, 1);
241 DEFINE_RPMPD_VFC(msm8996, vddsscx_vfc, LDOA, 26);
243 static struct rpmpd *msm8996_rpmpds[] = {
272 static struct rpmpd *msm8998_rpmpds[] = {
301 static struct rpmpd *qcs404_rpmpds[] = {
330 static struct rpmpd *sdm660_rpmpds[] = {
359 static struct rpmpd *sm6115_rpmpds[] = {
377 { .compatible = "qcom,mdm9607-rpmpd", .data = &mdm9607_desc },
378 { .compatible = "qcom,msm8916-rpmpd", .data = &msm8916_desc },
379 { .compatible = "qcom,msm8939-rpmpd", .data = &msm8939_desc },
380 { .compatible = "qcom,msm8976-rpmpd", .data = &msm8976_desc },
381 { .compatible = "qcom,msm8994-rpmpd", .data = &msm8994_desc },
382 { .compatible = "qcom,msm8996-rpmpd", .data = &msm8996_desc },
383 { .compatible = "qcom,msm8998-rpmpd", .data = &msm8998_desc },
384 { .compatible = "qcom,qcs404-rpmpd", .data = &qcs404_desc },
385 { .compatible = "qcom,sdm660-rpmpd", .data = &sdm660_desc },
386 { .compatible = "qcom,sm6115-rpmpd", .data = &sm6115_desc },
391 static int rpmpd_send_enable(struct rpmpd *pd, bool enable) in rpmpd_send_enable()
399 return qcom_rpm_smd_write(pd->rpm, QCOM_SMD_RPM_ACTIVE_STATE, in rpmpd_send_enable()
400 pd->res_type, pd->res_id, &req, sizeof(req)); in rpmpd_send_enable()
403 static int rpmpd_send_corner(struct rpmpd *pd, int state, unsigned int corner) in rpmpd_send_corner()
406 .key = pd->key, in rpmpd_send_corner()
411 return qcom_rpm_smd_write(pd->rpm, state, pd->res_type, pd->res_id, in rpmpd_send_corner()
415 static void to_active_sleep(struct rpmpd *pd, unsigned int corner, in to_active_sleep()
420 if (pd->active_only) in to_active_sleep()
426 static int rpmpd_aggregate_corner(struct rpmpd *pd) in rpmpd_aggregate_corner()
429 struct rpmpd *peer = pd->peer; in rpmpd_aggregate_corner()
434 to_active_sleep(pd, pd->corner, &this_active_corner, &this_sleep_corner); in rpmpd_aggregate_corner()
436 if (peer && peer->enabled) in rpmpd_aggregate_corner()
437 to_active_sleep(peer, peer->corner, &peer_active_corner, in rpmpd_aggregate_corner()
454 struct rpmpd *pd = domain_to_rpmpd(domain); in rpmpd_power_on()
462 pd->enabled = true; in rpmpd_power_on()
464 if (pd->corner) in rpmpd_power_on()
476 struct rpmpd *pd = domain_to_rpmpd(domain); in rpmpd_power_off()
482 pd->enabled = false; in rpmpd_power_off()
493 struct rpmpd *pd = domain_to_rpmpd(domain); in rpmpd_set_performance()
495 if (state > pd->max_state) in rpmpd_set_performance()
496 state = pd->max_state; in rpmpd_set_performance()
500 pd->corner = state; in rpmpd_set_performance()
503 if (!pd->enabled && pd->key != KEY_FLOOR_CORNER && in rpmpd_set_performance()
504 pd->key != KEY_FLOOR_LEVEL) in rpmpd_set_performance()
527 struct rpmpd **rpmpds; in rpmpd_probe()
530 rpm = dev_get_drvdata(pdev->dev.parent); in rpmpd_probe()
532 dev_err(&pdev->dev, "Unable to retrieve handle to RPM\n"); in rpmpd_probe()
533 return -ENODEV; in rpmpd_probe()
536 desc = of_device_get_match_data(&pdev->dev); in rpmpd_probe()
538 return -EINVAL; in rpmpd_probe()
540 rpmpds = desc->rpmpds; in rpmpd_probe()
541 num = desc->num_pds; in rpmpd_probe()
543 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in rpmpd_probe()
545 return -ENOMEM; in rpmpd_probe()
547 data->domains = devm_kcalloc(&pdev->dev, num, sizeof(*data->domains), in rpmpd_probe()
549 data->num_domains = num; in rpmpd_probe()
553 dev_warn(&pdev->dev, "rpmpds[] with empty entry at index=%d\n", in rpmpd_probe()
558 rpmpds[i]->rpm = rpm; in rpmpd_probe()
559 rpmpds[i]->max_state = desc->max_state; in rpmpd_probe()
560 rpmpds[i]->pd.power_off = rpmpd_power_off; in rpmpd_probe()
561 rpmpds[i]->pd.power_on = rpmpd_power_on; in rpmpd_probe()
562 rpmpds[i]->pd.set_performance_state = rpmpd_set_performance; in rpmpd_probe()
563 rpmpds[i]->pd.opp_to_performance_state = rpmpd_get_performance; in rpmpd_probe()
564 pm_genpd_init(&rpmpds[i]->pd, NULL, true); in rpmpd_probe()
566 data->domains[i] = &rpmpds[i]->pd; in rpmpd_probe()
569 return of_genpd_add_provider_onecell(pdev->dev.of_node, data); in rpmpd_probe()
574 .name = "qcom-rpmpd",