aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHai Li <hali@codeaurora.org>2015-03-26 19:25:14 -0400
committerRob Clark <robdclark@gmail.com>2015-04-01 19:29:37 -0400
commit5722a9e303be25adbe25c174f66c5e1e9e17c276 (patch)
treeaffe09e8b843f79821316092e0900daf4dd494dc
parent81ddd1bc5cff2df619559860f2481393ba74e3a0 (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.c89
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
164static int construct_encoder(struct mdp5_kms *mdp5_kms, 164static 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); 189static 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 }