diff options
author | Muralidhar Dixit <murali.dixit@ti.com> | 2012-07-20 05:16:42 +0530 |
---|---|---|
committer | Dmytro Kedrovskyi <x0169235@ti.com> | 2012-07-27 20:48:36 +0300 |
commit | 90d0e11c0576959f7692fe00336d6adb29636893 (patch) | |
tree | 71d15ffa615e3a0e0384cdb29f6e83f1c9f25fc9 /drivers/video/omap2 | |
parent | 4e778c13c25648cf5ae45a85f9b33d78599514dd (diff) | |
download | kernel_samsung_espresso10-90d0e11c0576959f7692fe00336d6adb29636893.zip kernel_samsung_espresso10-90d0e11c0576959f7692fe00336d6adb29636893.tar.gz kernel_samsung_espresso10-90d0e11c0576959f7692fe00336d6adb29636893.tar.bz2 |
OMAPFB: Select correct VSYNC IRQ based on DSS channel
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>
Diffstat (limited to 'drivers/video/omap2')
-rw-r--r-- | drivers/video/omap2/omapfb/omapfb-ioctl.c | 6 | ||||
-rw-r--r-- | drivers/video/omap2/omapfb/omapfb-main.c | 40 | ||||
-rw-r--r-- | drivers/video/omap2/omapfb/omapfb.h | 4 |
3 files changed, 33 insertions, 17 deletions
diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c index d6ec56d..4aacd01 100644 --- a/drivers/video/omap2/omapfb/omapfb-ioctl.c +++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c @@ -917,9 +917,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; diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c index 6cfa69e..46752ab 100644 --- a/drivers/video/omap2/omapfb/omapfb-main.c +++ b/drivers/video/omap2/omapfb/omapfb-main.c @@ -837,8 +837,9 @@ 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); + omapfb_enable_vsync(fbdev, display->channel, false); return 0; } @@ -1398,8 +1399,9 @@ static int omapfb_blank(int blank, struct fb_info *fbi) r = display->driver->enable(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; @@ -1411,7 +1413,7 @@ static int omapfb_blank(int blank, struct fb_info *fbi) 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; @@ -2402,17 +2404,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 + }; + + if (ch > OMAP_DSS_CHANNEL_LCD2) { + pr_warn("%s wrong channel number\n", __func__); + return -ENODEV; + } -void omapfb_disable_vsync(struct omapfb2_device *fbdev) -{ - omap_dispc_unregister_isr(omapfb_vsync_isr, fbdev, DISPC_IRQ_VSYNC); + 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 omapfb_probe(struct platform_device *pdev) diff --git a/drivers/video/omap2/omapfb/omapfb.h b/drivers/video/omap2/omapfb/omapfb.h index 5c67365..9314a8e 100644 --- a/drivers/video/omap2/omapfb/omapfb.h +++ b/drivers/video/omap2/omapfb/omapfb.h @@ -132,8 +132,8 @@ int dss_mode_to_fb_mode(enum omap_color_mode dssmode, int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl, u16 posx, u16 posy, u16 outw, u16 outh); -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); |