Lines Matching +full:data +full:- +full:bus
1 // SPDX-License-Identifier: GPL-2.0
30 * of the bus.
125 #define NPCM_I2CTXF_CTL 0x12 /* Tx-FIFO Control */
126 #define NPCM_I2CT_OUT 0x14 /* Bus T.O. */
127 #define NPCM_I2CPEC 0x16 /* PEC Data */
128 #define NPCM_I2CTXF_STS 0x1A /* Tx-FIFO Status */
129 #define NPCM_I2CRXF_STS 0x1C /* Rx-FIFO Status */
130 #define NPCM_I2CRXF_CTL 0x1E /* Rx-FIFO Control */
153 #define NPCM_I2CST_BER BIT(5) /* Bus error */
159 #define NPCM_I2CCST_BB BIT(1) /* Bus busy */
293 const struct npcm_i2c_data *data; member
338 static inline void npcm_i2c_select_bank(struct npcm_i2c *bus, in npcm_i2c_select_bank() argument
341 u8 i2cctl3 = ioread8(bus->reg + NPCM_I2CCTL3); in npcm_i2c_select_bank()
347 iowrite8(i2cctl3, bus->reg + NPCM_I2CCTL3); in npcm_i2c_select_bank()
350 static void npcm_i2c_init_params(struct npcm_i2c *bus) in npcm_i2c_init_params() argument
352 bus->stop_ind = I2C_NO_STATUS_IND; in npcm_i2c_init_params()
353 bus->rd_size = 0; in npcm_i2c_init_params()
354 bus->wr_size = 0; in npcm_i2c_init_params()
355 bus->rd_ind = 0; in npcm_i2c_init_params()
356 bus->wr_ind = 0; in npcm_i2c_init_params()
357 bus->read_block_use = false; in npcm_i2c_init_params()
358 bus->int_time_stamp = 0; in npcm_i2c_init_params()
359 bus->PEC_use = false; in npcm_i2c_init_params()
360 bus->PEC_mask = 0; in npcm_i2c_init_params()
362 if (bus->slave) in npcm_i2c_init_params()
363 bus->master_or_slave = I2C_SLAVE; in npcm_i2c_init_params()
367 static inline void npcm_i2c_wr_byte(struct npcm_i2c *bus, u8 data) in npcm_i2c_wr_byte() argument
369 iowrite8(data, bus->reg + NPCM_I2CSDA); in npcm_i2c_wr_byte()
372 static inline u8 npcm_i2c_rd_byte(struct npcm_i2c *bus) in npcm_i2c_rd_byte() argument
374 return ioread8(bus->reg + NPCM_I2CSDA); in npcm_i2c_rd_byte()
379 struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap); in npcm_i2c_get_SCL() local
381 return !!(I2CCTL3_SCL_LVL & ioread8(bus->reg + NPCM_I2CCTL3)); in npcm_i2c_get_SCL()
386 struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap); in npcm_i2c_get_SDA() local
388 return !!(I2CCTL3_SDA_LVL & ioread8(bus->reg + NPCM_I2CCTL3)); in npcm_i2c_get_SDA()
391 static inline u16 npcm_i2c_get_index(struct npcm_i2c *bus) in npcm_i2c_get_index() argument
393 if (bus->operation == I2C_READ_OPER) in npcm_i2c_get_index()
394 return bus->rd_ind; in npcm_i2c_get_index()
395 if (bus->operation == I2C_WRITE_OPER) in npcm_i2c_get_index()
396 return bus->wr_ind; in npcm_i2c_get_index()
401 static inline bool npcm_i2c_is_quick(struct npcm_i2c *bus) in npcm_i2c_is_quick() argument
403 return bus->wr_size == 0 && bus->rd_size == 0; in npcm_i2c_is_quick()
406 static void npcm_i2c_disable(struct npcm_i2c *bus) in npcm_i2c_disable() argument
415 iowrite8(0, bus->reg + npcm_i2caddr[i]); in npcm_i2c_disable()
419 i2cctl2 = ioread8(bus->reg + NPCM_I2CCTL2); in npcm_i2c_disable()
421 iowrite8(i2cctl2, bus->reg + NPCM_I2CCTL2); in npcm_i2c_disable()
423 bus->state = I2C_DISABLE; in npcm_i2c_disable()
426 static void npcm_i2c_enable(struct npcm_i2c *bus) in npcm_i2c_enable() argument
428 u8 i2cctl2 = ioread8(bus->reg + NPCM_I2CCTL2); in npcm_i2c_enable()
431 iowrite8(i2cctl2, bus->reg + NPCM_I2CCTL2); in npcm_i2c_enable()
432 bus->state = I2C_IDLE; in npcm_i2c_enable()
436 static inline void npcm_i2c_eob_int(struct npcm_i2c *bus, bool enable) in npcm_i2c_eob_int() argument
441 val = ioread8(bus->reg + NPCM_I2CCST3); in npcm_i2c_eob_int()
443 iowrite8(val, bus->reg + NPCM_I2CCST3); in npcm_i2c_eob_int()
445 val = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_eob_int()
451 iowrite8(val, bus->reg + NPCM_I2CCTL1); in npcm_i2c_eob_int()
454 static inline bool npcm_i2c_tx_fifo_empty(struct npcm_i2c *bus) in npcm_i2c_tx_fifo_empty() argument
458 tx_fifo_sts = ioread8(bus->reg + NPCM_I2CTXF_STS); in npcm_i2c_tx_fifo_empty()
460 if ((tx_fifo_sts & bus->data->txf_sts_tx_bytes) == 0) in npcm_i2c_tx_fifo_empty()
467 static inline bool npcm_i2c_rx_fifo_full(struct npcm_i2c *bus) in npcm_i2c_rx_fifo_full() argument
471 rx_fifo_sts = ioread8(bus->reg + NPCM_I2CRXF_STS); in npcm_i2c_rx_fifo_full()
473 if ((rx_fifo_sts & bus->data->rxf_sts_rx_bytes) == 0) in npcm_i2c_rx_fifo_full()
480 static inline void npcm_i2c_clear_fifo_int(struct npcm_i2c *bus) in npcm_i2c_clear_fifo_int() argument
484 val = ioread8(bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_clear_fifo_int()
486 iowrite8(val, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_clear_fifo_int()
489 static inline void npcm_i2c_clear_tx_fifo(struct npcm_i2c *bus) in npcm_i2c_clear_tx_fifo() argument
493 val = ioread8(bus->reg + NPCM_I2CTXF_STS); in npcm_i2c_clear_tx_fifo()
495 iowrite8(val, bus->reg + NPCM_I2CTXF_STS); in npcm_i2c_clear_tx_fifo()
498 static inline void npcm_i2c_clear_rx_fifo(struct npcm_i2c *bus) in npcm_i2c_clear_rx_fifo() argument
502 val = ioread8(bus->reg + NPCM_I2CRXF_STS); in npcm_i2c_clear_rx_fifo()
504 iowrite8(val, bus->reg + NPCM_I2CRXF_STS); in npcm_i2c_clear_rx_fifo()
507 static void npcm_i2c_int_enable(struct npcm_i2c *bus, bool enable) in npcm_i2c_int_enable() argument
511 val = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_int_enable()
517 iowrite8(val, bus->reg + NPCM_I2CCTL1); in npcm_i2c_int_enable()
520 static inline void npcm_i2c_master_start(struct npcm_i2c *bus) in npcm_i2c_master_start() argument
524 val = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_master_start()
527 iowrite8(val, bus->reg + NPCM_I2CCTL1); in npcm_i2c_master_start()
530 static inline void npcm_i2c_master_stop(struct npcm_i2c *bus) in npcm_i2c_master_stop() argument
540 val = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_master_stop()
543 iowrite8(val, bus->reg + NPCM_I2CCTL1); in npcm_i2c_master_stop()
545 if (!bus->fifo_use) in npcm_i2c_master_stop()
548 npcm_i2c_select_bank(bus, I2C_BANK_1); in npcm_i2c_master_stop()
550 if (bus->operation == I2C_READ_OPER) in npcm_i2c_master_stop()
551 npcm_i2c_clear_rx_fifo(bus); in npcm_i2c_master_stop()
553 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_master_stop()
554 npcm_i2c_clear_fifo_int(bus); in npcm_i2c_master_stop()
555 iowrite8(0, bus->reg + NPCM_I2CTXF_CTL); in npcm_i2c_master_stop()
558 static inline void npcm_i2c_stall_after_start(struct npcm_i2c *bus, bool stall) in npcm_i2c_stall_after_start() argument
562 val = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_stall_after_start()
568 iowrite8(val, bus->reg + NPCM_I2CCTL1); in npcm_i2c_stall_after_start()
571 static inline void npcm_i2c_nack(struct npcm_i2c *bus) in npcm_i2c_nack() argument
575 val = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_nack()
578 iowrite8(val, bus->reg + NPCM_I2CCTL1); in npcm_i2c_nack()
581 static inline void npcm_i2c_clear_master_status(struct npcm_i2c *bus) in npcm_i2c_clear_master_status() argument
587 iowrite8(val, bus->reg + NPCM_I2CST); in npcm_i2c_clear_master_status()
591 static void npcm_i2c_slave_int_enable(struct npcm_i2c *bus, bool enable) in npcm_i2c_slave_int_enable() argument
596 i2cctl1 = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_slave_int_enable()
602 iowrite8(i2cctl1, bus->reg + NPCM_I2CCTL1); in npcm_i2c_slave_int_enable()
605 static int npcm_i2c_slave_enable(struct npcm_i2c *bus, enum i2c_addr addr_type, in npcm_i2c_slave_enable() argument
614 i2cctl1 = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_slave_enable()
619 iowrite8(i2cctl1, bus->reg + NPCM_I2CCTL1); in npcm_i2c_slave_enable()
622 i2cctl3 = ioread8(bus->reg + NPCM_I2CCTL3); in npcm_i2c_slave_enable()
627 iowrite8(i2cctl3, bus->reg + NPCM_I2CCTL3); in npcm_i2c_slave_enable()
631 dev_err(bus->dev, "try to enable more than 2 SA not supported\n"); in npcm_i2c_slave_enable()
634 return -EFAULT; in npcm_i2c_slave_enable()
637 iowrite8(sa_reg, bus->reg + npcm_i2caddr[addr_type]); in npcm_i2c_slave_enable()
638 npcm_i2c_slave_int_enable(bus, enable); in npcm_i2c_slave_enable()
644 static void npcm_i2c_reset(struct npcm_i2c *bus) in npcm_i2c_reset() argument
655 i2cctl1 = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_reset()
657 npcm_i2c_disable(bus); in npcm_i2c_reset()
658 npcm_i2c_enable(bus); in npcm_i2c_reset()
662 iowrite8(i2cctl1, bus->reg + NPCM_I2CCTL1); in npcm_i2c_reset()
664 /* Clear BB (BUS BUSY) bit */ in npcm_i2c_reset()
665 iowrite8(NPCM_I2CCST_BB, bus->reg + NPCM_I2CCST); in npcm_i2c_reset()
666 iowrite8(0xFF, bus->reg + NPCM_I2CST); in npcm_i2c_reset()
669 npcm_i2c_eob_int(bus, false); in npcm_i2c_reset()
672 iowrite8(NPCM_I2CFIF_CTS_CLR_FIFO, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_reset()
675 if (bus->slave) { in npcm_i2c_reset()
676 addr = bus->slave->addr; in npcm_i2c_reset()
677 npcm_i2c_slave_enable(bus, I2C_SLAVE_ADDR1, addr, true); in npcm_i2c_reset()
682 npcm_i2c_clear_master_status(bus); in npcm_i2c_reset()
684 bus->state = I2C_IDLE; in npcm_i2c_reset()
687 static inline bool npcm_i2c_is_master(struct npcm_i2c *bus) in npcm_i2c_is_master() argument
689 return !!FIELD_GET(NPCM_I2CST_MASTER, ioread8(bus->reg + NPCM_I2CST)); in npcm_i2c_is_master()
692 static void npcm_i2c_callback(struct npcm_i2c *bus, in npcm_i2c_callback() argument
699 msgs = bus->msgs; in npcm_i2c_callback()
700 msgs_num = bus->msgs_num; in npcm_i2c_callback()
702 * check that transaction was not timed-out, and msgs still in npcm_i2c_callback()
708 if (completion_done(&bus->cmd_complete)) in npcm_i2c_callback()
713 bus->cmd_err = bus->msgs_num; in npcm_i2c_callback()
714 if (bus->tx_complete_cnt < ULLONG_MAX) in npcm_i2c_callback()
715 bus->tx_complete_cnt++; in npcm_i2c_callback()
719 if (bus->msgs) { in npcm_i2c_callback()
730 bus->cmd_err = -ENXIO; in npcm_i2c_callback()
734 /* Bus error */ in npcm_i2c_callback()
735 bus->cmd_err = -EAGAIN; in npcm_i2c_callback()
745 bus->operation = I2C_NO_OPER; in npcm_i2c_callback()
747 if (bus->slave) in npcm_i2c_callback()
748 bus->master_or_slave = I2C_SLAVE; in npcm_i2c_callback()
751 complete(&bus->cmd_complete); in npcm_i2c_callback()
754 static u8 npcm_i2c_fifo_usage(struct npcm_i2c *bus) in npcm_i2c_fifo_usage() argument
756 if (bus->operation == I2C_WRITE_OPER) in npcm_i2c_fifo_usage()
757 return (bus->data->txf_sts_tx_bytes & in npcm_i2c_fifo_usage()
758 ioread8(bus->reg + NPCM_I2CTXF_STS)); in npcm_i2c_fifo_usage()
759 if (bus->operation == I2C_READ_OPER) in npcm_i2c_fifo_usage()
760 return (bus->data->rxf_sts_rx_bytes & in npcm_i2c_fifo_usage()
761 ioread8(bus->reg + NPCM_I2CRXF_STS)); in npcm_i2c_fifo_usage()
765 static void npcm_i2c_write_to_fifo_master(struct npcm_i2c *bus, u16 max_bytes) in npcm_i2c_write_to_fifo_master() argument
773 size_free_fifo = bus->data->fifo_size - npcm_i2c_fifo_usage(bus); in npcm_i2c_write_to_fifo_master()
774 while (max_bytes-- && size_free_fifo) { in npcm_i2c_write_to_fifo_master()
775 if (bus->wr_ind < bus->wr_size) in npcm_i2c_write_to_fifo_master()
776 npcm_i2c_wr_byte(bus, bus->wr_buf[bus->wr_ind++]); in npcm_i2c_write_to_fifo_master()
778 npcm_i2c_wr_byte(bus, 0xFF); in npcm_i2c_write_to_fifo_master()
779 size_free_fifo = bus->data->fifo_size - npcm_i2c_fifo_usage(bus); in npcm_i2c_write_to_fifo_master()
785 * configure the FIFO before using it. If nread is -1 RX FIFO will not be
788 static void npcm_i2c_set_fifo(struct npcm_i2c *bus, int nread, int nwrite) in npcm_i2c_set_fifo() argument
792 if (!bus->fifo_use) in npcm_i2c_set_fifo()
794 npcm_i2c_select_bank(bus, I2C_BANK_1); in npcm_i2c_set_fifo()
795 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_set_fifo()
796 npcm_i2c_clear_rx_fifo(bus); in npcm_i2c_set_fifo()
800 rxf_ctl = min_t(int, nread, bus->data->fifo_size); in npcm_i2c_set_fifo()
803 if (nread <= bus->data->fifo_size) in npcm_i2c_set_fifo()
804 rxf_ctl |= bus->data->rxf_ctl_last_pec; in npcm_i2c_set_fifo()
811 if (bus->rd_ind == 0 && bus->read_block_use) { in npcm_i2c_set_fifo()
817 iowrite8(rxf_ctl, bus->reg + NPCM_I2CRXF_CTL); in npcm_i2c_set_fifo()
822 if (nwrite > bus->data->fifo_size) in npcm_i2c_set_fifo()
823 /* data to send is more then FIFO size. */ in npcm_i2c_set_fifo()
824 iowrite8(bus->data->fifo_size, bus->reg + NPCM_I2CTXF_CTL); in npcm_i2c_set_fifo()
826 iowrite8(nwrite, bus->reg + NPCM_I2CTXF_CTL); in npcm_i2c_set_fifo()
828 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_set_fifo()
832 static void npcm_i2c_read_fifo(struct npcm_i2c *bus, u8 bytes_in_fifo) in npcm_i2c_read_fifo() argument
834 u8 data; in npcm_i2c_read_fifo() local
836 while (bytes_in_fifo--) { in npcm_i2c_read_fifo()
837 data = npcm_i2c_rd_byte(bus); in npcm_i2c_read_fifo()
838 if (bus->rd_ind < bus->rd_size) in npcm_i2c_read_fifo()
839 bus->rd_buf[bus->rd_ind++] = data; in npcm_i2c_read_fifo()
843 static void npcm_i2c_master_abort(struct npcm_i2c *bus) in npcm_i2c_master_abort() argument
846 if (!npcm_i2c_is_master(bus)) in npcm_i2c_master_abort()
849 npcm_i2c_eob_int(bus, true); in npcm_i2c_master_abort()
850 npcm_i2c_master_stop(bus); in npcm_i2c_master_abort()
851 npcm_i2c_clear_master_status(bus); in npcm_i2c_master_abort()
855 static u8 npcm_i2c_get_slave_addr(struct npcm_i2c *bus, enum i2c_addr addr_type) in npcm_i2c_get_slave_addr() argument
860 dev_err(bus->dev, "get slave: try to use more than 2 SA not supported\n"); in npcm_i2c_get_slave_addr()
862 slave_add = ioread8(bus->reg + npcm_i2caddr[(int)addr_type]); in npcm_i2c_get_slave_addr()
867 static int npcm_i2c_remove_slave_addr(struct npcm_i2c *bus, u8 slave_add) in npcm_i2c_remove_slave_addr() argument
875 if (ioread8(bus->reg + npcm_i2caddr[i]) == slave_add) in npcm_i2c_remove_slave_addr()
876 iowrite8(0, bus->reg + npcm_i2caddr[i]); in npcm_i2c_remove_slave_addr()
882 static void npcm_i2c_write_fifo_slave(struct npcm_i2c *bus, u16 max_bytes) in npcm_i2c_write_fifo_slave() argument
888 npcm_i2c_clear_fifo_int(bus); in npcm_i2c_write_fifo_slave()
889 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_write_fifo_slave()
890 iowrite8(0, bus->reg + NPCM_I2CTXF_CTL); in npcm_i2c_write_fifo_slave()
891 while (max_bytes-- && bus->data->fifo_size != npcm_i2c_fifo_usage(bus)) { in npcm_i2c_write_fifo_slave()
892 if (bus->slv_wr_size <= 0) in npcm_i2c_write_fifo_slave()
894 bus->slv_wr_ind = bus->slv_wr_ind & (bus->data->fifo_size - 1); in npcm_i2c_write_fifo_slave()
895 npcm_i2c_wr_byte(bus, bus->slv_wr_buf[bus->slv_wr_ind]); in npcm_i2c_write_fifo_slave()
896 bus->slv_wr_ind++; in npcm_i2c_write_fifo_slave()
897 bus->slv_wr_ind = bus->slv_wr_ind & (bus->data->fifo_size - 1); in npcm_i2c_write_fifo_slave()
898 bus->slv_wr_size--; in npcm_i2c_write_fifo_slave()
902 static void npcm_i2c_read_fifo_slave(struct npcm_i2c *bus, u8 bytes_in_fifo) in npcm_i2c_read_fifo_slave() argument
904 u8 data; in npcm_i2c_read_fifo_slave() local
906 if (!bus->slave) in npcm_i2c_read_fifo_slave()
909 while (bytes_in_fifo--) { in npcm_i2c_read_fifo_slave()
910 data = npcm_i2c_rd_byte(bus); in npcm_i2c_read_fifo_slave()
912 bus->slv_rd_ind = bus->slv_rd_ind & (bus->data->fifo_size - 1); in npcm_i2c_read_fifo_slave()
913 bus->slv_rd_buf[bus->slv_rd_ind] = data; in npcm_i2c_read_fifo_slave()
914 bus->slv_rd_ind++; in npcm_i2c_read_fifo_slave()
917 if (bus->slv_rd_ind == 1 && bus->read_block_use) in npcm_i2c_read_fifo_slave()
918 bus->slv_rd_size = data + bus->PEC_use + 1; in npcm_i2c_read_fifo_slave()
922 static int npcm_i2c_slave_get_wr_buf(struct npcm_i2c *bus) in npcm_i2c_slave_get_wr_buf() argument
927 int ret = bus->slv_wr_ind; in npcm_i2c_slave_get_wr_buf()
930 for (i = 0; i < bus->data->fifo_size; i++) { in npcm_i2c_slave_get_wr_buf()
931 if (bus->slv_wr_size >= bus->data->fifo_size) in npcm_i2c_slave_get_wr_buf()
933 if (bus->state == I2C_SLAVE_MATCH) { in npcm_i2c_slave_get_wr_buf()
934 i2c_slave_event(bus->slave, I2C_SLAVE_READ_REQUESTED, &value); in npcm_i2c_slave_get_wr_buf()
935 bus->state = I2C_OPER_STARTED; in npcm_i2c_slave_get_wr_buf()
937 i2c_slave_event(bus->slave, I2C_SLAVE_READ_PROCESSED, &value); in npcm_i2c_slave_get_wr_buf()
939 ind = (bus->slv_wr_ind + bus->slv_wr_size) & (bus->data->fifo_size - 1); in npcm_i2c_slave_get_wr_buf()
940 bus->slv_wr_buf[ind] = value; in npcm_i2c_slave_get_wr_buf()
941 bus->slv_wr_size++; in npcm_i2c_slave_get_wr_buf()
943 return bus->data->fifo_size - ret; in npcm_i2c_slave_get_wr_buf()
946 static void npcm_i2c_slave_send_rd_buf(struct npcm_i2c *bus) in npcm_i2c_slave_send_rd_buf() argument
950 for (i = 0; i < bus->slv_rd_ind; i++) in npcm_i2c_slave_send_rd_buf()
951 i2c_slave_event(bus->slave, I2C_SLAVE_WRITE_RECEIVED, in npcm_i2c_slave_send_rd_buf()
952 &bus->slv_rd_buf[i]); in npcm_i2c_slave_send_rd_buf()
955 * got data from master (new offset in device), ignore wr fifo: in npcm_i2c_slave_send_rd_buf()
957 if (bus->slv_rd_ind) { in npcm_i2c_slave_send_rd_buf()
958 bus->slv_wr_size = 0; in npcm_i2c_slave_send_rd_buf()
959 bus->slv_wr_ind = 0; in npcm_i2c_slave_send_rd_buf()
962 bus->slv_rd_ind = 0; in npcm_i2c_slave_send_rd_buf()
963 bus->slv_rd_size = bus->adap.quirks->max_read_len; in npcm_i2c_slave_send_rd_buf()
965 npcm_i2c_clear_fifo_int(bus); in npcm_i2c_slave_send_rd_buf()
966 npcm_i2c_clear_rx_fifo(bus); in npcm_i2c_slave_send_rd_buf()
969 static void npcm_i2c_slave_receive(struct npcm_i2c *bus, u16 nread, in npcm_i2c_slave_receive() argument
972 bus->state = I2C_OPER_STARTED; in npcm_i2c_slave_receive()
973 bus->operation = I2C_READ_OPER; in npcm_i2c_slave_receive()
974 bus->slv_rd_size = nread; in npcm_i2c_slave_receive()
975 bus->slv_rd_ind = 0; in npcm_i2c_slave_receive()
977 iowrite8(0, bus->reg + NPCM_I2CTXF_CTL); in npcm_i2c_slave_receive()
978 iowrite8(bus->data->fifo_size, bus->reg + NPCM_I2CRXF_CTL); in npcm_i2c_slave_receive()
979 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_slave_receive()
980 npcm_i2c_clear_rx_fifo(bus); in npcm_i2c_slave_receive()
983 static void npcm_i2c_slave_xmit(struct npcm_i2c *bus, u16 nwrite, in npcm_i2c_slave_xmit() argument
989 bus->operation = I2C_WRITE_OPER; in npcm_i2c_slave_xmit()
992 npcm_i2c_slave_get_wr_buf(bus); in npcm_i2c_slave_xmit()
993 npcm_i2c_write_fifo_slave(bus, nwrite); in npcm_i2c_slave_xmit()
1001 * to the FIFO and onward to the bus.
1002 * NACK on read will be once reached to bus->adap->quirks->max_read_len.
1007 static void npcm_i2c_slave_wr_buf_sync(struct npcm_i2c *bus) in npcm_i2c_slave_wr_buf_sync() argument
1011 left_in_fifo = bus->data->txf_sts_tx_bytes & in npcm_i2c_slave_wr_buf_sync()
1012 ioread8(bus->reg + NPCM_I2CTXF_STS); in npcm_i2c_slave_wr_buf_sync()
1015 if (left_in_fifo >= bus->data->fifo_size || in npcm_i2c_slave_wr_buf_sync()
1016 bus->slv_wr_size >= bus->data->fifo_size) in npcm_i2c_slave_wr_buf_sync()
1020 bus->slv_wr_ind = bus->slv_wr_ind - left_in_fifo; in npcm_i2c_slave_wr_buf_sync()
1021 bus->slv_wr_size = bus->slv_wr_size + left_in_fifo; in npcm_i2c_slave_wr_buf_sync()
1023 if (bus->slv_wr_ind < 0) in npcm_i2c_slave_wr_buf_sync()
1024 bus->slv_wr_ind += bus->data->fifo_size; in npcm_i2c_slave_wr_buf_sync()
1027 static void npcm_i2c_slave_rd_wr(struct npcm_i2c *bus) in npcm_i2c_slave_rd_wr() argument
1029 if (NPCM_I2CST_XMIT & ioread8(bus->reg + NPCM_I2CST)) { in npcm_i2c_slave_rd_wr()
1032 * transmit data. Write till the master will NACK in npcm_i2c_slave_rd_wr()
1034 bus->operation = I2C_WRITE_OPER; in npcm_i2c_slave_rd_wr()
1035 npcm_i2c_slave_xmit(bus, bus->adap.quirks->max_write_len, in npcm_i2c_slave_rd_wr()
1036 bus->slv_wr_buf); in npcm_i2c_slave_rd_wr()
1040 * receive data. in npcm_i2c_slave_rd_wr()
1044 bus->operation = I2C_READ_OPER; in npcm_i2c_slave_rd_wr()
1045 npcm_i2c_read_fifo_slave(bus, npcm_i2c_fifo_usage(bus)); in npcm_i2c_slave_rd_wr()
1046 bus->stop_ind = I2C_SLAVE_RCV_IND; in npcm_i2c_slave_rd_wr()
1047 npcm_i2c_slave_send_rd_buf(bus); in npcm_i2c_slave_rd_wr()
1048 npcm_i2c_slave_receive(bus, bus->adap.quirks->max_read_len, in npcm_i2c_slave_rd_wr()
1049 bus->slv_rd_buf); in npcm_i2c_slave_rd_wr()
1053 static irqreturn_t npcm_i2c_int_slave_handler(struct npcm_i2c *bus) in npcm_i2c_int_slave_handler() argument
1057 u8 i2cst = ioread8(bus->reg + NPCM_I2CST); in npcm_i2c_int_slave_handler()
1061 bus->stop_ind = I2C_NACK_IND; in npcm_i2c_int_slave_handler()
1062 npcm_i2c_slave_wr_buf_sync(bus); in npcm_i2c_int_slave_handler()
1063 if (bus->fifo_use) in npcm_i2c_int_slave_handler()
1066 bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_int_slave_handler()
1069 bus->stop_ind = I2C_NO_STATUS_IND; in npcm_i2c_int_slave_handler()
1070 bus->operation = I2C_NO_OPER; in npcm_i2c_int_slave_handler()
1071 bus->own_slave_addr = 0xFF; in npcm_i2c_int_slave_handler()
1077 iowrite8(NPCM_I2CST_NEGACK, bus->reg + NPCM_I2CST); in npcm_i2c_int_slave_handler()
1082 /* Slave mode: a Bus Error (BER) has been identified */ in npcm_i2c_int_slave_handler()
1085 * Check whether bus arbitration or Start or Stop during data in npcm_i2c_int_slave_handler()
1086 * xfer bus arbitration problem should not result in recovery in npcm_i2c_int_slave_handler()
1088 bus->stop_ind = I2C_BUS_ERR_IND; in npcm_i2c_int_slave_handler()
1090 /* wait for bus busy before clear fifo */ in npcm_i2c_int_slave_handler()
1091 iowrite8(NPCM_I2CFIF_CTS_CLR_FIFO, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_int_slave_handler()
1093 bus->state = I2C_IDLE; in npcm_i2c_int_slave_handler()
1099 if (completion_done(&bus->cmd_complete) == false) { in npcm_i2c_int_slave_handler()
1100 bus->cmd_err = -EIO; in npcm_i2c_int_slave_handler()
1101 complete(&bus->cmd_complete); in npcm_i2c_int_slave_handler()
1103 bus->own_slave_addr = 0xFF; in npcm_i2c_int_slave_handler()
1104 iowrite8(NPCM_I2CST_BER, bus->reg + NPCM_I2CST); in npcm_i2c_int_slave_handler()
1110 u8 bytes_in_fifo = npcm_i2c_fifo_usage(bus); in npcm_i2c_int_slave_handler()
1112 bus->stop_ind = I2C_SLAVE_DONE_IND; in npcm_i2c_int_slave_handler()
1114 if (bus->operation == I2C_READ_OPER) in npcm_i2c_int_slave_handler()
1115 npcm_i2c_read_fifo_slave(bus, bytes_in_fifo); in npcm_i2c_int_slave_handler()
1118 npcm_i2c_slave_send_rd_buf(bus); in npcm_i2c_int_slave_handler()
1121 bus->stop_ind = I2C_NO_STATUS_IND; in npcm_i2c_int_slave_handler()
1128 bus->operation = I2C_NO_OPER; in npcm_i2c_int_slave_handler()
1129 bus->own_slave_addr = 0xFF; in npcm_i2c_int_slave_handler()
1130 i2c_slave_event(bus->slave, I2C_SLAVE_STOP, 0); in npcm_i2c_int_slave_handler()
1131 iowrite8(NPCM_I2CST_SLVSTP, bus->reg + NPCM_I2CST); in npcm_i2c_int_slave_handler()
1132 if (bus->fifo_use) { in npcm_i2c_int_slave_handler()
1133 npcm_i2c_clear_fifo_int(bus); in npcm_i2c_int_slave_handler()
1134 npcm_i2c_clear_rx_fifo(bus); in npcm_i2c_int_slave_handler()
1135 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_int_slave_handler()
1138 bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_int_slave_handler()
1140 bus->state = I2C_IDLE; in npcm_i2c_int_slave_handler()
1144 /* restart condition occurred and Rx-FIFO was not empty */ in npcm_i2c_int_slave_handler()
1145 if (bus->fifo_use && FIELD_GET(NPCM_I2CFIF_CTS_SLVRSTR, in npcm_i2c_int_slave_handler()
1146 ioread8(bus->reg + NPCM_I2CFIF_CTS))) { in npcm_i2c_int_slave_handler()
1147 bus->stop_ind = I2C_SLAVE_RESTART_IND; in npcm_i2c_int_slave_handler()
1148 bus->master_or_slave = I2C_SLAVE; in npcm_i2c_int_slave_handler()
1149 if (bus->operation == I2C_READ_OPER) in npcm_i2c_int_slave_handler()
1150 npcm_i2c_read_fifo_slave(bus, npcm_i2c_fifo_usage(bus)); in npcm_i2c_int_slave_handler()
1151 bus->operation = I2C_WRITE_OPER; in npcm_i2c_int_slave_handler()
1152 iowrite8(0, bus->reg + NPCM_I2CRXF_CTL); in npcm_i2c_int_slave_handler()
1155 iowrite8(val, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_int_slave_handler()
1156 npcm_i2c_slave_rd_wr(bus); in npcm_i2c_int_slave_handler()
1165 bus->master_or_slave = I2C_SLAVE; in npcm_i2c_int_slave_handler()
1166 npcm_i2c_clear_fifo_int(bus); in npcm_i2c_int_slave_handler()
1167 npcm_i2c_clear_rx_fifo(bus); in npcm_i2c_int_slave_handler()
1168 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_int_slave_handler()
1169 iowrite8(0, bus->reg + NPCM_I2CTXF_CTL); in npcm_i2c_int_slave_handler()
1170 iowrite8(bus->data->fifo_size, bus->reg + NPCM_I2CRXF_CTL); in npcm_i2c_int_slave_handler()
1172 bus->operation = I2C_WRITE_OPER; in npcm_i2c_int_slave_handler()
1174 i2c_slave_event(bus->slave, I2C_SLAVE_WRITE_REQUESTED, in npcm_i2c_int_slave_handler()
1176 bus->operation = I2C_READ_OPER; in npcm_i2c_int_slave_handler()
1178 if (bus->own_slave_addr == 0xFF) { in npcm_i2c_int_slave_handler()
1180 val = ioread8(bus->reg + NPCM_I2CCST); in npcm_i2c_int_slave_handler()
1187 i2ccst3 = ioread8(bus->reg + NPCM_I2CCST3); in npcm_i2c_int_slave_handler()
1188 i2ccst2 = ioread8(bus->reg + NPCM_I2CCST2); in npcm_i2c_int_slave_handler()
1199 addr = npcm_i2c_get_slave_addr(bus, eaddr); in npcm_i2c_int_slave_handler()
1201 bus->own_slave_addr = addr; in npcm_i2c_int_slave_handler()
1202 if (bus->PEC_mask & BIT(info)) in npcm_i2c_int_slave_handler()
1203 bus->PEC_use = true; in npcm_i2c_int_slave_handler()
1205 bus->PEC_use = false; in npcm_i2c_int_slave_handler()
1208 bus->own_slave_addr = 0; in npcm_i2c_int_slave_handler()
1210 bus->own_slave_addr = 0x61; in npcm_i2c_int_slave_handler()
1216 * 2. Start, SA, read, data, restart, SA, read, ... in npcm_i2c_int_slave_handler()
1218 * 3. Start, SA, write, data, restart, SA, read, .. in npcm_i2c_int_slave_handler()
1219 * (regular write-read mode) in npcm_i2c_int_slave_handler()
1221 if ((bus->state == I2C_OPER_STARTED && in npcm_i2c_int_slave_handler()
1222 bus->operation == I2C_READ_OPER && in npcm_i2c_int_slave_handler()
1223 bus->stop_ind == I2C_SLAVE_XMIT_IND) || in npcm_i2c_int_slave_handler()
1224 bus->stop_ind == I2C_SLAVE_RCV_IND) { in npcm_i2c_int_slave_handler()
1226 bus->stop_ind = I2C_SLAVE_RESTART_IND; in npcm_i2c_int_slave_handler()
1231 bus->stop_ind = I2C_SLAVE_XMIT_IND; in npcm_i2c_int_slave_handler()
1233 bus->stop_ind = I2C_SLAVE_RCV_IND; in npcm_i2c_int_slave_handler()
1234 bus->state = I2C_SLAVE_MATCH; in npcm_i2c_int_slave_handler()
1235 npcm_i2c_slave_rd_wr(bus); in npcm_i2c_int_slave_handler()
1236 iowrite8(NPCM_I2CST_NMATCH, bus->reg + NPCM_I2CST); in npcm_i2c_int_slave_handler()
1240 /* Slave SDA status is set - tx or rx */ in npcm_i2c_int_slave_handler()
1242 (bus->fifo_use && in npcm_i2c_int_slave_handler()
1243 (npcm_i2c_tx_fifo_empty(bus) || npcm_i2c_rx_fifo_full(bus)))) { in npcm_i2c_int_slave_handler()
1244 npcm_i2c_slave_rd_wr(bus); in npcm_i2c_int_slave_handler()
1245 iowrite8(NPCM_I2CST_SDAST, bus->reg + NPCM_I2CST); in npcm_i2c_int_slave_handler()
1254 npcm_i2c_eob_int(bus, false); in npcm_i2c_int_slave_handler()
1255 npcm_i2c_clear_master_status(bus); in npcm_i2c_int_slave_handler()
1264 struct npcm_i2c *bus = i2c_get_adapdata(client->adapter); in npcm_i2c_reg_slave() local
1266 bus->slave = client; in npcm_i2c_reg_slave()
1268 if (!bus->slave) in npcm_i2c_reg_slave()
1269 return -EINVAL; in npcm_i2c_reg_slave()
1271 if (client->flags & I2C_CLIENT_TEN) in npcm_i2c_reg_slave()
1272 return -EAFNOSUPPORT; in npcm_i2c_reg_slave()
1274 spin_lock_irqsave(&bus->lock, lock_flags); in npcm_i2c_reg_slave()
1276 npcm_i2c_init_params(bus); in npcm_i2c_reg_slave()
1277 bus->slv_rd_size = 0; in npcm_i2c_reg_slave()
1278 bus->slv_wr_size = 0; in npcm_i2c_reg_slave()
1279 bus->slv_rd_ind = 0; in npcm_i2c_reg_slave()
1280 bus->slv_wr_ind = 0; in npcm_i2c_reg_slave()
1281 if (client->flags & I2C_CLIENT_PEC) in npcm_i2c_reg_slave()
1282 bus->PEC_use = true; in npcm_i2c_reg_slave()
1284 dev_info(bus->dev, "i2c%d register slave SA=0x%x, PEC=%d\n", bus->num, in npcm_i2c_reg_slave()
1285 client->addr, bus->PEC_use); in npcm_i2c_reg_slave()
1287 npcm_i2c_slave_enable(bus, I2C_SLAVE_ADDR1, client->addr, true); in npcm_i2c_reg_slave()
1288 npcm_i2c_clear_fifo_int(bus); in npcm_i2c_reg_slave()
1289 npcm_i2c_clear_rx_fifo(bus); in npcm_i2c_reg_slave()
1290 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_reg_slave()
1291 npcm_i2c_slave_int_enable(bus, true); in npcm_i2c_reg_slave()
1293 spin_unlock_irqrestore(&bus->lock, lock_flags); in npcm_i2c_reg_slave()
1299 struct npcm_i2c *bus = client->adapter->algo_data; in npcm_i2c_unreg_slave() local
1302 spin_lock_irqsave(&bus->lock, lock_flags); in npcm_i2c_unreg_slave()
1303 if (!bus->slave) { in npcm_i2c_unreg_slave()
1304 spin_unlock_irqrestore(&bus->lock, lock_flags); in npcm_i2c_unreg_slave()
1305 return -EINVAL; in npcm_i2c_unreg_slave()
1307 npcm_i2c_slave_int_enable(bus, false); in npcm_i2c_unreg_slave()
1308 npcm_i2c_remove_slave_addr(bus, client->addr); in npcm_i2c_unreg_slave()
1309 bus->slave = NULL; in npcm_i2c_unreg_slave()
1310 spin_unlock_irqrestore(&bus->lock, lock_flags); in npcm_i2c_unreg_slave()
1315 static void npcm_i2c_master_fifo_read(struct npcm_i2c *bus) in npcm_i2c_master_fifo_read() argument
1321 fifo_bytes = npcm_i2c_fifo_usage(bus); in npcm_i2c_master_fifo_read()
1322 rcount = bus->rd_size - bus->rd_ind; in npcm_i2c_master_fifo_read()
1327 * we read the data in the following way. If the number of bytes to in npcm_i2c_master_fifo_read()
1329 * and in the next int we read rest of the data. in npcm_i2c_master_fifo_read()
1331 if (rcount < (2 * bus->data->fifo_size) && rcount > bus->data->fifo_size) in npcm_i2c_master_fifo_read()
1332 fifo_bytes = rcount - bus->data->fifo_size; in npcm_i2c_master_fifo_read()
1335 /* last bytes are about to be read - end of tx */ in npcm_i2c_master_fifo_read()
1336 bus->state = I2C_STOP_PENDING; in npcm_i2c_master_fifo_read()
1337 bus->stop_ind = ind; in npcm_i2c_master_fifo_read()
1338 npcm_i2c_eob_int(bus, true); in npcm_i2c_master_fifo_read()
1340 npcm_i2c_master_stop(bus); in npcm_i2c_master_fifo_read()
1341 npcm_i2c_read_fifo(bus, fifo_bytes); in npcm_i2c_master_fifo_read()
1343 npcm_i2c_read_fifo(bus, fifo_bytes); in npcm_i2c_master_fifo_read()
1344 rcount = bus->rd_size - bus->rd_ind; in npcm_i2c_master_fifo_read()
1345 npcm_i2c_set_fifo(bus, rcount, -1); in npcm_i2c_master_fifo_read()
1349 static void npcm_i2c_irq_master_handler_write(struct npcm_i2c *bus) in npcm_i2c_irq_master_handler_write() argument
1353 if (bus->fifo_use) in npcm_i2c_irq_master_handler_write()
1354 npcm_i2c_clear_tx_fifo(bus); /* clear the TX fifo status bit */ in npcm_i2c_irq_master_handler_write()
1356 /* Master write operation - last byte handling */ in npcm_i2c_irq_master_handler_write()
1357 if (bus->wr_ind == bus->wr_size) { in npcm_i2c_irq_master_handler_write()
1358 if (bus->fifo_use && npcm_i2c_fifo_usage(bus) > 0) in npcm_i2c_irq_master_handler_write()
1368 if (bus->rd_size == 0) { in npcm_i2c_irq_master_handler_write()
1370 npcm_i2c_eob_int(bus, true); in npcm_i2c_irq_master_handler_write()
1371 bus->state = I2C_STOP_PENDING; in npcm_i2c_irq_master_handler_write()
1372 bus->stop_ind = I2C_MASTER_DONE_IND; in npcm_i2c_irq_master_handler_write()
1373 npcm_i2c_master_stop(bus); in npcm_i2c_irq_master_handler_write()
1375 npcm_i2c_wr_byte(bus, 0xFF); in npcm_i2c_irq_master_handler_write()
1378 /* last write-byte written on previous int - restart */ in npcm_i2c_irq_master_handler_write()
1379 npcm_i2c_set_fifo(bus, bus->rd_size, -1); in npcm_i2c_irq_master_handler_write()
1381 npcm_i2c_master_start(bus); in npcm_i2c_irq_master_handler_write()
1384 * Receiving one byte only - stall after successful in npcm_i2c_irq_master_handler_write()
1387 * unintentionally NACK the next multi-byte read. in npcm_i2c_irq_master_handler_write()
1389 if (bus->rd_size == 1) in npcm_i2c_irq_master_handler_write()
1390 npcm_i2c_stall_after_start(bus, true); in npcm_i2c_irq_master_handler_write()
1393 bus->operation = I2C_READ_OPER; in npcm_i2c_irq_master_handler_write()
1395 npcm_i2c_wr_byte(bus, bus->dest_addr | 0x1); in npcm_i2c_irq_master_handler_write()
1399 if (!bus->fifo_use || bus->wr_size == 1) { in npcm_i2c_irq_master_handler_write()
1400 npcm_i2c_wr_byte(bus, bus->wr_buf[bus->wr_ind++]); in npcm_i2c_irq_master_handler_write()
1402 wcount = bus->wr_size - bus->wr_ind; in npcm_i2c_irq_master_handler_write()
1403 npcm_i2c_set_fifo(bus, -1, wcount); in npcm_i2c_irq_master_handler_write()
1405 npcm_i2c_write_to_fifo_master(bus, wcount); in npcm_i2c_irq_master_handler_write()
1410 static void npcm_i2c_irq_master_handler_read(struct npcm_i2c *bus) in npcm_i2c_irq_master_handler_read() argument
1413 u8 data; in npcm_i2c_irq_master_handler_read() local
1416 block_extra_bytes_size = bus->read_block_use + bus->PEC_use; in npcm_i2c_irq_master_handler_read()
1422 if (bus->rd_ind == 0) { /* first byte handling: */ in npcm_i2c_irq_master_handler_read()
1423 if (bus->read_block_use) { in npcm_i2c_irq_master_handler_read()
1425 data = npcm_i2c_rd_byte(bus); in npcm_i2c_irq_master_handler_read()
1426 data = clamp_val(data, 1, I2C_SMBUS_BLOCK_MAX); in npcm_i2c_irq_master_handler_read()
1427 bus->rd_size = data + block_extra_bytes_size; in npcm_i2c_irq_master_handler_read()
1428 bus->rd_buf[bus->rd_ind++] = data; in npcm_i2c_irq_master_handler_read()
1431 if (bus->fifo_use) { in npcm_i2c_irq_master_handler_read()
1432 data = ioread8(bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_irq_master_handler_read()
1433 data = data | NPCM_I2CFIF_CTS_RXF_TXE; in npcm_i2c_irq_master_handler_read()
1434 iowrite8(data, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_irq_master_handler_read()
1437 npcm_i2c_set_fifo(bus, bus->rd_size - 1, -1); in npcm_i2c_irq_master_handler_read()
1438 npcm_i2c_stall_after_start(bus, false); in npcm_i2c_irq_master_handler_read()
1440 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_irq_master_handler_read()
1441 npcm_i2c_master_fifo_read(bus); in npcm_i2c_irq_master_handler_read()
1444 if (bus->rd_size == block_extra_bytes_size && in npcm_i2c_irq_master_handler_read()
1445 bus->read_block_use) { in npcm_i2c_irq_master_handler_read()
1446 bus->state = I2C_STOP_PENDING; in npcm_i2c_irq_master_handler_read()
1447 bus->stop_ind = I2C_BLOCK_BYTES_ERR_IND; in npcm_i2c_irq_master_handler_read()
1448 bus->cmd_err = -EIO; in npcm_i2c_irq_master_handler_read()
1449 npcm_i2c_eob_int(bus, true); in npcm_i2c_irq_master_handler_read()
1450 npcm_i2c_master_stop(bus); in npcm_i2c_irq_master_handler_read()
1451 npcm_i2c_read_fifo(bus, npcm_i2c_fifo_usage(bus)); in npcm_i2c_irq_master_handler_read()
1453 npcm_i2c_master_fifo_read(bus); in npcm_i2c_irq_master_handler_read()
1458 static void npcm_i2c_irq_handle_nmatch(struct npcm_i2c *bus) in npcm_i2c_irq_handle_nmatch() argument
1460 iowrite8(NPCM_I2CST_NMATCH, bus->reg + NPCM_I2CST); in npcm_i2c_irq_handle_nmatch()
1461 npcm_i2c_nack(bus); in npcm_i2c_irq_handle_nmatch()
1462 bus->stop_ind = I2C_BUS_ERR_IND; in npcm_i2c_irq_handle_nmatch()
1463 npcm_i2c_callback(bus, bus->stop_ind, npcm_i2c_get_index(bus)); in npcm_i2c_irq_handle_nmatch()
1467 static void npcm_i2c_irq_handle_nack(struct npcm_i2c *bus) in npcm_i2c_irq_handle_nack() argument
1471 if (bus->nack_cnt < ULLONG_MAX) in npcm_i2c_irq_handle_nack()
1472 bus->nack_cnt++; in npcm_i2c_irq_handle_nack()
1474 if (bus->fifo_use) { in npcm_i2c_irq_handle_nack()
1479 if (bus->operation == I2C_WRITE_OPER) in npcm_i2c_irq_handle_nack()
1480 bus->wr_ind -= npcm_i2c_fifo_usage(bus); in npcm_i2c_irq_handle_nack()
1483 iowrite8(NPCM_I2CFIF_CTS_CLR_FIFO, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_irq_handle_nack()
1487 bus->stop_ind = I2C_NACK_IND; in npcm_i2c_irq_handle_nack()
1489 if (npcm_i2c_is_master(bus)) { in npcm_i2c_irq_handle_nack()
1491 npcm_i2c_eob_int(bus, false); in npcm_i2c_irq_handle_nack()
1492 npcm_i2c_master_stop(bus); in npcm_i2c_irq_handle_nack()
1495 npcm_i2c_rd_byte(bus); in npcm_i2c_irq_handle_nack()
1498 * The bus is released from stall only after the SW clears in npcm_i2c_irq_handle_nack()
1501 npcm_i2c_clear_master_status(bus); in npcm_i2c_irq_handle_nack()
1502 readx_poll_timeout_atomic(ioread8, bus->reg + NPCM_I2CCST, val, in npcm_i2c_irq_handle_nack()
1504 /* Verify no status bits are still set after bus is released */ in npcm_i2c_irq_handle_nack()
1505 npcm_i2c_clear_master_status(bus); in npcm_i2c_irq_handle_nack()
1507 bus->state = I2C_IDLE; in npcm_i2c_irq_handle_nack()
1511 * In such case, the bus is released from stall only after the in npcm_i2c_irq_handle_nack()
1514 npcm_i2c_callback(bus, bus->stop_ind, bus->wr_ind); in npcm_i2c_irq_handle_nack()
1517 /* Master mode: a Bus Error has been identified */
1518 static void npcm_i2c_irq_handle_ber(struct npcm_i2c *bus) in npcm_i2c_irq_handle_ber() argument
1520 if (bus->ber_cnt < ULLONG_MAX) in npcm_i2c_irq_handle_ber()
1521 bus->ber_cnt++; in npcm_i2c_irq_handle_ber()
1522 bus->stop_ind = I2C_BUS_ERR_IND; in npcm_i2c_irq_handle_ber()
1523 if (npcm_i2c_is_master(bus)) { in npcm_i2c_irq_handle_ber()
1524 npcm_i2c_master_abort(bus); in npcm_i2c_irq_handle_ber()
1526 npcm_i2c_clear_master_status(bus); in npcm_i2c_irq_handle_ber()
1528 /* Clear BB (BUS BUSY) bit */ in npcm_i2c_irq_handle_ber()
1529 iowrite8(NPCM_I2CCST_BB, bus->reg + NPCM_I2CCST); in npcm_i2c_irq_handle_ber()
1531 bus->cmd_err = -EAGAIN; in npcm_i2c_irq_handle_ber()
1532 npcm_i2c_callback(bus, bus->stop_ind, npcm_i2c_get_index(bus)); in npcm_i2c_irq_handle_ber()
1534 bus->state = I2C_IDLE; in npcm_i2c_irq_handle_ber()
1538 static void npcm_i2c_irq_handle_eob(struct npcm_i2c *bus) in npcm_i2c_irq_handle_eob() argument
1540 npcm_i2c_eob_int(bus, false); in npcm_i2c_irq_handle_eob()
1541 bus->state = I2C_IDLE; in npcm_i2c_irq_handle_eob()
1542 npcm_i2c_callback(bus, bus->stop_ind, bus->rd_ind); in npcm_i2c_irq_handle_eob()
1546 static void npcm_i2c_irq_handle_stall_after_start(struct npcm_i2c *bus) in npcm_i2c_irq_handle_stall_after_start() argument
1548 if (npcm_i2c_is_quick(bus)) { in npcm_i2c_irq_handle_stall_after_start()
1549 bus->state = I2C_STOP_PENDING; in npcm_i2c_irq_handle_stall_after_start()
1550 bus->stop_ind = I2C_MASTER_DONE_IND; in npcm_i2c_irq_handle_stall_after_start()
1551 npcm_i2c_eob_int(bus, true); in npcm_i2c_irq_handle_stall_after_start()
1552 npcm_i2c_master_stop(bus); in npcm_i2c_irq_handle_stall_after_start()
1553 } else if ((bus->rd_size == 1) && !bus->read_block_use) { in npcm_i2c_irq_handle_stall_after_start()
1555 * Receiving one byte only - set NACK after ensuring in npcm_i2c_irq_handle_stall_after_start()
1558 npcm_i2c_nack(bus); in npcm_i2c_irq_handle_stall_after_start()
1561 /* Reset stall-after-address-byte */ in npcm_i2c_irq_handle_stall_after_start()
1562 npcm_i2c_stall_after_start(bus, false); in npcm_i2c_irq_handle_stall_after_start()
1565 iowrite8(NPCM_I2CST_STASTR, bus->reg + NPCM_I2CST); in npcm_i2c_irq_handle_stall_after_start()
1568 /* SDA status is set - TX or RX, master */
1569 static void npcm_i2c_irq_handle_sda(struct npcm_i2c *bus, u8 i2cst) in npcm_i2c_irq_handle_sda() argument
1573 if (!npcm_i2c_is_master(bus)) in npcm_i2c_irq_handle_sda()
1576 if (bus->state == I2C_IDLE) { in npcm_i2c_irq_handle_sda()
1577 bus->stop_ind = I2C_WAKE_UP_IND; in npcm_i2c_irq_handle_sda()
1579 if (npcm_i2c_is_quick(bus) || bus->read_block_use) in npcm_i2c_irq_handle_sda()
1584 npcm_i2c_stall_after_start(bus, true); in npcm_i2c_irq_handle_sda()
1586 npcm_i2c_stall_after_start(bus, false); in npcm_i2c_irq_handle_sda()
1589 * Receiving one byte only - stall after successful completion in npcm_i2c_irq_handle_sda()
1592 * multi-byte read in npcm_i2c_irq_handle_sda()
1594 if (bus->wr_size == 0 && bus->rd_size == 1) in npcm_i2c_irq_handle_sda()
1595 npcm_i2c_stall_after_start(bus, true); in npcm_i2c_irq_handle_sda()
1600 npcm_i2c_select_bank(bus, I2C_BANK_1); in npcm_i2c_irq_handle_sda()
1602 fif_cts = ioread8(bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_irq_handle_sda()
1607 iowrite8(fif_cts, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_irq_handle_sda()
1609 /* re-enable */ in npcm_i2c_irq_handle_sda()
1611 iowrite8(fif_cts, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_irq_handle_sda()
1620 if (bus->wr_size) in npcm_i2c_irq_handle_sda()
1621 npcm_i2c_set_fifo(bus, -1, bus->wr_size); in npcm_i2c_irq_handle_sda()
1623 npcm_i2c_set_fifo(bus, bus->rd_size, -1); in npcm_i2c_irq_handle_sda()
1625 bus->state = I2C_OPER_STARTED; in npcm_i2c_irq_handle_sda()
1627 if (npcm_i2c_is_quick(bus) || bus->wr_size) in npcm_i2c_irq_handle_sda()
1628 npcm_i2c_wr_byte(bus, bus->dest_addr); in npcm_i2c_irq_handle_sda()
1630 npcm_i2c_wr_byte(bus, bus->dest_addr | BIT(0)); in npcm_i2c_irq_handle_sda()
1634 bus->operation = I2C_WRITE_OPER; in npcm_i2c_irq_handle_sda()
1635 npcm_i2c_irq_master_handler_write(bus); in npcm_i2c_irq_handle_sda()
1637 bus->operation = I2C_READ_OPER; in npcm_i2c_irq_handle_sda()
1638 npcm_i2c_irq_master_handler_read(bus); in npcm_i2c_irq_handle_sda()
1643 static int npcm_i2c_int_master_handler(struct npcm_i2c *bus) in npcm_i2c_int_master_handler() argument
1646 int ret = -EIO; in npcm_i2c_int_master_handler()
1648 i2cst = ioread8(bus->reg + NPCM_I2CST); in npcm_i2c_int_master_handler()
1651 npcm_i2c_irq_handle_nmatch(bus); in npcm_i2c_int_master_handler()
1656 npcm_i2c_irq_handle_nack(bus); in npcm_i2c_int_master_handler()
1660 /* Master mode: a Bus Error has been identified */ in npcm_i2c_int_master_handler()
1662 npcm_i2c_irq_handle_ber(bus); in npcm_i2c_int_master_handler()
1668 ioread8(bus->reg + NPCM_I2CCTL1)) == 1) && in npcm_i2c_int_master_handler()
1670 ioread8(bus->reg + NPCM_I2CCST3)))) { in npcm_i2c_int_master_handler()
1671 npcm_i2c_irq_handle_eob(bus); in npcm_i2c_int_master_handler()
1677 npcm_i2c_irq_handle_stall_after_start(bus); in npcm_i2c_int_master_handler()
1681 /* SDA status is set - TX or RX, master */ in npcm_i2c_int_master_handler()
1683 (bus->fifo_use && in npcm_i2c_int_master_handler()
1684 (npcm_i2c_tx_fifo_empty(bus) || npcm_i2c_rx_fifo_full(bus)))) { in npcm_i2c_int_master_handler()
1685 npcm_i2c_irq_handle_sda(bus, i2cst); in npcm_i2c_int_master_handler()
1698 int status = -ENOTRECOVERABLE; in npcm_i2c_recovery_tgclk()
1699 struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap); in npcm_i2c_recovery_tgclk() local
1704 dev_dbg(bus->dev, "bus%d-0x%x recovery skipped, bus not stuck", in npcm_i2c_recovery_tgclk()
1705 bus->num, bus->dest_addr); in npcm_i2c_recovery_tgclk()
1706 npcm_i2c_reset(bus); in npcm_i2c_recovery_tgclk()
1710 npcm_i2c_int_enable(bus, false); in npcm_i2c_recovery_tgclk()
1711 npcm_i2c_disable(bus); in npcm_i2c_recovery_tgclk()
1712 npcm_i2c_enable(bus); in npcm_i2c_recovery_tgclk()
1713 iowrite8(NPCM_I2CCST_BB, bus->reg + NPCM_I2CCST); in npcm_i2c_recovery_tgclk()
1714 npcm_i2c_clear_tx_fifo(bus); in npcm_i2c_recovery_tgclk()
1715 npcm_i2c_clear_rx_fifo(bus); in npcm_i2c_recovery_tgclk()
1716 iowrite8(0, bus->reg + NPCM_I2CRXF_CTL); in npcm_i2c_recovery_tgclk()
1717 iowrite8(0, bus->reg + NPCM_I2CTXF_CTL); in npcm_i2c_recovery_tgclk()
1718 npcm_i2c_stall_after_start(bus, false); in npcm_i2c_recovery_tgclk()
1721 npcm_i2c_select_bank(bus, I2C_BANK_1); in npcm_i2c_recovery_tgclk()
1724 fif_cts = ioread8(bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_recovery_tgclk()
1727 iowrite8(fif_cts, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_recovery_tgclk()
1728 npcm_i2c_set_fifo(bus, -1, 0); in npcm_i2c_recovery_tgclk()
1733 iowrite8(NPCM_I2CCST_TGSCL, bus->reg + NPCM_I2CCST); in npcm_i2c_recovery_tgclk()
1740 } while (!done && iter--); in npcm_i2c_recovery_tgclk()
1742 /* If SDA line is released: send start-addr-stop, to re-sync. */ in npcm_i2c_recovery_tgclk()
1745 npcm_i2c_wr_byte(bus, bus->dest_addr); in npcm_i2c_recovery_tgclk()
1746 npcm_i2c_master_start(bus); in npcm_i2c_recovery_tgclk()
1751 if (npcm_i2c_is_master(bus) > 0) { in npcm_i2c_recovery_tgclk()
1753 npcm_i2c_master_stop(bus); in npcm_i2c_recovery_tgclk()
1757 npcm_i2c_reset(bus); in npcm_i2c_recovery_tgclk()
1758 npcm_i2c_int_enable(bus, true); in npcm_i2c_recovery_tgclk()
1763 status = -ENOTRECOVERABLE; in npcm_i2c_recovery_tgclk()
1765 if (bus->rec_fail_cnt < ULLONG_MAX) in npcm_i2c_recovery_tgclk()
1766 bus->rec_fail_cnt++; in npcm_i2c_recovery_tgclk()
1768 if (bus->rec_succ_cnt < ULLONG_MAX) in npcm_i2c_recovery_tgclk()
1769 bus->rec_succ_cnt++; in npcm_i2c_recovery_tgclk()
1777 struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap); in npcm_i2c_recovery_init() local
1778 struct i2c_bus_recovery_info *rinfo = &bus->rinfo; in npcm_i2c_recovery_init()
1780 rinfo->recover_bus = npcm_i2c_recovery_tgclk; in npcm_i2c_recovery_init()
1788 rinfo->get_scl = npcm_i2c_get_SCL; in npcm_i2c_recovery_init()
1789 rinfo->get_sda = npcm_i2c_get_SDA; in npcm_i2c_recovery_init()
1790 _adap->bus_recovery_info = rinfo; in npcm_i2c_recovery_init()
1801 * and bus frequency.
1802 * 100kHz bus requires tSCL = 4 * SCLFRQ * tCLK. LT and HT are symmetric.
1803 * 400kHz bus requires asymmetric HT and LT. A different equation is recommended
1807 static int npcm_i2c_init_clk(struct npcm_i2c *bus, u32 bus_freq_hz) in npcm_i2c_init_clk() argument
1818 src_clk_khz = bus->apb_clk / 1000; in npcm_i2c_init_clk()
1820 bus->bus_freq = bus_freq_hz; in npcm_i2c_init_clk()
1827 return -EDOM; in npcm_i2c_init_clk()
1844 return -EDOM; in npcm_i2c_init_clk()
1868 return -EDOM; in npcm_i2c_init_clk()
1877 * SDA hold time: (HLDT-7) * T(CLK) >= 120 in npcm_i2c_init_clk()
1889 return -EINVAL; in npcm_i2c_init_clk()
1896 return -EDOM; in npcm_i2c_init_clk()
1901 bus->reg + NPCM_I2CCTL2); in npcm_i2c_init_clk()
1905 bus->reg + NPCM_I2CCTL3); in npcm_i2c_init_clk()
1908 npcm_i2c_select_bank(bus, I2C_BANK_0); in npcm_i2c_init_clk()
1913 * k1 = 2 * SCLLT7-0 -> Low Time = k1 / 2 in npcm_i2c_init_clk()
1914 * k2 = 2 * SCLLT7-0 -> High Time = k2 / 2 in npcm_i2c_init_clk()
1916 iowrite8(k1 / 2, bus->reg + NPCM_I2CSCLLT); in npcm_i2c_init_clk()
1917 iowrite8(k2 / 2, bus->reg + NPCM_I2CSCLHT); in npcm_i2c_init_clk()
1919 iowrite8(dbnct, bus->reg + NPCM_I2CCTL5); in npcm_i2c_init_clk()
1922 iowrite8(hldt, bus->reg + NPCM_I2CCTL4); in npcm_i2c_init_clk()
1925 npcm_i2c_select_bank(bus, I2C_BANK_1); in npcm_i2c_init_clk()
1930 static int npcm_i2c_init_module(struct npcm_i2c *bus, enum i2c_mode mode, in npcm_i2c_init_module() argument
1937 if ((bus->state != I2C_DISABLE && bus->state != I2C_IDLE) || in npcm_i2c_init_module()
1939 return -EINVAL; in npcm_i2c_init_module()
1941 npcm_i2c_int_enable(bus, false); in npcm_i2c_init_module()
1942 npcm_i2c_disable(bus); in npcm_i2c_init_module()
1945 if (FIELD_GET(I2C_VER_FIFO_EN, ioread8(bus->reg + I2C_VER))) { in npcm_i2c_init_module()
1946 bus->fifo_use = true; in npcm_i2c_init_module()
1947 npcm_i2c_select_bank(bus, I2C_BANK_0); in npcm_i2c_init_module()
1948 val = ioread8(bus->reg + NPCM_I2CFIF_CTL); in npcm_i2c_init_module()
1950 iowrite8(val, bus->reg + NPCM_I2CFIF_CTL); in npcm_i2c_init_module()
1951 npcm_i2c_select_bank(bus, I2C_BANK_1); in npcm_i2c_init_module()
1953 bus->fifo_use = false; in npcm_i2c_init_module()
1957 ret = npcm_i2c_init_clk(bus, bus_freq_hz); in npcm_i2c_init_module()
1959 dev_err(bus->dev, "npcm_i2c_init_clk failed\n"); in npcm_i2c_init_module()
1964 npcm_i2c_enable(bus); in npcm_i2c_init_module()
1965 bus->state = I2C_IDLE; in npcm_i2c_init_module()
1966 val = ioread8(bus->reg + NPCM_I2CCTL1); in npcm_i2c_init_module()
1968 iowrite8(val, bus->reg + NPCM_I2CCTL1); in npcm_i2c_init_module()
1970 npcm_i2c_reset(bus); in npcm_i2c_init_module()
1973 if ((npcm_i2c_get_SDA(&bus->adap) == 0) || (npcm_i2c_get_SCL(&bus->adap) == 0)) { in npcm_i2c_init_module()
1974 dev_warn(bus->dev, " I2C%d SDA=%d SCL=%d, attempting to recover\n", bus->num, in npcm_i2c_init_module()
1975 npcm_i2c_get_SDA(&bus->adap), npcm_i2c_get_SCL(&bus->adap)); in npcm_i2c_init_module()
1976 if (npcm_i2c_recovery_tgclk(&bus->adap)) { in npcm_i2c_init_module()
1977 dev_err(bus->dev, "I2C%d init fail: SDA=%d SCL=%d\n", in npcm_i2c_init_module()
1978 bus->num, npcm_i2c_get_SDA(&bus->adap), in npcm_i2c_init_module()
1979 npcm_i2c_get_SCL(&bus->adap)); in npcm_i2c_init_module()
1980 return -ENXIO; in npcm_i2c_init_module()
1984 npcm_i2c_int_enable(bus, true); in npcm_i2c_init_module()
1988 static int __npcm_i2c_init(struct npcm_i2c *bus, struct platform_device *pdev) in __npcm_i2c_init() argument
1993 /* Initialize the internal data structures */ in __npcm_i2c_init()
1994 bus->state = I2C_DISABLE; in __npcm_i2c_init()
1995 bus->master_or_slave = I2C_SLAVE; in __npcm_i2c_init()
1996 bus->int_time_stamp = 0; in __npcm_i2c_init()
1998 bus->slave = NULL; in __npcm_i2c_init()
2001 ret = device_property_read_u32(&pdev->dev, "clock-frequency", in __npcm_i2c_init()
2004 dev_info(&pdev->dev, "Could not read clock-frequency property"); in __npcm_i2c_init()
2008 ret = npcm_i2c_init_module(bus, I2C_MASTER, clk_freq_hz); in __npcm_i2c_init()
2010 dev_err(&pdev->dev, "npcm_i2c_init_module failed\n"); in __npcm_i2c_init()
2019 struct npcm_i2c *bus = dev_id; in npcm_i2c_bus_irq() local
2021 if (npcm_i2c_is_master(bus)) in npcm_i2c_bus_irq()
2022 bus->master_or_slave = I2C_MASTER; in npcm_i2c_bus_irq()
2024 if (bus->master_or_slave == I2C_MASTER) { in npcm_i2c_bus_irq()
2025 bus->int_time_stamp = jiffies; in npcm_i2c_bus_irq()
2026 if (!npcm_i2c_int_master_handler(bus)) in npcm_i2c_bus_irq()
2030 if (bus->slave) { in npcm_i2c_bus_irq()
2031 bus->master_or_slave = I2C_SLAVE; in npcm_i2c_bus_irq()
2032 if (npcm_i2c_int_slave_handler(bus)) in npcm_i2c_bus_irq()
2037 npcm_i2c_clear_master_status(bus); in npcm_i2c_bus_irq()
2042 static bool npcm_i2c_master_start_xmit(struct npcm_i2c *bus, in npcm_i2c_master_start_xmit() argument
2047 if (bus->state != I2C_IDLE) { in npcm_i2c_master_start_xmit()
2048 bus->cmd_err = -EBUSY; in npcm_i2c_master_start_xmit()
2051 bus->dest_addr = slave_addr << 1; in npcm_i2c_master_start_xmit()
2052 bus->wr_buf = write_data; in npcm_i2c_master_start_xmit()
2053 bus->wr_size = nwrite; in npcm_i2c_master_start_xmit()
2054 bus->wr_ind = 0; in npcm_i2c_master_start_xmit()
2055 bus->rd_buf = read_data; in npcm_i2c_master_start_xmit()
2056 bus->rd_size = nread; in npcm_i2c_master_start_xmit()
2057 bus->rd_ind = 0; in npcm_i2c_master_start_xmit()
2058 bus->PEC_use = 0; in npcm_i2c_master_start_xmit()
2062 bus->PEC_use = use_PEC; in npcm_i2c_master_start_xmit()
2064 bus->read_block_use = use_read_block; in npcm_i2c_master_start_xmit()
2066 bus->operation = I2C_READ_OPER; in npcm_i2c_master_start_xmit()
2068 bus->operation = I2C_WRITE_OPER; in npcm_i2c_master_start_xmit()
2069 if (bus->fifo_use) { in npcm_i2c_master_start_xmit()
2072 npcm_i2c_select_bank(bus, I2C_BANK_1); in npcm_i2c_master_start_xmit()
2074 i2cfif_cts = ioread8(bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_master_start_xmit()
2077 iowrite8(i2cfif_cts, bus->reg + NPCM_I2CFIF_CTS); in npcm_i2c_master_start_xmit()
2080 bus->state = I2C_IDLE; in npcm_i2c_master_start_xmit()
2081 npcm_i2c_stall_after_start(bus, true); in npcm_i2c_master_start_xmit()
2082 npcm_i2c_master_start(bus); in npcm_i2c_master_start_xmit()
2089 struct npcm_i2c *bus = container_of(adap, struct npcm_i2c, adap); in npcm_i2c_master_xfer() local
2101 if (bus->state == I2C_DISABLE) { in npcm_i2c_master_xfer()
2102 dev_err(bus->dev, "I2C%d module is disabled", bus->num); in npcm_i2c_master_xfer()
2103 return -EINVAL; in npcm_i2c_master_xfer()
2107 slave_addr = msg0->addr; in npcm_i2c_master_xfer()
2108 if (msg0->flags & I2C_M_RD) { /* read */ in npcm_i2c_master_xfer()
2111 read_data = msg0->buf; in npcm_i2c_master_xfer()
2112 if (msg0->flags & I2C_M_RECV_LEN) { in npcm_i2c_master_xfer()
2115 if (msg0->flags & I2C_CLIENT_PEC) in npcm_i2c_master_xfer()
2118 nread = msg0->len; in npcm_i2c_master_xfer()
2121 nwrite = msg0->len; in npcm_i2c_master_xfer()
2122 write_data = msg0->buf; in npcm_i2c_master_xfer()
2127 read_data = msg1->buf; in npcm_i2c_master_xfer()
2128 if (msg1->flags & I2C_M_RECV_LEN) { in npcm_i2c_master_xfer()
2131 if (msg1->flags & I2C_CLIENT_PEC) in npcm_i2c_master_xfer()
2134 nread = msg1->len; in npcm_i2c_master_xfer()
2145 timeout_usec = (2 * 9 * USEC_PER_SEC / bus->bus_freq) * (2 + nread + nwrite); in npcm_i2c_master_xfer()
2146 timeout = max_t(unsigned long, bus->adap.timeout, usecs_to_jiffies(timeout_usec)); in npcm_i2c_master_xfer()
2148 dev_err(bus->dev, "i2c%d buffer too big\n", bus->num); in npcm_i2c_master_xfer()
2149 return -EINVAL; in npcm_i2c_master_xfer()
2155 * we must clear slave address immediately when the bus is not in npcm_i2c_master_xfer()
2159 spin_lock_irqsave(&bus->lock, flags); in npcm_i2c_master_xfer()
2160 bus_busy = ioread8(bus->reg + NPCM_I2CCST) & NPCM_I2CCST_BB; in npcm_i2c_master_xfer()
2162 if (!bus_busy && bus->slave) in npcm_i2c_master_xfer()
2163 iowrite8((bus->slave->addr & 0x7F), in npcm_i2c_master_xfer()
2164 bus->reg + NPCM_I2CADDR1); in npcm_i2c_master_xfer()
2166 spin_unlock_irqrestore(&bus->lock, flags); in npcm_i2c_master_xfer()
2171 iowrite8(NPCM_I2CCST_BB, bus->reg + NPCM_I2CCST); in npcm_i2c_master_xfer()
2172 npcm_i2c_reset(bus); in npcm_i2c_master_xfer()
2174 return -EAGAIN; in npcm_i2c_master_xfer()
2177 npcm_i2c_init_params(bus); in npcm_i2c_master_xfer()
2178 bus->dest_addr = slave_addr; in npcm_i2c_master_xfer()
2179 bus->msgs = msgs; in npcm_i2c_master_xfer()
2180 bus->msgs_num = num; in npcm_i2c_master_xfer()
2181 bus->cmd_err = 0; in npcm_i2c_master_xfer()
2182 bus->read_block_use = read_block; in npcm_i2c_master_xfer()
2184 reinit_completion(&bus->cmd_complete); in npcm_i2c_master_xfer()
2186 npcm_i2c_int_enable(bus, true); in npcm_i2c_master_xfer()
2188 if (npcm_i2c_master_start_xmit(bus, slave_addr, nwrite, nread, in npcm_i2c_master_xfer()
2191 time_left = wait_for_completion_timeout(&bus->cmd_complete, in npcm_i2c_master_xfer()
2195 if (bus->timeout_cnt < ULLONG_MAX) in npcm_i2c_master_xfer()
2196 bus->timeout_cnt++; in npcm_i2c_master_xfer()
2197 if (bus->master_or_slave == I2C_MASTER) { in npcm_i2c_master_xfer()
2199 bus->cmd_err = -EIO; in npcm_i2c_master_xfer()
2200 bus->state = I2C_IDLE; in npcm_i2c_master_xfer()
2205 /* if there was BER, check if need to recover the bus: */ in npcm_i2c_master_xfer()
2206 if (bus->cmd_err == -EAGAIN) in npcm_i2c_master_xfer()
2207 bus->cmd_err = i2c_recover_bus(adap); in npcm_i2c_master_xfer()
2214 else if (bus->cmd_err && in npcm_i2c_master_xfer()
2215 (bus->data->rxf_ctl_last_pec & ioread8(bus->reg + NPCM_I2CRXF_CTL))) in npcm_i2c_master_xfer()
2216 npcm_i2c_reset(bus); in npcm_i2c_master_xfer()
2219 npcm_i2c_stall_after_start(bus, false); in npcm_i2c_master_xfer()
2220 npcm_i2c_eob_int(bus, false); in npcm_i2c_master_xfer()
2224 if (bus->slave) in npcm_i2c_master_xfer()
2225 iowrite8((bus->slave->addr & 0x7F) | NPCM_I2CADDR_SAEN, in npcm_i2c_master_xfer()
2226 bus->reg + NPCM_I2CADDR1); in npcm_i2c_master_xfer()
2228 npcm_i2c_int_enable(bus, false); in npcm_i2c_master_xfer()
2230 return bus->cmd_err; in npcm_i2c_master_xfer()
2261 struct npcm_i2c *bus) in npcm_i2c_init_debugfs() argument
2267 d = debugfs_create_dir(dev_name(&pdev->dev), npcm_i2c_debugfs_dir); in npcm_i2c_init_debugfs()
2270 debugfs_create_u64("ber_cnt", 0444, d, &bus->ber_cnt); in npcm_i2c_init_debugfs()
2271 debugfs_create_u64("nack_cnt", 0444, d, &bus->nack_cnt); in npcm_i2c_init_debugfs()
2272 debugfs_create_u64("rec_succ_cnt", 0444, d, &bus->rec_succ_cnt); in npcm_i2c_init_debugfs()
2273 debugfs_create_u64("rec_fail_cnt", 0444, d, &bus->rec_fail_cnt); in npcm_i2c_init_debugfs()
2274 debugfs_create_u64("timeout_cnt", 0444, d, &bus->timeout_cnt); in npcm_i2c_init_debugfs()
2275 debugfs_create_u64("tx_complete_cnt", 0444, d, &bus->tx_complete_cnt); in npcm_i2c_init_debugfs()
2277 bus->debugfs = d; in npcm_i2c_init_debugfs()
2282 struct device_node *np = pdev->dev.of_node; in npcm_i2c_probe_bus()
2284 struct device *dev = &pdev->dev; in npcm_i2c_probe_bus()
2286 struct npcm_i2c *bus; in npcm_i2c_probe_bus() local
2291 bus = devm_kzalloc(&pdev->dev, sizeof(*bus), GFP_KERNEL); in npcm_i2c_probe_bus()
2292 if (!bus) in npcm_i2c_probe_bus()
2293 return -ENOMEM; in npcm_i2c_probe_bus()
2295 bus->dev = &pdev->dev; in npcm_i2c_probe_bus()
2297 bus->data = of_device_get_match_data(dev); in npcm_i2c_probe_bus()
2298 if (!bus->data) { in npcm_i2c_probe_bus()
2299 dev_err(dev, "OF data missing\n"); in npcm_i2c_probe_bus()
2300 return -EINVAL; in npcm_i2c_probe_bus()
2303 bus->num = of_alias_get_id(pdev->dev.of_node, "i2c"); in npcm_i2c_probe_bus()
2305 i2c_clk = devm_clk_get(&pdev->dev, NULL); in npcm_i2c_probe_bus()
2308 bus->apb_clk = clk_get_rate(i2c_clk); in npcm_i2c_probe_bus()
2310 gcr_regmap = syscon_regmap_lookup_by_phandle(np, "nuvoton,sys-mgr"); in npcm_i2c_probe_bus()
2312 gcr_regmap = syscon_regmap_lookup_by_compatible("nuvoton,npcm750-gcr"); in npcm_i2c_probe_bus()
2316 regmap_write(gcr_regmap, NPCM_I2CSEGCTL, bus->data->segctl_init_val); in npcm_i2c_probe_bus()
2318 bus->reg = devm_platform_ioremap_resource(pdev, 0); in npcm_i2c_probe_bus()
2319 if (IS_ERR(bus->reg)) in npcm_i2c_probe_bus()
2320 return PTR_ERR(bus->reg); in npcm_i2c_probe_bus()
2322 spin_lock_init(&bus->lock); in npcm_i2c_probe_bus()
2323 init_completion(&bus->cmd_complete); in npcm_i2c_probe_bus()
2325 adap = &bus->adap; in npcm_i2c_probe_bus()
2326 adap->owner = THIS_MODULE; in npcm_i2c_probe_bus()
2327 adap->retries = 3; in npcm_i2c_probe_bus()
2328 adap->timeout = msecs_to_jiffies(35); in npcm_i2c_probe_bus()
2329 adap->algo = &npcm_i2c_algo; in npcm_i2c_probe_bus()
2330 adap->quirks = &npcm_i2c_quirks; in npcm_i2c_probe_bus()
2331 adap->algo_data = bus; in npcm_i2c_probe_bus()
2332 adap->dev.parent = &pdev->dev; in npcm_i2c_probe_bus()
2333 adap->dev.of_node = pdev->dev.of_node; in npcm_i2c_probe_bus()
2334 adap->nr = pdev->id; in npcm_i2c_probe_bus()
2345 npcm_i2c_int_enable(bus, false); in npcm_i2c_probe_bus()
2347 ret = devm_request_irq(bus->dev, irq, npcm_i2c_bus_irq, 0, in npcm_i2c_probe_bus()
2348 dev_name(bus->dev), bus); in npcm_i2c_probe_bus()
2352 ret = __npcm_i2c_init(bus, pdev); in npcm_i2c_probe_bus()
2358 i2c_set_adapdata(adap, bus); in npcm_i2c_probe_bus()
2360 snprintf(bus->adap.name, sizeof(bus->adap.name), "npcm_i2c_%d", in npcm_i2c_probe_bus()
2361 bus->num); in npcm_i2c_probe_bus()
2362 ret = i2c_add_numbered_adapter(&bus->adap); in npcm_i2c_probe_bus()
2366 platform_set_drvdata(pdev, bus); in npcm_i2c_probe_bus()
2367 npcm_i2c_init_debugfs(pdev, bus); in npcm_i2c_probe_bus()
2374 struct npcm_i2c *bus = platform_get_drvdata(pdev); in npcm_i2c_remove_bus() local
2376 debugfs_remove_recursive(bus->debugfs); in npcm_i2c_remove_bus()
2377 spin_lock_irqsave(&bus->lock, lock_flags); in npcm_i2c_remove_bus()
2378 npcm_i2c_disable(bus); in npcm_i2c_remove_bus()
2379 spin_unlock_irqrestore(&bus->lock, lock_flags); in npcm_i2c_remove_bus()
2380 i2c_del_adapter(&bus->adap); in npcm_i2c_remove_bus()
2384 { .compatible = "nuvoton,npcm750-i2c", .data = &npxm7xx_i2c_data },
2385 { .compatible = "nuvoton,npcm845-i2c", .data = &npxm8xx_i2c_data },
2394 .name = "nuvoton-i2c",
2425 MODULE_DESCRIPTION("Nuvoton I2C Bus Driver");