2 * APBridge ALSA SoC dummy codec driver
3 * Copyright 2016 Google Inc.
4 * Copyright 2016 Linaro Ltd.
6 * Released under the GPLv2 only.
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/pm_runtime.h>
11 #include <sound/soc.h>
12 #include <sound/pcm_params.h>
13 #include <uapi/linux/input.h>
15 #include "audio_codec.h"
16 #include "audio_apbridgea.h"
17 #include "audio_manager.h"
19 static struct gbaudio_codec_info *gbcodec;
21 static struct gbaudio_data_connection *
22 find_data(struct gbaudio_module_info *module, const char *name)
24 struct gbaudio_data_connection *data;
26 list_for_each_entry(data, &module->data_list, list) {
27 if (name && !strncmp(data->name, name, NAME_SIZE))
33 static int find_stream(const char *name)
37 if (strnstr(name, "SPK Amp", NAME_SIZE))
38 stream |= GB_PLAYBACK;
43 static int gbaudio_module_disable(struct gbaudio_codec_info *codec,
44 struct gbaudio_module_info *module,
48 uint16_t data_cport, cportid, i2s_port;
49 int codec_state, module_state;
50 struct gbaudio_data_connection *data;
53 mutex_lock(&codec->lock);
55 codec_state = codec->stream[dir].state;
56 if (codec_state == GBAUDIO_CODEC_SHUTDOWN) {
57 mutex_unlock(&codec->lock);
61 dai_name = codec->stream[dir].dai_name;
63 module_state = module->ctrlstate[dir];
64 if (module_state == GBAUDIO_CODEC_SHUTDOWN) {
65 dev_dbg(codec->dev, "%s: module already configured\n",
67 mutex_unlock(&codec->lock);
72 data = find_data(module, dai_name);
74 dev_err(codec->dev, "%s:%s DATA connection missing\n",
75 dai_name, module->name);
76 mutex_unlock(&codec->lock);
79 if (codec_state > GBAUDIO_CODEC_HWPARAMS) {
80 data_cport = data->connection->intf_cport_id;
82 case SNDRV_PCM_STREAM_CAPTURE:
83 ret = gb_audio_gb_deactivate_rx(
84 module->mgmt_connection,
87 case SNDRV_PCM_STREAM_PLAYBACK:
88 ret = gb_audio_gb_deactivate_tx(
89 module->mgmt_connection,
96 dev_err_ratelimited(codec->dev, "deactivate for %s failed:%d\n",
100 dev_dbg(codec->dev, "Dynamic deactivate %s:%d DAI\n", dai_name,
103 if (codec_state > GBAUDIO_CODEC_SHUTDOWN) {
104 cportid = data->connection->hd_cport_id;
106 case SNDRV_PCM_STREAM_CAPTURE:
107 ret = gb_audio_apbridgea_unregister_cport(
110 AUDIO_APBRIDGEA_DIRECTION_RX);
112 case SNDRV_PCM_STREAM_PLAYBACK:
113 ret = gb_audio_apbridgea_unregister_cport(
116 AUDIO_APBRIDGEA_DIRECTION_TX);
122 dev_err_ratelimited(codec->dev, "unregister_cport for %s failed:%d\n",
126 dev_dbg(codec->dev, "Dynamic Unregister %s:%d DAI\n", dai_name,
129 module->ctrlstate[dir] = GBAUDIO_CODEC_SHUTDOWN;
132 mutex_unlock(&codec->lock);
136 static int gbaudio_module_enable(struct gbaudio_codec_info *codec,
137 struct gbaudio_module_info *module, int dir)
140 __u16 i2s_port, cportid;
141 int codec_state, module_state;
143 uint8_t sig_bits, channels;
144 uint32_t format, rate;
145 struct gbaudio_data_connection *data;
146 const char *dai_name;
148 mutex_lock(&codec->lock);
150 codec_state = codec->stream[dir].state;
151 if (codec_state == GBAUDIO_CODEC_SHUTDOWN) {
152 mutex_unlock(&codec->lock);
156 dai_name = codec->stream[dir].dai_name;
157 format = codec->stream[dir].format;
158 channels = codec->stream[dir].channels;
159 rate = codec->stream[dir].rate;
160 sig_bits = codec->stream[dir].sig_bits;
162 module_state = module->ctrlstate[dir];
163 if (module_state == codec_state) {
164 dev_dbg(codec->dev, "%s: module already configured\n",
166 mutex_unlock(&codec->lock);
171 data = find_data(module, dai_name);
173 dev_err(codec->dev, "%s:%s DATA connection missing\n",
174 dai_name, module->name);
175 mutex_unlock(&codec->lock);
180 if (module_state < codec_state) {
181 i2s_port = 0; /* fixed for now */
182 cportid = data->connection->hd_cport_id;
184 case SNDRV_PCM_STREAM_CAPTURE:
185 ret = gb_audio_apbridgea_register_cport(
188 AUDIO_APBRIDGEA_DIRECTION_RX);
190 case SNDRV_PCM_STREAM_PLAYBACK:
191 ret = gb_audio_apbridgea_register_cport(
194 AUDIO_APBRIDGEA_DIRECTION_TX);
200 dev_err_ratelimited(codec->dev, "reg_cport for %s\n", module->name);
203 module_state = GBAUDIO_CODEC_STARTUP;
204 dev_dbg(codec->dev, "Dynamic Register %s:%d DAI\n", dai_name,
209 if (module_state < codec_state) {
210 data_cport = data->connection->intf_cport_id;
211 ret = gb_audio_gb_set_pcm(module->mgmt_connection, data_cport,
212 format, rate, channels, sig_bits);
214 dev_err_ratelimited(codec->dev, "set_pcm for %s\n", module->name);
217 module_state = GBAUDIO_CODEC_HWPARAMS;
218 dev_dbg(codec->dev, "Dynamic hw_params %s:%d DAI\n", dai_name,
223 if (module_state < codec_state) {
224 data_cport = data->connection->intf_cport_id;
226 case SNDRV_PCM_STREAM_CAPTURE:
227 ret = gb_audio_gb_set_rx_data_size(
228 module->mgmt_connection,
231 dev_err_ratelimited(codec->dev,
232 "set_rx_data_size for %s\n",
236 ret = gb_audio_gb_activate_rx(module->mgmt_connection,
239 dev_err_ratelimited(codec->dev, "activate_rx for %s\n",
244 case SNDRV_PCM_STREAM_PLAYBACK:
245 ret = gb_audio_gb_set_tx_data_size(
246 module->mgmt_connection,
249 dev_err_ratelimited(codec->dev,
250 "set_tx_data_size for %s\n",
254 ret = gb_audio_gb_activate_tx(module->mgmt_connection,
257 dev_err_ratelimited(codec->dev, "activate_tx for %s\n",
263 dev_err(codec->dev, "Inavlid stream direction\n");
267 module_state = GBAUDIO_CODEC_PREPARE;
268 dev_dbg(codec->dev, "Dynamic prepare %s:%d DAI\n", dai_name,
273 module->ctrlstate[dir] = module_state;
274 mutex_unlock(&codec->lock);
278 int gbaudio_module_update(struct gbaudio_codec_info *codec,
280 struct gbaudio_module_info *module, int enable)
283 int pb_state, cap_state;
285 dev_dbg(module->dev, "Module update %s sequence\n",
286 enable ? "Enable":"Disable");
288 stream = find_stream(w_name);
290 dev_dbg(codec->dev, "No action required for %s\n", w_name);
294 /* check if playback active */
295 pb_state = codec->stream[SNDRV_PCM_STREAM_PLAYBACK].state;
296 if ((stream & GB_PLAYBACK) && (pb_state > GBAUDIO_CODEC_SHUTDOWN)) {
298 ret = gbaudio_module_enable(codec, module,
299 SNDRV_PCM_STREAM_PLAYBACK);
301 ret = gbaudio_module_disable(codec, module,
302 SNDRV_PCM_STREAM_PLAYBACK);
305 /* check if capture active */
306 cap_state = codec->stream[SNDRV_PCM_STREAM_CAPTURE].state;
307 if ((stream & GB_CAPTURE) && (cap_state > GBAUDIO_CODEC_SHUTDOWN)) {
309 ret = gbaudio_module_enable(codec, module,
310 SNDRV_PCM_STREAM_CAPTURE);
312 ret = gbaudio_module_disable(codec, module,
313 SNDRV_PCM_STREAM_CAPTURE);
318 EXPORT_SYMBOL(gbaudio_module_update);
323 static int gbcodec_startup(struct snd_pcm_substream *substream,
324 struct snd_soc_dai *dai)
327 __u16 i2s_port, cportid;
329 struct gbaudio_data_connection *data;
330 struct gbaudio_module_info *module;
331 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
333 mutex_lock(&codec->lock);
335 if (list_empty(&codec->module_list)) {
336 dev_err(codec->dev, "No codec module available\n");
337 mutex_unlock(&codec->lock);
341 state = codec->stream[substream->stream].state;
342 list_for_each_entry(module, &codec->module_list, list) {
344 data = find_data(module, dai->name);
346 dev_err(dai->dev, "%s:%s DATA connection missing\n",
347 dai->name, module->name);
352 i2s_port = 0; /* fixed for now */
353 cportid = data->connection->hd_cport_id;
354 switch (substream->stream) {
355 case SNDRV_PCM_STREAM_CAPTURE:
356 ret = gb_audio_apbridgea_register_cport(
359 AUDIO_APBRIDGEA_DIRECTION_RX);
361 case SNDRV_PCM_STREAM_PLAYBACK:
362 ret = gb_audio_apbridgea_register_cport(
365 AUDIO_APBRIDGEA_DIRECTION_TX);
368 dev_err(dai->dev, "Inavlid stream\n");
369 mutex_unlock(&codec->lock);
372 dev_dbg(dai->dev, "Register %s:%d DAI, ret:%d\n", dai->name,
374 state = GBAUDIO_CODEC_STARTUP;
375 module->ctrlstate[substream->stream] = state;
376 dev_dbg(dai->dev, "%s: state:%d\n", module->name, state);
378 codec->stream[substream->stream].state = state;
379 codec->stream[substream->stream].dai_name = dai->name;
380 mutex_unlock(&codec->lock);
381 /* to prevent suspend in case of active audio */
382 pm_stay_awake(dai->dev);
387 static int gbmodule_shutdown_tx(struct gbaudio_module_info *module,
388 struct gbaudio_data_connection *data,
389 int codec_state, struct device *dev)
391 int ret, module_state;
392 __u16 i2s_port, cportid;
394 module_state = module->ctrlstate[0];
395 if (module_state == GBAUDIO_CODEC_SHUTDOWN) {
396 dev_dbg(dev, "%s: module already configured\n",
402 cportid = data->connection->intf_cport_id;
403 if (module_state >= GBAUDIO_CODEC_PREPARE) {
404 ret = gb_audio_gb_deactivate_tx(module->mgmt_connection,
410 /* unregister cport */
411 i2s_port = 0; /* fixed for now */
412 cportid = data->connection->hd_cport_id;
413 ret = gb_audio_apbridgea_unregister_cport(data->connection, i2s_port,
415 AUDIO_APBRIDGEA_DIRECTION_TX);
420 static int gbmodule_shutdown_rx(struct gbaudio_module_info *module,
421 struct gbaudio_data_connection *data,
422 int codec_state, struct device *dev)
424 int ret, module_state;
425 __u16 i2s_port, cportid;
427 module_state = module->ctrlstate[1];
428 if (module_state == GBAUDIO_CODEC_SHUTDOWN) {
429 dev_dbg(dev, "%s: module already configured\n",
435 cportid = data->connection->intf_cport_id;
436 if (module_state >= GBAUDIO_CODEC_PREPARE) {
437 ret = gb_audio_gb_deactivate_rx(module->mgmt_connection,
443 /* unregister cport */
444 i2s_port = 0; /* fixed for now */
445 cportid = data->connection->hd_cport_id;
446 ret = gb_audio_apbridgea_unregister_cport(data->connection, i2s_port,
448 AUDIO_APBRIDGEA_DIRECTION_RX);
453 static void gbcodec_shutdown(struct snd_pcm_substream *substream,
454 struct snd_soc_dai *dai)
457 struct gbaudio_module_info *module;
458 struct gbaudio_data_connection *data;
459 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
461 mutex_lock(&codec->lock);
463 if (list_empty(&codec->module_list)) {
464 dev_err(codec->dev, "No codec module available\n");
465 codec->stream[substream->stream].state = GBAUDIO_CODEC_SHUTDOWN;
466 codec->stream[substream->stream].dai_name = NULL;
467 mutex_unlock(&codec->lock);
472 state = codec->stream[substream->stream].state;
473 list_for_each_entry(module, &codec->module_list, list) {
475 data = find_data(module, dai->name);
477 dev_err(dai->dev, "%s:%s DATA connection missing\n",
478 dai->name, module->name);
482 switch (substream->stream) {
483 case SNDRV_PCM_STREAM_PLAYBACK:
484 ret = gbmodule_shutdown_tx(module, data, state,
487 case SNDRV_PCM_STREAM_CAPTURE:
488 ret = gbmodule_shutdown_rx(module, data, state,
492 dev_dbg(dai->dev, "Unregister %s DAI, ret:%d\n", dai->name,
494 state = GBAUDIO_CODEC_SHUTDOWN;
495 module->ctrlstate[substream->stream] = state;
496 dev_dbg(dai->dev, "%s: state:%d\n", module->name, state);
498 codec->stream[substream->stream].state = state;
499 codec->stream[substream->stream].dai_name = NULL;
500 mutex_unlock(&codec->lock);
505 static int gbcodec_hw_params(struct snd_pcm_substream *substream,
506 struct snd_pcm_hw_params *hwparams,
507 struct snd_soc_dai *dai)
510 uint8_t sig_bits, channels;
511 uint32_t format, rate;
513 struct gbaudio_module_info *module;
514 struct gbaudio_data_connection *data;
516 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
518 mutex_lock(&codec->lock);
520 if (list_empty(&codec->module_list)) {
521 dev_err(codec->dev, "No codec module available\n");
522 mutex_unlock(&codec->lock);
527 * assuming, currently only 48000 Hz, 16BIT_LE, stereo
528 * is supported, validate params before configuring codec
530 if (params_channels(hwparams) != 2) {
531 dev_err(dai->dev, "Invalid channel count:%d\n",
532 params_channels(hwparams));
533 mutex_unlock(&codec->lock);
536 channels = params_channels(hwparams);
538 if (params_rate(hwparams) != 48000) {
539 dev_err(dai->dev, "Invalid sampling rate:%d\n",
540 params_rate(hwparams));
541 mutex_unlock(&codec->lock);
544 rate = GB_AUDIO_PCM_RATE_48000;
546 if (params_format(hwparams) != SNDRV_PCM_FORMAT_S16_LE) {
547 dev_err(dai->dev, "Invalid format:%d\n",
548 params_format(hwparams));
549 mutex_unlock(&codec->lock);
552 format = GB_AUDIO_PCM_FMT_S16_LE;
554 state = codec->stream[substream->stream].state;
555 list_for_each_entry(module, &codec->module_list, list) {
556 /* find the data connection */
557 data = find_data(module, dai->name);
559 dev_err(dai->dev, "%s:%s DATA connection missing\n",
560 dai->name, module->name);
564 data_cport = data->connection->intf_cport_id;
565 /* XXX check impact of sig_bit
566 * it should not change ideally
569 "cport:%d, rate:%d, channel %d, format %d, sig_bits:%d\n",
570 data_cport, rate, channels, format, sig_bits);
571 ret = gb_audio_gb_set_pcm(module->mgmt_connection, data_cport,
572 format, rate, channels, sig_bits);
574 dev_err_ratelimited(dai->dev, "%d: Error during set_pcm\n", ret);
577 if (state < GBAUDIO_CODEC_HWPARAMS) {
578 ret = gb_audio_apbridgea_set_config(data->connection, 0,
579 AUDIO_APBRIDGEA_PCM_FMT_16,
580 AUDIO_APBRIDGEA_PCM_RATE_48000,
583 dev_err_ratelimited(dai->dev,
584 "%d: Error during set_config\n", ret);
588 state = GBAUDIO_CODEC_HWPARAMS;
589 module->ctrlstate[substream->stream] = state;
590 dev_dbg(dai->dev, "%s: state:%d\n", module->name, state);
592 codec->stream[substream->stream].state = state;
593 codec->stream[substream->stream].format = format;
594 codec->stream[substream->stream].rate = rate;
595 codec->stream[substream->stream].channels = channels;
596 codec->stream[substream->stream].sig_bits = sig_bits;
599 mutex_unlock(&codec->lock);
603 static int gbmodule_prepare_tx(struct gbaudio_module_info *module,
604 struct gbaudio_data_connection *data,
605 int codec_state, struct device *dev)
610 data_cport = data->connection->intf_cport_id;
611 ret = gb_audio_gb_set_tx_data_size(module->mgmt_connection, data_cport,
614 dev_err_ratelimited(dev, "%d:Error during set_tx_data_size, cport:%d\n",
618 if (codec_state < GBAUDIO_CODEC_PREPARE) {
619 ret = gb_audio_apbridgea_set_tx_data_size(data->connection, 0,
622 dev_err_ratelimited(dev,
623 "%d:Error during apbridgea set_tx_data_size, cport\n",
628 ret = gb_audio_gb_activate_tx(module->mgmt_connection,
631 dev_err_ratelimited(dev, "%s:Error during activate stream,%d\n",
637 static int gbmodule_prepare_rx(struct gbaudio_module_info *module,
638 struct gbaudio_data_connection *data,
639 int codec_state, struct device *dev)
644 data_cport = data->connection->intf_cport_id;
646 ret = gb_audio_gb_set_rx_data_size(module->mgmt_connection, data_cport,
649 dev_err_ratelimited(dev, "%d:Error during set_rx_data_size, cport:%d\n",
653 if (codec_state < GBAUDIO_CODEC_PREPARE) {
654 ret = gb_audio_apbridgea_set_rx_data_size(data->connection, 0,
657 dev_err_ratelimited(dev,
658 "%d:Error during apbridgea_set_rx_data_size\n",
663 ret = gb_audio_gb_activate_rx(module->mgmt_connection,
666 dev_err_ratelimited(dev, "%s:Error during activate stream,%d\n",
672 static int gbcodec_prepare(struct snd_pcm_substream *substream,
673 struct snd_soc_dai *dai)
676 struct gbaudio_module_info *module;
678 struct gbaudio_data_connection *data;
679 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
681 mutex_lock(&codec->lock);
683 if (list_empty(&codec->module_list)) {
684 dev_err(codec->dev, "No codec module available\n");
685 mutex_unlock(&codec->lock);
689 state = codec->stream[substream->stream].state;
690 list_for_each_entry(module, &codec->module_list, list) {
692 data = find_data(module, dai->name);
694 dev_err(dai->dev, "%s:%s DATA connection missing\n",
695 dai->name, module->name);
699 switch (substream->stream) {
700 case SNDRV_PCM_STREAM_PLAYBACK:
701 ret = gbmodule_prepare_tx(module, data, state,
704 case SNDRV_PCM_STREAM_CAPTURE:
705 ret = gbmodule_prepare_rx(module, data, state,
715 state = GBAUDIO_CODEC_PREPARE;
716 module->ctrlstate[substream->stream] = state;
717 dev_dbg(dai->dev, "%s: state:%d\n", module->name, state);
719 codec->stream[substream->stream].state = state;
722 mutex_unlock(&codec->lock);
726 static int gbcodec_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
729 struct gbaudio_data_connection *data;
730 struct gbaudio_module_info *module;
731 struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
734 dev_dbg(dai->dev, "Mute:%d, Direction:%s\n", mute,
735 stream ? "CAPTURE":"PLAYBACK");
737 mutex_lock(&codec->lock);
738 if (list_empty(&codec->module_list)) {
739 dev_err(codec->dev, "No codec module available\n");
741 codec->stream[stream].state = GBAUDIO_CODEC_STOP;
746 mutex_unlock(&codec->lock);
750 list_for_each_entry(module, &codec->module_list, list) {
752 data = find_data(module, dai->name);
757 dev_err(dai->dev, "%s:%s DATA connection missing\n",
758 dai->name, module->name);
759 mutex_unlock(&codec->lock);
763 if (!mute && !stream) {/* start playback */
764 ret = gb_audio_apbridgea_prepare_tx(data->connection,
767 ret = gb_audio_apbridgea_start_tx(data->connection,
769 codec->stream[stream].state = GBAUDIO_CODEC_START;
770 } else if (!mute && stream) {/* start capture */
771 ret = gb_audio_apbridgea_prepare_rx(data->connection,
774 ret = gb_audio_apbridgea_start_rx(data->connection,
776 codec->stream[stream].state = GBAUDIO_CODEC_START;
777 } else if (mute && !stream) {/* stop playback */
778 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
780 ret = gb_audio_apbridgea_shutdown_tx(data->connection,
782 codec->stream[stream].state = GBAUDIO_CODEC_STOP;
783 } else if (mute && stream) {/* stop capture */
784 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
786 ret = gb_audio_apbridgea_shutdown_rx(data->connection,
788 codec->stream[stream].state = GBAUDIO_CODEC_STOP;
792 dev_err_ratelimited(dai->dev,
793 "%s:Error during %s %s stream:%d\n",
794 module->name, mute ? "Mute" : "Unmute",
795 stream ? "Capture" : "Playback", ret);
797 mutex_unlock(&codec->lock);
801 static struct snd_soc_dai_ops gbcodec_dai_ops = {
802 .startup = gbcodec_startup,
803 .shutdown = gbcodec_shutdown,
804 .hw_params = gbcodec_hw_params,
805 .prepare = gbcodec_prepare,
806 .mute_stream = gbcodec_mute_stream,
809 static int gbaudio_init_jack(struct gbaudio_module_info *module,
810 struct snd_soc_codec *codec)
814 if (!module->num_jacks)
817 /* register jack(s) in case any */
818 if (module->num_jacks > 1) {
819 dev_err(module->dev, "Currently supports max=1 jack\n");
823 snprintf(module->jack_name, NAME_SIZE, "GB %d Headset Jack",
825 ret = snd_soc_jack_new(codec, module->jack_name, GBCODEC_JACK_MASK,
826 &module->headset_jack);
828 dev_err(module->dev, "Failed to create new jack\n");
832 snprintf(module->button_name, NAME_SIZE, "GB %d Button Jack",
834 ret = snd_soc_jack_new(codec, module->button_name,
835 GBCODEC_JACK_BUTTON_MASK, &module->button_jack);
837 dev_err(module->dev, "Failed to create button jack\n");
841 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_0,
844 dev_err(module->dev, "Failed to set BTN_0\n");
848 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_1,
851 dev_err(module->dev, "Failed to set BTN_1\n");
855 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_2,
858 dev_err(module->dev, "Failed to set BTN_2\n");
862 ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_3,
865 dev_err(module->dev, "Failed to set BTN_0\n");
870 * verify if this is really required
871 set_bit(INPUT_PROP_NO_DUMMY_RELEASE,
872 module->button_jack.jack->input_dev->propbit);
878 int gbaudio_register_module(struct gbaudio_module_info *module)
881 struct snd_soc_codec *codec;
882 struct snd_card *card;
883 struct snd_soc_jack *jack = NULL;
886 dev_err(module->dev, "GB Codec not yet probed\n");
890 codec = gbcodec->codec;
891 card = codec->card->snd_card;
893 down_write(&card->controls_rwsem);
895 if (module->num_dais) {
896 dev_err(gbcodec->dev,
897 "%d:DAIs not supported via gbcodec driver\n",
899 up_write(&card->controls_rwsem);
903 ret = gbaudio_init_jack(module, codec);
905 up_write(&card->controls_rwsem);
909 if (module->dapm_widgets)
910 snd_soc_dapm_new_controls(&codec->dapm, module->dapm_widgets,
911 module->num_dapm_widgets);
912 if (module->controls)
913 snd_soc_add_codec_controls(codec, module->controls,
914 module->num_controls);
915 if (module->dapm_routes)
916 snd_soc_dapm_add_routes(&codec->dapm, module->dapm_routes,
917 module->num_dapm_routes);
919 /* card already instantiated, create widgets here only */
920 if (codec->card->instantiated) {
921 snd_soc_dapm_link_component_dai_widgets(codec->card,
923 #ifdef CONFIG_SND_JACK
924 /* register jack devices for this module from codec->jack_list */
925 list_for_each_entry(jack, &codec->jack_list, list) {
926 if ((jack == &module->headset_jack)
927 || (jack == &module->button_jack))
928 snd_device_register(codec->card->snd_card,
934 mutex_lock(&gbcodec->lock);
935 list_add(&module->list, &gbcodec->module_list);
936 mutex_unlock(&gbcodec->lock);
938 if (codec->card->instantiated)
939 ret = snd_soc_dapm_new_widgets(&codec->dapm);
940 dev_dbg(codec->dev, "Registered %s module\n", module->name);
942 up_write(&card->controls_rwsem);
945 EXPORT_SYMBOL(gbaudio_register_module);
947 static void gbaudio_codec_cleanup(struct gbaudio_module_info *module)
949 struct gbaudio_data_connection *data;
950 int pb_state = gbcodec->stream[0].state;
951 int cap_state = gbcodec->stream[1].state;
953 uint16_t i2s_port, cportid;
955 /* locks already acquired */
956 if (!pb_state && !cap_state)
959 dev_dbg(gbcodec->dev, "%s: removed, cleanup APBridge\n", module->name);
960 if (pb_state == GBAUDIO_CODEC_START) {
961 /* cleanup PB path, only APBridge specific */
962 data = find_data(module, gbcodec->stream[0].dai_name);
964 dev_err(gbcodec->dev, "%s: Missing data pointer\n",
969 if (list_is_singular(&gbcodec->module_list)) {
970 ret = gb_audio_apbridgea_stop_tx(data->connection, 0);
973 ret = gb_audio_apbridgea_shutdown_tx(data->connection,
978 i2s_port = 0; /* fixed for now */
979 cportid = data->connection->hd_cport_id;
980 ret = gb_audio_apbridgea_unregister_cport(data->connection,
982 AUDIO_APBRIDGEA_DIRECTION_TX);
983 module->ctrlstate[0] = GBAUDIO_CODEC_SHUTDOWN;
986 if (cap_state == GBAUDIO_CODEC_START) {
987 /* cleanup CAP path, only APBridge specific */
988 data = find_data(module, gbcodec->stream[1].dai_name);
990 dev_err(gbcodec->dev, "%s: Missing data pointer\n",
994 if (list_is_singular(&gbcodec->module_list)) {
995 ret = gb_audio_apbridgea_stop_rx(data->connection, 0);
998 ret = gb_audio_apbridgea_shutdown_rx(data->connection,
1003 i2s_port = 0; /* fixed for now */
1004 cportid = data->connection->hd_cport_id;
1005 ret = gb_audio_apbridgea_unregister_cport(data->connection,
1007 AUDIO_APBRIDGEA_DIRECTION_RX);
1008 module->ctrlstate[1] = GBAUDIO_CODEC_SHUTDOWN;
1012 void gbaudio_unregister_module(struct gbaudio_module_info *module)
1014 struct snd_soc_codec *codec = gbcodec->codec;
1015 struct snd_card *card = codec->card->snd_card;
1016 struct snd_soc_jack *jack, *next_j;
1018 dev_dbg(codec->dev, "Unregister %s module\n", module->name);
1020 down_write(&card->controls_rwsem);
1021 mutex_lock(&gbcodec->lock);
1022 gbaudio_codec_cleanup(module);
1023 list_del(&module->list);
1024 dev_dbg(codec->dev, "Process Unregister %s module\n", module->name);
1025 mutex_unlock(&gbcodec->lock);
1027 #ifdef CONFIG_SND_JACK
1028 /* free jack devices for this module from codec->jack_list */
1029 list_for_each_entry_safe(jack, next_j, &codec->jack_list, list) {
1030 if ((jack == &module->headset_jack)
1031 || (jack == &module->button_jack)) {
1032 snd_device_free(codec->card->snd_card, jack->jack);
1033 list_del(&jack->list);
1038 if (module->dapm_routes) {
1039 dev_dbg(codec->dev, "Removing %d routes\n",
1040 module->num_dapm_routes);
1041 snd_soc_dapm_del_routes(&codec->dapm, module->dapm_routes,
1042 module->num_dapm_routes);
1044 if (module->controls) {
1045 dev_dbg(codec->dev, "Removing %d controls\n",
1046 module->num_controls);
1047 snd_soc_remove_codec_controls(codec, module->controls,
1048 module->num_controls);
1050 if (module->dapm_widgets) {
1051 dev_dbg(codec->dev, "Removing %d widgets\n",
1052 module->num_dapm_widgets);
1053 snd_soc_dapm_free_controls(&codec->dapm, module->dapm_widgets,
1054 module->num_dapm_widgets);
1057 dev_dbg(codec->dev, "Unregistered %s module\n", module->name);
1059 up_write(&card->controls_rwsem);
1061 EXPORT_SYMBOL(gbaudio_unregister_module);
1066 static int gbcodec_probe(struct snd_soc_codec *codec)
1068 struct gbaudio_codec_info *info;
1070 info = devm_kzalloc(codec->dev, sizeof(*info), GFP_KERNEL);
1074 info->dev = codec->dev;
1075 INIT_LIST_HEAD(&info->module_list);
1076 mutex_init(&info->lock);
1077 info->codec = codec;
1078 snd_soc_codec_set_drvdata(codec, info);
1081 device_init_wakeup(codec->dev, 1);
1085 static int gbcodec_remove(struct snd_soc_codec *codec)
1087 /* Empty function for now */
1091 static u8 gbcodec_reg[GBCODEC_REG_COUNT] = {
1092 [GBCODEC_CTL_REG] = GBCODEC_CTL_REG_DEFAULT,
1093 [GBCODEC_MUTE_REG] = GBCODEC_MUTE_REG_DEFAULT,
1094 [GBCODEC_PB_LVOL_REG] = GBCODEC_PB_VOL_REG_DEFAULT,
1095 [GBCODEC_PB_RVOL_REG] = GBCODEC_PB_VOL_REG_DEFAULT,
1096 [GBCODEC_CAP_LVOL_REG] = GBCODEC_CAP_VOL_REG_DEFAULT,
1097 [GBCODEC_CAP_RVOL_REG] = GBCODEC_CAP_VOL_REG_DEFAULT,
1098 [GBCODEC_APB1_MUX_REG] = GBCODEC_APB1_MUX_REG_DEFAULT,
1099 [GBCODEC_APB2_MUX_REG] = GBCODEC_APB2_MUX_REG_DEFAULT,
1102 static int gbcodec_write(struct snd_soc_codec *codec, unsigned int reg,
1107 if (reg == SND_SOC_NOPM)
1110 BUG_ON(reg >= GBCODEC_REG_COUNT);
1112 gbcodec_reg[reg] = value;
1113 dev_dbg(codec->dev, "reg[%d] = 0x%x\n", reg, value);
1118 static unsigned int gbcodec_read(struct snd_soc_codec *codec,
1121 unsigned int val = 0;
1123 if (reg == SND_SOC_NOPM)
1126 BUG_ON(reg >= GBCODEC_REG_COUNT);
1128 val = gbcodec_reg[reg];
1129 dev_dbg(codec->dev, "reg[%d] = 0x%x\n", reg, val);
1134 static struct snd_soc_dai_driver gbaudio_dai[] = {
1136 .name = "greybus-apb1",
1139 .stream_name = "GB Audio Playback",
1140 .rates = SNDRV_PCM_RATE_48000,
1141 .formats = SNDRV_PCM_FORMAT_S16_LE,
1148 .stream_name = "GB Audio Capture",
1149 .rates = SNDRV_PCM_RATE_48000,
1150 .formats = SNDRV_PCM_FORMAT_S16_LE,
1156 .ops = &gbcodec_dai_ops,
1160 static struct snd_soc_codec_driver soc_codec_dev_gbaudio = {
1161 .probe = gbcodec_probe,
1162 .remove = gbcodec_remove,
1164 .read = gbcodec_read,
1165 .write = gbcodec_write,
1167 .reg_cache_size = GBCODEC_REG_COUNT,
1168 .reg_cache_default = gbcodec_reg_defaults,
1171 .idle_bias_off = true,
1172 .ignore_pmdown_time = 1,
1176 static int gbaudio_codec_suspend(struct device *dev)
1178 dev_dbg(dev, "%s: suspend\n", __func__);
1182 static int gbaudio_codec_resume(struct device *dev)
1184 dev_dbg(dev, "%s: resume\n", __func__);
1188 static const struct dev_pm_ops gbaudio_codec_pm_ops = {
1189 .suspend = gbaudio_codec_suspend,
1190 .resume = gbaudio_codec_resume,
1194 static int gbaudio_codec_probe(struct platform_device *pdev)
1196 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_gbaudio,
1197 gbaudio_dai, ARRAY_SIZE(gbaudio_dai));
1200 static int gbaudio_codec_remove(struct platform_device *pdev)
1202 snd_soc_unregister_codec(&pdev->dev);
1206 static const struct of_device_id greybus_asoc_machine_of_match[] = {
1207 { .compatible = "toshiba,apb-dummy-codec", },
1211 static struct platform_driver gbaudio_codec_driver = {
1213 .name = "apb-dummy-codec",
1214 .owner = THIS_MODULE,
1216 .pm = &gbaudio_codec_pm_ops,
1218 .of_match_table = greybus_asoc_machine_of_match,
1220 .probe = gbaudio_codec_probe,
1221 .remove = gbaudio_codec_remove,
1223 module_platform_driver(gbaudio_codec_driver);
1225 MODULE_DESCRIPTION("APBridge ALSA SoC dummy codec driver");
1226 MODULE_AUTHOR("Vaibhav Agarwal <vaibhav.agarwal@linaro.org>");
1227 MODULE_LICENSE("GPL v2");
1228 MODULE_ALIAS("platform:apb-dummy-codec");