Skip to content

Commit da0f2d9

Browse files
committed
audio: dai-zephyr: migrate to use dai_get_properties_copy()
Modify code to allocate DAI properties object on stack and use dai_get_properties_copy(). This is required when DAI code is run in user-space and a syscall is needed to talk to the DAI driver. It's not possible to return a pointer to kernel memory, so instead data needs to be copied to caller stack. Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
1 parent 57ad498 commit da0f2d9

1 file changed

Lines changed: 30 additions & 24 deletions

File tree

src/audio/dai-zephyr.c

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -203,58 +203,62 @@ __cold int dai_set_config(struct dai *dai, struct ipc_config_dai *common_config,
203203
/* called from ipc/ipc3/dai.c */
204204
int dai_get_handshake(struct dai *dai, int direction, int stream_id)
205205
{
206-
const struct dai_properties *props;
207-
int hs_id;
206+
struct dai_properties props;
207+
int ret;
208208

209209
k_mutex_lock(dai->lock, K_FOREVER);
210-
props = dai_get_properties(dai->dev, direction, stream_id);
211-
hs_id = props->dma_hs_id;
210+
ret = dai_get_properties_copy(dai->dev, direction, stream_id, &props);
212211
k_mutex_unlock(dai->lock);
212+
if (ret < 0)
213+
return ret;
213214

214-
return hs_id;
215+
return props.dma_hs_id;
215216
}
216217

217218
/* called from ipc/ipc3/dai.c and ipc/ipc4/dai.c */
218219
int dai_get_fifo_depth(struct dai *dai, int direction)
219220
{
220-
const struct dai_properties *props;
221-
int fifo_depth;
221+
struct dai_properties props;
222+
int ret;
222223

223224
if (!dai)
224225
return 0;
225226

226227
k_mutex_lock(dai->lock, K_FOREVER);
227-
props = dai_get_properties(dai->dev, direction, 0);
228-
fifo_depth = props->fifo_depth;
228+
ret = dai_get_properties_copy(dai->dev, direction, 0, &props);
229229
k_mutex_unlock(dai->lock);
230+
if (ret < 0)
231+
return 0;
230232

231-
return fifo_depth;
233+
return props.fifo_depth;
232234
}
233235

234236
int dai_get_stream_id(struct dai *dai, int direction)
235237
{
236-
const struct dai_properties *props;
237-
int stream_id;
238+
struct dai_properties props;
239+
int ret;
238240

239241
k_mutex_lock(dai->lock, K_FOREVER);
240-
props = dai_get_properties(dai->dev, direction, 0);
241-
stream_id = props->stream_id;
242+
ret = dai_get_properties_copy(dai->dev, direction, 0, &props);
242243
k_mutex_unlock(dai->lock);
244+
if (ret < 0)
245+
return ret;
243246

244-
return stream_id;
247+
return props.stream_id;
245248
}
246249

247250
static int dai_get_fifo(struct dai *dai, int direction, int stream_id)
248251
{
249-
const struct dai_properties *props;
250-
int fifo_address;
252+
struct dai_properties props;
253+
int ret;
251254

252255
k_mutex_lock(dai->lock, K_FOREVER);
253-
props = dai_get_properties(dai->dev, direction, stream_id);
254-
fifo_address = props->fifo_address;
256+
ret = dai_get_properties_copy(dai->dev, direction, stream_id, &props);
255257
k_mutex_unlock(dai->lock);
258+
if (ret < 0)
259+
return ret;
256260

257-
return fifo_address;
261+
return props.fifo_address;
258262
}
259263

260264
/* this is called by DMA driver every time descriptor has completed */
@@ -1967,15 +1971,17 @@ static int dai_ts_stop_op(struct comp_dev *dev)
19671971

19681972
uint32_t dai_get_init_delay_ms(struct dai *dai)
19691973
{
1970-
const struct dai_properties *props;
1971-
uint32_t init_delay;
1974+
struct dai_properties props;
1975+
uint32_t init_delay = 0;
1976+
int ret;
19721977

19731978
if (!dai)
19741979
return 0;
19751980

19761981
k_mutex_lock(dai->lock, K_FOREVER);
1977-
props = dai_get_properties(dai->dev, 0, 0);
1978-
init_delay = props->reg_init_delay;
1982+
ret = dai_get_properties_copy(dai->dev, 0, 0, &props);
1983+
if (!ret)
1984+
init_delay = props.reg_init_delay;
19791985
k_mutex_unlock(dai->lock);
19801986

19811987
return init_delay;

0 commit comments

Comments
 (0)