|
@@ -399,7 +399,7 @@ static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * _set_softreset: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v
|
|
|
+ * _set_softreset: set OCP_SYSCONFIG.SOFTRESET bit in @v
|
|
|
* @oh: struct omap_hwmod *
|
|
|
* @v: pointer to register contents to modify
|
|
|
*
|
|
@@ -426,6 +426,36 @@ static int _set_softreset(struct omap_hwmod *oh, u32 *v)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * _clear_softreset: clear OCP_SYSCONFIG.SOFTRESET bit in @v
|
|
|
+ * @oh: struct omap_hwmod *
|
|
|
+ * @v: pointer to register contents to modify
|
|
|
+ *
|
|
|
+ * Clear the SOFTRESET bit in @v for hwmod @oh. Returns -EINVAL upon
|
|
|
+ * error or 0 upon success.
|
|
|
+ */
|
|
|
+static int _clear_softreset(struct omap_hwmod *oh, u32 *v)
|
|
|
+{
|
|
|
+ u32 softrst_mask;
|
|
|
+
|
|
|
+ if (!oh->class->sysc ||
|
|
|
+ !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (!oh->class->sysc->sysc_fields) {
|
|
|
+ WARN(1,
|
|
|
+ "omap_hwmod: %s: sysc_fields absent for sysconfig class\n",
|
|
|
+ oh->name);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
|
|
|
+
|
|
|
+ *v &= ~softrst_mask;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* _wait_softreset_complete - wait for an OCP softreset to complete
|
|
|
* @oh: struct omap_hwmod * to wait on
|
|
@@ -1911,6 +1941,12 @@ static int _ocp_softreset(struct omap_hwmod *oh)
|
|
|
ret = _set_softreset(oh, &v);
|
|
|
if (ret)
|
|
|
goto dis_opt_clks;
|
|
|
+
|
|
|
+ _write_sysconfig(v, oh);
|
|
|
+ ret = _clear_softreset(oh, &v);
|
|
|
+ if (ret)
|
|
|
+ goto dis_opt_clks;
|
|
|
+
|
|
|
_write_sysconfig(v, oh);
|
|
|
|
|
|
if (oh->class->sysc->srst_udelay)
|
|
@@ -3169,6 +3205,11 @@ int omap_hwmod_softreset(struct omap_hwmod *oh)
|
|
|
goto error;
|
|
|
_write_sysconfig(v, oh);
|
|
|
|
|
|
+ ret = _clear_softreset(oh, &v);
|
|
|
+ if (ret)
|
|
|
+ goto error;
|
|
|
+ _write_sysconfig(v, oh);
|
|
|
+
|
|
|
error:
|
|
|
return ret;
|
|
|
}
|