mirror of https://gitee.com/openkylin/linux.git
ARM: OMAP3: hwmod data: register dss hwmods after dss_core
dss_core has to be initialized before any other DSS hwmod. Currently this is broken as dss_core is listed in chip/revision specific hwmod lists while other DSS hwmods are listed in common list which is registered first. This patch moves DSS hwmods (except for dss_core) to the separate list which is registered last to ensure that dss_core is already registered. This solves the problem with BUG() in L3 interrupt handler on boards with DSS enabled in bootloader. The long-term fix to this is to ensure modules are set up in dependency order in the hwmod core code. CC: Tomi Valkeinen <tomi.valkeinen@ti.com> CC: Archit Taneja <archit@ti.com> CC: Paul Walmsley <paul@pwsan.com> Signed-off-by: Ilya Yanok <yanok@emcraft.com> [paul@pwsan.com: add notes that this is just a temporary workaround until hwmod dependencies are added] Signed-off-by: Paul Walmsley <paul@pwsan.com>
This commit is contained in:
parent
d19e8f2e44
commit
1d2f56c84f
|
@ -3545,12 +3545,6 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
|
||||||
&omap3xxx_uart2_hwmod,
|
&omap3xxx_uart2_hwmod,
|
||||||
&omap3xxx_uart3_hwmod,
|
&omap3xxx_uart3_hwmod,
|
||||||
|
|
||||||
/* dss class */
|
|
||||||
&omap3xxx_dss_dispc_hwmod,
|
|
||||||
&omap3xxx_dss_dsi1_hwmod,
|
|
||||||
&omap3xxx_dss_rfbi_hwmod,
|
|
||||||
&omap3xxx_dss_venc_hwmod,
|
|
||||||
|
|
||||||
/* i2c class */
|
/* i2c class */
|
||||||
&omap3xxx_i2c1_hwmod,
|
&omap3xxx_i2c1_hwmod,
|
||||||
&omap3xxx_i2c2_hwmod,
|
&omap3xxx_i2c2_hwmod,
|
||||||
|
@ -3657,6 +3651,15 @@ static __initdata struct omap_hwmod *am35xx_hwmods[] = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static __initdata struct omap_hwmod *omap3xxx_dss_hwmods[] = {
|
||||||
|
/* dss class */
|
||||||
|
&omap3xxx_dss_dispc_hwmod,
|
||||||
|
&omap3xxx_dss_dsi1_hwmod,
|
||||||
|
&omap3xxx_dss_rfbi_hwmod,
|
||||||
|
&omap3xxx_dss_venc_hwmod,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
int __init omap3xxx_hwmod_init(void)
|
int __init omap3xxx_hwmod_init(void)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
@ -3730,6 +3733,21 @@ int __init omap3xxx_hwmod_init(void)
|
||||||
|
|
||||||
if (h)
|
if (h)
|
||||||
r = omap_hwmod_register(h);
|
r = omap_hwmod_register(h);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DSS code presumes that dss_core hwmod is handled first,
|
||||||
|
* _before_ any other DSS related hwmods so register common
|
||||||
|
* DSS hwmods last to ensure that dss_core is already registered.
|
||||||
|
* Otherwise some change things may happen, for ex. if dispc
|
||||||
|
* is handled before dss_core and DSS is enabled in bootloader
|
||||||
|
* DIPSC will be reset with outputs enabled which sometimes leads
|
||||||
|
* to unrecoverable L3 error.
|
||||||
|
* XXX The long-term fix to this is to ensure modules are set up
|
||||||
|
* in dependency order in the hwmod core code.
|
||||||
|
*/
|
||||||
|
r = omap_hwmod_register(omap3xxx_dss_hwmods);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue