From: kfx Date: Wed, 28 Mar 2012 03:39:43 +0000 (+0800) Subject: rk30: i2c: modify 'controller switch' X-Git-Tag: firefly_0821_release~9560^2~27 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8eb9d814783fcffa5bbffc4d9166df1a8b153661;p=firefly-linux-kernel-4.4.55.git rk30: i2c: modify 'controller switch' --- diff --git a/arch/arm/mach-rk30/include/mach/board.h b/arch/arm/mach-rk30/include/mach/board.h index 04e7222e89db..9ff1d0ccfbaa 100755 --- a/arch/arm/mach-rk30/include/mach/board.h +++ b/arch/arm/mach-rk30/include/mach/board.h @@ -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); diff --git a/drivers/i2c/busses/i2c-rk30.c b/drivers/i2c/busses/i2c-rk30.c index 24e4c8a3b529..aa817e2c9a0a 100755 --- a/drivers/i2c/busses/i2c-rk30.c +++ b/drivers/i2c/busses/i2c-rk30.c @@ -17,9 +17,11 @@ #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; } diff --git a/drivers/i2c/busses/i2c-rk30.h b/drivers/i2c/busses/i2c-rk30.h index 003a200dea75..c4e124f322dd 100755 --- a/drivers/i2c/busses/i2c-rk30.h +++ b/drivers/i2c/busses/i2c-rk30.h @@ -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 *);