diff options
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/Kconfig | 2 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-amd756.c | 2 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 36 | ||||
-rw-r--r-- | drivers/i2c/chips/Makefile | 7 | ||||
-rw-r--r-- | drivers/i2c/i2c-core.c | 10 |
5 files changed, 44 insertions, 13 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 476b0bb72d6c..5fa9c3c67e0c 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -100,7 +100,7 @@ config I2C_AU1550 | |||
100 | 100 | ||
101 | config I2C_BLACKFIN_TWI | 101 | config I2C_BLACKFIN_TWI |
102 | tristate "Blackfin TWI I2C support" | 102 | tristate "Blackfin TWI I2C support" |
103 | depends on BF534 || BF536 || BF537 || BF54x | 103 | depends on BF534 || BF536 || BF537 |
104 | help | 104 | help |
105 | This is the TWI I2C device driver for Blackfin 534/536/537/54x. | 105 | This is the TWI I2C device driver for Blackfin 534/536/537/54x. |
106 | This driver can also be built as a module. If so, the module | 106 | This driver can also be built as a module. If so, the module |
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c index 573abe440842..2fa43183d375 100644 --- a/drivers/i2c/busses/i2c-amd756.c +++ b/drivers/i2c/busses/i2c-amd756.c | |||
@@ -335,7 +335,7 @@ static int __devinit amd756_probe(struct pci_dev *pdev, | |||
335 | u8 temp; | 335 | u8 temp; |
336 | 336 | ||
337 | /* driver_data might come from user-space, so check it */ | 337 | /* driver_data might come from user-space, so check it */ |
338 | if (id->driver_data > ARRAY_SIZE(chipname)) | 338 | if (id->driver_data >= ARRAY_SIZE(chipname)) |
339 | return -EINVAL; | 339 | return -EINVAL; |
340 | 340 | ||
341 | if (amd756_ioport) { | 341 | if (amd756_ioport) { |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index da6639707ea3..7ba31770d773 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
@@ -128,6 +128,8 @@ struct omap_i2c_dev { | |||
128 | size_t buf_len; | 128 | size_t buf_len; |
129 | struct i2c_adapter adapter; | 129 | struct i2c_adapter adapter; |
130 | unsigned rev1:1; | 130 | unsigned rev1:1; |
131 | unsigned idle:1; | ||
132 | u16 iestate; /* Saved interrupt register */ | ||
131 | }; | 133 | }; |
132 | 134 | ||
133 | static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev, | 135 | static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev, |
@@ -174,18 +176,30 @@ static void omap_i2c_put_clocks(struct omap_i2c_dev *dev) | |||
174 | } | 176 | } |
175 | } | 177 | } |
176 | 178 | ||
177 | static void omap_i2c_enable_clocks(struct omap_i2c_dev *dev) | 179 | static void omap_i2c_unidle(struct omap_i2c_dev *dev) |
178 | { | 180 | { |
179 | if (dev->iclk != NULL) | 181 | if (dev->iclk != NULL) |
180 | clk_enable(dev->iclk); | 182 | clk_enable(dev->iclk); |
181 | clk_enable(dev->fclk); | 183 | clk_enable(dev->fclk); |
184 | if (dev->iestate) | ||
185 | omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); | ||
186 | dev->idle = 0; | ||
182 | } | 187 | } |
183 | 188 | ||
184 | static void omap_i2c_disable_clocks(struct omap_i2c_dev *dev) | 189 | static void omap_i2c_idle(struct omap_i2c_dev *dev) |
185 | { | 190 | { |
191 | u16 iv; | ||
192 | |||
193 | dev->idle = 1; | ||
194 | dev->iestate = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); | ||
195 | omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0); | ||
196 | if (dev->rev1) | ||
197 | iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); /* Read clears */ | ||
198 | else | ||
199 | omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, dev->iestate); | ||
200 | clk_disable(dev->fclk); | ||
186 | if (dev->iclk != NULL) | 201 | if (dev->iclk != NULL) |
187 | clk_disable(dev->iclk); | 202 | clk_disable(dev->iclk); |
188 | clk_disable(dev->fclk); | ||
189 | } | 203 | } |
190 | 204 | ||
191 | static int omap_i2c_init(struct omap_i2c_dev *dev) | 205 | static int omap_i2c_init(struct omap_i2c_dev *dev) |
@@ -360,7 +374,7 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
360 | int i; | 374 | int i; |
361 | int r; | 375 | int r; |
362 | 376 | ||
363 | omap_i2c_enable_clocks(dev); | 377 | omap_i2c_unidle(dev); |
364 | 378 | ||
365 | if ((r = omap_i2c_wait_for_bb(dev)) < 0) | 379 | if ((r = omap_i2c_wait_for_bb(dev)) < 0) |
366 | goto out; | 380 | goto out; |
@@ -374,7 +388,7 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
374 | if (r == 0) | 388 | if (r == 0) |
375 | r = num; | 389 | r = num; |
376 | out: | 390 | out: |
377 | omap_i2c_disable_clocks(dev); | 391 | omap_i2c_idle(dev); |
378 | return r; | 392 | return r; |
379 | } | 393 | } |
380 | 394 | ||
@@ -403,6 +417,9 @@ omap_i2c_rev1_isr(int this_irq, void *dev_id) | |||
403 | struct omap_i2c_dev *dev = dev_id; | 417 | struct omap_i2c_dev *dev = dev_id; |
404 | u16 iv, w; | 418 | u16 iv, w; |
405 | 419 | ||
420 | if (dev->idle) | ||
421 | return IRQ_NONE; | ||
422 | |||
406 | iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); | 423 | iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); |
407 | switch (iv) { | 424 | switch (iv) { |
408 | case 0x00: /* None */ | 425 | case 0x00: /* None */ |
@@ -457,6 +474,9 @@ omap_i2c_isr(int this_irq, void *dev_id) | |||
457 | u16 stat, w; | 474 | u16 stat, w; |
458 | int count = 0; | 475 | int count = 0; |
459 | 476 | ||
477 | if (dev->idle) | ||
478 | return IRQ_NONE; | ||
479 | |||
460 | bits = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); | 480 | bits = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); |
461 | while ((stat = (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG))) & bits) { | 481 | while ((stat = (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG))) & bits) { |
462 | dev_dbg(dev->dev, "IRQ (ISR = 0x%04x)\n", stat); | 482 | dev_dbg(dev->dev, "IRQ (ISR = 0x%04x)\n", stat); |
@@ -575,7 +595,7 @@ omap_i2c_probe(struct platform_device *pdev) | |||
575 | if ((r = omap_i2c_get_clocks(dev)) != 0) | 595 | if ((r = omap_i2c_get_clocks(dev)) != 0) |
576 | goto err_free_mem; | 596 | goto err_free_mem; |
577 | 597 | ||
578 | omap_i2c_enable_clocks(dev); | 598 | omap_i2c_unidle(dev); |
579 | 599 | ||
580 | if (cpu_is_omap15xx()) | 600 | if (cpu_is_omap15xx()) |
581 | dev->rev1 = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) < 0x20; | 601 | dev->rev1 = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) < 0x20; |
@@ -610,7 +630,7 @@ omap_i2c_probe(struct platform_device *pdev) | |||
610 | goto err_free_irq; | 630 | goto err_free_irq; |
611 | } | 631 | } |
612 | 632 | ||
613 | omap_i2c_disable_clocks(dev); | 633 | omap_i2c_idle(dev); |
614 | 634 | ||
615 | return 0; | 635 | return 0; |
616 | 636 | ||
@@ -618,7 +638,7 @@ err_free_irq: | |||
618 | free_irq(dev->irq, dev); | 638 | free_irq(dev->irq, dev); |
619 | err_unuse_clocks: | 639 | err_unuse_clocks: |
620 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); | 640 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); |
621 | omap_i2c_disable_clocks(dev); | 641 | omap_i2c_idle(dev); |
622 | omap_i2c_put_clocks(dev); | 642 | omap_i2c_put_clocks(dev); |
623 | err_free_mem: | 643 | err_free_mem: |
624 | platform_set_drvdata(pdev, NULL); | 644 | platform_set_drvdata(pdev, NULL); |
diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile index 501f00cea782..e47aca0ca5ae 100644 --- a/drivers/i2c/chips/Makefile +++ b/drivers/i2c/chips/Makefile | |||
@@ -1,6 +1,13 @@ | |||
1 | # | 1 | # |
2 | # Makefile for miscellaneous I2C chip drivers. | 2 | # Makefile for miscellaneous I2C chip drivers. |
3 | # | 3 | # |
4 | # Think twice before you add a new driver to this directory. | ||
5 | # Device drivers are better grouped according to the functionality they | ||
6 | # implement rather than to the bus they are connected to. In particular: | ||
7 | # * Hardware monitoring chip drivers go to drivers/hwmon | ||
8 | # * RTC chip drivers go to drivers/rtc | ||
9 | # * I/O expander drivers go to drivers/gpio | ||
10 | # | ||
4 | 11 | ||
5 | obj-$(CONFIG_DS1682) += ds1682.o | 12 | obj-$(CONFIG_DS1682) += ds1682.o |
6 | obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o | 13 | obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 96da22e9a5a4..8b645c6b2cb5 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -90,12 +90,16 @@ static int i2c_device_probe(struct device *dev) | |||
90 | { | 90 | { |
91 | struct i2c_client *client = to_i2c_client(dev); | 91 | struct i2c_client *client = to_i2c_client(dev); |
92 | struct i2c_driver *driver = to_i2c_driver(dev->driver); | 92 | struct i2c_driver *driver = to_i2c_driver(dev->driver); |
93 | int status; | ||
93 | 94 | ||
94 | if (!driver->probe) | 95 | if (!driver->probe) |
95 | return -ENODEV; | 96 | return -ENODEV; |
96 | client->driver = driver; | 97 | client->driver = driver; |
97 | dev_dbg(dev, "probe\n"); | 98 | dev_dbg(dev, "probe\n"); |
98 | return driver->probe(client); | 99 | status = driver->probe(client); |
100 | if (status) | ||
101 | client->driver = NULL; | ||
102 | return status; | ||
99 | } | 103 | } |
100 | 104 | ||
101 | static int i2c_device_remove(struct device *dev) | 105 | static int i2c_device_remove(struct device *dev) |
@@ -485,8 +489,8 @@ EXPORT_SYMBOL(i2c_add_adapter); | |||
485 | * Context: can sleep | 489 | * Context: can sleep |
486 | * | 490 | * |
487 | * This routine is used to declare an I2C adapter when its bus number | 491 | * This routine is used to declare an I2C adapter when its bus number |
488 | * matters. Example: for I2C adapters from system-on-chip CPUs, or | 492 | * matters. For example, use it for I2C adapters from system-on-chip CPUs, |
489 | * otherwise built in to the system's mainboard, and where i2c_board_info | 493 | * or otherwise built in to the system's mainboard, and where i2c_board_info |
490 | * is used to properly configure I2C devices. | 494 | * is used to properly configure I2C devices. |
491 | * | 495 | * |
492 | * If no devices have pre-been declared for this bus, then be sure to | 496 | * If no devices have pre-been declared for this bus, then be sure to |