summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/audio_codec.c
diff options
context:
space:
mode:
authorMark Greer2016-02-29 23:31:02 +0100
committerGreg Kroah-Hartman2016-03-02 07:44:49 +0100
commit5bbe14b7acc2a00f51b23812ffc596577d94e80b (patch)
tree0f71167f46735107345ac0f3ed7e407134943a69 /drivers/staging/greybus/audio_codec.c
parentgreybus: Loopback_test: use poll instead of inotify (diff)
downloadkernel-qcow2-linux-5bbe14b7acc2a00f51b23812ffc596577d94e80b.tar.gz
kernel-qcow2-linux-5bbe14b7acc2a00f51b23812ffc596577d94e80b.tar.xz
kernel-qcow2-linux-5bbe14b7acc2a00f51b23812ffc596577d94e80b.zip
greybus: audio: Split start and stop APBridgeA requests
Provide finer-grained control of the audio streaming on APB1 by splitting the transmit/receive start and stop requests into prepare, start, stop, and shutdown. CC: Vaibhav Agarwal <vaibhav.agarwal@linaro.org> Signed-off-by: Mark Greer <mgreer@animalcreek.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/audio_codec.c')
-rw-r--r--drivers/staging/greybus/audio_codec.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/drivers/staging/greybus/audio_codec.c b/drivers/staging/greybus/audio_codec.c
index 5e29694139f7..d7cae772dbf5 100644
--- a/drivers/staging/greybus/audio_codec.c
+++ b/drivers/staging/greybus/audio_codec.c
@@ -345,17 +345,33 @@ static int gbcodec_trigger(struct snd_pcm_substream *substream, int cmd,
goto func_exit;
}
- if (start && tx)
- ret = gb_audio_apbridgea_start_tx(gb_dai->connection, 0, 0);
+ if (start && tx) {
+ ret = gb_audio_apbridgea_prepare_tx(gb_dai->connection, 0);
+ if (!ret)
+ ret = gb_audio_apbridgea_start_tx(gb_dai->connection, 0,
+ 0);
+ }
- else if (start && rx)
- ret = gb_audio_apbridgea_start_rx(gb_dai->connection, 0);
+ else if (start && rx) {
+ ret = gb_audio_apbridgea_prepare_rx(gb_dai->connection, 0);
+ if (!ret)
+ ret = gb_audio_apbridgea_start_rx(gb_dai->connection,
+ 0);
+ }
- else if (stop && tx)
+ else if (stop && tx) {
ret = gb_audio_apbridgea_stop_tx(gb_dai->connection, 0);
+ if (!ret)
+ ret = gb_audio_apbridgea_shutdown_tx(gb_dai->connection,
+ 0);
+ }
- else if (stop && rx)
+ else if (stop && rx) {
ret = gb_audio_apbridgea_stop_rx(gb_dai->connection, 0);
+ if (!ret)
+ ret = gb_audio_apbridgea_shutdown_rx(gb_dai->connection,
+ 0);
+ }
else
ret = -EINVAL;
@@ -488,6 +504,10 @@ static void gb_audio_cleanup(struct gbaudio_codec_info *gb)
if (ret)
dev_info(dev, "%d:Failed during APBridge stop_tx\n",
ret);
+ ret = gb_audio_apbridgea_shutdown_tx(connection, 0);
+ if (ret)
+ dev_info(dev, "%d:Failed during APBridge shutdown_tx\n",
+ ret);
cportid = connection->intf_cport_id;
ret = gb_audio_gb_deactivate_tx(gb->mgmt_connection,
cportid);