Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'i2c-fixes' of git://git.fluff.org/bjdooks/linux

* 'i2c-fixes' of git://git.fluff.org/bjdooks/linux:
i2c-omap: OMAP3: Fix I2C lockup during timeout/error cases
i2c-omap: Don't write IE state in unidle if 0
i2c-bfin-twi: fix CLKDIV calculation

+15 -4
+3 -3
drivers/i2c/busses/i2c-bfin-twi.c
··· 693 693 } 694 694 695 695 /* Set TWI internal clock as 10MHz */ 696 - write_CONTROL(iface, ((get_sclk() / 1024 / 1024 + 5) / 10) & 0x7F); 696 + write_CONTROL(iface, ((get_sclk() / 1000 / 1000 + 5) / 10) & 0x7F); 697 697 698 698 /* 699 699 * We will not end up with a CLKDIV=0 because no one will specify 700 - * 20kHz SCL or less in Kconfig now. (5 * 1024 / 20 = 0x100) 700 + * 20kHz SCL or less in Kconfig now. (5 * 1000 / 20 = 250) 701 701 */ 702 - clkhilow = 5 * 1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ; 702 + clkhilow = ((10 * 1000 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ) + 1) / 2; 703 703 704 704 /* Set Twi interface clock as specified */ 705 705 write_CLKDIV(iface, (clkhilow << 8) | clkhilow);
+12 -1
drivers/i2c/busses/i2c-omap.c
··· 247 247 omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); 248 248 } 249 249 dev->idle = 0; 250 - omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); 250 + 251 + /* 252 + * Don't write to this register if the IE state is 0 as it can 253 + * cause deadlock. 254 + */ 255 + if (dev->iestate) 256 + omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); 251 257 } 252 258 253 259 static void omap_i2c_idle(struct omap_i2c_dev *dev) ··· 286 280 unsigned long internal_clk = 0; 287 281 288 282 if (dev->rev >= OMAP_I2C_REV_2) { 283 + /* Disable I2C controller before soft reset */ 284 + omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 285 + omap_i2c_read_reg(dev, OMAP_I2C_CON_REG) & 286 + ~(OMAP_I2C_CON_EN)); 287 + 289 288 omap_i2c_write_reg(dev, OMAP_I2C_SYSC_REG, SYSC_SOFTRESET_MASK); 290 289 /* For some reason we need to set the EN bit before the 291 290 * reset done bit gets set. */