unsigned int databuf_sz;
        unsigned int palette_sz;
        unsigned int pxl_clk;
+       int blank;
 #ifdef CONFIG_CPU_FREQ
        struct notifier_block   freq_transition;
 #endif
+       void (*panel_power_ctrl)(int);
 };
 
 /* Variable Screen Information */
        },
 };
 
+/* Enable the Raster Engine of the LCD Controller */
+static inline void lcd_enable_raster(void)
+{
+       u32 reg;
+
+       reg = lcdc_read(LCD_RASTER_CTRL_REG);
+       if (!(reg & LCD_RASTER_ENABLE))
+               lcdc_write(reg | LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
+}
+
 /* Disable the Raster Engine of the LCD Controller */
-static void lcd_disable_raster(struct da8xx_fb_par *par)
+static inline void lcd_disable_raster(void)
 {
        u32 reg;
 
 static void lcd_reset(struct da8xx_fb_par *par)
 {
        /* Disable the Raster if previously Enabled */
-       if (lcdc_read(LCD_RASTER_CTRL_REG) & LCD_RASTER_ENABLE)
-               lcd_disable_raster(par);
+       lcd_disable_raster();
 
        /* DMA has to be disabled */
        lcdc_write(0, LCD_DMA_CTRL_REG);
 static irqreturn_t lcdc_irq_handler(int irq, void *arg)
 {
        u32 stat = lcdc_read(LCD_STAT_REG);
-       u32 reg;
 
        if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) {
-               reg = lcdc_read(LCD_RASTER_CTRL_REG);
-               lcdc_write(reg & ~LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
+               lcd_disable_raster();
                lcdc_write(stat, LCD_STAT_REG);
-               lcdc_write(reg | LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
+               lcd_enable_raster();
        } else
                lcdc_write(stat, LCD_STAT_REG);
 
                                     unsigned long val, void *data)
 {
        struct da8xx_fb_par *par;
-       unsigned int reg;
 
        par = container_of(nb, struct da8xx_fb_par, freq_transition);
        if (val == CPUFREQ_PRECHANGE) {
-               reg = lcdc_read(LCD_RASTER_CTRL_REG);
-               lcdc_write(reg & ~LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
+               lcd_disable_raster();
        } else if (val == CPUFREQ_POSTCHANGE) {
                lcd_calc_clk_divider(par);
-               reg = lcdc_read(LCD_RASTER_CTRL_REG);
-               lcdc_write(reg | LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
+               lcd_enable_raster();
        }
 
        return 0;
 #ifdef CONFIG_CPU_FREQ
                lcd_da8xx_cpufreq_deregister(par);
 #endif
-               if (lcdc_read(LCD_RASTER_CTRL_REG) & LCD_RASTER_ENABLE)
-                       lcd_disable_raster(par);
+               if (par->panel_power_ctrl)
+                       par->panel_power_ctrl(0);
+
+               lcd_disable_raster();
                lcdc_write(0, LCD_RASTER_CTRL_REG);
 
                /* disable DMA  */
        par = da8xx_fb_info->par;
        par->lcdc_clk = fb_clk;
        par->pxl_clk = lcdc_info->pxl_clk;
+       if (fb_pdata->panel_power_ctrl) {
+               par->panel_power_ctrl = fb_pdata->panel_power_ctrl;
+               par->panel_power_ctrl(1);
+       }
 
        if (lcd_init(par, lcd_cfg, lcdc_info) < 0) {
                dev_err(&device->dev, "lcd_init failed\n");
 #endif
 
        /* enable raster engine */
-       lcdc_write(lcdc_read(LCD_RASTER_CTRL_REG) |
-                       LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
+       lcd_enable_raster();
 
        return 0;