diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c
index 722d1bc..c799695 100755
--- a/arch/arm/mach-omap2/board-ldp.c
+++ b/arch/arm/mach-omap2/board-ldp.c
@@ -805,7 +805,7 @@ static struct i2c_board_info __initdata ldp_i2c_boardinfo_2[] = {
 
 static int __init omap_i2c_init(void)
 {
-	omap_register_i2c_bus(1, 400, ldp_i2c_boardinfo,
+	omap_register_i2c_bus(1, 2600, ldp_i2c_boardinfo,
 			ARRAY_SIZE(ldp_i2c_boardinfo));
 	omap_register_i2c_bus(2, 100, ldp_i2c_boardinfo_2,
 			ARRAY_SIZE(ldp_i2c_boardinfo_2));
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index 9a05419..0bd8332 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -91,7 +91,9 @@
 #define OMAP_I2C_STAT_NACK	(1 << 1)	/* No ack interrupt enable */
 #define OMAP_I2C_STAT_AL	(1 << 0)	/* Arbitration lost int ena */
 
-/* I2C WE wakeup enable register */
+/* I2C WE wakeup enable register 
+ * Don't use WE_STC unless I+F clocks are OFF else bad FSM
+ */
 #define OMAP_I2C_WE_XDR_WE	(1 << 14)	/* TX drain wakup */
 #define OMAP_I2C_WE_RDR_WE	(1 << 13)	/* RX drain wakeup */
 #define OMAP_I2C_WE_ROVR_WE	(1 << 11)	/* RX overflow wakeup */
@@ -108,9 +110,9 @@
 #define OMAP_I2C_WE_ALL		(OMAP_I2C_WE_XDR_WE | OMAP_I2C_WE_RDR_WE | \
 				OMAP_I2C_WE_ROVR_WE | OMAP_I2C_WE_ROVR_WE | \
 				OMAP_I2C_WE_AAS_WE | OMAP_I2C_WE_BF_WE | \
-				OMAP_I2C_WE_STC_WE | OMAP_I2C_WE_GC_WE | \
-				OMAP_I2C_WE_DRDY_WE | OMAP_I2C_WE_ARDY_WE | \
-				OMAP_I2C_WE_NACK_WE | OMAP_I2C_WE_AL_WE)
+				OMAP_I2C_WE_GC_WE | OMAP_I2C_WE_DRDY_WE | \
+				OMAP_I2C_WE_ARDY_WE | OMAP_I2C_WE_NACK_WE | \
+				OMAP_I2C_WE_AL_WE)
 
 /* I2C Buffer Configuration Register (OMAP_I2C_BUF): */
 #define OMAP_I2C_BUF_RDMA_EN	(1 << 15)	/* RX DMA channel enable */
@@ -284,6 +286,7 @@ static int omap_i2c_init(struct omap_i2c_dev *dev)
 	unsigned long fclk_rate = 12000000;
 	unsigned long timeout;
 	unsigned long internal_clk = 0;
+	int delay_count = 100;
 
 	if (dev->rev >= OMAP_I2C_REV_2) {
 		omap_i2c_write_reg(dev, OMAP_I2C_SYSC_REG, SYSC_SOFTRESET_MASK);
@@ -298,7 +301,10 @@ static int omap_i2c_init(struct omap_i2c_dev *dev)
 						"for controller reset\n");
 				return -ETIMEDOUT;
 			}
-			msleep(1);
+			if( --delay_count > 0 )
+				udelay(1);
+			else    
+				msleep(1);
 		}
 
 		/* SYSC register is cleared by the reset; rewrite it */
@@ -428,14 +434,18 @@ static int omap_i2c_init(struct omap_i2c_dev *dev)
 static int omap_i2c_wait_for_bb(struct omap_i2c_dev *dev)
 {
 	unsigned long timeout;
-
+	int delay_count = 100;
+	
 	timeout = jiffies + OMAP_I2C_TIMEOUT;
 	while (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG) & OMAP_I2C_STAT_BB) {
 		if (time_after(jiffies, timeout)) {
 			dev_warn(dev->dev, "timeout waiting for bus ready\n");
 			return -ETIMEDOUT;
 		}
-		msleep(1);
+		if( --delay_count > 0 )
+			udelay(1);
+		else    
+			msleep(1);
 	}
 
 	return 0;
@@ -506,7 +516,7 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,
 			}
 			cpu_relax();
 		}
-
+		/* FIXME: should consider ARDY value before writing to I2C_CON */
 		w |= OMAP_I2C_CON_STP;
 		w &= ~OMAP_I2C_CON_STT;
 		omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, w);
@@ -693,8 +703,11 @@ omap_i2c_isr(int this_irq, void *dev_id)
 			err |= OMAP_I2C_STAT_AL;
 		}
 		if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
-					OMAP_I2C_STAT_AL))
-			omap_i2c_complete_cmd(dev, err);
+					OMAP_I2C_STAT_AL)){
+				/* errata: ARDY needs double clear for some hardware */
+				omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, OMAP_I2C_STAT_ARDY);	
+				omap_i2c_complete_cmd(dev, err);
+		}
 		if (stat & (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR)) {
 			u8 num_bytes = 1;
 			if (dev->fifo_size) {
@@ -866,9 +879,11 @@ omap_i2c_probe(struct platform_device *pdev)
 		 * call back latencies.
 		 */
 		dev->fifo_size = (dev->fifo_size / 2);
-		dev->b_hw = 1; /* Enable hardware fixes */
 	}
 
+	if (cpu_is_omap2430())
+		dev->b_hw = 1; /* Enable hardware fix (might be es1 only) */
+
 	/* reset ASAP, clearing any IRQs */
 	omap_i2c_init(dev);
 
