162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/err.h>
562306a36Sopenharmony_ci#include <linux/init.h>
662306a36Sopenharmony_ci#include <linux/kernel.h>
762306a36Sopenharmony_ci#include <linux/module.h>
862306a36Sopenharmony_ci#include <linux/mutex.h>
962306a36Sopenharmony_ci#include <linux/pm_domain.h>
1062306a36Sopenharmony_ci#include <linux/of.h>
1162306a36Sopenharmony_ci#include <linux/platform_device.h>
1262306a36Sopenharmony_ci#include <linux/pm_opp.h>
1362306a36Sopenharmony_ci#include <linux/soc/qcom/smd-rpm.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <dt-bindings/power/qcom-rpmpd.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define domain_to_rpmpd(domain) container_of(domain, struct rpmpd, pd)
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/* Resource types:
2062306a36Sopenharmony_ci * RPMPD_X is X encoded as a little-endian, lower-case, ASCII string */
2162306a36Sopenharmony_ci#define RPMPD_SMPA 0x61706d73
2262306a36Sopenharmony_ci#define RPMPD_LDOA 0x616f646c
2362306a36Sopenharmony_ci#define RPMPD_SMPB 0x62706d73
2462306a36Sopenharmony_ci#define RPMPD_LDOB 0x626f646c
2562306a36Sopenharmony_ci#define RPMPD_RWCX 0x78637772
2662306a36Sopenharmony_ci#define RPMPD_RWMX 0x786d7772
2762306a36Sopenharmony_ci#define RPMPD_RWLC 0x636c7772
2862306a36Sopenharmony_ci#define RPMPD_RWLM 0x6d6c7772
2962306a36Sopenharmony_ci#define RPMPD_RWSC 0x63737772
3062306a36Sopenharmony_ci#define RPMPD_RWSM 0x6d737772
3162306a36Sopenharmony_ci#define RPMPD_RWGX 0x78677772
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/* Operation Keys */
3462306a36Sopenharmony_ci#define KEY_CORNER		0x6e726f63 /* corn */
3562306a36Sopenharmony_ci#define KEY_ENABLE		0x6e657773 /* swen */
3662306a36Sopenharmony_ci#define KEY_FLOOR_CORNER	0x636676   /* vfc */
3762306a36Sopenharmony_ci#define KEY_FLOOR_LEVEL		0x6c6676   /* vfl */
3862306a36Sopenharmony_ci#define KEY_LEVEL		0x6c766c76 /* vlvl */
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define MAX_CORNER_RPMPD_STATE	6
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct rpmpd_req {
4362306a36Sopenharmony_ci	__le32 key;
4462306a36Sopenharmony_ci	__le32 nbytes;
4562306a36Sopenharmony_ci	__le32 value;
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct rpmpd {
4962306a36Sopenharmony_ci	struct generic_pm_domain pd;
5062306a36Sopenharmony_ci	struct generic_pm_domain *parent;
5162306a36Sopenharmony_ci	struct rpmpd *peer;
5262306a36Sopenharmony_ci	const bool active_only;
5362306a36Sopenharmony_ci	unsigned int corner;
5462306a36Sopenharmony_ci	bool enabled;
5562306a36Sopenharmony_ci	const int res_type;
5662306a36Sopenharmony_ci	const int res_id;
5762306a36Sopenharmony_ci	struct qcom_smd_rpm *rpm;
5862306a36Sopenharmony_ci	unsigned int max_state;
5962306a36Sopenharmony_ci	__le32 key;
6062306a36Sopenharmony_ci	bool state_synced;
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistruct rpmpd_desc {
6462306a36Sopenharmony_ci	struct rpmpd **rpmpds;
6562306a36Sopenharmony_ci	size_t num_pds;
6662306a36Sopenharmony_ci	unsigned int max_state;
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic DEFINE_MUTEX(rpmpd_lock);
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/* CX */
7262306a36Sopenharmony_cistatic struct rpmpd cx_rwcx0_lvl_ao;
7362306a36Sopenharmony_cistatic struct rpmpd cx_rwcx0_lvl = {
7462306a36Sopenharmony_ci	.pd = { .name = "cx", },
7562306a36Sopenharmony_ci	.peer = &cx_rwcx0_lvl_ao,
7662306a36Sopenharmony_ci	.res_type = RPMPD_RWCX,
7762306a36Sopenharmony_ci	.res_id = 0,
7862306a36Sopenharmony_ci	.key = KEY_LEVEL,
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic struct rpmpd cx_rwcx0_lvl_ao = {
8262306a36Sopenharmony_ci	.pd = { .name = "cx_ao", },
8362306a36Sopenharmony_ci	.peer = &cx_rwcx0_lvl,
8462306a36Sopenharmony_ci	.active_only = true,
8562306a36Sopenharmony_ci	.res_type = RPMPD_RWCX,
8662306a36Sopenharmony_ci	.res_id = 0,
8762306a36Sopenharmony_ci	.key = KEY_LEVEL,
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic struct rpmpd cx_s1a_corner_ao;
9162306a36Sopenharmony_cistatic struct rpmpd cx_s1a_corner = {
9262306a36Sopenharmony_ci	.pd = { .name = "cx", },
9362306a36Sopenharmony_ci	.peer = &cx_s1a_corner_ao,
9462306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
9562306a36Sopenharmony_ci	.res_id = 1,
9662306a36Sopenharmony_ci	.key = KEY_CORNER,
9762306a36Sopenharmony_ci};
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic struct rpmpd cx_s1a_corner_ao = {
10062306a36Sopenharmony_ci	.pd = { .name = "cx_ao", },
10162306a36Sopenharmony_ci	.peer = &cx_s1a_corner,
10262306a36Sopenharmony_ci	.active_only = true,
10362306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
10462306a36Sopenharmony_ci	.res_id = 1,
10562306a36Sopenharmony_ci	.key = KEY_CORNER,
10662306a36Sopenharmony_ci};
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistatic struct rpmpd cx_s2a_corner_ao;
10962306a36Sopenharmony_cistatic struct rpmpd cx_s2a_corner = {
11062306a36Sopenharmony_ci	.pd = { .name = "cx", },
11162306a36Sopenharmony_ci	.peer = &cx_s2a_corner_ao,
11262306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
11362306a36Sopenharmony_ci	.res_id = 2,
11462306a36Sopenharmony_ci	.key = KEY_CORNER,
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistatic struct rpmpd cx_s2a_corner_ao = {
11862306a36Sopenharmony_ci	.pd = { .name = "cx_ao", },
11962306a36Sopenharmony_ci	.peer = &cx_s2a_corner,
12062306a36Sopenharmony_ci	.active_only = true,
12162306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
12262306a36Sopenharmony_ci	.res_id = 2,
12362306a36Sopenharmony_ci	.key = KEY_CORNER,
12462306a36Sopenharmony_ci};
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_cistatic struct rpmpd cx_s2a_lvl_ao;
12762306a36Sopenharmony_cistatic struct rpmpd cx_s2a_lvl = {
12862306a36Sopenharmony_ci	.pd = { .name = "cx", },
12962306a36Sopenharmony_ci	.peer = &cx_s2a_lvl_ao,
13062306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
13162306a36Sopenharmony_ci	.res_id = 2,
13262306a36Sopenharmony_ci	.key = KEY_LEVEL,
13362306a36Sopenharmony_ci};
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_cistatic struct rpmpd cx_s2a_lvl_ao = {
13662306a36Sopenharmony_ci	.pd = { .name = "cx_ao", },
13762306a36Sopenharmony_ci	.peer = &cx_s2a_lvl,
13862306a36Sopenharmony_ci	.active_only = true,
13962306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
14062306a36Sopenharmony_ci	.res_id = 2,
14162306a36Sopenharmony_ci	.key = KEY_LEVEL,
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_cistatic struct rpmpd cx_s3a_lvl_ao;
14562306a36Sopenharmony_cistatic struct rpmpd cx_s3a_lvl = {
14662306a36Sopenharmony_ci	.pd = { .name = "cx", },
14762306a36Sopenharmony_ci	.peer = &cx_s3a_lvl_ao,
14862306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
14962306a36Sopenharmony_ci	.res_id = 3,
15062306a36Sopenharmony_ci	.key = KEY_LEVEL,
15162306a36Sopenharmony_ci};
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistatic struct rpmpd cx_s3a_lvl_ao = {
15462306a36Sopenharmony_ci	.pd = { .name = "cx_ao", },
15562306a36Sopenharmony_ci	.peer = &cx_s3a_lvl,
15662306a36Sopenharmony_ci	.active_only = true,
15762306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
15862306a36Sopenharmony_ci	.res_id = 3,
15962306a36Sopenharmony_ci	.key = KEY_LEVEL,
16062306a36Sopenharmony_ci};
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_cistatic struct rpmpd cx_rwcx0_vfl = {
16362306a36Sopenharmony_ci	.pd = { .name = "cx_vfl", },
16462306a36Sopenharmony_ci	.res_type = RPMPD_RWCX,
16562306a36Sopenharmony_ci	.res_id = 0,
16662306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistatic struct rpmpd cx_rwsc2_vfl = {
17062306a36Sopenharmony_ci	.pd = { .name = "cx_vfl", },
17162306a36Sopenharmony_ci	.res_type = RPMPD_RWSC,
17262306a36Sopenharmony_ci	.res_id = 2,
17362306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistatic struct rpmpd cx_s1a_vfc = {
17762306a36Sopenharmony_ci	.pd = { .name = "cx_vfc", },
17862306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
17962306a36Sopenharmony_ci	.res_id = 1,
18062306a36Sopenharmony_ci	.key = KEY_FLOOR_CORNER,
18162306a36Sopenharmony_ci};
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistatic struct rpmpd cx_s2a_vfc = {
18462306a36Sopenharmony_ci	.pd = { .name = "cx_vfc", },
18562306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
18662306a36Sopenharmony_ci	.res_id = 2,
18762306a36Sopenharmony_ci	.key = KEY_FLOOR_CORNER,
18862306a36Sopenharmony_ci};
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistatic struct rpmpd cx_s2a_vfl = {
19162306a36Sopenharmony_ci	.pd = { .name = "cx_vfl", },
19262306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
19362306a36Sopenharmony_ci	.res_id = 2,
19462306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
19562306a36Sopenharmony_ci};
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_cistatic struct rpmpd cx_s3a_vfl = {
19862306a36Sopenharmony_ci	.pd = { .name = "cx_vfl", },
19962306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
20062306a36Sopenharmony_ci	.res_id = 3,
20162306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
20262306a36Sopenharmony_ci};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci/* G(F)X */
20562306a36Sopenharmony_cistatic struct rpmpd gfx_s2b_corner = {
20662306a36Sopenharmony_ci	.pd = { .name = "gfx", },
20762306a36Sopenharmony_ci	.res_type = RPMPD_SMPB,
20862306a36Sopenharmony_ci	.res_id = 2,
20962306a36Sopenharmony_ci	.key = KEY_CORNER,
21062306a36Sopenharmony_ci};
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_cistatic struct rpmpd gfx_s2b_vfc = {
21362306a36Sopenharmony_ci	.pd = { .name = "gfx_vfc", },
21462306a36Sopenharmony_ci	.res_type = RPMPD_SMPB,
21562306a36Sopenharmony_ci	.res_id = 2,
21662306a36Sopenharmony_ci	.key = KEY_FLOOR_CORNER,
21762306a36Sopenharmony_ci};
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cistatic struct rpmpd mx_rwmx0_lvl;
22062306a36Sopenharmony_cistatic struct rpmpd gx_rwgx0_lvl_ao;
22162306a36Sopenharmony_cistatic struct rpmpd gx_rwgx0_lvl = {
22262306a36Sopenharmony_ci	.pd = { .name = "gx", },
22362306a36Sopenharmony_ci	.peer = &gx_rwgx0_lvl_ao,
22462306a36Sopenharmony_ci	.res_type = RPMPD_RWGX,
22562306a36Sopenharmony_ci	.parent = &mx_rwmx0_lvl.pd,
22662306a36Sopenharmony_ci	.res_id = 0,
22762306a36Sopenharmony_ci	.key = KEY_LEVEL,
22862306a36Sopenharmony_ci};
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_cistatic struct rpmpd mx_rwmx0_lvl_ao;
23162306a36Sopenharmony_cistatic struct rpmpd gx_rwgx0_lvl_ao = {
23262306a36Sopenharmony_ci	.pd = { .name = "gx_ao", },
23362306a36Sopenharmony_ci	.peer = &gx_rwgx0_lvl,
23462306a36Sopenharmony_ci	.parent = &mx_rwmx0_lvl_ao.pd,
23562306a36Sopenharmony_ci	.active_only = true,
23662306a36Sopenharmony_ci	.res_type = RPMPD_RWGX,
23762306a36Sopenharmony_ci	.res_id = 0,
23862306a36Sopenharmony_ci	.key = KEY_LEVEL,
23962306a36Sopenharmony_ci};
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci/* MX */
24262306a36Sopenharmony_cistatic struct rpmpd mx_l3a_corner_ao;
24362306a36Sopenharmony_cistatic struct rpmpd mx_l3a_corner = {
24462306a36Sopenharmony_ci	.pd = { .name = "mx", },
24562306a36Sopenharmony_ci	.peer = &mx_l3a_corner_ao,
24662306a36Sopenharmony_ci	.res_type = RPMPD_LDOA,
24762306a36Sopenharmony_ci	.res_id = 3,
24862306a36Sopenharmony_ci	.key = KEY_CORNER,
24962306a36Sopenharmony_ci};
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cistatic struct rpmpd mx_l3a_corner_ao = {
25262306a36Sopenharmony_ci	.pd = { .name = "mx_ao", },
25362306a36Sopenharmony_ci	.peer = &mx_l3a_corner,
25462306a36Sopenharmony_ci	.active_only = true,
25562306a36Sopenharmony_ci	.res_type = RPMPD_LDOA,
25662306a36Sopenharmony_ci	.res_id = 3,
25762306a36Sopenharmony_ci	.key = KEY_CORNER,
25862306a36Sopenharmony_ci};
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_cistatic struct rpmpd mx_l12a_lvl_ao;
26162306a36Sopenharmony_cistatic struct rpmpd mx_l12a_lvl = {
26262306a36Sopenharmony_ci	.pd = { .name = "mx", },
26362306a36Sopenharmony_ci	.peer = &mx_l12a_lvl_ao,
26462306a36Sopenharmony_ci	.res_type = RPMPD_LDOA,
26562306a36Sopenharmony_ci	.res_id = 12,
26662306a36Sopenharmony_ci	.key = KEY_LEVEL,
26762306a36Sopenharmony_ci};
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_cistatic struct rpmpd mx_l12a_lvl_ao = {
27062306a36Sopenharmony_ci	.pd = { .name = "mx_ao", },
27162306a36Sopenharmony_ci	.peer = &mx_l12a_lvl,
27262306a36Sopenharmony_ci	.active_only = true,
27362306a36Sopenharmony_ci	.res_type = RPMPD_LDOA,
27462306a36Sopenharmony_ci	.res_id = 12,
27562306a36Sopenharmony_ci	.key = KEY_LEVEL,
27662306a36Sopenharmony_ci};
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_cistatic struct rpmpd mx_s2a_corner_ao;
27962306a36Sopenharmony_cistatic struct rpmpd mx_s2a_corner = {
28062306a36Sopenharmony_ci	.pd = { .name = "mx", },
28162306a36Sopenharmony_ci	.peer = &mx_s2a_corner_ao,
28262306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
28362306a36Sopenharmony_ci	.res_id = 2,
28462306a36Sopenharmony_ci	.key = KEY_CORNER,
28562306a36Sopenharmony_ci};
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_cistatic struct rpmpd mx_s2a_corner_ao = {
28862306a36Sopenharmony_ci	.pd = { .name = "mx_ao", },
28962306a36Sopenharmony_ci	.peer = &mx_s2a_corner,
29062306a36Sopenharmony_ci	.active_only = true,
29162306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
29262306a36Sopenharmony_ci	.res_id = 2,
29362306a36Sopenharmony_ci	.key = KEY_CORNER,
29462306a36Sopenharmony_ci};
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_cistatic struct rpmpd mx_rwmx0_lvl_ao;
29762306a36Sopenharmony_cistatic struct rpmpd mx_rwmx0_lvl = {
29862306a36Sopenharmony_ci	.pd = { .name = "mx", },
29962306a36Sopenharmony_ci	.peer = &mx_rwmx0_lvl_ao,
30062306a36Sopenharmony_ci	.res_type = RPMPD_RWMX,
30162306a36Sopenharmony_ci	.res_id = 0,
30262306a36Sopenharmony_ci	.key = KEY_LEVEL,
30362306a36Sopenharmony_ci};
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_cistatic struct rpmpd mx_rwmx0_lvl_ao = {
30662306a36Sopenharmony_ci	.pd = { .name = "mx_ao", },
30762306a36Sopenharmony_ci	.peer = &mx_rwmx0_lvl,
30862306a36Sopenharmony_ci	.active_only = true,
30962306a36Sopenharmony_ci	.res_type = RPMPD_RWMX,
31062306a36Sopenharmony_ci	.res_id = 0,
31162306a36Sopenharmony_ci	.key = KEY_LEVEL,
31262306a36Sopenharmony_ci};
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_cistatic struct rpmpd mx_s6a_lvl_ao;
31562306a36Sopenharmony_cistatic struct rpmpd mx_s6a_lvl = {
31662306a36Sopenharmony_ci	.pd = { .name = "mx", },
31762306a36Sopenharmony_ci	.peer = &mx_s6a_lvl_ao,
31862306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
31962306a36Sopenharmony_ci	.res_id = 6,
32062306a36Sopenharmony_ci	.key = KEY_LEVEL,
32162306a36Sopenharmony_ci};
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_cistatic struct rpmpd mx_s6a_lvl_ao = {
32462306a36Sopenharmony_ci	.pd = { .name = "mx_ao", },
32562306a36Sopenharmony_ci	.peer = &mx_s6a_lvl,
32662306a36Sopenharmony_ci	.active_only = true,
32762306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
32862306a36Sopenharmony_ci	.res_id = 6,
32962306a36Sopenharmony_ci	.key = KEY_LEVEL,
33062306a36Sopenharmony_ci};
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_cistatic struct rpmpd mx_s7a_lvl_ao;
33362306a36Sopenharmony_cistatic struct rpmpd mx_s7a_lvl = {
33462306a36Sopenharmony_ci	.pd = { .name = "mx", },
33562306a36Sopenharmony_ci	.peer = &mx_s7a_lvl_ao,
33662306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
33762306a36Sopenharmony_ci	.res_id = 7,
33862306a36Sopenharmony_ci	.key = KEY_LEVEL,
33962306a36Sopenharmony_ci};
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_cistatic struct rpmpd mx_s7a_lvl_ao = {
34262306a36Sopenharmony_ci	.pd = { .name = "mx_ao", },
34362306a36Sopenharmony_ci	.peer = &mx_s7a_lvl,
34462306a36Sopenharmony_ci	.active_only = true,
34562306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
34662306a36Sopenharmony_ci	.res_id = 7,
34762306a36Sopenharmony_ci	.key = KEY_LEVEL,
34862306a36Sopenharmony_ci};
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cistatic struct rpmpd mx_l12a_vfl = {
35162306a36Sopenharmony_ci	.pd = { .name = "mx_vfl", },
35262306a36Sopenharmony_ci	.res_type = RPMPD_LDOA,
35362306a36Sopenharmony_ci	.res_id = 12,
35462306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
35562306a36Sopenharmony_ci};
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_cistatic struct rpmpd mx_rwmx0_vfl = {
35862306a36Sopenharmony_ci	.pd = { .name = "mx_vfl", },
35962306a36Sopenharmony_ci	.res_type = RPMPD_RWMX,
36062306a36Sopenharmony_ci	.res_id = 0,
36162306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
36262306a36Sopenharmony_ci};
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_cistatic struct rpmpd mx_rwsm6_vfl = {
36562306a36Sopenharmony_ci	.pd = { .name = "mx_vfl", },
36662306a36Sopenharmony_ci	.res_type = RPMPD_RWSM,
36762306a36Sopenharmony_ci	.res_id = 6,
36862306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
36962306a36Sopenharmony_ci};
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci/* MD */
37262306a36Sopenharmony_cistatic struct rpmpd md_s1a_corner_ao;
37362306a36Sopenharmony_cistatic struct rpmpd md_s1a_corner = {
37462306a36Sopenharmony_ci	.pd = { .name = "md", },
37562306a36Sopenharmony_ci	.peer = &md_s1a_corner_ao,
37662306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
37762306a36Sopenharmony_ci	.res_id = 1,
37862306a36Sopenharmony_ci	.key = KEY_CORNER,
37962306a36Sopenharmony_ci};
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_cistatic struct rpmpd md_s1a_corner_ao = {
38262306a36Sopenharmony_ci	.pd = { .name = "md_ao", },
38362306a36Sopenharmony_ci	.peer = &md_s1a_corner,
38462306a36Sopenharmony_ci	.active_only = true,
38562306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
38662306a36Sopenharmony_ci	.res_id = 1,
38762306a36Sopenharmony_ci	.key = KEY_CORNER,
38862306a36Sopenharmony_ci};
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_cistatic struct rpmpd md_s1a_lvl_ao;
39162306a36Sopenharmony_cistatic struct rpmpd md_s1a_lvl = {
39262306a36Sopenharmony_ci	.pd = { .name = "md", },
39362306a36Sopenharmony_ci	.peer = &md_s1a_lvl_ao,
39462306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
39562306a36Sopenharmony_ci	.res_id = 1,
39662306a36Sopenharmony_ci	.key = KEY_LEVEL,
39762306a36Sopenharmony_ci};
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_cistatic struct rpmpd md_s1a_lvl_ao = {
40062306a36Sopenharmony_ci	.pd = { .name = "md_ao", },
40162306a36Sopenharmony_ci	.peer = &md_s1a_lvl,
40262306a36Sopenharmony_ci	.active_only = true,
40362306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
40462306a36Sopenharmony_ci	.res_id = 1,
40562306a36Sopenharmony_ci	.key = KEY_LEVEL,
40662306a36Sopenharmony_ci};
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_cistatic struct rpmpd md_s1a_vfc = {
40962306a36Sopenharmony_ci	.pd = { .name = "md_vfc", },
41062306a36Sopenharmony_ci	.res_type = RPMPD_SMPA,
41162306a36Sopenharmony_ci	.res_id = 1,
41262306a36Sopenharmony_ci	.key = KEY_FLOOR_CORNER,
41362306a36Sopenharmony_ci};
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci/* LPI_CX */
41662306a36Sopenharmony_cistatic struct rpmpd lpi_cx_rwlc0_lvl = {
41762306a36Sopenharmony_ci	.pd = { .name = "lpi_cx", },
41862306a36Sopenharmony_ci	.res_type = RPMPD_RWLC,
41962306a36Sopenharmony_ci	.res_id = 0,
42062306a36Sopenharmony_ci	.key = KEY_LEVEL,
42162306a36Sopenharmony_ci};
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_cistatic struct rpmpd lpi_cx_rwlc0_vfl = {
42462306a36Sopenharmony_ci	.pd = { .name = "lpi_cx_vfl", },
42562306a36Sopenharmony_ci	.res_type = RPMPD_RWLC,
42662306a36Sopenharmony_ci	.res_id = 0,
42762306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
42862306a36Sopenharmony_ci};
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci/* LPI_MX */
43162306a36Sopenharmony_cistatic struct rpmpd lpi_mx_rwlm0_lvl = {
43262306a36Sopenharmony_ci	.pd = { .name = "lpi_mx", },
43362306a36Sopenharmony_ci	.res_type = RPMPD_RWLM,
43462306a36Sopenharmony_ci	.res_id = 0,
43562306a36Sopenharmony_ci	.key = KEY_LEVEL,
43662306a36Sopenharmony_ci};
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_cistatic struct rpmpd lpi_mx_rwlm0_vfl = {
43962306a36Sopenharmony_ci	.pd = { .name = "lpi_mx_vfl", },
44062306a36Sopenharmony_ci	.res_type = RPMPD_RWLM,
44162306a36Sopenharmony_ci	.res_id = 0,
44262306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
44362306a36Sopenharmony_ci};
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ci/* SSC_CX */
44662306a36Sopenharmony_cistatic struct rpmpd ssc_cx_l26a_corner = {
44762306a36Sopenharmony_ci	.pd = { .name = "ssc_cx", },
44862306a36Sopenharmony_ci	.res_type = RPMPD_LDOA,
44962306a36Sopenharmony_ci	.res_id = 26,
45062306a36Sopenharmony_ci	.key = KEY_CORNER,
45162306a36Sopenharmony_ci};
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_cistatic struct rpmpd ssc_cx_rwlc0_lvl = {
45462306a36Sopenharmony_ci	.pd = { .name = "ssc_cx", },
45562306a36Sopenharmony_ci	.res_type = RPMPD_RWLC,
45662306a36Sopenharmony_ci	.res_id = 0,
45762306a36Sopenharmony_ci	.key = KEY_LEVEL,
45862306a36Sopenharmony_ci};
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_cistatic struct rpmpd ssc_cx_rwsc0_lvl = {
46162306a36Sopenharmony_ci	.pd = { .name = "ssc_cx", },
46262306a36Sopenharmony_ci	.res_type = RPMPD_RWSC,
46362306a36Sopenharmony_ci	.res_id = 0,
46462306a36Sopenharmony_ci	.key = KEY_LEVEL,
46562306a36Sopenharmony_ci};
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_cistatic struct rpmpd ssc_cx_l26a_vfc = {
46862306a36Sopenharmony_ci	.pd = { .name = "ssc_cx_vfc", },
46962306a36Sopenharmony_ci	.res_type = RPMPD_LDOA,
47062306a36Sopenharmony_ci	.res_id = 26,
47162306a36Sopenharmony_ci	.key = KEY_FLOOR_CORNER,
47262306a36Sopenharmony_ci};
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_cistatic struct rpmpd ssc_cx_rwlc0_vfl = {
47562306a36Sopenharmony_ci	.pd = { .name = "ssc_cx_vfl", },
47662306a36Sopenharmony_ci	.res_type = RPMPD_RWLC,
47762306a36Sopenharmony_ci	.res_id = 0,
47862306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
47962306a36Sopenharmony_ci};
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_cistatic struct rpmpd ssc_cx_rwsc0_vfl = {
48262306a36Sopenharmony_ci	.pd = { .name = "ssc_cx_vfl", },
48362306a36Sopenharmony_ci	.res_type = RPMPD_RWSC,
48462306a36Sopenharmony_ci	.res_id = 0,
48562306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
48662306a36Sopenharmony_ci};
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci/* SSC_MX */
48962306a36Sopenharmony_cistatic struct rpmpd ssc_mx_rwlm0_lvl = {
49062306a36Sopenharmony_ci	.pd = { .name = "ssc_mx", },
49162306a36Sopenharmony_ci	.res_type = RPMPD_RWLM,
49262306a36Sopenharmony_ci	.res_id = 0,
49362306a36Sopenharmony_ci	.key = KEY_LEVEL,
49462306a36Sopenharmony_ci};
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_cistatic struct rpmpd ssc_mx_rwsm0_lvl = {
49762306a36Sopenharmony_ci	.pd = { .name = "ssc_mx", },
49862306a36Sopenharmony_ci	.res_type = RPMPD_RWSM,
49962306a36Sopenharmony_ci	.res_id = 0,
50062306a36Sopenharmony_ci	.key = KEY_LEVEL,
50162306a36Sopenharmony_ci};
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_cistatic struct rpmpd ssc_mx_rwlm0_vfl = {
50462306a36Sopenharmony_ci	.pd = { .name = "ssc_mx_vfl", },
50562306a36Sopenharmony_ci	.res_type = RPMPD_RWLM,
50662306a36Sopenharmony_ci	.res_id = 0,
50762306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
50862306a36Sopenharmony_ci};
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_cistatic struct rpmpd ssc_mx_rwsm0_vfl = {
51162306a36Sopenharmony_ci	.pd = { .name = "ssc_mx_vfl", },
51262306a36Sopenharmony_ci	.res_type = RPMPD_RWSM,
51362306a36Sopenharmony_ci	.res_id = 0,
51462306a36Sopenharmony_ci	.key = KEY_FLOOR_LEVEL,
51562306a36Sopenharmony_ci};
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_cistatic struct rpmpd *mdm9607_rpmpds[] = {
51862306a36Sopenharmony_ci	[MDM9607_VDDCX] =	&cx_s3a_lvl,
51962306a36Sopenharmony_ci	[MDM9607_VDDCX_AO] =	&cx_s3a_lvl_ao,
52062306a36Sopenharmony_ci	[MDM9607_VDDCX_VFL] =	&cx_s3a_vfl,
52162306a36Sopenharmony_ci	[MDM9607_VDDMX] =	&mx_l12a_lvl,
52262306a36Sopenharmony_ci	[MDM9607_VDDMX_AO] =	&mx_l12a_lvl_ao,
52362306a36Sopenharmony_ci	[MDM9607_VDDMX_VFL] =	&mx_l12a_vfl,
52462306a36Sopenharmony_ci};
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_cistatic const struct rpmpd_desc mdm9607_desc = {
52762306a36Sopenharmony_ci	.rpmpds = mdm9607_rpmpds,
52862306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(mdm9607_rpmpds),
52962306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_TURBO,
53062306a36Sopenharmony_ci};
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_cistatic struct rpmpd *msm8226_rpmpds[] = {
53362306a36Sopenharmony_ci	[MSM8226_VDDCX] =	&cx_s1a_corner,
53462306a36Sopenharmony_ci	[MSM8226_VDDCX_AO] =	&cx_s1a_corner_ao,
53562306a36Sopenharmony_ci	[MSM8226_VDDCX_VFC] =	&cx_s1a_vfc,
53662306a36Sopenharmony_ci};
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_cistatic const struct rpmpd_desc msm8226_desc = {
53962306a36Sopenharmony_ci	.rpmpds = msm8226_rpmpds,
54062306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(msm8226_rpmpds),
54162306a36Sopenharmony_ci	.max_state = MAX_CORNER_RPMPD_STATE,
54262306a36Sopenharmony_ci};
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_cistatic struct rpmpd *msm8939_rpmpds[] = {
54562306a36Sopenharmony_ci	[MSM8939_VDDMDCX] =	&md_s1a_corner,
54662306a36Sopenharmony_ci	[MSM8939_VDDMDCX_AO] =	&md_s1a_corner_ao,
54762306a36Sopenharmony_ci	[MSM8939_VDDMDCX_VFC] =	&md_s1a_vfc,
54862306a36Sopenharmony_ci	[MSM8939_VDDCX] =	&cx_s2a_corner,
54962306a36Sopenharmony_ci	[MSM8939_VDDCX_AO] =	&cx_s2a_corner_ao,
55062306a36Sopenharmony_ci	[MSM8939_VDDCX_VFC] =	&cx_s2a_vfc,
55162306a36Sopenharmony_ci	[MSM8939_VDDMX] =	&mx_l3a_corner,
55262306a36Sopenharmony_ci	[MSM8939_VDDMX_AO] =	&mx_l3a_corner_ao,
55362306a36Sopenharmony_ci};
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_cistatic const struct rpmpd_desc msm8939_desc = {
55662306a36Sopenharmony_ci	.rpmpds = msm8939_rpmpds,
55762306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(msm8939_rpmpds),
55862306a36Sopenharmony_ci	.max_state = MAX_CORNER_RPMPD_STATE,
55962306a36Sopenharmony_ci};
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_cistatic struct rpmpd *msm8916_rpmpds[] = {
56262306a36Sopenharmony_ci	[MSM8916_VDDCX] =	&cx_s1a_corner,
56362306a36Sopenharmony_ci	[MSM8916_VDDCX_AO] =	&cx_s1a_corner_ao,
56462306a36Sopenharmony_ci	[MSM8916_VDDCX_VFC] =	&cx_s1a_vfc,
56562306a36Sopenharmony_ci	[MSM8916_VDDMX] =	&mx_l3a_corner,
56662306a36Sopenharmony_ci	[MSM8916_VDDMX_AO] =	&mx_l3a_corner_ao,
56762306a36Sopenharmony_ci};
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_cistatic const struct rpmpd_desc msm8916_desc = {
57062306a36Sopenharmony_ci	.rpmpds = msm8916_rpmpds,
57162306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(msm8916_rpmpds),
57262306a36Sopenharmony_ci	.max_state = MAX_CORNER_RPMPD_STATE,
57362306a36Sopenharmony_ci};
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_cistatic struct rpmpd *msm8953_rpmpds[] = {
57662306a36Sopenharmony_ci	[MSM8953_VDDMD] =	&md_s1a_lvl,
57762306a36Sopenharmony_ci	[MSM8953_VDDMD_AO] =	&md_s1a_lvl_ao,
57862306a36Sopenharmony_ci	[MSM8953_VDDCX] =	&cx_s2a_lvl,
57962306a36Sopenharmony_ci	[MSM8953_VDDCX_AO] =	&cx_s2a_lvl_ao,
58062306a36Sopenharmony_ci	[MSM8953_VDDCX_VFL] =	&cx_s2a_vfl,
58162306a36Sopenharmony_ci	[MSM8953_VDDMX] =	&mx_s7a_lvl,
58262306a36Sopenharmony_ci	[MSM8953_VDDMX_AO] =	&mx_s7a_lvl_ao,
58362306a36Sopenharmony_ci};
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_cistatic const struct rpmpd_desc msm8953_desc = {
58662306a36Sopenharmony_ci	.rpmpds = msm8953_rpmpds,
58762306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(msm8953_rpmpds),
58862306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_TURBO,
58962306a36Sopenharmony_ci};
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_cistatic struct rpmpd *msm8976_rpmpds[] = {
59262306a36Sopenharmony_ci	[MSM8976_VDDCX] =	&cx_s2a_lvl,
59362306a36Sopenharmony_ci	[MSM8976_VDDCX_AO] =	&cx_s2a_lvl_ao,
59462306a36Sopenharmony_ci	[MSM8976_VDDCX_VFL] =	&cx_rwsc2_vfl,
59562306a36Sopenharmony_ci	[MSM8976_VDDMX] =	&mx_s6a_lvl,
59662306a36Sopenharmony_ci	[MSM8976_VDDMX_AO] =	&mx_s6a_lvl_ao,
59762306a36Sopenharmony_ci	[MSM8976_VDDMX_VFL] =	&mx_rwsm6_vfl,
59862306a36Sopenharmony_ci};
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_cistatic const struct rpmpd_desc msm8976_desc = {
60162306a36Sopenharmony_ci	.rpmpds = msm8976_rpmpds,
60262306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(msm8976_rpmpds),
60362306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_TURBO_HIGH,
60462306a36Sopenharmony_ci};
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_cistatic struct rpmpd *msm8994_rpmpds[] = {
60762306a36Sopenharmony_ci	[MSM8994_VDDCX] =	&cx_s1a_corner,
60862306a36Sopenharmony_ci	[MSM8994_VDDCX_AO] =	&cx_s1a_corner_ao,
60962306a36Sopenharmony_ci	[MSM8994_VDDCX_VFC] =	&cx_s1a_vfc,
61062306a36Sopenharmony_ci	[MSM8994_VDDMX] =	&mx_s2a_corner,
61162306a36Sopenharmony_ci	[MSM8994_VDDMX_AO] =	&mx_s2a_corner_ao,
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_ci	/* Attention! *Some* 8994 boards with pm8004 may use SMPC here! */
61462306a36Sopenharmony_ci	[MSM8994_VDDGFX] =	&gfx_s2b_corner,
61562306a36Sopenharmony_ci	[MSM8994_VDDGFX_VFC] =	&gfx_s2b_vfc,
61662306a36Sopenharmony_ci};
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_cistatic const struct rpmpd_desc msm8994_desc = {
61962306a36Sopenharmony_ci	.rpmpds = msm8994_rpmpds,
62062306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(msm8994_rpmpds),
62162306a36Sopenharmony_ci	.max_state = MAX_CORNER_RPMPD_STATE,
62262306a36Sopenharmony_ci};
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_cistatic struct rpmpd *msm8996_rpmpds[] = {
62562306a36Sopenharmony_ci	[MSM8996_VDDCX] =	&cx_s1a_corner,
62662306a36Sopenharmony_ci	[MSM8996_VDDCX_AO] =	&cx_s1a_corner_ao,
62762306a36Sopenharmony_ci	[MSM8996_VDDCX_VFC] =	&cx_s1a_vfc,
62862306a36Sopenharmony_ci	[MSM8996_VDDMX] =	&mx_s2a_corner,
62962306a36Sopenharmony_ci	[MSM8996_VDDMX_AO] =	&mx_s2a_corner_ao,
63062306a36Sopenharmony_ci	[MSM8996_VDDSSCX] =	&ssc_cx_l26a_corner,
63162306a36Sopenharmony_ci	[MSM8996_VDDSSCX_VFC] =	&ssc_cx_l26a_vfc,
63262306a36Sopenharmony_ci};
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_cistatic const struct rpmpd_desc msm8996_desc = {
63562306a36Sopenharmony_ci	.rpmpds = msm8996_rpmpds,
63662306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(msm8996_rpmpds),
63762306a36Sopenharmony_ci	.max_state = MAX_CORNER_RPMPD_STATE,
63862306a36Sopenharmony_ci};
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_cistatic struct rpmpd *msm8998_rpmpds[] = {
64162306a36Sopenharmony_ci	[MSM8998_VDDCX] =	&cx_rwcx0_lvl,
64262306a36Sopenharmony_ci	[MSM8998_VDDCX_AO] =	&cx_rwcx0_lvl_ao,
64362306a36Sopenharmony_ci	[MSM8998_VDDCX_VFL] =	&cx_rwcx0_vfl,
64462306a36Sopenharmony_ci	[MSM8998_VDDMX] =	&mx_rwmx0_lvl,
64562306a36Sopenharmony_ci	[MSM8998_VDDMX_AO] =	&mx_rwmx0_lvl_ao,
64662306a36Sopenharmony_ci	[MSM8998_VDDMX_VFL] =	&mx_rwmx0_vfl,
64762306a36Sopenharmony_ci	[MSM8998_SSCCX] =	&ssc_cx_rwsc0_lvl,
64862306a36Sopenharmony_ci	[MSM8998_SSCCX_VFL] =	&ssc_cx_rwsc0_vfl,
64962306a36Sopenharmony_ci	[MSM8998_SSCMX] =	&ssc_mx_rwsm0_lvl,
65062306a36Sopenharmony_ci	[MSM8998_SSCMX_VFL] =	&ssc_mx_rwsm0_vfl,
65162306a36Sopenharmony_ci};
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_cistatic const struct rpmpd_desc msm8998_desc = {
65462306a36Sopenharmony_ci	.rpmpds = msm8998_rpmpds,
65562306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(msm8998_rpmpds),
65662306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_BINNING,
65762306a36Sopenharmony_ci};
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_cistatic struct rpmpd *qcs404_rpmpds[] = {
66062306a36Sopenharmony_ci	[QCS404_VDDMX] =	&mx_rwmx0_lvl,
66162306a36Sopenharmony_ci	[QCS404_VDDMX_AO] =	&mx_rwmx0_lvl_ao,
66262306a36Sopenharmony_ci	[QCS404_VDDMX_VFL] =	&mx_rwmx0_vfl,
66362306a36Sopenharmony_ci	[QCS404_LPICX] =	&lpi_cx_rwlc0_lvl,
66462306a36Sopenharmony_ci	[QCS404_LPICX_VFL] =	&lpi_cx_rwlc0_vfl,
66562306a36Sopenharmony_ci	[QCS404_LPIMX] =	&lpi_mx_rwlm0_lvl,
66662306a36Sopenharmony_ci	[QCS404_LPIMX_VFL] =	&lpi_mx_rwlm0_vfl,
66762306a36Sopenharmony_ci};
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_cistatic const struct rpmpd_desc qcs404_desc = {
67062306a36Sopenharmony_ci	.rpmpds = qcs404_rpmpds,
67162306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(qcs404_rpmpds),
67262306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_BINNING,
67362306a36Sopenharmony_ci};
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_cistatic struct rpmpd *sdm660_rpmpds[] = {
67662306a36Sopenharmony_ci	[SDM660_VDDCX] =	&cx_rwcx0_lvl,
67762306a36Sopenharmony_ci	[SDM660_VDDCX_AO] =	&cx_rwcx0_lvl_ao,
67862306a36Sopenharmony_ci	[SDM660_VDDCX_VFL] =	&cx_rwcx0_vfl,
67962306a36Sopenharmony_ci	[SDM660_VDDMX] =	&mx_rwmx0_lvl,
68062306a36Sopenharmony_ci	[SDM660_VDDMX_AO] =	&mx_rwmx0_lvl_ao,
68162306a36Sopenharmony_ci	[SDM660_VDDMX_VFL] =	&mx_rwmx0_vfl,
68262306a36Sopenharmony_ci	[SDM660_SSCCX] =	&ssc_cx_rwlc0_lvl,
68362306a36Sopenharmony_ci	[SDM660_SSCCX_VFL] =	&ssc_cx_rwlc0_vfl,
68462306a36Sopenharmony_ci	[SDM660_SSCMX] =	&ssc_mx_rwlm0_lvl,
68562306a36Sopenharmony_ci	[SDM660_SSCMX_VFL] =	&ssc_mx_rwlm0_vfl,
68662306a36Sopenharmony_ci};
68762306a36Sopenharmony_ci
68862306a36Sopenharmony_cistatic const struct rpmpd_desc sdm660_desc = {
68962306a36Sopenharmony_ci	.rpmpds = sdm660_rpmpds,
69062306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(sdm660_rpmpds),
69162306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_TURBO,
69262306a36Sopenharmony_ci};
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_cistatic struct rpmpd *sm6115_rpmpds[] = {
69562306a36Sopenharmony_ci	[SM6115_VDDCX] =	&cx_rwcx0_lvl,
69662306a36Sopenharmony_ci	[SM6115_VDDCX_AO] =	&cx_rwcx0_lvl_ao,
69762306a36Sopenharmony_ci	[SM6115_VDDCX_VFL] =	&cx_rwcx0_vfl,
69862306a36Sopenharmony_ci	[SM6115_VDDMX] =	&mx_rwmx0_lvl,
69962306a36Sopenharmony_ci	[SM6115_VDDMX_AO] =	&mx_rwmx0_lvl_ao,
70062306a36Sopenharmony_ci	[SM6115_VDDMX_VFL] =	&mx_rwmx0_vfl,
70162306a36Sopenharmony_ci	[SM6115_VDD_LPI_CX] =	&lpi_cx_rwlc0_lvl,
70262306a36Sopenharmony_ci	[SM6115_VDD_LPI_MX] =	&lpi_mx_rwlm0_lvl,
70362306a36Sopenharmony_ci};
70462306a36Sopenharmony_ci
70562306a36Sopenharmony_cistatic const struct rpmpd_desc sm6115_desc = {
70662306a36Sopenharmony_ci	.rpmpds = sm6115_rpmpds,
70762306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(sm6115_rpmpds),
70862306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_TURBO_NO_CPR,
70962306a36Sopenharmony_ci};
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_cistatic struct rpmpd *sm6125_rpmpds[] = {
71262306a36Sopenharmony_ci	[SM6125_VDDCX] =	&cx_rwcx0_lvl,
71362306a36Sopenharmony_ci	[SM6125_VDDCX_AO] =	&cx_rwcx0_lvl_ao,
71462306a36Sopenharmony_ci	[SM6125_VDDCX_VFL] =	&cx_rwcx0_vfl,
71562306a36Sopenharmony_ci	[SM6125_VDDMX] =	&mx_rwmx0_lvl,
71662306a36Sopenharmony_ci	[SM6125_VDDMX_AO] =	&mx_rwmx0_lvl_ao,
71762306a36Sopenharmony_ci	[SM6125_VDDMX_VFL] =	&mx_rwmx0_vfl,
71862306a36Sopenharmony_ci};
71962306a36Sopenharmony_ci
72062306a36Sopenharmony_cistatic const struct rpmpd_desc sm6125_desc = {
72162306a36Sopenharmony_ci	.rpmpds = sm6125_rpmpds,
72262306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(sm6125_rpmpds),
72362306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_BINNING,
72462306a36Sopenharmony_ci};
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_cistatic struct rpmpd *sm6375_rpmpds[] = {
72762306a36Sopenharmony_ci	[SM6375_VDDCX] =	&cx_rwcx0_lvl,
72862306a36Sopenharmony_ci	[SM6375_VDDCX_AO] =	&cx_rwcx0_lvl_ao,
72962306a36Sopenharmony_ci	[SM6375_VDDCX_VFL] =	&cx_rwcx0_vfl,
73062306a36Sopenharmony_ci	[SM6375_VDDMX] =	&mx_rwmx0_lvl,
73162306a36Sopenharmony_ci	[SM6375_VDDMX_AO] =	&mx_rwmx0_lvl_ao,
73262306a36Sopenharmony_ci	[SM6375_VDDMX_VFL] =	&mx_rwmx0_vfl,
73362306a36Sopenharmony_ci	[SM6375_VDDGX] =	&gx_rwgx0_lvl,
73462306a36Sopenharmony_ci	[SM6375_VDDGX_AO] =	&gx_rwgx0_lvl_ao,
73562306a36Sopenharmony_ci	[SM6375_VDD_LPI_CX] =	&lpi_cx_rwlc0_lvl,
73662306a36Sopenharmony_ci	[SM6375_VDD_LPI_MX] =	&lpi_mx_rwlm0_lvl,
73762306a36Sopenharmony_ci};
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_cistatic const struct rpmpd_desc sm6375_desc = {
74062306a36Sopenharmony_ci	.rpmpds = sm6375_rpmpds,
74162306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(sm6375_rpmpds),
74262306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_TURBO_NO_CPR,
74362306a36Sopenharmony_ci};
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_cistatic struct rpmpd *qcm2290_rpmpds[] = {
74662306a36Sopenharmony_ci	[QCM2290_VDDCX] =	&cx_rwcx0_lvl,
74762306a36Sopenharmony_ci	[QCM2290_VDDCX_AO] =	&cx_rwcx0_lvl_ao,
74862306a36Sopenharmony_ci	[QCM2290_VDDCX_VFL] =	&cx_rwcx0_vfl,
74962306a36Sopenharmony_ci	[QCM2290_VDDMX] =	&mx_rwmx0_lvl,
75062306a36Sopenharmony_ci	[QCM2290_VDDMX_AO] =	&mx_rwmx0_lvl_ao,
75162306a36Sopenharmony_ci	[QCM2290_VDDMX_VFL] =	&mx_rwmx0_vfl,
75262306a36Sopenharmony_ci	[QCM2290_VDD_LPI_CX] =	&lpi_cx_rwlc0_lvl,
75362306a36Sopenharmony_ci	[QCM2290_VDD_LPI_MX] =	&lpi_mx_rwlm0_lvl,
75462306a36Sopenharmony_ci};
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_cistatic const struct rpmpd_desc qcm2290_desc = {
75762306a36Sopenharmony_ci	.rpmpds = qcm2290_rpmpds,
75862306a36Sopenharmony_ci	.num_pds = ARRAY_SIZE(qcm2290_rpmpds),
75962306a36Sopenharmony_ci	.max_state = RPM_SMD_LEVEL_TURBO_NO_CPR,
76062306a36Sopenharmony_ci};
76162306a36Sopenharmony_ci
76262306a36Sopenharmony_cistatic const struct of_device_id rpmpd_match_table[] = {
76362306a36Sopenharmony_ci	{ .compatible = "qcom,mdm9607-rpmpd", .data = &mdm9607_desc },
76462306a36Sopenharmony_ci	{ .compatible = "qcom,msm8226-rpmpd", .data = &msm8226_desc },
76562306a36Sopenharmony_ci	{ .compatible = "qcom,msm8909-rpmpd", .data = &msm8916_desc },
76662306a36Sopenharmony_ci	{ .compatible = "qcom,msm8916-rpmpd", .data = &msm8916_desc },
76762306a36Sopenharmony_ci	{ .compatible = "qcom,msm8939-rpmpd", .data = &msm8939_desc },
76862306a36Sopenharmony_ci	{ .compatible = "qcom,msm8953-rpmpd", .data = &msm8953_desc },
76962306a36Sopenharmony_ci	{ .compatible = "qcom,msm8976-rpmpd", .data = &msm8976_desc },
77062306a36Sopenharmony_ci	{ .compatible = "qcom,msm8994-rpmpd", .data = &msm8994_desc },
77162306a36Sopenharmony_ci	{ .compatible = "qcom,msm8996-rpmpd", .data = &msm8996_desc },
77262306a36Sopenharmony_ci	{ .compatible = "qcom,msm8998-rpmpd", .data = &msm8998_desc },
77362306a36Sopenharmony_ci	{ .compatible = "qcom,qcm2290-rpmpd", .data = &qcm2290_desc },
77462306a36Sopenharmony_ci	{ .compatible = "qcom,qcs404-rpmpd", .data = &qcs404_desc },
77562306a36Sopenharmony_ci	{ .compatible = "qcom,sdm660-rpmpd", .data = &sdm660_desc },
77662306a36Sopenharmony_ci	{ .compatible = "qcom,sm6115-rpmpd", .data = &sm6115_desc },
77762306a36Sopenharmony_ci	{ .compatible = "qcom,sm6125-rpmpd", .data = &sm6125_desc },
77862306a36Sopenharmony_ci	{ .compatible = "qcom,sm6375-rpmpd", .data = &sm6375_desc },
77962306a36Sopenharmony_ci	{ }
78062306a36Sopenharmony_ci};
78162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, rpmpd_match_table);
78262306a36Sopenharmony_ci
78362306a36Sopenharmony_cistatic int rpmpd_send_enable(struct rpmpd *pd, bool enable)
78462306a36Sopenharmony_ci{
78562306a36Sopenharmony_ci	struct rpmpd_req req = {
78662306a36Sopenharmony_ci		.key = KEY_ENABLE,
78762306a36Sopenharmony_ci		.nbytes = cpu_to_le32(sizeof(u32)),
78862306a36Sopenharmony_ci		.value = cpu_to_le32(enable),
78962306a36Sopenharmony_ci	};
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci	return qcom_rpm_smd_write(pd->rpm, QCOM_SMD_RPM_ACTIVE_STATE,
79262306a36Sopenharmony_ci				  pd->res_type, pd->res_id, &req, sizeof(req));
79362306a36Sopenharmony_ci}
79462306a36Sopenharmony_ci
79562306a36Sopenharmony_cistatic int rpmpd_send_corner(struct rpmpd *pd, int state, unsigned int corner)
79662306a36Sopenharmony_ci{
79762306a36Sopenharmony_ci	struct rpmpd_req req = {
79862306a36Sopenharmony_ci		.key = pd->key,
79962306a36Sopenharmony_ci		.nbytes = cpu_to_le32(sizeof(u32)),
80062306a36Sopenharmony_ci		.value = cpu_to_le32(corner),
80162306a36Sopenharmony_ci	};
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_ci	return qcom_rpm_smd_write(pd->rpm, state, pd->res_type, pd->res_id,
80462306a36Sopenharmony_ci				  &req, sizeof(req));
80562306a36Sopenharmony_ci};
80662306a36Sopenharmony_ci
80762306a36Sopenharmony_cistatic void to_active_sleep(struct rpmpd *pd, unsigned int corner,
80862306a36Sopenharmony_ci			    unsigned int *active, unsigned int *sleep)
80962306a36Sopenharmony_ci{
81062306a36Sopenharmony_ci	*active = corner;
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_ci	if (pd->active_only)
81362306a36Sopenharmony_ci		*sleep = 0;
81462306a36Sopenharmony_ci	else
81562306a36Sopenharmony_ci		*sleep = *active;
81662306a36Sopenharmony_ci}
81762306a36Sopenharmony_ci
81862306a36Sopenharmony_cistatic int rpmpd_aggregate_corner(struct rpmpd *pd)
81962306a36Sopenharmony_ci{
82062306a36Sopenharmony_ci	int ret;
82162306a36Sopenharmony_ci	struct rpmpd *peer = pd->peer;
82262306a36Sopenharmony_ci	unsigned int active_corner, sleep_corner;
82362306a36Sopenharmony_ci	unsigned int this_active_corner = 0, this_sleep_corner = 0;
82462306a36Sopenharmony_ci	unsigned int peer_active_corner = 0, peer_sleep_corner = 0;
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_ci	/* Clamp to the highest corner/level if sync_state isn't done yet */
82762306a36Sopenharmony_ci	if (!pd->state_synced)
82862306a36Sopenharmony_ci		this_active_corner = this_sleep_corner = pd->max_state - 1;
82962306a36Sopenharmony_ci	else
83062306a36Sopenharmony_ci		to_active_sleep(pd, pd->corner, &this_active_corner, &this_sleep_corner);
83162306a36Sopenharmony_ci
83262306a36Sopenharmony_ci	if (peer && peer->enabled)
83362306a36Sopenharmony_ci		to_active_sleep(peer, peer->corner, &peer_active_corner,
83462306a36Sopenharmony_ci				&peer_sleep_corner);
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_ci	active_corner = max(this_active_corner, peer_active_corner);
83762306a36Sopenharmony_ci
83862306a36Sopenharmony_ci	ret = rpmpd_send_corner(pd, QCOM_SMD_RPM_ACTIVE_STATE, active_corner);
83962306a36Sopenharmony_ci	if (ret)
84062306a36Sopenharmony_ci		return ret;
84162306a36Sopenharmony_ci
84262306a36Sopenharmony_ci	sleep_corner = max(this_sleep_corner, peer_sleep_corner);
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_ci	return rpmpd_send_corner(pd, QCOM_SMD_RPM_SLEEP_STATE, sleep_corner);
84562306a36Sopenharmony_ci}
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_cistatic int rpmpd_power_on(struct generic_pm_domain *domain)
84862306a36Sopenharmony_ci{
84962306a36Sopenharmony_ci	int ret;
85062306a36Sopenharmony_ci	struct rpmpd *pd = domain_to_rpmpd(domain);
85162306a36Sopenharmony_ci
85262306a36Sopenharmony_ci	mutex_lock(&rpmpd_lock);
85362306a36Sopenharmony_ci
85462306a36Sopenharmony_ci	ret = rpmpd_send_enable(pd, true);
85562306a36Sopenharmony_ci	if (ret)
85662306a36Sopenharmony_ci		goto out;
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci	pd->enabled = true;
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci	if (pd->corner)
86162306a36Sopenharmony_ci		ret = rpmpd_aggregate_corner(pd);
86262306a36Sopenharmony_ci
86362306a36Sopenharmony_ciout:
86462306a36Sopenharmony_ci	mutex_unlock(&rpmpd_lock);
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci	return ret;
86762306a36Sopenharmony_ci}
86862306a36Sopenharmony_ci
86962306a36Sopenharmony_cistatic int rpmpd_power_off(struct generic_pm_domain *domain)
87062306a36Sopenharmony_ci{
87162306a36Sopenharmony_ci	int ret;
87262306a36Sopenharmony_ci	struct rpmpd *pd = domain_to_rpmpd(domain);
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_ci	mutex_lock(&rpmpd_lock);
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_ci	ret = rpmpd_send_enable(pd, false);
87762306a36Sopenharmony_ci	if (!ret)
87862306a36Sopenharmony_ci		pd->enabled = false;
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_ci	mutex_unlock(&rpmpd_lock);
88162306a36Sopenharmony_ci
88262306a36Sopenharmony_ci	return ret;
88362306a36Sopenharmony_ci}
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_cistatic int rpmpd_set_performance(struct generic_pm_domain *domain,
88662306a36Sopenharmony_ci				 unsigned int state)
88762306a36Sopenharmony_ci{
88862306a36Sopenharmony_ci	int ret = 0;
88962306a36Sopenharmony_ci	struct rpmpd *pd = domain_to_rpmpd(domain);
89062306a36Sopenharmony_ci
89162306a36Sopenharmony_ci	if (state > pd->max_state)
89262306a36Sopenharmony_ci		state = pd->max_state;
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci	mutex_lock(&rpmpd_lock);
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci	pd->corner = state;
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_ci	/* Always send updates for vfc and vfl */
89962306a36Sopenharmony_ci	if (!pd->enabled && pd->key != cpu_to_le32(KEY_FLOOR_CORNER) &&
90062306a36Sopenharmony_ci	    pd->key != cpu_to_le32(KEY_FLOOR_LEVEL))
90162306a36Sopenharmony_ci		goto out;
90262306a36Sopenharmony_ci
90362306a36Sopenharmony_ci	ret = rpmpd_aggregate_corner(pd);
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_ciout:
90662306a36Sopenharmony_ci	mutex_unlock(&rpmpd_lock);
90762306a36Sopenharmony_ci
90862306a36Sopenharmony_ci	return ret;
90962306a36Sopenharmony_ci}
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_cistatic unsigned int rpmpd_get_performance(struct generic_pm_domain *genpd,
91262306a36Sopenharmony_ci					  struct dev_pm_opp *opp)
91362306a36Sopenharmony_ci{
91462306a36Sopenharmony_ci	return dev_pm_opp_get_level(opp);
91562306a36Sopenharmony_ci}
91662306a36Sopenharmony_ci
91762306a36Sopenharmony_cistatic int rpmpd_probe(struct platform_device *pdev)
91862306a36Sopenharmony_ci{
91962306a36Sopenharmony_ci	int i;
92062306a36Sopenharmony_ci	size_t num;
92162306a36Sopenharmony_ci	struct genpd_onecell_data *data;
92262306a36Sopenharmony_ci	struct qcom_smd_rpm *rpm;
92362306a36Sopenharmony_ci	struct rpmpd **rpmpds;
92462306a36Sopenharmony_ci	const struct rpmpd_desc *desc;
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_ci	rpm = dev_get_drvdata(pdev->dev.parent);
92762306a36Sopenharmony_ci	if (!rpm) {
92862306a36Sopenharmony_ci		dev_err(&pdev->dev, "Unable to retrieve handle to RPM\n");
92962306a36Sopenharmony_ci		return -ENODEV;
93062306a36Sopenharmony_ci	}
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci	desc = of_device_get_match_data(&pdev->dev);
93362306a36Sopenharmony_ci	if (!desc)
93462306a36Sopenharmony_ci		return -EINVAL;
93562306a36Sopenharmony_ci
93662306a36Sopenharmony_ci	rpmpds = desc->rpmpds;
93762306a36Sopenharmony_ci	num = desc->num_pds;
93862306a36Sopenharmony_ci
93962306a36Sopenharmony_ci	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
94062306a36Sopenharmony_ci	if (!data)
94162306a36Sopenharmony_ci		return -ENOMEM;
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_ci	data->domains = devm_kcalloc(&pdev->dev, num, sizeof(*data->domains),
94462306a36Sopenharmony_ci				     GFP_KERNEL);
94562306a36Sopenharmony_ci	if (!data->domains)
94662306a36Sopenharmony_ci		return -ENOMEM;
94762306a36Sopenharmony_ci
94862306a36Sopenharmony_ci	data->num_domains = num;
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_ci	for (i = 0; i < num; i++) {
95162306a36Sopenharmony_ci		if (!rpmpds[i]) {
95262306a36Sopenharmony_ci			dev_warn(&pdev->dev, "rpmpds[] with empty entry at index=%d\n",
95362306a36Sopenharmony_ci				 i);
95462306a36Sopenharmony_ci			continue;
95562306a36Sopenharmony_ci		}
95662306a36Sopenharmony_ci
95762306a36Sopenharmony_ci		rpmpds[i]->rpm = rpm;
95862306a36Sopenharmony_ci		rpmpds[i]->max_state = desc->max_state;
95962306a36Sopenharmony_ci		rpmpds[i]->pd.power_off = rpmpd_power_off;
96062306a36Sopenharmony_ci		rpmpds[i]->pd.power_on = rpmpd_power_on;
96162306a36Sopenharmony_ci		rpmpds[i]->pd.set_performance_state = rpmpd_set_performance;
96262306a36Sopenharmony_ci		rpmpds[i]->pd.opp_to_performance_state = rpmpd_get_performance;
96362306a36Sopenharmony_ci		pm_genpd_init(&rpmpds[i]->pd, NULL, true);
96462306a36Sopenharmony_ci
96562306a36Sopenharmony_ci		data->domains[i] = &rpmpds[i]->pd;
96662306a36Sopenharmony_ci	}
96762306a36Sopenharmony_ci
96862306a36Sopenharmony_ci	/* Add subdomains */
96962306a36Sopenharmony_ci	for (i = 0; i < num; i++) {
97062306a36Sopenharmony_ci		if (!rpmpds[i])
97162306a36Sopenharmony_ci			continue;
97262306a36Sopenharmony_ci
97362306a36Sopenharmony_ci		if (rpmpds[i]->parent)
97462306a36Sopenharmony_ci			pm_genpd_add_subdomain(rpmpds[i]->parent, &rpmpds[i]->pd);
97562306a36Sopenharmony_ci	}
97662306a36Sopenharmony_ci
97762306a36Sopenharmony_ci	return of_genpd_add_provider_onecell(pdev->dev.of_node, data);
97862306a36Sopenharmony_ci}
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_cistatic void rpmpd_sync_state(struct device *dev)
98162306a36Sopenharmony_ci{
98262306a36Sopenharmony_ci	const struct rpmpd_desc *desc = of_device_get_match_data(dev);
98362306a36Sopenharmony_ci	struct rpmpd **rpmpds = desc->rpmpds;
98462306a36Sopenharmony_ci	struct rpmpd *pd;
98562306a36Sopenharmony_ci	unsigned int i;
98662306a36Sopenharmony_ci	int ret;
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci	mutex_lock(&rpmpd_lock);
98962306a36Sopenharmony_ci	for (i = 0; i < desc->num_pds; i++) {
99062306a36Sopenharmony_ci		pd = rpmpds[i];
99162306a36Sopenharmony_ci		if (!pd)
99262306a36Sopenharmony_ci			continue;
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci		pd->state_synced = true;
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci		if (!pd->enabled)
99762306a36Sopenharmony_ci			pd->corner = 0;
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci		ret = rpmpd_aggregate_corner(pd);
100062306a36Sopenharmony_ci		if (ret)
100162306a36Sopenharmony_ci			dev_err(dev, "failed to sync %s: %d\n", pd->pd.name, ret);
100262306a36Sopenharmony_ci	}
100362306a36Sopenharmony_ci	mutex_unlock(&rpmpd_lock);
100462306a36Sopenharmony_ci}
100562306a36Sopenharmony_ci
100662306a36Sopenharmony_cistatic struct platform_driver rpmpd_driver = {
100762306a36Sopenharmony_ci	.driver = {
100862306a36Sopenharmony_ci		.name = "qcom-rpmpd",
100962306a36Sopenharmony_ci		.of_match_table = rpmpd_match_table,
101062306a36Sopenharmony_ci		.suppress_bind_attrs = true,
101162306a36Sopenharmony_ci		.sync_state = rpmpd_sync_state,
101262306a36Sopenharmony_ci	},
101362306a36Sopenharmony_ci	.probe = rpmpd_probe,
101462306a36Sopenharmony_ci};
101562306a36Sopenharmony_ci
101662306a36Sopenharmony_cistatic int __init rpmpd_init(void)
101762306a36Sopenharmony_ci{
101862306a36Sopenharmony_ci	return platform_driver_register(&rpmpd_driver);
101962306a36Sopenharmony_ci}
102062306a36Sopenharmony_cicore_initcall(rpmpd_init);
102162306a36Sopenharmony_ci
102262306a36Sopenharmony_ciMODULE_DESCRIPTION("Qualcomm Technologies, Inc. RPM Power Domain Driver");
102362306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
1024