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 static void i2c_mux_lock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
132 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
133 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
135 rt_mutex_lock_nested(&parent
->mux_lock
, i2c_adapter_depth(adapter
));
136 if (!(flags
& I2C_LOCK_ROOT_ADAPTER
))
138 i2c_lock_bus(parent
, flags
);
141 static int i2c_mux_trylock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
143 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
144 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
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 */
156 static void i2c_mux_unlock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
158 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
159 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
161 if (flags
& I2C_LOCK_ROOT_ADAPTER
)
162 i2c_unlock_bus(parent
, flags
);
163 rt_mutex_unlock(&parent
->mux_lock
);
166 static void i2c_parent_lock_bus(struct i2c_adapter
*adapter
,
169 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
170 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
172 rt_mutex_lock_nested(&parent
->mux_lock
, i2c_adapter_depth(adapter
));
173 i2c_lock_bus(parent
, flags
);
176 static int i2c_parent_trylock_bus(struct i2c_adapter
*adapter
,
179 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
180 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
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 */
190 static void i2c_parent_unlock_bus(struct i2c_adapter
*adapter
,
193 struct i2c_mux_priv
*priv
= adapter
->algo_data
;
194 struct i2c_adapter
*parent
= priv
->muxc
->parent
;
196 i2c_unlock_bus(parent
, flags
);
197 rt_mutex_unlock(&parent
->mux_lock
);
200 struct i2c_adapter
*i2c_root_adapter(struct device
*dev
)
203 struct i2c_adapter
*i2c_root
;
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.
210 for (i2c
= dev
; i2c
; i2c
= i2c
->parent
) {
211 if (i2c
->type
== &i2c_adapter_type
)
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
);
224 EXPORT_SYMBOL_GPL(i2c_root_adapter
);
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
))
232 struct i2c_mux_core
*muxc
;
235 mux_size
= struct_size(muxc
, adapter
, max_adapters
);
236 muxc
= devm_kzalloc(dev
, size_add(mux_size
, sizeof_priv
), GFP_KERNEL
);
240 muxc
->priv
= &muxc
->adapter
[max_adapters
];
242 muxc
->parent
= parent
;
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
)
250 muxc
->select
= select
;
251 muxc
->deselect
= deselect
;
252 muxc
->max_adapters
= max_adapters
;
256 EXPORT_SYMBOL_GPL(i2c_mux_alloc
);
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
,
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
,
270 int i2c_mux_add_adapter(struct i2c_mux_core
*muxc
,
271 u32 force_nr
, u32 chan_id
)
273 struct i2c_adapter
*parent
= muxc
->parent
;
274 struct i2c_mux_priv
*priv
;
275 char symlink_name
[20];
278 if (muxc
->num_adapters
>= muxc
->max_adapters
) {
279 dev_err(muxc
->dev
, "No room for more i2c-mux adapters\n");
283 priv
= kzalloc(sizeof(*priv
), GFP_KERNEL
);
287 /* Set up private adapter data */
289 priv
->chan_id
= chan_id
;
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.
294 if (parent
->algo
->master_xfer
) {
295 if (muxc
->mux_locked
)
296 priv
->algo
.master_xfer
= i2c_mux_master_xfer
;
298 priv
->algo
.master_xfer
= __i2c_mux_master_xfer
;
300 if (parent
->algo
->master_xfer_atomic
)
301 priv
->algo
.master_xfer_atomic
= priv
->algo
.master_xfer
;
303 if (parent
->algo
->smbus_xfer
) {
304 if (muxc
->mux_locked
)
305 priv
->algo
.smbus_xfer
= i2c_mux_smbus_xfer
;
307 priv
->algo
.smbus_xfer
= __i2c_mux_smbus_xfer
;
309 if (parent
->algo
->smbus_xfer_atomic
)
310 priv
->algo
.smbus_xfer_atomic
= priv
->algo
.smbus_xfer
;
312 priv
->algo
.functionality
= i2c_mux_functionality
;
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
;
327 priv
->adap
.lock_ops
= &i2c_parent_lock_ops
;
330 * Try to populate the mux adapter's of_node, expands to
331 * nothing if !CONFIG_OF.
333 if (muxc
->dev
->of_node
) {
334 struct device_node
*dev_node
= muxc
->dev
->of_node
;
335 struct device_node
*mux_node
, *child
= NULL
;
338 if (muxc
->arbitrator
)
339 mux_node
= of_get_child_by_name(dev_node
, "i2c-arb");
341 mux_node
= of_get_child_by_name(dev_node
, "i2c-gate");
343 mux_node
= of_get_child_by_name(dev_node
, "i2c-mux");
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
);
354 mux_node
= of_node_get(dev_node
);
355 else if (muxc
->arbitrator
|| muxc
->gate
)
356 child
= of_node_get(mux_node
);
359 for_each_child_of_node(mux_node
, child
) {
360 ret
= of_property_read_u32(child
, "reg", ®
);
368 priv
->adap
.dev
.of_node
= child
;
369 of_node_put(mux_node
);
373 * Associate the mux channel with an ACPI node.
375 if (has_acpi_companion(muxc
->dev
))
376 acpi_preset_companion(&priv
->adap
.dev
,
377 ACPI_COMPANION(muxc
->dev
),
381 priv
->adap
.nr
= force_nr
;
382 ret
= i2c_add_numbered_adapter(&priv
->adap
);
384 dev_err(&parent
->dev
,
385 "failed to add mux-adapter %u as bus %u (error=%d)\n",
386 chan_id
, force_nr
, ret
);
390 ret
= i2c_add_adapter(&priv
->adap
);
392 dev_err(&parent
->dev
,
393 "failed to add mux-adapter %u (error=%d)\n",
399 WARN(sysfs_create_link(&priv
->adap
.dev
.kobj
, &muxc
->dev
->kobj
,
401 "can't create symlink to mux device\n");
403 snprintf(symlink_name
, sizeof(symlink_name
), "channel-%u", chan_id
);
404 WARN(sysfs_create_link(&muxc
->dev
->kobj
, &priv
->adap
.dev
.kobj
,
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
));
410 muxc
->adapter
[muxc
->num_adapters
++] = &priv
->adap
;
417 EXPORT_SYMBOL_GPL(i2c_mux_add_adapter
);
419 void i2c_mux_del_adapters(struct i2c_mux_core
*muxc
)
421 char symlink_name
[20];
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
;
428 muxc
->adapter
[muxc
->num_adapters
] = NULL
;
430 snprintf(symlink_name
, sizeof(symlink_name
),
431 "channel-%u", priv
->chan_id
);
432 sysfs_remove_link(&muxc
->dev
->kobj
, symlink_name
);
434 sysfs_remove_link(&priv
->adap
.dev
.kobj
, "mux_device");
435 i2c_del_adapter(adap
);
440 EXPORT_SYMBOL_GPL(i2c_mux_del_adapters
);
442 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
443 MODULE_DESCRIPTION("I2C driver for multiplexed I2C busses");
444 MODULE_LICENSE("GPL v2");