|
@@ -1480,6 +1480,28 @@ static struct omap_hwmod omap3xxx_dss_core_hwmod = {
|
|
|
.masters_cnt = ARRAY_SIZE(omap3xxx_dss_masters),
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * 'dispc' class
|
|
|
+ * display controller
|
|
|
+ */
|
|
|
+
|
|
|
+static struct omap_hwmod_class_sysconfig omap3_dispc_sysc = {
|
|
|
+ .rev_offs = 0x0000,
|
|
|
+ .sysc_offs = 0x0010,
|
|
|
+ .syss_offs = 0x0014,
|
|
|
+ .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
|
|
|
+ SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
|
|
|
+ SYSC_HAS_ENAWAKEUP),
|
|
|
+ .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
|
|
|
+ MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
|
|
|
+ .sysc_fields = &omap_hwmod_sysc_type1,
|
|
|
+};
|
|
|
+
|
|
|
+static struct omap_hwmod_class omap3_dispc_hwmod_class = {
|
|
|
+ .name = "dispc",
|
|
|
+ .sysc = &omap3_dispc_sysc,
|
|
|
+};
|
|
|
+
|
|
|
/* l4_core -> dss_dispc */
|
|
|
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dispc = {
|
|
|
.master = &omap3xxx_l4_core_hwmod,
|
|
@@ -1503,7 +1525,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_dispc_slaves[] = {
|
|
|
|
|
|
static struct omap_hwmod omap3xxx_dss_dispc_hwmod = {
|
|
|
.name = "dss_dispc",
|
|
|
- .class = &omap2_dispc_hwmod_class,
|
|
|
+ .class = &omap3_dispc_hwmod_class,
|
|
|
.mpu_irqs = omap2_dispc_irqs,
|
|
|
.main_clk = "dss1_alwon_fck",
|
|
|
.prcm = {
|
|
@@ -3523,12 +3545,6 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
|
|
|
&omap3xxx_uart2_hwmod,
|
|
|
&omap3xxx_uart3_hwmod,
|
|
|
|
|
|
- /* dss class */
|
|
|
- &omap3xxx_dss_dispc_hwmod,
|
|
|
- &omap3xxx_dss_dsi1_hwmod,
|
|
|
- &omap3xxx_dss_rfbi_hwmod,
|
|
|
- &omap3xxx_dss_venc_hwmod,
|
|
|
-
|
|
|
/* i2c class */
|
|
|
&omap3xxx_i2c1_hwmod,
|
|
|
&omap3xxx_i2c2_hwmod,
|
|
@@ -3635,6 +3651,15 @@ static __initdata struct omap_hwmod *am35xx_hwmods[] = {
|
|
|
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 r;
|
|
@@ -3708,6 +3733,21 @@ int __init omap3xxx_hwmod_init(void)
|
|
|
|
|
|
if (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;
|
|
|
}
|