2 * Multiplexed I2C bus driver.
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>
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).
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>
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.
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>
28 #include <linux/slab.h>
29 #include <linux/sysfs.h>
31 /* multiplexer per channel data */
33 struct i2c_adapter adap
;
34 struct i2c_algorithm algo
;
35 struct i2c_mux_core
*muxc
;
39 static int __i2c_mux_master_xfer(struct i2c_adapter
*adap
,
40 struct i2c_msg msgs
[], int num
)
42 struct i2c_mux_priv
*priv
= adap
->algo_data
;
43 struct i2c_mux_core
*muxc
= priv
->muxc
;
44 struct i2c_adapter
*parent
= muxc
->parent
;
47 /* Switch to the right mux port and perform the transfer. */
49 ret
= muxc
->select(muxc
, priv
->chan_id
);
51 ret
= __i2c_transfer(parent
, msgs
, num
);
53 muxc
->deselect(muxc
, priv
->chan_id
);
58 static int i2c_mux_master_xfer(struct i2c_adapter
*adap
,
59 struct i2c_msg msgs
[], int num
)
61 struct i2c_mux_priv
*priv
= adap
->algo_data
;
62 struct i2c_mux_core
*muxc
= priv
->muxc
;
63 struct i2c_adapter
*parent
= muxc
->parent
;
66 /* Switch to the right mux port and perform the transfer. */
68 ret
= muxc
->select(muxc
, priv
->chan_id
);
70 ret
= i2c_transfer(parent
, msgs
, num
);
72 muxc
->deselect(muxc
, priv
->chan_id
);
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
)
82 struct i2c_mux_priv
*priv
= adap
->algo_data
;
83 struct i2c_mux_core
*muxc
= priv
->muxc
;
84 struct i2c_adapter
*parent
= muxc
->parent
;
87 /* Select the right mux port and perform the transfer. */
89 ret
= muxc
->select(muxc
, priv
->chan_id
);
91 ret
= __i2c_smbus_xfer(parent
, addr
, flags
,
92 read_write
, command
, size
, data
);
94 muxc
->deselect(muxc
, priv
->chan_id
);
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
)
104 struct i2c_mux_priv
*priv
= adap
->algo_data
;
105 struct i2c_mux_core
*muxc
= priv
->muxc
;
106 struct i2c_adapter
*parent
= muxc
->parent
;
109 /* Select the right mux port and perform the transfer. */
111 ret
= muxc
->select(muxc
, priv
->chan_id
);
113 ret
= i2c_smbus_xfer(parent
, addr
, flags
,
114 read_write
, command
, size
, data
);
116 muxc
->deselect(muxc
, priv
->chan_id
);
121 /* Return the parent's functionality */
122 static u32
i2c_mux_functionality(struct i2c_adapter
*adap
)
124 struct i2c_mux_priv
*priv
= adap
->algo_data
;
125 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
127 return parent
->algo
->functionality(parent
);
130 /* Return all parent classes, merged */
131 static unsigned int i2c_mux_parent_classes(struct i2c_adapter
*parent
)
133 unsigned int class = 0;
136 class |= parent
->class;
137 parent
= i2c_parent_is_i2c_adapter(parent
);
143 static void i2c_mux_lock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
145 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
146 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
148 rt_mutex_lock_nested(&parent
->mux_lock
, i2c_adapter_depth(adapter
));
149 if (!(flags
& I2C_LOCK_ROOT_ADAPTER
))
151 i2c_lock_bus(parent
, flags
);
154 static int i2c_mux_trylock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
156 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
157 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
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 */
169 static void i2c_mux_unlock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
171 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
172 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
174 if (flags
& I2C_LOCK_ROOT_ADAPTER
)
175 i2c_unlock_bus(parent
, flags
);
176 rt_mutex_unlock(&parent
->mux_lock
);
179 static void i2c_parent_lock_bus(struct i2c_adapter
*adapter
,
182 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
183 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
185 rt_mutex_lock_nested(&parent
->mux_lock
, i2c_adapter_depth(adapter
));
186 i2c_lock_bus(parent
, flags
);
189 static int i2c_parent_trylock_bus(struct i2c_adapter
*adapter
,
192 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
193 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
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 */
203 static void i2c_parent_unlock_bus(struct i2c_adapter
*adapter
,
206 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
207 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
209 i2c_unlock_bus(parent
, flags
);
210 rt_mutex_unlock(&parent
->mux_lock
);
213 struct i2c_adapter
*i2c_root_adapter(struct device
*dev
)
216 struct i2c_adapter
*i2c_root
;
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.
223 for (i2c
= dev
; i2c
; i2c
= i2c
->parent
) {
224 if (i2c
->type
== &i2c_adapter_type
)
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
);
237 EXPORT_SYMBOL_GPL(i2c_root_adapter
);
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
))
245 struct i2c_mux_core
*muxc
;
247 muxc
= devm_kzalloc(dev
, struct_size(muxc
, adapter
, max_adapters
)
248 + sizeof_priv
, GFP_KERNEL
);
252 muxc
->priv
= &muxc
->adapter
[max_adapters
];
254 muxc
->parent
= parent
;
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
)
262 muxc
->select
= select
;
263 muxc
->deselect
= deselect
;
264 muxc
->max_adapters
= max_adapters
;
268 EXPORT_SYMBOL_GPL(i2c_mux_alloc
);
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
,
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
,
282 int i2c_mux_add_adapter(struct i2c_mux_core
*muxc
,
283 u32 force_nr
, u32 chan_id
,
286 struct i2c_adapter
*parent
= muxc
->parent
;
287 struct i2c_mux_priv
*priv
;
288 char symlink_name
[20];
291 if (muxc
->num_adapters
>= muxc
->max_adapters
) {
292 dev_err(muxc
->dev
, "No room for more i2c-mux adapters\n");
296 priv
= kzalloc(sizeof(*priv
), GFP_KERNEL
);
300 /* Set up private adapter data */
302 priv
->chan_id
= chan_id
;
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.
307 if (parent
->algo
->master_xfer
) {
308 if (muxc
->mux_locked
)
309 priv
->algo
.master_xfer
= i2c_mux_master_xfer
;
311 priv
->algo
.master_xfer
= __i2c_mux_master_xfer
;
313 if (parent
->algo
->master_xfer_atomic
)
314 priv
->algo
.master_xfer_atomic
= priv
->algo
.master_xfer
;
316 if (parent
->algo
->smbus_xfer
) {
317 if (muxc
->mux_locked
)
318 priv
->algo
.smbus_xfer
= i2c_mux_smbus_xfer
;
320 priv
->algo
.smbus_xfer
= __i2c_mux_smbus_xfer
;
322 if (parent
->algo
->smbus_xfer_atomic
)
323 priv
->algo
.smbus_xfer_atomic
= priv
->algo
.smbus_xfer
;
325 priv
->algo
.functionality
= i2c_mux_functionality
;
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
;
340 priv
->adap
.lock_ops
= &i2c_parent_lock_ops
;
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",
348 priv
->adap
.class = class;
351 * Try to populate the mux adapter's of_node, expands to
352 * nothing if !CONFIG_OF.
354 if (muxc
->dev
->of_node
) {
355 struct device_node
*dev_node
= muxc
->dev
->of_node
;
356 struct device_node
*mux_node
, *child
= NULL
;
359 if (muxc
->arbitrator
)
360 mux_node
= of_get_child_by_name(dev_node
, "i2c-arb");
362 mux_node
= of_get_child_by_name(dev_node
, "i2c-gate");
364 mux_node
= of_get_child_by_name(dev_node
, "i2c-mux");
367 /* A "reg" property indicates an old-style DT entry */
368 if (!of_property_read_u32(mux_node
, "reg", ®
)) {
369 of_node_put(mux_node
);
375 mux_node
= of_node_get(dev_node
);
376 else if (muxc
->arbitrator
|| muxc
->gate
)
377 child
= of_node_get(mux_node
);
380 for_each_child_of_node(mux_node
, child
) {
381 ret
= of_property_read_u32(child
, "reg", ®
);
389 priv
->adap
.dev
.of_node
= child
;
390 of_node_put(mux_node
);
394 * Associate the mux channel with an ACPI node.
396 if (has_acpi_companion(muxc
->dev
))
397 acpi_preset_companion(&priv
->adap
.dev
,
398 ACPI_COMPANION(muxc
->dev
),
402 priv
->adap
.nr
= force_nr
;
403 ret
= i2c_add_numbered_adapter(&priv
->adap
);
405 dev_err(&parent
->dev
,
406 "failed to add mux-adapter %u as bus %u (error=%d)\n",
407 chan_id
, force_nr
, ret
);
411 ret
= i2c_add_adapter(&priv
->adap
);
413 dev_err(&parent
->dev
,
414 "failed to add mux-adapter %u (error=%d)\n",
420 WARN(sysfs_create_link(&priv
->adap
.dev
.kobj
, &muxc
->dev
->kobj
,
422 "can't create symlink to mux device\n");
424 snprintf(symlink_name
, sizeof(symlink_name
), "channel-%u", chan_id
);
425 WARN(sysfs_create_link(&muxc
->dev
->kobj
, &priv
->adap
.dev
.kobj
,
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
));
431 muxc
->adapter
[muxc
->num_adapters
++] = &priv
->adap
;
438 EXPORT_SYMBOL_GPL(i2c_mux_add_adapter
);
440 void i2c_mux_del_adapters(struct i2c_mux_core
*muxc
)
442 char symlink_name
[20];
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
;
449 muxc
->adapter
[muxc
->num_adapters
] = NULL
;
451 snprintf(symlink_name
, sizeof(symlink_name
),
452 "channel-%u", priv
->chan_id
);
453 sysfs_remove_link(&muxc
->dev
->kobj
, symlink_name
);
455 sysfs_remove_link(&priv
->adap
.dev
.kobj
, "mux_device");
456 i2c_del_adapter(adap
);
461 EXPORT_SYMBOL_GPL(i2c_mux_del_adapters
);
463 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
464 MODULE_DESCRIPTION("I2C driver for multiplexed I2C busses");
465 MODULE_LICENSE("GPL v2");