18
18
#include <drm/drm_managed.h>
19
19
#include <drm/drm_modeset_helper_vtables.h>
20
20
#include <drm/drm_probe_helper.h>
21
+ #include <drm/display/drm_hdmi_audio_helper.h>
21
22
#include <drm/display/drm_hdmi_helper.h>
22
23
#include <drm/display/drm_hdmi_state_helper.h>
23
24
@@ -387,6 +388,75 @@ static const struct drm_connector_hdmi_funcs drm_bridge_connector_hdmi_funcs = {
387
388
.write_infoframe = drm_bridge_connector_write_infoframe ,
388
389
};
389
390
391
+ static int drm_bridge_connector_audio_startup (struct drm_connector * connector )
392
+ {
393
+ struct drm_bridge_connector * bridge_connector =
394
+ to_drm_bridge_connector (connector );
395
+ struct drm_bridge * bridge ;
396
+
397
+ bridge = bridge_connector -> bridge_hdmi ;
398
+ if (!bridge )
399
+ return - EINVAL ;
400
+
401
+ if (!bridge -> funcs -> hdmi_audio_startup )
402
+ return 0 ;
403
+
404
+ return bridge -> funcs -> hdmi_audio_startup (connector , bridge );
405
+ }
406
+
407
+ static int drm_bridge_connector_audio_prepare (struct drm_connector * connector ,
408
+ struct hdmi_codec_daifmt * fmt ,
409
+ struct hdmi_codec_params * hparms )
410
+ {
411
+ struct drm_bridge_connector * bridge_connector =
412
+ to_drm_bridge_connector (connector );
413
+ struct drm_bridge * bridge ;
414
+
415
+ bridge = bridge_connector -> bridge_hdmi ;
416
+ if (!bridge )
417
+ return - EINVAL ;
418
+
419
+ return bridge -> funcs -> hdmi_audio_prepare (connector , bridge , fmt , hparms );
420
+ }
421
+
422
+ static void drm_bridge_connector_audio_shutdown (struct drm_connector * connector )
423
+ {
424
+ struct drm_bridge_connector * bridge_connector =
425
+ to_drm_bridge_connector (connector );
426
+ struct drm_bridge * bridge ;
427
+
428
+ bridge = bridge_connector -> bridge_hdmi ;
429
+ if (!bridge )
430
+ return ;
431
+
432
+ bridge -> funcs -> hdmi_audio_shutdown (connector , bridge );
433
+ }
434
+
435
+ static int drm_bridge_connector_audio_mute_stream (struct drm_connector * connector ,
436
+ bool enable , int direction )
437
+ {
438
+ struct drm_bridge_connector * bridge_connector =
439
+ to_drm_bridge_connector (connector );
440
+ struct drm_bridge * bridge ;
441
+
442
+ bridge = bridge_connector -> bridge_hdmi ;
443
+ if (!bridge )
444
+ return - EINVAL ;
445
+
446
+ if (bridge -> funcs -> hdmi_audio_mute_stream )
447
+ return bridge -> funcs -> hdmi_audio_mute_stream (connector , bridge ,
448
+ enable , direction );
449
+ else
450
+ return - ENOTSUPP ;
451
+ }
452
+
453
+ static const struct drm_connector_hdmi_audio_funcs drm_bridge_connector_hdmi_audio_funcs = {
454
+ .startup = drm_bridge_connector_audio_startup ,
455
+ .prepare = drm_bridge_connector_audio_prepare ,
456
+ .shutdown = drm_bridge_connector_audio_shutdown ,
457
+ .mute_stream = drm_bridge_connector_audio_mute_stream ,
458
+ };
459
+
390
460
/* -----------------------------------------------------------------------------
391
461
* Bridge Connector Initialisation
392
462
*/
@@ -486,7 +556,9 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
486
556
if (connector_type == DRM_MODE_CONNECTOR_Unknown )
487
557
return ERR_PTR (- EINVAL );
488
558
489
- if (bridge_connector -> bridge_hdmi )
559
+ if (bridge_connector -> bridge_hdmi ) {
560
+ bridge = bridge_connector -> bridge_hdmi ;
561
+
490
562
ret = drmm_connector_hdmi_init (drm , connector ,
491
563
bridge_connector -> bridge_hdmi -> vendor ,
492
564
bridge_connector -> bridge_hdmi -> product ,
@@ -495,12 +567,31 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
495
567
connector_type , ddc ,
496
568
supported_formats ,
497
569
max_bpc );
498
- else
570
+ if (ret )
571
+ return ERR_PTR (ret );
572
+
573
+ if (bridge -> hdmi_audio_max_i2s_playback_channels ||
574
+ bridge -> hdmi_audio_spdif_playback ) {
575
+ if (!bridge -> funcs -> hdmi_audio_prepare ||
576
+ !bridge -> funcs -> hdmi_audio_shutdown )
577
+ return ERR_PTR (- EINVAL );
578
+
579
+ ret = drm_connector_hdmi_audio_init (connector ,
580
+ bridge -> hdmi_audio_dev ,
581
+ & drm_bridge_connector_hdmi_audio_funcs ,
582
+ bridge -> hdmi_audio_max_i2s_playback_channels ,
583
+ bridge -> hdmi_audio_spdif_playback ,
584
+ bridge -> hdmi_audio_dai_port );
585
+ if (ret )
586
+ return ERR_PTR (ret );
587
+ }
588
+ } else {
499
589
ret = drmm_connector_init (drm , connector ,
500
590
& drm_bridge_connector_funcs ,
501
591
connector_type , ddc );
502
- if (ret )
503
- return ERR_PTR (ret );
592
+ if (ret )
593
+ return ERR_PTR (ret );
594
+ }
504
595
505
596
drm_connector_helper_add (connector , & drm_bridge_connector_helper_funcs );
506
597
0 commit comments