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/imx-ldb.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/imx-ldb.c')
-rw-r--r-- | drivers/gpu/drm/imx/imx-ldb.c | 118 |
1 files changed, 60 insertions, 58 deletions
diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c index 12bf368ae6df..6e110bba35cb 100644 --- a/drivers/gpu/drm/imx/imx-ldb.c +++ b/drivers/gpu/drm/imx/imx-ldb.c | |||
@@ -51,14 +51,15 @@ | |||
51 | #define LDB_BGREF_RMODE_INT (1 << 15) | 51 | #define LDB_BGREF_RMODE_INT (1 << 15) |
52 | 52 | ||
53 | #define con_to_imx_ldb_ch(x) container_of(x, struct imx_ldb_channel, connector) | 53 | #define con_to_imx_ldb_ch(x) container_of(x, struct imx_ldb_channel, connector) |
54 | #define enc_to_imx_ldb_ch(x) container_of(x, struct imx_ldb_channel, encoder) | 54 | #define imx_enc_to_imx_ldb_ch(x) \ |
55 | container_of(x, struct imx_ldb_channel, imx_encoder) | ||
55 | 56 | ||
56 | struct imx_ldb; | 57 | struct imx_ldb; |
57 | 58 | ||
58 | struct imx_ldb_channel { | 59 | struct imx_ldb_channel { |
59 | struct imx_ldb *ldb; | 60 | struct imx_ldb *ldb; |
60 | struct drm_connector connector; | 61 | struct drm_connector connector; |
61 | struct drm_encoder encoder; | 62 | struct imx_drm_encoder imx_encoder; |
62 | struct drm_panel *panel; | 63 | struct drm_panel *panel; |
63 | struct device_node *child; | 64 | struct device_node *child; |
64 | struct i2c_adapter *ddc; | 65 | struct i2c_adapter *ddc; |
@@ -67,7 +68,6 @@ struct imx_ldb_channel { | |||
67 | int edid_len; | 68 | int edid_len; |
68 | struct drm_display_mode mode; | 69 | struct drm_display_mode mode; |
69 | int mode_valid; | 70 | int mode_valid; |
70 | int bus_format; | ||
71 | }; | 71 | }; |
72 | 72 | ||
73 | struct bus_mux { | 73 | struct bus_mux { |
@@ -94,6 +94,35 @@ static enum drm_connector_status imx_ldb_connector_detect( | |||
94 | return connector_status_connected; | 94 | return connector_status_connected; |
95 | } | 95 | } |
96 | 96 | ||
97 | static void imx_ldb_bus_format_translation(struct imx_ldb_channel *imx_ldb_ch, | ||
98 | u32 bus_format) | ||
99 | { | ||
100 | struct imx_ldb *ldb = imx_ldb_ch->ldb; | ||
101 | int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN; | ||
102 | |||
103 | switch (bus_format) { | ||
104 | case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: | ||
105 | imx_ldb_ch->imx_encoder.bus_format = MEDIA_BUS_FMT_RGB666_1X18; | ||
106 | break; | ||
107 | case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: | ||
108 | imx_ldb_ch->imx_encoder.bus_format = MEDIA_BUS_FMT_RGB888_1X24; | ||
109 | if (imx_ldb_ch->chno == 0 || dual) | ||
110 | ldb->ldb_ctrl |= LDB_DATA_WIDTH_CH0_24; | ||
111 | if (imx_ldb_ch->chno == 1 || dual) | ||
112 | ldb->ldb_ctrl |= LDB_DATA_WIDTH_CH1_24; | ||
113 | break; | ||
114 | case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: | ||
115 | imx_ldb_ch->imx_encoder.bus_format = MEDIA_BUS_FMT_RGB888_1X24; | ||
116 | if (imx_ldb_ch->chno == 0 || dual) | ||
117 | ldb->ldb_ctrl |= LDB_DATA_WIDTH_CH0_24 | | ||
118 | LDB_BIT_MAP_CH0_JEIDA; | ||
119 | if (imx_ldb_ch->chno == 1 || dual) | ||
120 | ldb->ldb_ctrl |= LDB_DATA_WIDTH_CH1_24 | | ||
121 | LDB_BIT_MAP_CH1_JEIDA; | ||
122 | break; | ||
123 | } | ||
124 | } | ||
125 | |||
97 | static int imx_ldb_connector_get_modes(struct drm_connector *connector) | 126 | static int imx_ldb_connector_get_modes(struct drm_connector *connector) |
98 | { | 127 | { |
99 | struct imx_ldb_channel *imx_ldb_ch = con_to_imx_ldb_ch(connector); | 128 | struct imx_ldb_channel *imx_ldb_ch = con_to_imx_ldb_ch(connector); |
@@ -104,8 +133,9 @@ static int imx_ldb_connector_get_modes(struct drm_connector *connector) | |||
104 | struct drm_display_info *di = &connector->display_info; | 133 | struct drm_display_info *di = &connector->display_info; |
105 | 134 | ||
106 | num_modes = imx_ldb_ch->panel->funcs->get_modes(imx_ldb_ch->panel); | 135 | num_modes = imx_ldb_ch->panel->funcs->get_modes(imx_ldb_ch->panel); |
107 | if (!imx_ldb_ch->bus_format && di->num_bus_formats) | 136 | if (!imx_ldb_ch->imx_encoder.bus_format && di->num_bus_formats) |
108 | imx_ldb_ch->bus_format = di->bus_formats[0]; | 137 | imx_ldb_bus_format_translation(imx_ldb_ch, |
138 | di->bus_formats[0]); | ||
109 | if (num_modes > 0) | 139 | if (num_modes > 0) |
110 | return num_modes; | 140 | return num_modes; |
111 | } | 141 | } |
@@ -139,7 +169,7 @@ static struct drm_encoder *imx_ldb_connector_best_encoder( | |||
139 | { | 169 | { |
140 | struct imx_ldb_channel *imx_ldb_ch = con_to_imx_ldb_ch(connector); | 170 | struct imx_ldb_channel *imx_ldb_ch = con_to_imx_ldb_ch(connector); |
141 | 171 | ||
142 | return &imx_ldb_ch->encoder; | 172 | return &imx_ldb_ch->imx_encoder.encoder; |
143 | } | 173 | } |
144 | 174 | ||
145 | static void imx_ldb_encoder_dpms(struct drm_encoder *encoder, int mode) | 175 | static void imx_ldb_encoder_dpms(struct drm_encoder *encoder, int mode) |
@@ -174,45 +204,10 @@ static void imx_ldb_set_clock(struct imx_ldb *ldb, int mux, int chno, | |||
174 | chno); | 204 | chno); |
175 | } | 205 | } |
176 | 206 | ||
177 | static void imx_ldb_encoder_prepare(struct drm_encoder *encoder) | ||
178 | { | ||
179 | struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder); | ||
180 | struct imx_ldb *ldb = imx_ldb_ch->ldb; | ||
181 | int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN; | ||
182 | u32 bus_format; | ||
183 | |||
184 | switch (imx_ldb_ch->bus_format) { | ||
185 | default: | ||
186 | dev_warn(ldb->dev, | ||
187 | "could not determine data mapping, default to 18-bit \"spwg\"\n"); | ||
188 | /* fallthrough */ | ||
189 | case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: | ||
190 | bus_format = MEDIA_BUS_FMT_RGB666_1X18; | ||
191 | break; | ||
192 | case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: | ||
193 | bus_format = MEDIA_BUS_FMT_RGB888_1X24; | ||
194 | if (imx_ldb_ch->chno == 0 || dual) | ||
195 | ldb->ldb_ctrl |= LDB_DATA_WIDTH_CH0_24; | ||
196 | if (imx_ldb_ch->chno == 1 || dual) | ||
197 | ldb->ldb_ctrl |= LDB_DATA_WIDTH_CH1_24; | ||
198 | break; | ||
199 | case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: | ||
200 | bus_format = MEDIA_BUS_FMT_RGB888_1X24; | ||
201 | if (imx_ldb_ch->chno == 0 || dual) | ||
202 | ldb->ldb_ctrl |= LDB_DATA_WIDTH_CH0_24 | | ||
203 | LDB_BIT_MAP_CH0_JEIDA; | ||
204 | if (imx_ldb_ch->chno == 1 || dual) | ||
205 | ldb->ldb_ctrl |= LDB_DATA_WIDTH_CH1_24 | | ||
206 | LDB_BIT_MAP_CH1_JEIDA; | ||
207 | break; | ||
208 | } | ||
209 | |||
210 | imx_drm_set_bus_format(encoder, bus_format); | ||
211 | } | ||
212 | |||
213 | static void imx_ldb_encoder_commit(struct drm_encoder *encoder) | 207 | static void imx_ldb_encoder_commit(struct drm_encoder *encoder) |
214 | { | 208 | { |
215 | struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder); | 209 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); |
210 | struct imx_ldb_channel *imx_ldb_ch = imx_enc_to_imx_ldb_ch(imx_encoder); | ||
216 | struct imx_ldb *ldb = imx_ldb_ch->ldb; | 211 | struct imx_ldb *ldb = imx_ldb_ch->ldb; |
217 | int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN; | 212 | int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN; |
218 | int mux = drm_of_encoder_active_port_id(imx_ldb_ch->child, encoder); | 213 | int mux = drm_of_encoder_active_port_id(imx_ldb_ch->child, encoder); |
@@ -260,7 +255,8 @@ static void imx_ldb_encoder_mode_set(struct drm_encoder *encoder, | |||
260 | struct drm_display_mode *orig_mode, | 255 | struct drm_display_mode *orig_mode, |
261 | struct drm_display_mode *mode) | 256 | struct drm_display_mode *mode) |
262 | { | 257 | { |
263 | struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder); | 258 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); |
259 | struct imx_ldb_channel *imx_ldb_ch = imx_enc_to_imx_ldb_ch(imx_encoder); | ||
264 | struct imx_ldb *ldb = imx_ldb_ch->ldb; | 260 | struct imx_ldb *ldb = imx_ldb_ch->ldb; |
265 | int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN; | 261 | int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN; |
266 | unsigned long serial_clk; | 262 | unsigned long serial_clk; |
@@ -303,7 +299,8 @@ static void imx_ldb_encoder_mode_set(struct drm_encoder *encoder, | |||
303 | 299 | ||
304 | static void imx_ldb_encoder_disable(struct drm_encoder *encoder) | 300 | static void imx_ldb_encoder_disable(struct drm_encoder *encoder) |
305 | { | 301 | { |
306 | struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder); | 302 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); |
303 | struct imx_ldb_channel *imx_ldb_ch = imx_enc_to_imx_ldb_ch(imx_encoder); | ||
307 | struct imx_ldb *ldb = imx_ldb_ch->ldb; | 304 | struct imx_ldb *ldb = imx_ldb_ch->ldb; |
308 | int mux, ret; | 305 | int mux, ret; |
309 | 306 | ||
@@ -379,7 +376,6 @@ static const struct drm_encoder_funcs imx_ldb_encoder_funcs = { | |||
379 | 376 | ||
380 | static const struct drm_encoder_helper_funcs imx_ldb_encoder_helper_funcs = { | 377 | static const struct drm_encoder_helper_funcs imx_ldb_encoder_helper_funcs = { |
381 | .dpms = imx_ldb_encoder_dpms, | 378 | .dpms = imx_ldb_encoder_dpms, |
382 | .prepare = imx_ldb_encoder_prepare, | ||
383 | .commit = imx_ldb_encoder_commit, | 379 | .commit = imx_ldb_encoder_commit, |
384 | .mode_set = imx_ldb_encoder_mode_set, | 380 | .mode_set = imx_ldb_encoder_mode_set, |
385 | .disable = imx_ldb_encoder_disable, | 381 | .disable = imx_ldb_encoder_disable, |
@@ -406,7 +402,7 @@ static int imx_ldb_register(struct drm_device *drm, | |||
406 | struct imx_ldb *ldb = imx_ldb_ch->ldb; | 402 | struct imx_ldb *ldb = imx_ldb_ch->ldb; |
407 | int ret; | 403 | int ret; |
408 | 404 | ||
409 | ret = imx_drm_encoder_parse_of(drm, &imx_ldb_ch->encoder, | 405 | ret = imx_drm_encoder_parse_of(drm, &imx_ldb_ch->imx_encoder.encoder, |
410 | imx_ldb_ch->child); | 406 | imx_ldb_ch->child); |
411 | if (ret) | 407 | if (ret) |
412 | return ret; | 408 | return ret; |
@@ -421,10 +417,10 @@ static int imx_ldb_register(struct drm_device *drm, | |||
421 | return ret; | 417 | return ret; |
422 | } | 418 | } |
423 | 419 | ||
424 | drm_encoder_helper_add(&imx_ldb_ch->encoder, | 420 | drm_encoder_helper_add(&imx_ldb_ch->imx_encoder.encoder, |
425 | &imx_ldb_encoder_helper_funcs); | 421 | &imx_ldb_encoder_helper_funcs); |
426 | drm_encoder_init(drm, &imx_ldb_ch->encoder, &imx_ldb_encoder_funcs, | 422 | drm_encoder_init(drm, &imx_ldb_ch->imx_encoder.encoder, |
427 | DRM_MODE_ENCODER_LVDS, NULL); | 423 | &imx_ldb_encoder_funcs, DRM_MODE_ENCODER_LVDS, NULL); |
428 | 424 | ||
429 | drm_connector_helper_add(&imx_ldb_ch->connector, | 425 | drm_connector_helper_add(&imx_ldb_ch->connector, |
430 | &imx_ldb_connector_helper_funcs); | 426 | &imx_ldb_connector_helper_funcs); |
@@ -435,7 +431,7 @@ static int imx_ldb_register(struct drm_device *drm, | |||
435 | drm_panel_attach(imx_ldb_ch->panel, &imx_ldb_ch->connector); | 431 | drm_panel_attach(imx_ldb_ch->panel, &imx_ldb_ch->connector); |
436 | 432 | ||
437 | drm_mode_connector_attach_encoder(&imx_ldb_ch->connector, | 433 | drm_mode_connector_attach_encoder(&imx_ldb_ch->connector, |
438 | &imx_ldb_ch->encoder); | 434 | &imx_ldb_ch->imx_encoder.encoder); |
439 | 435 | ||
440 | return 0; | 436 | return 0; |
441 | } | 437 | } |
@@ -564,6 +560,7 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data) | |||
564 | struct imx_ldb_channel *channel; | 560 | struct imx_ldb_channel *channel; |
565 | struct device_node *ddc_node; | 561 | struct device_node *ddc_node; |
566 | struct device_node *ep; | 562 | struct device_node *ep; |
563 | int bus_format; | ||
567 | 564 | ||
568 | ret = of_property_read_u32(child, "reg", &i); | 565 | ret = of_property_read_u32(child, "reg", &i); |
569 | if (ret || i < 0 || i > 1) | 566 | if (ret || i < 0 || i > 1) |
@@ -636,21 +633,25 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data) | |||
636 | } | 633 | } |
637 | } | 634 | } |
638 | 635 | ||
639 | channel->bus_format = of_get_bus_format(dev, child); | 636 | bus_format = of_get_bus_format(dev, child); |
640 | if (channel->bus_format == -EINVAL) { | 637 | if (bus_format == -EINVAL) { |
641 | /* | 638 | /* |
642 | * If no bus format was specified in the device tree, | 639 | * If no bus format was specified in the device tree, |
643 | * we can still get it from the connected panel later. | 640 | * we can still get it from the connected panel later. |
644 | */ | 641 | */ |
645 | if (channel->panel && channel->panel->funcs && | 642 | if (channel->panel && channel->panel->funcs && |
646 | channel->panel->funcs->get_modes) | 643 | channel->panel->funcs->get_modes) |
647 | channel->bus_format = 0; | 644 | bus_format = 0; |
648 | } | 645 | } |
649 | if (channel->bus_format < 0) { | 646 | if (bus_format < 0) { |
650 | dev_err(dev, "could not determine data mapping: %d\n", | 647 | dev_err(dev, "could not determine data mapping: %d\n", |
651 | channel->bus_format); | 648 | bus_format); |
652 | return channel->bus_format; | 649 | return bus_format; |
653 | } | 650 | } |
651 | imx_ldb_bus_format_translation(channel, bus_format); | ||
652 | |||
653 | channel->imx_encoder.di_hsync_pin = 2; | ||
654 | channel->imx_encoder.di_vsync_pin = 3; | ||
654 | 655 | ||
655 | ret = imx_ldb_register(drm, channel); | 656 | ret = imx_ldb_register(drm, channel); |
656 | if (ret) | 657 | if (ret) |
@@ -675,7 +676,8 @@ static void imx_ldb_unbind(struct device *dev, struct device *master, | |||
675 | continue; | 676 | continue; |
676 | 677 | ||
677 | channel->connector.funcs->destroy(&channel->connector); | 678 | channel->connector.funcs->destroy(&channel->connector); |
678 | channel->encoder.funcs->destroy(&channel->encoder); | 679 | channel->imx_encoder.encoder.funcs->destroy( |
680 | &channel->imx_encoder.encoder); | ||
679 | 681 | ||
680 | kfree(channel->edid); | 682 | kfree(channel->edid); |
681 | i2c_put_adapter(channel->ddc); | 683 | i2c_put_adapter(channel->ddc); |