Skip to content

Commit ac40b4d

Browse files
agarwalvaibhavgregkh
authored andcommitted
staging: greybus: audio: Maintain jack list within GB Audio module
As per the current implementation for GB codec driver, a jack list is maintained for each module. And it expects the list to be populated by the snd_soc_jack structure which would require modifications in mainstream code. However, this is not a necessary requirement and the list can be easily maintained within gbaudio_module_info as well. This patch provides the relevant changes for the same. Signed-off-by: Vaibhav Agarwal <[email protected]> Reviewed-by: Dan Carpenter <[email protected]> Link: https://lore.kernel.org/r/4ee030af7a8e203f89a6e513313e36f4e2991e5b.1594290158.git.vaibhav.sr@gmail.com Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent b503aef commit ac40b4d

File tree

3 files changed

+53
-46
lines changed

3 files changed

+53
-46
lines changed

drivers/staging/greybus/audio_codec.c

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,7 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
712712
struct snd_soc_card *card)
713713
{
714714
int ret;
715+
struct gbaudio_jack *jack, *n;
715716
struct snd_soc_jack_pin *headset, *button;
716717

717718
if (!module->jack_mask)
@@ -726,14 +727,16 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
726727

727728
headset->pin = module->jack_name;
728729
headset->mask = module->jack_mask;
729-
730730
ret = snd_soc_card_jack_new(card, module->jack_name, module->jack_mask,
731-
&module->headset_jack, headset, 1);
731+
&module->headset.jack, headset, 1);
732732
if (ret) {
733733
dev_err(module->dev, "Failed to create new jack\n");
734734
return ret;
735735
}
736736

737+
/* Add to module's jack list */
738+
list_add(&module->headset.list, &module->jack_list);
739+
737740
if (!module->button_mask)
738741
return 0;
739742

@@ -742,20 +745,22 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
742745
button = devm_kzalloc(module->dev, sizeof(*button), GFP_KERNEL);
743746
if (!button) {
744747
ret = -ENOMEM;
745-
goto free_headset;
748+
goto free_jacks;
746749
}
747750

748751
button->pin = module->button_name;
749752
button->mask = module->button_mask;
750-
751753
ret = snd_soc_card_jack_new(card, module->button_name,
752-
module->button_mask, &module->button_jack,
754+
module->button_mask, &module->button.jack,
753755
button, 1);
754756
if (ret) {
755757
dev_err(module->dev, "Failed to create button jack\n");
756-
goto free_headset;
758+
goto free_jacks;
757759
}
758760

761+
/* Add to module's jack list */
762+
list_add(&module->button.list, &module->jack_list);
763+
759764
/*
760765
* Currently, max 4 buttons are supported with following key mapping
761766
* BTN_0 = KEY_MEDIA
@@ -765,56 +770,54 @@ static int gbaudio_init_jack(struct gbaudio_module_info *module,
765770
*/
766771

767772
if (module->button_mask & SND_JACK_BTN_0) {
768-
ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_0,
773+
ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_0,
769774
KEY_MEDIA);
770775
if (ret) {
771776
dev_err(module->dev, "Failed to set BTN_0\n");
772-
goto free_button;
777+
goto free_jacks;
773778
}
774779
}
775780

776781
if (module->button_mask & SND_JACK_BTN_1) {
777-
ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_1,
782+
ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_1,
778783
KEY_VOICECOMMAND);
779784
if (ret) {
780785
dev_err(module->dev, "Failed to set BTN_1\n");
781-
goto free_button;
786+
goto free_jacks;
782787
}
783788
}
784789

785790
if (module->button_mask & SND_JACK_BTN_2) {
786-
ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_2,
791+
ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_2,
787792
KEY_VOLUMEUP);
788793
if (ret) {
789794
dev_err(module->dev, "Failed to set BTN_2\n");
790-
goto free_button;
795+
goto free_jacks;
791796
}
792797
}
793798

