aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/imx/parallel-display.c
diff options
context:
space:
mode:
authorLiu Ying <gnuiyl@gmail.com>2016-07-08 05:40:58 -0400
committerPhilipp Zabel <p.zabel@pengutronix.de>2016-07-12 12:23:58 -0400
commit032003c5cd744e8e0baf5430fc5b3fd5462208e4 (patch)
tree0ad9cbdfb21a3a336f2d4470881a4bce1b7b9a4b /drivers/gpu/drm/imx/parallel-display.c
parentae2531ab70864c00b49a986cd8bdc5eec7ec881a (diff)
drm/imx: Remove encoders' ->prepare callbacks
The main task of imx encoders' ->prepare callbacks is to set bus_format, bus_flags, di_vsync_pin and di_hsync_pin. We may create a structure named imx_encoder to cache them. The atomic encoder callback ->disable may replace ->prepare later, so let's remove ->prepare. Signed-off-by: Liu Ying <gnuiyl@gmail.com> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Diffstat (limited to 'drivers/gpu/drm/imx/parallel-display.c')
-rw-r--r--drivers/gpu/drm/imx/parallel-display.c56
1 files changed, 29 insertions, 27 deletions
diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
index 9fe88c9b4b0d..7374d824a6d1 100644
--- a/drivers/gpu/drm/imx/parallel-display.c
+++ b/drivers/gpu/drm/imx/parallel-display.c
@@ -27,15 +27,15 @@
27#include "imx-drm.h" 27#include "imx-drm.h"
28 28
29#define con_to_imxpd(x) container_of(x, struct imx_parallel_display, connector) 29#define con_to_imxpd(x) container_of(x, struct imx_parallel_display, connector)
30#define enc_to_imxpd(x) container_of(x, struct imx_parallel_display, encoder) 30#define imx_enc_to_imxpd(x) \
31 container_of(x, struct imx_parallel_display, imx_encoder)
31 32
32struct imx_parallel_display { 33struct imx_parallel_display {
33 struct drm_connector connector; 34 struct drm_connector connector;
34 struct drm_encoder encoder; 35 struct imx_drm_encoder imx_encoder;
35 struct device *dev; 36 struct device *dev;
36 void *edid; 37 void *edid;
37 int edid_len; 38 int edid_len;
38 u32 bus_format;
39 struct drm_display_mode mode; 39 struct drm_display_mode mode;
40 struct drm_panel *panel; 40 struct drm_panel *panel;
41}; 41};
@@ -57,8 +57,9 @@ static int imx_pd_connector_get_modes(struct drm_connector *connector)
57 struct drm_display_info *di = &connector->display_info; 57 struct drm_display_info *di = &connector->display_info;
58 58
59 num_modes = imxpd->panel->funcs->get_modes(imxpd->panel); 59 num_modes = imxpd->panel->funcs->get_modes(imxpd->panel);
60 if (!imxpd->bus_format && di->num_bus_formats) 60 if (!imxpd->imx_encoder.bus_format && di->num_bus_formats)
61 imxpd->bus_format = di->bus_formats[0]; 61 imxpd->imx_encoder.bus_format = di->bus_formats[0];
62 imxpd->imx_encoder.bus_flags = di->bus_flags;
62 if (num_modes > 0) 63 if (num_modes > 0)
63 return num_modes; 64 return num_modes;
64 } 65 }
@@ -88,12 +89,13 @@ static struct drm_encoder *imx_pd_connector_best_encoder(
88{ 89{
89 struct imx_parallel_display *imxpd = con_to_imxpd(connector); 90 struct imx_parallel_display *imxpd = con_to_imxpd(connector);
90 91
91 return &imxpd->encoder; 92 return &imxpd->imx_encoder.encoder;
92} 93}
93 94
94static void imx_pd_encoder_dpms(struct drm_encoder *encoder, int mode) 95static void imx_pd_encoder_dpms(struct drm_encoder *encoder, int mode)
95{ 96{
96 struct imx_parallel_display *imxpd = enc_to_imxpd(encoder); 97 struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder);
98 struct imx_parallel_display *imxpd = imx_enc_to_imxpd(imx_encoder);
97 99
98 if (mode != DRM_MODE_DPMS_ON) 100 if (mode != DRM_MODE_DPMS_ON)
99 drm_panel_disable(imxpd->panel); 101 drm_panel_disable(imxpd->panel);
@@ -101,16 +103,10 @@ static void imx_pd_encoder_dpms(struct drm_encoder *encoder, int mode)
101 drm_panel_enable(imxpd->panel); 103 drm_panel_enable(imxpd->panel);
102} 104}
103 105
104static void imx_pd_encoder_prepare(struct drm_encoder *encoder)
105{
106 struct imx_parallel_display *imxpd = enc_to_imxpd(encoder);
107 imx_drm_set_bus_config(encoder, imxpd->bus_format, 2, 3,
108 imxpd->connector.display_info.bus_flags);
109}
110
111static void imx_pd_encoder_commit(struct drm_encoder *encoder) 106static void imx_pd_encoder_commit(struct drm_encoder *encoder)
112{ 107{
113 struct imx_parallel_display *imxpd = enc_to_imxpd(encoder); 108 struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder);
109 struct imx_parallel_display *imxpd = imx_enc_to_imxpd(imx_encoder);
114 110
115 drm_panel_prepare(imxpd->panel); 111 drm_panel_prepare(imxpd->panel);
116 drm_panel_enable(imxpd->panel); 112 drm_panel_enable(imxpd->panel);
@@ -124,7 +120,8 @@ static void imx_pd_encoder_mode_set(struct drm_encoder *encoder,
124 120
125static void imx_pd_encoder_disable(struct drm_encoder *encoder) 121static void imx_pd_encoder_disable(struct drm_encoder *encoder)
126{ 122{
127 struct imx_parallel_display *imxpd = enc_to_imxpd(encoder); 123 struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder);
124 struct imx_parallel_display *imxpd = imx_enc_to_imxpd(imx_encoder);
128 125
129 drm_panel_disable(imxpd->panel); 126 drm_panel_disable(imxpd->panel);
130 drm_panel_unprepare(imxpd->panel); 127 drm_panel_unprepare(imxpd->panel);
@@ -151,7 +148,6 @@ static const struct drm_encoder_funcs imx_pd_encoder_funcs = {
151 148
152static const struct drm_encoder_helper_funcs imx_pd_encoder_helper_funcs = { 149static const struct drm_encoder_helper_funcs imx_pd_encoder_helper_funcs = {
153 .dpms = imx_pd_encoder_dpms, 150 .dpms = imx_pd_encoder_dpms,
154 .prepare = imx_pd_encoder_prepare,
155 .commit = imx_pd_encoder_commit, 151 .commit = imx_pd_encoder_commit,
156 .mode_set = imx_pd_encoder_mode_set, 152 .mode_set = imx_pd_encoder_mode_set,
157 .disable = imx_pd_encoder_disable, 153 .disable = imx_pd_encoder_disable,
@@ -162,7 +158,7 @@ static int imx_pd_register(struct drm_device *drm,
162{ 158{
163 int ret; 159 int ret;
164 160
165 ret = imx_drm_encoder_parse_of(drm, &imxpd->encoder, 161 ret = imx_drm_encoder_parse_of(drm, &imxpd->imx_encoder.encoder,
166 imxpd->dev->of_node); 162 imxpd->dev->of_node);
167 if (ret) 163 if (ret)
168 return ret; 164 return ret;
@@ -174,9 +170,10 @@ static int imx_pd_register(struct drm_device *drm,
174 */ 170 */
175 imxpd->connector.dpms = DRM_MODE_DPMS_OFF; 171 imxpd->connector.dpms = DRM_MODE_DPMS_OFF;
176 172
177 drm_encoder_helper_add(&imxpd->encoder, &imx_pd_encoder_helper_funcs); 173 drm_encoder_helper_add(&imxpd->imx_encoder.encoder,
178 drm_encoder_init(drm, &imxpd->encoder, &imx_pd_encoder_funcs, 174 &imx_pd_encoder_helper_funcs);
179 DRM_MODE_ENCODER_NONE, NULL); 175 drm_encoder_init(drm, &imxpd->imx_encoder.encoder,
176 &imx_pd_encoder_funcs, DRM_MODE_ENCODER_NONE, NULL);
180 177
181 drm_connector_helper_add(&imxpd->connector, 178 drm_connector_helper_add(&imxpd->connector,
182 &imx_pd_connector_helper_funcs); 179 &imx_pd_connector_helper_funcs);
@@ -186,7 +183,8 @@ static int imx_pd_register(struct drm_device *drm,
186 if (imxpd->panel) 183 if (imxpd->panel)
187 drm_panel_attach(imxpd->panel, &imxpd->connector); 184 drm_panel_attach(imxpd->panel, &imxpd->connector);
188 185
189 drm_mode_connector_attach_encoder(&imxpd->connector, &imxpd->encoder); 186 drm_mode_connector_attach_encoder(&imxpd->connector,
187 &imxpd->imx_encoder.encoder);
190 188
191 return 0; 189 return 0;
192} 190}
@@ -199,6 +197,7 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
199 const u8 *edidp; 197 const u8 *edidp;
200 struct imx_parallel_display *imxpd; 198 struct imx_parallel_display *imxpd;
201 int ret; 199 int ret;
200 u32 bus_format = 0;
202 const char *fmt; 201 const char *fmt;
203 202
204 imxpd = devm_kzalloc(dev, sizeof(*imxpd), GFP_KERNEL); 203 imxpd = devm_kzalloc(dev, sizeof(*imxpd), GFP_KERNEL);
@@ -212,14 +211,17 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
212 ret = of_property_read_string(np, "interface-pix-fmt", &fmt); 211 ret = of_property_read_string(np, "interface-pix-fmt", &fmt);
213 if (!ret) { 212 if (!ret) {
214 if (!strcmp(fmt, "rgb24")) 213 if (!strcmp(fmt, "rgb24"))
215 imxpd->bus_format = MEDIA_BUS_FMT_RGB888_1X24; 214 bus_format = MEDIA_BUS_FMT_RGB888_1X24;
216 else if (!strcmp(fmt, "rgb565")) 215 else if (!strcmp(fmt, "rgb565"))
217 imxpd->bus_format = MEDIA_BUS_FMT_RGB565_1X16; 216 bus_format = MEDIA_BUS_FMT_RGB565_1X16;
218 else if (!strcmp(fmt, "bgr666")) 217 else if (!strcmp(fmt, "bgr666"))
219 imxpd->bus_format = MEDIA_BUS_FMT_RGB666_1X18; 218 bus_format = MEDIA_BUS_FMT_RGB666_1X18;
220 else if (!strcmp(fmt, "lvds666")) 219 else if (!strcmp(fmt, "lvds666"))
221 imxpd->bus_format = MEDIA_BUS_FMT_RGB666_1X24_CPADHI; 220 bus_format = MEDIA_BUS_FMT_RGB666_1X24_CPADHI;
222 } 221 }
222 imxpd->imx_encoder.bus_format = bus_format;
223 imxpd->imx_encoder.di_hsync_pin = 2;
224 imxpd->imx_encoder.di_vsync_pin = 3;
223 225
224 /* port@1 is the output port */ 226 /* port@1 is the output port */
225 ep = of_graph_get_endpoint_by_regs(np, 1, -1); 227 ep = of_graph_get_endpoint_by_regs(np, 1, -1);
@@ -252,7 +254,7 @@ static void imx_pd_unbind(struct device *dev, struct device *master,
252{ 254{
253 struct imx_parallel_display *imxpd = dev_get_drvdata(dev); 255 struct imx_parallel_display *imxpd = dev_get_drvdata(dev);
254 256
255 imxpd->encoder.funcs->destroy(&imxpd->encoder); 257 imxpd->imx_encoder.encoder.funcs->destroy(&imxpd->imx_encoder.encoder);
256 imxpd->connector.funcs->destroy(&imxpd->connector); 258 imxpd->connector.funcs->destroy(&imxpd->connector);
257 259
258 kfree(imxpd->edid); 260 kfree(imxpd->edid);