]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/i2c/designware_i2c.c
blackfin: the sclk MHz in i2c driver should be divided by 1000 other than 1024
[karo-tx-uboot.git] / drivers / i2c / designware_i2c.c
index c2f06627d3e312b52a24c6310927a317d4dd506d..9ed929521a8944dc870fc2eff546507632b6e86a 100644 (file)
@@ -151,7 +151,19 @@ void i2c_init(int speed, int slaveadd)
  */
 static void i2c_setaddress(unsigned int i2c_addr)
 {
+       unsigned int enbl;
+
+       /* Disable i2c */
+       enbl = readl(&i2c_regs_p->ic_enable);
+       enbl &= ~IC_ENABLE_0B;
+       writel(enbl, &i2c_regs_p->ic_enable);
+
        writel(i2c_addr, &i2c_regs_p->ic_tar);
+
+       /* Enable i2c */
+       enbl = readl(&i2c_regs_p->ic_enable);
+       enbl |= IC_ENABLE_0B;
+       writel(enbl, &i2c_regs_p->ic_enable);
 }
 
 /*
@@ -237,9 +249,6 @@ static int i2c_xfer_finish(void)
 
        i2c_flush_rxfifo();
 
-       /* Wait for read/write operation to complete on actual memory */
-       udelay(10000);
-
        return 0;
 }
 
@@ -257,6 +266,25 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
 {
        unsigned long start_time_rx;
 
+#ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
+       /*
+        * EEPROM chips that implement "address overflow" are ones
+        * like Catalyst 24WC04/08/16 which has 9/10/11 bits of
+        * address and the extra bits end up in the "chip address"
+        * bit slots. This makes a 24WC08 (1Kbyte) chip look like
+        * four 256 byte chips.
+        *
+        * Note that we consider the length of the address field to
+        * still be one byte because the extra address bits are
+        * hidden in the chip address.
+        */
+       chip |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW);
+       addr &= ~(CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW << (alen * 8));
+
+       debug("%s: fix addr_overflow: chip %02x addr %02x\n", __func__, chip,
+             addr);
+#endif
+
        if (check_params(addr, alen, buffer, len))
                return 1;
 
@@ -298,6 +326,25 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
        int nb = len;
        unsigned long start_time_tx;
 
+#ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
+       /*
+        * EEPROM chips that implement "address overflow" are ones
+        * like Catalyst 24WC04/08/16 which has 9/10/11 bits of
+        * address and the extra bits end up in the "chip address"
+        * bit slots. This makes a 24WC08 (1Kbyte) chip look like
+        * four 256 byte chips.
+        *
+        * Note that we consider the length of the address field to
+        * still be one byte because the extra address bits are
+        * hidden in the chip address.
+        */
+       chip |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW);
+       addr &= ~(CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW << (alen * 8));
+
+       debug("%s: fix addr_overflow: chip %02x addr %02x\n", __func__, chip,
+             addr);
+#endif
+
        if (check_params(addr, alen, buffer, len))
                return 1;