Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * Nuvoton NPCM7xx I2C Controller driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * Copyright (C) 2020 Nuvoton Technologies tali.perry@nuvoton.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) #include <linux/bitfield.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include <linux/debugfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/iopoll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #include <linux/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include <linux/mfd/syscon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) enum i2c_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) 	I2C_MASTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) 	I2C_SLAVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29)  * External I2C Interface driver xfer indication values, which indicate status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30)  * of the bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) enum i2c_state_ind {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) 	I2C_NO_STATUS_IND = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) 	I2C_SLAVE_RCV_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) 	I2C_SLAVE_XMIT_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 	I2C_SLAVE_XMIT_MISSING_DATA_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 	I2C_SLAVE_RESTART_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) 	I2C_SLAVE_DONE_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) 	I2C_MASTER_DONE_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 	I2C_NACK_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) 	I2C_BUS_ERR_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) 	I2C_WAKE_UP_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) 	I2C_BLOCK_BYTES_ERR_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) 	I2C_SLAVE_RCV_MISSING_DATA_IND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48)  * Operation type values (used to define the operation currently running)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49)  * module is interrupt driven, on each interrupt the current operation is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50)  * checked to see if the module is currently reading or writing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) enum i2c_oper {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 	I2C_NO_OPER = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 	I2C_WRITE_OPER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 	I2C_READ_OPER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) /* I2C Bank (module had 2 banks of registers) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) enum i2c_bank {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	I2C_BANK_0 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	I2C_BANK_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) /* Internal I2C states values (for the I2C module state machine). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) enum i2c_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	I2C_DISABLE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 	I2C_IDLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 	I2C_MASTER_START,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 	I2C_SLAVE_MATCH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 	I2C_OPER_STARTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	I2C_STOP_PENDING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) /* Module supports setting multiple own slave addresses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) enum i2c_addr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 	I2C_SLAVE_ADDR1 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	I2C_SLAVE_ADDR2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 	I2C_SLAVE_ADDR3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 	I2C_SLAVE_ADDR4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 	I2C_SLAVE_ADDR5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 	I2C_SLAVE_ADDR6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 	I2C_SLAVE_ADDR7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	I2C_SLAVE_ADDR8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	I2C_SLAVE_ADDR9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 	I2C_SLAVE_ADDR10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 	I2C_GC_ADDR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	I2C_ARP_ADDR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) /* init register and default value required to enable module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) #define NPCM_I2CSEGCTL			0xE4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) #define NPCM_I2CSEGCTL_INIT_VAL		0x0333F000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) /* Common regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) #define NPCM_I2CSDA			0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) #define NPCM_I2CST			0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) #define NPCM_I2CCST			0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) #define NPCM_I2CCTL1			0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) #define NPCM_I2CADDR1			0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) #define NPCM_I2CCTL2			0x0A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) #define NPCM_I2CADDR2			0x0C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) #define NPCM_I2CCTL3			0x0E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) #define NPCM_I2CCST2			0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) #define NPCM_I2CCST3			0x19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) #define I2C_VER				0x1F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) /*BANK0 regs*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) #define NPCM_I2CADDR3			0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) #define NPCM_I2CADDR7			0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) #define NPCM_I2CADDR4			0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) #define NPCM_I2CADDR8			0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) #define NPCM_I2CADDR5			0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) #define NPCM_I2CADDR9			0x15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) #define NPCM_I2CADDR6			0x16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) #define NPCM_I2CADDR10			0x17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121)  * npcm_i2caddr array:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122)  * The module supports having multiple own slave addresses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123)  * Since the addr regs are sprinkled all over the address space,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124)  * use this array to get the address or each register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) #define I2C_NUM_OWN_ADDR 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) static const int npcm_i2caddr[I2C_NUM_OWN_ADDR] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	NPCM_I2CADDR1, NPCM_I2CADDR2, NPCM_I2CADDR3, NPCM_I2CADDR4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 	NPCM_I2CADDR5, NPCM_I2CADDR6, NPCM_I2CADDR7, NPCM_I2CADDR8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	NPCM_I2CADDR9, NPCM_I2CADDR10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) #define NPCM_I2CCTL4			0x1A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) #define NPCM_I2CCTL5			0x1B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) #define NPCM_I2CSCLLT			0x1C /* SCL Low Time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) #define NPCM_I2CFIF_CTL			0x1D /* FIFO Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) #define NPCM_I2CSCLHT			0x1E /* SCL High Time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) /* BANK 1 regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) #define NPCM_I2CFIF_CTS			0x10 /* Both FIFOs Control and Status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) #define NPCM_I2CTXF_CTL			0x12 /* Tx-FIFO Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) #define NPCM_I2CT_OUT			0x14 /* Bus T.O. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) #define NPCM_I2CPEC			0x16 /* PEC Data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) #define NPCM_I2CTXF_STS			0x1A /* Tx-FIFO Status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) #define NPCM_I2CRXF_STS			0x1C /* Rx-FIFO Status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) #define NPCM_I2CRXF_CTL			0x1E /* Rx-FIFO Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) /* NPCM_I2CST reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) #define NPCM_I2CST_XMIT			BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) #define NPCM_I2CST_MASTER		BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) #define NPCM_I2CST_NMATCH		BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) #define NPCM_I2CST_STASTR		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) #define NPCM_I2CST_NEGACK		BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) #define NPCM_I2CST_BER			BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) #define NPCM_I2CST_SDAST		BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) #define NPCM_I2CST_SLVSTP		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) /* NPCM_I2CCST reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) #define NPCM_I2CCST_BUSY		BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) #define NPCM_I2CCST_BB			BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) #define NPCM_I2CCST_MATCH		BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) #define NPCM_I2CCST_GCMATCH		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) #define NPCM_I2CCST_TSDA		BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) #define NPCM_I2CCST_TGSCL		BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) #define NPCM_I2CCST_MATCHAF		BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) #define NPCM_I2CCST_ARPMATCH		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) /* NPCM_I2CCTL1 reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) #define NPCM_I2CCTL1_START		BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) #define NPCM_I2CCTL1_STOP		BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) #define NPCM_I2CCTL1_INTEN		BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) #define NPCM_I2CCTL1_EOBINTE		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) #define NPCM_I2CCTL1_ACK		BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) #define NPCM_I2CCTL1_GCMEN		BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) #define NPCM_I2CCTL1_NMINTE		BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) #define NPCM_I2CCTL1_STASTRE		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) /* RW1S fields (inside a RW reg): */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) #define NPCM_I2CCTL1_RWS   \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	(NPCM_I2CCTL1_START | NPCM_I2CCTL1_STOP | NPCM_I2CCTL1_ACK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) /* npcm_i2caddr reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) #define NPCM_I2CADDR_A			GENMASK(6, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) #define NPCM_I2CADDR_SAEN		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) /* NPCM_I2CCTL2 reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) #define I2CCTL2_ENABLE			BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) #define I2CCTL2_SCLFRQ6_0		GENMASK(7, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) /* NPCM_I2CCTL3 reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) #define I2CCTL3_SCLFRQ8_7		GENMASK(1, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) #define I2CCTL3_ARPMEN			BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) #define I2CCTL3_IDL_START		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) #define I2CCTL3_400K_MODE		BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) #define I2CCTL3_BNK_SEL			BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) #define I2CCTL3_SDA_LVL			BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) #define I2CCTL3_SCL_LVL			BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) /* NPCM_I2CCST2 reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) #define NPCM_I2CCST2_MATCHA1F		BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) #define NPCM_I2CCST2_MATCHA2F		BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) #define NPCM_I2CCST2_MATCHA3F		BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) #define NPCM_I2CCST2_MATCHA4F		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) #define NPCM_I2CCST2_MATCHA5F		BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) #define NPCM_I2CCST2_MATCHA6F		BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) #define NPCM_I2CCST2_MATCHA7F		BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) #define NPCM_I2CCST2_INTSTS		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) /* NPCM_I2CCST3 reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) #define NPCM_I2CCST3_MATCHA8F		BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) #define NPCM_I2CCST3_MATCHA9F		BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) #define NPCM_I2CCST3_MATCHA10F		BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) #define NPCM_I2CCST3_EO_BUSY		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) /* NPCM_I2CCTL4 reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) #define I2CCTL4_HLDT			GENMASK(5, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) #define I2CCTL4_LVL_WE			BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) /* NPCM_I2CCTL5 reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) #define I2CCTL5_DBNCT			GENMASK(3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) /* NPCM_I2CFIF_CTS reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) #define NPCM_I2CFIF_CTS_RXF_TXE		BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) #define NPCM_I2CFIF_CTS_RFTE_IE		BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) #define NPCM_I2CFIF_CTS_CLR_FIFO	BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) #define NPCM_I2CFIF_CTS_SLVRSTR		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) /* NPCM_I2CTXF_CTL reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) #define NPCM_I2CTXF_CTL_TX_THR		GENMASK(4, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) #define NPCM_I2CTXF_CTL_THR_TXIE	BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) /* NPCM_I2CT_OUT reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) #define NPCM_I2CT_OUT_TO_CKDIV		GENMASK(5, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) #define NPCM_I2CT_OUT_T_OUTIE		BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) #define NPCM_I2CT_OUT_T_OUTST		BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) /* NPCM_I2CTXF_STS reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) #define NPCM_I2CTXF_STS_TX_BYTES	GENMASK(4, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) #define NPCM_I2CTXF_STS_TX_THST		BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) /* NPCM_I2CRXF_STS reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) #define NPCM_I2CRXF_STS_RX_BYTES	GENMASK(4, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) #define NPCM_I2CRXF_STS_RX_THST		BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) /* NPCM_I2CFIF_CTL reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) #define NPCM_I2CFIF_CTL_FIFO_EN		BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) /* NPCM_I2CRXF_CTL reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) #define NPCM_I2CRXF_CTL_RX_THR		GENMASK(4, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) #define NPCM_I2CRXF_CTL_LAST_PEC	BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) #define NPCM_I2CRXF_CTL_THR_RXIE	BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) #define I2C_HW_FIFO_SIZE		16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) /* I2C_VER reg fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) #define I2C_VER_VERSION			GENMASK(6, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) #define I2C_VER_FIFO_EN			BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) /* stall/stuck timeout in us */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) #define DEFAULT_STALL_COUNT		25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) /* SCLFRQ field position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) #define SCLFRQ_0_TO_6			GENMASK(6, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) #define SCLFRQ_7_TO_8			GENMASK(8, 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) /* supported clk settings. values in Hz. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) #define I2C_FREQ_MIN_HZ			10000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) #define I2C_FREQ_MAX_HZ			I2C_MAX_FAST_MODE_PLUS_FREQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) /* Status of one I2C module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) struct npcm_i2c {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	struct i2c_adapter adap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	unsigned char __iomem *reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	spinlock_t lock;   /* IRQ synchronization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 	struct completion cmd_complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 	int cmd_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	struct i2c_msg *msgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	int msgs_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 	int num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	u32 apb_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	struct i2c_bus_recovery_info rinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 	enum i2c_state state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 	enum i2c_oper operation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 	enum i2c_mode master_or_slave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	enum i2c_state_ind stop_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	u8 dest_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 	u8 *rd_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	u16 rd_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	u16 rd_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	u8 *wr_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	u16 wr_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	u16 wr_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	bool fifo_use;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	u16 PEC_mask; /* PEC bit mask per slave address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	bool PEC_use;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	bool read_block_use;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 	unsigned long int_time_stamp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	unsigned long bus_freq; /* in Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	u8 own_slave_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 	struct i2c_client *slave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	int slv_rd_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 	int slv_rd_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 	int slv_wr_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 	int slv_wr_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 	u8 slv_rd_buf[I2C_HW_FIFO_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 	u8 slv_wr_buf[I2C_HW_FIFO_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 	struct dentry *debugfs; /* debugfs device directory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	u64 ber_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	u64 rec_succ_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	u64 rec_fail_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	u64 nack_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	u64 timeout_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) static inline void npcm_i2c_select_bank(struct npcm_i2c *bus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 					enum i2c_bank bank)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	u8 i2cctl3 = ioread8(bus->reg + NPCM_I2CCTL3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	if (bank == I2C_BANK_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 		i2cctl3 = i2cctl3 & ~I2CCTL3_BNK_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 		i2cctl3 = i2cctl3 | I2CCTL3_BNK_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	iowrite8(i2cctl3, bus->reg + NPCM_I2CCTL3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) static void npcm_i2c_init_params(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 	bus->stop_ind = I2C_NO_STATUS_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 	bus->rd_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	bus->wr_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	bus->rd_ind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	bus->wr_ind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	bus->read_block_use = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 	bus->int_time_stamp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	bus->PEC_use = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 	bus->PEC_mask = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 	if (bus->slave)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 		bus->master_or_slave = I2C_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) static inline void npcm_i2c_wr_byte(struct npcm_i2c *bus, u8 data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 	iowrite8(data, bus->reg + NPCM_I2CSDA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) static inline u8 npcm_i2c_rd_byte(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	return ioread8(bus->reg + NPCM_I2CSDA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) static int npcm_i2c_get_SCL(struct i2c_adapter *_adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 	return !!(I2CCTL3_SCL_LVL & ioread32(bus->reg + NPCM_I2CCTL3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) static int npcm_i2c_get_SDA(struct i2c_adapter *_adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 	return !!(I2CCTL3_SDA_LVL & ioread32(bus->reg + NPCM_I2CCTL3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) static inline u16 npcm_i2c_get_index(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	if (bus->operation == I2C_READ_OPER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 		return bus->rd_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	if (bus->operation == I2C_WRITE_OPER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 		return bus->wr_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) /* quick protocol (just address) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) static inline bool npcm_i2c_is_quick(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 	return bus->wr_size == 0 && bus->rd_size == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) static void npcm_i2c_disable(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 	u8 i2cctl2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 	/* select bank 0 for I2C addresses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	npcm_i2c_select_bank(bus, I2C_BANK_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 	/* Slave addresses removal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	for (i = I2C_SLAVE_ADDR1; i < I2C_NUM_OWN_ADDR; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 		iowrite8(0, bus->reg + npcm_i2caddr[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 	npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	/* Disable module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	i2cctl2 = ioread8(bus->reg + NPCM_I2CCTL2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	i2cctl2 = i2cctl2 & ~I2CCTL2_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	iowrite8(i2cctl2, bus->reg + NPCM_I2CCTL2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 	bus->state = I2C_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) static void npcm_i2c_enable(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	u8 i2cctl2 = ioread8(bus->reg + NPCM_I2CCTL2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 	i2cctl2 = i2cctl2 | I2CCTL2_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 	iowrite8(i2cctl2, bus->reg + NPCM_I2CCTL2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) /* enable\disable end of busy (EOB) interrupts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) static inline void npcm_i2c_eob_int(struct npcm_i2c *bus, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	/* Clear EO_BUSY pending bit: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 	val = ioread8(bus->reg + NPCM_I2CCST3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 	val = val | NPCM_I2CCST3_EO_BUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	iowrite8(val, bus->reg + NPCM_I2CCST3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 	val = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	val &= ~NPCM_I2CCTL1_RWS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 	if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 		val |= NPCM_I2CCTL1_EOBINTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 		val &= ~NPCM_I2CCTL1_EOBINTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 	iowrite8(val, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) static inline bool npcm_i2c_tx_fifo_empty(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 	u8 tx_fifo_sts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 	tx_fifo_sts = ioread8(bus->reg + NPCM_I2CTXF_STS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 	/* check if TX FIFO is not empty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	if ((tx_fifo_sts & NPCM_I2CTXF_STS_TX_BYTES) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	/* check if TX FIFO status bit is set: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	return !!FIELD_GET(NPCM_I2CTXF_STS_TX_THST, tx_fifo_sts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) static inline bool npcm_i2c_rx_fifo_full(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	u8 rx_fifo_sts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 	rx_fifo_sts = ioread8(bus->reg + NPCM_I2CRXF_STS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	/* check if RX FIFO is not empty: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 	if ((rx_fifo_sts & NPCM_I2CRXF_STS_RX_BYTES) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 	/* check if rx fifo full status is set: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	return !!FIELD_GET(NPCM_I2CRXF_STS_RX_THST, rx_fifo_sts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) static inline void npcm_i2c_clear_fifo_int(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	val = ioread8(bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 	val = (val & NPCM_I2CFIF_CTS_SLVRSTR) | NPCM_I2CFIF_CTS_RXF_TXE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 	iowrite8(val, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) static inline void npcm_i2c_clear_tx_fifo(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	val = ioread8(bus->reg + NPCM_I2CTXF_STS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 	val = val | NPCM_I2CTXF_STS_TX_THST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 	iowrite8(val, bus->reg + NPCM_I2CTXF_STS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) static inline void npcm_i2c_clear_rx_fifo(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	val = ioread8(bus->reg + NPCM_I2CRXF_STS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	val = val | NPCM_I2CRXF_STS_RX_THST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	iowrite8(val, bus->reg + NPCM_I2CRXF_STS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) static void npcm_i2c_int_enable(struct npcm_i2c *bus, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	val = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	val &= ~NPCM_I2CCTL1_RWS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 		val |= NPCM_I2CCTL1_INTEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 		val &= ~NPCM_I2CCTL1_INTEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 	iowrite8(val, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) static inline void npcm_i2c_master_start(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	val = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	val &= ~(NPCM_I2CCTL1_STOP | NPCM_I2CCTL1_ACK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 	val |= NPCM_I2CCTL1_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 	iowrite8(val, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) static inline void npcm_i2c_master_stop(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 	 * override HW issue: I2C may fail to supply stop condition in Master
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 	 * Write operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	 * Need to delay at least 5 us from the last int, before issueing a stop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 	udelay(10); /* function called from interrupt, can't sleep */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 	val = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 	val &= ~(NPCM_I2CCTL1_START | NPCM_I2CCTL1_ACK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	val |= NPCM_I2CCTL1_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 	iowrite8(val, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 	if (!bus->fifo_use)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 	npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 	if (bus->operation == I2C_READ_OPER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 		npcm_i2c_clear_rx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 		npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	npcm_i2c_clear_fifo_int(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	iowrite8(0, bus->reg + NPCM_I2CTXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) static inline void npcm_i2c_stall_after_start(struct npcm_i2c *bus, bool stall)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 	val = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 	val &= ~NPCM_I2CCTL1_RWS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 	if (stall)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 		val |= NPCM_I2CCTL1_STASTRE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 		val &= ~NPCM_I2CCTL1_STASTRE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	iowrite8(val, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) static inline void npcm_i2c_nack(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	val = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 	val &= ~(NPCM_I2CCTL1_STOP | NPCM_I2CCTL1_START);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 	val |= NPCM_I2CCTL1_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	iowrite8(val, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) static void npcm_i2c_slave_int_enable(struct npcm_i2c *bus, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 	u8 i2cctl1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	/* enable interrupt on slave match: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	i2cctl1 = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	i2cctl1 &= ~NPCM_I2CCTL1_RWS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 	if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 		i2cctl1 |= NPCM_I2CCTL1_NMINTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 		i2cctl1 &= ~NPCM_I2CCTL1_NMINTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	iowrite8(i2cctl1, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) static int npcm_i2c_slave_enable(struct npcm_i2c *bus, enum i2c_addr addr_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 				 u8 addr, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	u8 i2cctl1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	u8 i2cctl3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	u8 sa_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 	sa_reg = (addr & 0x7F) | FIELD_PREP(NPCM_I2CADDR_SAEN, enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 	if (addr_type == I2C_GC_ADDR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 		i2cctl1 = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 		if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 			i2cctl1 |= NPCM_I2CCTL1_GCMEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 			i2cctl1 &= ~NPCM_I2CCTL1_GCMEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 		iowrite8(i2cctl1, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	if (addr_type == I2C_ARP_ADDR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 		i2cctl3 = ioread8(bus->reg + NPCM_I2CCTL3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 		if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 			i2cctl3 |= I2CCTL3_ARPMEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 			i2cctl3 &= ~I2CCTL3_ARPMEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 		iowrite8(i2cctl3, bus->reg + NPCM_I2CCTL3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	if (addr_type >= I2C_ARP_ADDR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 	/* select bank 0 for address 3 to 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 	if (addr_type > I2C_SLAVE_ADDR2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 		npcm_i2c_select_bank(bus, I2C_BANK_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 	/* Set and enable the address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	iowrite8(sa_reg, bus->reg + npcm_i2caddr[addr_type]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 	npcm_i2c_slave_int_enable(bus, enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 	if (addr_type > I2C_SLAVE_ADDR2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 		npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) static void npcm_i2c_reset(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	 * Save I2CCTL1 relevant bits. It is being cleared when the module
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	 *  is disabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	u8 i2cctl1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 	u8 addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 	i2cctl1 = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 	npcm_i2c_disable(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	npcm_i2c_enable(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 	/* Restore NPCM_I2CCTL1 Status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	i2cctl1 &= ~NPCM_I2CCTL1_RWS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	iowrite8(i2cctl1, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	/* Clear BB (BUS BUSY) bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	iowrite8(NPCM_I2CCST_BB, bus->reg + NPCM_I2CCST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	iowrite8(0xFF, bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 	/* Clear EOB bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	iowrite8(NPCM_I2CCST3_EO_BUSY, bus->reg + NPCM_I2CCST3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	/* Clear all fifo bits: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	iowrite8(NPCM_I2CFIF_CTS_CLR_FIFO, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	if (bus->slave) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 		addr = bus->slave->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 		npcm_i2c_slave_enable(bus, I2C_SLAVE_ADDR1, addr, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 	bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) static inline bool npcm_i2c_is_master(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	return !!FIELD_GET(NPCM_I2CST_MASTER, ioread8(bus->reg + NPCM_I2CST));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) static void npcm_i2c_callback(struct npcm_i2c *bus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 			      enum i2c_state_ind op_status, u16 info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 	struct i2c_msg *msgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 	int msgs_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 	msgs = bus->msgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 	msgs_num = bus->msgs_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 	 * check that transaction was not timed-out, and msgs still
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 	 * holds a valid value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 	if (!msgs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 	if (completion_done(&bus->cmd_complete))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	switch (op_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	case I2C_MASTER_DONE_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 		bus->cmd_err = bus->msgs_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	case I2C_BLOCK_BYTES_ERR_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 		/* Master tx finished and all transmit bytes were sent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 		if (bus->msgs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 			if (msgs[0].flags & I2C_M_RD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 				msgs[0].len = info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 			else if (msgs_num == 2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 				 msgs[1].flags & I2C_M_RD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 				msgs[1].len = info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 		if (completion_done(&bus->cmd_complete) == false)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 			complete(&bus->cmd_complete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 	break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 	case I2C_NACK_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 		/* MASTER transmit got a NACK before tx all bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 		bus->cmd_err = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 		if (bus->master_or_slave == I2C_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 			complete(&bus->cmd_complete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 	case I2C_BUS_ERR_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 		/* Bus error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 		bus->cmd_err = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 		if (bus->master_or_slave == I2C_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 			complete(&bus->cmd_complete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	case I2C_WAKE_UP_IND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 		/* I2C wake up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 	bus->operation = I2C_NO_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 	if (bus->slave)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 		bus->master_or_slave = I2C_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) static u8 npcm_i2c_fifo_usage(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 	if (bus->operation == I2C_WRITE_OPER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 		return FIELD_GET(NPCM_I2CTXF_STS_TX_BYTES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 				 ioread8(bus->reg + NPCM_I2CTXF_STS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	if (bus->operation == I2C_READ_OPER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 		return FIELD_GET(NPCM_I2CRXF_STS_RX_BYTES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 				 ioread8(bus->reg + NPCM_I2CRXF_STS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) static void npcm_i2c_write_to_fifo_master(struct npcm_i2c *bus, u16 max_bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	u8 size_free_fifo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 	 * Fill the FIFO, while the FIFO is not full and there are more bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 	 * to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	size_free_fifo = I2C_HW_FIFO_SIZE - npcm_i2c_fifo_usage(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 	while (max_bytes-- && size_free_fifo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 		if (bus->wr_ind < bus->wr_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 			npcm_i2c_wr_byte(bus, bus->wr_buf[bus->wr_ind++]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 			npcm_i2c_wr_byte(bus, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 		size_free_fifo = I2C_HW_FIFO_SIZE - npcm_i2c_fifo_usage(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759)  * npcm_i2c_set_fifo:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760)  * configure the FIFO before using it. If nread is -1 RX FIFO will not be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761)  * configured. same for nwrite
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) static void npcm_i2c_set_fifo(struct npcm_i2c *bus, int nread, int nwrite)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 	u8 rxf_ctl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 	if (!bus->fifo_use)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 	npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 	npcm_i2c_clear_rx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 	/* configure RX FIFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 	if (nread > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 		rxf_ctl = min_t(int, nread, I2C_HW_FIFO_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 		/* set LAST bit. if LAST is set next FIFO packet is nacked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 		if (nread <= I2C_HW_FIFO_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 			rxf_ctl |= NPCM_I2CRXF_CTL_LAST_PEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 		 * if we are about to read the first byte in blk rd mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 		 * don't NACK it. If slave returns zero size HW can't NACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 		 * it immidiattly, it will read extra byte and then NACK.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 		if (bus->rd_ind == 0 && bus->read_block_use) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 			/* set fifo to read one byte, no last: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 			rxf_ctl = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 		/* set fifo size: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 		iowrite8(rxf_ctl, bus->reg + NPCM_I2CRXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 	/* configure TX FIFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 	if (nwrite > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 		if (nwrite > I2C_HW_FIFO_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 			/* data to send is more then FIFO size. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 			iowrite8(I2C_HW_FIFO_SIZE, bus->reg + NPCM_I2CTXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 			iowrite8(nwrite, bus->reg + NPCM_I2CTXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 		npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) static void npcm_i2c_read_fifo(struct npcm_i2c *bus, u8 bytes_in_fifo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 	u8 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 	while (bytes_in_fifo--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 		data = npcm_i2c_rd_byte(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 		if (bus->rd_ind < bus->rd_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 			bus->rd_buf[bus->rd_ind++] = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) static inline void npcm_i2c_clear_master_status(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 	/* Clear NEGACK, STASTR and BER bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 	val = NPCM_I2CST_BER | NPCM_I2CST_NEGACK | NPCM_I2CST_STASTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 	iowrite8(val, bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) static void npcm_i2c_master_abort(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 	/* Only current master is allowed to issue a stop condition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	if (!npcm_i2c_is_master(bus))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 	npcm_i2c_eob_int(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 	npcm_i2c_master_stop(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 	npcm_i2c_clear_master_status(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) static u8 npcm_i2c_get_slave_addr(struct npcm_i2c *bus, enum i2c_addr addr_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 	u8 slave_add;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 	/* select bank 0 for address 3 to 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 	if (addr_type > I2C_SLAVE_ADDR2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 		npcm_i2c_select_bank(bus, I2C_BANK_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 	slave_add = ioread8(bus->reg + npcm_i2caddr[(int)addr_type]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 	if (addr_type > I2C_SLAVE_ADDR2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 		npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	return slave_add;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) static int npcm_i2c_remove_slave_addr(struct npcm_i2c *bus, u8 slave_add)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 	/* Set the enable bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	slave_add |= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 	npcm_i2c_select_bank(bus, I2C_BANK_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	for (i = I2C_SLAVE_ADDR1; i < I2C_NUM_OWN_ADDR; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 		if (ioread8(bus->reg + npcm_i2caddr[i]) == slave_add)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 			iowrite8(0, bus->reg + npcm_i2caddr[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 	npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) static void npcm_i2c_write_fifo_slave(struct npcm_i2c *bus, u16 max_bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 	 * Fill the FIFO, while the FIFO is not full and there are more bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 	 * to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 	npcm_i2c_clear_fifo_int(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 	npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 	iowrite8(0, bus->reg + NPCM_I2CTXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 	while (max_bytes-- && I2C_HW_FIFO_SIZE != npcm_i2c_fifo_usage(bus)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 		if (bus->slv_wr_size <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 		bus->slv_wr_ind = bus->slv_wr_ind % I2C_HW_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 		npcm_i2c_wr_byte(bus, bus->slv_wr_buf[bus->slv_wr_ind]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 		bus->slv_wr_ind++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 		bus->slv_wr_ind = bus->slv_wr_ind % I2C_HW_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 		bus->slv_wr_size--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) static void npcm_i2c_read_fifo_slave(struct npcm_i2c *bus, u8 bytes_in_fifo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	u8 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	if (!bus->slave)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	while (bytes_in_fifo--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 		data = npcm_i2c_rd_byte(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 		bus->slv_rd_ind = bus->slv_rd_ind % I2C_HW_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 		bus->slv_rd_buf[bus->slv_rd_ind] = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 		bus->slv_rd_ind++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 		/* 1st byte is length in block protocol: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 		if (bus->slv_rd_ind == 1 && bus->read_block_use)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 			bus->slv_rd_size = data + bus->PEC_use + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) static int npcm_i2c_slave_get_wr_buf(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 	u8 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 	int ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 	int ret = bus->slv_wr_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 	/* fill a cyclic buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 	for (i = 0; i < I2C_HW_FIFO_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 		if (bus->slv_wr_size >= I2C_HW_FIFO_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 		i2c_slave_event(bus->slave, I2C_SLAVE_READ_REQUESTED, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 		ind = (bus->slv_wr_ind + bus->slv_wr_size) % I2C_HW_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 		bus->slv_wr_buf[ind] = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 		bus->slv_wr_size++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 		i2c_slave_event(bus->slave, I2C_SLAVE_READ_PROCESSED, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 	return I2C_HW_FIFO_SIZE - ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) static void npcm_i2c_slave_send_rd_buf(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 	for (i = 0; i < bus->slv_rd_ind; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 		i2c_slave_event(bus->slave, I2C_SLAVE_WRITE_RECEIVED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 				&bus->slv_rd_buf[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 	 * once we send bytes up, need to reset the counter of the wr buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 	 * got data from master (new offset in device), ignore wr fifo:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 	if (bus->slv_rd_ind) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 		bus->slv_wr_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 		bus->slv_wr_ind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	bus->slv_rd_ind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	bus->slv_rd_size = bus->adap.quirks->max_read_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 	npcm_i2c_clear_fifo_int(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 	npcm_i2c_clear_rx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) static void npcm_i2c_slave_receive(struct npcm_i2c *bus, u16 nread,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 				   u8 *read_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 	bus->state = I2C_OPER_STARTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	bus->operation = I2C_READ_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 	bus->slv_rd_size = nread;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 	bus->slv_rd_ind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	iowrite8(0, bus->reg + NPCM_I2CTXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 	iowrite8(I2C_HW_FIFO_SIZE, bus->reg + NPCM_I2CRXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 	npcm_i2c_clear_rx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) static void npcm_i2c_slave_xmit(struct npcm_i2c *bus, u16 nwrite,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 				u8 *write_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	if (nwrite == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	bus->state = I2C_OPER_STARTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	bus->operation = I2C_WRITE_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	/* get the next buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 	npcm_i2c_slave_get_wr_buf(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 	npcm_i2c_write_fifo_slave(bus, nwrite);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982)  * npcm_i2c_slave_wr_buf_sync:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983)  * currently slave IF only supports single byte operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984)  * in order to utilyze the npcm HW FIFO, the driver will ask for 16 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985)  * at a time, pack them in buffer, and then transmit them all together
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986)  * to the FIFO and onward to the bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987)  * NACK on read will be once reached to bus->adap->quirks->max_read_len.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988)  * sending a NACK wherever the backend requests for it is not supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989)  * the next two functions allow reading to local buffer before writing it all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990)  * to the HW FIFO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) static void npcm_i2c_slave_wr_buf_sync(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 	int left_in_fifo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 	left_in_fifo = FIELD_GET(NPCM_I2CTXF_STS_TX_BYTES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 				 ioread8(bus->reg + NPCM_I2CTXF_STS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 	/* fifo already full: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 	if (left_in_fifo >= I2C_HW_FIFO_SIZE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 	    bus->slv_wr_size >= I2C_HW_FIFO_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 	/* update the wr fifo index back to the untransmitted bytes: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	bus->slv_wr_ind = bus->slv_wr_ind - left_in_fifo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 	bus->slv_wr_size = bus->slv_wr_size + left_in_fifo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 	if (bus->slv_wr_ind < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 		bus->slv_wr_ind += I2C_HW_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) static void npcm_i2c_slave_rd_wr(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 	if (NPCM_I2CST_XMIT & ioread8(bus->reg + NPCM_I2CST)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 		 * Slave got an address match with direction bit 1 so it should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 		 * transmit data. Write till the master will NACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 		bus->operation = I2C_WRITE_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 		npcm_i2c_slave_xmit(bus, bus->adap.quirks->max_write_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 				    bus->slv_wr_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 		 * Slave got an address match with direction bit 0 so it should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 		 * receive data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 		 * this module does not support saying no to bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 		 * it will always ACK.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 		bus->operation = I2C_READ_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 		npcm_i2c_read_fifo_slave(bus, npcm_i2c_fifo_usage(bus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 		bus->stop_ind = I2C_SLAVE_RCV_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 		npcm_i2c_slave_send_rd_buf(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 		npcm_i2c_slave_receive(bus, bus->adap.quirks->max_read_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 				       bus->slv_rd_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) static irqreturn_t npcm_i2c_int_slave_handler(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 	irqreturn_t ret = IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 	u8 i2cst = ioread8(bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	/* Slave: A NACK has occurred */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	if (NPCM_I2CST_NEGACK & i2cst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 		bus->stop_ind = I2C_NACK_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 		npcm_i2c_slave_wr_buf_sync(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 		if (bus->fifo_use)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 			/* clear the FIFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 			iowrite8(NPCM_I2CFIF_CTS_CLR_FIFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 				 bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 		/* In slave write, NACK is OK, otherwise it is a problem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 		bus->stop_ind = I2C_NO_STATUS_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 		bus->operation = I2C_NO_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 		bus->own_slave_addr = 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 		 * Slave has to wait for STOP to decide this is the end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 		 * of the transaction. tx is not yet considered as done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 		iowrite8(NPCM_I2CST_NEGACK, bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 		ret = IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 	/* Slave mode: a Bus Error (BER) has been identified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 	if (NPCM_I2CST_BER & i2cst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 		 * Check whether bus arbitration or Start or Stop during data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 		 * xfer bus arbitration problem should not result in recovery
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 		bus->stop_ind = I2C_BUS_ERR_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 		/* wait for bus busy before clear fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 		iowrite8(NPCM_I2CFIF_CTS_CLR_FIFO, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 		bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 		 * in BER case we might get 2 interrupts: one for slave one for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 		 * master ( for a channel which is master\slave switching)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 		if (completion_done(&bus->cmd_complete) == false) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 			bus->cmd_err = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 			complete(&bus->cmd_complete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 		bus->own_slave_addr = 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 		iowrite8(NPCM_I2CST_BER, bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 		ret = IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 	/* A Slave Stop Condition has been identified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	if (NPCM_I2CST_SLVSTP & i2cst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 		u8 bytes_in_fifo = npcm_i2c_fifo_usage(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 		bus->stop_ind = I2C_SLAVE_DONE_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 		if (bus->operation == I2C_READ_OPER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 			npcm_i2c_read_fifo_slave(bus, bytes_in_fifo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 		/* if the buffer is empty nothing will be sent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 		npcm_i2c_slave_send_rd_buf(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 		/* Slave done transmitting or receiving */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 		bus->stop_ind = I2C_NO_STATUS_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 		 * Note, just because we got here, it doesn't mean we through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 		 * away the wr buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 		 * we keep it until the next received offset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 		bus->operation = I2C_NO_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 		bus->own_slave_addr = 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 		i2c_slave_event(bus->slave, I2C_SLAVE_STOP, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 		iowrite8(NPCM_I2CST_SLVSTP, bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 		if (bus->fifo_use) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 			npcm_i2c_clear_fifo_int(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 			npcm_i2c_clear_rx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 			npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 			iowrite8(NPCM_I2CFIF_CTS_CLR_FIFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 				 bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 		bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 		ret = IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 	/* restart condition occurred and Rx-FIFO was not empty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 	if (bus->fifo_use && FIELD_GET(NPCM_I2CFIF_CTS_SLVRSTR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 				       ioread8(bus->reg + NPCM_I2CFIF_CTS))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 		bus->stop_ind = I2C_SLAVE_RESTART_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 		bus->master_or_slave = I2C_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 		if (bus->operation == I2C_READ_OPER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 			npcm_i2c_read_fifo_slave(bus, npcm_i2c_fifo_usage(bus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 		bus->operation = I2C_WRITE_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 		iowrite8(0, bus->reg + NPCM_I2CRXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 		val = NPCM_I2CFIF_CTS_CLR_FIFO | NPCM_I2CFIF_CTS_SLVRSTR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 		      NPCM_I2CFIF_CTS_RXF_TXE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 		iowrite8(val, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 		npcm_i2c_slave_rd_wr(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 		ret = IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 	/* A Slave Address Match has been identified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	if (NPCM_I2CST_NMATCH & i2cst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 		u8 info = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 		/* Address match automatically implies slave mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 		bus->master_or_slave = I2C_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 		npcm_i2c_clear_fifo_int(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 		npcm_i2c_clear_rx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 		npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 		iowrite8(0, bus->reg + NPCM_I2CTXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 		iowrite8(I2C_HW_FIFO_SIZE, bus->reg + NPCM_I2CRXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 		if (NPCM_I2CST_XMIT & i2cst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 			bus->operation = I2C_WRITE_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 			i2c_slave_event(bus->slave, I2C_SLAVE_WRITE_REQUESTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 					&info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 			bus->operation = I2C_READ_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 		if (bus->own_slave_addr == 0xFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 			/* Check which type of address match */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 			val = ioread8(bus->reg + NPCM_I2CCST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 			if (NPCM_I2CCST_MATCH & val) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 				u16 addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 				enum i2c_addr eaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 				u8 i2ccst2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 				u8 i2ccst3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 				i2ccst3 = ioread8(bus->reg + NPCM_I2CCST3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 				i2ccst2 = ioread8(bus->reg + NPCM_I2CCST2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 				/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 				 * the i2c module can response to 10 own SA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 				 * check which one was addressed by the master.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 				 * repond to the first one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 				 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 				addr = ((i2ccst3 & 0x07) << 7) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 					(i2ccst2 & 0x7F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 				info = ffs(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 				eaddr = (enum i2c_addr)info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 				addr = npcm_i2c_get_slave_addr(bus, eaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 				addr &= 0x7F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 				bus->own_slave_addr = addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 				if (bus->PEC_mask & BIT(info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 					bus->PEC_use = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 				else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 					bus->PEC_use = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 				if (NPCM_I2CCST_GCMATCH & val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 					bus->own_slave_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 				if (NPCM_I2CCST_ARPMATCH & val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 					bus->own_slave_addr = 0x61;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 			 *  Slave match can happen in two options:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 			 *  1. Start, SA, read (slave read without further ado)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 			 *  2. Start, SA, read, data, restart, SA, read,  ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 			 *     (slave read in fragmented mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 			 *  3. Start, SA, write, data, restart, SA, read, ..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 			 *     (regular write-read mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 			if ((bus->state == I2C_OPER_STARTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 			     bus->operation == I2C_READ_OPER &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 			     bus->stop_ind == I2C_SLAVE_XMIT_IND) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 			     bus->stop_ind == I2C_SLAVE_RCV_IND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 				/* slave tx after slave rx w/o STOP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 				bus->stop_ind = I2C_SLAVE_RESTART_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 		if (NPCM_I2CST_XMIT & i2cst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 			bus->stop_ind = I2C_SLAVE_XMIT_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 			bus->stop_ind = I2C_SLAVE_RCV_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 		bus->state = I2C_SLAVE_MATCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 		npcm_i2c_slave_rd_wr(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 		iowrite8(NPCM_I2CST_NMATCH, bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 		ret = IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 	/* Slave SDA status is set - tx or rx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	if ((NPCM_I2CST_SDAST & i2cst) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 	    (bus->fifo_use &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 	    (npcm_i2c_tx_fifo_empty(bus) || npcm_i2c_rx_fifo_full(bus)))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 		npcm_i2c_slave_rd_wr(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 		iowrite8(NPCM_I2CST_SDAST, bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 		ret = IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 	} /* SDAST */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) static int npcm_i2c_reg_slave(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	unsigned long lock_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	struct npcm_i2c *bus = i2c_get_adapdata(client->adapter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 	bus->slave = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	if (!bus->slave)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	if (client->flags & I2C_CLIENT_TEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 		return -EAFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	spin_lock_irqsave(&bus->lock, lock_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 	npcm_i2c_init_params(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 	bus->slv_rd_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	bus->slv_wr_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 	bus->slv_rd_ind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 	bus->slv_wr_ind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 	if (client->flags & I2C_CLIENT_PEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 		bus->PEC_use = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	dev_info(bus->dev, "i2c%d register slave SA=0x%x, PEC=%d\n", bus->num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 		 client->addr, bus->PEC_use);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 	npcm_i2c_slave_enable(bus, I2C_SLAVE_ADDR1, client->addr, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	npcm_i2c_clear_fifo_int(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	npcm_i2c_clear_rx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 	npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 	npcm_i2c_slave_int_enable(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 	spin_unlock_irqrestore(&bus->lock, lock_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) static int npcm_i2c_unreg_slave(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 	struct npcm_i2c *bus = client->adapter->algo_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	unsigned long lock_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	spin_lock_irqsave(&bus->lock, lock_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 	if (!bus->slave) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 		spin_unlock_irqrestore(&bus->lock, lock_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 	npcm_i2c_slave_int_enable(bus, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 	npcm_i2c_remove_slave_addr(bus, client->addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 	bus->slave = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 	spin_unlock_irqrestore(&bus->lock, lock_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) #endif /* CONFIG_I2C_SLAVE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) static void npcm_i2c_master_fifo_read(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	int rcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 	int fifo_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 	enum i2c_state_ind ind = I2C_MASTER_DONE_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 	fifo_bytes = npcm_i2c_fifo_usage(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 	rcount = bus->rd_size - bus->rd_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 	 * In order not to change the RX_TRH during transaction (we found that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 	 * this might be problematic if it takes too much time to read the FIFO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 	 * we read the data in the following way. If the number of bytes to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 	 * read == FIFO Size + C (where C < FIFO Size)then first read C bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 	 * and in the next int we read rest of the data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 	if (rcount < (2 * I2C_HW_FIFO_SIZE) && rcount > I2C_HW_FIFO_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 		fifo_bytes = rcount - I2C_HW_FIFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 	if (rcount <= fifo_bytes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 		/* last bytes are about to be read - end of tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 		bus->state = I2C_STOP_PENDING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 		bus->stop_ind = ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 		npcm_i2c_eob_int(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 		/* Stop should be set before reading last byte. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 		npcm_i2c_master_stop(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 		npcm_i2c_read_fifo(bus, fifo_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 		npcm_i2c_read_fifo(bus, fifo_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 		rcount = bus->rd_size - bus->rd_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 		npcm_i2c_set_fifo(bus, rcount, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) static void npcm_i2c_irq_master_handler_write(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 	u16 wcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 	if (bus->fifo_use)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 		npcm_i2c_clear_tx_fifo(bus); /* clear the TX fifo status bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 	/* Master write operation - last byte handling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 	if (bus->wr_ind == bus->wr_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 		if (bus->fifo_use && npcm_i2c_fifo_usage(bus) > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 			 * No more bytes to send (to add to the FIFO),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 			 * however the FIFO is not empty yet. It is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 			 * still in the middle of tx. Currently there's nothing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 			 * to do except for waiting to the end of the tx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 			 * We will get an int when the FIFO will get empty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 		if (bus->rd_size == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 			/* all bytes have been written, in wr only operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 			npcm_i2c_eob_int(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 			bus->state = I2C_STOP_PENDING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 			bus->stop_ind = I2C_MASTER_DONE_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 			npcm_i2c_master_stop(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 			/* Clear SDA Status bit (by writing dummy byte) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 			npcm_i2c_wr_byte(bus, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 			/* last write-byte written on previous int - restart */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 			npcm_i2c_set_fifo(bus, bus->rd_size, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 			/* Generate repeated start upon next write to SDA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 			npcm_i2c_master_start(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 			 * Receiving one byte only - stall after successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 			 * completion of send address byte. If we NACK here, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 			 * slave doesn't ACK the address, we might
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 			 * unintentionally NACK the next multi-byte read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 			if (bus->rd_size == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 				npcm_i2c_stall_after_start(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 			/* Next int will occur on read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 			bus->operation = I2C_READ_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 			/* send the slave address in read direction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 			npcm_i2c_wr_byte(bus, bus->dest_addr | 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 		/* write next byte not last byte and not slave address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 		if (!bus->fifo_use || bus->wr_size == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 			npcm_i2c_wr_byte(bus, bus->wr_buf[bus->wr_ind++]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 			wcount = bus->wr_size - bus->wr_ind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 			npcm_i2c_set_fifo(bus, -1, wcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 			if (wcount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 				npcm_i2c_write_to_fifo_master(bus, wcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) static void npcm_i2c_irq_master_handler_read(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	u16 block_extra_bytes_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 	u8 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 	/* added bytes to the packet: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 	block_extra_bytes_size = bus->read_block_use + bus->PEC_use;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 	 * Perform master read, distinguishing between last byte and the rest of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 	 * the bytes. The last byte should be read when the clock is stopped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 	if (bus->rd_ind == 0) { /* first byte handling: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 		if (bus->read_block_use) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 			/* first byte in block protocol is the size: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 			data = npcm_i2c_rd_byte(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 			data = clamp_val(data, 1, I2C_SMBUS_BLOCK_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 			bus->rd_size = data + block_extra_bytes_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 			bus->rd_buf[bus->rd_ind++] = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 			/* clear RX FIFO interrupt status: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 			if (bus->fifo_use) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 				data = ioread8(bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 				data = data | NPCM_I2CFIF_CTS_RXF_TXE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 				iowrite8(data, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 			npcm_i2c_set_fifo(bus, bus->rd_size - 1, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 			npcm_i2c_stall_after_start(bus, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 			npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 			npcm_i2c_master_fifo_read(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 		if (bus->rd_size == block_extra_bytes_size &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 		    bus->read_block_use) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 			bus->state = I2C_STOP_PENDING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 			bus->stop_ind = I2C_BLOCK_BYTES_ERR_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 			bus->cmd_err = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 			npcm_i2c_eob_int(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 			npcm_i2c_master_stop(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 			npcm_i2c_read_fifo(bus, npcm_i2c_fifo_usage(bus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 			npcm_i2c_master_fifo_read(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) static void npcm_i2c_irq_handle_nmatch(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 	iowrite8(NPCM_I2CST_NMATCH, bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 	npcm_i2c_nack(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 	bus->stop_ind = I2C_BUS_ERR_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 	npcm_i2c_callback(bus, bus->stop_ind, npcm_i2c_get_index(bus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) /* A NACK has occurred */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) static void npcm_i2c_irq_handle_nack(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 	if (bus->nack_cnt < ULLONG_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 		bus->nack_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 	if (bus->fifo_use) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 		 * if there are still untransmitted bytes in TX FIFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 		 * reduce them from wr_ind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 		if (bus->operation == I2C_WRITE_OPER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 			bus->wr_ind -= npcm_i2c_fifo_usage(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 		/* clear the FIFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 		iowrite8(NPCM_I2CFIF_CTS_CLR_FIFO, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 	/* In master write operation, got unexpected NACK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 	bus->stop_ind = I2C_NACK_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 	/* Only current master is allowed to issue Stop Condition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 	if (npcm_i2c_is_master(bus)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 		/* stopping in the middle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 		npcm_i2c_eob_int(bus, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 		npcm_i2c_master_stop(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 		 * The bus is released from stall only after the SW clears
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 		 * NEGACK bit. Then a Stop condition is sent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 		npcm_i2c_clear_master_status(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 		readx_poll_timeout_atomic(ioread8, bus->reg + NPCM_I2CCST, val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 					  !(val & NPCM_I2CCST_BUSY), 10, 200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 	bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 	 * In Master mode, NACK should be cleared only after STOP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 	 * In such case, the bus is released from stall only after the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 	 * software clears NACK bit. Then a Stop condition is sent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 	npcm_i2c_callback(bus, bus->stop_ind, bus->wr_ind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 	/* Master mode: a Bus Error has been identified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) static void npcm_i2c_irq_handle_ber(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 	if (bus->ber_cnt < ULLONG_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 		bus->ber_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	bus->stop_ind = I2C_BUS_ERR_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 	if (npcm_i2c_is_master(bus)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 		npcm_i2c_master_abort(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 		npcm_i2c_clear_master_status(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 		/* Clear BB (BUS BUSY) bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 		iowrite8(NPCM_I2CCST_BB, bus->reg + NPCM_I2CCST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 		bus->cmd_err = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 		npcm_i2c_callback(bus, bus->stop_ind, npcm_i2c_get_index(bus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 	bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 	/* EOB: a master End Of Busy (meaning STOP completed) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) static void npcm_i2c_irq_handle_eob(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	npcm_i2c_eob_int(bus, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 	bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 	npcm_i2c_callback(bus, bus->stop_ind, bus->rd_ind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) /* Address sent and requested stall occurred (Master mode) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) static void npcm_i2c_irq_handle_stall_after_start(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 	if (npcm_i2c_is_quick(bus)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 		bus->state = I2C_STOP_PENDING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 		bus->stop_ind = I2C_MASTER_DONE_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 		npcm_i2c_eob_int(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 		npcm_i2c_master_stop(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 	} else if ((bus->rd_size == 1) && !bus->read_block_use) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 		 * Receiving one byte only - set NACK after ensuring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 		 * slave ACKed the address byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 		npcm_i2c_nack(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 	/* Reset stall-after-address-byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 	npcm_i2c_stall_after_start(bus, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 	/* Clear stall only after setting STOP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 	iowrite8(NPCM_I2CST_STASTR, bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) /* SDA status is set - TX or RX, master */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) static void npcm_i2c_irq_handle_sda(struct npcm_i2c *bus, u8 i2cst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 	u8 fif_cts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 	if (!npcm_i2c_is_master(bus))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 	if (bus->state == I2C_IDLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 		bus->stop_ind = I2C_WAKE_UP_IND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 		if (npcm_i2c_is_quick(bus) || bus->read_block_use)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 			 * Need to stall after successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 			 * completion of sending address byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 			npcm_i2c_stall_after_start(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 			npcm_i2c_stall_after_start(bus, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 		 * Receiving one byte only - stall after successful completion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 		 * of sending address byte If we NACK here, and slave doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 		 * ACK the address, we might unintentionally NACK the next
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 		 * multi-byte read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 		if (bus->wr_size == 0 && bus->rd_size == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 			npcm_i2c_stall_after_start(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 		/* Initiate I2C master tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 		/* select bank 1 for FIFO regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) 		npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 		fif_cts = ioread8(bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 		fif_cts = fif_cts & ~NPCM_I2CFIF_CTS_SLVRSTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 		/* clear FIFO and relevant status bits. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 		fif_cts = fif_cts | NPCM_I2CFIF_CTS_CLR_FIFO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 		iowrite8(fif_cts, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 		/* re-enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 		fif_cts = fif_cts | NPCM_I2CFIF_CTS_RXF_TXE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 		iowrite8(fif_cts, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 		 * Configure the FIFO threshold:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 		 * according to the needed # of bytes to read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 		 * Note: due to HW limitation can't config the rx fifo before it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) 		 * got and ACK on the restart. LAST bit will not be reset unless
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) 		 * RX completed. It will stay set on the next tx.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 		if (bus->wr_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 			npcm_i2c_set_fifo(bus, -1, bus->wr_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 			npcm_i2c_set_fifo(bus, bus->rd_size, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 		bus->state = I2C_OPER_STARTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 		if (npcm_i2c_is_quick(bus) || bus->wr_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 			npcm_i2c_wr_byte(bus, bus->dest_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 			npcm_i2c_wr_byte(bus, bus->dest_addr | BIT(0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 	/* SDA interrupt, after start\restart */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 		if (NPCM_I2CST_XMIT & i2cst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 			bus->operation = I2C_WRITE_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 			npcm_i2c_irq_master_handler_write(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 			bus->operation = I2C_READ_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 			npcm_i2c_irq_master_handler_read(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) static int npcm_i2c_int_master_handler(struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 	u8 i2cst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 	int ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 	i2cst = ioread8(bus->reg + NPCM_I2CST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) 	if (FIELD_GET(NPCM_I2CST_NMATCH, i2cst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 		npcm_i2c_irq_handle_nmatch(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 	/* A NACK has occurred */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 	if (FIELD_GET(NPCM_I2CST_NEGACK, i2cst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 		npcm_i2c_irq_handle_nack(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 	/* Master mode: a Bus Error has been identified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 	if (FIELD_GET(NPCM_I2CST_BER, i2cst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) 		npcm_i2c_irq_handle_ber(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 	/* EOB: a master End Of Busy (meaning STOP completed) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 	if ((FIELD_GET(NPCM_I2CCTL1_EOBINTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) 		       ioread8(bus->reg + NPCM_I2CCTL1)) == 1) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) 	    (FIELD_GET(NPCM_I2CCST3_EO_BUSY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 		       ioread8(bus->reg + NPCM_I2CCST3)))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) 		npcm_i2c_irq_handle_eob(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 	/* Address sent and requested stall occurred (Master mode) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 	if (FIELD_GET(NPCM_I2CST_STASTR, i2cst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 		npcm_i2c_irq_handle_stall_after_start(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) 	/* SDA status is set - TX or RX, master */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) 	if (FIELD_GET(NPCM_I2CST_SDAST, i2cst) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) 	    (bus->fifo_use &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) 	    (npcm_i2c_tx_fifo_empty(bus) || npcm_i2c_rx_fifo_full(bus)))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) 		npcm_i2c_irq_handle_sda(bus, i2cst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) /* recovery using TGCLK functionality of the module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) static int npcm_i2c_recovery_tgclk(struct i2c_adapter *_adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) 	u8               val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) 	u8               fif_cts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) 	bool             done = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) 	int              status = -ENOTRECOVERABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) 	struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) 	/* Allow 3 bytes (27 toggles) to be read from the slave: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) 	int              iter = 27;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 	if ((npcm_i2c_get_SDA(_adap) == 1) && (npcm_i2c_get_SCL(_adap) == 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 		dev_dbg(bus->dev, "bus%d recovery skipped, bus not stuck",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 			bus->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 		npcm_i2c_reset(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 		return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 	npcm_i2c_int_enable(bus, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) 	npcm_i2c_disable(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 	npcm_i2c_enable(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) 	iowrite8(NPCM_I2CCST_BB, bus->reg + NPCM_I2CCST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) 	npcm_i2c_clear_tx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) 	npcm_i2c_clear_rx_fifo(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) 	iowrite8(0, bus->reg + NPCM_I2CRXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) 	iowrite8(0, bus->reg + NPCM_I2CTXF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) 	npcm_i2c_stall_after_start(bus, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) 	/* select bank 1 for FIFO regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) 	npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) 	/* clear FIFO and relevant status bits. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) 	fif_cts = ioread8(bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) 	fif_cts &= ~NPCM_I2CFIF_CTS_SLVRSTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) 	fif_cts |= NPCM_I2CFIF_CTS_CLR_FIFO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) 	iowrite8(fif_cts, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) 	npcm_i2c_set_fifo(bus, -1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) 	/* Repeat the following sequence until SDA is released */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 		/* Issue a single SCL toggle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) 		iowrite8(NPCM_I2CCST_TGSCL, bus->reg + NPCM_I2CCST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) 		usleep_range(20, 30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 		/* If SDA line is inactive (high), stop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) 		if (npcm_i2c_get_SDA(_adap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) 			done = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) 			status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) 	} while (!done && iter--);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) 	/* If SDA line is released: send start-addr-stop, to re-sync. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) 	if (npcm_i2c_get_SDA(_adap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) 		/* Send an address byte in write direction: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) 		npcm_i2c_wr_byte(bus, bus->dest_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) 		npcm_i2c_master_start(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) 		/* Wait until START condition is sent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) 		status = readx_poll_timeout(npcm_i2c_get_SCL, _adap, val, !val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) 					    20, 200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) 		/* If START condition was sent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) 		if (npcm_i2c_is_master(bus) > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) 			usleep_range(20, 30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) 			npcm_i2c_master_stop(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) 			usleep_range(200, 500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) 	npcm_i2c_reset(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) 	npcm_i2c_int_enable(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) 	if ((npcm_i2c_get_SDA(_adap) == 1) && (npcm_i2c_get_SCL(_adap) == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) 		status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) 		status = -ENOTRECOVERABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) 	if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) 		if (bus->rec_fail_cnt < ULLONG_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) 			bus->rec_fail_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) 		if (bus->rec_succ_cnt < ULLONG_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) 			bus->rec_succ_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) 	return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) /* recovery using bit banging functionality of the module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) static void npcm_i2c_recovery_init(struct i2c_adapter *_adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) 	struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) 	struct i2c_bus_recovery_info *rinfo = &bus->rinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) 	rinfo->recover_bus = npcm_i2c_recovery_tgclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) 	 * npcm i2c HW allows direct reading of SCL and SDA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) 	 * However, it does not support setting SCL and SDA directly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) 	 * The recovery function can togle SCL when SDA is low (but not set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) 	 * Getter functions used internally, and can be used externaly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) 	rinfo->get_scl = npcm_i2c_get_SCL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) 	rinfo->get_sda = npcm_i2c_get_SDA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) 	_adap->bus_recovery_info = rinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) /* SCLFRQ min/max field values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) #define SCLFRQ_MIN  10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) #define SCLFRQ_MAX  511
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) #define clk_coef(freq, mul)	DIV_ROUND_UP((freq) * (mul), 1000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)  * npcm_i2c_init_clk: init HW timing parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771)  * NPCM7XX i2c module timing parameters are depenent on module core clk (APB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772)  * and bus frequency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773)  * 100kHz bus requires tSCL = 4 * SCLFRQ * tCLK. LT and HT are simetric.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774)  * 400kHz bus requires assymetric HT and LT. A different equation is recomended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)  * by the HW designer, given core clock range (equations in comments below).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) static int npcm_i2c_init_clk(struct npcm_i2c *bus, u32 bus_freq_hz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) 	u32  k1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) 	u32  k2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) 	u8   dbnct = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) 	u32  sclfrq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) 	u8   hldt = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) 	u8   fast_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 	u32  src_clk_khz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) 	u32  bus_freq_khz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) 	src_clk_khz = bus->apb_clk / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) 	bus_freq_khz = bus_freq_hz / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) 	bus->bus_freq = bus_freq_hz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) 	/* 100KHz and below: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) 	if (bus_freq_hz <= I2C_MAX_STANDARD_MODE_FREQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 		sclfrq = src_clk_khz / (bus_freq_khz * 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) 		if (sclfrq < SCLFRQ_MIN || sclfrq > SCLFRQ_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) 			return -EDOM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) 		if (src_clk_khz >= 40000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) 			hldt = 17;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) 		else if (src_clk_khz >= 12500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) 			hldt = 15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) 			hldt = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) 	/* 400KHz: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) 	else if (bus_freq_hz <= I2C_MAX_FAST_MODE_FREQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) 		sclfrq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) 		fast_mode = I2CCTL3_400K_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) 		if (src_clk_khz < 7500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) 			/* 400KHZ cannot be supported for core clock < 7.5MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) 			return -EDOM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) 		else if (src_clk_khz >= 50000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) 			k1 = 80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) 			k2 = 48;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) 			hldt = 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) 			dbnct = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) 		/* Master or Slave with frequency > 25MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) 		else if (src_clk_khz > 25000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) 			hldt = clk_coef(src_clk_khz, 300) + 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) 			k1 = clk_coef(src_clk_khz, 1600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) 			k2 = clk_coef(src_clk_khz, 900);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) 	/* 1MHz: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) 	else if (bus_freq_hz <= I2C_MAX_FAST_MODE_PLUS_FREQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) 		sclfrq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) 		fast_mode = I2CCTL3_400K_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) 		/* 1MHZ cannot be supported for core clock < 24 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) 		if (src_clk_khz < 24000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) 			return -EDOM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) 		k1 = clk_coef(src_clk_khz, 620);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) 		k2 = clk_coef(src_clk_khz, 380);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) 		/* Core clk > 40 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) 		if (src_clk_khz > 40000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) 			 * Set HLDT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) 			 * SDA hold time:  (HLDT-7) * T(CLK) >= 120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) 			 * HLDT = 120/T(CLK) + 7 = 120 * FREQ(CLK) + 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) 			hldt = clk_coef(src_clk_khz, 120) + 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) 			hldt = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) 			dbnct = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 	/* Frequency larger than 1 MHz is not supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) 	if (bus_freq_hz >= I2C_MAX_FAST_MODE_FREQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) 		k1 = round_up(k1, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) 		k2 = round_up(k2 + 1, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) 		if (k1 < SCLFRQ_MIN || k1 > SCLFRQ_MAX ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) 		    k2 < SCLFRQ_MIN || k2 > SCLFRQ_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) 			return -EDOM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) 	/* write sclfrq value. bits [6:0] are in I2CCTL2 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) 	iowrite8(FIELD_PREP(I2CCTL2_SCLFRQ6_0, sclfrq & 0x7F),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) 		 bus->reg + NPCM_I2CCTL2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) 	/* bits [8:7] are in I2CCTL3 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) 	iowrite8(fast_mode | FIELD_PREP(I2CCTL3_SCLFRQ8_7, (sclfrq >> 7) & 0x3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) 		 bus->reg + NPCM_I2CCTL3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) 	/* Select Bank 0 to access NPCM_I2CCTL4/NPCM_I2CCTL5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) 	npcm_i2c_select_bank(bus, I2C_BANK_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) 	if (bus_freq_hz >= I2C_MAX_FAST_MODE_FREQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) 		 * Set SCL Low/High Time:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) 		 * k1 = 2 * SCLLT7-0 -> Low Time  = k1 / 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) 		 * k2 = 2 * SCLLT7-0 -> High Time = k2 / 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) 		iowrite8(k1 / 2, bus->reg + NPCM_I2CSCLLT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) 		iowrite8(k2 / 2, bus->reg + NPCM_I2CSCLHT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) 		iowrite8(dbnct, bus->reg + NPCM_I2CCTL5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) 	iowrite8(hldt, bus->reg + NPCM_I2CCTL4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) 	/* Return to Bank 1, and stay there by default: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) 	npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) static int npcm_i2c_init_module(struct npcm_i2c *bus, enum i2c_mode mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) 				u32 bus_freq_hz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) 	u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) 	/* Check whether module already enabled or frequency is out of bounds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) 	if ((bus->state != I2C_DISABLE && bus->state != I2C_IDLE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 	    bus_freq_hz < I2C_FREQ_MIN_HZ || bus_freq_hz > I2C_FREQ_MAX_HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) 	npcm_i2c_disable(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) 	/* Configure FIFO mode : */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) 	if (FIELD_GET(I2C_VER_FIFO_EN, ioread8(bus->reg + I2C_VER))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) 		bus->fifo_use = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) 		npcm_i2c_select_bank(bus, I2C_BANK_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) 		val = ioread8(bus->reg + NPCM_I2CFIF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) 		val |= NPCM_I2CFIF_CTL_FIFO_EN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) 		iowrite8(val, bus->reg + NPCM_I2CFIF_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) 		npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) 		bus->fifo_use = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) 	/* Configure I2C module clock frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) 	ret = npcm_i2c_init_clk(bus, bus_freq_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) 		dev_err(bus->dev, "npcm_i2c_init_clk failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) 	/* Enable module (before configuring CTL1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) 	npcm_i2c_enable(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) 	bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) 	val = ioread8(bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) 	val = (val | NPCM_I2CCTL1_NMINTE) & ~NPCM_I2CCTL1_RWS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) 	iowrite8(val, bus->reg + NPCM_I2CCTL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) 	npcm_i2c_int_enable(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) 	npcm_i2c_reset(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) static int __npcm_i2c_init(struct npcm_i2c *bus, struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) 	u32 clk_freq_hz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) 	/* Initialize the internal data structures */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) 	bus->state = I2C_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) 	bus->master_or_slave = I2C_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) 	bus->int_time_stamp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) 	bus->slave = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) 	ret = device_property_read_u32(&pdev->dev, "clock-frequency",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) 				       &clk_freq_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) 		dev_info(&pdev->dev, "Could not read clock-frequency property");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) 		clk_freq_hz = I2C_MAX_STANDARD_MODE_FREQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) 	ret = npcm_i2c_init_module(bus, I2C_MASTER, clk_freq_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) 		dev_err(&pdev->dev, "npcm_i2c_init_module failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) static irqreturn_t npcm_i2c_bus_irq(int irq, void *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) 	struct npcm_i2c *bus = dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) 	if (npcm_i2c_is_master(bus))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) 		bus->master_or_slave = I2C_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) 	if (bus->master_or_slave == I2C_MASTER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) 		bus->int_time_stamp = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) 		if (!npcm_i2c_int_master_handler(bus))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) 			return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) 	if (bus->slave) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) 		bus->master_or_slave = I2C_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) 		return npcm_i2c_int_slave_handler(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) 	return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) static bool npcm_i2c_master_start_xmit(struct npcm_i2c *bus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) 				       u8 slave_addr, u16 nwrite, u16 nread,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) 				       u8 *write_data, u8 *read_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) 				       bool use_PEC, bool use_read_block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) 	if (bus->state != I2C_IDLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) 		bus->cmd_err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) 	bus->dest_addr = slave_addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) 	bus->wr_buf = write_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) 	bus->wr_size = nwrite;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) 	bus->wr_ind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) 	bus->rd_buf = read_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) 	bus->rd_size = nread;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) 	bus->rd_ind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) 	bus->PEC_use = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) 	/* for tx PEC is appended to buffer from i2c IF. PEC flag is ignored */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) 	if (nread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) 		bus->PEC_use = use_PEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) 	bus->read_block_use = use_read_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) 	if (nread && !nwrite)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) 		bus->operation = I2C_READ_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) 		bus->operation = I2C_WRITE_OPER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) 	if (bus->fifo_use) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) 		u8 i2cfif_cts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) 		npcm_i2c_select_bank(bus, I2C_BANK_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) 		/* clear FIFO and relevant status bits. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) 		i2cfif_cts = ioread8(bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) 		i2cfif_cts &= ~NPCM_I2CFIF_CTS_SLVRSTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) 		i2cfif_cts |= NPCM_I2CFIF_CTS_CLR_FIFO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) 		iowrite8(i2cfif_cts, bus->reg + NPCM_I2CFIF_CTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) 	bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) 	npcm_i2c_stall_after_start(bus, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) 	npcm_i2c_master_start(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) static int npcm_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) 				int num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) 	struct npcm_i2c *bus = container_of(adap, struct npcm_i2c, adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) 	struct i2c_msg *msg0, *msg1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 	unsigned long time_left, flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 	u16 nwrite, nread;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) 	u8 *write_data, *read_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) 	u8 slave_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) 	int timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) 	bool read_block = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) 	bool read_PEC = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) 	u8 bus_busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) 	unsigned long timeout_usec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) 	if (bus->state == I2C_DISABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) 		dev_err(bus->dev, "I2C%d module is disabled", bus->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) 	msg0 = &msgs[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) 	slave_addr = msg0->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) 	if (msg0->flags & I2C_M_RD) { /* read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) 		nwrite = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) 		write_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) 		read_data = msg0->buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) 		if (msg0->flags & I2C_M_RECV_LEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) 			nread = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) 			read_block = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) 			if (msg0->flags & I2C_CLIENT_PEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) 				read_PEC = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) 			nread = msg0->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) 	} else { /* write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) 		nwrite = msg0->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) 		write_data = msg0->buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) 		nread = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) 		read_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) 		if (num == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) 			msg1 = &msgs[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) 			read_data = msg1->buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) 			if (msg1->flags & I2C_M_RECV_LEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) 				nread = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) 				read_block = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) 				if (msg1->flags & I2C_CLIENT_PEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) 					read_PEC = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) 				nread = msg1->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) 				read_block = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) 	 * Adaptive TimeOut: estimated time in usec + 100% margin:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) 	 * 2: double the timeout for clock stretching case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) 	 * 9: bits per transaction (including the ack/nack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) 	timeout_usec = (2 * 9 * USEC_PER_SEC / bus->bus_freq) * (2 + nread + nwrite);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) 	timeout = max(msecs_to_jiffies(35), usecs_to_jiffies(timeout_usec));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) 	if (nwrite >= 32 * 1024 || nread >= 32 * 1024) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) 		dev_err(bus->dev, "i2c%d buffer too big\n", bus->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) 	time_left = jiffies + msecs_to_jiffies(DEFAULT_STALL_COUNT) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) 		 * we must clear slave address immediately when the bus is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) 		 * busy, so we spinlock it, but we don't keep the lock for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) 		 * entire while since it is too long.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) 		spin_lock_irqsave(&bus->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) 		bus_busy = ioread8(bus->reg + NPCM_I2CCST) & NPCM_I2CCST_BB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) 		if (!bus_busy && bus->slave)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) 			iowrite8((bus->slave->addr & 0x7F),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) 				 bus->reg + NPCM_I2CADDR1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) 		spin_unlock_irqrestore(&bus->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) 	} while (time_is_after_jiffies(time_left) && bus_busy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) 	if (bus_busy) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) 		iowrite8(NPCM_I2CCST_BB, bus->reg + NPCM_I2CCST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) 		npcm_i2c_reset(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) 		i2c_recover_bus(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) 		return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) 	npcm_i2c_init_params(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) 	bus->dest_addr = slave_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) 	bus->msgs = msgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) 	bus->msgs_num = num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) 	bus->cmd_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) 	bus->read_block_use = read_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) 	reinit_completion(&bus->cmd_complete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) 	if (!npcm_i2c_master_start_xmit(bus, slave_addr, nwrite, nread,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) 					write_data, read_data, read_PEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) 					read_block))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) 		ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) 	if (ret != -EBUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) 		time_left = wait_for_completion_timeout(&bus->cmd_complete,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) 							timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) 		if (time_left == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) 			if (bus->timeout_cnt < ULLONG_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 				bus->timeout_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) 			if (bus->master_or_slave == I2C_MASTER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) 				i2c_recover_bus(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) 				bus->cmd_err = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) 				bus->state = I2C_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) 	ret = bus->cmd_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 	/* if there was BER, check if need to recover the bus: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) 	if (bus->cmd_err == -EAGAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) 		ret = i2c_recover_bus(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 	 * After any type of error, check if LAST bit is still set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) 	 * due to a HW issue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) 	 * It cannot be cleared without resetting the module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) 	if (bus->cmd_err &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) 	    (NPCM_I2CRXF_CTL_LAST_PEC & ioread8(bus->reg + NPCM_I2CRXF_CTL)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) 		npcm_i2c_reset(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) 	/* reenable slave if it was enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) 	if (bus->slave)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) 		iowrite8((bus->slave->addr & 0x7F) | NPCM_I2CADDR_SAEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) 			 bus->reg + NPCM_I2CADDR1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) 	return bus->cmd_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) static u32 npcm_i2c_functionality(struct i2c_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) 	return I2C_FUNC_I2C |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) 	       I2C_FUNC_SMBUS_EMUL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) 	       I2C_FUNC_SMBUS_BLOCK_DATA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) 	       I2C_FUNC_SMBUS_PEC |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) 	       I2C_FUNC_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) static const struct i2c_adapter_quirks npcm_i2c_quirks = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) 	.max_read_len = 32768,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) 	.max_write_len = 32768,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) 	.flags = I2C_AQ_COMB_WRITE_THEN_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) static const struct i2c_algorithm npcm_i2c_algo = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) 	.master_xfer = npcm_i2c_master_xfer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) 	.functionality = npcm_i2c_functionality,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) #if IS_ENABLED(CONFIG_I2C_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 	.reg_slave	= npcm_i2c_reg_slave,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) 	.unreg_slave	= npcm_i2c_unreg_slave,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) /* i2c debugfs directory: used to keep health monitor of i2c devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) static struct dentry *npcm_i2c_debugfs_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) static void npcm_i2c_init_debugfs(struct platform_device *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) 				  struct npcm_i2c *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) 	struct dentry *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) 	if (!npcm_i2c_debugfs_dir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) 	d = debugfs_create_dir(dev_name(&pdev->dev), npcm_i2c_debugfs_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) 	if (IS_ERR_OR_NULL(d))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) 	debugfs_create_u64("ber_cnt", 0444, d, &bus->ber_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) 	debugfs_create_u64("nack_cnt", 0444, d, &bus->nack_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) 	debugfs_create_u64("rec_succ_cnt", 0444, d, &bus->rec_succ_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) 	debugfs_create_u64("rec_fail_cnt", 0444, d, &bus->rec_fail_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) 	debugfs_create_u64("timeout_cnt", 0444, d, &bus->timeout_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) 	bus->debugfs = d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) static int npcm_i2c_probe_bus(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) 	struct npcm_i2c *bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) 	struct i2c_adapter *adap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) 	struct clk *i2c_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) 	static struct regmap *gcr_regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) 	static struct regmap *clk_regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) 	int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) 	bus = devm_kzalloc(&pdev->dev, sizeof(*bus), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) 	if (!bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) 	bus->dev = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) 	bus->num = of_alias_get_id(pdev->dev.of_node, "i2c");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) 	/* core clk must be acquired to calculate module timing settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) 	i2c_clk = devm_clk_get(&pdev->dev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) 	if (IS_ERR(i2c_clk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) 		return PTR_ERR(i2c_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) 	bus->apb_clk = clk_get_rate(i2c_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) 	gcr_regmap = syscon_regmap_lookup_by_compatible("nuvoton,npcm750-gcr");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) 	if (IS_ERR(gcr_regmap))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) 		return PTR_ERR(gcr_regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) 	regmap_write(gcr_regmap, NPCM_I2CSEGCTL, NPCM_I2CSEGCTL_INIT_VAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) 	clk_regmap = syscon_regmap_lookup_by_compatible("nuvoton,npcm750-clk");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) 	if (IS_ERR(clk_regmap))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) 		return PTR_ERR(clk_regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) 	bus->reg = devm_platform_ioremap_resource(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) 	if (IS_ERR(bus->reg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) 		return PTR_ERR(bus->reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) 	spin_lock_init(&bus->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) 	init_completion(&bus->cmd_complete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) 	adap = &bus->adap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 	adap->owner = THIS_MODULE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) 	adap->retries = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) 	adap->timeout = HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) 	adap->algo = &npcm_i2c_algo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) 	adap->quirks = &npcm_i2c_quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) 	adap->algo_data = bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) 	adap->dev.parent = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) 	adap->dev.of_node = pdev->dev.of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) 	adap->nr = pdev->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) 	irq = platform_get_irq(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) 	if (irq < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) 		return irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) 	ret = devm_request_irq(bus->dev, irq, npcm_i2c_bus_irq, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) 			       dev_name(bus->dev), bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) 	ret = __npcm_i2c_init(bus, pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) 	npcm_i2c_recovery_init(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) 	i2c_set_adapdata(adap, bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) 	snprintf(bus->adap.name, sizeof(bus->adap.name), "npcm_i2c_%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) 		 bus->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) 	ret = i2c_add_numbered_adapter(&bus->adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) 	platform_set_drvdata(pdev, bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) 	npcm_i2c_init_debugfs(pdev, bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) static int npcm_i2c_remove_bus(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) 	unsigned long lock_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) 	struct npcm_i2c *bus = platform_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) 	debugfs_remove_recursive(bus->debugfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) 	spin_lock_irqsave(&bus->lock, lock_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) 	npcm_i2c_disable(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) 	spin_unlock_irqrestore(&bus->lock, lock_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) 	i2c_del_adapter(&bus->adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) static const struct of_device_id npcm_i2c_bus_of_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) 	{ .compatible = "nuvoton,npcm750-i2c", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) 	{}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) MODULE_DEVICE_TABLE(of, npcm_i2c_bus_of_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) static struct platform_driver npcm_i2c_bus_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) 	.probe = npcm_i2c_probe_bus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) 	.remove = npcm_i2c_remove_bus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) 	.driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) 		.name = "nuvoton-i2c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) 		.of_match_table = npcm_i2c_bus_of_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) static int __init npcm_i2c_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) 	npcm_i2c_debugfs_dir = debugfs_create_dir("npcm_i2c", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) 	platform_driver_register(&npcm_i2c_bus_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) module_init(npcm_i2c_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) static void __exit npcm_i2c_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) 	platform_driver_unregister(&npcm_i2c_bus_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) 	debugfs_remove_recursive(npcm_i2c_debugfs_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) module_exit(npcm_i2c_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) MODULE_AUTHOR("Avi Fishman <avi.fishman@gmail.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) MODULE_AUTHOR("Tali Perry <tali.perry@nuvoton.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) MODULE_AUTHOR("Tyrone Ting <kfting@nuvoton.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) MODULE_DESCRIPTION("Nuvoton I2C Bus Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) MODULE_LICENSE("GPL v2");