linux/drivers/gpio/gpio-pcf857x.c
<<
>>
Prefs
   1/*
   2 * Driver for pcf857x, pca857x, and pca967x I2C GPIO expanders
   3 *
   4 * Copyright (C) 2007 David Brownell
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19 */
  20
  21#include <linux/kernel.h>
  22#include <linux/slab.h>
  23#include <linux/gpio.h>
  24#include <linux/i2c.h>
  25#include <linux/i2c/pcf857x.h>
  26#include <linux/module.h>
  27
  28
  29static const struct i2c_device_id pcf857x_id[] = {
  30        { "pcf8574", 8 },
  31        { "pcf8574a", 8 },
  32        { "pca8574", 8 },
  33        { "pca9670", 8 },
  34        { "pca9672", 8 },
  35        { "pca9674", 8 },
  36        { "pcf8575", 16 },
  37        { "pca8575", 16 },
  38        { "pca9671", 16 },
  39        { "pca9673", 16 },
  40        { "pca9675", 16 },
  41        { "max7328", 8 },
  42        { "max7329", 8 },
  43        { }
  44};
  45MODULE_DEVICE_TABLE(i2c, pcf857x_id);
  46
  47/*
  48 * The pcf857x, pca857x, and pca967x chips only expose one read and one
  49 * write register.  Writing a "one" bit (to match the reset state) lets
  50 * that pin be used as an input; it's not an open-drain model, but acts
  51 * a bit like one.  This is described as "quasi-bidirectional"; read the
  52 * chip documentation for details.
  53 *
  54 * Many other I2C GPIO expander chips (like the pca953x models) have
  55 * more complex register models and more conventional circuitry using
  56 * push/pull drivers.  They often use the same 0x20..0x27 addresses as
  57 * pcf857x parts, making the "legacy" I2C driver model problematic.
  58 */
  59struct pcf857x {
  60        struct gpio_chip        chip;
  61        struct i2c_client       *client;
  62        struct mutex            lock;           /* protect 'out' */
  63        unsigned                out;            /* software latch */
  64
  65        int (*write)(struct i2c_client *client, unsigned data);
  66        int (*read)(struct i2c_client *client);
  67};
  68
  69/*-------------------------------------------------------------------------*/
  70
  71/* Talk to 8-bit I/O expander */
  72
  73static int i2c_write_le8(struct i2c_client *client, unsigned data)
  74{
  75        return i2c_smbus_write_byte(client, data);
  76}
  77
  78static int i2c_read_le8(struct i2c_client *client)
  79{
  80        return (int)i2c_smbus_read_byte(client);
  81}
  82
  83/* Talk to 16-bit I/O expander */
  84
  85static int i2c_write_le16(struct i2c_client *client, unsigned word)
  86{
  87        u8 buf[2] = { word & 0xff, word >> 8, };
  88        int status;
  89
  90        status = i2c_master_send(client, buf, 2);
  91        return (status < 0) ? status : 0;
  92}
  93
  94static int i2c_read_le16(struct i2c_client *client)
  95{
  96        u8 buf[2];
  97        int status;
  98
  99        status = i2c_master_recv(client, buf, 2);
 100        if (status < 0)
 101                return status;
 102        return (buf[1] << 8) | buf[0];
 103}
 104
 105/*-------------------------------------------------------------------------*/
 106
 107static int pcf857x_input(struct gpio_chip *chip, unsigned offset)
 108{
 109        struct pcf857x  *gpio = container_of(chip, struct pcf857x, chip);
 110        int             status;
 111
 112        mutex_lock(&gpio->lock);
 113        gpio->out |= (1 << offset);
 114        status = gpio->write(gpio->client, gpio->out);
 115        mutex_unlock(&gpio->lock);
 116
 117        return status;
 118}
 119
 120static int pcf857x_get(struct gpio_chip *chip, unsigned offset)
 121{
 122        struct pcf857x  *gpio = container_of(chip, struct pcf857x, chip);
 123        int             value;
 124
 125        value = gpio->read(gpio->client);
 126        return (value < 0) ? 0 : (value & (1 << offset));
 127}
 128
 129static int pcf857x_output(struct gpio_chip *chip, unsigned offset, int value)
 130{
 131        struct pcf857x  *gpio = container_of(chip, struct pcf857x, chip);
 132        unsigned        bit = 1 << offset;
 133        int             status;
 134
 135        mutex_lock(&gpio->lock);
 136        if (value)
 137                gpio->out |= bit;
 138        else
 139                gpio->out &= ~bit;
 140        status = gpio->write(gpio->client, gpio->out);
 141        mutex_unlock(&gpio->lock);
 142
 143        return status;
 144}
 145
 146static void pcf857x_set(struct gpio_chip *chip, unsigned offset, int value)
 147{
 148        pcf857x_output(chip, offset, value);
 149}
 150
 151/*-------------------------------------------------------------------------*/
 152
 153static int pcf857x_probe(struct i2c_client *client,
 154                         const struct i2c_device_id *id)
 155{
 156        struct pcf857x_platform_data    *pdata;
 157        struct pcf857x                  *gpio;
 158        int                             status;
 159
 160        pdata = client->dev.platform_data;
 161        if (!pdata) {
 162                dev_dbg(&client->dev, "no platform data\n");
 163        }
 164
 165        /* Allocate, initialize, and register this gpio_chip. */
 166        gpio = kzalloc(sizeof *gpio, GFP_KERNEL);
 167        if (!gpio)
 168                return -ENOMEM;
 169
 170        mutex_init(&gpio->lock);
 171
 172        gpio->chip.base                 = pdata ? pdata->gpio_base : -1;
 173        gpio->chip.can_sleep            = 1;
 174        gpio->chip.dev                  = &client->dev;
 175        gpio->chip.owner                = THIS_MODULE;
 176        gpio->chip.get                  = pcf857x_get;
 177        gpio->chip.set                  = pcf857x_set;
 178        gpio->chip.direction_input      = pcf857x_input;
 179        gpio->chip.direction_output     = pcf857x_output;
 180        gpio->chip.ngpio                = id->driver_data;
 181
 182        /* NOTE:  the OnSemi jlc1562b is also largely compatible with
 183         * these parts, notably for output.  It has a low-resolution
 184         * DAC instead of pin change IRQs; and its inputs can be the
 185         * result of comparators.
 186         */
 187
 188        /* 8574 addresses are 0x20..0x27; 8574a uses 0x38..0x3f;
 189         * 9670, 9672, 9764, and 9764a use quite a variety.
 190         *
 191         * NOTE: we don't distinguish here between *4 and *4a parts.
 192         */
 193        if (gpio->chip.ngpio == 8) {
 194                gpio->write     = i2c_write_le8;
 195                gpio->read      = i2c_read_le8;
 196
 197                if (!i2c_check_functionality(client->adapter,
 198                                I2C_FUNC_SMBUS_BYTE))
 199                        status = -EIO;
 200
 201                /* fail if there's no chip present */
 202                else
 203                        status = i2c_smbus_read_byte(client);
 204
 205        /* '75/'75c addresses are 0x20..0x27, just like the '74;
 206         * the '75c doesn't have a current source pulling high.
 207         * 9671, 9673, and 9765 use quite a variety of addresses.
 208         *
 209         * NOTE: we don't distinguish here between '75 and '75c parts.
 210         */
 211        } else if (gpio->chip.ngpio == 16) {
 212                gpio->write     = i2c_write_le16;
 213                gpio->read      = i2c_read_le16;
 214
 215                if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
 216                        status = -EIO;
 217
 218                /* fail if there's no chip present */
 219                else
 220                        status = i2c_read_le16(client);
 221
 222        } else {
 223                dev_dbg(&client->dev, "unsupported number of gpios\n");
 224                status = -EINVAL;
 225        }
 226
 227        if (status < 0)
 228                goto fail;
 229
 230        gpio->chip.label = client->name;
 231
 232        gpio->client = client;
 233        i2c_set_clientdata(client, gpio);
 234
 235        /* NOTE:  these chips have strange "quasi-bidirectional" I/O pins.
 236         * We can't actually know whether a pin is configured (a) as output
 237         * and driving the signal low, or (b) as input and reporting a low
 238         * value ... without knowing the last value written since the chip
 239         * came out of reset (if any).  We can't read the latched output.
 240         *
 241         * In short, the only reliable solution for setting up pin direction
 242         * is to do it explicitly.  The setup() method can do that, but it
 243         * may cause transient glitching since it can't know the last value
 244         * written (some pins may need to be driven low).
 245         *
 246         * Using pdata->n_latch avoids that trouble.  When left initialized
 247         * to zero, our software copy of the "latch" then matches the chip's
 248         * all-ones reset state.  Otherwise it flags pins to be driven low.
 249         */
 250        gpio->out = pdata ? ~pdata->n_latch : ~0;
 251
 252        status = gpiochip_add(&gpio->chip);
 253        if (status < 0)
 254                goto fail;
 255
 256        /* NOTE: these chips can issue "some pin-changed" IRQs, which we
 257         * don't yet even try to use.  Among other issues, the relevant
 258         * genirq state isn't available to modular drivers; and most irq
 259         * methods can't be called from sleeping contexts.
 260         */
 261
 262        dev_info(&client->dev, "%s\n",
 263                        client->irq ? " (irq ignored)" : "");
 264
 265        /* Let platform code set up the GPIOs and their users.
 266         * Now is the first time anyone could use them.
 267         */
 268        if (pdata && pdata->setup) {
 269                status = pdata->setup(client,
 270                                gpio->chip.base, gpio->chip.ngpio,
 271                                pdata->context);
 272                if (status < 0)
 273                        dev_warn(&client->dev, "setup --> %d\n", status);
 274        }
 275
 276        return 0;
 277
 278fail:
 279        dev_dbg(&client->dev, "probe error %d for '%s'\n",
 280                        status, client->name);
 281        kfree(gpio);
 282        return status;
 283}
 284
 285static int pcf857x_remove(struct i2c_client *client)
 286{
 287        struct pcf857x_platform_data    *pdata = client->dev.platform_data;
 288        struct pcf857x                  *gpio = i2c_get_clientdata(client);
 289        int                             status = 0;
 290
 291        if (pdata && pdata->teardown) {
 292                status = pdata->teardown(client,
 293                                gpio->chip.base, gpio->chip.ngpio,
 294                                pdata->context);
 295                if (status < 0) {
 296                        dev_err(&client->dev, "%s --> %d\n",
 297                                        "teardown", status);
 298                        return status;
 299                }
 300        }
 301
 302        status = gpiochip_remove(&gpio->chip);
 303        if (status == 0)
 304                kfree(gpio);
 305        else
 306                dev_err(&client->dev, "%s --> %d\n", "remove", status);
 307        return status;
 308}
 309
 310static struct i2c_driver pcf857x_driver = {
 311        .driver = {
 312                .name   = "pcf857x",
 313                .owner  = THIS_MODULE,
 314        },
 315        .probe  = pcf857x_probe,
 316        .remove = pcf857x_remove,
 317        .id_table = pcf857x_id,
 318};
 319
 320static int __init pcf857x_init(void)
 321{
 322        return i2c_add_driver(&pcf857x_driver);
 323}
 324/* register after i2c postcore initcall and before
 325 * subsys initcalls that may rely on these GPIOs
 326 */
 327subsys_initcall(pcf857x_init);
 328
 329static void __exit pcf857x_exit(void)
 330{
 331        i2c_del_driver(&pcf857x_driver);
 332}
 333module_exit(pcf857x_exit);
 334
 335MODULE_LICENSE("GPL");
 336MODULE_AUTHOR("David Brownell");
 337
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.