xref: /openbmc/linux/drivers/i2c/i2c-mux.c (revision 293d5b43)
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 
30 /* multiplexer per channel data */
31 struct i2c_mux_priv {
32 	struct i2c_adapter adap;
33 	struct i2c_algorithm algo;
34 	struct i2c_mux_core *muxc;
35 	u32 chan_id;
36 };
37 
38 static int __i2c_mux_master_xfer(struct i2c_adapter *adap,
39 				 struct i2c_msg msgs[], int num)
40 {
41 	struct i2c_mux_priv *priv = adap->algo_data;
42 	struct i2c_mux_core *muxc = priv->muxc;
43 	struct i2c_adapter *parent = muxc->parent;
44 	int ret;
45 
46 	/* Switch to the right mux port and perform the transfer. */
47 
48 	ret = muxc->select(muxc, priv->chan_id);
49 	if (ret >= 0)
50 		ret = __i2c_transfer(parent, msgs, num);
51 	if (muxc->deselect)
52 		muxc->deselect(muxc, priv->chan_id);
53 
54 	return ret;
55 }
56 
57 static int i2c_mux_master_xfer(struct i2c_adapter *adap,
58 			       struct i2c_msg msgs[], int num)
59 {
60 	struct i2c_mux_priv *priv = adap->algo_data;
61 	struct i2c_mux_core *muxc = priv->muxc;
62 	struct i2c_adapter *parent = muxc->parent;
63 	int ret;
64 
65 	/* Switch to the right mux port and perform the transfer. */
66 
67 	ret = muxc->select(muxc, priv->chan_id);
68 	if (ret >= 0)
69 		ret = i2c_transfer(parent, msgs, num);
70 	if (muxc->deselect)
71 		muxc->deselect(muxc, priv->chan_id);
72 
73 	return ret;
74 }
75 
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)
80 {
81 	struct i2c_mux_priv *priv = adap->algo_data;
82 	struct i2c_mux_core *muxc = priv->muxc;
83 	struct i2c_adapter *parent = muxc->parent;
84 	int ret;
85 
86 	/* Select the right mux port and perform the transfer. */
87 
88 	ret = muxc->select(muxc, priv->chan_id);
89 	if (ret >= 0)
90 		ret = parent->algo->smbus_xfer(parent, addr, flags,
91 					read_write, command, size, data);
92 	if (muxc->deselect)
93 		muxc->deselect(muxc, priv->chan_id);
94 
95 	return ret;
96 }
97 
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)
102 {
103 	struct i2c_mux_priv *priv = adap->algo_data;
104 	struct i2c_mux_core *muxc = priv->muxc;
105 	struct i2c_adapter *parent = muxc->parent;
106 	int ret;
107 
108 	/* Select the right mux port and perform the transfer. */
109 
110 	ret = muxc->select(muxc, priv->chan_id);
111 	if (ret >= 0)
112 		ret = i2c_smbus_xfer(parent, addr, flags,
113 				     read_write, command, size, data);
114 	if (muxc->deselect)
115 		muxc->deselect(muxc, priv->chan_id);
116 
117 	return ret;
118 }
119 
120 /* Return the parent's functionality */
121 static u32 i2c_mux_functionality(struct i2c_adapter *adap)
122 {
123 	struct i2c_mux_priv *priv = adap->algo_data;
124 	struct i2c_adapter *parent = priv->muxc->parent;
125 
126 	return parent->algo->functionality(parent);
127 }
128 
129 /* Return all parent classes, merged */
130 static unsigned int i2c_mux_parent_classes(struct i2c_adapter *parent)
131 {
132 	unsigned int class = 0;
133 
134 	do {
135 		class |= parent->class;
136 		parent = i2c_parent_is_i2c_adapter(parent);
137 	} while (parent);
138 
139 	return class;
140 }
141 
142 static void i2c_mux_lock_bus(struct i2c_adapter *adapter, unsigned int flags)
143 {
144 	struct i2c_mux_priv *priv = adapter->algo_data;
145 	struct i2c_adapter *parent = priv->muxc->parent;
146 
147 	rt_mutex_lock(&parent->mux_lock);
148 	if (!(flags & I2C_LOCK_ROOT_ADAPTER))
149 		return;
150 	i2c_lock_bus(parent, flags);
151 }
152 
153 static int i2c_mux_trylock_bus(struct i2c_adapter *adapter, unsigned int flags)
154 {
155 	struct i2c_mux_priv *priv = adapter->algo_data;
156 	struct i2c_adapter *parent = priv->muxc->parent;
157 
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 (parent->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 */
166 }
167 
168 static void i2c_mux_unlock_bus(struct i2c_adapter *adapter, unsigned int flags)
169 {
170 	struct i2c_mux_priv *priv = adapter->algo_data;
171 	struct i2c_adapter *parent = priv->muxc->parent;
172 
173 	if (flags & I2C_LOCK_ROOT_ADAPTER)
174 		i2c_unlock_bus(parent, flags);
175 	rt_mutex_unlock(&parent->mux_lock);
176 }
177 
178 static void i2c_parent_lock_bus(struct i2c_adapter *adapter,
179 				unsigned int flags)
180 {
181 	struct i2c_mux_priv *priv = adapter->algo_data;
182 	struct i2c_adapter *parent = priv->muxc->parent;
183 
184 	rt_mutex_lock(&parent->mux_lock);
185 	i2c_lock_bus(parent, flags);
186 }
187 
188 static int i2c_parent_trylock_bus(struct i2c_adapter *adapter,
189 				  unsigned int flags)
190 {
191 	struct i2c_mux_priv *priv = adapter->algo_data;
192 	struct i2c_adapter *parent = priv->muxc->parent;
193 
194 	if (!rt_mutex_trylock(&parent->mux_lock))
195 		return 0;	/* mux_lock not locked, failure */
196 	if (parent->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 */
200 }
201 
202 static void i2c_parent_unlock_bus(struct i2c_adapter *adapter,
203 				  unsigned int flags)
204 {
205 	struct i2c_mux_priv *priv = adapter->algo_data;
206 	struct i2c_adapter *parent = priv->muxc->parent;
207 
208 	i2c_unlock_bus(parent, flags);
209 	rt_mutex_unlock(&parent->mux_lock);
210 }
211 
212 struct i2c_adapter *i2c_root_adapter(struct device *dev)
213 {
214 	struct device *i2c;
215 	struct i2c_adapter *i2c_root;
216 
217 	/*
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.
221 	 */
222 	for (i2c = dev; i2c; i2c = i2c->parent) {
223 		if (i2c->type == &i2c_adapter_type)
224 			break;
225 	}
226 	if (!i2c)
227 		return NULL;
228 
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);
233 
234 	return i2c_root;
235 }
236 EXPORT_SYMBOL_GPL(i2c_root_adapter);
237 
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))
243 {
244 	struct i2c_mux_core *muxc;
245 
246 	muxc = devm_kzalloc(dev, sizeof(*muxc)
247 			    + max_adapters * sizeof(muxc->adapter[0])
248 			    + sizeof_priv, GFP_KERNEL);
249 	if (!muxc)
250 		return NULL;
251 	if (sizeof_priv)
252 		muxc->priv = &muxc->adapter[max_adapters];
253 
254 	muxc->parent = parent;
255 	muxc->dev = dev;
256 	if (flags & I2C_MUX_LOCKED)
257 		muxc->mux_locked = true;
258 	muxc->select = select;
259 	muxc->deselect = deselect;
260 	muxc->max_adapters = max_adapters;
261 
262 	return muxc;
263 }
264 EXPORT_SYMBOL_GPL(i2c_mux_alloc);
265 
266 int i2c_mux_add_adapter(struct i2c_mux_core *muxc,
267 			u32 force_nr, u32 chan_id,
268 			unsigned int class)
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.master_xfer = i2c_mux_master_xfer;
294 		else
295 			priv->algo.master_xfer = __i2c_mux_master_xfer;
296 	}
297 	if (parent->algo->smbus_xfer) {
298 		if (muxc->mux_locked)
299 			priv->algo.smbus_xfer = i2c_mux_smbus_xfer;
300 		else
301 			priv->algo.smbus_xfer = __i2c_mux_smbus_xfer;
302 	}
303 	priv->algo.functionality = i2c_mux_functionality;
304 
305 	/* Now fill out new adapter structure */
306 	snprintf(priv->adap.name, sizeof(priv->adap.name),
307 		 "i2c-%d-mux (chan_id %d)", i2c_adapter_id(parent), chan_id);
308 	priv->adap.owner = THIS_MODULE;
309 	priv->adap.algo = &priv->algo;
310 	priv->adap.algo_data = priv;
311 	priv->adap.dev.parent = &parent->dev;
312 	priv->adap.retries = parent->retries;
313 	priv->adap.timeout = parent->timeout;
314 	priv->adap.quirks = parent->quirks;
315 	if (muxc->mux_locked) {
316 		priv->adap.lock_bus = i2c_mux_lock_bus;
317 		priv->adap.trylock_bus = i2c_mux_trylock_bus;
318 		priv->adap.unlock_bus = i2c_mux_unlock_bus;
319 	} else {
320 		priv->adap.lock_bus = i2c_parent_lock_bus;
321 		priv->adap.trylock_bus = i2c_parent_trylock_bus;
322 		priv->adap.unlock_bus = i2c_parent_unlock_bus;
323 	}
324 
325 	/* Sanity check on class */
326 	if (i2c_mux_parent_classes(parent) & class)
327 		dev_err(&parent->dev,
328 			"Segment %d behind mux can't share classes with ancestors\n",
329 			chan_id);
330 	else
331 		priv->adap.class = class;
332 
333 	/*
334 	 * Try to populate the mux adapter's of_node, expands to
335 	 * nothing if !CONFIG_OF.
336 	 */
337 	if (muxc->dev->of_node) {
338 		struct device_node *child;
339 		u32 reg;
340 
341 		for_each_child_of_node(muxc->dev->of_node, child) {
342 			ret = of_property_read_u32(child, "reg", &reg);
343 			if (ret)
344 				continue;
345 			if (chan_id == reg) {
346 				priv->adap.dev.of_node = child;
347 				break;
348 			}
349 		}
350 	}
351 
352 	/*
353 	 * Associate the mux channel with an ACPI node.
354 	 */
355 	if (has_acpi_companion(muxc->dev))
356 		acpi_preset_companion(&priv->adap.dev,
357 				      ACPI_COMPANION(muxc->dev),
358 				      chan_id);
359 
360 	if (force_nr) {
361 		priv->adap.nr = force_nr;
362 		ret = i2c_add_numbered_adapter(&priv->adap);
363 	} else {
364 		ret = i2c_add_adapter(&priv->adap);
365 	}
366 	if (ret < 0) {
367 		dev_err(&parent->dev,
368 			"failed to add mux-adapter (error=%d)\n",
369 			ret);
370 		kfree(priv);
371 		return ret;
372 	}
373 
374 	WARN(sysfs_create_link(&priv->adap.dev.kobj, &muxc->dev->kobj,
375 			       "mux_device"),
376 	     "can't create symlink to mux device\n");
377 
378 	snprintf(symlink_name, sizeof(symlink_name), "channel-%u", chan_id);
379 	WARN(sysfs_create_link(&muxc->dev->kobj, &priv->adap.dev.kobj,
380 			       symlink_name),
381 	     "can't create symlink for channel %u\n", chan_id);
382 	dev_info(&parent->dev, "Added multiplexed i2c bus %d\n",
383 		 i2c_adapter_id(&priv->adap));
384 
385 	muxc->adapter[muxc->num_adapters++] = &priv->adap;
386 	return 0;
387 }
388 EXPORT_SYMBOL_GPL(i2c_mux_add_adapter);
389 
390 void i2c_mux_del_adapters(struct i2c_mux_core *muxc)
391 {
392 	char symlink_name[20];
393 
394 	while (muxc->num_adapters) {
395 		struct i2c_adapter *adap = muxc->adapter[--muxc->num_adapters];
396 		struct i2c_mux_priv *priv = adap->algo_data;
397 
398 		muxc->adapter[muxc->num_adapters] = NULL;
399 
400 		snprintf(symlink_name, sizeof(symlink_name),
401 			 "channel-%u", priv->chan_id);
402 		sysfs_remove_link(&muxc->dev->kobj, symlink_name);
403 
404 		sysfs_remove_link(&priv->adap.dev.kobj, "mux_device");
405 		i2c_del_adapter(adap);
406 		kfree(priv);
407 	}
408 }
409 EXPORT_SYMBOL_GPL(i2c_mux_del_adapters);
410 
411 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
412 MODULE_DESCRIPTION("I2C driver for multiplexed I2C busses");
413 MODULE_LICENSE("GPL v2");
414