diff options
-rw-r--r-- | arch/arm/mach-omap2/Makefile | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cm1_44xx.h | 5 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cm2_44xx.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cm44xx.c | 52 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cm4xxx.c | 62 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cminst44xx.c | 109 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cminst44xx.h | 25 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prcm.c | 26 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prcm44xx.h | 42 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prcm_mpu44xx.c | 45 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prcm_mpu44xx.h | 8 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm44xx.c | 65 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm44xx.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prminst44xx.c | 66 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prminst44xx.h | 25 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/prcm.h | 7 |
16 files changed, 462 insertions, 91 deletions
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index b2e4f7bcfa34..1fce382a90a9 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -77,7 +77,9 @@ obj-$(CONFIG_ARCH_OMAP3) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o | |||
77 | # XXX The presence of cm2xxx_3xxx.o on the line below is temporary and | 77 | # XXX The presence of cm2xxx_3xxx.o on the line below is temporary and |
78 | # will be removed once the OMAP4 part of the codebase is converted to | 78 | # will be removed once the OMAP4 part of the codebase is converted to |
79 | # use OMAP4-specific PRCM functions. | 79 | # use OMAP4-specific PRCM functions. |
80 | obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cm4xxx.o | 80 | obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cminst44xx.o \ |
81 | cm44xx.o prcm_mpu44xx.o \ | ||
82 | prminst44xx.o | ||
81 | 83 | ||
82 | # OMAP powerdomain framework | 84 | # OMAP powerdomain framework |
83 | powerdomain-common += powerdomain.o powerdomain-common.o | 85 | powerdomain-common += powerdomain.o powerdomain-common.o |
diff --git a/arch/arm/mach-omap2/cm1_44xx.h b/arch/arm/mach-omap2/cm1_44xx.h index aa2ee7802631..63ef9e3a857c 100644 --- a/arch/arm/mach-omap2/cm1_44xx.h +++ b/arch/arm/mach-omap2/cm1_44xx.h | |||
@@ -248,4 +248,9 @@ | |||
248 | #define OMAP4_CM_DYN_DEP_PRESCAL_RESTORE_OFFSET 0x0040 | 248 | #define OMAP4_CM_DYN_DEP_PRESCAL_RESTORE_OFFSET 0x0040 |
249 | #define OMAP4430_CM_DYN_DEP_PRESCAL_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_INST, 0x0040) | 249 | #define OMAP4430_CM_DYN_DEP_PRESCAL_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_INST, 0x0040) |
250 | 250 | ||
251 | /* Function prototypes */ | ||
252 | extern u32 omap4_cm1_read_inst_reg(s16 inst, u16 idx); | ||
253 | extern void omap4_cm1_write_inst_reg(u32 val, s16 inst, u16 idx); | ||
254 | extern u32 omap4_cm1_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); | ||
255 | |||
251 | #endif | 256 | #endif |
diff --git a/arch/arm/mach-omap2/cm2_44xx.h b/arch/arm/mach-omap2/cm2_44xx.h index 89c95220d3e9..0fd021069792 100644 --- a/arch/arm/mach-omap2/cm2_44xx.h +++ b/arch/arm/mach-omap2/cm2_44xx.h | |||
@@ -480,4 +480,10 @@ | |||
480 | #define OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_INST, 0x0058) | 480 | #define OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_INST, 0x0058) |
481 | #define OMAP4_CM_SDMA_STATICDEP_RESTORE_OFFSET 0x005c | 481 | #define OMAP4_CM_SDMA_STATICDEP_RESTORE_OFFSET 0x005c |
482 | #define OMAP4430_CM_SDMA_STATICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_INST, 0x005c) | 482 | #define OMAP4430_CM_SDMA_STATICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_INST, 0x005c) |
483 | |||
484 | /* Function prototypes */ | ||
485 | extern u32 omap4_cm2_read_inst_reg(s16 inst, u16 idx); | ||
486 | extern void omap4_cm2_write_inst_reg(u32 val, s16 inst, u16 idx); | ||
487 | extern u32 omap4_cm2_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); | ||
488 | |||
483 | #endif | 489 | #endif |
diff --git a/arch/arm/mach-omap2/cm44xx.c b/arch/arm/mach-omap2/cm44xx.c new file mode 100644 index 000000000000..e96f53ea01a1 --- /dev/null +++ b/arch/arm/mach-omap2/cm44xx.c | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * OMAP4 CM1, CM2 module low-level functions | ||
3 | * | ||
4 | * Copyright (C) 2010 Nokia Corporation | ||
5 | * Paul Walmsley | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * These functions are intended to be used only by the cminst44xx.c file. | ||
12 | * XXX Perhaps we should just move them there and make them static. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/errno.h> | ||
18 | #include <linux/err.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | #include <plat/common.h> | ||
22 | |||
23 | #include "cm.h" | ||
24 | #include "cm1_44xx.h" | ||
25 | #include "cm2_44xx.h" | ||
26 | #include "cm-regbits-44xx.h" | ||
27 | |||
28 | /* CM1 hardware module low-level functions */ | ||
29 | |||
30 | /* Read a register in CM1 */ | ||
31 | u32 omap4_cm1_read_inst_reg(s16 inst, u16 reg) | ||
32 | { | ||
33 | return __raw_readl(OMAP44XX_CM1_REGADDR(inst, reg)); | ||
34 | } | ||
35 | |||
36 | /* Write into a register in CM1 */ | ||
37 | void omap4_cm1_write_inst_reg(u32 val, s16 inst, u16 reg) | ||
38 | { | ||
39 | __raw_writel(val, OMAP44XX_CM1_REGADDR(inst, reg)); | ||
40 | } | ||
41 | |||
42 | /* Read a register in CM2 */ | ||
43 | u32 omap4_cm2_read_inst_reg(s16 inst, u16 reg) | ||
44 | { | ||
45 | return __raw_readl(OMAP44XX_CM2_REGADDR(inst, reg)); | ||
46 | } | ||
47 | |||
48 | /* Write into a register in CM2 */ | ||
49 | void omap4_cm2_write_inst_reg(u32 val, s16 inst, u16 reg) | ||
50 | { | ||
51 | __raw_writel(val, OMAP44XX_CM2_REGADDR(inst, reg)); | ||
52 | } | ||
diff --git a/arch/arm/mach-omap2/cm4xxx.c b/arch/arm/mach-omap2/cm4xxx.c deleted file mode 100644 index 25d2b3e4c6f7..000000000000 --- a/arch/arm/mach-omap2/cm4xxx.c +++ /dev/null | |||
@@ -1,62 +0,0 @@ | |||
1 | /* | ||
2 | * OMAP4 CM module functions | ||
3 | * | ||
4 | * Copyright (C) 2009 Nokia Corporation | ||
5 | * Paul Walmsley | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/delay.h> | ||
16 | #include <linux/spinlock.h> | ||
17 | #include <linux/list.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/err.h> | ||
20 | #include <linux/io.h> | ||
21 | |||
22 | #include <asm/atomic.h> | ||
23 | |||
24 | #include <plat/common.h> | ||
25 | |||
26 | #include "cm44xx.h" | ||
27 | #include "cm-regbits-44xx.h" | ||
28 | |||
29 | /** | ||
30 | * omap4_cm_wait_module_ready - wait for a module to be in 'func' state | ||
31 | * @clkctrl_reg: CLKCTRL module address | ||
32 | * | ||
33 | * Wait for the module IDLEST to be functional. If the idle state is in any | ||
34 | * the non functional state (trans, idle or disabled), module and thus the | ||
35 | * sysconfig cannot be accessed and will probably lead to an "imprecise | ||
36 | * external abort" | ||
37 | * | ||
38 | * Module idle state: | ||
39 | * 0x0 func: Module is fully functional, including OCP | ||
40 | * 0x1 trans: Module is performing transition: wakeup, or sleep, or sleep | ||
41 | * abortion | ||
42 | * 0x2 idle: Module is in Idle mode (only OCP part). It is functional if | ||
43 | * using separate functional clock | ||
44 | * 0x3 disabled: Module is disabled and cannot be accessed | ||
45 | * | ||
46 | */ | ||
47 | int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg) | ||
48 | { | ||
49 | int i = 0; | ||
50 | |||
51 | if (!clkctrl_reg) | ||
52 | return 0; | ||
53 | |||
54 | omap_test_timeout(( | ||
55 | ((__raw_readl(clkctrl_reg) & OMAP4430_IDLEST_MASK) == 0) || | ||
56 | (((__raw_readl(clkctrl_reg) & OMAP4430_IDLEST_MASK) >> | ||
57 | OMAP4430_IDLEST_SHIFT) == 0x2)), | ||
58 | MAX_MODULE_READY_TIME, i); | ||
59 | |||
60 | return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; | ||
61 | } | ||
62 | |||
diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c new file mode 100644 index 000000000000..c13613b513b5 --- /dev/null +++ b/arch/arm/mach-omap2/cminst44xx.c | |||
@@ -0,0 +1,109 @@ | |||
1 | /* | ||
2 | * OMAP4 CM instance functions | ||
3 | * | ||
4 | * Copyright (C) 2009 Nokia Corporation | ||
5 | * Paul Walmsley | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This is needed since CM instances can be in the PRM, PRCM_MPU, CM1, | ||
12 | * or CM2 hardware modules. For example, the EMU_CM CM instance is in | ||
13 | * the PRM hardware module. What a mess... | ||
14 | */ | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/types.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/err.h> | ||
20 | #include <linux/io.h> | ||
21 | |||
22 | #include <plat/common.h> | ||
23 | |||
24 | #include "cm.h" | ||
25 | #include "cm1_44xx.h" | ||
26 | #include "cm2_44xx.h" | ||
27 | #include "cm44xx.h" | ||
28 | #include "cminst44xx.h" | ||
29 | #include "cm-regbits-44xx.h" | ||
30 | #include "prcm44xx.h" | ||
31 | #include "prm44xx.h" | ||
32 | #include "prcm_mpu44xx.h" | ||
33 | |||
34 | static u32 _cm_bases[OMAP4_MAX_PRCM_PARTITIONS] = { | ||
35 | [OMAP4430_INVALID_PRCM_PARTITION] = 0, | ||
36 | [OMAP4430_PRM_PARTITION] = OMAP4430_PRM_BASE, | ||
37 | [OMAP4430_CM1_PARTITION] = OMAP4430_CM1_BASE, | ||
38 | [OMAP4430_CM2_PARTITION] = OMAP4430_CM2_BASE, | ||
39 | [OMAP4430_SCRM_PARTITION] = 0, | ||
40 | [OMAP4430_PRCM_MPU_PARTITION] = OMAP4430_PRCM_MPU_BASE, | ||
41 | }; | ||
42 | |||
43 | /* Read a register in a CM instance */ | ||
44 | u32 omap4_cminst_read_inst_reg(u8 part, s16 inst, u16 idx) | ||
45 | { | ||
46 | BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS || | ||
47 | part == OMAP4430_INVALID_PRCM_PARTITION || | ||
48 | !_cm_bases[part]); | ||
49 | return __raw_readl(OMAP2_L4_IO_ADDRESS(_cm_bases[part] + inst + idx)); | ||
50 | } | ||
51 | |||
52 | /* Write into a register in a CM instance */ | ||
53 | void omap4_cminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx) | ||
54 | { | ||
55 | BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS || | ||
56 | part == OMAP4430_INVALID_PRCM_PARTITION || | ||
57 | !_cm_bases[part]); | ||
58 | __raw_writel(val, OMAP2_L4_IO_ADDRESS(_cm_bases[part] + inst + idx)); | ||
59 | } | ||
60 | |||
61 | /* Read-modify-write a register in CM1. Caller must lock */ | ||
62 | u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, s16 inst, | ||
63 | s16 idx) | ||
64 | { | ||
65 | u32 v; | ||
66 | |||
67 | v = omap4_cminst_read_inst_reg(part, inst, idx); | ||
68 | v &= ~mask; | ||
69 | v |= bits; | ||
70 | omap4_cminst_write_inst_reg(v, part, inst, idx); | ||
71 | |||
72 | return v; | ||
73 | } | ||
74 | |||
75 | |||
76 | /** | ||
77 | * omap4_cm_wait_module_ready - wait for a module to be in 'func' state | ||
78 | * @clkctrl_reg: CLKCTRL module address | ||
79 | * | ||
80 | * Wait for the module IDLEST to be functional. If the idle state is in any | ||
81 | * the non functional state (trans, idle or disabled), module and thus the | ||
82 | * sysconfig cannot be accessed and will probably lead to an "imprecise | ||
83 | * external abort" | ||
84 | * | ||
85 | * Module idle state: | ||
86 | * 0x0 func: Module is fully functional, including OCP | ||
87 | * 0x1 trans: Module is performing transition: wakeup, or sleep, or sleep | ||
88 | * abortion | ||
89 | * 0x2 idle: Module is in Idle mode (only OCP part). It is functional if | ||
90 | * using separate functional clock | ||
91 | * 0x3 disabled: Module is disabled and cannot be accessed | ||
92 | * | ||
93 | */ | ||
94 | int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg) | ||
95 | { | ||
96 | int i = 0; | ||
97 | |||
98 | if (!clkctrl_reg) | ||
99 | return 0; | ||
100 | |||
101 | omap_test_timeout(( | ||
102 | ((__raw_readl(clkctrl_reg) & OMAP4430_IDLEST_MASK) == 0) || | ||
103 | (((__raw_readl(clkctrl_reg) & OMAP4430_IDLEST_MASK) >> | ||
104 | OMAP4430_IDLEST_SHIFT) == 0x2)), | ||
105 | MAX_MODULE_READY_TIME, i); | ||
106 | |||
107 | return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; | ||
108 | } | ||
109 | |||
diff --git a/arch/arm/mach-omap2/cminst44xx.h b/arch/arm/mach-omap2/cminst44xx.h new file mode 100644 index 000000000000..6baa4c7b14f1 --- /dev/null +++ b/arch/arm/mach-omap2/cminst44xx.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * OMAP4 Clock Management (CM) function prototypes | ||
3 | * | ||
4 | * Copyright (C) 2010 Nokia Corporation | ||
5 | * Paul Walmsley | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | #ifndef __ARCH_ASM_MACH_OMAP2_CMINST44XX_H | ||
12 | #define __ARCH_ASM_MACH_OMAP2_CMINST44XX_H | ||
13 | |||
14 | /* | ||
15 | * In an ideal world, we would not export these low-level functions, | ||
16 | * but this will probably take some time to fix properly | ||
17 | */ | ||
18 | extern u32 omap4_cminst_read_inst_reg(u8 part, s16 inst, u16 idx); | ||
19 | extern void omap4_cminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx); | ||
20 | extern u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, | ||
21 | s16 inst, s16 idx); | ||
22 | |||
23 | extern int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg); | ||
24 | |||
25 | #endif | ||
diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index dd95cbbdecc7..fe0865bd64cf 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include "cm44xx.h" | 33 | #include "cm44xx.h" |
34 | #include "prm2xxx_3xxx.h" | 34 | #include "prm2xxx_3xxx.h" |
35 | #include "prm44xx.h" | 35 | #include "prm44xx.h" |
36 | #include "prcm44xx.h" | ||
36 | #include "prm-regbits-24xx.h" | 37 | #include "prm-regbits-24xx.h" |
37 | #include "prm-regbits-44xx.h" | 38 | #include "prm-regbits-44xx.h" |
38 | #include "control.h" | 39 | #include "control.h" |
@@ -80,31 +81,6 @@ void omap_prcm_arch_reset(char mode, const char *cmd) | |||
80 | prcm_offs, OMAP4_RM_RSTCTRL); | 81 | prcm_offs, OMAP4_RM_RSTCTRL); |
81 | } | 82 | } |
82 | 83 | ||
83 | /* Read a PRM register, AND it, and shift the result down to bit 0 */ | ||
84 | u32 omap4_prm_read_bits_shift(void __iomem *reg, u32 mask) | ||
85 | { | ||
86 | u32 v; | ||
87 | |||
88 | v = __raw_readl(reg); | ||
89 | v &= mask; | ||
90 | v >>= __ffs(mask); | ||
91 | |||
92 | return v; | ||
93 | } | ||
94 | |||
95 | /* Read-modify-write a register in a PRM module. Caller must lock */ | ||
96 | u32 omap4_prm_rmw_reg_bits(u32 mask, u32 bits, void __iomem *reg) | ||
97 | { | ||
98 | u32 v; | ||
99 | |||
100 | v = __raw_readl(reg); | ||
101 | v &= ~mask; | ||
102 | v |= bits; | ||
103 | __raw_writel(v, reg); | ||
104 | |||
105 | return v; | ||
106 | } | ||
107 | |||
108 | /** | 84 | /** |
109 | * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness | 85 | * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness |
110 | * @reg: physical address of module IDLEST register | 86 | * @reg: physical address of module IDLEST register |
diff --git a/arch/arm/mach-omap2/prcm44xx.h b/arch/arm/mach-omap2/prcm44xx.h new file mode 100644 index 000000000000..7334ffb9d2c1 --- /dev/null +++ b/arch/arm/mach-omap2/prcm44xx.h | |||
@@ -0,0 +1,42 @@ | |||
1 | /* | ||
2 | * OMAP4 PRCM definitions | ||
3 | * | ||
4 | * Copyright (C) 2010 Texas Instruments, Inc. | ||
5 | * Copyright (C) 2010 Nokia Corporation | ||
6 | * | ||
7 | * Paul Walmsley | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * This file contains macros and functions that are common to all of | ||
14 | * the PRM/CM/PRCM blocks on the OMAP4 devices: PRM, CM1, CM2, | ||
15 | * PRCM_MPU, SCRM | ||
16 | */ | ||
17 | |||
18 | #ifndef __ARCH_ARM_MACH_OMAP2_PRCM44XX_H | ||
19 | #define __ARCH_ARM_MACH_OMAP2_PRCM44XX_H | ||
20 | |||
21 | /* | ||
22 | * OMAP4 PRCM partition IDs | ||
23 | * | ||
24 | * The numbers and order are arbitrary, but 0 is reserved for the | ||
25 | * 'invalid' partition in case someone forgets to add a | ||
26 | * .prcm_partition field. | ||
27 | */ | ||
28 | #define OMAP4430_INVALID_PRCM_PARTITION 0 | ||
29 | #define OMAP4430_PRM_PARTITION 1 | ||
30 | #define OMAP4430_CM1_PARTITION 2 | ||
31 | #define OMAP4430_CM2_PARTITION 3 | ||
32 | #define OMAP4430_SCRM_PARTITION 4 | ||
33 | #define OMAP4430_PRCM_MPU_PARTITION 5 | ||
34 | |||
35 | /* | ||
36 | * OMAP4_MAX_PRCM_PARTITIONS: set to the highest value of the PRCM partition | ||
37 | * IDs, plus one | ||
38 | */ | ||
39 | #define OMAP4_MAX_PRCM_PARTITIONS 6 | ||
40 | |||
41 | |||
42 | #endif | ||
diff --git a/arch/arm/mach-omap2/prcm_mpu44xx.c b/arch/arm/mach-omap2/prcm_mpu44xx.c new file mode 100644 index 000000000000..171fe171a749 --- /dev/null +++ b/arch/arm/mach-omap2/prcm_mpu44xx.c | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | * OMAP4 PRCM_MPU module functions | ||
3 | * | ||
4 | * Copyright (C) 2009 Nokia Corporation | ||
5 | * Paul Walmsley | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/errno.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/io.h> | ||
17 | |||
18 | #include <plat/common.h> | ||
19 | |||
20 | #include "prcm_mpu44xx.h" | ||
21 | #include "cm-regbits-44xx.h" | ||
22 | |||
23 | /* PRCM_MPU low-level functions */ | ||
24 | |||
25 | u32 omap4_prcm_mpu_read_inst_reg(s16 inst, u16 reg) | ||
26 | { | ||
27 | return __raw_readl(OMAP44XX_PRCM_MPU_REGADDR(inst, reg)); | ||
28 | } | ||
29 | |||
30 | void omap4_prcm_mpu_write_inst_reg(u32 val, s16 inst, u16 reg) | ||
31 | { | ||
32 | __raw_writel(val, OMAP44XX_PRCM_MPU_REGADDR(inst, reg)); | ||
33 | } | ||
34 | |||
35 | u32 omap4_prcm_mpu_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 reg) | ||
36 | { | ||
37 | u32 v; | ||
38 | |||
39 | v = omap4_prcm_mpu_read_inst_reg(inst, reg); | ||
40 | v &= ~mask; | ||
41 | v |= bits; | ||
42 | omap4_prcm_mpu_write_inst_reg(v, inst, reg); | ||
43 | |||
44 | return v; | ||
45 | } | ||
diff --git a/arch/arm/mach-omap2/prcm_mpu44xx.h b/arch/arm/mach-omap2/prcm_mpu44xx.h index 80e00c16d36f..e5190e99fd94 100644 --- a/arch/arm/mach-omap2/prcm_mpu44xx.h +++ b/arch/arm/mach-omap2/prcm_mpu44xx.h | |||
@@ -88,4 +88,12 @@ | |||
88 | #define OMAP4_CM_CPU1_CLKSTCTRL_OFFSET 0x0018 | 88 | #define OMAP4_CM_CPU1_CLKSTCTRL_OFFSET 0x0018 |
89 | #define OMAP4430_CM_CPU1_CLKSTCTRL OMAP44XX_PRCM_MPU_REGADDR(OMAP4430_PRCM_MPU_CPU1_INST, 0x0018) | 89 | #define OMAP4430_CM_CPU1_CLKSTCTRL OMAP44XX_PRCM_MPU_REGADDR(OMAP4430_PRCM_MPU_CPU1_INST, 0x0018) |
90 | 90 | ||
91 | /* Function prototypes */ | ||
92 | # ifndef __ASSEMBLER__ | ||
93 | extern u32 omap4_prcm_mpu_read_inst_reg(s16 inst, u16 idx); | ||
94 | extern void omap4_prcm_mpu_write_inst_reg(u32 val, s16 inst, u16 idx); | ||
95 | extern u32 omap4_prcm_mpu_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, | ||
96 | s16 idx); | ||
97 | # endif | ||
98 | |||
91 | #endif | 99 | #endif |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 697b58f8e4a8..c016ae4cbad1 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
18 | #include <linux/io.h> | ||
18 | 19 | ||
19 | #include <plat/common.h> | 20 | #include <plat/common.h> |
20 | #include <plat/cpu.h> | 21 | #include <plat/cpu.h> |
@@ -29,6 +30,70 @@ | |||
29 | */ | 30 | */ |
30 | #define OMAP4_RST_CTRL_ST_OFFSET 4 | 31 | #define OMAP4_RST_CTRL_ST_OFFSET 4 |
31 | 32 | ||
33 | /* PRM low-level functions */ | ||
34 | |||
35 | /* Read a register in a CM/PRM instance in the PRM module */ | ||
36 | u32 omap4_prm_read_inst_reg(s16 inst, u16 reg) | ||
37 | { | ||
38 | return __raw_readl(OMAP44XX_PRM_REGADDR(inst, reg)); | ||
39 | } | ||
40 | |||
41 | /* Write into a register in a CM/PRM instance in the PRM module */ | ||
42 | void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 reg) | ||
43 | { | ||
44 | __raw_writel(val, OMAP44XX_PRM_REGADDR(inst, reg)); | ||
45 | } | ||
46 | |||
47 | /* Read-modify-write a register in a PRM module. Caller must lock */ | ||
48 | u32 omap4_prm_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 reg) | ||
49 | { | ||
50 | u32 v; | ||
51 | |||
52 | v = omap4_prm_read_inst_reg(inst, reg); | ||
53 | v &= ~mask; | ||
54 | v |= bits; | ||
55 | omap4_prm_write_inst_reg(v, inst, reg); | ||
56 | |||
57 | return v; | ||
58 | } | ||
59 | |||
60 | /* Read a PRM register, AND it, and shift the result down to bit 0 */ | ||
61 | /* XXX deprecated */ | ||
62 | u32 omap4_prm_read_bits_shift(void __iomem *reg, u32 mask) | ||
63 | { | ||
64 | u32 v; | ||
65 | |||
66 | v = __raw_readl(reg); | ||
67 | v &= mask; | ||
68 | v >>= __ffs(mask); | ||
69 | |||
70 | return v; | ||
71 | } | ||
72 | |||
73 | /* Read-modify-write a register in a PRM module. Caller must lock */ | ||
74 | /* XXX deprecated */ | ||
75 | u32 omap4_prm_rmw_reg_bits(u32 mask, u32 bits, void __iomem *reg) | ||
76 | { | ||
77 | u32 v; | ||
78 | |||
79 | v = __raw_readl(reg); | ||
80 | v &= ~mask; | ||
81 | v |= bits; | ||
82 | __raw_writel(v, reg); | ||
83 | |||
84 | return v; | ||
85 | } | ||
86 | |||
87 | u32 omap4_prm_set_inst_reg_bits(u32 bits, s16 inst, s16 reg) | ||
88 | { | ||
89 | return omap4_prm_rmw_inst_reg_bits(bits, bits, inst, reg); | ||
90 | } | ||
91 | |||
92 | u32 omap4_prm_clear_inst_reg_bits(u32 bits, s16 inst, s16 reg) | ||
93 | { | ||
94 | return omap4_prm_rmw_inst_reg_bits(bits, 0x0, inst, reg); | ||
95 | } | ||
96 | |||
32 | /** | 97 | /** |
33 | * omap4_prm_is_hardreset_asserted - read the HW reset line state of | 98 | * omap4_prm_is_hardreset_asserted - read the HW reset line state of |
34 | * submodules contained in the hwmod module | 99 | * submodules contained in the hwmod module |
diff --git a/arch/arm/mach-omap2/prm44xx.h b/arch/arm/mach-omap2/prm44xx.h index 3d361497ca70..358865344d58 100644 --- a/arch/arm/mach-omap2/prm44xx.h +++ b/arch/arm/mach-omap2/prm44xx.h | |||
@@ -744,6 +744,12 @@ | |||
744 | /* Function prototypes */ | 744 | /* Function prototypes */ |
745 | # ifndef __ASSEMBLER__ | 745 | # ifndef __ASSEMBLER__ |
746 | 746 | ||
747 | extern u32 omap4_prm_read_inst_reg(s16 inst, u16 idx); | ||
748 | extern void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 idx); | ||
749 | extern u32 omap4_prm_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); | ||
750 | extern u32 omap4_prm_rmw_reg_bits(u32 mask, u32 bits, void __iomem *reg); | ||
751 | extern u32 omap4_prm_set_inst_reg_bits(u32 bits, s16 inst, s16 idx); | ||
752 | extern u32 omap4_prm_clear_inst_reg_bits(u32 bits, s16 inst, s16 idx); | ||
747 | extern u32 omap4_prm_read_bits_shift(void __iomem *reg, u32 mask); | 753 | extern u32 omap4_prm_read_bits_shift(void __iomem *reg, u32 mask); |
748 | 754 | ||
749 | extern int omap4_prm_is_hardreset_asserted(void __iomem *rstctrl_reg, u8 shift); | 755 | extern int omap4_prm_is_hardreset_asserted(void __iomem *rstctrl_reg, u8 shift); |
diff --git a/arch/arm/mach-omap2/prminst44xx.c b/arch/arm/mach-omap2/prminst44xx.c new file mode 100644 index 000000000000..a30324297278 --- /dev/null +++ b/arch/arm/mach-omap2/prminst44xx.c | |||
@@ -0,0 +1,66 @@ | |||
1 | /* | ||
2 | * OMAP4 PRM instance functions | ||
3 | * | ||
4 | * Copyright (C) 2009 Nokia Corporation | ||
5 | * Paul Walmsley | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/errno.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/io.h> | ||
17 | |||
18 | #include <plat/common.h> | ||
19 | |||
20 | #include "prm44xx.h" | ||
21 | #include "prminst44xx.h" | ||
22 | #include "prm-regbits-44xx.h" | ||
23 | #include "prcm44xx.h" | ||
24 | #include "prcm_mpu44xx.h" | ||
25 | |||
26 | static u32 _prm_bases[OMAP4_MAX_PRCM_PARTITIONS] = { | ||
27 | [OMAP4430_INVALID_PRCM_PARTITION] = 0, | ||
28 | [OMAP4430_PRM_PARTITION] = OMAP4430_PRM_BASE, | ||
29 | [OMAP4430_CM1_PARTITION] = 0, | ||
30 | [OMAP4430_CM2_PARTITION] = 0, | ||
31 | [OMAP4430_SCRM_PARTITION] = 0, | ||
32 | [OMAP4430_PRCM_MPU_PARTITION] = OMAP4430_PRCM_MPU_BASE, | ||
33 | }; | ||
34 | |||
35 | /* Read a register in a PRM instance */ | ||
36 | u32 omap4_prminst_read_inst_reg(u8 part, s16 inst, u16 idx) | ||
37 | { | ||
38 | BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS || | ||
39 | part == OMAP4430_INVALID_PRCM_PARTITION || | ||
40 | !_prm_bases[part]); | ||
41 | return __raw_readl(OMAP2_L4_IO_ADDRESS(_prm_bases[part] + inst + | ||
42 | idx)); | ||
43 | } | ||
44 | |||
45 | /* Write into a register in a PRM instance */ | ||
46 | void omap4_prminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx) | ||
47 | { | ||
48 | BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS || | ||
49 | part == OMAP4430_INVALID_PRCM_PARTITION || | ||
50 | !_prm_bases[part]); | ||
51 | __raw_writel(val, OMAP2_L4_IO_ADDRESS(_prm_bases[part] + inst + idx)); | ||
52 | } | ||
53 | |||
54 | /* Read-modify-write a register in PRM. Caller must lock */ | ||
55 | u32 omap4_prminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, s16 inst, | ||
56 | s16 idx) | ||
57 | { | ||
58 | u32 v; | ||
59 | |||
60 | v = omap4_prminst_read_inst_reg(part, inst, idx); | ||
61 | v &= ~mask; | ||
62 | v |= bits; | ||
63 | omap4_prminst_write_inst_reg(v, part, inst, idx); | ||
64 | |||
65 | return v; | ||
66 | } | ||
diff --git a/arch/arm/mach-omap2/prminst44xx.h b/arch/arm/mach-omap2/prminst44xx.h new file mode 100644 index 000000000000..02dd66ddda8b --- /dev/null +++ b/arch/arm/mach-omap2/prminst44xx.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * OMAP4 Power/Reset Management (PRM) function prototypes | ||
3 | * | ||
4 | * Copyright (C) 2010 Nokia Corporation | ||
5 | * Paul Walmsley | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | #ifndef __ARCH_ASM_MACH_OMAP2_PRMINST44XX_H | ||
12 | #define __ARCH_ASM_MACH_OMAP2_PRMINST44XX_H | ||
13 | |||
14 | /* | ||
15 | * In an ideal world, we would not export these low-level functions, | ||
16 | * but this will probably take some time to fix properly | ||
17 | */ | ||
18 | extern u32 omap4_prminst_read_inst_reg(u8 part, s16 inst, u16 idx); | ||
19 | extern void omap4_prminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx); | ||
20 | extern u32 omap4_prminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, | ||
21 | s16 inst, s16 idx); | ||
22 | |||
23 | extern void omap4_prm_global_warm_sw_reset(void); | ||
24 | |||
25 | #endif | ||
diff --git a/arch/arm/plat-omap/include/plat/prcm.h b/arch/arm/plat-omap/include/plat/prcm.h index d059a05bc457..078906d86b6c 100644 --- a/arch/arm/plat-omap/include/plat/prcm.h +++ b/arch/arm/plat-omap/include/plat/prcm.h | |||
@@ -18,6 +18,10 @@ | |||
18 | * You should have received a copy of the GNU General Public License | 18 | * You should have received a copy of the GNU General Public License |
19 | * along with this program; if not, write to the Free Software | 19 | * along with this program; if not, write to the Free Software |
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 | * | ||
22 | * XXX This file is deprecated. The PRCM is an OMAP2+-only subsystem, | ||
23 | * so this file doesn't belong in plat-omap/include/plat. Please | ||
24 | * do not add anything new to this file. | ||
21 | */ | 25 | */ |
22 | 26 | ||
23 | #ifndef __ASM_ARM_ARCH_OMAP_PRCM_H | 27 | #ifndef __ASM_ARM_ARCH_OMAP_PRCM_H |
@@ -31,9 +35,6 @@ int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, | |||
31 | #define START_PADCONF_SAVE 0x2 | 35 | #define START_PADCONF_SAVE 0x2 |
32 | #define PADCONF_SAVE_DONE 0x1 | 36 | #define PADCONF_SAVE_DONE 0x1 |
33 | 37 | ||
34 | u32 omap4_prm_read_bits_shift(void __iomem *reg, u32 mask); | ||
35 | u32 omap4_prm_rmw_reg_bits(u32 mask, u32 bits, void __iomem *reg); | ||
36 | |||
37 | #endif | 38 | #endif |
38 | 39 | ||
39 | 40 | ||