|  | /* | 
|  | * Copyright (c) 2016 BayLibre, SAS | 
|  | * Copyright (c) 2017 Linaro Ltd | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | * | 
|  | */ | 
|  |  | 
|  | #ifndef ZEPHYR_DRIVERS_I2C_I2C_LL_STM32_H_ | 
|  | #define ZEPHYR_DRIVERS_I2C_I2C_LL_STM32_H_ | 
|  |  | 
|  | #include <zephyr/drivers/i2c/stm32.h> | 
|  |  | 
|  | #ifdef CONFIG_I2C_STM32_BUS_RECOVERY | 
|  | #include <zephyr/drivers/gpio.h> | 
|  | #endif /* CONFIG_I2C_STM32_BUS_RECOVERY */ | 
|  |  | 
|  | #include <zephyr/drivers/dma.h> | 
|  |  | 
|  | typedef void (*irq_config_func_t)(const struct device *port); | 
|  |  | 
|  | #if DT_HAS_COMPAT_STATUS_OKAY(st_stm32_i2c_v2) | 
|  | /** | 
|  | * @brief structure to convey optional i2c timings settings | 
|  | */ | 
|  | struct i2c_config_timing { | 
|  | /* i2c peripheral clock in Hz */ | 
|  | uint32_t periph_clock; | 
|  | /* i2c bus speed in Hz */ | 
|  | uint32_t i2c_speed; | 
|  | /* I2C_TIMINGR register value of i2c v2 peripheral */ | 
|  | uint32_t timing_setting; | 
|  | }; | 
|  | #endif | 
|  |  | 
|  | #ifdef CONFIG_I2C_STM32_V2_DMA | 
|  | struct stream { | 
|  | const struct device *dev_dma; | 
|  | int32_t dma_channel; | 
|  | }; | 
|  | #endif /* CONFIG_I2C_STM32_V2_DMA */ | 
|  |  | 
|  | struct i2c_stm32_config { | 
|  | #ifdef CONFIG_I2C_STM32_INTERRUPT | 
|  | irq_config_func_t irq_config_func; | 
|  | #endif | 
|  | #ifdef CONFIG_I2C_STM32_BUS_RECOVERY | 
|  | struct gpio_dt_spec scl; | 
|  | struct gpio_dt_spec sda; | 
|  | #endif /* CONFIG_I2C_STM32_BUS_RECOVERY */ | 
|  | const struct stm32_pclken *pclken; | 
|  | size_t pclk_len; | 
|  | I2C_TypeDef *i2c; | 
|  | uint32_t bitrate; | 
|  | const struct pinctrl_dev_config *pcfg; | 
|  | #if DT_HAS_COMPAT_STATUS_OKAY(st_stm32_i2c_v2) | 
|  | const struct i2c_config_timing *timings; | 
|  | size_t n_timings; | 
|  | #endif | 
|  | #ifdef CONFIG_I2C_STM32_V2_DMA | 
|  | struct stream tx_dma; | 
|  | struct stream rx_dma; | 
|  | #endif /* CONFIG_I2C_STM32_V2_DMA */ | 
|  | }; | 
|  |  | 
|  | struct i2c_stm32_data { | 
|  | #ifdef CONFIG_I2C_STM32_INTERRUPT | 
|  | struct k_sem device_sync_sem; | 
|  | #endif | 
|  | struct k_sem bus_mutex; | 
|  | uint32_t dev_config; | 
|  | #if DT_HAS_COMPAT_STATUS_OKAY(st_stm32_i2c_v2) | 
|  | /* Store the current timing structure set by runtime config */ | 
|  | struct i2c_config_timing current_timing; | 
|  | #endif | 
|  | #ifdef CONFIG_I2C_STM32_V1 | 
|  | uint16_t slave_address; | 
|  | #endif | 
|  | struct { | 
|  | #ifdef CONFIG_I2C_STM32_V1 | 
|  | unsigned int is_restart; | 
|  | unsigned int flags; | 
|  | #endif | 
|  | unsigned int is_write; | 
|  | unsigned int is_arlo; | 
|  | unsigned int is_nack; | 
|  | unsigned int is_err; | 
|  | struct i2c_msg *msg; | 
|  | unsigned int len; | 
|  | uint8_t *buf; | 
|  | } current; | 
|  | #ifdef CONFIG_I2C_TARGET | 
|  | bool master_active; | 
|  | struct i2c_target_config *slave_cfg; | 
|  | #ifdef CONFIG_I2C_STM32_V2 | 
|  | struct i2c_target_config *slave2_cfg; | 
|  | #endif | 
|  | bool slave_attached; | 
|  | #endif | 
|  | bool is_configured; | 
|  | bool smbalert_active; | 
|  | enum i2c_stm32_mode mode; | 
|  | #ifdef CONFIG_SMBUS_STM32_SMBALERT | 
|  | i2c_stm32_smbalert_cb_func_t smbalert_cb_func; | 
|  | const struct device *smbalert_cb_dev; | 
|  | #endif | 
|  | #ifdef CONFIG_I2C_STM32_V2_DMA | 
|  | struct dma_config dma_tx_cfg; | 
|  | struct dma_config dma_rx_cfg; | 
|  | struct dma_block_config dma_blk_cfg; | 
|  | #endif /* CONFIG_I2C_STM32_V2_DMA */ | 
|  | }; | 
|  |  | 
|  | int stm32_i2c_transaction(const struct device *dev, | 
|  | struct i2c_msg msg, uint8_t *next_msg_flags, | 
|  | uint16_t periph); | 
|  | int stm32_i2c_configure_timing(const struct device *dev, uint32_t clk); | 
|  | int i2c_stm32_runtime_configure(const struct device *dev, uint32_t config); | 
|  | int i2c_stm32_get_config(const struct device *dev, uint32_t *config); | 
|  |  | 
|  | void stm32_i2c_event_isr(void *arg); | 
|  | void stm32_i2c_error_isr(void *arg); | 
|  | #ifdef CONFIG_I2C_STM32_COMBINED_INTERRUPT | 
|  | void stm32_i2c_combined_isr(void *arg); | 
|  | #endif | 
|  |  | 
|  | #ifdef CONFIG_I2C_TARGET | 
|  | int i2c_stm32_target_register(const struct device *dev, struct i2c_target_config *config); | 
|  | int i2c_stm32_target_unregister(const struct device *dev, struct i2c_target_config *config); | 
|  | #endif | 
|  |  | 
|  | #endif	/* ZEPHYR_DRIVERS_I2C_I2C_LL_STM32_H_ */ |