mod i2c
author柯飞雄 <kfx@rock-chips.com>
Thu, 13 May 2010 14:09:48 +0000 (14:09 +0000)
committer黄涛 <huangtao@rock-chips.com>
Mon, 21 Jun 2010 05:34:53 +0000 (13:34 +0800)
arch/arm/mach-rk2818/board-midsdk.c
arch/arm/mach-rk2818/devices.c
arch/arm/mach-rk2818/devices.h

index 0dcffa5417871038bb9e811985024044a343d9aa..3b789a2f63d6a0cbbd09360a97551c4e3c69f2bd 100644 (file)
@@ -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
index 6e9b05b01c11fe82159d9298a3cc72b8984d6a50..8b27b4c5ccdea384578a0ca73cfd64a261873ef6 100644 (file)
@@ -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 = {
index 0ef2452a3ca8d135e1656b07f42ec848bdd8e212..b3cc29876210bb3adb232c2dc4a8645a37f84586 100644 (file)
@@ -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