summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergii Postulga <x0153364@ti.com>2011-10-10 15:10:56 -0500
committerDan Murphy <dmurphy@ti.com>2012-05-09 07:59:18 -0500
commite7722019d1f1eaccc8a81129b8aa20221891aeb8 (patch)
tree2929c55799eb15b75a74031afea775c33861769a
parentdcac2f14a0936fb382a4a77a94eb84f162aa81b1 (diff)
downloadomap-omapzoom-e7722019d1f1eaccc8a81129b8aa20221891aeb8.tar.gz
ARM: OMAP4: Add resistor selection code to the I2C platform driver
Add a call into the I2C to set the I2C pullup resistor strength. Change-Id: I0bb9eee666d75e04ebd752cb15f1c41a9c8a7b71 Signed-off-by: Dan Murphy <dmurphy@ti.com>
-rw-r--r--arch/arm/plat-omap/i2c.c64
-rw-r--r--arch/arm/plat-omap/include/plat/i2c.h7
2 files changed, 71 insertions, 0 deletions
diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c
index e2cfcc3e4333..b0b28ef4fc3b 100644
--- a/arch/arm/plat-omap/i2c.c
+++ b/arch/arm/plat-omap/i2c.c
@@ -32,6 +32,7 @@
#include <linux/clk.h>
#include <mach/irqs.h>
+#include "../../../../arch/arm/mach-omap2/control.h"
#include <plat/mux.h>
#include <plat/i2c.h>
#include <plat/omap_device.h>
@@ -263,6 +264,69 @@ void omap_register_i2c_bus_board_data(int bus_id,
}
/**
+ * omap2_i2c_pullup - setup pull-up resistors for I2C bus
+ * @bus_id: bus id counting from number 1
+ * @sda_pullup: Pull-up resistor for SDA and SCL pins
+ *
+ */
+void omap2_i2c_pullup(int bus_id, enum omap_i2c_pullup_values pullup)
+{
+ u32 val = 0;
+
+
+ if (bus_id < 1 || bus_id > omap_i2c_nr_ports() ||
+ pullup > I2C_PULLUP_STD_NA_FAST_300_OM) {
+ pr_err("%s:Wrong pullup (%d) or use wrong I2C port (%d)\n",
+ __func__, pullup, bus_id);
+ return;
+ }
+
+ val = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_I2C_0);
+ switch (bus_id) {
+ case 1:
+ /* Setup PULL-UP resistor for I2C-1 */
+ val &= ~(OMAP4_I2C1_SDA_LOAD_BITS_MASK |
+ OMAP4_I2C1_SCL_LOAD_BITS_MASK |
+ OMAP4_I2C1_SDA_PULLUPRESX_MASK |
+ OMAP4_I2C1_SCL_PULLUPRESX_MASK);
+ val |= ((pullup << OMAP4_I2C1_SDA_LOAD_BITS_SHIFT) |
+ (pullup << OMAP4_I2C1_SCL_LOAD_BITS_SHIFT));
+ break;
+ case 2:
+ /* Setup PULL-UP resistor for I2C-2 */
+ val &= ~(OMAP4_I2C2_SDA_LOAD_BITS_MASK |
+ OMAP4_I2C2_SCL_LOAD_BITS_MASK |
+ OMAP4_I2C2_SDA_PULLUPRESX_MASK |
+ OMAP4_I2C2_SCL_PULLUPRESX_MASK);
+ val |= ((pullup << OMAP4_I2C2_SDA_LOAD_BITS_SHIFT) |
+ (pullup << OMAP4_I2C2_SCL_LOAD_BITS_SHIFT));
+ break;
+ case 3:
+ /* Setup PULL-UP resistor for I2C-3 */
+ val &= ~(OMAP4_I2C3_SDA_LOAD_BITS_MASK |
+ OMAP4_I2C3_SCL_LOAD_BITS_MASK |
+ OMAP4_I2C3_SDA_PULLUPRESX_MASK |
+ OMAP4_I2C3_SCL_PULLUPRESX_MASK);
+ val |= ((pullup << OMAP4_I2C3_SDA_LOAD_BITS_SHIFT) |
+ (pullup << OMAP4_I2C3_SCL_LOAD_BITS_SHIFT));
+ break;
+ case 4:
+ /* Setup PULL-UP resistor for I2C-4 */
+ val &= ~(OMAP4_I2C4_SDA_LOAD_BITS_MASK |
+ OMAP4_I2C4_SCL_LOAD_BITS_MASK |
+ OMAP4_I2C4_SDA_PULLUPRESX_MASK |
+ OMAP4_I2C4_SCL_PULLUPRESX_MASK);
+ val |= ((pullup << OMAP4_I2C4_SDA_LOAD_BITS_SHIFT) |
+ (pullup << OMAP4_I2C4_SCL_LOAD_BITS_SHIFT));
+ break;
+ default:
+ return;
+ }
+
+ omap4_ctrl_pad_writel(val, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_I2C_0);
+}
+
+/**
* omap_i2c_get_hwspinlockid - Get HWSPINLOCK ID for I2C device
* @dev: I2C device
*
diff --git a/arch/arm/plat-omap/include/plat/i2c.h b/arch/arm/plat-omap/include/plat/i2c.h
index 55ae3bd7a843..98395d432bec 100644
--- a/arch/arm/plat-omap/include/plat/i2c.h
+++ b/arch/arm/plat-omap/include/plat/i2c.h
@@ -72,11 +72,18 @@ struct omap_i2c_dev_attr {
u8 fifo_depth;
u32 flags;
};
+enum omap_i2c_pullup_values {
+ I2C_PULLUP_STD_4K5_FAST_1K66 = 0,
+ I2C_PULLUP_STD_2K1_FAST_920OM,
+ I2C_PULLUP_STD_860_OM_FAST_500_OM,
+ I2C_PULLUP_STD_NA_FAST_300_OM
+};
void __init omap1_i2c_mux_pins(int bus_id);
void __init omap2_i2c_mux_pins(int bus_id);
struct omap_hwmod;
int omap_i2c_reset(struct omap_hwmod *oh);
+void omap2_i2c_pullup(int bus_id, enum omap_i2c_pullup_values pullup);
#endif /* __ASM__ARCH_OMAP_I2C_H */