Hi

Had a look at my old driver and it needs a little care.

Basically this block has changed 

> +     if(count > 16){
> +             /* Chip bug, set enable here */
> +             local_irq_save(flags);
> +             i2c->i2c_i2cmr = 0x13;  /* Enable some interupts */
> +             i2c->i2c_i2cer = 0xff;
> +             i2c->i2c_i2mod |= 1;    /* Enable */
> +             i2c->i2c_i2com |= 0x80; /* Begin transmission */
> +
> +             /* Wait for IIC transfer */
> +             tmo = interruptible_sleep_on_timeout(&iic_wait,1*HZ);
> +             local_irq_restore(flags);
> +     } else { /* busy wait for small transfers, its faster */
> +             i2c->i2c_i2cmr = 0x00;  /* Disable I2C interupts */
> +             i2c->i2c_i2cer = 0xff;
> +             i2c->i2c_i2mod |= 1;    /* Enable */
> +             i2c->i2c_i2com |= 0x80; /* Begin transmission */
> +             tmo = jiffies + 1*HZ;
> +             /* Busy wait, with a timeout */
> +             while(!(i2c->i2c_i2cer & 0x11 || time_after(jiffies, tmo)));
> +     }

into

> +             /* Chip bug, set enable here */
> +             local_irq_save(flags);
> +             i2c->i2c_i2cmr = 0x13;  /* Enable some interupts */
> +             i2c->i2c_i2cer = 0xff;
> +             i2c->i2c_i2mod |= 1;    /* Enable */
> +             i2c->i2c_i2com |= 0x80 | 0x01; /* Begin transmission and force 
> master.
                                              Some errors(CL) clears the M/S 
bit */
> +
> +             /* Wait for IIC transfer */
> +             tmo = interruptible_sleep_on_timeout(&iic_wait,1*HZ);
> +             local_irq_restore(flags);

I have done this for cpm_iic_read, cpm_iic_write and cpm_iic_try_address.
Also note the the addition of "| 0x01" to i2c->i2c_i2com.

Reply via email to