diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/Kconfig | 14 | ||||
| -rw-r--r-- | drivers/i2c/algos/Kconfig | 11 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-amd756-s4882.c | 9 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-nforce2-s4985.c | 5 | ||||
| -rw-r--r-- | drivers/i2c/chips/at24.c | 8 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core.c | 11 | ||||
| -rw-r--r-- | drivers/i2c/i2c-dev.c | 4 |
7 files changed, 44 insertions, 18 deletions
diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig index 96867347bcbf..711ca08ab776 100644 --- a/drivers/i2c/Kconfig +++ b/drivers/i2c/Kconfig | |||
| @@ -38,6 +38,20 @@ config I2C_CHARDEV | |||
| 38 | This support is also available as a module. If so, the module | 38 | This support is also available as a module. If so, the module |
| 39 | will be called i2c-dev. | 39 | will be called i2c-dev. |
| 40 | 40 | ||
| 41 | config I2C_HELPER_AUTO | ||
| 42 | bool "Autoselect pertinent helper modules" | ||
| 43 | default y | ||
| 44 | help | ||
| 45 | Some I2C bus drivers require so-called "I2C algorithm" modules | ||
| 46 | to work. These are basically software-only abstractions of generic | ||
| 47 | I2C interfaces. This option will autoselect them so that you don't | ||
| 48 | have to care. | ||
| 49 | |||
| 50 | Unselect this only if you need to enable additional helper | ||
| 51 | modules, for example for use with external I2C bus drivers. | ||
| 52 | |||
| 53 | In doubt, say Y. | ||
| 54 | |||
| 41 | source drivers/i2c/algos/Kconfig | 55 | source drivers/i2c/algos/Kconfig |
| 42 | source drivers/i2c/busses/Kconfig | 56 | source drivers/i2c/busses/Kconfig |
| 43 | source drivers/i2c/chips/Kconfig | 57 | source drivers/i2c/chips/Kconfig |
diff --git a/drivers/i2c/algos/Kconfig b/drivers/i2c/algos/Kconfig index 7137a17402fe..b788579b8227 100644 --- a/drivers/i2c/algos/Kconfig +++ b/drivers/i2c/algos/Kconfig | |||
| @@ -2,15 +2,20 @@ | |||
| 2 | # I2C algorithm drivers configuration | 2 | # I2C algorithm drivers configuration |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | menu "I2C Algorithms" | ||
| 6 | depends on !I2C_HELPER_AUTO | ||
| 7 | |||
| 5 | config I2C_ALGOBIT | 8 | config I2C_ALGOBIT |
| 6 | tristate | 9 | tristate "I2C bit-banging interfaces" |
| 7 | 10 | ||
| 8 | config I2C_ALGOPCF | 11 | config I2C_ALGOPCF |
| 9 | tristate | 12 | tristate "I2C PCF 8584 interfaces" |
| 10 | 13 | ||
| 11 | config I2C_ALGOPCA | 14 | config I2C_ALGOPCA |
| 12 | tristate | 15 | tristate "I2C PCA 9564 interfaces" |
| 13 | 16 | ||
| 14 | config I2C_ALGO_SGI | 17 | config I2C_ALGO_SGI |
| 15 | tristate | 18 | tristate |
| 16 | depends on SGI_IP22 || SGI_IP32 || X86_VISWS | 19 | depends on SGI_IP22 || SGI_IP32 || X86_VISWS |
| 20 | |||
| 21 | endmenu | ||
diff --git a/drivers/i2c/busses/i2c-amd756-s4882.c b/drivers/i2c/busses/i2c-amd756-s4882.c index 72872d1e63ef..8ba2bcf727d3 100644 --- a/drivers/i2c/busses/i2c-amd756-s4882.c +++ b/drivers/i2c/busses/i2c-amd756-s4882.c | |||
| @@ -155,6 +155,9 @@ static int __init amd756_s4882_init(void) | |||
| 155 | int i, error; | 155 | int i, error; |
| 156 | union i2c_smbus_data ioconfig; | 156 | union i2c_smbus_data ioconfig; |
| 157 | 157 | ||
| 158 | if (!amd756_smbus.dev.parent) | ||
| 159 | return -ENODEV; | ||
| 160 | |||
| 158 | /* Configure the PCA9556 multiplexer */ | 161 | /* Configure the PCA9556 multiplexer */ |
| 159 | ioconfig.byte = 0x00; /* All I/O to output mode */ | 162 | ioconfig.byte = 0x00; /* All I/O to output mode */ |
| 160 | error = i2c_smbus_xfer(&amd756_smbus, 0x18, 0, I2C_SMBUS_WRITE, 0x03, | 163 | error = i2c_smbus_xfer(&amd756_smbus, 0x18, 0, I2C_SMBUS_WRITE, 0x03, |
| @@ -168,11 +171,7 @@ static int __init amd756_s4882_init(void) | |||
| 168 | /* Unregister physical bus */ | 171 | /* Unregister physical bus */ |
| 169 | error = i2c_del_adapter(&amd756_smbus); | 172 | error = i2c_del_adapter(&amd756_smbus); |
| 170 | if (error) { | 173 | if (error) { |
| 171 | if (error == -EINVAL) | 174 | dev_err(&amd756_smbus.dev, "Physical bus removal failed\n"); |
| 172 | error = -ENODEV; | ||
| 173 | else | ||
| 174 | dev_err(&amd756_smbus.dev, "Physical bus removal " | ||
| 175 | "failed\n"); | ||
| 176 | goto ERROR0; | 175 | goto ERROR0; |
| 177 | } | 176 | } |
| 178 | 177 | ||
diff --git a/drivers/i2c/busses/i2c-nforce2-s4985.c b/drivers/i2c/busses/i2c-nforce2-s4985.c index d1a4cbcf2aa4..29015eb9ca46 100644 --- a/drivers/i2c/busses/i2c-nforce2-s4985.c +++ b/drivers/i2c/busses/i2c-nforce2-s4985.c | |||
| @@ -150,6 +150,9 @@ static int __init nforce2_s4985_init(void) | |||
| 150 | int i, error; | 150 | int i, error; |
| 151 | union i2c_smbus_data ioconfig; | 151 | union i2c_smbus_data ioconfig; |
| 152 | 152 | ||
| 153 | if (!nforce2_smbus) | ||
| 154 | return -ENODEV; | ||
| 155 | |||
| 153 | /* Configure the PCA9556 multiplexer */ | 156 | /* Configure the PCA9556 multiplexer */ |
| 154 | ioconfig.byte = 0x00; /* All I/O to output mode */ | 157 | ioconfig.byte = 0x00; /* All I/O to output mode */ |
| 155 | error = i2c_smbus_xfer(nforce2_smbus, 0x18, 0, I2C_SMBUS_WRITE, 0x03, | 158 | error = i2c_smbus_xfer(nforce2_smbus, 0x18, 0, I2C_SMBUS_WRITE, 0x03, |
| @@ -161,8 +164,6 @@ static int __init nforce2_s4985_init(void) | |||
| 161 | } | 164 | } |
| 162 | 165 | ||
| 163 | /* Unregister physical bus */ | 166 | /* Unregister physical bus */ |
| 164 | if (!nforce2_smbus) | ||
| 165 | return -ENODEV; | ||
| 166 | error = i2c_del_adapter(nforce2_smbus); | 167 | error = i2c_del_adapter(nforce2_smbus); |
| 167 | if (error) { | 168 | if (error) { |
| 168 | dev_err(&nforce2_smbus->dev, "Physical bus removal failed\n"); | 169 | dev_err(&nforce2_smbus->dev, "Physical bus removal failed\n"); |
diff --git a/drivers/i2c/chips/at24.c b/drivers/i2c/chips/at24.c index e764c94f3e3d..2a4acb269569 100644 --- a/drivers/i2c/chips/at24.c +++ b/drivers/i2c/chips/at24.c | |||
| @@ -188,7 +188,7 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf, | |||
| 188 | count = I2C_SMBUS_BLOCK_MAX; | 188 | count = I2C_SMBUS_BLOCK_MAX; |
| 189 | status = i2c_smbus_read_i2c_block_data(client, offset, | 189 | status = i2c_smbus_read_i2c_block_data(client, offset, |
| 190 | count, buf); | 190 | count, buf); |
| 191 | dev_dbg(&client->dev, "smbus read %zd@%d --> %d\n", | 191 | dev_dbg(&client->dev, "smbus read %zu@%d --> %d\n", |
| 192 | count, offset, status); | 192 | count, offset, status); |
| 193 | return (status < 0) ? -EIO : status; | 193 | return (status < 0) ? -EIO : status; |
| 194 | } | 194 | } |
| @@ -214,7 +214,7 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf, | |||
| 214 | msg[1].len = count; | 214 | msg[1].len = count; |
| 215 | 215 | ||
| 216 | status = i2c_transfer(client->adapter, msg, 2); | 216 | status = i2c_transfer(client->adapter, msg, 2); |
| 217 | dev_dbg(&client->dev, "i2c read %zd@%d --> %d\n", | 217 | dev_dbg(&client->dev, "i2c read %zu@%d --> %d\n", |
| 218 | count, offset, status); | 218 | count, offset, status); |
| 219 | 219 | ||
| 220 | if (status == 2) | 220 | if (status == 2) |
| @@ -334,7 +334,7 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, char *buf, | |||
| 334 | if (status == 1) | 334 | if (status == 1) |
| 335 | status = count; | 335 | status = count; |
| 336 | } | 336 | } |
| 337 | dev_dbg(&client->dev, "write %zd@%d --> %zd (%ld)\n", | 337 | dev_dbg(&client->dev, "write %zu@%d --> %zd (%ld)\n", |
| 338 | count, offset, status, jiffies); | 338 | count, offset, status, jiffies); |
| 339 | 339 | ||
| 340 | if (status == count) | 340 | if (status == count) |
| @@ -512,7 +512,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 512 | 512 | ||
| 513 | i2c_set_clientdata(client, at24); | 513 | i2c_set_clientdata(client, at24); |
| 514 | 514 | ||
| 515 | dev_info(&client->dev, "%Zd byte %s EEPROM %s\n", | 515 | dev_info(&client->dev, "%zu byte %s EEPROM %s\n", |
| 516 | at24->bin.size, client->name, | 516 | at24->bin.size, client->name, |
| 517 | writable ? "(writable)" : "(read-only)"); | 517 | writable ? "(writable)" : "(read-only)"); |
| 518 | dev_dbg(&client->dev, | 518 | dev_dbg(&client->dev, |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 7bf38c418086..550853f79ae8 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -813,7 +813,12 @@ static int i2c_check_addr(struct i2c_adapter *adapter, int addr) | |||
| 813 | int i2c_attach_client(struct i2c_client *client) | 813 | int i2c_attach_client(struct i2c_client *client) |
| 814 | { | 814 | { |
| 815 | struct i2c_adapter *adapter = client->adapter; | 815 | struct i2c_adapter *adapter = client->adapter; |
| 816 | int res = 0; | 816 | int res; |
| 817 | |||
| 818 | /* Check for address business */ | ||
| 819 | res = i2c_check_addr(adapter, client->addr); | ||
| 820 | if (res) | ||
| 821 | return res; | ||
| 817 | 822 | ||
| 818 | client->dev.parent = &client->adapter->dev; | 823 | client->dev.parent = &client->adapter->dev; |
| 819 | client->dev.bus = &i2c_bus_type; | 824 | client->dev.bus = &i2c_bus_type; |
| @@ -1451,9 +1456,11 @@ i2c_new_probed_device(struct i2c_adapter *adap, | |||
| 1451 | if ((addr_list[i] & ~0x07) == 0x30 | 1456 | if ((addr_list[i] & ~0x07) == 0x30 |
| 1452 | || (addr_list[i] & ~0x0f) == 0x50 | 1457 | || (addr_list[i] & ~0x0f) == 0x50 |
| 1453 | || !i2c_check_functionality(adap, I2C_FUNC_SMBUS_QUICK)) { | 1458 | || !i2c_check_functionality(adap, I2C_FUNC_SMBUS_QUICK)) { |
| 1459 | union i2c_smbus_data data; | ||
| 1460 | |||
| 1454 | if (i2c_smbus_xfer(adap, addr_list[i], 0, | 1461 | if (i2c_smbus_xfer(adap, addr_list[i], 0, |
| 1455 | I2C_SMBUS_READ, 0, | 1462 | I2C_SMBUS_READ, 0, |
| 1456 | I2C_SMBUS_BYTE, NULL) >= 0) | 1463 | I2C_SMBUS_BYTE, &data) >= 0) |
| 1457 | break; | 1464 | break; |
| 1458 | } else { | 1465 | } else { |
| 1459 | if (i2c_smbus_xfer(adap, addr_list[i], 0, | 1466 | if (i2c_smbus_xfer(adap, addr_list[i], 0, |
diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index 9d55c6383b23..af4491fa7e34 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c | |||
| @@ -147,7 +147,7 @@ static ssize_t i2cdev_read (struct file *file, char __user *buf, size_t count, | |||
| 147 | if (tmp==NULL) | 147 | if (tmp==NULL) |
| 148 | return -ENOMEM; | 148 | return -ENOMEM; |
| 149 | 149 | ||
| 150 | pr_debug("i2c-dev: i2c-%d reading %zd bytes.\n", | 150 | pr_debug("i2c-dev: i2c-%d reading %zu bytes.\n", |
| 151 | iminor(file->f_path.dentry->d_inode), count); | 151 | iminor(file->f_path.dentry->d_inode), count); |
| 152 | 152 | ||
| 153 | ret = i2c_master_recv(client,tmp,count); | 153 | ret = i2c_master_recv(client,tmp,count); |
| @@ -175,7 +175,7 @@ static ssize_t i2cdev_write (struct file *file, const char __user *buf, size_t c | |||
| 175 | return -EFAULT; | 175 | return -EFAULT; |
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | pr_debug("i2c-dev: i2c-%d writing %zd bytes.\n", | 178 | pr_debug("i2c-dev: i2c-%d writing %zu bytes.\n", |
| 179 | iminor(file->f_path.dentry->d_inode), count); | 179 | iminor(file->f_path.dentry->d_inode), count); |
| 180 | 180 | ||
| 181 | ret = i2c_master_send(client,tmp,count); | 181 | ret = i2c_master_send(client,tmp,count); |
