OMAPDSS: tpo-td043 panel: handle gpios in panel driver
authorArchit Taneja <archit@ti.com>
Wed, 21 Nov 2012 10:09:31 +0000 (15:39 +0530)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Wed, 3 Apr 2013 12:21:08 +0000 (15:21 +0300)
The tpo-td043mtea1 panel driver leaves gpio configurations to the
platform_enable and disable calls in the platform's board file. These should
happen in the panel driver itself.

Create a platform data struct for the panel, this contains the reset gpio
number used by the panel driver, this struct will be passed to the panel driver
as platform data. The driver will request and configure the reset gpio rather
than leaving it to platform callbacks in board files.

This will help in removing the need for the panel drivers to have platform
related callbacks.

Signed-off-by: Archit Taneja <archit@ti.com>
drivers/video/omap2/displays/panel-tpo-td043mtea1.c

index 048c98381ef6affd36417518881b890ec1f170dd..e3252bf4781ad765d2aadb7ccf6c69817517aee7 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/slab.h>
 
 #include <video/omapdss.h>
+#include <video/omap-panel-data.h>
 
 #define TPO_R02_MODE(x)                ((x) & 7)
 #define TPO_R02_MODE_800x480   7
@@ -278,9 +279,14 @@ static const struct omap_video_timings tpo_td043_timings = {
        .sync_pclk_edge = OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES,
 };
 
+static inline struct panel_tpo_td043_data
+*get_panel_data(const struct omap_dss_device *dssdev)
+{
+       return (struct panel_tpo_td043_data *) dssdev->data;
+}
+
 static int tpo_td043_power_on(struct tpo_td043_device *tpo_td043)
 {
-       int nreset_gpio = tpo_td043->nreset_gpio;
        int r;
 
        if (tpo_td043->powered_on)
@@ -293,8 +299,8 @@ static int tpo_td043_power_on(struct tpo_td043_device *tpo_td043)
        /* wait for panel to stabilize */
        msleep(160);
 
-       if (gpio_is_valid(nreset_gpio))
-               gpio_set_value(nreset_gpio, 1);
+       if (gpio_is_valid(tpo_td043->nreset_gpio))
+               gpio_set_value(tpo_td043->nreset_gpio, 1);
 
        tpo_td043_write(tpo_td043->spi, 2,
                        TPO_R02_MODE(tpo_td043->mode) | TPO_R02_NCLK_RISING);
@@ -311,16 +317,14 @@ static int tpo_td043_power_on(struct tpo_td043_device *tpo_td043)
 
 static void tpo_td043_power_off(struct tpo_td043_device *tpo_td043)
 {
-       int nreset_gpio = tpo_td043->nreset_gpio;
-
        if (!tpo_td043->powered_on)
                return;
 
        tpo_td043_write(tpo_td043->spi, 3,
                        TPO_R03_VAL_STANDBY | TPO_R03_EN_PWM);
 
-       if (gpio_is_valid(nreset_gpio))
-               gpio_set_value(nreset_gpio, 0);
+       if (gpio_is_valid(tpo_td043->nreset_gpio))
+               gpio_set_value(tpo_td043->nreset_gpio, 0);
 
        /* wait for at least 2 vsyncs before cutting off power */
        msleep(50);
@@ -407,7 +411,7 @@ static void tpo_td043_disable(struct omap_dss_device *dssdev)
 static int tpo_td043_probe(struct omap_dss_device *dssdev)
 {
        struct tpo_td043_device *tpo_td043 = g_tpo_td043;
-       int nreset_gpio = dssdev->reset_gpio;
+       struct panel_tpo_td043_data *pdata = get_panel_data(dssdev);
        int ret = 0;
 
        dev_dbg(&dssdev->dev, "probe\n");
@@ -417,6 +421,11 @@ static int tpo_td043_probe(struct omap_dss_device *dssdev)
                return -ENODEV;
        }
 
+       if (!pdata)
+               return -EINVAL;
+
+       tpo_td043->nreset_gpio = pdata->nreset_gpio;
+
        dssdev->panel.timings = tpo_td043_timings;
        dssdev->ctrl.pixel_size = 24;
 
@@ -430,9 +439,10 @@ static int tpo_td043_probe(struct omap_dss_device *dssdev)
                goto fail_regulator;
        }
 
-       if (gpio_is_valid(nreset_gpio)) {
-               ret = gpio_request_one(nreset_gpio, GPIOF_OUT_INIT_LOW,
-                                       "lcd reset");
+       if (gpio_is_valid(tpo_td043->nreset_gpio)) {
+               ret = devm_gpio_request_one(&dssdev->dev,
+                               tpo_td043->nreset_gpio, GPIOF_OUT_INIT_LOW,
+                               "lcd reset");
                if (ret < 0) {
                        dev_err(&dssdev->dev, "couldn't request reset GPIO\n");
                        goto fail_gpio_req;
@@ -457,14 +467,11 @@ fail_regulator:
 static void tpo_td043_remove(struct omap_dss_device *dssdev)
 {
        struct tpo_td043_device *tpo_td043 = dev_get_drvdata(&dssdev->dev);
-       int nreset_gpio = dssdev->reset_gpio;
 
        dev_dbg(&dssdev->dev, "remove\n");
 
        sysfs_remove_group(&dssdev->dev.kobj, &tpo_td043_attr_group);
        regulator_put(tpo_td043->vcc_reg);
-       if (gpio_is_valid(nreset_gpio))
-               gpio_free(nreset_gpio);
 }
 
 static void tpo_td043_set_timings(struct omap_dss_device *dssdev,
@@ -527,7 +534,6 @@ static int tpo_td043_spi_probe(struct spi_device *spi)
                return -ENOMEM;
 
        tpo_td043->spi = spi;
-       tpo_td043->nreset_gpio = dssdev->reset_gpio;
        dev_set_drvdata(&spi->dev, tpo_td043);
        g_tpo_td043 = tpo_td043;