[U-Boot] [PATCH 4/6 v2] i2c: designware_i2c: Prepare for DM driver conversion

Heiko Schocher hs at denx.de
Mon Mar 28 09:33:42 CEST 2016


Hello Stefan,

Am 23.03.2016 um 06:46 schrieb Stefan Roese:
> This patch prepares the designware I2C driver for the DM conversion.
> This is mainly done by removing struct i2c_adapter from the functions
> that shall be used by the DM driver version as well.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
> Cc: Simon Glass <sjg at chromium.org>
> Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
> Cc: Marek Vasut <marex at denx.de>
> Cc: Heiko Schocher <hs at denx.de>
> ---
> v2:
> - Added Reviewed-by from Bin
>
>   drivers/i2c/designware_i2c.c | 173 ++++++++++++++++++++++---------------------
>   1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zurückzufallen.
Kann nicht zu 3-Wege-Merge zurückfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c: Prepare for DM driver conversion

I tried the this patch on current mainline, with the following
patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Could you take a look?

Thanks!

bye,
Heiko
>
> diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c
> index aac56a7..8dd1de9 100644
> --- a/drivers/i2c/designware_i2c.c
> +++ b/drivers/i2c/designware_i2c.c
> @@ -10,30 +10,6 @@
>   #include <asm/io.h>
>   #include "designware_i2c.h"
>
> -static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap)
> -{
> -	switch (adap->hwadapnr) {
> -#if CONFIG_SYS_I2C_BUS_MAX >= 4
> -	case 3:
> -		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE3;
> -#endif
> -#if CONFIG_SYS_I2C_BUS_MAX >= 3
> -	case 2:
> -		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE2;
> -#endif
> -#if CONFIG_SYS_I2C_BUS_MAX >= 2
> -	case 1:
> -		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE1;
> -#endif
> -	case 0:
> -		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE;
> -	default:
> -		printf("Wrong I2C-adapter number %d\n", adap->hwadapnr);
> -	}
> -
> -	return NULL;
> -}
> -
>   static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
>   {
>   	int timeout = 100;
> @@ -60,10 +36,9 @@ static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
>    *
>    * Set the i2c speed.
>    */
> -static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
> -					 unsigned int speed)
> +static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base,
> +					   unsigned int speed)
>   {
> -	struct i2c_regs *i2c_base = i2c_get_base(adap);
>   	unsigned int cntl;
>   	unsigned int hcnt, lcnt;
>   	int i2c_spd;
> @@ -112,47 +87,17 @@ static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
>   	/* Enable back i2c now speed set */
>   	dw_i2c_enable(i2c_base, true);
>
> -	adap->speed = speed;
> -
>   	return 0;
>   }
>
>   /*
> - * i2c_init - Init function
> - * @speed:	required i2c speed
> - * @slaveaddr:	slave address for the device
> - *
> - * Initialization function.
> - */
> -static void dw_i2c_init(struct i2c_adapter *adap, int speed,
> -			int slaveaddr)
> -{
> -	struct i2c_regs *i2c_base = i2c_get_base(adap);
> -
> -	/* Disable i2c */
> -	dw_i2c_enable(i2c_base, false);
> -
> -	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con);
> -	writel(IC_RX_TL, &i2c_base->ic_rx_tl);
> -	writel(IC_TX_TL, &i2c_base->ic_tx_tl);
> -	dw_i2c_set_bus_speed(adap, speed);
> -	writel(IC_STOP_DET, &i2c_base->ic_intr_mask);
> -	writel(slaveaddr, &i2c_base->ic_sar);
> -
> -	/* Enable i2c */
> -	dw_i2c_enable(i2c_base, true);
> -}
> -
> -/*
>    * i2c_setaddress - Sets the target slave address
>    * @i2c_addr:	target i2c address
>    *
>    * Sets the target slave address.
>    */
> -static void i2c_setaddress(struct i2c_adapter *adap, unsigned int i2c_addr)
> +static void i2c_setaddress(struct i2c_regs *i2c_base, unsigned int i2c_addr)
>   {
> -	struct i2c_regs *i2c_base = i2c_get_base(adap);
> -
>   	/* Disable i2c */
>   	dw_i2c_enable(i2c_base, false);
>
> @@ -167,10 +112,8 @@ static void i2c_setaddress(struct i2c_adapter *adap, unsigned int i2c_addr)
>    *
>    * Flushes the i2c RX FIFO
>    */
> -static void i2c_flush_rxfifo(struct i2c_adapter *adap)
> +static void i2c_flush_rxfifo(struct i2c_regs *i2c_base)
>   {
> -	struct i2c_regs *i2c_base = i2c_get_base(adap);
> -
>   	while (readl(&i2c_base->ic_status) & IC_STATUS_RFNE)
>   		readl(&i2c_base->ic_cmd_data);
>   }
> @@ -180,9 +123,8 @@ static void i2c_flush_rxfifo(struct i2c_adapter *adap)
>    *
>    * Waits for bus busy
>    */
> -static int i2c_wait_for_bb(struct i2c_adapter *adap)
> +static int i2c_wait_for_bb(struct i2c_regs *i2c_base)
>   {
> -	struct i2c_regs *i2c_base = i2c_get_base(adap);
>   	unsigned long start_time_bb = get_timer(0);
>
>   	while ((readl(&i2c_base->ic_status) & IC_STATUS_MA) ||
> @@ -196,15 +138,13 @@ static int i2c_wait_for_bb(struct i2c_adapter *adap)
>   	return 0;
>   }
>
> -static int i2c_xfer_init(struct i2c_adapter *adap, uchar chip, uint addr,
> +static int i2c_xfer_init(struct i2c_regs *i2c_base, uchar chip, uint addr,
>   			 int alen)
>   {
> -	struct i2c_regs *i2c_base = i2c_get_base(adap);
> -
> -	if (i2c_wait_for_bb(adap))
> +	if (i2c_wait_for_bb(i2c_base))
>   		return 1;
>
> -	i2c_setaddress(adap, chip);
> +	i2c_setaddress(i2c_base, chip);
>   	while (alen) {
>   		alen--;
>   		/* high byte address going out first */
> @@ -214,9 +154,8 @@ static int i2c_xfer_init(struct i2c_adapter *adap, uchar chip, uint addr,
>   	return 0;
>   }
>
> -static int i2c_xfer_finish(struct i2c_adapter *adap)
> +static int i2c_xfer_finish(struct i2c_regs *i2c_base)
>   {
> -	struct i2c_regs *i2c_base = i2c_get_base(adap);
>   	ulong start_stop_det = get_timer(0);
>
>   	while (1) {
> @@ -228,12 +167,12 @@ static int i2c_xfer_finish(struct i2c_adapter *adap)
>   		}
>   	}
>
> -	if (i2c_wait_for_bb(adap)) {
> +	if (i2c_wait_for_bb(i2c_base)) {
>   		printf("Timed out waiting for bus\n");
>   		return 1;
>   	}
>
> -	i2c_flush_rxfifo(adap);
> +	i2c_flush_rxfifo(i2c_base);
>
>   	return 0;
>   }
> @@ -248,10 +187,9 @@ static int i2c_xfer_finish(struct i2c_adapter *adap)
>    *
>    * Read from i2c memory.
>    */
> -static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
> -		       int alen, u8 *buffer, int len)
> +static int __dw_i2c_read(struct i2c_regs *i2c_base, u8 dev, uint addr,
> +			 int alen, u8 *buffer, int len)
>   {
> -	struct i2c_regs *i2c_base = i2c_get_base(adap);
>   	unsigned long start_time_rx;
>
>   #ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
> @@ -273,7 +211,7 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
>   	      addr);
>   #endif
>
> -	if (i2c_xfer_init(adap, dev, addr, alen))
> +	if (i2c_xfer_init(i2c_base, dev, addr, alen))
>   		return 1;
>
>   	start_time_rx = get_timer(0);
> @@ -293,7 +231,7 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
>   		}
>   	}
>
> -	return i2c_xfer_finish(adap);
> +	return i2c_xfer_finish(i2c_base);
>   }
>
>   /*
> @@ -306,10 +244,9 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
>    *
>    * Write to i2c memory.
>    */
> -static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
> -			int alen, u8 *buffer, int len)
> +static int __dw_i2c_write(struct i2c_regs *i2c_base, u8 dev, uint addr,
> +			  int alen, u8 *buffer, int len)
>   {
> -	struct i2c_regs *i2c_base = i2c_get_base(adap);
>   	int nb = len;
>   	unsigned long start_time_tx;
>
> @@ -332,7 +269,7 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
>   	      addr);
>   #endif
>
> -	if (i2c_xfer_init(adap, dev, addr, alen))
> +	if (i2c_xfer_init(i2c_base, dev, addr, alen))
>   		return 1;
>
>   	start_time_tx = get_timer(0);
> @@ -353,7 +290,76 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
>   		}
>   	}
>
> -	return i2c_xfer_finish(adap);
> +	return i2c_xfer_finish(i2c_base);
> +}
> +
> +static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap)
> +{
> +	switch (adap->hwadapnr) {
> +#if CONFIG_SYS_I2C_BUS_MAX >= 4
> +	case 3:
> +		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE3;
> +#endif
> +#if CONFIG_SYS_I2C_BUS_MAX >= 3
> +	case 2:
> +		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE2;
> +#endif
> +#if CONFIG_SYS_I2C_BUS_MAX >= 2
> +	case 1:
> +		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE1;
> +#endif
> +	case 0:
> +		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE;
> +	default:
> +		printf("Wrong I2C-adapter number %d\n", adap->hwadapnr);
> +	}
> +
> +	return NULL;
> +}
> +
> +static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
> +					 unsigned int speed)
> +{
> +	adap->speed = speed;
> +	return __dw_i2c_set_bus_speed(i2c_get_base(adap), speed);
> +}
> +
> +/*
> + * i2c_init - Init function
> + * @speed:	required i2c speed
> + * @slaveaddr:	slave address for the device
> + *
> + * Initialization function.
> + */
> +static void dw_i2c_init(struct i2c_adapter *adap, int speed,
> +			int slaveaddr)
> +{
> +	struct i2c_regs *i2c_base = i2c_get_base(adap);
> +
> +	/* Disable i2c */
> +	dw_i2c_enable(i2c_base, false);
> +
> +	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con);
> +	writel(IC_RX_TL, &i2c_base->ic_rx_tl);
> +	writel(IC_TX_TL, &i2c_base->ic_tx_tl);
> +	dw_i2c_set_bus_speed(adap, speed);
> +	writel(IC_STOP_DET, &i2c_base->ic_intr_mask);
> +	writel(slaveaddr, &i2c_base->ic_sar);
> +
> +	/* Enable i2c */
> +	dw_i2c_enable(i2c_base, true);
> +}
> +
> +static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
> +		       int alen, u8 *buffer, int len)
> +{
> +	return __dw_i2c_read(i2c_get_base(adap), dev, addr, alen, buffer, len);
> +}
> +
> +static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
> +			int alen, u8 *buffer, int len)
> +{
> +	return __dw_i2c_write(i2c_get_base(adap), dev, addr, alen, buffer, len);
>   }
>
>   /*
> @@ -361,13 +367,14 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
>    */
>   static int dw_i2c_probe(struct i2c_adapter *adap, u8 dev)
>   {
> +	struct i2c_regs *i2c_base = i2c_get_base(adap);
>   	u32 tmp;
>   	int ret;
>
>   	/*
>   	 * Try to read the first location of the chip.
>   	 */
> -	ret = dw_i2c_read(adap, dev, 0, 1, (uchar *)&tmp, 1);
> +	ret = __dw_i2c_read(i2c_base, dev, 0, 1, (uchar *)&tmp, 1);
>   	if (ret)
>   		dw_i2c_init(adap, adap->speed, adap->slaveaddr);
>
>

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany


More information about the U-Boot mailing list