Merge branch 'i2c-mux-dt-3' of https://github.com/peda-r/i2c-mux into i2c/for-4.9
[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 (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 */
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 (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 */
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         if (flags & I2C_MUX_ARBITRATOR)
259                 muxc->arbitrator = true;
260         if (flags & I2C_MUX_GATE)
261                 muxc->gate = true;
262         muxc->select = select;
263         muxc->deselect = deselect;
264         muxc->max_adapters = max_adapters;
265
266         return muxc;
267 }
268 EXPORT_SYMBOL_GPL(i2c_mux_alloc);
269
270 int i2c_mux_add_adapter(struct i2c_mux_core *muxc,
271                         u32 force_nr, u32 chan_id,
272                         unsigned int class)
273 {
274         struct i2c_adapter *parent = muxc->parent;
275         struct i2c_mux_priv *priv;
276         char symlink_name[20];
277         int ret;
278
279         if (muxc->num_adapters >= muxc->max_adapters) {
280                 dev_err(muxc->dev, "No room for more i2c-mux adapters\n");
281                 return -EINVAL;
282         }
283
284         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
285         if (!priv)
286                 return -ENOMEM;
287
288         /* Set up private adapter data */
289         priv->muxc = muxc;
290         priv->chan_id = chan_id;
291
292         /* Need to do algo dynamically because we don't know ahead
293          * of time what sort of physical adapter we'll be dealing with.
294          */
295         if (parent->algo->master_xfer) {
296                 if (muxc->mux_locked)
297                         priv->algo.master_xfer = i2c_mux_master_xfer;
298                 else
299                         priv->algo.master_xfer = __i2c_mux_master_xfer;
300         }
301         if (parent->algo->smbus_xfer) {
302                 if (muxc->mux_locked)
303                         priv->algo.smbus_xfer = i2c_mux_smbus_xfer;
304                 else
305                         priv->algo.smbus_xfer = __i2c_mux_smbus_xfer;
306         }
307         priv->algo.functionality = i2c_mux_functionality;
308
309         /* Now fill out new adapter structure */
310         snprintf(priv->adap.name, sizeof(priv->adap.name),
311                  "i2c-%d-mux (chan_id %d)", i2c_adapter_id(parent), chan_id);
312         priv->adap.owner = THIS_MODULE;
313         priv->adap.algo = &priv->algo;
314         priv->adap.algo_data = priv;
315         priv->adap.dev.parent = &parent->dev;
316         priv->adap.retries = parent->retries;
317         priv->adap.timeout = parent->timeout;
318         priv->adap.quirks = parent->quirks;
319         if (muxc->mux_locked) {
320                 priv->adap.lock_bus = i2c_mux_lock_bus;
321                 priv->adap.trylock_bus = i2c_mux_trylock_bus;
322                 priv->adap.unlock_bus = i2c_mux_unlock_bus;
323         } else {
324                 priv->adap.lock_bus = i2c_parent_lock_bus;
325                 priv->adap.trylock_bus = i2c_parent_trylock_bus;
326                 priv->adap.unlock_bus = i2c_parent_unlock_bus;
327         }
328
329         /* Sanity check on class */
330         if (i2c_mux_parent_classes(parent) & class)
331                 dev_err(&parent->dev,
332                         "Segment %d behind mux can't share classes with ancestors\n",
333                         chan_id);
334         else
335                 priv->adap.class = class;
336
337         /*
338          * Try to populate the mux adapter's of_node, expands to
339          * nothing if !CONFIG_OF.
340          */
341         if (muxc->dev->of_node) {
342                 struct device_node *dev_node = muxc->dev->of_node;
343                 struct device_node *mux_node, *child = NULL;
344                 u32 reg;
345
346                 if (muxc->arbitrator)
347                         mux_node = of_get_child_by_name(dev_node, "i2c-arb");
348                 else if (muxc->gate)
349                         mux_node = of_get_child_by_name(dev_node, "i2c-gate");
350                 else
351                         mux_node = of_get_child_by_name(dev_node, "i2c-mux");
352
353                 if (mux_node) {
354                         /* A "reg" property indicates an old-style DT entry */
355                         if (!of_property_read_u32(mux_node, "reg", &reg)) {
356                                 of_node_put(mux_node);
357                                 mux_node = NULL;
358                         }
359                 }
360
361                 if (!mux_node)
362                         mux_node = of_node_get(dev_node);
363                 else if (muxc->arbitrator || muxc->gate)
364                         child = of_node_get(mux_node);
365
366                 if (!child) {
367                         for_each_child_of_node(mux_node, child) {
368                                 ret = of_property_read_u32(child, "reg", &reg);
369                                 if (ret)
370                                         continue;
371                                 if (chan_id == reg)
372                                         break;
373                         }
374                 }
375
376                 priv->adap.dev.of_node = child;
377                 of_node_put(mux_node);
378         }
379
380         /*
381          * Associate the mux channel with an ACPI node.
382          */
383         if (has_acpi_companion(muxc->dev))
384                 acpi_preset_companion(&priv->adap.dev,
385                                       ACPI_COMPANION(muxc->dev),
386                                       chan_id);
387
388         if (force_nr) {
389                 priv->adap.nr = force_nr;
390                 ret = i2c_add_numbered_adapter(&priv->adap);
391         } else {
392                 ret = i2c_add_adapter(&priv->adap);
393         }
394         if (ret < 0) {
395                 dev_err(&parent->dev,
396                         "failed to add mux-adapter (error=%d)\n",
397                         ret);
398                 kfree(priv);
399                 return ret;
400         }
401
402         WARN(sysfs_create_link(&priv->adap.dev.kobj, &muxc->dev->kobj,
403                                "mux_device"),
404              "can't create symlink to mux device\n");
405
406         snprintf(symlink_name, sizeof(symlink_name), "channel-%u", chan_id);
407         WARN(sysfs_create_link(&muxc->dev->kobj, &priv->adap.dev.kobj,
408                                symlink_name),
409              "can't create symlink for channel %u\n", chan_id);
410         dev_info(&parent->dev, "Added multiplexed i2c bus %d\n",
411                  i2c_adapter_id(&priv->adap));
412
413         muxc->adapter[muxc->num_adapters++] = &priv->adap;
414         return 0;
415 }
416 EXPORT_SYMBOL_GPL(i2c_mux_add_adapter);
417
418 void i2c_mux_del_adapters(struct i2c_mux_core *muxc)
419 {
420         char symlink_name[20];
421
422         while (muxc->num_adapters) {
423                 struct i2c_adapter *adap = muxc->adapter[--muxc->num_adapters];
424                 struct i2c_mux_priv *priv = adap->algo_data;
425
426                 muxc->adapter[muxc->num_adapters] = NULL;
427
428                 snprintf(symlink_name, sizeof(symlink_name),
429                          "channel-%u", priv->chan_id);
430                 sysfs_remove_link(&muxc->dev->kobj, symlink_name);
431
432                 sysfs_remove_link(&priv->adap.dev.kobj, "mux_device");
433                 i2c_del_adapter(adap);
434                 kfree(priv);
435         }
436 }
437 EXPORT_SYMBOL_GPL(i2c_mux_del_adapters);
438
439 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
440 MODULE_DESCRIPTION("I2C driver for multiplexed I2C busses");
441 MODULE_LICENSE("GPL v2");