diff options
Diffstat (limited to 'drivers/i2c')
45 files changed, 458 insertions, 904 deletions
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile index cd170395a8c7..71c5a854ac5d 100644 --- a/drivers/i2c/Makefile +++ b/drivers/i2c/Makefile | |||
@@ -4,12 +4,8 @@ | |||
4 | 4 | ||
5 | obj-$(CONFIG_I2C) += i2c-core.o | 5 | obj-$(CONFIG_I2C) += i2c-core.o |
6 | obj-$(CONFIG_I2C_CHARDEV) += i2c-dev.o | 6 | obj-$(CONFIG_I2C_CHARDEV) += i2c-dev.o |
7 | obj-$(CONFIG_I2C_SENSOR) += i2c-sensor.o | ||
8 | obj-y += busses/ chips/ algos/ | 7 | obj-y += busses/ chips/ algos/ |
9 | 8 | ||
10 | i2c-sensor-objs := i2c-sensor-detect.o i2c-sensor-vid.o | ||
11 | |||
12 | |||
13 | ifeq ($(CONFIG_I2C_DEBUG_CORE),y) | 9 | ifeq ($(CONFIG_I2C_DEBUG_CORE),y) |
14 | EXTRA_CFLAGS += -DDEBUG | 10 | EXTRA_CFLAGS += -DDEBUG |
15 | endif | 11 | endif |
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index fb5b732238ed..df05df1a0ef6 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
@@ -519,8 +519,6 @@ static u32 bit_func(struct i2c_adapter *adap) | |||
519 | /* -----exported algorithm data: ------------------------------------- */ | 519 | /* -----exported algorithm data: ------------------------------------- */ |
520 | 520 | ||
521 | static struct i2c_algorithm i2c_bit_algo = { | 521 | static struct i2c_algorithm i2c_bit_algo = { |
522 | .name = "Bit-shift algorithm", | ||
523 | .id = I2C_ALGO_BIT, | ||
524 | .master_xfer = bit_xfer, | 522 | .master_xfer = bit_xfer, |
525 | .functionality = bit_func, | 523 | .functionality = bit_func, |
526 | }; | 524 | }; |
@@ -541,8 +539,6 @@ int i2c_bit_add_bus(struct i2c_adapter *adap) | |||
541 | DEB2(dev_dbg(&adap->dev, "hw routines registered.\n")); | 539 | DEB2(dev_dbg(&adap->dev, "hw routines registered.\n")); |
542 | 540 | ||
543 | /* register new adapter to i2c module... */ | 541 | /* register new adapter to i2c module... */ |
544 | |||
545 | adap->id |= i2c_bit_algo.id; | ||
546 | adap->algo = &i2c_bit_algo; | 542 | adap->algo = &i2c_bit_algo; |
547 | 543 | ||
548 | adap->timeout = 100; /* default values, should */ | 544 | adap->timeout = 100; /* default values, should */ |
diff --git a/drivers/i2c/algos/i2c-algo-ite.c b/drivers/i2c/algos/i2c-algo-ite.c index e6cae39f47aa..2db7bfc85225 100644 --- a/drivers/i2c/algos/i2c-algo-ite.c +++ b/drivers/i2c/algos/i2c-algo-ite.c | |||
@@ -713,8 +713,6 @@ static u32 iic_func(struct i2c_adapter *adap) | |||
713 | /* -----exported algorithm data: ------------------------------------- */ | 713 | /* -----exported algorithm data: ------------------------------------- */ |
714 | 714 | ||
715 | static struct i2c_algorithm iic_algo = { | 715 | static struct i2c_algorithm iic_algo = { |
716 | .name = "ITE IIC algorithm", | ||
717 | .id = I2C_ALGO_IIC, | ||
718 | .master_xfer = iic_xfer, | 716 | .master_xfer = iic_xfer, |
719 | .algo_control = algo_control, /* ioctl */ | 717 | .algo_control = algo_control, /* ioctl */ |
720 | .functionality = iic_func, | 718 | .functionality = iic_func, |
@@ -738,8 +736,6 @@ int i2c_iic_add_bus(struct i2c_adapter *adap) | |||
738 | adap->name)); | 736 | adap->name)); |
739 | 737 | ||
740 | /* register new adapter to i2c module... */ | 738 | /* register new adapter to i2c module... */ |
741 | |||
742 | adap->id |= iic_algo.id; | ||
743 | adap->algo = &iic_algo; | 739 | adap->algo = &iic_algo; |
744 | 740 | ||
745 | adap->timeout = 100; /* default values, should */ | 741 | adap->timeout = 100; /* default values, should */ |
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index cc3a952401f2..beb10edfe9c1 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
@@ -187,12 +187,14 @@ static int pca_xfer(struct i2c_adapter *i2c_adap, | |||
187 | int numbytes = 0; | 187 | int numbytes = 0; |
188 | int state; | 188 | int state; |
189 | int ret; | 189 | int ret; |
190 | int timeout = 100; | ||
190 | 191 | ||
191 | state = pca_status(adap); | 192 | while ((state = pca_status(adap)) != 0xf8 && timeout--) { |
192 | if ( state != 0xF8 ) { | 193 | msleep(10); |
193 | dev_dbg(&i2c_adap->dev, "bus is not idle. status is %#04x\n", state ); | 194 | } |
194 | /* FIXME: what to do. Force stop ? */ | 195 | if (state != 0xf8) { |
195 | return -EREMOTEIO; | 196 | dev_dbg(&i2c_adap->dev, "bus is not idle. status is %#04x\n", state); |
197 | return -EIO; | ||
196 | } | 198 | } |
197 | 199 | ||
198 | DEB1("{{{ XFER %d messages\n", num); | 200 | DEB1("{{{ XFER %d messages\n", num); |
@@ -354,8 +356,6 @@ static int pca_init(struct i2c_algo_pca_data *adap) | |||
354 | } | 356 | } |
355 | 357 | ||
356 | static struct i2c_algorithm pca_algo = { | 358 | static struct i2c_algorithm pca_algo = { |
357 | .name = "PCA9564 algorithm", | ||
358 | .id = I2C_ALGO_PCA, | ||
359 | .master_xfer = pca_xfer, | 359 | .master_xfer = pca_xfer, |
360 | .functionality = pca_func, | 360 | .functionality = pca_func, |
361 | }; | 361 | }; |
@@ -369,8 +369,6 @@ int i2c_pca_add_bus(struct i2c_adapter *adap) | |||
369 | int rval; | 369 | int rval; |
370 | 370 | ||
371 | /* register new adapter to i2c module... */ | 371 | /* register new adapter to i2c module... */ |
372 | |||
373 | adap->id |= pca_algo.id; | ||
374 | adap->algo = &pca_algo; | 372 | adap->algo = &pca_algo; |
375 | 373 | ||
376 | adap->timeout = 100; /* default values, should */ | 374 | adap->timeout = 100; /* default values, should */ |
diff --git a/drivers/i2c/algos/i2c-algo-pcf.c b/drivers/i2c/algos/i2c-algo-pcf.c index 8d087dac32af..6e498df1f717 100644 --- a/drivers/i2c/algos/i2c-algo-pcf.c +++ b/drivers/i2c/algos/i2c-algo-pcf.c | |||
@@ -459,8 +459,6 @@ static u32 pcf_func(struct i2c_adapter *adap) | |||
459 | /* -----exported algorithm data: ------------------------------------- */ | 459 | /* -----exported algorithm data: ------------------------------------- */ |
460 | 460 | ||
461 | static struct i2c_algorithm pcf_algo = { | 461 | static struct i2c_algorithm pcf_algo = { |
462 | .name = "PCF8584 algorithm", | ||
463 | .id = I2C_ALGO_PCF, | ||
464 | .master_xfer = pcf_xfer, | 462 | .master_xfer = pcf_xfer, |
465 | .functionality = pcf_func, | 463 | .functionality = pcf_func, |
466 | }; | 464 | }; |
@@ -476,8 +474,6 @@ int i2c_pcf_add_bus(struct i2c_adapter *adap) | |||
476 | DEB2(dev_dbg(&adap->dev, "hw routines registered.\n")); | 474 | DEB2(dev_dbg(&adap->dev, "hw routines registered.\n")); |
477 | 475 | ||
478 | /* register new adapter to i2c module... */ | 476 | /* register new adapter to i2c module... */ |
479 | |||
480 | adap->id |= pcf_algo.id; | ||
481 | adap->algo = &pcf_algo; | 477 | adap->algo = &pcf_algo; |
482 | 478 | ||
483 | adap->timeout = 100; /* default values, should */ | 479 | adap->timeout = 100; /* default values, should */ |
diff --git a/drivers/i2c/algos/i2c-algo-sgi.c b/drivers/i2c/algos/i2c-algo-sgi.c index 422721b241e5..932c4fa86c73 100644 --- a/drivers/i2c/algos/i2c-algo-sgi.c +++ b/drivers/i2c/algos/i2c-algo-sgi.c | |||
@@ -149,7 +149,7 @@ static int sgi_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, | |||
149 | err = i2c_write(adap, p->buf, p->len); | 149 | err = i2c_write(adap, p->buf, p->len); |
150 | } | 150 | } |
151 | 151 | ||
152 | return err; | 152 | return (err < 0) ? err : i; |
153 | } | 153 | } |
154 | 154 | ||
155 | static u32 sgi_func(struct i2c_adapter *adap) | 155 | static u32 sgi_func(struct i2c_adapter *adap) |
@@ -158,8 +158,6 @@ static u32 sgi_func(struct i2c_adapter *adap) | |||
158 | } | 158 | } |
159 | 159 | ||
160 | static struct i2c_algorithm sgi_algo = { | 160 | static struct i2c_algorithm sgi_algo = { |
161 | .name = "SGI algorithm", | ||
162 | .id = I2C_ALGO_SGI, | ||
163 | .master_xfer = sgi_xfer, | 161 | .master_xfer = sgi_xfer, |
164 | .functionality = sgi_func, | 162 | .functionality = sgi_func, |
165 | }; | 163 | }; |
@@ -169,7 +167,6 @@ static struct i2c_algorithm sgi_algo = { | |||
169 | */ | 167 | */ |
170 | int i2c_sgi_add_bus(struct i2c_adapter *adap) | 168 | int i2c_sgi_add_bus(struct i2c_adapter *adap) |
171 | { | 169 | { |
172 | adap->id |= sgi_algo.id; | ||
173 | adap->algo = &sgi_algo; | 170 | adap->algo = &sgi_algo; |
174 | 171 | ||
175 | return i2c_add_adapter(adap); | 172 | return i2c_add_adapter(adap); |
diff --git a/drivers/i2c/algos/i2c-algo-sibyte.c b/drivers/i2c/algos/i2c-algo-sibyte.c index f2785499237b..8ed5ad12552f 100644 --- a/drivers/i2c/algos/i2c-algo-sibyte.c +++ b/drivers/i2c/algos/i2c-algo-sibyte.c | |||
@@ -135,8 +135,6 @@ static u32 bit_func(struct i2c_adapter *adap) | |||
135 | /* -----exported algorithm data: ------------------------------------- */ | 135 | /* -----exported algorithm data: ------------------------------------- */ |
136 | 136 | ||
137 | static struct i2c_algorithm i2c_sibyte_algo = { | 137 | static struct i2c_algorithm i2c_sibyte_algo = { |
138 | .name = "SiByte algorithm", | ||
139 | .id = I2C_ALGO_SIBYTE, | ||
140 | .smbus_xfer = smbus_xfer, | 138 | .smbus_xfer = smbus_xfer, |
141 | .algo_control = algo_control, /* ioctl */ | 139 | .algo_control = algo_control, /* ioctl */ |
142 | .functionality = bit_func, | 140 | .functionality = bit_func, |
@@ -151,8 +149,6 @@ int i2c_sibyte_add_bus(struct i2c_adapter *i2c_adap, int speed) | |||
151 | struct i2c_algo_sibyte_data *adap = i2c_adap->algo_data; | 149 | struct i2c_algo_sibyte_data *adap = i2c_adap->algo_data; |
152 | 150 | ||
153 | /* register new adapter to i2c module... */ | 151 | /* register new adapter to i2c module... */ |
154 | |||
155 | i2c_adap->id |= i2c_sibyte_algo.id; | ||
156 | i2c_adap->algo = &i2c_sibyte_algo; | 152 | i2c_adap->algo = &i2c_sibyte_algo; |
157 | 153 | ||
158 | /* Set the frequency to 100 kHz */ | 154 | /* Set the frequency to 100 kHz */ |
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 916ba5e40a96..6e9da1372225 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -182,14 +182,8 @@ config I2C_IOP3XX | |||
182 | will be called i2c-iop3xx. | 182 | will be called i2c-iop3xx. |
183 | 183 | ||
184 | config I2C_ISA | 184 | config I2C_ISA |
185 | tristate "ISA Bus support" | 185 | tristate |
186 | depends on I2C | 186 | depends on I2C |
187 | help | ||
188 | If you say yes to this option, support will be included for i2c | ||
189 | interfaces that are on the ISA bus. | ||
190 | |||
191 | This driver can also be built as a module. If so, the module | ||
192 | will be called i2c-isa. | ||
193 | 187 | ||
194 | config I2C_ITE | 188 | config I2C_ITE |
195 | tristate "ITE I2C Adapter" | 189 | tristate "ITE I2C Adapter" |
diff --git a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c index f634a0780cf0..f021acd2674e 100644 --- a/drivers/i2c/busses/i2c-ali1535.c +++ b/drivers/i2c/busses/i2c-ali1535.c | |||
@@ -472,8 +472,6 @@ static u32 ali1535_func(struct i2c_adapter *adapter) | |||
472 | } | 472 | } |
473 | 473 | ||
474 | static struct i2c_algorithm smbus_algorithm = { | 474 | static struct i2c_algorithm smbus_algorithm = { |
475 | .name = "Non-i2c SMBus adapter", | ||
476 | .id = I2C_ALGO_SMBUS, | ||
477 | .smbus_xfer = ali1535_access, | 475 | .smbus_xfer = ali1535_access, |
478 | .functionality = ali1535_func, | 476 | .functionality = ali1535_func, |
479 | }; | 477 | }; |
diff --git a/drivers/i2c/busses/i2c-ali1563.c b/drivers/i2c/busses/i2c-ali1563.c index fdd881aee618..86947504aea1 100644 --- a/drivers/i2c/busses/i2c-ali1563.c +++ b/drivers/i2c/busses/i2c-ali1563.c | |||
@@ -366,8 +366,6 @@ static void ali1563_shutdown(struct pci_dev *dev) | |||
366 | } | 366 | } |
367 | 367 | ||
368 | static struct i2c_algorithm ali1563_algorithm = { | 368 | static struct i2c_algorithm ali1563_algorithm = { |
369 | .name = "Non-i2c SMBus adapter", | ||
370 | .id = I2C_ALGO_SMBUS, | ||
371 | .smbus_xfer = ali1563_access, | 369 | .smbus_xfer = ali1563_access, |
372 | .functionality = ali1563_func, | 370 | .functionality = ali1563_func, |
373 | }; | 371 | }; |
diff --git a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c index 0f781a1a3323..b3f50bff39a0 100644 --- a/drivers/i2c/busses/i2c-ali15x3.c +++ b/drivers/i2c/busses/i2c-ali15x3.c | |||
@@ -462,8 +462,6 @@ static u32 ali15x3_func(struct i2c_adapter *adapter) | |||
462 | } | 462 | } |
463 | 463 | ||
464 | static struct i2c_algorithm smbus_algorithm = { | 464 | static struct i2c_algorithm smbus_algorithm = { |
465 | .name = "Non-I2C SMBus adapter", | ||
466 | .id = I2C_ALGO_SMBUS, | ||
467 | .smbus_xfer = ali15x3_access, | 465 | .smbus_xfer = ali15x3_access, |
468 | .functionality = ali15x3_func, | 466 | .functionality = ali15x3_func, |
469 | }; | 467 | }; |
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c index 6347ebc6fb53..6ad0603384b8 100644 --- a/drivers/i2c/busses/i2c-amd756.c +++ b/drivers/i2c/busses/i2c-amd756.c | |||
@@ -295,8 +295,6 @@ static u32 amd756_func(struct i2c_adapter *adapter) | |||
295 | } | 295 | } |
296 | 296 | ||
297 | static struct i2c_algorithm smbus_algorithm = { | 297 | static struct i2c_algorithm smbus_algorithm = { |
298 | .name = "Non-I2C SMBus adapter", | ||
299 | .id = I2C_ALGO_SMBUS, | ||
300 | .smbus_xfer = amd756_access, | 298 | .smbus_xfer = amd756_access, |
301 | .functionality = amd756_func, | 299 | .functionality = amd756_func, |
302 | }; | 300 | }; |
diff --git a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c index d6644481d2a0..45ea24ba14d5 100644 --- a/drivers/i2c/busses/i2c-amd8111.c +++ b/drivers/i2c/busses/i2c-amd8111.c | |||
@@ -323,8 +323,6 @@ static u32 amd8111_func(struct i2c_adapter *adapter) | |||
323 | } | 323 | } |
324 | 324 | ||
325 | static struct i2c_algorithm smbus_algorithm = { | 325 | static struct i2c_algorithm smbus_algorithm = { |
326 | .name = "Non-I2C SMBus 2.0 adapter", | ||
327 | .id = I2C_ALGO_SMBUS, | ||
328 | .smbus_xfer = amd8111_access, | 326 | .smbus_xfer = amd8111_access, |
329 | .functionality = amd8111_func, | 327 | .functionality = amd8111_func, |
330 | }; | 328 | }; |
diff --git a/drivers/i2c/busses/i2c-au1550.c b/drivers/i2c/busses/i2c-au1550.c index a7ff112e49bf..d06edce03bf4 100644 --- a/drivers/i2c/busses/i2c-au1550.c +++ b/drivers/i2c/busses/i2c-au1550.c | |||
@@ -283,8 +283,6 @@ au1550_func(struct i2c_adapter *adap) | |||
283 | } | 283 | } |
284 | 284 | ||
285 | static struct i2c_algorithm au1550_algo = { | 285 | static struct i2c_algorithm au1550_algo = { |
286 | .name = "Au1550 algorithm", | ||
287 | .id = I2C_ALGO_AU1550, | ||
288 | .master_xfer = au1550_xfer, | 286 | .master_xfer = au1550_xfer, |
289 | .functionality = au1550_func, | 287 | .functionality = au1550_func, |
290 | }; | 288 | }; |
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 1ab41313ce51..709beab76609 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
@@ -535,8 +535,6 @@ static u32 i801_func(struct i2c_adapter *adapter) | |||
535 | } | 535 | } |
536 | 536 | ||
537 | static struct i2c_algorithm smbus_algorithm = { | 537 | static struct i2c_algorithm smbus_algorithm = { |
538 | .name = "Non-I2C SMBus adapter", | ||
539 | .id = I2C_ALGO_SMBUS, | ||
540 | .smbus_xfer = i801_access, | 538 | .smbus_xfer = i801_access, |
541 | .functionality = i801_func, | 539 | .functionality = i801_func, |
542 | }; | 540 | }; |
diff --git a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c index 93ca36dc777e..a3ed9590f028 100644 --- a/drivers/i2c/busses/i2c-ibm_iic.c +++ b/drivers/i2c/busses/i2c-ibm_iic.c | |||
@@ -627,8 +627,6 @@ static u32 iic_func(struct i2c_adapter *adap) | |||
627 | } | 627 | } |
628 | 628 | ||
629 | static struct i2c_algorithm iic_algo = { | 629 | static struct i2c_algorithm iic_algo = { |
630 | .name = "IBM IIC algorithm", | ||
631 | .id = I2C_ALGO_OCP, | ||
632 | .master_xfer = iic_xfer, | 630 | .master_xfer = iic_xfer, |
633 | .functionality = iic_func | 631 | .functionality = iic_func |
634 | }; | 632 | }; |
@@ -727,7 +725,7 @@ static int __devinit iic_probe(struct ocp_device *ocp){ | |||
727 | adap = &dev->adap; | 725 | adap = &dev->adap; |
728 | strcpy(adap->name, "IBM IIC"); | 726 | strcpy(adap->name, "IBM IIC"); |
729 | i2c_set_adapdata(adap, dev); | 727 | i2c_set_adapdata(adap, dev); |
730 | adap->id = I2C_HW_OCP | iic_algo.id; | 728 | adap->id = I2C_HW_OCP; |
731 | adap->algo = &iic_algo; | 729 | adap->algo = &iic_algo; |
732 | adap->client_register = NULL; | 730 | adap->client_register = NULL; |
733 | adap->client_unregister = NULL; | 731 | adap->client_unregister = NULL; |
diff --git a/drivers/i2c/busses/i2c-iop3xx.c b/drivers/i2c/busses/i2c-iop3xx.c index 6b682e903f09..7bd9102db701 100644 --- a/drivers/i2c/busses/i2c-iop3xx.c +++ b/drivers/i2c/busses/i2c-iop3xx.c | |||
@@ -399,8 +399,6 @@ iop3xx_i2c_func(struct i2c_adapter *adap) | |||
399 | } | 399 | } |
400 | 400 | ||
401 | static struct i2c_algorithm iop3xx_i2c_algo = { | 401 | static struct i2c_algorithm iop3xx_i2c_algo = { |
402 | .name = "IOP3xx I2C algorithm", | ||
403 | .id = I2C_ALGO_IOP3XX, | ||
404 | .master_xfer = iop3xx_i2c_master_xfer, | 402 | .master_xfer = iop3xx_i2c_master_xfer, |
405 | .algo_control = iop3xx_i2c_algo_control, | 403 | .algo_control = iop3xx_i2c_algo_control, |
406 | .functionality = iop3xx_i2c_func, | 404 | .functionality = iop3xx_i2c_func, |
diff --git a/drivers/i2c/busses/i2c-isa.c b/drivers/i2c/busses/i2c-isa.c index 00e7f7157b75..bdc6806dafae 100644 --- a/drivers/i2c/busses/i2c-isa.c +++ b/drivers/i2c/busses/i2c-isa.c | |||
@@ -1,6 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | i2c-isa.c - Part of lm_sensors, Linux kernel modules for hardware | 2 | i2c-isa.c - an i2c-core-like thing for ISA hardware monitoring chips |
3 | monitoring | 3 | Copyright (C) 2005 Jean Delvare <khali@linux-fr.org> |
4 | |||
5 | Based on the i2c-isa pseudo-adapter from the lm_sensors project | ||
4 | Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl> | 6 | Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl> |
5 | 7 | ||
6 | This program is free software; you can redistribute it and/or modify | 8 | This program is free software; you can redistribute it and/or modify |
@@ -18,30 +20,36 @@ | |||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 | */ | 21 | */ |
20 | 22 | ||
21 | /* This implements an i2c algorithm/adapter for ISA bus. Not that this is | 23 | /* This implements an i2c-core-like thing for ISA hardware monitoring |
22 | on first sight very useful; almost no functionality is preserved. | 24 | chips. Such chips are linked to the i2c subsystem for historical |
23 | Except that it makes writing drivers for chips which can be on both | 25 | reasons (because the early ISA hardware monitoring chips such as the |
24 | the SMBus and the ISA bus very much easier. See lm78.c for an example | 26 | LM78 had both an I2C and an ISA interface). They used to be |
25 | of this. */ | 27 | registered with the main i2c-core, but as a first step in the |
28 | direction of a clean separation between I2C and ISA chip drivers, | ||
29 | we now have this separate core for ISA ones. It is significantly | ||
30 | more simple than the real one, of course, because we don't have to | ||
31 | handle multiple busses: there is only one (fake) ISA adapter. | ||
32 | It is worth noting that we still rely on i2c-core for some things | ||
33 | at the moment - but hopefully this won't last. */ | ||
26 | 34 | ||
27 | #include <linux/init.h> | 35 | #include <linux/init.h> |
28 | #include <linux/module.h> | 36 | #include <linux/module.h> |
29 | #include <linux/kernel.h> | 37 | #include <linux/kernel.h> |
30 | #include <linux/errno.h> | 38 | #include <linux/errno.h> |
31 | #include <linux/i2c.h> | 39 | #include <linux/i2c.h> |
40 | #include <linux/i2c-isa.h> | ||
32 | 41 | ||
33 | static u32 isa_func(struct i2c_adapter *adapter); | 42 | static u32 isa_func(struct i2c_adapter *adapter); |
34 | 43 | ||
35 | /* This is the actual algorithm we define */ | 44 | /* This is the actual algorithm we define */ |
36 | static struct i2c_algorithm isa_algorithm = { | 45 | static struct i2c_algorithm isa_algorithm = { |
37 | .name = "ISA bus algorithm", | ||
38 | .id = I2C_ALGO_ISA, | ||
39 | .functionality = isa_func, | 46 | .functionality = isa_func, |
40 | }; | 47 | }; |
41 | 48 | ||
42 | /* There can only be one... */ | 49 | /* There can only be one... */ |
43 | static struct i2c_adapter isa_adapter = { | 50 | static struct i2c_adapter isa_adapter = { |
44 | .owner = THIS_MODULE, | 51 | .owner = THIS_MODULE, |
52 | .id = I2C_HW_ISA, | ||
45 | .class = I2C_CLASS_HWMON, | 53 | .class = I2C_CLASS_HWMON, |
46 | .algo = &isa_algorithm, | 54 | .algo = &isa_algorithm, |
47 | .name = "ISA main adapter", | 55 | .name = "ISA main adapter", |
@@ -53,17 +61,146 @@ static u32 isa_func(struct i2c_adapter *adapter) | |||
53 | return 0; | 61 | return 0; |
54 | } | 62 | } |
55 | 63 | ||
64 | |||
65 | /* Copied from i2c-core */ | ||
66 | static ssize_t show_adapter_name(struct device *dev, | ||
67 | struct device_attribute *attr, char *buf) | ||
68 | { | ||
69 | struct i2c_adapter *adap = dev_to_i2c_adapter(dev); | ||
70 | return sprintf(buf, "%s\n", adap->name); | ||
71 | } | ||
72 | static DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL); | ||
73 | |||
74 | static int i2c_isa_device_probe(struct device *dev) | ||
75 | { | ||
76 | return -ENODEV; | ||
77 | } | ||
78 | |||
79 | static int i2c_isa_device_remove(struct device *dev) | ||
80 | { | ||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | |||
85 | /* We implement an interface which resembles i2c_{add,del}_driver, | ||
86 | but for i2c-isa drivers. We don't have to remember and handle lists | ||
87 | of drivers and adapters so this is much more simple, of course. */ | ||
88 | |||
89 | int i2c_isa_add_driver(struct i2c_driver *driver) | ||
90 | { | ||
91 | int res; | ||
92 | |||
93 | /* Add the driver to the list of i2c drivers in the driver core */ | ||
94 | driver->driver.name = driver->name; | ||
95 | driver->driver.bus = &i2c_bus_type; | ||
96 | driver->driver.probe = i2c_isa_device_probe; | ||
97 | driver->driver.remove = i2c_isa_device_remove; | ||
98 | res = driver_register(&driver->driver); | ||
99 | if (res) | ||
100 | return res; | ||
101 | dev_dbg(&isa_adapter.dev, "Driver %s registered\n", driver->name); | ||
102 | |||
103 | /* Now look for clients */ | ||
104 | driver->attach_adapter(&isa_adapter); | ||
105 | |||
106 | return 0; | ||
107 | } | ||
108 | |||
109 | int i2c_isa_del_driver(struct i2c_driver *driver) | ||
110 | { | ||
111 | struct list_head *item, *_n; | ||
112 | struct i2c_client *client; | ||
113 | int res; | ||
114 | |||
115 | /* Detach all clients belonging to this one driver */ | ||
116 | list_for_each_safe(item, _n, &isa_adapter.clients) { | ||
117 | client = list_entry(item, struct i2c_client, list); | ||
118 | if (client->driver != driver) | ||
119 | continue; | ||
120 | dev_dbg(&isa_adapter.dev, "Detaching client %s at 0x%x\n", | ||
121 | client->name, client->addr); | ||
122 | if ((res = driver->detach_client(client))) { | ||
123 | dev_err(&isa_adapter.dev, "Failed, driver " | ||
124 | "%s not unregistered!\n", | ||
125 | driver->name); | ||
126 | return res; | ||
127 | } | ||
128 | } | ||
129 | |||
130 | /* Get the driver off the core list */ | ||
131 | driver_unregister(&driver->driver); | ||
132 | dev_dbg(&isa_adapter.dev, "Driver %s unregistered\n", driver->name); | ||
133 | |||
134 | return 0; | ||
135 | } | ||
136 | |||
137 | |||
56 | static int __init i2c_isa_init(void) | 138 | static int __init i2c_isa_init(void) |
57 | { | 139 | { |
58 | return i2c_add_adapter(&isa_adapter); | 140 | init_MUTEX(&isa_adapter.clist_lock); |
141 | INIT_LIST_HEAD(&isa_adapter.clients); | ||
142 | |||
143 | isa_adapter.nr = ANY_I2C_ISA_BUS; | ||
144 | isa_adapter.dev.parent = &platform_bus; | ||
145 | sprintf(isa_adapter.dev.bus_id, "i2c-%d", isa_adapter.nr); | ||
146 | isa_adapter.dev.driver = &i2c_adapter_driver; | ||
147 | isa_adapter.dev.release = &i2c_adapter_dev_release; | ||
148 | device_register(&isa_adapter.dev); | ||
149 | device_create_file(&isa_adapter.dev, &dev_attr_name); | ||
150 | |||
151 | /* Add this adapter to the i2c_adapter class */ | ||
152 | memset(&isa_adapter.class_dev, 0x00, sizeof(struct class_device)); | ||
153 | isa_adapter.class_dev.dev = &isa_adapter.dev; | ||
154 | isa_adapter.class_dev.class = &i2c_adapter_class; | ||
155 | strlcpy(isa_adapter.class_dev.class_id, isa_adapter.dev.bus_id, | ||
156 | BUS_ID_SIZE); | ||
157 | class_device_register(&isa_adapter.class_dev); | ||
158 | |||
159 | dev_dbg(&isa_adapter.dev, "%s registered\n", isa_adapter.name); | ||
160 | |||
161 | return 0; | ||
59 | } | 162 | } |
60 | 163 | ||
61 | static void __exit i2c_isa_exit(void) | 164 | static void __exit i2c_isa_exit(void) |
62 | { | 165 | { |
63 | i2c_del_adapter(&isa_adapter); | 166 | #ifdef DEBUG |
167 | struct list_head *item, *_n; | ||
168 | struct i2c_client *client = NULL; | ||
169 | #endif | ||
170 | |||
171 | /* There should be no more active client */ | ||
172 | #ifdef DEBUG | ||
173 | dev_dbg(&isa_adapter.dev, "Looking for clients\n"); | ||
174 | list_for_each_safe(item, _n, &isa_adapter.clients) { | ||
175 | client = list_entry(item, struct i2c_client, list); | ||
176 | dev_err(&isa_adapter.dev, "Driver %s still has an active " | ||
177 | "ISA client at 0x%x\n", client->driver->name, | ||
178 | client->addr); | ||
179 | } | ||
180 | if (client != NULL) | ||
181 | return; | ||
182 | #endif | ||
183 | |||
184 | /* Clean up the sysfs representation */ | ||
185 | dev_dbg(&isa_adapter.dev, "Unregistering from sysfs\n"); | ||
186 | init_completion(&isa_adapter.dev_released); | ||
187 | init_completion(&isa_adapter.class_dev_released); | ||
188 | class_device_unregister(&isa_adapter.class_dev); | ||
189 | device_remove_file(&isa_adapter.dev, &dev_attr_name); | ||
190 | device_unregister(&isa_adapter.dev); | ||
191 | |||
192 | /* Wait for sysfs to drop all references */ | ||
193 | dev_dbg(&isa_adapter.dev, "Waiting for sysfs completion\n"); | ||
194 | wait_for_completion(&isa_adapter.dev_released); | ||
195 | wait_for_completion(&isa_adapter.class_dev_released); | ||
196 | |||
197 | dev_dbg(&isa_adapter.dev, "%s unregistered\n", isa_adapter.name); | ||
64 | } | 198 | } |
65 | 199 | ||
66 | MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>"); | 200 | EXPORT_SYMBOL(i2c_isa_add_driver); |
201 | EXPORT_SYMBOL(i2c_isa_del_driver); | ||
202 | |||
203 | MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>"); | ||
67 | MODULE_DESCRIPTION("ISA bus access through i2c"); | 204 | MODULE_DESCRIPTION("ISA bus access through i2c"); |
68 | MODULE_LICENSE("GPL"); | 205 | MODULE_LICENSE("GPL"); |
69 | 206 | ||
diff --git a/drivers/i2c/busses/i2c-keywest.c b/drivers/i2c/busses/i2c-keywest.c index 94ae808314f7..37b49c2daf5f 100644 --- a/drivers/i2c/busses/i2c-keywest.c +++ b/drivers/i2c/busses/i2c-keywest.c | |||
@@ -87,12 +87,9 @@ static const char *__kw_state_names[] = { | |||
87 | }; | 87 | }; |
88 | #endif /* DEBUG */ | 88 | #endif /* DEBUG */ |
89 | 89 | ||
90 | static int probe; | ||
91 | |||
92 | MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>"); | 90 | MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>"); |
93 | MODULE_DESCRIPTION("I2C driver for Apple's Keywest"); | 91 | MODULE_DESCRIPTION("I2C driver for Apple's Keywest"); |
94 | MODULE_LICENSE("GPL"); | 92 | MODULE_LICENSE("GPL"); |
95 | module_param(probe, bool, 0); | ||
96 | 93 | ||
97 | #ifdef POLLED_MODE | 94 | #ifdef POLLED_MODE |
98 | /* Don't schedule, the g5 fan controller is too | 95 | /* Don't schedule, the g5 fan controller is too |
@@ -498,8 +495,6 @@ keywest_func(struct i2c_adapter * adapter) | |||
498 | 495 | ||
499 | /* For now, we only handle combined mode (smbus) */ | 496 | /* For now, we only handle combined mode (smbus) */ |
500 | static struct i2c_algorithm keywest_algorithm = { | 497 | static struct i2c_algorithm keywest_algorithm = { |
501 | .name = "Keywest i2c", | ||
502 | .id = I2C_ALGO_SMBUS, | ||
503 | .smbus_xfer = keywest_smbus_xfer, | 498 | .smbus_xfer = keywest_smbus_xfer, |
504 | .master_xfer = keywest_xfer, | 499 | .master_xfer = keywest_xfer, |
505 | .functionality = keywest_func, | 500 | .functionality = keywest_func, |
@@ -621,7 +616,6 @@ create_iface(struct device_node *np, struct device *dev) | |||
621 | sprintf(chan->adapter.name, "%s %d", np->parent->name, i); | 616 | sprintf(chan->adapter.name, "%s %d", np->parent->name, i); |
622 | chan->iface = iface; | 617 | chan->iface = iface; |
623 | chan->chan_no = i; | 618 | chan->chan_no = i; |
624 | chan->adapter.id = I2C_ALGO_SMBUS; | ||
625 | chan->adapter.algo = &keywest_algorithm; | 619 | chan->adapter.algo = &keywest_algorithm; |
626 | chan->adapter.algo_data = NULL; | 620 | chan->adapter.algo_data = NULL; |
627 | chan->adapter.client_register = NULL; | 621 | chan->adapter.client_register = NULL; |
@@ -635,15 +629,6 @@ create_iface(struct device_node *np, struct device *dev) | |||
635 | chan->adapter.name); | 629 | chan->adapter.name); |
636 | i2c_set_adapdata(&chan->adapter, NULL); | 630 | i2c_set_adapdata(&chan->adapter, NULL); |
637 | } | 631 | } |
638 | if (probe) { | ||
639 | printk("Probe: "); | ||
640 | for (addr = 0x00; addr <= 0x7f; addr++) { | ||
641 | if (i2c_smbus_xfer(&chan->adapter,addr, | ||
642 | 0,0,0,I2C_SMBUS_QUICK,NULL) >= 0) | ||
643 | printk("%02x ", addr); | ||
644 | } | ||
645 | printk("\n"); | ||
646 | } | ||
647 | } | 632 | } |
648 | 633 | ||
649 | printk(KERN_INFO "Found KeyWest i2c on \"%s\", %d channel%s, stepping: %d bits\n", | 634 | printk(KERN_INFO "Found KeyWest i2c on \"%s\", %d channel%s, stepping: %d bits\n", |
diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index 9ad3e9262e8a..f065583ddcf1 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c | |||
@@ -272,8 +272,6 @@ static u32 mpc_functionality(struct i2c_adapter *adap) | |||
272 | } | 272 | } |
273 | 273 | ||
274 | static struct i2c_algorithm mpc_algo = { | 274 | static struct i2c_algorithm mpc_algo = { |
275 | .name = "MPC algorithm", | ||
276 | .id = I2C_ALGO_MPC107, | ||
277 | .master_xfer = mpc_xfer, | 275 | .master_xfer = mpc_xfer, |
278 | .functionality = mpc_functionality, | 276 | .functionality = mpc_functionality, |
279 | }; | 277 | }; |
@@ -281,7 +279,7 @@ static struct i2c_algorithm mpc_algo = { | |||
281 | static struct i2c_adapter mpc_ops = { | 279 | static struct i2c_adapter mpc_ops = { |
282 | .owner = THIS_MODULE, | 280 | .owner = THIS_MODULE, |
283 | .name = "MPC adapter", | 281 | .name = "MPC adapter", |
284 | .id = I2C_ALGO_MPC107 | I2C_HW_MPC107, | 282 | .id = I2C_HW_MPC107, |
285 | .algo = &mpc_algo, | 283 | .algo = &mpc_algo, |
286 | .class = I2C_CLASS_HWMON, | 284 | .class = I2C_CLASS_HWMON, |
287 | .timeout = 1, | 285 | .timeout = 1, |
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index 5b852782d2f5..99abca45fece 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c | |||
@@ -423,18 +423,16 @@ static int | |||
423 | mv64xxx_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | 423 | mv64xxx_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) |
424 | { | 424 | { |
425 | struct mv64xxx_i2c_data *drv_data = i2c_get_adapdata(adap); | 425 | struct mv64xxx_i2c_data *drv_data = i2c_get_adapdata(adap); |
426 | int i, rc = 0; | 426 | int i, rc; |
427 | 427 | ||
428 | for (i=0; i<num; i++) | 428 | for (i=0; i<num; i++) |
429 | if ((rc = mv64xxx_i2c_execute_msg(drv_data, &msgs[i])) != 0) | 429 | if ((rc = mv64xxx_i2c_execute_msg(drv_data, &msgs[i])) < 0) |
430 | break; | 430 | return rc; |
431 | 431 | ||
432 | return rc; | 432 | return num; |
433 | } | 433 | } |
434 | 434 | ||
435 | static struct i2c_algorithm mv64xxx_i2c_algo = { | 435 | static struct i2c_algorithm mv64xxx_i2c_algo = { |
436 | .name = MV64XXX_I2C_CTLR_NAME " algorithm", | ||
437 | .id = I2C_ALGO_MV64XXX, | ||
438 | .master_xfer = mv64xxx_i2c_xfer, | 436 | .master_xfer = mv64xxx_i2c_xfer, |
439 | .functionality = mv64xxx_i2c_functionality, | 437 | .functionality = mv64xxx_i2c_functionality, |
440 | }; | 438 | }; |
@@ -523,7 +521,7 @@ mv64xxx_i2c_probe(struct device *dev) | |||
523 | drv_data->freq_m = pdata->freq_m; | 521 | drv_data->freq_m = pdata->freq_m; |
524 | drv_data->freq_n = pdata->freq_n; | 522 | drv_data->freq_n = pdata->freq_n; |
525 | drv_data->irq = platform_get_irq(pd, 0); | 523 | drv_data->irq = platform_get_irq(pd, 0); |
526 | drv_data->adapter.id = I2C_ALGO_MV64XXX | I2C_HW_MV64XXX; | 524 | drv_data->adapter.id = I2C_HW_MV64XXX; |
527 | drv_data->adapter.algo = &mv64xxx_i2c_algo; | 525 | drv_data->adapter.algo = &mv64xxx_i2c_algo; |
528 | drv_data->adapter.owner = THIS_MODULE; | 526 | drv_data->adapter.owner = THIS_MODULE; |
529 | drv_data->adapter.class = I2C_CLASS_HWMON; | 527 | drv_data->adapter.class = I2C_CLASS_HWMON; |
diff --git a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c index 74eb89aa9350..e0b7a913431e 100644 --- a/drivers/i2c/busses/i2c-nforce2.c +++ b/drivers/i2c/busses/i2c-nforce2.c | |||
@@ -110,8 +110,6 @@ static u32 nforce2_func(struct i2c_adapter *adapter); | |||
110 | 110 | ||
111 | 111 | ||
112 | static struct i2c_algorithm smbus_algorithm = { | 112 | static struct i2c_algorithm smbus_algorithm = { |
113 | .name = "Non-I2C SMBus adapter", | ||
114 | .id = I2C_ALGO_SMBUS, | ||
115 | .smbus_xfer = nforce2_access, | 113 | .smbus_xfer = nforce2_access, |
116 | .functionality = nforce2_func, | 114 | .functionality = nforce2_func, |
117 | }; | 115 | }; |
@@ -131,7 +129,6 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
131 | struct nforce2_smbus *smbus = adap->algo_data; | 129 | struct nforce2_smbus *smbus = adap->algo_data; |
132 | unsigned char protocol, pec, temp; | 130 | unsigned char protocol, pec, temp; |
133 | unsigned char len = 0; /* to keep the compiler quiet */ | 131 | unsigned char len = 0; /* to keep the compiler quiet */ |
134 | int timeout = 0; | ||
135 | int i; | 132 | int i; |
136 | 133 | ||
137 | protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ : | 134 | protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ : |
@@ -191,29 +188,10 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
191 | case I2C_SMBUS_PROC_CALL: | 188 | case I2C_SMBUS_PROC_CALL: |
192 | dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); | 189 | dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); |
193 | return -1; | 190 | return -1; |
194 | /* | ||
195 | outb_p(command, NVIDIA_SMB_CMD); | ||
196 | outb_p(data->word, NVIDIA_SMB_DATA); | ||
197 | outb_p(data->word >> 8, NVIDIA_SMB_DATA + 1); | ||
198 | protocol = NVIDIA_SMB_PRTCL_PROC_CALL | pec; | ||
199 | read_write = I2C_SMBUS_READ; | ||
200 | break; | ||
201 | */ | ||
202 | 191 | ||
203 | case I2C_SMBUS_BLOCK_PROC_CALL: | 192 | case I2C_SMBUS_BLOCK_PROC_CALL: |
204 | dev_err(&adap->dev, "I2C_SMBUS_BLOCK_PROC_CALL not supported!\n"); | 193 | dev_err(&adap->dev, "I2C_SMBUS_BLOCK_PROC_CALL not supported!\n"); |
205 | return -1; | 194 | return -1; |
206 | /* | ||
207 | protocol |= pec; | ||
208 | len = min_t(u8, data->block[0], 31); | ||
209 | outb_p(command, NVIDIA_SMB_CMD); | ||
210 | outb_p(len, NVIDIA_SMB_BCNT); | ||
211 | for (i = 0; i < len; i++) | ||
212 | outb_p(data->block[i + 1], NVIDIA_SMB_DATA + i); | ||
213 | protocol = NVIDIA_SMB_PRTCL_BLOCK_PROC_CALL | pec; | ||
214 | read_write = I2C_SMBUS_READ; | ||
215 | break; | ||
216 | */ | ||
217 | 195 | ||
218 | case I2C_SMBUS_WORD_DATA_PEC: | 196 | case I2C_SMBUS_WORD_DATA_PEC: |
219 | case I2C_SMBUS_BLOCK_DATA_PEC: | 197 | case I2C_SMBUS_BLOCK_DATA_PEC: |
@@ -232,12 +210,6 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
232 | 210 | ||
233 | temp = inb_p(NVIDIA_SMB_STS); | 211 | temp = inb_p(NVIDIA_SMB_STS); |
234 | 212 | ||
235 | #if 0 | ||
236 | do { | ||
237 | i2c_do_pause(1); | ||
238 | temp = inb_p(NVIDIA_SMB_STS); | ||
239 | } while (((temp & NVIDIA_SMB_STS_DONE) == 0) && (timeout++ < MAX_TIMEOUT)); | ||
240 | #endif | ||
241 | if (~temp & NVIDIA_SMB_STS_DONE) { | 213 | if (~temp & NVIDIA_SMB_STS_DONE) { |
242 | udelay(500); | 214 | udelay(500); |
243 | temp = inb_p(NVIDIA_SMB_STS); | 215 | temp = inb_p(NVIDIA_SMB_STS); |
@@ -247,9 +219,10 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
247 | temp = inb_p(NVIDIA_SMB_STS); | 219 | temp = inb_p(NVIDIA_SMB_STS); |
248 | } | 220 | } |
249 | 221 | ||
250 | if ((timeout >= MAX_TIMEOUT) || (~temp & NVIDIA_SMB_STS_DONE) | 222 | if ((~temp & NVIDIA_SMB_STS_DONE) || (temp & NVIDIA_SMB_STS_STATUS)) { |
251 | || (temp & NVIDIA_SMB_STS_STATUS)) | 223 | dev_dbg(&adap->dev, "SMBus Timeout! (0x%02x)\n", temp); |
252 | return -1; | 224 | return -1; |
225 | } | ||
253 | 226 | ||
254 | if (read_write == I2C_SMBUS_WRITE) | 227 | if (read_write == I2C_SMBUS_WRITE) |
255 | return 0; | 228 | return 0; |
diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index 6d34ee381ce1..6d48a4da7bed 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c | |||
@@ -399,8 +399,6 @@ static u32 piix4_func(struct i2c_adapter *adapter) | |||
399 | } | 399 | } |
400 | 400 | ||
401 | static struct i2c_algorithm smbus_algorithm = { | 401 | static struct i2c_algorithm smbus_algorithm = { |
402 | .name = "Non-I2C SMBus adapter", | ||
403 | .id = I2C_ALGO_SMBUS, | ||
404 | .smbus_xfer = piix4_access, | 402 | .smbus_xfer = piix4_access, |
405 | .functionality = piix4_func, | 403 | .functionality = piix4_func, |
406 | }; | 404 | }; |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index a3b38257cc3d..73a092fb0e7e 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
@@ -568,7 +568,6 @@ static u32 s3c24xx_i2c_func(struct i2c_adapter *adap) | |||
568 | /* i2c bus registration info */ | 568 | /* i2c bus registration info */ |
569 | 569 | ||
570 | static struct i2c_algorithm s3c24xx_i2c_algorithm = { | 570 | static struct i2c_algorithm s3c24xx_i2c_algorithm = { |
571 | .name = "S3C2410-I2C-Algorithm", | ||
572 | .master_xfer = s3c24xx_i2c_xfer, | 571 | .master_xfer = s3c24xx_i2c_xfer, |
573 | .functionality = s3c24xx_i2c_func, | 572 | .functionality = s3c24xx_i2c_func, |
574 | }; | 573 | }; |
diff --git a/drivers/i2c/busses/i2c-sis5595.c b/drivers/i2c/busses/i2c-sis5595.c index bbd5e4e52f09..080318d6f54b 100644 --- a/drivers/i2c/busses/i2c-sis5595.c +++ b/drivers/i2c/busses/i2c-sis5595.c | |||
@@ -357,8 +357,6 @@ static u32 sis5595_func(struct i2c_adapter *adapter) | |||
357 | } | 357 | } |
358 | 358 | ||
359 | static struct i2c_algorithm smbus_algorithm = { | 359 | static struct i2c_algorithm smbus_algorithm = { |
360 | .name = "Non-I2C SMBus adapter", | ||
361 | .id = I2C_ALGO_SMBUS, | ||
362 | .smbus_xfer = sis5595_access, | 360 | .smbus_xfer = sis5595_access, |
363 | .functionality = sis5595_func, | 361 | .functionality = sis5595_func, |
364 | }; | 362 | }; |
diff --git a/drivers/i2c/busses/i2c-sis630.c b/drivers/i2c/busses/i2c-sis630.c index f58455e7689e..86f0f448fa0b 100644 --- a/drivers/i2c/busses/i2c-sis630.c +++ b/drivers/i2c/busses/i2c-sis630.c | |||
@@ -448,8 +448,6 @@ exit: | |||
448 | 448 | ||
449 | 449 | ||
450 | static struct i2c_algorithm smbus_algorithm = { | 450 | static struct i2c_algorithm smbus_algorithm = { |
451 | .name = "Non-I2C SMBus adapter", | ||
452 | .id = I2C_ALGO_SMBUS, | ||
453 | .smbus_xfer = sis630_access, | 451 | .smbus_xfer = sis630_access, |
454 | .functionality = sis630_func, | 452 | .functionality = sis630_func, |
455 | }; | 453 | }; |
diff --git a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c index 6484792e23a1..ead2ff3cf60e 100644 --- a/drivers/i2c/busses/i2c-sis96x.c +++ b/drivers/i2c/busses/i2c-sis96x.c | |||
@@ -249,8 +249,6 @@ static u32 sis96x_func(struct i2c_adapter *adapter) | |||
249 | } | 249 | } |
250 | 250 | ||
251 | static struct i2c_algorithm smbus_algorithm = { | 251 | static struct i2c_algorithm smbus_algorithm = { |
252 | .name = "Non-I2C SMBus adapter", | ||
253 | .id = I2C_ALGO_SMBUS, | ||
254 | .smbus_xfer = sis96x_access, | 252 | .smbus_xfer = sis96x_access, |
255 | .functionality = sis96x_func, | 253 | .functionality = sis96x_func, |
256 | }; | 254 | }; |
diff --git a/drivers/i2c/busses/i2c-stub.c b/drivers/i2c/busses/i2c-stub.c index 00d94e886955..73f481e93a36 100644 --- a/drivers/i2c/busses/i2c-stub.c +++ b/drivers/i2c/busses/i2c-stub.c | |||
@@ -109,8 +109,6 @@ static u32 stub_func(struct i2c_adapter *adapter) | |||
109 | } | 109 | } |
110 | 110 | ||
111 | static struct i2c_algorithm smbus_algorithm = { | 111 | static struct i2c_algorithm smbus_algorithm = { |
112 | .name = "Non-I2C SMBus adapter", | ||
113 | .id = I2C_ALGO_SMBUS, | ||
114 | .functionality = stub_func, | 112 | .functionality = stub_func, |
115 | .smbus_xfer = stub_xfer, | 113 | .smbus_xfer = stub_xfer, |
116 | }; | 114 | }; |
diff --git a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c index 6b5008005c6f..99d209e0485a 100644 --- a/drivers/i2c/busses/i2c-viapro.c +++ b/drivers/i2c/busses/i2c-viapro.c | |||
@@ -286,8 +286,6 @@ static u32 vt596_func(struct i2c_adapter *adapter) | |||
286 | } | 286 | } |
287 | 287 | ||
288 | static struct i2c_algorithm smbus_algorithm = { | 288 | static struct i2c_algorithm smbus_algorithm = { |
289 | .name = "Non-I2C SMBus adapter", | ||
290 | .id = I2C_ALGO_SMBUS, | ||
291 | .smbus_xfer = vt596_access, | 289 | .smbus_xfer = vt596_access, |
292 | .functionality = vt596_func, | 290 | .functionality = vt596_func, |
293 | }; | 291 | }; |
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index a18bdd9aa7ba..a1d580e05361 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
@@ -395,8 +395,6 @@ static u32 scx200_acb_func(struct i2c_adapter *adapter) | |||
395 | 395 | ||
396 | /* For now, we only handle combined mode (smbus) */ | 396 | /* For now, we only handle combined mode (smbus) */ |
397 | static struct i2c_algorithm scx200_acb_algorithm = { | 397 | static struct i2c_algorithm scx200_acb_algorithm = { |
398 | .name = "NatSemi SCx200 ACCESS.bus", | ||
399 | .id = I2C_ALGO_SMBUS, | ||
400 | .smbus_xfer = scx200_acb_smbus_xfer, | 398 | .smbus_xfer = scx200_acb_smbus_xfer, |
401 | .functionality = scx200_acb_func, | 399 | .functionality = scx200_acb_func, |
402 | }; | 400 | }; |
@@ -456,7 +454,7 @@ static int __init scx200_acb_create(int base, int index) | |||
456 | i2c_set_adapdata(adapter, iface); | 454 | i2c_set_adapdata(adapter, iface); |
457 | snprintf(adapter->name, I2C_NAME_SIZE, "SCx200 ACB%d", index); | 455 | snprintf(adapter->name, I2C_NAME_SIZE, "SCx200 ACB%d", index); |
458 | adapter->owner = THIS_MODULE; | 456 | adapter->owner = THIS_MODULE; |
459 | adapter->id = I2C_ALGO_SMBUS; | 457 | adapter->id = I2C_HW_SMBUS_SCX200; |
460 | adapter->algo = &scx200_acb_algorithm; | 458 | adapter->algo = &scx200_acb_algorithm; |
461 | adapter->class = I2C_CLASS_HWMON; | 459 | adapter->class = I2C_CLASS_HWMON; |
462 | 460 | ||
diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig index 43f70dbfc03f..6bd44a44cd28 100644 --- a/drivers/i2c/chips/Kconfig +++ b/drivers/i2c/chips/Kconfig | |||
@@ -2,17 +2,12 @@ | |||
2 | # Miscellaneous I2C chip drivers configuration | 2 | # Miscellaneous I2C chip drivers configuration |
3 | # | 3 | # |
4 | 4 | ||
5 | config I2C_SENSOR | ||
6 | tristate | ||
7 | default n | ||
8 | |||
9 | menu "Miscellaneous I2C Chip support" | 5 | menu "Miscellaneous I2C Chip support" |
10 | depends on I2C | 6 | depends on I2C |
11 | 7 | ||
12 | config SENSORS_DS1337 | 8 | config SENSORS_DS1337 |
13 | tristate "Dallas Semiconductor DS1337 and DS1339 Real Time Clock" | 9 | tristate "Dallas Semiconductor DS1337 and DS1339 Real Time Clock" |
14 | depends on I2C && EXPERIMENTAL | 10 | depends on I2C && EXPERIMENTAL |
15 | select I2C_SENSOR | ||
16 | help | 11 | help |
17 | If you say yes here you get support for Dallas Semiconductor | 12 | If you say yes here you get support for Dallas Semiconductor |
18 | DS1337 and DS1339 real-time clock chips. | 13 | DS1337 and DS1339 real-time clock chips. |
@@ -23,7 +18,6 @@ config SENSORS_DS1337 | |||
23 | config SENSORS_DS1374 | 18 | config SENSORS_DS1374 |
24 | tristate "Maxim/Dallas Semiconductor DS1374 Real Time Clock" | 19 | tristate "Maxim/Dallas Semiconductor DS1374 Real Time Clock" |
25 | depends on I2C && EXPERIMENTAL | 20 | depends on I2C && EXPERIMENTAL |
26 | select I2C_SENSOR | ||
27 | help | 21 | help |
28 | If you say yes here you get support for Dallas Semiconductor | 22 | If you say yes here you get support for Dallas Semiconductor |
29 | DS1374 real-time clock chips. | 23 | DS1374 real-time clock chips. |
@@ -34,7 +28,6 @@ config SENSORS_DS1374 | |||
34 | config SENSORS_EEPROM | 28 | config SENSORS_EEPROM |
35 | tristate "EEPROM reader" | 29 | tristate "EEPROM reader" |
36 | depends on I2C && EXPERIMENTAL | 30 | depends on I2C && EXPERIMENTAL |
37 | select I2C_SENSOR | ||
38 | help | 31 | help |
39 | If you say yes here you get read-only access to the EEPROM data | 32 | If you say yes here you get read-only access to the EEPROM data |
40 | available on modern memory DIMMs and Sony Vaio laptops. Such | 33 | available on modern memory DIMMs and Sony Vaio laptops. Such |
@@ -46,7 +39,6 @@ config SENSORS_EEPROM | |||
46 | config SENSORS_PCF8574 | 39 | config SENSORS_PCF8574 |
47 | tristate "Philips PCF8574 and PCF8574A" | 40 | tristate "Philips PCF8574 and PCF8574A" |
48 | depends on I2C && EXPERIMENTAL | 41 | depends on I2C && EXPERIMENTAL |
49 | select I2C_SENSOR | ||
50 | help | 42 | help |
51 | If you say yes here you get support for Philips PCF8574 and | 43 | If you say yes here you get support for Philips PCF8574 and |
52 | PCF8574A chips. | 44 | PCF8574A chips. |
@@ -67,7 +59,6 @@ config SENSORS_PCA9539 | |||
67 | config SENSORS_PCF8591 | 59 | config SENSORS_PCF8591 |
68 | tristate "Philips PCF8591" | 60 | tristate "Philips PCF8591" |
69 | depends on I2C && EXPERIMENTAL | 61 | depends on I2C && EXPERIMENTAL |
70 | select I2C_SENSOR | ||
71 | help | 62 | help |
72 | If you say yes here you get support for Philips PCF8591 chips. | 63 | If you say yes here you get support for Philips PCF8591 chips. |
73 | 64 | ||
@@ -77,7 +68,6 @@ config SENSORS_PCF8591 | |||
77 | config SENSORS_RTC8564 | 68 | config SENSORS_RTC8564 |
78 | tristate "Epson 8564 RTC chip" | 69 | tristate "Epson 8564 RTC chip" |
79 | depends on I2C && EXPERIMENTAL | 70 | depends on I2C && EXPERIMENTAL |
80 | select I2C_SENSOR | ||
81 | help | 71 | help |
82 | If you say yes here you get support for the Epson 8564 RTC chip. | 72 | If you say yes here you get support for the Epson 8564 RTC chip. |
83 | 73 | ||
diff --git a/drivers/i2c/chips/ds1337.c b/drivers/i2c/chips/ds1337.c index 82cf959989fd..9d3175c03395 100644 --- a/drivers/i2c/chips/ds1337.c +++ b/drivers/i2c/chips/ds1337.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/slab.h> | 18 | #include <linux/slab.h> |
19 | #include <linux/i2c.h> | 19 | #include <linux/i2c.h> |
20 | #include <linux/i2c-sensor.h> | ||
21 | #include <linux/string.h> | 20 | #include <linux/string.h> |
22 | #include <linux/rtc.h> /* get the user-level API */ | 21 | #include <linux/rtc.h> /* get the user-level API */ |
23 | #include <linux/bcd.h> | 22 | #include <linux/bcd.h> |
@@ -39,9 +38,8 @@ | |||
39 | * Functions declaration | 38 | * Functions declaration |
40 | */ | 39 | */ |
41 | static unsigned short normal_i2c[] = { 0x68, I2C_CLIENT_END }; | 40 | static unsigned short normal_i2c[] = { 0x68, I2C_CLIENT_END }; |
42 | static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; | ||
43 | 41 | ||
44 | SENSORS_INSMOD_1(ds1337); | 42 | I2C_CLIENT_INSMOD_1(ds1337); |
45 | 43 | ||
46 | static int ds1337_attach_adapter(struct i2c_adapter *adapter); | 44 | static int ds1337_attach_adapter(struct i2c_adapter *adapter); |
47 | static int ds1337_detect(struct i2c_adapter *adapter, int address, int kind); | 45 | static int ds1337_detect(struct i2c_adapter *adapter, int address, int kind); |
@@ -227,7 +225,7 @@ int ds1337_do_command(int bus, int cmd, void *arg) | |||
227 | 225 | ||
228 | static int ds1337_attach_adapter(struct i2c_adapter *adapter) | 226 | static int ds1337_attach_adapter(struct i2c_adapter *adapter) |
229 | { | 227 | { |
230 | return i2c_detect(adapter, &addr_data, ds1337_detect); | 228 | return i2c_probe(adapter, &addr_data, ds1337_detect); |
231 | } | 229 | } |
232 | 230 | ||
233 | /* | 231 | /* |
@@ -354,11 +352,8 @@ static int ds1337_detach_client(struct i2c_client *client) | |||
354 | int err; | 352 | int err; |
355 | struct ds1337_data *data = i2c_get_clientdata(client); | 353 | struct ds1337_data *data = i2c_get_clientdata(client); |
356 | 354 | ||
357 | if ((err = i2c_detach_client(client))) { | 355 | if ((err = i2c_detach_client(client))) |
358 | dev_err(&client->dev, "Client deregistration failed, " | ||
359 | "client not detached.\n"); | ||
360 | return err; | 356 | return err; |
361 | } | ||
362 | 357 | ||
363 | list_del(&data->list); | 358 | list_del(&data->list); |
364 | kfree(data); | 359 | kfree(data); |
diff --git a/drivers/i2c/chips/ds1374.c b/drivers/i2c/chips/ds1374.c index a445736d8838..0936327a946d 100644 --- a/drivers/i2c/chips/ds1374.c +++ b/drivers/i2c/chips/ds1374.c | |||
@@ -53,7 +53,6 @@ static struct i2c_client_address_data addr_data = { | |||
53 | .normal_i2c = normal_addr, | 53 | .normal_i2c = normal_addr, |
54 | .probe = ignore, | 54 | .probe = ignore, |
55 | .ignore = ignore, | 55 | .ignore = ignore, |
56 | .force = ignore, | ||
57 | }; | 56 | }; |
58 | 57 | ||
59 | static ulong ds1374_read_rtc(void) | 58 | static ulong ds1374_read_rtc(void) |
@@ -166,7 +165,7 @@ static void ds1374_set_tlet(ulong arg) | |||
166 | "can't confirm time set from rtc chip\n"); | 165 | "can't confirm time set from rtc chip\n"); |
167 | } | 166 | } |
168 | 167 | ||
169 | ulong new_time; | 168 | static ulong new_time; |
170 | 169 | ||
171 | DECLARE_TASKLET_DISABLED(ds1374_tasklet, ds1374_set_tlet, (ulong) & new_time); | 170 | DECLARE_TASKLET_DISABLED(ds1374_tasklet, ds1374_set_tlet, (ulong) & new_time); |
172 | 171 | ||
diff --git a/drivers/i2c/chips/eeprom.c b/drivers/i2c/chips/eeprom.c index a2da31b0dd7b..d58403a47908 100644 --- a/drivers/i2c/chips/eeprom.c +++ b/drivers/i2c/chips/eeprom.c | |||
@@ -33,15 +33,13 @@ | |||
33 | #include <linux/sched.h> | 33 | #include <linux/sched.h> |
34 | #include <linux/jiffies.h> | 34 | #include <linux/jiffies.h> |
35 | #include <linux/i2c.h> | 35 | #include <linux/i2c.h> |
36 | #include <linux/i2c-sensor.h> | ||
37 | 36 | ||
38 | /* Addresses to scan */ | 37 | /* Addresses to scan */ |
39 | static unsigned short normal_i2c[] = { 0x50, 0x51, 0x52, 0x53, 0x54, | 38 | static unsigned short normal_i2c[] = { 0x50, 0x51, 0x52, 0x53, 0x54, |
40 | 0x55, 0x56, 0x57, I2C_CLIENT_END }; | 39 | 0x55, 0x56, 0x57, I2C_CLIENT_END }; |
41 | static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; | ||
42 | 40 | ||
43 | /* Insmod parameters */ | 41 | /* Insmod parameters */ |
44 | SENSORS_INSMOD_1(eeprom); | 42 | I2C_CLIENT_INSMOD_1(eeprom); |
45 | 43 | ||
46 | 44 | ||
47 | /* Size of EEPROM in bytes */ | 45 | /* Size of EEPROM in bytes */ |
@@ -153,21 +151,16 @@ static struct bin_attribute eeprom_attr = { | |||
153 | 151 | ||
154 | static int eeprom_attach_adapter(struct i2c_adapter *adapter) | 152 | static int eeprom_attach_adapter(struct i2c_adapter *adapter) |
155 | { | 153 | { |
156 | return i2c_detect(adapter, &addr_data, eeprom_detect); | 154 | return i2c_probe(adapter, &addr_data, eeprom_detect); |
157 | } | 155 | } |
158 | 156 | ||
159 | /* This function is called by i2c_detect */ | 157 | /* This function is called by i2c_probe */ |
160 | int eeprom_detect(struct i2c_adapter *adapter, int address, int kind) | 158 | int eeprom_detect(struct i2c_adapter *adapter, int address, int kind) |
161 | { | 159 | { |
162 | struct i2c_client *new_client; | 160 | struct i2c_client *new_client; |
163 | struct eeprom_data *data; | 161 | struct eeprom_data *data; |
164 | int err = 0; | 162 | int err = 0; |
165 | 163 | ||
166 | /* prevent 24RF08 corruption */ | ||
167 | if (kind < 0) | ||
168 | i2c_smbus_xfer(adapter, address, 0, 0, 0, | ||
169 | I2C_SMBUS_QUICK, NULL); | ||
170 | |||
171 | /* There are three ways we can read the EEPROM data: | 164 | /* There are three ways we can read the EEPROM data: |
172 | (1) I2C block reads (faster, but unsupported by most adapters) | 165 | (1) I2C block reads (faster, but unsupported by most adapters) |
173 | (2) Consecutive byte reads (100% overhead) | 166 | (2) Consecutive byte reads (100% overhead) |
@@ -231,10 +224,8 @@ static int eeprom_detach_client(struct i2c_client *client) | |||
231 | int err; | 224 | int err; |
232 | 225 | ||
233 | err = i2c_detach_client(client); | 226 | err = i2c_detach_client(client); |
234 | if (err) { | 227 | if (err) |
235 | dev_err(&client->dev, "Client deregistration failed, client not detached.\n"); | ||
236 | return err; | 228 | return err; |
237 | } | ||
238 | 229 | ||
239 | kfree(i2c_get_clientdata(client)); | 230 | kfree(i2c_get_clientdata(client)); |
240 | 231 | ||
diff --git a/drivers/i2c/chips/isp1301_omap.c b/drivers/i2c/chips/isp1301_omap.c index 354a26295672..8ee56d4b3891 100644 --- a/drivers/i2c/chips/isp1301_omap.c +++ b/drivers/i2c/chips/isp1301_omap.c | |||
@@ -1489,7 +1489,7 @@ static int isp1301_probe(struct i2c_adapter *bus, int address, int kind) | |||
1489 | if (the_transceiver) | 1489 | if (the_transceiver) |
1490 | return 0; | 1490 | return 0; |
1491 | 1491 | ||
1492 | isp = kcalloc(1, sizeof *isp, GFP_KERNEL); | 1492 | isp = kzalloc(sizeof *isp, GFP_KERNEL); |
1493 | if (!isp) | 1493 | if (!isp) |
1494 | return 0; | 1494 | return 0; |
1495 | 1495 | ||
diff --git a/drivers/i2c/chips/m41t00.c b/drivers/i2c/chips/m41t00.c index 778d7e12859d..3f14528a52a9 100644 --- a/drivers/i2c/chips/m41t00.c +++ b/drivers/i2c/chips/m41t00.c | |||
@@ -42,7 +42,6 @@ static struct i2c_client_address_data addr_data = { | |||
42 | .normal_i2c = normal_addr, | 42 | .normal_i2c = normal_addr, |
43 | .probe = ignore, | 43 | .probe = ignore, |
44 | .ignore = ignore, | 44 | .ignore = ignore, |
45 | .force = ignore, | ||
46 | }; | 45 | }; |
47 | 46 | ||
48 | ulong | 47 | ulong |
@@ -145,7 +144,7 @@ m41t00_set_tlet(ulong arg) | |||
145 | return; | 144 | return; |
146 | } | 145 | } |
147 | 146 | ||
148 | ulong new_time; | 147 | static ulong new_time; |
149 | 148 | ||
150 | DECLARE_TASKLET_DISABLED(m41t00_tasklet, m41t00_set_tlet, (ulong)&new_time); | 149 | DECLARE_TASKLET_DISABLED(m41t00_tasklet, m41t00_set_tlet, (ulong)&new_time); |
151 | 150 | ||
diff --git a/drivers/i2c/chips/max6875.c b/drivers/i2c/chips/max6875.c index 0230375f72e5..9e1aeb69abf9 100644 --- a/drivers/i2c/chips/max6875.c +++ b/drivers/i2c/chips/max6875.c | |||
@@ -5,97 +5,60 @@ | |||
5 | 5 | ||
6 | Based on i2c/chips/eeprom.c | 6 | Based on i2c/chips/eeprom.c |
7 | 7 | ||
8 | The MAX6875 has two EEPROM sections: config and user. | 8 | The MAX6875 has a bank of registers and two banks of EEPROM. |
9 | At reset, the config EEPROM is read into the registers. | 9 | Address ranges are defined as follows: |
10 | * 0x0000 - 0x0046 = configuration registers | ||
11 | * 0x8000 - 0x8046 = configuration EEPROM | ||
12 | * 0x8100 - 0x82FF = user EEPROM | ||
10 | 13 | ||
11 | This driver make 3 binary files available in sysfs: | 14 | This driver makes the user EEPROM available for read. |
12 | reg_config - direct access to the registers | ||
13 | eeprom_config - acesses configuration eeprom space | ||
14 | eeprom_user - free for application use | ||
15 | 15 | ||
16 | In our application, we put device serial & model numbers in user eeprom. | 16 | The registers & config EEPROM should be accessed via i2c-dev. |
17 | 17 | ||
18 | Notes: | 18 | The MAX6875 ignores the lowest address bit, so each chip responds to |
19 | 1) The datasheet says that register 0x44 / EEPROM 0x8044 should NOT | 19 | two addresses - 0x50/0x51 and 0x52/0x53. |
20 | be overwritten, so the driver explicitly prevents that. | 20 | |
21 | 2) It's a good idea to keep the config (0x45) locked in config EEPROM. | 21 | Note that the MAX6875 uses i2c_smbus_write_byte_data() to set the read |
22 | You can temporarily enable config writes by changing register 0x45. | 22 | address, so this driver is destructive if loaded for the wrong EEPROM chip. |
23 | 23 | ||
24 | This program is free software; you can redistribute it and/or modify | 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 | 25 | it under the terms of the GNU General Public License as published by |
26 | the Free Software Foundation; version 2 of the License. | 26 | the Free Software Foundation; version 2 of the License. |
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include <linux/config.h> | ||
30 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
31 | #include <linux/init.h> | 30 | #include <linux/init.h> |
32 | #include <linux/module.h> | 31 | #include <linux/module.h> |
33 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
34 | #include <linux/sched.h> | ||
35 | #include <linux/delay.h> | ||
36 | #include <linux/i2c.h> | 33 | #include <linux/i2c.h> |
37 | #include <linux/i2c-sensor.h> | 34 | #include <asm/semaphore.h> |
38 | 35 | ||
39 | /* Addresses to scan */ | 36 | /* Do not scan - the MAX6875 access method will write to some EEPROM chips */ |
40 | /* No address scanned by default, as this could corrupt standard EEPROMS. */ | ||
41 | static unsigned short normal_i2c[] = {I2C_CLIENT_END}; | 37 | static unsigned short normal_i2c[] = {I2C_CLIENT_END}; |
42 | static unsigned int normal_isa[] = {I2C_CLIENT_ISA_END}; | ||
43 | 38 | ||
44 | /* Insmod parameters */ | 39 | /* Insmod parameters */ |
45 | SENSORS_INSMOD_1(max6875); | 40 | I2C_CLIENT_INSMOD_1(max6875); |
46 | |||
47 | /* this param will prevent 'accidental' writes to the eeprom */ | ||
48 | static int allow_write = 0; | ||
49 | module_param(allow_write, int, 0); | ||
50 | MODULE_PARM_DESC(allow_write, | ||
51 | "Enable write access:\n" | ||
52 | "*0: Read only\n" | ||
53 | " 1: Read/Write access"); | ||
54 | 41 | ||
55 | /* The MAX6875 can only read/write 16 bytes at a time */ | 42 | /* The MAX6875 can only read/write 16 bytes at a time */ |
56 | #define SLICE_SIZE 16 | 43 | #define SLICE_SIZE 16 |
57 | #define SLICE_BITS 4 | 44 | #define SLICE_BITS 4 |
58 | 45 | ||
59 | /* CONFIG EEPROM is at addresses 0x8000 - 0x8045, registers are at 0 - 0x45 */ | ||
60 | #define CONFIG_EEPROM_BASE 0x8000 | ||
61 | #define CONFIG_EEPROM_SIZE 0x0046 | ||
62 | #define CONFIG_EEPROM_SLICES 5 | ||
63 | |||
64 | /* USER EEPROM is at addresses 0x8100 - 0x82FF */ | 46 | /* USER EEPROM is at addresses 0x8100 - 0x82FF */ |
65 | #define USER_EEPROM_BASE 0x8100 | 47 | #define USER_EEPROM_BASE 0x8100 |
66 | #define USER_EEPROM_SIZE 0x0200 | 48 | #define USER_EEPROM_SIZE 0x0200 |
67 | #define USER_EEPROM_SLICES 32 | 49 | #define USER_EEPROM_SLICES 32 |
68 | 50 | ||
69 | /* MAX6875 commands */ | 51 | /* MAX6875 commands */ |
70 | #define MAX6875_CMD_BLOCK_WRITE 0x83 | 52 | #define MAX6875_CMD_BLK_READ 0x84 |
71 | #define MAX6875_CMD_BLOCK_READ 0x84 | ||
72 | #define MAX6875_CMD_REBOOT 0x88 | ||
73 | |||
74 | enum max6875_area_type { | ||
75 | max6875_register_config=0, | ||
76 | max6875_eeprom_config, | ||
77 | max6875_eeprom_user, | ||
78 | max6857_max | ||
79 | }; | ||
80 | |||
81 | struct eeprom_block { | ||
82 | enum max6875_area_type type; | ||
83 | u8 slices; | ||
84 | u32 size; | ||
85 | u32 valid; | ||
86 | u32 base; | ||
87 | unsigned long *updated; | ||
88 | u8 *data; | ||
89 | }; | ||
90 | 53 | ||
91 | /* Each client has this additional data */ | 54 | /* Each client has this additional data */ |
92 | struct max6875_data { | 55 | struct max6875_data { |
93 | struct i2c_client client; | 56 | struct i2c_client client; |
94 | struct semaphore update_lock; | 57 | struct semaphore update_lock; |
95 | struct eeprom_block blocks[max6857_max]; | 58 | |
96 | /* the above structs point into the arrays below */ | 59 | u32 valid; |
97 | u8 data[USER_EEPROM_SIZE + (CONFIG_EEPROM_SIZE*2)]; | 60 | u8 data[USER_EEPROM_SIZE]; |
98 | unsigned long last_updated[USER_EEPROM_SLICES + (CONFIG_EEPROM_SLICES*2)]; | 61 | unsigned long last_updated[USER_EEPROM_SLICES]; |
99 | }; | 62 | }; |
100 | 63 | ||
101 | static int max6875_attach_adapter(struct i2c_adapter *adapter); | 64 | static int max6875_attach_adapter(struct i2c_adapter *adapter); |
@@ -111,337 +74,160 @@ static struct i2c_driver max6875_driver = { | |||
111 | .detach_client = max6875_detach_client, | 74 | .detach_client = max6875_detach_client, |
112 | }; | 75 | }; |
113 | 76 | ||
114 | static int max6875_update_slice(struct i2c_client *client, | 77 | static void max6875_update_slice(struct i2c_client *client, int slice) |
115 | struct eeprom_block *blk, | ||
116 | int slice) | ||
117 | { | 78 | { |
118 | struct max6875_data *data = i2c_get_clientdata(client); | 79 | struct max6875_data *data = i2c_get_clientdata(client); |
119 | int i, j, addr, count; | 80 | int i, j, addr; |
120 | u8 rdbuf[SLICE_SIZE]; | 81 | u8 *buf; |
121 | int retval = 0; | ||
122 | 82 | ||
123 | if (slice >= blk->slices) | 83 | if (slice >= USER_EEPROM_SLICES) |
124 | return -1; | 84 | return; |
125 | 85 | ||
126 | down(&data->update_lock); | 86 | down(&data->update_lock); |
127 | 87 | ||
128 | if (!(blk->valid & (1 << slice)) || | 88 | buf = &data->data[slice << SLICE_BITS]; |
129 | (jiffies - blk->updated[slice] > 300 * HZ) || | ||
130 | (jiffies < blk->updated[slice])) { | ||
131 | dev_dbg(&client->dev, "Starting eeprom update, slice %u, base %u\n", | ||
132 | slice, blk->base); | ||
133 | 89 | ||
134 | addr = blk->base + (slice << SLICE_BITS); | 90 | if (!(data->valid & (1 << slice)) || |
135 | count = blk->size - (slice << SLICE_BITS); | 91 | time_after(jiffies, data->last_updated[slice])) { |
136 | if (count > SLICE_SIZE) { | ||
137 | count = SLICE_SIZE; | ||
138 | } | ||
139 | 92 | ||
140 | /* Preset the read address */ | 93 | dev_dbg(&client->dev, "Starting update of slice %u\n", slice); |
141 | if (addr < 0x100) { | 94 | |
142 | /* select the register */ | 95 | data->valid &= ~(1 << slice); |
143 | if (i2c_smbus_write_byte(client, addr & 0xFF)) { | 96 | |
144 | dev_dbg(&client->dev, "max6875 register select has failed!\n"); | 97 | addr = USER_EEPROM_BASE + (slice << SLICE_BITS); |
145 | retval = -1; | 98 | |
146 | goto exit; | 99 | /* select the eeprom address */ |
147 | } | 100 | if (i2c_smbus_write_byte_data(client, addr >> 8, addr & 0xFF)) { |
148 | } else { | 101 | dev_err(&client->dev, "address set failed\n"); |
149 | /* select the eeprom */ | 102 | goto exit_up; |
150 | if (i2c_smbus_write_byte_data(client, addr >> 8, addr & 0xFF)) { | ||
151 | dev_dbg(&client->dev, "max6875 address set has failed!\n"); | ||
152 | retval = -1; | ||
153 | goto exit; | ||
154 | } | ||
155 | } | 103 | } |
156 | 104 | ||
157 | if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { | 105 | if (i2c_check_functionality(client->adapter, |
158 | if (i2c_smbus_read_i2c_block_data(client, MAX6875_CMD_BLOCK_READ, | 106 | I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { |
159 | rdbuf) != SLICE_SIZE) | 107 | if (i2c_smbus_read_i2c_block_data(client, |
160 | { | 108 | MAX6875_CMD_BLK_READ, |
161 | retval = -1; | 109 | buf) != SLICE_SIZE) { |
162 | goto exit; | 110 | goto exit_up; |
163 | } | 111 | } |
164 | |||
165 | memcpy(&blk->data[slice << SLICE_BITS], rdbuf, count); | ||
166 | } else { | 112 | } else { |
167 | for (i = 0; i < count; i++) { | 113 | for (i = 0; i < SLICE_SIZE; i++) { |
168 | j = i2c_smbus_read_byte(client); | 114 | j = i2c_smbus_read_byte(client); |
169 | if (j < 0) | 115 | if (j < 0) { |
170 | { | 116 | goto exit_up; |
171 | retval = -1; | ||
172 | goto exit; | ||
173 | } | 117 | } |
174 | blk->data[(slice << SLICE_BITS) + i] = (u8) j; | 118 | buf[i] = j; |
175 | } | 119 | } |
176 | } | 120 | } |
177 | blk->updated[slice] = jiffies; | 121 | data->last_updated[slice] = jiffies; |
178 | blk->valid |= (1 << slice); | 122 | data->valid |= (1 << slice); |
179 | } | 123 | } |
180 | exit: | 124 | exit_up: |
181 | up(&data->update_lock); | 125 | up(&data->update_lock); |
182 | return retval; | ||
183 | } | 126 | } |
184 | 127 | ||
185 | static ssize_t max6875_read(struct kobject *kobj, char *buf, loff_t off, size_t count, | 128 | static ssize_t max6875_read(struct kobject *kobj, char *buf, loff_t off, |
186 | enum max6875_area_type area_type) | 129 | size_t count) |
187 | { | 130 | { |
188 | struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); | 131 | struct i2c_client *client = kobj_to_i2c_client(kobj); |
189 | struct max6875_data *data = i2c_get_clientdata(client); | 132 | struct max6875_data *data = i2c_get_clientdata(client); |
190 | struct eeprom_block *blk; | 133 | int slice, max_slice; |
191 | int slice; | ||
192 | |||
193 | blk = &data->blocks[area_type]; | ||
194 | 134 | ||
195 | if (off > blk->size) | 135 | if (off > USER_EEPROM_SIZE) |
196 | return 0; | 136 | return 0; |
197 | if (off + count > blk->size) | ||
198 | count = blk->size - off; | ||
199 | 137 | ||
200 | /* Only refresh slices which contain requested bytes */ | 138 | if (off + count > USER_EEPROM_SIZE) |
201 | for (slice = (off >> SLICE_BITS); slice <= ((off + count - 1) >> SLICE_BITS); slice++) | 139 | count = USER_EEPROM_SIZE - off; |
202 | max6875_update_slice(client, blk, slice); | ||
203 | 140 | ||
204 | memcpy(buf, &blk->data[off], count); | 141 | /* refresh slices which contain requested bytes */ |
142 | max_slice = (off + count - 1) >> SLICE_BITS; | ||
143 | for (slice = (off >> SLICE_BITS); slice <= max_slice; slice++) | ||
144 | max6875_update_slice(client, slice); | ||
205 | 145 | ||
206 | return count; | 146 | memcpy(buf, &data->data[off], count); |
207 | } | ||
208 | |||
209 | static ssize_t max6875_user_read(struct kobject *kobj, char *buf, loff_t off, size_t count) | ||
210 | { | ||
211 | return max6875_read(kobj, buf, off, count, max6875_eeprom_user); | ||
212 | } | ||
213 | |||
214 | static ssize_t max6875_config_read(struct kobject *kobj, char *buf, loff_t off, size_t count) | ||
215 | { | ||
216 | return max6875_read(kobj, buf, off, count, max6875_eeprom_config); | ||
217 | } | ||
218 | |||
219 | static ssize_t max6875_cfgreg_read(struct kobject *kobj, char *buf, loff_t off, size_t count) | ||
220 | { | ||
221 | return max6875_read(kobj, buf, off, count, max6875_register_config); | ||
222 | } | ||
223 | |||
224 | |||
225 | static ssize_t max6875_write(struct kobject *kobj, char *buf, loff_t off, size_t count, | ||
226 | enum max6875_area_type area_type) | ||
227 | { | ||
228 | struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); | ||
229 | struct max6875_data *data = i2c_get_clientdata(client); | ||
230 | struct eeprom_block *blk; | ||
231 | int slice, addr, retval; | ||
232 | ssize_t sent = 0; | ||
233 | |||
234 | blk = &data->blocks[area_type]; | ||
235 | |||
236 | if (off > blk->size) | ||
237 | return 0; | ||
238 | if ((off + count) > blk->size) | ||
239 | count = blk->size - off; | ||
240 | |||
241 | if (down_interruptible(&data->update_lock)) | ||
242 | return -EAGAIN; | ||
243 | |||
244 | /* writing to a register is done with i2c_smbus_write_byte_data() */ | ||
245 | if (blk->type == max6875_register_config) { | ||
246 | for (sent = 0; sent < count; sent++) { | ||
247 | addr = off + sent; | ||
248 | if (addr == 0x44) | ||
249 | continue; | ||
250 | |||
251 | retval = i2c_smbus_write_byte_data(client, addr, buf[sent]); | ||
252 | } | ||
253 | } else { | ||
254 | int cmd, val; | ||
255 | |||
256 | /* We are writing to EEPROM */ | ||
257 | for (sent = 0; sent < count; sent++) { | ||
258 | addr = blk->base + off + sent; | ||
259 | cmd = addr >> 8; | ||
260 | val = (addr & 0xff) | (buf[sent] << 8); // reversed | ||
261 | |||
262 | if (addr == 0x8044) | ||
263 | continue; | ||
264 | |||
265 | retval = i2c_smbus_write_word_data(client, cmd, val); | ||
266 | |||
267 | if (retval) { | ||
268 | goto error_exit; | ||
269 | } | ||
270 | 147 | ||
271 | /* A write takes up to 11 ms */ | 148 | return count; |
272 | msleep(11); | ||
273 | } | ||
274 | } | ||
275 | |||
276 | /* Invalidate the scratch buffer */ | ||
277 | for (slice = (off >> SLICE_BITS); slice <= ((off + count - 1) >> SLICE_BITS); slice++) | ||
278 | blk->valid &= ~(1 << slice); | ||
279 | |||
280 | error_exit: | ||
281 | up(&data->update_lock); | ||
282 | |||
283 | return sent; | ||
284 | } | ||
285 | |||
286 | static ssize_t max6875_user_write(struct kobject *kobj, char *buf, loff_t off, size_t count) | ||
287 | { | ||
288 | return max6875_write(kobj, buf, off, count, max6875_eeprom_user); | ||
289 | } | ||
290 | |||
291 | static ssize_t max6875_config_write(struct kobject *kobj, char *buf, loff_t off, size_t count) | ||
292 | { | ||
293 | return max6875_write(kobj, buf, off, count, max6875_eeprom_config); | ||
294 | } | ||
295 | |||
296 | static ssize_t max6875_cfgreg_write(struct kobject *kobj, char *buf, loff_t off, size_t count) | ||
297 | { | ||
298 | return max6875_write(kobj, buf, off, count, max6875_register_config); | ||
299 | } | 149 | } |
300 | 150 | ||
301 | static struct bin_attribute user_eeprom_attr = { | 151 | static struct bin_attribute user_eeprom_attr = { |
302 | .attr = { | 152 | .attr = { |
303 | .name = "eeprom_user", | 153 | .name = "eeprom", |
304 | .mode = S_IRUGO | S_IWUSR | S_IWGRP, | 154 | .mode = S_IRUGO, |
305 | .owner = THIS_MODULE, | ||
306 | }, | ||
307 | .size = USER_EEPROM_SIZE, | ||
308 | .read = max6875_user_read, | ||
309 | .write = max6875_user_write, | ||
310 | }; | ||
311 | |||
312 | static struct bin_attribute config_eeprom_attr = { | ||
313 | .attr = { | ||
314 | .name = "eeprom_config", | ||
315 | .mode = S_IRUGO | S_IWUSR, | ||
316 | .owner = THIS_MODULE, | ||
317 | }, | ||
318 | .size = CONFIG_EEPROM_SIZE, | ||
319 | .read = max6875_config_read, | ||
320 | .write = max6875_config_write, | ||
321 | }; | ||
322 | |||
323 | static struct bin_attribute config_register_attr = { | ||
324 | .attr = { | ||
325 | .name = "reg_config", | ||
326 | .mode = S_IRUGO | S_IWUSR, | ||
327 | .owner = THIS_MODULE, | 155 | .owner = THIS_MODULE, |
328 | }, | 156 | }, |
329 | .size = CONFIG_EEPROM_SIZE, | 157 | .size = USER_EEPROM_SIZE, |
330 | .read = max6875_cfgreg_read, | 158 | .read = max6875_read, |
331 | .write = max6875_cfgreg_write, | ||
332 | }; | 159 | }; |
333 | 160 | ||
334 | static int max6875_attach_adapter(struct i2c_adapter *adapter) | 161 | static int max6875_attach_adapter(struct i2c_adapter *adapter) |
335 | { | 162 | { |
336 | return i2c_detect(adapter, &addr_data, max6875_detect); | 163 | return i2c_probe(adapter, &addr_data, max6875_detect); |
337 | } | 164 | } |
338 | 165 | ||
339 | /* This function is called by i2c_detect */ | 166 | /* This function is called by i2c_probe */ |
340 | static int max6875_detect(struct i2c_adapter *adapter, int address, int kind) | 167 | static int max6875_detect(struct i2c_adapter *adapter, int address, int kind) |
341 | { | 168 | { |
342 | struct i2c_client *new_client; | 169 | struct i2c_client *real_client; |
170 | struct i2c_client *fake_client; | ||
343 | struct max6875_data *data; | 171 | struct max6875_data *data; |
344 | int err = 0; | 172 | int err = 0; |
345 | 173 | ||
346 | /* Prevent 24RF08 corruption (in case of user error) */ | 174 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA |
347 | if (kind < 0) | 175 | | I2C_FUNC_SMBUS_READ_BYTE)) |
348 | i2c_smbus_xfer(adapter, address, 0, 0, 0, | 176 | return 0; |
349 | I2C_SMBUS_QUICK, NULL); | 177 | |
350 | 178 | /* Only check even addresses */ | |
351 | /* There are three ways we can read the EEPROM data: | 179 | if (address & 1) |
352 | (1) I2C block reads (faster, but unsupported by most adapters) | 180 | return 0; |
353 | (2) Consecutive byte reads (100% overhead) | 181 | |
354 | (3) Regular byte data reads (200% overhead) | 182 | if (!(data = kmalloc(sizeof(struct max6875_data), GFP_KERNEL))) |
355 | The third method is not implemented by this driver because all | 183 | return -ENOMEM; |
356 | known adapters support at least the second. */ | ||
357 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA | | ||
358 | I2C_FUNC_SMBUS_BYTE | | ||
359 | I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) | ||
360 | goto exit; | ||
361 | |||
362 | /* OK. For now, we presume we have a valid client. We now create the | ||
363 | client structure, even though we cannot fill it completely yet. | ||
364 | But it allows us to access eeprom_{read,write}_value. */ | ||
365 | if (!(data = kmalloc(sizeof(struct max6875_data), GFP_KERNEL))) { | ||
366 | err = -ENOMEM; | ||
367 | goto exit; | ||
368 | } | ||
369 | memset(data, 0, sizeof(struct max6875_data)); | 184 | memset(data, 0, sizeof(struct max6875_data)); |
370 | 185 | ||
371 | new_client = &data->client; | 186 | /* A fake client is created on the odd address */ |
372 | i2c_set_clientdata(new_client, data); | 187 | if (!(fake_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL))) { |
373 | new_client->addr = address; | 188 | err = -ENOMEM; |
374 | new_client->adapter = adapter; | 189 | goto exit_kfree1; |
375 | new_client->driver = &max6875_driver; | 190 | } |
376 | new_client->flags = 0; | 191 | memset(fake_client, 0, sizeof(struct i2c_client)); |
377 | 192 | ||
378 | /* Setup the user section */ | 193 | /* Init real i2c_client */ |
379 | data->blocks[max6875_eeprom_user].type = max6875_eeprom_user; | 194 | real_client = &data->client; |
380 | data->blocks[max6875_eeprom_user].slices = USER_EEPROM_SLICES; | 195 | i2c_set_clientdata(real_client, data); |
381 | data->blocks[max6875_eeprom_user].size = USER_EEPROM_SIZE; | 196 | real_client->addr = address; |
382 | data->blocks[max6875_eeprom_user].base = USER_EEPROM_BASE; | 197 | real_client->adapter = adapter; |
383 | data->blocks[max6875_eeprom_user].data = data->data; | 198 | real_client->driver = &max6875_driver; |
384 | data->blocks[max6875_eeprom_user].updated = data->last_updated; | 199 | real_client->flags = 0; |
385 | 200 | strlcpy(real_client->name, "max6875", I2C_NAME_SIZE); | |
386 | /* Setup the config section */ | ||
387 | data->blocks[max6875_eeprom_config].type = max6875_eeprom_config; | ||
388 | data->blocks[max6875_eeprom_config].slices = CONFIG_EEPROM_SLICES; | ||
389 | data->blocks[max6875_eeprom_config].size = CONFIG_EEPROM_SIZE; | ||
390 | data->blocks[max6875_eeprom_config].base = CONFIG_EEPROM_BASE; | ||
391 | data->blocks[max6875_eeprom_config].data = &data->data[USER_EEPROM_SIZE]; | ||
392 | data->blocks[max6875_eeprom_config].updated = &data->last_updated[USER_EEPROM_SLICES]; | ||
393 | |||
394 | /* Setup the register section */ | ||
395 | data->blocks[max6875_register_config].type = max6875_register_config; | ||
396 | data->blocks[max6875_register_config].slices = CONFIG_EEPROM_SLICES; | ||
397 | data->blocks[max6875_register_config].size = CONFIG_EEPROM_SIZE; | ||
398 | data->blocks[max6875_register_config].base = 0; | ||
399 | data->blocks[max6875_register_config].data = &data->data[USER_EEPROM_SIZE+CONFIG_EEPROM_SIZE]; | ||
400 | data->blocks[max6875_register_config].updated = &data->last_updated[USER_EEPROM_SLICES+CONFIG_EEPROM_SLICES]; | ||
401 | |||
402 | /* Init the data */ | ||
403 | memset(data->data, 0xff, sizeof(data->data)); | ||
404 | |||
405 | /* Fill in the remaining client fields */ | ||
406 | strlcpy(new_client->name, "max6875", I2C_NAME_SIZE); | ||
407 | init_MUTEX(&data->update_lock); | 201 | init_MUTEX(&data->update_lock); |
408 | 202 | ||
409 | /* Verify that the chip is really what we think it is */ | 203 | /* Init fake client data */ |
410 | if ((max6875_update_slice(new_client, &data->blocks[max6875_eeprom_config], 4) < 0) || | 204 | /* set the client data to the i2c_client so that it will get freed */ |
411 | (max6875_update_slice(new_client, &data->blocks[max6875_register_config], 4) < 0)) | 205 | i2c_set_clientdata(fake_client, fake_client); |
412 | goto exit_kfree; | 206 | fake_client->addr = address | 1; |
413 | 207 | fake_client->adapter = adapter; | |
414 | /* 0x41,0x42 must be zero and 0x40 must match in eeprom and registers */ | 208 | fake_client->driver = &max6875_driver; |
415 | if ((data->blocks[max6875_eeprom_config].data[0x41] != 0) || | 209 | fake_client->flags = 0; |
416 | (data->blocks[max6875_eeprom_config].data[0x42] != 0) || | 210 | strlcpy(fake_client->name, "max6875 subclient", I2C_NAME_SIZE); |
417 | (data->blocks[max6875_register_config].data[0x41] != 0) || | 211 | |
418 | (data->blocks[max6875_register_config].data[0x42] != 0) || | 212 | /* Prevent 24RF08 corruption (in case of user error) */ |
419 | (data->blocks[max6875_eeprom_config].data[0x40] != | 213 | i2c_smbus_write_quick(real_client, 0); |
420 | data->blocks[max6875_register_config].data[0x40])) | 214 | |
421 | goto exit_kfree; | 215 | if ((err = i2c_attach_client(real_client)) != 0) |
422 | 216 | goto exit_kfree2; | |
423 | /* Tell the I2C layer a new client has arrived */ | 217 | |
424 | if ((err = i2c_attach_client(new_client))) | 218 | if ((err = i2c_attach_client(fake_client)) != 0) |
425 | goto exit_kfree; | 219 | goto exit_detach; |
426 | 220 | ||
427 | /* create the sysfs eeprom files with the correct permissions */ | 221 | sysfs_create_bin_file(&real_client->dev.kobj, &user_eeprom_attr); |
428 | if (allow_write == 0) { | ||
429 | user_eeprom_attr.attr.mode &= ~S_IWUGO; | ||
430 | user_eeprom_attr.write = NULL; | ||
431 | config_eeprom_attr.attr.mode &= ~S_IWUGO; | ||
432 | config_eeprom_attr.write = NULL; | ||
433 | config_register_attr.attr.mode &= ~S_IWUGO; | ||
434 | config_register_attr.write = NULL; | ||
435 | } | ||
436 | sysfs_create_bin_file(&new_client->dev.kobj, &user_eeprom_attr); | ||
437 | sysfs_create_bin_file(&new_client->dev.kobj, &config_eeprom_attr); | ||
438 | sysfs_create_bin_file(&new_client->dev.kobj, &config_register_attr); | ||
439 | 222 | ||
440 | return 0; | 223 | return 0; |
441 | 224 | ||
442 | exit_kfree: | 225 | exit_detach: |
226 | i2c_detach_client(real_client); | ||
227 | exit_kfree2: | ||
228 | kfree(fake_client); | ||
229 | exit_kfree1: | ||
443 | kfree(data); | 230 | kfree(data); |
444 | exit: | ||
445 | return err; | 231 | return err; |
446 | } | 232 | } |
447 | 233 | ||
@@ -450,13 +236,9 @@ static int max6875_detach_client(struct i2c_client *client) | |||
450 | int err; | 236 | int err; |
451 | 237 | ||
452 | err = i2c_detach_client(client); | 238 | err = i2c_detach_client(client); |
453 | if (err) { | 239 | if (err) |
454 | dev_err(&client->dev, "Client deregistration failed, client not detached.\n"); | ||
455 | return err; | 240 | return err; |
456 | } | ||
457 | |||
458 | kfree(i2c_get_clientdata(client)); | 241 | kfree(i2c_get_clientdata(client)); |
459 | |||
460 | return 0; | 242 | return 0; |
461 | } | 243 | } |
462 | 244 | ||
diff --git a/drivers/i2c/chips/pca9539.c b/drivers/i2c/chips/pca9539.c index 9f3ad45daae2..225577fdda4d 100644 --- a/drivers/i2c/chips/pca9539.c +++ b/drivers/i2c/chips/pca9539.c | |||
@@ -13,14 +13,12 @@ | |||
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/i2c.h> | 14 | #include <linux/i2c.h> |
15 | #include <linux/hwmon-sysfs.h> | 15 | #include <linux/hwmon-sysfs.h> |
16 | #include <linux/i2c-sensor.h> | ||
17 | 16 | ||
18 | /* Addresses to scan */ | 17 | /* Addresses to scan */ |
19 | static unsigned short normal_i2c[] = {0x74, 0x75, 0x76, 0x77, I2C_CLIENT_END}; | 18 | static unsigned short normal_i2c[] = {0x74, 0x75, 0x76, 0x77, I2C_CLIENT_END}; |
20 | static unsigned int normal_isa[] = {I2C_CLIENT_ISA_END}; | ||
21 | 19 | ||
22 | /* Insmod parameters */ | 20 | /* Insmod parameters */ |
23 | SENSORS_INSMOD_1(pca9539); | 21 | I2C_CLIENT_INSMOD_1(pca9539); |
24 | 22 | ||
25 | enum pca9539_cmd | 23 | enum pca9539_cmd |
26 | { | 24 | { |
@@ -109,10 +107,10 @@ static struct attribute_group pca9539_defattr_group = { | |||
109 | 107 | ||
110 | static int pca9539_attach_adapter(struct i2c_adapter *adapter) | 108 | static int pca9539_attach_adapter(struct i2c_adapter *adapter) |
111 | { | 109 | { |
112 | return i2c_detect(adapter, &addr_data, pca9539_detect); | 110 | return i2c_probe(adapter, &addr_data, pca9539_detect); |
113 | } | 111 | } |
114 | 112 | ||
115 | /* This function is called by i2c_detect */ | 113 | /* This function is called by i2c_probe */ |
116 | static int pca9539_detect(struct i2c_adapter *adapter, int address, int kind) | 114 | static int pca9539_detect(struct i2c_adapter *adapter, int address, int kind) |
117 | { | 115 | { |
118 | struct i2c_client *new_client; | 116 | struct i2c_client *new_client; |
@@ -164,10 +162,8 @@ static int pca9539_detach_client(struct i2c_client *client) | |||
164 | { | 162 | { |
165 | int err; | 163 | int err; |
166 | 164 | ||
167 | if ((err = i2c_detach_client(client))) { | 165 | if ((err = i2c_detach_client(client))) |
168 | dev_err(&client->dev, "Client deregistration failed.\n"); | ||
169 | return err; | 166 | return err; |
170 | } | ||
171 | 167 | ||
172 | kfree(i2c_get_clientdata(client)); | 168 | kfree(i2c_get_clientdata(client)); |
173 | return 0; | 169 | return 0; |
diff --git a/drivers/i2c/chips/pcf8574.c b/drivers/i2c/chips/pcf8574.c index cfcf64654080..6525743ff9fd 100644 --- a/drivers/i2c/chips/pcf8574.c +++ b/drivers/i2c/chips/pcf8574.c | |||
@@ -39,16 +39,14 @@ | |||
39 | #include <linux/init.h> | 39 | #include <linux/init.h> |
40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
41 | #include <linux/i2c.h> | 41 | #include <linux/i2c.h> |
42 | #include <linux/i2c-sensor.h> | ||
43 | 42 | ||
44 | /* Addresses to scan */ | 43 | /* Addresses to scan */ |
45 | static unsigned short normal_i2c[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, | 44 | static unsigned short normal_i2c[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, |
46 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, | 45 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, |
47 | I2C_CLIENT_END }; | 46 | I2C_CLIENT_END }; |
48 | static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; | ||
49 | 47 | ||
50 | /* Insmod parameters */ | 48 | /* Insmod parameters */ |
51 | SENSORS_INSMOD_2(pcf8574, pcf8574a); | 49 | I2C_CLIENT_INSMOD_2(pcf8574, pcf8574a); |
52 | 50 | ||
53 | /* Initial values */ | 51 | /* Initial values */ |
54 | #define PCF8574_INIT 255 /* All outputs on (input mode) */ | 52 | #define PCF8574_INIT 255 /* All outputs on (input mode) */ |
@@ -113,10 +111,10 @@ static DEVICE_ATTR(write, S_IWUSR | S_IRUGO, show_write, set_write); | |||
113 | 111 | ||
114 | static int pcf8574_attach_adapter(struct i2c_adapter *adapter) | 112 | static int pcf8574_attach_adapter(struct i2c_adapter *adapter) |
115 | { | 113 | { |
116 | return i2c_detect(adapter, &addr_data, pcf8574_detect); | 114 | return i2c_probe(adapter, &addr_data, pcf8574_detect); |
117 | } | 115 | } |
118 | 116 | ||
119 | /* This function is called by i2c_detect */ | 117 | /* This function is called by i2c_probe */ |
120 | int pcf8574_detect(struct i2c_adapter *adapter, int address, int kind) | 118 | int pcf8574_detect(struct i2c_adapter *adapter, int address, int kind) |
121 | { | 119 | { |
122 | struct i2c_client *new_client; | 120 | struct i2c_client *new_client; |
@@ -186,11 +184,8 @@ static int pcf8574_detach_client(struct i2c_client *client) | |||
186 | { | 184 | { |
187 | int err; | 185 | int err; |
188 | 186 | ||
189 | if ((err = i2c_detach_client(client))) { | 187 | if ((err = i2c_detach_client(client))) |
190 | dev_err(&client->dev, | ||
191 | "Client deregistration failed, client not detached.\n"); | ||
192 | return err; | 188 | return err; |
193 | } | ||
194 | 189 | ||
195 | kfree(i2c_get_clientdata(client)); | 190 | kfree(i2c_get_clientdata(client)); |
196 | return 0; | 191 | return 0; |
diff --git a/drivers/i2c/chips/pcf8591.c b/drivers/i2c/chips/pcf8591.c index db812ade8564..80f1df9a4500 100644 --- a/drivers/i2c/chips/pcf8591.c +++ b/drivers/i2c/chips/pcf8591.c | |||
@@ -24,15 +24,13 @@ | |||
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/i2c.h> | 26 | #include <linux/i2c.h> |
27 | #include <linux/i2c-sensor.h> | ||
28 | 27 | ||
29 | /* Addresses to scan */ | 28 | /* Addresses to scan */ |
30 | static unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, | 29 | static unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, |
31 | 0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; | 30 | 0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; |
32 | static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; | ||
33 | 31 | ||
34 | /* Insmod parameters */ | 32 | /* Insmod parameters */ |
35 | SENSORS_INSMOD_1(pcf8591); | 33 | I2C_CLIENT_INSMOD_1(pcf8591); |
36 | 34 | ||
37 | static int input_mode; | 35 | static int input_mode; |
38 | module_param(input_mode, int, 0); | 36 | module_param(input_mode, int, 0); |
@@ -164,10 +162,10 @@ static DEVICE_ATTR(out0_enable, S_IWUSR | S_IRUGO, | |||
164 | */ | 162 | */ |
165 | static int pcf8591_attach_adapter(struct i2c_adapter *adapter) | 163 | static int pcf8591_attach_adapter(struct i2c_adapter *adapter) |
166 | { | 164 | { |
167 | return i2c_detect(adapter, &addr_data, pcf8591_detect); | 165 | return i2c_probe(adapter, &addr_data, pcf8591_detect); |
168 | } | 166 | } |
169 | 167 | ||
170 | /* This function is called by i2c_detect */ | 168 | /* This function is called by i2c_probe */ |
171 | int pcf8591_detect(struct i2c_adapter *adapter, int address, int kind) | 169 | int pcf8591_detect(struct i2c_adapter *adapter, int address, int kind) |
172 | { | 170 | { |
173 | struct i2c_client *new_client; | 171 | struct i2c_client *new_client; |
@@ -241,11 +239,8 @@ static int pcf8591_detach_client(struct i2c_client *client) | |||
241 | { | 239 | { |
242 | int err; | 240 | int err; |
243 | 241 | ||
244 | if ((err = i2c_detach_client(client))) { | 242 | if ((err = i2c_detach_client(client))) |
245 | dev_err(&client->dev, | ||
246 | "Client deregistration failed, client not detached.\n"); | ||
247 | return err; | 243 | return err; |
248 | } | ||
249 | 244 | ||
250 | kfree(i2c_get_clientdata(client)); | 245 | kfree(i2c_get_clientdata(client)); |
251 | return 0; | 246 | return 0; |
diff --git a/drivers/i2c/chips/rtc8564.c b/drivers/i2c/chips/rtc8564.c index 588fc2261a91..0b5385c892b1 100644 --- a/drivers/i2c/chips/rtc8564.c +++ b/drivers/i2c/chips/rtc8564.c | |||
@@ -67,7 +67,6 @@ static struct i2c_client_address_data addr_data = { | |||
67 | .normal_i2c = normal_addr, | 67 | .normal_i2c = normal_addr, |
68 | .probe = ignore, | 68 | .probe = ignore, |
69 | .ignore = ignore, | 69 | .ignore = ignore, |
70 | .force = ignore, | ||
71 | }; | 70 | }; |
72 | 71 | ||
73 | static int rtc8564_read_mem(struct i2c_client *client, struct mem *mem); | 72 | static int rtc8564_read_mem(struct i2c_client *client, struct mem *mem); |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 4a9ead277596..dda472e5e8be 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -61,7 +61,7 @@ static int i2c_bus_resume(struct device * dev) | |||
61 | return rc; | 61 | return rc; |
62 | } | 62 | } |
63 | 63 | ||
64 | static struct bus_type i2c_bus_type = { | 64 | struct bus_type i2c_bus_type = { |
65 | .name = "i2c", | 65 | .name = "i2c", |
66 | .match = i2c_device_match, | 66 | .match = i2c_device_match, |
67 | .suspend = i2c_bus_suspend, | 67 | .suspend = i2c_bus_suspend, |
@@ -78,13 +78,13 @@ static int i2c_device_remove(struct device *dev) | |||
78 | return 0; | 78 | return 0; |
79 | } | 79 | } |
80 | 80 | ||
81 | static void i2c_adapter_dev_release(struct device *dev) | 81 | void i2c_adapter_dev_release(struct device *dev) |
82 | { | 82 | { |
83 | struct i2c_adapter *adap = dev_to_i2c_adapter(dev); | 83 | struct i2c_adapter *adap = dev_to_i2c_adapter(dev); |
84 | complete(&adap->dev_released); | 84 | complete(&adap->dev_released); |
85 | } | 85 | } |
86 | 86 | ||
87 | static struct device_driver i2c_adapter_driver = { | 87 | struct device_driver i2c_adapter_driver = { |
88 | .name = "i2c_adapter", | 88 | .name = "i2c_adapter", |
89 | .bus = &i2c_bus_type, | 89 | .bus = &i2c_bus_type, |
90 | .probe = i2c_device_probe, | 90 | .probe = i2c_device_probe, |
@@ -97,7 +97,7 @@ static void i2c_adapter_class_dev_release(struct class_device *dev) | |||
97 | complete(&adap->class_dev_released); | 97 | complete(&adap->class_dev_released); |
98 | } | 98 | } |
99 | 99 | ||
100 | static struct class i2c_adapter_class = { | 100 | struct class i2c_adapter_class = { |
101 | .name = "i2c-adapter", | 101 | .name = "i2c-adapter", |
102 | .release = &i2c_adapter_class_dev_release, | 102 | .release = &i2c_adapter_class_dev_release, |
103 | }; | 103 | }; |
@@ -188,6 +188,8 @@ int i2c_add_adapter(struct i2c_adapter *adap) | |||
188 | strlcpy(adap->class_dev.class_id, adap->dev.bus_id, BUS_ID_SIZE); | 188 | strlcpy(adap->class_dev.class_id, adap->dev.bus_id, BUS_ID_SIZE); |
189 | class_device_register(&adap->class_dev); | 189 | class_device_register(&adap->class_dev); |
190 | 190 | ||
191 | dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); | ||
192 | |||
191 | /* inform drivers of new adapters */ | 193 | /* inform drivers of new adapters */ |
192 | list_for_each(item,&drivers) { | 194 | list_for_each(item,&drivers) { |
193 | driver = list_entry(item, struct i2c_driver, list); | 195 | driver = list_entry(item, struct i2c_driver, list); |
@@ -196,8 +198,6 @@ int i2c_add_adapter(struct i2c_adapter *adap) | |||
196 | driver->attach_adapter(adap); | 198 | driver->attach_adapter(adap); |
197 | } | 199 | } |
198 | 200 | ||
199 | dev_dbg(&adap->dev, "registered as adapter #%d\n", adap->nr); | ||
200 | |||
201 | out_unlock: | 201 | out_unlock: |
202 | up(&core_lists); | 202 | up(&core_lists); |
203 | return res; | 203 | return res; |
@@ -220,8 +220,8 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
220 | break; | 220 | break; |
221 | } | 221 | } |
222 | if (adap_from_list != adap) { | 222 | if (adap_from_list != adap) { |
223 | pr_debug("I2C: Attempting to delete an unregistered " | 223 | pr_debug("i2c-core: attempting to delete unregistered " |
224 | "adapter\n"); | 224 | "adapter [%s]\n", adap->name); |
225 | res = -EINVAL; | 225 | res = -EINVAL; |
226 | goto out_unlock; | 226 | goto out_unlock; |
227 | } | 227 | } |
@@ -230,9 +230,8 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
230 | driver = list_entry(item, struct i2c_driver, list); | 230 | driver = list_entry(item, struct i2c_driver, list); |
231 | if (driver->detach_adapter) | 231 | if (driver->detach_adapter) |
232 | if ((res = driver->detach_adapter(adap))) { | 232 | if ((res = driver->detach_adapter(adap))) { |
233 | dev_warn(&adap->dev, "can't detach adapter " | 233 | dev_err(&adap->dev, "detach_adapter failed " |
234 | "while detaching driver %s: driver " | 234 | "for driver [%s]\n", driver->name); |
235 | "not detached!\n", driver->name); | ||
236 | goto out_unlock; | 235 | goto out_unlock; |
237 | } | 236 | } |
238 | } | 237 | } |
@@ -247,9 +246,8 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
247 | * must be deleted, as this would cause invalid states. | 246 | * must be deleted, as this would cause invalid states. |
248 | */ | 247 | */ |
249 | if ((res=client->driver->detach_client(client))) { | 248 | if ((res=client->driver->detach_client(client))) { |
250 | dev_err(&adap->dev, "adapter not " | 249 | dev_err(&adap->dev, "detach_client failed for client " |
251 | "unregistered, because client at " | 250 | "[%s] at address 0x%02x\n", client->name, |
252 | "address %02x can't be detached. ", | ||
253 | client->addr); | 251 | client->addr); |
254 | goto out_unlock; | 252 | goto out_unlock; |
255 | } | 253 | } |
@@ -270,7 +268,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
270 | /* free dynamically allocated bus id */ | 268 | /* free dynamically allocated bus id */ |
271 | idr_remove(&i2c_adapter_idr, adap->nr); | 269 | idr_remove(&i2c_adapter_idr, adap->nr); |
272 | 270 | ||
273 | dev_dbg(&adap->dev, "adapter unregistered\n"); | 271 | dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name); |
274 | 272 | ||
275 | out_unlock: | 273 | out_unlock: |
276 | up(&core_lists); | 274 | up(&core_lists); |
@@ -303,7 +301,7 @@ int i2c_add_driver(struct i2c_driver *driver) | |||
303 | goto out_unlock; | 301 | goto out_unlock; |
304 | 302 | ||
305 | list_add_tail(&driver->list,&drivers); | 303 | list_add_tail(&driver->list,&drivers); |
306 | pr_debug("i2c-core: driver %s registered.\n", driver->name); | 304 | pr_debug("i2c-core: driver [%s] registered\n", driver->name); |
307 | 305 | ||
308 | /* now look for instances of driver on our adapters */ | 306 | /* now look for instances of driver on our adapters */ |
309 | if (driver->flags & I2C_DF_NOTIFY) { | 307 | if (driver->flags & I2C_DF_NOTIFY) { |
@@ -331,21 +329,17 @@ int i2c_del_driver(struct i2c_driver *driver) | |||
331 | /* Have a look at each adapter, if clients of this driver are still | 329 | /* Have a look at each adapter, if clients of this driver are still |
332 | * attached. If so, detach them to be able to kill the driver | 330 | * attached. If so, detach them to be able to kill the driver |
333 | * afterwards. | 331 | * afterwards. |
334 | */ | 332 | * |
335 | pr_debug("i2c-core: unregister_driver - looking for clients.\n"); | 333 | * Removing clients does not depend on the notify flag, else |
336 | /* removing clients does not depend on the notify flag, else | ||
337 | * invalid operation might (will!) result, when using stale client | 334 | * invalid operation might (will!) result, when using stale client |
338 | * pointers. | 335 | * pointers. |
339 | */ | 336 | */ |
340 | list_for_each(item1,&adapters) { | 337 | list_for_each(item1,&adapters) { |
341 | adap = list_entry(item1, struct i2c_adapter, list); | 338 | adap = list_entry(item1, struct i2c_adapter, list); |
342 | dev_dbg(&adap->dev, "examining adapter\n"); | ||
343 | if (driver->detach_adapter) { | 339 | if (driver->detach_adapter) { |
344 | if ((res = driver->detach_adapter(adap))) { | 340 | if ((res = driver->detach_adapter(adap))) { |
345 | dev_warn(&adap->dev, "while unregistering " | 341 | dev_err(&adap->dev, "detach_adapter failed " |
346 | "dummy driver %s, adapter could " | 342 | "for driver [%s]\n", driver->name); |
347 | "not be detached properly; driver " | ||
348 | "not unloaded!",driver->name); | ||
349 | goto out_unlock; | 343 | goto out_unlock; |
350 | } | 344 | } |
351 | } else { | 345 | } else { |
@@ -353,16 +347,13 @@ int i2c_del_driver(struct i2c_driver *driver) | |||
353 | client = list_entry(item2, struct i2c_client, list); | 347 | client = list_entry(item2, struct i2c_client, list); |
354 | if (client->driver != driver) | 348 | if (client->driver != driver) |
355 | continue; | 349 | continue; |
356 | pr_debug("i2c-core.o: detaching client %s:\n", client->name); | 350 | dev_dbg(&adap->dev, "detaching client [%s] " |
351 | "at 0x%02x\n", client->name, | ||
352 | client->addr); | ||
357 | if ((res = driver->detach_client(client))) { | 353 | if ((res = driver->detach_client(client))) { |
358 | dev_err(&adap->dev, "while " | 354 | dev_err(&adap->dev, "detach_client " |
359 | "unregistering driver " | 355 | "failed for client [%s] at " |
360 | "`%s', the client at " | 356 | "0x%02x\n", client->name, |
361 | "address %02x of " | ||
362 | "adapter could not " | ||
363 | "be detached; driver " | ||
364 | "not unloaded!", | ||
365 | driver->name, | ||
366 | client->addr); | 357 | client->addr); |
367 | goto out_unlock; | 358 | goto out_unlock; |
368 | } | 359 | } |
@@ -372,7 +363,7 @@ int i2c_del_driver(struct i2c_driver *driver) | |||
372 | 363 | ||
373 | driver_unregister(&driver->driver); | 364 | driver_unregister(&driver->driver); |
374 | list_del(&driver->list); | 365 | list_del(&driver->list); |
375 | pr_debug("i2c-core: driver unregistered: %s\n", driver->name); | 366 | pr_debug("i2c-core: driver [%s] unregistered\n", driver->name); |
376 | 367 | ||
377 | out_unlock: | 368 | out_unlock: |
378 | up(&core_lists); | 369 | up(&core_lists); |
@@ -417,15 +408,12 @@ int i2c_attach_client(struct i2c_client *client) | |||
417 | 408 | ||
418 | if (adapter->client_register) { | 409 | if (adapter->client_register) { |
419 | if (adapter->client_register(client)) { | 410 | if (adapter->client_register(client)) { |
420 | dev_warn(&adapter->dev, "warning: client_register " | 411 | dev_dbg(&adapter->dev, "client_register " |
421 | "seems to have failed for client %02x\n", | 412 | "failed for client [%s] at 0x%02x\n", |
422 | client->addr); | 413 | client->name, client->addr); |
423 | } | 414 | } |
424 | } | 415 | } |
425 | 416 | ||
426 | dev_dbg(&adapter->dev, "client [%s] registered to adapter\n", | ||
427 | client->name); | ||
428 | |||
429 | if (client->flags & I2C_CLIENT_ALLOW_USE) | 417 | if (client->flags & I2C_CLIENT_ALLOW_USE) |
430 | client->usage_count = 0; | 418 | client->usage_count = 0; |
431 | 419 | ||
@@ -436,7 +424,8 @@ int i2c_attach_client(struct i2c_client *client) | |||
436 | 424 | ||
437 | snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id), | 425 | snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id), |
438 | "%d-%04x", i2c_adapter_id(adapter), client->addr); | 426 | "%d-%04x", i2c_adapter_id(adapter), client->addr); |
439 | pr_debug("registering %s\n", client->dev.bus_id); | 427 | dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n", |
428 | client->name, client->dev.bus_id); | ||
440 | device_register(&client->dev); | 429 | device_register(&client->dev); |
441 | device_create_file(&client->dev, &dev_attr_client_name); | 430 | device_create_file(&client->dev, &dev_attr_client_name); |
442 | 431 | ||
@@ -449,8 +438,12 @@ int i2c_detach_client(struct i2c_client *client) | |||
449 | struct i2c_adapter *adapter = client->adapter; | 438 | struct i2c_adapter *adapter = client->adapter; |
450 | int res = 0; | 439 | int res = 0; |
451 | 440 | ||
452 | if ((client->flags & I2C_CLIENT_ALLOW_USE) && (client->usage_count > 0)) | 441 | if ((client->flags & I2C_CLIENT_ALLOW_USE) |
442 | && (client->usage_count > 0)) { | ||
443 | dev_warn(&client->dev, "Client [%s] still busy, " | ||
444 | "can't detach\n", client->name); | ||
453 | return -EBUSY; | 445 | return -EBUSY; |
446 | } | ||
454 | 447 | ||
455 | if (adapter->client_unregister) { | 448 | if (adapter->client_unregister) { |
456 | res = adapter->client_unregister(client); | 449 | res = adapter->client_unregister(client); |
@@ -669,98 +662,128 @@ int i2c_control(struct i2c_client *client, | |||
669 | * Will not work for 10-bit addresses! | 662 | * Will not work for 10-bit addresses! |
670 | * ---------------------------------------------------- | 663 | * ---------------------------------------------------- |
671 | */ | 664 | */ |
665 | static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind, | ||
666 | int (*found_proc) (struct i2c_adapter *, int, int)) | ||
667 | { | ||
668 | int err; | ||
669 | |||
670 | /* Make sure the address is valid */ | ||
671 | if (addr < 0x03 || addr > 0x77) { | ||
672 | dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n", | ||
673 | addr); | ||
674 | return -EINVAL; | ||
675 | } | ||
676 | |||
677 | /* Skip if already in use */ | ||
678 | if (i2c_check_addr(adapter, addr)) | ||
679 | return 0; | ||
680 | |||
681 | /* Make sure there is something at this address, unless forced */ | ||
682 | if (kind < 0) { | ||
683 | if (i2c_smbus_xfer(adapter, addr, 0, 0, 0, | ||
684 | I2C_SMBUS_QUICK, NULL) < 0) | ||
685 | return 0; | ||
686 | |||
687 | /* prevent 24RF08 corruption */ | ||
688 | if ((addr & ~0x0f) == 0x50) | ||
689 | i2c_smbus_xfer(adapter, addr, 0, 0, 0, | ||
690 | I2C_SMBUS_QUICK, NULL); | ||
691 | } | ||
692 | |||
693 | /* Finally call the custom detection function */ | ||
694 | err = found_proc(adapter, addr, kind); | ||
695 | |||
696 | /* -ENODEV can be returned if there is a chip at the given address | ||
697 | but it isn't supported by this chip driver. We catch it here as | ||
698 | this isn't an error. */ | ||
699 | return (err == -ENODEV) ? 0 : err; | ||
700 | } | ||
701 | |||
672 | int i2c_probe(struct i2c_adapter *adapter, | 702 | int i2c_probe(struct i2c_adapter *adapter, |
673 | struct i2c_client_address_data *address_data, | 703 | struct i2c_client_address_data *address_data, |
674 | int (*found_proc) (struct i2c_adapter *, int, int)) | 704 | int (*found_proc) (struct i2c_adapter *, int, int)) |
675 | { | 705 | { |
676 | int addr,i,found,err; | 706 | int i, err; |
677 | int adap_id = i2c_adapter_id(adapter); | 707 | int adap_id = i2c_adapter_id(adapter); |
678 | 708 | ||
679 | /* Forget it if we can't probe using SMBUS_QUICK */ | 709 | /* Forget it if we can't probe using SMBUS_QUICK */ |
680 | if (! i2c_check_functionality(adapter,I2C_FUNC_SMBUS_QUICK)) | 710 | if (! i2c_check_functionality(adapter,I2C_FUNC_SMBUS_QUICK)) |
681 | return -1; | 711 | return -1; |
682 | 712 | ||
683 | for (addr = 0x00; addr <= 0x7f; addr++) { | 713 | /* Force entries are done first, and are not affected by ignore |
684 | 714 | entries */ | |
685 | /* Skip if already in use */ | 715 | if (address_data->forces) { |
686 | if (i2c_check_addr(adapter,addr)) | 716 | unsigned short **forces = address_data->forces; |
687 | continue; | 717 | int kind; |
688 | 718 | ||
689 | /* If it is in one of the force entries, we don't do any detection | 719 | for (kind = 0; forces[kind]; kind++) { |
690 | at all */ | 720 | for (i = 0; forces[kind][i] != I2C_CLIENT_END; |
691 | found = 0; | 721 | i += 2) { |
692 | 722 | if (forces[kind][i] == adap_id | |
693 | for (i = 0; !found && (address_data->force[i] != I2C_CLIENT_END); i += 2) { | 723 | || forces[kind][i] == ANY_I2C_BUS) { |
694 | if (((adap_id == address_data->force[i]) || | 724 | dev_dbg(&adapter->dev, "found force " |
695 | (address_data->force[i] == ANY_I2C_BUS)) && | 725 | "parameter for adapter %d, " |
696 | (addr == address_data->force[i+1])) { | 726 | "addr 0x%02x, kind %d\n", |
697 | dev_dbg(&adapter->dev, "found force parameter for adapter %d, addr %04x\n", | 727 | adap_id, forces[kind][i + 1], |
698 | adap_id, addr); | 728 | kind); |
699 | if ((err = found_proc(adapter,addr,0))) | 729 | err = i2c_probe_address(adapter, |
700 | return err; | 730 | forces[kind][i + 1], |
701 | found = 1; | 731 | kind, found_proc); |
702 | } | 732 | if (err) |
703 | } | 733 | return err; |
704 | if (found) | 734 | } |
705 | continue; | ||
706 | |||
707 | /* If this address is in one of the ignores, we can forget about | ||
708 | it right now */ | ||
709 | for (i = 0; | ||
710 | !found && (address_data->ignore[i] != I2C_CLIENT_END); | ||
711 | i += 2) { | ||
712 | if (((adap_id == address_data->ignore[i]) || | ||
713 | ((address_data->ignore[i] == ANY_I2C_BUS))) && | ||
714 | (addr == address_data->ignore[i+1])) { | ||
715 | dev_dbg(&adapter->dev, "found ignore parameter for adapter %d, " | ||
716 | "addr %04x\n", adap_id ,addr); | ||
717 | found = 1; | ||
718 | } | 735 | } |
719 | } | 736 | } |
720 | if (found) | 737 | } |
721 | continue; | ||
722 | 738 | ||
723 | /* Now, we will do a detection, but only if it is in the normal or | 739 | /* Probe entries are done second, and are not affected by ignore |
724 | probe entries */ | 740 | entries either */ |
725 | for (i = 0; | 741 | for (i = 0; address_data->probe[i] != I2C_CLIENT_END; i += 2) { |
726 | !found && (address_data->normal_i2c[i] != I2C_CLIENT_END); | 742 | if (address_data->probe[i] == adap_id |
727 | i += 1) { | 743 | || address_data->probe[i] == ANY_I2C_BUS) { |
728 | if (addr == address_data->normal_i2c[i]) { | 744 | dev_dbg(&adapter->dev, "found probe parameter for " |
729 | found = 1; | 745 | "adapter %d, addr 0x%02x\n", adap_id, |
730 | dev_dbg(&adapter->dev, "found normal i2c entry for adapter %d, " | 746 | address_data->probe[i + 1]); |
731 | "addr %02x\n", adap_id, addr); | 747 | err = i2c_probe_address(adapter, |
732 | } | 748 | address_data->probe[i + 1], |
749 | -1, found_proc); | ||
750 | if (err) | ||
751 | return err; | ||
733 | } | 752 | } |
753 | } | ||
734 | 754 | ||
735 | for (i = 0; | 755 | /* Normal entries are done last, unless shadowed by an ignore entry */ |
736 | !found && (address_data->probe[i] != I2C_CLIENT_END); | 756 | for (i = 0; address_data->normal_i2c[i] != I2C_CLIENT_END; i += 1) { |
737 | i += 2) { | 757 | int j, ignore; |
738 | if (((adap_id == address_data->probe[i]) || | 758 | |
739 | ((address_data->probe[i] == ANY_I2C_BUS))) && | 759 | ignore = 0; |
740 | (addr == address_data->probe[i+1])) { | 760 | for (j = 0; address_data->ignore[j] != I2C_CLIENT_END; |
741 | found = 1; | 761 | j += 2) { |
742 | dev_dbg(&adapter->dev, "found probe parameter for adapter %d, " | 762 | if ((address_data->ignore[j] == adap_id || |
743 | "addr %04x\n", adap_id,addr); | 763 | address_data->ignore[j] == ANY_I2C_BUS) |
764 | && address_data->ignore[j + 1] | ||
765 | == address_data->normal_i2c[i]) { | ||
766 | dev_dbg(&adapter->dev, "found ignore " | ||
767 | "parameter for adapter %d, " | ||
768 | "addr 0x%02x\n", adap_id, | ||
769 | address_data->ignore[j + 1]); | ||
744 | } | 770 | } |
771 | ignore = 1; | ||
772 | break; | ||
745 | } | 773 | } |
746 | if (!found) | 774 | if (ignore) |
747 | continue; | 775 | continue; |
748 | 776 | ||
749 | /* OK, so we really should examine this address. First check | 777 | dev_dbg(&adapter->dev, "found normal entry for adapter %d, " |
750 | whether there is some client here at all! */ | 778 | "addr 0x%02x\n", adap_id, |
751 | if (i2c_smbus_xfer(adapter,addr,0,0,0,I2C_SMBUS_QUICK,NULL) >= 0) | 779 | address_data->normal_i2c[i]); |
752 | if ((err = found_proc(adapter,addr,-1))) | 780 | err = i2c_probe_address(adapter, address_data->normal_i2c[i], |
753 | return err; | 781 | -1, found_proc); |
782 | if (err) | ||
783 | return err; | ||
754 | } | 784 | } |
755 | return 0; | ||
756 | } | ||
757 | 785 | ||
758 | /* | 786 | return 0; |
759 | * return id number for a specific adapter | ||
760 | */ | ||
761 | int i2c_adapter_id(struct i2c_adapter *adap) | ||
762 | { | ||
763 | return adap->nr; | ||
764 | } | 787 | } |
765 | 788 | ||
766 | struct i2c_adapter* i2c_get_adapter(int id) | 789 | struct i2c_adapter* i2c_get_adapter(int id) |
@@ -1171,6 +1194,12 @@ s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags, | |||
1171 | } | 1194 | } |
1172 | 1195 | ||
1173 | 1196 | ||
1197 | /* Next four are needed by i2c-isa */ | ||
1198 | EXPORT_SYMBOL_GPL(i2c_adapter_dev_release); | ||
1199 | EXPORT_SYMBOL_GPL(i2c_adapter_driver); | ||
1200 | EXPORT_SYMBOL_GPL(i2c_adapter_class); | ||
1201 | EXPORT_SYMBOL_GPL(i2c_bus_type); | ||
1202 | |||
1174 | EXPORT_SYMBOL(i2c_add_adapter); | 1203 | EXPORT_SYMBOL(i2c_add_adapter); |
1175 | EXPORT_SYMBOL(i2c_del_adapter); | 1204 | EXPORT_SYMBOL(i2c_del_adapter); |
1176 | EXPORT_SYMBOL(i2c_add_driver); | 1205 | EXPORT_SYMBOL(i2c_add_driver); |
@@ -1186,7 +1215,6 @@ EXPORT_SYMBOL(i2c_master_send); | |||
1186 | EXPORT_SYMBOL(i2c_master_recv); | 1215 | EXPORT_SYMBOL(i2c_master_recv); |
1187 | EXPORT_SYMBOL(i2c_control); | 1216 | EXPORT_SYMBOL(i2c_control); |
1188 | EXPORT_SYMBOL(i2c_transfer); | 1217 | EXPORT_SYMBOL(i2c_transfer); |
1189 | EXPORT_SYMBOL(i2c_adapter_id); | ||
1190 | EXPORT_SYMBOL(i2c_get_adapter); | 1218 | EXPORT_SYMBOL(i2c_get_adapter); |
1191 | EXPORT_SYMBOL(i2c_put_adapter); | 1219 | EXPORT_SYMBOL(i2c_put_adapter); |
1192 | EXPORT_SYMBOL(i2c_probe); | 1220 | EXPORT_SYMBOL(i2c_probe); |
diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index bc5d557e5dd9..aa7a4fadef64 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c | |||
@@ -434,7 +434,8 @@ static int i2cdev_attach_adapter(struct i2c_adapter *adap) | |||
434 | 434 | ||
435 | devfs_mk_cdev(MKDEV(I2C_MAJOR, i2c_dev->minor), | 435 | devfs_mk_cdev(MKDEV(I2C_MAJOR, i2c_dev->minor), |
436 | S_IFCHR|S_IRUSR|S_IWUSR, "i2c/%d", i2c_dev->minor); | 436 | S_IFCHR|S_IRUSR|S_IWUSR, "i2c/%d", i2c_dev->minor); |
437 | dev_dbg(&adap->dev, "Registered as minor %d\n", i2c_dev->minor); | 437 | pr_debug("i2c-dev: adapter [%s] registered as minor %d\n", |
438 | adap->name, i2c_dev->minor); | ||
438 | 439 | ||
439 | /* register this i2c device with the driver core */ | 440 | /* register this i2c device with the driver core */ |
440 | i2c_dev->adap = adap; | 441 | i2c_dev->adap = adap; |
@@ -471,7 +472,7 @@ static int i2cdev_detach_adapter(struct i2c_adapter *adap) | |||
471 | wait_for_completion(&i2c_dev->released); | 472 | wait_for_completion(&i2c_dev->released); |
472 | kfree(i2c_dev); | 473 | kfree(i2c_dev); |
473 | 474 | ||
474 | dev_dbg(&adap->dev, "Adapter unregistered\n"); | 475 | pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name); |
475 | return 0; | 476 | return 0; |
476 | } | 477 | } |
477 | 478 | ||
diff --git a/drivers/i2c/i2c-sensor-detect.c b/drivers/i2c/i2c-sensor-detect.c deleted file mode 100644 index f99a8161a9f1..000000000000 --- a/drivers/i2c/i2c-sensor-detect.c +++ /dev/null | |||
@@ -1,145 +0,0 @@ | |||
1 | /* | ||
2 | i2c-sensor-detect.c - Part of lm_sensors, Linux kernel modules for hardware | ||
3 | monitoring | ||
4 | Copyright (c) 1998 - 2001 Frodo Looijaard <frodol@dds.nl> and | ||
5 | Mark D. Studebaker <mdsxyz123@yahoo.com> | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2 of the License, or | ||
10 | (at your option) any later version. | ||
11 | |||
12 | This program is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software | ||
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/module.h> | ||
23 | #include <linux/kernel.h> | ||
24 | #include <linux/i2c.h> | ||
25 | #include <linux/i2c-sensor.h> | ||
26 | |||
27 | static unsigned short empty[] = {I2C_CLIENT_END}; | ||
28 | static unsigned int empty_isa[] = {I2C_CLIENT_ISA_END}; | ||
29 | |||
30 | /* Very inefficient for ISA detects, and won't work for 10-bit addresses! */ | ||
31 | int i2c_detect(struct i2c_adapter *adapter, | ||
32 | struct i2c_address_data *address_data, | ||
33 | int (*found_proc) (struct i2c_adapter *, int, int)) | ||
34 | { | ||
35 | int addr, i, found, j, err; | ||
36 | struct i2c_force_data *this_force; | ||
37 | int is_isa = i2c_is_isa_adapter(adapter); | ||
38 | int adapter_id = | ||
39 | is_isa ? ANY_I2C_ISA_BUS : i2c_adapter_id(adapter); | ||
40 | unsigned short *normal_i2c; | ||
41 | unsigned int *normal_isa; | ||
42 | unsigned short *probe; | ||
43 | unsigned short *ignore; | ||
44 | |||
45 | /* Forget it if we can't probe using SMBUS_QUICK */ | ||
46 | if ((!is_isa) && | ||
47 | !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) | ||
48 | return -1; | ||
49 | |||
50 | /* Use default "empty" list if the adapter doesn't specify any */ | ||
51 | normal_i2c = probe = ignore = empty; | ||
52 | normal_isa = empty_isa; | ||
53 | if (address_data->normal_i2c) | ||
54 | normal_i2c = address_data->normal_i2c; | ||
55 | if (address_data->normal_isa) | ||
56 | normal_isa = address_data->normal_isa; | ||
57 | if (address_data->probe) | ||
58 | probe = address_data->probe; | ||
59 | if (address_data->ignore) | ||
60 | ignore = address_data->ignore; | ||
61 | |||
62 | for (addr = 0x00; addr <= (is_isa ? 0xffff : 0x7f); addr++) { | ||
63 | if (!is_isa && i2c_check_addr(adapter, addr)) | ||
64 | continue; | ||
65 | |||
66 | /* If it is in one of the force entries, we don't do any | ||
67 | detection at all */ | ||
68 | found = 0; | ||
69 | for (i = 0; !found && (this_force = address_data->forces + i, this_force->force); i++) { | ||
70 | for (j = 0; !found && (this_force->force[j] != I2C_CLIENT_END); j += 2) { | ||
71 | if ( ((adapter_id == this_force->force[j]) || | ||
72 | ((this_force->force[j] == ANY_I2C_BUS) && !is_isa)) && | ||
73 | (addr == this_force->force[j + 1]) ) { | ||
74 | dev_dbg(&adapter->dev, "found force parameter for adapter %d, addr %04x\n", adapter_id, addr); | ||
75 | if ((err = found_proc(adapter, addr, this_force->kind))) | ||
76 | return err; | ||
77 | found = 1; | ||
78 | } | ||
79 | } | ||
80 | } | ||
81 | if (found) | ||
82 | continue; | ||
83 | |||
84 | /* If this address is in one of the ignores, we can forget about it | ||
85 | right now */ | ||
86 | for (i = 0; !found && (ignore[i] != I2C_CLIENT_END); i += 2) { | ||
87 | if ( ((adapter_id == ignore[i]) || | ||
88 | ((ignore[i] == ANY_I2C_BUS) && | ||
89 | !is_isa)) && | ||
90 | (addr == ignore[i + 1])) { | ||
91 | dev_dbg(&adapter->dev, "found ignore parameter for adapter %d, addr %04x\n", adapter_id, addr); | ||
92 | found = 1; | ||
93 | } | ||
94 | } | ||
95 | if (found) | ||
96 | continue; | ||
97 | |||
98 | /* Now, we will do a detection, but only if it is in the normal or | ||
99 | probe entries */ | ||
100 | if (is_isa) { | ||
101 | for (i = 0; !found && (normal_isa[i] != I2C_CLIENT_ISA_END); i += 1) { | ||
102 | if (addr == normal_isa[i]) { | ||
103 | dev_dbg(&adapter->dev, "found normal isa entry for adapter %d, addr %04x\n", adapter_id, addr); | ||
104 | found = 1; | ||
105 | } | ||
106 | } | ||
107 | } else { | ||
108 | for (i = 0; !found && (normal_i2c[i] != I2C_CLIENT_END); i += 1) { | ||
109 | if (addr == normal_i2c[i]) { | ||
110 | found = 1; | ||
111 | dev_dbg(&adapter->dev, "found normal i2c entry for adapter %d, addr %02x\n", adapter_id, addr); | ||
112 | } | ||
113 | } | ||
114 | } | ||
115 | |||
116 | for (i = 0; | ||
117 | !found && (probe[i] != I2C_CLIENT_END); | ||
118 | i += 2) { | ||
119 | if (((adapter_id == probe[i]) || | ||
120 | ((probe[i] == ANY_I2C_BUS) && !is_isa)) | ||
121 | && (addr == probe[i + 1])) { | ||
122 | dev_dbg(&adapter->dev, "found probe parameter for adapter %d, addr %04x\n", adapter_id, addr); | ||
123 | found = 1; | ||
124 | } | ||
125 | } | ||
126 | if (!found) | ||
127 | continue; | ||
128 | |||
129 | /* OK, so we really should examine this address. First check | ||
130 | whether there is some client here at all! */ | ||
131 | if (is_isa || | ||
132 | (i2c_smbus_xfer (adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL) >= 0)) | ||
133 | if ((err = found_proc(adapter, addr, -1))) | ||
134 | return err; | ||
135 | } | ||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | EXPORT_SYMBOL(i2c_detect); | ||
140 | |||
141 | MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, " | ||
142 | "Rudolf Marek <r.marek@sh.cvut.cz>"); | ||
143 | |||
144 | MODULE_DESCRIPTION("i2c-sensor driver"); | ||
145 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/i2c/i2c-sensor-vid.c b/drivers/i2c/i2c-sensor-vid.c deleted file mode 100644 index 922e22f054bb..000000000000 --- a/drivers/i2c/i2c-sensor-vid.c +++ /dev/null | |||
@@ -1,98 +0,0 @@ | |||
1 | /* | ||
2 | i2c-sensor-vid.c - Part of lm_sensors, Linux kernel modules for hardware | ||
3 | monitoring | ||
4 | |||
5 | Copyright (c) 2004 Rudolf Marek <r.marek@sh.cvut.cz> | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2 of the License, or | ||
10 | (at your option) any later version. | ||
11 | |||
12 | This program is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software | ||
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/config.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/kernel.h> | ||
25 | |||
26 | struct vrm_model { | ||
27 | u8 vendor; | ||
28 | u8 eff_family; | ||
29 | u8 eff_model; | ||
30 | int vrm_type; | ||
31 | }; | ||
32 | |||
33 | #define ANY 0xFF | ||
34 | |||
35 | #ifdef CONFIG_X86 | ||
36 | |||
37 | static struct vrm_model vrm_models[] = { | ||
38 | {X86_VENDOR_AMD, 0x6, ANY, 90}, /* Athlon Duron etc */ | ||
39 | {X86_VENDOR_AMD, 0xF, ANY, 24}, /* Athlon 64, Opteron */ | ||
40 | {X86_VENDOR_INTEL, 0x6, 0x9, 85}, /* 0.13um too */ | ||
41 | {X86_VENDOR_INTEL, 0x6, 0xB, 85}, /* 0xB Tualatin */ | ||
42 | {X86_VENDOR_INTEL, 0x6, ANY, 82}, /* any P6 */ | ||
43 | {X86_VENDOR_INTEL, 0x7, ANY, 0}, /* Itanium */ | ||
44 | {X86_VENDOR_INTEL, 0xF, 0x3, 100}, /* P4 Prescott */ | ||
45 | {X86_VENDOR_INTEL, 0xF, ANY, 90}, /* P4 before Prescott */ | ||
46 | {X86_VENDOR_INTEL, 0x10,ANY, 0}, /* Itanium 2 */ | ||
47 | {X86_VENDOR_UNKNOWN, ANY, ANY, 0} /* stop here */ | ||
48 | }; | ||
49 | |||
50 | static int find_vrm(u8 eff_family, u8 eff_model, u8 vendor) | ||
51 | { | ||
52 | int i = 0; | ||
53 | |||
54 | while (vrm_models[i].vendor!=X86_VENDOR_UNKNOWN) { | ||
55 | if (vrm_models[i].vendor==vendor) | ||
56 | if ((vrm_models[i].eff_family==eff_family)&& \ | ||
57 | ((vrm_models[i].eff_model==eff_model)|| \ | ||
58 | (vrm_models[i].eff_model==ANY))) | ||
59 | return vrm_models[i].vrm_type; | ||
60 | i++; | ||
61 | } | ||
62 | |||
63 | return 0; | ||
64 | } | ||
65 | |||
66 | int i2c_which_vrm(void) | ||
67 | { | ||
68 | struct cpuinfo_x86 *c = cpu_data; | ||
69 | u32 eax; | ||
70 | u8 eff_family, eff_model; | ||
71 | int vrm_ret; | ||
72 | |||
73 | if (c->x86 < 6) return 0; /* any CPU with familly lower than 6 | ||
74 | dont have VID and/or CPUID */ | ||
75 | eax = cpuid_eax(1); | ||
76 | eff_family = ((eax & 0x00000F00)>>8); | ||
77 | eff_model = ((eax & 0x000000F0)>>4); | ||
78 | if (eff_family == 0xF) { /* use extended model & family */ | ||
79 | eff_family += ((eax & 0x00F00000)>>20); | ||
80 | eff_model += ((eax & 0x000F0000)>>16)<<4; | ||
81 | } | ||
82 | vrm_ret = find_vrm(eff_family,eff_model,c->x86_vendor); | ||
83 | if (vrm_ret == 0) | ||
84 | printk(KERN_INFO "i2c-sensor.o: Unknown VRM version of your" | ||
85 | " x86 CPU\n"); | ||
86 | return vrm_ret; | ||
87 | } | ||
88 | |||
89 | /* and now for something completely different for Non-x86 world*/ | ||
90 | #else | ||
91 | int i2c_which_vrm(void) | ||
92 | { | ||
93 | printk(KERN_INFO "i2c-sensor.o: Unknown VRM version of your CPU\n"); | ||
94 | return 0; | ||
95 | } | ||
96 | #endif | ||
97 | |||
98 | EXPORT_SYMBOL(i2c_which_vrm); | ||