________________________________________ From: Tony Lindgren [tony@xxxxxxxxxxx] Sent: Monday, February 01, 2010 7:53 PM To: Pais, Allen Cc: linux-omap@xxxxxxxxxxxxxxx Subject: Re: [PATCH 1/2] omap: Disable GAIA I2C1/I2C4 internal pull-ups 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? [Allen] Yes, it does apply to 36xx only. BTW, once ready it hould be sent to Samuel Ortiz with linux-omap list Cc'd: [Allen] i'll have it sent to Samuel also. Thanks, - Allen $ 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