@@ -709,17 +709,26 @@ static struct snd_soc_dai_driver gbaudio_dai[] = {
709
709
};
710
710
711
711
static int gbaudio_init_jack (struct gbaudio_module_info * module ,
712
- struct snd_soc_codec * codec )
712
+ struct snd_soc_card * card )
713
713
{
714
714
int ret ;
715
+ struct snd_soc_jack_pin * headset , * button ;
715
716
716
717
if (!module -> jack_mask )
717
718
return 0 ;
718
719
719
720
snprintf (module -> jack_name , NAME_SIZE , "GB %d Headset Jack" ,
720
721
module -> dev_id );
721
- ret = snd_soc_jack_new (codec , module -> jack_name , module -> jack_mask ,
722
- & module -> headset_jack );
722
+
723
+ headset = devm_kzalloc (module -> dev , sizeof (* headset ), GFP_KERNEL );
724
+ if (!headset )
725
+ return - ENOMEM ;
726
+
727
+ headset -> pin = module -> jack_name ;
728
+ headset -> mask = module -> jack_mask ;
729
+
730
+ ret = snd_soc_card_jack_new (card , module -> jack_name , module -> jack_mask ,
731
+ & module -> headset_jack , headset , 1 );
723
732
if (ret ) {
724
733
dev_err (module -> dev , "Failed to create new jack\n" );
725
734
return ret ;
@@ -730,11 +739,21 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
730
739
731
740
snprintf (module -> button_name , NAME_SIZE , "GB %d Button Jack" ,
732
741
module -> dev_id );
733
- ret = snd_soc_jack_new (codec , module -> button_name , module -> button_mask ,
734
- & module -> button_jack );
742
+ button = devm_kzalloc (module -> dev , sizeof (* button ), GFP_KERNEL );
743
+ if (!button ) {
744
+ ret = - ENOMEM ;
745
+ goto free_headset ;
746
+ }
747
+
748
+ button -> pin = module -> button_name ;
749
+ button -> mask = module -> button_mask ;
750
+
751
+ ret = snd_soc_card_jack_new (card , module -> button_name ,
752
+ module -> button_mask , & module -> button_jack ,
753
+ button , 1 );
735
754
if (ret ) {
736
755
dev_err (module -> dev , "Failed to create button jack\n" );
737
- return ret ;
756
+ goto free_headset ;
738
757
}
739
758
740
759
/*
@@ -750,7 +769,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
750
769
KEY_MEDIA );
751
770
if (ret ) {
752
771
dev_err (module -> dev , "Failed to set BTN_0\n" );
753
- return ret ;
772
+ goto free_button ;
754
773
}
755
774
}
756
775
@@ -759,7 +778,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
759
778
KEY_VOICECOMMAND );
760
779
if (ret ) {
761
780
dev_err (module -> dev , "Failed to set BTN_1\n" );
762
- return ret ;
781
+ goto free_button ;
763
782
}
764
783
}
765
784
@@ -768,7 +787,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
768
787
KEY_VOLUMEUP );
769
788
if (ret ) {
770
789
dev_err (module -> dev , "Failed to set BTN_2\n" );
771
- return ret ;
790
+ goto free_button ;
772
791
}
773
792
}
774
793
@@ -777,7 +796,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
777
796
KEY_VOLUMEDOWN );
778
797
if (ret ) {
779
798
dev_err (module -> dev , "Failed to set BTN_0\n" );
780
- return ret ;
799
+ goto free_button ;
781
800
}
782
801
}
783
802
@@ -788,6 +807,16 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
788
807
*/
789
808
790
809
return 0 ;
810
+
811
+ free_button :
812
+ snd_device_free (card -> snd_card , module -> button_jack .jack );
813
+ list_del (& module -> button_jack .list );
814
+
815
+ free_headset :
816
+ snd_device_free (card -> snd_card , module -> headset_jack .jack );
817
+ list_del (& module -> headset_jack .list );
818
+
819
+ return ret ;
791
820
}
792
821
793
822
int gbaudio_register_module (struct gbaudio_module_info * module )
@@ -815,7 +844,7 @@ int gbaudio_register_module(struct gbaudio_module_info *module)
815
844
return - EINVAL ;
816
845
}
817
846
818
- ret = gbaudio_init_jack (module , codec );
847
+ ret = gbaudio_init_jack (module , component -> card );
819
848
if (ret ) {
820
849
up_write (& card -> controls_rwsem );
821
850
return ret ;
@@ -942,7 +971,8 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module)
942
971
943
972
#ifdef CONFIG_SND_JACK
944
973
/* free jack devices for this module from codec->jack_list */
945
- list_for_each_entry_safe (jack , next_j , & codec -> jack_list , list ) {
974
+ list_for_each_entry_safe (jack , next_j , & component -> card -> jack_list ,
975
+ list ) {
946
976
if (jack == & module -> headset_jack )
947
977
mask = GBCODEC_JACK_MASK ;
948
978
else if (jack == & module -> button_jack )
0 commit comments