i2c: designware: Move configuration routines to respective modules
Move configuration routines to respective modules, i.e. master and slave. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Wolfram Sang <wsa@kernel.org>
This commit is contained in:
parent
188fe480cd
commit
3ebe40ed1c
|
@ -314,13 +314,25 @@ static inline void __i2c_dw_disable_nowait(struct dw_i2c_dev *dev)
|
||||||
|
|
||||||
void __i2c_dw_disable(struct dw_i2c_dev *dev);
|
void __i2c_dw_disable(struct dw_i2c_dev *dev);
|
||||||
|
|
||||||
|
extern void i2c_dw_configure_master(struct dw_i2c_dev *dev);
|
||||||
extern int i2c_dw_probe(struct dw_i2c_dev *dev);
|
extern int i2c_dw_probe(struct dw_i2c_dev *dev);
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_I2C_DESIGNWARE_SLAVE)
|
#if IS_ENABLED(CONFIG_I2C_DESIGNWARE_SLAVE)
|
||||||
|
extern void i2c_dw_configure_slave(struct dw_i2c_dev *dev);
|
||||||
extern int i2c_dw_probe_slave(struct dw_i2c_dev *dev);
|
extern int i2c_dw_probe_slave(struct dw_i2c_dev *dev);
|
||||||
#else
|
#else
|
||||||
|
static inline void i2c_dw_configure_slave(struct dw_i2c_dev *dev) { }
|
||||||
static inline int i2c_dw_probe_slave(struct dw_i2c_dev *dev) { return -EINVAL; }
|
static inline int i2c_dw_probe_slave(struct dw_i2c_dev *dev) { return -EINVAL; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline void i2c_dw_configure(struct dw_i2c_dev *dev)
|
||||||
|
{
|
||||||
|
if (i2c_detect_slave_mode(dev->dev))
|
||||||
|
i2c_dw_configure_slave(dev);
|
||||||
|
else
|
||||||
|
i2c_dw_configure_master(dev);
|
||||||
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_I2C_DESIGNWARE_BAYTRAIL)
|
#if IS_ENABLED(CONFIG_I2C_DESIGNWARE_BAYTRAIL)
|
||||||
extern int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev);
|
extern int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -657,6 +657,30 @@ static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void i2c_dw_configure_master(struct dw_i2c_dev *dev)
|
||||||
|
{
|
||||||
|
struct i2c_timings *t = &dev->timings;
|
||||||
|
|
||||||
|
dev->functionality = I2C_FUNC_10BIT_ADDR | DW_IC_DEFAULT_FUNCTIONALITY;
|
||||||
|
|
||||||
|
dev->master_cfg = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE |
|
||||||
|
DW_IC_CON_RESTART_EN;
|
||||||
|
|
||||||
|
dev->mode = DW_IC_MASTER;
|
||||||
|
|
||||||
|
switch (t->bus_freq_hz) {
|
||||||
|
case I2C_MAX_STANDARD_MODE_FREQ:
|
||||||
|
dev->master_cfg |= DW_IC_CON_SPEED_STD;
|
||||||
|
break;
|
||||||
|
case I2C_MAX_HIGH_SPEED_MODE_FREQ:
|
||||||
|
dev->master_cfg |= DW_IC_CON_SPEED_HIGH;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dev->master_cfg |= DW_IC_CON_SPEED_FAST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(i2c_dw_configure_master);
|
||||||
|
|
||||||
static void i2c_dw_prepare_recovery(struct i2c_adapter *adap)
|
static void i2c_dw_prepare_recovery(struct i2c_adapter *adap)
|
||||||
{
|
{
|
||||||
struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
|
struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
|
||||||
|
|
|
@ -184,39 +184,6 @@ static inline int dw_i2c_of_configure(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void i2c_dw_configure_master(struct dw_i2c_dev *dev)
|
|
||||||
{
|
|
||||||
struct i2c_timings *t = &dev->timings;
|
|
||||||
|
|
||||||
dev->functionality = I2C_FUNC_10BIT_ADDR | DW_IC_DEFAULT_FUNCTIONALITY;
|
|
||||||
|
|
||||||
dev->master_cfg = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE |
|
|
||||||
DW_IC_CON_RESTART_EN;
|
|
||||||
|
|
||||||
dev->mode = DW_IC_MASTER;
|
|
||||||
|
|
||||||
switch (t->bus_freq_hz) {
|
|
||||||
case I2C_MAX_STANDARD_MODE_FREQ:
|
|
||||||
dev->master_cfg |= DW_IC_CON_SPEED_STD;
|
|
||||||
break;
|
|
||||||
case I2C_MAX_HIGH_SPEED_MODE_FREQ:
|
|
||||||
dev->master_cfg |= DW_IC_CON_SPEED_HIGH;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
dev->master_cfg |= DW_IC_CON_SPEED_FAST;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void i2c_dw_configure_slave(struct dw_i2c_dev *dev)
|
|
||||||
{
|
|
||||||
dev->functionality = I2C_FUNC_SLAVE | DW_IC_DEFAULT_FUNCTIONALITY;
|
|
||||||
|
|
||||||
dev->slave_cfg = DW_IC_CON_RX_FIFO_FULL_HLD_CTRL |
|
|
||||||
DW_IC_CON_RESTART_EN | DW_IC_CON_STOP_DET_IFADDRESSED;
|
|
||||||
|
|
||||||
dev->mode = DW_IC_SLAVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dw_i2c_plat_pm_cleanup(struct dw_i2c_dev *dev)
|
static void dw_i2c_plat_pm_cleanup(struct dw_i2c_dev *dev)
|
||||||
{
|
{
|
||||||
pm_runtime_disable(dev->dev);
|
pm_runtime_disable(dev->dev);
|
||||||
|
@ -319,10 +286,7 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto exit_reset;
|
goto exit_reset;
|
||||||
|
|
||||||
if (i2c_detect_slave_mode(&pdev->dev))
|
i2c_dw_configure(dev);
|
||||||
i2c_dw_configure_slave(dev);
|
|
||||||
else
|
|
||||||
i2c_dw_configure_master(dev);
|
|
||||||
|
|
||||||
/* Optional interface clock */
|
/* Optional interface clock */
|
||||||
dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk");
|
dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk");
|
||||||
|
|
|
@ -241,6 +241,17 @@ static const struct i2c_algorithm i2c_dw_algo = {
|
||||||
.unreg_slave = i2c_dw_unreg_slave,
|
.unreg_slave = i2c_dw_unreg_slave,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void i2c_dw_configure_slave(struct dw_i2c_dev *dev)
|
||||||
|
{
|
||||||
|
dev->functionality = I2C_FUNC_SLAVE | DW_IC_DEFAULT_FUNCTIONALITY;
|
||||||
|
|
||||||
|
dev->slave_cfg = DW_IC_CON_RX_FIFO_FULL_HLD_CTRL |
|
||||||
|
DW_IC_CON_RESTART_EN | DW_IC_CON_STOP_DET_IFADDRESSED;
|
||||||
|
|
||||||
|
dev->mode = DW_IC_SLAVE;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(i2c_dw_configure_slave);
|
||||||
|
|
||||||
int i2c_dw_probe_slave(struct dw_i2c_dev *dev)
|
int i2c_dw_probe_slave(struct dw_i2c_dev *dev)
|
||||||
{
|
{
|
||||||
struct i2c_adapter *adap = &dev->adapter;
|
struct i2c_adapter *adap = &dev->adapter;
|
||||||
|
|
Loading…
Reference in New Issue