aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-06-16 14:29:17 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-06-16 14:29:17 -0400
commit4858704da75ba84ce21e6d4b3b974e8b8594c9f2 (patch)
tree153f92e4ac0d5c90890ee1b14458ea56e22f984e /drivers/i2c
parent86ade88e15b0852fa437e816037ecb266ae990ad (diff)
parent036533e232922ec6667817de9b037d0b1ebd062e (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/Kconfig6
-rw-r--r--drivers/i2c/busses/i2c-viapro.c4
-rw-r--r--drivers/i2c/busses/i2c-voodoo3.c1
-rw-r--r--drivers/i2c/chips/Kconfig15
-rw-r--r--drivers/i2c/chips/Makefile1
-rw-r--r--drivers/i2c/chips/max6875.c246
-rw-r--r--drivers/i2c/i2c-core.c43
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
213config I2C_VIAPRO 213config 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
164static struct i2c_adapter voodoo3_i2c_adapter = { 164static 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
67config 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
82config SENSORS_TSL2550 67config 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
13obj-$(CONFIG_DS1682) += ds1682.o 13obj-$(CONFIG_DS1682) += ds1682.o
14obj-$(CONFIG_SENSORS_MAX6875) += max6875.o
15obj-$(CONFIG_SENSORS_PCA9539) += pca9539.o 14obj-$(CONFIG_SENSORS_PCA9539) += pca9539.o
16obj-$(CONFIG_SENSORS_PCF8574) += pcf8574.o 15obj-$(CONFIG_SENSORS_PCF8574) += pcf8574.o
17obj-$(CONFIG_PCF8575) += pcf8575.o 16obj-$(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 */
37static const unsigned short normal_i2c[] = { I2C_CLIENT_END };
38
39/* Insmod parameters */
40I2C_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 */
55struct 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
64static 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 }
112exit_up:
113 mutex_unlock(&data->update_lock);
114}
115
116static 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
140static 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 */
150static 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
168static 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
194exit_remove_fake:
195 i2c_unregister_device(data->fake_client);
196exit_kfree:
197 kfree(data);
198 return err;
199}
200
201static 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
213static const struct i2c_device_id max6875_id[] = {
214 { "max6875", 0 },
215 { }
216};
217
218static 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
230static int __init max6875_init(void)
231{
232 return i2c_add_driver(&max6875_driver);
233}
234
235static void __exit max6875_exit(void)
236{
237 i2c_del_driver(&max6875_driver);
238}
239
240
241MODULE_AUTHOR("Ben Gardner <bgardner@wabtec.com>");
242MODULE_DESCRIPTION("MAX6875 driver");
243MODULE_LICENSE("GPL");
244
245module_init(max6875_init);
246module_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 */
1023int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) 1012int 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,