diff options
| author | David S. Miller <davem@davemloft.net> | 2009-12-01 18:46:35 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-12-01 18:46:35 -0500 |
| commit | 7e8f44f8d4fa9bb35e32c161fbcdbd6b9e6400e3 (patch) | |
| tree | cf6d526a070a06b365ab0ceb4e1c3ca9ad94666e /drivers/i2c | |
| parent | 138f3c8518976953563a1316d7e0420c72d4ab96 (diff) | |
| parent | 2127816366e0ffbc1426fa69e7b9b2bebd2e2288 (diff) | |
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/i2c-pnx.c | 9 | ||||
| -rw-r--r-- | drivers/i2c/chips/tsl2550.c | 3 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core.c | 11 |
3 files changed, 21 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c index 6ff6c20f1e78..fbab6846ae64 100644 --- a/drivers/i2c/busses/i2c-pnx.c +++ b/drivers/i2c/busses/i2c-pnx.c | |||
| @@ -19,7 +19,9 @@ | |||
| 19 | #include <linux/completion.h> | 19 | #include <linux/completion.h> |
| 20 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
| 21 | #include <linux/i2c-pnx.h> | 21 | #include <linux/i2c-pnx.h> |
| 22 | #include <linux/io.h> | ||
| 22 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
| 24 | #include <mach/i2c.h> | ||
| 23 | #include <asm/irq.h> | 25 | #include <asm/irq.h> |
| 24 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
| 25 | 27 | ||
| @@ -54,6 +56,9 @@ static inline void i2c_pnx_arm_timer(struct i2c_adapter *adap) | |||
| 54 | struct timer_list *timer = &data->mif.timer; | 56 | struct timer_list *timer = &data->mif.timer; |
| 55 | int expires = I2C_PNX_TIMEOUT / (1000 / HZ); | 57 | int expires = I2C_PNX_TIMEOUT / (1000 / HZ); |
| 56 | 58 | ||
| 59 | if (expires <= 1) | ||
| 60 | expires = 2; | ||
| 61 | |||
| 57 | del_timer_sync(timer); | 62 | del_timer_sync(timer); |
| 58 | 63 | ||
| 59 | dev_dbg(&adap->dev, "Timer armed at %lu plus %u jiffies.\n", | 64 | dev_dbg(&adap->dev, "Timer armed at %lu plus %u jiffies.\n", |
| @@ -645,7 +650,7 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev) | |||
| 645 | return 0; | 650 | return 0; |
| 646 | 651 | ||
| 647 | out_irq: | 652 | out_irq: |
| 648 | free_irq(alg_data->irq, alg_data); | 653 | free_irq(alg_data->irq, i2c_pnx->adapter); |
| 649 | out_clock: | 654 | out_clock: |
| 650 | i2c_pnx->set_clock_stop(pdev); | 655 | i2c_pnx->set_clock_stop(pdev); |
| 651 | out_unmap: | 656 | out_unmap: |
| @@ -664,7 +669,7 @@ static int __devexit i2c_pnx_remove(struct platform_device *pdev) | |||
| 664 | struct i2c_adapter *adap = i2c_pnx->adapter; | 669 | struct i2c_adapter *adap = i2c_pnx->adapter; |
| 665 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | 670 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; |
| 666 | 671 | ||
| 667 | free_irq(alg_data->irq, alg_data); | 672 | free_irq(alg_data->irq, i2c_pnx->adapter); |
| 668 | i2c_del_adapter(adap); | 673 | i2c_del_adapter(adap); |
| 669 | i2c_pnx->set_clock_stop(pdev); | 674 | i2c_pnx->set_clock_stop(pdev); |
| 670 | iounmap((void *)alg_data->ioaddr); | 675 | iounmap((void *)alg_data->ioaddr); |
diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c index aa96bd2d27ea..a0702f36a72f 100644 --- a/drivers/i2c/chips/tsl2550.c +++ b/drivers/i2c/chips/tsl2550.c | |||
| @@ -257,6 +257,7 @@ static DEVICE_ATTR(operating_mode, S_IWUSR | S_IRUGO, | |||
| 257 | 257 | ||
| 258 | static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf) | 258 | static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf) |
| 259 | { | 259 | { |
| 260 | struct tsl2550_data *data = i2c_get_clientdata(client); | ||
| 260 | u8 ch0, ch1; | 261 | u8 ch0, ch1; |
| 261 | int ret; | 262 | int ret; |
| 262 | 263 | ||
| @@ -274,6 +275,8 @@ static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf) | |||
| 274 | ret = tsl2550_calculate_lux(ch0, ch1); | 275 | ret = tsl2550_calculate_lux(ch0, ch1); |
| 275 | if (ret < 0) | 276 | if (ret < 0) |
| 276 | return ret; | 277 | return ret; |
| 278 | if (data->operating_mode == 1) | ||
| 279 | ret *= 5; | ||
| 277 | 280 | ||
| 278 | return sprintf(buf, "%d\n", ret); | 281 | return sprintf(buf, "%d\n", ret); |
| 279 | } | 282 | } |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 8d80fceca6a4..296504355142 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -762,6 +762,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
| 762 | { | 762 | { |
| 763 | int res = 0; | 763 | int res = 0; |
| 764 | struct i2c_adapter *found; | 764 | struct i2c_adapter *found; |
| 765 | struct i2c_client *client, *next; | ||
| 765 | 766 | ||
| 766 | /* First make sure that this adapter was ever added */ | 767 | /* First make sure that this adapter was ever added */ |
| 767 | mutex_lock(&core_lock); | 768 | mutex_lock(&core_lock); |
| @@ -781,6 +782,16 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
| 781 | if (res) | 782 | if (res) |
| 782 | return res; | 783 | return res; |
| 783 | 784 | ||
| 785 | /* Remove devices instantiated from sysfs */ | ||
| 786 | list_for_each_entry_safe(client, next, &userspace_devices, detected) { | ||
| 787 | if (client->adapter == adap) { | ||
| 788 | dev_dbg(&adap->dev, "Removing %s at 0x%x\n", | ||
| 789 | client->name, client->addr); | ||
| 790 | list_del(&client->detected); | ||
| 791 | i2c_unregister_device(client); | ||
| 792 | } | ||
| 793 | } | ||
| 794 | |||
| 784 | /* Detach any active clients. This can't fail, thus we do not | 795 | /* Detach any active clients. This can't fail, thus we do not |
| 785 | checking the returned value. */ | 796 | checking the returned value. */ |
| 786 | res = device_for_each_child(&adap->dev, NULL, __unregister_client); | 797 | res = device_for_each_child(&adap->dev, NULL, __unregister_client); |
