From daae33d9070f0f4a22734ae49c20fdf70f05a0f9 Mon Sep 17 00:00:00 2001
From: Robert Nelson <robertcnelson@gmail.com>
Date: Wed, 18 Dec 2013 12:05:16 -0600
Subject: [PATCH 4/5] hack: port da8xx changes from ti 3.12 repo

Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
---
 drivers/video/da8xx-fb.c |   33 +++++++++++++++++++++++++++++++++
 include/video/da8xx-fb.h |    4 ++++
 2 files changed, 37 insertions(+)

Index: linux-3.12.36-rt50-r4s2/drivers/video/da8xx-fb.c
===================================================================
--- linux-3.12.36-rt50-r4s2.orig/drivers/video/da8xx-fb.c
+++ linux-3.12.36-rt50-r4s2/drivers/video/da8xx-fb.c
@@ -198,6 +198,9 @@ static struct fb_fix_screeninfo da8xx_fb
        .accel = FB_ACCEL_NONE
 };
 
+static vsync_callback_t vsync_cb_handler;
+static void *vsync_cb_arg;
+
 static struct fb_videomode known_lcd_panels[] = {
        /* Sharp LCD035Q3DG01 */
        [0] = {
@@ -825,6 +828,32 @@ static int lcd_init(struct da8xx_fb_par
        return 0;
 }
 
+int register_vsync_cb(vsync_callback_t handler, void *arg, int idx)
+{
+       if ((vsync_cb_handler == NULL) && (vsync_cb_arg == NULL)) {
+               vsync_cb_arg = arg;
+               vsync_cb_handler = handler;
+       } else {
+               return -EEXIST;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(register_vsync_cb);
+
+int unregister_vsync_cb(vsync_callback_t handler, void *arg, int idx)
+{
+       if ((vsync_cb_handler == handler) && (vsync_cb_arg == arg)) {
+               vsync_cb_handler = NULL;
+               vsync_cb_arg = NULL;
+       } else {
+               return -ENXIO;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(unregister_vsync_cb);
+
 /* IRQ handler for version 2 of LCDC */
 static irqreturn_t lcdc_irq_handler_rev02(int irq, void *arg)
 {
@@ -862,6 +891,8 @@ static irqreturn_t lcdc_irq_handler_rev0
                                   LCD_DMA_FRM_BUF_CEILING_ADDR_0_REG);
                        par->vsync_flag = 1;
                        wake_up_interruptible(&par->vsync_wait);
+                       if (vsync_cb_handler)
+                               vsync_cb_handler(vsync_cb_arg);
                }
 
                if (stat & LCD_END_OF_FRAME1) {
@@ -872,6 +903,8 @@ static irqreturn_t lcdc_irq_handler_rev0
                                   LCD_DMA_FRM_BUF_CEILING_ADDR_1_REG);
                        par->vsync_flag = 1;
                        wake_up_interruptible(&par->vsync_wait);
+                       if (vsync_cb_handler)
+                               vsync_cb_handler(vsync_cb_arg);
                }
 
                /* Set only when controller is disabled and at the end of
Index: linux-3.12.36-rt50-r4s2/include/video/da8xx-fb.h
===================================================================
--- linux-3.12.36-rt50-r4s2.orig/include/video/da8xx-fb.h
+++ linux-3.12.36-rt50-r4s2/include/video/da8xx-fb.h
@@ -91,5 +91,9 @@ struct lcd_sync_arg {
 /* Proprietary FB_SYNC_ flags */
 #define FB_SYNC_CLK_INVERT 0x40000000
 
+typedef void (*vsync_callback_t)(void *arg);
+int register_vsync_cb(vsync_callback_t handler, void *arg, int idx);
+int unregister_vsync_cb(vsync_callback_t handler, void *arg, int idx);
+
 #endif  /* ifndef DA8XX_FB_H */