diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-16 14:29:17 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-16 14:29:17 -0400 |
commit | 4858704da75ba84ce21e6d4b3b974e8b8594c9f2 (patch) | |
tree | 153f92e4ac0d5c90890ee1b14458ea56e22f984e /drivers/i2c | |
parent | 86ade88e15b0852fa437e816037ecb266ae990ad (diff) | |
parent | 036533e232922ec6667817de9b037d0b1ebd062e (diff) |
Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging
* 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
therm_windtunnel: Convert to a new-style i2c driver
therm_adt746x: Convert to a new-style i2c driver
windfarm: Convert to new-style i2c drivers
therm_pm72: Convert to a new-style i2c driver
i2c-viapro: Add new PCI device ID for VX855
i2c/chips: Move max6875 to drivers/misc/eeprom
i2c: Do not give adapters a default parent
i2c: Do not probe for TV chips on Voodoo3 adapters
i2c: Retry automatically on arbitration loss
i2c: Remove void casts
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/Kconfig | 6 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-viapro.c | 4 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-voodoo3.c | 1 | ||||
-rw-r--r-- | drivers/i2c/chips/Kconfig | 15 | ||||
-rw-r--r-- | drivers/i2c/chips/Makefile | 1 | ||||
-rw-r--r-- | drivers/i2c/chips/max6875.c | 246 | ||||
-rw-r--r-- | drivers/i2c/i2c-core.c | 43 |
7 files changed, 34 insertions, 282 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index c8460fa9cfac..0d04d3ebfc2d 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -211,7 +211,7 @@ config I2C_VIA | |||
211 | will be called i2c-via. | 211 | will be called i2c-via. |
212 | 212 | ||
213 | config I2C_VIAPRO | 213 | config I2C_VIAPRO |
214 | tristate "VIA VT82C596/82C686/82xx and CX700/VX800/VX820" | 214 | tristate "VIA VT82C596/82C686/82xx and CX700/VX8xx" |
215 | depends on PCI | 215 | depends on PCI |
216 | help | 216 | help |
217 | If you say yes to this option, support will be included for the VIA | 217 | If you say yes to this option, support will be included for the VIA |
@@ -225,8 +225,8 @@ config I2C_VIAPRO | |||
225 | VT8237R/A/S | 225 | VT8237R/A/S |
226 | VT8251 | 226 | VT8251 |
227 | CX700 | 227 | CX700 |
228 | VX800 | 228 | VX800/VX820 |
229 | VX820 | 229 | VX855/VX875 |
230 | 230 | ||
231 | This driver can also be built as a module. If so, the module | 231 | This driver can also be built as a module. If so, the module |
232 | will be called i2c-viapro. | 232 | will be called i2c-viapro. |
diff --git a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c index 02e6f724b05f..54d810a4d00f 100644 --- a/drivers/i2c/busses/i2c-viapro.c +++ b/drivers/i2c/busses/i2c-viapro.c | |||
@@ -37,6 +37,7 @@ | |||
37 | VT8251 0x3287 yes | 37 | VT8251 0x3287 yes |
38 | CX700 0x8324 yes | 38 | CX700 0x8324 yes |
39 | VX800/VX820 0x8353 yes | 39 | VX800/VX820 0x8353 yes |
40 | VX855/VX875 0x8409 yes | ||
40 | 41 | ||
41 | Note: we assume there can only be one device, with one SMBus interface. | 42 | Note: we assume there can only be one device, with one SMBus interface. |
42 | */ | 43 | */ |
@@ -404,6 +405,7 @@ found: | |||
404 | switch (pdev->device) { | 405 | switch (pdev->device) { |
405 | case PCI_DEVICE_ID_VIA_CX700: | 406 | case PCI_DEVICE_ID_VIA_CX700: |
406 | case PCI_DEVICE_ID_VIA_VX800: | 407 | case PCI_DEVICE_ID_VIA_VX800: |
408 | case PCI_DEVICE_ID_VIA_VX855: | ||
407 | case PCI_DEVICE_ID_VIA_8251: | 409 | case PCI_DEVICE_ID_VIA_8251: |
408 | case PCI_DEVICE_ID_VIA_8237: | 410 | case PCI_DEVICE_ID_VIA_8237: |
409 | case PCI_DEVICE_ID_VIA_8237A: | 411 | case PCI_DEVICE_ID_VIA_8237A: |
@@ -469,6 +471,8 @@ static struct pci_device_id vt596_ids[] = { | |||
469 | .driver_data = SMBBA3 }, | 471 | .driver_data = SMBBA3 }, |
470 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX800), | 472 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX800), |
471 | .driver_data = SMBBA3 }, | 473 | .driver_data = SMBBA3 }, |
474 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX855), | ||
475 | .driver_data = SMBBA3 }, | ||
472 | { 0, } | 476 | { 0, } |
473 | }; | 477 | }; |
474 | 478 | ||
diff --git a/drivers/i2c/busses/i2c-voodoo3.c b/drivers/i2c/busses/i2c-voodoo3.c index 1a474acc0ddd..7663d57833a0 100644 --- a/drivers/i2c/busses/i2c-voodoo3.c +++ b/drivers/i2c/busses/i2c-voodoo3.c | |||
@@ -163,7 +163,6 @@ static struct i2c_algo_bit_data voo_i2c_bit_data = { | |||
163 | 163 | ||
164 | static struct i2c_adapter voodoo3_i2c_adapter = { | 164 | static struct i2c_adapter voodoo3_i2c_adapter = { |
165 | .owner = THIS_MODULE, | 165 | .owner = THIS_MODULE, |
166 | .class = I2C_CLASS_TV_ANALOG, | ||
167 | .name = "I2C Voodoo3/Banshee adapter", | 166 | .name = "I2C Voodoo3/Banshee adapter", |
168 | .algo_data = &voo_i2c_bit_data, | 167 | .algo_data = &voo_i2c_bit_data, |
169 | }; | 168 | }; |
diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig index 8f8c81eb0aee..02d746c9c474 100644 --- a/drivers/i2c/chips/Kconfig +++ b/drivers/i2c/chips/Kconfig | |||
@@ -64,21 +64,6 @@ config SENSORS_PCA9539 | |||
64 | This driver is deprecated and will be dropped soon. Use | 64 | This driver is deprecated and will be dropped soon. Use |
65 | drivers/gpio/pca953x.c instead. | 65 | drivers/gpio/pca953x.c instead. |
66 | 66 | ||
67 | config SENSORS_MAX6875 | ||
68 | tristate "Maxim MAX6875 Power supply supervisor" | ||
69 | depends on EXPERIMENTAL | ||
70 | help | ||
71 | If you say yes here you get support for the Maxim MAX6875 | ||
72 | EEPROM-programmable, quad power-supply sequencer/supervisor. | ||
73 | |||
74 | This provides an interface to program the EEPROM and reset the chip. | ||
75 | |||
76 | This driver also supports the Maxim MAX6874 hex power-supply | ||
77 | sequencer/supervisor if found at a compatible address. | ||
78 | |||
79 | This driver can also be built as a module. If so, the module | ||
80 | will be called max6875. | ||
81 | |||
82 | config SENSORS_TSL2550 | 67 | config SENSORS_TSL2550 |
83 | tristate "Taos TSL2550 ambient light sensor" | 68 | tristate "Taos TSL2550 ambient light sensor" |
84 | depends on EXPERIMENTAL | 69 | depends on EXPERIMENTAL |
diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile index 55a376037183..f4680d16ee34 100644 --- a/drivers/i2c/chips/Makefile +++ b/drivers/i2c/chips/Makefile | |||
@@ -11,7 +11,6 @@ | |||
11 | # | 11 | # |
12 | 12 | ||
13 | obj-$(CONFIG_DS1682) += ds1682.o | 13 | obj-$(CONFIG_DS1682) += ds1682.o |
14 | obj-$(CONFIG_SENSORS_MAX6875) += max6875.o | ||
15 | obj-$(CONFIG_SENSORS_PCA9539) += pca9539.o | 14 | obj-$(CONFIG_SENSORS_PCA9539) += pca9539.o |
16 | obj-$(CONFIG_SENSORS_PCF8574) += pcf8574.o | 15 | obj-$(CONFIG_SENSORS_PCF8574) += pcf8574.o |
17 | obj-$(CONFIG_PCF8575) += pcf8575.o | 16 | obj-$(CONFIG_PCF8575) += pcf8575.o |
diff --git a/drivers/i2c/chips/max6875.c b/drivers/i2c/chips/max6875.c deleted file mode 100644 index 033d9d81ec8a..000000000000 --- a/drivers/i2c/chips/max6875.c +++ /dev/null | |||
@@ -1,246 +0,0 @@ | |||
1 | /* | ||
2 | max6875.c - driver for MAX6874/MAX6875 | ||
3 | |||
4 | Copyright (C) 2005 Ben Gardner <bgardner@wabtec.com> | ||
5 | |||
6 | Based on i2c/chips/eeprom.c | ||
7 | |||
8 | The MAX6875 has a bank of registers and two banks of EEPROM. | ||
9 | Address ranges are defined as follows: | ||
10 | * 0x0000 - 0x0046 = configuration registers | ||
11 | * 0x8000 - 0x8046 = configuration EEPROM | ||
12 | * 0x8100 - 0x82FF = user EEPROM | ||
13 | |||
14 | This driver makes the user EEPROM available for read. | ||
15 | |||
16 | The registers & config EEPROM should be accessed via i2c-dev. | ||
17 | |||
18 | The MAX6875 ignores the lowest address bit, so each chip responds to | ||
19 | two addresses - 0x50/0x51 and 0x52/0x53. | ||
20 | |||
21 | Note that the MAX6875 uses i2c_smbus_write_byte_data() to set the read | ||
22 | address, so this driver is destructive if loaded for the wrong EEPROM chip. | ||
23 | |||
24 | 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 | ||
26 | the Free Software Foundation; version 2 of the License. | ||
27 | */ | ||
28 | |||
29 | #include <linux/kernel.h> | ||
30 | #include <linux/init.h> | ||
31 | #include <linux/module.h> | ||
32 | #include <linux/slab.h> | ||
33 | #include <linux/i2c.h> | ||
34 | #include <linux/mutex.h> | ||
35 | |||
36 | /* Do not scan - the MAX6875 access method will write to some EEPROM chips */ | ||
37 | static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; | ||
38 | |||
39 | /* Insmod parameters */ | ||
40 | I2C_CLIENT_INSMOD_1(max6875); | ||
41 | |||
42 | /* The MAX6875 can only read/write 16 bytes at a time */ | ||
43 | #define SLICE_SIZE 16 | ||
44 | #define SLICE_BITS 4 | ||
45 | |||
46 | /* USER EEPROM is at addresses 0x8100 - 0x82FF */ | ||
47 | #define USER_EEPROM_BASE 0x8100 | ||
48 | #define USER_EEPROM_SIZE 0x0200 | ||
49 | #define USER_EEPROM_SLICES 32 | ||
50 | |||
51 | /* MAX6875 commands */ | ||
52 | #define MAX6875_CMD_BLK_READ 0x84 | ||
53 | |||
54 | /* Each client has this additional data */ | ||
55 | struct max6875_data { | ||
56 | struct i2c_client *fake_client; | ||
57 | struct mutex update_lock; | ||
58 | |||
59 | u32 valid; | ||
60 | u8 data[USER_EEPROM_SIZE]; | ||
61 | unsigned long last_updated[USER_EEPROM_SLICES]; | ||
62 | }; | ||
63 | |||
64 | static void max6875_update_slice(struct i2c_client *client, int slice) | ||
65 | { | ||
66 | struct max6875_data *data = i2c_get_clientdata(client); | ||
67 | int i, j, addr; | ||
68 | u8 *buf; | ||
69 | |||
70 | if (slice >= USER_EEPROM_SLICES) | ||
71 | return; | ||
72 | |||
73 | mutex_lock(&data->update_lock); | ||
74 | |||
75 | buf = &data->data[slice << SLICE_BITS]; | ||
76 | |||
77 | if (!(data->valid & (1 << slice)) || | ||
78 | time_after(jiffies, data->last_updated[slice])) { | ||
79 | |||
80 | dev_dbg(&client->dev, "Starting update of slice %u\n", slice); | ||
81 | |||
82 | data->valid &= ~(1 << slice); | ||
83 | |||
84 | addr = USER_EEPROM_BASE + (slice << SLICE_BITS); | ||
85 | |||
86 | /* select the eeprom address */ | ||
87 | if (i2c_smbus_write_byte_data(client, addr >> 8, addr & 0xFF)) { | ||
88 | dev_err(&client->dev, "address set failed\n"); | ||
89 | goto exit_up; | ||
90 | } | ||
91 | |||
92 | if (i2c_check_functionality(client->adapter, | ||
93 | I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { | ||
94 | if (i2c_smbus_read_i2c_block_data(client, | ||
95 | MAX6875_CMD_BLK_READ, | ||
96 | SLICE_SIZE, | ||
97 | buf) != SLICE_SIZE) { | ||
98 | goto exit_up; | ||
99 | } | ||
100 | } else { | ||
101 | for (i = 0; i < SLICE_SIZE; i++) { | ||
102 | j = i2c_smbus_read_byte(client); | ||
103 | if (j < 0) { | ||
104 | goto exit_up; | ||
105 | } | ||
106 | buf[i] = j; | ||
107 | } | ||
108 | } | ||
109 | data->last_updated[slice] = jiffies; | ||
110 | data->valid |= (1 << slice); | ||
111 | } | ||
112 | exit_up: | ||
113 | mutex_unlock(&data->update_lock); | ||
114 | } | ||
115 | |||
116 | static ssize_t max6875_read(struct kobject *kobj, | ||
117 | struct bin_attribute *bin_attr, | ||
118 | char *buf, loff_t off, size_t count) | ||
119 | { | ||
120 | struct i2c_client *client = kobj_to_i2c_client(kobj); | ||
121 | struct max6875_data *data = i2c_get_clientdata(client); | ||
122 | int slice, max_slice; | ||
123 | |||
124 | if (off > USER_EEPROM_SIZE) | ||
125 | return 0; | ||
126 | |||
127 | if (off + count > USER_EEPROM_SIZE) | ||
128 | count = USER_EEPROM_SIZE - off; | ||
129 | |||
130 | /* refresh slices which contain requested bytes */ | ||
131 | max_slice = (off + count - 1) >> SLICE_BITS; | ||
132 | for (slice = (off >> SLICE_BITS); slice <= max_slice; slice++) | ||
133 | max6875_update_slice(client, slice); | ||
134 | |||
135 | memcpy(buf, &data->data[off], count); | ||
136 | |||
137 | return count; | ||
138 | } | ||
139 | |||
140 | static struct bin_attribute user_eeprom_attr = { | ||
141 | .attr = { | ||
142 | .name = "eeprom", | ||
143 | .mode = S_IRUGO, | ||
144 | }, | ||
145 | .size = USER_EEPROM_SIZE, | ||
146 | .read = max6875_read, | ||
147 | }; | ||
148 | |||
149 | /* Return 0 if detection is successful, -ENODEV otherwise */ | ||
150 | static int max6875_detect(struct i2c_client *client, int kind, | ||
151 | struct i2c_board_info *info) | ||
152 | { | ||
153 | struct i2c_adapter *adapter = client->adapter; | ||
154 | |||
155 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA | ||
156 | | I2C_FUNC_SMBUS_READ_BYTE)) | ||
157 | return -ENODEV; | ||
158 | |||
159 | /* Only check even addresses */ | ||
160 | if (client->addr & 1) | ||
161 | return -ENODEV; | ||
162 | |||
163 | strlcpy(info->type, "max6875", I2C_NAME_SIZE); | ||
164 | |||
165 | return 0; | ||
166 | } | ||
167 | |||
168 | static int max6875_probe(struct i2c_client *client, | ||
169 | const struct i2c_device_id *id) | ||
170 | { | ||
171 | struct max6875_data *data; | ||
172 | int err; | ||
173 | |||
174 | if (!(data = kzalloc(sizeof(struct max6875_data), GFP_KERNEL))) | ||
175 | return -ENOMEM; | ||
176 | |||
177 | /* A fake client is created on the odd address */ | ||
178 | data->fake_client = i2c_new_dummy(client->adapter, client->addr + 1); | ||
179 | if (!data->fake_client) { | ||
180 | err = -ENOMEM; | ||
181 | goto exit_kfree; | ||
182 | } | ||
183 | |||
184 | /* Init real i2c_client */ | ||
185 | i2c_set_clientdata(client, data); | ||
186 | mutex_init(&data->update_lock); | ||
187 | |||
188 | err = sysfs_create_bin_file(&client->dev.kobj, &user_eeprom_attr); | ||
189 | if (err) | ||
190 | goto exit_remove_fake; | ||
191 | |||
192 | return 0; | ||
193 | |||
194 | exit_remove_fake: | ||
195 | i2c_unregister_device(data->fake_client); | ||
196 | exit_kfree: | ||
197 | kfree(data); | ||
198 | return err; | ||
199 | } | ||
200 | |||
201 | static int max6875_remove(struct i2c_client *client) | ||
202 | { | ||
203 | struct max6875_data *data = i2c_get_clientdata(client); | ||
204 | |||
205 | i2c_unregister_device(data->fake_client); | ||
206 | |||
207 | sysfs_remove_bin_file(&client->dev.kobj, &user_eeprom_attr); | ||
208 | kfree(data); | ||
209 | |||
210 | return 0; | ||
211 | } | ||
212 | |||
213 | static const struct i2c_device_id max6875_id[] = { | ||
214 | { "max6875", 0 }, | ||
215 | { } | ||
216 | }; | ||
217 | |||
218 | static struct i2c_driver max6875_driver = { | ||
219 | .driver = { | ||
220 | .name = "max6875", | ||
221 | }, | ||
222 | .probe = max6875_probe, | ||
223 | .remove = max6875_remove, | ||
224 | .id_table = max6875_id, | ||
225 | |||
226 | .detect = max6875_detect, | ||
227 | .address_data = &addr_data, | ||
228 | }; | ||
229 | |||
230 | static int __init max6875_init(void) | ||
231 | { | ||
232 | return i2c_add_driver(&max6875_driver); | ||
233 | } | ||
234 | |||
235 | static void __exit max6875_exit(void) | ||
236 | { | ||
237 | i2c_del_driver(&max6875_driver); | ||
238 | } | ||
239 | |||
240 | |||
241 | MODULE_AUTHOR("Ben Gardner <bgardner@wabtec.com>"); | ||
242 | MODULE_DESCRIPTION("MAX6875 driver"); | ||
243 | MODULE_LICENSE("GPL"); | ||
244 | |||
245 | module_init(max6875_init); | ||
246 | module_exit(max6875_exit); | ||
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 85e2e919d1cd..5ed622ee65c3 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <linux/i2c.h> | 29 | #include <linux/i2c.h> |
30 | #include <linux/init.h> | 30 | #include <linux/init.h> |
31 | #include <linux/idr.h> | 31 | #include <linux/idr.h> |
32 | #include <linux/platform_device.h> | ||
33 | #include <linux/mutex.h> | 32 | #include <linux/mutex.h> |
34 | #include <linux/completion.h> | 33 | #include <linux/completion.h> |
35 | #include <linux/hardirq.h> | 34 | #include <linux/hardirq.h> |
@@ -451,16 +450,6 @@ static int i2c_register_adapter(struct i2c_adapter *adap) | |||
451 | 450 | ||
452 | mutex_lock(&core_lock); | 451 | mutex_lock(&core_lock); |
453 | 452 | ||
454 | /* Add the adapter to the driver core. | ||
455 | * If the parent pointer is not set up, | ||
456 | * we add this adapter to the host bus. | ||
457 | */ | ||
458 | if (adap->dev.parent == NULL) { | ||
459 | adap->dev.parent = &platform_bus; | ||
460 | pr_debug("I2C adapter driver [%s] forgot to specify " | ||
461 | "physical device\n", adap->name); | ||
462 | } | ||
463 | |||
464 | /* Set default timeout to 1 second if not already set */ | 453 | /* Set default timeout to 1 second if not already set */ |
465 | if (adap->timeout == 0) | 454 | if (adap->timeout == 0) |
466 | adap->timeout = HZ; | 455 | adap->timeout = HZ; |
@@ -1022,7 +1011,8 @@ module_exit(i2c_exit); | |||
1022 | */ | 1011 | */ |
1023 | int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | 1012 | int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) |
1024 | { | 1013 | { |
1025 | int ret; | 1014 | unsigned long orig_jiffies; |
1015 | int ret, try; | ||
1026 | 1016 | ||
1027 | /* REVISIT the fault reporting model here is weak: | 1017 | /* REVISIT the fault reporting model here is weak: |
1028 | * | 1018 | * |
@@ -1060,7 +1050,15 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
1060 | mutex_lock_nested(&adap->bus_lock, adap->level); | 1050 | mutex_lock_nested(&adap->bus_lock, adap->level); |
1061 | } | 1051 | } |
1062 | 1052 | ||
1063 | ret = adap->algo->master_xfer(adap,msgs,num); | 1053 | /* Retry automatically on arbitration loss */ |
1054 | orig_jiffies = jiffies; | ||
1055 | for (ret = 0, try = 0; try <= adap->retries; try++) { | ||
1056 | ret = adap->algo->master_xfer(adap, msgs, num); | ||
1057 | if (ret != -EAGAIN) | ||
1058 | break; | ||
1059 | if (time_after(jiffies, orig_jiffies + adap->timeout)) | ||
1060 | break; | ||
1061 | } | ||
1064 | mutex_unlock(&adap->bus_lock); | 1062 | mutex_unlock(&adap->bus_lock); |
1065 | 1063 | ||
1066 | return ret; | 1064 | return ret; |
@@ -1509,7 +1507,7 @@ struct i2c_adapter* i2c_get_adapter(int id) | |||
1509 | struct i2c_adapter *adapter; | 1507 | struct i2c_adapter *adapter; |
1510 | 1508 | ||
1511 | mutex_lock(&core_lock); | 1509 | mutex_lock(&core_lock); |
1512 | adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id); | 1510 | adapter = idr_find(&i2c_adapter_idr, id); |
1513 | if (adapter && !try_module_get(adapter->owner)) | 1511 | if (adapter && !try_module_get(adapter->owner)) |
1514 | adapter = NULL; | 1512 | adapter = NULL; |
1515 | 1513 | ||
@@ -1995,14 +1993,27 @@ s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags, | |||
1995 | char read_write, u8 command, int protocol, | 1993 | char read_write, u8 command, int protocol, |
1996 | union i2c_smbus_data *data) | 1994 | union i2c_smbus_data *data) |
1997 | { | 1995 | { |
1996 | unsigned long orig_jiffies; | ||
1997 | int try; | ||
1998 | s32 res; | 1998 | s32 res; |
1999 | 1999 | ||
2000 | flags &= I2C_M_TEN | I2C_CLIENT_PEC; | 2000 | flags &= I2C_M_TEN | I2C_CLIENT_PEC; |
2001 | 2001 | ||
2002 | if (adapter->algo->smbus_xfer) { | 2002 | if (adapter->algo->smbus_xfer) { |
2003 | mutex_lock(&adapter->bus_lock); | 2003 | mutex_lock(&adapter->bus_lock); |
2004 | res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write, | 2004 | |
2005 | command, protocol, data); | 2005 | /* Retry automatically on arbitration loss */ |
2006 | orig_jiffies = jiffies; | ||
2007 | for (res = 0, try = 0; try <= adapter->retries; try++) { | ||
2008 | res = adapter->algo->smbus_xfer(adapter, addr, flags, | ||
2009 | read_write, command, | ||
2010 | protocol, data); | ||
2011 | if (res != -EAGAIN) | ||
2012 | break; | ||
2013 | if (time_after(jiffies, | ||
2014 | orig_jiffies + adapter->timeout)) | ||
2015 | break; | ||
2016 | } | ||
2006 | mutex_unlock(&adapter->bus_lock); | 2017 | mutex_unlock(&adapter->bus_lock); |
2007 | } else | 2018 | } else |
2008 | res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write, | 2019 | res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write, |