diff options
-rw-r--r-- | drivers/video/pxafb.c | 32 | ||||
-rw-r--r-- | drivers/video/pxafb.h | 2 | ||||
-rw-r--r-- | include/asm-arm/arch-pxa/pxafb.h | 1 |
3 files changed, 35 insertions, 0 deletions
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index 30112816420c..34d4dcc0320a 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
@@ -468,6 +468,36 @@ static inline unsigned int get_pcd(unsigned int pixclock) | |||
468 | } | 468 | } |
469 | 469 | ||
470 | /* | 470 | /* |
471 | * Some touchscreens need hsync information from the video driver to | ||
472 | * function correctly. We export it here. | ||
473 | */ | ||
474 | static inline void set_hsync_time(struct pxafb_info *fbi, unsigned int pcd) | ||
475 | { | ||
476 | unsigned long long htime; | ||
477 | |||
478 | if ((pcd == 0) || (fbi->fb.var.hsync_len == 0)) { | ||
479 | fbi->hsync_time=0; | ||
480 | return; | ||
481 | } | ||
482 | |||
483 | htime = (unsigned long long)get_lcdclk_frequency_10khz() * 10000; | ||
484 | do_div(htime, pcd * fbi->fb.var.hsync_len); | ||
485 | fbi->hsync_time = htime; | ||
486 | } | ||
487 | |||
488 | unsigned long pxafb_get_hsync_time(struct device *dev) | ||
489 | { | ||
490 | struct pxafb_info *fbi = dev_get_drvdata(dev); | ||
491 | |||
492 | /* If display is blanked/suspended, hsync isn't active */ | ||
493 | if (!fbi || (fbi->state != C_ENABLE)) | ||
494 | return 0; | ||
495 | |||
496 | return fbi->hsync_time; | ||
497 | } | ||
498 | EXPORT_SYMBOL(pxafb_get_hsync_time); | ||
499 | |||
500 | /* | ||
471 | * pxafb_activate_var(): | 501 | * pxafb_activate_var(): |
472 | * Configures LCD Controller based on entries in var parameter. Settings are | 502 | * Configures LCD Controller based on entries in var parameter. Settings are |
473 | * only written to the controller if changes were made. | 503 | * only written to the controller if changes were made. |
@@ -631,6 +661,7 @@ static int pxafb_activate_var(struct fb_var_screeninfo *var, struct pxafb_info * | |||
631 | fbi->reg_lccr1 = new_regs.lccr1; | 661 | fbi->reg_lccr1 = new_regs.lccr1; |
632 | fbi->reg_lccr2 = new_regs.lccr2; | 662 | fbi->reg_lccr2 = new_regs.lccr2; |
633 | fbi->reg_lccr3 = new_regs.lccr3; | 663 | fbi->reg_lccr3 = new_regs.lccr3; |
664 | set_hsync_time(fbi, pcd); | ||
634 | local_irq_restore(flags); | 665 | local_irq_restore(flags); |
635 | 666 | ||
636 | /* | 667 | /* |
@@ -907,6 +938,7 @@ pxafb_freq_transition(struct notifier_block *nb, unsigned long val, void *data) | |||
907 | 938 | ||
908 | case CPUFREQ_POSTCHANGE: | 939 | case CPUFREQ_POSTCHANGE: |
909 | pcd = get_pcd(fbi->fb.var.pixclock); | 940 | pcd = get_pcd(fbi->fb.var.pixclock); |
941 | set_hsync_time(fbi, pcd); | ||
910 | fbi->reg_lccr3 = (fbi->reg_lccr3 & ~0xff) | LCCR3_PixClkDiv(pcd); | 942 | fbi->reg_lccr3 = (fbi->reg_lccr3 & ~0xff) | LCCR3_PixClkDiv(pcd); |
911 | set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE); | 943 | set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE); |
912 | break; | 944 | break; |
diff --git a/drivers/video/pxafb.h b/drivers/video/pxafb.h index de15fec5f82f..22c00be786a8 100644 --- a/drivers/video/pxafb.h +++ b/drivers/video/pxafb.h | |||
@@ -83,6 +83,8 @@ struct pxafb_info { | |||
83 | u_int reg_lccr2; | 83 | u_int reg_lccr2; |
84 | u_int reg_lccr3; | 84 | u_int reg_lccr3; |
85 | 85 | ||
86 | unsigned long hsync_time; | ||
87 | |||
86 | volatile u_char state; | 88 | volatile u_char state; |
87 | volatile u_char task_state; | 89 | volatile u_char task_state; |
88 | struct semaphore ctrlr_sem; | 90 | struct semaphore ctrlr_sem; |
diff --git a/include/asm-arm/arch-pxa/pxafb.h b/include/asm-arm/arch-pxa/pxafb.h index 27d71e9d413b..21c0e16dce5f 100644 --- a/include/asm-arm/arch-pxa/pxafb.h +++ b/include/asm-arm/arch-pxa/pxafb.h | |||
@@ -66,3 +66,4 @@ struct pxafb_mach_info { | |||
66 | 66 | ||
67 | }; | 67 | }; |
68 | void set_pxa_fb_info(struct pxafb_mach_info *hard_pxa_fb_info); | 68 | void set_pxa_fb_info(struct pxafb_mach_info *hard_pxa_fb_info); |
69 | unsigned long pxafb_get_hsync_time(struct device *dev); | ||