i2c/pcf8574: No arbitrary initialization
Do not initialize the PCF8574 with an arbitrary value. Users will have to write the initial value to sysfs themselves. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
committed by
Jean Delvare
parent
95a7f10ead
commit
553515e5c5
@@ -62,8 +62,6 @@ if the corresponding output is set as 1, otherwise the current output
|
|||||||
value, that is to say 0.
|
value, that is to say 0.
|
||||||
|
|
||||||
The write file is read/write. Writing a value outputs it on the I/O
|
The write file is read/write. Writing a value outputs it on the I/O
|
||||||
port. Reading returns the last written value.
|
port. Reading returns the last written value. As it is not possible
|
||||||
|
to read this value from the chip, you need to write at least once to
|
||||||
On module initialization the chip is configured as eight inputs (all
|
this file before you can read back from it.
|
||||||
outputs to 1), so you can connect any circuit to the PCF8574(A) without
|
|
||||||
being afraid of short-circuit.
|
|
||||||
|
@@ -48,14 +48,11 @@ static unsigned short normal_i2c[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
|
|||||||
/* Insmod parameters */
|
/* Insmod parameters */
|
||||||
I2C_CLIENT_INSMOD_2(pcf8574, pcf8574a);
|
I2C_CLIENT_INSMOD_2(pcf8574, pcf8574a);
|
||||||
|
|
||||||
/* Initial values */
|
|
||||||
#define PCF8574_INIT 255 /* All outputs on (input mode) */
|
|
||||||
|
|
||||||
/* Each client has this additional data */
|
/* Each client has this additional data */
|
||||||
struct pcf8574_data {
|
struct pcf8574_data {
|
||||||
struct i2c_client client;
|
struct i2c_client client;
|
||||||
|
|
||||||
u8 write; /* Remember last written value */
|
int write; /* Remember last written value */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int pcf8574_attach_adapter(struct i2c_adapter *adapter);
|
static int pcf8574_attach_adapter(struct i2c_adapter *adapter);
|
||||||
@@ -85,7 +82,11 @@ static DEVICE_ATTR(read, S_IRUGO, show_read, NULL);
|
|||||||
static ssize_t show_write(struct device *dev, struct device_attribute *attr, char *buf)
|
static ssize_t show_write(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
struct pcf8574_data *data = i2c_get_clientdata(to_i2c_client(dev));
|
struct pcf8574_data *data = i2c_get_clientdata(to_i2c_client(dev));
|
||||||
return sprintf(buf, "%u\n", data->write);
|
|
||||||
|
if (data->write < 0)
|
||||||
|
return data->write;
|
||||||
|
|
||||||
|
return sprintf(buf, "%d\n", data->write);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t set_write(struct device *dev, struct device_attribute *attr, const char *buf,
|
static ssize_t set_write(struct device *dev, struct device_attribute *attr, const char *buf,
|
||||||
@@ -206,8 +207,7 @@ static int pcf8574_detach_client(struct i2c_client *client)
|
|||||||
static void pcf8574_init_client(struct i2c_client *client)
|
static void pcf8574_init_client(struct i2c_client *client)
|
||||||
{
|
{
|
||||||
struct pcf8574_data *data = i2c_get_clientdata(client);
|
struct pcf8574_data *data = i2c_get_clientdata(client);
|
||||||
data->write = PCF8574_INIT;
|
data->write = -EAGAIN;
|
||||||
i2c_smbus_write_byte(client, data->write);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init pcf8574_init(void)
|
static int __init pcf8574_init(void)
|
||||||
|
Reference in New Issue
Block a user