]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
i2c: designware: Move register access detection to common code
authorJarkko Nikula <jarkko.nikula@linux.intel.com>
Tue, 19 Jun 2018 11:23:19 +0000 (14:23 +0300)
committerWolfram Sang <wsa@the-dreams.de>
Tue, 3 Jul 2018 21:05:20 +0000 (23:05 +0200)
Move register access detection out from master and slave HW
initialization code to common code. Motivation for this is to have
register access configured before HW initialization and remove
duplicated code.

This allows to do further separation between probe time initialization
and runtime reinitialization code.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-designware-common.c
drivers/i2c/busses/i2c-designware-core.h
drivers/i2c/busses/i2c-designware-master.c
drivers/i2c/busses/i2c-designware-slave.c

index 48914dfc8ce88ff54246a2f450ef2bc3ae9afe4d..d1c93acabfcfc858f230d85e4c6c62b201e10dd4 100644 (file)
@@ -94,6 +94,40 @@ void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset)
        }
 }
 
+/**
+ * i2c_dw_set_reg_access() - Set register access flags
+ * @dev: device private data
+ *
+ * Autodetects needed register access mode and sets access flags accordingly.
+ * This must be called before doing any other register access.
+ */
+int i2c_dw_set_reg_access(struct dw_i2c_dev *dev)
+{
+       u32 reg;
+       int ret;
+
+       ret = i2c_dw_acquire_lock(dev);
+       if (ret)
+               return ret;
+
+       reg = dw_readl(dev, DW_IC_COMP_TYPE);
+       i2c_dw_release_lock(dev);
+
+       if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) {
+               /* Configure register endianess access */
+               dev->flags |= ACCESS_SWAP;
+       } else if (reg == (DW_IC_COMP_TYPE_VALUE & 0x0000ffff)) {
+               /* Configure register access mode 16bit */
+               dev->flags |= ACCESS_16BIT;
+       } else if (reg != DW_IC_COMP_TYPE_VALUE) {
+               dev_err(dev->dev,
+                       "Unknown Synopsys component type: 0x%08x\n", reg);
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
 u32 i2c_dw_scl_hcnt(u32 ic_clk, u32 tSYMBOL, u32 tf, int cond, int offset)
 {
        /*
index d690e648bc015efcd96d63b81c11969e9a6ceaae..5d54f70710adf323fc77dabd60f0906fb6d47b10 100644 (file)
@@ -295,6 +295,7 @@ struct dw_i2c_dev {
 
 u32 dw_readl(struct dw_i2c_dev *dev, int offset);
 void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset);
+int i2c_dw_set_reg_access(struct dw_i2c_dev *dev);
 u32 i2c_dw_scl_hcnt(u32 ic_clk, u32 tSYMBOL, u32 tf, int cond, int offset);
 u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset);
 unsigned long i2c_dw_clk_rate(struct dw_i2c_dev *dev);
index 27436a937492d1afdefe77264bcd1afaf7d91856..3a7c184f24c89ed62fa496a51870cacc4db95cb4 100644 (file)
@@ -64,20 +64,6 @@ static int i2c_dw_init_master(struct dw_i2c_dev *dev)
        if (ret)
                return ret;
 
-       reg = dw_readl(dev, DW_IC_COMP_TYPE);
-       if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) {
-               /* Configure register endianess access */
-               dev->flags |= ACCESS_SWAP;
-       } else if (reg == (DW_IC_COMP_TYPE_VALUE & 0x0000ffff)) {
-               /* Configure register access mode 16bit */
-               dev->flags |= ACCESS_16BIT;
-       } else if (reg != DW_IC_COMP_TYPE_VALUE) {
-               dev_err(dev->dev,
-                       "Unknown Synopsys component type: 0x%08x\n", reg);
-               i2c_dw_release_lock(dev);
-               return -ENODEV;
-       }
-
        comp_param1 = dw_readl(dev, DW_IC_COMP_PARAM_1);
 
        /* Disable the adapter */
@@ -681,6 +667,10 @@ int i2c_dw_probe(struct dw_i2c_dev *dev)
        dev->disable = i2c_dw_disable;
        dev->disable_int = i2c_dw_disable_int;
 
+       ret = i2c_dw_set_reg_access(dev);
+       if (ret)
+               return ret;
+
        ret = dev->init(dev);
        if (ret)
                return ret;
index 2036a579b5dfc23d6fd1feabdd67e127c00684e4..a1f802001e1f45c0f46a2339f62d4d1b1444b8f4 100644 (file)
@@ -58,20 +58,6 @@ static int i2c_dw_init_slave(struct dw_i2c_dev *dev)
        if (ret)
                return ret;
 
-       reg = dw_readl(dev, DW_IC_COMP_TYPE);
-       if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) {
-               /* Configure register endianness access. */
-               dev->flags |= ACCESS_SWAP;
-       } else if (reg == (DW_IC_COMP_TYPE_VALUE & 0x0000ffff)) {
-               /* Configure register access mode 16bit. */
-               dev->flags |= ACCESS_16BIT;
-       } else if (reg != DW_IC_COMP_TYPE_VALUE) {
-               dev_err(dev->dev,
-                       "Unknown Synopsys component type: 0x%08x\n", reg);
-               i2c_dw_release_lock(dev);
-               return -ENODEV;
-       }
-
        /* Disable the adapter. */
        __i2c_dw_disable(dev);
 
@@ -297,6 +283,10 @@ int i2c_dw_probe_slave(struct dw_i2c_dev *dev)
        dev->disable = i2c_dw_disable;
        dev->disable_int = i2c_dw_disable_int;
 
+       ret = i2c_dw_set_reg_access(dev);
+       if (ret)
+               return ret;
+
        ret = dev->init(dev);
        if (ret)
                return ret;