diff options
author | Paul Mackerras <paulus@samba.org> | 2006-07-31 20:37:25 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-07-31 20:37:25 -0400 |
commit | 57cad8084e0837e0f2c97da789ec9b3f36809be9 (patch) | |
tree | e9c790afb4286f78cb08d9664f58baa7e876fe55 /drivers/i2c | |
parent | cb18bd40030c879cd93fef02fd579f74dbab473d (diff) | |
parent | 49b1e3ea19b1c95c2f012b8331ffb3b169e4c042 (diff) |
Merge branch 'merge'
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/algos/i2c-algo-bit.c | 4 | ||||
-rw-r--r-- | drivers/i2c/algos/i2c-algo-ite.c | 4 | ||||
-rw-r--r-- | drivers/i2c/algos/i2c-algo-pca.c | 6 | ||||
-rw-r--r-- | drivers/i2c/algos/i2c-algo-pcf.c | 8 | ||||
-rw-r--r-- | drivers/i2c/algos/i2c-algo-sibyte.c | 4 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-iop3xx.c | 17 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-iop3xx.h | 2 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-powermac.c | 4 | ||||
-rw-r--r-- | drivers/i2c/busses/scx200_acb.c | 20 | ||||
-rw-r--r-- | drivers/i2c/chips/pca9539.c | 12 | ||||
-rw-r--r-- | drivers/i2c/i2c-core.c | 4 |
11 files changed, 44 insertions, 41 deletions
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index df05df1a0ef6..ab230c033f99 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
@@ -372,7 +372,6 @@ static inline int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) | |||
372 | 372 | ||
373 | while (count > 0) { | 373 | while (count > 0) { |
374 | inval = i2c_inb(i2c_adap); | 374 | inval = i2c_inb(i2c_adap); |
375 | /*printk("%#02x ",inval); if ( ! (count % 16) ) printk("\n"); */ | ||
376 | if (inval>=0) { | 375 | if (inval>=0) { |
377 | *temp = inval; | 376 | *temp = inval; |
378 | rdcount++; | 377 | rdcount++; |
@@ -544,8 +543,7 @@ int i2c_bit_add_bus(struct i2c_adapter *adap) | |||
544 | adap->timeout = 100; /* default values, should */ | 543 | adap->timeout = 100; /* default values, should */ |
545 | adap->retries = 3; /* be replaced by defines */ | 544 | adap->retries = 3; /* be replaced by defines */ |
546 | 545 | ||
547 | i2c_add_adapter(adap); | 546 | return i2c_add_adapter(adap); |
548 | return 0; | ||
549 | } | 547 | } |
550 | 548 | ||
551 | 549 | ||
diff --git a/drivers/i2c/algos/i2c-algo-ite.c b/drivers/i2c/algos/i2c-algo-ite.c index 2db7bfc85225..70d8eefb5efc 100644 --- a/drivers/i2c/algos/i2c-algo-ite.c +++ b/drivers/i2c/algos/i2c-algo-ite.c | |||
@@ -742,10 +742,8 @@ int i2c_iic_add_bus(struct i2c_adapter *adap) | |||
742 | adap->retries = 3; /* be replaced by defines */ | 742 | adap->retries = 3; /* be replaced by defines */ |
743 | adap->flags = 0; | 743 | adap->flags = 0; |
744 | 744 | ||
745 | i2c_add_adapter(adap); | ||
746 | iic_init(iic_adap); | 745 | iic_init(iic_adap); |
747 | 746 | return i2c_add_adapter(adap); | |
748 | return 0; | ||
749 | } | 747 | } |
750 | 748 | ||
751 | 749 | ||
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index 82946acab4c7..b88a6fcf7bd0 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
@@ -374,10 +374,10 @@ int i2c_pca_add_bus(struct i2c_adapter *adap) | |||
374 | adap->timeout = 100; /* default values, should */ | 374 | adap->timeout = 100; /* default values, should */ |
375 | adap->retries = 3; /* be replaced by defines */ | 375 | adap->retries = 3; /* be replaced by defines */ |
376 | 376 | ||
377 | rval = pca_init(pca_adap); | 377 | if ((rval = pca_init(pca_adap))) |
378 | return rval; | ||
378 | 379 | ||
379 | if (!rval) | 380 | rval = i2c_add_adapter(adap); |
380 | i2c_add_adapter(adap); | ||
381 | 381 | ||
382 | return rval; | 382 | return rval; |
383 | } | 383 | } |
diff --git a/drivers/i2c/algos/i2c-algo-pcf.c b/drivers/i2c/algos/i2c-algo-pcf.c index 6e498df1f717..5b24930adb5a 100644 --- a/drivers/i2c/algos/i2c-algo-pcf.c +++ b/drivers/i2c/algos/i2c-algo-pcf.c | |||
@@ -479,9 +479,11 @@ int i2c_pcf_add_bus(struct i2c_adapter *adap) | |||
479 | adap->timeout = 100; /* default values, should */ | 479 | adap->timeout = 100; /* default values, should */ |
480 | adap->retries = 3; /* be replaced by defines */ | 480 | adap->retries = 3; /* be replaced by defines */ |
481 | 481 | ||
482 | rval = pcf_init_8584(pcf_adap); | 482 | if ((rval = pcf_init_8584(pcf_adap))) |
483 | if (!rval) | 483 | return rval; |
484 | i2c_add_adapter(adap); | 484 | |
485 | rval = i2c_add_adapter(adap); | ||
486 | |||
485 | return rval; | 487 | return rval; |
486 | } | 488 | } |
487 | 489 | ||
diff --git a/drivers/i2c/algos/i2c-algo-sibyte.c b/drivers/i2c/algos/i2c-algo-sibyte.c index 3df3f09995c2..32d41c6fac0f 100644 --- a/drivers/i2c/algos/i2c-algo-sibyte.c +++ b/drivers/i2c/algos/i2c-algo-sibyte.c | |||
@@ -173,9 +173,7 @@ int i2c_sibyte_add_bus(struct i2c_adapter *i2c_adap, int speed) | |||
173 | printk("\n"); | 173 | printk("\n"); |
174 | } | 174 | } |
175 | 175 | ||
176 | i2c_add_adapter(i2c_adap); | 176 | return i2c_add_adapter(i2c_adap); |
177 | |||
178 | return 0; | ||
179 | } | 177 | } |
180 | 178 | ||
181 | 179 | ||
diff --git a/drivers/i2c/busses/i2c-iop3xx.c b/drivers/i2c/busses/i2c-iop3xx.c index aca7e1668605..48c56939c861 100644 --- a/drivers/i2c/busses/i2c-iop3xx.c +++ b/drivers/i2c/busses/i2c-iop3xx.c | |||
@@ -21,6 +21,9 @@ | |||
21 | * - Make it work with IXP46x chips | 21 | * - Make it work with IXP46x chips |
22 | * - Cleanup function names, coding style, etc | 22 | * - Cleanup function names, coding style, etc |
23 | * | 23 | * |
24 | * - writing to slave address causes latchup on iop331. | ||
25 | * fix: driver refuses to address self. | ||
26 | * | ||
24 | * This program is free software; you can redistribute it and/or modify | 27 | * This program is free software; you can redistribute it and/or modify |
25 | * it under the terms of the GNU General Public License as published by | 28 | * it under the terms of the GNU General Public License as published by |
26 | * the Free Software Foundation, version 2. | 29 | * the Free Software Foundation, version 2. |
@@ -73,12 +76,6 @@ iop3xx_i2c_reset(struct i2c_algo_iop3xx_data *iop3xx_adap) | |||
73 | } | 76 | } |
74 | 77 | ||
75 | static void | 78 | static void |
76 | iop3xx_i2c_set_slave_addr(struct i2c_algo_iop3xx_data *iop3xx_adap) | ||
77 | { | ||
78 | __raw_writel(MYSAR, iop3xx_adap->ioaddr + SAR_OFFSET); | ||
79 | } | ||
80 | |||
81 | static void | ||
82 | iop3xx_i2c_enable(struct i2c_algo_iop3xx_data *iop3xx_adap) | 79 | iop3xx_i2c_enable(struct i2c_algo_iop3xx_data *iop3xx_adap) |
83 | { | 80 | { |
84 | u32 cr = IOP3XX_ICR_GCD | IOP3XX_ICR_SCLEN | IOP3XX_ICR_UE; | 81 | u32 cr = IOP3XX_ICR_GCD | IOP3XX_ICR_SCLEN | IOP3XX_ICR_UE; |
@@ -248,6 +245,13 @@ iop3xx_i2c_send_target_addr(struct i2c_algo_iop3xx_data *iop3xx_adap, | |||
248 | int status; | 245 | int status; |
249 | int rc; | 246 | int rc; |
250 | 247 | ||
248 | /* avoid writing to my slave address (hangs on 80331), | ||
249 | * forbidden in Intel developer manual | ||
250 | */ | ||
251 | if (msg->addr == MYSAR) { | ||
252 | return -EBUSY; | ||
253 | } | ||
254 | |||
251 | __raw_writel(iic_cook_addr(msg), iop3xx_adap->ioaddr + DBR_OFFSET); | 255 | __raw_writel(iic_cook_addr(msg), iop3xx_adap->ioaddr + DBR_OFFSET); |
252 | 256 | ||
253 | cr &= ~(IOP3XX_ICR_MSTOP | IOP3XX_ICR_NACK); | 257 | cr &= ~(IOP3XX_ICR_MSTOP | IOP3XX_ICR_NACK); |
@@ -498,7 +502,6 @@ iop3xx_i2c_probe(struct platform_device *pdev) | |||
498 | spin_lock_init(&adapter_data->lock); | 502 | spin_lock_init(&adapter_data->lock); |
499 | 503 | ||
500 | iop3xx_i2c_reset(adapter_data); | 504 | iop3xx_i2c_reset(adapter_data); |
501 | iop3xx_i2c_set_slave_addr(adapter_data); | ||
502 | iop3xx_i2c_enable(adapter_data); | 505 | iop3xx_i2c_enable(adapter_data); |
503 | 506 | ||
504 | platform_set_drvdata(pdev, new_adapter); | 507 | platform_set_drvdata(pdev, new_adapter); |
diff --git a/drivers/i2c/busses/i2c-iop3xx.h b/drivers/i2c/busses/i2c-iop3xx.h index e46ebaea7b1e..8485861f6a36 100644 --- a/drivers/i2c/busses/i2c-iop3xx.h +++ b/drivers/i2c/busses/i2c-iop3xx.h | |||
@@ -80,7 +80,7 @@ | |||
80 | #define IOP3XX_GPOD_I2C0 0x00c0 /* clear these bits to enable ch0 */ | 80 | #define IOP3XX_GPOD_I2C0 0x00c0 /* clear these bits to enable ch0 */ |
81 | #define IOP3XX_GPOD_I2C1 0x0030 /* clear these bits to enable ch1 */ | 81 | #define IOP3XX_GPOD_I2C1 0x0030 /* clear these bits to enable ch1 */ |
82 | 82 | ||
83 | #define MYSAR 0x02 /* SWAG a suitable slave address */ | 83 | #define MYSAR 0 /* default slave address */ |
84 | 84 | ||
85 | #define I2C_ERR 321 | 85 | #define I2C_ERR 321 |
86 | #define I2C_ERR_BERR (I2C_ERR+0) | 86 | #define I2C_ERR_BERR (I2C_ERR+0) |
diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c index e8a6de5a1517..d658d9107955 100644 --- a/drivers/i2c/busses/i2c-powermac.c +++ b/drivers/i2c/busses/i2c-powermac.c | |||
@@ -148,8 +148,6 @@ static int i2c_powermac_master_xfer( struct i2c_adapter *adap, | |||
148 | int read; | 148 | int read; |
149 | int addrdir; | 149 | int addrdir; |
150 | 150 | ||
151 | if (num != 1) | ||
152 | return -EINVAL; | ||
153 | if (msgs->flags & I2C_M_TEN) | 151 | if (msgs->flags & I2C_M_TEN) |
154 | return -EINVAL; | 152 | return -EINVAL; |
155 | read = (msgs->flags & I2C_M_RD) != 0; | 153 | read = (msgs->flags & I2C_M_RD) != 0; |
@@ -166,7 +164,7 @@ static int i2c_powermac_master_xfer( struct i2c_adapter *adap, | |||
166 | rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len); | 164 | rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len); |
167 | bail: | 165 | bail: |
168 | pmac_i2c_close(bus); | 166 | pmac_i2c_close(bus); |
169 | return rc < 0 ? rc : msgs->len; | 167 | return rc < 0 ? rc : 1; |
170 | } | 168 | } |
171 | 169 | ||
172 | static u32 i2c_powermac_func(struct i2c_adapter * adapter) | 170 | static u32 i2c_powermac_func(struct i2c_adapter * adapter) |
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index 22a3eda04166..ced309ff056f 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
@@ -184,21 +184,21 @@ static void scx200_acb_machine(struct scx200_acb_iface *iface, u8 status) | |||
184 | break; | 184 | break; |
185 | 185 | ||
186 | case state_read: | 186 | case state_read: |
187 | /* Set ACK if receiving the last byte */ | 187 | /* Set ACK if _next_ byte will be the last one */ |
188 | if (iface->len == 1) | 188 | if (iface->len == 2) |
189 | outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1); | 189 | outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1); |
190 | else | 190 | else |
191 | outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1); | 191 | outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1); |
192 | 192 | ||
193 | *iface->ptr++ = inb(ACBSDA); | 193 | if (iface->len == 1) { |
194 | --iface->len; | ||
195 | |||
196 | if (iface->len == 0) { | ||
197 | iface->result = 0; | 194 | iface->result = 0; |
198 | iface->state = state_idle; | 195 | iface->state = state_idle; |
199 | outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1); | 196 | outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1); |
200 | } | 197 | } |
201 | 198 | ||
199 | *iface->ptr++ = inb(ACBSDA); | ||
200 | --iface->len; | ||
201 | |||
202 | break; | 202 | break; |
203 | 203 | ||
204 | case state_write: | 204 | case state_write: |
@@ -307,8 +307,12 @@ static s32 scx200_acb_smbus_xfer(struct i2c_adapter *adapter, | |||
307 | buffer = (u8 *)&cur_word; | 307 | buffer = (u8 *)&cur_word; |
308 | break; | 308 | break; |
309 | 309 | ||
310 | case I2C_SMBUS_BLOCK_DATA: | 310 | case I2C_SMBUS_I2C_BLOCK_DATA: |
311 | if (rw == I2C_SMBUS_READ) | ||
312 | data->block[0] = I2C_SMBUS_BLOCK_MAX; /* For now */ | ||
311 | len = data->block[0]; | 313 | len = data->block[0]; |
314 | if (len == 0 || len > I2C_SMBUS_BLOCK_MAX) | ||
315 | return -EINVAL; | ||
312 | buffer = &data->block[1]; | 316 | buffer = &data->block[1]; |
313 | break; | 317 | break; |
314 | 318 | ||
@@ -372,7 +376,7 @@ static u32 scx200_acb_func(struct i2c_adapter *adapter) | |||
372 | { | 376 | { |
373 | return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | | 377 | return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | |
374 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | | 378 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | |
375 | I2C_FUNC_SMBUS_BLOCK_DATA; | 379 | I2C_FUNC_SMBUS_I2C_BLOCK; |
376 | } | 380 | } |
377 | 381 | ||
378 | /* For now, we only handle combined mode (smbus) */ | 382 | /* For now, we only handle combined mode (smbus) */ |
diff --git a/drivers/i2c/chips/pca9539.c b/drivers/i2c/chips/pca9539.c index 54b6e6a4beed..cb22280cdd27 100644 --- a/drivers/i2c/chips/pca9539.c +++ b/drivers/i2c/chips/pca9539.c | |||
@@ -134,11 +134,13 @@ static int pca9539_detect(struct i2c_adapter *adapter, int address, int kind) | |||
134 | new_client->driver = &pca9539_driver; | 134 | new_client->driver = &pca9539_driver; |
135 | new_client->flags = 0; | 135 | new_client->flags = 0; |
136 | 136 | ||
137 | /* Detection: the pca9539 only has 8 registers (0-7). | 137 | if (kind < 0) { |
138 | A read of 7 should succeed, but a read of 8 should fail. */ | 138 | /* Detection: the pca9539 only has 8 registers (0-7). |
139 | if ((i2c_smbus_read_byte_data(new_client, 7) < 0) || | 139 | A read of 7 should succeed, but a read of 8 should fail. */ |
140 | (i2c_smbus_read_byte_data(new_client, 8) >= 0)) | 140 | if ((i2c_smbus_read_byte_data(new_client, 7) < 0) || |
141 | goto exit_kfree; | 141 | (i2c_smbus_read_byte_data(new_client, 8) >= 0)) |
142 | goto exit_kfree; | ||
143 | } | ||
142 | 144 | ||
143 | strlcpy(new_client->name, "pca9539", I2C_NAME_SIZE); | 145 | strlcpy(new_client->name, "pca9539", I2C_NAME_SIZE); |
144 | 146 | ||
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index a45155f799d4..9cb277d6aa48 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -756,9 +756,9 @@ int i2c_probe(struct i2c_adapter *adapter, | |||
756 | "parameter for adapter %d, " | 756 | "parameter for adapter %d, " |
757 | "addr 0x%02x\n", adap_id, | 757 | "addr 0x%02x\n", adap_id, |
758 | address_data->ignore[j + 1]); | 758 | address_data->ignore[j + 1]); |
759 | ignore = 1; | ||
760 | break; | ||
759 | } | 761 | } |
760 | ignore = 1; | ||
761 | break; | ||
762 | } | 762 | } |
763 | if (ignore) | 763 | if (ignore) |
764 | continue; | 764 | continue; |