From 28482b0cc7c4859ca9723ad29edd134ddbd7924a Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E6=9F=AF=E9=A3=9E=E9=9B=84?= Date: Thu, 13 May 2010 14:09:48 +0000 Subject: [PATCH] mod i2c --- arch/arm/mach-rk2818/board-midsdk.c | 84 +++++++++++------------------ arch/arm/mach-rk2818/devices.c | 6 +++ arch/arm/mach-rk2818/devices.h | 2 + 3 files changed, 38 insertions(+), 54 deletions(-) diff --git a/arch/arm/mach-rk2818/board-midsdk.c b/arch/arm/mach-rk2818/board-midsdk.c index 0dcffa541787..3b789a2f63d6 100644 --- a/arch/arm/mach-rk2818/board-midsdk.c +++ b/arch/arm/mach-rk2818/board-midsdk.c @@ -150,20 +150,35 @@ static struct map_desc rk2818_io_desc[] __initdata = { /***************************************************************************************** * I2C devices *author: kfx - *****************************************************************************************/ -static struct rk2818_i2c_platform_data default_i2c0_data __initdata = { +*****************************************************************************************/ + void rk2818_i2c0_cfg_gpio(struct platform_device *dev) +{ + rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, IOMUXA_I2C0); +} + +void rk2818_i2c1_cfg_gpio(struct platform_device *dev) +{ + rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1); +} +struct rk2818_i2c_platform_data default_i2c0_data __initdata = { .bus_num = 0, .flags = 0, .slave_addr = 0xff, .scl_rate = 400*1000, .clk_id = "i2c0", + .cfg_gpio = rk2818_i2c0_cfg_gpio, }; -static struct rk2818_i2c_platform_data default_i2c1_data __initdata = { +struct rk2818_i2c_platform_data default_i2c1_data __initdata = { +#ifdef CONFIG_I2C0_RK2818 .bus_num = 1, +#else + .bus_num = 0, +#endif .flags = 0, .slave_addr = 0xff, .scl_rate = 400*1000, .clk_id = "i2c1", + .cfg_gpio = rk2818_i2c1_cfg_gpio, }; static struct i2c_board_info __initdata board_i2c0_devices[] = { @@ -209,57 +224,7 @@ static struct i2c_board_info __initdata board_i2c1_devices[] = { {} }; -static void rk2818_i2c0_cfg_gpio(struct platform_device *dev) -{ - rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, IOMUXA_I2C0); -} - -static void rk2818_i2c1_cfg_gpio(struct platform_device *dev) -{ - rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1); -} - - -static void __init rk2818_i2c0_set_platdata(struct rk2818_i2c_platform_data *pd) -{ - struct rk2818_i2c_platform_data *npd; - - if (!pd) - pd = &default_i2c0_data; - - npd = kmemdup(pd, sizeof(struct rk2818_i2c_platform_data), GFP_KERNEL); - if (!npd) - printk(KERN_ERR "%s: no memory for platform data\n", __func__); - else if (!npd->cfg_gpio) - npd->cfg_gpio = rk2818_i2c0_cfg_gpio; - - rk2818_device_i2c0.dev.platform_data = npd; -} -static void __init rk2818_i2c1_set_platdata(struct rk2818_i2c_platform_data *pd) -{ - struct rk2818_i2c_platform_data *npd; - - if (!pd) - pd = &default_i2c1_data; - - npd = kmemdup(pd, sizeof(struct rk2818_i2c_platform_data), GFP_KERNEL); - if (!npd) - printk(KERN_ERR "%s: no memory for platform data\n", __func__); - else if (!npd->cfg_gpio) - npd->cfg_gpio = rk2818_i2c1_cfg_gpio; - rk2818_device_i2c1.dev.platform_data = npd; -} - -static void __init rk2818_i2c_board_init(void) -{ - rk2818_i2c0_set_platdata(NULL); - rk2818_i2c1_set_platdata(NULL); - i2c_register_board_info(0, board_i2c0_devices, - ARRAY_SIZE(board_i2c0_devices)); - i2c_register_board_info(1, board_i2c1_devices, - ARRAY_SIZE(board_i2c1_devices)); -} /***************************************************************************************** * SPI devices *author: lhh @@ -286,8 +251,12 @@ static struct spi_board_info board_spi_devices[] = { static struct platform_device *devices[] __initdata = { &rk2818_device_uart1, &rk2818_device_dm9k, +#ifdef CONFIG_I2C0_RK2818 &rk2818_device_i2c0, +#endif +#ifdef CONFIG_I2C1_RK2818 &rk2818_device_i2c1, +#endif &rk2818_device_spim, }; @@ -302,7 +271,14 @@ static void __init machine_rk2818_init_irq(void) static void __init machine_rk2818_board_init(void) { - rk2818_i2c_board_init(); +#ifdef CONFIG_I2C0_RK2818 + i2c_register_board_info(default_i2c0_data.bus_num, board_i2c0_devices, + ARRAY_SIZE(board_i2c0_devices)); +#endif +#ifdef CONFIG_I2C1_RK2818 + i2c_register_board_info(default_i2c1_data.bus_num, board_i2c1_devices, + ARRAY_SIZE(board_i2c1_devices)); +#endif platform_add_devices(devices, ARRAY_SIZE(devices)); spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices)); rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,IOMUXA_GPIO0_B4); //IOMUXA_SPI0_CSN0);//use for gpio SPI CS0 diff --git a/arch/arm/mach-rk2818/devices.c b/arch/arm/mach-rk2818/devices.c index 6e9b05b01c11..8b27b4c5ccde 100644 --- a/arch/arm/mach-rk2818/devices.c +++ b/arch/arm/mach-rk2818/devices.c @@ -107,12 +107,18 @@ struct platform_device rk2818_device_i2c0 = { .id = 0, .num_resources = ARRAY_SIZE(resources_i2c0), .resource = resources_i2c0, + .dev = { + .platform_data = &default_i2c0_data, + }, }; struct platform_device rk2818_device_i2c1 = { .name = "rk2818_i2c", .id = 1, .num_resources = ARRAY_SIZE(resources_i2c1), .resource = resources_i2c1, + .dev = { + .platform_data = &default_i2c1_data, + }, }; struct platform_device rk2818_device_uart0 = { diff --git a/arch/arm/mach-rk2818/devices.h b/arch/arm/mach-rk2818/devices.h index 0ef2452a3ca8..b3cc29876210 100644 --- a/arch/arm/mach-rk2818/devices.h +++ b/arch/arm/mach-rk2818/devices.h @@ -23,6 +23,8 @@ extern struct platform_device rk2818_device_uart3; extern struct platform_device rk2818_device_spim; extern struct platform_device rk2818_device_i2c0; extern struct platform_device rk2818_device_i2c1; +extern struct rk2818_i2c_platform_data default_i2c0_data; +extern struct rk2818_i2c_platform_data default_i2c1_data; extern struct platform_device rk2818_device_dm9k; #endif -- 2.34.1