You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.9 KiB
99 lines
2.9 KiB
11 years ago
|
From 9a1a810516ae9cb3259b898b6879901c5b44fa90 Mon Sep 17 00:00:00 2001
|
||
|
From: Prathap M S <msprathap@ti.com>
|
||
|
Date: Mon, 2 Sep 2013 12:05:23 +0530
|
||
|
Subject: [PATCH 343/752] video: da8xx-fb: Add API to register wait for vsync
|
||
|
callback
|
||
|
|
||
|
This patch adds APIs to register and unregister wait for vsync callback.
|
||
|
This is derived from commit id 2d44302545da24fd22912d964102bc31a7489e97
|
||
|
This commit id was part of 3.2 kernel sources.
|
||
|
|
||
|
Signed-off-by: Prathap M S <msprathap@ti.com>
|
||
|
---
|
||
|
drivers/video/da8xx-fb.c | 33 +++++++++++++++++++++++++++++++++
|
||
|
include/video/da8xx-fb.h | 4 ++++
|
||
|
2 files changed, 37 insertions(+)
|
||
|
|
||
|
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
|
||
|
index c534d45..77dc477 100644
|
||
|
--- a/drivers/video/da8xx-fb.c
|
||
|
+++ b/drivers/video/da8xx-fb.c
|
||
|
@@ -235,6 +235,9 @@ static struct fb_fix_screeninfo da8xx_fb_fix = {
|
||
|
.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] = {
|
||
|
@@ -916,6 +919,32 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
|
||
|
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)
|
||
|
{
|
||
|
@@ -953,6 +982,8 @@ static irqreturn_t lcdc_irq_handler_rev02(int irq, void *arg)
|
||
|
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) {
|
||
|
@@ -1028,6 +1059,8 @@ static irqreturn_t lcdc_irq_handler_rev01(int irq, void *arg)
|
||
|
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);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
diff --git a/include/video/da8xx-fb.h b/include/video/da8xx-fb.h
|
||
|
index 74c986a..2a0c739 100644
|
||
|
--- a/include/video/da8xx-fb.h
|
||
|
+++ b/include/video/da8xx-fb.h
|
||
|
@@ -106,5 +106,9 @@ void da8xx_register_encoder(struct da8xx_encoder *encoder);
|
||
|
void da8xx_unregister_encoder(struct da8xx_encoder *encoder);
|
||
|
|
||
|
|
||
|
+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 */
|
||
|
|
||
|
--
|
||
|
1.7.10.4
|
||
|
|