diff --git a/drivers/i2s/i2s_cavs.c b/drivers/i2s/i2s_cavs.c index 50fcebb1d62..e8f1c0a9b07 100644 --- a/drivers/i2s/i2s_cavs.c +++ b/drivers/i2s/i2s_cavs.c @@ -227,7 +227,7 @@ static void i2s_dma_rx_callback(const struct device *dma_dev, void *arg, } static int i2s_cavs_configure(const struct device *dev, enum i2s_dir dir, - struct i2s_config *i2s_cfg) + const struct i2s_config *i2s_cfg) { const struct i2s_cavs_config *const dev_cfg = DEV_CFG(dev); struct i2s_cavs_dev_data *const dev_data = DEV_DATA(dev); diff --git a/drivers/i2s/i2s_common.c b/drivers/i2s/i2s_common.c index 2319a59194d..180c0f26c8e 100644 --- a/drivers/i2s/i2s_common.c +++ b/drivers/i2s/i2s_common.c @@ -16,8 +16,9 @@ int z_impl_i2s_buf_read(const struct device *dev, void *buf, size_t *size) ret = i2s_read((const struct device *)dev, &mem_block, size); if (!ret) { - struct i2s_config *rx_cfg = - i2s_config_get((const struct device *)dev, I2S_DIR_RX); + 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); @@ -29,7 +30,7 @@ int z_impl_i2s_buf_read(const struct device *dev, void *buf, size_t *size) int z_impl_i2s_buf_write(const struct device *dev, void *buf, size_t size) { int ret; - struct i2s_config *tx_cfg; + const struct i2s_config *tx_cfg; void *mem_block; tx_cfg = i2s_config_get((const struct device *)dev, I2S_DIR_TX); diff --git a/drivers/i2s/i2s_handlers.c b/drivers/i2s/i2s_handlers.c index 27384887f25..0bd3d4dc311 100644 --- a/drivers/i2s/i2s_handlers.c +++ b/drivers/i2s/i2s_handlers.c @@ -11,7 +11,7 @@ static inline int z_vrfy_i2s_configure(const struct device *dev, enum i2s_dir dir, - struct i2s_config *cfg_ptr) + const struct i2s_config *cfg_ptr) { struct i2s_config config; int ret = -EINVAL; @@ -20,7 +20,7 @@ static inline int z_vrfy_i2s_configure(const struct device *dev, goto out; } - Z_OOPS(z_user_from_copy(&config, (void *)cfg_ptr, + Z_OOPS(z_user_from_copy(&config, (const void *)cfg_ptr, sizeof(struct i2s_config))); /* Check that the k_mem_slab provided is a valid pointer and that @@ -55,14 +55,13 @@ static inline int z_vrfy_i2s_buf_read(const struct device *dev, ret = i2s_read((const struct device *)dev, &mem_block, &data_size); if (!ret) { - struct i2s_config *rx_cfg; + const struct i2s_config *rx_cfg; int copy_success; /* Presumed to be configured otherwise the i2s_read() call * would have failed. */ - rx_cfg = i2s_config_get((const struct device *)dev, - I2S_DIR_RX); + rx_cfg = i2s_config_get((const struct device *)dev, I2S_DIR_RX); copy_success = z_user_to_copy((void *)buf, mem_block, data_size); @@ -81,7 +80,7 @@ static inline int z_vrfy_i2s_buf_write(const struct device *dev, void *buf, size_t size) { int ret; - struct i2s_config *tx_cfg; + const struct i2s_config *tx_cfg; void *mem_block; Z_OOPS(Z_SYSCALL_DRIVER_I2S(dev, write)); diff --git a/drivers/i2s/i2s_litex.c b/drivers/i2s/i2s_litex.c index ec159c7a817..d63e4ff94e7 100644 --- a/drivers/i2s/i2s_litex.c +++ b/drivers/i2s/i2s_litex.c @@ -334,7 +334,7 @@ static int i2s_litex_initialize(const struct device *dev) } static int i2s_litex_configure(const struct device *dev, enum i2s_dir dir, - struct i2s_config *i2s_cfg) + const struct i2s_config *i2s_cfg) { struct i2s_litex_data *const dev_data = DEV_DATA(dev); const struct i2s_litex_cfg *const cfg = DEV_CFG(dev); @@ -393,7 +393,9 @@ static int i2s_litex_configure(const struct device *dev, enum i2s_dir dir, "only %" "i bytes of data are valid ", req_buf_s); - i2s_cfg->block_size = req_buf_s; + /* The block_size field will be corrected to req_buf_s in the + * structure copied as stream configuration (see below). + */ } int dev_sample_width = i2s_get_sample_width(cfg->base); @@ -434,6 +436,8 @@ static int i2s_litex_configure(const struct device *dev, enum i2s_dir dir, #endif memcpy(&stream->cfg, i2s_cfg, sizeof(struct i2s_config)); + stream->cfg.block_size = req_buf_s; + stream->state = I2S_STATE_READY; return 0; } diff --git a/drivers/i2s/i2s_ll_stm32.c b/drivers/i2s/i2s_ll_stm32.c index ebc5df4d221..02d0cd51ae0 100644 --- a/drivers/i2s/i2s_ll_stm32.c +++ b/drivers/i2s/i2s_ll_stm32.c @@ -181,7 +181,7 @@ static int i2s_stm32_set_clock(const struct device *dev, } static int i2s_stm32_configure(const struct device *dev, enum i2s_dir dir, - struct i2s_config *i2s_cfg) + const struct i2s_config *i2s_cfg) { const struct i2s_stm32_cfg *const cfg = DEV_CFG(dev); struct i2s_stm32_data *const dev_data = DEV_DATA(dev); diff --git a/drivers/i2s/i2s_mcux_flexcomm.c b/drivers/i2s/i2s_mcux_flexcomm.c index c67d28303c8..c153839a142 100644 --- a/drivers/i2s/i2s_mcux_flexcomm.c +++ b/drivers/i2s/i2s_mcux_flexcomm.c @@ -48,7 +48,7 @@ struct i2s_mcux_data { static int i2s_mcux_flexcomm_cfg_convert(uint32_t base_frequency, enum i2s_dir dir, - struct i2s_config *i2s_cfg, + const struct i2s_config *i2s_cfg, i2s_config_t *fsl_cfg) { if (dir == I2S_DIR_RX) { @@ -149,8 +149,8 @@ static int i2s_mcux_flexcomm_cfg_convert(uint32_t base_frequency, return 0; } -static struct i2s_config *i2s_mcux_config_get(const struct device *dev, - enum i2s_dir dir) +static const struct i2s_config *i2s_mcux_config_get(const struct device *dev, + enum i2s_dir dir) { struct i2s_mcux_data *dev_data = dev->data; struct stream *stream; @@ -169,7 +169,7 @@ static struct i2s_config *i2s_mcux_config_get(const struct device *dev, } static int i2s_mcux_configure(const struct device *dev, enum i2s_dir dir, - struct i2s_config *i2s_cfg) + const struct i2s_config *i2s_cfg) { const struct i2s_mcux_config *cfg = dev->config; struct i2s_mcux_data *dev_data = dev->data; diff --git a/drivers/i2s/i2s_sam_ssc.c b/drivers/i2s/i2s_sam_ssc.c index be7201fee1a..f5666af3687 100644 --- a/drivers/i2s/i2s_sam_ssc.c +++ b/drivers/i2s/i2s_sam_ssc.c @@ -311,7 +311,7 @@ tx_disable: } static int set_rx_data_format(const struct i2s_sam_dev_cfg *const dev_cfg, - struct i2s_config *i2s_cfg) + const struct i2s_config *i2s_cfg) { Ssc *const ssc = dev_cfg->regs; const bool pin_rk_en = IS_ENABLED(CONFIG_I2S_SAM_SSC_0_PIN_RK_EN); @@ -404,7 +404,7 @@ static int set_rx_data_format(const struct i2s_sam_dev_cfg *const dev_cfg, } static int set_tx_data_format(const struct i2s_sam_dev_cfg *const dev_cfg, - struct i2s_config *i2s_cfg) + const struct i2s_config *i2s_cfg) { Ssc *const ssc = dev_cfg->regs; uint8_t word_size_bits = i2s_cfg->word_size; @@ -515,8 +515,8 @@ static int bit_clock_set(Ssc *const ssc, uint32_t bit_clk_freq) return 0; } -static struct i2s_config *i2s_sam_config_get(const struct device *dev, - enum i2s_dir dir) +static const struct i2s_config *i2s_sam_config_get(const struct device *dev, + enum i2s_dir dir) { struct i2s_sam_dev_data *const dev_data = DEV_DATA(dev); struct stream *stream; @@ -535,7 +535,7 @@ static struct i2s_config *i2s_sam_config_get(const struct device *dev, } static int i2s_sam_configure(const struct device *dev, enum i2s_dir dir, - struct i2s_config *i2s_cfg) + const struct i2s_config *i2s_cfg) { const struct i2s_sam_dev_cfg *const dev_cfg = DEV_CFG(dev); struct i2s_sam_dev_data *const dev_data = DEV_DATA(dev); diff --git a/include/drivers/i2s.h b/include/drivers/i2s.h index b96be3efb5f..5b11c852771 100644 --- a/include/drivers/i2s.h +++ b/include/drivers/i2s.h @@ -316,9 +316,9 @@ struct i2s_config { */ __subsystem struct i2s_driver_api { int (*configure)(const struct device *dev, enum i2s_dir dir, - struct i2s_config *cfg); - struct i2s_config *(*config_get)(const struct device *dev, - enum i2s_dir dir); + const struct i2s_config *cfg); + const struct i2s_config *(*config_get)(const struct device *dev, + enum i2s_dir dir); int (*read)(const struct device *dev, void **mem_block, size_t *size); int (*write)(const struct device *dev, void *mem_block, size_t size); int (*trigger)(const struct device *dev, enum i2s_dir dir, @@ -351,11 +351,11 @@ __subsystem struct i2s_driver_api { * @retval -ENOSYS I2S_DIR_BOTH value is not supported. */ __syscall int i2s_configure(const struct device *dev, enum i2s_dir dir, - struct i2s_config *cfg); + const struct i2s_config *cfg); static inline int z_impl_i2s_configure(const struct device *dev, enum i2s_dir dir, - struct i2s_config *cfg) + const struct i2s_config *cfg) { const struct i2s_driver_api *api = (const struct i2s_driver_api *)dev->api; @@ -371,8 +371,8 @@ static inline int z_impl_i2s_configure(const struct device *dev, * @retval Pointer to the structure containing configuration parameters, * or NULL if un-configured */ -static inline struct i2s_config *i2s_config_get(const struct device *dev, - enum i2s_dir dir) +static inline const struct i2s_config *i2s_config_get(const struct device *dev, + enum i2s_dir dir) { const struct i2s_driver_api *api = (const struct i2s_driver_api *)dev->api;