7fcf78073b
The i2s_config structure passed to the i2s_configure() function is not supposed to be modified by the driver. Similarly, the structure returned by the i2s_config_get() function is not supposed to be modified outside the driver. Decorate the pointers to those structures with the const qualifier and correct one driver that actually modified the structure passed to i2s_configure(). Signed-off-by: Andrzej Głąbek <andrzej.glabek@nordicsemi.no>
59 lines
1.1 KiB
C
59 lines
1.1 KiB
C
/*
|
|
* Copyright (c) 2018 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <kernel.h>
|
|
#include <string.h>
|
|
#include <drivers/i2s.h>
|
|
|
|
int z_impl_i2s_buf_read(const struct device *dev, void *buf, size_t *size)
|
|
{
|
|
void *mem_block;
|
|
int ret;
|
|
|
|
ret = i2s_read((const struct device *)dev, &mem_block, size);
|
|
|
|
if (!ret) {
|
|
const struct i2s_config *rx_cfg;
|
|
|
|
rx_cfg = i2s_config_get((const struct device *)dev, I2S_DIR_RX);
|
|
|
|
memcpy(buf, mem_block, *size);
|
|
k_mem_slab_free(rx_cfg->mem_slab, &mem_block);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int z_impl_i2s_buf_write(const struct device *dev, void *buf, size_t size)
|
|
{
|
|
int ret;
|
|
const struct i2s_config *tx_cfg;
|
|
void *mem_block;
|
|
|
|
tx_cfg = i2s_config_get((const struct device *)dev, I2S_DIR_TX);
|
|
if (!tx_cfg) {
|
|
return -EIO;
|
|
}
|
|
|
|
if (size > tx_cfg->block_size) {
|
|
return -EINVAL;
|
|
}
|
|
|
|
ret = k_mem_slab_alloc(tx_cfg->mem_slab, &mem_block, K_FOREVER);
|
|
if (ret < 0) {
|
|
return -ENOMEM;
|
|
}
|
|
|
|
memcpy(mem_block, (void *)buf, size);
|
|
|
|
ret = i2s_write((const struct device *)dev, mem_block, size);
|
|
if (ret != 0) {
|
|
k_mem_slab_free(tx_cfg->mem_slab, &mem_block);
|
|
}
|
|
|
|
return ret;
|
|
}
|