#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
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;
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;
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));
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);
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");
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:
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;
}
#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,
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 *);