1 ========================== 1 ========================== 2 Kernel driver i2c-mux-gpio 2 Kernel driver i2c-mux-gpio 3 ========================== 3 ========================== 4 4 5 Author: Peter Korsgaard <peter.korsgaard@barco. 5 Author: Peter Korsgaard <peter.korsgaard@barco.com> 6 6 7 Description 7 Description 8 ----------- 8 ----------- 9 9 10 i2c-mux-gpio is an i2c mux driver providing ac 10 i2c-mux-gpio is an i2c mux driver providing access to I2C bus segments 11 from a master I2C bus and a hardware MUX contr 11 from a master I2C bus and a hardware MUX controlled through GPIO pins. 12 12 13 E.G.:: 13 E.G.:: 14 14 15 ---------- ---------- Bus segm 15 ---------- ---------- Bus segment 1 - - - - - 16 | | SCL/SDA | |--------- 16 | | SCL/SDA | |-------------- | | 17 | |------------| | 17 | |------------| | 18 | | | | Bus segm 18 | | | | Bus segment 2 | | 19 | Linux | GPIO 1..N | MUX |--------- 19 | Linux | GPIO 1..N | MUX |--------------- Devices 20 | |------------| | 20 | |------------| | | | 21 | | | | Bus segm 21 | | | | Bus segment M 22 | | | |--------- 22 | | | |---------------| | 23 ---------- ---------- 23 ---------- ---------- - - - - - 24 24 25 SCL/SDA of the master I2C bus is multiplexed t 25 SCL/SDA of the master I2C bus is multiplexed to bus segment 1..M 26 according to the settings of the GPIO pins 1.. 26 according to the settings of the GPIO pins 1..N. 27 27 28 Usage 28 Usage 29 ----- 29 ----- 30 30 31 i2c-mux-gpio uses the platform bus, so you nee 31 i2c-mux-gpio uses the platform bus, so you need to provide a struct 32 platform_device with the platform_data pointin 32 platform_device with the platform_data pointing to a struct 33 i2c_mux_gpio_platform_data with the I2C adapte 33 i2c_mux_gpio_platform_data with the I2C adapter number of the master 34 bus, the number of bus segments to create and 34 bus, the number of bus segments to create and the GPIO pins used 35 to control it. See include/linux/platform_data 35 to control it. See include/linux/platform_data/i2c-mux-gpio.h for details. 36 36 37 E.G. something like this for a MUX providing 4 37 E.G. something like this for a MUX providing 4 bus segments 38 controlled through 3 GPIO pins:: 38 controlled through 3 GPIO pins:: 39 39 40 #include <linux/platform_data/i2c-mux-gpio.h 40 #include <linux/platform_data/i2c-mux-gpio.h> 41 #include <linux/platform_device.h> 41 #include <linux/platform_device.h> 42 42 43 static const unsigned myboard_gpiomux_gpios[ 43 static const unsigned myboard_gpiomux_gpios[] = { 44 AT91_PIN_PC26, AT91_PIN_PC25, AT91_PIN 44 AT91_PIN_PC26, AT91_PIN_PC25, AT91_PIN_PC24 45 }; 45 }; 46 46 47 static const unsigned myboard_gpiomux_values 47 static const unsigned myboard_gpiomux_values[] = { 48 0, 1, 2, 3 48 0, 1, 2, 3 49 }; 49 }; 50 50 51 static struct i2c_mux_gpio_platform_data myb 51 static struct i2c_mux_gpio_platform_data myboard_i2cmux_data = { 52 .parent = 1, 52 .parent = 1, 53 .base_nr = 2, /* optional */ 53 .base_nr = 2, /* optional */ 54 .values = myboard_gpiomux_valu 54 .values = myboard_gpiomux_values, 55 .n_values = ARRAY_SIZE(myboard_g 55 .n_values = ARRAY_SIZE(myboard_gpiomux_values), 56 .gpios = myboard_gpiomux_gpio 56 .gpios = myboard_gpiomux_gpios, 57 .n_gpios = ARRAY_SIZE(myboard_g 57 .n_gpios = ARRAY_SIZE(myboard_gpiomux_gpios), 58 .idle = 4, /* optional */ 58 .idle = 4, /* optional */ 59 }; 59 }; 60 60 61 static struct platform_device myboard_i2cmux 61 static struct platform_device myboard_i2cmux = { 62 .name = "i2c-mux-gpio", 62 .name = "i2c-mux-gpio", 63 .id = 0, 63 .id = 0, 64 .dev = { 64 .dev = { 65 .platform_data = &myboard_i2c 65 .platform_data = &myboard_i2cmux_data, 66 }, 66 }, 67 }; 67 }; 68 68 69 If you don't know the absolute GPIO pin number 69 If you don't know the absolute GPIO pin numbers at registration time, 70 you can instead provide a chip name (.chip_nam 70 you can instead provide a chip name (.chip_name) and relative GPIO pin 71 numbers, and the i2c-mux-gpio driver will do t 71 numbers, and the i2c-mux-gpio driver will do the work for you, 72 including deferred probing if the GPIO chip is 72 including deferred probing if the GPIO chip isn't immediately 73 available. 73 available. 74 74 75 Device Registration 75 Device Registration 76 ------------------- 76 ------------------- 77 77 78 When registering your i2c-mux-gpio device, you 78 When registering your i2c-mux-gpio device, you should pass the number 79 of any GPIO pin it uses as the device ID. This 79 of any GPIO pin it uses as the device ID. This guarantees that every 80 instance has a different ID. 80 instance has a different ID. 81 81 82 Alternatively, if you don't need a stable devi 82 Alternatively, if you don't need a stable device name, you can simply 83 pass PLATFORM_DEVID_AUTO as the device ID, and 83 pass PLATFORM_DEVID_AUTO as the device ID, and the platform core will 84 assign a dynamic ID to your device. If you do 84 assign a dynamic ID to your device. If you do not know the absolute 85 GPIO pin numbers at registration time, this is 85 GPIO pin numbers at registration time, this is even the only option.
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.