diff options
Diffstat (limited to 'drivers/video/omap2/displays/panel-lgphilips-lb035q02.c')
-rw-r--r-- | drivers/video/omap2/displays/panel-lgphilips-lb035q02.c | 58 |
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 | ||
26 | struct lb035q02_data { | 28 | struct 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 | ||
53 | static 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 | |||
51 | static int lb035q02_panel_power_on(struct omap_dss_device *dssdev) | 59 | static 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; |
72 | err1: | 80 | |
73 | omapdss_dpi_display_disable(dssdev); | ||
74 | err0: | 81 | err0: |
75 | return r; | 82 | return r; |
76 | } | 83 | } |
77 | 84 | ||
78 | static void lb035q02_panel_power_off(struct omap_dss_device *dssdev) | 85 | static 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 | ||
89 | static int lb035q02_panel_probe(struct omap_dss_device *dssdev) | 101 | static 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; |
104 | err: | ||
105 | return r; | ||
106 | } | 129 | } |
107 | 130 | ||
108 | static void lb035q02_panel_remove(struct omap_dss_device *dssdev) | 131 | static 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 | ||
115 | static int lb035q02_panel_enable(struct omap_dss_device *dssdev) | 135 | static int lb035q02_panel_enable(struct omap_dss_device *dssdev) |