Lines Matching +full:sdm845 +full:- +full:rpmhpd
1 // SPDX-License-Identifier: GPL-2.0
15 #include <soc/qcom/cmd-db.h>
17 #include <dt-bindings/power/qcom-rpmpd.h>
19 #define domain_to_rpmhpd(domain) container_of(domain, struct rpmhpd, pd)
24 * struct rpmhpd - top level RPMh power domain resource data structure
34 * derived from cmd-db
36 * being 16 (0 - 15)
38 * @res_name: Resource name used for cmd-db lookup
40 * cmd-db
42 struct rpmhpd { struct
46 struct rpmhpd *peer; argument
58 struct rpmhpd **rpmhpds; argument
64 /* SDM845 RPMH powerdomains */
66 static struct rpmhpd sdm845_ebi = {
71 static struct rpmhpd sdm845_lmx = {
76 static struct rpmhpd sdm845_lcx = {
81 static struct rpmhpd sdm845_gfx = {
86 static struct rpmhpd sdm845_mss = {
91 static struct rpmhpd sdm845_mx_ao;
92 static struct rpmhpd sdm845_mx = {
98 static struct rpmhpd sdm845_mx_ao = {
105 static struct rpmhpd sdm845_cx_ao;
106 static struct rpmhpd sdm845_cx = {
113 static struct rpmhpd sdm845_cx_ao = {
121 static struct rpmhpd *sdm845_rpmhpds[] = {
139 static struct rpmhpd *sdx55_rpmhpds[] = {
152 static struct rpmhpd sm8150_mmcx_ao;
153 static struct rpmhpd sm8150_mmcx = {
159 static struct rpmhpd sm8150_mmcx_ao = {
166 static struct rpmhpd *sm8150_rpmhpds[] = {
185 static struct rpmhpd *sm8250_rpmhpds[] = {
204 static struct rpmhpd sm8350_mxc_ao;
205 static struct rpmhpd sm8350_mxc = {
211 static struct rpmhpd sm8350_mxc_ao = {
218 static struct rpmhpd *sm8350_rpmhpds[] = {
240 static struct rpmhpd *sc7180_rpmhpds[] = {
257 static struct rpmhpd *sc7280_rpmhpds[] = {
275 static struct rpmhpd *sc8180x_rpmhpds[] = {
295 { .compatible = "qcom,sc7180-rpmhpd", .data = &sc7180_desc },
296 { .compatible = "qcom,sc7280-rpmhpd", .data = &sc7280_desc },
297 { .compatible = "qcom,sc8180x-rpmhpd", .data = &sc8180x_desc },
298 { .compatible = "qcom,sdm845-rpmhpd", .data = &sdm845_desc },
299 { .compatible = "qcom,sdx55-rpmhpd", .data = &sdx55_desc},
300 { .compatible = "qcom,sm8150-rpmhpd", .data = &sm8150_desc },
301 { .compatible = "qcom,sm8250-rpmhpd", .data = &sm8250_desc },
302 { .compatible = "qcom,sm8350-rpmhpd", .data = &sm8350_desc },
307 static int rpmhpd_send_corner(struct rpmhpd *pd, int state, in rpmhpd_send_corner()
311 .addr = pd->addr, in rpmhpd_send_corner()
320 return rpmh_write(pd->dev, state, &cmd, 1); in rpmhpd_send_corner()
322 return rpmh_write_async(pd->dev, state, &cmd, 1); in rpmhpd_send_corner()
325 static void to_active_sleep(struct rpmhpd *pd, unsigned int corner, in to_active_sleep()
330 if (pd->active_only) in to_active_sleep()
345 static int rpmhpd_aggregate_corner(struct rpmhpd *pd, unsigned int corner) in rpmhpd_aggregate_corner()
348 struct rpmhpd *peer = pd->peer; in rpmhpd_aggregate_corner()
355 if (peer && peer->enabled) in rpmhpd_aggregate_corner()
356 to_active_sleep(peer, peer->corner, &peer_active_corner, in rpmhpd_aggregate_corner()
362 active_corner > pd->active_corner); in rpmhpd_aggregate_corner()
366 pd->active_corner = active_corner; in rpmhpd_aggregate_corner()
369 peer->active_corner = active_corner; in rpmhpd_aggregate_corner()
387 struct rpmhpd *pd = domain_to_rpmhpd(domain); in rpmhpd_power_on()
392 if (pd->corner) in rpmhpd_power_on()
393 ret = rpmhpd_aggregate_corner(pd, pd->corner); in rpmhpd_power_on()
396 pd->enabled = true; in rpmhpd_power_on()
405 struct rpmhpd *pd = domain_to_rpmhpd(domain); in rpmhpd_power_off()
412 pd->enabled = false; in rpmhpd_power_off()
422 struct rpmhpd *pd = domain_to_rpmhpd(domain); in rpmhpd_set_performance_state()
427 for (i = 0; i < pd->level_count; i++) in rpmhpd_set_performance_state()
428 if (level <= pd->level[i]) in rpmhpd_set_performance_state()
435 if (i == pd->level_count) in rpmhpd_set_performance_state()
436 i--; in rpmhpd_set_performance_state()
438 if (pd->enabled) { in rpmhpd_set_performance_state()
444 pd->corner = i; in rpmhpd_set_performance_state()
457 static int rpmhpd_update_level_mapping(struct rpmhpd *rpmhpd) in rpmhpd_update_level_mapping() argument
462 buf = cmd_db_read_aux_data(rpmhpd->res_name, &rpmhpd->level_count); in rpmhpd_update_level_mapping()
467 rpmhpd->level_count >>= 1; in rpmhpd_update_level_mapping()
469 if (rpmhpd->level_count > RPMH_ARC_MAX_LEVELS) in rpmhpd_update_level_mapping()
470 return -EINVAL; in rpmhpd_update_level_mapping()
472 for (i = 0; i < rpmhpd->level_count; i++) { in rpmhpd_update_level_mapping()
473 rpmhpd->level[i] = buf[i]; in rpmhpd_update_level_mapping()
479 if (i > 0 && rpmhpd->level[i] == 0) { in rpmhpd_update_level_mapping()
480 rpmhpd->level_count = i; in rpmhpd_update_level_mapping()
483 pr_debug("%s: ARC hlvl=%2d --> vlvl=%4u\n", rpmhpd->res_name, i, in rpmhpd_update_level_mapping()
484 rpmhpd->level[i]); in rpmhpd_update_level_mapping()
494 struct device *dev = &pdev->dev; in rpmhpd_probe()
496 struct rpmhpd **rpmhpds; in rpmhpd_probe()
501 return -EINVAL; in rpmhpd_probe()
503 rpmhpds = desc->rpmhpds; in rpmhpd_probe()
504 num_pds = desc->num_pds; in rpmhpd_probe()
508 return -ENOMEM; in rpmhpd_probe()
510 data->domains = devm_kcalloc(dev, num_pds, sizeof(*data->domains), in rpmhpd_probe()
512 if (!data->domains) in rpmhpd_probe()
513 return -ENOMEM; in rpmhpd_probe()
515 data->num_domains = num_pds; in rpmhpd_probe()
523 rpmhpds[i]->dev = dev; in rpmhpd_probe()
524 rpmhpds[i]->addr = cmd_db_read_addr(rpmhpds[i]->res_name); in rpmhpd_probe()
525 if (!rpmhpds[i]->addr) { in rpmhpd_probe()
527 rpmhpds[i]->res_name); in rpmhpd_probe()
528 return -ENODEV; in rpmhpd_probe()
531 ret = cmd_db_read_slave_id(rpmhpds[i]->res_name); in rpmhpd_probe()
534 return -EINVAL; in rpmhpd_probe()
541 rpmhpds[i]->pd.power_off = rpmhpd_power_off; in rpmhpd_probe()
542 rpmhpds[i]->pd.power_on = rpmhpd_power_on; in rpmhpd_probe()
543 rpmhpds[i]->pd.set_performance_state = rpmhpd_set_performance_state; in rpmhpd_probe()
544 rpmhpds[i]->pd.opp_to_performance_state = rpmhpd_get_performance_state; in rpmhpd_probe()
545 pm_genpd_init(&rpmhpds[i]->pd, NULL, true); in rpmhpd_probe()
547 data->domains[i] = &rpmhpds[i]->pd; in rpmhpd_probe()
554 if (rpmhpds[i]->parent) in rpmhpd_probe()
555 pm_genpd_add_subdomain(rpmhpds[i]->parent, in rpmhpd_probe()
556 &rpmhpds[i]->pd); in rpmhpd_probe()
559 return of_genpd_add_provider_onecell(pdev->dev.of_node, data); in rpmhpd_probe()
564 .name = "qcom-rpmhpd",