aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/i2c/chips/pcf857465
-rw-r--r--drivers/i2c/chips/Kconfig17
-rw-r--r--drivers/i2c/chips/Makefile1
-rw-r--r--drivers/i2c/chips/pcf8574.c215
4 files changed, 0 insertions, 298 deletions
diff --git a/Documentation/i2c/chips/pcf8574 b/Documentation/i2c/chips/pcf8574
deleted file mode 100644
index 235815c075ff..000000000000
--- a/Documentation/i2c/chips/pcf8574
+++ /dev/null
@@ -1,65 +0,0 @@
1Kernel driver pcf8574
2=====================
3
4Supported chips:
5 * Philips PCF8574
6 Prefix: 'pcf8574'
7 Addresses scanned: none
8 Datasheet: Publicly available at the Philips Semiconductors website
9 http://www.semiconductors.philips.com/pip/PCF8574P.html
10
11 * Philips PCF8574A
12 Prefix: 'pcf8574a'
13 Addresses scanned: none
14 Datasheet: Publicly available at the Philips Semiconductors website
15 http://www.semiconductors.philips.com/pip/PCF8574P.html
16
17Authors:
18 Frodo Looijaard <frodol@dds.nl>,
19 Philip Edelbrock <phil@netroedge.com>,
20 Dan Eaton <dan.eaton@rocketlogix.com>,
21 Aurelien Jarno <aurelien@aurel32.net>,
22 Jean Delvare <khali@linux-fr.org>,
23
24
25Description
26-----------
27The PCF8574(A) is an 8-bit I/O expander for the I2C bus produced by Philips
28Semiconductors. It is designed to provide a byte I2C interface to up to 16
29separate devices (8 x PCF8574 and 8 x PCF8574A).
30
31This device consists of a quasi-bidirectional port. Each of the eight I/Os
32can be independently used as an input or output. To setup an I/O as an
33input, you have to write a 1 to the corresponding output.
34
35For more informations see the datasheet.
36
37
38Accessing PCF8574(A) via /sys interface
39-------------------------------------
40
41The PCF8574(A) is plainly impossible to detect ! Stupid chip.
42So, you have to pass the I2C bus and address of the installed PCF857A
43and PCF8574A devices explicitly to the driver at load time via the
44force=... parameter.
45
46On detection (i.e. insmod, modprobe et al.), directories are being
47created for each detected PCF8574(A):
48
49/sys/bus/i2c/devices/<0>-<1>/
50where <0> is the bus the chip was detected on (e. g. i2c-0)
51and <1> the chip address ([20..27] or [38..3f]):
52
53(example: /sys/bus/i2c/devices/1-0020/)
54
55Inside these directories, there are two files each:
56read and write (and one file with chip name).
57
58The read file is read-only. Reading gives you the current I/O input
59if the corresponding output is set as 1, otherwise the current output
60value, that is to say 0.
61
62The write file is read/write. Writing a value outputs it on the I/O
63port. Reading returns the last written value. As it is not possible
64to read this value from the chip, you need to write at least once to
65this file before you can read back from it.
diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig
index 8cd1a7f3dcbe..f9618f4d4e47 100644
--- a/drivers/i2c/chips/Kconfig
+++ b/drivers/i2c/chips/Kconfig
@@ -16,23 +16,6 @@ config DS1682
16 This driver can also be built as a module. If so, the module 16 This driver can also be built as a module. If so, the module
17 will be called ds1682. 17 will be called ds1682.
18 18
19config SENSORS_PCF8574
20 tristate "Philips PCF8574 and PCF8574A (DEPRECATED)"
21 depends on EXPERIMENTAL && GPIO_PCF857X = "n"
22 default n
23 help
24 If you say yes here you get support for Philips PCF8574 and
25 PCF8574A chips. These chips are 8-bit I/O expanders for the I2C bus.
26
27 This driver can also be built as a module. If so, the module
28 will be called pcf8574.
29
30 This driver is deprecated and will be dropped soon. Use
31 drivers/gpio/pcf857x.c instead.
32
33 These devices are hard to detect and rarely found on mainstream
34 hardware. If unsure, say N.
35
36config SENSORS_TSL2550 19config SENSORS_TSL2550
37 tristate "Taos TSL2550 ambient light sensor" 20 tristate "Taos TSL2550 ambient light sensor"
38 depends on EXPERIMENTAL 21 depends on EXPERIMENTAL
diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile
index 8cd778dd64e5..749cf3606294 100644
--- a/drivers/i2c/chips/Makefile
+++ b/drivers/i2c/chips/Makefile
@@ -11,7 +11,6 @@
11# 11#
12 12
13obj-$(CONFIG_DS1682) += ds1682.o 13obj-$(CONFIG_DS1682) += ds1682.o
14obj-$(CONFIG_SENSORS_PCF8574) += pcf8574.o
15obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o 14obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o
16 15
17ifeq ($(CONFIG_I2C_DEBUG_CHIP),y) 16ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
diff --git a/drivers/i2c/chips/pcf8574.c b/drivers/i2c/chips/pcf8574.c
deleted file mode 100644
index 6ec309894c88..000000000000
--- a/drivers/i2c/chips/pcf8574.c
+++ /dev/null
@@ -1,215 +0,0 @@
1/*
2 Copyright (c) 2000 Frodo Looijaard <frodol@dds.nl>,
3 Philip Edelbrock <phil@netroedge.com>,
4 Dan Eaton <dan.eaton@rocketlogix.com>
5 Ported to Linux 2.6 by Aurelien Jarno <aurel32@debian.org> with
6 the help of Jean Delvare <khali@linux-fr.org>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21*/
22
23/* A few notes about the PCF8574:
24
25* The PCF8574 is an 8-bit I/O expander for the I2C bus produced by
26 Philips Semiconductors. It is designed to provide a byte I2C
27 interface to up to 8 separate devices.
28
29* The PCF8574 appears as a very simple SMBus device which can be
30 read from or written to with SMBUS byte read/write accesses.
31
32 --Dan
33
34*/
35
36#include <linux/module.h>
37#include <linux/init.h>
38#include <linux/slab.h>
39#include <linux/i2c.h>
40
41/* Addresses to scan: none, device can't be detected */
42static const unsigned short normal_i2c[] = { I2C_CLIENT_END };
43
44/* Insmod parameters */
45I2C_CLIENT_INSMOD_2(pcf8574, pcf8574a);
46
47/* Each client has this additional data */
48struct pcf8574_data {
49 int write; /* Remember last written value */
50};
51
52static void pcf8574_init_client(struct i2c_client *client);
53
54/* following are the sysfs callback functions */
55static ssize_t show_read(struct device *dev, struct device_attribute *attr, char *buf)
56{
57 struct i2c_client *client = to_i2c_client(dev);
58 return sprintf(buf, "%u\n", i2c_smbus_read_byte(client));
59}
60
61static DEVICE_ATTR(read, S_IRUGO, show_read, NULL);
62
63static ssize_t show_write(struct device *dev, struct device_attribute *attr, char *buf)
64{
65 struct pcf8574_data *data = i2c_get_clientdata(to_i2c_client(dev));
66
67 if (data->write < 0)
68 return data->write;
69
70 return sprintf(buf, "%d\n", data->write);
71}
72
73static ssize_t set_write(struct device *dev, struct device_attribute *attr, const char *buf,
74 size_t count)
75{
76 struct i2c_client *client = to_i2c_client(dev);
77 struct pcf8574_data *data = i2c_get_clientdata(client);
78 unsigned long val = simple_strtoul(buf, NULL, 10);
79
80 if (val > 0xff)
81 return -EINVAL;
82
83 data->write = val;
84 i2c_smbus_write_byte(client, data->write);
85 return count;
86}
87
88static DEVICE_ATTR(write, S_IWUSR | S_IRUGO, show_write, set_write);
89
90static struct attribute *pcf8574_attributes[] = {
91 &dev_attr_read.attr,
92 &dev_attr_write.attr,
93 NULL
94};
95
96static const struct attribute_group pcf8574_attr_group = {
97 .attrs = pcf8574_attributes,
98};
99
100/*
101 * Real code
102 */
103
104/* Return 0 if detection is successful, -ENODEV otherwise */
105static int pcf8574_detect(struct i2c_client *client, int kind,
106 struct i2c_board_info *info)
107{
108 struct i2c_adapter *adapter = client->adapter;
109 const char *client_name;
110
111 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE))
112 return -ENODEV;
113
114 /* Now, we would do the remaining detection. But the PCF8574 is plainly
115 impossible to detect! Stupid chip. */
116
117 /* Determine the chip type */
118 if (kind <= 0) {
119 if (client->addr >= 0x38 && client->addr <= 0x3f)
120 kind = pcf8574a;
121 else
122 kind = pcf8574;
123 }
124
125 if (kind == pcf8574a)
126 client_name = "pcf8574a";
127 else
128 client_name = "pcf8574";
129 strlcpy(info->type, client_name, I2C_NAME_SIZE);
130
131 return 0;
132}
133
134static int pcf8574_probe(struct i2c_client *client,
135 const struct i2c_device_id *id)
136{
137 struct pcf8574_data *data;
138 int err;
139
140 data = kzalloc(sizeof(struct pcf8574_data), GFP_KERNEL);
141 if (!data) {
142 err = -ENOMEM;
143 goto exit;
144 }
145
146 i2c_set_clientdata(client, data);
147
148 /* Initialize the PCF8574 chip */
149 pcf8574_init_client(client);
150
151 /* Register sysfs hooks */
152 err = sysfs_create_group(&client->dev.kobj, &pcf8574_attr_group);
153 if (err)
154 goto exit_free;
155 return 0;
156
157 exit_free:
158 kfree(data);
159 exit:
160 return err;
161}
162
163static int pcf8574_remove(struct i2c_client *client)
164{
165 sysfs_remove_group(&client->dev.kobj, &pcf8574_attr_group);
166 kfree(i2c_get_clientdata(client));
167 return 0;
168}
169
170/* Called when we have found a new PCF8574. */
171static void pcf8574_init_client(struct i2c_client *client)
172{
173 struct pcf8574_data *data = i2c_get_clientdata(client);
174 data->write = -EAGAIN;
175}
176
177static const struct i2c_device_id pcf8574_id[] = {
178 { "pcf8574", 0 },
179 { "pcf8574a", 0 },
180 { }
181};
182
183static struct i2c_driver pcf8574_driver = {
184 .driver = {
185 .name = "pcf8574",
186 },
187 .probe = pcf8574_probe,
188 .remove = pcf8574_remove,
189 .id_table = pcf8574_id,
190
191 .detect = pcf8574_detect,
192 .address_data = &addr_data,
193};
194
195static int __init pcf8574_init(void)
196{
197 return i2c_add_driver(&pcf8574_driver);
198}
199
200static void __exit pcf8574_exit(void)
201{
202 i2c_del_driver(&pcf8574_driver);
203}
204
205
206MODULE_AUTHOR
207 ("Frodo Looijaard <frodol@dds.nl>, "
208 "Philip Edelbrock <phil@netroedge.com>, "
209 "Dan Eaton <dan.eaton@rocketlogix.com> "
210 "and Aurelien Jarno <aurelien@aurel32.net>");
211MODULE_DESCRIPTION("PCF8574 driver");
212MODULE_LICENSE("GPL");
213
214module_init(pcf8574_init);
215module_exit(pcf8574_exit);