diff options
author | Liu Ying <gnuiyl@gmail.com> | 2016-07-08 05:40:58 -0400 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2016-07-12 12:23:58 -0400 |
commit | 032003c5cd744e8e0baf5430fc5b3fd5462208e4 (patch) | |
tree | 0ad9cbdfb21a3a336f2d4470881a4bce1b7b9a4b /drivers/gpu/drm/imx/parallel-display.c | |
parent | ae2531ab70864c00b49a986cd8bdc5eec7ec881a (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.c | 56 |
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 | ||
32 | struct imx_parallel_display { | 33 | struct 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 | ||
94 | static void imx_pd_encoder_dpms(struct drm_encoder *encoder, int mode) | 95 | static 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 | ||
104 | static 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 | |||
111 | static void imx_pd_encoder_commit(struct drm_encoder *encoder) | 106 | static 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 | ||
125 | static void imx_pd_encoder_disable(struct drm_encoder *encoder) | 121 | static 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 | ||
152 | static const struct drm_encoder_helper_funcs imx_pd_encoder_helper_funcs = { | 149 | static 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); |