summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDipesh Gandhi <dipeshg@nvidia.com>2018-05-22 01:13:10 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-07-05 12:56:57 -0400
commit517f0c6e0607e2684d259b214d5de855ac82c649 (patch)
tree47ac3d725f2e3d7dc6773d0707ac62b60d0e6412
parent946c53285235c578a3b58ff49f2511c56832dd30 (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.c51
-rw-r--r--sound/soc/tegra-virt-alt/tegra_virt_alt_ivc.c10
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)) {