OSDN Git Service

soc: qcom: rpmpd: Add QCS404 power-domains
authorBjorn Andersson <bjorn.andersson@linaro.org>
Mon, 13 May 2019 10:20:11 +0000 (15:50 +0530)
committerAndy Gross <agross@kernel.org>
Thu, 30 May 2019 02:40:43 +0000 (21:40 -0500)
Add the shared cx/mx and the low-power-island's cx and mx power-domains
found on QCS404.

Reviewed-by: Jeffrey Hugo <jhugo@codeaurora.org>
Reviewed-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
[sibi: Fixup corner/vfc with vlfl/vfl]
Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Andy Gross <agross@kernel.org>
drivers/soc/qcom/rpmpd.c

index bac4499..63db8b2 100644 (file)
  * RPMPD_X is X encoded as a little-endian, lower-case, ASCII string */
 #define RPMPD_SMPA 0x61706d73
 #define RPMPD_LDOA 0x616f646c
+#define RPMPD_RWMX 0x786d7772
+#define RPMPD_RWLC 0x636c7772
+#define RPMPD_RWLM 0x6d6c7772
 
 /* Operation Keys */
 #define KEY_CORNER             0x6e726f63 /* corn */
 #define KEY_ENABLE             0x6e657773 /* swen */
 #define KEY_FLOOR_CORNER       0x636676   /* vfc */
+#define KEY_FLOOR_LEVEL                0x6c6676   /* vfl */
+#define KEY_LEVEL              0x6c766c76 /* vlvl */
 
 #define MAX_8996_RPMPD_STATE   6
 
                .key = KEY_CORNER,                                      \
        }
 
+#define DEFINE_RPMPD_LEVEL(_platform, _name, r_type, r_id)             \
+       static struct rpmpd _platform##_##_name = {                     \
+               .pd = { .name = #_name, },                              \
+               .res_type = RPMPD_##r_type,                             \
+               .res_id = r_id,                                         \
+               .key = KEY_LEVEL,                                       \
+       }
+
 #define DEFINE_RPMPD_VFC(_platform, _name, r_type, r_id)               \
        static struct rpmpd _platform##_##_name = {                     \
                .pd = { .name = #_name, },                              \
                .key = KEY_FLOOR_CORNER,                                \
        }
 
+#define DEFINE_RPMPD_VFL(_platform, _name, r_type, r_id)               \
+       static struct rpmpd _platform##_##_name = {                     \
+               .pd = { .name = #_name, },                              \
+               .res_type = RPMPD_##r_type,                             \
+               .res_id = r_id,                                         \
+               .key = KEY_FLOOR_LEVEL,                                 \
+       }
+
 struct rpmpd_req {
        __le32 key;
        __le32 nbytes;
@@ -115,8 +136,35 @@ static const struct rpmpd_desc msm8996_desc = {
        .max_state = MAX_8996_RPMPD_STATE,
 };
 
+/* qcs404 RPM Power domains */
+DEFINE_RPMPD_PAIR(qcs404, vddmx, vddmx_ao, RWMX, LEVEL, 0);
+DEFINE_RPMPD_VFL(qcs404, vddmx_vfl, RWMX, 0);
+
+DEFINE_RPMPD_LEVEL(qcs404, vdd_lpicx, RWLC, 0);
+DEFINE_RPMPD_VFL(qcs404, vdd_lpicx_vfl, RWLC, 0);
+
+DEFINE_RPMPD_LEVEL(qcs404, vdd_lpimx, RWLM, 0);
+DEFINE_RPMPD_VFL(qcs404, vdd_lpimx_vfl, RWLM, 0);
+
+static struct rpmpd *qcs404_rpmpds[] = {
+       [QCS404_VDDMX] = &qcs404_vddmx,
+       [QCS404_VDDMX_AO] = &qcs404_vddmx_ao,
+       [QCS404_VDDMX_VFL] = &qcs404_vddmx_vfl,
+       [QCS404_LPICX] = &qcs404_vdd_lpicx,
+       [QCS404_LPICX_VFL] = &qcs404_vdd_lpicx_vfl,
+       [QCS404_LPIMX] = &qcs404_vdd_lpimx,
+       [QCS404_LPIMX_VFL] = &qcs404_vdd_lpimx_vfl,
+};
+
+static const struct rpmpd_desc qcs404_desc = {
+       .rpmpds = qcs404_rpmpds,
+       .num_pds = ARRAY_SIZE(qcs404_rpmpds),
+       .max_state = RPM_SMD_LEVEL_BINNING,
+};
+
 static const struct of_device_id rpmpd_match_table[] = {
        { .compatible = "qcom,msm8996-rpmpd", .data = &msm8996_desc },
+       { .compatible = "qcom,qcs404-rpmpd", .data = &qcs404_desc },
        { }
 };
 
@@ -231,7 +279,9 @@ static int rpmpd_set_performance(struct generic_pm_domain *domain,
 
        pd->corner = state;
 
-       if (!pd->enabled && pd->key != KEY_FLOOR_CORNER)
+       /* Always send updates for vfc and vfl */
+       if (!pd->enabled && pd->key != KEY_FLOOR_CORNER &&
+           pd->key != KEY_FLOOR_LEVEL)
                goto out;
 
        ret = rpmpd_aggregate_corner(pd);