@@ -621,34 +621,27 @@ nv50_audio_component_get_eld(struct device *kdev, int port, int dev_id,
621
621
struct nouveau_drm * drm = nouveau_drm (drm_dev );
622
622
struct drm_encoder * encoder ;
623
623
struct nouveau_encoder * nv_encoder ;
624
- struct drm_connector * connector ;
625
624
struct nouveau_crtc * nv_crtc ;
626
- struct drm_connector_list_iter conn_iter ;
627
625
int ret = 0 ;
628
626
629
627
* enabled = false;
630
628
629
+ mutex_lock (& drm -> audio .lock );
630
+
631
631
drm_for_each_encoder (encoder , drm -> dev ) {
632
632
struct nouveau_connector * nv_connector = NULL ;
633
633
634
+ if (encoder -> encoder_type == DRM_MODE_ENCODER_DPMST )
635
+ continue ; /* TODO */
636
+
634
637
nv_encoder = nouveau_encoder (encoder );
638
+ nv_connector = nouveau_connector (nv_encoder -> audio .connector );
639
+ nv_crtc = nouveau_crtc (nv_encoder -> crtc );
635
640
636
- drm_connector_list_iter_begin (drm_dev , & conn_iter );
637
- drm_for_each_connector_iter (connector , & conn_iter ) {
638
- if (connector -> state -> best_encoder == encoder ) {
639
- nv_connector = nouveau_connector (connector );
640
- break ;
641
- }
642
- }
643
- drm_connector_list_iter_end (& conn_iter );
644
- if (!nv_connector )
641
+ if (!nv_crtc || nv_encoder -> or != port || nv_crtc -> index != dev_id )
645
642
continue ;
646
643
647
- nv_crtc = nouveau_crtc (nv_encoder -> crtc );
648
- if (!nv_crtc || nv_encoder -> or != port ||
649
- nv_crtc -> index != dev_id )
650
- continue ;
651
- * enabled = nv_encoder -> audio ;
644
+ * enabled = nv_encoder -> audio .enabled ;
652
645
if (* enabled ) {
653
646
ret = drm_eld_size (nv_connector -> base .eld );
654
647
memcpy (buf , nv_connector -> base .eld ,
@@ -657,6 +650,8 @@ nv50_audio_component_get_eld(struct device *kdev, int port, int dev_id,
657
650
break ;
658
651
}
659
652
653
+ mutex_unlock (& drm -> audio .lock );
654
+
660
655
return ret ;
661
656
}
662
657
@@ -706,17 +701,22 @@ static const struct component_ops nv50_audio_component_bind_ops = {
706
701
static void
707
702
nv50_audio_component_init (struct nouveau_drm * drm )
708
703
{
709
- if (!component_add (drm -> dev -> dev , & nv50_audio_component_bind_ops ))
710
- drm -> audio .component_registered = true;
704
+ if (component_add (drm -> dev -> dev , & nv50_audio_component_bind_ops ))
705
+ return ;
706
+
707
+ drm -> audio .component_registered = true;
708
+ mutex_init (& drm -> audio .lock );
711
709
}
712
710
713
711
static void
714
712
nv50_audio_component_fini (struct nouveau_drm * drm )
715
713
{
716
- if (drm -> audio .component_registered ) {
717
- component_del (drm -> dev -> dev , & nv50_audio_component_bind_ops );
718
- drm -> audio .component_registered = false;
719
- }
714
+ if (!drm -> audio .component_registered )
715
+ return ;
716
+
717
+ component_del (drm -> dev -> dev , & nv50_audio_component_bind_ops );
718
+ drm -> audio .component_registered = false;
719
+ mutex_destroy (& drm -> audio .lock );
720
720
}
721
721
722
722
/******************************************************************************
@@ -739,11 +739,13 @@ nv50_audio_disable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc)
739
739
(0x0100 << nv_crtc -> index ),
740
740
};
741
741
742
- if (!nv_encoder -> audio )
743
- return ;
744
-
745
- nv_encoder -> audio = false;
746
- nvif_mthd (& disp -> disp -> object , 0 , & args , sizeof (args ));
742
+ mutex_lock (& drm -> audio .lock );
743
+ if (nv_encoder -> audio .enabled ) {
744
+ nv_encoder -> audio .enabled = false;
745
+ nv_encoder -> audio .connector = NULL ;
746
+ nvif_mthd (& disp -> disp -> object , 0 , & args , sizeof (args ));
747
+ }
748
+ mutex_unlock (& drm -> audio .lock );
747
749
748
750
nv50_audio_component_eld_notify (drm -> audio .component , nv_encoder -> or ,
749
751
nv_crtc -> index );
@@ -774,11 +776,16 @@ nv50_audio_enable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc,
774
776
if (!drm_detect_monitor_audio (nv_connector -> edid ))
775
777
return ;
776
778
779
+ mutex_lock (& drm -> audio .lock );
780
+
777
781
memcpy (args .data , nv_connector -> base .eld , sizeof (args .data ));
778
782
779
783
nvif_mthd (& disp -> disp -> object , 0 , & args ,
780
784
sizeof (args .base ) + drm_eld_size (args .data ));
781
- nv_encoder -> audio = true;
785
+ nv_encoder -> audio .enabled = true;
786
+ nv_encoder -> audio .connector = & nv_connector -> base ;
787
+
788
+ mutex_unlock (& drm -> audio .lock );
782
789
783
790
nv50_audio_component_eld_notify (drm -> audio .component , nv_encoder -> or ,
784
791
nv_crtc -> index );
@@ -1649,8 +1656,6 @@ nv50_sor_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *st
1649
1656
struct drm_dp_aux * aux = & nv_connector -> aux ;
1650
1657
u8 pwr ;
1651
1658
1652
- nv_encoder -> crtc = NULL ;
1653
-
1654
1659
if (nv_encoder -> dcb -> type == DCB_OUTPUT_DP ) {
1655
1660
int ret = drm_dp_dpcd_readb (aux , DP_SET_POWER , & pwr );
1656
1661
@@ -1665,6 +1670,7 @@ nv50_sor_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *st
1665
1670
nv50_audio_disable (encoder , nv_crtc );
1666
1671
nv50_hdmi_disable (& nv_encoder -> base .base , nv_crtc );
1667
1672
nv50_outp_release (nv_encoder );
1673
+ nv_encoder -> crtc = NULL ;
1668
1674
}
1669
1675
1670
1676
static void
0 commit comments