diff options
author | Dipesh Gandhi <dipeshg@nvidia.com> | 2018-05-22 01:13:10 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-07-05 12:56:57 -0400 |
commit | 517f0c6e0607e2684d259b214d5de855ac82c649 (patch) | |
tree | 47ac3d725f2e3d7dc6773d0707ac62b60d0e6412 | |
parent | 946c53285235c578a3b58ff49f2511c56832dd30 (diff) |
tegra-virt-alt: atomic wait for ivc receive
Change updates ack based wait for start/stop playback and capture
ivc messages. Since trigger is called in atomic context updated
ivc receive for using atomic wait.
Bug 2127348
Bug 2109369
Change-Id: I418ddaa9fed4c3f75ee007311023e4e29655e694
Signed-off-by: Dipesh Gandhi <dipeshg@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1729593
(cherry picked from commit 63250eab2abafc7d892356fca94d9ba53851a06e)
Reviewed-on: https://git-master.nvidia.com/r/1726738
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Uday Gupta <udayg@nvidia.com>
Reviewed-by: Nitin Pai <npai@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r-- | sound/soc/tegra-virt-alt/tegra210_virt_alt_admaif.c | 51 | ||||
-rw-r--r-- | sound/soc/tegra-virt-alt/tegra_virt_alt_ivc.c | 10 |
2 files changed, 41 insertions, 20 deletions
diff --git a/sound/soc/tegra-virt-alt/tegra210_virt_alt_admaif.c b/sound/soc/tegra-virt-alt/tegra210_virt_alt_admaif.c index 9fac2bd97..258ec78f6 100644 --- a/sound/soc/tegra-virt-alt/tegra210_virt_alt_admaif.c +++ b/sound/soc/tegra-virt-alt/tegra210_virt_alt_admaif.c | |||
@@ -132,10 +132,14 @@ static void tegra210_admaif_start_playback(struct snd_soc_dai *dai) | |||
132 | memset(&msg, 0, sizeof(struct nvaudio_ivc_msg)); | 132 | memset(&msg, 0, sizeof(struct nvaudio_ivc_msg)); |
133 | msg.cmd = NVAUDIO_START_PLAYBACK; | 133 | msg.cmd = NVAUDIO_START_PLAYBACK; |
134 | msg.params.dmaif_info.id = data->admaif_id; | 134 | msg.params.dmaif_info.id = data->admaif_id; |
135 | err = nvaudio_ivc_send(data->hivc_client, | 135 | msg.ack_required = true; |
136 | &msg, | 136 | err = nvaudio_ivc_send_retry(data->hivc_client, |
137 | sizeof(struct nvaudio_ivc_msg)); | 137 | &msg, sizeof(struct nvaudio_ivc_msg)); |
138 | if (err < 0) | 138 | |
139 | if (err >= 0) { | ||
140 | nvaudio_ivc_receive(data->hivc_client, | ||
141 | &msg, sizeof(struct nvaudio_ivc_msg)); | ||
142 | } else if (err < 0) | ||
139 | pr_err("%s: error on ivc_send\n", __func__); | 143 | pr_err("%s: error on ivc_send\n", __func__); |
140 | } | 144 | } |
141 | 145 | ||
@@ -150,10 +154,15 @@ static void tegra210_admaif_stop_playback(struct snd_soc_dai *dai) | |||
150 | memset(&msg, 0, sizeof(struct nvaudio_ivc_msg)); | 154 | memset(&msg, 0, sizeof(struct nvaudio_ivc_msg)); |
151 | msg.cmd = NVAUDIO_STOP_PLAYBACK; | 155 | msg.cmd = NVAUDIO_STOP_PLAYBACK; |
152 | msg.params.dmaif_info.id = data->admaif_id; | 156 | msg.params.dmaif_info.id = data->admaif_id; |
153 | err = nvaudio_ivc_send(data->hivc_client, | 157 | |
154 | &msg, | 158 | msg.ack_required = true; |
155 | sizeof(struct nvaudio_ivc_msg)); | 159 | err = nvaudio_ivc_send_retry(data->hivc_client, |
156 | if (err < 0) | 160 | &msg, sizeof(struct nvaudio_ivc_msg)); |
161 | |||
162 | if (err >= 0) { | ||
163 | nvaudio_ivc_receive(data->hivc_client, | ||
164 | &msg, sizeof(struct nvaudio_ivc_msg)); | ||
165 | } else if (err < 0) | ||
157 | pr_err("%s: error on ivc_send\n", __func__); | 166 | pr_err("%s: error on ivc_send\n", __func__); |
158 | } | 167 | } |
159 | 168 | ||
@@ -168,10 +177,15 @@ static void tegra210_admaif_start_capture(struct snd_soc_dai *dai) | |||
168 | memset(&msg, 0, sizeof(struct nvaudio_ivc_msg)); | 177 | memset(&msg, 0, sizeof(struct nvaudio_ivc_msg)); |
169 | msg.cmd = NVAUDIO_START_CAPTURE; | 178 | msg.cmd = NVAUDIO_START_CAPTURE; |
170 | msg.params.dmaif_info.id = data->admaif_id; | 179 | msg.params.dmaif_info.id = data->admaif_id; |
171 | err = nvaudio_ivc_send(data->hivc_client, | 180 | |
172 | &msg, | 181 | msg.ack_required = true; |
173 | sizeof(struct nvaudio_ivc_msg)); | 182 | err = nvaudio_ivc_send_retry(data->hivc_client, |
174 | if (err < 0) | 183 | &msg, sizeof(struct nvaudio_ivc_msg)); |
184 | |||
185 | if (err >= 0) { | ||
186 | nvaudio_ivc_receive(data->hivc_client, | ||
187 | &msg, sizeof(struct nvaudio_ivc_msg)); | ||
188 | } else if (err < 0) | ||
175 | pr_err("%s: error on ivc_send\n", __func__); | 189 | pr_err("%s: error on ivc_send\n", __func__); |
176 | } | 190 | } |
177 | 191 | ||
@@ -186,10 +200,15 @@ static void tegra210_admaif_stop_capture(struct snd_soc_dai *dai) | |||
186 | memset(&msg, 0, sizeof(struct nvaudio_ivc_msg)); | 200 | memset(&msg, 0, sizeof(struct nvaudio_ivc_msg)); |
187 | msg.cmd = NVAUDIO_STOP_CAPTURE; | 201 | msg.cmd = NVAUDIO_STOP_CAPTURE; |
188 | msg.params.dmaif_info.id = data->admaif_id; | 202 | msg.params.dmaif_info.id = data->admaif_id; |
189 | err = nvaudio_ivc_send(data->hivc_client, | 203 | |
190 | &msg, | 204 | msg.ack_required = true; |
191 | sizeof(struct nvaudio_ivc_msg)); | 205 | err = nvaudio_ivc_send_retry(data->hivc_client, |
192 | if (err < 0) | 206 | &msg, sizeof(struct nvaudio_ivc_msg)); |
207 | |||
208 | if (err >= 0) { | ||
209 | nvaudio_ivc_receive(data->hivc_client, | ||
210 | &msg, sizeof(struct nvaudio_ivc_msg)); | ||
211 | } else if (err < 0) | ||
193 | pr_err("%s: error on ivc_send\n", __func__); | 212 | pr_err("%s: error on ivc_send\n", __func__); |
194 | } | 213 | } |
195 | 214 | ||
diff --git a/sound/soc/tegra-virt-alt/tegra_virt_alt_ivc.c b/sound/soc/tegra-virt-alt/tegra_virt_alt_ivc.c index 30370845d..67c72ced9 100644 --- a/sound/soc/tegra-virt-alt/tegra_virt_alt_ivc.c +++ b/sound/soc/tegra-virt-alt/tegra_virt_alt_ivc.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * IVC based librabry for AUDIO server | 2 | * IVC based librabry for AUDIO server |
3 | * | 3 | * |
4 | * Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. | 4 | * Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms and conditions of the GNU General Public License, | 7 | * under the terms and conditions of the GNU General Public License, |
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/spinlock.h> | 24 | #include <linux/spinlock.h> |
25 | #include <linux/hardirq.h> | 25 | #include <linux/hardirq.h> |
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/iopoll.h> | ||
27 | 28 | ||
28 | #include "tegra_virt_alt_ivc.h" | 29 | #include "tegra_virt_alt_ivc.h" |
29 | #include "tegra_virt_alt_ivc_common.h" | 30 | #include "tegra_virt_alt_ivc_common.h" |
@@ -115,13 +116,14 @@ int nvaudio_ivc_receive(struct nvaudio_ivc_ctxt *ictxt, | |||
115 | struct nvaudio_ivc_msg *rx_msg, int size) | 116 | struct nvaudio_ivc_msg *rx_msg, int size) |
116 | { | 117 | { |
117 | unsigned long flags; | 118 | unsigned long flags; |
119 | unsigned int status; | ||
118 | int err = 0; | 120 | int err = 0; |
119 | u32 len = 0; | 121 | u32 len = 0; |
120 | 122 | ||
121 | while (!tegra_hv_ivc_can_read(ictxt->ivck)) { | 123 | while (!tegra_hv_ivc_can_read(ictxt->ivck)) { |
122 | wait_event_timeout(ictxt->wait, | 124 | readx_poll_timeout_atomic(readl, &(ictxt->rx_state), |
123 | ictxt->rx_state == RX_AVAIL, | 125 | status, (status == RX_AVAIL), |
124 | msecs_to_jiffies(ictxt->timeout)); | 126 | 10, 10000); |
125 | } | 127 | } |
126 | 128 | ||
127 | if (tegra_hv_ivc_channel_notified(ictxt->ivck)) { | 129 | if (tegra_hv_ivc_channel_notified(ictxt->ivck)) { |