| 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 | }; |