| Peter Korsgaard | 92ed1a7 | 2011-01-10 22:11:23 +0100 | [diff] [blame^] | 1 | Kernel driver gpio-i2cmux | 
|  | 2 |  | 
|  | 3 | Author: Peter Korsgaard <peter.korsgaard@barco.com> | 
|  | 4 |  | 
|  | 5 | Description | 
|  | 6 | ----------- | 
|  | 7 |  | 
|  | 8 | gpio-i2cmux is an i2c mux driver providing access to I2C bus segments | 
|  | 9 | from a master I2C bus and a hardware MUX controlled through GPIO pins. | 
|  | 10 |  | 
|  | 11 | E.G.: | 
|  | 12 |  | 
|  | 13 | ----------              ----------  Bus segment 1   - - - - - | 
|  | 14 | |          | SCL/SDA    |          |-------------- |           | | 
|  | 15 | |          |------------|          | | 
|  | 16 | |          |            |          | Bus segment 2 |           | | 
|  | 17 | |  Linux   | GPIO 1..N  |   MUX    |---------------   Devices | 
|  | 18 | |          |------------|          |               |           | | 
|  | 19 | |          |            |          | Bus segment M | 
|  | 20 | |          |            |          |---------------|           | | 
|  | 21 | ----------              ----------                  - - - - - | 
|  | 22 |  | 
|  | 23 | SCL/SDA of the master I2C bus is multiplexed to bus segment 1..M | 
|  | 24 | according to the settings of the GPIO pins 1..N. | 
|  | 25 |  | 
|  | 26 | Usage | 
|  | 27 | ----- | 
|  | 28 |  | 
|  | 29 | gpio-i2cmux uses the platform bus, so you need to provide a struct | 
|  | 30 | platform_device with the platform_data pointing to a struct | 
|  | 31 | gpio_i2cmux_platform_data with the I2C adapter number of the master | 
|  | 32 | bus, the number of bus segments to create and the GPIO pins used | 
|  | 33 | to control it. See include/linux/gpio-i2cmux.h for details. | 
|  | 34 |  | 
|  | 35 | E.G. something like this for a MUX providing 4 bus segments | 
|  | 36 | controlled through 3 GPIO pins: | 
|  | 37 |  | 
|  | 38 | #include <linux/gpio-i2cmux.h> | 
|  | 39 | #include <linux/platform_device.h> | 
|  | 40 |  | 
|  | 41 | static const unsigned myboard_gpiomux_gpios[] = { | 
|  | 42 | AT91_PIN_PC26, AT91_PIN_PC25, AT91_PIN_PC24 | 
|  | 43 | }; | 
|  | 44 |  | 
|  | 45 | static const unsigned myboard_gpiomux_values[] = { | 
|  | 46 | 0, 1, 2, 3 | 
|  | 47 | }; | 
|  | 48 |  | 
|  | 49 | static struct gpio_i2cmux_platform_data myboard_i2cmux_data = { | 
|  | 50 | .parent		= 1, | 
|  | 51 | .base_nr	= 2, /* optional */ | 
|  | 52 | .values		= myboard_gpiomux_values, | 
|  | 53 | .n_values	= ARRAY_SIZE(myboard_gpiomux_values), | 
|  | 54 | .gpios		= myboard_gpiomux_gpios, | 
|  | 55 | .n_gpios	= ARRAY_SIZE(myboard_gpiomux_gpios), | 
|  | 56 | .idle		= 4, /* optional */ | 
|  | 57 | }; | 
|  | 58 |  | 
|  | 59 | static struct platform_device myboard_i2cmux = { | 
|  | 60 | .name		= "gpio-i2cmux", | 
|  | 61 | .id		= 0, | 
|  | 62 | .dev		= { | 
|  | 63 | .platform_data	= &myboard_i2cmux_data, | 
|  | 64 | }, | 
|  | 65 | }; |