| /* |
| * Copyright (c) 2018 STMicroelectronics |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef _STM32_I2S_H_ |
| #define _STM32_I2S_H_ |
| |
| struct queue_item { |
| void *mem_block; |
| size_t size; |
| }; |
| |
| /* Minimal ring buffer implementation */ |
| struct ring_buf { |
| struct queue_item *buf; |
| uint16_t len; |
| uint16_t head; |
| uint16_t tail; |
| }; |
| |
| /* Device constant configuration parameters */ |
| struct i2s_stm32_cfg { |
| SPI_TypeDef *i2s; |
| const struct stm32_pclken *pclken; |
| size_t pclk_len; |
| const struct pinctrl_dev_config *pcfg; |
| void (*irq_config)(const struct device *dev); |
| bool master_clk_sel; |
| }; |
| |
| struct stream { |
| int32_t state; |
| struct k_sem sem; |
| |
| const struct device *dev_dma; |
| uint32_t dma_channel; |
| struct dma_config dma_cfg; |
| uint8_t priority; |
| bool src_addr_increment; |
| bool dst_addr_increment; |
| uint8_t fifo_threshold; |
| bool tx_stop_for_drain; |
| |
| struct i2s_config cfg; |
| struct ring_buf mem_block_queue; |
| void *mem_block; |
| bool last_block; |
| bool master; |
| int (*stream_start)(struct stream *, const struct device *dev); |
| void (*stream_disable)(struct stream *, const struct device *dev); |
| void (*queue_drop)(struct stream *); |
| }; |
| |
| /* Device run time data */ |
| struct i2s_stm32_data { |
| struct stream rx; |
| struct stream tx; |
| }; |
| |
| /* checks that DMA Tx packet is fully transmitted over the I2S */ |
| static inline uint32_t ll_func_i2s_dma_busy(SPI_TypeDef *i2s) |
| { |
| #if DT_HAS_COMPAT_STATUS_OKAY(st_stm32h7_i2s) |
| return LL_SPI_IsActiveFlag_TXC(i2s) == 0; |
| #else |
| /* the I2S Tx empty and busy flags are needed */ |
| return (LL_SPI_IsActiveFlag_TXE(i2s) && |
| !LL_SPI_IsActiveFlag_BSY(i2s)); |
| #endif |
| } |
| |
| #endif /* _STM32_I2S_H_ */ |