xref: /linux/drivers/gpu/drm/display/drm_bridge_connector.c (revision 7b1166dee847d5018c1f3cc781218e806078f752)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2019 Laurent Pinchart <laurent.pinchart@ideasonboard.com>
4  */
5 
6 #include <linux/kernel.h>
7 #include <linux/module.h>
8 #include <linux/of.h>
9 #include <linux/property.h>
10 #include <linux/slab.h>
11 
12 #include <drm/drm_atomic_state_helper.h>
13 #include <drm/drm_bridge.h>
14 #include <drm/drm_bridge_connector.h>
15 #include <drm/drm_connector.h>
16 #include <drm/drm_device.h>
17 #include <drm/drm_edid.h>
18 #include <drm/drm_managed.h>
19 #include <drm/drm_modeset_helper_vtables.h>
20 #include <drm/drm_print.h>
21 #include <drm/drm_probe_helper.h>
22 #include <drm/display/drm_hdmi_audio_helper.h>
23 #include <drm/display/drm_hdmi_cec_helper.h>
24 #include <drm/display/drm_hdmi_helper.h>
25 #include <drm/display/drm_hdmi_state_helper.h>
26 
27 /**
28  * DOC: overview
29  *
30  * The DRM bridge connector helper object provides a DRM connector
31  * implementation that wraps a chain of &struct drm_bridge. The connector
32  * operations are fully implemented based on the operations of the bridges in
33  * the chain, and don't require any intervention from the display controller
34  * driver at runtime.
35  *
36  * To use the helper, display controller drivers create a bridge connector with
37  * a call to drm_bridge_connector_init(). This associates the newly created
38  * connector with the chain of bridges passed to the function and registers it
39  * with the DRM device. At that point the connector becomes fully usable, no
40  * further operation is needed.
41  *
42  * The DRM bridge connector operations are implemented based on the operations
43  * provided by the bridges in the chain. Each connector operation is delegated
44  * to the bridge closest to the connector (at the end of the chain) that
45  * provides the relevant functionality.
46  *
47  * To make use of this helper, all bridges in the chain shall report bridge
48  * operation flags (&drm_bridge->ops) and bridge output type
49  * (&drm_bridge->type), as well as the DRM_BRIDGE_ATTACH_NO_CONNECTOR attach
50  * flag (none of the bridges shall create a DRM connector directly).
51  */
52 
53 /**
54  * struct drm_bridge_connector - A connector backed by a chain of bridges
55  */
56 struct drm_bridge_connector {
57 	/**
58 	 * @base: The base DRM connector
59 	 */
60 	struct drm_connector base;
61 	/**
62 	 * @encoder:
63 	 *
64 	 * The encoder at the start of the bridges chain.
65 	 */
66 	struct drm_encoder *encoder;
67 	/**
68 	 * @bridge_edid:
69 	 *
70 	 * The last bridge in the chain (closest to the connector) that provides
71 	 * EDID read support, if any (see &DRM_BRIDGE_OP_EDID).
72 	 */
73 	struct drm_bridge *bridge_edid;
74 	/**
75 	 * @bridge_hpd:
76 	 *
77 	 * The last bridge in the chain (closest to the connector) that provides
78 	 * hot-plug detection notification, if any (see &DRM_BRIDGE_OP_HPD).
79 	 */
80 	struct drm_bridge *bridge_hpd;
81 	/**
82 	 * @bridge_detect:
83 	 *
84 	 * The last bridge in the chain (closest to the connector) that provides
85 	 * connector detection, if any (see &DRM_BRIDGE_OP_DETECT).
86 	 */
87 	struct drm_bridge *bridge_detect;
88 	/**
89 	 * @bridge_modes:
90 	 *
91 	 * The last bridge in the chain (closest to the connector) that provides
92 	 * connector modes detection, if any (see &DRM_BRIDGE_OP_MODES).
93 	 */
94 	struct drm_bridge *bridge_modes;
95 	/**
96 	 * @bridge_hdmi:
97 	 *
98 	 * The bridge in the chain that implements necessary support for the
99 	 * HDMI connector infrastructure, if any (see &DRM_BRIDGE_OP_HDMI).
100 	 */
101 	struct drm_bridge *bridge_hdmi;
102 	/**
103 	 * @bridge_hdmi_audio:
104 	 *
105 	 * The bridge in the chain that implements necessary support for the
106 	 * HDMI Audio infrastructure, if any (see &DRM_BRIDGE_OP_HDMI_AUDIO).
107 	 */
108 	struct drm_bridge *bridge_hdmi_audio;
109 	/**
110 	 * @bridge_dp_audio:
111 	 *
112 	 * The bridge in the chain that implements necessary support for the
113 	 * DisplayPort Audio infrastructure, if any (see
114 	 * &DRM_BRIDGE_OP_DP_AUDIO).
115 	 */
116 	struct drm_bridge *bridge_dp_audio;
117 	/**
118 	 * @bridge_hdmi_cec:
119 	 *
120 	 * The bridge in the chain that implements CEC support, if any (see
121 	 * DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER).
122 	 */
123 	struct drm_bridge *bridge_hdmi_cec;
124 };
125 
126 #define to_drm_bridge_connector(x) \
127 	container_of(x, struct drm_bridge_connector, base)
128 
129 /* -----------------------------------------------------------------------------
130  * Bridge Connector Hot-Plug Handling
131  */
132 
133 static void drm_bridge_connector_hpd_notify(struct drm_connector *connector,
134 					    enum drm_connector_status status)
135 {
136 	struct drm_bridge_connector *bridge_connector =
137 		to_drm_bridge_connector(connector);
138 	struct drm_bridge *bridge;
139 
140 	/* Notify all bridges in the pipeline of hotplug events. */
141 	drm_for_each_bridge_in_chain(bridge_connector->encoder, bridge) {
142 		if (bridge->funcs->hpd_notify)
143 			bridge->funcs->hpd_notify(bridge, status);
144 	}
145 }
146 
147 static void drm_bridge_connector_handle_hpd(struct drm_bridge_connector *drm_bridge_connector,
148 					    enum drm_connector_status status)
149 {
150 	struct drm_connector *connector = &drm_bridge_connector->base;
151 	struct drm_device *dev = connector->dev;
152 
153 	mutex_lock(&dev->mode_config.mutex);
154 	connector->status = status;
155 	mutex_unlock(&dev->mode_config.mutex);
156 
157 	drm_bridge_connector_hpd_notify(connector, status);
158 
159 	drm_kms_helper_connector_hotplug_event(connector);
160 }
161 
162 static void drm_bridge_connector_hpd_cb(void *cb_data,
163 					enum drm_connector_status status)
164 {
165 	drm_bridge_connector_handle_hpd(cb_data, status);
166 }
167 
168 static void drm_bridge_connector_oob_hotplug_event(struct drm_connector *connector,
169 						   enum drm_connector_status status)
170 {
171 	struct drm_bridge_connector *bridge_connector =
172 		to_drm_bridge_connector(connector);
173 
174 	drm_bridge_connector_handle_hpd(bridge_connector, status);
175 }
176 
177 static void drm_bridge_connector_enable_hpd(struct drm_connector *connector)
178 {
179 	struct drm_bridge_connector *bridge_connector =
180 		to_drm_bridge_connector(connector);
181 	struct drm_bridge *hpd = bridge_connector->bridge_hpd;
182 
183 	if (hpd)
184 		drm_bridge_hpd_enable(hpd, drm_bridge_connector_hpd_cb,
185 				      bridge_connector);
186 }
187 
188 static void drm_bridge_connector_disable_hpd(struct drm_connector *connector)
189 {
190 	struct drm_bridge_connector *bridge_connector =
191 		to_drm_bridge_connector(connector);
192 	struct drm_bridge *hpd = bridge_connector->bridge_hpd;
193 
194 	if (hpd)
195 		drm_bridge_hpd_disable(hpd);
196 }
197 
198 /* -----------------------------------------------------------------------------
199  * Bridge Connector Functions
200  */
201 
202 static enum drm_connector_status
203 drm_bridge_connector_detect(struct drm_connector *connector, bool force)
204 {
205 	struct drm_bridge_connector *bridge_connector =
206 		to_drm_bridge_connector(connector);
207 	struct drm_bridge *detect = bridge_connector->bridge_detect;
208 	struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
209 	enum drm_connector_status status;
210 
211 	if (detect) {
212 		status = detect->funcs->detect(detect);
213 
214 		if (hdmi)
215 			drm_atomic_helper_connector_hdmi_hotplug(connector, status);
216 
217 		drm_bridge_connector_hpd_notify(connector, status);
218 	} else {
219 		switch (connector->connector_type) {
220 		case DRM_MODE_CONNECTOR_DPI:
221 		case DRM_MODE_CONNECTOR_LVDS:
222 		case DRM_MODE_CONNECTOR_DSI:
223 		case DRM_MODE_CONNECTOR_eDP:
224 			status = connector_status_connected;
225 			break;
226 		default:
227 			status = connector_status_unknown;
228 			break;
229 		}
230 	}
231 
232 	return status;
233 }
234 
235 static void drm_bridge_connector_force(struct drm_connector *connector)
236 {
237 	struct drm_bridge_connector *bridge_connector =
238 		to_drm_bridge_connector(connector);
239 	struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
240 
241 	if (hdmi)
242 		drm_atomic_helper_connector_hdmi_force(connector);
243 }
244 
245 static void drm_bridge_connector_debugfs_init(struct drm_connector *connector,
246 					      struct dentry *root)
247 {
248 	struct drm_bridge_connector *bridge_connector =
249 		to_drm_bridge_connector(connector);
250 	struct drm_encoder *encoder = bridge_connector->encoder;
251 	struct drm_bridge *bridge;
252 
253 	list_for_each_entry(bridge, &encoder->bridge_chain, chain_node) {
254 		if (bridge->funcs->debugfs_init)
255 			bridge->funcs->debugfs_init(bridge, root);
256 	}
257 }
258 
259 static void drm_bridge_connector_reset(struct drm_connector *connector)
260 {
261 	struct drm_bridge_connector *bridge_connector =
262 		to_drm_bridge_connector(connector);
263 
264 	drm_atomic_helper_connector_reset(connector);
265 	if (bridge_connector->bridge_hdmi)
266 		__drm_atomic_helper_connector_hdmi_reset(connector,
267 							 connector->state);
268 }
269 
270 static const struct drm_connector_funcs drm_bridge_connector_funcs = {
271 	.reset = drm_bridge_connector_reset,
272 	.detect = drm_bridge_connector_detect,
273 	.force = drm_bridge_connector_force,
274 	.fill_modes = drm_helper_probe_single_connector_modes,
275 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
276 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
277 	.debugfs_init = drm_bridge_connector_debugfs_init,
278 	.oob_hotplug_event = drm_bridge_connector_oob_hotplug_event,
279 };
280 
281 /* -----------------------------------------------------------------------------
282  * Bridge Connector Helper Functions
283  */
284 
285 static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector,
286 					       struct drm_bridge *bridge)
287 {
288 	enum drm_connector_status status;
289 	const struct drm_edid *drm_edid;
290 	int n;
291 
292 	status = drm_bridge_connector_detect(connector, false);
293 	if (status != connector_status_connected)
294 		goto no_edid;
295 
296 	drm_edid = drm_bridge_edid_read(bridge, connector);
297 	if (!drm_edid_valid(drm_edid)) {
298 		drm_edid_free(drm_edid);
299 		goto no_edid;
300 	}
301 
302 	drm_edid_connector_update(connector, drm_edid);
303 	n = drm_edid_connector_add_modes(connector);
304 
305 	drm_edid_free(drm_edid);
306 	return n;
307 
308 no_edid:
309 	drm_edid_connector_update(connector, NULL);
310 	return 0;
311 }
312 
313 static int drm_bridge_connector_get_modes(struct drm_connector *connector)
314 {
315 	struct drm_bridge_connector *bridge_connector =
316 		to_drm_bridge_connector(connector);
317 	struct drm_bridge *bridge;
318 
319 	/*
320 	 * If there is a HDMI bridge, EDID has been updated as a part of
321 	 * the .detect(). Just update the modes here.
322 	 */
323 	bridge = bridge_connector->bridge_hdmi;
324 	if (bridge)
325 		return drm_edid_connector_add_modes(connector);
326 
327 	/*
328 	 * If display exposes EDID, then we parse that in the normal way to
329 	 * build table of supported modes.
330 	 */
331 	bridge = bridge_connector->bridge_edid;
332 	if (bridge)
333 		return drm_bridge_connector_get_modes_edid(connector, bridge);
334 
335 	/*
336 	 * Otherwise if the display pipeline reports modes (e.g. with a fixed
337 	 * resolution panel or an analog TV output), query it.
338 	 */
339 	bridge = bridge_connector->bridge_modes;
340 	if (bridge)
341 		return bridge->funcs->get_modes(bridge, connector);
342 
343 	/*
344 	 * We can't retrieve modes, which can happen for instance for a DVI or
345 	 * VGA output with the DDC bus unconnected. The KMS core will add the
346 	 * default modes.
347 	 */
348 	return 0;
349 }
350 
351 static enum drm_mode_status
352 drm_bridge_connector_mode_valid(struct drm_connector *connector,
353 				const struct drm_display_mode *mode)
354 {
355 	struct drm_bridge_connector *bridge_connector =
356 		to_drm_bridge_connector(connector);
357 
358 	if (bridge_connector->bridge_hdmi)
359 		return drm_hdmi_connector_mode_valid(connector, mode);
360 
361 	return MODE_OK;
362 }
363 
364 static int drm_bridge_connector_atomic_check(struct drm_connector *connector,
365 					     struct drm_atomic_state *state)
366 {
367 	struct drm_bridge_connector *bridge_connector =
368 		to_drm_bridge_connector(connector);
369 
370 	if (bridge_connector->bridge_hdmi)
371 		return drm_atomic_helper_connector_hdmi_check(connector, state);
372 
373 	return 0;
374 }
375 
376 static const struct drm_connector_helper_funcs drm_bridge_connector_helper_funcs = {
377 	.get_modes = drm_bridge_connector_get_modes,
378 	.mode_valid = drm_bridge_connector_mode_valid,
379 	.enable_hpd = drm_bridge_connector_enable_hpd,
380 	.disable_hpd = drm_bridge_connector_disable_hpd,
381 	.atomic_check = drm_bridge_connector_atomic_check,
382 };
383 
384 static enum drm_mode_status
385 drm_bridge_connector_tmds_char_rate_valid(const struct drm_connector *connector,
386 					  const struct drm_display_mode *mode,
387 					  unsigned long long tmds_rate)
388 {
389 	struct drm_bridge_connector *bridge_connector =
390 		to_drm_bridge_connector(connector);
391 	struct drm_bridge *bridge;
392 
393 	bridge = bridge_connector->bridge_hdmi;
394 	if (!bridge)
395 		return MODE_ERROR;
396 
397 	if (bridge->funcs->hdmi_tmds_char_rate_valid)
398 		return bridge->funcs->hdmi_tmds_char_rate_valid(bridge, mode, tmds_rate);
399 	else
400 		return MODE_OK;
401 }
402 
403 static int drm_bridge_connector_clear_infoframe(struct drm_connector *connector,
404 						enum hdmi_infoframe_type type)
405 {
406 	struct drm_bridge_connector *bridge_connector =
407 		to_drm_bridge_connector(connector);
408 	struct drm_bridge *bridge;
409 
410 	bridge = bridge_connector->bridge_hdmi;
411 	if (!bridge)
412 		return -EINVAL;
413 
414 	return bridge->funcs->hdmi_clear_infoframe(bridge, type);
415 }
416 
417 static int drm_bridge_connector_write_infoframe(struct drm_connector *connector,
418 						enum hdmi_infoframe_type type,
419 						const u8 *buffer, size_t len)
420 {
421 	struct drm_bridge_connector *bridge_connector =
422 		to_drm_bridge_connector(connector);
423 	struct drm_bridge *bridge;
424 
425 	bridge = bridge_connector->bridge_hdmi;
426 	if (!bridge)
427 		return -EINVAL;
428 
429 	return bridge->funcs->hdmi_write_infoframe(bridge, type, buffer, len);
430 }
431 
432 static const struct drm_edid *
433 drm_bridge_connector_read_edid(struct drm_connector *connector)
434 {
435 	struct drm_bridge_connector *bridge_connector =
436 		to_drm_bridge_connector(connector);
437 	struct drm_bridge *bridge;
438 
439 	bridge = bridge_connector->bridge_edid;
440 	if (!bridge)
441 		return NULL;
442 
443 	return drm_bridge_edid_read(bridge, connector);
444 }
445 
446 static const struct drm_connector_hdmi_funcs drm_bridge_connector_hdmi_funcs = {
447 	.tmds_char_rate_valid = drm_bridge_connector_tmds_char_rate_valid,
448 	.clear_infoframe = drm_bridge_connector_clear_infoframe,
449 	.write_infoframe = drm_bridge_connector_write_infoframe,
450 	.read_edid = drm_bridge_connector_read_edid,
451 };
452 
453 static int drm_bridge_connector_audio_startup(struct drm_connector *connector)
454 {
455 	struct drm_bridge_connector *bridge_connector =
456 		to_drm_bridge_connector(connector);
457 	struct drm_bridge *bridge;
458 
459 	if (bridge_connector->bridge_hdmi_audio) {
460 		bridge = bridge_connector->bridge_hdmi_audio;
461 
462 		if (!bridge->funcs->hdmi_audio_startup)
463 			return 0;
464 
465 		return bridge->funcs->hdmi_audio_startup(connector, bridge);
466 	}
467 
468 	if (bridge_connector->bridge_dp_audio) {
469 		bridge = bridge_connector->bridge_dp_audio;
470 
471 		if (!bridge->funcs->dp_audio_startup)
472 			return 0;
473 
474 		return bridge->funcs->dp_audio_startup(connector, bridge);
475 	}
476 
477 	return -EINVAL;
478 }
479 
480 static int drm_bridge_connector_audio_prepare(struct drm_connector *connector,
481 					      struct hdmi_codec_daifmt *fmt,
482 					      struct hdmi_codec_params *hparms)
483 {
484 	struct drm_bridge_connector *bridge_connector =
485 		to_drm_bridge_connector(connector);
486 	struct drm_bridge *bridge;
487 
488 	if (bridge_connector->bridge_hdmi_audio) {
489 		bridge = bridge_connector->bridge_hdmi_audio;
490 
491 		return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms);
492 	}
493 
494 	if (bridge_connector->bridge_dp_audio) {
495 		bridge = bridge_connector->bridge_dp_audio;
496 
497 		return bridge->funcs->dp_audio_prepare(connector, bridge, fmt, hparms);
498 	}
499 
500 	return -EINVAL;
501 }
502 
503 static void drm_bridge_connector_audio_shutdown(struct drm_connector *connector)
504 {
505 	struct drm_bridge_connector *bridge_connector =
506 		to_drm_bridge_connector(connector);
507 	struct drm_bridge *bridge;
508 
509 	if (bridge_connector->bridge_hdmi_audio) {
510 		bridge = bridge_connector->bridge_hdmi_audio;
511 		bridge->funcs->hdmi_audio_shutdown(connector, bridge);
512 	}
513 
514 	if (bridge_connector->bridge_dp_audio) {
515 		bridge = bridge_connector->bridge_dp_audio;
516 		bridge->funcs->dp_audio_shutdown(connector, bridge);
517 	}
518 }
519 
520 static int drm_bridge_connector_audio_mute_stream(struct drm_connector *connector,
521 						  bool enable, int direction)
522 {
523 	struct drm_bridge_connector *bridge_connector =
524 		to_drm_bridge_connector(connector);
525 	struct drm_bridge *bridge;
526 
527 	if (bridge_connector->bridge_hdmi_audio) {
528 		bridge = bridge_connector->bridge_hdmi_audio;
529 
530 		if (!bridge->funcs->hdmi_audio_mute_stream)
531 			return -ENOTSUPP;
532 
533 		return bridge->funcs->hdmi_audio_mute_stream(connector, bridge,
534 							     enable, direction);
535 	}
536 
537 	if (bridge_connector->bridge_dp_audio) {
538 		bridge = bridge_connector->bridge_dp_audio;
539 
540 		if (!bridge->funcs->dp_audio_mute_stream)
541 			return -ENOTSUPP;
542 
543 		return bridge->funcs->dp_audio_mute_stream(connector, bridge,
544 							   enable, direction);
545 	}
546 
547 	return -EINVAL;
548 }
549 
550 static const struct drm_connector_hdmi_audio_funcs drm_bridge_connector_hdmi_audio_funcs = {
551 	.startup = drm_bridge_connector_audio_startup,
552 	.prepare = drm_bridge_connector_audio_prepare,
553 	.shutdown = drm_bridge_connector_audio_shutdown,
554 	.mute_stream = drm_bridge_connector_audio_mute_stream,
555 };
556 
557 static int drm_bridge_connector_hdmi_cec_enable(struct drm_connector *connector, bool enable)
558 {
559 	struct drm_bridge_connector *bridge_connector =
560 		to_drm_bridge_connector(connector);
561 	struct drm_bridge *bridge;
562 
563 	bridge = bridge_connector->bridge_hdmi_cec;
564 
565 	return bridge->funcs->hdmi_cec_enable(bridge, enable);
566 }
567 
568 static int drm_bridge_connector_hdmi_cec_log_addr(struct drm_connector *connector, u8 logical_addr)
569 {
570 	struct drm_bridge_connector *bridge_connector =
571 		to_drm_bridge_connector(connector);
572 	struct drm_bridge *bridge;
573 
574 	bridge = bridge_connector->bridge_hdmi_cec;
575 
576 	return bridge->funcs->hdmi_cec_log_addr(bridge, logical_addr);
577 }
578 
579 static int drm_bridge_connector_hdmi_cec_transmit(struct drm_connector *connector,
580 						  u8 attempts,
581 						  u32 signal_free_time,
582 						  struct cec_msg *msg)
583 {
584 	struct drm_bridge_connector *bridge_connector =
585 		to_drm_bridge_connector(connector);
586 	struct drm_bridge *bridge;
587 
588 	bridge = bridge_connector->bridge_hdmi_cec;
589 
590 	return bridge->funcs->hdmi_cec_transmit(bridge, attempts,
591 						signal_free_time,
592 						msg);
593 }
594 
595 static int drm_bridge_connector_hdmi_cec_init(struct drm_connector *connector)
596 {
597 	struct drm_bridge_connector *bridge_connector =
598 		to_drm_bridge_connector(connector);
599 	struct drm_bridge *bridge;
600 
601 	bridge = bridge_connector->bridge_hdmi_cec;
602 
603 	if (!bridge->funcs->hdmi_cec_init)
604 		return 0;
605 
606 	return bridge->funcs->hdmi_cec_init(connector, bridge);
607 }
608 
609 static const struct drm_connector_hdmi_cec_funcs drm_bridge_connector_hdmi_cec_funcs = {
610 	.init = drm_bridge_connector_hdmi_cec_init,
611 	.enable = drm_bridge_connector_hdmi_cec_enable,
612 	.log_addr = drm_bridge_connector_hdmi_cec_log_addr,
613 	.transmit = drm_bridge_connector_hdmi_cec_transmit,
614 };
615 
616 /* -----------------------------------------------------------------------------
617  * Bridge Connector Initialisation
618  */
619 
620 /**
621  * drm_bridge_connector_init - Initialise a connector for a chain of bridges
622  * @drm: the DRM device
623  * @encoder: the encoder where the bridge chain starts
624  *
625  * Allocate, initialise and register a &drm_bridge_connector with the @drm
626  * device. The connector is associated with a chain of bridges that starts at
627  * the @encoder. All bridges in the chain shall report bridge operation flags
628  * (&drm_bridge->ops) and bridge output type (&drm_bridge->type), and none of
629  * them may create a DRM connector directly.
630  *
631  * Returns a pointer to the new connector on success, or a negative error
632  * pointer otherwise.
633  */
634 struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
635 						struct drm_encoder *encoder)
636 {
637 	struct drm_bridge_connector *bridge_connector;
638 	struct drm_connector *connector;
639 	struct i2c_adapter *ddc = NULL;
640 	struct drm_bridge *bridge, *panel_bridge = NULL;
641 	unsigned int supported_formats = BIT(HDMI_COLORSPACE_RGB);
642 	unsigned int max_bpc = 8;
643 	int connector_type;
644 	int ret;
645 
646 	bridge_connector = drmm_kzalloc(drm, sizeof(*bridge_connector), GFP_KERNEL);
647 	if (!bridge_connector)
648 		return ERR_PTR(-ENOMEM);
649 
650 	bridge_connector->encoder = encoder;
651 
652 	/*
653 	 * TODO: Handle doublescan_allowed and stereo_allowed.
654 	 */
655 	connector = &bridge_connector->base;
656 	connector->interlace_allowed = true;
657 	connector->ycbcr_420_allowed = true;
658 
659 	/*
660 	 * Initialise connector status handling. First locate the furthest
661 	 * bridges in the pipeline that support HPD and output detection. Then
662 	 * initialise the connector polling mode, using HPD if available and
663 	 * falling back to polling if supported. If neither HPD nor output
664 	 * detection are available, we don't support hotplug detection at all.
665 	 */
666 	connector_type = DRM_MODE_CONNECTOR_Unknown;
667 	drm_for_each_bridge_in_chain(encoder, bridge) {
668 		if (!bridge->interlace_allowed)
669 			connector->interlace_allowed = false;
670 		if (!bridge->ycbcr_420_allowed)
671 			connector->ycbcr_420_allowed = false;
672 
673 		if (bridge->ops & DRM_BRIDGE_OP_EDID)
674 			bridge_connector->bridge_edid = bridge;
675 		if (bridge->ops & DRM_BRIDGE_OP_HPD)
676 			bridge_connector->bridge_hpd = bridge;
677 		if (bridge->ops & DRM_BRIDGE_OP_DETECT)
678 			bridge_connector->bridge_detect = bridge;
679 		if (bridge->ops & DRM_BRIDGE_OP_MODES)
680 			bridge_connector->bridge_modes = bridge;
681 		if (bridge->ops & DRM_BRIDGE_OP_HDMI) {
682 			if (bridge_connector->bridge_hdmi)
683 				return ERR_PTR(-EBUSY);
684 			if (!bridge->funcs->hdmi_write_infoframe ||
685 			    !bridge->funcs->hdmi_clear_infoframe)
686 				return ERR_PTR(-EINVAL);
687 
688 			bridge_connector->bridge_hdmi = bridge;
689 
690 			if (bridge->supported_formats)
691 				supported_formats = bridge->supported_formats;
692 			if (bridge->max_bpc)
693 				max_bpc = bridge->max_bpc;
694 		}
695 
696 		if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) {
697 			if (bridge_connector->bridge_hdmi_audio)
698 				return ERR_PTR(-EBUSY);
699 
700 			if (bridge_connector->bridge_dp_audio)
701 				return ERR_PTR(-EBUSY);
702 
703 			if (!bridge->hdmi_audio_max_i2s_playback_channels &&
704 			    !bridge->hdmi_audio_spdif_playback)
705 				return ERR_PTR(-EINVAL);
706 
707 			if (!bridge->funcs->hdmi_audio_prepare ||
708 			    !bridge->funcs->hdmi_audio_shutdown)
709 				return ERR_PTR(-EINVAL);
710 
711 			bridge_connector->bridge_hdmi_audio = bridge;
712 		}
713 
714 		if (bridge->ops & DRM_BRIDGE_OP_DP_AUDIO) {
715 			if (bridge_connector->bridge_dp_audio)
716 				return ERR_PTR(-EBUSY);
717 
718 			if (bridge_connector->bridge_hdmi_audio)
719 				return ERR_PTR(-EBUSY);
720 
721 			if (!bridge->hdmi_audio_max_i2s_playback_channels &&
722 			    !bridge->hdmi_audio_spdif_playback)
723 				return ERR_PTR(-EINVAL);
724 
725 			if (!bridge->funcs->dp_audio_prepare ||
726 			    !bridge->funcs->dp_audio_shutdown)
727 				return ERR_PTR(-EINVAL);
728 
729 			bridge_connector->bridge_dp_audio = bridge;
730 		}
731 
732 		if (bridge->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) {
733 			if (bridge_connector->bridge_hdmi_cec)
734 				return ERR_PTR(-EBUSY);
735 
736 			bridge_connector->bridge_hdmi_cec = bridge;
737 		}
738 
739 		if (bridge->ops & DRM_BRIDGE_OP_HDMI_CEC_ADAPTER) {
740 			if (bridge_connector->bridge_hdmi_cec)
741 				return ERR_PTR(-EBUSY);
742 
743 			bridge_connector->bridge_hdmi_cec = bridge;
744 
745 			if (!bridge->funcs->hdmi_cec_enable ||
746 			    !bridge->funcs->hdmi_cec_log_addr ||
747 			    !bridge->funcs->hdmi_cec_transmit)
748 				return ERR_PTR(-EINVAL);
749 		}
750 
751 		if (!drm_bridge_get_next_bridge(bridge))
752 			connector_type = bridge->type;
753 
754 #ifdef CONFIG_OF
755 		if (!drm_bridge_get_next_bridge(bridge) &&
756 		    bridge->of_node)
757 			connector->fwnode = fwnode_handle_get(of_fwnode_handle(bridge->of_node));
758 #endif
759 
760 		if (bridge->ddc)
761 			ddc = bridge->ddc;
762 
763 		if (drm_bridge_is_panel(bridge))
764 			panel_bridge = bridge;
765 	}
766 
767 	if (connector_type == DRM_MODE_CONNECTOR_Unknown)
768 		return ERR_PTR(-EINVAL);
769 
770 	if (bridge_connector->bridge_hdmi) {
771 		if (!connector->ycbcr_420_allowed)
772 			supported_formats &= ~BIT(HDMI_COLORSPACE_YUV420);
773 
774 		bridge = bridge_connector->bridge_hdmi;
775 
776 		ret = drmm_connector_hdmi_init(drm, connector,
777 					       bridge_connector->bridge_hdmi->vendor,
778 					       bridge_connector->bridge_hdmi->product,
779 					       &drm_bridge_connector_funcs,
780 					       &drm_bridge_connector_hdmi_funcs,
781 					       connector_type, ddc,
782 					       supported_formats,
783 					       max_bpc);
784 		if (ret)
785 			return ERR_PTR(ret);
786 	} else {
787 		ret = drmm_connector_init(drm, connector,
788 					  &drm_bridge_connector_funcs,
789 					  connector_type, ddc);
790 		if (ret)
791 			return ERR_PTR(ret);
792 	}
793 
794 	if (bridge_connector->bridge_hdmi_audio ||
795 	    bridge_connector->bridge_dp_audio) {
796 		struct device *dev;
797 
798 		if (bridge_connector->bridge_hdmi_audio)
799 			dev = bridge_connector->bridge_hdmi_audio->hdmi_audio_dev;
800 		else
801 			dev = bridge_connector->bridge_dp_audio->hdmi_audio_dev;
802 
803 		ret = drm_connector_hdmi_audio_init(connector, dev,
804 						    &drm_bridge_connector_hdmi_audio_funcs,
805 						    bridge->hdmi_audio_max_i2s_playback_channels,
806 						    bridge->hdmi_audio_i2s_formats,
807 						    bridge->hdmi_audio_spdif_playback,
808 						    bridge->hdmi_audio_dai_port);
809 		if (ret)
810 			return ERR_PTR(ret);
811 	}
812 
813 	if (bridge_connector->bridge_hdmi_cec &&
814 	    bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) {
815 		ret = drmm_connector_hdmi_cec_notifier_register(connector,
816 								NULL,
817 								bridge->hdmi_cec_dev);
818 		if (ret)
819 			return ERR_PTR(ret);
820 	}
821 
822 	if (bridge_connector->bridge_hdmi_cec &&
823 	    bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_ADAPTER) {
824 		ret = drmm_connector_hdmi_cec_register(connector,
825 						       &drm_bridge_connector_hdmi_cec_funcs,
826 						       bridge->hdmi_cec_adapter_name,
827 						       bridge->hdmi_cec_available_las,
828 						       bridge->hdmi_cec_dev);
829 		if (ret)
830 			return ERR_PTR(ret);
831 	}
832 
833 	drm_connector_helper_add(connector, &drm_bridge_connector_helper_funcs);
834 
835 	if (bridge_connector->bridge_hpd)
836 		connector->polled = DRM_CONNECTOR_POLL_HPD;
837 	else if (bridge_connector->bridge_detect)
838 		connector->polled = DRM_CONNECTOR_POLL_CONNECT
839 				  | DRM_CONNECTOR_POLL_DISCONNECT;
840 
841 	if (panel_bridge)
842 		drm_panel_bridge_set_orientation(connector, panel_bridge);
843 
844 	return connector;
845 }
846 EXPORT_SYMBOL_GPL(drm_bridge_connector_init);
847