| 1 |
Virtual i2c bus |
|---|
| 2 |
Brian Kuschak <bkuschak@xxxxxxxxx> |
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
I2C devices must have a unique 7 bit address on the bus to which they |
|---|
| 6 |
are attached. Many I2C chips have one or more input lines which can be |
|---|
| 7 |
used to configure one or more of their address bits. This allows the |
|---|
| 8 |
hardware designer to include multiple chips on a single bus by selecting |
|---|
| 9 |
different addresses for each one. However, some chips have fixed addresses |
|---|
| 10 |
which present a problem if more than one of them are required on a board. |
|---|
| 11 |
Also, sometimes there are more devices than there are selectable addresses. |
|---|
| 12 |
|
|---|
| 13 |
A common solution is to break the i2c bus into disjoint segments, by using |
|---|
| 14 |
a multiplexor or i2c bus switch. This electrically isolates the individual |
|---|
| 15 |
bus segments. Then the devices with duplicate addresses are placed on |
|---|
| 16 |
separate bus segments, to prevent address conflicts. |
|---|
| 17 |
|
|---|
| 18 |
This seems to be a very common approach in certain types of applications, |
|---|
| 19 |
such as bladed chassis, where many identical 'blades' or cards are inserted |
|---|
| 20 |
into a common backplane. The I2C bus on each blade is then located behind |
|---|
| 21 |
a mux or i2c bus switch. This solution works great from the hardware |
|---|
| 22 |
perspective, but presents some complexities for software. |
|---|
| 23 |
|
|---|
| 24 |
The 'virtual i2c adapter' driver is an attempt to provide a flexible software |
|---|
| 25 |
abstraction to simiplify these issues, while minimizing the impact on |
|---|
| 26 |
existing code and fitting nicely into the i2c driver framework. |
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 |
What is a 'virtual i2c adapter' |
|---|
| 30 |
=============================== |
|---|
| 31 |
|
|---|
| 32 |
Think of this adapter as a layer above the existing algorithm and adapter |
|---|
| 33 |
drivers. The virtual i2c adapter is the handle by which you access a |
|---|
| 34 |
specific multiplexed bus segment. Each disjoint bus segment becomes a new |
|---|
| 35 |
virtual bus. The virtual adapter is associated with a 'real' adapter and a |
|---|
| 36 |
set of multiplexor control variables. |
|---|
| 37 |
|
|---|
| 38 |
For example: you have an i2c-0 bus with one multiplexor or i2c bus switch, |
|---|
| 39 |
and the mux has four outputs which can be electrically connected to the |
|---|
| 40 |
i2c-0 bus. You would register four virtual i2c busses, one for each position |
|---|
| 41 |
of the mux. As part of the registration, you provide callback functions to |
|---|
| 42 |
select and deselect the mux as well as the selector values to be passed to |
|---|
| 43 |
these functions. |
|---|
| 44 |
|
|---|
| 45 |
--------- <--------> i2c-1 virtual |
|---|
| 46 |
| i2c mux | <--------> i2c-2 virtual |
|---|
| 47 |
i2c-0 <-------> | | <--------> i2c-3 virtual |
|---|
| 48 |
ibm_ocp | 0x74 | <--------> i2c-4 virtual |
|---|
| 49 |
--------- |
|---|
| 50 |
^ |
|---|
| 51 |
| |
|---|
| 52 |
+--- (or externally controlled) |
|---|
| 53 |
|
|---|
| 54 |
The mux may be i2c-controlled, in which case the mux_addr is set to the |
|---|
| 55 |
slave address (0x74) and the mux_val would be the port number to select (0-3). |
|---|
| 56 |
Alternatively, the mux could be controlled by some fixed memory-mapped register |
|---|
| 57 |
in which case only the mux_val would be needed. The callback functions |
|---|
| 58 |
are hardware specific and written by the user. |
|---|
| 59 |
|
|---|
| 60 |
Once the virtual busses are registered, you may talk to any devices behind |
|---|
| 61 |
the mux simply the using the i2c-1, i2c-2, i2c-3, etc. adapters instead of |
|---|
| 62 |
the i2c-0 adapter. This makes the mux essentially transparent to the |
|---|
| 63 |
i2c_client. |
|---|
| 64 |
|
|---|
| 65 |
The great advantage of course is that all the existing sensor drivers and |
|---|
| 66 |
other i2c client drivers automatically work, and the mux becomes transparent |
|---|
| 67 |
to them. |
|---|
| 68 |
|
|---|
| 69 |
|
|---|
| 70 |
Additional capabilities |
|---|
| 71 |
======================= |
|---|
| 72 |
|
|---|
| 73 |
This driver also supports multiple levels of muxing, by allowing the |
|---|
| 74 |
user to register a virtual bus which has a different virtual bus as its |
|---|
| 75 |
'real' adapter. In addition, each virtual bus may have different kinds of |
|---|
| 76 |
multiplexors, with each bus having its own set of callback functions. |
|---|
| 77 |
This allows you to easily support some very complex topologies. |
|---|
| 78 |
|
|---|
| 79 |
In addition to multiplexing, some systems require that you obtain hardware |
|---|
| 80 |
access to the bus behind the mux before talking on it. (Again, bladed chassis |
|---|
| 81 |
typically 'fence' other blades off the bus to prevent a crashed blade from |
|---|
| 82 |
bringing down the whole backplane.) Before talking on this bus, you have to |
|---|
| 83 |
arbitrate with the other blades to acquire exclusive access to the bus. This |
|---|
| 84 |
requirement is met by the addition of two new function pointers to the |
|---|
| 85 |
algorithm drivers, acquire_exclusive() and release_exclusive(). Traditional |
|---|
| 86 |
adapters will not use these and they can safely be left NULL. If they are |
|---|
| 87 |
non-null, the virtual bus driver will call the acquire_exclusive() function |
|---|
| 88 |
before attempting any operations on that virtual bus. This function may block, |
|---|
| 89 |
and this is done before acquiring the lock on the underlying 'real' bus to |
|---|
| 90 |
allow transactions on the real bus to continue unimpeded while waiting for |
|---|
| 91 |
arbitrartion. In addition the ownership is only held for as long as it takes |
|---|
| 92 |
to complete the transfer. |
|---|
| 93 |
|
|---|
| 94 |
|
|---|
| 95 |
Files |
|---|
| 96 |
===== |
|---|
| 97 |
|
|---|
| 98 |
drivers/i2c/i2c-virtual.c: The 'algorithm' and 'adapter' driver |
|---|
| 99 |
include/linux/i2c-virtual.h: Header file with the mux control structure |
|---|
| 100 |
and callback prototypes. |
|---|
| 101 |
|
|---|
| 102 |
|
|---|