*/
 
 #include <linux/init.h>
+#include <linux/gpio.h>
+#include <linux/delay.h>
 #include <linux/memblock.h>
 #include <linux/types.h>
 #include <linux/interrupt.h>
 #include <asm/mach/arch.h>
 #include <asm/mach-types.h>
 
+#include <video/platform_lcd.h>
+
 #include <mach/hardware.h>
 
 #include "common.h"
 
 #define VIDEORAM_SIZE          SZ_128K
 
+#define EDB7211_LCD_DC_DC_EN   CLPS711X_GPIO(3, 1)
+#define EDB7211_LCDEN          CLPS711X_GPIO(3, 2)
+
 #define EDB7211_CS8900_BASE    (CS2_PHYS_BASE + 0x300)
 #define EDB7211_CS8900_IRQ     (IRQ_EINT3)
 
        DEFINE_RES_IRQ(EDB7211_CS8900_IRQ),
 };
 
+static void edb7211_lcd_power_set(struct plat_lcd_data *pd, unsigned int power)
+{
+       if (power) {
+               gpio_set_value(EDB7211_LCDEN, 1);
+               udelay(100);
+               gpio_set_value(EDB7211_LCD_DC_DC_EN, 1);
+       } else {
+               gpio_set_value(EDB7211_LCD_DC_DC_EN, 0);
+               udelay(100);
+               gpio_set_value(EDB7211_LCDEN, 0);
+       }
+}
+
+static struct plat_lcd_data edb7211_lcd_power_pdata = {
+       .set_power      = edb7211_lcd_power_set,
+};
+
+static struct gpio edb7211_gpios[] __initconst = {
+       { EDB7211_LCD_DC_DC_EN, GPIOF_OUT_INIT_LOW,     "LCD DC-DC" },
+       { EDB7211_LCDEN,        GPIOF_OUT_INIT_LOW,     "LCD POWER" },
+};
+
 static struct map_desc edb7211_io_desc[] __initdata = {
        {       /* Memory-mapped extra keyboard row */
                .virtual        = IO_ADDRESS(EP7211_PHYS_EXTKBD),
 
 static void __init edb7211_init(void)
 {
+       gpio_request_array(edb7211_gpios, ARRAY_SIZE(edb7211_gpios));
+
+       platform_device_register_data(&platform_bus, "platform-lcd", 0,
+                                     &edb7211_lcd_power_pdata,
+                                     sizeof(edb7211_lcd_power_pdata));
        platform_device_register_simple("video-clps711x", 0, NULL, 0);
        platform_device_register_simple("cs89x0", 0, edb7211_cs8900_resource,
                                        ARRAY_SIZE(edb7211_cs8900_resource));
 
  * Relevant bits in port D, which controls power to the various parts of
  * the LCD on the EDB7211.
  */
-#define EDB_PD1_LCD_DC_DC_EN   (1<<1)
-#define EDB_PD2_LCDEN          (1<<2)
 #define EDB_PD3_LCDBL          (1<<3)
 
 #endif
 
 #include <asm/mach/map.h>
 #include <mach/syspld.h>
 
+#include <video/platform_lcd.h>
+
 #include "common.h"
 
 #define GPIO_USERLED   CLPS711X_GPIO(3, 0)
 
+static void p720t_lcd_power_set(struct plat_lcd_data *pd, unsigned int power)
+{
+       if (power) {
+               PLD_LCDEN = PLD_LCDEN_EN;
+               PLD_PWR |= PLD_S4_ON | PLD_S2_ON | PLD_S1_ON;
+       } else {
+               PLD_PWR &= ~(PLD_S4_ON | PLD_S2_ON | PLD_S1_ON);
+               PLD_LCDEN = 0;
+       }
+}
+
+static struct plat_lcd_data p720t_lcd_power_pdata = {
+       .set_power      = p720t_lcd_power_set,
+};
+
 /*
  * Map the P720T system PLD. It occupies two address spaces:
  * 0x10000000 and 0x10400000. We map both regions as one.
 
 static void __init p720t_init(void)
 {
+       platform_device_register_data(&platform_bus, "platform-lcd", 0,
+                                     &p720t_lcd_power_pdata,
+                                     sizeof(p720t_lcd_power_pdata));
        platform_device_register_simple("video-clps711x", 0, NULL, 0);
 }
 
 
                        /* Turn off the LCD backlight. */
                        clps_writeb(clps_readb(PDDR) & ~EDB_PD3_LCDBL, PDDR);
 
-                       /* Power off the LCD DC-DC converter. */
-                       clps_writeb(clps_readb(PDDR) & ~EDB_PD1_LCD_DC_DC_EN, PDDR);
-
-                       /* Delay for a little while (half a second). */
-                       udelay(100);
-
-                       /* Power off the LCD panel. */
-                       clps_writeb(clps_readb(PDDR) & ~EDB_PD2_LCDEN, PDDR);
-
-                       /* Power off the LCD controller. */
+                       /* Disable LCD controller. */
                        clps_writel(clps_readl(SYSCON1) & ~SYSCON1_LCDEN, 
                                        SYSCON1);
                }
        } else {
                if (machine_is_edb7211()) {
-                       /* Power up the LCD controller. */
+                       /* Enable LCD controller. */
                        clps_writel(clps_readl(SYSCON1) | SYSCON1_LCDEN,
                                        SYSCON1);
 
-                       /* Power up the LCD panel. */
-                       clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
-
-                       /* Delay for a little while. */
-                       udelay(100);
-
-                       /* Power up the LCD DC-DC converter. */
-                       clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN,
-                                       PDDR);
-
                        /* Turn on the LCD backlight. */
                        clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR);
                }
        /*
         * Power up the LCD
         */
-       if (machine_is_p720t()) {
-               PLD_LCDEN = PLD_LCDEN_EN;
-               PLD_PWR |= (PLD_S4_ON|PLD_S3_ON|PLD_S2_ON|PLD_S1_ON);
-       }
+       if (machine_is_p720t())
+               PLD_PWR |= PLD_S3_ON;
 
        if (machine_is_edb7211()) {
-               /* Power up the LCD panel. */
-               clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
-
-               /* Delay for a little while. */
-               udelay(100);
-
-               /* Power up the LCD DC-DC converter. */
-               clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN, PDDR);
-
                /* Turn on the LCD backlight. */
                clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR);
        }
        /*
         * Power down the LCD
         */
-       if (machine_is_p720t()) {
-               PLD_LCDEN = 0;
-               PLD_PWR &= ~(PLD_S4_ON|PLD_S3_ON|PLD_S2_ON|PLD_S1_ON);
-       }
+       if (machine_is_p720t())
+               PLD_PWR &= ~PLD_S3_ON;
 
        return 0;
 }