|
@@ -962,3 +962,58 @@ int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
|
|
|
int pwrdm_wait_transition(struct powerdomain *pwrdm)
|
|
|
{
|
|
|
int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (!pwrdm)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (arch_pwrdm && arch_pwrdm->pwrdm_wait_transition)
|
|
|
+ ret = arch_pwrdm->pwrdm_wait_transition(pwrdm);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+int pwrdm_state_switch(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = pwrdm_wait_transition(pwrdm);
|
|
|
+ if (!ret)
|
|
|
+ ret = _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+int pwrdm_pre_transition(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ if (pwrdm)
|
|
|
+ _pwrdm_pre_transition_cb(pwrdm, NULL);
|
|
|
+ else
|
|
|
+ pwrdm_for_each(_pwrdm_pre_transition_cb, NULL);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int pwrdm_post_transition(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ if (pwrdm)
|
|
|
+ _pwrdm_post_transition_cb(pwrdm, NULL);
|
|
|
+ else
|
|
|
+ pwrdm_for_each(_pwrdm_post_transition_cb, NULL);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pwrdm_get_context_loss_count - get powerdomain's context loss count
|
|
|
+ * @pwrdm: struct powerdomain * to wait for
|
|
|
+ *
|
|
|
+ * Context loss count is the sum of powerdomain off-mode counter, the
|
|
|
+ * logic off counter and the per-bank memory off counter. Returns negative
|
|
|
+ * (and WARNs) upon error, otherwise, returns the context loss count.
|
|
|
+ */
|
|
|
+int pwrdm_get_context_loss_count(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ int i, count;
|
|
|
+
|
|
|
+ if (!pwrdm) {
|
|
|
+ WARN(1, "powerdomain: %s: pwrdm is null\n", __func__);
|