Lines Matching refs:hi2c

308 static vaddr_t get_base(struct i2c_handle_s *hi2c)  in get_base()  argument
310 return io_pa_or_va_secure(&hi2c->base, hi2c->reg_size); in get_base()
313 static void notif_i2c_timeout(struct i2c_handle_s *hi2c) in notif_i2c_timeout() argument
315 hi2c->i2c_err |= I2C_ERROR_TIMEOUT; in notif_i2c_timeout()
316 hi2c->i2c_state = I2C_STATE_READY; in notif_i2c_timeout()
330 static void save_cfg(struct i2c_handle_s *hi2c, struct i2c_cfg *cfg) in save_cfg() argument
332 vaddr_t base = get_base(hi2c); in save_cfg()
334 clk_enable(hi2c->clock); in save_cfg()
342 clk_disable(hi2c->clock); in save_cfg()
345 static void restore_cfg(struct i2c_handle_s *hi2c, struct i2c_cfg *cfg) in restore_cfg() argument
347 vaddr_t base = get_base(hi2c); in restore_cfg()
349 clk_enable(hi2c->clock); in restore_cfg()
359 clk_disable(hi2c->clock); in restore_cfg()
371 static void __maybe_unused dump_i2c(struct i2c_handle_s *hi2c) in dump_i2c() argument
373 vaddr_t __maybe_unused base = get_base(hi2c); in dump_i2c()
375 clk_enable(hi2c->clock); in dump_i2c()
383 clk_disable(hi2c->clock); in dump_i2c()
609 static int i2c_setup_timing(struct i2c_handle_s *hi2c, in i2c_setup_timing() argument
618 clock_src = clk_get_rate(hi2c->clock); in i2c_setup_timing()
628 if (clock_src == hi2c->saved_frequency) { in i2c_setup_timing()
629 *timing = hi2c->saved_timing; in i2c_setup_timing()
659 hi2c->saved_timing = *timing; in i2c_setup_timing()
660 hi2c->saved_frequency = clock_src; in i2c_setup_timing()
670 static void i2c_config_analog_filter(struct i2c_handle_s *hi2c, in i2c_config_analog_filter() argument
673 vaddr_t base = get_base(hi2c); in i2c_config_analog_filter()
756 static void init_i2c_bus_access_lock(struct i2c_handle_s *hi2c) in init_i2c_bus_access_lock() argument
758 mutex_pm_aware_init(&hi2c->mu); in init_i2c_bus_access_lock()
759 hi2c->consumer_itr_lock = 0; in init_i2c_bus_access_lock()
767 static void lock_i2c_bus_access(struct i2c_handle_s *hi2c) in lock_i2c_bus_access() argument
785 mutex_pm_aware_lock(&hi2c->mu); in lock_i2c_bus_access()
798 hi2c->consumer_itr_masked = true; in lock_i2c_bus_access()
801 SLIST_FOREACH(itr_dep, &hi2c->consumer_itr_head, link) in lock_i2c_bus_access()
810 if (!atomic_load_int(&hi2c->consumer_itr_lock)) in lock_i2c_bus_access()
813 if (atomic_load_int(&hi2c->consumer_itr_lock)) { in lock_i2c_bus_access()
815 hi2c->base.pa); in lock_i2c_bus_access()
820 atomic_store_int(&hi2c->consumer_itr_lock, 1); in lock_i2c_bus_access()
824 static void unlock_i2c_bus_access(struct i2c_handle_s *hi2c) in unlock_i2c_bus_access() argument
829 if (hi2c->consumer_itr_masked) { in unlock_i2c_bus_access()
833 SLIST_FOREACH(itr_dep, &hi2c->consumer_itr_head, link) in unlock_i2c_bus_access()
836 hi2c->consumer_itr_masked = false; in unlock_i2c_bus_access()
840 mutex_pm_aware_unlock(&hi2c->mu); in unlock_i2c_bus_access()
843 atomic_store_int(&hi2c->consumer_itr_lock, 0); in unlock_i2c_bus_access()
847 int stm32_i2c_init(struct i2c_handle_s *hi2c, in stm32_i2c_init() argument
855 init_i2c_bus_access_lock(hi2c); in stm32_i2c_init()
857 rc = i2c_setup_timing(hi2c, init_data, &timing); in stm32_i2c_init()
861 clk_enable(hi2c->clock); in stm32_i2c_init()
863 base = get_base(hi2c); in stm32_i2c_init()
864 hi2c->i2c_state = I2C_STATE_BUSY; in stm32_i2c_init()
915 hi2c->i2c_err = I2C_ERROR_NONE; in stm32_i2c_init()
916 hi2c->i2c_state = I2C_STATE_READY; in stm32_i2c_init()
918 i2c_config_analog_filter(hi2c, init_data->analog_filter); in stm32_i2c_init()
920 clk_disable(hi2c->clock); in stm32_i2c_init()
922 if (hi2c->pinctrl && pinctrl_apply_state(hi2c->pinctrl)) in stm32_i2c_init()
929 static void i2c_flush_txdr(struct i2c_handle_s *hi2c) in i2c_flush_txdr() argument
931 vaddr_t base = get_base(hi2c); in i2c_flush_txdr()
954 static int wait_isr_event(struct i2c_handle_s *hi2c, uint32_t bit_mask, in wait_isr_event() argument
957 vaddr_t isr = get_base(hi2c) + I2C_ISR; in wait_isr_event()
969 notif_i2c_timeout(hi2c); in wait_isr_event()
974 static int i2c_ack_failed(struct i2c_handle_s *hi2c, uint64_t timeout_ref) in i2c_ack_failed() argument
976 vaddr_t base = get_base(hi2c); in i2c_ack_failed()
991 notif_i2c_timeout(hi2c); in i2c_ack_failed()
999 i2c_flush_txdr(hi2c); in i2c_ack_failed()
1003 hi2c->i2c_err |= I2C_ERROR_ACKF; in i2c_ack_failed()
1004 hi2c->i2c_state = I2C_STATE_READY; in i2c_ack_failed()
1010 static int i2c_wait_txis(struct i2c_handle_s *hi2c, uint64_t timeout_ref) in i2c_wait_txis() argument
1013 if (io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_TXIS) in i2c_wait_txis()
1015 if (i2c_ack_failed(hi2c, timeout_ref)) in i2c_wait_txis()
1019 if (io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_TXIS) in i2c_wait_txis()
1022 if (i2c_ack_failed(hi2c, timeout_ref)) in i2c_wait_txis()
1025 notif_i2c_timeout(hi2c); in i2c_wait_txis()
1030 static int i2c_wait_stop(struct i2c_handle_s *hi2c, uint64_t timeout_ref) in i2c_wait_stop() argument
1033 if (io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_STOPF) in i2c_wait_stop()
1036 if (i2c_ack_failed(hi2c, timeout_ref)) in i2c_wait_stop()
1040 if (io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_STOPF) in i2c_wait_stop()
1043 if (i2c_ack_failed(hi2c, timeout_ref)) in i2c_wait_stop()
1046 notif_i2c_timeout(hi2c); in i2c_wait_stop()
1060 static void i2c_transfer_config(struct i2c_handle_s *hi2c, uint32_t dev_addr, in i2c_transfer_config() argument
1073 io_clrsetbits32(get_base(hi2c) + I2C_CR2, clr_value, set_value); in i2c_transfer_config()
1081 static int i2c_request_mem_write(struct i2c_handle_s *hi2c, in i2c_request_mem_write() argument
1085 vaddr_t base = get_base(hi2c); in i2c_request_mem_write()
1087 i2c_transfer_config(hi2c, request->dev_addr, request->mem_addr_size, in i2c_request_mem_write()
1090 if (i2c_wait_txis(hi2c, timeout_ref)) in i2c_request_mem_write()
1100 if (i2c_wait_txis(hi2c, timeout_ref)) in i2c_request_mem_write()
1107 if (wait_isr_event(hi2c, I2C_ISR_TCR, 1, timeout_ref)) in i2c_request_mem_write()
1118 static int i2c_request_mem_read(struct i2c_handle_s *hi2c, in i2c_request_mem_read() argument
1122 vaddr_t base = get_base(hi2c); in i2c_request_mem_read()
1124 i2c_transfer_config(hi2c, request->dev_addr, request->mem_addr_size, in i2c_request_mem_read()
1127 if (i2c_wait_txis(hi2c, timeout_ref)) in i2c_request_mem_read()
1137 if (i2c_wait_txis(hi2c, timeout_ref)) in i2c_request_mem_read()
1144 if (wait_isr_event(hi2c, I2C_ISR_TC, 1, timeout_ref)) in i2c_request_mem_read()
1159 static int do_write(struct i2c_handle_s *hi2c, struct i2c_request *request, in do_write() argument
1163 vaddr_t base = get_base(hi2c); in do_write()
1175 lock_i2c_bus_access(hi2c); in do_write()
1177 if (hi2c->i2c_state != I2C_STATE_READY) { in do_write()
1178 unlock_i2c_bus_access(hi2c); in do_write()
1182 clk_enable(hi2c->clock); in do_write()
1185 if (wait_isr_event(hi2c, I2C_ISR_BUSY, 0, timeout_ref)) in do_write()
1188 hi2c->i2c_state = I2C_STATE_BUSY_TX; in do_write()
1189 hi2c->i2c_err = I2C_ERROR_NONE; in do_write()
1194 if (i2c_request_mem_write(hi2c, request, timeout_ref)) in do_write()
1199 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in do_write()
1203 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in do_write()
1210 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in do_write()
1215 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in do_write()
1222 if (i2c_wait_txis(hi2c, timeout_ref)) in do_write()
1232 if (wait_isr_event(hi2c, I2C_ISR_TCR, 1, timeout_ref)) in do_write()
1237 i2c_transfer_config(hi2c, request->dev_addr, in do_write()
1243 i2c_transfer_config(hi2c, request->dev_addr, in do_write()
1257 if (i2c_wait_stop(hi2c, timeout_ref)) in do_write()
1264 hi2c->i2c_state = I2C_STATE_READY; in do_write()
1269 clk_disable(hi2c->clock); in do_write()
1270 unlock_i2c_bus_access(hi2c); in do_write()
1275 int stm32_i2c_mem_write(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_mem_write() argument
1287 return do_write(hi2c, &request, p_data, size); in stm32_i2c_mem_write()
1290 int stm32_i2c_master_transmit(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_master_transmit() argument
1300 return do_write(hi2c, &request, p_data, size); in stm32_i2c_master_transmit()
1303 int stm32_i2c_read_write_membyte(struct i2c_handle_s *hi2c, uint16_t dev_addr, in stm32_i2c_read_write_membyte() argument
1308 uintptr_t base = get_base(hi2c); in stm32_i2c_read_write_membyte()
1313 lock_i2c_bus_access(hi2c); in stm32_i2c_read_write_membyte()
1315 if (hi2c->i2c_state != I2C_STATE_READY || !p_data) { in stm32_i2c_read_write_membyte()
1316 unlock_i2c_bus_access(hi2c); in stm32_i2c_read_write_membyte()
1320 clk_enable(hi2c->clock); in stm32_i2c_read_write_membyte()
1323 if (wait_isr_event(hi2c, I2C_ISR_BUSY, 0, timeout_ref)) in stm32_i2c_read_write_membyte()
1326 hi2c->i2c_state = write ? I2C_STATE_BUSY_TX : I2C_STATE_BUSY_RX; in stm32_i2c_read_write_membyte()
1327 hi2c->i2c_err = I2C_ERROR_NONE; in stm32_i2c_read_write_membyte()
1329 i2c_transfer_config(hi2c, dev_addr, I2C_MEMADD_SIZE_8BIT, in stm32_i2c_read_write_membyte()
1334 if (i2c_wait_txis(hi2c, timeout_ref)) in stm32_i2c_read_write_membyte()
1345 if (wait_isr_event(hi2c, event_mask, 1, timeout_ref)) in stm32_i2c_read_write_membyte()
1348 i2c_transfer_config(hi2c, dev_addr, I2C_MEMADD_SIZE_8BIT, in stm32_i2c_read_write_membyte()
1354 if (i2c_wait_txis(hi2c, timeout_ref)) in stm32_i2c_read_write_membyte()
1359 if (wait_isr_event(hi2c, I2C_ISR_RXNE, 1, timeout_ref)) in stm32_i2c_read_write_membyte()
1366 if (i2c_wait_stop(hi2c, timeout_ref)) in stm32_i2c_read_write_membyte()
1372 hi2c->i2c_state = I2C_STATE_READY; in stm32_i2c_read_write_membyte()
1377 clk_disable(hi2c->clock); in stm32_i2c_read_write_membyte()
1378 unlock_i2c_bus_access(hi2c); in stm32_i2c_read_write_membyte()
1392 static int do_read(struct i2c_handle_s *hi2c, struct i2c_request *request, in do_read() argument
1395 vaddr_t base = get_base(hi2c); in do_read()
1408 lock_i2c_bus_access(hi2c); in do_read()
1410 if (hi2c->i2c_state != I2C_STATE_READY) { in do_read()
1411 unlock_i2c_bus_access(hi2c); in do_read()
1415 clk_enable(hi2c->clock); in do_read()
1418 if (wait_isr_event(hi2c, I2C_ISR_BUSY, 0, timeout_ref)) in do_read()
1421 hi2c->i2c_state = I2C_STATE_BUSY_RX; in do_read()
1422 hi2c->i2c_err = I2C_ERROR_NONE; in do_read()
1427 if (i2c_request_mem_read(hi2c, request, timeout_ref)) in do_read()
1438 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in do_read()
1442 i2c_transfer_config(hi2c, request->dev_addr, xfer_size, in do_read()
1447 if (wait_isr_event(hi2c, I2C_ISR_RXNE, 1, in do_read()
1457 if (wait_isr_event(hi2c, I2C_ISR_TCR, 1, timeout_ref)) in do_read()
1462 i2c_transfer_config(hi2c, request->dev_addr, in do_read()
1468 i2c_transfer_config(hi2c, request->dev_addr, in do_read()
1481 if (i2c_wait_stop(hi2c, timeout_ref)) in do_read()
1485 if ((io_read32(get_base(hi2c) + I2C_ISR) & I2C_ISR_NACKF)) in do_read()
1486 io_write32(get_base(hi2c) + I2C_ICR, I2C_ICR_NACKCF); in do_read()
1492 hi2c->i2c_state = I2C_STATE_READY; in do_read()
1497 clk_disable(hi2c->clock); in do_read()
1498 unlock_i2c_bus_access(hi2c); in do_read()
1503 int stm32_i2c_mem_read(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_mem_read() argument
1515 return do_read(hi2c, &request, p_data, size); in stm32_i2c_mem_read()
1518 int stm32_i2c_master_receive(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_master_receive() argument
1528 return do_read(hi2c, &request, p_data, size); in stm32_i2c_master_receive()
1573 bool stm32_i2c_is_device_ready(struct i2c_handle_s *hi2c, uint32_t dev_addr, in stm32_i2c_is_device_ready() argument
1576 vaddr_t base = get_base(hi2c); in stm32_i2c_is_device_ready()
1580 lock_i2c_bus_access(hi2c); in stm32_i2c_is_device_ready()
1582 if (hi2c->i2c_state != I2C_STATE_READY) { in stm32_i2c_is_device_ready()
1583 unlock_i2c_bus_access(hi2c); in stm32_i2c_is_device_ready()
1587 clk_enable(hi2c->clock); in stm32_i2c_is_device_ready()
1592 hi2c->i2c_state = I2C_STATE_BUSY; in stm32_i2c_is_device_ready()
1593 hi2c->i2c_err = I2C_ERROR_NONE; in stm32_i2c_is_device_ready()
1622 notif_i2c_timeout(hi2c); in stm32_i2c_is_device_ready()
1627 if (wait_isr_event(hi2c, I2C_ISR_STOPF, 1, timeout_ref)) in stm32_i2c_is_device_ready()
1632 hi2c->i2c_state = I2C_STATE_READY; in stm32_i2c_is_device_ready()
1638 if (wait_isr_event(hi2c, I2C_ISR_STOPF, 1, timeout_ref)) in stm32_i2c_is_device_ready()
1647 if (wait_isr_event(hi2c, I2C_ISR_STOPF, 1, timeout_ref)) in stm32_i2c_is_device_ready()
1656 notif_i2c_timeout(hi2c); in stm32_i2c_is_device_ready()
1659 clk_disable(hi2c->clock); in stm32_i2c_is_device_ready()
1660 unlock_i2c_bus_access(hi2c); in stm32_i2c_is_device_ready()
1665 void stm32_i2c_interrupt_access_lockdeps(struct i2c_handle_s *hi2c, in stm32_i2c_interrupt_access_lockdeps() argument
1677 SLIST_INSERT_HEAD(&hi2c->consumer_itr_head, itr_dep, link); in stm32_i2c_interrupt_access_lockdeps()
1680 void stm32_i2c_resume(struct i2c_handle_s *hi2c) in stm32_i2c_resume() argument
1682 if (hi2c->i2c_state == I2C_STATE_READY) in stm32_i2c_resume()
1685 if ((hi2c->i2c_state != I2C_STATE_RESET) && in stm32_i2c_resume()
1686 (hi2c->i2c_state != I2C_STATE_SUSPENDED)) in stm32_i2c_resume()
1689 if (pinctrl_apply_state(hi2c->pinctrl)) in stm32_i2c_resume()
1692 if (hi2c->i2c_state == I2C_STATE_RESET) { in stm32_i2c_resume()
1697 restore_cfg(hi2c, &hi2c->sec_cfg); in stm32_i2c_resume()
1699 hi2c->i2c_state = I2C_STATE_READY; in stm32_i2c_resume()
1702 void stm32_i2c_suspend(struct i2c_handle_s *hi2c) in stm32_i2c_suspend() argument
1704 if (hi2c->i2c_state == I2C_STATE_SUSPENDED) in stm32_i2c_suspend()
1707 if (hi2c->i2c_state != I2C_STATE_READY) in stm32_i2c_suspend()
1710 save_cfg(hi2c, &hi2c->sec_cfg); in stm32_i2c_suspend()
1712 if (hi2c->pinctrl_sleep && pinctrl_apply_state(hi2c->pinctrl_sleep)) in stm32_i2c_suspend()
1715 hi2c->i2c_state = I2C_STATE_SUSPENDED; in stm32_i2c_suspend()