diff options
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 2a0b3be7cdd0..53bb43593863 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; |
