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 and PCA954x series of I2C multiplexer/switch
   8 * chips made by NXP Semiconductors.
   9 * This includes the:
  10 *       PCA9540, PCA9542, PCA9543, PCA9544, PCA9545, PCA9546, PCA9547,
  11 *       PCA9548, PCA9846, PCA9847, PCA9848 and PCA9849.
  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/interrupt.h>
  43#include <linux/irq.h>
  44#include <linux/module.h>
  45#include <linux/of.h>
  46#include <linux/of_device.h>
  47#include <linux/of_irq.h>
  48#include <linux/platform_data/pca954x.h>
  49#include <linux/pm.h>
  50#include <linux/slab.h>
  51#include <linux/spinlock.h>
  52
  53#define PCA954X_MAX_NCHANS 8
  54
  55#define PCA954X_IRQ_OFFSET 4
  56
  57enum pca_type {
  58        pca_9540,
  59        pca_9542,
  60        pca_9543,
  61        pca_9544,
  62        pca_9545,
  63        pca_9546,
  64        pca_9547,
  65        pca_9548,
  66        pca_9846,
  67        pca_9847,
  68        pca_9848,
  69        pca_9849,
  70};
  71
  72struct chip_desc {
  73        u8 nchans;
  74        u8 enable;      /* used for muxes only */
  75        u8 has_irq;
  76        enum muxtype {
  77                pca954x_ismux = 0,
  78                pca954x_isswi
  79        } muxtype;
  80};
  81
  82struct pca954x {
  83        const struct chip_desc *chip;
  84
  85        u8 last_chan;           /* last register value */
  86        u8 deselect;
  87        struct i2c_client *client;
  88
  89        struct irq_domain *irq;
  90        unsigned int irq_mask;
  91        raw_spinlock_t lock;
  92};
  93
  94/* Provide specs for the PCA954x types we know about */
  95static const struct chip_desc chips[] = {
  96        [pca_9540] = {
  97                .nchans = 2,
  98                .enable = 0x4,
  99                .muxtype = pca954x_ismux,
 100        },
 101        [pca_9542] = {
 102                .nchans = 2,
 103                .enable = 0x4,
 104                .has_irq = 1,
 105                .muxtype = pca954x_ismux,
 106        },
 107        [pca_9543] = {
 108                .nchans = 2,
 109                .has_irq = 1,
 110                .muxtype = pca954x_isswi,
 111        },
 112        [pca_9544] = {
 113                .nchans = 4,
 114                .enable = 0x4,
 115                .has_irq = 1,
 116                .muxtype = pca954x_ismux,
 117        },
 118        [pca_9545] = {
 119                .nchans = 4,
 120                .has_irq = 1,
 121                .muxtype = pca954x_isswi,
 122        },
 123        [pca_9546] = {
 124                .nchans = 4,
 125                .muxtype = pca954x_isswi,
 126        },
 127        [pca_9547] = {
 128                .nchans = 8,
 129                .enable = 0x8,
 130                .muxtype = pca954x_ismux,
 131        },
 132        [pca_9548] = {
 133                .nchans = 8,
 134                .muxtype = pca954x_isswi,
 135        },
 136        [pca_9846] = {
 137                .nchans = 4,
 138                .muxtype = pca954x_isswi,
 139        },
 140        [pca_9847] = {
 141                .nchans = 8,
 142                .enable = 0x8,
 143                .muxtype = pca954x_ismux,
 144        },
 145        [pca_9848] = {
 146                .nchans = 8,
 147                .muxtype = pca954x_isswi,
 148        },
 149        [pca_9849] = {
 150                .nchans = 4,
 151                .enable = 0x4,
 152                .muxtype = pca954x_ismux,
 153        },
 154};
 155
 156static const struct i2c_device_id pca954x_id[] = {
 157        { "pca9540", pca_9540 },
 158        { "pca9542", pca_9542 },
 159        { "pca9543", pca_9543 },
 160        { "pca9544", pca_9544 },
 161        { "pca9545", pca_9545 },
 162        { "pca9546", pca_9546 },
 163        { "pca9547", pca_9547 },
 164        { "pca9548", pca_9548 },
 165        { "pca9846", pca_9846 },
 166        { "pca9847", pca_9847 },
 167        { "pca9848", pca_9848 },
 168        { "pca9849", pca_9849 },
 169        { }
 170};
 171MODULE_DEVICE_TABLE(i2c, pca954x_id);
 172
 173#ifdef CONFIG_OF
 174static const struct of_device_id pca954x_of_match[] = {
 175        { .compatible = "nxp,pca9540", .data = &chips[pca_9540] },
 176        { .compatible = "nxp,pca9542", .data = &chips[pca_9542] },
 177        { .compatible = "nxp,pca9543", .data = &chips[pca_9543] },
 178        { .compatible = "nxp,pca9544", .data = &chips[pca_9544] },
 179        { .compatible = "nxp,pca9545", .data = &chips[pca_9545] },
 180        { .compatible = "nxp,pca9546", .data = &chips[pca_9546] },
 181        { .compatible = "nxp,pca9547", .data = &chips[pca_9547] },
 182        { .compatible = "nxp,pca9548", .data = &chips[pca_9548] },
 183        { .compatible = "nxp,pca9846", .data = &chips[pca_9846] },
 184        { .compatible = "nxp,pca9847", .data = &chips[pca_9847] },
 185        { .compatible = "nxp,pca9848", .data = &chips[pca_9848] },
 186        { .compatible = "nxp,pca9849", .data = &chips[pca_9849] },
 187        {}
 188};
 189MODULE_DEVICE_TABLE(of, pca954x_of_match);
 190#endif
 191
 192/* Write to mux register. Don't use i2c_transfer()/i2c_smbus_xfer()
 193   for this as they will try to lock adapter a second time */
 194static int pca954x_reg_write(struct i2c_adapter *adap,
 195                             struct i2c_client *client, u8 val)
 196{
 197        int ret = -ENODEV;
 198
 199        if (adap->algo->master_xfer) {
 200                struct i2c_msg msg;
 201                char buf[1];
 202
 203                msg.addr = client->addr;
 204                msg.flags = 0;
 205                msg.len = 1;
 206                buf[0] = val;
 207                msg.buf = buf;
 208                ret = __i2c_transfer(adap, &msg, 1);
 209
 210                if (ret >= 0 && ret != 1)
 211                        ret = -EREMOTEIO;
 212        } else {
 213                union i2c_smbus_data data;
 214                ret = adap->algo->smbus_xfer(adap, client->addr,
 215                                             client->flags,
 216                                             I2C_SMBUS_WRITE,
 217                                             val, I2C_SMBUS_BYTE, &data);
 218        }
 219
 220        return ret;
 221}
 222
 223static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan)
 224{
 225        struct pca954x *data = i2c_mux_priv(muxc);
 226        struct i2c_client *client = data->client;
 227        const struct chip_desc *chip = data->chip;
 228        u8 regval;
 229        int ret = 0;
 230
 231        /* we make switches look like muxes, not sure how to be smarter */
 232        if (chip->muxtype == pca954x_ismux)
 233                regval = chan | chip->enable;
 234        else
 235                regval = 1 << chan;
 236
 237        /* Only select the channel if its different from the last channel */
 238        if (data->last_chan != regval) {
 239                ret = pca954x_reg_write(muxc->parent, client, regval);
 240                data->last_chan = ret < 0 ? 0 : regval;
 241        }
 242
 243        return ret;
 244}
 245
 246static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan)
 247{
 248        struct pca954x *data = i2c_mux_priv(muxc);
 249        struct i2c_client *client = data->client;
 250
 251        if (!(data->deselect & (1 << chan)))
 252                return 0;
 253
 254        /* Deselect active channel */
 255        data->last_chan = 0;
 256        return pca954x_reg_write(muxc->parent, client, data->last_chan);
 257}
 258
 259static irqreturn_t pca954x_irq_handler(int irq, void *dev_id)
 260{
 261        struct pca954x *data = dev_id;
 262        unsigned int child_irq;
 263        int ret, i, handled = 0;
 264
 265        ret = i2c_smbus_read_byte(data->client);
 266        if (ret < 0)
 267                return IRQ_NONE;
 268
 269        for (i = 0; i < data->chip->nchans; i++) {
 270                if (ret & BIT(PCA954X_IRQ_OFFSET + i)) {
 271                        child_irq = irq_linear_revmap(data->irq, i);
 272                        handle_nested_irq(child_irq);
 273                        handled++;
 274                }
 275        }
 276        return handled ? IRQ_HANDLED : IRQ_NONE;
 277}
 278
 279static int pca954x_irq_set_type(struct irq_data *idata, unsigned int type)
 280{
 281        if ((type & IRQ_TYPE_SENSE_MASK) != IRQ_TYPE_LEVEL_LOW)
 282                return -EINVAL;
 283        return 0;
 284}
 285
 286static struct irq_chip pca954x_irq_chip = {
 287        .name = "i2c-mux-pca954x",
 288        .irq_set_type = pca954x_irq_set_type,
 289};
 290
 291static int pca954x_irq_setup(struct i2c_mux_core *muxc)
 292{
 293        struct pca954x *data = i2c_mux_priv(muxc);
 294        struct i2c_client *client = data->client;
 295        int c, irq;
 296
 297        if (!data->chip->has_irq || client->irq <= 0)
 298                return 0;
 299
 300        raw_spin_lock_init(&data->lock);
 301
 302        data->irq = irq_domain_add_linear(client->dev.of_node,
 303                                          data->chip->nchans,
 304                                          &irq_domain_simple_ops, data);
 305        if (!data->irq)
 306                return -ENODEV;
 307
 308        for (c = 0; c < data->chip->nchans; c++) {
 309                irq = irq_create_mapping(data->irq, c);
 310                if (!irq) {
 311                        dev_err(&client->dev, "failed irq create map\n");
 312                        return -EINVAL;
 313                }
 314                irq_set_chip_data(irq, data);
 315                irq_set_chip_and_handler(irq, &pca954x_irq_chip,
 316                        handle_simple_irq);
 317        }
 318
 319        return 0;
 320}
 321
 322static void pca954x_cleanup(struct i2c_mux_core *muxc)
 323{
 324        struct pca954x *data = i2c_mux_priv(muxc);
 325        int c, irq;
 326
 327        if (data->irq) {
 328                for (c = 0; c < data->chip->nchans; c++) {
 329                        irq = irq_find_mapping(data->irq, c);
 330                        irq_dispose_mapping(irq);
 331                }
 332                irq_domain_remove(data->irq);
 333        }
 334        i2c_mux_del_adapters(muxc);
 335}
 336
 337/*
 338 * I2C init/probing/exit functions
 339 */
 340static int pca954x_probe(struct i2c_client *client,
 341                         const struct i2c_device_id *id)
 342{
 343        struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent);
 344        struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev);
 345        struct device_node *of_node = client->dev.of_node;
 346        bool idle_disconnect_dt;
 347        struct gpio_desc *gpio;
 348        int num, force, class;
 349        struct i2c_mux_core *muxc;
 350        struct pca954x *data;
 351        const struct of_device_id *match;
 352        int ret;
 353
 354        if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE))
 355                return -ENODEV;
 356
 357        muxc = i2c_mux_alloc(adap, &client->dev,
 358                             PCA954X_MAX_NCHANS, sizeof(*data), 0,
 359                             pca954x_select_chan, pca954x_deselect_mux);
 360        if (!muxc)
 361                return -ENOMEM;
 362        data = i2c_mux_priv(muxc);
 363
 364        i2c_set_clientdata(client, muxc);
 365        data->client = client;
 366
 367        /* Get the mux out of reset if a reset GPIO is specified. */
 368        gpio = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_OUT_LOW);
 369        if (IS_ERR(gpio))
 370                return PTR_ERR(gpio);
 371
 372        /* Write the mux register at addr to verify
 373         * that the mux is in fact present. This also
 374         * initializes the mux to disconnected state.
 375         */
 376        if (i2c_smbus_write_byte(client, 0) < 0) {
 377                dev_warn(&client->dev, "probe failed\n");
 378                return -ENODEV;
 379        }
 380
 381        match = of_match_device(of_match_ptr(pca954x_of_match), &client->dev);
 382        if (match)
 383                data->chip = of_device_get_match_data(&client->dev);
 384        else
 385                data->chip = &chips[id->driver_data];
 386
 387        data->last_chan = 0;               /* force the first selection */
 388
 389        idle_disconnect_dt = of_node &&
 390                of_property_read_bool(of_node, "i2c-mux-idle-disconnect");
 391
 392        ret = pca954x_irq_setup(muxc);
 393        if (ret)
 394                goto fail_cleanup;
 395
 396        /* Now create an adapter for each channel */
 397        for (num = 0; num < data->chip->nchans; num++) {
 398                bool idle_disconnect_pd = false;
 399
 400                force = 0;                        /* dynamic adap number */
 401                class = 0;                        /* no class by default */
 402                if (pdata) {
 403                        if (num < pdata->num_modes) {
 404                                /* force static number */
 405                                force = pdata->modes[num].adap_id;
 406                                class = pdata->modes[num].class;
 407                        } else
 408                                /* discard unconfigured channels */
 409                                break;
 410                        idle_disconnect_pd = pdata->modes[num].deselect_on_exit;
 411                }
 412                data->deselect |= (idle_disconnect_pd ||
 413                                   idle_disconnect_dt) << num;
 414
 415                ret = i2c_mux_add_adapter(muxc, force, num, class);
 416                if (ret)
 417                        goto fail_cleanup;
 418        }
 419
 420        if (data->irq) {
 421                ret = devm_request_threaded_irq(&client->dev, data->client->irq,
 422                                                NULL, pca954x_irq_handler,
 423                                                IRQF_ONESHOT | IRQF_SHARED,
 424                                                "pca954x", data);
 425                if (ret)
 426                        goto fail_cleanup;
 427        }
 428
 429        dev_info(&client->dev,
 430                 "registered %d multiplexed busses for I2C %s %s\n",
 431                 num, data->chip->muxtype == pca954x_ismux
 432                                ? "mux" : "switch", client->name);
 433
 434        return 0;
 435
 436fail_cleanup:
 437        pca954x_cleanup(muxc);
 438        return ret;
 439}
 440
 441static int pca954x_remove(struct i2c_client *client)
 442{
 443        struct i2c_mux_core *muxc = i2c_get_clientdata(client);
 444
 445        pca954x_cleanup(muxc);
 446        return 0;
 447}
 448
 449#ifdef CONFIG_PM_SLEEP
 450static int pca954x_resume(struct device *dev)
 451{
 452        struct i2c_client *client = to_i2c_client(dev);
 453        struct i2c_mux_core *muxc = i2c_get_clientdata(client);
 454        struct pca954x *data = i2c_mux_priv(muxc);
 455
 456        data->last_chan = 0;
 457        return i2c_smbus_write_byte(client, 0);
 458}
 459#endif
 460
 461static SIMPLE_DEV_PM_OPS(pca954x_pm, NULL, pca954x_resume);
 462
 463static struct i2c_driver pca954x_driver = {
 464        .driver         = {
 465                .name   = "pca954x",
 466                .pm     = &pca954x_pm,
 467                .of_match_table = of_match_ptr(pca954x_of_match),
 468        },
 469        .probe          = pca954x_probe,
 470        .remove         = pca954x_remove,
 471        .id_table       = pca954x_id,
 472};
 473
 474module_i2c_driver(pca954x_driver);
 475
 476MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
 477MODULE_DESCRIPTION("PCA954x I2C mux/switch driver");
 478MODULE_LICENSE("GPL v2");
 479