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-algo-bit: Add pre- and post-xfer hooks at24: Init dynamic bin_attribute structures i2c: Drop configure option I2C_DEBUG_CHIP tsl2550: Move from i2c/chips to misc i2c-i801: Don't use the block buffer for I2C block writes i2c-powermac: Be less verbose in the absence of real errors. i2c-smbus: Use device_lock/device_unlock
This commit is contained in:
commit
bced863599
13 changed files with 50 additions and 61 deletions
|
@ -73,7 +73,6 @@ config I2C_SMBUS
|
||||||
|
|
||||||
source drivers/i2c/algos/Kconfig
|
source drivers/i2c/algos/Kconfig
|
||||||
source drivers/i2c/busses/Kconfig
|
source drivers/i2c/busses/Kconfig
|
||||||
source drivers/i2c/chips/Kconfig
|
|
||||||
|
|
||||||
config I2C_DEBUG_CORE
|
config I2C_DEBUG_CORE
|
||||||
bool "I2C Core debugging messages"
|
bool "I2C Core debugging messages"
|
||||||
|
@ -98,12 +97,4 @@ config I2C_DEBUG_BUS
|
||||||
a problem with I2C support and want to see more of what is going
|
a problem with I2C support and want to see more of what is going
|
||||||
on.
|
on.
|
||||||
|
|
||||||
config I2C_DEBUG_CHIP
|
|
||||||
bool "I2C Chip debugging messages"
|
|
||||||
help
|
|
||||||
Say Y here if you want the I2C chip drivers to produce a bunch of
|
|
||||||
debug messages to the system log. Select this if you are having
|
|
||||||
a problem with I2C support and want to see more of what is going
|
|
||||||
on.
|
|
||||||
|
|
||||||
endif # I2C
|
endif # I2C
|
||||||
|
|
|
@ -6,7 +6,7 @@ obj-$(CONFIG_I2C_BOARDINFO) += i2c-boardinfo.o
|
||||||
obj-$(CONFIG_I2C) += i2c-core.o
|
obj-$(CONFIG_I2C) += i2c-core.o
|
||||||
obj-$(CONFIG_I2C_SMBUS) += i2c-smbus.o
|
obj-$(CONFIG_I2C_SMBUS) += i2c-smbus.o
|
||||||
obj-$(CONFIG_I2C_CHARDEV) += i2c-dev.o
|
obj-$(CONFIG_I2C_CHARDEV) += i2c-dev.o
|
||||||
obj-y += busses/ chips/ algos/
|
obj-y += algos/ busses/
|
||||||
|
|
||||||
ifeq ($(CONFIG_I2C_DEBUG_CORE),y)
|
ifeq ($(CONFIG_I2C_DEBUG_CORE),y)
|
||||||
EXTRA_CFLAGS += -DDEBUG
|
EXTRA_CFLAGS += -DDEBUG
|
||||||
|
|
|
@ -522,6 +522,12 @@ static int bit_xfer(struct i2c_adapter *i2c_adap,
|
||||||
int i, ret;
|
int i, ret;
|
||||||
unsigned short nak_ok;
|
unsigned short nak_ok;
|
||||||
|
|
||||||
|
if (adap->pre_xfer) {
|
||||||
|
ret = adap->pre_xfer(i2c_adap);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
|
bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
|
||||||
i2c_start(adap);
|
i2c_start(adap);
|
||||||
for (i = 0; i < num; i++) {
|
for (i = 0; i < num; i++) {
|
||||||
|
@ -570,6 +576,9 @@ static int bit_xfer(struct i2c_adapter *i2c_adap,
|
||||||
bailout:
|
bailout:
|
||||||
bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
|
bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
|
||||||
i2c_stop(adap);
|
i2c_stop(adap);
|
||||||
|
|
||||||
|
if (adap->post_xfer)
|
||||||
|
adap->post_xfer(i2c_adap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -416,9 +416,11 @@ static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
|
||||||
data->block[0] = 32; /* max for SMBus block reads */
|
data->block[0] = 32; /* max for SMBus block reads */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Experience has shown that the block buffer can only be used for
|
||||||
|
SMBus (not I2C) block transactions, even though the datasheet
|
||||||
|
doesn't mention this limitation. */
|
||||||
if ((i801_features & FEATURE_BLOCK_BUFFER)
|
if ((i801_features & FEATURE_BLOCK_BUFFER)
|
||||||
&& !(command == I2C_SMBUS_I2C_BLOCK_DATA
|
&& command != I2C_SMBUS_I2C_BLOCK_DATA
|
||||||
&& read_write == I2C_SMBUS_READ)
|
|
||||||
&& i801_set_block_buffer_mode() == 0)
|
&& i801_set_block_buffer_mode() == 0)
|
||||||
result = i801_block_transaction_by_block(data, read_write,
|
result = i801_block_transaction_by_block(data, read_write,
|
||||||
hwpec);
|
hwpec);
|
||||||
|
|
|
@ -122,9 +122,14 @@ static s32 i2c_powermac_smbus_xfer( struct i2c_adapter* adap,
|
||||||
|
|
||||||
rc = pmac_i2c_xfer(bus, addrdir, subsize, subaddr, buf, len);
|
rc = pmac_i2c_xfer(bus, addrdir, subsize, subaddr, buf, len);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
dev_err(&adap->dev,
|
if (rc == -ENXIO)
|
||||||
"I2C transfer at 0x%02x failed, size %d, err %d\n",
|
dev_dbg(&adap->dev,
|
||||||
addrdir >> 1, size, rc);
|
"I2C transfer at 0x%02x failed, size %d, "
|
||||||
|
"err %d\n", addrdir >> 1, size, rc);
|
||||||
|
else
|
||||||
|
dev_err(&adap->dev,
|
||||||
|
"I2C transfer at 0x%02x failed, size %d, "
|
||||||
|
"err %d\n", addrdir >> 1, size, rc);
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,10 +180,16 @@ static int i2c_powermac_master_xfer( struct i2c_adapter *adap,
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len);
|
rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len);
|
||||||
if (rc < 0)
|
if (rc < 0) {
|
||||||
dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n",
|
if (rc == -ENXIO)
|
||||||
addrdir & 1 ? "read from" : "write to", addrdir >> 1,
|
dev_dbg(&adap->dev, "I2C %s 0x%02x failed, err %d\n",
|
||||||
rc);
|
addrdir & 1 ? "read from" : "write to",
|
||||||
|
addrdir >> 1, rc);
|
||||||
|
else
|
||||||
|
dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n",
|
||||||
|
addrdir & 1 ? "read from" : "write to",
|
||||||
|
addrdir >> 1, rc);
|
||||||
|
}
|
||||||
bail:
|
bail:
|
||||||
pmac_i2c_close(bus);
|
pmac_i2c_close(bus);
|
||||||
return rc < 0 ? rc : 1;
|
return rc < 0 ? rc : 1;
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
#
|
|
||||||
# Miscellaneous I2C chip drivers configuration
|
|
||||||
#
|
|
||||||
# *** DEPRECATED! Do not add new entries! See Makefile ***
|
|
||||||
#
|
|
||||||
|
|
||||||
menu "Miscellaneous I2C Chip support"
|
|
||||||
|
|
||||||
config SENSORS_TSL2550
|
|
||||||
tristate "Taos TSL2550 ambient light sensor"
|
|
||||||
depends on EXPERIMENTAL
|
|
||||||
help
|
|
||||||
If you say yes here you get support for the Taos TSL2550
|
|
||||||
ambient light sensor.
|
|
||||||
|
|
||||||
This driver can also be built as a module. If so, the module
|
|
||||||
will be called tsl2550.
|
|
||||||
|
|
||||||
endmenu
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# Makefile for miscellaneous I2C chip drivers.
|
|
||||||
#
|
|
||||||
# Do not add new drivers to this directory! It is DEPRECATED.
|
|
||||||
#
|
|
||||||
# Device drivers are better grouped according to the functionality they
|
|
||||||
# implement rather than to the bus they are connected to. In particular:
|
|
||||||
# * Hardware monitoring chip drivers go to drivers/hwmon
|
|
||||||
# * RTC chip drivers go to drivers/rtc
|
|
||||||
# * I/O expander drivers go to drivers/gpio
|
|
||||||
#
|
|
||||||
|
|
||||||
obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
|
|
||||||
EXTRA_CFLAGS += -DDEBUG
|
|
||||||
endif
|
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/semaphore.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
|
@ -55,7 +54,7 @@ static int smbus_do_alert(struct device *dev, void *addrp)
|
||||||
* Drivers should either disable alerts, or provide at least
|
* Drivers should either disable alerts, or provide at least
|
||||||
* a minimal handler. Lock so client->driver won't change.
|
* a minimal handler. Lock so client->driver won't change.
|
||||||
*/
|
*/
|
||||||
down(&dev->sem);
|
device_lock(dev);
|
||||||
if (client->driver) {
|
if (client->driver) {
|
||||||
if (client->driver->alert)
|
if (client->driver->alert)
|
||||||
client->driver->alert(client, data->flag);
|
client->driver->alert(client, data->flag);
|
||||||
|
@ -63,7 +62,7 @@ static int smbus_do_alert(struct device *dev, void *addrp)
|
||||||
dev_warn(&client->dev, "no driver alert()!\n");
|
dev_warn(&client->dev, "no driver alert()!\n");
|
||||||
} else
|
} else
|
||||||
dev_dbg(&client->dev, "alert with no driver\n");
|
dev_dbg(&client->dev, "alert with no driver\n");
|
||||||
up(&dev->sem);
|
device_unlock(dev);
|
||||||
|
|
||||||
/* Stop iterating after we find the device */
|
/* Stop iterating after we find the device */
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
|
@ -268,6 +268,16 @@ config ISL29003
|
||||||
This driver can also be built as a module. If so, the module
|
This driver can also be built as a module. If so, the module
|
||||||
will be called isl29003.
|
will be called isl29003.
|
||||||
|
|
||||||
|
config SENSORS_TSL2550
|
||||||
|
tristate "Taos TSL2550 ambient light sensor"
|
||||||
|
depends on I2C && SYSFS
|
||||||
|
help
|
||||||
|
If you say yes here you get support for the Taos TSL2550
|
||||||
|
ambient light sensor.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called tsl2550.
|
||||||
|
|
||||||
config EP93XX_PWM
|
config EP93XX_PWM
|
||||||
tristate "EP93xx PWM support"
|
tristate "EP93xx PWM support"
|
||||||
depends on ARCH_EP93XX
|
depends on ARCH_EP93XX
|
||||||
|
|
|
@ -21,6 +21,7 @@ obj-$(CONFIG_SGI_GRU) += sgi-gru/
|
||||||
obj-$(CONFIG_CS5535_MFGPT) += cs5535-mfgpt.o
|
obj-$(CONFIG_CS5535_MFGPT) += cs5535-mfgpt.o
|
||||||
obj-$(CONFIG_HP_ILO) += hpilo.o
|
obj-$(CONFIG_HP_ILO) += hpilo.o
|
||||||
obj-$(CONFIG_ISL29003) += isl29003.o
|
obj-$(CONFIG_ISL29003) += isl29003.o
|
||||||
|
obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o
|
||||||
obj-$(CONFIG_EP93XX_PWM) += ep93xx_pwm.o
|
obj-$(CONFIG_EP93XX_PWM) += ep93xx_pwm.o
|
||||||
obj-$(CONFIG_DS1682) += ds1682.o
|
obj-$(CONFIG_DS1682) += ds1682.o
|
||||||
obj-$(CONFIG_TI_DAC7512) += ti_dac7512.o
|
obj-$(CONFIG_TI_DAC7512) += ti_dac7512.o
|
||||||
|
|
|
@ -505,6 +505,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||||
* Export the EEPROM bytes through sysfs, since that's convenient.
|
* Export the EEPROM bytes through sysfs, since that's convenient.
|
||||||
* By default, only root should see the data (maybe passwords etc)
|
* By default, only root should see the data (maybe passwords etc)
|
||||||
*/
|
*/
|
||||||
|
sysfs_bin_attr_init(&at24->bin);
|
||||||
at24->bin.attr.name = "eeprom";
|
at24->bin.attr.name = "eeprom";
|
||||||
at24->bin.attr.mode = chip.flags & AT24_FLAG_IRUGO ? S_IRUGO : S_IRUSR;
|
at24->bin.attr.mode = chip.flags & AT24_FLAG_IRUGO ? S_IRUGO : S_IRUSR;
|
||||||
at24->bin.read = at24_bin_read;
|
at24->bin.read = at24_bin_read;
|
||||||
|
|
|
@ -47,8 +47,8 @@ struct tsl2550_data {
|
||||||
struct i2c_client *client;
|
struct i2c_client *client;
|
||||||
struct mutex update_lock;
|
struct mutex update_lock;
|
||||||
|
|
||||||
unsigned int power_state : 1;
|
unsigned int power_state:1;
|
||||||
unsigned int operating_mode : 1;
|
unsigned int operating_mode:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
|
@ -36,6 +36,8 @@ struct i2c_algo_bit_data {
|
||||||
void (*setscl) (void *data, int state);
|
void (*setscl) (void *data, int state);
|
||||||
int (*getsda) (void *data);
|
int (*getsda) (void *data);
|
||||||
int (*getscl) (void *data);
|
int (*getscl) (void *data);
|
||||||
|
int (*pre_xfer) (struct i2c_adapter *);
|
||||||
|
void (*post_xfer) (struct i2c_adapter *);
|
||||||
|
|
||||||
/* local settings */
|
/* local settings */
|
||||||
int udelay; /* half clock cycle time in us,
|
int udelay; /* half clock cycle time in us,
|
||||||
|
|
Loading…
Reference in a new issue