|
@@ -334,3 +334,127 @@ static u32 omap44xx_prm_read_reset_sources(void)
|
|
|
u32 v;
|
|
|
|
|
|
v = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
|
|
|
+ OMAP4_RM_RSTST);
|
|
|
+
|
|
|
+ p = omap44xx_prm_reset_src_map;
|
|
|
+ while (p->reg_shift >= 0 && p->std_shift >= 0) {
|
|
|
+ if (v & (1 << p->reg_shift))
|
|
|
+ r |= 1 << p->std_shift;
|
|
|
+ p++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return r;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * omap44xx_prm_was_any_context_lost_old - was module hardware context lost?
|
|
|
+ * @part: PRM partition ID (e.g., OMAP4430_PRM_PARTITION)
|
|
|
+ * @inst: PRM instance offset (e.g., OMAP4430_PRM_MPU_INST)
|
|
|
+ * @idx: CONTEXT register offset
|
|
|
+ *
|
|
|
+ * Return 1 if any bits were set in the *_CONTEXT_* register
|
|
|
+ * identified by (@part, @inst, @idx), which means that some context
|
|
|
+ * was lost for that module; otherwise, return 0.
|
|
|
+ */
|
|
|
+static bool omap44xx_prm_was_any_context_lost_old(u8 part, s16 inst, u16 idx)
|
|
|
+{
|
|
|
+ return (omap4_prminst_read_inst_reg(part, inst, idx)) ? 1 : 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * omap44xx_prm_clear_context_lost_flags_old - clear context loss flags
|
|
|
+ * @part: PRM partition ID (e.g., OMAP4430_PRM_PARTITION)
|
|
|
+ * @inst: PRM instance offset (e.g., OMAP4430_PRM_MPU_INST)
|
|
|
+ * @idx: CONTEXT register offset
|
|
|
+ *
|
|
|
+ * Clear hardware context loss bits for the module identified by
|
|
|
+ * (@part, @inst, @idx). No return value. XXX Writes to reserved bits;
|
|
|
+ * is there a way to avoid this?
|
|
|
+ */
|
|
|
+static void omap44xx_prm_clear_context_loss_flags_old(u8 part, s16 inst,
|
|
|
+ u16 idx)
|
|
|
+{
|
|
|
+ omap4_prminst_write_inst_reg(0xffffffff, part, inst, idx);
|
|
|
+}
|
|
|
+
|
|
|
+/* Powerdomain low-level functions */
|
|
|
+
|
|
|
+static int omap4_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
|
|
|
+{
|
|
|
+ omap4_prminst_rmw_inst_reg_bits(OMAP_POWERSTATE_MASK,
|
|
|
+ (pwrst << OMAP_POWERSTATE_SHIFT),
|
|
|
+ pwrdm->prcm_partition,
|
|
|
+ pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int omap4_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ u32 v;
|
|
|
+
|
|
|
+ v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs,
|
|
|
+ OMAP4_PM_PWSTCTRL);
|
|
|
+ v &= OMAP_POWERSTATE_MASK;
|
|
|
+ v >>= OMAP_POWERSTATE_SHIFT;
|
|
|
+
|
|
|
+ return v;
|
|
|
+}
|
|
|
+
|
|
|
+static int omap4_pwrdm_read_pwrst(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ u32 v;
|
|
|
+
|
|
|
+ v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs,
|
|
|
+ OMAP4_PM_PWSTST);
|
|
|
+ v &= OMAP_POWERSTATEST_MASK;
|
|
|
+ v >>= OMAP_POWERSTATEST_SHIFT;
|
|
|
+
|
|
|
+ return v;
|
|
|
+}
|
|
|
+
|
|
|
+static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ u32 v;
|
|
|
+
|
|
|
+ v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs,
|
|
|
+ OMAP4_PM_PWSTST);
|
|
|
+ v &= OMAP4430_LASTPOWERSTATEENTERED_MASK;
|
|
|
+ v >>= OMAP4430_LASTPOWERSTATEENTERED_SHIFT;
|
|
|
+
|
|
|
+ return v;
|
|
|
+}
|
|
|
+
|
|
|
+static int omap4_pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ omap4_prminst_rmw_inst_reg_bits(OMAP4430_LOWPOWERSTATECHANGE_MASK,
|
|
|
+ (1 << OMAP4430_LOWPOWERSTATECHANGE_SHIFT),
|
|
|
+ pwrdm->prcm_partition,
|
|
|
+ pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int omap4_pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
|
|
|
+{
|
|
|
+ omap4_prminst_rmw_inst_reg_bits(OMAP4430_LASTPOWERSTATEENTERED_MASK,
|
|
|
+ OMAP4430_LASTPOWERSTATEENTERED_MASK,
|
|
|
+ pwrdm->prcm_partition,
|
|
|
+ pwrdm->prcm_offs, OMAP4_PM_PWSTST);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
|
|
|
+{
|
|
|
+ u32 v;
|
|
|
+
|
|
|
+ v = pwrst << __ffs(OMAP4430_LOGICRETSTATE_MASK);
|
|
|
+ omap4_prminst_rmw_inst_reg_bits(OMAP4430_LOGICRETSTATE_MASK, v,
|
|
|
+ pwrdm->prcm_partition, pwrdm->prcm_offs,
|
|
|
+ OMAP4_PM_PWSTCTRL);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int omap4_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank,
|
|
|
+ u8 pwrst)
|
|
|
+{
|
|
|
+ u32 m;
|