On Wednesday, August 12, 2015 at 08:43:52 PM, Andrew Ruder wrote:

Commit message is missing :'-(

> Cc: Marek Vasut <ma...@denx.de>
> Cc: Heiko Schocher <h...@denx.de>
> Signed-off-by: Andrew Ruder <andrew.ru...@elecsyscorp.com>
> ---
> 
> This driver was written before the driver model stuff was really around (or
> at least based on a U-Boot version that only had very preliminary support)
> so there might be some older conventions in use here.  I have tested on a
> PXA270 board running upstream master with this driver, however - so to
> some extent this all still works fine.  Let me know if things need to
> change to be accepted, and I'll try to find some time to update!
> 
>  drivers/i2c/Makefile  |   1 +
>  drivers/i2c/pxa_i2c.c | 796
> ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 797
> insertions(+)
>  create mode 100644 drivers/i2c/pxa_i2c.c
> 
> diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
> index 9b45248..cf2c8a8 100644
> --- a/drivers/i2c/Makefile
> +++ b/drivers/i2c/Makefile
> @@ -30,6 +30,7 @@ obj-$(CONFIG_SYS_I2C_MXS) += mxs_i2c.o
>  obj-$(CONFIG_SYS_I2C_OMAP24XX) += omap24xx_i2c.o
>  obj-$(CONFIG_SYS_I2C_OMAP34XX) += omap24xx_i2c.o
>  obj-$(CONFIG_SYS_I2C_PPC4XX) += ppc4xx_i2c.o
> +obj-$(CONFIG_SYS_I2C_PXA) += pxa_i2c.o
>  obj-$(CONFIG_SYS_I2C_RCAR) += rcar_i2c.o
>  obj-$(CONFIG_SYS_I2C_S3C24X0) += s3c24x0_i2c.o
>  obj-$(CONFIG_SYS_I2C_SANDBOX) += sandbox_i2c.o i2c-emul-uclass.o
> diff --git a/drivers/i2c/pxa_i2c.c b/drivers/i2c/pxa_i2c.c
> new file mode 100644
> index 0000000..859d6cf
> --- /dev/null
> +++ b/drivers/i2c/pxa_i2c.c
> @@ -0,0 +1,796 @@
> +/*
> + *  pxa_i2c.c
> + *
> + *  I2C adapter for the PXA I2C bus access.
> + *
> + *  Copyright (C) 2002 Intrinsyc Software Inc.
> + *  Copyright (C) 2004-2005 Deep Blue Solutions Ltd.
> + *  Copyright (C) 2014 Andrew Ruder
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License version 2 as
> + *  published by the Free Software Foundation.
> + *
> + *  This is a heavily modified version of the PXA I2C driver from the
> Linux + *  kernel 3.15.10.
> + */
> +
> +#include <common.h>
> +#include <compiler.h>
> +#include <i2c.h>
> +#include <asm/arch/pxa-regs.h>
> +
> +#include <asm/errno.h>
> +#include <asm/io.h>
> +
> +#define MAX_TRANSFER_MS 5000
> +#define WAIT_MASTER_MS 64
> +#define ABORT_LENGTH_MS 50
> +
> +/* Set up some defaults for various configurable pieces of this driver
> + * so that most of the time we don't need extra things defined

Multiline comment should be of the form:

/*
 * foo
 * bar
 */

> + */
> +#if !defined(CONFIG_SYS_PXA_STD_I2C_SPEED)
> +#define CONFIG_SYS_PXA_STD_I2C_SPEED 100000
> +#endif
> +
> +#if !defined(CONFIG_SYS_PXA_STD_I2C_SLAVE)
> +#define CONFIG_SYS_PXA_STD_I2C_SLAVE 1
> +#endif
> +
> +#if !defined(CONFIG_SYS_PXA_PWR_I2C_SPEED)
> +#define CONFIG_SYS_PXA_PWR_I2C_SPEED 40000
> +#endif
> +
> +#if !defined(CONFIG_SYS_PXA_PWR_I2C_SLAVE)
> +#define CONFIG_SYS_PXA_PWR_I2C_SLAVE 1
> +#endif

Please remove all this stuff, it's only going to hide bugs.

> +#if defined(CONFIG_CPU_MONAHANS) && defined(CONFIG_PXA_PWR_I2C)
> +#warning Monahans + PWRI2C is unlikely to work without additional testing
> +#endif
> +

[...]

