[U-Boot] [PATCH v4] sh: i2c: Add support I2C controller of SH7734

Nobuhiro Iwamatsu nobuhiro.iwamatsu.yj at renesas.com
Fri Mar 2 04:40:45 CET 2012


Hi, Mike.

2012/3/1 Mike Frysinger <vapier at gentoo.org>:
> On Wednesday 29 February 2012 21:58:42 Nobuhiro Iwamatsu wrote:
>> --- /dev/null
>> +++ b/drivers/i2c/sh_sh7734_i2c.c
>>
>> +#include <common.h>
>> +#include <asm/io.h>
>
> should include i2c.h too so you know your funcs match the prototypes everyone
> else uses

OK.

>
>> +static int check_stop(struct sh_i2c *base)
>> +{
>> +     int i, ret = 1;
>> +
>> +     for (i = 0; i < IRQ_WAIT; i++) {
>> +             if (SH_I2C_ICSR_STOP & readb(&base->icsr)) {
>> +                     ret = 0;
>> +                     break;
>> +             }
>> +             udelay(10);
>> +     }
>> +
>> +     clrbits_le8(&base->icsr, SH_I2C_ICSR_STOP);
>> +
>> +     return ret;
>> +}
>> +
>> +static int check_tend(struct sh_i2c *base, int stop)
>> +{
>> +     int i, ret = 1;
>> +
>> +     for (i = 0; i < IRQ_WAIT; i++) {
>> +             if (SH_I2C_ICSR_TEND & readb(&base->icsr)) {
>> +                     ret = 0;
>> +                     break;
>> +             }
>> +             udelay(10);
>> +     }
>> +
>> +     if (stop) {
>> +             u8 data;
>> +
>> +             clrbits_le8(&base->icsr, SH_I2C_ICSR_STOP);
>> +
>> +             sh_i2c_send_stop(base);
>> +     }
>> +
>> +     clrbits_le8(&base->icsr, SH_I2C_ICSR_TEND);
>> +
>> +     return ret;
>> +}
>> +
>> +static int check_tdre(struct sh_i2c *base)
>> +{
>> +     int i;
>> +
>> +     for (i = 0; i < IRQ_WAIT; i++) {
>> +             if (SH_I2C_ICSR_TDRE & readb(&base->icsr))
>> +                     return 0;
>> +             udelay(10);
>> +     }
>> +
>> +     return 1;
>> +}
>> +
>> +static int check_rdrf(struct sh_i2c *base)
>> +{
>> +     int i;
>> +
>> +     for (i = 0; i < IRQ_WAIT; i++) {
>> +             if (SH_I2C_ICSR_RDRF & readb(&base->icsr))
>> +                     return 0;
>> +             udelay(10);
>> +     }
>> +
>> +     return 1;
>> +}
>
> you've got the same icsr bit polling logic here.  probably better to put it
> into a dedicated func which takes the bit flag to check and the rest will call
> that.
>        static int check_icsr_bit(struct sh_i2c *base, uint bit)
>        {
>                int i;
>
>                for (i = 0; i < IRQ_WAIT; i++) {
>                        if (bit & readb(&base->icsr))
>                                return 0;
>                        udelay(10);
>                }
>
>                return 1;
>        }
>
>        static int check_tdre(struct sh_i2c *base)
>        {
>                return check_icsr_bit(base, SH_I2C_ICSR_TDRE);
>        }

OK, I fixed.
>
>> +static u8 i2c_raw_read(struct sh_i2c *base, u8 id, u8 reg)
>> +{
>> ...
>> +     writeb(id << 1 | 1, &base->icdrt);
>
> shifting and bit ops can lead to unexpected behavior ... might be better:
>        writeb((id << 1) | 1, &base->icdrt);
>

OK, I fixed.

>> +/*
>> + * i2c_probe: - Test if a chip answers for a given i2c address
>> + *
>> + * @chip:   address of the chip which is searched for
>> + * @return: 0 if a chip was found, -1 otherwhise
>> + */
>> +int i2c_probe(u8 chip)
>> +{
>> +     return 0;
>> +}
>
> should implement this.  look at the Blackfin twi driver for an easy one.

Thanks for your infomation.
I implemented this.

Thanks,
  Nobuhiro
-- 
Nobuhiro Iwamatsu


More information about the U-Boot mailing list