i2c: designware: Move configuration routines to respective modules
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Sat, 25 Apr 2020 13:44:45 +0000 (16:44 +0300)
committerWolfram Sang <wsa@kernel.org>
Wed, 13 May 2020 10:36:22 +0000 (12:36 +0200)
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>
drivers/i2c/busses/i2c-designware-core.h
drivers/i2c/busses/i2c-designware-master.c
drivers/i2c/busses/i2c-designware-platdrv.c
drivers/i2c/busses/i2c-designware-slave.c

index b220ad6..b2f894f 100644 (file)
@@ -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);
 
+extern void i2c_dw_configure_master(struct dw_i2c_dev *dev);
 extern int i2c_dw_probe(struct dw_i2c_dev *dev);
+
 #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);
 #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; }
 #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)
 extern int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev);
 #else
index b6c17b5..139ba98 100644 (file)
@@ -657,6 +657,30 @@ static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)
        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)
 {
        struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
index f5d57b8..8ca5d0f 100644 (file)
@@ -184,39 +184,6 @@ static inline int dw_i2c_of_configure(struct platform_device *pdev)
 }
 #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)
 {
        pm_runtime_disable(dev->dev);
@@ -319,10 +286,7 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
        if (ret)
                goto exit_reset;
 
-       if (i2c_detect_slave_mode(&pdev->dev))
-               i2c_dw_configure_slave(dev);
-       else
-               i2c_dw_configure_master(dev);
+       i2c_dw_configure(dev);
 
        /* Optional interface clock */
        dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk");
index f5ecf76..576e7af 100644 (file)
@@ -241,6 +241,17 @@ static const struct i2c_algorithm i2c_dw_algo = {
        .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)
 {
        struct i2c_adapter *adap = &dev->adapter;