rk30: i2c: modify 'controller switch'
authorkfx <kfx@rock-chips.com>
Wed, 28 Mar 2012 03:39:43 +0000 (11:39 +0800)
committerkfx <kfx@rock-chips.com>
Wed, 28 Mar 2012 03:39:43 +0000 (11:39 +0800)
arch/arm/mach-rk30/include/mach/board.h
drivers/i2c/busses/i2c-rk30.c
drivers/i2c/busses/i2c-rk30.h

index 04e7222e89db57bc6bb9ce4da2fba094d2dd4ae7..9ff1d0ccfbaa65619aaf25460f4c85f277cf7ab2 100755 (executable)
@@ -15,8 +15,8 @@ struct rk30_i2c_platform_data {
        int bus_num;
 #define I2C_RK29_ADAP   0
 #define I2C_RK30_ADAP   1
-       int adap_type:1;
-       int is_div_from_arm:1;
+       int adap_type;
+       int is_div_from_arm;
        u32 flags;
        int (*io_init)(void);
        int (*io_deinit)(void);
index 24e4c8a3b529308cddc83131fd158db5029812d2..aa817e2c9a0a3c2734fc06352ea14ea40d1f4549 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);
+        unsigned int p = readl(i2c->con_base);
 
-    writel(rk30_set_bit(p, adap_type, I2C_ADAP_SEL_BIT(nr)), 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);
 }
 
 #ifdef CONFIG_CPU_FREQ
@@ -29,7 +31,7 @@ void i2c_adap_sel(struct rk30_i2c *i2c, int nr, int adap_type)
 static int rk30_i2c_cpufreq_transition(struct notifier_block *nb,
                                          unsigned long val, void *data)
 {
-    struct rk30_i2c *i2c = freq_to_i2c(nb);
+        struct rk30_i2c *i2c = freq_to_i2c(nb);
        unsigned long flags;
        int delta_f;
 
@@ -84,7 +86,7 @@ static int rk30_i2c_probe(struct platform_device *pdev)
        struct rk30_i2c *i2c = NULL;
        struct rk30_i2c_platform_data *pdata = NULL;
        struct resource *res;
-    char name[5];
+        char name[5];
        int ret;
 
        pdata = pdev->dev.platform_data;
@@ -99,10 +101,10 @@ static int rk30_i2c_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "no memory for state\n");
                return -ENOMEM;
        }
-    i2c->con_base = (void __iomem *)GRF_I2C_CON_BASE;
-    i2c_adap_sel(i2c, pdata->bus_num, pdata->adap_type);
+        i2c->con_base = (void __iomem *)GRF_I2C_CON_BASE;
+        i2c_adap_sel(i2c, pdata->bus_num, pdata->adap_type);
 
-    if(pdata->io_init)
+        if(pdata->io_init)
                pdata->io_init();
 
        strlcpy(i2c->adap.name, "rk30_i2c", sizeof(i2c->adap.name));
@@ -110,7 +112,7 @@ static int rk30_i2c_probe(struct platform_device *pdev)
        i2c->adap.class   = I2C_CLASS_HWMON | I2C_CLASS_SPD;
        i2c->tx_setup     = TX_SETUP;
        i2c->adap.retries = 5;
-    i2c->adap.timeout = msecs_to_jiffies(500);
+        i2c->adap.timeout = msecs_to_jiffies(500);
 
        spin_lock_init(&i2c->lock);
        init_waitqueue_head(&i2c->wait);
@@ -163,10 +165,10 @@ static int rk30_i2c_probe(struct platform_device *pdev)
        i2c->adap.algo_data = i2c;
        i2c->adap.dev.parent = &pdev->dev;
        i2c->adap.nr = pdata->bus_num;
