rk30: i2c: gpio i2c support
authorkfx <kfx@rock-chips.com>
Fri, 13 Apr 2012 03:14:32 +0000 (11:14 +0800)
committerkfx <kfx@rock-chips.com>
Fri, 13 Apr 2012 03:14:32 +0000 (11:14 +0800)
arch/arm/mach-rk30/board-rk30-sdk.c
arch/arm/mach-rk30/devices.c
arch/arm/mach-rk30/include/mach/board.h
drivers/i2c/busses/Kconfig
drivers/i2c/busses/i2c-rk30.c

index f3409c635c6e31add0ac9ec47b4f64b6cf275848..b846d405a79366a9bcae7dc980b1629fe61f14ab 100755 (executable)
@@ -1283,6 +1283,29 @@ static struct i2c_board_info __initdata i2c4_info[] = {
 };
 #endif
 
+#ifdef CONFIG_I2C_GPIO_RK30
+#define I2C_SDA_PIN     INVALID_GPIO// RK30_PIN2_PD6   //set sda_pin here
+#define I2C_SCL_PIN     INVALID_GPIO//RK30_PIN2_PD7   //set scl_pin here
+static int rk30_i2c_io_init(void)
+{
+        //set iomux (gpio) here
+        //rk30_mux_api_set(GPIO2D7_I2C1SCL_NAME, GPIO2D_GPIO2D7);
+        //rk30_mux_api_set(GPIO2D6_I2C1SDA_NAME, GPIO2D_GPIO2D6);
+
+        return 0;
+}
+struct i2c_gpio_platform_data default_i2c_gpio_data = {
+       .sda_pin = I2C_SDA_PIN,
+       .scl_pin = I2C_SCL_PIN,
+       .udelay = 5, // clk = 500/udelay = 100Khz
+       .timeout = 100,//msecs_to_jiffies(100),
+       .bus_num    = 5,
+       .io_init = rk30_i2c_io_init,
+};
+static struct i2c_board_info __initdata i2c_gpio_info[] = {
+};
+#endif
+
 static void __init rk30_i2c_register_board_info(void)
 {
 #ifdef CONFIG_I2C0_RK30
@@ -1300,6 +1323,9 @@ static void __init rk30_i2c_register_board_info(void)
 #ifdef CONFIG_I2C4_RK30
        i2c_register_board_info(4, i2c4_info, ARRAY_SIZE(i2c4_info));
 #endif
+#ifdef CONFIG_I2C_GPIO_RK30
+       i2c_register_board_info(5, i2c_gpio_info, ARRAY_SIZE(i2c_gpio_info));
+#endif
 }
 //end of i2c
 
index dc0677036f61a564ceeebf651953805d1629424d..2fa28801e199202b014707283b246e94f528888b 100755 (executable)
@@ -522,6 +522,16 @@ static struct platform_device device_i2c4 = {
 };
 #endif
 
+#ifdef CONFIG_I2C_GPIO_RK30
+struct platform_device device_i2c_gpio = {
+        .name   = "i2c-gpio",
+        .id = 5,
+        .dev            = {
+                .platform_data = &default_i2c_gpio_data,
+        },
+};
+#endif
+
 static void __init rk30_init_i2c(void)
 {
 #ifdef CONFIG_I2C0_RK30
@@ -539,6 +549,9 @@ static void __init rk30_init_i2c(void)
 #ifdef CONFIG_I2C4_RK30
        platform_device_register(&device_i2c4);
 #endif
+#ifdef CONFIG_I2C_GPIO_RK30
+       platform_device_register(&device_i2c_gpio);
+#endif
 }
 //end of i2c
 
index a8140d58a837a8379a243a39db217fd45dcd86ef..8fd9495712b1c39982b51bde61a4bc9eb3f0e9bc 100755 (executable)
@@ -10,6 +10,7 @@
 #include <asm/setup.h>
 #include <plat/board.h>
 #include <mach/sram.h>
+#include <linux/i2c-gpio.h>
 
 struct rk30_i2c_platform_data {
        char *name;
@@ -36,6 +37,10 @@ struct wifi_platform_data {
 extern struct rk29_sdmmc_platform_data default_sdmmc0_data;
 extern struct rk29_sdmmc_platform_data default_sdmmc1_data;
 
+#ifdef CONFIG_I2C_ALGOBIT
+extern struct i2c_gpio_platform_data default_i2c_gpio_data; 
+#endif
+
 void __init rk30_map_common_io(void);
 void __init rk30_init_irq(void);
 void __init rk30_map_io(void);
index 8c8b36f2b2169106a1f5d56667ae44d877fa3b53..018fad3a83d362b955864c20fdf42246f4f7db96 100644 (file)
@@ -919,6 +919,10 @@ if I2C_RK30
                                        bool "With RK30 I2C Controller"
                        endchoice
                endif
+        config I2C_GPIO_RK30
+                bool "Simulation with GPIO"
+                default n
+                select I2C_GPIO
 endif
 config I2C_RK29
        tristate "RK29 i2c interface (I2C)"
index 63dd362af514e451ddbccc344710282f5d6de6d1..1438279ecf3ba661244a7c9c564e5468aa8d3264 100755 (executable)
 #define TX_SETUP                        1 //unit us
 void i2c_adap_sel(struct rk30_i2c *i2c, int nr, int adap_type)
 {
-        unsigned int p = readl(i2c->con_base);
-
-        p = rk30_set_bit(p, adap_type, I2C_ADAP_SEL_BIT(nr));
-        p = rk30_set_bit(p, adap_type, I2C_ADAP_SEL_MASK(nr));
-        writel(p, i2c->con_base);
+        writel((1 << I2C_ADAP_SEL_BIT(nr)) | (1 << I2C_ADAP_SEL_MASK(nr)) ,
+                        i2c->con_base);
 }
 
 #ifdef CONFIG_CPU_FREQ