diff options
author | Dima Zavin <dima@android.com> | 2011-06-27 19:21:28 -0700 |
---|---|---|
committer | Dima Zavin <dima@android.com> | 2011-06-27 19:21:28 -0700 |
commit | b42abaf3b5996b56203c6ddb09ff27693f90d5f3 (patch) | |
tree | 6d8b3b68ef9287f1180cfae1bb7fb8ccf5a57259 | |
parent | 07367d95a03c2d584201b2a18fa0b34357b04ab6 (diff) | |
parent | 20e93f112412967a9850cb9642195c04c46acd62 (diff) | |
download | kernel_samsung_tuna-b42abaf3b5996b56203c6ddb09ff27693f90d5f3.zip kernel_samsung_tuna-b42abaf3b5996b56203c6ddb09ff27693f90d5f3.tar.gz kernel_samsung_tuna-b42abaf3b5996b56203c6ddb09ff27693f90d5f3.tar.bz2 |
Merge branch 'linux-omap-dss-3.0' into linux-omap-3.0
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 54 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dispc.c | 4 |
2 files changed, 57 insertions, 1 deletions
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 5fcd435..22a45f8 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -1424,9 +1424,61 @@ static struct omap_hwmod_class_sysconfig omap44xx_dss_sysc = { .sysc_flags = SYSS_HAS_RESET_STATUS, }; -int omap44xx_dss_reset(struct omap_hwmod *oh) { +static int omap44xx_dss_reset(struct omap_hwmod *oh) +{ +#define DISPC_IRQSTATUS (0x48041018UL) +#define DISPC_CONTROL1 (0x48041040UL) +#define DISPC_CONTROL2 (0x48041238UL) + u32 ctrl1_mask = 0; + u32 ctrl2_mask = 0; + u32 irq_mask = 0; + u32 val; + unsigned long end_wait; + + /* HACK */ + /* If LCD1/LCD2/TV are active, disable them first before + * moving the clock sources back to PRCM. We don't want to change + * the clock source while a DMA is active. + */ + val = omap_readl(DISPC_CONTROL1); + if (val & (1 << 0)) { + /* LCD1 */ + irq_mask |= 1 << 0; + ctrl1_mask |= 1 << 0; + } + if (val & (1 << 1)) { + /* TV/VENC */ + irq_mask |= 1 << 24; + ctrl1_mask |= 1 << 1; + } + val = omap_readl(DISPC_CONTROL2); + if (val & (1 << 0)) { + /* LCD2 */ + irq_mask |= 1 << 22; + ctrl2_mask |= 1 << 0; + } + + /* disable the active controllers */ + omap_writel(omap_readl(DISPC_CONTROL1) & (~ctrl1_mask), DISPC_CONTROL1); + omap_writel(omap_readl(DISPC_CONTROL2) & (~ctrl2_mask), DISPC_CONTROL2); + + omap_writel(irq_mask, DISPC_IRQSTATUS); + + end_wait = jiffies + msecs_to_jiffies(50); + while (((omap_readl(DISPC_CONTROL1) & ctrl1_mask) || + (omap_readl(DISPC_CONTROL2) & ctrl2_mask) || + ((omap_readl(DISPC_IRQSTATUS) & irq_mask) != irq_mask)) && + time_before(jiffies, end_wait)) + cpu_relax(); + WARN_ON((omap_readl(DISPC_CONTROL1) & ctrl1_mask) || + (omap_readl(DISPC_CONTROL2) & ctrl2_mask) || + ((omap_readl(DISPC_IRQSTATUS) & irq_mask) != irq_mask)); + omap_hwmod_write(0x0, oh, 0x40); return 0; +#undef DISPC_IRQSTATUS +#undef DISPC_CONTROL1 +#undef DISPC_CONTROL2 } static struct omap_hwmod_class omap44xx_dss_hwmod_class = { diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index 988d440..9681717 100644 --- a/drivers/video/omap2/dss/dispc.c +++ b/drivers/video/omap2/dss/dispc.c @@ -3391,6 +3391,8 @@ static void dispc_error_worker(struct work_struct *work) dispc.error_irqs = 0; spin_unlock_irqrestore(&dispc.irq_lock, flags); + dispc_runtime_get(); + if (errors & DISPC_IRQ_GFX_FIFO_UNDERFLOW) { DSSERR("GFX_FIFO_UNDERFLOW, disabling GFX\n"); for (i = 0; i < omap_dss_get_num_overlays(); ++i) { @@ -3595,6 +3597,8 @@ static void dispc_error_worker(struct work_struct *work) dispc.irq_error_mask |= errors; _omap_dispc_set_irqs(); spin_unlock_irqrestore(&dispc.irq_lock, flags); + + dispc_runtime_put(); } int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout) |