|
@@ -635,3 +635,188 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
|
|
|
|
|
|
/**
|
|
|
* pwrdm_set_mem_retst - set memory power state while powerdomain in RET
|
|
|
+ * @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
|
|
|
+ * RETENTION state. Bank will be a number from 0 to 3, and represents
|
|
|
+ * different types of memory, depending on the powerdomain. @pwrst
|
|
|
+ * 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 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_retst(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_ret[bank] & (1 << pwrst)))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ pr_debug("powerdomain: %s: setting next memory powerstate for bank %0x while pwrdm-RET to %0x\n",
|
|
|
+ pwrdm->name, bank, pwrst);
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_retst)
|
|
|
+ ret = arch_pwrdm->pwrdm_set_mem_retst(pwrdm, bank, pwrst);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_read_logic_pwrst - get current powerdomain logic retention power state
|
|
|
+ * @pwrdm: struct powerdomain * to get current logic retention power state
|
|
|
+ *
|
|
|
+ * Return the power state that the logic portion of powerdomain @pwrdm
|
|
|
+ * will enter when the powerdomain enters retention. Returns -EINVAL
|
|
|
+ * if the powerdomain pointer is null or returns the logic retention
|
|
|
+ * power state upon success.
|
|
|
+ */
|
|
|
+int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_logic_pwrst)
|
|
|
+ ret = arch_pwrdm->pwrdm_read_logic_pwrst(pwrdm);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_read_prev_logic_pwrst - get previous powerdomain logic power state
|
|
|
+ * @pwrdm: struct powerdomain * to get previous logic power state
|
|
|
+ *
|
|
|
+ * Return the powerdomain @pwrdm's previous logic power state. Returns
|
|
|
+ * -EINVAL if the powerdomain pointer is null or returns the previous
|
|
|
+ * logic power state upon success.
|
|
|
+ */
|
|
|
+int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_logic_pwrst)
|
|
|
+ ret = arch_pwrdm->pwrdm_read_prev_logic_pwrst(pwrdm);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_read_logic_retst - get next powerdomain logic power state
|
|
|
+ * @pwrdm: struct powerdomain * to get next logic power state
|
|
|
+ *
|
|
|
+ * Return the powerdomain pwrdm's logic power state. Returns -EINVAL
|
|
|
+ * if the powerdomain pointer is null or returns the next logic
|
|
|
+ * power state upon success.
|
|
|
+ */
|
|
|
+int pwrdm_read_logic_retst(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_logic_retst)
|
|
|
+ ret = arch_pwrdm->pwrdm_read_logic_retst(pwrdm);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_read_mem_pwrst - get current memory bank power state
|
|
|
+ * @pwrdm: struct powerdomain * to get current memory bank power state
|
|
|
+ * @bank: memory bank number (0-3)
|
|
|
+ *
|
|
|
+ * Return the powerdomain @pwrdm's current memory power state for bank
|
|
|
+ * @bank. Returns -EINVAL if the powerdomain pointer is null, -EEXIST if
|
|
|
+ * the target memory bank does not exist or is not controllable, or
|
|
|
+ * returns the current memory power state upon success.
|
|
|
+ */
|
|
|
+int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (pwrdm->banks < (bank + 1))
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK)
|
|
|
+ bank = 1;
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_mem_pwrst)
|
|
|
+ ret = arch_pwrdm->pwrdm_read_mem_pwrst(pwrdm, bank);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_read_prev_mem_pwrst - get previous memory bank power state
|
|
|
+ * @pwrdm: struct powerdomain * to get previous memory bank power state
|
|
|
+ * @bank: memory bank number (0-3)
|
|
|
+ *
|
|
|
+ * Return the powerdomain @pwrdm's previous memory power state for
|
|
|
+ * bank @bank. Returns -EINVAL if the powerdomain pointer is null,
|
|
|
+ * -EEXIST if the target memory bank does not exist or is not
|
|
|
+ * controllable, or returns the previous memory power state upon
|
|
|
+ * success.
|
|
|
+ */
|
|
|
+int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (pwrdm->banks < (bank + 1))
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK)
|
|
|
+ bank = 1;
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_mem_pwrst)
|
|
|
+ ret = arch_pwrdm->pwrdm_read_prev_mem_pwrst(pwrdm, bank);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_read_mem_retst - get next memory bank power state
|
|
|
+ * @pwrdm: struct powerdomain * to get mext memory bank power state
|
|
|
+ * @bank: memory bank number (0-3)
|
|
|
+ *
|
|
|
+ * Return the powerdomain pwrdm's next memory power state for bank
|
|
|
+ * x. Returns -EINVAL if the powerdomain pointer is null, -EEXIST if
|
|
|
+ * the target memory bank does not exist or is not controllable, or
|
|
|
+ * returns the next memory power state upon success.
|
|
|
+ */
|
|
|
+int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (pwrdm->banks < (bank + 1))
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_read_mem_retst)
|
|
|
+ ret = arch_pwrdm->pwrdm_read_mem_retst(pwrdm, bank);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|