Hi, * Pais, Allen <allen.pais@xxxxxx> [100121 02:31]: > From 4044fcc9c517e86fbea9f7d3b15d5cf75a767476 Mon Sep 17 00:00:00 2001 > From: Allen Pais <allen.pais@xxxxxx> > Date: Thu, 21 Jan 2010 21:00:04 +0530 > Subject: [PATCH 1/2] omap: Disable GAIA I2C1/I2C4 internal pull-ups > > This patch disables GAIA I2C1 adn I2C4(SR) internal pull-up, to > use only the external HW resistor >=470 Ohm for the assured > functionality in HS mode. > > While testing the I2C in High Speed mode, it was discovered that > without a proper pull-up resistor, there is data corruption during > multi-byte transfer. RTC(time_set) test case was used for testing. > > From the analysis done, it was concluded that ideally we need a > pull-up of 1.6k Ohm(recomended) or atleast 470 Ohm or greater for > assured performance in HS mode. Does this apply to 3630 only, or also 34xx? Is this safe to do always? BTW, once ready it hould be sent to Samuel Ortiz with linux-omap list Cc'd: $ grep -A4 MFD MAINTAINERS MULTIFUNCTION DEVICES (MFD) M: Samuel Ortiz <sameo@xxxxxxxxxxxxxxx> T: git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6.git S: Supported F: drivers/mfd/ Regards, Tony > Signed-off-by: Moiz Sonasath <m-sonasath@xxxxxx> > Signed-off-by: Allen Pais <allen.pais@xxxxxx> > --- > drivers/mfd/twl-core.c | 10 ++++++++++ > include/linux/i2c/twl.h | 13 +++++++++++++ > 2 files changed, 23 insertions(+), 0 deletions(-) > > diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c > index 2a76065..7dcb5e9 100644 > --- a/drivers/mfd/twl-core.c > +++ b/drivers/mfd/twl-core.c > @@ -965,6 +965,7 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id) > int status; > unsigned i; > struct twl4030_platform_data *pdata = client->dev.platform_data; > + u8 temp; > > if (!pdata) { > dev_dbg(&client->dev, "no platform data?\n"); > @@ -1031,6 +1032,15 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id) > if (status < 0) > goto fail; > } > + /* Disable GAIA I2C Pull-up on I2C1 and I2C4(SR) interface > + * program I2C_SCL_CTRL_PU(bit 0)=0, I2C_SDA_CTRL_PU (bit 2)=0, > + * SR_I2C_SCL_CTRL_PU(bit 4)=0 and SR_I2C_SDA_CTRL_PU(bit 6)=0. > + */ > + > + twl_i2c_read_u8(TWL4030_MODULE_INTBR, &temp, REG_GPPUPDCTR1); > + temp &= ~(SR_I2C_SDA_CTRL_PU | SR_I2C_SCL_CTRL_PU | \ > + I2C_SDA_CTRL_PU | I2C_SCL_CTRL_PU); > + twl_i2c_write_u8(TWL4030_MODULE_INTBR, temp, REG_GPPUPDCTR1); > > status = add_children(pdata, id->driver_data); > fail: > diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h > index bf1c5be..2f4faf9 100644 > --- a/include/linux/i2c/twl.h > +++ b/include/linux/i2c/twl.h > @@ -168,6 +168,19 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); > int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); > int twl6030_interrupt_mask(u8 bit_mask, u8 offset); > > +/*Interface Bit Register (INTBR) offsets > + *(Use TWL_4030_MODULE_INTBR) > + */ > + > +#define REG_GPPUPDCTR1 0x0F > + > +/*I2C1 and I2C4(SR) SDA/SCL pull-up control bits */ > + > +#define I2C_SCL_CTRL_PU BIT(0) > +#define I2C_SDA_CTRL_PU BIT(2) > +#define SR_I2C_SCL_CTRL_PU BIT(4) > +#define SR_I2C_SDA_CTRL_PU BIT(6) > + > /*----------------------------------------------------------------------*/ > > /* > -- > 1.6.3.3 > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html