On Fri, Mar 18, 2016 at 3:54 PM, Stefan Roese <s...@denx.de> wrote: > 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 <s...@denx.de> > Cc: Simon Glass <s...@chromium.org> > Cc: Bin Meng <bmeng...@gmail.com> > Cc: Marek Vasut <ma...@denx.de> > Cc: Heiko Schocher <h...@denx.de> > --- > drivers/i2c/designware_i2c.c | 173 > ++++++++++++++++++++++--------------------- > 1 file changed, 90 insertions(+), 83 deletions(-) > > diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c > index 508dac9..e51e6de 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, 1); > > - 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, 0); > - > - 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, 1); > -} > - > -/* > * 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, 0); > > @@ -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
dw_i2c_init > + * @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, 0); > + > + 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, 1); > +} > + Reviewed-by: Bin Meng <bmeng...@gmail.com> _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot