Skip to content

Commit

Permalink
OMAPDSS: tpo-td043 panel: handle gpios in panel driver
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Archit Taneja authored and Tomi Valkeinen committed Apr 3, 2013
1 parent be9a006 commit 7eab07e
Showing 1 changed file with 21 additions and 15 deletions.
36 changes: 21 additions & 15 deletions drivers/video/omap2/displays/panel-tpo-td043mtea1.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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");
Expand All @@ -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;

Expand All @@ -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;
Expand All @@ -457,14 +467,11 @@ static int tpo_td043_probe(struct omap_dss_device *dssdev)
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,
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit 7eab07e

Please sign in to comment.