[U-Boot] [PATCH v2 1/8] i2c: davinci: Split functions into two parts for future DM support
Heiko Schocher
hs at denx.de
Fri Apr 28 03:54:15 UTC 2017
Hello Franklin,
Am 20.04.2017 um 17:25 schrieb Franklin S Cooper Jr:
> The i2c driver will be converted to support device model. In preparation
> for that change split the various functions into two parts. This will
> allow device model specific driver to reuse the majority of the code from
> the non device model implementation.
>
> Also rename the probe function to probe_chip to better reflect its
> purpose.
>
> Signed-off-by: Franklin S Cooper Jr <fcooper at ti.com>
> ---
> drivers/i2c/davinci_i2c.c | 185 +++++++++++++++++++++++++++-------------------
> 1 file changed, 110 insertions(+), 75 deletions(-)
Reviewed-by: Heiko Schocher <hs at denx.de>
Applied to u-boot-i2c/next
bye,
Heiko
>
> diff --git a/drivers/i2c/davinci_i2c.c b/drivers/i2c/davinci_i2c.c
> index c5bd38c..a6bce26 100644
> --- a/drivers/i2c/davinci_i2c.c
> +++ b/drivers/i2c/davinci_i2c.c
> @@ -29,9 +29,8 @@
>
> static struct i2c_regs *davinci_get_base(struct i2c_adapter *adap);
>
> -static int wait_for_bus(struct i2c_adapter *adap)
> +static int _wait_for_bus(struct i2c_regs *i2c_base)
> {
> - struct i2c_regs *i2c_base = davinci_get_base(adap);
> int stat, timeout;
>
> REG(&(i2c_base->i2c_stat)) = 0xffff;
> @@ -51,10 +50,8 @@ static int wait_for_bus(struct i2c_adapter *adap)
> return 1;
> }
>
> -
> -static int poll_i2c_irq(struct i2c_adapter *adap, int mask)
> +static int _poll_i2c_irq(struct i2c_regs *i2c_base, int mask)
> {
> - struct i2c_regs *i2c_base = davinci_get_base(adap);
> int stat, timeout;
>
> for (timeout = 0; timeout < 10; timeout++) {
> @@ -68,10 +65,8 @@ static int poll_i2c_irq(struct i2c_adapter *adap, int mask)
> return stat | I2C_TIMEOUT;
> }
>
> -static void flush_rx(struct i2c_adapter *adap)
> +static void _flush_rx(struct i2c_regs *i2c_base)
> {
> - struct i2c_regs *i2c_base = davinci_get_base(adap);
> -
> while (1) {
> if (!(REG(&(i2c_base->i2c_stat)) & I2C_STAT_RRDY))
> break;
> @@ -82,9 +77,9 @@ static void flush_rx(struct i2c_adapter *adap)
> }
> }
>
> -static uint davinci_i2c_setspeed(struct i2c_adapter *adap, uint speed)
> +static uint _davinci_i2c_setspeed(struct i2c_regs *i2c_base,
> + uint speed)
> {
> - struct i2c_regs *i2c_base = davinci_get_base(adap);
> uint32_t div, psc;
>
> psc = 2;
> @@ -94,20 +89,18 @@ static uint davinci_i2c_setspeed(struct i2c_adapter *adap, uint speed)
> REG(&(i2c_base->i2c_scll)) = (div * 50) / 100; /* 50% Duty */
> REG(&(i2c_base->i2c_sclh)) = div - REG(&(i2c_base->i2c_scll));
>
> - adap->speed = speed;
> return 0;
> }
>
> -static void davinci_i2c_init(struct i2c_adapter *adap, int speed, int slaveadd)
> +static void _davinci_i2c_init(struct i2c_regs *i2c_base,
> + uint speed, int slaveadd)
> {
> - struct i2c_regs *i2c_base = davinci_get_base(adap);
> -
> if (REG(&(i2c_base->i2c_con)) & I2C_CON_EN) {
> REG(&(i2c_base->i2c_con)) = 0;
> udelay(50000);
> }
>
> - davinci_i2c_setspeed(adap, speed);
> + _davinci_i2c_setspeed(i2c_base, speed);
>
> REG(&(i2c_base->i2c_oa)) = slaveadd;
> REG(&(i2c_base->i2c_cnt)) = 0;
> @@ -122,47 +115,9 @@ static void davinci_i2c_init(struct i2c_adapter *adap, int speed, int slaveadd)
> udelay(1000);
> }
>
> -static int davinci_i2c_probe(struct i2c_adapter *adap, uint8_t chip)
> +static int _davinci_i2c_read(struct i2c_regs *i2c_base, uint8_t chip,
> + uint32_t addr, int alen, uint8_t *buf, int len)
> {
> - struct i2c_regs *i2c_base = davinci_get_base(adap);
> - int rc = 1;
> -
> - if (chip == REG(&(i2c_base->i2c_oa)))
> - return rc;
> -
> - REG(&(i2c_base->i2c_con)) = 0;
> - if (wait_for_bus(adap))
> - return 1;
> -
> - /* try to read one byte from current (or only) address */
> - REG(&(i2c_base->i2c_cnt)) = 1;
> - REG(&(i2c_base->i2c_sa)) = chip;
> - REG(&(i2c_base->i2c_con)) = (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT |
> - I2C_CON_STP);
> - udelay(50000);
> -
> - if (!(REG(&(i2c_base->i2c_stat)) & I2C_STAT_NACK)) {
> - rc = 0;
> - flush_rx(adap);
> - REG(&(i2c_base->i2c_stat)) = 0xffff;
> - } else {
> - REG(&(i2c_base->i2c_stat)) = 0xffff;
> - REG(&(i2c_base->i2c_con)) |= I2C_CON_STP;
> - udelay(20000);
> - if (wait_for_bus(adap))
> - return 1;
> - }
> -
> - flush_rx(adap);
> - REG(&(i2c_base->i2c_stat)) = 0xffff;
> - REG(&(i2c_base->i2c_cnt)) = 0;
> - return rc;
> -}
> -
> -static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> - uint32_t addr, int alen, uint8_t *buf, int len)
> -{
> - struct i2c_regs *i2c_base = davinci_get_base(adap);
> uint32_t tmp;
> int i;
>
> @@ -171,7 +126,7 @@ static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> return 1;
> }
>
> - if (wait_for_bus(adap))
> + if (_wait_for_bus(i2c_base))
> return 1;
>
> if (alen != 0) {
> @@ -181,7 +136,7 @@ static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> REG(&(i2c_base->i2c_sa)) = chip;
> REG(&(i2c_base->i2c_con)) = tmp;
>
> - tmp = poll_i2c_irq(adap, I2C_STAT_XRDY | I2C_STAT_NACK);
> + tmp = _poll_i2c_irq(i2c_base, I2C_STAT_XRDY | I2C_STAT_NACK);
>
> CHECK_NACK();
>
> @@ -195,7 +150,8 @@ static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> return 1;
> }
>
> - tmp = poll_i2c_irq(adap, I2C_STAT_XRDY | I2C_STAT_NACK);
> + tmp = _poll_i2c_irq(i2c_base,
> + I2C_STAT_XRDY | I2C_STAT_NACK);
>
> CHECK_NACK();
> /* No break, fall through */
> @@ -208,8 +164,8 @@ static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> return 1;
> }
>
> - tmp = poll_i2c_irq(adap, I2C_STAT_XRDY |
> - I2C_STAT_NACK | I2C_STAT_ARDY);
> + tmp = _poll_i2c_irq(i2c_base, I2C_STAT_XRDY |
> + I2C_STAT_NACK | I2C_STAT_ARDY);
>
> CHECK_NACK();
>
> @@ -227,7 +183,7 @@ static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> REG(&(i2c_base->i2c_con)) = tmp;
>
> for (i = 0; i < len; i++) {
> - tmp = poll_i2c_irq(adap, I2C_STAT_RRDY | I2C_STAT_NACK |
> + tmp = _poll_i2c_irq(i2c_base, I2C_STAT_RRDY | I2C_STAT_NACK |
> I2C_STAT_ROVR);
>
> CHECK_NACK();
> @@ -240,7 +196,7 @@ static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> }
> }
>
> - tmp = poll_i2c_irq(adap, I2C_STAT_SCD | I2C_STAT_NACK);
> + tmp = _poll_i2c_irq(i2c_base, I2C_STAT_SCD | I2C_STAT_NACK);
>
> CHECK_NACK();
>
> @@ -249,7 +205,7 @@ static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> return 1;
> }
>
> - flush_rx(adap);
> + _flush_rx(i2c_base);
> REG(&(i2c_base->i2c_stat)) = 0xffff;
> REG(&(i2c_base->i2c_cnt)) = 0;
> REG(&(i2c_base->i2c_con)) = 0;
> @@ -257,10 +213,9 @@ static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> return 0;
> }
>
> -static int davinci_i2c_write(struct i2c_adapter *adap, uint8_t chip,
> - uint32_t addr, int alen, uint8_t *buf, int len)
> +static int _davinci_i2c_write(struct i2c_regs *i2c_base, uint8_t chip,
> + uint32_t addr, int alen, uint8_t *buf, int len)
> {
> - struct i2c_regs *i2c_base = davinci_get_base(adap);
> uint32_t tmp;
> int i;
>
> @@ -273,7 +228,7 @@ static int davinci_i2c_write(struct i2c_adapter *adap, uint8_t chip,
> return 1;
> }
>
> - if (wait_for_bus(adap))
> + if (_wait_for_bus(i2c_base))
> return 1;
>
> /* Start address phase */
> @@ -287,7 +242,7 @@ static int davinci_i2c_write(struct i2c_adapter *adap, uint8_t chip,
> switch (alen) {
> case 2:
> /* Send address MSByte */
> - tmp = poll_i2c_irq(adap, I2C_STAT_XRDY | I2C_STAT_NACK);
> + tmp = _poll_i2c_irq(i2c_base, I2C_STAT_XRDY | I2C_STAT_NACK);
>
> CHECK_NACK();
>
> @@ -300,7 +255,7 @@ static int davinci_i2c_write(struct i2c_adapter *adap, uint8_t chip,
> /* No break, fall through */
> case 1:
> /* Send address LSByte */
> - tmp = poll_i2c_irq(adap, I2C_STAT_XRDY | I2C_STAT_NACK);
> + tmp = _poll_i2c_irq(i2c_base, I2C_STAT_XRDY | I2C_STAT_NACK);
>
> CHECK_NACK();
>
> @@ -313,7 +268,7 @@ static int davinci_i2c_write(struct i2c_adapter *adap, uint8_t chip,
> }
>
> for (i = 0; i < len; i++) {
> - tmp = poll_i2c_irq(adap, I2C_STAT_XRDY | I2C_STAT_NACK);
> + tmp = _poll_i2c_irq(i2c_base, I2C_STAT_XRDY | I2C_STAT_NACK);
>
> CHECK_NACK();
>
> @@ -323,7 +278,7 @@ static int davinci_i2c_write(struct i2c_adapter *adap, uint8_t chip,
> return 1;
> }
>
> - tmp = poll_i2c_irq(adap, I2C_STAT_SCD | I2C_STAT_NACK);
> + tmp = _poll_i2c_irq(i2c_base, I2C_STAT_SCD | I2C_STAT_NACK);
>
> CHECK_NACK();
>
> @@ -332,7 +287,7 @@ static int davinci_i2c_write(struct i2c_adapter *adap, uint8_t chip,
> return 1;
> }
>
> - flush_rx(adap);
> + _flush_rx(i2c_base);
> REG(&(i2c_base->i2c_stat)) = 0xffff;
> REG(&(i2c_base->i2c_cnt)) = 0;
> REG(&(i2c_base->i2c_con)) = 0;
> @@ -340,6 +295,42 @@ static int davinci_i2c_write(struct i2c_adapter *adap, uint8_t chip,
> return 0;
> }
>
> +static int _davinci_i2c_probe_chip(struct i2c_regs *i2c_base, uint8_t chip)
> +{
> + int rc = 1;
> +
> + if (chip == REG(&(i2c_base->i2c_oa)))
> + return rc;
> +
> + REG(&(i2c_base->i2c_con)) = 0;
> + if (_wait_for_bus(i2c_base))
> + return 1;
> +
> + /* try to read one byte from current (or only) address */
> + REG(&(i2c_base->i2c_cnt)) = 1;
> + REG(&(i2c_base->i2c_sa)) = chip;
> + REG(&(i2c_base->i2c_con)) = (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT |
> + I2C_CON_STP);
> + udelay(50000);
> +
> + if (!(REG(&(i2c_base->i2c_stat)) & I2C_STAT_NACK)) {
> + rc = 0;
> + _flush_rx(i2c_base);
> + REG(&(i2c_base->i2c_stat)) = 0xffff;
> + } else {
> + REG(&(i2c_base->i2c_stat)) = 0xffff;
> + REG(&(i2c_base->i2c_con)) |= I2C_CON_STP;
> + udelay(20000);
> + if (_wait_for_bus(i2c_base))
> + return 1;
> + }
> +
> + _flush_rx(i2c_base);
> + REG(&(i2c_base->i2c_stat)) = 0xffff;
> + REG(&(i2c_base->i2c_cnt)) = 0;
> + return rc;
> +}
> +
> static struct i2c_regs *davinci_get_base(struct i2c_adapter *adap)
> {
> switch (adap->hwadapnr) {
> @@ -361,7 +352,51 @@ static struct i2c_regs *davinci_get_base(struct i2c_adapter *adap)
> return NULL;
> }
>
> -U_BOOT_I2C_ADAP_COMPLETE(davinci_0, davinci_i2c_init, davinci_i2c_probe,
> +static uint davinci_i2c_setspeed(struct i2c_adapter *adap, uint speed)
> +{
> + struct i2c_regs *i2c_base = davinci_get_base(adap);
> + uint ret;
> +
> + adap->speed = speed;
> + ret = _davinci_i2c_setspeed(i2c_base, speed);
> +
> + return ret;
> +}
> +
> +static void davinci_i2c_init(struct i2c_adapter *adap, int speed,
> + int slaveadd)
> +{
> + struct i2c_regs *i2c_base = davinci_get_base(adap);
> +
> + adap->speed = speed;
> + _davinci_i2c_init(i2c_base, speed, slaveadd);
> +
> + return;
> +}
> +
> +static int davinci_i2c_read(struct i2c_adapter *adap, uint8_t chip,
> + uint32_t addr, int alen, uint8_t *buf, int len)
> +{
> + struct i2c_regs *i2c_base = davinci_get_base(adap);
> + return _davinci_i2c_read(i2c_base, chip, addr, alen, buf, len);
> +}
> +
> +static int davinci_i2c_write(struct i2c_adapter *adap, uint8_t chip,
> + uint32_t addr, int alen, uint8_t *buf, int len)
> +{
> + struct i2c_regs *i2c_base = davinci_get_base(adap);
> +
> + return _davinci_i2c_write(i2c_base, chip, addr, alen, buf, len);
> +}
> +
> +static int davinci_i2c_probe_chip(struct i2c_adapter *adap, uint8_t chip)
> +{
> + struct i2c_regs *i2c_base = davinci_get_base(adap);
> +
> + return _davinci_i2c_probe_chip(i2c_base, chip);
> +}
> +
> +U_BOOT_I2C_ADAP_COMPLETE(davinci_0, davinci_i2c_init, davinci_i2c_probe_chip,
> davinci_i2c_read, davinci_i2c_write,
> davinci_i2c_setspeed,
> CONFIG_SYS_DAVINCI_I2C_SPEED,
> @@ -369,7 +404,7 @@ U_BOOT_I2C_ADAP_COMPLETE(davinci_0, davinci_i2c_init, davinci_i2c_probe,
> 0)
>
> #if I2C_BUS_MAX >= 2
> -U_BOOT_I2C_ADAP_COMPLETE(davinci_1, davinci_i2c_init, davinci_i2c_probe,
> +U_BOOT_I2C_ADAP_COMPLETE(davinci_1, davinci_i2c_init, davinci_i2c_probe_chip,
> davinci_i2c_read, davinci_i2c_write,
> davinci_i2c_setspeed,
> CONFIG_SYS_DAVINCI_I2C_SPEED1,
> @@ -378,7 +413,7 @@ U_BOOT_I2C_ADAP_COMPLETE(davinci_1, davinci_i2c_init, davinci_i2c_probe,
> #endif
>
> #if I2C_BUS_MAX >= 3
> -U_BOOT_I2C_ADAP_COMPLETE(davinci_2, davinci_i2c_init, davinci_i2c_probe,
> +U_BOOT_I2C_ADAP_COMPLETE(davinci_2, davinci_i2c_init, davinci_i2c_probe_chip,
> davinci_i2c_read, davinci_i2c_write,
> davinci_i2c_setspeed,
> CONFIG_SYS_DAVINCI_I2C_SPEED2,
>
--
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