#include <linux/sched.h>
 #include <linux/backlight.h>
 #include <linux/fb.h>
+#include <linux/gpio.h>
 
 #include <video/omapdss.h>
+#include <video/omap-panel-data.h>
 
 #define MIPID_CMD_READ_DISP_ID         0x04
 #define MIPID_CMD_READ_RED             0x06
        .sync_pclk_edge = OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES,
 };
 
+static struct panel_acx565akm_data *get_panel_data(struct omap_dss_device *dssdev)
+{
+       return (struct panel_acx565akm_data *) dssdev->data;
+}
+
 static int acx_panel_probe(struct omap_dss_device *dssdev)
 {
        int r;
        struct acx565akm_device *md = &acx_dev;
+       struct panel_acx565akm_data *panel_data = get_panel_data(dssdev);
        struct backlight_device *bldev;
        int max_brightness, brightness;
        struct backlight_properties props;
 
        dev_dbg(&dssdev->dev, "%s\n", __func__);
 
+       if (!panel_data)
+               return -EINVAL;
+
        /* FIXME AC bias ? */
        dssdev->panel.timings = acx_panel_timings;
 
-       if (dssdev->platform_enable)
-               dssdev->platform_enable(dssdev);
+       if (gpio_is_valid(panel_data->reset_gpio)) {
+               r = devm_gpio_request_one(&dssdev->dev, panel_data->reset_gpio,
+                               GPIOF_OUT_INIT_LOW, "lcd reset");
+               if (r)
+                       return r;
+       }
+
+       if (gpio_is_valid(panel_data->reset_gpio))
+               gpio_set_value(panel_data->reset_gpio, 1);
+
        /*
         * After reset we have to wait 5 msec before the first
         * command can be sent.
        r = panel_detect(md);
        if (r) {
                dev_err(&dssdev->dev, "%s panel detect error\n", __func__);
-               if (!md->enabled && dssdev->platform_disable)
-                       dssdev->platform_disable(dssdev);
+               if (!md->enabled && gpio_is_valid(panel_data->reset_gpio))
+                       gpio_set_value(panel_data->reset_gpio, 0);
+
                return r;
        }
 
        mutex_unlock(&acx_dev.mutex);
 
        if (!md->enabled) {
-               if (dssdev->platform_disable)
-                       dssdev->platform_disable(dssdev);
+               if (gpio_is_valid(panel_data->reset_gpio))
+                       gpio_set_value(panel_data->reset_gpio, 0);
        }
 
        /*------- Backlight control --------*/
 static int acx_panel_power_on(struct omap_dss_device *dssdev)
 {
        struct acx565akm_device *md = &acx_dev;
+       struct panel_acx565akm_data *panel_data = get_panel_data(dssdev);
        int r;
 
        dev_dbg(&dssdev->dev, "%s\n", __func__);
        /*FIXME tweak me */
        msleep(50);
 
-       if (dssdev->platform_enable) {
-               r = dssdev->platform_enable(dssdev);
-               if (r)
-                       goto fail;
-       }
+       if (gpio_is_valid(panel_data->reset_gpio))
+               gpio_set_value(panel_data->reset_gpio, 1);
 
        if (md->enabled) {
                dev_dbg(&md->spi->dev, "panel already enabled\n");
        mutex_unlock(&md->mutex);
 
        return acx565akm_bl_update_status(md->bl_dev);
-fail:
-       omapdss_sdi_display_disable(dssdev);
+
 fail_unlock:
        mutex_unlock(&md->mutex);
        return r;
 static void acx_panel_power_off(struct omap_dss_device *dssdev)
 {
        struct acx565akm_device *md = &acx_dev;
+       struct panel_acx565akm_data *panel_data = get_panel_data(dssdev);
 
        dev_dbg(&dssdev->dev, "%s\n", __func__);
 
         */
        msleep(50);
 
-       if (dssdev->platform_disable)
-               dssdev->platform_disable(dssdev);
+       if (gpio_is_valid(panel_data->reset_gpio))
+               gpio_set_value(panel_data->reset_gpio, 0);
 
        /* FIXME need to tweak this delay */
        msleep(100);