|
@@ -533,3 +533,105 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm)
|
|
|
{
|
|
|
int ret = -EINVAL;
|
|
|
|
|
|
+ if (!pwrdm)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (pwrdm->pwrsts == PWRSTS_ON)
|
|
|
+ return PWRDM_POWER_ON;
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_pwrst)
|
|
|
+ ret = arch_pwrdm->pwrdm_read_pwrst(pwrdm);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_read_prev_pwrst - get previous powerdomain power state
|
|
|
+ * @pwrdm: struct powerdomain * to get previous power state
|
|
|
+ *
|
|
|
+ * Return the powerdomain @pwrdm's previous power state. Returns -EINVAL
|
|
|
+ * if the powerdomain pointer is null or returns the previous power state
|
|
|
+ * upon success.
|
|
|
+ */
|
|
|
+int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_pwrst)
|
|
|
+ ret = arch_pwrdm->pwrdm_read_prev_pwrst(pwrdm);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_set_logic_retst - set powerdomain logic power state upon retention
|
|
|
+ * @pwrdm: struct powerdomain * to set
|
|
|
+ * @pwrst: one of the PWRDM_POWER_* macros
|
|
|
+ *
|
|
|
+ * Set the next power state @pwrst that the logic portion of the
|
|
|
+ * powerdomain @pwrdm will enter when the powerdomain enters retention.
|
|
|
+ * This will be either RETENTION or OFF, if supported. Returns
|
|
|
+ * -EINVAL if the powerdomain pointer is null or the target power
|
|
|
+ * state is not not supported, or returns 0 upon success.
|
|
|
+ */
|
|
|
+int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (!(pwrdm->pwrsts_logic_ret & (1 << pwrst)))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ pr_debug("powerdomain: %s: setting next logic powerstate to %0x\n",
|
|
|
+ pwrdm->name, pwrst);
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_set_logic_retst)
|
|
|
+ ret = arch_pwrdm->pwrdm_set_logic_retst(pwrdm, pwrst);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_set_mem_onst - set memory power state while powerdomain ON
|
|
|
+ * @pwrdm: struct powerdomain * to set
|
|
|
+ * @bank: memory bank number to set (0-3)
|
|
|
+ * @pwrst: one of the PWRDM_POWER_* macros
|
|
|
+ *
|
|
|
+ * Set the next power state @pwrst that memory bank @bank of the
|
|
|
+ * powerdomain @pwrdm will enter when the powerdomain enters the ON
|
|
|
+ * state. @bank will be a number from 0 to 3, and represents different
|
|
|
+ * types of memory, depending on the powerdomain. Returns -EINVAL if
|
|
|
+ * the powerdomain pointer is null or the target power state is not
|
|
|
+ * not supported for this memory bank, -EEXIST if the target memory
|
|
|
+ * bank does not exist or is not controllable, or returns 0 upon
|
|
|
+ * success.
|
|
|
+ */
|
|
|
+int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (pwrdm->banks < (bank + 1))
|
|
|
+ return -EEXIST;
|
|
|
+
|
|
|
+ if (!(pwrdm->pwrsts_mem_on[bank] & (1 << pwrst)))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ pr_debug("powerdomain: %s: setting next memory powerstate for bank %0x while pwrdm-ON to %0x\n",
|
|
|
+ pwrdm->name, bank, pwrst);
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_onst)
|
|
|
+ ret = arch_pwrdm->pwrdm_set_mem_onst(pwrdm, bank, pwrst);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_set_mem_retst - set memory power state while powerdomain in RET
|