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 /* 214 * For a mux adapter, the lock_select operation first locks just like the 215 * lock_bus operation. Then it selects the channel for this adapter and 216 * returns the root adapter. If there is another mux above this one, calling 217 * the parent lock_select should ensure that the channel is correctly 218 * selected. 219 */ 220 static struct i2c_adapter *i2c_mux_lock_select(struct i2c_adapter *adapter) 221 { 222 int ret; 223 struct i2c_mux_priv *priv = adapter->algo_data; 224 struct i2c_mux_core *muxc = priv->muxc; 225 struct i2c_adapter *parent = muxc->parent; 226 227 rt_mutex_lock_nested(&parent->mux_lock, i2c_adapter_depth(adapter)); 228 229 adapter = parent->mux_root_ops->lock_select(parent); 230 if (IS_ERR(adapter)) 231 return adapter; 232 233 ret = muxc->select(muxc, priv->chan_id); 234 if (ret < 0) { 235 parent->mux_root_ops->unlock_deselect(parent); 236 rt_mutex_unlock(&parent->mux_lock); 237 return ERR_PTR(ret); 238 } 239 240 return adapter; 241 } 242 243 static void i2c_mux_unlock_deselect(struct i2c_adapter *adapter) 244 { 245 struct i2c_mux_priv *priv = adapter->algo_data; 246 struct i2c_mux_core *muxc = priv->muxc; 247 struct i2c_adapter *parent = muxc->parent; 248 249 if (muxc->deselect) 250 muxc->deselect(muxc, priv->chan_id); 251 252 parent->mux_root_ops->unlock_deselect(parent); 253 rt_mutex_unlock(&parent->mux_lock); 254 } 255 256 struct i2c_adapter *i2c_root_adapter(struct device *dev) 257 { 258 struct device *i2c; 259 struct i2c_adapter *i2c_root; 260 261 /* 262 * Walk up the device tree to find an i2c adapter, indicating 263 * that this is an i2c client device. Check all ancestors to 264 * handle mfd devices etc. 265 */ 266 for (i2c = dev; i2c; i2c = i2c->parent) { 267 if (i2c->type == &i2c_adapter_type) 268 break; 269 } 270 if (!i2c) 271 return NULL; 272 273 /* Continue up the tree to find the root i2c adapter */ 274 i2c_root = to_i2c_adapter(i2c); 275 while (i2c_parent_is_i2c_adapter(i2c_root)) 276 i2c_root = i2c_parent_is_i2c_adapter(i2c_root); 277 278 return i2c_root; 279 } 280 EXPORT_SYMBOL_GPL(i2c_root_adapter); 281 282 struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *parent, 283 struct device *dev, int max_adapters, 284 int sizeof_priv, u32 flags, 285 int (*select)(struct i2c_mux_core *, u32), 286 int (*deselect)(struct i2c_mux_core *, u32)) 287 { 288 struct i2c_mux_core *muxc; 289 size_t mux_size; 290 291 mux_size = struct_size(muxc, adapter, max_adapters); 292 muxc = devm_kzalloc(dev, size_add(mux_size, sizeof_priv), GFP_KERNEL); 293 if (!muxc) 294 return NULL; 295 if (sizeof_priv) 296 muxc->priv = &muxc->adapter[max_adapters]; 297 298 muxc->parent = parent; 299 muxc->dev = dev; 300 if (flags & I2C_MUX_LOCKED) 301 muxc->mux_locked = true; 302 if (flags & I2C_MUX_ARBITRATOR) 303 muxc->arbitrator = true; 304 if (flags & I2C_MUX_GATE) 305 muxc->gate = true; 306 muxc->select = select; 307 muxc->deselect = deselect; 308 muxc->max_adapters = max_adapters; 309 310 return muxc; 311 } 312 EXPORT_SYMBOL_GPL(i2c_mux_alloc); 313 314 static const struct i2c_lock_operations i2c_mux_lock_ops = { 315 .lock_bus = i2c_mux_lock_bus, 316 .trylock_bus = i2c_mux_trylock_bus, 317 .unlock_bus = i2c_mux_unlock_bus, 318 }; 319 320 static const struct i2c_lock_operations i2c_parent_lock_ops = { 321 .lock_bus = i2c_parent_lock_bus, 322 .trylock_bus = i2c_parent_trylock_bus, 323 .unlock_bus = i2c_parent_unlock_bus, 324 }; 325 326 static const struct i2c_mux_root_operations i2c_mux_root_ops = { 327 .lock_select = i2c_mux_lock_select, 328 .unlock_deselect = i2c_mux_unlock_deselect, 329 }; 330 331 int i2c_mux_add_adapter(struct i2c_mux_core *muxc, 332 u32 force_nr, u32 chan_id, 333 unsigned int class) 334 { 335 struct i2c_adapter *parent = muxc->parent; 336 struct i2c_mux_priv *priv; 337 char symlink_name[20]; 338 int ret; 339 340 if (muxc->num_adapters >= muxc->max_adapters) { 341 dev_err(muxc->dev, "No room for more i2c-mux adapters\n"); 342 return -EINVAL; 343 } 344 345 priv = kzalloc(sizeof(*priv), GFP_KERNEL); 346 if (!priv) 347 return -ENOMEM; 348 349 /* Set up private adapter data */ 350 priv->muxc = muxc; 351 priv->chan_id = chan_id; 352 353 /* Need to do algo dynamically because we don't know ahead 354 * of time what sort of physical adapter we'll be dealing with. 355 */ 356 if (parent->algo->master_xfer) { 357 if (muxc->mux_locked) 358 priv->algo.master_xfer = i2c_mux_master_xfer; 359 else 360 priv->algo.master_xfer = __i2c_mux_master_xfer; 361 } 362 if (parent->algo->master_xfer_atomic) 363 priv->algo.master_xfer_atomic = priv->algo.master_xfer; 364 365 if (parent->algo->smbus_xfer) { 366 if (muxc->mux_locked) 367 priv->algo.smbus_xfer = i2c_mux_smbus_xfer; 368 else 369 priv->algo.smbus_xfer = __i2c_mux_smbus_xfer; 370 } 371 if (parent->algo->smbus_xfer_atomic) 372 priv->algo.smbus_xfer_atomic = priv->algo.smbus_xfer; 373 374 priv->algo.functionality = i2c_mux_functionality; 375 376 /* Now fill out new adapter structure */ 377 snprintf(priv->adap.name, sizeof(priv->adap.name), 378 "i2c-%d-mux (chan_id %d)", i2c_adapter_id(parent), chan_id); 379 priv->adap.owner = THIS_MODULE; 380 priv->adap.algo = &priv->algo; 381 priv->adap.algo_data = priv; 382 priv->adap.dev.parent = &parent->dev; 383 priv->adap.retries = parent->retries; 384 priv->adap.timeout = parent->timeout; 385 priv->adap.quirks = parent->quirks; 386 if (muxc->mux_locked) 387 priv->adap.lock_ops = &i2c_mux_lock_ops; 388 else 389 priv->adap.lock_ops = &i2c_parent_lock_ops; 390 391 priv->adap.mux_root_ops = &i2c_mux_root_ops; 392 393 /* Sanity check on class */ 394 if (i2c_mux_parent_classes(parent) & class & ~I2C_CLASS_DEPRECATED) 395 dev_err(&parent->dev, 396 "Segment %d behind mux can't share classes with ancestors\n", 397 chan_id); 398 else 399 priv->adap.class = class; 400 401 /* 402 * Try to populate the mux adapter's of_node, expands to 403 * nothing if !CONFIG_OF. 404 */ 405 if (muxc->dev->of_node) { 406 struct device_node *dev_node = muxc->dev->of_node; 407 struct device_node *mux_node, *child = NULL; 408 u32 reg; 409 410 if (muxc->arbitrator) 411 mux_node = of_get_child_by_name(dev_node, "i2c-arb"); 412 else if (muxc->gate) 413 mux_node = of_get_child_by_name(dev_node, "i2c-gate"); 414 else 415 mux_node = of_get_child_by_name(dev_node, "i2c-mux"); 416 417 if (mux_node) { 418 /* A "reg" property indicates an old-style DT entry */ 419 if (!of_property_read_u32(mux_node, "reg", ®)) { 420 of_node_put(mux_node); 421 mux_node = NULL; 422 } 423 } 424 425 if (!mux_node) 426 mux_node = of_node_get(dev_node); 427 else if (muxc->arbitrator || muxc->gate) 428 child = of_node_get(mux_node); 429 430 if (!child) { 431 for_each_child_of_node(mux_node, child) { 432 ret = of_property_read_u32(child, "reg", ®); 433 if (ret) 434 continue; 435 if (chan_id == reg) 436 break; 437 } 438 } 439 440 priv->adap.dev.of_node = child; 441 of_node_put(mux_node); 442 } 443 444 /* 445 * Associate the mux channel with an ACPI node. 446 */ 447 if (has_acpi_companion(muxc->dev)) 448 acpi_preset_companion(&priv->adap.dev, 449 ACPI_COMPANION(muxc->dev), 450 chan_id); 451 452 if (force_nr) { 453 priv->adap.nr = force_nr; 454 ret = i2c_add_numbered_adapter(&priv->adap); 455 if (ret < 0) { 456 dev_err(&parent->dev, 457 "failed to add mux-adapter %u as bus %u (error=%d)\n", 458 chan_id, force_nr, ret); 459 goto err_free_priv; 460 } 461 } else { 462 ret = i2c_add_adapter(&priv->adap); 463 if (ret < 0) { 464 dev_err(&parent->dev, 465 "failed to add mux-adapter %u (error=%d)\n", 466 chan_id, ret); 467 goto err_free_priv; 468 } 469 } 470 471 WARN(sysfs_create_link(&priv->adap.dev.kobj, &muxc->dev->kobj, 472 "mux_device"), 473 "can't create symlink to mux device\n"); 474 475 snprintf(symlink_name, sizeof(symlink_name), "channel-%u", chan_id); 476 WARN(sysfs_create_link(&muxc->dev->kobj, &priv->adap.dev.kobj, 477 symlink_name), 478 "can't create symlink to channel %u\n", chan_id); 479 dev_info(&parent->dev, "Added multiplexed i2c bus %d\n", 480 i2c_adapter_id(&priv->adap)); 481 482 muxc->adapter[muxc->num_adapters++] = &priv->adap; 483 return 0; 484 485 err_free_priv: 486 kfree(priv); 487 return ret; 488 } 489 EXPORT_SYMBOL_GPL(i2c_mux_add_adapter); 490 491 void i2c_mux_del_adapters(struct i2c_mux_core *muxc) 492 { 493 char symlink_name[20]; 494 495 while (muxc->num_adapters) { 496 struct i2c_adapter *adap = muxc->adapter[--muxc->num_adapters]; 497 struct i2c_mux_priv *priv = adap->algo_data; 498 struct device_node *np = adap->dev.of_node; 499 500 muxc->adapter[muxc->num_adapters] = NULL; 501 502 snprintf(symlink_name, sizeof(symlink_name), 503 "channel-%u", priv->chan_id); 504 sysfs_remove_link(&muxc->dev->kobj, symlink_name); 505 506 sysfs_remove_link(&priv->adap.dev.kobj, "mux_device"); 507 i2c_del_adapter(adap); 508 of_node_put(np); 509 kfree(priv); 510 } 511 } 512 EXPORT_SYMBOL_GPL(i2c_mux_del_adapters); 513 514 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 515 MODULE_DESCRIPTION("I2C driver for multiplexed I2C busses"); 516 MODULE_LICENSE("GPL v2"); 517