diff options
| -rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 0037e31076ba..913abd7c172f 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -49,24 +49,24 @@ | |||
| 49 | #define OMAP_I2C_TIMEOUT (msecs_to_jiffies(1000)) | 49 | #define OMAP_I2C_TIMEOUT (msecs_to_jiffies(1000)) |
| 50 | 50 | ||
| 51 | #define OMAP_I2C_REV_REG 0x00 | 51 | #define OMAP_I2C_REV_REG 0x00 |
| 52 | #define OMAP_I2C_IE_REG 0x04 | 52 | #define OMAP_I2C_IE_REG 0x01 |
| 53 | #define OMAP_I2C_STAT_REG 0x08 | 53 | #define OMAP_I2C_STAT_REG 0x02 |
| 54 | #define OMAP_I2C_IV_REG 0x0c | 54 | #define OMAP_I2C_IV_REG 0x03 |
| 55 | /* For OMAP3 I2C_IV has changed to I2C_WE (wakeup enable) */ | 55 | /* For OMAP3 I2C_IV has changed to I2C_WE (wakeup enable) */ |
| 56 | #define OMAP_I2C_WE_REG 0x0c | 56 | #define OMAP_I2C_WE_REG 0x03 |
| 57 | #define OMAP_I2C_SYSS_REG 0x10 | 57 | #define OMAP_I2C_SYSS_REG 0x04 |
| 58 | #define OMAP_I2C_BUF_REG 0x14 | 58 | #define OMAP_I2C_BUF_REG 0x05 |
| 59 | #define OMAP_I2C_CNT_REG 0x18 | 59 | #define OMAP_I2C_CNT_REG 0x06 |
| 60 | #define OMAP_I2C_DATA_REG 0x1c | 60 | #define OMAP_I2C_DATA_REG 0x07 |
| 61 | #define OMAP_I2C_SYSC_REG 0x20 | 61 | #define OMAP_I2C_SYSC_REG 0x08 |
| 62 | #define OMAP_I2C_CON_REG 0x24 | 62 | #define OMAP_I2C_CON_REG 0x09 |
| 63 | #define OMAP_I2C_OA_REG 0x28 | 63 | #define OMAP_I2C_OA_REG 0x0a |
| 64 | #define OMAP_I2C_SA_REG 0x2c | 64 | #define OMAP_I2C_SA_REG 0x0b |
| 65 | #define OMAP_I2C_PSC_REG 0x30 | 65 | #define OMAP_I2C_PSC_REG 0x0c |
| 66 | #define OMAP_I2C_SCLL_REG 0x34 | 66 | #define OMAP_I2C_SCLL_REG 0x0d |
| 67 | #define OMAP_I2C_SCLH_REG 0x38 | 67 | #define OMAP_I2C_SCLH_REG 0x0e |
| 68 | #define OMAP_I2C_SYSTEST_REG 0x3c | 68 | #define OMAP_I2C_SYSTEST_REG 0x0f |
| 69 | #define OMAP_I2C_BUFSTAT_REG 0x40 | 69 | #define OMAP_I2C_BUFSTAT_REG 0x10 |
| 70 | 70 | ||
| 71 | /* I2C Interrupt Enable Register (OMAP_I2C_IE): */ | 71 | /* I2C Interrupt Enable Register (OMAP_I2C_IE): */ |
| 72 | #define OMAP_I2C_IE_XDR (1 << 14) /* TX Buffer drain int enable */ | 72 | #define OMAP_I2C_IE_XDR (1 << 14) /* TX Buffer drain int enable */ |
| @@ -161,6 +161,7 @@ struct omap_i2c_dev { | |||
| 161 | struct device *dev; | 161 | struct device *dev; |
| 162 | void __iomem *base; /* virtual */ | 162 | void __iomem *base; /* virtual */ |
| 163 | int irq; | 163 | int irq; |
| 164 | int reg_shift; /* bit shift for I2C register addresses */ | ||
| 164 | struct clk *iclk; /* Interface clock */ | 165 | struct clk *iclk; /* Interface clock */ |
| 165 | struct clk *fclk; /* Functional clock */ | 166 | struct clk *fclk; /* Functional clock */ |
| 166 | struct completion cmd_complete; | 167 | struct completion cmd_complete; |
| @@ -189,12 +190,12 @@ struct omap_i2c_dev { | |||
| 189 | static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev, | 190 | static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev, |
| 190 | int reg, u16 val) | 191 | int reg, u16 val) |
| 191 | { | 192 | { |
| 192 | __raw_writew(val, i2c_dev->base + reg); | 193 | __raw_writew(val, i2c_dev->base + (reg << i2c_dev->reg_shift)); |
| 193 | } | 194 | } |
| 194 | 195 | ||
| 195 | static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *i2c_dev, int reg) | 196 | static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *i2c_dev, int reg) |
| 196 | { | 197 | { |
| 197 | return __raw_readw(i2c_dev->base + reg); | 198 | return __raw_readw(i2c_dev->base + (reg << i2c_dev->reg_shift)); |
| 198 | } | 199 | } |
| 199 | 200 | ||
| 200 | static int __init omap_i2c_get_clocks(struct omap_i2c_dev *dev) | 201 | static int __init omap_i2c_get_clocks(struct omap_i2c_dev *dev) |
| @@ -924,6 +925,11 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 924 | dev->b_hw = 1; /* Enable hardware fixes */ | 925 | dev->b_hw = 1; /* Enable hardware fixes */ |
| 925 | } | 926 | } |
| 926 | 927 | ||
| 928 | if (cpu_is_omap7xx()) | ||
| 929 | dev->reg_shift = 1; | ||
| 930 | else | ||
| 931 | dev->reg_shift = 2; | ||
| 932 | |||
| 927 | /* reset ASAP, clearing any IRQs */ | 933 | /* reset ASAP, clearing any IRQs */ |
| 928 | omap_i2c_init(dev); | 934 | omap_i2c_init(dev); |
| 929 | 935 | ||
