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 | |
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')
-rw-r--r-- | drivers/gpu/drm/imx/dw_hdmi-imx.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/imx-drm-core.c | 39 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/imx-drm.h | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/imx-ldb.c | 118 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/imx-tve.c | 58 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/ipuv3-crtc.c | 38 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/parallel-display.c | 56 |
7 files changed, 142 insertions, 203 deletions
diff --git a/drivers/gpu/drm/imx/dw_hdmi-imx.c b/drivers/gpu/drm/imx/dw_hdmi-imx.c index a24631fdf4ad..5f646748960a 100644 --- a/drivers/gpu/drm/imx/dw_hdmi-imx.c +++ b/drivers/gpu/drm/imx/dw_hdmi-imx.c | |||
@@ -22,9 +22,11 @@ | |||
22 | 22 | ||
23 | #include "imx-drm.h" | 23 | #include "imx-drm.h" |
24 | 24 | ||
25 | #define imx_enc_to_imx_hdmi(x) container_of(x, struct imx_hdmi, imx_encoder) | ||
26 | |||
25 | struct imx_hdmi { | 27 | struct imx_hdmi { |
26 | struct device *dev; | 28 | struct device *dev; |
27 | struct drm_encoder encoder; | 29 | struct imx_drm_encoder imx_encoder; |
28 | struct regmap *regmap; | 30 | struct regmap *regmap; |
29 | }; | 31 | }; |
30 | 32 | ||
@@ -117,7 +119,8 @@ static void dw_hdmi_imx_encoder_mode_set(struct drm_encoder *encoder, | |||
117 | 119 | ||
118 | static void dw_hdmi_imx_encoder_commit(struct drm_encoder *encoder) | 120 | static void dw_hdmi_imx_encoder_commit(struct drm_encoder *encoder) |
119 | { | 121 | { |
120 | struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder); | 122 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); |
123 | struct imx_hdmi *hdmi = imx_enc_to_imx_hdmi(imx_encoder); | ||
121 | int mux = drm_of_encoder_active_port_id(hdmi->dev->of_node, encoder); | 124 | int mux = drm_of_encoder_active_port_id(hdmi->dev->of_node, encoder); |
122 | 125 | ||
123 | regmap_update_bits(hdmi->regmap, IOMUXC_GPR3, | 126 | regmap_update_bits(hdmi->regmap, IOMUXC_GPR3, |
@@ -125,14 +128,8 @@ static void dw_hdmi_imx_encoder_commit(struct drm_encoder *encoder) | |||
125 | mux << IMX6Q_GPR3_HDMI_MUX_CTL_SHIFT); | 128 | mux << IMX6Q_GPR3_HDMI_MUX_CTL_SHIFT); |
126 | } | 129 | } |
127 | 130 | ||
128 | static void dw_hdmi_imx_encoder_prepare(struct drm_encoder *encoder) | ||
129 | { | ||
130 | imx_drm_set_bus_format(encoder, MEDIA_BUS_FMT_RGB888_1X24); | ||
131 | } | ||
132 | |||
133 | static const struct drm_encoder_helper_funcs dw_hdmi_imx_encoder_helper_funcs = { | 131 | static const struct drm_encoder_helper_funcs dw_hdmi_imx_encoder_helper_funcs = { |
134 | .mode_set = dw_hdmi_imx_encoder_mode_set, | 132 | .mode_set = dw_hdmi_imx_encoder_mode_set, |
135 | .prepare = dw_hdmi_imx_encoder_prepare, | ||
136 | .commit = dw_hdmi_imx_encoder_commit, | 133 | .commit = dw_hdmi_imx_encoder_commit, |
137 | .disable = dw_hdmi_imx_encoder_disable, | 134 | .disable = dw_hdmi_imx_encoder_disable, |
138 | }; | 135 | }; |
@@ -215,7 +212,10 @@ static int dw_hdmi_imx_bind(struct device *dev, struct device *master, | |||
215 | match = of_match_node(dw_hdmi_imx_dt_ids, pdev->dev.of_node); | 212 | match = of_match_node(dw_hdmi_imx_dt_ids, pdev->dev.of_node); |
216 | plat_data = match->data; | 213 | plat_data = match->data; |
217 | hdmi->dev = &pdev->dev; | 214 | hdmi->dev = &pdev->dev; |
218 | encoder = &hdmi->encoder; | 215 | encoder = &hdmi->imx_encoder.encoder; |
216 | hdmi->imx_encoder.bus_format = MEDIA_BUS_FMT_RGB888_1X24; | ||
217 | hdmi->imx_encoder.di_hsync_pin = 2; | ||
218 | hdmi->imx_encoder.di_vsync_pin = 3; | ||
219 | 219 | ||
220 | irq = platform_get_irq(pdev, 0); | 220 | irq = platform_get_irq(pdev, 0); |
221 | if (irq < 0) | 221 | if (irq < 0) |
diff --git a/drivers/gpu/drm/imx/imx-drm-core.c b/drivers/gpu/drm/imx/imx-drm-core.c index b5a5173b05af..f6e44c220874 100644 --- a/drivers/gpu/drm/imx/imx-drm-core.c +++ b/drivers/gpu/drm/imx/imx-drm-core.c | |||
@@ -85,45 +85,6 @@ static int imx_drm_driver_unload(struct drm_device *drm) | |||
85 | return 0; | 85 | return 0; |
86 | } | 86 | } |
87 | 87 | ||
88 | static struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc) | ||
89 | { | ||
90 | struct imx_drm_device *imxdrm = crtc->dev->dev_private; | ||
91 | unsigned i; | ||
92 | |||
93 | for (i = 0; i < MAX_CRTC; i++) | ||
94 | if (imxdrm->crtc[i] && imxdrm->crtc[i]->crtc == crtc) | ||
95 | return imxdrm->crtc[i]; | ||
96 | |||
97 | return NULL; | ||
98 | } | ||
99 | |||
100 | int imx_drm_set_bus_config(struct drm_encoder *encoder, u32 bus_format, | ||
101 | int hsync_pin, int vsync_pin, u32 bus_flags) | ||
102 | { | ||
103 | struct imx_drm_crtc_helper_funcs *helper; | ||
104 | struct imx_drm_crtc *imx_crtc; | ||
105 | |||
106 | imx_crtc = imx_drm_find_crtc(encoder->crtc); | ||
107 | if (!imx_crtc) | ||
108 | return -EINVAL; | ||
109 | |||
110 | helper = &imx_crtc->imx_drm_helper_funcs; | ||
111 | if (helper->set_interface_pix_fmt) | ||
112 | return helper->set_interface_pix_fmt(encoder->crtc, | ||
113 | bus_format, hsync_pin, vsync_pin, | ||
114 | bus_flags); | ||
115 | return 0; | ||
116 | } | ||
117 | EXPORT_SYMBOL_GPL(imx_drm_set_bus_config); | ||
118 | |||
119 | int imx_drm_set_bus_format(struct drm_encoder *encoder, u32 bus_format) | ||
120 | { | ||
121 | return imx_drm_set_bus_config(encoder, bus_format, 2, 3, | ||
122 | DRM_BUS_FLAG_DE_HIGH | | ||
123 | DRM_BUS_FLAG_PIXDATA_NEGEDGE); | ||
124 | } | ||
125 | EXPORT_SYMBOL_GPL(imx_drm_set_bus_format); | ||
126 | |||
127 | int imx_drm_crtc_vblank_get(struct imx_drm_crtc *imx_drm_crtc) | 88 | int imx_drm_crtc_vblank_get(struct imx_drm_crtc *imx_drm_crtc) |
128 | { | 89 | { |
129 | return drm_crtc_vblank_get(imx_drm_crtc->crtc); | 90 | return drm_crtc_vblank_get(imx_drm_crtc->crtc); |
diff --git a/drivers/gpu/drm/imx/imx-drm.h b/drivers/gpu/drm/imx/imx-drm.h index 74320a1723b7..39cef15c699b 100644 --- a/drivers/gpu/drm/imx/imx-drm.h +++ b/drivers/gpu/drm/imx/imx-drm.h | |||
@@ -15,12 +15,19 @@ struct platform_device; | |||
15 | 15 | ||
16 | unsigned int imx_drm_crtc_id(struct imx_drm_crtc *crtc); | 16 | unsigned int imx_drm_crtc_id(struct imx_drm_crtc *crtc); |
17 | 17 | ||
18 | struct imx_drm_encoder { | ||
19 | struct drm_encoder encoder; | ||
20 | u32 bus_format; | ||
21 | u32 bus_flags; | ||
22 | int di_hsync_pin; | ||
23 | int di_vsync_pin; | ||
24 | }; | ||
25 | |||
26 | #define enc_to_imx_enc(x) container_of(x, struct imx_drm_encoder, encoder) | ||
27 | |||
18 | struct imx_drm_crtc_helper_funcs { | 28 | struct imx_drm_crtc_helper_funcs { |
19 | int (*enable_vblank)(struct drm_crtc *crtc); | 29 | int (*enable_vblank)(struct drm_crtc *crtc); |
20 | void (*disable_vblank)(struct drm_crtc *crtc); | 30 | void (*disable_vblank)(struct drm_crtc *crtc); |
21 | int (*set_interface_pix_fmt)(struct drm_crtc *crtc, | ||
22 | u32 bus_format, int hsync_pin, int vsync_pin, | ||
23 | u32 bus_flags); | ||
24 | const struct drm_crtc_helper_funcs *crtc_helper_funcs; | 31 | const struct drm_crtc_helper_funcs *crtc_helper_funcs; |
25 | const struct drm_crtc_funcs *crtc_funcs; | 32 | const struct drm_crtc_funcs *crtc_funcs; |
26 | }; | 33 | }; |
@@ -42,11 +49,6 @@ void imx_drm_mode_config_init(struct drm_device *drm); | |||
42 | 49 | ||
43 | struct drm_gem_cma_object *imx_drm_fb_get_obj(struct drm_framebuffer *fb); | 50 | struct drm_gem_cma_object *imx_drm_fb_get_obj(struct drm_framebuffer *fb); |
44 | 51 | ||
45 | int imx_drm_set_bus_config(struct drm_encoder *encoder, u32 bus_format, | ||
46 | int hsync_pin, int vsync_pin, u32 bus_flags); | ||
47 | int imx_drm_set_bus_format(struct drm_encoder *encoder, | ||
48 | u32 bus_format); | ||
49 | |||
50 | int imx_drm_encoder_parse_of(struct drm_device *drm, | 52 | int imx_drm_encoder_parse_of(struct drm_device *drm, |
51 | struct drm_encoder *encoder, struct device_node *np); | 53 | struct drm_encoder *encoder, struct device_node *np); |
52 | 54 | ||
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); |
diff --git a/drivers/gpu/drm/imx/imx-tve.c b/drivers/gpu/drm/imx/imx-tve.c index 0b0aeee5c5f0..82a1edd74f20 100644 --- a/drivers/gpu/drm/imx/imx-tve.c +++ b/drivers/gpu/drm/imx/imx-tve.c | |||
@@ -99,7 +99,7 @@ | |||
99 | #define TVE_TVDAC_TEST_MODE_MASK (0x7 << 0) | 99 | #define TVE_TVDAC_TEST_MODE_MASK (0x7 << 0) |
100 | 100 | ||
101 | #define con_to_tve(x) container_of(x, struct imx_tve, connector) | 101 | #define con_to_tve(x) container_of(x, struct imx_tve, connector) |
102 | #define enc_to_tve(x) container_of(x, struct imx_tve, encoder) | 102 | #define imx_enc_to_tve(x) container_of(x, struct imx_tve, imx_encoder) |
103 | 103 | ||
104 | enum { | 104 | enum { |
105 | TVE_MODE_TVOUT, | 105 | TVE_MODE_TVOUT, |
@@ -108,7 +108,7 @@ enum { | |||
108 | 108 | ||
109 | struct imx_tve { | 109 | struct imx_tve { |
110 | struct drm_connector connector; | 110 | struct drm_connector connector; |
111 | struct drm_encoder encoder; | 111 | struct imx_drm_encoder imx_encoder; |
112 | struct device *dev; | 112 | struct device *dev; |
113 | spinlock_t lock; /* register lock */ | 113 | spinlock_t lock; /* register lock */ |
114 | bool enabled; | 114 | bool enabled; |
@@ -121,8 +121,6 @@ struct imx_tve { | |||
121 | struct clk *di_sel_clk; | 121 | struct clk *di_sel_clk; |
122 | struct clk_hw clk_hw_di; | 122 | struct clk_hw clk_hw_di; |
123 | struct clk *di_clk; | 123 | struct clk *di_clk; |
124 | int vsync_pin; | ||
125 | int hsync_pin; | ||
126 | }; | 124 | }; |
127 | 125 | ||
128 | static void tve_lock(void *__tve) | 126 | static void tve_lock(void *__tve) |
@@ -273,12 +271,13 @@ static struct drm_encoder *imx_tve_connector_best_encoder( | |||
273 | { | 271 | { |
274 | struct imx_tve *tve = con_to_tve(connector); | 272 | struct imx_tve *tve = con_to_tve(connector); |
275 | 273 | ||
276 | return &tve->encoder; | 274 | return &tve->imx_encoder.encoder; |
277 | } | 275 | } |
278 | 276 | ||
279 | static void imx_tve_encoder_dpms(struct drm_encoder *encoder, int mode) | 277 | static void imx_tve_encoder_dpms(struct drm_encoder *encoder, int mode) |
280 | { | 278 | { |
281 | struct imx_tve *tve = enc_to_tve(encoder); | 279 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); |
280 | struct imx_tve *tve = imx_enc_to_tve(imx_encoder); | ||
282 | int ret; | 281 | int ret; |
283 | 282 | ||
284 | ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, | 283 | ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, |
@@ -287,30 +286,12 @@ static void imx_tve_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
287 | dev_err(tve->dev, "failed to disable TVOUT: %d\n", ret); | 286 | dev_err(tve->dev, "failed to disable TVOUT: %d\n", ret); |
288 | } | 287 | } |
289 | 288 | ||
290 | static void imx_tve_encoder_prepare(struct drm_encoder *encoder) | ||
291 | { | ||
292 | struct imx_tve *tve = enc_to_tve(encoder); | ||
293 | |||
294 | tve_disable(tve); | ||
295 | |||
296 | switch (tve->mode) { | ||
297 | case TVE_MODE_VGA: | ||
298 | imx_drm_set_bus_config(encoder, MEDIA_BUS_FMT_GBR888_1X24, | ||
299 | tve->hsync_pin, tve->vsync_pin, | ||
300 | DRM_BUS_FLAG_DE_HIGH | | ||
301 | DRM_BUS_FLAG_PIXDATA_NEGEDGE); | ||
302 | break; | ||
303 | case TVE_MODE_TVOUT: | ||
304 | imx_drm_set_bus_format(encoder, MEDIA_BUS_FMT_YUV8_1X24); | ||
305 | break; | ||
306 | } | ||
307 | } | ||
308 | |||
309 | static void imx_tve_encoder_mode_set(struct drm_encoder *encoder, | 289 | static void imx_tve_encoder_mode_set(struct drm_encoder *encoder, |
310 | struct drm_display_mode *orig_mode, | 290 | struct drm_display_mode *orig_mode, |
311 | struct drm_display_mode *mode) | 291 | struct drm_display_mode *mode) |
312 | { | 292 | { |
313 | struct imx_tve *tve = enc_to_tve(encoder); | 293 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); |
294 | struct imx_tve *tve = imx_enc_to_tve(imx_encoder); | ||
314 | unsigned long rounded_rate; | 295 | unsigned long rounded_rate; |
315 | unsigned long rate; | 296 | unsigned long rate; |
316 | int div = 1; | 297 | int div = 1; |
@@ -344,14 +325,16 @@ static void imx_tve_encoder_mode_set(struct drm_encoder *encoder, | |||
344 | 325 | ||
345 | static void imx_tve_encoder_commit(struct drm_encoder *encoder) | 326 | static void imx_tve_encoder_commit(struct drm_encoder *encoder) |
346 | { | 327 | { |
347 | struct imx_tve *tve = enc_to_tve(encoder); | 328 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); |
329 | struct imx_tve *tve = imx_enc_to_tve(imx_encoder); | ||
348 | 330 | ||
349 | tve_enable(tve); | 331 | tve_enable(tve); |
350 | } | 332 | } |
351 | 333 | ||
352 | static void imx_tve_encoder_disable(struct drm_encoder *encoder) | 334 | static void imx_tve_encoder_disable(struct drm_encoder *encoder) |
353 | { | 335 | { |
354 | struct imx_tve *tve = enc_to_tve(encoder); | 336 | struct imx_drm_encoder *imx_encoder = enc_to_imx_enc(encoder); |
337 | struct imx_tve *tve = imx_enc_to_tve(imx_encoder); | ||
355 | 338 | ||
356 | tve_disable(tve); | 339 | tve_disable(tve); |
357 | } | 340 | } |
@@ -378,7 +361,6 @@ static const struct drm_encoder_funcs imx_tve_encoder_funcs = { | |||
378 | 361 | ||
379 | static const struct drm_encoder_helper_funcs imx_tve_encoder_helper_funcs = { | 362 | static const struct drm_encoder_helper_funcs imx_tve_encoder_helper_funcs = { |
380 | .dpms = imx_tve_encoder_dpms, | 363 | .dpms = imx_tve_encoder_dpms, |
381 | .prepare = imx_tve_encoder_prepare, | ||
382 | .mode_set = imx_tve_encoder_mode_set, | 364 | .mode_set = imx_tve_encoder_mode_set, |
383 | .commit = imx_tve_encoder_commit, | 365 | .commit = imx_tve_encoder_commit, |
384 | .disable = imx_tve_encoder_disable, | 366 | .disable = imx_tve_encoder_disable, |
@@ -499,13 +481,14 @@ static int imx_tve_register(struct drm_device *drm, struct imx_tve *tve) | |||
499 | encoder_type = tve->mode == TVE_MODE_VGA ? | 481 | encoder_type = tve->mode == TVE_MODE_VGA ? |
500 | DRM_MODE_ENCODER_DAC : DRM_MODE_ENCODER_TVDAC; | 482 | DRM_MODE_ENCODER_DAC : DRM_MODE_ENCODER_TVDAC; |
501 | 483 | ||
502 | ret = imx_drm_encoder_parse_of(drm, &tve->encoder, | 484 | ret = imx_drm_encoder_parse_of(drm, &tve->imx_encoder.encoder, |
503 | tve->dev->of_node); | 485 | tve->dev->of_node); |
504 | if (ret) | 486 | if (ret) |
505 | return ret; | 487 | return ret; |
506 | 488 | ||
507 | drm_encoder_helper_add(&tve->encoder, &imx_tve_encoder_helper_funcs); | 489 | drm_encoder_helper_add(&tve->imx_encoder.encoder, |
508 | drm_encoder_init(drm, &tve->encoder, &imx_tve_encoder_funcs, | 490 | &imx_tve_encoder_helper_funcs); |
491 | drm_encoder_init(drm, &tve->imx_encoder.encoder, &imx_tve_encoder_funcs, | ||
509 | encoder_type, NULL); | 492 | encoder_type, NULL); |
510 | 493 | ||
511 | drm_connector_helper_add(&tve->connector, | 494 | drm_connector_helper_add(&tve->connector, |
@@ -513,7 +496,8 @@ static int imx_tve_register(struct drm_device *drm, struct imx_tve *tve) | |||
513 | drm_connector_init(drm, &tve->connector, &imx_tve_connector_funcs, | 496 | drm_connector_init(drm, &tve->connector, &imx_tve_connector_funcs, |
514 | DRM_MODE_CONNECTOR_VGA); | 497 | DRM_MODE_CONNECTOR_VGA); |
515 | 498 | ||
516 | drm_mode_connector_attach_encoder(&tve->connector, &tve->encoder); | 499 | drm_mode_connector_attach_encoder(&tve->connector, |
500 | &tve->imx_encoder.encoder); | ||
517 | 501 | ||
518 | return 0; | 502 | return 0; |
519 | } | 503 | } |
@@ -591,7 +575,7 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data) | |||
591 | 575 | ||
592 | if (tve->mode == TVE_MODE_VGA) { | 576 | if (tve->mode == TVE_MODE_VGA) { |
593 | ret = of_property_read_u32(np, "fsl,hsync-pin", | 577 | ret = of_property_read_u32(np, "fsl,hsync-pin", |
594 | &tve->hsync_pin); | 578 | &tve->imx_encoder.di_hsync_pin); |
595 | 579 | ||
596 | if (ret < 0) { | 580 | if (ret < 0) { |
597 | dev_err(dev, "failed to get vsync pin\n"); | 581 | dev_err(dev, "failed to get vsync pin\n"); |
@@ -599,12 +583,14 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data) | |||
599 | } | 583 | } |
600 | 584 | ||
601 | ret |= of_property_read_u32(np, "fsl,vsync-pin", | 585 | ret |= of_property_read_u32(np, "fsl,vsync-pin", |
602 | &tve->vsync_pin); | 586 | &tve->imx_encoder.di_vsync_pin); |
603 | 587 | ||
604 | if (ret < 0) { | 588 | if (ret < 0) { |
605 | dev_err(dev, "failed to get vsync pin\n"); | 589 | dev_err(dev, "failed to get vsync pin\n"); |
606 | return ret; | 590 | return ret; |
607 | } | 591 | } |
592 | |||
593 | tve->imx_encoder.bus_format = MEDIA_BUS_FMT_GBR888_1X24; | ||
608 | } | 594 | } |
609 | 595 | ||
610 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 596 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -693,7 +679,7 @@ static void imx_tve_unbind(struct device *dev, struct device *master, | |||
693 | struct imx_tve *tve = dev_get_drvdata(dev); | 679 | struct imx_tve *tve = dev_get_drvdata(dev); |
694 | 680 | ||
695 | tve->connector.funcs->destroy(&tve->connector); | 681 | tve->connector.funcs->destroy(&tve->connector); |
696 | tve->encoder.funcs->destroy(&tve->encoder); | 682 | tve->imx_encoder.encoder.funcs->destroy(&tve->imx_encoder.encoder); |
697 | 683 | ||
698 | if (!IS_ERR(tve->dac_reg)) | 684 | if (!IS_ERR(tve->dac_reg)) |
699 | regulator_disable(tve->dac_reg); | 685 | regulator_disable(tve->dac_reg); |
diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c index 7df51e81d895..f9d5d7c5cd79 100644 --- a/drivers/gpu/drm/imx/ipuv3-crtc.c +++ b/drivers/gpu/drm/imx/ipuv3-crtc.c | |||
@@ -67,10 +67,6 @@ struct ipu_crtc { | |||
67 | struct workqueue_struct *flip_queue; | 67 | struct workqueue_struct *flip_queue; |
68 | struct ipu_flip_work *flip_work; | 68 | struct ipu_flip_work *flip_work; |
69 | int irq; | 69 | int irq; |
70 | u32 bus_format; | ||
71 | u32 bus_flags; | ||
72 | int di_hsync_pin; | ||
73 | int di_vsync_pin; | ||
74 | }; | 70 | }; |
75 | 71 | ||
76 | #define to_ipu_crtc(x) container_of(x, struct ipu_crtc, base) | 72 | #define to_ipu_crtc(x) container_of(x, struct ipu_crtc, base) |
@@ -321,6 +317,7 @@ static void ipu_crtc_mode_set_nofb(struct drm_crtc *crtc) | |||
321 | { | 317 | { |
322 | struct drm_device *dev = crtc->dev; | 318 | struct drm_device *dev = crtc->dev; |
323 | struct drm_encoder *encoder; | 319 | struct drm_encoder *encoder; |
320 | struct imx_drm_encoder *imx_encoder = NULL; | ||
324 | struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); | 321 | struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); |
325 | struct drm_display_mode *mode = &crtc->state->adjusted_mode; | 322 | struct drm_display_mode *mode = &crtc->state->adjusted_mode; |
326 | struct ipu_di_signal_cfg sig_cfg = {}; | 323 | struct ipu_di_signal_cfg sig_cfg = {}; |
@@ -331,9 +328,12 @@ static void ipu_crtc_mode_set_nofb(struct drm_crtc *crtc) | |||
331 | dev_dbg(ipu_crtc->dev, "%s: mode->vdisplay: %d\n", __func__, | 328 | dev_dbg(ipu_crtc->dev, "%s: mode->vdisplay: %d\n", __func__, |
332 | mode->vdisplay); | 329 | mode->vdisplay); |
333 | 330 | ||
334 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) | 331 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
335 | if (encoder->crtc == crtc) | 332 | if (encoder->crtc == crtc) { |
336 | encoder_types |= BIT(encoder->encoder_type); | 333 | encoder_types |= BIT(encoder->encoder_type); |
334 | imx_encoder = enc_to_imx_enc(encoder); | ||
335 | } | ||
336 | } | ||
337 | 337 | ||
338 | dev_dbg(ipu_crtc->dev, "%s: attached to encoder types 0x%lx\n", | 338 | dev_dbg(ipu_crtc->dev, "%s: attached to encoder types 0x%lx\n", |
339 | __func__, encoder_types); | 339 | __func__, encoder_types); |
@@ -351,20 +351,20 @@ static void ipu_crtc_mode_set_nofb(struct drm_crtc *crtc) | |||
351 | else | 351 | else |
352 | sig_cfg.clkflags = 0; | 352 | sig_cfg.clkflags = 0; |
353 | 353 | ||
354 | sig_cfg.enable_pol = !(ipu_crtc->bus_flags & DRM_BUS_FLAG_DE_LOW); | 354 | sig_cfg.enable_pol = !(imx_encoder->bus_flags & DRM_BUS_FLAG_DE_LOW); |
355 | /* Default to driving pixel data on negative clock edges */ | 355 | /* Default to driving pixel data on negative clock edges */ |
356 | sig_cfg.clk_pol = !!(ipu_crtc->bus_flags & | 356 | sig_cfg.clk_pol = !!(imx_encoder->bus_flags & |
357 | DRM_BUS_FLAG_PIXDATA_POSEDGE); | 357 | DRM_BUS_FLAG_PIXDATA_POSEDGE); |
358 | sig_cfg.bus_format = ipu_crtc->bus_format; | 358 | sig_cfg.bus_format = imx_encoder->bus_format; |
359 | sig_cfg.v_to_h_sync = 0; | 359 | sig_cfg.v_to_h_sync = 0; |
360 | sig_cfg.hsync_pin = ipu_crtc->di_hsync_pin; | 360 | sig_cfg.hsync_pin = imx_encoder->di_hsync_pin; |
361 | sig_cfg.vsync_pin = ipu_crtc->di_vsync_pin; | 361 | sig_cfg.vsync_pin = imx_encoder->di_vsync_pin; |
362 | 362 | ||
363 | drm_display_mode_to_videomode(mode, &sig_cfg.mode); | 363 | drm_display_mode_to_videomode(mode, &sig_cfg.mode); |
364 | 364 | ||
365 | ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di, | 365 | ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di, |
366 | mode->flags & DRM_MODE_FLAG_INTERLACE, | 366 | mode->flags & DRM_MODE_FLAG_INTERLACE, |
367 | ipu_crtc->bus_format, mode->hdisplay); | 367 | imx_encoder->bus_format, mode->hdisplay); |
368 | ipu_di_init_sync_panel(ipu_crtc->di, &sig_cfg); | 368 | ipu_di_init_sync_panel(ipu_crtc->di, &sig_cfg); |
369 | } | 369 | } |
370 | 370 | ||
@@ -402,23 +402,9 @@ static void ipu_disable_vblank(struct drm_crtc *crtc) | |||
402 | disable_irq_nosync(ipu_crtc->irq); | 402 | disable_irq_nosync(ipu_crtc->irq); |
403 | } | 403 | } |
404 | 404 | ||
405 | static int ipu_set_interface_pix_fmt(struct drm_crtc *crtc, | ||
406 | u32 bus_format, int hsync_pin, int vsync_pin, u32 bus_flags) | ||
407 | { | ||
408 | struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); | ||
409 | |||
410 | ipu_crtc->bus_format = bus_format; | ||
411 | ipu_crtc->bus_flags = bus_flags; | ||
412 | ipu_crtc->di_hsync_pin = hsync_pin; | ||
413 | ipu_crtc->di_vsync_pin = vsync_pin; | ||
414 | |||
415 | return 0; | ||
416 | } | ||
417 | |||
418 | static const struct imx_drm_crtc_helper_funcs ipu_crtc_helper_funcs = { | 405 | static const struct imx_drm_crtc_helper_funcs ipu_crtc_helper_funcs = { |
419 | .enable_vblank = ipu_enable_vblank, | 406 | .enable_vblank = ipu_enable_vblank, |
420 | .disable_vblank = ipu_disable_vblank, | 407 | .disable_vblank = ipu_disable_vblank, |
421 | .set_interface_pix_fmt = ipu_set_interface_pix_fmt, | ||
422 | .crtc_funcs = &ipu_crtc_funcs, | 408 | .crtc_funcs = &ipu_crtc_funcs, |
423 | .crtc_helper_funcs = &ipu_helper_funcs, | 409 | .crtc_helper_funcs = &ipu_helper_funcs, |
424 | }; | 410 | }; |
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); |