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 muxc->mux_locked = !!(flags & I2C_MUX_LOCKED); 245 muxc->arbitrator = !!(flags & I2C_MUX_ARBITRATOR); 246 muxc->gate = !!(flags & I2C_MUX_GATE); 247 muxc->select = select; 248 muxc->deselect = deselect; 249 muxc->max_adapters = max_adapters; 250 251 return muxc; 252 } 253 EXPORT_SYMBOL_GPL(i2c_mux_alloc); 254 255 static const struct i2c_lock_operations i2c_mux_lock_ops = { 256 .lock_bus = i2c_mux_lock_bus, 257 .trylock_bus = i2c_mux_trylock_bus, 258 .unlock_bus = i2c_mux_unlock_bus, 259 }; 260 261 static const struct i2c_lock_operations i2c_parent_lock_ops = { 262 .lock_bus = i2c_parent_lock_bus, 263 .trylock_bus = i2c_parent_trylock_bus, 264 .unlock_bus = i2c_parent_unlock_bus, 265 }; 266 267 int i2c_mux_add_adapter(struct i2c_mux_core *muxc, 268 u32 force_nr, u32 chan_id) 269 { 270 struct i2c_adapter *parent = muxc->parent; 271 struct i2c_mux_priv *priv; 272 char symlink_name[20]; 273 int ret; 274 275 if (muxc->num_adapters >= muxc->max_adapters) { 276 dev_err(muxc->dev, "No room for more i2c-mux adapters\n"); 277 return -EINVAL; 278 } 279 280 priv = kzalloc(sizeof(*priv), GFP_KERNEL); 281 if (!priv) 282 return -ENOMEM; 283 284 /* Set up private adapter data */ 285 priv->muxc = muxc; 286 priv->chan_id = chan_id; 287 288 /* Need to do algo dynamically because we don't know ahead 289 * of time what sort of physical adapter we'll be dealing with. 290 */ 291 if (parent->algo->master_xfer) { 292 if (muxc->mux_locked) 293 priv->algo.xfer = i2c_mux_master_xfer; 294 else 295 priv->algo.xfer = __i2c_mux_master_xfer; 296 } 297 if (parent->algo->master_xfer_atomic) 298 priv->algo.xfer_atomic = priv->algo.master_xfer; 299 300 if (parent->algo->smbus_xfer) { 301 if (muxc->mux_locked) 302 priv->algo.smbus_xfer = i2c_mux_smbus_xfer; 303 else 304 priv->algo.smbus_xfer = __i2c_mux_smbus_xfer; 305 } 306 if (parent->algo->smbus_xfer_atomic) 307 priv->algo.smbus_xfer_atomic = priv->algo.smbus_xfer; 308 309 priv->algo.functionality = i2c_mux_functionality; 310 311 /* Now fill out new adapter structure */ 312 snprintf(priv->adap.name, sizeof(priv->adap.name), 313 "i2c-%d-mux (chan_id %d)", i2c_adapter_id(parent), chan_id); 314 priv->adap.owner = THIS_MODULE; 315 priv->adap.algo = &priv->algo; 316 priv->adap.algo_data = priv; 317 priv->adap.dev.parent = &parent->dev; 318 priv->adap.retries = parent->retries; 319 priv->adap.timeout = parent->timeout; 320 priv->adap.quirks = parent->quirks; 321 if (muxc->mux_locked) 322 priv->adap.lock_ops = &i2c_mux_lock_ops; 323 else 324 priv->adap.lock_ops = &i2c_parent_lock_ops; 325 326 /* 327 * Try to populate the mux adapter's of_node, expands to 328 * nothing if !CONFIG_OF. 329 */ 330 if (muxc->dev->of_node) { 331 struct device_node *dev_node = muxc->dev->of_node; 332 struct device_node *mux_node, *child = NULL; 333 u32 reg; 334 335 if (muxc->arbitrator) 336 mux_node = of_get_child_by_name(dev_node, "i2c-arb"); 337 else if (muxc->gate) 338 mux_node = of_get_child_by_name(dev_node, "i2c-gate"); 339 else 340 mux_node = of_get_child_by_name(dev_node, "i2c-mux"); 341 342 if (mux_node) { 343 /* A "reg" property indicates an old-style DT entry */ 344 if (!of_property_read_u32(mux_node, "reg", ®)) { 345 of_node_put(mux_node); 346 mux_node = NULL; 347 } 348 } 349 350 if (!mux_node) 351 mux_node = of_node_get(dev_node); 352 else if (muxc->arbitrator || muxc->gate) 353 child = of_node_get(mux_node); 354 355 if (!child) { 356 for_each_child_of_node(mux_node, child) { 357 ret = of_property_read_u32(child, "reg", ®); 358 if (ret) 359 continue; 360 if (chan_id == reg) 361 break; 362 } 363 } 364 365 priv->adap.dev.of_node = child; 366 of_node_put(mux_node); 367 } 368 369 /* 370 * Associate the mux channel with an ACPI node. 371 */ 372 if (has_acpi_companion(muxc->dev)) 373 acpi_preset_companion(&priv->adap.dev, 374 ACPI_COMPANION(muxc->dev), 375 chan_id); 376 377 if (force_nr) { 378 priv->adap.nr = force_nr; 379 ret = i2c_add_numbered_adapter(&priv->adap); 380 if (ret < 0) { 381 dev_err(&parent->dev, 382 "failed to add mux-adapter %u as bus %u (error=%d)\n", 383 chan_id, force_nr, ret); 384 goto err_free_priv; 385 } 386 } else { 387 ret = i2c_add_adapter(&priv->adap); 388 if (ret < 0) { 389 dev_err(&parent->dev, 390 "failed to add mux-adapter %u (error=%d)\n", 391 chan_id, ret); 392 goto err_free_priv; 393 } 394 } 395 396 WARN(sysfs_create_link(&priv->adap.dev.kobj, &muxc->dev->kobj, 397 "mux_device"), 398 "can't create symlink to mux device\n"); 399 400 snprintf(symlink_name, sizeof(symlink_name), "channel-%u", chan_id); 401 WARN(sysfs_create_link(&muxc->dev->kobj, &priv->adap.dev.kobj, 402 symlink_name), 403 "can't create symlink to channel %u\n", chan_id); 404 dev_info(&parent->dev, "Added multiplexed i2c bus %d\n", 405 i2c_adapter_id(&priv->adap)); 406 407 muxc->adapter[muxc->num_adapters++] = &priv->adap; 408 return 0; 409 410 err_free_priv: 411 kfree(priv); 412 return ret; 413 } 414 EXPORT_SYMBOL_GPL(i2c_mux_add_adapter); 415 416 void i2c_mux_del_adapters(struct i2c_mux_core *muxc) 417 { 418 char symlink_name[20]; 419 420 while (muxc->num_adapters) { 421 struct i2c_adapter *adap = muxc->adapter[--muxc->num_adapters]; 422 struct i2c_mux_priv *priv = adap->algo_data; 423 struct device_node *np = adap->dev.of_node; 424 425 muxc->adapter[muxc->num_adapters] = NULL; 426 427 snprintf(symlink_name, sizeof(symlink_name), 428 "channel-%u", priv->chan_id); 429 sysfs_remove_link(&muxc->dev->kobj, symlink_name); 430 431 sysfs_remove_link(&priv->adap.dev.kobj, "mux_device"); 432 i2c_del_adapter(adap); 433 of_node_put(np); 434 kfree(priv); 435 } 436 } 437 EXPORT_SYMBOL_GPL(i2c_mux_del_adapters); 438 439 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 440 MODULE_DESCRIPTION("I2C driver for multiplexed I2C busses"); 441 MODULE_LICENSE("GPL v2"); 442