aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/omap2/displays/panel-lgphilips-lb035q02.c')
-rw-r--r--drivers/video/omap2/displays/panel-lgphilips-lb035q02.c58
1 files changed, 39 insertions, 19 deletions
diff --git a/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c b/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
index 6e5abe8fd2dd..4ea6548c0ae9 100644
--- a/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
@@ -20,8 +20,10 @@
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/spi/spi.h> 21#include <linux/spi/spi.h>
22#include <linux/mutex.h> 22#include <linux/mutex.h>
23#include <linux/gpio.h>
23 24
24#include <video/omapdss.h> 25#include <video/omapdss.h>
26#include <video/omap-panel-data.h>
25 27
26struct lb035q02_data { 28struct lb035q02_data {
27 struct mutex lock; 29 struct mutex lock;
@@ -48,9 +50,16 @@ static struct omap_video_timings lb035q02_timings = {
48 .sync_pclk_edge = OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES, 50 .sync_pclk_edge = OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES,
49}; 51};
50 52
53static inline struct panel_generic_dpi_data
54*get_panel_data(const struct omap_dss_device *dssdev)
55{
56 return (struct panel_generic_dpi_data *) dssdev->data;
57}
58
51static int lb035q02_panel_power_on(struct omap_dss_device *dssdev) 59static int lb035q02_panel_power_on(struct omap_dss_device *dssdev)
52{ 60{
53 int r; 61 struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
62 int r, i;
54 63
55 if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) 64 if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
56 return 0; 65 return 0;
@@ -62,54 +71,65 @@ static int lb035q02_panel_power_on(struct omap_dss_device *dssdev)
62 if (r) 71 if (r)
63 goto err0; 72 goto err0;
64 73
65 if (dssdev->platform_enable) { 74 for (i = 0; i < panel_data->num_gpios; ++i) {
66 r = dssdev->platform_enable(dssdev); 75 gpio_set_value_cansleep(panel_data->gpios[i],
67 if (r) 76 panel_data->gpio_invert[i] ? 0 : 1);
68 goto err1;
69 } 77 }
70 78
71 return 0; 79 return 0;
72err1: 80
73 omapdss_dpi_display_disable(dssdev);
74err0: 81err0:
75 return r; 82 return r;
76} 83}
77 84
78static void lb035q02_panel_power_off(struct omap_dss_device *dssdev) 85static void lb035q02_panel_power_off(struct omap_dss_device *dssdev)
79{ 86{
87 struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
88 int i;
89
80 if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 90 if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
81 return; 91 return;
82 92
83 if (dssdev->platform_disable) 93 for (i = panel_data->num_gpios - 1; i >= 0; --i) {
84 dssdev->platform_disable(dssdev); 94 gpio_set_value_cansleep(panel_data->gpios[i],
95 panel_data->gpio_invert[i] ? 1 : 0);
96 }
85 97
86 omapdss_dpi_display_disable(dssdev); 98 omapdss_dpi_display_disable(dssdev);
87} 99}
88 100
89static int lb035q02_panel_probe(struct omap_dss_device *dssdev) 101static int lb035q02_panel_probe(struct omap_dss_device *dssdev)
90{ 102{
103 struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
91 struct lb035q02_data *ld; 104 struct lb035q02_data *ld;
92 int r; 105 int r, i;
106
107 if (!panel_data)
108 return -EINVAL;
93 109
94 dssdev->panel.timings = lb035q02_timings; 110 dssdev->panel.timings = lb035q02_timings;
95 111
96 ld = kzalloc(sizeof(*ld), GFP_KERNEL); 112 ld = devm_kzalloc(&dssdev->dev, sizeof(*ld), GFP_KERNEL);
97 if (!ld) { 113 if (!ld)
98 r = -ENOMEM; 114 return -ENOMEM;
99 goto err; 115
116 for (i = 0; i < panel_data->num_gpios; ++i) {
117 r = devm_gpio_request_one(&dssdev->dev, panel_data->gpios[i],
118 panel_data->gpio_invert[i] ?
119 GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW,
120 "panel gpio");
121 if (r)
122 return r;
100 } 123 }
124
101 mutex_init(&ld->lock); 125 mutex_init(&ld->lock);
102 dev_set_drvdata(&dssdev->dev, ld); 126 dev_set_drvdata(&dssdev->dev, ld);
127
103 return 0; 128 return 0;
104err:
105 return r;
106} 129}
107 130
108static void lb035q02_panel_remove(struct omap_dss_device *dssdev) 131static void lb035q02_panel_remove(struct omap_dss_device *dssdev)
109{ 132{
110 struct lb035q02_data *ld = dev_get_drvdata(&dssdev->dev);
111
112 kfree(ld);
113} 133}
114 134
115static int lb035q02_panel_enable(struct omap_dss_device *dssdev) 135static int lb035q02_panel_enable(struct omap_dss_device *dssdev)