794799
if (module->button_mask & SND_JACK_BTN_3) {
795-
ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_3,
800+
ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_3,
796801
KEY_VOLUMEDOWN);
797802
if (ret) {
798803
dev_err(module->dev, "Failed to set BTN_0\n");
799-
goto free_button;
804+
goto free_jacks;
800805
}
801806
}
802807

803808
/* FIXME
804809
* verify if this is really required
805810
set_bit(INPUT_PROP_NO_DUMMY_RELEASE,
806-
module->button_jack.jack->input_dev->propbit);
811+
module->button.jack.jack->input_dev->propbit);
807812
*/
808813

809814
return 0;
810815

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);
816+
free_jacks:
817+
list_for_each_entry_safe(jack, n, &module->jack_list, list) {
818+
snd_device_free(card->snd_card, jack->jack.jack);
819+
list_del(&jack->list);
820+
}
818821

819822
return ret;
820823
}
@@ -824,7 +827,7 @@ int gbaudio_register_module(struct gbaudio_module_info *module)
824827
int ret;
825828
struct snd_soc_codec *codec;
826829
struct snd_card *card;
827-
struct snd_soc_jack *jack = NULL;
830+
struct gbaudio_jack *jack = NULL;
828831

829832
if (!gbcodec) {
830833
dev_err(module->dev, "GB Codec not yet probed\n");
@@ -869,11 +872,9 @@ int gbaudio_register_module(struct gbaudio_module_info *module)
869872
* register jack devices for this module
870873
* from codec->jack_list
871874
*/
872-
list_for_each_entry(jack, &codec->jack_list, list) {
873-
if ((jack == &module->headset_jack) ||
874-
(jack == &module->button_jack))
875-
snd_device_register(codec->card->snd_card,
876-
jack->jack);
875+
list_for_each_entry(jack, &module->jack_list, list) {
876+
snd_device_register(codec->card->snd_card,
877+
jack->jack.jack);
877878
}
878879
#endif
879880
}
@@ -957,7 +958,7 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module)
957958
{
958959
struct snd_soc_codec *codec = gbcodec->codec;
959960
struct snd_card *card = codec->card->snd_card;
960-
struct snd_soc_jack *jack, *next_j;
961+
struct gbaudio_jack *jack, *n;
961962
int mask;
962963

963964
dev_dbg(codec->dev, "Unregister %s module\n", module->name);
@@ -970,20 +971,19 @@ void gbaudio_unregister_module(struct gbaudio_module_info *module)
970971
mutex_unlock(&gbcodec->lock);
971972

972973
#ifdef CONFIG_SND_JACK
973-
/* free jack devices for this module from codec->jack_list */
974-
list_for_each_entry_safe(jack, next_j, &component->card->jack_list,
975-
list) {
976-
if (jack == &module->headset_jack)
974+
/* free jack devices for this module jack_list */
975+
list_for_each_entry_safe(jack, n, &module->jack_list, list) {
976+
if (jack == &module->headset)
977977
mask = GBCODEC_JACK_MASK;
978-
else if (jack == &module->button_jack)
978+
else if (jack == &module->button)
979979
mask = GBCODEC_JACK_BUTTON_MASK;
980980
else
981981
mask = 0;
982982
if (mask) {
983983
dev_dbg(module->dev, "Report %s removal\n",
984-
jack->jack->id);
985-
snd_soc_jack_report(jack, 0, mask);
986-
snd_device_free(codec->card->snd_card, jack->jack);
984+
jack->jack.jack->id);
985+
snd_soc_jack_report(&jack->jack, 0, mask);
986+
snd_device_free(codec->card->snd_card, jack->jack.jack);
987987
list_del(&jack->list);
988988
}
989989
}

drivers/staging/greybus/audio_codec.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ enum gbaudio_module_state {
106106
GBAUDIO_MODULE_ON,
107107
};
108108

109+
struct gbaudio_jack {
110+
struct snd_soc_jack jack;
111+
struct list_head list;
112+
};
113+
109114
struct gbaudio_module_info {
110115
/* module info */
111116
struct device *dev;
@@ -130,8 +135,8 @@ struct gbaudio_module_info {
130135
int jack_mask;
131136
int button_mask;
132137
int button_status;
133-
struct snd_soc_jack headset_jack;
134-
struct snd_soc_jack button_jack;
138+
struct gbaudio_jack headset;
139+
struct gbaudio_jack button;
135140

136141
/* connection info */
137142
struct gb_connection *mgmt_connection;
@@ -155,6 +160,7 @@ struct gbaudio_module_info {
155160
struct list_head widget_list;
156161
struct list_head ctl_list;
157162
struct list_head widget_ctl_list;
163+
struct list_head jack_list;
158164

159165
struct gb_audio_topology *topology;
160166
};

drivers/staging/greybus/audio_module.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ static int gbaudio_request_jack(struct gbaudio_module_info *module,
2121
struct gb_audio_jack_event_request *req)
2222
{
2323
int report;
24-
struct snd_jack *jack = module->headset_jack.jack;
25-
struct snd_jack *btn_jack = module->button_jack.jack;
24+
struct snd_jack *jack = module->headset.jack.jack;
25+
struct snd_jack *btn_jack = module->button.jack.jack;
2626

2727
if (!jack) {
2828
dev_err_ratelimited(module->dev,
@@ -38,11 +38,11 @@ static int gbaudio_request_jack(struct gbaudio_module_info *module,
3838
if (req->event == GB_AUDIO_JACK_EVENT_REMOVAL) {
3939
module->jack_type = 0;
4040
if (btn_jack && module->button_status) {
41-
snd_soc_jack_report(&module->button_jack, 0,
41+
snd_soc_jack_report(&module->button.jack, 0,
4242
module->button_mask);
4343
module->button_status = 0;
4444
}
45-
snd_soc_jack_report(&module->headset_jack, 0,
45+
snd_soc_jack_report(&module->headset.jack, 0,
4646
module->jack_mask);
4747
return 0;
4848
}
@@ -61,7 +61,7 @@ static int gbaudio_request_jack(struct gbaudio_module_info *module,
6161
module->jack_type, report);
6262

6363
module->jack_type = report;
64-
snd_soc_jack_report(&module->headset_jack, report, module->jack_mask);
64+
snd_soc_jack_report(&module->headset.jack, report, module->jack_mask);
6565

6666
return 0;
6767
}
@@ -70,7 +70,7 @@ static int gbaudio_request_button(struct gbaudio_module_info *module,
7070
struct gb_audio_button_event_request *req)
7171
{
7272
int soc_button_id, report;
73-
struct snd_jack *btn_jack = module->button_jack.jack;
73+
struct snd_jack *btn_jack = module->button.jack.jack;
7474

7575
if (!btn_jack) {
7676
dev_err_ratelimited(module->dev,
@@ -124,7 +124,7 @@ static int gbaudio_request_button(struct gbaudio_module_info *module,
124124

125125
module->button_status = report;
126126

127-
snd_soc_jack_report(&module->button_jack, report, module->button_mask);
127+
snd_soc_jack_report(&module->button.jack, report, module->button_mask);
128128

129129
return 0;
130130
}
@@ -258,6 +258,7 @@ static int gb_audio_probe(struct gb_bundle *bundle,
258258
INIT_LIST_HEAD(&gbmodule->widget_list);
259259
INIT_LIST_HEAD(&gbmodule->ctl_list);
260260
INIT_LIST_HEAD(&gbmodule->widget_ctl_list);
261+
INIT_LIST_HEAD(&gbmodule->jack_list);
261262
gbmodule->dev = dev;
262263
snprintf(gbmodule->name, NAME_SIZE, "%s.%s", dev->driver->name,
263264
dev_name(dev));

0 commit comments

Comments
 (0)