linux/drivers/i2c/muxes/i2c-mux-pca954x.c
<<
>>
Prefs
   1/*
   2 * I2C multiplexer
   3 *
   4 * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it>
   5 * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it>
   6 *
   7 * This module supports the PCA954x series of I2C multiplexer/switch chips
   8 * made by Philips Semiconductors.
   9 * This includes the:
  10 *       PCA9540, PCA9542, PCA9543, PCA9544, PCA9545, PCA9546, PCA9547
  11 *       and PCA9548.
  12 *
  13 * These chips are all controlled via the I2C bus itself, and all have a
  14 * single 8-bit register. The upstream "parent" bus fans out to two,
  15 * four, or eight downstream busses or channels; which of these
  16 * are selected is determined by the chip type and register contents. A
  17 * mux can select only one sub-bus at a time; a switch can select any
  18 * combination simultaneously.
  19 *
  20 * Based on:
  21 *      pca954x.c from Kumar Gala <galak@kernel.crashing.org>
  22 * Copyright (C) 2006
  23 *
  24 * Based on:
  25 *      pca954x.c from Ken Harrenstien
  26 * Copyright (C) 2004 Google, Inc. (Ken Harrenstien)
  27 *
  28 * Based on:
  29 *      i2c-virtual_cb.c from Brian Kuschak <bkuschak@yahoo.com>
  30 * and
  31 *      pca9540.c from Jean Delvare <jdelvare@suse.de>.
  32 *
  33 * This file is licensed under the terms of the GNU General Public
  34 * License version 2. This program is licensed "as is" without any
  35 * warranty of any kind, whether express or implied.
  36 */
  37
  38#include <linux/device.h>
  39#include <linux/gpio/consumer.h>
  40#include <linux/i2c.h>
  41#include <linux/i2c-mux.h>
  42#include <linux/i2c/pca954x.h>
  43#include <linux/module.h>
  44#include <linux/of.h>
  45#include <linux/pm.h>
  46#include <linux/slab.h>
  47
  48#define PCA954X_MAX_NCHANS 8
  49
  50enum pca_type {
  51        pca_9540,
  52        pca_9542,
  53        pca_9543,
  54        pca_9544,
  55        pca_9545,
  56        pca_9546,
  57        pca_9547,
  58        pca_9548,
  59};
  60
  61struct pca954x {
  62        enum pca_type type;
  63
  64        u8 last_chan;           /* last register value */
  65        u8 deselect;
  66        struct i2c_client *client;
  67};
  68
  69struct chip_desc {
  70        u8 nchans;
  71        u8 enable;      /* used for muxes only */
  72        enum muxtype {
  73                pca954x_ismux = 0,
  74                pca954x_isswi
  75        } muxtype;
  76};
  77
  78/* Provide specs for the PCA954x types we know about */
  79static const struct chip_desc chips[] = {
  80        [pca_9540] = {
  81                .nchans = 2,
  82                .enable = 0x4,
  83                .muxtype = pca954x_ismux,
  84        },
  85        [pca_9543] = {
  86                .nchans = 2,
  87                .muxtype = pca954x_isswi,
  88        },
  89        [pca_9544] = {
  90                .nchans = 4,
  91                .enable = 0x4,
  92                .muxtype = pca954x_ismux,
  93        },
  94        [pca_9545] = {
  95                .nchans = 4,
  96                .muxtype = pca954x_isswi,
  97        },
  98        [pca_9547] = {
  99                .nchans = 8,
 100                .enable = 0x8,
 101                .muxtype = pca954x_ismux,
 102        },
 103        [pca_9548] = {
 104                .nchans = 8,
 105                .muxtype = pca954x_isswi,
 106        },
 107};
 108
 109static const struct i2c_device_id pca954x_id[] = {
 110        { "pca9540", pca_9540 },
 111        { "pca9542", pca_9540 },
 112        { "pca9543", pca_9543 },
 113        { "pca9544", pca_9544 },
 114        { "pca9545", pca_9545 },
 115        { "pca9546", pca_9545 },
 116        { "pca9547", pca_9547 },
 117        { "pca9548", pca_9548 },
 118        { }
 119};
 120MODULE_DEVICE_TABLE(i2c, pca954x_id);
 121
 122/* Write to mux register. Don't use i2c_transfer()/i2c_smbus_xfer()
 123   for this as they will try to lock adapter a second time */
 124static int pca954x_reg_write(struct i2c_adapter *adap,
 125                             struct i2c_client *client, u8 val)
 126{
 127        int ret = -ENODEV;
 128
 129        if (adap->algo->master_xfer) {
 130                struct i2c_msg msg;
 131                char buf[1];
 132
 133                msg.addr = client->addr;
 134                msg.flags = 0;
 135                msg.len = 1;
 136                buf[0] = val;
 137                msg.buf = buf;
 138                ret = __i2c_transfer(adap, &msg, 1);
 139        } else {
 140                union i2c_smbus_data data;
 141                ret = adap->algo->smbus_xfer(adap, client->addr,
 142                                             client->flags,
 143                                             I2C_SMBUS_WRITE,
 144                                             val, I2C_SMBUS_BYTE, &data);
 145        }
 146
 147        return ret;
 148}
 149
 150static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan)
 151{
 152        struct pca954x *data = i2c_mux_priv(muxc);
 153        struct i2c_client *client = data->client;
 154        const struct chip_desc *chip = &chips[data->type];
 155        u8 regval;
 156        int ret = 0;
 157
 158        /* we make switches look like muxes, not sure how to be smarter */
 159        if (chip->muxtype == pca954x_ismux)
 160                regval = chan | chip->enable;
 161        else
 162                regval = 1 << chan;
 163
 164        /* Only select the channel if its different from the last channel */
 165        if (data->last_chan != regval) {
 166                ret = pca954x_reg_write(muxc->parent, client, regval);
 167                data->last_chan = ret ? 0 : regval;
 168        }
 169
 170        return ret;
 171}
 172
 173static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan)
 174{
 175        struct pca954x *data = i2c_mux_priv(muxc);
 176        struct i2c_client *client = data->client;
 177
 178        if (!(data->deselect & (1 << chan)))
 179                return 0;
 180
 181        /* Deselect active channel */
 182        data->last_chan = 0;
 183        return pca954x_reg_write(muxc->parent, client, data->last_chan);
 184}
 185
 186/*
 187 * I2C init/probing/exit functions
 188 */
 189static int pca954x_probe(struct i2c_client *client,
 190                         const struct i2c_device_id *id)
 191{
 192        struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent);
 193        struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev);
 194        struct device_node *of_node = client->dev.of_node;
 195        bool idle_disconnect_dt;
 196        struct gpio_desc *gpio;
 197        int num, force, class;
 198        struct i2c_mux_core *muxc;
 199        struct pca954x *data;
 200        int ret;
 201
 202        if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE))
 203                return -ENODEV;
 204
 205        muxc = i2c_mux_alloc(adap, &client->dev,
 206                             PCA954X_MAX_NCHANS, sizeof(*data), 0,
 207                             pca954x_select_chan, pca954x_deselect_mux);
 208        if (!muxc)
 209                return -ENOMEM;
 210        data = i2c_mux_priv(muxc);
 211
 212        i2c_set_clientdata(client, muxc);
 213        data->client = client;
 214
 215        /* Get the mux out of reset if a reset GPIO is specified. */
 216        gpio = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_OUT_LOW);
 217        if (IS_ERR(gpio))
 218                return PTR_ERR(gpio);
 219
 220        /* Write the mux register at addr to verify
 221         * that the mux is in fact present. This also
 222         * initializes the mux to disconnected state.
 223         */
 224        if (i2c_smbus_write_byte(client, 0) < 0) {
 225                dev_warn(&client->dev, "probe failed\n");
 226                return -ENODEV;
 227        }
 228
 229        data->type = id->driver_data;
 230        data->last_chan = 0;               /* force the first selection */
 231
 232        idle_disconnect_dt = of_node &&
 233                of_property_read_bool(of_node, "i2c-mux-idle-disconnect");
 234
 235        /* Now create an adapter for each channel */
 236        for (num = 0; num < chips[data->type].nchans; num++) {
 237                bool idle_disconnect_pd = false;
 238
 239                force = 0;                        /* dynamic adap number */
 240                class = 0;                        /* no class by default */
 241                if (pdata) {
 242                        if (num < pdata->num_modes) {
 243                                /* force static number */
 244                                force = pdata->modes[num].adap_id;
 245                                class = pdata->modes[num].class;
 246                        } else
 247                                /* discard unconfigured channels */
 248                                break;
 249                        idle_disconnect_pd = pdata->modes[num].deselect_on_exit;
 250                        data->deselect |= (idle_disconnect_pd
 251                                           || idle_disconnect_dt) << num;
 252                }
 253
 254                ret = i2c_mux_add_adapter(muxc, force, num, class);
 255
 256                if (ret) {
 257                        dev_err(&client->dev,
 258                                "failed to register multiplexed adapter"
 259                                " %d as bus %d\n", num, force);
 260                        goto virt_reg_failed;
 261                }
 262        }
 263
 264        dev_info(&client->dev,
 265                 "registered %d multiplexed busses for I2C %s %s\n",
 266                 num, chips[data->type].muxtype == pca954x_ismux
 267                                ? "mux" : "switch", client->name);
 268
 269        return 0;
 270
 271virt_reg_failed:
 272        i2c_mux_del_adapters(muxc);
 273        return ret;
 274}
 275
 276static int pca954x_remove(struct i2c_client *client)
 277{
 278        struct i2c_mux_core *muxc = i2c_get_clientdata(client);
 279
 280        i2c_mux_del_adapters(muxc);
 281        return 0;
 282}
 283
 284#ifdef CONFIG_PM_SLEEP
 285static int pca954x_resume(struct device *dev)
 286{
 287        struct i2c_client *client = to_i2c_client(dev);
 288        struct i2c_mux_core *muxc = i2c_get_clientdata(client);
 289        struct pca954x *data = i2c_mux_priv(muxc);
 290
 291        data->last_chan = 0;
 292        return i2c_smbus_write_byte(client, 0);
 293}
 294#endif
 295
 296static SIMPLE_DEV_PM_OPS(pca954x_pm, NULL, pca954x_resume);
 297
 298static struct i2c_driver pca954x_driver = {
 299        .driver         = {
 300                .name   = "pca954x",
 301                .pm     = &pca954x_pm,
 302        },
 303        .probe          = pca954x_probe,
 304        .remove         = pca954x_remove,
 305        .id_table       = pca954x_id,
 306};
 307
 308module_i2c_driver(pca954x_driver);
 309
 310MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
 311MODULE_DESCRIPTION("PCA954x I2C mux/switch driver");
 312MODULE_LICENSE("GPL v2");
 313