Lines Matching refs:hi2c

294 static vaddr_t get_base(struct i2c_handle_s *hi2c)  in get_base()  argument
296 return io_pa_or_va_secure(&hi2c->base, hi2c->reg_size); in get_base()
299 static void notif_i2c_timeout(struct i2c_handle_s *hi2c) in notif_i2c_timeout() argument
301 hi2c->i2c_err |= I2C_ERROR_TIMEOUT; in notif_i2c_timeout()
302 hi2c->i2c_state = I2C_STATE_READY; in notif_i2c_timeout()
316 static void save_cfg(struct i2c_handle_s *hi2c, struct i2c_cfg *cfg) in save_cfg() argument
318 vaddr_t base = get_base(hi2c); in save_cfg()
320 clk_enable(hi2c->clock); in save_cfg()
328 clk_disable(hi2c->clock); in save_cfg()
331 static void restore_cfg(struct i2c_handle_s *hi2c, struct i2c_cfg *cfg) in restore_cfg() argument
333 vaddr_t base = get_base(hi2c); in restore_cfg()
335 clk_enable(hi2c->clock); in restore_cfg()
345 clk_disable(hi2c->clock); in restore_cfg()
357 static void __maybe_unused dump_i2c(struct i2c_handle_s *hi2c) in dump_i2c() argument
359 vaddr_t __maybe_unused base = get_base(hi2c); in dump_i2c()
361 clk_enable(hi2c->clock); in dump_i2c()
369 clk_disable(hi2c->clock); in dump_i2c()
595 static int i2c_setup_timing(struct i2c_handle_s *hi2c, in i2c_setup_timing() argument
604 clock_src = clk_get_rate(hi2c->clock); in i2c_setup_timing()
614 if (clock_src == hi2c->saved_frequency) { in i2c_setup_timing()
615 *timing = hi2c->saved_timing; in i2c_setup_timing()
645 hi2c->saved_timing = *timing; in i2c_setup_timing()
646 hi2c->saved_frequency = clock_src; in i2c_setup_timing()
657 static int i2c_config_analog_filter(struct i2c_handle_s *hi2c, in i2c_config_analog_filter() argument
660 vaddr_t base = get_base(hi2c); in i2c_config_analog_filter()
662 if (hi2c->i2c_state != I2C_STATE_READY) in i2c_config_analog_filter()
665 hi2c->i2c_state = I2C_STATE_BUSY; in i2c_config_analog_filter()
680 hi2c->i2c_state = I2C_STATE_READY; in i2c_config_analog_filter()
759 int stm32_i2c_init(struct i2c_handle_s *hi2c, in stm32_i2c_init() argument
767 hi2c->dt_status = init_data->dt_status; in stm32_i2c_init()
768 hi2c->base.pa = init_data->pbase; in stm32_i2c_init()
769 hi2c->reg_size = init_data->reg_size; in stm32_i2c_init()
770 hi2c->clock = init_data->clock; in stm32_i2c_init()
772 rc = i2c_setup_timing(hi2c, init_data, &timing); in stm32_i2c_init()
776 clk_enable(hi2c->clock); in stm32_i2c_init()
778 base = get_base(hi2c); in stm32_i2c_init()
779 hi2c->i2c_state = I2C_STATE_BUSY; in stm32_i2c_init()
830 hi2c->i2c_err = I2C_ERROR_NONE; in stm32_i2c_init()
831 hi2c->i2c_state = I2C_STATE_READY; in stm32_i2c_init()
833 rc = i2c_config_analog_filter(hi2c, init_data->analog_filter); in stm32_i2c_init()
838 stm32_gpio_set_secure_cfg(hi2c->pinctrl->bank, in stm32_i2c_init()
839 hi2c->pinctrl->pin, true); in stm32_i2c_init()
841 clk_disable(hi2c->clock); in stm32_i2c_init()
847 static void i2c_flush_txdr(struct i2c_handle_s *hi2c) in i2c_flush_txdr() argument
849 vaddr_t base = get_base(hi2c); in i2c_flush_txdr()
872 static int wait_isr_event(struct i2c_handle_s *hi2c, uint32_t bit_mask, in wait_isr_event() argument
875 vaddr_t isr = get_base(hi2c) + I2C_ISR; in wait_isr_event()
887 notif_i2c_timeout(hi2c); in wait_isr_event()
892 static int i2c_ack_failed(struct i2c_handle_s *hi2c, uint64_t timeout_ref) in i2c_ack_failed() argument
894 vaddr_t base = get_base(hi2c); in i2c_ack_failed()
909 notif_i2c_timeout(hi2c); in i2c_ack_failed()
917 i2c_flush_txdr(hi2c); in i2c_ack_failed()
921 hi2c->i2c_err |= I2C_ERROR_ACKF; in i2c_ack_failed()
922 hi2c->i2c_state = I2C_STATE_READY; in i2c_ack_failed()
928 static int i2c_wait_txis(struct i2c_handle_s *hi2c, uint64_t timeout_ref) in i2c_wait_txis() argument
931 if (io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_TXIS) in i2c_wait_txis()
933 if (i2c_ack_failed(hi2c, timeout_ref)) in i2c_wait_txis()
937 if (io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_TXIS) in i2c_wait_txis()
940 if (i2c_ack_failed(hi2c, timeout_ref)) in i2c_wait_txis()
943 notif_i2c_timeout(hi2c); in i2c_wait_txis()
948 static int i2c_wait_stop(struct i2c_handle_s *hi2c, uint64_t timeout_ref) in i2c_wait_stop() argument
951 if (io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_STOPF) in i2c_wait_stop()
954 if (i2c_ack_failed(hi2c, timeout_ref)) in i2c_wait_stop()
958 if (io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_STOPF) in i2c_wait_stop()
961 if (i2c_ack_failed(hi2c, timeout_ref)) in i2c_wait_stop()
964 notif_i2c_timeout(hi2c); in i2c_wait_stop()
978 static void i2c_transfer_config(struct i2c_handle_s *hi2c, uint32_t dev_addr, in i2c_transfer_config() argument
991 io_clrsetbits32(get_base(hi2c) + I2C_CR2, clr_value, set_value); in i2c_transfer_config()
999 static int i2c_request_mem_write(struct i2c_handle_s *hi2c, in i2c_request_mem_write() argument
1003 vaddr_t base = get_base(hi2c); in i2c_request_mem_write()
1005 i2c_transfer_config(hi2c, request->dev_addr, request->mem_addr_size, in i2c_request_mem_write()
1008 if (i2c_wait_txis(hi2c, timeout_ref)) in i2c_request_mem_write()
1018 if (i2c_wait_txis(hi2c, timeout_ref)) in i2c_request_mem_write()
1025 if (wait_isr_event(hi2c, I2C_ISR_TCR, 1, timeout_ref)) in i2c_request_mem_write()
1036 static int i2c_request_mem_read(struct i2c_handle_s *hi2c, in i2c_request_mem_read() argument
1040 vaddr_t base = get_base(hi2c); in i2c_request_mem_read()
1042 i2c_transfer_config(hi2c, request->dev_addr, request->mem_addr_size, in i2c_request_mem_read()
1045 if (i2c_wait_txis(hi2c, timeout_ref)) in i2c_request_mem_read()
1055 if (i2c_wait_txis(hi2c, timeout_ref)) in i2c_request_mem_read()
1062 if (wait_isr_event(hi2c, I2C_ISR_TC, 1, timeout_ref)) in i2c_request_mem_read()
1077 static int i2c_write(struct i2c_handle_s *hi2c, struct i2c_request *request, in i2c_write() argument
1081 vaddr_t base = get_base(hi2c); in i2c_write()
1090 if (hi2c->i2c_state != I2C_STATE_READY) in i2c_write()
1096 clk_enable(hi2c->clock); in i2c_write()
1099 if (wait_isr_event(hi2c, I2C_ISR_BUSY, 0, timeout_ref)) in i2c_write()
1102 hi2c->i2c_state = I2C_STATE_BUSY_TX; in i2c_write()
1103 hi2c->i2c_err = I2C_ERROR_NONE; in i2c_write()
1108 if (i2c_request_mem_write(hi2c, request, timeout_ref)) in i2c_write()
1113 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in i2c_write()
1117 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in i2c_write()
1124 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in i2c_write()
1129 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in i2c_write()
1136 if (i2c_wait_txis(hi2c, timeout_ref)) in i2c_write()
1146 if (wait_isr_event(hi2c, I2C_ISR_TCR, 1, timeout_ref)) in i2c_write()
1151 i2c_transfer_config(hi2c, request->dev_addr, in i2c_write()
1157 i2c_transfer_config(hi2c, request->dev_addr, in i2c_write()
1171 if (i2c_wait_stop(hi2c, timeout_ref)) in i2c_write()
1178 hi2c->i2c_state = I2C_STATE_READY; in i2c_write()
1183 clk_disable(hi2c->clock); in i2c_write()
1188 int stm32_i2c_mem_write(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_mem_write() argument
1200 return i2c_write(hi2c, &request, p_data, size); in stm32_i2c_mem_write()
1203 int stm32_i2c_master_transmit(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_master_transmit() argument
1213 return i2c_write(hi2c, &request, p_data, size); in stm32_i2c_master_transmit()
1216 int stm32_i2c_read_write_membyte(struct i2c_handle_s *hi2c, uint16_t dev_addr, in stm32_i2c_read_write_membyte() argument
1221 uintptr_t base = get_base(hi2c); in stm32_i2c_read_write_membyte()
1226 if (hi2c->i2c_state != I2C_STATE_READY || !p_data) in stm32_i2c_read_write_membyte()
1229 clk_enable(hi2c->clock); in stm32_i2c_read_write_membyte()
1232 if (wait_isr_event(hi2c, I2C_ISR_BUSY, 0, timeout_ref)) in stm32_i2c_read_write_membyte()
1235 hi2c->i2c_state = write ? I2C_STATE_BUSY_TX : I2C_STATE_BUSY_RX; in stm32_i2c_read_write_membyte()
1236 hi2c->i2c_err = I2C_ERROR_NONE; in stm32_i2c_read_write_membyte()
1238 i2c_transfer_config(hi2c, dev_addr, I2C_MEMADD_SIZE_8BIT, in stm32_i2c_read_write_membyte()
1243 if (i2c_wait_txis(hi2c, timeout_ref)) in stm32_i2c_read_write_membyte()
1254 if (wait_isr_event(hi2c, event_mask, 1, timeout_ref)) in stm32_i2c_read_write_membyte()
1257 i2c_transfer_config(hi2c, dev_addr, I2C_MEMADD_SIZE_8BIT, in stm32_i2c_read_write_membyte()
1263 if (i2c_wait_txis(hi2c, timeout_ref)) in stm32_i2c_read_write_membyte()
1268 if (wait_isr_event(hi2c, I2C_ISR_RXNE, 1, timeout_ref)) in stm32_i2c_read_write_membyte()
1275 if (i2c_wait_stop(hi2c, timeout_ref)) in stm32_i2c_read_write_membyte()
1281 hi2c->i2c_state = I2C_STATE_READY; in stm32_i2c_read_write_membyte()
1286 clk_disable(hi2c->clock); in stm32_i2c_read_write_membyte()
1300 static int i2c_read(struct i2c_handle_s *hi2c, struct i2c_request *request, in i2c_read() argument
1303 vaddr_t base = get_base(hi2c); in i2c_read()
1313 if (hi2c->i2c_state != I2C_STATE_READY) in i2c_read()
1319 clk_enable(hi2c->clock); in i2c_read()
1322 if (wait_isr_event(hi2c, I2C_ISR_BUSY, 0, timeout_ref)) in i2c_read()
1325 hi2c->i2c_state = I2C_STATE_BUSY_RX; in i2c_read()
1326 hi2c->i2c_err = I2C_ERROR_NONE; in i2c_read()
1331 if (i2c_request_mem_read(hi2c, request, timeout_ref)) in i2c_read()
1342 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in i2c_read()
1346 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in i2c_read()
1351 if (wait_isr_event(hi2c, I2C_ISR_RXNE, 1, in i2c_read()
1361 if (wait_isr_event(hi2c, I2C_ISR_TCR, 1, timeout_ref)) in i2c_read()
1366 i2c_transfer_config(hi2c, request->dev_addr, in i2c_read()
1372 i2c_transfer_config(hi2c, request->dev_addr, in i2c_read()
1385 if (i2c_wait_stop(hi2c, timeout_ref)) in i2c_read()
1389 if ((io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_NACKF)) in i2c_read()
1390 io_write32(get_base(hi2c) + I2C_ICR, I2C_ICR_NACKCF); in i2c_read()
1396 hi2c->i2c_state = I2C_STATE_READY; in i2c_read()
1401 clk_disable(hi2c->clock); in i2c_read()
1406 int stm32_i2c_mem_read(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_mem_read() argument
1418 return i2c_read(hi2c, &request, p_data, size); in stm32_i2c_mem_read()
1421 int stm32_i2c_master_receive(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_master_receive() argument
1431 return i2c_read(hi2c, &request, p_data, size); in stm32_i2c_master_receive()
1434 bool stm32_i2c_is_device_ready(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_is_device_ready() argument
1437 vaddr_t base = get_base(hi2c); in stm32_i2c_is_device_ready()
1441 if (hi2c->i2c_state != I2C_STATE_READY) in stm32_i2c_is_device_ready()
1444 clk_enable(hi2c->clock); in stm32_i2c_is_device_ready()
1449 hi2c->i2c_state = I2C_STATE_BUSY; in stm32_i2c_is_device_ready()
1450 hi2c->i2c_err = I2C_ERROR_NONE; in stm32_i2c_is_device_ready()
1479 notif_i2c_timeout(hi2c); in stm32_i2c_is_device_ready()
1484 if (wait_isr_event(hi2c, I2C_ISR_STOPF, 1, timeout_ref)) in stm32_i2c_is_device_ready()
1489 hi2c->i2c_state = I2C_STATE_READY; in stm32_i2c_is_device_ready()
1495 if (wait_isr_event(hi2c, I2C_ISR_STOPF, 1, timeout_ref)) in stm32_i2c_is_device_ready()
1504 if (wait_isr_event(hi2c, I2C_ISR_STOPF, 1, timeout_ref)) in stm32_i2c_is_device_ready()
1513 notif_i2c_timeout(hi2c); in stm32_i2c_is_device_ready()
1516 clk_disable(hi2c->clock); in stm32_i2c_is_device_ready()
1521 void stm32_i2c_resume(struct i2c_handle_s *hi2c) in stm32_i2c_resume() argument
1523 if (hi2c->i2c_state == I2C_STATE_READY) in stm32_i2c_resume()
1526 if ((hi2c->i2c_state != I2C_STATE_RESET) && in stm32_i2c_resume()
1527 (hi2c->i2c_state != I2C_STATE_SUSPENDED)) in stm32_i2c_resume()
1530 stm32_pinctrl_load_active_cfg(hi2c->pinctrl, hi2c->pinctrl_count); in stm32_i2c_resume()
1532 if (hi2c->i2c_state == I2C_STATE_RESET) { in stm32_i2c_resume()
1537 restore_cfg(hi2c, &hi2c->sec_cfg); in stm32_i2c_resume()
1540 stm32_gpio_set_secure_cfg(hi2c->pinctrl->bank, in stm32_i2c_resume()
1541 hi2c->pinctrl->pin, true); in stm32_i2c_resume()
1543 hi2c->i2c_state = I2C_STATE_READY; in stm32_i2c_resume()
1546 void stm32_i2c_suspend(struct i2c_handle_s *hi2c) in stm32_i2c_suspend() argument
1548 if (hi2c->i2c_state == I2C_STATE_SUSPENDED) in stm32_i2c_suspend()
1551 if (hi2c->i2c_state != I2C_STATE_READY) in stm32_i2c_suspend()
1554 save_cfg(hi2c, &hi2c->sec_cfg); in stm32_i2c_suspend()
1555 stm32_pinctrl_load_standby_cfg(hi2c->pinctrl, hi2c->pinctrl_count); in stm32_i2c_suspend()
1557 hi2c->i2c_state = I2C_STATE_SUSPENDED; in stm32_i2c_suspend()