[U-Boot] [PATCH 10/13] i2c: mvtwsi: Add compatibility to DM

Stefan Roese sr at denx.de
Thu Jul 21 09:05:14 CEST 2016


Hi Mario,

first, thanks for this very nice patch series. Really appreciated.
One comment below...

On 18.07.2016 10:27, Mario Six wrote:
> This patch adds the necessary functions and Kconfig entry to make the
> MVTWSI I2C driver compatible with the driver model.
>
> A possible device tree entry might look like this:
>
> i2c at 11100 {
> 	compatible = "marvell,mv64xxx-i2c";
> 	reg = <0x11000 0x20>;
> 	clock-frequency = <100000>;
> 	u-boot,i2c-slave-addr = <0x0>;
> };
>
> Signed-off-by: Mario Six <mario.six at gdsys.cc>
> ---
>  drivers/i2c/Kconfig  |   7 +++
>  drivers/i2c/mvtwsi.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 123 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
> index 6e22bba..b3e8405 100644
> --- a/drivers/i2c/Kconfig
> +++ b/drivers/i2c/Kconfig
> @@ -154,6 +154,13 @@ config SYS_I2C_UNIPHIER_F
>  	  Support for UniPhier FIFO-builtin I2C controller driver.
>  	  This I2C controller is used on PH1-Pro4 or newer UniPhier SoCs.
>
> +config SYS_I2C_MVTWSI
> +	bool "Marvell I2C driver"
> +	depends on DM_I2C
> +	help
> +	  Support for Marvell I2C controllers as used on the orion5x and
> +	  kirkwood SoC families.
> +
>  source "drivers/i2c/muxes/Kconfig"
>
>  endmenu
> diff --git a/drivers/i2c/mvtwsi.c b/drivers/i2c/mvtwsi.c
> index 3325c4b..c81e9d4 100644
> --- a/drivers/i2c/mvtwsi.c
> +++ b/drivers/i2c/mvtwsi.c
> @@ -12,12 +12,19 @@
>  #include <i2c.h>
>  #include <asm/errno.h>
>  #include <asm/io.h>
> +#ifdef CONFIG_DM_I2C
> +#include <dm.h>
> +#include <mapmem.h>
> +#endif
> +
> +DECLARE_GLOBAL_DATA_PTR;
>
>  /*
>   * Include a file that will provide CONFIG_I2C_MVTWSI_BASE*, and possibly other
>   * settings
>   */
>
> +#ifndef CONFIG_DM_I2C
>  #if defined(CONFIG_ORION5X)
>  #include <asm/arch/orion5x.h>
>  #elif (defined(CONFIG_KIRKWOOD) || defined(CONFIG_ARCH_MVEBU))
> @@ -27,6 +34,7 @@
>  #else
>  #error Driver mvtwsi not supported by SoC or board
>  #endif
> +#endif /* CONFIG_DM_I2C */
>
>  /*
>   * TWSI register structure
> @@ -61,6 +69,19 @@ struct  mvtwsi_registers {
>
>  #endif
>
> +#ifdef CONFIG_DM_I2C
> +struct mvtwsi_i2c_dev {
> +	/* TWSI Register base for the device */
> +	struct mvtwsi_registers *base;
> +	/* Number of the device (determined from cell-index property) */
> +	int index;
> +	/* The I2C slave address for the device */
> +	u8 slaveadd;
> +	/* The configured I2C speed in Hz */
> +	uint speed;
> +};
> +#endif /* CONFIG_DM_I2C */
> +
>  /*
>   * enum mvtwsi_ctrl_register_fields - Bit masks for flags in the control
>   * register
> @@ -134,6 +155,7 @@ enum mvtwsi_ack_flags {
>  	MVTWSI_READ_ACK = 1,
>  };
>
> +#ifndef CONFIG_DM_I2C
>  /*
>   * MVTWSI controller base
>   */
> @@ -172,6 +194,7 @@ static struct mvtwsi_registers *twsi_get_base(struct i2c_adapter *adap)
>
>  	return NULL;
>  }
> +#endif
>
>  /*
>   * enum mvtwsi_error_class - types of I2C errors
> @@ -358,7 +381,7 @@ static uint __twsi_i2c_set_bus_speed(struct mvtwsi_registers *twsi,
>  }
>
>  static void __twsi_i2c_init(struct mvtwsi_registers *twsi, int speed,
> -			  int slaveadd)
> +			    int slaveadd)
>  {
>  	/* Reset controller */
>  	twsi_reset(twsi);
> @@ -472,6 +495,7 @@ static int __twsi_i2c_write(struct mvtwsi_registers *twsi, uchar chip,
>  	return status != 0 ? status : stop_status;
>  }
>
> +#ifndef CONFIG_DM_I2C
>  static void twsi_i2c_init(struct i2c_adapter *adap, int speed,
>  			  int slaveadd)
>  {
> @@ -561,3 +585,94 @@ U_BOOT_I2C_ADAP_COMPLETE(twsi5, twsi_i2c_init, twsi_i2c_probe,
>  			 CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE, 5)
>
>  #endif
> +#else /* CONFIG_DM_I2C */
> +
> +static int mvtwsi_i2c_probe_chip(struct udevice *bus, u32 chip_addr,
> +				 u32 chip_flags)
> +{
> +	struct mvtwsi_i2c_dev *dev = dev_get_priv(bus);
> +	return __twsi_i2c_probe_chip(dev->base, chip_addr);
> +}
> +
> +static int mvtwsi_i2c_set_bus_speed(struct udevice *bus, uint speed)
> +{
> +	struct mvtwsi_i2c_dev *dev = dev_get_priv(bus);
> +	return __twsi_i2c_set_bus_speed(dev->base, speed);
> +}
> +
> +static int mvtwsi_i2c_ofdata_to_platdata(struct udevice *bus)
> +{
> +	struct mvtwsi_i2c_dev *dev = dev_get_priv(bus);
> +	fdt_addr_t addr;
> +	fdt_size_t size;
> +
> +	addr = fdtdec_get_addr_size_auto_noparent(gd->fdt_blob, bus->of_offset,
> +						  "reg", 0, &size);
> +
> +	dev->base = map_sysmem(SOC_REGS_PHY_BASE + addr, size);
> +
> +	if (!dev->base)
> +		return -ENOMEM;


SOC_REGS_PHY_BASE is only defined for MVEBU / Armada XP / 38x. You
should use dev_get_addr() instead here. This will do all the
address translation you need:

	addr = dev_get_addr(bus);

Or if you need a ptr:

	dev->base = dev_get_addr_ptr(bus);

Otherwise your patch serial look good, so please add my:

Reviewed-by: Stefan Roese <sr at denx.de>

to all the patches.

Thanks,
Stefan


More information about the U-Boot mailing list