mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 11:16:11 +00:00
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
This commit is contained in:
commit
4310471668
2 changed files with 15 additions and 4 deletions
|
@ -693,13 +693,13 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* Set TWI internal clock as 10MHz */
|
||||
write_CONTROL(iface, ((get_sclk() / 1024 / 1024 + 5) / 10) & 0x7F);
|
||||
write_CONTROL(iface, ((get_sclk() / 1000 / 1000 + 5) / 10) & 0x7F);
|
||||
|
||||
/*
|
||||
* We will not end up with a CLKDIV=0 because no one will specify
|
||||
* 20kHz SCL or less in Kconfig now. (5 * 1024 / 20 = 0x100)
|
||||
* 20kHz SCL or less in Kconfig now. (5 * 1000 / 20 = 250)
|
||||
*/
|
||||
clkhilow = 5 * 1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ;
|
||||
clkhilow = ((10 * 1000 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ) + 1) / 2;
|
||||
|
||||
/* Set Twi interface clock as specified */
|
||||
write_CLKDIV(iface, (clkhilow << 8) | clkhilow);
|
||||
|
|
|
@ -247,6 +247,12 @@ static void omap_i2c_unidle(struct omap_i2c_dev *dev)
|
|||
omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN);
|
||||
}
|
||||
dev->idle = 0;
|
||||
|
||||
/*
|
||||
* Don't write to this register if the IE state is 0 as it can
|
||||
* cause deadlock.
|
||||
*/
|
||||
if (dev->iestate)
|
||||
omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate);
|
||||
}
|
||||
|
||||
|
@ -280,6 +286,11 @@ static int omap_i2c_init(struct omap_i2c_dev *dev)
|
|||
unsigned long internal_clk = 0;
|
||||
|
||||
if (dev->rev >= OMAP_I2C_REV_2) {
|
||||
/* Disable I2C controller before soft reset */
|
||||
omap_i2c_write_reg(dev, OMAP_I2C_CON_REG,
|
||||
omap_i2c_read_reg(dev, OMAP_I2C_CON_REG) &
|
||||
~(OMAP_I2C_CON_EN));
|
||||
|
||||
omap_i2c_write_reg(dev, OMAP_I2C_SYSC_REG, SYSC_SOFTRESET_MASK);
|
||||
/* For some reason we need to set the EN bit before the
|
||||
* reset done bit gets set. */
|
||||
|
|
Loading…
Reference in a new issue