root/drivers/i2c/i2c-mux.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. __i2c_mux_master_xfer
  2. i2c_mux_master_xfer
  3. __i2c_mux_smbus_xfer
  4. i2c_mux_smbus_xfer
  5. i2c_mux_functionality
  6. i2c_mux_parent_classes
  7. i2c_mux_lock_bus
  8. i2c_mux_trylock_bus
  9. i2c_mux_unlock_bus
  10. i2c_parent_lock_bus
  11. i2c_parent_trylock_bus
  12. i2c_parent_unlock_bus
  13. i2c_root_adapter
  14. i2c_mux_alloc
  15. i2c_mux_add_adapter
  16. i2c_mux_del_adapters

   1 /*
   2  * Multiplexed I2C bus driver.
   3  *
   4  * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it>
   5  * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it>
   6  * Copyright (c) 2009-2010 NSN GmbH & Co KG <michael.lawnick.ext@nsn.com>
   7  *
   8  * Simplifies access to complex multiplexed I2C bus topologies, by presenting
   9  * each multiplexed bus segment as an additional I2C adapter.
  10  * Supports multi-level mux'ing (mux behind a mux).
  11  *
  12  * Based on:
  13  *      i2c-virt.c from Kumar Gala <galak@kernel.crashing.org>
  14  *      i2c-virtual.c from Ken Harrenstien, Copyright (c) 2004 Google, Inc.
  15  *      i2c-virtual.c from Brian Kuschak <bkuschak@yahoo.com>
  16  *
  17  * This file is licensed under the terms of the GNU General Public
  18  * License version 2. This program is licensed "as is" without any
  19  * warranty of any kind, whether express or implied.
  20  */
  21 
  22 #include <linux/acpi.h>
  23 #include <linux/i2c.h>
  24 #include <linux/i2c-mux.h>
  25 #include <linux/kernel.h>
  26 #include <linux/module.h>
  27 #include <linux/of.h>
  28 #include <linux/slab.h>
  29 #include <linux/sysfs.h>
  30 
  31 /* multiplexer per channel data */
  32 struct i2c_mux_priv {
  33         struct i2c_adapter adap;
  34         struct i2c_algorithm algo;
  35         struct i2c_mux_core *muxc;
  36         u32 chan_id;
  37 };
  38 
  39 static int __i2c_mux_master_xfer(struct i2c_adapter *adap,
  40                                  struct i2c_msg msgs[], int num)
  41 {
  42         struct i2c_mux_priv *priv = adap->algo_data;
  43         struct i2c_mux_core *muxc = priv->muxc;
  44         struct i2c_adapter *parent = muxc->parent;
  45         int ret;
  46 
  47         /* Switch to the right mux port and perform the transfer. */
  48 
  49         ret = muxc->select(muxc, priv->chan_id);
  50         if (ret >= 0)
  51                 ret = __i2c_transfer(parent, msgs, num);
  52         if (muxc->deselect)
  53                 muxc->deselect(muxc, priv->chan_id);
  54 
  55         return ret;
  56 }
  57 
  58 static int i2c_mux_master_xfer(struct i2c_adapter *adap,
  59                                struct i2c_msg msgs[], int num)
  60 {
  61         struct i2c_mux_priv *priv = adap->algo_data;
  62         struct i2c_mux_core *muxc = priv->muxc;
  63         struct i2c_adapter *parent = muxc->parent;
  64         int ret;
  65 
  66         /* Switch to the right mux port and perform the transfer. */
  67 
  68         ret = muxc->select(muxc, priv->chan_id);
  69         if (ret >= 0)
  70                 ret = i2c_transfer(parent, msgs, num);
  71         if (muxc->deselect)
  72                 muxc->deselect(muxc, priv->chan_id);
  73 
  74         return ret;
  75 }
  76 
  77 static int __i2c_mux_smbus_xfer(struct i2c_adapter *adap,
  78                                 u16 addr, unsigned short flags,
  79                                 char read_write, u8 command,
  80                                 int size, union i2c_smbus_data *data)
  81 {
  82         struct i2c_mux_priv *priv = adap->algo_data;
  83         struct i2c_mux_core *muxc = priv->muxc;
  84         struct i2c_adapter *parent = muxc->parent;
  85         int ret;
  86 
  87         /* Select the right mux port and perform the transfer. */
  88 
  89         ret = muxc->select(muxc, priv->chan_id);
  90         if (ret >= 0)
  91                 ret = __i2c_smbus_xfer(parent, addr, flags,
  92                                        read_write, command, size, data);
  93         if (muxc->deselect)
  94                 muxc->deselect(muxc, priv->chan_id);
  95 
  96         return ret;
  97 }
  98 
  99 static int i2c_mux_smbus_xfer(struct i2c_adapter *adap,
 100                               u16 addr, unsigned short flags,
 101                               char read_write, u8 command,
 102                               int size, union i2c_smbus_data *data)
 103 {
 104         struct i2c_mux_priv *priv = adap->algo_data;
 105         struct i2c_mux_core *muxc = priv->muxc;
 106         struct i2c_adapter *parent = muxc->parent;
 107         int ret;
 108 
 109         /* Select the right mux port and perform the transfer. */
 110 
 111         ret = muxc->select(muxc, priv->chan_id);
 112         if (ret >= 0)
 113                 ret = i2c_smbus_xfer(parent, addr, flags,
 114                                      read_write, command, size, data);
 115         if (muxc->deselect)
 116                 muxc->deselect(muxc, priv->chan_id);
 117 
 118         return ret;
 119 }
 120 
 121 /* Return the parent's functionality */
 122 static u32 i2c_mux_functionality(struct i2c_adapter *adap)
 123 {
 124         struct i2c_mux_priv *priv = adap->algo_data;
 125         struct i2c_adapter *parent = priv->muxc->parent;
 126 
 127         return parent->algo->functionality(parent);
 128 }
 129 
 130 /* Return all parent classes, merged */
 131 static unsigned int i2c_mux_parent_classes(struct i2c_adapter *parent)
 132 {
 133         unsigned int class = 0;
 134 
 135         do {
 136                 class |= parent->class;
 137                 parent = i2c_parent_is_i2c_adapter(parent);
 138         } while (parent);
 139 
 140         return class;
 141 }
 142 
 143 static void i2c_mux_lock_bus(struct i2c_adapter *adapter, unsigned int flags)
 144 {
 145         struct i2c_mux_priv *priv = adapter->algo_data;
 146         struct i2c_adapter *parent = priv->muxc->parent;
 147 
 148         rt_mutex_lock_nested(&parent->mux_lock, i2c_adapter_depth(adapter));
 149         if (!(flags & I2C_LOCK_ROOT_ADAPTER))
 150                 return;
 151         i2c_lock_bus(parent, flags);
 152 }
 153 
 154 static int i2c_mux_trylock_bus(struct i2c_adapter *adapter, unsigned int flags)
 155 {
 156         struct i2c_mux_priv *priv = adapter->algo_data;
 157         struct i2c_adapter *parent = priv->muxc->parent;
 158 
 159         if (!rt_mutex_trylock(&parent->mux_lock))
 160                 return 0;       /* mux_lock not locked, failure */
 161         if (!(flags & I2C_LOCK_ROOT_ADAPTER))
 162                 return 1;       /* we only want mux_lock, success */
 163         if (i2c_trylock_bus(parent, flags))
 164                 return 1;       /* parent locked too, success */
 165         rt_mutex_unlock(&parent->mux_lock);
 166         return 0;               /* parent not locked, failure */
 167 }
 168 
 169 static void i2c_mux_unlock_bus(struct i2c_adapter *adapter, unsigned int flags)
 170 {
 171         struct i2c_mux_priv *priv = adapter->algo_data;
 172         struct i2c_adapter *parent = priv->muxc->parent;
 173 
 174         if (flags & I2C_LOCK_ROOT_ADAPTER)
 175                 i2c_unlock_bus(parent, flags);
 176         rt_mutex_unlock(&parent->mux_lock);
 177 }
 178 
 179 static void i2c_parent_lock_bus(struct i2c_adapter *adapter,
 180                                 unsigned int flags)
 181 {
 182         struct i2c_mux_priv *priv = adapter->algo_data;
 183         struct i2c_adapter *parent = priv->muxc->parent;
 184 
 185         rt_mutex_lock_nested(&parent->mux_lock, i2c_adapter_depth(adapter));
 186         i2c_lock_bus(parent, flags);
 187 }
 188 
 189 static int i2c_parent_trylock_bus(struct i2c_adapter *adapter,
 190                                   unsigned int flags)
 191 {
 192         struct i2c_mux_priv *priv = adapter->algo_data;
 193         struct i2c_adapter *parent = priv->muxc->parent;
 194 
 195         if (!rt_mutex_trylock(&parent->mux_lock))
 196                 return 0;       /* mux_lock not locked, failure */
 197         if (i2c_trylock_bus(parent, flags))
 198                 return 1;       /* parent locked too, success */
 199         rt_mutex_unlock(&parent->mux_lock);
 200         return 0;               /* parent not locked, failure */
 201 }
 202 
 203 static void i2c_parent_unlock_bus(struct i2c_adapter *adapter,
 204                                   unsigned int flags)
 205 {
 206         struct i2c_mux_priv *priv = adapter->algo_data;
 207         struct i2c_adapter *parent = priv->muxc->parent;
 208 
 209         i2c_unlock_bus(parent, flags);
 210         rt_mutex_unlock(&parent->mux_lock);
 211 }
 212 
 213 struct i2c_adapter *i2c_root_adapter(struct device *dev)
 214 {
 215         struct device *i2c;
 216         struct i2c_adapter *i2c_root;
 217 
 218         /*
 219          * Walk up the device tree to find an i2c adapter, indicating
 220          * that this is an i2c client device. Check all ancestors to
 221          * handle mfd devices etc.
 222          */
 223         for (i2c = dev; i2c; i2c = i2c->parent) {
 224                 if (i2c->type == &i2c_adapter_type)
 225                         break;
 226         }
 227         if (!i2c)
 228                 return NULL;
 229 
 230         /* Continue up the tree to find the root i2c adapter */
 231         i2c_root = to_i2c_adapter(i2c);
 232         while (i2c_parent_is_i2c_adapter(i2c_root))
 233                 i2c_root = i2c_parent_is_i2c_adapter(i2c_root);
 234 
 235         return i2c_root;
 236 }
 237 EXPORT_SYMBOL_GPL(i2c_root_adapter);
 238 
 239 struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *parent,
 240                                    struct device *dev, int max_adapters,
 241                                    int sizeof_priv, u32 flags,
 242                                    int (*select)(struct i2c_mux_core *, u32),
 243                                    int (*deselect)(struct i2c_mux_core *, u32))
 244 {
 245         struct i2c_mux_core *muxc;
 246 
 247         muxc = devm_kzalloc(dev, struct_size(muxc, adapter, max_adapters)
 248                             + sizeof_priv, GFP_KERNEL);
 249         if (!muxc)
 250                 return NULL;
 251         if (sizeof_priv)
 252                 muxc->priv = &muxc->adapter[max_adapters];
 253 
 254         muxc->parent = parent;
 255         muxc->dev = dev;
 256         if (flags & I2C_MUX_LOCKED)
 257                 muxc->mux_locked = true;
 258         if (flags & I2C_MUX_ARBITRATOR)
 259                 muxc->arbitrator = true;
 260         if (flags & I2C_MUX_GATE)
 261                 muxc->gate = true;
 262         muxc->select = select;
 263         muxc->deselect = deselect;
 264         muxc->max_adapters = max_adapters;
 265 
 266         return muxc;
 267 }
 268 EXPORT_SYMBOL_GPL(i2c_mux_alloc);
 269 
 270 static const struct i2c_lock_operations i2c_mux_lock_ops = {
 271         .lock_bus =    i2c_mux_lock_bus,
 272         .trylock_bus = i2c_mux_trylock_bus,
 273         .unlock_bus =  i2c_mux_unlock_bus,
 274 };
 275 
 276 static const struct i2c_lock_operations i2c_parent_lock_ops = {
 277         .lock_bus =    i2c_parent_lock_bus,
 278         .trylock_bus = i2c_parent_trylock_bus,
 279         .unlock_bus =  i2c_parent_unlock_bus,
 280 };
 281 
 282 int i2c_mux_add_adapter(struct i2c_mux_core *muxc,
 283                         u32 force_nr, u32 chan_id,
 284                         unsigned int class)
 285 {
 286         struct i2c_adapter *parent = muxc->parent;
 287         struct i2c_mux_priv *priv;
 288         char symlink_name[20];
 289         int ret;
 290 
 291         if (muxc->num_adapters >= muxc->max_adapters) {
 292                 dev_err(muxc->dev, "No room for more i2c-mux adapters\n");
 293                 return -EINVAL;
 294         }
 295 
 296         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 297         if (!priv)
 298                 return -ENOMEM;
 299 
 300         /* Set up private adapter data */
 301         priv->muxc = muxc;
 302         priv->chan_id = chan_id;
 303 
 304         /* Need to do algo dynamically because we don't know ahead
 305          * of time what sort of physical adapter we'll be dealing with.
 306          */
 307         if (parent->algo->master_xfer) {
 308                 if (muxc->mux_locked)
 309                         priv->algo.master_xfer = i2c_mux_master_xfer;
 310                 else
 311                         priv->algo.master_xfer = __i2c_mux_master_xfer;
 312         }
 313         if (parent->algo->master_xfer_atomic)
 314                 priv->algo.master_xfer_atomic = priv->algo.master_xfer;
 315 
 316         if (parent->algo->smbus_xfer) {
 317                 if (muxc->mux_locked)
 318                         priv->algo.smbus_xfer = i2c_mux_smbus_xfer;
 319                 else
 320                         priv->algo.smbus_xfer = __i2c_mux_smbus_xfer;
 321         }
 322         if (parent->algo->smbus_xfer_atomic)
 323                 priv->algo.smbus_xfer_atomic = priv->algo.smbus_xfer;
 324 
 325         priv->algo.functionality = i2c_mux_functionality;
 326 
 327         /* Now fill out new adapter structure */
 328         snprintf(priv->adap.name, sizeof(priv->adap.name),
 329                  "i2c-%d-mux (chan_id %d)", i2c_adapter_id(parent), chan_id);
 330         priv->adap.owner = THIS_MODULE;
 331         priv->adap.algo = &priv->algo;
 332         priv->adap.algo_data = priv;
 333         priv->adap.dev.parent = &parent->dev;
 334         priv->adap.retries = parent->retries;
 335         priv->adap.timeout = parent->timeout;
 336         priv->adap.quirks = parent->quirks;
 337         if (muxc->mux_locked)
 338                 priv->adap.lock_ops = &i2c_mux_lock_ops;
 339         else
 340                 priv->adap.lock_ops = &i2c_parent_lock_ops;
 341 
 342         /* Sanity check on class */
 343         if (i2c_mux_parent_classes(parent) & class)
 344                 dev_err(&parent->dev,
 345                         "Segment %d behind mux can't share classes with ancestors\n",
 346                         chan_id);
 347         else
 348                 priv->adap.class = class;
 349 
 350         /*
 351          * Try to populate the mux adapter's of_node, expands to
 352          * nothing if !CONFIG_OF.
 353          */
 354         if (muxc->dev->of_node) {
 355                 struct device_node *dev_node = muxc->dev->of_node;
 356                 struct device_node *mux_node, *child = NULL;
 357                 u32 reg;
 358 
 359                 if (muxc->arbitrator)
 360                         mux_node = of_get_child_by_name(dev_node, "i2c-arb");
 361                 else if (muxc->gate)
 362                         mux_node = of_get_child_by_name(dev_node, "i2c-gate");
 363                 else
 364                         mux_node = of_get_child_by_name(dev_node, "i2c-mux");
 365 
 366                 if (mux_node) {
 367                         /* A "reg" property indicates an old-style DT entry */
 368                         if (!of_property_read_u32(mux_node, "reg", &reg)) {
 369                                 of_node_put(mux_node);
 370                                 mux_node = NULL;
 371                         }
 372                 }
 373 
 374                 if (!mux_node)
 375                         mux_node = of_node_get(dev_node);
 376                 else if (muxc->arbitrator || muxc->gate)
 377                         child = of_node_get(mux_node);
 378 
 379                 if (!child) {
 380                         for_each_child_of_node(mux_node, child) {
 381                                 ret = of_property_read_u32(child, "reg", &reg);
 382                                 if (ret)
 383                                         continue;
 384                                 if (chan_id == reg)
 385                                         break;
 386                         }
 387                 }
 388 
 389                 priv->adap.dev.of_node = child;
 390                 of_node_put(mux_node);
 391         }
 392 
 393         /*
 394          * Associate the mux channel with an ACPI node.
 395          */
 396         if (has_acpi_companion(muxc->dev))
 397                 acpi_preset_companion(&priv->adap.dev,
 398                                       ACPI_COMPANION(muxc->dev),
 399                                       chan_id);
 400 
 401         if (force_nr) {
 402                 priv->adap.nr = force_nr;
 403                 ret = i2c_add_numbered_adapter(&priv->adap);
 404                 if (ret < 0) {
 405                         dev_err(&parent->dev,
 406                                 "failed to add mux-adapter %u as bus %u (error=%d)\n",
 407                                 chan_id, force_nr, ret);
 408                         goto err_free_priv;
 409                 }
 410         } else {
 411                 ret = i2c_add_adapter(&priv->adap);
 412                 if (ret < 0) {
 413                         dev_err(&parent->dev,
 414                                 "failed to add mux-adapter %u (error=%d)\n",
 415                                 chan_id, ret);
 416                         goto err_free_priv;
 417                 }
 418         }
 419 
 420         WARN(sysfs_create_link(&priv->adap.dev.kobj, &muxc->dev->kobj,
 421                                "mux_device"),
 422              "can't create symlink to mux device\n");
 423 
 424         snprintf(symlink_name, sizeof(symlink_name), "channel-%u", chan_id);
 425         WARN(sysfs_create_link(&muxc->dev->kobj, &priv->adap.dev.kobj,
 426                                symlink_name),
 427              "can't create symlink to channel %u\n", chan_id);
 428         dev_info(&parent->dev, "Added multiplexed i2c bus %d\n",
 429                  i2c_adapter_id(&priv->adap));
 430 
 431         muxc->adapter[muxc->num_adapters++] = &priv->adap;
 432         return 0;
 433 
 434 err_free_priv:
 435         kfree(priv);
 436         return ret;
 437 }
 438 EXPORT_SYMBOL_GPL(i2c_mux_add_adapter);
 439 
 440 void i2c_mux_del_adapters(struct i2c_mux_core *muxc)
 441 {
 442         char symlink_name[20];
 443 
 444         while (muxc->num_adapters) {
 445                 struct i2c_adapter *adap = muxc->adapter[--muxc->num_adapters];
 446                 struct i2c_mux_priv *priv = adap->algo_data;
 447                 struct device_node *np = adap->dev.of_node;
 448 
 449                 muxc->adapter[muxc->num_adapters] = NULL;
 450 
 451                 snprintf(symlink_name, sizeof(symlink_name),
 452                          "channel-%u", priv->chan_id);
 453                 sysfs_remove_link(&muxc->dev->kobj, symlink_name);
 454 
 455                 sysfs_remove_link(&priv->adap.dev.kobj, "mux_device");
 456                 i2c_del_adapter(adap);
 457                 of_node_put(np);
 458                 kfree(priv);
 459         }
 460 }
 461 EXPORT_SYMBOL_GPL(i2c_mux_del_adapters);
 462 
 463 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
 464 MODULE_DESCRIPTION("I2C driver for multiplexed I2C busses");
 465 MODULE_LICENSE("GPL v2");

/* [<][>][^][v][top][bottom][index][help] */