diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-23 09:30:48 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-23 09:30:48 -0700 |
commit | 40aba218969914d1b225e742617adb921cf94eae (patch) | |
tree | 663ec9cdadbedec5f8eab754cbc590298c1d40be /drivers/i2c/chips/tsl2550.c | |
parent | b64ada6b23d4a305fb3ca59b79dd38707fc53b69 (diff) | |
parent | cfd550ed3d3bd509b475c7a9d425fc63bf843a7c (diff) |
Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging
* 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
i2c: Clearly mark ACPI drivers as such
i2c: Add driver for SMBus Control Method Interface
i2c-pnx: Correct use of request_region/request_mem_region
MAINTAINERS: Add maintainer for AT24 and PCA9564/PCA9665
i2c-piix4: Add AMD SB900 SMBus device ID
i2c/chips: Remove deprecated pcf8574 driver
i2c/chips: Remove deprecated pca9539 driver
i2c/chips: Remove deprecated pcf8575 driver
gpio/pcf857x: Copy i2c_device_id from old pcf8574 driver
i2c/scx200_acb: Provide more information on bus errors
i2c: Provide compatibility links for i2c adapters
i2c: Convert i2c adapters to bus devices
i2c: Convert i2c clients to a device type
i2c/tsl2550: Use combined SMBus transactions
i2c-taos-evm: Switch echo off to improve performance
i2c: Drop unused i2c_driver.id field
Diffstat (limited to 'drivers/i2c/chips/tsl2550.c')
-rw-r--r-- | drivers/i2c/chips/tsl2550.c | 42 |
1 files changed, 10 insertions, 32 deletions
diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c index b96f3025e58..aa96bd2d27e 100644 --- a/drivers/i2c/chips/tsl2550.c +++ b/drivers/i2c/chips/tsl2550.c @@ -24,10 +24,9 @@ #include <linux/slab.h> #include <linux/i2c.h> #include <linux/mutex.h> -#include <linux/delay.h> #define TSL2550_DRV_NAME "tsl2550" -#define DRIVER_VERSION "1.1.2" +#define DRIVER_VERSION "1.2" /* * Defines @@ -96,32 +95,13 @@ static int tsl2550_set_power_state(struct i2c_client *client, int state) static int tsl2550_get_adc_value(struct i2c_client *client, u8 cmd) { - unsigned long end; - int loop = 0, ret = 0; + int ret; - /* - * Read ADC channel waiting at most 400ms (see data sheet for further - * info). - * To avoid long busy wait we spin for few milliseconds then - * start sleeping. - */ - end = jiffies + msecs_to_jiffies(400); - while (time_before(jiffies, end)) { - i2c_smbus_write_byte(client, cmd); - - if (loop++ < 5) - mdelay(1); - else - msleep(1); - - ret = i2c_smbus_read_byte(client); - if (ret < 0) - return ret; - else if (ret & 0x0080) - break; - } + ret = i2c_smbus_read_byte_data(client, cmd); + if (ret < 0) + return ret; if (!(ret & 0x80)) - return -EIO; + return -EAGAIN; return ret & 0x7f; /* remove the "valid" bit */ } @@ -285,8 +265,6 @@ static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf) return ret; ch0 = ret; - mdelay(1); - ret = tsl2550_get_adc_value(client, TSL2550_READ_ADC1); if (ret < 0) return ret; @@ -345,11 +323,10 @@ static int tsl2550_init_client(struct i2c_client *client) * Probe the chip. To do so we try to power up the device and then to * read back the 0x03 code */ - err = i2c_smbus_write_byte(client, TSL2550_POWER_UP); + err = i2c_smbus_read_byte_data(client, TSL2550_POWER_UP); if (err < 0) return err; - mdelay(1); - if (i2c_smbus_read_byte(client) != TSL2550_POWER_UP) + if (err != TSL2550_POWER_UP) return -ENODEV; data->power_state = 1; @@ -374,7 +351,8 @@ static int __devinit tsl2550_probe(struct i2c_client *client, struct tsl2550_data *data; int *opmode, err = 0; - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE)) { + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE + | I2C_FUNC_SMBUS_READ_BYTE_DATA)) { err = -EIO; goto exit; } |