-    if(pdata->adap_type == I2C_RK29_ADAP)
-        ret = i2c_add_rk29_adapter(&i2c->adap);
-    else // I2C_RK30_ADAP
-        ret = i2c_add_rk30_adapter(&i2c->adap);
+        if(pdata->adap_type == I2C_RK29_ADAP)
+                ret = i2c_add_rk29_adapter(&i2c->adap);
+        else // I2C_RK30_ADAP
+                ret = i2c_add_rk30_adapter(&i2c->adap);
 
        if (ret < 0) {
                dev_err(&pdev->dev, "failed to add adapter\n");
@@ -199,12 +201,12 @@ static int rk30_i2c_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, i2c);
 
-    sprintf(name, "%s%d", "i2c", i2c->adap.nr);
-    i2c->is_div_from_arm[i2c->adap.nr] = pdata->is_div_from_arm;
-    if(i2c->is_div_from_arm[i2c->adap.nr])
-        wake_lock_init(&i2c->idlelock[i2c->adap.nr], WAKE_LOCK_IDLE, name);
+        sprintf(name, "%s%d", "i2c", i2c->adap.nr);
+        i2c->is_div_from_arm[i2c->adap.nr] = pdata->is_div_from_arm;
+        if(i2c->is_div_from_arm[i2c->adap.nr])
+                wake_lock_init(&i2c->idlelock[i2c->adap.nr], WAKE_LOCK_IDLE, name);
 
-    i2c->i2c_init_hw(i2c, 100 * 1000);
+        i2c->i2c_init_hw(i2c, 100 * 1000);
        dev_info(&pdev->dev, "%s: RK30 I2C adapter\n", dev_name(&i2c->adap.dev));
        return 0;
 //err_none:
@@ -264,7 +266,7 @@ static int rk30_i2c_resume_noirq(struct device *dev)
        struct rk30_i2c *i2c = platform_get_drvdata(pdev);
 
        i2c->suspended = 0;
-    i2c->i2c_init_hw(i2c, i2c->scl_rate);
+        i2c->i2c_init_hw(i2c, i2c->scl_rate);
 
        return 0;
 }
index 003a200dea751ffd0273596c50ba56e40f042149..c4e124f322dd1e06ed4d8f0f70290e8619a29057 100755 (executable)
@@ -44,6 +44,7 @@
 
 #define GRF_I2C_CON_BASE            (RK30_GRF_BASE + GRF_SOC_CON1)
 #define I2C_ADAP_SEL_BIT(nr)        ((nr) + 11)
+#define I2C_ADAP_SEL_MASK(nr)        ((nr) + 27)
 enum rk30_i2c_state {
        STATE_IDLE,
        STATE_START,
@@ -68,28 +69,28 @@ struct rk30_i2c {
        unsigned long           clkrate;
 
        void __iomem            *regs;
-    void __iomem        *con_base;
+        void __iomem        *con_base;
        struct clk                  *clk;
        struct device           *dev;
        struct resource         *ioarea;
        struct i2c_adapter      adap;
     
-    unsigned long              scl_rate;
+        unsigned long          scl_rate;
        unsigned long           i2c_rate;
-    unsigned int        addr;
-    unsigned int        mode;
-    unsigned int        count;
+        unsigned int        addr;
+        unsigned int        mode;
+        unsigned int        count;
 
-    struct wake_lock    idlelock[5];
-    int is_div_from_arm[5];
+        struct wake_lock    idlelock[5];
+        int is_div_from_arm[5];
 
 #ifdef CONFIG_CPU_FREQ
        struct notifier_block   freq_transition;
 #endif
 
-    void (*i2c_init_hw)(struct rk30_i2c *, unsigned long scl_rate);
-    void (*i2c_set_clk)(struct rk30_i2c *, unsigned long);
-    irqreturn_t (*i2c_irq)(int, void *);
+        void (*i2c_init_hw)(struct rk30_i2c *, unsigned long scl_rate);
+        void (*i2c_set_clk)(struct rk30_i2c *, unsigned long);
+        irqreturn_t (*i2c_irq)(int, void *);
 };
 void i2c_adap_sel(struct rk30_i2c *i2c, int nr, int adap_type);
 int i2c_add_rk29_adapter(struct i2c_adapter *);