aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2008-10-14 11:30:05 -0400
committerJean Delvare <khali@mahadeva.delvare>2008-10-14 11:30:05 -0400
commit7c15fd1249658e203b2ac8661e48da6c2102e563 (patch)
tree273d569997d69d5606be0d76baff1354376b9c96 /Documentation
parentfceb2d06800ddae53095f63843d85fcff4f701ac (diff)
i2c: Document the implementation details of the /dev interface
I wrote this explanation to answer a question on the i2c mailing list, and thought it would be good to have in the kernel documentation. Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'Documentation')
-rw-r--r--Documentation/i2c/dev-interface45
1 files changed, 45 insertions, 0 deletions
diff --git a/Documentation/i2c/dev-interface b/Documentation/i2c/dev-interface
index 689a79ea5ce7..3e742ba25536 100644
--- a/Documentation/i2c/dev-interface
+++ b/Documentation/i2c/dev-interface
@@ -167,3 +167,48 @@ The above functions are all inline functions, that resolve to calls to
167the i2c_smbus_access function, that on its turn calls a specific ioctl 167the i2c_smbus_access function, that on its turn calls a specific ioctl
168with the data in a specific format. Read the source code if you 168with the data in a specific format. Read the source code if you
169want to know what happens behind the screens. 169want to know what happens behind the screens.
170
171
172Implementation details
173======================
174
175For the interested, here's the code flow which happens inside the kernel
176when you use the /dev interface to I2C:
177
1781* Your program opens /dev/i2c-N and calls ioctl() on it, as described in
179section "C example" above.
180
1812* These open() and ioctl() calls are handled by the i2c-dev kernel
182driver: see i2c-dev.c:i2cdev_open() and i2c-dev.c:i2cdev_ioctl(),
183respectively. You can think of i2c-dev as a generic I2C chip driver
184that can be programmed from user-space.
185
1863* Some ioctl() calls are for administrative tasks and are handled by
187i2c-dev directly. Examples include I2C_SLAVE (set the address of the
188device you want to access) and I2C_PEC (enable or disable SMBus error
189checking on future transactions.)
190
1914* Other ioctl() calls are converted to in-kernel function calls by
192i2c-dev. Examples include I2C_FUNCS, which queries the I2C adapter
193functionality using i2c.h:i2c_get_functionality(), and I2C_SMBUS, which
194performs an SMBus transaction using i2c-core.c:i2c_smbus_xfer().
195
196The i2c-dev driver is responsible for checking all the parameters that
197come from user-space for validity. After this point, there is no
198difference between these calls that came from user-space through i2c-dev
199and calls that would have been performed by kernel I2C chip drivers
200directly. This means that I2C bus drivers don't need to implement
201anything special to support access from user-space.
202
2035* These i2c-core.c/i2c.h functions are wrappers to the actual
204implementation of your I2C bus driver. Each adapter must declare
205callback functions implementing these standard calls.
206i2c.h:i2c_get_functionality() calls i2c_adapter.algo->functionality(),
207while i2c-core.c:i2c_smbus_xfer() calls either
208adapter.algo->smbus_xfer() if it is implemented, or if not,
209i2c-core.c:i2c_smbus_xfer_emulated() which in turn calls
210i2c_adapter.algo->master_xfer().
211
212After your I2C bus driver has processed these requests, execution runs
213up the call chain, with almost no processing done, except by i2c-dev to
214package the returned data, if any, in suitable format for the ioctl.