Skip to content
  • Peng Fan's avatar
    i2c: mxc: refactor i2c driver and support dm · 71204e95
    Peng Fan authored
    
    
    1. Introduce a new structure `struct mxc_i2c_bus`, this structure will
       used for non-DM and DM.
    2. Remove `struct mxc_i2c_regs` structure, but use register offset to access
       registers based on `base` entry of `struct mxc_i2c_bus`.
    3. Remove most `#ifdef I2C_QUIRK_REG`. Using driver_data to contain platform
       flags. A new flag is introduced, I2C_QUIRK_FLAG.
    4. Most functions use `struct mxc_i2c_bus` as one of the parameters.
       Make most functions common to DM and non-DM, try to avoid duplicated code.
    5. Support DM, but pinctrl is not included. Pinmux setting is still set
       by setup_i2c, but we do not need bus_i2c_init for DM.
    6. struct i2c_parms and struct sram_data are removed.
    7. Remove bus_i2c_read bus_i2c_write prototype in header file. The frist
       paramter of bus_i2c_init is modified to i2c index. Add new prototype
       i2c_idle_bus and force_bus_idle. Since bus_i2c_init is not good for
       DM I2C and pinctrl is missed, we use a weak function for i2c_idle_bus.
       Board file take the responsibility to implement this function, like this:
       "
       int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
       {
    	   if (i2c_bus->index == 0)
    		   force_bus_idle(i2c_pads_info0);
    	   else if (i2c_bus->index == 1)
    		   force_bus_idle(i2c_pads_info1);
    	   else
    		   xxxxxx
       }
       "
    8. Introduce a weak function, enable_i2c_clk
    9. Tested on an i.MX7 platform. Log info:
     => dm tree
     Class       Probed   Name
     ----------------------------------------
     root        [ + ]    root_driver
     simple_bus  [   ]    |-- soc
     simple_bus  [   ]    |   |-- aips-bus@30000000
     simple_bus  [   ]    |   |   |-- anatop@30360000
     simple_bus  [   ]    |   |   `-- snvs@30370000
     simple_bus  [   ]    |   |-- aips-bus@30400000
     simple_bus  [   ]    |   `-- aips-bus@30800000
     i2c         [   ]    |       |-- i2c@30a20000
     i2c         [   ]    |       `-- i2c@30a40000
     simple_bus  [   ]    `-- regulators
     => i2c dev 0
     Setting bus to 0
     => i2c probe
     Valid chip addresses: 08 50
     => i2c md 8 31
     0031: 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08
    
    Signed-off-by: default avatarPeng Fan <Peng.Fan@freescale.com>
    Acked-by: default avatarSimon Glass <sjg@chromium.org>
    71204e95