3 * Copyright 2015 Google Inc.
4 * Copyright 2015 Linaro Ltd.
6 * Released under the GPLv2 only.
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <sound/soc.h>
11 #include <sound/pcm_params.h>
12 #include <sound/msm-dynamic-dailink.h>
14 #include "audio_codec.h"
15 #include "audio_apbridgea.h"
16 #include "audio_manager.h"
18 static DEFINE_MUTEX(gb_codec_list_lock);
19 static LIST_HEAD(gb_codec_list);
21 struct gbaudio_dai *gbaudio_find_dai(struct gbaudio_codec_info *gbcodec,
22 int data_cport, const char *name)
24 struct gbaudio_dai *dai;
26 list_for_each_entry(dai, &gbcodec->dai_list, list) {
27 if (name && !strncmp(dai->name, name, NAME_SIZE))
29 if ((data_cport != -1) && (dai->data_cport == data_cport))
38 static int gbcodec_startup(struct snd_pcm_substream *substream,
39 struct snd_soc_dai *dai)
42 __u16 i2s_port, cportid;
44 struct gbaudio_dai *gb_dai;
45 struct gbaudio_codec_info *gb = dev_get_drvdata(dai->dev);
48 mutex_lock(&gb->lock);
49 gb_dai = gbaudio_find_dai(gb, -1, dai->name);
51 dev_err(dai->dev, "%s: DAI not registered\n", dai->name);
52 mutex_unlock(&gb->lock);
57 i2s_port = 0; /* fixed for now */
58 cportid = gb_dai->connection->hd_cport_id;
59 ret = gb_audio_apbridgea_register_cport(gb_dai->connection, i2s_port,
61 dev_dbg(dai->dev, "Register %s:%d DAI, ret:%d\n", dai->name, cportid,
65 atomic_inc(&gb_dai->users);
66 mutex_unlock(&gb->lock);
71 static void gbcodec_shutdown(struct snd_pcm_substream *substream,
72 struct snd_soc_dai *dai)
75 __u16 i2s_port, cportid;
77 struct gbaudio_dai *gb_dai;
78 struct gbaudio_codec_info *gb = dev_get_drvdata(dai->dev);
81 mutex_lock(&gb->lock);
82 gb_dai = gbaudio_find_dai(gb, -1, dai->name);
84 dev_err(dai->dev, "%s: DAI not registered\n", dai->name);
88 atomic_dec(&gb_dai->users);
90 /* deactivate rx/tx */
91 cportid = gb_dai->connection->intf_cport_id;
93 switch (substream->stream) {
94 case SNDRV_PCM_STREAM_CAPTURE:
95 ret = gb_audio_gb_deactivate_rx(gb->mgmt_connection, cportid);
97 case SNDRV_PCM_STREAM_PLAYBACK:
98 ret = gb_audio_gb_deactivate_tx(gb->mgmt_connection, cportid);
101 dev_err(dai->dev, "Invalid stream type during shutdown\n");
106 dev_err(dai->dev, "%d:Error during deactivate\n", ret);
108 /* un register cport */
109 i2s_port = 0; /* fixed for now */
110 ret = gb_audio_apbridgea_unregister_cport(gb_dai->connection, i2s_port,
111 gb_dai->connection->hd_cport_id);
113 dev_dbg(dai->dev, "Unregister %s:%d DAI, ret:%d\n", dai->name,
114 gb_dai->connection->hd_cport_id, ret);
116 mutex_unlock(&gb->lock);
121 static int gbcodec_hw_params(struct snd_pcm_substream *substream,
122 struct snd_pcm_hw_params *hwparams,
123 struct snd_soc_dai *dai)
126 uint8_t sig_bits, channels;
127 uint32_t format, rate;
129 struct gbaudio_dai *gb_dai;
130 struct gbaudio_codec_info *gb = dev_get_drvdata(dai->dev);
133 mutex_lock(&gb->lock);
134 gb_dai = gbaudio_find_dai(gb, -1, dai->name);
136 dev_err(dai->dev, "%s: DAI not registered\n", dai->name);
142 * assuming, currently only 48000 Hz, 16BIT_LE, stereo
143 * is supported, validate params before configuring codec
145 if (params_channels(hwparams) != 2) {
146 dev_err(dai->dev, "Invalid channel count:%d\n",
147 params_channels(hwparams));
151 channels = params_channels(hwparams);
153 if (params_rate(hwparams) != 48000) {
154 dev_err(dai->dev, "Invalid sampling rate:%d\n",
155 params_rate(hwparams));
159 rate = GB_AUDIO_PCM_RATE_48000;
161 if (params_format(hwparams) != SNDRV_PCM_FORMAT_S16_LE) {
162 dev_err(dai->dev, "Invalid format:%d\n",
163 params_format(hwparams));
167 format = GB_AUDIO_PCM_FMT_S16_LE;
169 data_cport = gb_dai->connection->intf_cport_id;
170 /* XXX check impact of sig_bit
171 * it should not change ideally
174 dev_dbg(dai->dev, "cport:%d, rate:%d, channel %d, format %d, sig_bits:%d\n",
175 data_cport, rate, channels, format, sig_bits);
176 ret = gb_audio_gb_set_pcm(gb->mgmt_connection, data_cport, format,
177 rate, channels, sig_bits);
179 dev_err(dai->dev, "%d: Error during set_pcm\n", ret);
184 * XXX need to check if
185 * set config is always required
186 * check for mclk_freq as well
188 ret = gb_audio_apbridgea_set_config(gb_dai->connection, 0,
189 AUDIO_APBRIDGEA_PCM_FMT_16,
190 AUDIO_APBRIDGEA_PCM_RATE_48000,
193 dev_err(dai->dev, "%d: Error during set_config\n", ret);
195 mutex_unlock(&gb->lock);
199 static int gbcodec_prepare(struct snd_pcm_substream *substream,
200 struct snd_soc_dai *dai)
204 struct gbaudio_dai *gb_dai;
205 struct gbaudio_codec_info *gb = dev_get_drvdata(dai->dev);
208 mutex_lock(&gb->lock);
209 gb_dai = gbaudio_find_dai(gb, -1, dai->name);
211 dev_err(dai->dev, "%s: DAI not registered\n", dai->name);
216 /* deactivate rx/tx */
217 data_cport = gb_dai->connection->intf_cport_id;
219 switch (substream->stream) {
220 case SNDRV_PCM_STREAM_CAPTURE:
221 ret = gb_audio_gb_set_rx_data_size(gb->mgmt_connection,
225 "%d:Error during set_rx_data_size, cport:%d\n",
229 ret = gb_audio_apbridgea_set_rx_data_size(gb_dai->connection, 0,
233 "%d:Error during apbridgea_set_rx_data_size\n",
237 ret = gb_audio_gb_activate_rx(gb->mgmt_connection, data_cport);
239 case SNDRV_PCM_STREAM_PLAYBACK:
240 ret = gb_audio_gb_set_tx_data_size(gb->mgmt_connection,
244 "%d:Error during module set_tx_data_size, cport:%d\n",
248 ret = gb_audio_apbridgea_set_tx_data_size(gb_dai->connection, 0,
252 "%d:Error during apbridgea set_tx_data_size, cport\n",
256 ret = gb_audio_gb_activate_tx(gb->mgmt_connection, data_cport);
259 dev_err(dai->dev, "Invalid stream type %d during prepare\n",
266 dev_err(dai->dev, "%d: Error during activate stream\n", ret);
269 mutex_unlock(&gb->lock);
273 static int gbcodec_trigger(struct snd_pcm_substream *substream, int cmd,
274 struct snd_soc_dai *dai)
277 int tx, rx, start, stop;
278 struct gbaudio_dai *gb_dai;
279 struct gbaudio_codec_info *gb = dev_get_drvdata(dai->dev);
282 mutex_lock(&gb->lock);
283 gb_dai = gbaudio_find_dai(gb, -1, dai->name);
285 dev_err(dai->dev, "%s: DAI not registered\n", dai->name);
290 tx = rx = start = stop = 0;
292 case SNDRV_PCM_TRIGGER_START:
293 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
296 case SNDRV_PCM_TRIGGER_STOP:
297 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
301 dev_err(dai->dev, "Invalid tigger cmd:%d\n", cmd);
306 switch (substream->stream) {
307 case SNDRV_PCM_STREAM_CAPTURE:
310 case SNDRV_PCM_STREAM_PLAYBACK:
314 dev_err(dai->dev, "Invalid stream type:%d\n",
321 ret = gb_audio_apbridgea_start_tx(gb_dai->connection, 0, 0);
323 else if (start && rx)
324 ret = gb_audio_apbridgea_start_rx(gb_dai->connection, 0);
327 ret = gb_audio_apbridgea_stop_tx(gb_dai->connection, 0);
330 ret = gb_audio_apbridgea_stop_rx(gb_dai->connection, 0);
336 dev_err(dai->dev, "%d:Error during %s stream\n", ret,
337 start ? "Start" : "Stop");
340 mutex_unlock(&gb->lock);
344 static int gbcodec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
349 static int gbcodec_digital_mute(struct snd_soc_dai *dai, int mute)
354 static struct snd_soc_dai_ops gbcodec_dai_ops = {
355 .startup = gbcodec_startup,
356 .shutdown = gbcodec_shutdown,
357 .hw_params = gbcodec_hw_params,
358 .trigger = gbcodec_trigger,
359 .prepare = gbcodec_prepare,
360 .set_fmt = gbcodec_set_dai_fmt,
361 .digital_mute = gbcodec_digital_mute,
367 static int gbcodec_probe(struct snd_soc_codec *codec)
369 /* Empty function for now */
373 static int gbcodec_remove(struct snd_soc_codec *codec)
375 /* Empty function for now */
379 static int gbcodec_write(struct snd_soc_codec *codec, unsigned int reg,
383 struct gbaudio_codec_info *gbcodec = snd_soc_codec_get_drvdata(codec);
384 u8 *gbcodec_reg = gbcodec->reg;
386 if (reg == SND_SOC_NOPM)
389 if (reg >= GBCODEC_REG_COUNT)
392 gbcodec_reg[reg] = value;
393 dev_dbg(codec->dev, "reg[%d] = 0x%x\n", reg, value);
398 static unsigned int gbcodec_read(struct snd_soc_codec *codec,
401 unsigned int val = 0;
403 struct gbaudio_codec_info *gbcodec = snd_soc_codec_get_drvdata(codec);
404 u8 *gbcodec_reg = gbcodec->reg;
406 if (reg == SND_SOC_NOPM)
409 if (reg >= GBCODEC_REG_COUNT)
412 val = gbcodec_reg[reg];
413 dev_dbg(codec->dev, "reg[%d] = 0x%x\n", reg, val);
418 static struct snd_soc_codec_driver soc_codec_dev_gbcodec = {
419 .probe = gbcodec_probe,
420 .remove = gbcodec_remove,
422 .read = gbcodec_read,
423 .write = gbcodec_write,
425 .reg_cache_size = GBCODEC_REG_COUNT,
426 .reg_cache_default = gbcodec_reg_defaults,
429 .idle_bias_off = true,
430 .ignore_pmdown_time = 1,
434 * GB codec DAI link related
436 static struct snd_soc_dai_link gbaudio_dailink = {
437 .name = "PRI_MI2S_RX",
438 .stream_name = "Primary MI2S Playback",
439 .platform_name = "msm-pcm-routing",
440 .cpu_dai_name = "msm-dai-q6-mi2s.0",
445 static int gbaudio_add_dailinks(struct gbaudio_codec_info *gbcodec)
449 struct snd_soc_dai_link *dailink;
450 struct device *dev = gbcodec->dev;
452 dailink = &gbaudio_dailink;
453 dailink->codec_name = gbcodec->name;
456 * allocate memory for DAI links based on count.
457 * currently num_dai_links=1, so using static struct
459 gbcodec->num_dai_links = 1;
461 for (i = 0; i < gbcodec->num_dai_links; i++) {
462 gbcodec->dailink_name[i] = dai_link_name =
463 devm_kzalloc(dev, NAME_SIZE, GFP_KERNEL);
464 snprintf(dai_link_name, NAME_SIZE, "GB %d.%d PRI_MI2S_RX",
466 dailink->name = dai_link_name;
467 dailink->codec_dai_name = gbcodec->dais[i].name;
470 ret = msm8994_add_dailink("msm8994-tomtom-mtp-snd-card", dailink, 1);
472 dev_err(dev, "%d:Error while adding DAI link\n", ret);
478 * gb_snd management functions
482 * since BE DAI path is not yet properly closed from above layer,
483 * dsp dai.mi2s_dai_data.status_mask is still set to STATUS_PORT_STARTED
484 * this causes immediate playback/capture to fail in case relevant mixer
485 * control is not turned OFF
486 * user need to try once again after failure to recover DSP state.
488 static void gb_audio_cleanup(struct gbaudio_codec_info *gb)
491 struct gbaudio_dai *gb_dai;
492 struct gb_connection *connection;
493 struct device *dev = gb->dev;
495 list_for_each_entry(gb_dai, &gb->dai_list, list) {
497 * In case of BE dailink, need to deactivate APBridge
500 if (atomic_read(&gb_dai->users)) {
501 connection = gb_dai->connection;
503 ret = gb_audio_apbridgea_stop_tx(connection, 0);
505 dev_info(dev, "%d:Failed during APBridge stop_tx\n",
507 cportid = connection->intf_cport_id;
508 ret = gb_audio_gb_deactivate_tx(gb->mgmt_connection,
512 "%d:Failed during deactivate_tx\n",
514 cportid = connection->hd_cport_id;
515 ret = gb_audio_apbridgea_unregister_cport(connection, 0,
518 dev_info(dev, "%d:Failed during unregister cport\n",
520 atomic_dec(&gb_dai->users);
525 static int gbaudio_register_codec(struct gbaudio_codec_info *gbcodec)
528 struct device *dev = gbcodec->dev;
529 struct gb_connection *connection = gbcodec->mgmt_connection;
531 * FIXME: malloc for topology happens via audio_gb driver
532 * should be done within codec driver itself
534 struct gb_audio_topology *topology;
536 ret = gb_connection_enable(connection);
538 dev_err(dev, "%d: Error while enabling mgmt connection\n", ret);
542 gbcodec->dev_id = connection->intf->interface_id;
543 /* fetch topology data */
544 ret = gb_audio_gb_get_topology(connection, &topology);
546 dev_err(dev, "%d:Error while fetching topology\n", ret);
550 /* process topology data */
551 ret = gbaudio_tplg_parse_data(gbcodec, topology);
553 dev_err(dev, "%d:Error while parsing topology data\n",
557 gbcodec->topology = topology;
559 /* update codec info */
560 soc_codec_dev_gbcodec.controls = gbcodec->kctls;
561 soc_codec_dev_gbcodec.num_controls = gbcodec->num_kcontrols;
562 soc_codec_dev_gbcodec.dapm_widgets = gbcodec->widgets;
563 soc_codec_dev_gbcodec.num_dapm_widgets = gbcodec->num_dapm_widgets;
564 soc_codec_dev_gbcodec.dapm_routes = gbcodec->routes;
565 soc_codec_dev_gbcodec.num_dapm_routes = gbcodec->num_dapm_routes;
567 /* update DAI info */
568 for (i = 0; i < gbcodec->num_dais; i++)
569 gbcodec->dais[i].ops = &gbcodec_dai_ops;
572 ret = snd_soc_register_codec(dev, &soc_codec_dev_gbcodec,
575 dev_err(dev, "%d:Failed to register codec\n", ret);
579 /* update DAI links in response to this codec */
580 ret = gbaudio_add_dailinks(gbcodec);
582 dev_err(dev, "%d: Failed to add DAI links\n", ret);
583 goto add_dailink_err;
589 snd_soc_unregister_codec(dev);
591 gbaudio_tplg_release(gbcodec);
592 gbcodec->topology = NULL;
596 gb_connection_disable(gbcodec->mgmt_connection);
600 static void gbaudio_unregister_codec(struct gbaudio_codec_info *gbcodec)
602 gb_audio_cleanup(gbcodec);
603 msm8994_remove_dailink("msm8994-tomtom-mtp-snd-card", &gbaudio_dailink,
605 snd_soc_unregister_codec(gbcodec->dev);
606 gbaudio_tplg_release(gbcodec);
607 kfree(gbcodec->topology);
608 gb_connection_disable(gbcodec->mgmt_connection);
611 static int gbaudio_codec_request_handler(struct gb_operation *op)
613 struct gb_connection *connection = op->connection;
614 struct gb_audio_streaming_event_request *req = op->request->payload;
616 dev_warn(&connection->bundle->dev,
617 "Audio Event received: cport: %u, event: %u\n",
618 req->data_cport, req->event);
623 static int gbaudio_dai_request_handler(struct gb_operation *op)
625 struct gb_connection *connection = op->connection;
627 dev_warn(&connection->bundle->dev, "Audio Event received\n");
632 static int gb_audio_add_mgmt_connection(struct gbaudio_codec_info *gbcodec,
633 struct greybus_descriptor_cport *cport_desc,
634 struct gb_bundle *bundle)
636 struct gb_connection *connection;
638 /* Management Cport */
639 if (gbcodec->mgmt_connection) {
640 dev_err(&bundle->dev,
641 "Can't have multiple Management connections\n");
645 connection = gb_connection_create(bundle, le16_to_cpu(cport_desc->id),
646 gbaudio_codec_request_handler);
647 if (IS_ERR(connection))
648 return PTR_ERR(connection);
650 connection->private = gbcodec;
651 gbcodec->mgmt_connection = connection;
656 static int gb_audio_add_data_connection(struct gbaudio_codec_info *gbcodec,
657 struct greybus_descriptor_cport *cport_desc,
658 struct gb_bundle *bundle)
660 struct gb_connection *connection;
661 struct gbaudio_dai *dai;
663 dai = devm_kzalloc(gbcodec->dev, sizeof(*dai), GFP_KERNEL);
665 dev_err(gbcodec->dev, "DAI Malloc failure\n");
669 connection = gb_connection_create(bundle, le16_to_cpu(cport_desc->id),
670 gbaudio_dai_request_handler);
671 if (IS_ERR(connection)) {
672 devm_kfree(gbcodec->dev, dai);
673 return PTR_ERR(connection);
676 connection->private = gbcodec;
677 atomic_set(&dai->users, 0);
678 dai->data_cport = connection->intf_cport_id;
679 dai->connection = connection;
680 list_add(&dai->list, &gbcodec->dai_list);
685 * This is the basic hook get things initialized and registered w/ gb
688 static int gb_audio_probe(struct gb_bundle *bundle,
689 const struct greybus_bundle_id *id)
691 struct device *dev = &bundle->dev;
692 struct gbaudio_codec_info *gbcodec;
693 struct greybus_descriptor_cport *cport_desc;
694 struct gb_audio_manager_module_descriptor desc;
695 struct gbaudio_dai *dai, *_dai;
698 /* There should be at least one Management and one Data cport */
699 if (bundle->num_cports < 2)
702 mutex_lock(&gb_codec_list_lock);
704 * There can be only one Management connection and any number of data
707 gbcodec = devm_kzalloc(dev, sizeof(*gbcodec), GFP_KERNEL);
709 mutex_unlock(&gb_codec_list_lock);
713 gbcodec->num_data_connections = bundle->num_cports - 1;
714 mutex_init(&gbcodec->lock);
715 INIT_LIST_HEAD(&gbcodec->dai_list);
716 INIT_LIST_HEAD(&gbcodec->widget_list);
717 INIT_LIST_HEAD(&gbcodec->codec_ctl_list);
718 INIT_LIST_HEAD(&gbcodec->widget_ctl_list);
720 snprintf(gbcodec->name, NAME_SIZE, "%s.%s", dev->driver->name,
722 greybus_set_drvdata(bundle, gbcodec);
724 /* Create all connections */
725 for (i = 0; i < bundle->num_cports; i++) {
726 cport_desc = &bundle->cport_desc[i];
728 switch (cport_desc->protocol_id) {
729 case GREYBUS_PROTOCOL_AUDIO_MGMT:
730 ret = gb_audio_add_mgmt_connection(gbcodec, cport_desc,
733 goto destroy_connections;
735 case GREYBUS_PROTOCOL_AUDIO_DATA:
736 ret = gb_audio_add_data_connection(gbcodec, cport_desc,
739 goto destroy_connections;
742 dev_err(dev, "Unsupported protocol: 0x%02x\n",
743 cport_desc->protocol_id);
745 goto destroy_connections;
749 /* There must be a management cport */
750 if (!gbcodec->mgmt_connection) {
752 dev_err(dev, "Missing management connection\n");
753 goto destroy_connections;
756 /* Initialize management connection */
757 ret = gbaudio_register_codec(gbcodec);
759 goto destroy_connections;
761 /* Initialize data connections */
762 list_for_each_entry(dai, &gbcodec->dai_list, list) {
763 ret = gb_connection_enable(dai->connection);
768 /* inform above layer for uevent */
769 dev_dbg(dev, "Inform set_event:%d to above layer\n", 1);
770 /* prepare for the audio manager */
771 strlcpy(desc.name, gbcodec->name, GB_AUDIO_MANAGER_MODULE_NAME_LEN);
772 desc.slot = 1; /* todo */
773 desc.vid = 2; /* todo */
774 desc.pid = 3; /* todo */
775 desc.cport = gbcodec->dev_id;
776 desc.devices = 0x2; /* todo */
777 gbcodec->manager_id = gb_audio_manager_add(&desc);
779 list_add(&gbcodec->list, &gb_codec_list);
780 dev_dbg(dev, "Add GB Audio device:%s\n", gbcodec->name);
781 mutex_unlock(&gb_codec_list_lock);
786 list_for_each_entry_safe(dai, _dai, &gbcodec->dai_list, list)
787 gb_connection_disable(dai->connection);
789 gbaudio_unregister_codec(gbcodec);
791 list_for_each_entry_safe(dai, _dai, &gbcodec->dai_list, list) {
792 gb_connection_destroy(dai->connection);
793 list_del(&dai->list);
794 devm_kfree(dev, dai);
797 if (gbcodec->mgmt_connection)
798 gb_connection_destroy(gbcodec->mgmt_connection);
800 devm_kfree(dev, gbcodec);
801 mutex_unlock(&gb_codec_list_lock);
806 static void gb_audio_disconnect(struct gb_bundle *bundle)
808 struct gbaudio_codec_info *gbcodec = greybus_get_drvdata(bundle);
809 struct gbaudio_dai *dai, *_dai;
811 mutex_lock(&gb_codec_list_lock);
812 list_del(&gbcodec->list);
813 /* inform uevent to above layers */
814 gb_audio_manager_remove(gbcodec->manager_id);
816 mutex_lock(&gbcodec->lock);
817 list_for_each_entry_safe(dai, _dai, &gbcodec->dai_list, list)
818 gb_connection_disable(dai->connection);
819 gbaudio_unregister_codec(gbcodec);
821 list_for_each_entry_safe(dai, _dai, &gbcodec->dai_list, list) {
822 gb_connection_destroy(dai->connection);
823 list_del(&dai->list);
824 devm_kfree(gbcodec->dev, dai);
826 gb_connection_destroy(gbcodec->mgmt_connection);
827 gbcodec->mgmt_connection = NULL;
828 mutex_unlock(&gbcodec->lock);
830 devm_kfree(&bundle->dev, gbcodec);
831 mutex_unlock(&gb_codec_list_lock);
834 static const struct greybus_bundle_id gb_audio_id_table[] = {
835 { GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_AUDIO) },
838 MODULE_DEVICE_TABLE(greybus, gb_audio_id_table);
840 static struct greybus_driver gb_audio_driver = {
842 .probe = gb_audio_probe,
843 .disconnect = gb_audio_disconnect,
844 .id_table = gb_audio_id_table,
846 module_greybus_driver(gb_audio_driver);
848 MODULE_DESCRIPTION("Greybus Audio codec driver");
849 MODULE_AUTHOR("Vaibhav Agarwal <vaibhav.agarwal@linaro.org>");
850 MODULE_LICENSE("GPL v2");
851 MODULE_ALIAS("platform:gbaudio-codec");