Lines Matching +full:smd +full:- +full:rpm
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>
21 * RPMPD_X is X encoded as a little-endian, lower-case, ASCII string */
108 struct qcom_smd_rpm *rpm; member
121 /* mdm9607 RPM Power Domains */
142 /* msm8939 RPM Power Domains */
168 /* msm8916 RPM Power Domains */
188 /* msm8976 RPM Power Domains */
210 /* msm8994 RPM Power domains */
235 /* msm8996 RPM Power domains */
259 /* msm8998 RPM Power domains */
291 /* qcs404 RPM Power domains */
317 /* sdm660 RPM Power domains */
349 /* sm4250/6115 RPM Power domains */
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 },
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()
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()
420 if (pd->active_only) in to_active_sleep()
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()
462 pd->enabled = true; in rpmpd_power_on()
464 if (pd->corner) in rpmpd_power_on()
482 pd->enabled = false; in rpmpd_power_off()
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()
526 struct qcom_smd_rpm *rpm; in rpmpd_probe() local
530 rpm = dev_get_drvdata(pdev->dev.parent); in rpmpd_probe()
531 if (!rpm) { 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",
587 MODULE_DESCRIPTION("Qualcomm Technologies, Inc. RPM Power Domain Driver");