Commit 553515e5 authored by Jean Delvare's avatar Jean Delvare Committed by Jean Delvare

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: default avatarJean Delvare <khali@linux-fr.org>
Acked-by: default avatarAurelien Jarno <aurelien@aurel32.net>
parent 95a7f10e
...@@ -62,8 +62,6 @@ if the corresponding output is set as 1, otherwise the current output ...@@ -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, ...@@ -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); ...@@ -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) ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment