2 * i2c-algo-pca.c i2c driver algorithms for PCA9564 adapters
3 * Copyright (C) 2004 Arcom Control Systems
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include <linux/kernel.h>
21 #include <linux/module.h>
22 #include <linux/moduleparam.h>
23 #include <linux/delay.h>
24 #include <linux/slab.h>
25 #include <linux/init.h>
26 #include <linux/errno.h>
27 #include <linux/i2c.h>
28 #include <linux/i2c-algo-pca.h>
29 #include "i2c-algo-pca.h"
31 #define DRIVER "i2c-algo-pca"
33 #define DEB1(fmt, args...) do { if (i2c_debug>=1) printk(fmt, ## args); } while(0)
34 #define DEB2(fmt, args...) do { if (i2c_debug>=2) printk(fmt, ## args); } while(0)
35 #define DEB3(fmt, args...) do { if (i2c_debug>=3) printk(fmt, ## args); } while(0)
37 static int i2c_debug
=0;
39 #define pca_outw(adap, reg, val) adap->write_byte(adap, reg, val)
40 #define pca_inw(adap, reg) adap->read_byte(adap, reg)
42 #define pca_status(adap) pca_inw(adap, I2C_PCA_STA)
43 #define pca_clock(adap) adap->get_clock(adap)
44 #define pca_own(adap) adap->get_own(adap)
45 #define pca_set_con(adap, val) pca_outw(adap, I2C_PCA_CON, val)
46 #define pca_get_con(adap) pca_inw(adap, I2C_PCA_CON)
47 #define pca_wait(adap) adap->wait_for_interrupt(adap)
50 * Generate a start condition on the i2c bus.
52 * returns after the start condition has occured
54 static void pca_start(struct i2c_algo_pca_data
*adap
)
56 int sta
= pca_get_con(adap
);
58 sta
|= I2C_PCA_CON_STA
;
59 sta
&= ~(I2C_PCA_CON_STO
|I2C_PCA_CON_SI
);
60 pca_set_con(adap
, sta
);
65 * Generate a repeated start condition on the i2c bus
67 * return after the repeated start condition has occured
69 static void pca_repeated_start(struct i2c_algo_pca_data
*adap
)
71 int sta
= pca_get_con(adap
);
72 DEB2("=== REPEATED START\n");
73 sta
|= I2C_PCA_CON_STA
;
74 sta
&= ~(I2C_PCA_CON_STO
|I2C_PCA_CON_SI
);
75 pca_set_con(adap
, sta
);
80 * Generate a stop condition on the i2c bus
82 * returns after the stop condition has been generated
84 * STOPs do not generate an interrupt or set the SI flag, since the
85 * part returns the the idle state (0xf8). Hence we don't need to
88 static void pca_stop(struct i2c_algo_pca_data
*adap
)
90 int sta
= pca_get_con(adap
);
92 sta
|= I2C_PCA_CON_STO
;
93 sta
&= ~(I2C_PCA_CON_STA
|I2C_PCA_CON_SI
);
94 pca_set_con(adap
, sta
);
98 * Send the slave address and R/W bit
100 * returns after the address has been sent
102 static void pca_address(struct i2c_algo_pca_data
*adap
,
105 int sta
= pca_get_con(adap
);
108 addr
= ( (0x7f & msg
->addr
) << 1 );
109 if (msg
->flags
& I2C_M_RD
)
111 DEB2("=== SLAVE ADDRESS %#04x+%c=%#04x\n",
112 msg
->addr
, msg
->flags
& I2C_M_RD
? 'R' : 'W', addr
);
114 pca_outw(adap
, I2C_PCA_DAT
, addr
);
116 sta
&= ~(I2C_PCA_CON_STO
|I2C_PCA_CON_STA
|I2C_PCA_CON_SI
);
117 pca_set_con(adap
, sta
);
125 * Returns after the byte has been transmitted
127 static void pca_tx_byte(struct i2c_algo_pca_data
*adap
,
130 int sta
= pca_get_con(adap
);
131 DEB2("=== WRITE %#04x\n", b
);
132 pca_outw(adap
, I2C_PCA_DAT
, b
);
134 sta
&= ~(I2C_PCA_CON_STO
|I2C_PCA_CON_STA
|I2C_PCA_CON_SI
);
135 pca_set_con(adap
, sta
);
143 * returns immediately.
145 static void pca_rx_byte(struct i2c_algo_pca_data
*adap
,
148 *b
= pca_inw(adap
, I2C_PCA_DAT
);
149 DEB2("=== READ %#04x %s\n", *b
, ack
? "ACK" : "NACK");
153 * Setup ACK or NACK for next received byte and wait for it to arrive.
155 * Returns after next byte has arrived.
157 static void pca_rx_ack(struct i2c_algo_pca_data
*adap
,
160 int sta
= pca_get_con(adap
);
162 sta
&= ~(I2C_PCA_CON_STO
|I2C_PCA_CON_STA
|I2C_PCA_CON_SI
|I2C_PCA_CON_AA
);
165 sta
|= I2C_PCA_CON_AA
;
167 pca_set_con(adap
, sta
);
172 * Reset the i2c bus / SIO
174 static void pca_reset(struct i2c_algo_pca_data
*adap
)
176 /* apparently only an external reset will do it. not a lot can be done */
177 printk(KERN_ERR DRIVER
": Haven't figured out how to do a reset yet\n");
180 static int pca_xfer(struct i2c_adapter
*i2c_adap
,
181 struct i2c_msg
*msgs
,
184 struct i2c_algo_pca_data
*adap
= i2c_adap
->algo_data
;
185 struct i2c_msg
*msg
= NULL
;
191 state
= pca_status(adap
);
192 if ( state
!= 0xF8 ) {
193 dev_dbg(&i2c_adap
->dev
, "bus is not idle. status is %#04x\n", state
);
194 /* FIXME: what to do. Force stop ? */
198 DEB1("{{{ XFER %d messages\n", num
);
201 for (curmsg
= 0; curmsg
< num
; curmsg
++) {
205 addr
= (0x7f & msg
->addr
) ;
207 if (msg
->flags
& I2C_M_RD
)
208 printk(KERN_INFO
" [%02d] RD %d bytes from %#02x [%#02x, ...]\n",
209 curmsg
, msg
->len
, addr
, (addr
<<1) | 1);
211 printk(KERN_INFO
" [%02d] WR %d bytes to %#02x [%#02x%s",
212 curmsg
, msg
->len
, addr
, addr
<<1,
213 msg
->len
== 0 ? "" : ", ");
214 for(i
=0; i
< msg
->len
; i
++)
215 printk("%#04x%s", msg
->buf
[i
], i
== msg
->len
- 1 ? "" : ", ");
223 while (curmsg
< num
) {
224 state
= pca_status(adap
);
226 DEB3("STATE is 0x%02x\n", state
);
230 case 0xf8: /* On reset or stop the bus is idle */
234 case 0x08: /* A START condition has been transmitted */
235 case 0x10: /* A repeated start condition has been transmitted */
236 pca_address(adap
, msg
);
239 case 0x18: /* SLA+W has been transmitted; ACK has been received */
240 case 0x28: /* Data byte in I2CDAT has been transmitted; ACK has been received */
241 if (numbytes
< msg
->len
) {
242 pca_tx_byte(adap
, msg
->buf
[numbytes
]);
246 curmsg
++; numbytes
= 0;
250 pca_repeated_start(adap
);
253 case 0x20: /* SLA+W has been transmitted; NOT ACK has been received */
254 DEB2("NOT ACK received after SLA+W\n");
258 case 0x40: /* SLA+R has been transmitted; ACK has been received */
259 pca_rx_ack(adap
, msg
->len
> 1);
262 case 0x50: /* Data bytes has been received; ACK has been returned */
263 if (numbytes
< msg
->len
) {
264 pca_rx_byte(adap
, &msg
->buf
[numbytes
], 1);
266 pca_rx_ack(adap
, numbytes
< msg
->len
- 1);
269 curmsg
++; numbytes
= 0;
273 pca_repeated_start(adap
);
276 case 0x48: /* SLA+R has been transmitted; NOT ACK has been received */
277 DEB2("NOT ACK received after SLA+R\n");
281 case 0x30: /* Data byte in I2CDAT has been transmitted; NOT ACK has been received */
282 DEB2("NOT ACK received after data byte\n");
285 case 0x38: /* Arbitration lost during SLA+W, SLA+R or data bytes */
286 DEB2("Arbitration lost\n");
289 case 0x58: /* Data byte has been received; NOT ACK has been returned */
290 if ( numbytes
== msg
->len
- 1 ) {
291 pca_rx_byte(adap
, &msg
->buf
[numbytes
], 0);
292 curmsg
++; numbytes
= 0;
296 pca_repeated_start(adap
);
298 DEB2("NOT ACK sent after data byte received. "
299 "Not final byte. numbytes %d. len %d\n",
305 case 0x70: /* Bus error - SDA stuck low */
306 DEB2("BUS ERROR - SDA Stuck low\n");
309 case 0x90: /* Bus error - SCL stuck low */
310 DEB2("BUS ERROR - SCL Stuck low\n");
313 case 0x00: /* Bus error during master or slave mode due to illegal START or STOP condition */
314 DEB2("BUS ERROR - Illegal START or STOP\n");
318 printk(KERN_ERR DRIVER
": unhandled SIO state 0x%02x\n", state
);
326 DEB1(KERN_CRIT
"}}} transfered %d/%d messages. "
327 "status is %#04x. control is %#04x\n",
328 curmsg
, num
, pca_status(adap
),
333 static u32
pca_func(struct i2c_adapter
*adap
)
335 return I2C_FUNC_I2C
| I2C_FUNC_SMBUS_EMUL
;
338 static int pca_init(struct i2c_algo_pca_data
*adap
)
340 static int freqs
[] = {330,288,217,146,88,59,44,36};
344 clock
= pca_clock(adap
);
345 DEB1(KERN_INFO DRIVER
": own address is %#04x\n", own
);
346 DEB1(KERN_INFO DRIVER
": clock freqeuncy is %dkHz\n", freqs
[clock
]);
348 pca_outw(adap
, I2C_PCA_ADR
, own
<< 1);
350 pca_set_con(adap
, I2C_PCA_CON_ENSIO
| clock
);
351 udelay(500); /* 500 µs for oscilator to stabilise */
356 static struct i2c_algorithm pca_algo
= {
357 .name
= "PCA9564 algorithm",
359 .master_xfer
= pca_xfer
,
360 .functionality
= pca_func
,
364 * registering functions to load algorithms at runtime
366 int i2c_pca_add_bus(struct i2c_adapter
*adap
)
368 struct i2c_algo_pca_data
*pca_adap
= adap
->algo_data
;
371 /* register new adapter to i2c module... */
373 adap
->id
|= pca_algo
.id
;
374 adap
->algo
= &pca_algo
;
376 adap
->timeout
= 100; /* default values, should */
377 adap
->retries
= 3; /* be replaced by defines */
379 rval
= pca_init(pca_adap
);
382 i2c_add_adapter(adap
);
387 int i2c_pca_del_bus(struct i2c_adapter
*adap
)
389 return i2c_del_adapter(adap
);
392 EXPORT_SYMBOL(i2c_pca_add_bus
);
393 EXPORT_SYMBOL(i2c_pca_del_bus
);
395 MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>");
396 MODULE_DESCRIPTION("I2C-Bus PCA9564 algorithm");
397 MODULE_LICENSE("GPL");
399 module_param(i2c_debug
, int, 0);