Commit 0801711e authored by Tomi Valkeinen's avatar Tomi Valkeinen

OMAPDSS: generic dpi panel: handle gpios in panel driver

The generic dpi 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.

Add a generic way of passing gpio information to the generic dpi panel driver
via it's platform_data. This information includes the number of gpios used by
the panel, the gpio number and logic level (active high/low) for each gpio. This
gpio data will be used by the driver to request and configure the gpios required
by the panel.

This will help in removing the need for the panel drivers to have platform
related callbacks.
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
Signed-off-by: default avatarArchit Taneja <archit@ti.com>
parent ba7b2d98
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/gpio.h>
#include <video/omapdss.h> #include <video/omapdss.h>
#include <video/omap-panel-data.h> #include <video/omap-panel-data.h>
...@@ -533,7 +534,7 @@ static inline struct panel_generic_dpi_data ...@@ -533,7 +534,7 @@ static inline struct panel_generic_dpi_data
static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev) static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev)
{ {
int r; int r, i;
struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev); struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev); struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
struct panel_config *panel_config = drv_data->panel_config; struct panel_config *panel_config = drv_data->panel_config;
...@@ -558,6 +559,11 @@ static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev) ...@@ -558,6 +559,11 @@ static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev)
goto err1; goto err1;
} }
for (i = 0; i < panel_data->num_gpios; ++i) {
gpio_set_value_cansleep(panel_data->gpios[i],
panel_data->gpio_invert[i] ? 0 : 1);
}
return 0; return 0;
err1: err1:
omapdss_dpi_display_disable(dssdev); omapdss_dpi_display_disable(dssdev);
...@@ -570,10 +576,16 @@ static void generic_dpi_panel_power_off(struct omap_dss_device *dssdev) ...@@ -570,10 +576,16 @@ static void generic_dpi_panel_power_off(struct omap_dss_device *dssdev)
struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev); struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev); struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
struct panel_config *panel_config = drv_data->panel_config; struct panel_config *panel_config = drv_data->panel_config;
int i;
if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
return; return;
for (i = panel_data->num_gpios - 1; i >= 0; --i) {
gpio_set_value_cansleep(panel_data->gpios[i],
panel_data->gpio_invert[i] ? 1 : 0);
}
if (panel_data->platform_disable) if (panel_data->platform_disable)
panel_data->platform_disable(dssdev); panel_data->platform_disable(dssdev);
...@@ -589,7 +601,7 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev) ...@@ -589,7 +601,7 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev); struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
struct panel_config *panel_config = NULL; struct panel_config *panel_config = NULL;
struct panel_drv_data *drv_data = NULL; struct panel_drv_data *drv_data = NULL;
int i; int i, r;
dev_dbg(&dssdev->dev, "probe\n"); dev_dbg(&dssdev->dev, "probe\n");
...@@ -606,6 +618,15 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev) ...@@ -606,6 +618,15 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
if (!panel_config) if (!panel_config)
return -EINVAL; return -EINVAL;
for (i = 0; i < panel_data->num_gpios; ++i) {
r = devm_gpio_request_one(&dssdev->dev, panel_data->gpios[i],
panel_data->gpio_invert[i] ?
GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW,
"panel gpio");
if (r)
return r;
}
dssdev->panel.timings = panel_config->timings; dssdev->panel.timings = panel_config->timings;
drv_data = devm_kzalloc(&dssdev->dev, sizeof(*drv_data), GFP_KERNEL); drv_data = devm_kzalloc(&dssdev->dev, sizeof(*drv_data), GFP_KERNEL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment