aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/da8xx-fb.c43
-rw-r--r--include/video/da8xx-fb.h1
2 files changed, 28 insertions, 16 deletions
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 8966274bbbbc..eb95b893e8b2 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -115,9 +115,11 @@ struct da8xx_fb_par {
115 unsigned int databuf_sz; 115 unsigned int databuf_sz;
116 unsigned int palette_sz; 116 unsigned int palette_sz;
117 unsigned int pxl_clk; 117 unsigned int pxl_clk;
118 int blank;
118#ifdef CONFIG_CPU_FREQ 119#ifdef CONFIG_CPU_FREQ
119 struct notifier_block freq_transition; 120 struct notifier_block freq_transition;
120#endif 121#endif
122 void (*panel_power_ctrl)(int);
121}; 123};
122 124
123/* Variable Screen Information */ 125/* Variable Screen Information */
@@ -195,8 +197,18 @@ static struct da8xx_panel known_lcd_panels[] = {
195 }, 197 },
196}; 198};
197 199
200/* Enable the Raster Engine of the LCD Controller */
201static inline void lcd_enable_raster(void)
202{
203 u32 reg;
204
205 reg = lcdc_read(LCD_RASTER_CTRL_REG);
206 if (!(reg & LCD_RASTER_ENABLE))
207 lcdc_write(reg | LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
208}
209
198/* Disable the Raster Engine of the LCD Controller */ 210/* Disable the Raster Engine of the LCD Controller */
199static void lcd_disable_raster(struct da8xx_fb_par *par) 211static inline void lcd_disable_raster(void)
200{ 212{
201 u32 reg; 213 u32 reg;
202 214
@@ -448,8 +460,7 @@ static int fb_setcolreg(unsigned regno, unsigned red, unsigned green,
448static void lcd_reset(struct da8xx_fb_par *par) 460static void lcd_reset(struct da8xx_fb_par *par)
449{ 461{
450 /* Disable the Raster if previously Enabled */ 462 /* Disable the Raster if previously Enabled */
451 if (lcdc_read(LCD_RASTER_CTRL_REG) & LCD_RASTER_ENABLE) 463 lcd_disable_raster();
452 lcd_disable_raster(par);
453 464
454 /* DMA has to be disabled */ 465 /* DMA has to be disabled */
455 lcdc_write(0, LCD_DMA_CTRL_REG); 466 lcdc_write(0, LCD_DMA_CTRL_REG);
@@ -529,13 +540,11 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
529static irqreturn_t lcdc_irq_handler(int irq, void *arg) 540static irqreturn_t lcdc_irq_handler(int irq, void *arg)
530{ 541{
531 u32 stat = lcdc_read(LCD_STAT_REG); 542 u32 stat = lcdc_read(LCD_STAT_REG);
532 u32 reg;
533 543
534 if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) { 544 if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) {
535 reg = lcdc_read(LCD_RASTER_CTRL_REG); 545 lcd_disable_raster();
536 lcdc_write(reg & ~LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
537 lcdc_write(stat, LCD_STAT_REG); 546 lcdc_write(stat, LCD_STAT_REG);
538 lcdc_write(reg | LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG); 547 lcd_enable_raster();
539 } else 548 } else
540 lcdc_write(stat, LCD_STAT_REG); 549 lcdc_write(stat, LCD_STAT_REG);
541 550
@@ -595,16 +604,13 @@ static int lcd_da8xx_cpufreq_transition(struct notifier_block *nb,
595 unsigned long val, void *data) 604 unsigned long val, void *data)
596{ 605{
597 struct da8xx_fb_par *par; 606 struct da8xx_fb_par *par;
598 unsigned int reg;
599 607
600 par = container_of(nb, struct da8xx_fb_par, freq_transition); 608 par = container_of(nb, struct da8xx_fb_par, freq_transition);
601 if (val == CPUFREQ_PRECHANGE) { 609 if (val == CPUFREQ_PRECHANGE) {
602 reg = lcdc_read(LCD_RASTER_CTRL_REG); 610 lcd_disable_raster();
603 lcdc_write(reg & ~LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
604 } else if (val == CPUFREQ_POSTCHANGE) { 611 } else if (val == CPUFREQ_POSTCHANGE) {
605 lcd_calc_clk_divider(par); 612 lcd_calc_clk_divider(par);
606 reg = lcdc_read(LCD_RASTER_CTRL_REG); 613 lcd_enable_raster();
607 lcdc_write(reg | LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
608 } 614 }
609 615
610 return 0; 616 return 0;
@@ -635,8 +641,10 @@ static int __devexit fb_remove(struct platform_device *dev)
635#ifdef CONFIG_CPU_FREQ 641#ifdef CONFIG_CPU_FREQ
636 lcd_da8xx_cpufreq_deregister(par); 642 lcd_da8xx_cpufreq_deregister(par);
637#endif 643#endif
638 if (lcdc_read(LCD_RASTER_CTRL_REG) & LCD_RASTER_ENABLE) 644 if (par->panel_power_ctrl)
639 lcd_disable_raster(par); 645 par->panel_power_ctrl(0);
646
647 lcd_disable_raster();
640 lcdc_write(0, LCD_RASTER_CTRL_REG); 648 lcdc_write(0, LCD_RASTER_CTRL_REG);
641 649
642 /* disable DMA */ 650 /* disable DMA */
@@ -777,6 +785,10 @@ static int __init fb_probe(struct platform_device *device)
777 par = da8xx_fb_info->par; 785 par = da8xx_fb_info->par;
778 par->lcdc_clk = fb_clk; 786 par->lcdc_clk = fb_clk;
779 par->pxl_clk = lcdc_info->pxl_clk; 787 par->pxl_clk = lcdc_info->pxl_clk;
788 if (fb_pdata->panel_power_ctrl) {
789 par->panel_power_ctrl = fb_pdata->panel_power_ctrl;
790 par->panel_power_ctrl(1);
791 }
780 792
781 if (lcd_init(par, lcd_cfg, lcdc_info) < 0) { 793 if (lcd_init(par, lcd_cfg, lcdc_info) < 0) {
782 dev_err(&device->dev, "lcd_init failed\n"); 794 dev_err(&device->dev, "lcd_init failed\n");
@@ -877,8 +889,7 @@ static int __init fb_probe(struct platform_device *device)
877#endif 889#endif
878 890
879 /* enable raster engine */ 891 /* enable raster engine */
880 lcdc_write(lcdc_read(LCD_RASTER_CTRL_REG) | 892 lcd_enable_raster();
881 LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
882 893
883 return 0; 894 return 0;
884 895
diff --git a/include/video/da8xx-fb.h b/include/video/da8xx-fb.h
index c051a50ed528..89d43b3d4cb9 100644
--- a/include/video/da8xx-fb.h
+++ b/include/video/da8xx-fb.h
@@ -38,6 +38,7 @@ struct da8xx_lcdc_platform_data {
38 const char manu_name[10]; 38 const char manu_name[10];
39 void *controller_data; 39 void *controller_data;
40 const char type[25]; 40 const char type[25];
41 void (*panel_power_ctrl)(int);
41}; 42};
42 43
43struct lcd_ctrl_config { 44struct lcd_ctrl_config {