8eee98634cda57839cda747708469715d6cfa271
[cascardo/linux.git] / drivers / i2c / i2c-mux.c
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");