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"
18 static struct gbaudio_codec_info *gbcodec;
20 static struct gbaudio_data_connection *
21 find_data(struct gbaudio_module_info *module, int id)
23 struct gbaudio_data_connection *data;
25 list_for_each_entry(data, &module->data_list, list) {
32 static struct gbaudio_stream_params *
33 find_dai_stream_params(struct gbaudio_codec_info *codec, int id, int stream)
35 struct gbaudio_codec_dai *dai;
37 list_for_each_entry(dai, &codec->dai_list, list) {
39 return &dai->params[stream];
44 static int gbaudio_module_enable_tx(struct gbaudio_codec_info *codec,
45 struct gbaudio_module_info *module, int id)
47 int module_state, ret = 0;
48 u16 data_cport, i2s_port, cportid;
49 u8 sig_bits, channels;
50 uint32_t format, rate;
51 struct gbaudio_data_connection *data;
52 struct gbaudio_stream_params *params;
55 data = find_data(module, id);
57 dev_err(module->dev, "%d:DATA connection missing\n", id);
60 module_state = data->state[SNDRV_PCM_STREAM_PLAYBACK];
62 params = find_dai_stream_params(codec, id, SNDRV_PCM_STREAM_PLAYBACK);
64 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
69 if (module_state < GBAUDIO_CODEC_STARTUP) {
70 i2s_port = 0; /* fixed for now */
71 cportid = data->connection->hd_cport_id;
72 ret = gb_audio_apbridgea_register_cport(data->connection,
74 AUDIO_APBRIDGEA_DIRECTION_TX);
76 dev_err_ratelimited(module->dev,
77 "reg_cport failed:%d\n", ret);
80 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
81 GBAUDIO_CODEC_STARTUP;
82 dev_dbg(module->dev, "Dynamic Register %d DAI\n", cportid);
86 if (module_state < GBAUDIO_CODEC_HWPARAMS) {
87 format = params->format;
88 channels = params->channels;
90 sig_bits = params->sig_bits;
91 data_cport = data->connection->intf_cport_id;
92 ret = gb_audio_gb_set_pcm(module->mgmt_connection, data_cport,
93 format, rate, channels, sig_bits);
95 dev_err_ratelimited(module->dev, "set_pcm failed:%d\n",
99 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
100 GBAUDIO_CODEC_HWPARAMS;
101 dev_dbg(module->dev, "Dynamic hw_params %d DAI\n", data_cport);
105 if (module_state < GBAUDIO_CODEC_PREPARE) {
106 data_cport = data->connection->intf_cport_id;
107 ret = gb_audio_gb_set_tx_data_size(module->mgmt_connection,
110 dev_err_ratelimited(module->dev,
111 "set_tx_data_size failed:%d\n",
115 ret = gb_audio_gb_activate_tx(module->mgmt_connection,
118 dev_err_ratelimited(module->dev,
119 "activate_tx failed:%d\n", ret);
122 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
123 GBAUDIO_CODEC_PREPARE;
124 dev_dbg(module->dev, "Dynamic prepare %d DAI\n", data_cport);
130 static int gbaudio_module_disable_tx(struct gbaudio_module_info *module, int id)
133 u16 data_cport, cportid, i2s_port;
135 struct gbaudio_data_connection *data;
138 data = find_data(module, id);
140 dev_err(module->dev, "%d:DATA connection missing\n", id);
143 module_state = data->state[SNDRV_PCM_STREAM_PLAYBACK];
145 if (module_state > GBAUDIO_CODEC_HWPARAMS) {
146 data_cport = data->connection->intf_cport_id;
147 ret = gb_audio_gb_deactivate_tx(module->mgmt_connection,
150 dev_err_ratelimited(module->dev,
151 "deactivate_tx failed:%d\n", ret);
154 dev_dbg(module->dev, "Dynamic deactivate %d DAI\n", data_cport);
155 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
156 GBAUDIO_CODEC_HWPARAMS;
159 if (module_state > GBAUDIO_CODEC_SHUTDOWN) {
160 i2s_port = 0; /* fixed for now */
161 cportid = data->connection->hd_cport_id;
162 ret = gb_audio_apbridgea_unregister_cport(data->connection,
164 AUDIO_APBRIDGEA_DIRECTION_TX);
166 dev_err_ratelimited(module->dev,
167 "unregister_cport failed:%d\n",
171 dev_dbg(module->dev, "Dynamic Unregister %d DAI\n", cportid);
172 data->state[SNDRV_PCM_STREAM_PLAYBACK] =
173 GBAUDIO_CODEC_SHUTDOWN;
179 static int gbaudio_module_enable_rx(struct gbaudio_codec_info *codec,
180 struct gbaudio_module_info *module, int id)
182 int module_state, ret = 0;
183 u16 data_cport, i2s_port, cportid;
184 u8 sig_bits, channels;
185 uint32_t format, rate;
186 struct gbaudio_data_connection *data;
187 struct gbaudio_stream_params *params;
190 data = find_data(module, id);
192 dev_err(module->dev, "%d:DATA connection missing\n", id);
195 module_state = data->state[SNDRV_PCM_STREAM_CAPTURE];
197 params = find_dai_stream_params(codec, id, SNDRV_PCM_STREAM_CAPTURE);
199 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
204 if (module_state < GBAUDIO_CODEC_STARTUP) {
205 i2s_port = 0; /* fixed for now */
206 cportid = data->connection->hd_cport_id;
207 ret = gb_audio_apbridgea_register_cport(data->connection,
209 AUDIO_APBRIDGEA_DIRECTION_RX);
211 dev_err_ratelimited(module->dev,
212 "reg_cport failed:%d\n", ret);
215 data->state[SNDRV_PCM_STREAM_CAPTURE] =
216 GBAUDIO_CODEC_STARTUP;
217 dev_dbg(module->dev, "Dynamic Register %d DAI\n", cportid);
221 if (module_state < GBAUDIO_CODEC_HWPARAMS) {
222 format = params->format;
223 channels = params->channels;
225 sig_bits = params->sig_bits;
226 data_cport = data->connection->intf_cport_id;
227 ret = gb_audio_gb_set_pcm(module->mgmt_connection, data_cport,
228 format, rate, channels, sig_bits);
230 dev_err_ratelimited(module->dev, "set_pcm failed:%d\n",
234 data->state[SNDRV_PCM_STREAM_CAPTURE] =
235 GBAUDIO_CODEC_HWPARAMS;
236 dev_dbg(module->dev, "Dynamic hw_params %d DAI\n", data_cport);
240 if (module_state < GBAUDIO_CODEC_PREPARE) {
241 data_cport = data->connection->intf_cport_id;
242 ret = gb_audio_gb_set_rx_data_size(module->mgmt_connection,
245 dev_err_ratelimited(module->dev,
246 "set_rx_data_size failed:%d\n",
250 ret = gb_audio_gb_activate_rx(module->mgmt_connection,
253 dev_err_ratelimited(module->dev,
254 "activate_rx failed:%d\n", ret);
257 data->state[SNDRV_PCM_STREAM_CAPTURE] =
258 GBAUDIO_CODEC_PREPARE;
259 dev_dbg(module->dev, "Dynamic prepare %d DAI\n", data_cport);
265 static int gbaudio_module_disable_rx(struct gbaudio_module_info *module, int id)
268 u16 data_cport, cportid, i2s_port;
270 struct gbaudio_data_connection *data;
273 data = find_data(module, id);
275 dev_err(module->dev, "%d:DATA connection missing\n", id);
278 module_state = data->state[SNDRV_PCM_STREAM_CAPTURE];
280 if (module_state > GBAUDIO_CODEC_HWPARAMS) {
281 data_cport = data->connection->intf_cport_id;
282 ret = gb_audio_gb_deactivate_rx(module->mgmt_connection,
285 dev_err_ratelimited(module->dev,
286 "deactivate_rx failed:%d\n", ret);
289 dev_dbg(module->dev, "Dynamic deactivate %d DAI\n", data_cport);
290 data->state[SNDRV_PCM_STREAM_CAPTURE] =
291 GBAUDIO_CODEC_HWPARAMS;
294 if (module_state > GBAUDIO_CODEC_SHUTDOWN) {
295 i2s_port = 0; /* fixed for now */
296 cportid = data->connection->hd_cport_id;
297 ret = gb_audio_apbridgea_unregister_cport(data->connection,
299 AUDIO_APBRIDGEA_DIRECTION_RX);
301 dev_err_ratelimited(module->dev,
302 "unregister_cport failed:%d\n",
306 dev_dbg(module->dev, "Dynamic Unregister %d DAI\n", cportid);
307 data->state[SNDRV_PCM_STREAM_CAPTURE] =
308 GBAUDIO_CODEC_SHUTDOWN;
314 int gbaudio_module_update(struct gbaudio_codec_info *codec,
315 struct snd_soc_dapm_widget *w,
316 struct gbaudio_module_info *module, int enable)
319 char intf_name[NAME_SIZE], dir[NAME_SIZE];
321 dev_dbg(module->dev, "%s:Module update %s sequence\n", w->name,
322 enable ? "Enable":"Disable");
324 if ((w->id != snd_soc_dapm_aif_in) && (w->id != snd_soc_dapm_aif_out)) {
325 dev_dbg(codec->dev, "No action required for %s\n", w->name);
329 /* parse dai_id from AIF widget's stream_name */
330 ret = sscanf(w->sname, "%s %d %s", intf_name, &dai_id, dir);
332 dev_err(codec->dev, "Error while parsing dai_id for %s\n",
337 mutex_lock(&codec->lock);
338 if (w->id == snd_soc_dapm_aif_in) {
340 ret = gbaudio_module_enable_tx(codec, module, dai_id);
342 ret = gbaudio_module_disable_tx(module, dai_id);
343 } else if (w->id == snd_soc_dapm_aif_out) {
345 ret = gbaudio_module_enable_rx(codec, module, dai_id);
347 ret = gbaudio_module_disable_rx(module, dai_id);
350 mutex_unlock(&codec->lock);
354 EXPORT_SYMBOL(gbaudio_module_update);
359 static int gbcodec_startup(struct snd_pcm_substream *substream,
360 struct snd_soc_dai *dai)
362 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
363 struct gbaudio_stream_params *params;
365 mutex_lock(&codec->lock);
367 if (list_empty(&codec->module_list)) {
368 dev_err(codec->dev, "No codec module available\n");
369 mutex_unlock(&codec->lock);
373 params = find_dai_stream_params(codec, dai->id, substream->stream);
375 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
376 mutex_unlock(&codec->lock);
379 params->state = GBAUDIO_CODEC_STARTUP;
380 mutex_unlock(&codec->lock);
381 /* to prevent suspend in case of active audio */
382 pm_stay_awake(dai->dev);
387 static void gbcodec_shutdown(struct snd_pcm_substream *substream,
388 struct snd_soc_dai *dai)
390 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
391 struct gbaudio_stream_params *params;
393 mutex_lock(&codec->lock);
395 if (list_empty(&codec->module_list))
396 dev_info(codec->dev, "No codec module available during shutdown\n");
398 params = find_dai_stream_params(codec, dai->id, substream->stream);
400 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
401 mutex_unlock(&codec->lock);
404 params->state = GBAUDIO_CODEC_SHUTDOWN;
405 mutex_unlock(&codec->lock);
409 static int gbcodec_hw_params(struct snd_pcm_substream *substream,
410 struct snd_pcm_hw_params *hwparams,
411 struct snd_soc_dai *dai)
414 u8 sig_bits, channels;
415 uint32_t format, rate;
416 struct gbaudio_module_info *module;
417 struct gbaudio_data_connection *data;
418 struct gb_bundle *bundle;
419 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
420 struct gbaudio_stream_params *params;
422 mutex_lock(&codec->lock);
424 if (list_empty(&codec->module_list)) {
425 dev_err(codec->dev, "No codec module available\n");
426 mutex_unlock(&codec->lock);
431 * assuming, currently only 48000 Hz, 16BIT_LE, stereo
432 * is supported, validate params before configuring codec
434 if (params_channels(hwparams) != 2) {
435 dev_err(dai->dev, "Invalid channel count:%d\n",
436 params_channels(hwparams));
437 mutex_unlock(&codec->lock);
440 channels = params_channels(hwparams);
442 if (params_rate(hwparams) != 48000) {
443 dev_err(dai->dev, "Invalid sampling rate:%d\n",
444 params_rate(hwparams));
445 mutex_unlock(&codec->lock);
448 rate = GB_AUDIO_PCM_RATE_48000;
450 if (params_format(hwparams) != SNDRV_PCM_FORMAT_S16_LE) {
451 dev_err(dai->dev, "Invalid format:%d\n",
452 params_format(hwparams));
453 mutex_unlock(&codec->lock);
456 format = GB_AUDIO_PCM_FMT_S16_LE;
458 /* find the data connection */
459 list_for_each_entry(module, &codec->module_list, list) {
460 data = find_data(module, dai->id);
466 dev_err(dai->dev, "DATA connection missing\n");
467 mutex_unlock(&codec->lock);
471 params = find_dai_stream_params(codec, dai->id, substream->stream);
473 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
474 mutex_unlock(&codec->lock);
478 bundle = to_gb_bundle(module->dev);
479 ret = gb_pm_runtime_get_sync(bundle);
481 mutex_unlock(&codec->lock);
485 ret = gb_audio_apbridgea_set_config(data->connection, 0,
486 AUDIO_APBRIDGEA_PCM_FMT_16,
487 AUDIO_APBRIDGEA_PCM_RATE_48000,
490 dev_err_ratelimited(dai->dev, "%d: Error during set_config\n",
492 mutex_unlock(&codec->lock);
496 gb_pm_runtime_put_noidle(bundle);
498 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
499 sig_bits = dai->driver->playback.sig_bits;
501 sig_bits = dai->driver->capture.sig_bits;
503 params->state = GBAUDIO_CODEC_HWPARAMS;
504 params->format = format;
506 params->channels = channels;
507 params->sig_bits = sig_bits;
509 mutex_unlock(&codec->lock);
513 static int gbcodec_prepare(struct snd_pcm_substream *substream,
514 struct snd_soc_dai *dai)
517 struct gbaudio_module_info *module;
518 struct gbaudio_data_connection *data;
519 struct gb_bundle *bundle;
520 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
521 struct gbaudio_stream_params *params;
523 mutex_lock(&codec->lock);
525 if (list_empty(&codec->module_list)) {
526 dev_err(codec->dev, "No codec module available\n");
527 mutex_unlock(&codec->lock);
531 list_for_each_entry(module, &codec->module_list, list) {
533 data = find_data(module, dai->id);
538 dev_err(dai->dev, "DATA connection missing\n");
539 mutex_unlock(&codec->lock);
543 params = find_dai_stream_params(codec, dai->id, substream->stream);
545 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
546 mutex_unlock(&codec->lock);
550 bundle = to_gb_bundle(module->dev);
551 ret = gb_pm_runtime_get_sync(bundle);
553 mutex_unlock(&codec->lock);
557 switch (substream->stream) {
558 case SNDRV_PCM_STREAM_PLAYBACK:
559 ret = gb_audio_apbridgea_set_tx_data_size(data->connection, 0,
562 case SNDRV_PCM_STREAM_CAPTURE:
563 ret = gb_audio_apbridgea_set_rx_data_size(data->connection, 0,
568 mutex_unlock(&codec->lock);
569 dev_err_ratelimited(dai->dev, "set_data_size failed:%d\n",
574 gb_pm_runtime_put_noidle(bundle);
576 params->state = GBAUDIO_CODEC_PREPARE;
577 mutex_unlock(&codec->lock);
581 static int gbcodec_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
584 struct gbaudio_data_connection *data;
585 struct gbaudio_module_info *module;
586 struct gb_bundle *bundle;
587 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
588 struct gbaudio_stream_params *params;
591 dev_dbg(dai->dev, "Mute:%d, Direction:%s\n", mute,
592 stream ? "CAPTURE":"PLAYBACK");
594 mutex_lock(&codec->lock);
596 params = find_dai_stream_params(codec, dai->id, stream);
598 dev_err(codec->dev, "Failed to fetch dai_stream pointer\n");
599 mutex_unlock(&codec->lock);
603 if (list_empty(&codec->module_list)) {
604 dev_err(codec->dev, "No codec module available\n");
606 params->state = GBAUDIO_CODEC_STOP;
611 mutex_unlock(&codec->lock);
615 list_for_each_entry(module, &codec->module_list, list) {
617 data = find_data(module, dai->id);
622 dev_err(dai->dev, "%s:%s DATA connection missing\n",
623 dai->name, module->name);
624 mutex_unlock(&codec->lock);
628 bundle = to_gb_bundle(module->dev);
629 ret = gb_pm_runtime_get_sync(bundle);
631 mutex_unlock(&codec->lock);
635 if (!mute && !stream) {/* start playback */
636 ret = gb_audio_apbridgea_prepare_tx(data->connection,
639 ret = gb_audio_apbridgea_start_tx(data->connection,
641 params->state = GBAUDIO_CODEC_START;
642 } else if (!mute && stream) {/* start capture */
643 ret = gb_audio_apbridgea_prepare_rx(data->connection,
646 ret = gb_audio_apbridgea_start_rx(data->connection,
648 params->state = GBAUDIO_CODEC_START;
649 } else if (mute && !stream) {/* stop playback */
650 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
652 ret = gb_audio_apbridgea_shutdown_tx(data->connection,
654 params->state = GBAUDIO_CODEC_STOP;
655 } else if (mute && stream) {/* stop capture */
656 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
658 ret = gb_audio_apbridgea_shutdown_rx(data->connection,
660 params->state = GBAUDIO_CODEC_STOP;
666 dev_err_ratelimited(dai->dev,
667 "%s:Error during %s %s stream:%d\n",
668 module->name, mute ? "Mute" : "Unmute",
669 stream ? "Capture" : "Playback", ret);
671 gb_pm_runtime_put_noidle(bundle);
672 mutex_unlock(&codec->lock);
676 static const struct snd_soc_dai_ops gbcodec_dai_ops = {
677 .startup = gbcodec_startup,
678 .shutdown = gbcodec_shutdown,
679 .hw_params = gbcodec_hw_params,
680 .prepare = gbcodec_prepare,
681 .mute_stream = gbcodec_mute_stream,
684 static struct snd_soc_dai_driver gbaudio_dai[] = {
689 .stream_name = "I2S 0 Playback",
690 .rates = SNDRV_PCM_RATE_48000,
691 .formats = SNDRV_PCM_FORMAT_S16_LE,
699 .stream_name = "I2S 0 Capture",
700 .rates = SNDRV_PCM_RATE_48000,
701 .formats = SNDRV_PCM_FORMAT_S16_LE,
708 .ops = &gbcodec_dai_ops,
712 static int gbaudio_init_jack(struct gbaudio_module_info *module,
713 struct snd_soc_codec *codec)
717 if (!module->jack_mask)
720 snprintf(module->jack_name, NAME_SIZE, "GB %d Headset Jack",
722 ret = snd_soc_jack_new(codec, module->jack_name, module->jack_mask,
723 &module->headset_jack);
725 dev_err(module->dev, "Failed to create new jack\n");
729 if (!module->button_mask)
732 snprintf(module->button_name, NAME_SIZE, "GB %d Button Jack",
734 ret = snd_soc_jack_new(codec, module->button_name, module->button_mask,
735 &module->button_jack);
737 dev_err(module->dev, "Failed to create button jack\n");
742 * Currently, max 4 buttons are supported with following key mapping
744 * BTN_1 = KEY_VOICECOMMAND
745 * BTN_2 = KEY_VOLUMEUP
746 * BTN_3 = KEY_VOLUMEDOWN
749 if (module->button_mask & SND_JACK_BTN_0) {
750 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_0,
753 dev_err(module->dev, "Failed to set BTN_0\n");
758 if (module->button_mask & SND_JACK_BTN_1) {
759 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_1,
762 dev_err(module->dev, "Failed to set BTN_1\n");
767 if (module->button_mask & SND_JACK_BTN_2) {
768 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_2,
771 dev_err(module->dev, "Failed to set BTN_2\n");
776 if (module->button_mask & SND_JACK_BTN_3) {
777 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_3,
780 dev_err(module->dev, "Failed to set BTN_0\n");
786 * verify if this is really required
787 set_bit(INPUT_PROP_NO_DUMMY_RELEASE,
788 module->button_jack.jack->input_dev->propbit);
794 int gbaudio_register_module(struct gbaudio_module_info *module)
797 struct snd_soc_codec *codec;
798 struct snd_card *card;
799 struct snd_soc_jack *jack = NULL;
802 dev_err(module->dev, "GB Codec not yet probed\n");
806 codec = gbcodec->codec;
807 card = codec->card->snd_card;
809 down_write(&card->controls_rwsem);
811 if (module->num_dais) {
812 dev_err(gbcodec->dev,
813 "%d:DAIs not supported via gbcodec driver\n",
815 up_write(&card->controls_rwsem);
819 ret = gbaudio_init_jack(module, codec);
821 up_write(&card->controls_rwsem);
825 if (module->dapm_widgets)
826 snd_soc_dapm_new_controls(&codec->dapm, module->dapm_widgets,
827 module->num_dapm_widgets);
828 if (module->controls)
829 snd_soc_add_codec_controls(codec, module->controls,
830 module->num_controls);
831 if (module->dapm_routes)
832 snd_soc_dapm_add_routes(&codec->dapm, module->dapm_routes,
833 module->num_dapm_routes);
835 /* card already instantiated, create widgets here only */
836 if (codec->card->instantiated) {
837 snd_soc_dapm_link_component_dai_widgets(codec->card,
839 #ifdef CONFIG_SND_JACK
841 * register jack devices for this module
842 * from codec->jack_list
844 list_for_each_entry(jack, &codec->jack_list, list) {
845 if ((jack == &module->headset_jack)
846 || (jack == &module->button_jack))
847 snd_device_register(codec->card->snd_card,
853 mutex_lock(&gbcodec->lock);
854 list_add(&module->list, &gbcodec->module_list);
855 mutex_unlock(&gbcodec->lock);
857 if (codec->card->instantiated)
858 ret = snd_soc_dapm_new_widgets(&codec->dapm);
859 dev_dbg(codec->dev, "Registered %s module\n", module->name);
861 up_write(&card->controls_rwsem);
864 EXPORT_SYMBOL(gbaudio_register_module);
866 static void gbaudio_codec_clean_data_tx(struct gbaudio_data_connection *data)
868 u16 i2s_port, cportid;
871 if (list_is_singular(&gbcodec->module_list)) {
872 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
875 ret = gb_audio_apbridgea_shutdown_tx(data->connection,
880 i2s_port = 0; /* fixed for now */
881 cportid = data->connection->hd_cport_id;
882 ret = gb_audio_apbridgea_unregister_cport(data->connection,
884 AUDIO_APBRIDGEA_DIRECTION_TX);
885 data->state[0] = GBAUDIO_CODEC_SHUTDOWN;
888 static void gbaudio_codec_clean_data_rx(struct gbaudio_data_connection *data)
890 u16 i2s_port, cportid;
893 if (list_is_singular(&gbcodec->module_list)) {
894 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
897 ret = gb_audio_apbridgea_shutdown_rx(data->connection,
902 i2s_port = 0; /* fixed for now */
903 cportid = data->connection->hd_cport_id;
904 ret = gb_audio_apbridgea_unregister_cport(data->connection,
906 AUDIO_APBRIDGEA_DIRECTION_RX);
907 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);
930 void gbaudio_unregister_module(struct gbaudio_module_info *module)
932 struct snd_soc_codec *codec = gbcodec->codec;
933 struct snd_card *card = codec->card->snd_card;
934 struct snd_soc_jack *jack, *next_j;
937 dev_dbg(codec->dev, "Unregister %s module\n", module->name);
939 down_write(&card->controls_rwsem);
940 mutex_lock(&gbcodec->lock);
941 gbaudio_codec_cleanup(module);
942 list_del(&module->list);
943 dev_dbg(codec->dev, "Process Unregister %s module\n", module->name);
944 mutex_unlock(&gbcodec->lock);
946 #ifdef CONFIG_SND_JACK
947 /* free jack devices for this module from codec->jack_list */
948 list_for_each_entry_safe(jack, next_j, &codec->jack_list, list) {
949 if (jack == &module->headset_jack)
950 mask = GBCODEC_JACK_MASK;
951 else if (jack == &module->button_jack)
952 mask = GBCODEC_JACK_BUTTON_MASK;
956 dev_dbg(module->dev, "Report %s removal\n",
958 snd_soc_jack_report(jack, 0, mask);
959 snd_device_free(codec->card->snd_card, jack->jack);
960 list_del(&jack->list);
965 if (module->dapm_routes) {
966 dev_dbg(codec->dev, "Removing %d routes\n",
967 module->num_dapm_routes);
968 snd_soc_dapm_del_routes(&codec->dapm, module->dapm_routes,
969 module->num_dapm_routes);
971 if (module->controls) {
972 dev_dbg(codec->dev, "Removing %d controls\n",
973 module->num_controls);
974 snd_soc_remove_codec_controls(codec, module->controls,
975 module->num_controls);
977 if (module->dapm_widgets) {
978 dev_dbg(codec->dev, "Removing %d widgets\n",
979 module->num_dapm_widgets);
980 snd_soc_dapm_free_controls(&codec->dapm, module->dapm_widgets,
981 module->num_dapm_widgets);
984 dev_dbg(codec->dev, "Unregistered %s module\n", module->name);
986 up_write(&card->controls_rwsem);
988 EXPORT_SYMBOL(gbaudio_unregister_module);
993 static int gbcodec_probe(struct snd_soc_codec *codec)
996 struct gbaudio_codec_info *info;
997 struct gbaudio_codec_dai *dai;
999 info = devm_kzalloc(codec->dev, sizeof(*info), GFP_KERNEL);
1003 info->dev = codec->dev;
1004 INIT_LIST_HEAD(&info->module_list);
1005 mutex_init(&info->lock);
1006 INIT_LIST_HEAD(&info->dai_list);
1008 /* init dai_list used to maintain runtime stream info */
1009 for (i = 0; i < ARRAY_SIZE(gbaudio_dai); i++) {
1010 dai = devm_kzalloc(codec->dev, sizeof(*dai), GFP_KERNEL);
1013 dai->id = gbaudio_dai[i].id;
1014 list_add(&dai->list, &info->dai_list);
1017 info->codec = codec;
1018 snd_soc_codec_set_drvdata(codec, info);
1021 device_init_wakeup(codec->dev, 1);
1025 static int gbcodec_remove(struct snd_soc_codec *codec)
1027 /* Empty function for now */
1031 static int gbcodec_write(struct snd_soc_codec *codec, unsigned int reg,
1037 static unsigned int gbcodec_read(struct snd_soc_codec *codec,
1043 static struct snd_soc_codec_driver soc_codec_dev_gbaudio = {
1044 .probe = gbcodec_probe,
1045 .remove = gbcodec_remove,
1047 .read = gbcodec_read,
1048 .write = gbcodec_write,
1050 .idle_bias_off = true,
1051 .ignore_pmdown_time = 1,
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 snd_soc_register_codec(&pdev->dev, &soc_codec_dev_gbaudio,
1076 gbaudio_dai, ARRAY_SIZE(gbaudio_dai));
1079 static int gbaudio_codec_remove(struct platform_device *pdev)
1081 snd_soc_unregister_codec(&pdev->dev);
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",
1093 .owner = THIS_MODULE,
1095 .pm = &gbaudio_codec_pm_ops,
1097 .of_match_table = greybus_asoc_machine_of_match,
1099 .probe = gbaudio_codec_probe,
1100 .remove = gbaudio_codec_remove,
1102 module_platform_driver(gbaudio_codec_driver);
1104 MODULE_DESCRIPTION("APBridge ALSA SoC dummy codec driver");
1106 MODULE_LICENSE("GPL v2");
1107 MODULE_ALIAS("platform:apb-dummy-codec");