aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2013-02-12 04:29:17 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2013-04-03 08:19:46 -0400
commit0801711e1eea061cfdec2ad5bf1be687f7098c06 (patch)
treecbf3f2277ce8b7084a91f24e5e1738940792569b
parentba7b2d987dea0847782e8ad9a7bcc9429896d7ac (diff)
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: Tomi Valkeinen <tomi.valkeinen@ti.com> Signed-off-by: Archit Taneja <archit@ti.com>
-rw-r--r--drivers/video/omap2/displays/panel-generic-dpi.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/drivers/video/omap2/displays/panel-generic-dpi.c b/drivers/video/omap2/displays/panel-generic-dpi.c
index 5fb8063e2559..5c75e4de073c 100644
--- a/drivers/video/omap2/displays/panel-generic-dpi.c
+++ b/drivers/video/omap2/displays/panel-generic-dpi.c
@@ -33,6 +33,7 @@
33#include <linux/module.h> 33#include <linux/module.h>
34#include <linux/delay.h> 34#include <linux/delay.h>
35#include <linux/slab.h> 35#include <linux/slab.h>
36#include <linux/gpio.h>
36#include <video/omapdss.h> 37#include <video/omapdss.h>
37 38
38#include <video/omap-panel-data.h> 39#include <video/omap-panel-data.h>
@@ -533,7 +534,7 @@ static inline struct panel_generic_dpi_data
533 534
534static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev) 535static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev)
535{ 536{
536 int r; 537 int r, i;
537 struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev); 538 struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
538 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev); 539 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
539 struct panel_config *panel_config = drv_data->panel_config; 540 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 goto err1; 559 goto err1;
559 } 560 }
560 561
562 for (i = 0; i < panel_data->num_gpios; ++i) {
563 gpio_set_value_cansleep(panel_data->gpios[i],
564 panel_data->gpio_invert[i] ? 0 : 1);
565 }
566
561 return 0; 567 return 0;
562err1: 568err1:
563 omapdss_dpi_display_disable(dssdev); 569 omapdss_dpi_display_disable(dssdev);
@@ -570,10 +576,16 @@ static void generic_dpi_panel_power_off(struct omap_dss_device *dssdev)
570 struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev); 576 struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
571 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev); 577 struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
572 struct panel_config *panel_config = drv_data->panel_config; 578 struct panel_config *panel_config = drv_data->panel_config;
579 int i;
573 580
574 if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 581 if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
575 return; 582 return;
576 583
584 for (i = panel_data->num_gpios - 1; i >= 0; --i) {
585 gpio_set_value_cansleep(panel_data->gpios[i],
586 panel_data->gpio_invert[i] ? 1 : 0);
587 }
588
577 if (panel_data->platform_disable) 589 if (panel_data->platform_disable)
578 panel_data->platform_disable(dssdev); 590 panel_data->platform_disable(dssdev);
579 591
@@ -589,7 +601,7 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
589 struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev); 601 struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
590 struct panel_config *panel_config = NULL; 602 struct panel_config *panel_config = NULL;
591 struct panel_drv_data *drv_data = NULL; 603 struct panel_drv_data *drv_data = NULL;
592 int i; 604 int i, r;
593 605
594 dev_dbg(&dssdev->dev, "probe\n"); 606 dev_dbg(&dssdev->dev, "probe\n");
595 607
@@ -606,6 +618,15 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
606 if (!panel_config) 618 if (!panel_config)
607 return -EINVAL; 619 return -EINVAL;
608 620
621 for (i = 0; i < panel_data->num_gpios; ++i) {
622 r = devm_gpio_request_one(&dssdev->dev, panel_data->gpios[i],
623 panel_data->gpio_invert[i] ?
624 GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW,
625 "panel gpio");
626 if (r)
627 return r;
628 }
629
609 dssdev->panel.timings = panel_config->timings; 630 dssdev->panel.timings = panel_config->timings;
610 631
611 drv_data = devm_kzalloc(&dssdev->dev, sizeof(*drv_data), GFP_KERNEL); 632 drv_data = devm_kzalloc(&dssdev->dev, sizeof(*drv_data), GFP_KERNEL);