rk30: i2c: modify 'controller switch'

This commit is contained in:
kfx
2012-03-28 11:39:43 +08:00
parent c80a4df97f
commit 8eb9d81478
3 changed files with 33 additions and 30 deletions

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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 *);