]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android-sdk/kernel-video.git/commitdiff
OMAPDSS: OMAPFB: Select correct VSYNC IRQ based on DSS channel
authorMuralidhar Dixit <murali.dixit@ti.com>
Tue, 9 Apr 2013 23:41:35 +0000 (16:41 -0700)
committerPraneeth Bajjuri <praneeth@ti.com>
Fri, 12 Jul 2013 22:28:58 +0000 (17:28 -0500)
Select correct VSYNC IRQ for asynchronous vsync notification
based on the DSS channel.
Current VSYNC notification supports only primary LCD panel.
To support VSYNC notification for default HDMI display this
patch adds the VSYNC IRQ selection based on the DSS channel
for default display.

Change-Id: I0594e80d4b4850c278e6bdd3b07c0cb63488be39
Signed-off-by: Muralidhar Dixit <murali.dixit@ti.com>
Signed-off-by: Dandawate Saket <dsaket@ti.com>
drivers/video/omap2/omapfb/omapfb-ioctl.c
drivers/video/omap2/omapfb/omapfb-main.c
drivers/video/omap2/omapfb/omapfb.h

index dc9da240713fc2c2b4dbd638f402906f7211b716..87d61811e4b65fc2ae5926ebdd11399430e2f5b9 100644 (file)
@@ -910,9 +910,11 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
 
                if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
                        if (p.crt)
-                               omapfb_enable_vsync(fbdev);
+                               omapfb_enable_vsync(fbdev, display->channel,
+                                       true);
                        else
-                               omapfb_disable_vsync(fbdev);
+                               omapfb_enable_vsync(fbdev, display->channel,
+                                       false);
                }
                omapfb_unlock(fbdev);
                break;
index 87805861faaad52c785cfe3669d8e089b8d15a8f..061a133b36a46d43e7bba7df6d81b58f5b7ee482 100644 (file)
@@ -845,8 +845,12 @@ static int omapfb_release(struct fb_info *fbi, int user)
 {
        struct omapfb_info *ofbi = FB2OFB(fbi);
        struct omapfb2_device *fbdev = ofbi->fbdev;
+       struct omap_dss_device *display = fb2display(fbi);
 
-       omapfb_disable_vsync(fbdev);
+       if (!display)
+               return -ENODEV;
+
+       omapfb_enable_vsync(fbdev, display->channel, false);
 
        return 0;
 }
@@ -1394,8 +1398,9 @@ static int omapfb_blank(int blank, struct fb_info *fbi)
                                !d->auto_update_work_enabled)
                        omapfb_start_auto_update(fbdev, display);
 
-               if (fbdev->vsync_active)
-                       omapfb_enable_vsync(fbdev);
+               if (fbdev->vsync_active &&
+                       (display->state == OMAP_DSS_DISPLAY_ACTIVE))
+                       omapfb_enable_vsync(fbdev, display->channel, true);
 
                break;
 
@@ -1412,7 +1417,7 @@ static int omapfb_blank(int blank, struct fb_info *fbi)
        case FB_BLANK_HSYNC_SUSPEND:
        case FB_BLANK_POWERDOWN:
                if (fbdev->vsync_active)
-                       omapfb_disable_vsync(fbdev);
+                       omapfb_enable_vsync(fbdev, display->channel, false);
 
                if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
                        goto exit;
@@ -2599,17 +2604,29 @@ static void omapfb_vsync_isr(void *data, u32 mask)
        schedule_work(&fbdev->vsync_work);
 }
 
-int omapfb_enable_vsync(struct omapfb2_device *fbdev)
+int omapfb_enable_vsync(struct omapfb2_device *fbdev, enum omap_channel ch,
+       bool enable)
 {
-       int r;
-       /* TODO: should determine correct IRQ like dss_mgr_wait_for_vsync does*/
-       r = omap_dispc_register_isr(omapfb_vsync_isr, fbdev, DISPC_IRQ_VSYNC);
-       return r;
-}
+       int r = 0;
+       const u32 masks[] = {
+               DISPC_IRQ_VSYNC,
+               DISPC_IRQ_EVSYNC_EVEN,
+               DISPC_IRQ_VSYNC2
+       };
 
-void omapfb_disable_vsync(struct omapfb2_device *fbdev)
-{
-       omap_dispc_unregister_isr(omapfb_vsync_isr, fbdev, DISPC_IRQ_VSYNC);
+       if (ch > OMAP_DSS_CHANNEL_LCD2) {
+               pr_warn("%s wrong channel number\n", __func__);
+               return -ENODEV;
+       }
+
+       if (enable)
+               r = omap_dispc_register_isr(omapfb_vsync_isr, fbdev,
+                       masks[ch]);
+       else
+               r = omap_dispc_unregister_isr(omapfb_vsync_isr, fbdev,
+                       masks[ch]);
+
+       return r;
 }
 
 static int __init omapfb_probe(struct platform_device *pdev)
index a5f305fad23f25ad9c46ec98bffa6bed66bf6903..b41188d06e8454136988008f9c507d010fcd1433 100644 (file)
@@ -150,9 +150,9 @@ void omapfb_stop_auto_update(struct omapfb2_device *fbdev,
                struct omap_dss_device *display);
 int omapfb_get_update_mode(struct fb_info *fbi, enum omapfb_update_mode *mode);
 int omapfb_set_update_mode(struct fb_info *fbi, enum omapfb_update_mode mode);
-int omapfb_enable_vsync(struct omapfb2_device *fbdev);
-void omapfb_disable_vsync(struct omapfb2_device *fbdev);
 
+int omapfb_enable_vsync(struct omapfb2_device *fbdev, enum omap_channel ch,
+                       bool enable);
 void get_fb_resolution(struct omap_dss_device *dssdev,
                u16 *xres, u16 *yres);