9 #include <linux/module.h>
10 #include <linux/slab.h>
12 #include <linux/i2c.h>
15 #define PIC32_I2CxCON 0x0000
16 #define PIC32_I2CCON_ON (1<<15)
17 #define PIC32_I2CCON_ACKDT (1<<5)
18 #define PIC32_I2CCON_ACKEN (1<<4)
19 #define PIC32_I2CCON_RCEN (1<<3)
20 #define PIC32_I2CCON_PEN (1<<2)
21 #define PIC32_I2CCON_RSEN (1<<1)
22 #define PIC32_I2CCON_SEN (1<<0)
23 #define PIC32_I2CxCONCLR 0x0004
24 #define PIC32_I2CxCONSET 0x0008
25 #define PIC32_I2CxSTAT 0x0010
26 #define PIC32_I2CxSTATCLR 0x0014
27 #define PIC32_I2CSTAT_ACKSTAT (1<<15)
28 #define PIC32_I2CSTAT_TRSTAT (1<<14)
29 #define PIC32_I2CSTAT_BCL (1<<10)
30 #define PIC32_I2CSTAT_IWCOL (1<<7)
31 #define PIC32_I2CSTAT_I2COV (1<<6)
32 #define PIC32_I2CxBRG 0x0040
33 #define PIC32_I2CxTRN 0x0050
34 #define PIC32_I2CxRCV 0x0060
41 #define DELAY() udelay(100)
43 static inline unsigned int ioready(
void)
45 return readl(bus_status) & 1;
48 static inline void wait_ioready(
void)
50 do { }
while (!ioready());
53 static inline void wait_ioclear(
void)
55 do { }
while (ioready());
58 static inline void check_ioclear(
void)
76 writel((0x01 << 24) | (reg & 0x00ffffff), bus_xfer);
79 status =
readl(bus_xfer);
81 val =
readl(bus_xfer);
84 spin_unlock_irqrestore(&pic32_bus_lock, flags);
89 static void pic32_bus_writel(
u32 val,
u32 reg)
97 writel((0x10 << 24) | (reg & 0x00ffffff), bus_xfer);
102 status =
readl(bus_xfer);
105 spin_unlock_irqrestore(&pic32_bus_lock, flags);
173 unsigned int addr,
int rd)
175 pic32_i2c_idle(adap);
176 pic32_i2c_start(adap);
177 pic32_i2c_idle(adap);
183 if (pic32_i2c_master_write(adap, addr))
185 pic32_i2c_idle(adap);
193 unsigned char *
buf,
unsigned int len)
200 data = pic32_i2c_master_read(adap);
205 pic32_i2c_nack(adap);
208 pic32_i2c_stop(adap);
209 pic32_i2c_idle(adap);
214 unsigned char *buf,
unsigned int len)
222 if (pic32_i2c_master_write(adap, data))
224 pic32_i2c_idle(adap);
231 pic32_i2c_stop(adap);
232 pic32_i2c_idle(adap);
236 static int sead3_pic32_platform_xfer(
struct i2c_adapter *i2c_adap,
243 for (i = 0; i < num; i++) {
252 for (ii = 0; ii < p->
len; ii++) {
253 if (b < &buf[__BUFSIZE-4]) {
263 for (i = 0; !err && i < num; i++) {
269 err = sead3_i2c_read(adap, p->
buf, p->
len);
271 err = sead3_i2c_write(adap, p->
buf, p->
len);
287 .master_xfer = sead3_pic32_platform_xfer,
288 .functionality = sead3_pic32_platform_func,
329 priv->
adap.algo = &sead3_platform_algo;
331 priv->
adap.dev.parent = &pdev->
dev;
334 sead3_i2c_platform_setup(priv);
338 platform_set_drvdata(pdev, priv);
352 platform_set_drvdata(pdev,
NULL);
362 dev_dbg(&pdev->
dev,
"i2c_platform_disable\n");
370 dev_dbg(&pdev->
dev,
"sead3_i2c_platform_setup\n");
371 sead3_i2c_platform_setup(priv);
376 #define sead3_i2c_platform_suspend NULL
377 #define sead3_i2c_platform_resume NULL
385 .probe = sead3_i2c_platform_probe,
391 static int __init sead3_i2c_platform_init(
void)
397 static void __exit sead3_i2c_platform_exit(
void)