@@ -49,8 +49,7 @@ struct viai2c_zhaoxin {
4949 u16 xfer_len ;
5050};
5151
52- /* 'irq == true' means in interrupt context */
53- int viai2c_fifo_irq_xfer (struct viai2c * i2c , bool irq )
52+ static int viai2c_fifo_xfer (struct viai2c * i2c )
5453{
5554 u16 i ;
5655 u8 tmp ;
@@ -59,17 +58,6 @@ int viai2c_fifo_irq_xfer(struct viai2c *i2c, bool irq)
5958 bool read = !!(msg -> flags & I2C_M_RD );
6059 struct viai2c_zhaoxin * priv = i2c -> pltfm_priv ;
6160
62- if (irq ) {
63- /* get the received data */
64- if (read )
65- for (i = 0 ; i < priv -> xfer_len ; i ++ )
66- msg -> buf [i2c -> xfered_len + i ] = ioread8 (base + ZXI2C_REG_HRDR );
67-
68- i2c -> xfered_len += priv -> xfer_len ;
69- if (i2c -> xfered_len == msg -> len )
70- return 1 ;
71- }
72-
7361 /* reset fifo buffer */
7462 tmp = ioread8 (base + ZXI2C_REG_HCR );
7563 iowrite8 (tmp | ZXI2C_HCR_RST_FIFO , base + ZXI2C_REG_HCR );
@@ -92,18 +80,59 @@ int viai2c_fifo_irq_xfer(struct viai2c *i2c, bool irq)
9280 iowrite8 (tmp , base + VIAI2C_REG_CR );
9381 }
9482
95- if (irq ) {
96- /* continue transmission */
97- tmp = ioread8 (base + VIAI2C_REG_CR );
98- iowrite8 (tmp |= VIAI2C_CR_CPU_RDY , base + VIAI2C_REG_CR );
83+ u16 tcr_val = i2c -> tcr ;
84+
85+ /* start transmission */
86+ tcr_val |= read ? VIAI2C_TCR_READ : 0 ;
87+ writew (tcr_val | msg -> addr , base + VIAI2C_REG_TCR );
88+
89+ return 0 ;
90+ }
91+
92+ static int viai2c_fifo_irq_xfer (struct viai2c * i2c )
93+ {
94+ u16 i ;
95+ u8 tmp ;
96+ struct i2c_msg * msg = i2c -> msg ;
97+ void __iomem * base = i2c -> base ;
98+ bool read = !!(msg -> flags & I2C_M_RD );
99+ struct viai2c_zhaoxin * priv = i2c -> pltfm_priv ;
100+
101+ /* get the received data */
102+ if (read )
103+ for (i = 0 ; i < priv -> xfer_len ; i ++ )
104+ msg -> buf [i2c -> xfered_len + i ] = ioread8 (base + ZXI2C_REG_HRDR );
105+
106+ i2c -> xfered_len += priv -> xfer_len ;
107+ if (i2c -> xfered_len == msg -> len )
108+ return 1 ;
109+
110+ /* reset fifo buffer */
111+ tmp = ioread8 (base + ZXI2C_REG_HCR );
112+ iowrite8 (tmp | ZXI2C_HCR_RST_FIFO , base + ZXI2C_REG_HCR );
113+
114+ /* set xfer len */
115+ priv -> xfer_len = min_t (u16 , msg -> len - i2c -> xfered_len , ZXI2C_FIFO_SIZE );
116+ if (read ) {
117+ iowrite8 (priv -> xfer_len - 1 , base + ZXI2C_REG_HRLR );
99118 } else {
100- u16 tcr_val = i2c -> tcr ;
119+ iowrite8 (priv -> xfer_len - 1 , base + ZXI2C_REG_HTLR );
120+ /* set write data */
121+ for (i = 0 ; i < priv -> xfer_len ; i ++ )
122+ iowrite8 (msg -> buf [i2c -> xfered_len + i ], base + ZXI2C_REG_HTDR );
123+ }
101124
102- /* start transmission */
103- tcr_val |= read ? VIAI2C_TCR_READ : 0 ;
104- writew (tcr_val | msg -> addr , base + VIAI2C_REG_TCR );
125+ /* prepare to stop transmission */
126+ if (priv -> hrv && msg -> len == (i2c -> xfered_len + priv -> xfer_len )) {
127+ tmp = ioread8 (base + VIAI2C_REG_CR );
128+ tmp |= read ? VIAI2C_CR_RX_END : VIAI2C_CR_TX_END ;
129+ iowrite8 (tmp , base + VIAI2C_REG_CR );
105130 }
106131
132+ /* continue transmission */
133+ tmp = ioread8 (base + VIAI2C_REG_CR );
134+ iowrite8 (tmp |= VIAI2C_CR_CPU_RDY , base + VIAI2C_REG_CR );
135+
107136 return 0 ;
108137}
109138
@@ -135,7 +164,7 @@ static int zxi2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int
135164 priv -> xfer_len = 0 ;
136165 i2c -> xfered_len = 0 ;
137166
138- viai2c_fifo_irq_xfer (i2c , 0 );
167+ viai2c_fifo_xfer (i2c );
139168
140169 if (!wait_for_completion_timeout (& i2c -> complete , VIAI2C_TIMEOUT ))
141170 return - ETIMEDOUT ;
@@ -228,6 +257,36 @@ static void zxi2c_get_bus_speed(struct viai2c *i2c)
228257 dev_info (i2c -> dev , "speed mode is %s\n" , i2c_freq_mode_string (params [0 ]));
229258}
230259
260+ static irqreturn_t zxi2c_isr (int irq , void * data )
261+ {
262+ struct viai2c * i2c = data ;
263+ u8 status ;
264+
265+ /* save the status and write-clear it */
266+ status = readw (i2c -> base + VIAI2C_REG_ISR );
267+ if (!status )
268+ return IRQ_NONE ;
269+
270+ writew (status , i2c -> base + VIAI2C_REG_ISR );
271+
272+ i2c -> ret = 0 ;
273+ if (status & VIAI2C_ISR_NACK_ADDR )
274+ i2c -> ret = - EIO ;
275+
276+ if (!i2c -> ret ) {
277+ if (i2c -> mode == VIAI2C_BYTE_MODE )
278+ i2c -> ret = viai2c_irq_xfer (i2c );
279+ else
280+ i2c -> ret = viai2c_fifo_irq_xfer (i2c );
281+ }
282+
283+ /* All the data has been successfully transferred or error occurred */
284+ if (i2c -> ret )
285+ complete (& i2c -> complete );
286+
287+ return IRQ_HANDLED ;
288+ }
289+
231290static int zxi2c_probe (struct platform_device * pdev )
232291{
233292 int error ;
@@ -239,6 +298,16 @@ static int zxi2c_probe(struct platform_device *pdev)
239298 if (error )
240299 return error ;
241300
301+ i2c -> irq = platform_get_irq (pdev , 0 );
302+ if (i2c -> irq < 0 )
303+ return i2c -> irq ;
304+
305+ error = devm_request_irq (& pdev -> dev , i2c -> irq , zxi2c_isr ,
306+ IRQF_SHARED , pdev -> name , i2c );
307+ if (error )
308+ return dev_err_probe (& pdev -> dev , error ,
309+ "failed to request irq %i\n" , i2c -> irq );
310+
242311 priv = devm_kzalloc (& pdev -> dev , sizeof (* priv ), GFP_KERNEL );
243312 if (!priv )
244313 return - ENOMEM ;
0 commit comments