|
@@ -967,6 +967,12 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name)
|
|
|
* enabled for this to work. Returns -EINVAL if the hwmod cannot be
|
|
|
* reset this way or if the hwmod is in the wrong state, -ETIMEDOUT if
|
|
|
* the module did not reset in time, or 0 upon success.
|
|
|
+ *
|
|
|
+ * In OMAP3 a specific SYSSTATUS register is used to get the reset status.
|
|
|
+ * Starting in OMAP4, some IPs does not have SYSSTATUS register and instead
|
|
|
+ * use the SYSCONFIG softreset bit to provide the status.
|
|
|
+ *
|
|
|
+ * Note that some IP like McBSP does have a reset control but no reset status.
|
|
|
*/
|
|
|
static int _reset(struct omap_hwmod *oh)
|
|
|
{
|
|
@@ -974,8 +980,7 @@ static int _reset(struct omap_hwmod *oh)
|
|
|
int c = 0;
|
|
|
|
|
|
if (!oh->class->sysc ||
|
|
|
- !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET) ||
|
|
|
- (oh->class->sysc->sysc_flags & SYSS_MISSING))
|
|
|
+ !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
|
|
|
return -EINVAL;
|
|
|
|
|
|
/* clocks must be on for this operation */
|
|
@@ -993,9 +998,16 @@ static int _reset(struct omap_hwmod *oh)
|
|
|
return r;
|
|
|
_write_sysconfig(v, oh);
|
|
|
|
|
|
- omap_test_timeout((omap_hwmod_readl(oh, oh->class->sysc->syss_offs) &
|
|
|
- SYSS_RESETDONE_MASK),
|
|
|
- MAX_MODULE_SOFTRESET_WAIT, c);
|
|
|
+ if (oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS)
|
|
|
+ omap_test_timeout((omap_hwmod_readl(oh,
|
|
|
+ oh->class->sysc->syss_offs)
|
|
|
+ & SYSS_RESETDONE_MASK),
|
|
|
+ MAX_MODULE_SOFTRESET_WAIT, c);
|
|
|
+ else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS)
|
|
|
+ omap_test_timeout(!(omap_hwmod_readl(oh,
|
|
|
+ oh->class->sysc->sysc_offs)
|
|
|
+ & SYSC_TYPE2_SOFTRESET_MASK),
|
|
|
+ MAX_MODULE_SOFTRESET_WAIT, c);
|
|
|
|
|
|
if (c == MAX_MODULE_SOFTRESET_WAIT)
|
|
|
pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n",
|