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 static void i2c_mux_lock_bus(struct i2c_adapter *adapter, unsigned int flags) 131 { 132 struct i2c_mux_priv *priv = adapter->algo_data; 133 struct i2c_adapter *parent = priv->muxc->parent; 134 135 rt_mutex_lock_nested(&parent->mux_lock, i2c_adapter_depth(adapter)); 136 if (!(flags & I2C_LOCK_ROOT_ADAPTER)) 137 return; 138 i2c_lock_bus(parent, flags); 139 } 140 141 static int i2c_mux_trylock_bus(struct i2c_adapter *adapter, unsigned int flags) 142 { 143 struct i2c_mux_priv *priv = adapter->algo_data; 144 struct i2c_adapter *parent = priv->muxc->parent; 145 146 if (!rt_mutex_trylock(&parent->mux_lock)) 147 return 0; /* mux_lock not locked, failure */ 148 if (!(flags & I2C_LOCK_ROOT_ADAPTER)) 149 return 1; /* we only want mux_lock, success */ 150 if (i2c_trylock_bus(parent, flags)) 151 return 1; /* parent locked too, success */ 152 rt_mutex_unlock(&parent->mux_lock); 153 return 0; /* parent not locked, failure */ 154 } 155 156 static void i2c_mux_unlock_bus(struct i2c_adapter *adapter, unsigned int flags) 157 { 158 struct i2c_mux_priv *priv = adapter->algo_data; 159 struct i2c_adapter *parent = priv->muxc->parent; 160 161 if (flags & I2C_LOCK_ROOT_ADAPTER) 162 i2c_unlock_bus(parent, flags); 163 rt_mutex_unlock(&parent->mux_lock); 164 } 165 166 static void i2c_parent_lock_bus(struct i2c_adapter *adapter, 167 unsigned int flags) 168 { 169 struct i2c_mux_priv *priv = adapter->algo_data; 170 struct i2c_adapter *parent = priv->muxc->parent; 171 172 rt_mutex_lock_nested(&parent->mux_lock, i2c_adapter_depth(adapter)); 173 i2c_lock_bus(parent, flags); 174 } 175 176 static int i2c_parent_trylock_bus(struct i2c_adapter *adapter, 177 unsigned int flags) 178 { 179 struct i2c_mux_priv *priv = adapter->algo_data; 180 struct i2c_adapter *parent = priv->muxc->parent; 181 182 if (!rt_mutex_trylock(&parent->mux_lock)) 183 return 0; /* mux_lock not locked, failure */ 184 if (i2c_trylock_bus(parent, flags)) 185 return 1; /* parent locked too, success */ 186 rt_mutex_unlock(&parent->mux_lock); 187 return 0; /* parent not locked, failure */ 188 } 189 190 static void i2c_parent_unlock_bus(struct i2c_adapter *adapter, 191 unsigned int flags) 192 { 193 struct i2c_mux_priv *priv = adapter->algo_data; 194 struct i2c_adapter *parent = priv->muxc->parent; 195 196 i2c_unlock_bus(parent, flags); 197 rt_mutex_unlock(&parent->mux_lock); 198 } 199 200 struct i2c_adapter *i2c_root_adapter(struct device *dev) 201 { 202 struct device *i2c; 203 struct i2c_adapter *i2c_root; 204 205 /* 206 * Walk up the device tree to find an i2c adapter, indicating 207 * that this is an i2c client device. Check all ancestors to 208 * handle mfd devices etc. 209 */ 210 for (i2c = dev; i2c; i2c = i2c->parent) { 211 if (i2c->type == &i2c_adapter_type) 212 break; 213 } 214 if (!i2c) 215 return NULL; 216 217 /* Continue up the tree to find the root i2c adapter */ 218 i2c_root = to_i2c_adapter(i2c); 219 while (i2c_parent_is_i2c_adapter(i2c_root)) 220 i2c_root = i2c_parent_is_i2c_adapter(i2c_root); 221 222 return i2c_root; 223 } 224 EXPORT_SYMBOL_GPL(i2c_root_adapter); 225 226 struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *parent, 227 struct device *dev, int max_adapters, 228 int sizeof_priv, u32 flags, 229 int (*select)(struct i2c_mux_core *, u32), 230 int (*deselect)(struct i2c_mux_core *, u32)) 231 { 232 struct i2c_mux_core *muxc; 233 size_t mux_size; 234 235 mux_size = struct_size(muxc, adapter, max_adapters); 236 muxc = devm_kzalloc(dev, size_add(mux_size, sizeof_priv), GFP_KERNEL); 237 if (!muxc) 238 return NULL; 239 if (sizeof_priv) 240 muxc->priv = &muxc->adapter[max_adapters]; 241 242 muxc->parent = parent; 243 muxc->dev = dev; 244 if (flags & I2C_MUX_LOCKED) 245 muxc->mux_locked = true; 246 if (flags & I2C_MUX_ARBITRATOR) 247 muxc->arbitrator = true; 248 if (flags & I2C_MUX_GATE) 249 muxc->gate = true; 250 muxc->select = select; 251 muxc->deselect = deselect; 252 muxc->max_adapters = max_adapters; 253 254 return muxc; 255 } 256 EXPORT_SYMBOL_GPL(i2c_mux_alloc); 257 258 static const struct i2c_lock_operations i2c_mux_lock_ops = { 259 .lock_bus = i2c_mux_lock_bus, 260 .trylock_bus = i2c_mux_trylock_bus, 261 .unlock_bus = i2c_mux_unlock_bus, 262 }; 263 264 static const struct i2c_lock_operations i2c_parent_lock_ops = { 265 .lock_bus = i2c_parent_lock_bus, 266 .trylock_bus = i2c_parent_trylock_bus, 267 .unlock_bus = i2c_parent_unlock_bus, 268 }; 269 270 int i2c_mux_add_adapter(struct i2c_mux_core *muxc, 271 u32 force_nr, u32 chan_id) 272 { 273 struct i2c_adapter *parent = muxc->parent; 274 struct i2c_mux_priv *priv; 275 char symlink_name[20]; 276 int ret; 277 278 if (muxc->num_adapters >= muxc->max_adapters) { 279 dev_err(muxc->dev, "No room for more i2c-mux adapters\n"); 280 return -EINVAL; 281 } 282 283 priv = kzalloc(sizeof(*priv), GFP_KERNEL); 284 if (!priv) 285 return -ENOMEM; 286 287 /* Set up private adapter data */ 288 priv->muxc = muxc; 289 priv->chan_id = chan_id; 290 291 /* Need to do algo dynamically because we don't know ahead 292 * of time what sort of physical adapter we'll be dealing with. 293 */ 294 if (parent->algo->master_xfer) { 295 if (muxc->mux_locked) 296 priv->algo.master_xfer = i2c_mux_master_xfer; 297 else 298 priv->algo.master_xfer = __i2c_mux_master_xfer; 299 } 300 if (parent->algo->master_xfer_atomic) 301 priv->algo.master_xfer_atomic = priv->algo.master_xfer; 302 303 if (parent->algo->smbus_xfer) { 304 if (muxc->mux_locked) 305 priv->algo.smbus_xfer = i2c_mux_smbus_xfer; 306 else 307 priv->algo.smbus_xfer = __i2c_mux_smbus_xfer; 308 } 309 if (parent->algo->smbus_xfer_atomic) 310 priv->algo.smbus_xfer_atomic = priv->algo.smbus_xfer; 311 312 priv->algo.functionality = i2c_mux_functionality; 313 314 /* Now fill out new adapter structure */ 315 snprintf(priv->adap.name, sizeof(priv->adap.name), 316 "i2c-%d-mux (chan_id %d)", i2c_adapter_id(parent), chan_id); 317 priv->adap.owner = THIS_MODULE; 318 priv->adap.algo = &priv->algo; 319 priv->adap.algo_data = priv; 320 priv->adap.dev.parent = &parent->dev; 321 priv->adap.retries = parent->retries; 322 priv->adap.timeout = parent->timeout; 323 priv->adap.quirks = parent->quirks; 324 if (muxc->mux_locked) 325 priv->adap.lock_ops = &i2c_mux_lock_ops; 326 else 327 priv->adap.lock_ops = &i2c_parent_lock_ops; 328 329 /* 330 * Try to populate the mux adapter's of_node, expands to 331 * nothing if !CONFIG_OF. 332 */ 333 if (muxc->dev->of_node) { 334 struct device_node *dev_node = muxc->dev->of_node; 335 struct device_node *mux_node, *child = NULL; 336 u32 reg; 337 338 if (muxc->arbitrator) 339 mux_node = of_get_child_by_name(dev_node, "i2c-arb"); 340 else if (muxc->gate) 341 mux_node = of_get_child_by_name(dev_node, "i2c-gate"); 342 else 343 mux_node = of_get_child_by_name(dev_node, "i2c-mux"); 344 345 if (mux_node) { 346 /* A "reg" property indicates an old-style DT entry */ 347 if (!of_property_read_u32(mux_node, "reg", ®)) { 348 of_node_put(mux_node); 349 mux_node = NULL; 350 } 351 } 352 353 if (!mux_node) 354 mux_node = of_node_get(dev_node); 355 else if (muxc->arbitrator || muxc->gate) 356 child = of_node_get(mux_node); 357 358 if (!child) { 359 for_each_child_of_node(mux_node, child) { 360 ret = of_property_read_u32(child, "reg", ®); 361 if (ret) 362 continue; 363 if (chan_id == reg) 364 break; 365 } 366 } 367 368 priv->adap.dev.of_node = child; 369 of_node_put(mux_node); 370 } 371 372 /* 373 * Associate the mux channel with an ACPI node. 374 */ 375 if (has_acpi_companion(muxc->dev)) 376 acpi_preset_companion(&priv->adap.dev, 377 ACPI_COMPANION(muxc->dev), 378 chan_id); 379 380 if (force_nr) { 381 priv->adap.nr = force_nr; 382 ret = i2c_add_numbered_adapter(&priv->adap); 383 if (ret < 0) { 384 dev_err(&parent->dev, 385 "failed to add mux-adapter %u as bus %u (error=%d)\n", 386 chan_id, force_nr, ret); 387 goto err_free_priv; 388 } 389 } else { 390 ret = i2c_add_adapter(&priv->adap); 391 if (ret < 0) { 392 dev_err(&parent->dev, 393 "failed to add mux-adapter %u (error=%d)\n", 394 chan_id, ret); 395 goto err_free_priv; 396 } 397 } 398 399 WARN(sysfs_create_link(&priv->adap.dev.kobj, &muxc->dev->kobj, 400 "mux_device"), 401 "can't create symlink to mux device\n"); 402 403 snprintf(symlink_name, sizeof(symlink_name), "channel-%u", chan_id); 404 WARN(sysfs_create_link(&muxc->dev->kobj, &priv->adap.dev.kobj, 405 symlink_name), 406 "can't create symlink to channel %u\n", chan_id); 407 dev_info(&parent->dev, "Added multiplexed i2c bus %d\n", 408 i2c_adapter_id(&priv->adap)); 409 410 muxc->adapter[muxc->num_adapters++] = &priv->adap; 411 return 0; 412 413 err_free_priv: 414 kfree(priv); 415 return ret; 416 } 417 EXPORT_SYMBOL_GPL(i2c_mux_add_adapter); 418 419 void i2c_mux_del_adapters(struct i2c_mux_core *muxc) 420 { 421 char symlink_name[20]; 422 423 while (muxc->num_adapters) { 424 struct i2c_adapter *adap = muxc->adapter[--muxc->num_adapters]; 425 struct i2c_mux_priv *priv = adap->algo_data; 426 struct device_node *np = adap->dev.of_node; 427 428 muxc->adapter[muxc->num_adapters] = NULL; 429 430 snprintf(symlink_name, sizeof(symlink_name), 431 "channel-%u", priv->chan_id); 432 sysfs_remove_link(&muxc->dev->kobj, symlink_name); 433 434 sysfs_remove_link(&priv->adap.dev.kobj, "mux_device"); 435 i2c_del_adapter(adap); 436 of_node_put(np); 437 kfree(priv); 438 } 439 } 440 EXPORT_SYMBOL_GPL(i2c_mux_del_adapters); 441 442 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 443 MODULE_DESCRIPTION("I2C driver for multiplexed I2C busses"); 444 MODULE_LICENSE("GPL v2"); 445