1 /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ 2 /* 3 * Copyright (c) 2017-2019, STMicroelectronics 4 */ 5 6 #ifndef __STM32_I2C_H 7 #define __STM32_I2C_H 8 9 #include <drivers/stm32_gpio.h> 10 #include <mm/core_memprot.h> 11 #include <stdbool.h> 12 #include <stdint.h> 13 #include <util.h> 14 #include <types_ext.h> 15 16 /* 17 * I2C specification values as per version 6.0, 4th of April 2014 [1], 18 * table 10 page 48: Characteristics of the SDA and SCL bus lines for 19 * Standard, Fast, and Fast-mode Plus I2C-bus devices. 20 * 21 * [1] https://www.nxp.com/docs/en/user-guide/UM10204.pdf 22 */ 23 enum i2c_speed_e { 24 I2C_SPEED_STANDARD, /* 100 kHz */ 25 I2C_SPEED_FAST, /* 400 kHz */ 26 I2C_SPEED_FAST_PLUS, /* 1 MHz */ 27 }; 28 29 #define I2C_STANDARD_RATE 100000 30 #define I2C_FAST_RATE 400000 31 #define I2C_FAST_PLUS_RATE 1000000 32 33 /* 34 * Initialization configuration structure for the STM32 I2C bus. 35 * Refer to the SoC Reference Manual for more details on configuration items. 36 * 37 * @pbase: I2C interface base address 38 * @clock: I2C bus/interface clock 39 * @addr_mode_10b_not_7b: True if 10bit addressing mode, otherwise 7bit mode 40 * @own_address1: 7-bit or 10-bit first device own address. 41 * @dual_address_mode: True if enabling Dual-Addressing mode 42 * @own_address2: 7-bit second device own address (Dual-Addressing mode) 43 * @own_address2_masks: Acknowledge mask address (Dual-Addressing mode) 44 * @general_call_mode: True if enbling General-Call mode 45 * @no_stretch_mode: If enabling the No-Stretch mode 46 * @rise_time: SCL clock pin rising time in nanoseconds 47 * @fall_time: SCL clock pin falling time in nanoseconds 48 * @speed_mode: I2C clock source frequency mode 49 * @analog_filter: True if enabling analog filter 50 * @digital_filter_coef: filter coef (below STM32_I2C_DIGITAL_FILTER_MAX) 51 */ 52 struct stm32_i2c_init_s { 53 paddr_t pbase; 54 unsigned int clock; 55 bool addr_mode_10b_not_7b; 56 uint32_t own_address1; 57 bool dual_address_mode; 58 uint32_t own_address2; 59 uint32_t own_address2_masks; 60 bool general_call_mode; 61 bool no_stretch_mode; 62 uint32_t rise_time; 63 uint32_t fall_time; 64 enum i2c_speed_e speed_mode; 65 bool analog_filter; 66 uint8_t digital_filter_coef; 67 }; 68 69 enum i2c_state_e { 70 I2C_STATE_RESET, /* Not yet initialized */ 71 I2C_STATE_READY, /* Ready for use */ 72 I2C_STATE_BUSY, /* Internal process ongoing */ 73 I2C_STATE_BUSY_TX, /* Data Transmission ongoing */ 74 I2C_STATE_BUSY_RX, /* Data Reception ongoing */ 75 I2C_STATE_SUSPENDED, /* Bus is supended */ 76 }; 77 78 enum i2c_mode_e { 79 I2C_MODE_NONE, /* No active communication */ 80 I2C_MODE_MASTER, /* Communication in Master Mode */ 81 I2C_MODE_SLAVE, /* Communication in Slave Mode */ 82 I2C_MODE_MEM, /* Communication in Memory Mode */ 83 }; 84 85 #define I2C_ERROR_NONE 0x0 86 #define I2C_ERROR_BERR BIT(0) 87 #define I2C_ERROR_ARLO BIT(1) 88 #define I2C_ERROR_ACKF BIT(2) 89 #define I2C_ERROR_OVR BIT(3) 90 #define I2C_ERROR_DMA BIT(4) 91 #define I2C_ERROR_TIMEOUT BIT(5) 92 #define I2C_ERROR_SIZE BIT(6) 93 94 /* I2C interface registers state */ 95 struct i2c_cfg { 96 uint32_t timingr; 97 uint32_t oar1; 98 uint32_t oar2; 99 uint32_t cr1; 100 uint32_t cr2; 101 }; 102 103 /* 104 * I2C bus device 105 * @base: I2C SoC registers base address 106 * @clock: clock ID 107 * @i2c_state: Driver state ID I2C_STATE_* 108 * @i2c_err: Last error code I2C_ERROR_* 109 * @sec_cfg: I2C regsiters configuration storage 110 * @pinctrl: PINCTRLs configuration for the I2C PINs 111 * @pinctrl_count: Number of PINCTRLs elements 112 */ 113 struct i2c_handle_s { 114 struct io_pa_va base; 115 unsigned long clock; 116 enum i2c_state_e i2c_state; 117 uint32_t i2c_err; 118 struct i2c_cfg sec_cfg; 119 struct stm32_pinctrl *pinctrl; 120 size_t pinctrl_count; 121 }; 122 123 /* STM32 specific defines */ 124 #define STM32_I2C_SPEED_DEFAULT I2C_SPEED_STANDARD 125 #define STM32_I2C_RISE_TIME_DEFAULT 25 /* ns */ 126 #define STM32_I2C_FALL_TIME_DEFAULT 10 /* ns */ 127 #define STM32_I2C_ANALOG_FILTER_DELAY_MIN 50 /* ns */ 128 #define STM32_I2C_ANALOG_FILTER_DELAY_MAX 260 /* ns */ 129 #define STM32_I2C_DIGITAL_FILTER_MAX 16 130 131 /* 132 * Fill struct stm32_i2c_init_s from DT content for a given I2C node 133 * 134 * @fdt: Reference to DT 135 * @node: Target I2C node in the DT 136 * @init: Output stm32_i2c_init_s structure 137 * @pinctrl: Reference to output pinctrl array 138 * @pinctrl_count: Input @pinctrl array size, output expected size 139 * Return 0 on success else a negative value 140 */ 141 int stm32_i2c_get_setup_from_fdt(void *fdt, int node, 142 struct stm32_i2c_init_s *init, 143 struct stm32_pinctrl **pinctrl, 144 size_t *pinctrl_count); 145 146 /* 147 * Initialize I2C bus handle from input configuration directives 148 * 149 * @hi2c: Reference to I2C bus handle structure 150 * @init_data: Input stm32_i2c_init_s structure 151 * Return 0 on success else a negative value 152 */ 153 int stm32_i2c_init(struct i2c_handle_s *hi2c, 154 struct stm32_i2c_init_s *init_data); 155 156 /* 157 * Send a memory write request in the I2C bus 158 * 159 * @hi2c: Reference to I2C bus handle structure 160 * @dev_addr: Target device I2C address 161 * @mem_addr: Target device memory address 162 * @mem_addr_size: Byte size of internal memory address 163 * @p_data: Data to be written 164 * @size: Byte size of the data to be written 165 * @timeout_ms: Timeout value in milliseconds 166 * Return 0 on success else a negative value 167 */ 168 int stm32_i2c_mem_write(struct i2c_handle_s *hi2c, uint32_t dev_addr, 169 uint32_t mem_addr, uint32_t mem_addr_size, 170 uint8_t *p_data, size_t size, unsigned int timeout_ms); 171 172 /* 173 * Send a memory read request in the I2C bus 174 * 175 * @hi2c: Reference to I2C bus handle structure 176 * @dev_addr: Target device I2C address 177 * @mem_addr: Target device memory address 178 * @mem_addr_size: Byte size of internal memory address 179 * @p_data: Data to be read 180 * @size: Byte size of the data to be read 181 * @timeout_ms: Timeout value in milliseconds 182 * Return 0 on success else a negative value 183 */ 184 int stm32_i2c_mem_read(struct i2c_handle_s *hi2c, uint32_t dev_addr, 185 uint32_t mem_addr, uint32_t mem_addr_size, 186 uint8_t *p_data, size_t size, unsigned int timeout_ms); 187 188 /* 189 * Send a data buffer in master mode on the I2C bus 190 * 191 * @hi2c: Reference to I2C bus handle structure 192 * @dev_addr: Target device I2C address 193 * @p_data: Data to be sent 194 * @size: Byte size of the data to be sent 195 * @timeout_ms: Timeout value in milliseconds 196 * Return 0 on success else a negative value 197 */ 198 int stm32_i2c_master_transmit(struct i2c_handle_s *hi2c, uint32_t dev_addr, 199 uint8_t *p_data, size_t size, 200 unsigned int timeout_ms); 201 202 /* 203 * Receive a data buffer in master mode on the I2C bus 204 * 205 * @hi2c: Reference to I2C bus handle structure 206 * @dev_addr: Target device I2C address 207 * @p_data: Buffer for the received data 208 * @size: Byte size of the data to be received 209 * @timeout_ms: Timeout value in milliseconds 210 * Return 0 on success else a negative value 211 */ 212 int stm32_i2c_master_receive(struct i2c_handle_s *hi2c, uint32_t dev_addr, 213 uint8_t *p_data, size_t size, 214 unsigned int timeout_ms); 215 216 /* 217 * Check link with the I2C device 218 * 219 * @hi2c: Reference to I2C bus handle structure 220 * @dev_addr: Target device I2C address 221 * @trials: Number of attempts of I2C request 222 * @timeout_ms: Timeout value in milliseconds for each I2C request 223 * Return 0 on success else a negative value 224 */ 225 bool stm32_i2c_is_device_ready(struct i2c_handle_s *hi2c, uint32_t dev_addr, 226 unsigned int trials, unsigned int timeout_ms); 227 228 /* 229 * Suspend I2C bus. 230 * Bus owner is reponsible for calling stm32_i2c_suspend(). 231 * 232 * @hi2c: Reference to I2C bus handle structure 233 */ 234 void stm32_i2c_suspend(struct i2c_handle_s *hi2c); 235 236 /* 237 * Resume I2C bus. 238 * Bus owner is reponsible for calling stm32_i2c_resume(). 239 * 240 * @hi2c: Reference to I2C bus handle structure 241 */ 242 void stm32_i2c_resume(struct i2c_handle_s *hi2c); 243 244 #endif /* __STM32_I2C_H */ 245