From c2ef9ffad932f3c94bfabf5ba7df1c2d3f8de33d Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Thu, 20 Jan 2011 18:43:42 -0800 Subject: [PATCH] siihdmi: better IPU settling handling For some reason pausing to allow the IPU to catchup allows the driver to interact with a wider variety of devices. It is still unknown as to the concrete reason why it improves compatibility. Unify the definition for the timeout and only do it on the Efika MX for the time being. --- drivers/video/mxc/mxcfb_siihdmi.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/video/mxc/mxcfb_siihdmi.c b/drivers/video/mxc/mxcfb_siihdmi.c index 9a39e589aa9..c8aab4b7331 100644 --- a/drivers/video/mxc/mxcfb_siihdmi.c +++ b/drivers/video/mxc/mxcfb_siihdmi.c @@ -43,6 +43,12 @@ #include +#if defined(CONFIG_MACH_MX51_EFIKAMX) +/* TODO Figure out why we need to wait for the IPU on the EFIKA MX */ +#define MX51_IPU_SETTLE_TIME_MS (100) +#endif + + /* logging helpers */ #define CONTINUE(fmt, ...) printk(KERN_CONT fmt, ## __VA_ARGS__) #define DEBUG(fmt, ...) printk(KERN_DEBUG "SIIHDMI: " fmt, ## __VA_ARGS__) @@ -791,7 +797,9 @@ static int siihdmi_init_fb(struct siihdmi_tx *tx, struct fb_info *info) fb_videomode_to_var(&var, mode); - msleep(10); // pause to let IPU settle +#if defined(CONFIG_MACH_MX51_EFIKAMX) + msleep(MX51_IPU_SETTLE_TIME_MS); +#endif if ((ret = siihdmi_set_resolution(tx, &var)) < 0) goto out; @@ -845,20 +853,18 @@ static int siihdmi_fb_event_handler(struct notifier_block *nb, switch (val) { case FB_EVENT_FB_REGISTERED: - { - /* - * sleep just a little while to let the IPU settle - * before we force it to change again to an EDID mode - */ - msleep(100); +#if defined(CONFIG_MACH_MX51_EFIKAMX) + msleep(MX51_IPU_SETTLE_TIME_MS); +#endif return siihdmi_init_fb(tx, event->info); - } case FB_EVENT_MODE_CHANGE: { struct fb_var_screeninfo var = {0}; fb_videomode_to_var(&var, event->info->mode); - msleep(100); +#if defined(CONFIG_MACH_MX51_EFIKAMX) + msleep(MX51_IPU_SETTLE_TIME_MS); +#endif return siihdmi_set_resolution(tx, &var); } break; @@ -961,7 +967,10 @@ static int __devinit siihdmi_probe(struct i2c_client *client, DEBUG("could not register display hotplug irq\n"); } #endif - msleep(100); // let things settle, for some reason this improves compatibility + +#if defined(CONFIG_MACH_MX51_EFIKAMX) + msleep(MX51_IPU_SETTLE_TIME_MS); +#endif /* initialise the device */ if ((ret = siihdmi_initialise(tx)) < 0)