diff options
author | Hai Li <hali@codeaurora.org> | 2015-03-26 19:25:14 -0400 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2015-04-01 19:29:37 -0400 |
commit | 5722a9e303be25adbe25c174f66c5e1e9e17c276 (patch) | |
tree | affe09e8b843f79821316092e0900daf4dd494dc | |
parent | 81ddd1bc5cff2df619559860f2481393ba74e3a0 (diff) |
drm/msm/mdp5: Move *_modeset_init out of construct_encoder function
This change is to make the content in construct_encoder reflect its
name.
Also, DSI connector may be connected to video mode or command mode
encoder, so that 2 different encoders need to be constructed for DSI.
Signed-off-by: Hai Li <hali@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c | 89 |
1 files changed, 54 insertions, 35 deletions
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c index e7ab89dddcf6..4d8f5b471e4d 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c | |||
@@ -161,8 +161,9 @@ int mdp5_enable(struct mdp5_kms *mdp5_kms) | |||
161 | return 0; | 161 | return 0; |
162 | } | 162 | } |
163 | 163 | ||
164 | static int construct_encoder(struct mdp5_kms *mdp5_kms, | 164 | static struct drm_encoder *construct_encoder(struct mdp5_kms *mdp5_kms, |
165 | enum mdp5_intf_type intf_type, int intf_num) | 165 | enum mdp5_intf_type intf_type, int intf_num, |
166 | enum mdp5_intf_mode intf_mode) | ||
166 | { | 167 | { |
167 | struct drm_device *dev = mdp5_kms->dev; | 168 | struct drm_device *dev = mdp5_kms->dev; |
168 | struct msm_drm_private *priv = dev->dev_private; | 169 | struct msm_drm_private *priv = dev->dev_private; |
@@ -170,30 +171,64 @@ static int construct_encoder(struct mdp5_kms *mdp5_kms, | |||
170 | struct mdp5_interface intf = { | 171 | struct mdp5_interface intf = { |
171 | .num = intf_num, | 172 | .num = intf_num, |
172 | .type = intf_type, | 173 | .type = intf_type, |
173 | .mode = MDP5_INTF_MODE_NONE, | 174 | .mode = intf_mode, |
174 | }; | 175 | }; |
175 | int ret = 0; | ||
176 | 176 | ||
177 | encoder = mdp5_encoder_init(dev, &intf); | 177 | encoder = mdp5_encoder_init(dev, &intf); |
178 | if (IS_ERR(encoder)) { | 178 | if (IS_ERR(encoder)) { |
179 | ret = PTR_ERR(encoder); | 179 | dev_err(dev->dev, "failed to construct encoder\n"); |
180 | dev_err(dev->dev, "failed to construct encoder: %d\n", ret); | 180 | return encoder; |
181 | return ret; | ||
182 | } | 181 | } |
183 | 182 | ||
184 | encoder->possible_crtcs = (1 << priv->num_crtcs) - 1; | 183 | encoder->possible_crtcs = (1 << priv->num_crtcs) - 1; |
185 | priv->encoders[priv->num_encoders++] = encoder; | 184 | priv->encoders[priv->num_encoders++] = encoder; |
186 | 185 | ||
187 | if (intf_type == INTF_HDMI) { | 186 | return encoder; |
188 | ret = hdmi_modeset_init(priv->hdmi, dev, encoder); | 187 | } |
189 | if (ret) | 188 | |
190 | dev_err(dev->dev, "failed to init HDMI: %d\n", ret); | 189 | static int modeset_init_intf(struct mdp5_kms *mdp5_kms, int intf_num) |
190 | { | ||
191 | struct drm_device *dev = mdp5_kms->dev; | ||
192 | struct msm_drm_private *priv = dev->dev_private; | ||
193 | const struct mdp5_cfg_hw *hw_cfg = | ||
194 | mdp5_cfg_get_hw_config(mdp5_kms->cfg); | ||
195 | enum mdp5_intf_type intf_type = hw_cfg->intfs[intf_num]; | ||
196 | struct drm_encoder *encoder; | ||
197 | int ret = 0; | ||
198 | |||
199 | switch (intf_type) { | ||
200 | case INTF_DISABLED: | ||
201 | break; | ||
202 | case INTF_eDP: | ||
203 | if (!priv->edp) | ||
204 | break; | ||
205 | |||
206 | encoder = construct_encoder(mdp5_kms, INTF_eDP, intf_num, | ||
207 | MDP5_INTF_MODE_NONE); | ||
208 | if (IS_ERR(encoder)) { | ||
209 | ret = PTR_ERR(encoder); | ||
210 | break; | ||
211 | } | ||
191 | 212 | ||
192 | } else if (intf_type == INTF_eDP) { | ||
193 | /* Construct bridge/connector for eDP: */ | ||
194 | ret = msm_edp_modeset_init(priv->edp, dev, encoder); | 213 | ret = msm_edp_modeset_init(priv->edp, dev, encoder); |
195 | if (ret) | 214 | break; |
196 | dev_err(dev->dev, "failed to init eDP: %d\n", ret); | 215 | case INTF_HDMI: |
216 | if (!priv->hdmi) | ||
217 | break; | ||
218 | |||
219 | encoder = construct_encoder(mdp5_kms, INTF_HDMI, intf_num, | ||
220 | MDP5_INTF_MODE_NONE); | ||
221 | if (IS_ERR(encoder)) { | ||
222 | ret = PTR_ERR(encoder); | ||
223 | break; | ||
224 | } | ||
225 | |||
226 | ret = hdmi_modeset_init(priv->hdmi, dev, encoder); | ||
227 | break; | ||
228 | default: | ||
229 | dev_err(dev->dev, "unknown intf: %d\n", intf_type); | ||
230 | ret = -EINVAL; | ||
231 | break; | ||
197 | } | 232 | } |
198 | 233 | ||
199 | return ret; | 234 | return ret; |
@@ -259,27 +294,11 @@ static int modeset_init(struct mdp5_kms *mdp5_kms) | |||
259 | } | 294 | } |
260 | } | 295 | } |
261 | 296 | ||
262 | /* Construct external display interfaces' encoders: */ | 297 | /* Construct encoders and modeset initialize connector devices |
298 | * for each external display interface. | ||
299 | */ | ||
263 | for (i = 0; i < ARRAY_SIZE(hw_cfg->intfs); i++) { | 300 | for (i = 0; i < ARRAY_SIZE(hw_cfg->intfs); i++) { |
264 | enum mdp5_intf_type intf_type = hw_cfg->intfs[i]; | 301 | ret = modeset_init_intf(mdp5_kms, i); |
265 | |||
266 | switch (intf_type) { | ||
267 | case INTF_DISABLED: | ||
268 | break; | ||
269 | case INTF_eDP: | ||
270 | if (priv->edp) | ||
271 | ret = construct_encoder(mdp5_kms, INTF_eDP, i); | ||
272 | break; | ||
273 | case INTF_HDMI: | ||
274 | if (priv->hdmi) | ||
275 | ret = construct_encoder(mdp5_kms, INTF_HDMI, i); | ||
276 | break; | ||
277 | default: | ||
278 | dev_err(dev->dev, "unknown intf: %d\n", intf_type); | ||
279 | ret = -EINVAL; | ||
280 | break; | ||
281 | } | ||
282 | |||
283 | if (ret) | 302 | if (ret) |
284 | goto fail; | 303 | goto fail; |
285 | } | 304 | } |