diff options
author | Mattias Wallin <mattias.wallin@stericsson.com> | 2010-12-02 10:20:42 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@stericsson.com> | 2010-12-08 07:14:13 -0500 |
commit | fcbd458e95316fe5031f1b8eaf5e66ce8f3c3146 (patch) | |
tree | 504699aded7b00e11de6019af68381fcdf0beecf /arch/arm/mach-ux500/prcmu.c | |
parent | fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebe (diff) |
ARM: ux500: prcmu db8500 v2 support
This patch adds support for db8500 chip version 2.
The TCDM memory address of the PRCMU is changed and
dynamic detection of that is added.
Signed-off-by: Mattias Wallin <mattias.wallin@stericsson.com>
Acked-by: Linus Walleij <linus.walleij@stericsson.com>
Diffstat (limited to 'arch/arm/mach-ux500/prcmu.c')
-rw-r--r-- | arch/arm/mach-ux500/prcmu.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/arch/arm/mach-ux500/prcmu.c b/arch/arm/mach-ux500/prcmu.c index 293274d1342a..3ba3e3298b89 100644 --- a/arch/arm/mach-ux500/prcmu.c +++ b/arch/arm/mach-ux500/prcmu.c | |||
@@ -20,10 +20,11 @@ | |||
20 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
21 | #include <mach/prcmu-regs.h> | 21 | #include <mach/prcmu-regs.h> |
22 | 22 | ||
23 | #define PRCMU_TCDM_BASE __io_address(U8500_PRCMU_TCDM_BASE) | 23 | /* Global var to runtime determine TCDM base for v2 or v1 */ |
24 | static __iomem void *tcdm_base; | ||
24 | 25 | ||
25 | #define REQ_MB5 (PRCMU_TCDM_BASE + 0xE44) | 26 | #define REQ_MB5 (tcdm_base + 0xE44) |
26 | #define ACK_MB5 (PRCMU_TCDM_BASE + 0xDF4) | 27 | #define ACK_MB5 (tcdm_base + 0xDF4) |
27 | 28 | ||
28 | #define REQ_MB5_I2C_SLAVE_OP (REQ_MB5) | 29 | #define REQ_MB5_I2C_SLAVE_OP (REQ_MB5) |
29 | #define REQ_MB5_I2C_HW_BITS (REQ_MB5 + 1) | 30 | #define REQ_MB5_I2C_HW_BITS (REQ_MB5 + 1) |
@@ -33,8 +34,10 @@ | |||
33 | #define ACK_MB5_I2C_STATUS (ACK_MB5 + 1) | 34 | #define ACK_MB5_I2C_STATUS (ACK_MB5 + 1) |
34 | #define ACK_MB5_I2C_VAL (ACK_MB5 + 3) | 35 | #define ACK_MB5_I2C_VAL (ACK_MB5 + 3) |
35 | 36 | ||
36 | #define I2C_WRITE(slave) ((slave) << 1) | 37 | #define I2C_WRITE(slave) \ |
37 | #define I2C_READ(slave) (((slave) << 1) | BIT(0)) | 38 | (((slave) << 1) | (cpu_is_u8500v2() ? BIT(6) : 0)) |
39 | #define I2C_READ(slave) \ | ||
40 | (((slave) << 1) | (cpu_is_u8500v2() ? BIT(6) : 0) | BIT(0)) | ||
38 | #define I2C_STOP_EN BIT(3) | 41 | #define I2C_STOP_EN BIT(3) |
39 | 42 | ||
40 | enum ack_mb5_status { | 43 | enum ack_mb5_status { |
@@ -217,6 +220,18 @@ static irqreturn_t prcmu_irq_handler(int irq, void *data) | |||
217 | return IRQ_HANDLED; | 220 | return IRQ_HANDLED; |
218 | } | 221 | } |
219 | 222 | ||
223 | void __init prcmu_early_init(void) | ||
224 | { | ||
225 | if (cpu_is_u8500v11() || cpu_is_u8500ed()) { | ||
226 | tcdm_base = __io_address(U8500_PRCMU_TCDM_BASE_V1); | ||
227 | } else if (cpu_is_u8500v2()) { | ||
228 | tcdm_base = __io_address(U8500_PRCMU_TCDM_BASE); | ||
229 | } else { | ||
230 | pr_err("prcmu: Unsupported chip version\n"); | ||
231 | BUG(); | ||
232 | } | ||
233 | } | ||
234 | |||
220 | static int __init prcmu_init(void) | 235 | static int __init prcmu_init(void) |
221 | { | 236 | { |
222 | mutex_init(&mb5_transfer.lock); | 237 | mutex_init(&mb5_transfer.lock); |