@ -37,6 +37,7 @@
# define DISPC_CONTROL 0x0040
# define DISPC_CONTROL2 0x0238
# define DISPC_CONTROL3 0x0848
# define DISPC_IRQSTATUS 0x0018
# define DSS_SYSCONFIG 0x10
@ -52,6 +53,7 @@
# define EVSYNC_EVEN_IRQ_SHIFT 2
# define EVSYNC_ODD_IRQ_SHIFT 3
# define FRAMEDONE2_IRQ_SHIFT 22
# define FRAMEDONE3_IRQ_SHIFT 30
# define FRAMEDONETV_IRQ_SHIFT 24
/*
@ -376,7 +378,7 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)
static void dispc_disable_outputs ( void )
{
u32 v , irq_mask = 0 ;
bool lcd_en , digit_en , lcd2_en = false ;
bool lcd_en , digit_en , lcd2_en = false , lcd3_en = false ;
int i ;
struct omap_dss_dispc_dev_attr * da ;
struct omap_hwmod * oh ;
@ -405,7 +407,13 @@ static void dispc_disable_outputs(void)
lcd2_en = v & LCD_EN_MASK ;
}
if ( ! ( lcd_en | digit_en | lcd2_en ) )
/* store value of LCDENABLE for LCD3 */
if ( da - > manager_count > 3 ) {
v = omap_hwmod_read ( oh , DISPC_CONTROL3 ) ;
lcd3_en = v & LCD_EN_MASK ;
}
if ( ! ( lcd_en | digit_en | lcd2_en | lcd3_en ) )
return ; /* no managers currently enabled */
/*
@ -426,10 +434,12 @@ static void dispc_disable_outputs(void)
if ( lcd2_en )
irq_mask | = 1 < < FRAMEDONE2_IRQ_SHIFT ;
if ( lcd3_en )
irq_mask | = 1 < < FRAMEDONE3_IRQ_SHIFT ;
/*
* clear any previous FRAMEDONE , FRAMEDONETV ,
* EVSYNC_EVEN / ODD or FRAMEDONE2 interrupts
* EVSYNC_EVEN / ODD , FRAMEDONE2 or FRAMEDONE3 interrupts
*/
omap_hwmod_write ( irq_mask , oh , DISPC_IRQSTATUS ) ;
@ -445,12 +455,19 @@ static void dispc_disable_outputs(void)
omap_hwmod_write ( v , oh , DISPC_CONTROL2 ) ;
}
/* disable LCD3 manager */
if ( da - > manager_count > 3 ) {
v = omap_hwmod_read ( oh , DISPC_CONTROL3 ) ;
v & = ~ LCD_EN_MASK ;
omap_hwmod_write ( v , oh , DISPC_CONTROL3 ) ;
}
i = 0 ;
while ( ( omap_hwmod_read ( oh , DISPC_IRQSTATUS ) & irq_mask ) ! =
irq_mask ) {
i + + ;
if ( i > FRAMEDONE_IRQ_TIMEOUT ) {
pr_err ( " didn't get FRAMEDONE1/2 or TV interrupt \n " ) ;
pr_err ( " didn't get FRAMEDONE1/2/3 or TV interrupt \n " ) ;
break ;
}
mdelay ( 1 ) ;