1 // SPDX-License-Identifier: GPL-2.0
3 * APBridge ALSA SoC dummy codec driver
4 * Copyright 2016 Google Inc.
5 * Copyright 2016 Linaro Ltd.
7 #include <linux/kernel.h>
8 #include <linux/module.h>
9 #include <linux/pm_runtime.h>
10 #include <sound/soc.h>
11 #include <sound/pcm_params.h>
12 #include <uapi/linux/input.h>
14 #include "audio_codec.h"
15 #include "audio_apbridgea.h"
16 #include "audio_manager.h"
17 #include "audio_helper.h"
19 static struct gbaudio_codec_info *gbcodec;
21 static struct gbaudio_data_connection *
22 find_data(struct gbaudio_module_info *module, int id)
24 struct gbaudio_data_connection *data;
26 list_for_each_entry(data, &module->data_list, list) {
33 static struct gbaudio_stream_params *
34 find_dai_stream_params(struct gbaudio_codec_info *codec, int id, int stream)
36 struct gbaudio_codec_dai *dai;
38 list_for_each_entry(dai, &codec->dai_list, list) {
40 return &dai->params[stream];
45 static int gbaudio_module_enable_tx(struct gbaudio_codec_info *codec,
46 struct gbaudio_module_info *module, int id)
48 int module_state, ret = 0;
49 u16 data_cport, i2s_port, cportid;
50 u8 sig_bits, channels;
52 struct gbaudio_data_connection *data;
53 struct gbaudio_stream_params *params;
56 data = find_data(module, id);
58 dev_err(module->dev, "%d:DATA connection missing\n", id);
61 module_state = data->state[SNDRV_PCM_STREAM_PLAYBACK];
63 params = find_dai_stream_params(codec, id, SNDRV_PCM_STREAM_PLAYBACK);
65 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
70 if (module_state < GBAUDIO_CODEC_STARTUP) {
71 i2s_port = 0; /* fixed for now */
72 cportid = data->connection->hd_cport_id;
73 ret = gb_audio_apbridgea_register_cport(data->connection,
75 AUDIO_APBRIDGEA_DIRECTION_TX);
77 dev_err_ratelimited(module->dev, "reg_cport failed:%d\n", ret);
80 data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_STARTUP;
81 dev_dbg(module->dev, "Dynamic Register %d DAI\n", cportid);
85 if (module_state < GBAUDIO_CODEC_HWPARAMS) {
86 format = params->format;
87 channels = params->channels;
89 sig_bits = params->sig_bits;
90 data_cport = data->connection->intf_cport_id;
91 ret = gb_audio_gb_set_pcm(module->mgmt_connection, data_cport,
92 format, rate, channels, sig_bits);
94 dev_err_ratelimited(module->dev, "set_pcm failed:%d\n", ret);
97 data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_HWPARAMS;
98 dev_dbg(module->dev, "Dynamic hw_params %d DAI\n", data_cport);
102 if (module_state < GBAUDIO_CODEC_PREPARE) {
103 data_cport = data->connection->intf_cport_id;
104 ret = gb_audio_gb_set_tx_data_size(module->mgmt_connection,
107 dev_err_ratelimited(module->dev,
108 "set_tx_data_size failed:%d\n",
112 ret = gb_audio_gb_activate_tx(module->mgmt_connection, data_cport);
114 dev_err_ratelimited(module->dev,
115 "activate_tx failed:%d\n", ret);
118 data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_PREPARE;
119 dev_dbg(module->dev, "Dynamic prepare %d DAI\n", data_cport);
125 static int gbaudio_module_disable_tx(struct gbaudio_module_info *module, int id)
128 u16 data_cport, cportid, i2s_port;
130 struct gbaudio_data_connection *data;
133 data = find_data(module, id);
135 dev_err(module->dev, "%d:DATA connection missing\n", id);
138 module_state = data->state[SNDRV_PCM_STREAM_PLAYBACK];
140 if (module_state > GBAUDIO_CODEC_HWPARAMS) {
141 data_cport = data->connection->intf_cport_id;
142 ret = gb_audio_gb_deactivate_tx(module->mgmt_connection,
145 dev_err_ratelimited(module->dev,
146 "deactivate_tx failed:%d\n", ret);
149 dev_dbg(module->dev, "Dynamic deactivate %d DAI\n", data_cport);
150 data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_HWPARAMS;
153 if (module_state > GBAUDIO_CODEC_SHUTDOWN) {
154 i2s_port = 0; /* fixed for now */
155 cportid = data->connection->hd_cport_id;
156 ret = gb_audio_apbridgea_unregister_cport(data->connection,
158 AUDIO_APBRIDGEA_DIRECTION_TX);
160 dev_err_ratelimited(module->dev,
161 "unregister_cport failed:%d\n", ret);
164 dev_dbg(module->dev, "Dynamic Unregister %d DAI\n", cportid);
165 data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_SHUTDOWN;
171 static int gbaudio_module_enable_rx(struct gbaudio_codec_info *codec,
172 struct gbaudio_module_info *module, int id)
174 int module_state, ret = 0;
175 u16 data_cport, i2s_port, cportid;
176 u8 sig_bits, channels;
178 struct gbaudio_data_connection *data;
179 struct gbaudio_stream_params *params;
182 data = find_data(module, id);
184 dev_err(module->dev, "%d:DATA connection missing\n", id);
187 module_state = data->state[SNDRV_PCM_STREAM_CAPTURE];
189 params = find_dai_stream_params(codec, id, SNDRV_PCM_STREAM_CAPTURE);
191 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
196 if (module_state < GBAUDIO_CODEC_STARTUP) {
197 i2s_port = 0; /* fixed for now */
198 cportid = data->connection->hd_cport_id;
199 ret = gb_audio_apbridgea_register_cport(data->connection,
201 AUDIO_APBRIDGEA_DIRECTION_RX);
203 dev_err_ratelimited(module->dev, "reg_cport failed:%d\n", ret);
206 data->state[SNDRV_PCM_STREAM_CAPTURE] = GBAUDIO_CODEC_STARTUP;
207 dev_dbg(module->dev, "Dynamic Register %d DAI\n", cportid);
211 if (module_state < GBAUDIO_CODEC_HWPARAMS) {
212 format = params->format;
213 channels = params->channels;
215 sig_bits = params->sig_bits;
216 data_cport = data->connection->intf_cport_id;
217 ret = gb_audio_gb_set_pcm(module->mgmt_connection, data_cport,
218 format, rate, channels, sig_bits);
220 dev_err_ratelimited(module->dev, "set_pcm failed:%d\n", ret);
223 data->state[SNDRV_PCM_STREAM_CAPTURE] = GBAUDIO_CODEC_HWPARAMS;
224 dev_dbg(module->dev, "Dynamic hw_params %d DAI\n", data_cport);
228 if (module_state < GBAUDIO_CODEC_PREPARE) {
229 data_cport = data->connection->intf_cport_id;
230 ret = gb_audio_gb_set_rx_data_size(module->mgmt_connection,
233 dev_err_ratelimited(module->dev,
234 "set_rx_data_size failed:%d\n",
238 ret = gb_audio_gb_activate_rx(module->mgmt_connection,
241 dev_err_ratelimited(module->dev,
242 "activate_rx failed:%d\n", ret);
245 data->state[SNDRV_PCM_STREAM_CAPTURE] = GBAUDIO_CODEC_PREPARE;
246 dev_dbg(module->dev, "Dynamic prepare %d DAI\n", data_cport);
252 static int gbaudio_module_disable_rx(struct gbaudio_module_info *module, int id)
255 u16 data_cport, cportid, i2s_port;
257 struct gbaudio_data_connection *data;
260 data = find_data(module, id);
262 dev_err(module->dev, "%d:DATA connection missing\n", id);
265 module_state = data->state[SNDRV_PCM_STREAM_CAPTURE];
267 if (module_state > GBAUDIO_CODEC_HWPARAMS) {
268 data_cport = data->connection->intf_cport_id;
269 ret = gb_audio_gb_deactivate_rx(module->mgmt_connection,
272 dev_err_ratelimited(module->dev,
273 "deactivate_rx failed:%d\n", ret);
276 dev_dbg(module->dev, "Dynamic deactivate %d DAI\n", data_cport);
277 data->state[SNDRV_PCM_STREAM_CAPTURE] = GBAUDIO_CODEC_HWPARAMS;
280 if (module_state > GBAUDIO_CODEC_SHUTDOWN) {
281 i2s_port = 0; /* fixed for now */
282 cportid = data->connection->hd_cport_id;
283 ret = gb_audio_apbridgea_unregister_cport(data->connection,
285 AUDIO_APBRIDGEA_DIRECTION_RX);
287 dev_err_ratelimited(module->dev,
288 "unregister_cport failed:%d\n", ret);
291 dev_dbg(module->dev, "Dynamic Unregister %d DAI\n", cportid);
292 data->state[SNDRV_PCM_STREAM_CAPTURE] = GBAUDIO_CODEC_SHUTDOWN;
298 int gbaudio_module_update(struct gbaudio_codec_info *codec,
299 struct snd_soc_dapm_widget *w,
300 struct gbaudio_module_info *module, int enable)
303 char intf_name[NAME_SIZE], dir[NAME_SIZE];
305 dev_dbg(module->dev, "%s:Module update %s sequence\n", w->name,
306 enable ? "Enable" : "Disable");
308 if ((w->id != snd_soc_dapm_aif_in) && (w->id != snd_soc_dapm_aif_out)) {
309 dev_dbg(codec->dev, "No action required for %s\n", w->name);
313 /* parse dai_id from AIF widget's stream_name */
314 ret = sscanf(w->sname, "%s %d %s", intf_name, &dai_id, dir);
316 dev_err(codec->dev, "Error while parsing dai_id for %s\n", w->name);
320 mutex_lock(&codec->lock);
321 if (w->id == snd_soc_dapm_aif_in) {
323 ret = gbaudio_module_enable_tx(codec, module, dai_id);
325 ret = gbaudio_module_disable_tx(module, dai_id);
326 } else if (w->id == snd_soc_dapm_aif_out) {
328 ret = gbaudio_module_enable_rx(codec, module, dai_id);
330 ret = gbaudio_module_disable_rx(module, dai_id);
333 mutex_unlock(&codec->lock);
337 EXPORT_SYMBOL(gbaudio_module_update);
342 static int gbcodec_startup(struct snd_pcm_substream *substream,
343 struct snd_soc_dai *dai)
345 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
346 struct gbaudio_stream_params *params;
348 mutex_lock(&codec->lock);
350 if (list_empty(&codec->module_list)) {
351 dev_err(codec->dev, "No codec module available\n");
352 mutex_unlock(&codec->lock);
356 params = find_dai_stream_params(codec, dai->id, substream->stream);
358 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
359 mutex_unlock(&codec->lock);
362 params->state = GBAUDIO_CODEC_STARTUP;
363 mutex_unlock(&codec->lock);
364 /* to prevent suspend in case of active audio */
365 pm_stay_awake(dai->dev);
370 static void gbcodec_shutdown(struct snd_pcm_substream *substream,
371 struct snd_soc_dai *dai)
373 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
374 struct gbaudio_stream_params *params;
376 mutex_lock(&codec->lock);
378 if (list_empty(&codec->module_list))
379 dev_info(codec->dev, "No codec module available during shutdown\n");
381 params = find_dai_stream_params(codec, dai->id, substream->stream);
383 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
384 mutex_unlock(&codec->lock);
387 params->state = GBAUDIO_CODEC_SHUTDOWN;
388 mutex_unlock(&codec->lock);
392 static int gbcodec_hw_params(struct snd_pcm_substream *substream,
393 struct snd_pcm_hw_params *hwparams,
394 struct snd_soc_dai *dai)
397 u8 sig_bits, channels;
399 struct gbaudio_module_info *module;
400 struct gbaudio_data_connection *data;
401 struct gb_bundle *bundle;
402 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
403 struct gbaudio_stream_params *params;
405 mutex_lock(&codec->lock);
407 if (list_empty(&codec->module_list)) {
408 dev_err(codec->dev, "No codec module available\n");
409 mutex_unlock(&codec->lock);
414 * assuming, currently only 48000 Hz, 16BIT_LE, stereo
415 * is supported, validate params before configuring codec
417 if (params_channels(hwparams) != 2) {
418 dev_err(dai->dev, "Invalid channel count:%d\n",
419 params_channels(hwparams));
420 mutex_unlock(&codec->lock);
423 channels = params_channels(hwparams);
425 if (params_rate(hwparams) != 48000) {
426 dev_err(dai->dev, "Invalid sampling rate:%d\n",
427 params_rate(hwparams));
428 mutex_unlock(&codec->lock);
431 rate = GB_AUDIO_PCM_RATE_48000;
433 if (params_format(hwparams) != SNDRV_PCM_FORMAT_S16_LE) {
434 dev_err(dai->dev, "Invalid format:%d\n", params_format(hwparams));
435 mutex_unlock(&codec->lock);
438 format = GB_AUDIO_PCM_FMT_S16_LE;
440 /* find the data connection */
441 list_for_each_entry(module, &codec->module_list, list) {
442 data = find_data(module, dai->id);
448 dev_err(dai->dev, "DATA connection missing\n");
449 mutex_unlock(&codec->lock);
453 params = find_dai_stream_params(codec, dai->id, substream->stream);
455 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
456 mutex_unlock(&codec->lock);
460 bundle = to_gb_bundle(module->dev);
461 ret = gb_pm_runtime_get_sync(bundle);
463 mutex_unlock(&codec->lock);
467 ret = gb_audio_apbridgea_set_config(data->connection, 0,
468 AUDIO_APBRIDGEA_PCM_FMT_16,
469 AUDIO_APBRIDGEA_PCM_RATE_48000,
472 dev_err_ratelimited(dai->dev, "%d: Error during set_config\n",
474 gb_pm_runtime_put_noidle(bundle);
475 mutex_unlock(&codec->lock);
479 gb_pm_runtime_put_noidle(bundle);
481 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
482 sig_bits = dai->driver->playback.sig_bits;
484 sig_bits = dai->driver->capture.sig_bits;
486 params->state = GBAUDIO_CODEC_HWPARAMS;
487 params->format = format;
489 params->channels = channels;
490 params->sig_bits = sig_bits;
492 mutex_unlock(&codec->lock);
496 static int gbcodec_prepare(struct snd_pcm_substream *substream,
497 struct snd_soc_dai *dai)
500 struct gbaudio_module_info *module;
501 struct gbaudio_data_connection *data;
502 struct gb_bundle *bundle;
503 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
504 struct gbaudio_stream_params *params;
506 mutex_lock(&codec->lock);
508 if (list_empty(&codec->module_list)) {
509 dev_err(codec->dev, "No codec module available\n");
510 mutex_unlock(&codec->lock);
514 list_for_each_entry(module, &codec->module_list, list) {
516 data = find_data(module, dai->id);
521 dev_err(dai->dev, "DATA connection missing\n");
522 mutex_unlock(&codec->lock);
526 params = find_dai_stream_params(codec, dai->id, substream->stream);
528 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
529 mutex_unlock(&codec->lock);
533 bundle = to_gb_bundle(module->dev);
534 ret = gb_pm_runtime_get_sync(bundle);
536 mutex_unlock(&codec->lock);
540 switch (substream->stream) {
541 case SNDRV_PCM_STREAM_PLAYBACK:
542 ret = gb_audio_apbridgea_set_tx_data_size(data->connection, 0, 192);
544 case SNDRV_PCM_STREAM_CAPTURE:
545 ret = gb_audio_apbridgea_set_rx_data_size(data->connection, 0, 192);
549 gb_pm_runtime_put_noidle(bundle);
550 mutex_unlock(&codec->lock);
551 dev_err_ratelimited(dai->dev, "set_data_size failed:%d\n", ret);
555 gb_pm_runtime_put_noidle(bundle);
557 params->state = GBAUDIO_CODEC_PREPARE;
558 mutex_unlock(&codec->lock);
562 static int gbcodec_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
565 struct gbaudio_data_connection *data;
566 struct gbaudio_module_info *module;
567 struct gb_bundle *bundle;
568 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
569 struct gbaudio_stream_params *params;
571 dev_dbg(dai->dev, "Mute:%d, Direction:%s\n", mute,
572 stream ? "CAPTURE" : "PLAYBACK");
574 mutex_lock(&codec->lock);
576 params = find_dai_stream_params(codec, dai->id, stream);
578 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
579 mutex_unlock(&codec->lock);
583 if (list_empty(&codec->module_list)) {
584 dev_err(codec->dev, "No codec module available\n");
586 params->state = GBAUDIO_CODEC_STOP;
591 mutex_unlock(&codec->lock);
595 list_for_each_entry(module, &codec->module_list, list) {
597 data = find_data(module, dai->id);
602 dev_err(dai->dev, "%s:%s DATA connection missing\n",
603 dai->name, module->name);
604 mutex_unlock(&codec->lock);
608 bundle = to_gb_bundle(module->dev);
609 ret = gb_pm_runtime_get_sync(bundle);
611 mutex_unlock(&codec->lock);
615 if (!mute && !stream) {/* start playback */
616 ret = gb_audio_apbridgea_prepare_tx(data->connection, 0);
618 ret = gb_audio_apbridgea_start_tx(data->connection, 0, 0);
619 params->state = GBAUDIO_CODEC_START;
620 } else if (!mute && stream) {/* start capture */
621 ret = gb_audio_apbridgea_prepare_rx(data->connection, 0);
623 ret = gb_audio_apbridgea_start_rx(data->connection, 0);
624 params->state = GBAUDIO_CODEC_START;
625 } else if (mute && !stream) {/* stop playback */
626 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
628 ret = gb_audio_apbridgea_shutdown_tx(data->connection, 0);
629 params->state = GBAUDIO_CODEC_STOP;
630 } else if (mute && stream) {/* stop capture */
631 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
633 ret = gb_audio_apbridgea_shutdown_rx(data->connection, 0);
634 params->state = GBAUDIO_CODEC_STOP;
640 dev_err_ratelimited(dai->dev,
641 "%s:Error during %s %s stream:%d\n",
642 module->name, mute ? "Mute" : "Unmute",
643 stream ? "Capture" : "Playback", ret);
645 gb_pm_runtime_put_noidle(bundle);
646 mutex_unlock(&codec->lock);
650 static const struct snd_soc_dai_ops gbcodec_dai_ops = {
651 .startup = gbcodec_startup,
652 .shutdown = gbcodec_shutdown,
653 .hw_params = gbcodec_hw_params,
654 .prepare = gbcodec_prepare,
655 .mute_stream = gbcodec_mute_stream,
658 static struct snd_soc_dai_driver gbaudio_dai[] = {
663 .stream_name = "I2S 0 Playback",
664 .rates = SNDRV_PCM_RATE_48000,
665 .formats = SNDRV_PCM_FMTBIT_S16_LE,
673 .stream_name = "I2S 0 Capture",
674 .rates = SNDRV_PCM_RATE_48000,
675 .formats = SNDRV_PCM_FMTBIT_S16_LE,
682 .ops = &gbcodec_dai_ops,
686 static int gbaudio_init_jack(struct gbaudio_module_info *module,
687 struct snd_soc_card *card)
690 struct gbaudio_jack *jack, *n;
691 struct snd_soc_jack_pin *headset, *button;
693 if (!module->jack_mask)
696 snprintf(module->jack_name, NAME_SIZE, "GB %d Headset Jack",
699 headset = devm_kzalloc(module->dev, sizeof(*headset), GFP_KERNEL);
703 headset->pin = module->jack_name;
704 headset->mask = module->jack_mask;
705 ret = snd_soc_card_jack_new(card, module->jack_name, module->jack_mask,
706 &module->headset.jack, headset, 1);
708 dev_err(module->dev, "Failed to create new jack\n");
712 /* Add to module's jack list */
713 list_add(&module->headset.list, &module->jack_list);
715 if (!module->button_mask)
718 snprintf(module->button_name, NAME_SIZE, "GB %d Button Jack",
720 button = devm_kzalloc(module->dev, sizeof(*button), GFP_KERNEL);
726 button->pin = module->button_name;
727 button->mask = module->button_mask;
728 ret = snd_soc_card_jack_new(card, module->button_name,
729 module->button_mask, &module->button.jack,
732 dev_err(module->dev, "Failed to create button jack\n");
736 /* Add to module's jack list */
737 list_add(&module->button.list, &module->jack_list);
740 * Currently, max 4 buttons are supported with following key mapping
742 * BTN_1 = KEY_VOICECOMMAND
743 * BTN_2 = KEY_VOLUMEUP
744 * BTN_3 = KEY_VOLUMEDOWN
747 if (module->button_mask & SND_JACK_BTN_0) {
748 ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_0,
751 dev_err(module->dev, "Failed to set BTN_0\n");
756 if (module->button_mask & SND_JACK_BTN_1) {
757 ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_1,
760 dev_err(module->dev, "Failed to set BTN_1\n");
765 if (module->button_mask & SND_JACK_BTN_2) {
766 ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_2,
769 dev_err(module->dev, "Failed to set BTN_2\n");
774 if (module->button_mask & SND_JACK_BTN_3) {
775 ret = snd_jack_set_key(module->button.jack.jack, SND_JACK_BTN_3,
778 dev_err(module->dev, "Failed to set BTN_0\n");
784 * verify if this is really required
785 set_bit(INPUT_PROP_NO_DUMMY_RELEASE,
786 module->button.jack.jack->input_dev->propbit);
792 list_for_each_entry_safe(jack, n, &module->jack_list, list) {
793 snd_device_free(card->snd_card, jack->jack.jack);
794 list_del(&jack->list);
800 int gbaudio_register_module(struct gbaudio_module_info *module)
803 struct snd_soc_component *comp;
804 struct snd_card *card;
805 struct gbaudio_jack *jack = NULL;
808 dev_err(module->dev, "GB Codec not yet probed\n");
812 comp = gbcodec->component;
813 card = comp->card->snd_card;
815 down_write(&card->controls_rwsem);
817 if (module->num_dais) {
818 dev_err(gbcodec->dev,
819 "%d:DAIs not supported via gbcodec driver\n",
821 up_write(&card->controls_rwsem);
825 ret = gbaudio_init_jack(module, comp->card);
827 up_write(&card->controls_rwsem);
831 if (module->dapm_widgets)
832 snd_soc_dapm_new_controls(&comp->dapm, module->dapm_widgets,
833 module->num_dapm_widgets);
834 if (module->controls)
835 snd_soc_add_component_controls(comp, module->controls,
836 module->num_controls);
837 if (module->dapm_routes)
838 snd_soc_dapm_add_routes(&comp->dapm, module->dapm_routes,
839 module->num_dapm_routes);
841 /* card already instantiated, create widgets here only */
842 if (comp->card->instantiated) {
843 gbaudio_dapm_link_component_dai_widgets(comp->card, &comp->dapm);
844 #ifdef CONFIG_SND_JACK
846 * register jack devices for this module
847 * from codec->jack_list
849 list_for_each_entry(jack, &module->jack_list, list) {
850 snd_device_register(comp->card->snd_card,
856 mutex_lock(&gbcodec->lock);
857 list_add(&module->list, &gbcodec->module_list);
858 mutex_unlock(&gbcodec->lock);
860 if (comp->card->instantiated)
861 ret = snd_soc_dapm_new_widgets(comp->card);
862 dev_dbg(comp->dev, "Registered %s module\n", module->name);
864 up_write(&card->controls_rwsem);
867 EXPORT_SYMBOL(gbaudio_register_module);
869 static void gbaudio_codec_clean_data_tx(struct gbaudio_data_connection *data)
871 u16 i2s_port, cportid;
874 if (list_is_singular(&gbcodec->module_list)) {
875 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
878 ret = gb_audio_apbridgea_shutdown_tx(data->connection, 0);
882 i2s_port = 0; /* fixed for now */
883 cportid = data->connection->hd_cport_id;
884 ret = gb_audio_apbridgea_unregister_cport(data->connection,
886 AUDIO_APBRIDGEA_DIRECTION_TX);
887 data->state[0] = GBAUDIO_CODEC_SHUTDOWN;
890 static void gbaudio_codec_clean_data_rx(struct gbaudio_data_connection *data)
892 u16 i2s_port, cportid;
895 if (list_is_singular(&gbcodec->module_list)) {
896 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
899 ret = gb_audio_apbridgea_shutdown_rx(data->connection, 0);
903 i2s_port = 0; /* fixed for now */
904 cportid = data->connection->hd_cport_id;
905 ret = gb_audio_apbridgea_unregister_cport(data->connection,
907 AUDIO_APBRIDGEA_DIRECTION_RX);
908 data->state[1] = GBAUDIO_CODEC_SHUTDOWN;
911 static void gbaudio_codec_cleanup(struct gbaudio_module_info *module)
913 struct gbaudio_data_connection *data;
914 int pb_state, cap_state;
916 dev_dbg(gbcodec->dev, "%s: removed, cleanup APBridge\n", module->name);
917 list_for_each_entry(data, &module->data_list, list) {
918 pb_state = data->state[0];
919 cap_state = data->state[1];
921 if (pb_state > GBAUDIO_CODEC_SHUTDOWN)
922 gbaudio_codec_clean_data_tx(data);
924 if (cap_state > GBAUDIO_CODEC_SHUTDOWN)
925 gbaudio_codec_clean_data_rx(data);
929 void gbaudio_unregister_module(struct gbaudio_module_info *module)
931 struct snd_soc_component *comp = gbcodec->component;
932 struct snd_card *card = comp->card->snd_card;
933 struct gbaudio_jack *jack, *n;
936 dev_dbg(comp->dev, "Unregister %s module\n", module->name);
938 down_write(&card->controls_rwsem);
939 mutex_lock(&gbcodec->lock);
940 gbaudio_codec_cleanup(module);
941 list_del(&module->list);
942 dev_dbg(comp->dev, "Process Unregister %s module\n", module->name);
943 mutex_unlock(&gbcodec->lock);
945 #ifdef CONFIG_SND_JACK
946 /* free jack devices for this module jack_list */
947 list_for_each_entry_safe(jack, n, &module->jack_list, list) {
948 if (jack == &module->headset)
949 mask = GBCODEC_JACK_MASK;
950 else if (jack == &module->button)
951 mask = GBCODEC_JACK_BUTTON_MASK;
955 dev_dbg(module->dev, "Report %s removal\n",
956 jack->jack.jack->id);
957 snd_soc_jack_report(&jack->jack, 0, mask);
958 snd_device_free(comp->card->snd_card,
960 list_del(&jack->list);
965 if (module->dapm_routes) {
966 dev_dbg(comp->dev, "Removing %d routes\n",
967 module->num_dapm_routes);
968 snd_soc_dapm_del_routes(&comp->dapm, module->dapm_routes,
969 module->num_dapm_routes);
971 if (module->controls) {
972 dev_dbg(comp->dev, "Removing %d controls\n",
973 module->num_controls);
974 /* release control semaphore */
975 up_write(&card->controls_rwsem);
976 gbaudio_remove_component_controls(comp, module->controls,
977 module->num_controls);
978 down_write(&card->controls_rwsem);
980 if (module->dapm_widgets) {
981 dev_dbg(comp->dev, "Removing %d widgets\n",
982 module->num_dapm_widgets);
983 gbaudio_dapm_free_controls(&comp->dapm, module->dapm_widgets,
984 module->num_dapm_widgets);
987 dev_dbg(comp->dev, "Unregistered %s module\n", module->name);
989 up_write(&card->controls_rwsem);
991 EXPORT_SYMBOL(gbaudio_unregister_module);
994 * component driver ops
996 static int gbcodec_probe(struct snd_soc_component *comp)
999 struct gbaudio_codec_info *info;
1000 struct gbaudio_codec_dai *dai;
1002 info = devm_kzalloc(comp->dev, sizeof(*info), GFP_KERNEL);
1006 info->dev = comp->dev;
1007 INIT_LIST_HEAD(&info->module_list);
1008 mutex_init(&info->lock);
1009 INIT_LIST_HEAD(&info->dai_list);
1011 /* init dai_list used to maintain runtime stream info */
1012 for (i = 0; i < ARRAY_SIZE(gbaudio_dai); i++) {
1013 dai = devm_kzalloc(comp->dev, sizeof(*dai), GFP_KERNEL);
1016 dai->id = gbaudio_dai[i].id;
1017 list_add(&dai->list, &info->dai_list);
1020 info->component = comp;
1021 snd_soc_component_set_drvdata(comp, info);
1024 device_init_wakeup(comp->dev, 1);
1028 static void gbcodec_remove(struct snd_soc_component *comp)
1030 /* Empty function for now */
1034 static int gbcodec_write(struct snd_soc_component *comp, unsigned int reg,
1040 static unsigned int gbcodec_read(struct snd_soc_component *comp,
1046 static const struct snd_soc_component_driver soc_codec_dev_gbaudio = {
1047 .probe = gbcodec_probe,
1048 .remove = gbcodec_remove,
1050 .read = gbcodec_read,
1051 .write = gbcodec_write,
1055 static int gbaudio_codec_suspend(struct device *dev)
1057 dev_dbg(dev, "%s: suspend\n", __func__);
1061 static int gbaudio_codec_resume(struct device *dev)
1063 dev_dbg(dev, "%s: resume\n", __func__);
1067 static const struct dev_pm_ops gbaudio_codec_pm_ops = {
1068 .suspend = gbaudio_codec_suspend,
1069 .resume = gbaudio_codec_resume,
1073 static int gbaudio_codec_probe(struct platform_device *pdev)
1075 return devm_snd_soc_register_component(&pdev->dev,
1076 &soc_codec_dev_gbaudio,
1077 gbaudio_dai, ARRAY_SIZE(gbaudio_dai));
1080 static int gbaudio_codec_remove(struct platform_device *pdev)
1085 static const struct of_device_id greybus_asoc_machine_of_match[] = {
1086 { .compatible = "toshiba,apb-dummy-codec", },
1090 static struct platform_driver gbaudio_codec_driver = {
1092 .name = "apb-dummy-codec",
1094 .pm = &gbaudio_codec_pm_ops,
1096 .of_match_table = greybus_asoc_machine_of_match,
1098 .probe = gbaudio_codec_probe,
1099 .remove = gbaudio_codec_remove,
1101 module_platform_driver(gbaudio_codec_driver);
1103 MODULE_DESCRIPTION("APBridge ALSA SoC dummy codec driver");
1105 MODULE_LICENSE("GPL v2");
1106 MODULE_ALIAS("platform:apb-dummy-codec");