diff options
author | Sergii Postulga <x0153364@ti.com> | 2011-10-10 15:10:56 -0500 |
---|---|---|
committer | Dan Murphy <dmurphy@ti.com> | 2012-05-09 07:59:18 -0500 |
commit | e7722019d1f1eaccc8a81129b8aa20221891aeb8 (patch) | |
tree | 2929c55799eb15b75a74031afea775c33861769a | |
parent | dcac2f14a0936fb382a4a77a94eb84f162aa81b1 (diff) | |
download | omap-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.c | 64 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/i2c.h | 7 |
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 */ |