@@ -161,39 +161,74 @@ int mdp5_enable(struct mdp5_kms *mdp5_kms)
161161 return 0 ;
162162}
163163
164- static int construct_encoder (struct mdp5_kms * mdp5_kms ,
165- enum mdp5_intf_type intf_type , int intf_num )
164+ static struct drm_encoder * construct_encoder (struct mdp5_kms * mdp5_kms ,
165+ enum mdp5_intf_type intf_type , int intf_num ,
166+ enum mdp5_intf_mode intf_mode )
166167{
167168 struct drm_device * dev = mdp5_kms -> dev ;
168169 struct msm_drm_private * priv = dev -> dev_private ;
169170 struct drm_encoder * encoder ;
170171 struct mdp5_interface intf = {
171172 .num = intf_num ,
172173 .type = intf_type ,
173- .mode = MDP5_INTF_MODE_NONE ,
174+ .mode = intf_mode ,
174175 };
175- int ret = 0 ;
176176
177177 encoder = mdp5_encoder_init (dev , & intf );
178178 if (IS_ERR (encoder )) {
179- ret = PTR_ERR (encoder );
180- dev_err (dev -> dev , "failed to construct encoder: %d\n" , ret );
181- return ret ;
179+ dev_err (dev -> dev , "failed to construct encoder\n" );
180+ return encoder ;
182181 }
183182
184183 encoder -> possible_crtcs = (1 << priv -> num_crtcs ) - 1 ;
185184 priv -> encoders [priv -> num_encoders ++ ] = encoder ;
186185
187- if (intf_type == INTF_HDMI ) {
188- ret = hdmi_modeset_init (priv -> hdmi , dev , encoder );
189- if (ret )
190- dev_err (dev -> dev , "failed to init HDMI: %d\n" , ret );
186+ return encoder ;
187+ }
188+
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+ }
191212
192- } else if (intf_type == INTF_eDP ) {
193- /* Construct bridge/connector for eDP: */
194213 ret = msm_edp_modeset_init (priv -> edp , dev , encoder );
195- if (ret )
196- dev_err (dev -> dev , "failed to init eDP: %d\n" , ret );
214+ break ;
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 ;
197232 }
198233
199234 return ret ;
@@ -259,27 +294,11 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
259294 }
260295 }
261296
262- /* Construct external display interfaces' encoders: */
297+ /* Construct encoders and modeset initialize connector devices
298+ * for each external display interface.
299+ */
263300 for (i = 0 ; i < ARRAY_SIZE (hw_cfg -> intfs ); i ++ ) {
264- enum mdp5_intf_type intf_type = hw_cfg -> intfs [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-
301+ ret = modeset_init_intf (mdp5_kms , i );
283302 if (ret )
284303 goto fail ;
285304 }
0 commit comments