Lines Matching +full:rpm +full:- +full:msm8916

1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. */
13 #include <linux/soc/qcom/smd-rpm.h>
15 #include <dt-bindings/power/qcom-rpmpd.h>
20 * RPMPD_X is X encoded as a little-endian, lower-case, ASCII string */
57 struct qcom_smd_rpm *rpm; member
852 { .compatible = "qcom,mdm9607-rpmpd", .data = &mdm9607_desc },
853 { .compatible = "qcom,msm8226-rpmpd", .data = &msm8226_desc },
854 { .compatible = "qcom,msm8909-rpmpd", .data = &msm8916_desc },
855 { .compatible = "qcom,msm8916-rpmpd", .data = &msm8916_desc },
856 { .compatible = "qcom,msm8917-rpmpd", .data = &msm8917_desc },
857 { .compatible = "qcom,msm8939-rpmpd", .data = &msm8939_desc },
858 { .compatible = "qcom,msm8953-rpmpd", .data = &msm8953_desc },
859 { .compatible = "qcom,msm8976-rpmpd", .data = &msm8976_desc },
860 { .compatible = "qcom,msm8994-rpmpd", .data = &msm8994_desc },
861 { .compatible = "qcom,msm8996-rpmpd", .data = &msm8996_desc },
862 { .compatible = "qcom,msm8998-rpmpd", .data = &msm8998_desc },
863 { .compatible = "qcom,qcm2290-rpmpd", .data = &qcm2290_desc },
864 { .compatible = "qcom,qcs404-rpmpd", .data = &qcs404_desc },
865 { .compatible = "qcom,qm215-rpmpd", .data = &qm215_desc },
866 { .compatible = "qcom,sdm660-rpmpd", .data = &sdm660_desc },
867 { .compatible = "qcom,sm6115-rpmpd", .data = &sm6115_desc },
868 { .compatible = "qcom,sm6125-rpmpd", .data = &sm6125_desc },
869 { .compatible = "qcom,sm6375-rpmpd", .data = &sm6375_desc },
882 return qcom_rpm_smd_write(pd->rpm, QCOM_SMD_RPM_ACTIVE_STATE, in rpmpd_send_enable()
883 pd->res_type, pd->res_id, &req, sizeof(req)); in rpmpd_send_enable()
889 .key = pd->key, in rpmpd_send_corner()
894 return qcom_rpm_smd_write(pd->rpm, state, pd->res_type, pd->res_id, in rpmpd_send_corner()
903 if (pd->active_only) in to_active_sleep()
912 struct rpmpd *peer = pd->peer; in rpmpd_aggregate_corner()
918 if (!pd->state_synced) in rpmpd_aggregate_corner()
919 this_active_corner = this_sleep_corner = pd->max_state - 1; in rpmpd_aggregate_corner()
921 to_active_sleep(pd, pd->corner, &this_active_corner, &this_sleep_corner); in rpmpd_aggregate_corner()
923 if (peer && peer->enabled) in rpmpd_aggregate_corner()
924 to_active_sleep(peer, peer->corner, &peer_active_corner, in rpmpd_aggregate_corner()
949 pd->enabled = true; in rpmpd_power_on()
951 if (pd->corner) in rpmpd_power_on()
969 pd->enabled = false; in rpmpd_power_off()
982 if (state > pd->max_state) in rpmpd_set_performance()
983 state = pd->max_state; in rpmpd_set_performance()
987 pd->corner = state; in rpmpd_set_performance()
990 if (!pd->enabled && pd->key != cpu_to_le32(KEY_FLOOR_CORNER) && in rpmpd_set_performance()
991 pd->key != cpu_to_le32(KEY_FLOOR_LEVEL)) in rpmpd_set_performance()
1007 struct qcom_smd_rpm *rpm; in rpmpd_probe() local
1011 rpm = dev_get_drvdata(pdev->dev.parent); in rpmpd_probe()
1012 if (!rpm) { in rpmpd_probe()
1013 dev_err(&pdev->dev, "Unable to retrieve handle to RPM\n"); in rpmpd_probe()
1014 return -ENODEV; in rpmpd_probe()
1017 desc = of_device_get_match_data(&pdev->dev); in rpmpd_probe()
1019 return -EINVAL; in rpmpd_probe()
1021 rpmpds = desc->rpmpds; in rpmpd_probe()
1022 num = desc->num_pds; in rpmpd_probe()
1024 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in rpmpd_probe()
1026 return -ENOMEM; in rpmpd_probe()
1028 data->domains = devm_kcalloc(&pdev->dev, num, sizeof(*data->domains), in rpmpd_probe()
1030 if (!data->domains) in rpmpd_probe()
1031 return -ENOMEM; in rpmpd_probe()
1033 data->num_domains = num; in rpmpd_probe()
1037 dev_warn(&pdev->dev, "rpmpds[] with empty entry at index=%d\n", in rpmpd_probe()
1042 rpmpds[i]->rpm = rpm; in rpmpd_probe()
1043 rpmpds[i]->max_state = desc->max_state; in rpmpd_probe()
1044 rpmpds[i]->pd.power_off = rpmpd_power_off; in rpmpd_probe()
1045 rpmpds[i]->pd.power_on = rpmpd_power_on; in rpmpd_probe()
1046 rpmpds[i]->pd.set_performance_state = rpmpd_set_performance; in rpmpd_probe()
1047 rpmpds[i]->pd.flags = GENPD_FLAG_ACTIVE_WAKEUP; in rpmpd_probe()
1048 pm_genpd_init(&rpmpds[i]->pd, NULL, true); in rpmpd_probe()
1050 data->domains[i] = &rpmpds[i]->pd; in rpmpd_probe()
1058 if (rpmpds[i]->parent) in rpmpd_probe()
1059 pm_genpd_add_subdomain(rpmpds[i]->parent, &rpmpds[i]->pd); in rpmpd_probe()
1062 return of_genpd_add_provider_onecell(pdev->dev.of_node, data); in rpmpd_probe()
1068 struct rpmpd **rpmpds = desc->rpmpds; in rpmpd_sync_state()
1074 for (i = 0; i < desc->num_pds; i++) { in rpmpd_sync_state()
1079 pd->state_synced = true; in rpmpd_sync_state()
1081 if (!pd->enabled) in rpmpd_sync_state()
1082 pd->corner = 0; in rpmpd_sync_state()
1086 dev_err(dev, "failed to sync %s: %d\n", pd->pd.name, ret); in rpmpd_sync_state()
1093 .name = "qcom-rpmpd",
1107 MODULE_DESCRIPTION("Qualcomm Technologies, Inc. RPM Power Domain Driver");