|
@@ -1480,6 +1480,11 @@ static int _reset(struct omap_hwmod *oh)
|
|
|
|
|
|
pr_debug("omap_hwmod: %s: resetting\n", oh->name);
|
|
|
|
|
|
+ /*
|
|
|
+ * XXX We're not resetting modules with hardreset lines
|
|
|
+ * automatically here. Should we do this also, or just expect
|
|
|
+ * those modules to define custom reset functions?
|
|
|
+ */
|
|
|
ret = (oh->class->reset) ? oh->class->reset(oh) : _ocp_softreset(oh);
|
|
|
|
|
|
if (oh->class->sysc) {
|
|
@@ -1500,7 +1505,7 @@ static int _reset(struct omap_hwmod *oh)
|
|
|
*/
|
|
|
static int _enable(struct omap_hwmod *oh)
|
|
|
{
|
|
|
- int r;
|
|
|
+ int r, i;
|
|
|
int hwsup = 0;
|
|
|
|
|
|
pr_debug("omap_hwmod: %s: enabling\n", oh->name);
|
|
@@ -1532,15 +1537,15 @@ static int _enable(struct omap_hwmod *oh)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/*
|
|
|
- * If an IP contains only one HW reset line, then de-assert it in order
|
|
|
+ * If an IP contains HW reset lines, then de-assert them in order
|
|
|
* to allow the module state transition. Otherwise the PRCM will return
|
|
|
* Intransition status, and the init will failed.
|
|
|
*/
|
|
|
- if ((oh->_state == _HWMOD_STATE_INITIALIZED ||
|
|
|
- oh->_state == _HWMOD_STATE_DISABLED) && oh->rst_lines_cnt == 1)
|
|
|
- _deassert_hardreset(oh, oh->rst_lines[0].name);
|
|
|
+ if (oh->_state == _HWMOD_STATE_INITIALIZED ||
|
|
|
+ oh->_state == _HWMOD_STATE_DISABLED)
|
|
|
+ for (i = 0; i < oh->rst_lines_cnt; i++)
|
|
|
+ _deassert_hardreset(oh, oh->rst_lines[i].name);
|
|
|
|
|
|
/* Mux pins for device runtime if populated */
|
|
|
if (oh->mux && (!oh->mux->enabled ||
|
|
@@ -1687,7 +1692,7 @@ int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle)
|
|
|
*/
|
|
|
static int _shutdown(struct omap_hwmod *oh)
|
|
|
{
|
|
|
- int ret;
|
|
|
+ int ret, i;
|
|
|
u8 prev_state;
|
|
|
|
|
|
if (oh->_state != _HWMOD_STATE_IDLE &&
|
|
@@ -1728,12 +1733,8 @@ static int _shutdown(struct omap_hwmod *oh)
|
|
|
}
|
|
|
/* XXX Should this code also force-disable the optional clocks? */
|
|
|
|
|
|
- /*
|
|
|
- * If an IP contains only one HW reset line, then assert it
|
|
|
- * after disabling the clocks and before shutting down the IP.
|
|
|
- */
|
|
|
- if (oh->rst_lines_cnt == 1)
|
|
|
- _assert_hardreset(oh, oh->rst_lines[0].name);
|
|
|
+ for (i = 0; i < oh->rst_lines_cnt; i++)
|
|
|
+ _assert_hardreset(oh, oh->rst_lines[i].name);
|
|
|
|
|
|
/* Mux pins to safe mode or use populated off mode values */
|
|
|
if (oh->mux)
|
|
@@ -1786,7 +1787,7 @@ static int _setup(struct omap_hwmod *oh, void *data)
|
|
|
* reset asserted. Exit without warning because that behavior is
|
|
|
* expected.
|
|
|
*/
|
|
|
- if ((oh->flags & HWMOD_INIT_NO_RESET) && oh->rst_lines_cnt == 1)
|
|
|
+ if ((oh->flags & HWMOD_INIT_NO_RESET) && oh->rst_lines_cnt > 0)
|
|
|
return 0;
|
|
|
|
|
|
r = _enable(oh);
|