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>
30 /* multiplexer per channel data */
32 struct i2c_adapter adap
;
33 struct i2c_algorithm algo
;
34 struct i2c_mux_core
*muxc
;
38 static int __i2c_mux_master_xfer(struct i2c_adapter
*adap
,
39 struct i2c_msg msgs
[], int num
)
41 struct i2c_mux_priv
*priv
= adap
->algo_data
;
42 struct i2c_mux_core
*muxc
= priv
->muxc
;
43 struct i2c_adapter
*parent
= muxc
->parent
;
46 /* Switch to the right mux port and perform the transfer. */
48 ret
= muxc
->select(muxc
, priv
->chan_id
);
50 ret
= __i2c_transfer(parent
, msgs
, num
);
52 muxc
->deselect(muxc
, priv
->chan_id
);
57 static int i2c_mux_master_xfer(struct i2c_adapter
*adap
,
58 struct i2c_msg msgs
[], int num
)
60 struct i2c_mux_priv
*priv
= adap
->algo_data
;
61 struct i2c_mux_core
*muxc
= priv
->muxc
;
62 struct i2c_adapter
*parent
= muxc
->parent
;
65 /* Switch to the right mux port and perform the transfer. */
67 ret
= muxc
->select(muxc
, priv
->chan_id
);
69 ret
= i2c_transfer(parent
, msgs
, num
);
71 muxc
->deselect(muxc
, priv
->chan_id
);
76 static int __i2c_mux_smbus_xfer(struct i2c_adapter
*adap
,
77 u16 addr
, unsigned short flags
,
78 char read_write
, u8 command
,
79 int size
, union i2c_smbus_data
*data
)
81 struct i2c_mux_priv
*priv
= adap
->algo_data
;
82 struct i2c_mux_core
*muxc
= priv
->muxc
;
83 struct i2c_adapter
*parent
= muxc
->parent
;
86 /* Select the right mux port and perform the transfer. */
88 ret
= muxc
->select(muxc
, priv
->chan_id
);
90 ret
= __i2c_smbus_xfer(parent
, addr
, flags
,
91 read_write
, command
, size
, data
);
93 muxc
->deselect(muxc
, priv
->chan_id
);
98 static int i2c_mux_smbus_xfer(struct i2c_adapter
*adap
,
99 u16 addr
, unsigned short flags
,
100 char read_write
, u8 command
,
101 int size
, union i2c_smbus_data
*data
)
103 struct i2c_mux_priv
*priv
= adap
->algo_data
;
104 struct i2c_mux_core
*muxc
= priv
->muxc
;
105 struct i2c_adapter
*parent
= muxc
->parent
;
108 /* Select the right mux port and perform the transfer. */
110 ret
= muxc
->select(muxc
, priv
->chan_id
);
112 ret
= i2c_smbus_xfer(parent
, addr
, flags
,
113 read_write
, command
, size
, data
);
115 muxc
->deselect(muxc
, priv
->chan_id
);
120 /* Return the parent's functionality */
121 static u32
i2c_mux_functionality(struct i2c_adapter
*adap
)
123 struct i2c_mux_priv
*priv
= adap
->algo_data
;
124 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
126 return parent
->algo
->functionality(parent
);
129 /* Return all parent classes, merged */
130 static unsigned int i2c_mux_parent_classes(struct i2c_adapter
*parent
)
132 unsigned int class = 0;
135 class |= parent
->class;
136 parent
= i2c_parent_is_i2c_adapter(parent
);
142 static void i2c_mux_lock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
144 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
145 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
147 rt_mutex_lock_nested(&parent
->mux_lock
, i2c_adapter_depth(adapter
));
148 if (!(flags
& I2C_LOCK_ROOT_ADAPTER
))
150 i2c_lock_bus(parent
, flags
);
153 static int i2c_mux_trylock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
155 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
156 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
158 if (!rt_mutex_trylock(&parent
->mux_lock
))
159 return 0; /* mux_lock not locked, failure */
160 if (!(flags
& I2C_LOCK_ROOT_ADAPTER
))
161 return 1; /* we only want mux_lock, success */
162 if (i2c_trylock_bus(parent
, flags
))
163 return 1; /* parent locked too, success */
164 rt_mutex_unlock(&parent
->mux_lock
);
165 return 0; /* parent not locked, failure */
168 static void i2c_mux_unlock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
170 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
171 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
173 if (flags
& I2C_LOCK_ROOT_ADAPTER
)
174 i2c_unlock_bus(parent
, flags
);
175 rt_mutex_unlock(&parent
->mux_lock
);
178 static void i2c_parent_lock_bus(struct i2c_adapter
*adapter
,
181 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
182 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
184 rt_mutex_lock_nested(&parent
->mux_lock
, i2c_adapter_depth(adapter
));
185 i2c_lock_bus(parent
, flags
);
188 static int i2c_parent_trylock_bus(struct i2c_adapter
*adapter
,
191 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
192 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
194 if (!rt_mutex_trylock(&parent
->mux_lock
))
195 return 0; /* mux_lock not locked, failure */
196 if (i2c_trylock_bus(parent
, flags
))
197 return 1; /* parent locked too, success */
198 rt_mutex_unlock(&parent
->mux_lock
);
199 return 0; /* parent not locked, failure */
202 static void i2c_parent_unlock_bus(struct i2c_adapter
*adapter
,
205 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
206 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
208 i2c_unlock_bus(parent
, flags
);
209 rt_mutex_unlock(&parent
->mux_lock
);
212 struct i2c_adapter
*i2c_root_adapter(struct device
*dev
)
215 struct i2c_adapter
*i2c_root
;
218 * Walk up the device tree to find an i2c adapter, indicating
219 * that this is an i2c client device. Check all ancestors to
220 * handle mfd devices etc.
222 for (i2c
= dev
; i2c
; i2c
= i2c
->parent
) {
223 if (i2c
->type
== &i2c_adapter_type
)
229 /* Continue up the tree to find the root i2c adapter */
230 i2c_root
= to_i2c_adapter(i2c
);
231 while (i2c_parent_is_i2c_adapter(i2c_root
))
232 i2c_root
= i2c_parent_is_i2c_adapter(i2c_root
);
236 EXPORT_SYMBOL_GPL(i2c_root_adapter
);
238 struct i2c_mux_core
*i2c_mux_alloc(struct i2c_adapter
*parent
,
239 struct device
*dev
, int max_adapters
,
240 int sizeof_priv
, u32 flags
,
241 int (*select
)(struct i2c_mux_core
*, u32
),
242 int (*deselect
)(struct i2c_mux_core
*, u32
))
244 struct i2c_mux_core
*muxc
;
246 muxc
= devm_kzalloc(dev
, sizeof(*muxc
)
247 + max_adapters
* sizeof(muxc
->adapter
[0])
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
->smbus_xfer
) {
314 if (muxc
->mux_locked
)
315 priv
->algo
.smbus_xfer
= i2c_mux_smbus_xfer
;
317 priv
->algo
.smbus_xfer
= __i2c_mux_smbus_xfer
;
319 priv
->algo
.functionality
= i2c_mux_functionality
;
321 /* Now fill out new adapter structure */
322 snprintf(priv
->adap
.name
, sizeof(priv
->adap
.name
),
323 "i2c-%d-mux (chan_id %d)", i2c_adapter_id(parent
), chan_id
);
324 priv
->adap
.owner
= THIS_MODULE
;
325 priv
->adap
.algo
= &priv
->algo
;
326 priv
->adap
.algo_data
= priv
;
327 priv
->adap
.dev
.parent
= &parent
->dev
;
328 priv
->adap
.retries
= parent
->retries
;
329 priv
->adap
.timeout
= parent
->timeout
;
330 priv
->adap
.quirks
= parent
->quirks
;
331 if (muxc
->mux_locked
)
332 priv
->adap
.lock_ops
= &i2c_mux_lock_ops
;
334 priv
->adap
.lock_ops
= &i2c_parent_lock_ops
;
336 /* Sanity check on class */
337 if (i2c_mux_parent_classes(parent
) & class)
338 dev_err(&parent
->dev
,
339 "Segment %d behind mux can't share classes with ancestors\n",
342 priv
->adap
.class = class;
345 * Try to populate the mux adapter's of_node, expands to
346 * nothing if !CONFIG_OF.
348 if (muxc
->dev
->of_node
) {
349 struct device_node
*dev_node
= muxc
->dev
->of_node
;
350 struct device_node
*mux_node
, *child
= NULL
;
353 if (muxc
->arbitrator
)
354 mux_node
= of_get_child_by_name(dev_node
, "i2c-arb");
356 mux_node
= of_get_child_by_name(dev_node
, "i2c-gate");
358 mux_node
= of_get_child_by_name(dev_node
, "i2c-mux");
361 /* A "reg" property indicates an old-style DT entry */
362 if (!of_property_read_u32(mux_node
, "reg", ®
)) {
363 of_node_put(mux_node
);
369 mux_node
= of_node_get(dev_node
);
370 else if (muxc
->arbitrator
|| muxc
->gate
)
371 child
= of_node_get(mux_node
);
374 for_each_child_of_node(mux_node
, child
) {
375 ret
= of_property_read_u32(child
, "reg", ®
);
383 priv
->adap
.dev
.of_node
= child
;
384 of_node_put(mux_node
);
388 * Associate the mux channel with an ACPI node.
390 if (has_acpi_companion(muxc
->dev
))
391 acpi_preset_companion(&priv
->adap
.dev
,
392 ACPI_COMPANION(muxc
->dev
),
396 priv
->adap
.nr
= force_nr
;
397 ret
= i2c_add_numbered_adapter(&priv
->adap
);
399 dev_err(&parent
->dev
,
400 "failed to add mux-adapter %u as bus %u (error=%d)\n",
401 chan_id
, force_nr
, ret
);
405 ret
= i2c_add_adapter(&priv
->adap
);
407 dev_err(&parent
->dev
,
408 "failed to add mux-adapter %u (error=%d)\n",
414 WARN(sysfs_create_link(&priv
->adap
.dev
.kobj
, &muxc
->dev
->kobj
,
416 "can't create symlink to mux device\n");
418 snprintf(symlink_name
, sizeof(symlink_name
), "channel-%u", chan_id
);
419 WARN(sysfs_create_link(&muxc
->dev
->kobj
, &priv
->adap
.dev
.kobj
,
421 "can't create symlink to channel %u\n", chan_id
);
422 dev_info(&parent
->dev
, "Added multiplexed i2c bus %d\n",
423 i2c_adapter_id(&priv
->adap
));
425 muxc
->adapter
[muxc
->num_adapters
++] = &priv
->adap
;
432 EXPORT_SYMBOL_GPL(i2c_mux_add_adapter
);
434 void i2c_mux_del_adapters(struct i2c_mux_core
*muxc
)
436 char symlink_name
[20];
438 while (muxc
->num_adapters
) {
439 struct i2c_adapter
*adap
= muxc
->adapter
[--muxc
->num_adapters
];
440 struct i2c_mux_priv
*priv
= adap
->algo_data
;
441 struct device_node
*np
= adap
->dev
.of_node
;
443 muxc
->adapter
[muxc
->num_adapters
] = NULL
;
445 snprintf(symlink_name
, sizeof(symlink_name
),
446 "channel-%u", priv
->chan_id
);
447 sysfs_remove_link(&muxc
->dev
->kobj
, symlink_name
);
449 sysfs_remove_link(&priv
->adap
.dev
.kobj
, "mux_device");
450 i2c_del_adapter(adap
);
455 EXPORT_SYMBOL_GPL(i2c_mux_del_adapters
);
457 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
458 MODULE_DESCRIPTION("I2C driver for multiplexed I2C busses");
459 MODULE_LICENSE("GPL v2");