From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Schocher Date: Mon, 28 Mar 2016 09:33:42 +0200 Subject: [U-Boot] [PATCH 4/6 v2] i2c: designware_i2c: Prepare for DM driver conversion In-Reply-To: <1458711988-3235-4-git-send-email-sr@denx.de> References: <1458711988-3235-1-git-send-email-sr@denx.de> <1458711988-3235-4-git-send-email-sr@denx.de> Message-ID: <56F8DE56.1060109@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 > Cc: Simon Glass > Reviewed-by: Bin Meng > Cc: Marek Vasut > Cc: Heiko Schocher > --- > 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 > #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