diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-10 17:09:13 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-10 17:09:13 -0800 |
commit | 8adbf8d46718a8f110de55ec82c40d04d0c362cc (patch) | |
tree | dbaf7109edaaa26496e131e6644074fbcb75c75d /Documentation | |
parent | 0be8c8bd1de21d75ef14eb6af35b664f70a35746 (diff) | |
parent | 0cc43a1806f078f7fd414850d8f1f1761696e4af (diff) | |
download | kernel-common-8adbf8d46718a8f110de55ec82c40d04d0c362cc.tar.gz kernel-common-8adbf8d46718a8f110de55ec82c40d04d0c362cc.tar.bz2 kernel-common-8adbf8d46718a8f110de55ec82c40d04d0c362cc.zip |
Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging
* 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
i2c: Constify i2c_client where possible
i2c-algo-bit: Complain about masters which can't read SCL
i2c-algo-bit: Refactor adapter registration
i2c: Add generic I2C multiplexer using GPIO API
i2c-nforce2: Remove unnecessary cast of pci_get_drvdata
i2c-i801: Include <linux/slab.h>
Diffstat (limited to 'Documentation')
-rw-r--r-- | Documentation/i2c/muxes/gpio-i2cmux | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/Documentation/i2c/muxes/gpio-i2cmux b/Documentation/i2c/muxes/gpio-i2cmux new file mode 100644 index 000000000000..811cd78d4cdc --- /dev/null +++ b/Documentation/i2c/muxes/gpio-i2cmux @@ -0,0 +1,65 @@ +Kernel driver gpio-i2cmux + +Author: Peter Korsgaard <peter.korsgaard@barco.com> + +Description +----------- + +gpio-i2cmux is an i2c mux driver providing access to I2C bus segments +from a master I2C bus and a hardware MUX controlled through GPIO pins. + +E.G.: + + ---------- ---------- Bus segment 1 - - - - - + | | SCL/SDA | |-------------- | | + | |------------| | + | | | | Bus segment 2 | | + | Linux | GPIO 1..N | MUX |--------------- Devices + | |------------| | | | + | | | | Bus segment M + | | | |---------------| | + ---------- ---------- - - - - - + +SCL/SDA of the master I2C bus is multiplexed to bus segment 1..M +according to the settings of the GPIO pins 1..N. + +Usage +----- + +gpio-i2cmux uses the platform bus, so you need to provide a struct +platform_device with the platform_data pointing to a struct +gpio_i2cmux_platform_data with the I2C adapter number of the master +bus, the number of bus segments to create and the GPIO pins used +to control it. See include/linux/gpio-i2cmux.h for details. + +E.G. something like this for a MUX providing 4 bus segments +controlled through 3 GPIO pins: + +#include <linux/gpio-i2cmux.h> +#include <linux/platform_device.h> + +static const unsigned myboard_gpiomux_gpios[] = { + AT91_PIN_PC26, AT91_PIN_PC25, AT91_PIN_PC24 +}; + +static const unsigned myboard_gpiomux_values[] = { + 0, 1, 2, 3 +}; + +static struct gpio_i2cmux_platform_data myboard_i2cmux_data = { + .parent = 1, + .base_nr = 2, /* optional */ + .values = myboard_gpiomux_values, + .n_values = ARRAY_SIZE(myboard_gpiomux_values), + .gpios = myboard_gpiomux_gpios, + .n_gpios = ARRAY_SIZE(myboard_gpiomux_gpios), + .idle = 4, /* optional */ +}; + +static struct platform_device myboard_i2cmux = { + .name = "gpio-i2cmux", + .id = 0, + .dev = { + .platform_data = &myboard_i2cmux_data, + }, +}; |