> +#define ISR_ITE              (1 << 6)           /* tx buffer empty */
> +#define ISR_IRF              (1 << 7)           /* rx buffer full */
> +#define ISR_GCAD     (1 << 8)           /* general call address detected */
> +#define ISR_SAD              (1 << 9)           /* slave address detected */
> +#define ISR_BED              (1 << 10)          /* bus error no ACK/NAK */
> +
> +struct pxa_i2c_msg {
> +     u16 addr;
> +     u16 flags;
> +#define I2C_M_TEN            0x0010  /* this is a ten bit chip address */

Be consistent about using 1 << n or 0x0n00 please. Just use the BIT(n) macro.

> +#define I2C_M_RD             0x0001  /* read data, from slave to master */
> +#define I2C_M_STOP           0x8000  /* if I2C_FUNC_PROTOCOL_MANGLING */
> +#define I2C_M_NOSTART                0x4000  /* if I2C_FUNC_NOSTART */
> +#define I2C_M_REV_DIR_ADDR   0x2000  /* if I2C_FUNC_PROTOCOL_MANGLING */
> +#define I2C_M_IGNORE_NAK     0x1000  /* if I2C_FUNC_PROTOCOL_MANGLING */
> +#define I2C_M_NO_RD_ACK              0x0800  /* if 
> I2C_FUNC_PROTOCOL_MANGLING 
*/
> +#define I2C_M_RECV_LEN               0x0400  /* length will be first 
> received 
byte */
> +#define I2C_M_FIRST          0x0800  /* First message in a chain */
> +     u16 len;
> +     u8 *buf;
> +};
> +
> +struct pxa_i2c_state {
> +     struct pxa_i2c_msg      *msg;
> +     unsigned int            msg_num;
> +     unsigned int            msg_ptr;
> +};
> +
> +#define STD_I2C_BASE 0x40301680
> +#if defined(CONFIG_CPU_PXA27X) || defined(CONFIG_CPU_PXA25X)
> +#define PWR_I2C_BASE 0x40f00180
> +#define IBMR_OFFSET  0x00
> +#define IDBR_OFFSET  0x08
> +#define ICR_OFFSET   0x10
> +#define ISR_OFFSET   0x18
> +#define ISAR_OFFSET  0x20
> +#elif defined(CONFIG_CPU_MONAHANS)
> +#define PWR_I2C_BASE 0x40f500c0
> +#define IBMR_OFFSET  0x00
> +#define IDBR_OFFSET  0x04
> +#define ICR_OFFSET   0x08
> +#define ISR_OFFSET   0x0c
> +#define ISAR_OFFSET  0x10
> +#endif
> +
> +static inline void __iomem *
> +pxa_i2c_base(const struct i2c_adapter *adap)
> +{
> +     return (adap->hwadapnr == 0) ? (void *)STD_I2C_BASE : (void
> *)PWR_I2C_BASE; +}
> +
> +static inline void __iomem *
> +pxa_i2c_ibmr(const struct i2c_adapter *adap)
> +{
> +     return (void *)((char *)pxa_i2c_base(adap) + IBMR_OFFSET);

No need for these hideous casts, just use pxa_i2c_base() + OFFSET in the code.

> +}

[...]

> +static void
> +i2c_pxa_abort(struct i2c_adapter *adap)
> +{
> +     unsigned long long end;
> +
> +     end = get_ticks() + (get_tbclk() / 1000) * ABORT_LENGTH_MS;
> +
> +     while ((get_ticks() < end) &&

Please use get_timer() to implement the delay loop.

time = get_timer(0);
while (true) {
        reg = readl();
        if (reg & bit)
                break;

        if (get_timer(time) > timeout)
                return -ETIMEDOUT;
}

Also, the lpc32xx patches recently implemented a wait_for_bit() function.
If you make this generic, that'd be really cool.

> +            (readl(_IBMR(adap)) & 0x1) == 0) {
> +             unsigned long icr = readl(_ICR(adap));
> +
> +             icr &= ~ICR_START;
> +             icr |= ICR_ACKNAK | ICR_STOP | ICR_TB;
> +
> +             writel(icr, _ICR(adap));
> +
> +             show_state(adap);
> +
> +             mdelay(1);
> +     }
> +
> +     writel(readl(_ICR(adap)) & ~(ICR_MA | ICR_START | ICR_STOP),
> +            _ICR(adap));

Please use clrsetbits_le32();

> +}
[...]
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to