diff options
Diffstat (limited to 'arch')
194 files changed, 3019 insertions, 1808 deletions
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 60cde53d266c..8bb936226dee 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -51,7 +51,7 @@ config GENERIC_CMOS_UPDATE | |||
51 | def_bool y | 51 | def_bool y |
52 | 52 | ||
53 | config GENERIC_GPIO | 53 | config GENERIC_GPIO |
54 | def_bool y | 54 | bool |
55 | 55 | ||
56 | config ZONE_DMA | 56 | config ZONE_DMA |
57 | bool | 57 | bool |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 5ebc5d922ea1..3146ed3f6eca 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1271,6 +1271,32 @@ config ARM_ERRATA_754327 | |||
1271 | This workaround defines cpu_relax() as smp_mb(), preventing correctly | 1271 | This workaround defines cpu_relax() as smp_mb(), preventing correctly |
1272 | written polling loops from denying visibility of updates to memory. | 1272 | written polling loops from denying visibility of updates to memory. |
1273 | 1273 | ||
1274 | config ARM_ERRATA_364296 | ||
1275 | bool "ARM errata: Possible cache data corruption with hit-under-miss enabled" | ||
1276 | depends on CPU_V6 && !SMP | ||
1277 | help | ||
1278 | This options enables the workaround for the 364296 ARM1136 | ||
1279 | r0p2 erratum (possible cache data corruption with | ||
1280 | hit-under-miss enabled). It sets the undocumented bit 31 in | ||
1281 | the auxiliary control register and the FI bit in the control | ||
1282 | register, thus disabling hit-under-miss without putting the | ||
1283 | processor into full low interrupt latency mode. ARM11MPCore | ||
1284 | is not affected. | ||
1285 | |||
1286 | config ARM_ERRATA_764369 | ||
1287 | bool "ARM errata: Data cache line maintenance operation by MVA may not succeed" | ||
1288 | depends on CPU_V7 && SMP | ||
1289 | help | ||
1290 | This option enables the workaround for erratum 764369 | ||
1291 | affecting Cortex-A9 MPCore with two or more processors (all | ||
1292 | current revisions). Under certain timing circumstances, a data | ||
1293 | cache line maintenance operation by MVA targeting an Inner | ||
1294 | Shareable memory region may fail to proceed up to either the | ||
1295 | Point of Coherency or to the Point of Unification of the | ||
1296 | system. This workaround adds a DSB instruction before the | ||
1297 | relevant cache maintenance functions and sets a specific bit | ||
1298 | in the diagnostic control register of the SCU. | ||
1299 | |||
1274 | endmenu | 1300 | endmenu |
1275 | 1301 | ||
1276 | source "arch/arm/common/Kconfig" | 1302 | source "arch/arm/common/Kconfig" |
diff --git a/arch/arm/boot/compressed/mmcif-sh7372.c b/arch/arm/boot/compressed/mmcif-sh7372.c index b6f61d9a5a1b..672ae95db5c3 100644 --- a/arch/arm/boot/compressed/mmcif-sh7372.c +++ b/arch/arm/boot/compressed/mmcif-sh7372.c | |||
@@ -82,7 +82,7 @@ asmlinkage void mmc_loader(unsigned char *buf, unsigned long len) | |||
82 | 82 | ||
83 | 83 | ||
84 | /* Disable clock to MMC hardware block */ | 84 | /* Disable clock to MMC hardware block */ |
85 | __raw_writel(__raw_readl(SMSTPCR3) & (1 << 12), SMSTPCR3); | 85 | __raw_writel(__raw_readl(SMSTPCR3) | (1 << 12), SMSTPCR3); |
86 | 86 | ||
87 | mmc_update_progress(MMC_PROGRESS_DONE); | 87 | mmc_update_progress(MMC_PROGRESS_DONE); |
88 | } | 88 | } |
diff --git a/arch/arm/boot/compressed/sdhi-sh7372.c b/arch/arm/boot/compressed/sdhi-sh7372.c index d403a8b24d7f..d279294f2381 100644 --- a/arch/arm/boot/compressed/sdhi-sh7372.c +++ b/arch/arm/boot/compressed/sdhi-sh7372.c | |||
@@ -85,7 +85,7 @@ asmlinkage void mmc_loader(unsigned short *buf, unsigned long len) | |||
85 | goto err; | 85 | goto err; |
86 | 86 | ||
87 | /* Disable clock to SDHI1 hardware block */ | 87 | /* Disable clock to SDHI1 hardware block */ |
88 | __raw_writel(__raw_readl(SMSTPCR3) & (1 << 13), SMSTPCR3); | 88 | __raw_writel(__raw_readl(SMSTPCR3) | (1 << 13), SMSTPCR3); |
89 | 89 | ||
90 | mmc_update_progress(MMC_PROGRESS_DONE); | 90 | mmc_update_progress(MMC_PROGRESS_DONE); |
91 | 91 | ||
diff --git a/arch/arm/boot/dts/tegra-harmony.dts b/arch/arm/boot/dts/tegra-harmony.dts index 4c053340ce33..e5818668d091 100644 --- a/arch/arm/boot/dts/tegra-harmony.dts +++ b/arch/arm/boot/dts/tegra-harmony.dts | |||
@@ -57,14 +57,14 @@ | |||
57 | }; | 57 | }; |
58 | 58 | ||
59 | sdhci@c8000200 { | 59 | sdhci@c8000200 { |
60 | gpios = <&gpio 69 0>, /* cd, gpio PI5 */ | 60 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ |
61 | <&gpio 57 0>, /* wp, gpio PH1 */ | 61 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ |
62 | <&gpio 155 0>; /* power, gpio PT3 */ | 62 | power-gpios = <&gpio 155 0>; /* gpio PT3 */ |
63 | }; | 63 | }; |
64 | 64 | ||
65 | sdhci@c8000600 { | 65 | sdhci@c8000600 { |
66 | gpios = <&gpio 58 0>, /* cd, gpio PH2 */ | 66 | cd-gpios = <&gpio 58 0>; /* gpio PH2 */ |
67 | <&gpio 59 0>, /* wp, gpio PH3 */ | 67 | wp-gpios = <&gpio 59 0>; /* gpio PH3 */ |
68 | <&gpio 70 0>; /* power, gpio PI6 */ | 68 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ |
69 | }; | 69 | }; |
70 | }; | 70 | }; |
diff --git a/arch/arm/boot/dts/tegra-seaboard.dts b/arch/arm/boot/dts/tegra-seaboard.dts index 1940cae00748..64cedca6fc79 100644 --- a/arch/arm/boot/dts/tegra-seaboard.dts +++ b/arch/arm/boot/dts/tegra-seaboard.dts | |||
@@ -21,8 +21,8 @@ | |||
21 | }; | 21 | }; |
22 | 22 | ||
23 | sdhci@c8000400 { | 23 | sdhci@c8000400 { |
24 | gpios = <&gpio 69 0>, /* cd, gpio PI5 */ | 24 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ |
25 | <&gpio 57 0>, /* wp, gpio PH1 */ | 25 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ |
26 | <&gpio 70 0>; /* power, gpio PI6 */ | 26 | power-gpios = <&gpio 70 0>; /* gpio PI6 */ |
27 | }; | 27 | }; |
28 | }; | 28 | }; |
diff --git a/arch/arm/include/asm/device.h b/arch/arm/include/asm/device.h index 9f390ce335cb..b5c9f5b1f6a3 100644 --- a/arch/arm/include/asm/device.h +++ b/arch/arm/include/asm/device.h | |||
@@ -12,7 +12,12 @@ struct dev_archdata { | |||
12 | #endif | 12 | #endif |
13 | }; | 13 | }; |
14 | 14 | ||
15 | struct omap_device; | ||
16 | |||
15 | struct pdev_archdata { | 17 | struct pdev_archdata { |
18 | #ifdef CONFIG_ARCH_OMAP | ||
19 | struct omap_device *od; | ||
20 | #endif | ||
16 | }; | 21 | }; |
17 | 22 | ||
18 | #endif | 23 | #endif |
diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h index 8c73900da9ed..253cc86318bf 100644 --- a/arch/arm/include/asm/futex.h +++ b/arch/arm/include/asm/futex.h | |||
@@ -25,17 +25,17 @@ | |||
25 | 25 | ||
26 | #ifdef CONFIG_SMP | 26 | #ifdef CONFIG_SMP |
27 | 27 | ||
28 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ | 28 | #define __futex_atomic_op(insn, ret, oldval, tmp, uaddr, oparg) \ |
29 | smp_mb(); \ | 29 | smp_mb(); \ |
30 | __asm__ __volatile__( \ | 30 | __asm__ __volatile__( \ |
31 | "1: ldrex %1, [%2]\n" \ | 31 | "1: ldrex %1, [%3]\n" \ |
32 | " " insn "\n" \ | 32 | " " insn "\n" \ |
33 | "2: strex %1, %0, [%2]\n" \ | 33 | "2: strex %2, %0, [%3]\n" \ |
34 | " teq %1, #0\n" \ | 34 | " teq %2, #0\n" \ |
35 | " bne 1b\n" \ | 35 | " bne 1b\n" \ |
36 | " mov %0, #0\n" \ | 36 | " mov %0, #0\n" \ |
37 | __futex_atomic_ex_table("%4") \ | 37 | __futex_atomic_ex_table("%5") \ |
38 | : "=&r" (ret), "=&r" (oldval) \ | 38 | : "=&r" (ret), "=&r" (oldval), "=&r" (tmp) \ |
39 | : "r" (uaddr), "r" (oparg), "Ir" (-EFAULT) \ | 39 | : "r" (uaddr), "r" (oparg), "Ir" (-EFAULT) \ |
40 | : "cc", "memory") | 40 | : "cc", "memory") |
41 | 41 | ||
@@ -73,14 +73,14 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | |||
73 | #include <linux/preempt.h> | 73 | #include <linux/preempt.h> |
74 | #include <asm/domain.h> | 74 | #include <asm/domain.h> |
75 | 75 | ||
76 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ | 76 | #define __futex_atomic_op(insn, ret, oldval, tmp, uaddr, oparg) \ |
77 | __asm__ __volatile__( \ | 77 | __asm__ __volatile__( \ |
78 | "1: " T(ldr) " %1, [%2]\n" \ | 78 | "1: " T(ldr) " %1, [%3]\n" \ |
79 | " " insn "\n" \ | 79 | " " insn "\n" \ |
80 | "2: " T(str) " %0, [%2]\n" \ | 80 | "2: " T(str) " %0, [%3]\n" \ |
81 | " mov %0, #0\n" \ | 81 | " mov %0, #0\n" \ |
82 | __futex_atomic_ex_table("%4") \ | 82 | __futex_atomic_ex_table("%5") \ |
83 | : "=&r" (ret), "=&r" (oldval) \ | 83 | : "=&r" (ret), "=&r" (oldval), "=&r" (tmp) \ |
84 | : "r" (uaddr), "r" (oparg), "Ir" (-EFAULT) \ | 84 | : "r" (uaddr), "r" (oparg), "Ir" (-EFAULT) \ |
85 | : "cc", "memory") | 85 | : "cc", "memory") |
86 | 86 | ||
@@ -117,7 +117,7 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) | |||
117 | int cmp = (encoded_op >> 24) & 15; | 117 | int cmp = (encoded_op >> 24) & 15; |
118 | int oparg = (encoded_op << 8) >> 20; | 118 | int oparg = (encoded_op << 8) >> 20; |
119 | int cmparg = (encoded_op << 20) >> 20; | 119 | int cmparg = (encoded_op << 20) >> 20; |
120 | int oldval = 0, ret; | 120 | int oldval = 0, ret, tmp; |
121 | 121 | ||
122 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) | 122 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) |
123 | oparg = 1 << oparg; | 123 | oparg = 1 << oparg; |
@@ -129,19 +129,19 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) | |||
129 | 129 | ||
130 | switch (op) { | 130 | switch (op) { |
131 | case FUTEX_OP_SET: | 131 | case FUTEX_OP_SET: |
132 | __futex_atomic_op("mov %0, %3", ret, oldval, uaddr, oparg); | 132 | __futex_atomic_op("mov %0, %4", ret, oldval, tmp, uaddr, oparg); |
133 | break; | 133 | break; |
134 | case FUTEX_OP_ADD: | 134 | case FUTEX_OP_ADD: |
135 | __futex_atomic_op("add %0, %1, %3", ret, oldval, uaddr, oparg); | 135 | __futex_atomic_op("add %0, %1, %4", ret, oldval, tmp, uaddr, oparg); |
136 | break; | 136 | break; |
137 | case FUTEX_OP_OR: | 137 | case FUTEX_OP_OR: |
138 | __futex_atomic_op("orr %0, %1, %3", ret, oldval, uaddr, oparg); | 138 | __futex_atomic_op("orr %0, %1, %4", ret, oldval, tmp, uaddr, oparg); |
139 | break; | 139 | break; |
140 | case FUTEX_OP_ANDN: | 140 | case FUTEX_OP_ANDN: |
141 | __futex_atomic_op("and %0, %1, %3", ret, oldval, uaddr, ~oparg); | 141 | __futex_atomic_op("and %0, %1, %4", ret, oldval, tmp, uaddr, ~oparg); |
142 | break; | 142 | break; |
143 | case FUTEX_OP_XOR: | 143 | case FUTEX_OP_XOR: |
144 | __futex_atomic_op("eor %0, %1, %3", ret, oldval, uaddr, oparg); | 144 | __futex_atomic_op("eor %0, %1, %4", ret, oldval, tmp, uaddr, oparg); |
145 | break; | 145 | break; |
146 | default: | 146 | default: |
147 | ret = -ENOSYS; | 147 | ret = -ENOSYS; |
diff --git a/arch/arm/include/asm/hardware/cache-l2x0.h b/arch/arm/include/asm/hardware/cache-l2x0.h index 16bd48031583..99a6ed7e1bfd 100644 --- a/arch/arm/include/asm/hardware/cache-l2x0.h +++ b/arch/arm/include/asm/hardware/cache-l2x0.h | |||
@@ -45,8 +45,13 @@ | |||
45 | #define L2X0_CLEAN_INV_LINE_PA 0x7F0 | 45 | #define L2X0_CLEAN_INV_LINE_PA 0x7F0 |
46 | #define L2X0_CLEAN_INV_LINE_IDX 0x7F8 | 46 | #define L2X0_CLEAN_INV_LINE_IDX 0x7F8 |
47 | #define L2X0_CLEAN_INV_WAY 0x7FC | 47 | #define L2X0_CLEAN_INV_WAY 0x7FC |
48 | #define L2X0_LOCKDOWN_WAY_D 0x900 | 48 | /* |
49 | #define L2X0_LOCKDOWN_WAY_I 0x904 | 49 | * The lockdown registers repeat 8 times for L310, the L210 has only one |
50 | * D and one I lockdown register at 0x0900 and 0x0904. | ||
51 | */ | ||
52 | #define L2X0_LOCKDOWN_WAY_D_BASE 0x900 | ||
53 | #define L2X0_LOCKDOWN_WAY_I_BASE 0x904 | ||
54 | #define L2X0_LOCKDOWN_STRIDE 0x08 | ||
50 | #define L2X0_TEST_OPERATION 0xF00 | 55 | #define L2X0_TEST_OPERATION 0xF00 |
51 | #define L2X0_LINE_DATA 0xF10 | 56 | #define L2X0_LINE_DATA 0xF10 |
52 | #define L2X0_LINE_TAG 0xF30 | 57 | #define L2X0_LINE_TAG 0xF30 |
@@ -64,7 +69,7 @@ | |||
64 | #define L2X0_AUX_CTRL_MASK 0xc0000fff | 69 | #define L2X0_AUX_CTRL_MASK 0xc0000fff |
65 | #define L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT 16 | 70 | #define L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT 16 |
66 | #define L2X0_AUX_CTRL_WAY_SIZE_SHIFT 17 | 71 | #define L2X0_AUX_CTRL_WAY_SIZE_SHIFT 17 |
67 | #define L2X0_AUX_CTRL_WAY_SIZE_MASK (0x3 << 17) | 72 | #define L2X0_AUX_CTRL_WAY_SIZE_MASK (0x7 << 17) |
68 | #define L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT 22 | 73 | #define L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT 22 |
69 | #define L2X0_AUX_CTRL_NS_LOCKDOWN_SHIFT 26 | 74 | #define L2X0_AUX_CTRL_NS_LOCKDOWN_SHIFT 26 |
70 | #define L2X0_AUX_CTRL_NS_INT_CTRL_SHIFT 27 | 75 | #define L2X0_AUX_CTRL_NS_INT_CTRL_SHIFT 27 |
diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index 67c70a31a1be..b7e82c4aced6 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h | |||
@@ -41,7 +41,7 @@ struct arm_pmu_platdata { | |||
41 | * encoded error on failure. | 41 | * encoded error on failure. |
42 | */ | 42 | */ |
43 | extern struct platform_device * | 43 | extern struct platform_device * |
44 | reserve_pmu(enum arm_pmu_type device); | 44 | reserve_pmu(enum arm_pmu_type type); |
45 | 45 | ||
46 | /** | 46 | /** |
47 | * release_pmu() - Relinquish control of the performance counters | 47 | * release_pmu() - Relinquish control of the performance counters |
@@ -62,26 +62,26 @@ release_pmu(enum arm_pmu_type type); | |||
62 | * the actual hardware initialisation. | 62 | * the actual hardware initialisation. |
63 | */ | 63 | */ |
64 | extern int | 64 | extern int |
65 | init_pmu(enum arm_pmu_type device); | 65 | init_pmu(enum arm_pmu_type type); |
66 | 66 | ||
67 | #else /* CONFIG_CPU_HAS_PMU */ | 67 | #else /* CONFIG_CPU_HAS_PMU */ |
68 | 68 | ||
69 | #include <linux/err.h> | 69 | #include <linux/err.h> |
70 | 70 | ||
71 | static inline struct platform_device * | 71 | static inline struct platform_device * |
72 | reserve_pmu(enum arm_pmu_type device) | 72 | reserve_pmu(enum arm_pmu_type type) |
73 | { | 73 | { |
74 | return ERR_PTR(-ENODEV); | 74 | return ERR_PTR(-ENODEV); |
75 | } | 75 | } |
76 | 76 | ||
77 | static inline int | 77 | static inline int |
78 | release_pmu(struct platform_device *pdev) | 78 | release_pmu(enum arm_pmu_type type) |
79 | { | 79 | { |
80 | return -ENODEV; | 80 | return -ENODEV; |
81 | } | 81 | } |
82 | 82 | ||
83 | static inline int | 83 | static inline int |
84 | init_pmu(enum arm_pmu_type device) | 84 | init_pmu(enum arm_pmu_type type) |
85 | { | 85 | { |
86 | return -ENODEV; | 86 | return -ENODEV; |
87 | } | 87 | } |
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index 2c04ed5efeb5..c60a2944f95b 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
@@ -478,8 +478,8 @@ | |||
478 | /* | 478 | /* |
479 | * Unimplemented (or alternatively implemented) syscalls | 479 | * Unimplemented (or alternatively implemented) syscalls |
480 | */ | 480 | */ |
481 | #define __IGNORE_fadvise64_64 1 | 481 | #define __IGNORE_fadvise64_64 |
482 | #define __IGNORE_migrate_pages 1 | 482 | #define __IGNORE_migrate_pages |
483 | 483 | ||
484 | #endif /* __KERNEL__ */ | 484 | #endif /* __KERNEL__ */ |
485 | #endif /* __ASM_ARM_UNISTD_H */ | 485 | #endif /* __ASM_ARM_UNISTD_H */ |
diff --git a/arch/arm/kernel/pmu.c b/arch/arm/kernel/pmu.c index 2b70709376c3..c53474fe84df 100644 --- a/arch/arm/kernel/pmu.c +++ b/arch/arm/kernel/pmu.c | |||
@@ -31,7 +31,7 @@ static int __devinit pmu_register(struct platform_device *pdev, | |||
31 | { | 31 | { |
32 | if (type < 0 || type >= ARM_NUM_PMU_DEVICES) { | 32 | if (type < 0 || type >= ARM_NUM_PMU_DEVICES) { |
33 | pr_warning("received registration request for unknown " | 33 | pr_warning("received registration request for unknown " |
34 | "device %d\n", type); | 34 | "PMU device type %d\n", type); |
35 | return -EINVAL; | 35 | return -EINVAL; |
36 | } | 36 | } |
37 | 37 | ||
@@ -112,17 +112,17 @@ static int __init register_pmu_driver(void) | |||
112 | device_initcall(register_pmu_driver); | 112 | device_initcall(register_pmu_driver); |
113 | 113 | ||
114 | struct platform_device * | 114 | struct platform_device * |
115 | reserve_pmu(enum arm_pmu_type device) | 115 | reserve_pmu(enum arm_pmu_type type) |
116 | { | 116 | { |
117 | struct platform_device *pdev; | 117 | struct platform_device *pdev; |
118 | 118 | ||
119 | if (test_and_set_bit_lock(device, &pmu_lock)) { | 119 | if (test_and_set_bit_lock(type, &pmu_lock)) { |
120 | pdev = ERR_PTR(-EBUSY); | 120 | pdev = ERR_PTR(-EBUSY); |
121 | } else if (pmu_devices[device] == NULL) { | 121 | } else if (pmu_devices[type] == NULL) { |
122 | clear_bit_unlock(device, &pmu_lock); | 122 | clear_bit_unlock(type, &pmu_lock); |
123 | pdev = ERR_PTR(-ENODEV); | 123 | pdev = ERR_PTR(-ENODEV); |
124 | } else { | 124 | } else { |
125 | pdev = pmu_devices[device]; | 125 | pdev = pmu_devices[type]; |
126 | } | 126 | } |
127 | 127 | ||
128 | return pdev; | 128 | return pdev; |
@@ -130,11 +130,11 @@ reserve_pmu(enum arm_pmu_type device) | |||
130 | EXPORT_SYMBOL_GPL(reserve_pmu); | 130 | EXPORT_SYMBOL_GPL(reserve_pmu); |
131 | 131 | ||
132 | int | 132 | int |
133 | release_pmu(enum arm_pmu_type device) | 133 | release_pmu(enum arm_pmu_type type) |
134 | { | 134 | { |
135 | if (WARN_ON(!pmu_devices[device])) | 135 | if (WARN_ON(!pmu_devices[type])) |
136 | return -EINVAL; | 136 | return -EINVAL; |
137 | clear_bit_unlock(device, &pmu_lock); | 137 | clear_bit_unlock(type, &pmu_lock); |
138 | return 0; | 138 | return 0; |
139 | } | 139 | } |
140 | EXPORT_SYMBOL_GPL(release_pmu); | 140 | EXPORT_SYMBOL_GPL(release_pmu); |
@@ -182,17 +182,17 @@ init_cpu_pmu(void) | |||
182 | } | 182 | } |
183 | 183 | ||
184 | int | 184 | int |
185 | init_pmu(enum arm_pmu_type device) | 185 | init_pmu(enum arm_pmu_type type) |
186 | { | 186 | { |
187 | int err = 0; | 187 | int err = 0; |
188 | 188 | ||
189 | switch (device) { | 189 | switch (type) { |
190 | case ARM_PMU_DEVICE_CPU: | 190 | case ARM_PMU_DEVICE_CPU: |
191 | err = init_cpu_pmu(); | 191 | err = init_cpu_pmu(); |
192 | break; | 192 | break; |
193 | default: | 193 | default: |
194 | pr_warning("attempt to initialise unknown device %d\n", | 194 | pr_warning("attempt to initialise PMU of unknown " |
195 | device); | 195 | "type %d\n", type); |
196 | err = -EINVAL; | 196 | err = -EINVAL; |
197 | } | 197 | } |
198 | 198 | ||
diff --git a/arch/arm/kernel/relocate_kernel.S b/arch/arm/kernel/relocate_kernel.S index 9cf4cbf8f95b..d0cdedf4864d 100644 --- a/arch/arm/kernel/relocate_kernel.S +++ b/arch/arm/kernel/relocate_kernel.S | |||
@@ -57,7 +57,8 @@ relocate_new_kernel: | |||
57 | mov r0,#0 | 57 | mov r0,#0 |
58 | ldr r1,kexec_mach_type | 58 | ldr r1,kexec_mach_type |
59 | ldr r2,kexec_boot_atags | 59 | ldr r2,kexec_boot_atags |
60 | mov pc,lr | 60 | ARM( mov pc, lr ) |
61 | THUMB( bx lr ) | ||
61 | 62 | ||
62 | .align | 63 | .align |
63 | 64 | ||
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 70bca649e925..e514c76043b4 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -280,18 +280,19 @@ static void __init cacheid_init(void) | |||
280 | if (arch >= CPU_ARCH_ARMv6) { | 280 | if (arch >= CPU_ARCH_ARMv6) { |
281 | if ((cachetype & (7 << 29)) == 4 << 29) { | 281 | if ((cachetype & (7 << 29)) == 4 << 29) { |
282 | /* ARMv7 register format */ | 282 | /* ARMv7 register format */ |
283 | arch = CPU_ARCH_ARMv7; | ||
283 | cacheid = CACHEID_VIPT_NONALIASING; | 284 | cacheid = CACHEID_VIPT_NONALIASING; |
284 | if ((cachetype & (3 << 14)) == 1 << 14) | 285 | if ((cachetype & (3 << 14)) == 1 << 14) |
285 | cacheid |= CACHEID_ASID_TAGGED; | 286 | cacheid |= CACHEID_ASID_TAGGED; |
286 | else if (cpu_has_aliasing_icache(CPU_ARCH_ARMv7)) | ||
287 | cacheid |= CACHEID_VIPT_I_ALIASING; | ||
288 | } else if (cachetype & (1 << 23)) { | ||
289 | cacheid = CACHEID_VIPT_ALIASING; | ||
290 | } else { | 287 | } else { |
291 | cacheid = CACHEID_VIPT_NONALIASING; | 288 | arch = CPU_ARCH_ARMv6; |
292 | if (cpu_has_aliasing_icache(CPU_ARCH_ARMv6)) | 289 | if (cachetype & (1 << 23)) |
293 | cacheid |= CACHEID_VIPT_I_ALIASING; | 290 | cacheid = CACHEID_VIPT_ALIASING; |
291 | else | ||
292 | cacheid = CACHEID_VIPT_NONALIASING; | ||
294 | } | 293 | } |
294 | if (cpu_has_aliasing_icache(arch)) | ||
295 | cacheid |= CACHEID_VIPT_I_ALIASING; | ||
295 | } else { | 296 | } else { |
296 | cacheid = CACHEID_VIVT; | 297 | cacheid = CACHEID_VIVT; |
297 | } | 298 | } |
diff --git a/arch/arm/kernel/smp_scu.c b/arch/arm/kernel/smp_scu.c index 79ed5e7f204a..7fcddb75c877 100644 --- a/arch/arm/kernel/smp_scu.c +++ b/arch/arm/kernel/smp_scu.c | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #include <asm/smp_scu.h> | 14 | #include <asm/smp_scu.h> |
15 | #include <asm/cacheflush.h> | 15 | #include <asm/cacheflush.h> |
16 | #include <asm/cputype.h> | ||
16 | 17 | ||
17 | #define SCU_CTRL 0x00 | 18 | #define SCU_CTRL 0x00 |
18 | #define SCU_CONFIG 0x04 | 19 | #define SCU_CONFIG 0x04 |
@@ -37,6 +38,15 @@ void __init scu_enable(void __iomem *scu_base) | |||
37 | { | 38 | { |
38 | u32 scu_ctrl; | 39 | u32 scu_ctrl; |
39 | 40 | ||
41 | #ifdef CONFIG_ARM_ERRATA_764369 | ||
42 | /* Cortex-A9 only */ | ||
43 | if ((read_cpuid(CPUID_ID) & 0xff0ffff0) == 0x410fc090) { | ||
44 | scu_ctrl = __raw_readl(scu_base + 0x30); | ||
45 | if (!(scu_ctrl & 1)) | ||
46 | __raw_writel(scu_ctrl | 0x1, scu_base + 0x30); | ||
47 | } | ||
48 | #endif | ||
49 | |||
40 | scu_ctrl = __raw_readl(scu_base + SCU_CTRL); | 50 | scu_ctrl = __raw_readl(scu_base + SCU_CTRL); |
41 | /* already enabled? */ | 51 | /* already enabled? */ |
42 | if (scu_ctrl & 1) | 52 | if (scu_ctrl & 1) |
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 2c277d40cee6..01c186222f3b 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c | |||
@@ -137,8 +137,8 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk) | |||
137 | clk->max_delta_ns = clockevent_delta2ns(0xffffffff, clk); | 137 | clk->max_delta_ns = clockevent_delta2ns(0xffffffff, clk); |
138 | clk->min_delta_ns = clockevent_delta2ns(0xf, clk); | 138 | clk->min_delta_ns = clockevent_delta2ns(0xf, clk); |
139 | 139 | ||
140 | clockevents_register_device(clk); | ||
141 | |||
140 | /* Make sure our local interrupt controller has this enabled */ | 142 | /* Make sure our local interrupt controller has this enabled */ |
141 | gic_enable_ppi(clk->irq); | 143 | gic_enable_ppi(clk->irq); |
142 | |||
143 | clockevents_register_device(clk); | ||
144 | } | 144 | } |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index bf977f8514f6..4e66f62b8d41 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -23,8 +23,10 @@ | |||
23 | 23 | ||
24 | #if defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK) | 24 | #if defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK) |
25 | #define ARM_EXIT_KEEP(x) x | 25 | #define ARM_EXIT_KEEP(x) x |
26 | #define ARM_EXIT_DISCARD(x) | ||
26 | #else | 27 | #else |
27 | #define ARM_EXIT_KEEP(x) | 28 | #define ARM_EXIT_KEEP(x) |
29 | #define ARM_EXIT_DISCARD(x) x | ||
28 | #endif | 30 | #endif |
29 | 31 | ||
30 | OUTPUT_ARCH(arm) | 32 | OUTPUT_ARCH(arm) |
@@ -39,6 +41,11 @@ jiffies = jiffies_64 + 4; | |||
39 | SECTIONS | 41 | SECTIONS |
40 | { | 42 | { |
41 | /* | 43 | /* |
44 | * XXX: The linker does not define how output sections are | ||
45 | * assigned to input sections when there are multiple statements | ||
46 | * matching the same input section name. There is no documented | ||
47 | * order of matching. | ||
48 | * | ||
42 | * unwind exit sections must be discarded before the rest of the | 49 | * unwind exit sections must be discarded before the rest of the |
43 | * unwind sections get included. | 50 | * unwind sections get included. |
44 | */ | 51 | */ |
@@ -47,6 +54,9 @@ SECTIONS | |||
47 | *(.ARM.extab.exit.text) | 54 | *(.ARM.extab.exit.text) |
48 | ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) | 55 | ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) |
49 | ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) | 56 | ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) |
57 | ARM_EXIT_DISCARD(EXIT_TEXT) | ||
58 | ARM_EXIT_DISCARD(EXIT_DATA) | ||
59 | EXIT_CALL | ||
50 | #ifndef CONFIG_HOTPLUG | 60 | #ifndef CONFIG_HOTPLUG |
51 | *(.ARM.exidx.devexit.text) | 61 | *(.ARM.exidx.devexit.text) |
52 | *(.ARM.extab.devexit.text) | 62 | *(.ARM.extab.devexit.text) |
@@ -58,6 +68,8 @@ SECTIONS | |||
58 | #ifndef CONFIG_SMP_ON_UP | 68 | #ifndef CONFIG_SMP_ON_UP |
59 | *(.alt.smp.init) | 69 | *(.alt.smp.init) |
60 | #endif | 70 | #endif |
71 | *(.discard) | ||
72 | *(.discard.*) | ||
61 | } | 73 | } |
62 | 74 | ||
63 | #ifdef CONFIG_XIP_KERNEL | 75 | #ifdef CONFIG_XIP_KERNEL |
@@ -279,9 +291,6 @@ SECTIONS | |||
279 | 291 | ||
280 | STABS_DEBUG | 292 | STABS_DEBUG |
281 | .comment 0 : { *(.comment) } | 293 | .comment 0 : { *(.comment) } |
282 | |||
283 | /* Default discards */ | ||
284 | DISCARDS | ||
285 | } | 294 | } |
286 | 295 | ||
287 | /* | 296 | /* |
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index d522b47e30b5..6c8e3b5f669f 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c | |||
@@ -157,7 +157,7 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
157 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | 157 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), |
158 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | 158 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), |
159 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | 159 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), |
160 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc1_clk), | 160 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), |
161 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | 161 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), |
162 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | 162 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), |
163 | CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk), | 163 | CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk), |
diff --git a/arch/arm/mach-cns3xxx/include/mach/entry-macro.S b/arch/arm/mach-cns3xxx/include/mach/entry-macro.S index 6bd83ed90afe..d87bfc397d39 100644 --- a/arch/arm/mach-cns3xxx/include/mach/entry-macro.S +++ b/arch/arm/mach-cns3xxx/include/mach/entry-macro.S | |||
@@ -8,7 +8,6 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <mach/hardware.h> | ||
12 | #include <asm/hardware/entry-macro-gic.S> | 11 | #include <asm/hardware/entry-macro-gic.S> |
13 | 12 | ||
14 | .macro disable_fiq | 13 | .macro disable_fiq |
diff --git a/arch/arm/mach-cns3xxx/include/mach/system.h b/arch/arm/mach-cns3xxx/include/mach/system.h index 58bb03ae3cf4..4f16c9b79f78 100644 --- a/arch/arm/mach-cns3xxx/include/mach/system.h +++ b/arch/arm/mach-cns3xxx/include/mach/system.h | |||
@@ -13,7 +13,6 @@ | |||
13 | 13 | ||
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | #include <asm/proc-fns.h> | 15 | #include <asm/proc-fns.h> |
16 | #include <mach/hardware.h> | ||
17 | 16 | ||
18 | static inline void arch_idle(void) | 17 | static inline void arch_idle(void) |
19 | { | 18 | { |
diff --git a/arch/arm/mach-cns3xxx/include/mach/uncompress.h b/arch/arm/mach-cns3xxx/include/mach/uncompress.h index de8ead9b91f7..a91b6058ab4f 100644 --- a/arch/arm/mach-cns3xxx/include/mach/uncompress.h +++ b/arch/arm/mach-cns3xxx/include/mach/uncompress.h | |||
@@ -8,7 +8,6 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <asm/mach-types.h> | 10 | #include <asm/mach-types.h> |
11 | #include <mach/hardware.h> | ||
12 | #include <mach/cns3xxx.h> | 11 | #include <mach/cns3xxx.h> |
13 | 12 | ||
14 | #define AMBA_UART_DR(base) (*(volatile unsigned char *)((base) + 0x00)) | 13 | #define AMBA_UART_DR(base) (*(volatile unsigned char *)((base) + 0x00)) |
diff --git a/arch/arm/mach-cns3xxx/pcie.c b/arch/arm/mach-cns3xxx/pcie.c index 06fd25d70aec..0f8fca48a5ed 100644 --- a/arch/arm/mach-cns3xxx/pcie.c +++ b/arch/arm/mach-cns3xxx/pcie.c | |||
@@ -49,7 +49,7 @@ static struct cns3xxx_pcie *sysdata_to_cnspci(void *sysdata) | |||
49 | return &cns3xxx_pcie[root->domain]; | 49 | return &cns3xxx_pcie[root->domain]; |
50 | } | 50 | } |
51 | 51 | ||
52 | static struct cns3xxx_pcie *pdev_to_cnspci(struct pci_dev *dev) | 52 | static struct cns3xxx_pcie *pdev_to_cnspci(const struct pci_dev *dev) |
53 | { | 53 | { |
54 | return sysdata_to_cnspci(dev->sysdata); | 54 | return sysdata_to_cnspci(dev->sysdata); |
55 | } | 55 | } |
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index bd5394537c88..008d51407cd7 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c | |||
@@ -115,6 +115,32 @@ static struct spi_board_info da850evm_spi_info[] = { | |||
115 | }, | 115 | }, |
116 | }; | 116 | }; |
117 | 117 | ||
118 | #ifdef CONFIG_MTD | ||
119 | static void da850_evm_m25p80_notify_add(struct mtd_info *mtd) | ||
120 | { | ||
121 | char *mac_addr = davinci_soc_info.emac_pdata->mac_addr; | ||
122 | size_t retlen; | ||
123 | |||
124 | if (!strcmp(mtd->name, "MAC-Address")) { | ||
125 | mtd->read(mtd, 0, ETH_ALEN, &retlen, mac_addr); | ||
126 | if (retlen == ETH_ALEN) | ||
127 | pr_info("Read MAC addr from SPI Flash: %pM\n", | ||
128 | mac_addr); | ||
129 | } | ||
130 | } | ||
131 | |||
132 | static struct mtd_notifier da850evm_spi_notifier = { | ||
133 | .add = da850_evm_m25p80_notify_add, | ||
134 | }; | ||
135 | |||
136 | static void da850_evm_setup_mac_addr(void) | ||
137 | { | ||
138 | register_mtd_user(&da850evm_spi_notifier); | ||
139 | } | ||
140 | #else | ||
141 | static void da850_evm_setup_mac_addr(void) { } | ||
142 | #endif | ||
143 | |||
118 | static struct mtd_partition da850_evm_norflash_partition[] = { | 144 | static struct mtd_partition da850_evm_norflash_partition[] = { |
119 | { | 145 | { |
120 | .name = "bootloaders + env", | 146 | .name = "bootloaders + env", |
@@ -1244,6 +1270,8 @@ static __init void da850_evm_init(void) | |||
1244 | if (ret) | 1270 | if (ret) |
1245 | pr_warning("da850_evm_init: sata registration failed: %d\n", | 1271 | pr_warning("da850_evm_init: sata registration failed: %d\n", |
1246 | ret); | 1272 | ret); |
1273 | |||
1274 | da850_evm_setup_mac_addr(); | ||
1247 | } | 1275 | } |
1248 | 1276 | ||
1249 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 1277 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
diff --git a/arch/arm/mach-davinci/include/mach/psc.h b/arch/arm/mach-davinci/include/mach/psc.h index 47fd0bc3d3e7..fa59c097223d 100644 --- a/arch/arm/mach-davinci/include/mach/psc.h +++ b/arch/arm/mach-davinci/include/mach/psc.h | |||
@@ -243,7 +243,7 @@ | |||
243 | #define PSC_STATE_DISABLE 2 | 243 | #define PSC_STATE_DISABLE 2 |
244 | #define PSC_STATE_ENABLE 3 | 244 | #define PSC_STATE_ENABLE 3 |
245 | 245 | ||
246 | #define MDSTAT_STATE_MASK 0x1f | 246 | #define MDSTAT_STATE_MASK 0x3f |
247 | #define MDCTL_FORCE BIT(31) | 247 | #define MDCTL_FORCE BIT(31) |
248 | 248 | ||
249 | #ifndef __ASSEMBLER__ | 249 | #ifndef __ASSEMBLER__ |
diff --git a/arch/arm/mach-davinci/sleep.S b/arch/arm/mach-davinci/sleep.S index fb5e72b532b0..5f1e045a3ad1 100644 --- a/arch/arm/mach-davinci/sleep.S +++ b/arch/arm/mach-davinci/sleep.S | |||
@@ -217,7 +217,11 @@ ddr2clk_stop_done: | |||
217 | ENDPROC(davinci_ddr_psc_config) | 217 | ENDPROC(davinci_ddr_psc_config) |
218 | 218 | ||
219 | CACHE_FLUSH: | 219 | CACHE_FLUSH: |
220 | .word arm926_flush_kern_cache_all | 220 | #ifdef CONFIG_CPU_V6 |
221 | .word v6_flush_kern_cache_all | ||
222 | #else | ||
223 | .word arm926_flush_kern_cache_all | ||
224 | #endif | ||
221 | 225 | ||
222 | ENTRY(davinci_cpu_suspend_sz) | 226 | ENTRY(davinci_cpu_suspend_sz) |
223 | .word . - davinci_cpu_suspend | 227 | .word . - davinci_cpu_suspend |
diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index 83dce859886d..a9e0dae86a26 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c | |||
@@ -158,7 +158,7 @@ void __init dove_spi0_init(void) | |||
158 | 158 | ||
159 | void __init dove_spi1_init(void) | 159 | void __init dove_spi1_init(void) |
160 | { | 160 | { |
161 | orion_spi_init(DOVE_SPI1_PHYS_BASE, get_tclk()); | 161 | orion_spi_1_init(DOVE_SPI1_PHYS_BASE, get_tclk()); |
162 | } | 162 | } |
163 | 163 | ||
164 | /***************************************************************************** | 164 | /***************************************************************************** |
diff --git a/arch/arm/mach-ep93xx/include/mach/ts72xx.h b/arch/arm/mach-ep93xx/include/mach/ts72xx.h index 0eabec62cd9d..f1397a13e76b 100644 --- a/arch/arm/mach-ep93xx/include/mach/ts72xx.h +++ b/arch/arm/mach-ep93xx/include/mach/ts72xx.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * TS72xx memory map: | 6 | * TS72xx memory map: |
7 | * | 7 | * |
8 | * virt phys size | 8 | * virt phys size |
9 | * febff000 22000000 4K model number register | 9 | * febff000 22000000 4K model number register (bits 0-2) |
10 | * febfe000 22400000 4K options register | 10 | * febfe000 22400000 4K options register |
11 | * febfd000 22800000 4K options register #2 | 11 | * febfd000 22800000 4K options register #2 |
12 | * febf9000 10800000 4K TS-5620 RTC index register | 12 | * febf9000 10800000 4K TS-5620 RTC index register |
@@ -20,6 +20,9 @@ | |||
20 | #define TS72XX_MODEL_TS7200 0x00 | 20 | #define TS72XX_MODEL_TS7200 0x00 |
21 | #define TS72XX_MODEL_TS7250 0x01 | 21 | #define TS72XX_MODEL_TS7250 0x01 |
22 | #define TS72XX_MODEL_TS7260 0x02 | 22 | #define TS72XX_MODEL_TS7260 0x02 |
23 | #define TS72XX_MODEL_TS7300 0x03 | ||
24 | #define TS72XX_MODEL_TS7400 0x04 | ||
25 | #define TS72XX_MODEL_MASK 0x07 | ||
23 | 26 | ||
24 | 27 | ||
25 | #define TS72XX_OPTIONS_PHYS_BASE 0x22400000 | 28 | #define TS72XX_OPTIONS_PHYS_BASE 0x22400000 |
@@ -51,19 +54,34 @@ | |||
51 | 54 | ||
52 | #ifndef __ASSEMBLY__ | 55 | #ifndef __ASSEMBLY__ |
53 | 56 | ||
57 | static inline int ts72xx_model(void) | ||
58 | { | ||
59 | return __raw_readb(TS72XX_MODEL_VIRT_BASE) & TS72XX_MODEL_MASK; | ||
60 | } | ||
61 | |||
54 | static inline int board_is_ts7200(void) | 62 | static inline int board_is_ts7200(void) |
55 | { | 63 | { |
56 | return __raw_readb(TS72XX_MODEL_VIRT_BASE) == TS72XX_MODEL_TS7200; | 64 | return ts72xx_model() == TS72XX_MODEL_TS7200; |
57 | } | 65 | } |
58 | 66 | ||
59 | static inline int board_is_ts7250(void) | 67 | static inline int board_is_ts7250(void) |
60 | { | 68 | { |
61 | return __raw_readb(TS72XX_MODEL_VIRT_BASE) == TS72XX_MODEL_TS7250; | 69 | return ts72xx_model() == TS72XX_MODEL_TS7250; |
62 | } | 70 | } |
63 | 71 | ||
64 | static inline int board_is_ts7260(void) | 72 | static inline int board_is_ts7260(void) |
65 | { | 73 | { |
66 | return __raw_readb(TS72XX_MODEL_VIRT_BASE) == TS72XX_MODEL_TS7260; | 74 | return ts72xx_model() == TS72XX_MODEL_TS7260; |
75 | } | ||
76 | |||
77 | static inline int board_is_ts7300(void) | ||
78 | { | ||
79 | return ts72xx_model() == TS72XX_MODEL_TS7300; | ||
80 | } | ||
81 | |||
82 | static inline int board_is_ts7400(void) | ||
83 | { | ||
84 | return ts72xx_model() == TS72XX_MODEL_TS7400; | ||
67 | } | 85 | } |
68 | 86 | ||
69 | static inline int is_max197_installed(void) | 87 | static inline int is_max197_installed(void) |
diff --git a/arch/arm/mach-exynos4/clock.c b/arch/arm/mach-exynos4/clock.c index 851dea018578..86964d2e9e1b 100644 --- a/arch/arm/mach-exynos4/clock.c +++ b/arch/arm/mach-exynos4/clock.c | |||
@@ -520,7 +520,7 @@ static struct clk init_clocks_off[] = { | |||
520 | .ctrlbit = (1 << 21), | 520 | .ctrlbit = (1 << 21), |
521 | }, { | 521 | }, { |
522 | .name = "ac97", | 522 | .name = "ac97", |
523 | .id = -1, | 523 | .devname = "samsung-ac97", |
524 | .enable = exynos4_clk_ip_peril_ctrl, | 524 | .enable = exynos4_clk_ip_peril_ctrl, |
525 | .ctrlbit = (1 << 27), | 525 | .ctrlbit = (1 << 27), |
526 | }, { | 526 | }, { |
@@ -899,8 +899,7 @@ static struct clksrc_clk clksrcs[] = { | |||
899 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 }, | 899 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 }, |
900 | }, { | 900 | }, { |
901 | .clk = { | 901 | .clk = { |
902 | .name = "sclk_cam", | 902 | .name = "sclk_cam0", |
903 | .devname = "exynos4-fimc.0", | ||
904 | .enable = exynos4_clksrc_mask_cam_ctrl, | 903 | .enable = exynos4_clksrc_mask_cam_ctrl, |
905 | .ctrlbit = (1 << 16), | 904 | .ctrlbit = (1 << 16), |
906 | }, | 905 | }, |
@@ -909,8 +908,7 @@ static struct clksrc_clk clksrcs[] = { | |||
909 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 }, | 908 | .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 }, |
910 | }, { | 909 | }, { |
911 | .clk = { | 910 | .clk = { |
912 | .name = "sclk_cam", | 911 | .name = "sclk_cam1", |
913 | .devname = "exynos4-fimc.1", | ||
914 | .enable = exynos4_clksrc_mask_cam_ctrl, | 912 | .enable = exynos4_clksrc_mask_cam_ctrl, |
915 | .ctrlbit = (1 << 20), | 913 | .ctrlbit = (1 << 20), |
916 | }, | 914 | }, |
@@ -1160,7 +1158,7 @@ void __init_or_cpufreq exynos4_setup_clocks(void) | |||
1160 | 1158 | ||
1161 | vpllsrc = clk_get_rate(&clk_vpllsrc.clk); | 1159 | vpllsrc = clk_get_rate(&clk_vpllsrc.clk); |
1162 | vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0), | 1160 | vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0), |
1163 | __raw_readl(S5P_VPLL_CON1), pll_4650); | 1161 | __raw_readl(S5P_VPLL_CON1), pll_4650c); |
1164 | 1162 | ||
1165 | clk_fout_apll.ops = &exynos4_fout_apll_ops; | 1163 | clk_fout_apll.ops = &exynos4_fout_apll_ops; |
1166 | clk_fout_mpll.rate = mpll; | 1164 | clk_fout_mpll.rate = mpll; |
diff --git a/arch/arm/mach-exynos4/cpu.c b/arch/arm/mach-exynos4/cpu.c index 2d8a40c9e6e5..746d6fc6d397 100644 --- a/arch/arm/mach-exynos4/cpu.c +++ b/arch/arm/mach-exynos4/cpu.c | |||
@@ -24,12 +24,13 @@ | |||
24 | #include <plat/exynos4.h> | 24 | #include <plat/exynos4.h> |
25 | #include <plat/adc-core.h> | 25 | #include <plat/adc-core.h> |
26 | #include <plat/sdhci.h> | 26 | #include <plat/sdhci.h> |
27 | #include <plat/devs.h> | ||
28 | #include <plat/fb-core.h> | 27 | #include <plat/fb-core.h> |
29 | #include <plat/fimc-core.h> | 28 | #include <plat/fimc-core.h> |
30 | #include <plat/iic-core.h> | 29 | #include <plat/iic-core.h> |
30 | #include <plat/reset.h> | ||
31 | 31 | ||
32 | #include <mach/regs-irq.h> | 32 | #include <mach/regs-irq.h> |
33 | #include <mach/regs-pmu.h> | ||
33 | 34 | ||
34 | extern int combiner_init(unsigned int combiner_nr, void __iomem *base, | 35 | extern int combiner_init(unsigned int combiner_nr, void __iomem *base, |
35 | unsigned int irq_start); | 36 | unsigned int irq_start); |
@@ -128,6 +129,11 @@ static void exynos4_idle(void) | |||
128 | local_irq_enable(); | 129 | local_irq_enable(); |
129 | } | 130 | } |
130 | 131 | ||
132 | static void exynos4_sw_reset(void) | ||
133 | { | ||
134 | __raw_writel(0x1, S5P_SWRESET); | ||
135 | } | ||
136 | |||
131 | /* | 137 | /* |
132 | * exynos4_map_io | 138 | * exynos4_map_io |
133 | * | 139 | * |
@@ -241,5 +247,8 @@ int __init exynos4_init(void) | |||
241 | /* set idle function */ | 247 | /* set idle function */ |
242 | pm_idle = exynos4_idle; | 248 | pm_idle = exynos4_idle; |
243 | 249 | ||
250 | /* set sw_reset function */ | ||
251 | s5p_reset_hook = exynos4_sw_reset; | ||
252 | |||
244 | return sysdev_register(&exynos4_sysdev); | 253 | return sysdev_register(&exynos4_sysdev); |
245 | } | 254 | } |
diff --git a/arch/arm/mach-exynos4/include/mach/irqs.h b/arch/arm/mach-exynos4/include/mach/irqs.h index 934d2a493982..f8952f8f3757 100644 --- a/arch/arm/mach-exynos4/include/mach/irqs.h +++ b/arch/arm/mach-exynos4/include/mach/irqs.h | |||
@@ -80,9 +80,8 @@ | |||
80 | #define IRQ_HSMMC3 IRQ_SPI(76) | 80 | #define IRQ_HSMMC3 IRQ_SPI(76) |
81 | #define IRQ_DWMCI IRQ_SPI(77) | 81 | #define IRQ_DWMCI IRQ_SPI(77) |
82 | 82 | ||
83 | #define IRQ_MIPICSI0 IRQ_SPI(78) | 83 | #define IRQ_MIPI_CSIS0 IRQ_SPI(78) |
84 | 84 | #define IRQ_MIPI_CSIS1 IRQ_SPI(80) | |
85 | #define IRQ_MIPICSI1 IRQ_SPI(80) | ||
86 | 85 | ||
87 | #define IRQ_ONENAND_AUDI IRQ_SPI(82) | 86 | #define IRQ_ONENAND_AUDI IRQ_SPI(82) |
88 | #define IRQ_ROTATOR IRQ_SPI(83) | 87 | #define IRQ_ROTATOR IRQ_SPI(83) |
diff --git a/arch/arm/mach-exynos4/include/mach/regs-pmu.h b/arch/arm/mach-exynos4/include/mach/regs-pmu.h index fa49bbb8e7b0..cdf9b47c303c 100644 --- a/arch/arm/mach-exynos4/include/mach/regs-pmu.h +++ b/arch/arm/mach-exynos4/include/mach/regs-pmu.h | |||
@@ -29,6 +29,8 @@ | |||
29 | #define S5P_USE_STANDBY_WFE1 (1 << 25) | 29 | #define S5P_USE_STANDBY_WFE1 (1 << 25) |
30 | #define S5P_USE_MASK ((0x3 << 16) | (0x3 << 24)) | 30 | #define S5P_USE_MASK ((0x3 << 16) | (0x3 << 24)) |
31 | 31 | ||
32 | #define S5P_SWRESET S5P_PMUREG(0x0400) | ||
33 | |||
32 | #define S5P_WAKEUP_STAT S5P_PMUREG(0x0600) | 34 | #define S5P_WAKEUP_STAT S5P_PMUREG(0x0600) |
33 | #define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604) | 35 | #define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604) |
34 | #define S5P_WAKEUP_MASK S5P_PMUREG(0x0608) | 36 | #define S5P_WAKEUP_MASK S5P_PMUREG(0x0608) |
diff --git a/arch/arm/mach-exynos4/irq-eint.c b/arch/arm/mach-exynos4/irq-eint.c index 9d87d2ac7f68..badb8c66fc9b 100644 --- a/arch/arm/mach-exynos4/irq-eint.c +++ b/arch/arm/mach-exynos4/irq-eint.c | |||
@@ -23,6 +23,8 @@ | |||
23 | 23 | ||
24 | #include <mach/regs-gpio.h> | 24 | #include <mach/regs-gpio.h> |
25 | 25 | ||
26 | #include <asm/mach/irq.h> | ||
27 | |||
26 | static DEFINE_SPINLOCK(eint_lock); | 28 | static DEFINE_SPINLOCK(eint_lock); |
27 | 29 | ||
28 | static unsigned int eint0_15_data[16]; | 30 | static unsigned int eint0_15_data[16]; |
@@ -184,8 +186,11 @@ static inline void exynos4_irq_demux_eint(unsigned int start) | |||
184 | 186 | ||
185 | static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) | 187 | static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) |
186 | { | 188 | { |
189 | struct irq_chip *chip = irq_get_chip(irq); | ||
190 | chained_irq_enter(chip, desc); | ||
187 | exynos4_irq_demux_eint(IRQ_EINT(16)); | 191 | exynos4_irq_demux_eint(IRQ_EINT(16)); |
188 | exynos4_irq_demux_eint(IRQ_EINT(24)); | 192 | exynos4_irq_demux_eint(IRQ_EINT(24)); |
193 | chained_irq_exit(chip, desc); | ||
189 | } | 194 | } |
190 | 195 | ||
191 | static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) | 196 | static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) |
@@ -193,6 +198,7 @@ static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) | |||
193 | u32 *irq_data = irq_get_handler_data(irq); | 198 | u32 *irq_data = irq_get_handler_data(irq); |
194 | struct irq_chip *chip = irq_get_chip(irq); | 199 | struct irq_chip *chip = irq_get_chip(irq); |
195 | 200 | ||
201 | chained_irq_enter(chip, desc); | ||
196 | chip->irq_mask(&desc->irq_data); | 202 | chip->irq_mask(&desc->irq_data); |
197 | 203 | ||
198 | if (chip->irq_ack) | 204 | if (chip->irq_ack) |
@@ -201,6 +207,7 @@ static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) | |||
201 | generic_handle_irq(*irq_data); | 207 | generic_handle_irq(*irq_data); |
202 | 208 | ||
203 | chip->irq_unmask(&desc->irq_data); | 209 | chip->irq_unmask(&desc->irq_data); |
210 | chained_irq_exit(chip, desc); | ||
204 | } | 211 | } |
205 | 212 | ||
206 | int __init exynos4_init_irq_eint(void) | 213 | int __init exynos4_init_irq_eint(void) |
diff --git a/arch/arm/mach-exynos4/mach-universal_c210.c b/arch/arm/mach-exynos4/mach-universal_c210.c index 0e280d12301e..b3b5d8911004 100644 --- a/arch/arm/mach-exynos4/mach-universal_c210.c +++ b/arch/arm/mach-exynos4/mach-universal_c210.c | |||
@@ -79,7 +79,7 @@ static struct s3c2410_uartcfg universal_uartcfgs[] __initdata = { | |||
79 | }; | 79 | }; |
80 | 80 | ||
81 | static struct regulator_consumer_supply max8952_consumer = | 81 | static struct regulator_consumer_supply max8952_consumer = |
82 | REGULATOR_SUPPLY("vddarm", NULL); | 82 | REGULATOR_SUPPLY("vdd_arm", NULL); |
83 | 83 | ||
84 | static struct max8952_platform_data universal_max8952_pdata __initdata = { | 84 | static struct max8952_platform_data universal_max8952_pdata __initdata = { |
85 | .gpio_vid0 = EXYNOS4_GPX0(3), | 85 | .gpio_vid0 = EXYNOS4_GPX0(3), |
@@ -105,7 +105,7 @@ static struct max8952_platform_data universal_max8952_pdata __initdata = { | |||
105 | }; | 105 | }; |
106 | 106 | ||
107 | static struct regulator_consumer_supply lp3974_buck1_consumer = | 107 | static struct regulator_consumer_supply lp3974_buck1_consumer = |
108 | REGULATOR_SUPPLY("vddint", NULL); | 108 | REGULATOR_SUPPLY("vdd_int", NULL); |
109 | 109 | ||
110 | static struct regulator_consumer_supply lp3974_buck2_consumer = | 110 | static struct regulator_consumer_supply lp3974_buck2_consumer = |
111 | REGULATOR_SUPPLY("vddg3d", NULL); | 111 | REGULATOR_SUPPLY("vddg3d", NULL); |
diff --git a/arch/arm/mach-exynos4/mct.c b/arch/arm/mach-exynos4/mct.c index 1ae059b7ad7b..ddd86864fb83 100644 --- a/arch/arm/mach-exynos4/mct.c +++ b/arch/arm/mach-exynos4/mct.c | |||
@@ -132,12 +132,18 @@ static cycle_t exynos4_frc_read(struct clocksource *cs) | |||
132 | return ((cycle_t)hi << 32) | lo; | 132 | return ((cycle_t)hi << 32) | lo; |
133 | } | 133 | } |
134 | 134 | ||
135 | static void exynos4_frc_resume(struct clocksource *cs) | ||
136 | { | ||
137 | exynos4_mct_frc_start(0, 0); | ||
138 | } | ||
139 | |||
135 | struct clocksource mct_frc = { | 140 | struct clocksource mct_frc = { |
136 | .name = "mct-frc", | 141 | .name = "mct-frc", |
137 | .rating = 400, | 142 | .rating = 400, |
138 | .read = exynos4_frc_read, | 143 | .read = exynos4_frc_read, |
139 | .mask = CLOCKSOURCE_MASK(64), | 144 | .mask = CLOCKSOURCE_MASK(64), |
140 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 145 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
146 | .resume = exynos4_frc_resume, | ||
141 | }; | 147 | }; |
142 | 148 | ||
143 | static void __init exynos4_clocksource_init(void) | 149 | static void __init exynos4_clocksource_init(void) |
@@ -389,9 +395,11 @@ static void exynos4_mct_tick_init(struct clock_event_device *evt) | |||
389 | } | 395 | } |
390 | 396 | ||
391 | /* Setup the local clock events for a CPU */ | 397 | /* Setup the local clock events for a CPU */ |
392 | void __cpuinit local_timer_setup(struct clock_event_device *evt) | 398 | int __cpuinit local_timer_setup(struct clock_event_device *evt) |
393 | { | 399 | { |
394 | exynos4_mct_tick_init(evt); | 400 | exynos4_mct_tick_init(evt); |
401 | |||
402 | return 0; | ||
395 | } | 403 | } |
396 | 404 | ||
397 | int local_timer_ack(void) | 405 | int local_timer_ack(void) |
diff --git a/arch/arm/mach-exynos4/platsmp.c b/arch/arm/mach-exynos4/platsmp.c index 7c2282c6ba81..df6ef1b2f98b 100644 --- a/arch/arm/mach-exynos4/platsmp.c +++ b/arch/arm/mach-exynos4/platsmp.c | |||
@@ -106,6 +106,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu) | |||
106 | */ | 106 | */ |
107 | spin_lock(&boot_lock); | 107 | spin_lock(&boot_lock); |
108 | spin_unlock(&boot_lock); | 108 | spin_unlock(&boot_lock); |
109 | |||
110 | set_cpu_online(cpu, true); | ||
109 | } | 111 | } |
110 | 112 | ||
111 | int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) | 113 | int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) |
diff --git a/arch/arm/mach-exynos4/setup-keypad.c b/arch/arm/mach-exynos4/setup-keypad.c index 1ee0ebff111f..7862bfb5933d 100644 --- a/arch/arm/mach-exynos4/setup-keypad.c +++ b/arch/arm/mach-exynos4/setup-keypad.c | |||
@@ -19,15 +19,16 @@ void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) | |||
19 | 19 | ||
20 | if (rows > 8) { | 20 | if (rows > 8) { |
21 | /* Set all the necessary GPX2 pins: KP_ROW[0~7] */ | 21 | /* Set all the necessary GPX2 pins: KP_ROW[0~7] */ |
22 | s3c_gpio_cfgrange_nopull(EXYNOS4_GPX2(0), 8, S3C_GPIO_SFN(3)); | 22 | s3c_gpio_cfgall_range(EXYNOS4_GPX2(0), 8, S3C_GPIO_SFN(3), |
23 | S3C_GPIO_PULL_UP); | ||
23 | 24 | ||
24 | /* Set all the necessary GPX3 pins: KP_ROW[8~] */ | 25 | /* Set all the necessary GPX3 pins: KP_ROW[8~] */ |
25 | s3c_gpio_cfgrange_nopull(EXYNOS4_GPX3(0), (rows - 8), | 26 | s3c_gpio_cfgall_range(EXYNOS4_GPX3(0), (rows - 8), |
26 | S3C_GPIO_SFN(3)); | 27 | S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); |
27 | } else { | 28 | } else { |
28 | /* Set all the necessary GPX2 pins: KP_ROW[x] */ | 29 | /* Set all the necessary GPX2 pins: KP_ROW[x] */ |
29 | s3c_gpio_cfgrange_nopull(EXYNOS4_GPX2(0), rows, | 30 | s3c_gpio_cfgall_range(EXYNOS4_GPX2(0), rows, S3C_GPIO_SFN(3), |
30 | S3C_GPIO_SFN(3)); | 31 | S3C_GPIO_PULL_UP); |
31 | } | 32 | } |
32 | 33 | ||
33 | /* Set all the necessary GPX1 pins to special-function 3: KP_COL[x] */ | 34 | /* Set all the necessary GPX1 pins to special-function 3: KP_COL[x] */ |
diff --git a/arch/arm/mach-exynos4/setup-usb-phy.c b/arch/arm/mach-exynos4/setup-usb-phy.c index 0883c1b824b9..39aca045f660 100644 --- a/arch/arm/mach-exynos4/setup-usb-phy.c +++ b/arch/arm/mach-exynos4/setup-usb-phy.c | |||
@@ -82,7 +82,7 @@ static int exynos4_usb_phy1_init(struct platform_device *pdev) | |||
82 | 82 | ||
83 | rstcon &= ~(HOST_LINK_PORT_SWRST_MASK | PHY1_SWRST_MASK); | 83 | rstcon &= ~(HOST_LINK_PORT_SWRST_MASK | PHY1_SWRST_MASK); |
84 | writel(rstcon, EXYNOS4_RSTCON); | 84 | writel(rstcon, EXYNOS4_RSTCON); |
85 | udelay(50); | 85 | udelay(80); |
86 | 86 | ||
87 | clk_disable(otg_clk); | 87 | clk_disable(otg_clk); |
88 | clk_put(otg_clk); | 88 | clk_put(otg_clk); |
diff --git a/arch/arm/mach-footbridge/Kconfig b/arch/arm/mach-footbridge/Kconfig index dc26fff22cf0..c8e7afcf14ec 100644 --- a/arch/arm/mach-footbridge/Kconfig +++ b/arch/arm/mach-footbridge/Kconfig | |||
@@ -62,6 +62,7 @@ config ARCH_EBSA285_HOST | |||
62 | config ARCH_NETWINDER | 62 | config ARCH_NETWINDER |
63 | bool "NetWinder" | 63 | bool "NetWinder" |
64 | select CLKSRC_I8253 | 64 | select CLKSRC_I8253 |
65 | select CLKEVT_I8253 | ||
65 | select FOOTBRIDGE_HOST | 66 | select FOOTBRIDGE_HOST |
66 | select ISA | 67 | select ISA |
67 | select ISA_DMA | 68 | select ISA_DMA |
diff --git a/arch/arm/mach-footbridge/dc21285.c b/arch/arm/mach-footbridge/dc21285.c index 1331fff51ae2..18c32a5541d9 100644 --- a/arch/arm/mach-footbridge/dc21285.c +++ b/arch/arm/mach-footbridge/dc21285.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/irq.h> | 18 | #include <linux/irq.h> |
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <linux/spinlock.h> | 20 | #include <linux/spinlock.h> |
21 | #include <video/vga.h> | ||
21 | 22 | ||
22 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
23 | #include <asm/system.h> | 24 | #include <asm/system.h> |
diff --git a/arch/arm/mach-imx/mach-cpuimx27.c b/arch/arm/mach-imx/mach-cpuimx27.c index 87887ac5806b..f851fe903687 100644 --- a/arch/arm/mach-imx/mach-cpuimx27.c +++ b/arch/arm/mach-imx/mach-cpuimx27.c | |||
@@ -310,7 +310,7 @@ static struct sys_timer eukrea_cpuimx27_timer = { | |||
310 | .init = eukrea_cpuimx27_timer_init, | 310 | .init = eukrea_cpuimx27_timer_init, |
311 | }; | 311 | }; |
312 | 312 | ||
313 | MACHINE_START(CPUIMX27, "EUKREA CPUIMX27") | 313 | MACHINE_START(EUKREA_CPUIMX27, "EUKREA CPUIMX27") |
314 | .boot_params = MX27_PHYS_OFFSET + 0x100, | 314 | .boot_params = MX27_PHYS_OFFSET + 0x100, |
315 | .map_io = mx27_map_io, | 315 | .map_io = mx27_map_io, |
316 | .init_early = imx27_init_early, | 316 | .init_early = imx27_init_early, |
diff --git a/arch/arm/mach-imx/mach-cpuimx35.c b/arch/arm/mach-imx/mach-cpuimx35.c index f39a478ba1a6..4bd083ba9af2 100644 --- a/arch/arm/mach-imx/mach-cpuimx35.c +++ b/arch/arm/mach-imx/mach-cpuimx35.c | |||
@@ -192,7 +192,7 @@ struct sys_timer eukrea_cpuimx35_timer = { | |||
192 | .init = eukrea_cpuimx35_timer_init, | 192 | .init = eukrea_cpuimx35_timer_init, |
193 | }; | 193 | }; |
194 | 194 | ||
195 | MACHINE_START(EUKREA_CPUIMX35, "Eukrea CPUIMX35") | 195 | MACHINE_START(EUKREA_CPUIMX35SD, "Eukrea CPUIMX35") |
196 | /* Maintainer: Eukrea Electromatique */ | 196 | /* Maintainer: Eukrea Electromatique */ |
197 | .boot_params = MX3x_PHYS_OFFSET + 0x100, | 197 | .boot_params = MX3x_PHYS_OFFSET + 0x100, |
198 | .map_io = mx35_map_io, | 198 | .map_io = mx35_map_io, |
diff --git a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c index da36da52969d..2442d5da883d 100644 --- a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c +++ b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c | |||
@@ -161,7 +161,7 @@ static struct sys_timer eukrea_cpuimx25_timer = { | |||
161 | .init = eukrea_cpuimx25_timer_init, | 161 | .init = eukrea_cpuimx25_timer_init, |
162 | }; | 162 | }; |
163 | 163 | ||
164 | MACHINE_START(EUKREA_CPUIMX25, "Eukrea CPUIMX25") | 164 | MACHINE_START(EUKREA_CPUIMX25SD, "Eukrea CPUIMX25") |
165 | /* Maintainer: Eukrea Electromatique */ | 165 | /* Maintainer: Eukrea Electromatique */ |
166 | .boot_params = MX25_PHYS_OFFSET + 0x100, | 166 | .boot_params = MX25_PHYS_OFFSET + 0x100, |
167 | .map_io = mx25_map_io, | 167 | .map_io = mx25_map_io, |
diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index 2fbbdd5eac35..8cdc730dcb3a 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/interrupt.h> | 32 | #include <linux/interrupt.h> |
33 | #include <linux/io.h> | 33 | #include <linux/io.h> |
34 | #include <linux/mtd/physmap.h> | 34 | #include <linux/mtd/physmap.h> |
35 | #include <video/vga.h> | ||
35 | 36 | ||
36 | #include <mach/hardware.h> | 37 | #include <mach/hardware.h> |
37 | #include <mach/platform.h> | 38 | #include <mach/platform.h> |
@@ -154,6 +155,7 @@ static struct map_desc ap_io_desc[] __initdata = { | |||
154 | static void __init ap_map_io(void) | 155 | static void __init ap_map_io(void) |
155 | { | 156 | { |
156 | iotable_init(ap_io_desc, ARRAY_SIZE(ap_io_desc)); | 157 | iotable_init(ap_io_desc, ARRAY_SIZE(ap_io_desc)); |
158 | vga_base = PCI_MEMORY_VADDR; | ||
157 | } | 159 | } |
158 | 160 | ||
159 | #define INTEGRATOR_SC_VALID_INT 0x003fffff | 161 | #define INTEGRATOR_SC_VALID_INT 0x003fffff |
@@ -337,15 +339,15 @@ static unsigned long timer_reload; | |||
337 | static void integrator_clocksource_init(u32 khz) | 339 | static void integrator_clocksource_init(u32 khz) |
338 | { | 340 | { |
339 | void __iomem *base = (void __iomem *)TIMER2_VA_BASE; | 341 | void __iomem *base = (void __iomem *)TIMER2_VA_BASE; |
340 | u32 ctrl = TIMER_CTRL_ENABLE; | 342 | u32 ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC; |
341 | 343 | ||
342 | if (khz >= 1500) { | 344 | if (khz >= 1500) { |
343 | khz /= 16; | 345 | khz /= 16; |
344 | ctrl = TIMER_CTRL_DIV16; | 346 | ctrl |= TIMER_CTRL_DIV16; |
345 | } | 347 | } |
346 | 348 | ||
347 | writel(ctrl, base + TIMER_CTRL); | ||
348 | writel(0xffff, base + TIMER_LOAD); | 349 | writel(0xffff, base + TIMER_LOAD); |
350 | writel(ctrl, base + TIMER_CTRL); | ||
349 | 351 | ||
350 | clocksource_mmio_init(base + TIMER_VALUE, "timer2", | 352 | clocksource_mmio_init(base + TIMER_VALUE, "timer2", |
351 | khz * 1000, 200, 16, clocksource_mmio_readl_down); | 353 | khz * 1000, 200, 16, clocksource_mmio_readl_down); |
diff --git a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c index dd56bfb351e3..11b86e5b71c2 100644 --- a/arch/arm/mach-integrator/pci_v3.c +++ b/arch/arm/mach-integrator/pci_v3.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/io.h> | 29 | #include <linux/io.h> |
30 | #include <video/vga.h> | ||
31 | 30 | ||
32 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
33 | #include <mach/platform.h> | 32 | #include <mach/platform.h> |
@@ -505,7 +504,6 @@ void __init pci_v3_preinit(void) | |||
505 | 504 | ||
506 | pcibios_min_io = 0x6000; | 505 | pcibios_min_io = 0x6000; |
507 | pcibios_min_mem = 0x00100000; | 506 | pcibios_min_mem = 0x00100000; |
508 | vga_base = PCI_MEMORY_VADDR; | ||
509 | 507 | ||
510 | /* | 508 | /* |
511 | * Hook in our fault handler for PCI errors | 509 | * Hook in our fault handler for PCI errors |
diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile index 5b114d1558c8..11c85cd2731a 100644 --- a/arch/arm/mach-omap1/Makefile +++ b/arch/arm/mach-omap1/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | # Common support | 5 | # Common support |
6 | obj-y := io.o id.o sram.o time.o irq.o mux.o flash.o serial.o devices.o dma.o | 6 | obj-y := io.o id.o sram.o time.o irq.o mux.o flash.o serial.o devices.o dma.o |
7 | obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o | 7 | obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o timer.o |
8 | 8 | ||
9 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o | 9 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o |
10 | 10 | ||
diff --git a/arch/arm/mach-omap1/mcbsp.c b/arch/arm/mach-omap1/mcbsp.c index ab7395d84bc8..91f9abbd3250 100644 --- a/arch/arm/mach-omap1/mcbsp.c +++ b/arch/arm/mach-omap1/mcbsp.c | |||
@@ -31,6 +31,7 @@ | |||
31 | static int dsp_use; | 31 | static int dsp_use; |
32 | static struct clk *api_clk; | 32 | static struct clk *api_clk; |
33 | static struct clk *dsp_clk; | 33 | static struct clk *dsp_clk; |
34 | static struct platform_device **omap_mcbsp_devices; | ||
34 | 35 | ||
35 | static void omap1_mcbsp_request(unsigned int id) | 36 | static void omap1_mcbsp_request(unsigned int id) |
36 | { | 37 | { |
@@ -78,6 +79,17 @@ static struct omap_mcbsp_ops omap1_mcbsp_ops = { | |||
78 | .free = omap1_mcbsp_free, | 79 | .free = omap1_mcbsp_free, |
79 | }; | 80 | }; |
80 | 81 | ||
82 | #define OMAP7XX_MCBSP1_BASE 0xfffb1000 | ||
83 | #define OMAP7XX_MCBSP2_BASE 0xfffb1800 | ||
84 | |||
85 | #define OMAP1510_MCBSP1_BASE 0xe1011800 | ||
86 | #define OMAP1510_MCBSP2_BASE 0xfffb1000 | ||
87 | #define OMAP1510_MCBSP3_BASE 0xe1017000 | ||
88 | |||
89 | #define OMAP1610_MCBSP1_BASE 0xe1011800 | ||
90 | #define OMAP1610_MCBSP2_BASE 0xfffb1000 | ||
91 | #define OMAP1610_MCBSP3_BASE 0xe1017000 | ||
92 | |||
81 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | 93 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) |
82 | struct resource omap7xx_mcbsp_res[][6] = { | 94 | struct resource omap7xx_mcbsp_res[][6] = { |
83 | { | 95 | { |
@@ -369,6 +381,39 @@ static struct omap_mcbsp_platform_data omap16xx_mcbsp_pdata[] = { | |||
369 | #define OMAP16XX_MCBSP_COUNT 0 | 381 | #define OMAP16XX_MCBSP_COUNT 0 |
370 | #endif | 382 | #endif |
371 | 383 | ||
384 | static void omap_mcbsp_register_board_cfg(struct resource *res, int res_count, | ||
385 | struct omap_mcbsp_platform_data *config, int size) | ||
386 | { | ||
387 | int i; | ||
388 | |||
389 | omap_mcbsp_devices = kzalloc(size * sizeof(struct platform_device *), | ||
390 | GFP_KERNEL); | ||
391 | if (!omap_mcbsp_devices) { | ||
392 | printk(KERN_ERR "Could not register McBSP devices\n"); | ||
393 | return; | ||
394 | } | ||
395 | |||
396 | for (i = 0; i < size; i++) { | ||
397 | struct platform_device *new_mcbsp; | ||
398 | int ret; | ||
399 | |||
400 | new_mcbsp = platform_device_alloc("omap-mcbsp", i + 1); | ||
401 | if (!new_mcbsp) | ||
402 | continue; | ||
403 | platform_device_add_resources(new_mcbsp, &res[i * res_count], | ||
404 | res_count); | ||
405 | config[i].reg_size = 2; | ||
406 | config[i].reg_step = 2; | ||
407 | new_mcbsp->dev.platform_data = &config[i]; | ||
408 | ret = platform_device_add(new_mcbsp); | ||
409 | if (ret) { | ||
410 | platform_device_put(new_mcbsp); | ||
411 | continue; | ||
412 | } | ||
413 | omap_mcbsp_devices[i] = new_mcbsp; | ||
414 | } | ||
415 | } | ||
416 | |||
372 | static int __init omap1_mcbsp_init(void) | 417 | static int __init omap1_mcbsp_init(void) |
373 | { | 418 | { |
374 | if (!cpu_class_is_omap1()) | 419 | if (!cpu_class_is_omap1()) |
diff --git a/arch/arm/mach-omap1/timer.c b/arch/arm/mach-omap1/timer.c new file mode 100644 index 000000000000..6e90665a7c47 --- /dev/null +++ b/arch/arm/mach-omap1/timer.c | |||
@@ -0,0 +1,173 @@ | |||
1 | /** | ||
2 | * OMAP1 Dual-Mode Timers - platform device registration | ||
3 | * | ||
4 | * Contains first level initialization routines which internally | ||
5 | * generates timer device information and registers with linux | ||
6 | * device model. It also has low level function to chnage the timer | ||
7 | * input clock source. | ||
8 | * | ||
9 | * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ | ||
10 | * Tarun Kanti DebBarma <tarun.kanti@ti.com> | ||
11 | * Thara Gopinath <thara@ti.com> | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify | ||
14 | * it under the terms of the GNU General Public License version 2 as | ||
15 | * published by the Free Software Foundation. | ||
16 | * | ||
17 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
18 | * kind, whether express or implied; without even the implied warranty | ||
19 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
20 | * GNU General Public License for more details. | ||
21 | */ | ||
22 | |||
23 | #include <linux/clk.h> | ||
24 | #include <linux/io.h> | ||
25 | #include <linux/err.h> | ||
26 | #include <linux/slab.h> | ||
27 | #include <linux/platform_device.h> | ||
28 | |||
29 | #include <mach/irqs.h> | ||
30 | |||
31 | #include <plat/dmtimer.h> | ||
32 | |||
33 | #define OMAP1610_GPTIMER1_BASE 0xfffb1400 | ||
34 | #define OMAP1610_GPTIMER2_BASE 0xfffb1c00 | ||
35 | #define OMAP1610_GPTIMER3_BASE 0xfffb2400 | ||
36 | #define OMAP1610_GPTIMER4_BASE 0xfffb2c00 | ||
37 | #define OMAP1610_GPTIMER5_BASE 0xfffb3400 | ||
38 | #define OMAP1610_GPTIMER6_BASE 0xfffb3c00 | ||
39 | #define OMAP1610_GPTIMER7_BASE 0xfffb7400 | ||
40 | #define OMAP1610_GPTIMER8_BASE 0xfffbd400 | ||
41 | |||
42 | #define OMAP1_DM_TIMER_COUNT 8 | ||
43 | |||
44 | static int omap1_dm_timer_set_src(struct platform_device *pdev, | ||
45 | int source) | ||
46 | { | ||
47 | int n = (pdev->id - 1) << 1; | ||
48 | u32 l; | ||
49 | |||
50 | l = __raw_readl(MOD_CONF_CTRL_1) & ~(0x03 << n); | ||
51 | l |= source << n; | ||
52 | __raw_writel(l, MOD_CONF_CTRL_1); | ||
53 | |||
54 | return 0; | ||
55 | } | ||
56 | |||
57 | |||
58 | int __init omap1_dm_timer_init(void) | ||
59 | { | ||
60 | int i; | ||
61 | int ret; | ||
62 | struct dmtimer_platform_data *pdata; | ||
63 | struct platform_device *pdev; | ||
64 | |||
65 | if (!cpu_is_omap16xx()) | ||
66 | return 0; | ||
67 | |||
68 | for (i = 1; i <= OMAP1_DM_TIMER_COUNT; i++) { | ||
69 | struct resource res[2]; | ||
70 | u32 base, irq; | ||
71 | |||
72 | switch (i) { | ||
73 | case 1: | ||
74 | base = OMAP1610_GPTIMER1_BASE; | ||
75 | irq = INT_1610_GPTIMER1; | ||
76 | break; | ||
77 | case 2: | ||
78 | base = OMAP1610_GPTIMER2_BASE; | ||
79 | irq = INT_1610_GPTIMER2; | ||
80 | break; | ||
81 | case 3: | ||
82 | base = OMAP1610_GPTIMER3_BASE; | ||
83 | irq = INT_1610_GPTIMER3; | ||
84 | break; | ||
85 | case 4: | ||
86 | base = OMAP1610_GPTIMER4_BASE; | ||
87 | irq = INT_1610_GPTIMER4; | ||
88 | break; | ||
89 | case 5: | ||
90 | base = OMAP1610_GPTIMER5_BASE; | ||
91 | irq = INT_1610_GPTIMER5; | ||
92 | break; | ||
93 | case 6: | ||
94 | base = OMAP1610_GPTIMER6_BASE; | ||
95 | irq = INT_1610_GPTIMER6; | ||
96 | break; | ||
97 | case 7: | ||
98 | base = OMAP1610_GPTIMER7_BASE; | ||
99 | irq = INT_1610_GPTIMER7; | ||
100 | break; | ||
101 | case 8: | ||
102 | base = OMAP1610_GPTIMER8_BASE; | ||
103 | irq = INT_1610_GPTIMER8; | ||
104 | break; | ||
105 | default: | ||
106 | /* | ||
107 | * not supposed to reach here. | ||
108 | * this is to remove warning. | ||
109 | */ | ||
110 | return -EINVAL; | ||
111 | } | ||
112 | |||
113 | pdev = platform_device_alloc("omap_timer", i); | ||
114 | if (!pdev) { | ||
115 | pr_err("%s: Failed to device alloc for dmtimer%d\n", | ||
116 | __func__, i); | ||
117 | return -ENOMEM; | ||
118 | } | ||
119 | |||
120 | memset(res, 0, 2 * sizeof(struct resource)); | ||
121 | res[0].start = base; | ||
122 | res[0].end = base + 0x46; | ||
123 | res[0].flags = IORESOURCE_MEM; | ||
124 | res[1].start = irq; | ||
125 | res[1].end = irq; | ||
126 | res[1].flags = IORESOURCE_IRQ; | ||
127 | ret = platform_device_add_resources(pdev, res, | ||
128 | ARRAY_SIZE(res)); | ||
129 | if (ret) { | ||
130 | dev_err(&pdev->dev, "%s: Failed to add resources.\n", | ||
131 | __func__); | ||
132 | goto err_free_pdev; | ||
133 | } | ||
134 | |||
135 | pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); | ||
136 | if (!pdata) { | ||
137 | dev_err(&pdev->dev, "%s: Failed to allocate pdata.\n", | ||
138 | __func__); | ||
139 | ret = -ENOMEM; | ||
140 | goto err_free_pdata; | ||
141 | } | ||
142 | |||
143 | pdata->set_timer_src = omap1_dm_timer_set_src; | ||
144 | pdata->needs_manual_reset = 1; | ||
145 | |||
146 | ret = platform_device_add_data(pdev, pdata, sizeof(*pdata)); | ||
147 | if (ret) { | ||
148 | dev_err(&pdev->dev, "%s: Failed to add platform data.\n", | ||
149 | __func__); | ||
150 | goto err_free_pdata; | ||
151 | } | ||
152 | |||
153 | ret = platform_device_add(pdev); | ||
154 | if (ret) { | ||
155 | dev_err(&pdev->dev, "%s: Failed to add platform device.\n", | ||
156 | __func__); | ||
157 | goto err_free_pdata; | ||
158 | } | ||
159 | |||
160 | dev_dbg(&pdev->dev, " Registered.\n"); | ||
161 | } | ||
162 | |||
163 | return 0; | ||
164 | |||
165 | err_free_pdata: | ||
166 | kfree(pdata); | ||
167 | |||
168 | err_free_pdev: | ||
169 | platform_device_unregister(pdev); | ||
170 | |||
171 | return ret; | ||
172 | } | ||
173 | arch_initcall(omap1_dm_timer_init); | ||
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 618216c8f742..d934169d6553 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -187,7 +187,8 @@ static int __init omap2430_i2c_init(void) | |||
187 | { | 187 | { |
188 | omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo, | 188 | omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo, |
189 | ARRAY_SIZE(sdp2430_i2c1_boardinfo)); | 189 | ARRAY_SIZE(sdp2430_i2c1_boardinfo)); |
190 | omap2_pmic_init("twl4030", &sdp2430_twldata); | 190 | omap_pmic_init(2, 100, "twl4030", INT_24XX_SYS_NIRQ, |
191 | &sdp2430_twldata); | ||
191 | return 0; | 192 | return 0; |
192 | } | 193 | } |
193 | 194 | ||
@@ -243,17 +244,11 @@ static void __init omap_2430sdp_init(void) | |||
243 | "Secondary LCD backlight"); | 244 | "Secondary LCD backlight"); |
244 | } | 245 | } |
245 | 246 | ||
246 | static void __init omap_2430sdp_map_io(void) | ||
247 | { | ||
248 | omap2_set_globals_243x(); | ||
249 | omap243x_map_common_io(); | ||
250 | } | ||
251 | |||
252 | MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") | 247 | MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") |
253 | /* Maintainer: Syed Khasim - Texas Instruments Inc */ | 248 | /* Maintainer: Syed Khasim - Texas Instruments Inc */ |
254 | .boot_params = 0x80000100, | 249 | .boot_params = 0x80000100, |
255 | .reserve = omap_reserve, | 250 | .reserve = omap_reserve, |
256 | .map_io = omap_2430sdp_map_io, | 251 | .map_io = omap243x_map_io, |
257 | .init_early = omap2430_init_early, | 252 | .init_early = omap2430_init_early, |
258 | .init_irq = omap2_init_irq, | 253 | .init_irq = omap2_init_irq, |
259 | .init_machine = omap_2430sdp_init, | 254 | .init_machine = omap_2430sdp_init, |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index ab19d305f61e..a97c29a73edd 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -129,7 +129,7 @@ static const int sdp4430_keymap[] = { | |||
129 | KEY(7, 6, KEY_OK), | 129 | KEY(7, 6, KEY_OK), |
130 | KEY(7, 7, KEY_DOWN), | 130 | KEY(7, 7, KEY_DOWN), |
131 | }; | 131 | }; |
132 | static struct omap_device_pad keypad_pads[] __initdata = { | 132 | static struct omap_device_pad keypad_pads[] = { |
133 | { .name = "kpd_col1.kpd_col1", | 133 | { .name = "kpd_col1.kpd_col1", |
134 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, | 134 | .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1, |
135 | }, | 135 | }, |
@@ -825,17 +825,11 @@ static void __init omap_4430sdp_init(void) | |||
825 | omap_4430sdp_display_init(); | 825 | omap_4430sdp_display_init(); |
826 | } | 826 | } |
827 | 827 | ||
828 | static void __init omap_4430sdp_map_io(void) | ||
829 | { | ||
830 | omap2_set_globals_443x(); | ||
831 | omap44xx_map_common_io(); | ||
832 | } | ||
833 | |||
834 | MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board") | 828 | MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board") |
835 | /* Maintainer: Santosh Shilimkar - Texas Instruments Inc */ | 829 | /* Maintainer: Santosh Shilimkar - Texas Instruments Inc */ |
836 | .boot_params = 0x80000100, | 830 | .boot_params = 0x80000100, |
837 | .reserve = omap_reserve, | 831 | .reserve = omap_reserve, |
838 | .map_io = omap_4430sdp_map_io, | 832 | .map_io = omap4_map_io, |
839 | .init_early = omap4430_init_early, | 833 | .init_early = omap4430_init_early, |
840 | .init_irq = gic_init_irq, | 834 | .init_irq = gic_init_irq, |
841 | .init_machine = omap_4430sdp_init, | 835 | .init_machine = omap_4430sdp_init, |
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index cf546f86014e..852843638fa9 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c | |||
@@ -337,17 +337,11 @@ static void __init omap_apollon_init(void) | |||
337 | omap_sdrc_init(NULL, NULL); | 337 | omap_sdrc_init(NULL, NULL); |
338 | } | 338 | } |
339 | 339 | ||
340 | static void __init omap_apollon_map_io(void) | ||
341 | { | ||
342 | omap2_set_globals_242x(); | ||
343 | omap242x_map_common_io(); | ||
344 | } | ||
345 | |||
346 | MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") | 340 | MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") |
347 | /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */ | 341 | /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */ |
348 | .boot_params = 0x80000100, | 342 | .boot_params = 0x80000100, |
349 | .reserve = omap_reserve, | 343 | .reserve = omap_reserve, |
350 | .map_io = omap_apollon_map_io, | 344 | .map_io = omap242x_map_io, |
351 | .init_early = omap2420_init_early, | 345 | .init_early = omap2420_init_early, |
352 | .init_irq = omap2_init_irq, | 346 | .init_irq = omap2_init_irq, |
353 | .init_machine = omap_apollon_init, | 347 | .init_machine = omap_apollon_init, |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index 4b1f6c68c358..059b74dd9289 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
@@ -397,11 +397,6 @@ static struct platform_device keys_gpio = { | |||
397 | }, | 397 | }, |
398 | }; | 398 | }; |
399 | 399 | ||
400 | static void __init devkit8000_init_irq(void) | ||
401 | { | ||
402 | omap3_init_irq(); | ||
403 | } | ||
404 | |||
405 | #define OMAP_DM9000_BASE 0x2c000000 | 400 | #define OMAP_DM9000_BASE 0x2c000000 |
406 | 401 | ||
407 | static struct resource omap_dm9000_resources[] = { | 402 | static struct resource omap_dm9000_resources[] = { |
@@ -665,7 +660,7 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000") | |||
665 | .reserve = omap_reserve, | 660 | .reserve = omap_reserve, |
666 | .map_io = omap3_map_io, | 661 | .map_io = omap3_map_io, |
667 | .init_early = omap35xx_init_early, | 662 | .init_early = omap35xx_init_early, |
668 | .init_irq = devkit8000_init_irq, | 663 | .init_irq = omap3_init_irq, |
669 | .init_machine = devkit8000_init, | 664 | .init_machine = devkit8000_init, |
670 | .timer = &omap3_secure_timer, | 665 | .timer = &omap3_secure_timer, |
671 | MACHINE_END | 666 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-flash.c b/arch/arm/mach-omap2/board-flash.c index aa1b0cbe19d2..30a6f527510c 100644 --- a/arch/arm/mach-omap2/board-flash.c +++ b/arch/arm/mach-omap2/board-flash.c | |||
@@ -148,11 +148,6 @@ __init board_nand_init(struct mtd_partition *nand_parts, | |||
148 | board_nand_data.gpmc_irq = OMAP_GPMC_IRQ_BASE + cs; | 148 | board_nand_data.gpmc_irq = OMAP_GPMC_IRQ_BASE + cs; |
149 | gpmc_nand_init(&board_nand_data); | 149 | gpmc_nand_init(&board_nand_data); |
150 | } | 150 | } |
151 | #else | ||
152 | void | ||
153 | __init board_nand_init(struct mtd_partition *nand_parts, u8 nr_parts, u8 cs, int nand_type) | ||
154 | { | ||
155 | } | ||
156 | #endif /* CONFIG_MTD_NAND_OMAP2 || CONFIG_MTD_NAND_OMAP2_MODULE */ | 151 | #endif /* CONFIG_MTD_NAND_OMAP2 || CONFIG_MTD_NAND_OMAP2_MODULE */ |
157 | 152 | ||
158 | /** | 153 | /** |
diff --git a/arch/arm/mach-omap2/board-flash.h b/arch/arm/mach-omap2/board-flash.h index c240a3f8d163..d25503a98417 100644 --- a/arch/arm/mach-omap2/board-flash.h +++ b/arch/arm/mach-omap2/board-flash.h | |||
@@ -24,7 +24,26 @@ struct flash_partitions { | |||
24 | int nr_parts; | 24 | int nr_parts; |
25 | }; | 25 | }; |
26 | 26 | ||
27 | #if defined(CONFIG_MTD_NAND_OMAP2) || \ | ||
28 | defined(CONFIG_MTD_NAND_OMAP2_MODULE) || \ | ||
29 | defined(CONFIG_MTD_ONENAND_OMAP2) || \ | ||
30 | defined(CONFIG_MTD_ONENAND_OMAP2_MODULE) | ||
27 | extern void board_flash_init(struct flash_partitions [], | 31 | extern void board_flash_init(struct flash_partitions [], |
28 | char chip_sel[][GPMC_CS_NUM], int nand_type); | 32 | char chip_sel[][GPMC_CS_NUM], int nand_type); |
33 | #else | ||
34 | static inline void board_flash_init(struct flash_partitions part[], | ||
35 | char chip_sel[][GPMC_CS_NUM], int nand_type) | ||
36 | { | ||
37 | } | ||
38 | #endif | ||
39 | |||
40 | #if defined(CONFIG_MTD_NAND_OMAP2) || \ | ||
41 | defined(CONFIG_MTD_NAND_OMAP2_MODULE) | ||
29 | extern void board_nand_init(struct mtd_partition *nand_parts, | 42 | extern void board_nand_init(struct mtd_partition *nand_parts, |
30 | u8 nr_parts, u8 cs, int nand_type); | 43 | u8 nr_parts, u8 cs, int nand_type); |
44 | #else | ||
45 | static inline void board_nand_init(struct mtd_partition *nand_parts, | ||
46 | u8 nr_parts, u8 cs, int nand_type) | ||
47 | { | ||
48 | } | ||
49 | #endif | ||
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 948fde010c69..8486142dcae7 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -290,11 +290,6 @@ static struct omap_board_config_kernel h4_config[] __initdata = { | |||
290 | { OMAP_TAG_LCD, &h4_lcd_config }, | 290 | { OMAP_TAG_LCD, &h4_lcd_config }, |
291 | }; | 291 | }; |
292 | 292 | ||
293 | static void __init omap_h4_init_irq(void) | ||
294 | { | ||
295 | omap2_init_irq(); | ||
296 | } | ||
297 | |||
298 | static struct at24_platform_data m24c01 = { | 293 | static struct at24_platform_data m24c01 = { |
299 | .byte_len = SZ_1K / 8, | 294 | .byte_len = SZ_1K / 8, |
300 | .page_size = 16, | 295 | .page_size = 16, |
@@ -369,19 +364,13 @@ static void __init omap_h4_init(void) | |||
369 | h4_init_flash(); | 364 | h4_init_flash(); |
370 | } | 365 | } |
371 | 366 | ||
372 | static void __init omap_h4_map_io(void) | ||
373 | { | ||
374 | omap2_set_globals_242x(); | ||
375 | omap242x_map_common_io(); | ||
376 | } | ||
377 | |||
378 | MACHINE_START(OMAP_H4, "OMAP2420 H4 board") | 367 | MACHINE_START(OMAP_H4, "OMAP2420 H4 board") |
379 | /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */ | 368 | /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */ |
380 | .boot_params = 0x80000100, | 369 | .boot_params = 0x80000100, |
381 | .reserve = omap_reserve, | 370 | .reserve = omap_reserve, |
382 | .map_io = omap_h4_map_io, | 371 | .map_io = omap242x_map_io, |
383 | .init_early = omap2420_init_early, | 372 | .init_early = omap2420_init_early, |
384 | .init_irq = omap_h4_init_irq, | 373 | .init_irq = omap2_init_irq, |
385 | .init_machine = omap_h4_init, | 374 | .init_machine = omap_h4_init, |
386 | .timer = &omap2_timer, | 375 | .timer = &omap2_timer, |
387 | MACHINE_END | 376 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 77a4e19222e2..d1f4a0292c42 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
@@ -616,12 +616,6 @@ static struct i2c_board_info n810_i2c_board_info_2[] __initdata = { | |||
616 | }, | 616 | }, |
617 | }; | 617 | }; |
618 | 618 | ||
619 | static void __init n8x0_map_io(void) | ||
620 | { | ||
621 | omap2_set_globals_242x(); | ||
622 | omap242x_map_common_io(); | ||
623 | } | ||
624 | |||
625 | #ifdef CONFIG_OMAP_MUX | 619 | #ifdef CONFIG_OMAP_MUX |
626 | static struct omap_board_mux board_mux[] __initdata = { | 620 | static struct omap_board_mux board_mux[] __initdata = { |
627 | /* I2S codec port pins for McBSP block */ | 621 | /* I2S codec port pins for McBSP block */ |
@@ -692,7 +686,7 @@ static void __init n8x0_init_machine(void) | |||
692 | MACHINE_START(NOKIA_N800, "Nokia N800") | 686 | MACHINE_START(NOKIA_N800, "Nokia N800") |
693 | .boot_params = 0x80000100, | 687 | .boot_params = 0x80000100, |
694 | .reserve = omap_reserve, | 688 | .reserve = omap_reserve, |
695 | .map_io = n8x0_map_io, | 689 | .map_io = omap242x_map_io, |
696 | .init_early = omap2420_init_early, | 690 | .init_early = omap2420_init_early, |
697 | .init_irq = omap2_init_irq, | 691 | .init_irq = omap2_init_irq, |
698 | .init_machine = n8x0_init_machine, | 692 | .init_machine = n8x0_init_machine, |
@@ -702,7 +696,7 @@ MACHINE_END | |||
702 | MACHINE_START(NOKIA_N810, "Nokia N810") | 696 | MACHINE_START(NOKIA_N810, "Nokia N810") |
703 | .boot_params = 0x80000100, | 697 | .boot_params = 0x80000100, |
704 | .reserve = omap_reserve, | 698 | .reserve = omap_reserve, |
705 | .map_io = n8x0_map_io, | 699 | .map_io = omap242x_map_io, |
706 | .init_early = omap2420_init_early, | 700 | .init_early = omap2420_init_early, |
707 | .init_irq = omap2_init_irq, | 701 | .init_irq = omap2_init_irq, |
708 | .init_machine = n8x0_init_machine, | 702 | .init_machine = n8x0_init_machine, |
@@ -712,7 +706,7 @@ MACHINE_END | |||
712 | MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") | 706 | MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") |
713 | .boot_params = 0x80000100, | 707 | .boot_params = 0x80000100, |
714 | .reserve = omap_reserve, | 708 | .reserve = omap_reserve, |
715 | .map_io = n8x0_map_io, | 709 | .map_io = omap242x_map_io, |
716 | .init_early = omap2420_init_early, | 710 | .init_early = omap2420_init_early, |
717 | .init_irq = omap2_init_irq, | 711 | .init_irq = omap2_init_irq, |
718 | .init_machine = n8x0_init_machine, | 712 | .init_machine = n8x0_init_machine, |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index ce3234d6a344..e085371eb494 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -449,11 +449,6 @@ static void __init omap3_beagle_init_early(void) | |||
449 | omap2_init_common_infrastructure(); | 449 | omap2_init_common_infrastructure(); |
450 | } | 450 | } |
451 | 451 | ||
452 | static void __init omap3_beagle_init_irq(void) | ||
453 | { | ||
454 | omap3_init_irq(); | ||
455 | } | ||
456 | |||
457 | static struct platform_device *omap3_beagle_devices[] __initdata = { | 452 | static struct platform_device *omap3_beagle_devices[] __initdata = { |
458 | &leds_gpio, | 453 | &leds_gpio, |
459 | &keys_gpio, | 454 | &keys_gpio, |
@@ -561,7 +556,7 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | |||
561 | .reserve = omap_reserve, | 556 | .reserve = omap_reserve, |
562 | .map_io = omap3_map_io, | 557 | .map_io = omap3_map_io, |
563 | .init_early = omap3_beagle_init_early, | 558 | .init_early = omap3_beagle_init_early, |
564 | .init_irq = omap3_beagle_init_irq, | 559 | .init_irq = omap3_init_irq, |
565 | .init_machine = omap3_beagle_init, | 560 | .init_machine = omap3_beagle_init, |
566 | .timer = &omap3_secure_timer, | 561 | .timer = &omap3_secure_timer, |
567 | MACHINE_END | 562 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index 807c27406792..fa58a0f1584a 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
@@ -428,11 +428,6 @@ static int __init omap3_stalker_i2c_init(void) | |||
428 | static struct omap_board_config_kernel omap3_stalker_config[] __initdata = { | 428 | static struct omap_board_config_kernel omap3_stalker_config[] __initdata = { |
429 | }; | 429 | }; |
430 | 430 | ||
431 | static void __init omap3_stalker_init_irq(void) | ||
432 | { | ||
433 | omap3_init_irq(); | ||
434 | } | ||
435 | |||
436 | static struct platform_device *omap3_stalker_devices[] __initdata = { | 431 | static struct platform_device *omap3_stalker_devices[] __initdata = { |
437 | &keys_gpio, | 432 | &keys_gpio, |
438 | }; | 433 | }; |
@@ -492,7 +487,7 @@ MACHINE_START(SBC3530, "OMAP3 STALKER") | |||
492 | .boot_params = 0x80000100, | 487 | .boot_params = 0x80000100, |
493 | .map_io = omap3_map_io, | 488 | .map_io = omap3_map_io, |
494 | .init_early = omap35xx_init_early, | 489 | .init_early = omap35xx_init_early, |
495 | .init_irq = omap3_stalker_init_irq, | 490 | .init_irq = omap3_init_irq, |
496 | .init_machine = omap3_stalker_init, | 491 | .init_machine = omap3_stalker_init, |
497 | .timer = &omap3_secure_timer, | 492 | .timer = &omap3_secure_timer, |
498 | MACHINE_END | 493 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index f7f18092f36d..05488fbc20d5 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
@@ -326,11 +326,6 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
326 | }; | 326 | }; |
327 | #endif | 327 | #endif |
328 | 328 | ||
329 | static void __init omap3_touchbook_init_irq(void) | ||
330 | { | ||
331 | omap3_init_irq(); | ||
332 | } | ||
333 | |||
334 | static struct platform_device *omap3_touchbook_devices[] __initdata = { | 329 | static struct platform_device *omap3_touchbook_devices[] __initdata = { |
335 | &omap3_touchbook_lcd_device, | 330 | &omap3_touchbook_lcd_device, |
336 | &leds_gpio, | 331 | &leds_gpio, |
@@ -403,7 +398,7 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board") | |||
403 | .reserve = omap_reserve, | 398 | .reserve = omap_reserve, |
404 | .map_io = omap3_map_io, | 399 | .map_io = omap3_map_io, |
405 | .init_early = omap3430_init_early, | 400 | .init_early = omap3430_init_early, |
406 | .init_irq = omap3_touchbook_init_irq, | 401 | .init_irq = omap3_init_irq, |
407 | .init_machine = omap3_touchbook_init, | 402 | .init_machine = omap3_touchbook_init, |
408 | .timer = &omap3_secure_timer, | 403 | .timer = &omap3_secure_timer, |
409 | MACHINE_END | 404 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 1bce76589784..e26929049a4d 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -570,17 +570,11 @@ static void __init omap4_panda_init(void) | |||
570 | omap4_panda_display_init(); | 570 | omap4_panda_display_init(); |
571 | } | 571 | } |
572 | 572 | ||
573 | static void __init omap4_panda_map_io(void) | ||
574 | { | ||
575 | omap2_set_globals_443x(); | ||
576 | omap44xx_map_common_io(); | ||
577 | } | ||
578 | |||
579 | MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board") | 573 | MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board") |
580 | /* Maintainer: David Anders - Texas Instruments Inc */ | 574 | /* Maintainer: David Anders - Texas Instruments Inc */ |
581 | .boot_params = 0x80000100, | 575 | .boot_params = 0x80000100, |
582 | .reserve = omap_reserve, | 576 | .reserve = omap_reserve, |
583 | .map_io = omap4_panda_map_io, | 577 | .map_io = omap4_map_io, |
584 | .init_early = omap4430_init_early, | 578 | .init_early = omap4430_init_early, |
585 | .init_irq = gic_init_irq, | 579 | .init_irq = gic_init_irq, |
586 | .init_machine = omap4_panda_init, | 580 | .init_machine = omap4_panda_init, |
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index a3182e846b14..a98db616e0d4 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c | |||
@@ -143,16 +143,10 @@ static void __init rm680_init(void) | |||
143 | rm680_peripherals_init(); | 143 | rm680_peripherals_init(); |
144 | } | 144 | } |
145 | 145 | ||
146 | static void __init rm680_map_io(void) | ||
147 | { | ||
148 | omap2_set_globals_3xxx(); | ||
149 | omap34xx_map_common_io(); | ||
150 | } | ||
151 | |||
152 | MACHINE_START(NOKIA_RM680, "Nokia RM-680 board") | 146 | MACHINE_START(NOKIA_RM680, "Nokia RM-680 board") |
153 | .boot_params = 0x80000100, | 147 | .boot_params = 0x80000100, |
154 | .reserve = omap_reserve, | 148 | .reserve = omap_reserve, |
155 | .map_io = rm680_map_io, | 149 | .map_io = omap3_map_io, |
156 | .init_early = omap3630_init_early, | 150 | .init_early = omap3630_init_early, |
157 | .init_irq = omap3_init_irq, | 151 | .init_irq = omap3_init_irq, |
158 | .init_machine = rm680_init, | 152 | .init_machine = rm680_init, |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index 32a79e28379c..8677a06aa4a7 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
@@ -139,12 +139,6 @@ static void __init rx51_init(void) | |||
139 | platform_device_register(&leds_gpio); | 139 | platform_device_register(&leds_gpio); |
140 | } | 140 | } |
141 | 141 | ||
142 | static void __init rx51_map_io(void) | ||
143 | { | ||
144 | omap2_set_globals_3xxx(); | ||
145 | omap34xx_map_common_io(); | ||
146 | } | ||
147 | |||
148 | static void __init rx51_reserve(void) | 142 | static void __init rx51_reserve(void) |
149 | { | 143 | { |
150 | rx51_video_mem_init(); | 144 | rx51_video_mem_init(); |
@@ -155,7 +149,7 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") | |||
155 | /* Maintainer: Lauri Leukkunen <lauri.leukkunen@nokia.com> */ | 149 | /* Maintainer: Lauri Leukkunen <lauri.leukkunen@nokia.com> */ |
156 | .boot_params = 0x80000100, | 150 | .boot_params = 0x80000100, |
157 | .reserve = rx51_reserve, | 151 | .reserve = rx51_reserve, |
158 | .map_io = rx51_map_io, | 152 | .map_io = omap3_map_io, |
159 | .init_early = omap3430_init_early, | 153 | .init_early = omap3430_init_early, |
160 | .init_irq = omap3_init_irq, | 154 | .init_irq = omap3_init_irq, |
161 | .init_machine = rx51_init, | 155 | .init_machine = rx51_init, |
diff --git a/arch/arm/mach-omap2/clock2420_data.c b/arch/arm/mach-omap2/clock2420_data.c index debc040872f1..14a6277dd184 100644 --- a/arch/arm/mach-omap2/clock2420_data.c +++ b/arch/arm/mach-omap2/clock2420_data.c | |||
@@ -1898,6 +1898,54 @@ static struct omap_clk omap2420_clks[] = { | |||
1898 | CLK(NULL, "pka_ick", &pka_ick, CK_242X), | 1898 | CLK(NULL, "pka_ick", &pka_ick, CK_242X), |
1899 | CLK(NULL, "usb_fck", &usb_fck, CK_242X), | 1899 | CLK(NULL, "usb_fck", &usb_fck, CK_242X), |
1900 | CLK("musb-hdrc", "fck", &osc_ck, CK_242X), | 1900 | CLK("musb-hdrc", "fck", &osc_ck, CK_242X), |
1901 | CLK("omap_timer.1", "fck", &gpt1_fck, CK_242X), | ||
1902 | CLK("omap_timer.2", "fck", &gpt2_fck, CK_242X), | ||
1903 | CLK("omap_timer.3", "fck", &gpt3_fck, CK_242X), | ||
1904 | CLK("omap_timer.4", "fck", &gpt4_fck, CK_242X), | ||
1905 | CLK("omap_timer.5", "fck", &gpt5_fck, CK_242X), | ||
1906 | CLK("omap_timer.6", "fck", &gpt6_fck, CK_242X), | ||
1907 | CLK("omap_timer.7", "fck", &gpt7_fck, CK_242X), | ||
1908 | CLK("omap_timer.8", "fck", &gpt8_fck, CK_242X), | ||
1909 | CLK("omap_timer.9", "fck", &gpt9_fck, CK_242X), | ||
1910 | CLK("omap_timer.10", "fck", &gpt10_fck, CK_242X), | ||
1911 | CLK("omap_timer.11", "fck", &gpt11_fck, CK_242X), | ||
1912 | CLK("omap_timer.12", "fck", &gpt12_fck, CK_242X), | ||
1913 | CLK("omap_timer.1", "32k_ck", &func_32k_ck, CK_243X), | ||
1914 | CLK("omap_timer.2", "32k_ck", &func_32k_ck, CK_243X), | ||
1915 | CLK("omap_timer.3", "32k_ck", &func_32k_ck, CK_243X), | ||
1916 | CLK("omap_timer.4", "32k_ck", &func_32k_ck, CK_243X), | ||
1917 | CLK("omap_timer.5", "32k_ck", &func_32k_ck, CK_243X), | ||
1918 | CLK("omap_timer.6", "32k_ck", &func_32k_ck, CK_243X), | ||
1919 | CLK("omap_timer.7", "32k_ck", &func_32k_ck, CK_243X), | ||
1920 | CLK("omap_timer.8", "32k_ck", &func_32k_ck, CK_243X), | ||
1921 | CLK("omap_timer.9", "32k_ck", &func_32k_ck, CK_243X), | ||
1922 | CLK("omap_timer.10", "32k_ck", &func_32k_ck, CK_243X), | ||
1923 | CLK("omap_timer.11", "32k_ck", &func_32k_ck, CK_243X), | ||
1924 | CLK("omap_timer.12", "32k_ck", &func_32k_ck, CK_243X), | ||
1925 | CLK("omap_timer.1", "sys_ck", &sys_ck, CK_243X), | ||
1926 | CLK("omap_timer.2", "sys_ck", &sys_ck, CK_243X), | ||
1927 | CLK("omap_timer.3", "sys_ck", &sys_ck, CK_243X), | ||
1928 | CLK("omap_timer.4", "sys_ck", &sys_ck, CK_243X), | ||
1929 | CLK("omap_timer.5", "sys_ck", &sys_ck, CK_243X), | ||
1930 | CLK("omap_timer.6", "sys_ck", &sys_ck, CK_243X), | ||
1931 | CLK("omap_timer.7", "sys_ck", &sys_ck, CK_243X), | ||
1932 | CLK("omap_timer.8", "sys_ck", &sys_ck, CK_243X), | ||
1933 | CLK("omap_timer.9", "sys_ck", &sys_ck, CK_243X), | ||
1934 | CLK("omap_timer.10", "sys_ck", &sys_ck, CK_243X), | ||
1935 | CLK("omap_timer.11", "sys_ck", &sys_ck, CK_243X), | ||
1936 | CLK("omap_timer.12", "sys_ck", &sys_ck, CK_243X), | ||
1937 | CLK("omap_timer.1", "alt_ck", &alt_ck, CK_243X), | ||
1938 | CLK("omap_timer.2", "alt_ck", &alt_ck, CK_243X), | ||
1939 | CLK("omap_timer.3", "alt_ck", &alt_ck, CK_243X), | ||
1940 | CLK("omap_timer.4", "alt_ck", &alt_ck, CK_243X), | ||
1941 | CLK("omap_timer.5", "alt_ck", &alt_ck, CK_243X), | ||
1942 | CLK("omap_timer.6", "alt_ck", &alt_ck, CK_243X), | ||
1943 | CLK("omap_timer.7", "alt_ck", &alt_ck, CK_243X), | ||
1944 | CLK("omap_timer.8", "alt_ck", &alt_ck, CK_243X), | ||
1945 | CLK("omap_timer.9", "alt_ck", &alt_ck, CK_243X), | ||
1946 | CLK("omap_timer.10", "alt_ck", &alt_ck, CK_243X), | ||
1947 | CLK("omap_timer.11", "alt_ck", &alt_ck, CK_243X), | ||
1948 | CLK("omap_timer.12", "alt_ck", &alt_ck, CK_243X), | ||
1901 | }; | 1949 | }; |
1902 | 1950 | ||
1903 | /* | 1951 | /* |
diff --git a/arch/arm/mach-omap2/clock2430_data.c b/arch/arm/mach-omap2/clock2430_data.c index 96a942e42db1..ea6717cfa3c8 100644 --- a/arch/arm/mach-omap2/clock2430_data.c +++ b/arch/arm/mach-omap2/clock2430_data.c | |||
@@ -1998,6 +1998,54 @@ static struct omap_clk omap2430_clks[] = { | |||
1998 | CLK(NULL, "mdm_intc_ick", &mdm_intc_ick, CK_243X), | 1998 | CLK(NULL, "mdm_intc_ick", &mdm_intc_ick, CK_243X), |
1999 | CLK("omap_hsmmc.0", "mmchsdb_fck", &mmchsdb1_fck, CK_243X), | 1999 | CLK("omap_hsmmc.0", "mmchsdb_fck", &mmchsdb1_fck, CK_243X), |
2000 | CLK("omap_hsmmc.1", "mmchsdb_fck", &mmchsdb2_fck, CK_243X), | 2000 | CLK("omap_hsmmc.1", "mmchsdb_fck", &mmchsdb2_fck, CK_243X), |
2001 | CLK("omap_timer.1", "fck", &gpt1_fck, CK_243X), | ||
2002 | CLK("omap_timer.2", "fck", &gpt2_fck, CK_243X), | ||
2003 | CLK("omap_timer.3", "fck", &gpt3_fck, CK_243X), | ||
2004 | CLK("omap_timer.4", "fck", &gpt4_fck, CK_243X), | ||
2005 | CLK("omap_timer.5", "fck", &gpt5_fck, CK_243X), | ||
2006 | CLK("omap_timer.6", "fck", &gpt6_fck, CK_243X), | ||
2007 | CLK("omap_timer.7", "fck", &gpt7_fck, CK_243X), | ||
2008 | CLK("omap_timer.8", "fck", &gpt8_fck, CK_243X), | ||
2009 | CLK("omap_timer.9", "fck", &gpt9_fck, CK_243X), | ||
2010 | CLK("omap_timer.10", "fck", &gpt10_fck, CK_243X), | ||
2011 | CLK("omap_timer.11", "fck", &gpt11_fck, CK_243X), | ||
2012 | CLK("omap_timer.12", "fck", &gpt12_fck, CK_243X), | ||
2013 | CLK("omap_timer.1", "32k_ck", &func_32k_ck, CK_243X), | ||
2014 | CLK("omap_timer.2", "32k_ck", &func_32k_ck, CK_243X), | ||
2015 | CLK("omap_timer.3", "32k_ck", &func_32k_ck, CK_243X), | ||
2016 | CLK("omap_timer.4", "32k_ck", &func_32k_ck, CK_243X), | ||
2017 | CLK("omap_timer.5", "32k_ck", &func_32k_ck, CK_243X), | ||
2018 | CLK("omap_timer.6", "32k_ck", &func_32k_ck, CK_243X), | ||
2019 | CLK("omap_timer.7", "32k_ck", &func_32k_ck, CK_243X), | ||
2020 | CLK("omap_timer.8", "32k_ck", &func_32k_ck, CK_243X), | ||
2021 | CLK("omap_timer.9", "32k_ck", &func_32k_ck, CK_243X), | ||
2022 | CLK("omap_timer.10", "32k_ck", &func_32k_ck, CK_243X), | ||
2023 | CLK("omap_timer.11", "32k_ck", &func_32k_ck, CK_243X), | ||
2024 | CLK("omap_timer.12", "32k_ck", &func_32k_ck, CK_243X), | ||
2025 | CLK("omap_timer.1", "sys_ck", &sys_ck, CK_243X), | ||
2026 | CLK("omap_timer.2", "sys_ck", &sys_ck, CK_243X), | ||
2027 | CLK("omap_timer.3", "sys_ck", &sys_ck, CK_243X), | ||
2028 | CLK("omap_timer.4", "sys_ck", &sys_ck, CK_243X), | ||
2029 | CLK("omap_timer.5", "sys_ck", &sys_ck, CK_243X), | ||
2030 | CLK("omap_timer.6", "sys_ck", &sys_ck, CK_243X), | ||
2031 | CLK("omap_timer.7", "sys_ck", &sys_ck, CK_243X), | ||
2032 | CLK("omap_timer.8", "sys_ck", &sys_ck, CK_243X), | ||
2033 | CLK("omap_timer.9", "sys_ck", &sys_ck, CK_243X), | ||
2034 | CLK("omap_timer.10", "sys_ck", &sys_ck, CK_243X), | ||
2035 | CLK("omap_timer.11", "sys_ck", &sys_ck, CK_243X), | ||
2036 | CLK("omap_timer.12", "sys_ck", &sys_ck, CK_243X), | ||
2037 | CLK("omap_timer.1", "alt_ck", &alt_ck, CK_243X), | ||
2038 | CLK("omap_timer.2", "alt_ck", &alt_ck, CK_243X), | ||
2039 | CLK("omap_timer.3", "alt_ck", &alt_ck, CK_243X), | ||
2040 | CLK("omap_timer.4", "alt_ck", &alt_ck, CK_243X), | ||
2041 | CLK("omap_timer.5", "alt_ck", &alt_ck, CK_243X), | ||
2042 | CLK("omap_timer.6", "alt_ck", &alt_ck, CK_243X), | ||
2043 | CLK("omap_timer.7", "alt_ck", &alt_ck, CK_243X), | ||
2044 | CLK("omap_timer.8", "alt_ck", &alt_ck, CK_243X), | ||
2045 | CLK("omap_timer.9", "alt_ck", &alt_ck, CK_243X), | ||
2046 | CLK("omap_timer.10", "alt_ck", &alt_ck, CK_243X), | ||
2047 | CLK("omap_timer.11", "alt_ck", &alt_ck, CK_243X), | ||
2048 | CLK("omap_timer.12", "alt_ck", &alt_ck, CK_243X), | ||
2001 | }; | 2049 | }; |
2002 | 2050 | ||
2003 | /* | 2051 | /* |
diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index dadb8c6c0115..65dd363163bc 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c | |||
@@ -3464,6 +3464,42 @@ static struct omap_clk omap3xxx_clks[] = { | |||
3464 | CLK("musb-am35x", "fck", &hsotgusb_fck_am35xx, CK_AM35XX), | 3464 | CLK("musb-am35x", "fck", &hsotgusb_fck_am35xx, CK_AM35XX), |
3465 | CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX), | 3465 | CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX), |
3466 | CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX), | 3466 | CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX), |
3467 | CLK("omap_timer.1", "fck", &gpt1_fck, CK_3XXX), | ||
3468 | CLK("omap_timer.2", "fck", &gpt2_fck, CK_3XXX), | ||
3469 | CLK("omap_timer.3", "fck", &gpt3_fck, CK_3XXX), | ||
3470 | CLK("omap_timer.4", "fck", &gpt4_fck, CK_3XXX), | ||
3471 | CLK("omap_timer.5", "fck", &gpt5_fck, CK_3XXX), | ||
3472 | CLK("omap_timer.6", "fck", &gpt6_fck, CK_3XXX), | ||
3473 | CLK("omap_timer.7", "fck", &gpt7_fck, CK_3XXX), | ||
3474 | CLK("omap_timer.8", "fck", &gpt8_fck, CK_3XXX), | ||
3475 | CLK("omap_timer.9", "fck", &gpt9_fck, CK_3XXX), | ||
3476 | CLK("omap_timer.10", "fck", &gpt10_fck, CK_3XXX), | ||
3477 | CLK("omap_timer.11", "fck", &gpt11_fck, CK_3XXX), | ||
3478 | CLK("omap_timer.12", "fck", &gpt12_fck, CK_3XXX), | ||
3479 | CLK("omap_timer.1", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3480 | CLK("omap_timer.2", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3481 | CLK("omap_timer.3", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3482 | CLK("omap_timer.4", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3483 | CLK("omap_timer.5", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3484 | CLK("omap_timer.6", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3485 | CLK("omap_timer.7", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3486 | CLK("omap_timer.8", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3487 | CLK("omap_timer.9", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3488 | CLK("omap_timer.10", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3489 | CLK("omap_timer.11", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3490 | CLK("omap_timer.12", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3491 | CLK("omap_timer.1", "sys_ck", &sys_ck, CK_3XXX), | ||
3492 | CLK("omap_timer.2", "sys_ck", &sys_ck, CK_3XXX), | ||
3493 | CLK("omap_timer.3", "sys_ck", &sys_ck, CK_3XXX), | ||
3494 | CLK("omap_timer.4", "sys_ck", &sys_ck, CK_3XXX), | ||
3495 | CLK("omap_timer.5", "sys_ck", &sys_ck, CK_3XXX), | ||
3496 | CLK("omap_timer.6", "sys_ck", &sys_ck, CK_3XXX), | ||
3497 | CLK("omap_timer.7", "sys_ck", &sys_ck, CK_3XXX), | ||
3498 | CLK("omap_timer.8", "sys_ck", &sys_ck, CK_3XXX), | ||
3499 | CLK("omap_timer.9", "sys_ck", &sys_ck, CK_3XXX), | ||
3500 | CLK("omap_timer.10", "sys_ck", &sys_ck, CK_3XXX), | ||
3501 | CLK("omap_timer.11", "sys_ck", &sys_ck, CK_3XXX), | ||
3502 | CLK("omap_timer.12", "sys_ck", &sys_ck, CK_3XXX), | ||
3467 | }; | 3503 | }; |
3468 | 3504 | ||
3469 | 3505 | ||
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index c0b6fbda3408..946bf04a956d 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c | |||
@@ -3363,6 +3363,39 @@ static struct omap_clk omap44xx_clks[] = { | |||
3363 | CLK("usbhs-omap.0", "usbhost_ick", &dummy_ck, CK_443X), | 3363 | CLK("usbhs-omap.0", "usbhost_ick", &dummy_ck, CK_443X), |
3364 | CLK("usbhs-omap.0", "usbtll_fck", &dummy_ck, CK_443X), | 3364 | CLK("usbhs-omap.0", "usbtll_fck", &dummy_ck, CK_443X), |
3365 | CLK("omap_wdt", "ick", &dummy_ck, CK_443X), | 3365 | CLK("omap_wdt", "ick", &dummy_ck, CK_443X), |
3366 | CLK("omap_timer.1", "fck", &timer1_fck, CK_443X), | ||
3367 | CLK("omap_timer.2", "fck", &timer2_fck, CK_443X), | ||
3368 | CLK("omap_timer.3", "fck", &timer3_fck, CK_443X), | ||
3369 | CLK("omap_timer.4", "fck", &timer4_fck, CK_443X), | ||
3370 | CLK("omap_timer.5", "fck", &timer5_fck, CK_443X), | ||
3371 | CLK("omap_timer.6", "fck", &timer6_fck, CK_443X), | ||
3372 | CLK("omap_timer.7", "fck", &timer7_fck, CK_443X), | ||
3373 | CLK("omap_timer.8", "fck", &timer8_fck, CK_443X), | ||
3374 | CLK("omap_timer.9", "fck", &timer9_fck, CK_443X), | ||
3375 | CLK("omap_timer.10", "fck", &timer10_fck, CK_443X), | ||
3376 | CLK("omap_timer.11", "fck", &timer11_fck, CK_443X), | ||
3377 | CLK("omap_timer.1", "32k_ck", &sys_32k_ck, CK_443X), | ||
3378 | CLK("omap_timer.2", "32k_ck", &sys_32k_ck, CK_443X), | ||
3379 | CLK("omap_timer.3", "32k_ck", &sys_32k_ck, CK_443X), | ||
3380 | CLK("omap_timer.4", "32k_ck", &sys_32k_ck, CK_443X), | ||
3381 | CLK("omap_timer.5", "32k_ck", &sys_32k_ck, CK_443X), | ||
3382 | CLK("omap_timer.6", "32k_ck", &sys_32k_ck, CK_443X), | ||
3383 | CLK("omap_timer.7", "32k_ck", &sys_32k_ck, CK_443X), | ||
3384 | CLK("omap_timer.8", "32k_ck", &sys_32k_ck, CK_443X), | ||
3385 | CLK("omap_timer.9", "32k_ck", &sys_32k_ck, CK_443X), | ||
3386 | CLK("omap_timer.10", "32k_ck", &sys_32k_ck, CK_443X), | ||
3387 | CLK("omap_timer.11", "32k_ck", &sys_32k_ck, CK_443X), | ||
3388 | CLK("omap_timer.1", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3389 | CLK("omap_timer.2", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3390 | CLK("omap_timer.3", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3391 | CLK("omap_timer.4", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3392 | CLK("omap_timer.9", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3393 | CLK("omap_timer.10", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3394 | CLK("omap_timer.11", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3395 | CLK("omap_timer.5", "sys_ck", &syc_clk_div_ck, CK_443X), | ||
3396 | CLK("omap_timer.6", "sys_ck", &syc_clk_div_ck, CK_443X), | ||
3397 | CLK("omap_timer.7", "sys_ck", &syc_clk_div_ck, CK_443X), | ||
3398 | CLK("omap_timer.8", "sys_ck", &syc_clk_div_ck, CK_443X), | ||
3366 | }; | 3399 | }; |
3367 | 3400 | ||
3368 | int __init omap4xxx_clk_init(void) | 3401 | int __init omap4xxx_clk_init(void) |
diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c index 3f20cbb9967b..de61f15c48e2 100644 --- a/arch/arm/mach-omap2/common.c +++ b/arch/arm/mach-omap2/common.c | |||
@@ -56,6 +56,12 @@ void __init omap2_set_globals_242x(void) | |||
56 | { | 56 | { |
57 | __omap2_set_globals(&omap242x_globals); | 57 | __omap2_set_globals(&omap242x_globals); |
58 | } | 58 | } |
59 | |||
60 | void __init omap242x_map_io(void) | ||
61 | { | ||
62 | omap2_set_globals_242x(); | ||
63 | omap242x_map_common_io(); | ||
64 | } | ||
59 | #endif | 65 | #endif |
60 | 66 | ||
61 | #if defined(CONFIG_SOC_OMAP2430) | 67 | #if defined(CONFIG_SOC_OMAP2430) |
@@ -74,6 +80,12 @@ void __init omap2_set_globals_243x(void) | |||
74 | { | 80 | { |
75 | __omap2_set_globals(&omap243x_globals); | 81 | __omap2_set_globals(&omap243x_globals); |
76 | } | 82 | } |
83 | |||
84 | void __init omap243x_map_io(void) | ||
85 | { | ||
86 | omap2_set_globals_243x(); | ||
87 | omap243x_map_common_io(); | ||
88 | } | ||
77 | #endif | 89 | #endif |
78 | 90 | ||
79 | #if defined(CONFIG_ARCH_OMAP3) | 91 | #if defined(CONFIG_ARCH_OMAP3) |
@@ -138,5 +150,11 @@ void __init omap2_set_globals_443x(void) | |||
138 | omap2_set_globals_control(&omap4_globals); | 150 | omap2_set_globals_control(&omap4_globals); |
139 | omap2_set_globals_prcm(&omap4_globals); | 151 | omap2_set_globals_prcm(&omap4_globals); |
140 | } | 152 | } |
153 | |||
154 | void __init omap4_map_io(void) | ||
155 | { | ||
156 | omap2_set_globals_443x(); | ||
157 | omap44xx_map_common_io(); | ||
158 | } | ||
141 | #endif | 159 | #endif |
142 | 160 | ||
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 1077ad663f93..10adf66be7ba 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
@@ -44,7 +44,7 @@ static int __init omap3_l3_init(void) | |||
44 | { | 44 | { |
45 | int l; | 45 | int l; |
46 | struct omap_hwmod *oh; | 46 | struct omap_hwmod *oh; |
47 | struct omap_device *od; | 47 | struct platform_device *pdev; |
48 | char oh_name[L3_MODULES_MAX_LEN]; | 48 | char oh_name[L3_MODULES_MAX_LEN]; |
49 | 49 | ||
50 | /* | 50 | /* |
@@ -61,12 +61,12 @@ static int __init omap3_l3_init(void) | |||
61 | if (!oh) | 61 | if (!oh) |
62 | pr_err("could not look up %s\n", oh_name); | 62 | pr_err("could not look up %s\n", oh_name); |
63 | 63 | ||
64 | od = omap_device_build("omap_l3_smx", 0, oh, NULL, 0, | 64 | pdev = omap_device_build("omap_l3_smx", 0, oh, NULL, 0, |
65 | NULL, 0, 0); | 65 | NULL, 0, 0); |
66 | 66 | ||
67 | WARN(IS_ERR(od), "could not build omap_device for %s\n", oh_name); | 67 | WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); |
68 | 68 | ||
69 | return IS_ERR(od) ? PTR_ERR(od) : 0; | 69 | return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; |
70 | } | 70 | } |
71 | postcore_initcall(omap3_l3_init); | 71 | postcore_initcall(omap3_l3_init); |
72 | 72 | ||
@@ -74,7 +74,7 @@ static int __init omap4_l3_init(void) | |||
74 | { | 74 | { |
75 | int l, i; | 75 | int l, i; |
76 | struct omap_hwmod *oh[3]; | 76 | struct omap_hwmod *oh[3]; |
77 | struct omap_device *od; | 77 | struct platform_device *pdev; |
78 | char oh_name[L3_MODULES_MAX_LEN]; | 78 | char oh_name[L3_MODULES_MAX_LEN]; |
79 | 79 | ||
80 | /* | 80 | /* |
@@ -92,12 +92,12 @@ static int __init omap4_l3_init(void) | |||
92 | pr_err("could not look up %s\n", oh_name); | 92 | pr_err("could not look up %s\n", oh_name); |
93 | } | 93 | } |
94 | 94 | ||
95 | od = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL, | 95 | pdev = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL, |
96 | 0, NULL, 0, 0); | 96 | 0, NULL, 0, 0); |
97 | 97 | ||
98 | WARN(IS_ERR(od), "could not build omap_device for %s\n", oh_name); | 98 | WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); |
99 | 99 | ||
100 | return IS_ERR(od) ? PTR_ERR(od) : 0; | 100 | return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; |
101 | } | 101 | } |
102 | postcore_initcall(omap4_l3_init); | 102 | postcore_initcall(omap4_l3_init); |
103 | 103 | ||
@@ -232,7 +232,7 @@ struct omap_device_pm_latency omap_keyboard_latency[] = { | |||
232 | int __init omap4_keyboard_init(struct omap4_keypad_platform_data | 232 | int __init omap4_keyboard_init(struct omap4_keypad_platform_data |
233 | *sdp4430_keypad_data, struct omap_board_data *bdata) | 233 | *sdp4430_keypad_data, struct omap_board_data *bdata) |
234 | { | 234 | { |
235 | struct omap_device *od; | 235 | struct platform_device *pdev; |
236 | struct omap_hwmod *oh; | 236 | struct omap_hwmod *oh; |
237 | struct omap4_keypad_platform_data *keypad_data; | 237 | struct omap4_keypad_platform_data *keypad_data; |
238 | unsigned int id = -1; | 238 | unsigned int id = -1; |
@@ -247,15 +247,15 @@ int __init omap4_keyboard_init(struct omap4_keypad_platform_data | |||
247 | 247 | ||
248 | keypad_data = sdp4430_keypad_data; | 248 | keypad_data = sdp4430_keypad_data; |
249 | 249 | ||
250 | od = omap_device_build(name, id, oh, keypad_data, | 250 | pdev = omap_device_build(name, id, oh, keypad_data, |
251 | sizeof(struct omap4_keypad_platform_data), | 251 | sizeof(struct omap4_keypad_platform_data), |
252 | omap_keyboard_latency, | 252 | omap_keyboard_latency, |
253 | ARRAY_SIZE(omap_keyboard_latency), 0); | 253 | ARRAY_SIZE(omap_keyboard_latency), 0); |
254 | 254 | ||
255 | if (IS_ERR(od)) { | 255 | if (IS_ERR(pdev)) { |
256 | WARN(1, "Can't build omap_device for %s:%s.\n", | 256 | WARN(1, "Can't build omap_device for %s:%s.\n", |
257 | name, oh->name); | 257 | name, oh->name); |
258 | return PTR_ERR(od); | 258 | return PTR_ERR(pdev); |
259 | } | 259 | } |
260 | oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt); | 260 | oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt); |
261 | 261 | ||
@@ -274,7 +274,7 @@ static struct omap_device_pm_latency mbox_latencies[] = { | |||
274 | static inline void omap_init_mbox(void) | 274 | static inline void omap_init_mbox(void) |
275 | { | 275 | { |
276 | struct omap_hwmod *oh; | 276 | struct omap_hwmod *oh; |
277 | struct omap_device *od; | 277 | struct platform_device *pdev; |
278 | 278 | ||
279 | oh = omap_hwmod_lookup("mailbox"); | 279 | oh = omap_hwmod_lookup("mailbox"); |
280 | if (!oh) { | 280 | if (!oh) { |
@@ -282,10 +282,10 @@ static inline void omap_init_mbox(void) | |||
282 | return; | 282 | return; |
283 | } | 283 | } |
284 | 284 | ||
285 | od = omap_device_build("omap-mailbox", -1, oh, NULL, 0, | 285 | pdev = omap_device_build("omap-mailbox", -1, oh, NULL, 0, |
286 | mbox_latencies, ARRAY_SIZE(mbox_latencies), 0); | 286 | mbox_latencies, ARRAY_SIZE(mbox_latencies), 0); |
287 | WARN(IS_ERR(od), "%s: could not build device, err %ld\n", | 287 | WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n", |
288 | __func__, PTR_ERR(od)); | 288 | __func__, PTR_ERR(pdev)); |
289 | } | 289 | } |
290 | #else | 290 | #else |
291 | static inline void omap_init_mbox(void) { } | 291 | static inline void omap_init_mbox(void) { } |
@@ -344,7 +344,7 @@ struct omap_device_pm_latency omap_mcspi_latency[] = { | |||
344 | 344 | ||
345 | static int omap_mcspi_init(struct omap_hwmod *oh, void *unused) | 345 | static int omap_mcspi_init(struct omap_hwmod *oh, void *unused) |
346 | { | 346 | { |
347 | struct omap_device *od; | 347 | struct platform_device *pdev; |
348 | char *name = "omap2_mcspi"; | 348 | char *name = "omap2_mcspi"; |
349 | struct omap2_mcspi_platform_config *pdata; | 349 | struct omap2_mcspi_platform_config *pdata; |
350 | static int spi_num; | 350 | static int spi_num; |
@@ -371,10 +371,10 @@ static int omap_mcspi_init(struct omap_hwmod *oh, void *unused) | |||
371 | } | 371 | } |
372 | 372 | ||
373 | spi_num++; | 373 | spi_num++; |
374 | od = omap_device_build(name, spi_num, oh, pdata, | 374 | pdev = omap_device_build(name, spi_num, oh, pdata, |
375 | sizeof(*pdata), omap_mcspi_latency, | 375 | sizeof(*pdata), omap_mcspi_latency, |
376 | ARRAY_SIZE(omap_mcspi_latency), 0); | 376 | ARRAY_SIZE(omap_mcspi_latency), 0); |
377 | WARN(IS_ERR(od), "Can't build omap_device for %s:%s\n", | 377 | WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s\n", |
378 | name, oh->name); | 378 | name, oh->name); |
379 | kfree(pdata); | 379 | kfree(pdata); |
380 | return 0; | 380 | return 0; |
@@ -709,7 +709,7 @@ static struct omap_device_pm_latency omap_wdt_latency[] = { | |||
709 | static int __init omap_init_wdt(void) | 709 | static int __init omap_init_wdt(void) |
710 | { | 710 | { |
711 | int id = -1; | 711 | int id = -1; |
712 | struct omap_device *od; | 712 | struct platform_device *pdev; |
713 | struct omap_hwmod *oh; | 713 | struct omap_hwmod *oh; |
714 | char *oh_name = "wd_timer2"; | 714 | char *oh_name = "wd_timer2"; |
715 | char *dev_name = "omap_wdt"; | 715 | char *dev_name = "omap_wdt"; |
@@ -723,10 +723,10 @@ static int __init omap_init_wdt(void) | |||
723 | return -EINVAL; | 723 | return -EINVAL; |
724 | } | 724 | } |
725 | 725 | ||
726 | od = omap_device_build(dev_name, id, oh, NULL, 0, | 726 | pdev = omap_device_build(dev_name, id, oh, NULL, 0, |
727 | omap_wdt_latency, | 727 | omap_wdt_latency, |
728 | ARRAY_SIZE(omap_wdt_latency), 0); | 728 | ARRAY_SIZE(omap_wdt_latency), 0); |
729 | WARN(IS_ERR(od), "Can't build omap_device for %s:%s.\n", | 729 | WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", |
730 | dev_name, oh->name); | 730 | dev_name, oh->name); |
731 | return 0; | 731 | return 0; |
732 | } | 732 | } |
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index a5b7a236aa5b..18693f6de041 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c | |||
@@ -78,7 +78,7 @@ int __init omap_display_init(struct omap_dss_board_info *board_data) | |||
78 | { | 78 | { |
79 | int r = 0; | 79 | int r = 0; |
80 | struct omap_hwmod *oh; | 80 | struct omap_hwmod *oh; |
81 | struct omap_device *od; | 81 | struct platform_device *pdev; |
82 | int i, oh_count; | 82 | int i, oh_count; |
83 | struct omap_display_platform_data pdata; | 83 | struct omap_display_platform_data pdata; |
84 | const struct omap_dss_hwmod_data *curr_dss_hwmod; | 84 | const struct omap_dss_hwmod_data *curr_dss_hwmod; |
@@ -108,13 +108,13 @@ int __init omap_display_init(struct omap_dss_board_info *board_data) | |||
108 | return -ENODEV; | 108 | return -ENODEV; |
109 | } | 109 | } |
110 | 110 | ||
111 | od = omap_device_build(curr_dss_hwmod[i].dev_name, | 111 | pdev = omap_device_build(curr_dss_hwmod[i].dev_name, |
112 | curr_dss_hwmod[i].id, oh, &pdata, | 112 | curr_dss_hwmod[i].id, oh, &pdata, |
113 | sizeof(struct omap_display_platform_data), | 113 | sizeof(struct omap_display_platform_data), |
114 | omap_dss_latency, | 114 | omap_dss_latency, |
115 | ARRAY_SIZE(omap_dss_latency), 0); | 115 | ARRAY_SIZE(omap_dss_latency), 0); |
116 | 116 | ||
117 | if (WARN((IS_ERR(od)), "Could not build omap_device for %s\n", | 117 | if (WARN((IS_ERR(pdev)), "Could not build omap_device for %s\n", |
118 | curr_dss_hwmod[i].oh_name)) | 118 | curr_dss_hwmod[i].oh_name)) |
119 | return -ENODEV; | 119 | return -ENODEV; |
120 | } | 120 | } |
diff --git a/arch/arm/mach-omap2/dma.c b/arch/arm/mach-omap2/dma.c index c9ff0e79703d..ae8cb3fb1830 100644 --- a/arch/arm/mach-omap2/dma.c +++ b/arch/arm/mach-omap2/dma.c | |||
@@ -228,7 +228,7 @@ static u32 configure_dma_errata(void) | |||
228 | /* One time initializations */ | 228 | /* One time initializations */ |
229 | static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) | 229 | static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) |
230 | { | 230 | { |
231 | struct omap_device *od; | 231 | struct platform_device *pdev; |
232 | struct omap_system_dma_plat_info *p; | 232 | struct omap_system_dma_plat_info *p; |
233 | struct resource *mem; | 233 | struct resource *mem; |
234 | char *name = "omap_dma_system"; | 234 | char *name = "omap_dma_system"; |
@@ -258,23 +258,23 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) | |||
258 | 258 | ||
259 | p->errata = configure_dma_errata(); | 259 | p->errata = configure_dma_errata(); |
260 | 260 | ||
261 | od = omap_device_build(name, 0, oh, p, sizeof(*p), | 261 | pdev = omap_device_build(name, 0, oh, p, sizeof(*p), |
262 | omap2_dma_latency, ARRAY_SIZE(omap2_dma_latency), 0); | 262 | omap2_dma_latency, ARRAY_SIZE(omap2_dma_latency), 0); |
263 | kfree(p); | 263 | kfree(p); |
264 | if (IS_ERR(od)) { | 264 | if (IS_ERR(pdev)) { |
265 | pr_err("%s: Can't build omap_device for %s:%s.\n", | 265 | pr_err("%s: Can't build omap_device for %s:%s.\n", |
266 | __func__, name, oh->name); | 266 | __func__, name, oh->name); |
267 | return PTR_ERR(od); | 267 | return PTR_ERR(pdev); |
268 | } | 268 | } |
269 | 269 | ||
270 | mem = platform_get_resource(&od->pdev, IORESOURCE_MEM, 0); | 270 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
271 | if (!mem) { | 271 | if (!mem) { |
272 | dev_err(&od->pdev.dev, "%s: no mem resource\n", __func__); | 272 | dev_err(&pdev->dev, "%s: no mem resource\n", __func__); |
273 | return -EINVAL; | 273 | return -EINVAL; |
274 | } | 274 | } |
275 | dma_base = ioremap(mem->start, resource_size(mem)); | 275 | dma_base = ioremap(mem->start, resource_size(mem)); |
276 | if (!dma_base) { | 276 | if (!dma_base) { |
277 | dev_err(&od->pdev.dev, "%s: ioremap fail\n", __func__); | 277 | dev_err(&pdev->dev, "%s: ioremap fail\n", __func__); |
278 | return -ENOMEM; | 278 | return -ENOMEM; |
279 | } | 279 | } |
280 | 280 | ||
@@ -283,7 +283,7 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) | |||
283 | (d->lch_count), GFP_KERNEL); | 283 | (d->lch_count), GFP_KERNEL); |
284 | 284 | ||
285 | if (!d->chan) { | 285 | if (!d->chan) { |
286 | dev_err(&od->pdev.dev, "%s: kzalloc fail\n", __func__); | 286 | dev_err(&pdev->dev, "%s: kzalloc fail\n", __func__); |
287 | return -ENOMEM; | 287 | return -ENOMEM; |
288 | } | 288 | } |
289 | return 0; | 289 | return 0; |
diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c index 2765cdc3152d..652ccc574196 100644 --- a/arch/arm/mach-omap2/gpio.c +++ b/arch/arm/mach-omap2/gpio.c | |||
@@ -34,7 +34,7 @@ static struct omap_device_pm_latency omap_gpio_latency[] = { | |||
34 | 34 | ||
35 | static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | 35 | static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) |
36 | { | 36 | { |
37 | struct omap_device *od; | 37 | struct platform_device *pdev; |
38 | struct omap_gpio_platform_data *pdata; | 38 | struct omap_gpio_platform_data *pdata; |
39 | struct omap_gpio_dev_attr *dev_attr; | 39 | struct omap_gpio_dev_attr *dev_attr; |
40 | char *name = "omap_gpio"; | 40 | char *name = "omap_gpio"; |
@@ -107,19 +107,19 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
107 | return -EINVAL; | 107 | return -EINVAL; |
108 | } | 108 | } |
109 | 109 | ||
110 | od = omap_device_build(name, id - 1, oh, pdata, | 110 | pdev = omap_device_build(name, id - 1, oh, pdata, |
111 | sizeof(*pdata), omap_gpio_latency, | 111 | sizeof(*pdata), omap_gpio_latency, |
112 | ARRAY_SIZE(omap_gpio_latency), | 112 | ARRAY_SIZE(omap_gpio_latency), |
113 | false); | 113 | false); |
114 | kfree(pdata); | 114 | kfree(pdata); |
115 | 115 | ||
116 | if (IS_ERR(od)) { | 116 | if (IS_ERR(pdev)) { |
117 | WARN(1, "Can't build omap_device for %s:%s.\n", | 117 | WARN(1, "Can't build omap_device for %s:%s.\n", |
118 | name, oh->name); | 118 | name, oh->name); |
119 | return PTR_ERR(od); | 119 | return PTR_ERR(pdev); |
120 | } | 120 | } |
121 | 121 | ||
122 | omap_device_disable_idle_on_suspend(od); | 122 | omap_device_disable_idle_on_suspend(pdev); |
123 | 123 | ||
124 | gpio_bank_count++; | 124 | gpio_bank_count++; |
125 | return 0; | 125 | return 0; |
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index a9b45c76e1d3..2dc002a388b3 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
@@ -137,8 +137,7 @@ static void omap4_hsmmc1_before_set_reg(struct device *dev, int slot, | |||
137 | */ | 137 | */ |
138 | reg = omap4_ctrl_pad_readl(control_pbias_offset); | 138 | reg = omap4_ctrl_pad_readl(control_pbias_offset); |
139 | reg &= ~(OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK | | 139 | reg &= ~(OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK | |
140 | OMAP4_MMC1_PWRDNZ_MASK | | 140 | OMAP4_MMC1_PWRDNZ_MASK); |
141 | OMAP4_USBC1_ICUSB_PWRDNZ_MASK); | ||
142 | omap4_ctrl_pad_writel(reg, control_pbias_offset); | 141 | omap4_ctrl_pad_writel(reg, control_pbias_offset); |
143 | } | 142 | } |
144 | 143 | ||
@@ -156,8 +155,7 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot, | |||
156 | else | 155 | else |
157 | reg |= OMAP4_MMC1_PBIASLITE_VMODE_MASK; | 156 | reg |= OMAP4_MMC1_PBIASLITE_VMODE_MASK; |
158 | reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK | | 157 | reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK | |
159 | OMAP4_MMC1_PWRDNZ_MASK | | 158 | OMAP4_MMC1_PWRDNZ_MASK); |
160 | OMAP4_USBC1_ICUSB_PWRDNZ_MASK); | ||
161 | omap4_ctrl_pad_writel(reg, control_pbias_offset); | 159 | omap4_ctrl_pad_writel(reg, control_pbias_offset); |
162 | 160 | ||
163 | timeout = jiffies + msecs_to_jiffies(5); | 161 | timeout = jiffies + msecs_to_jiffies(5); |
@@ -171,16 +169,14 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot, | |||
171 | if (reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK) { | 169 | if (reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK) { |
172 | pr_err("Pbias Voltage is not same as LDO\n"); | 170 | pr_err("Pbias Voltage is not same as LDO\n"); |
173 | /* Caution : On VMODE_ERROR Power Down MMC IO */ | 171 | /* Caution : On VMODE_ERROR Power Down MMC IO */ |
174 | reg &= ~(OMAP4_MMC1_PWRDNZ_MASK | | 172 | reg &= ~(OMAP4_MMC1_PWRDNZ_MASK); |
175 | OMAP4_USBC1_ICUSB_PWRDNZ_MASK); | ||
176 | omap4_ctrl_pad_writel(reg, control_pbias_offset); | 173 | omap4_ctrl_pad_writel(reg, control_pbias_offset); |
177 | } | 174 | } |
178 | } else { | 175 | } else { |
179 | reg = omap4_ctrl_pad_readl(control_pbias_offset); | 176 | reg = omap4_ctrl_pad_readl(control_pbias_offset); |
180 | reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK | | 177 | reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK | |
181 | OMAP4_MMC1_PWRDNZ_MASK | | 178 | OMAP4_MMC1_PWRDNZ_MASK | |
182 | OMAP4_MMC1_PBIASLITE_VMODE_MASK | | 179 | OMAP4_MMC1_PBIASLITE_VMODE_MASK); |
183 | OMAP4_USBC1_ICUSB_PWRDNZ_MASK); | ||
184 | omap4_ctrl_pad_writel(reg, control_pbias_offset); | 180 | omap4_ctrl_pad_writel(reg, control_pbias_offset); |
185 | } | 181 | } |
186 | } | 182 | } |
@@ -430,7 +426,7 @@ static struct omap_device_pm_latency omap_hsmmc_latency[] = { | |||
430 | void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) | 426 | void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) |
431 | { | 427 | { |
432 | struct omap_hwmod *oh; | 428 | struct omap_hwmod *oh; |
433 | struct omap_device *od; | 429 | struct platform_device *pdev; |
434 | struct omap_device_pm_latency *ohl; | 430 | struct omap_device_pm_latency *ohl; |
435 | char oh_name[MAX_OMAP_MMC_HWMOD_NAME_LEN]; | 431 | char oh_name[MAX_OMAP_MMC_HWMOD_NAME_LEN]; |
436 | struct omap_mmc_platform_data *mmc_data; | 432 | struct omap_mmc_platform_data *mmc_data; |
@@ -471,9 +467,9 @@ void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) | |||
471 | mmc_data->controller_flags = mmc_dev_attr->flags; | 467 | mmc_data->controller_flags = mmc_dev_attr->flags; |
472 | } | 468 | } |
473 | 469 | ||
474 | od = omap_device_build(name, ctrl_nr - 1, oh, mmc_data, | 470 | pdev = omap_device_build(name, ctrl_nr - 1, oh, mmc_data, |
475 | sizeof(struct omap_mmc_platform_data), ohl, ohl_cnt, false); | 471 | sizeof(struct omap_mmc_platform_data), ohl, ohl_cnt, false); |
476 | if (IS_ERR(od)) { | 472 | if (IS_ERR(pdev)) { |
477 | WARN(1, "Can't build omap_device for %s:%s.\n", name, oh->name); | 473 | WARN(1, "Can't build omap_device for %s:%s.\n", name, oh->name); |
478 | kfree(mmc_data->slots[0].name); | 474 | kfree(mmc_data->slots[0].name); |
479 | goto done; | 475 | goto done; |
@@ -482,7 +478,7 @@ void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) | |||
482 | * return device handle to board setup code | 478 | * return device handle to board setup code |
483 | * required to populate for regulator framework structure | 479 | * required to populate for regulator framework structure |
484 | */ | 480 | */ |
485 | hsmmcinfo->dev = &od->pdev.dev; | 481 | hsmmcinfo->dev = &pdev->dev; |
486 | 482 | ||
487 | done: | 483 | done: |
488 | kfree(mmc_data); | 484 | kfree(mmc_data); |
diff --git a/arch/arm/mach-omap2/hwspinlock.c b/arch/arm/mach-omap2/hwspinlock.c index 06d4a80660a5..0b3ae9d9c3b3 100644 --- a/arch/arm/mach-omap2/hwspinlock.c +++ b/arch/arm/mach-omap2/hwspinlock.c | |||
@@ -35,7 +35,7 @@ int __init hwspinlocks_init(void) | |||
35 | { | 35 | { |
36 | int retval = 0; | 36 | int retval = 0; |
37 | struct omap_hwmod *oh; | 37 | struct omap_hwmod *oh; |
38 | struct omap_device *od; | 38 | struct platform_device *pdev; |
39 | const char *oh_name = "spinlock"; | 39 | const char *oh_name = "spinlock"; |
40 | const char *dev_name = "omap_hwspinlock"; | 40 | const char *dev_name = "omap_hwspinlock"; |
41 | 41 | ||
@@ -48,13 +48,13 @@ int __init hwspinlocks_init(void) | |||
48 | if (oh == NULL) | 48 | if (oh == NULL) |
49 | return -EINVAL; | 49 | return -EINVAL; |
50 | 50 | ||
51 | od = omap_device_build(dev_name, 0, oh, NULL, 0, | 51 | pdev = omap_device_build(dev_name, 0, oh, NULL, 0, |
52 | omap_spinlock_latency, | 52 | omap_spinlock_latency, |
53 | ARRAY_SIZE(omap_spinlock_latency), false); | 53 | ARRAY_SIZE(omap_spinlock_latency), false); |
54 | if (IS_ERR(od)) { | 54 | if (IS_ERR(pdev)) { |
55 | pr_err("Can't build omap_device for %s:%s\n", dev_name, | 55 | pr_err("Can't build omap_device for %s:%s\n", dev_name, |
56 | oh_name); | 56 | oh_name); |
57 | retval = PTR_ERR(od); | 57 | retval = PTR_ERR(pdev); |
58 | } | 58 | } |
59 | 59 | ||
60 | return retval; | 60 | return retval; |
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 3a12f7586a4c..65f1be6a182c 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c | |||
@@ -165,8 +165,8 @@ static void __init omap_init_irq(u32 base, int nr_irqs) | |||
165 | 165 | ||
166 | omap_irq_bank_init_one(bank); | 166 | omap_irq_bank_init_one(bank); |
167 | 167 | ||
168 | for (i = 0, j = 0; i < bank->nr_irqs; i += 32, j += 0x20) | 168 | for (j = 0; j < bank->nr_irqs; j += 32) |
169 | omap_alloc_gc(bank->base_reg + j, i, 32); | 169 | omap_alloc_gc(bank->base_reg + j, j, 32); |
170 | 170 | ||
171 | nr_of_irqs += bank->nr_irqs; | 171 | nr_of_irqs += bank->nr_irqs; |
172 | nr_banks++; | 172 | nr_banks++; |
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c index 4a6ef6ab8458..5063f253c4b9 100644 --- a/arch/arm/mach-omap2/mcbsp.c +++ b/arch/arm/mach-omap2/mcbsp.c | |||
@@ -27,66 +27,69 @@ | |||
27 | 27 | ||
28 | #include "control.h" | 28 | #include "control.h" |
29 | 29 | ||
30 | /* McBSP internal signal muxing functions */ | 30 | /* |
31 | * FIXME: Find a mechanism to enable/disable runtime the McBSP ICLK autoidle. | ||
32 | * Sidetone needs non-gated ICLK and sidetone autoidle is broken. | ||
33 | */ | ||
34 | #include "cm2xxx_3xxx.h" | ||
35 | #include "cm-regbits-34xx.h" | ||
31 | 36 | ||
32 | void omap2_mcbsp1_mux_clkr_src(u8 mux) | 37 | /* McBSP internal signal muxing function */ |
38 | static int omap2_mcbsp1_mux_rx_clk(struct device *dev, const char *signal, | ||
39 | const char *src) | ||
33 | { | 40 | { |
34 | u32 v; | 41 | u32 v; |
35 | 42 | ||
36 | v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); | 43 | v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); |
37 | if (mux == CLKR_SRC_CLKR) | ||
38 | v &= ~OMAP2_MCBSP1_CLKR_MASK; | ||
39 | else if (mux == CLKR_SRC_CLKX) | ||
40 | v |= OMAP2_MCBSP1_CLKR_MASK; | ||
41 | omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); | ||
42 | } | ||
43 | EXPORT_SYMBOL(omap2_mcbsp1_mux_clkr_src); | ||
44 | 44 | ||
45 | void omap2_mcbsp1_mux_fsr_src(u8 mux) | 45 | if (!strcmp(signal, "clkr")) { |
46 | { | 46 | if (!strcmp(src, "clkr")) |
47 | u32 v; | 47 | v &= ~OMAP2_MCBSP1_CLKR_MASK; |
48 | else if (!strcmp(src, "clkx")) | ||
49 | v |= OMAP2_MCBSP1_CLKR_MASK; | ||
50 | else | ||
51 | return -EINVAL; | ||
52 | } else if (!strcmp(signal, "fsr")) { | ||
53 | if (!strcmp(src, "fsr")) | ||
54 | v &= ~OMAP2_MCBSP1_FSR_MASK; | ||
55 | else if (!strcmp(src, "fsx")) | ||
56 | v |= OMAP2_MCBSP1_FSR_MASK; | ||
57 | else | ||
58 | return -EINVAL; | ||
59 | } else { | ||
60 | return -EINVAL; | ||
61 | } | ||
48 | 62 | ||
49 | v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); | ||
50 | if (mux == FSR_SRC_FSR) | ||
51 | v &= ~OMAP2_MCBSP1_FSR_MASK; | ||
52 | else if (mux == FSR_SRC_FSX) | ||
53 | v |= OMAP2_MCBSP1_FSR_MASK; | ||
54 | omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); | 63 | omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); |
64 | |||
65 | return 0; | ||
55 | } | 66 | } |
56 | EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src); | ||
57 | 67 | ||
58 | /* McBSP CLKS source switching function */ | 68 | /* McBSP CLKS source switching function */ |
59 | 69 | static int omap2_mcbsp_set_clk_src(struct device *dev, struct clk *clk, | |
60 | int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id) | 70 | const char *src) |
61 | { | 71 | { |
62 | struct omap_mcbsp *mcbsp; | ||
63 | struct clk *fck_src; | 72 | struct clk *fck_src; |
64 | char *fck_src_name; | 73 | char *fck_src_name; |
65 | int r; | 74 | int r; |
66 | 75 | ||
67 | if (!omap_mcbsp_check_valid_id(id)) { | 76 | if (!strcmp(src, "clks_ext")) |
68 | pr_err("%s: Invalid id (%d)\n", __func__, id + 1); | ||
69 | return -EINVAL; | ||
70 | } | ||
71 | mcbsp = id_to_mcbsp_ptr(id); | ||
72 | |||
73 | if (fck_src_id == MCBSP_CLKS_PAD_SRC) | ||
74 | fck_src_name = "pad_fck"; | 77 | fck_src_name = "pad_fck"; |
75 | else if (fck_src_id == MCBSP_CLKS_PRCM_SRC) | 78 | else if (!strcmp(src, "clks_fclk")) |
76 | fck_src_name = "prcm_fck"; | 79 | fck_src_name = "prcm_fck"; |
77 | else | 80 | else |
78 | return -EINVAL; | 81 | return -EINVAL; |
79 | 82 | ||
80 | fck_src = clk_get(mcbsp->dev, fck_src_name); | 83 | fck_src = clk_get(dev, fck_src_name); |
81 | if (IS_ERR_OR_NULL(fck_src)) { | 84 | if (IS_ERR_OR_NULL(fck_src)) { |
82 | pr_err("omap-mcbsp: %s: could not clk_get() %s\n", "clks", | 85 | pr_err("omap-mcbsp: %s: could not clk_get() %s\n", "clks", |
83 | fck_src_name); | 86 | fck_src_name); |
84 | return -EINVAL; | 87 | return -EINVAL; |
85 | } | 88 | } |
86 | 89 | ||
87 | pm_runtime_put_sync(mcbsp->dev); | 90 | pm_runtime_put_sync(dev); |
88 | 91 | ||
89 | r = clk_set_parent(mcbsp->fclk, fck_src); | 92 | r = clk_set_parent(clk, fck_src); |
90 | if (IS_ERR_VALUE(r)) { | 93 | if (IS_ERR_VALUE(r)) { |
91 | pr_err("omap-mcbsp: %s: could not clk_set_parent() to %s\n", | 94 | pr_err("omap-mcbsp: %s: could not clk_set_parent() to %s\n", |
92 | "clks", fck_src_name); | 95 | "clks", fck_src_name); |
@@ -94,13 +97,30 @@ int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id) | |||
94 | return -EINVAL; | 97 | return -EINVAL; |
95 | } | 98 | } |
96 | 99 | ||
97 | pm_runtime_get_sync(mcbsp->dev); | 100 | pm_runtime_get_sync(dev); |
98 | 101 | ||
99 | clk_put(fck_src); | 102 | clk_put(fck_src); |
100 | 103 | ||
101 | return 0; | 104 | return 0; |
102 | } | 105 | } |
103 | EXPORT_SYMBOL(omap2_mcbsp_set_clks_src); | 106 | |
107 | static int omap3_enable_st_clock(unsigned int id, bool enable) | ||
108 | { | ||
109 | unsigned int w; | ||
110 | |||
111 | /* | ||
112 | * Sidetone uses McBSP ICLK - which must not idle when sidetones | ||
113 | * are enabled or sidetones start sounding ugly. | ||
114 | */ | ||
115 | w = omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE); | ||
116 | if (enable) | ||
117 | w &= ~(1 << (id - 2)); | ||
118 | else | ||
119 | w |= 1 << (id - 2); | ||
120 | omap2_cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE); | ||
121 | |||
122 | return 0; | ||
123 | } | ||
104 | 124 | ||
105 | struct omap_device_pm_latency omap2_mcbsp_latency[] = { | 125 | struct omap_device_pm_latency omap2_mcbsp_latency[] = { |
106 | { | 126 | { |
@@ -116,7 +136,7 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused) | |||
116 | char *name = "omap-mcbsp"; | 136 | char *name = "omap-mcbsp"; |
117 | struct omap_hwmod *oh_device[2]; | 137 | struct omap_hwmod *oh_device[2]; |
118 | struct omap_mcbsp_platform_data *pdata = NULL; | 138 | struct omap_mcbsp_platform_data *pdata = NULL; |
119 | struct omap_device *od; | 139 | struct platform_device *pdev; |
120 | 140 | ||
121 | sscanf(oh->name, "mcbsp%d", &id); | 141 | sscanf(oh->name, "mcbsp%d", &id); |
122 | 142 | ||
@@ -126,7 +146,13 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused) | |||
126 | return -ENOMEM; | 146 | return -ENOMEM; |
127 | } | 147 | } |
128 | 148 | ||
129 | pdata->mcbsp_config_type = oh->class->rev; | 149 | pdata->reg_step = 4; |
150 | if (oh->class->rev < MCBSP_CONFIG_TYPE2) { | ||
151 | pdata->reg_size = 2; | ||
152 | } else { | ||
153 | pdata->reg_size = 4; | ||
154 | pdata->has_ccr = true; | ||
155 | } | ||
130 | 156 | ||
131 | if (oh->class->rev == MCBSP_CONFIG_TYPE3) { | 157 | if (oh->class->rev == MCBSP_CONFIG_TYPE3) { |
132 | if (id == 2) | 158 | if (id == 2) |
@@ -137,22 +163,29 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused) | |||
137 | pdata->buffer_size = 0x80; | 163 | pdata->buffer_size = 0x80; |
138 | } | 164 | } |
139 | 165 | ||
166 | if (oh->class->rev >= MCBSP_CONFIG_TYPE3) | ||
167 | pdata->has_wakeup = true; | ||
168 | |||
140 | oh_device[0] = oh; | 169 | oh_device[0] = oh; |
141 | 170 | ||
142 | if (oh->dev_attr) { | 171 | if (oh->dev_attr) { |
143 | oh_device[1] = omap_hwmod_lookup(( | 172 | oh_device[1] = omap_hwmod_lookup(( |
144 | (struct omap_mcbsp_dev_attr *)(oh->dev_attr))->sidetone); | 173 | (struct omap_mcbsp_dev_attr *)(oh->dev_attr))->sidetone); |
174 | pdata->enable_st_clock = omap3_enable_st_clock; | ||
145 | count++; | 175 | count++; |
146 | } | 176 | } |
147 | od = omap_device_build_ss(name, id, oh_device, count, pdata, | 177 | pdev = omap_device_build_ss(name, id, oh_device, count, pdata, |
148 | sizeof(*pdata), omap2_mcbsp_latency, | 178 | sizeof(*pdata), omap2_mcbsp_latency, |
149 | ARRAY_SIZE(omap2_mcbsp_latency), false); | 179 | ARRAY_SIZE(omap2_mcbsp_latency), false); |
150 | kfree(pdata); | 180 | kfree(pdata); |
151 | if (IS_ERR(od)) { | 181 | if (IS_ERR(pdev)) { |
152 | pr_err("%s: Can't build omap_device for %s:%s.\n", __func__, | 182 | pr_err("%s: Can't build omap_device for %s:%s.\n", __func__, |
153 | name, oh->name); | 183 | name, oh->name); |
154 | return PTR_ERR(od); | 184 | return PTR_ERR(pdev); |
155 | } | 185 | } |
186 | pdata->set_clk_src = omap2_mcbsp_set_clk_src; | ||
187 | if (id == 1) | ||
188 | pdata->mux_signal = omap2_mcbsp1_mux_rx_clk; | ||
156 | omap_mcbsp_count++; | 189 | omap_mcbsp_count++; |
157 | return 0; | 190 | return 0; |
158 | } | 191 | } |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index b6ea69a5c2f8..6d7206213525 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c | |||
@@ -269,6 +269,16 @@ static struct omap_hwmod omap2420_iva_hwmod = { | |||
269 | .masters_cnt = ARRAY_SIZE(omap2420_iva_masters), | 269 | .masters_cnt = ARRAY_SIZE(omap2420_iva_masters), |
270 | }; | 270 | }; |
271 | 271 | ||
272 | /* always-on timers dev attribute */ | ||
273 | static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = { | ||
274 | .timer_capability = OMAP_TIMER_ALWON, | ||
275 | }; | ||
276 | |||
277 | /* pwm timers dev attribute */ | ||
278 | static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = { | ||
279 | .timer_capability = OMAP_TIMER_HAS_PWM, | ||
280 | }; | ||
281 | |||
272 | /* timer1 */ | 282 | /* timer1 */ |
273 | static struct omap_hwmod omap2420_timer1_hwmod; | 283 | static struct omap_hwmod omap2420_timer1_hwmod; |
274 | 284 | ||
@@ -309,6 +319,7 @@ static struct omap_hwmod omap2420_timer1_hwmod = { | |||
309 | .idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT, | 319 | .idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT, |
310 | }, | 320 | }, |
311 | }, | 321 | }, |
322 | .dev_attr = &capability_alwon_dev_attr, | ||
312 | .slaves = omap2420_timer1_slaves, | 323 | .slaves = omap2420_timer1_slaves, |
313 | .slaves_cnt = ARRAY_SIZE(omap2420_timer1_slaves), | 324 | .slaves_cnt = ARRAY_SIZE(omap2420_timer1_slaves), |
314 | .class = &omap2xxx_timer_hwmod_class, | 325 | .class = &omap2xxx_timer_hwmod_class, |
@@ -345,6 +356,7 @@ static struct omap_hwmod omap2420_timer2_hwmod = { | |||
345 | .idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT, | 356 | .idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT, |
346 | }, | 357 | }, |
347 | }, | 358 | }, |
359 | .dev_attr = &capability_alwon_dev_attr, | ||
348 | .slaves = omap2420_timer2_slaves, | 360 | .slaves = omap2420_timer2_slaves, |
349 | .slaves_cnt = ARRAY_SIZE(omap2420_timer2_slaves), | 361 | .slaves_cnt = ARRAY_SIZE(omap2420_timer2_slaves), |
350 | .class = &omap2xxx_timer_hwmod_class, | 362 | .class = &omap2xxx_timer_hwmod_class, |
@@ -381,6 +393,7 @@ static struct omap_hwmod omap2420_timer3_hwmod = { | |||
381 | .idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT, | 393 | .idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT, |
382 | }, | 394 | }, |
383 | }, | 395 | }, |
396 | .dev_attr = &capability_alwon_dev_attr, | ||
384 | .slaves = omap2420_timer3_slaves, | 397 | .slaves = omap2420_timer3_slaves, |
385 | .slaves_cnt = ARRAY_SIZE(omap2420_timer3_slaves), | 398 | .slaves_cnt = ARRAY_SIZE(omap2420_timer3_slaves), |
386 | .class = &omap2xxx_timer_hwmod_class, | 399 | .class = &omap2xxx_timer_hwmod_class, |
@@ -417,6 +430,7 @@ static struct omap_hwmod omap2420_timer4_hwmod = { | |||
417 | .idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT, | 430 | .idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT, |
418 | }, | 431 | }, |
419 | }, | 432 | }, |
433 | .dev_attr = &capability_alwon_dev_attr, | ||
420 | .slaves = omap2420_timer4_slaves, | 434 | .slaves = omap2420_timer4_slaves, |
421 | .slaves_cnt = ARRAY_SIZE(omap2420_timer4_slaves), | 435 | .slaves_cnt = ARRAY_SIZE(omap2420_timer4_slaves), |
422 | .class = &omap2xxx_timer_hwmod_class, | 436 | .class = &omap2xxx_timer_hwmod_class, |
@@ -453,6 +467,7 @@ static struct omap_hwmod omap2420_timer5_hwmod = { | |||
453 | .idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT, | 467 | .idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT, |
454 | }, | 468 | }, |
455 | }, | 469 | }, |
470 | .dev_attr = &capability_alwon_dev_attr, | ||
456 | .slaves = omap2420_timer5_slaves, | 471 | .slaves = omap2420_timer5_slaves, |
457 | .slaves_cnt = ARRAY_SIZE(omap2420_timer5_slaves), | 472 | .slaves_cnt = ARRAY_SIZE(omap2420_timer5_slaves), |
458 | .class = &omap2xxx_timer_hwmod_class, | 473 | .class = &omap2xxx_timer_hwmod_class, |
@@ -490,6 +505,7 @@ static struct omap_hwmod omap2420_timer6_hwmod = { | |||
490 | .idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT, | 505 | .idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT, |
491 | }, | 506 | }, |
492 | }, | 507 | }, |
508 | .dev_attr = &capability_alwon_dev_attr, | ||
493 | .slaves = omap2420_timer6_slaves, | 509 | .slaves = omap2420_timer6_slaves, |
494 | .slaves_cnt = ARRAY_SIZE(omap2420_timer6_slaves), | 510 | .slaves_cnt = ARRAY_SIZE(omap2420_timer6_slaves), |
495 | .class = &omap2xxx_timer_hwmod_class, | 511 | .class = &omap2xxx_timer_hwmod_class, |
@@ -526,6 +542,7 @@ static struct omap_hwmod omap2420_timer7_hwmod = { | |||
526 | .idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT, | 542 | .idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT, |
527 | }, | 543 | }, |
528 | }, | 544 | }, |
545 | .dev_attr = &capability_alwon_dev_attr, | ||
529 | .slaves = omap2420_timer7_slaves, | 546 | .slaves = omap2420_timer7_slaves, |
530 | .slaves_cnt = ARRAY_SIZE(omap2420_timer7_slaves), | 547 | .slaves_cnt = ARRAY_SIZE(omap2420_timer7_slaves), |
531 | .class = &omap2xxx_timer_hwmod_class, | 548 | .class = &omap2xxx_timer_hwmod_class, |
@@ -562,6 +579,7 @@ static struct omap_hwmod omap2420_timer8_hwmod = { | |||
562 | .idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT, | 579 | .idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT, |
563 | }, | 580 | }, |
564 | }, | 581 | }, |
582 | .dev_attr = &capability_alwon_dev_attr, | ||
565 | .slaves = omap2420_timer8_slaves, | 583 | .slaves = omap2420_timer8_slaves, |
566 | .slaves_cnt = ARRAY_SIZE(omap2420_timer8_slaves), | 584 | .slaves_cnt = ARRAY_SIZE(omap2420_timer8_slaves), |
567 | .class = &omap2xxx_timer_hwmod_class, | 585 | .class = &omap2xxx_timer_hwmod_class, |
@@ -598,6 +616,7 @@ static struct omap_hwmod omap2420_timer9_hwmod = { | |||
598 | .idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT, | 616 | .idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT, |
599 | }, | 617 | }, |
600 | }, | 618 | }, |
619 | .dev_attr = &capability_pwm_dev_attr, | ||
601 | .slaves = omap2420_timer9_slaves, | 620 | .slaves = omap2420_timer9_slaves, |
602 | .slaves_cnt = ARRAY_SIZE(omap2420_timer9_slaves), | 621 | .slaves_cnt = ARRAY_SIZE(omap2420_timer9_slaves), |
603 | .class = &omap2xxx_timer_hwmod_class, | 622 | .class = &omap2xxx_timer_hwmod_class, |
@@ -634,6 +653,7 @@ static struct omap_hwmod omap2420_timer10_hwmod = { | |||
634 | .idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT, | 653 | .idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT, |
635 | }, | 654 | }, |
636 | }, | 655 | }, |
656 | .dev_attr = &capability_pwm_dev_attr, | ||
637 | .slaves = omap2420_timer10_slaves, | 657 | .slaves = omap2420_timer10_slaves, |
638 | .slaves_cnt = ARRAY_SIZE(omap2420_timer10_slaves), | 658 | .slaves_cnt = ARRAY_SIZE(omap2420_timer10_slaves), |
639 | .class = &omap2xxx_timer_hwmod_class, | 659 | .class = &omap2xxx_timer_hwmod_class, |
@@ -670,6 +690,7 @@ static struct omap_hwmod omap2420_timer11_hwmod = { | |||
670 | .idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT, | 690 | .idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT, |
671 | }, | 691 | }, |
672 | }, | 692 | }, |
693 | .dev_attr = &capability_pwm_dev_attr, | ||
673 | .slaves = omap2420_timer11_slaves, | 694 | .slaves = omap2420_timer11_slaves, |
674 | .slaves_cnt = ARRAY_SIZE(omap2420_timer11_slaves), | 695 | .slaves_cnt = ARRAY_SIZE(omap2420_timer11_slaves), |
675 | .class = &omap2xxx_timer_hwmod_class, | 696 | .class = &omap2xxx_timer_hwmod_class, |
@@ -706,6 +727,7 @@ static struct omap_hwmod omap2420_timer12_hwmod = { | |||
706 | .idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT, | 727 | .idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT, |
707 | }, | 728 | }, |
708 | }, | 729 | }, |
730 | .dev_attr = &capability_pwm_dev_attr, | ||
709 | .slaves = omap2420_timer12_slaves, | 731 | .slaves = omap2420_timer12_slaves, |
710 | .slaves_cnt = ARRAY_SIZE(omap2420_timer12_slaves), | 732 | .slaves_cnt = ARRAY_SIZE(omap2420_timer12_slaves), |
711 | .class = &omap2xxx_timer_hwmod_class, | 733 | .class = &omap2xxx_timer_hwmod_class, |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index 56de8d616313..a2580d01c3ff 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c | |||
@@ -343,6 +343,16 @@ static struct omap_hwmod omap2430_iva_hwmod = { | |||
343 | .masters_cnt = ARRAY_SIZE(omap2430_iva_masters), | 343 | .masters_cnt = ARRAY_SIZE(omap2430_iva_masters), |
344 | }; | 344 | }; |
345 | 345 | ||
346 | /* always-on timers dev attribute */ | ||
347 | static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = { | ||
348 | .timer_capability = OMAP_TIMER_ALWON, | ||
349 | }; | ||
350 | |||
351 | /* pwm timers dev attribute */ | ||
352 | static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = { | ||
353 | .timer_capability = OMAP_TIMER_HAS_PWM, | ||
354 | }; | ||
355 | |||
346 | /* timer1 */ | 356 | /* timer1 */ |
347 | static struct omap_hwmod omap2430_timer1_hwmod; | 357 | static struct omap_hwmod omap2430_timer1_hwmod; |
348 | 358 | ||
@@ -383,6 +393,7 @@ static struct omap_hwmod omap2430_timer1_hwmod = { | |||
383 | .idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT, | 393 | .idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT, |
384 | }, | 394 | }, |
385 | }, | 395 | }, |
396 | .dev_attr = &capability_alwon_dev_attr, | ||
386 | .slaves = omap2430_timer1_slaves, | 397 | .slaves = omap2430_timer1_slaves, |
387 | .slaves_cnt = ARRAY_SIZE(omap2430_timer1_slaves), | 398 | .slaves_cnt = ARRAY_SIZE(omap2430_timer1_slaves), |
388 | .class = &omap2xxx_timer_hwmod_class, | 399 | .class = &omap2xxx_timer_hwmod_class, |
@@ -419,6 +430,7 @@ static struct omap_hwmod omap2430_timer2_hwmod = { | |||
419 | .idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT, | 430 | .idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT, |
420 | }, | 431 | }, |
421 | }, | 432 | }, |
433 | .dev_attr = &capability_alwon_dev_attr, | ||
422 | .slaves = omap2430_timer2_slaves, | 434 | .slaves = omap2430_timer2_slaves, |
423 | .slaves_cnt = ARRAY_SIZE(omap2430_timer2_slaves), | 435 | .slaves_cnt = ARRAY_SIZE(omap2430_timer2_slaves), |
424 | .class = &omap2xxx_timer_hwmod_class, | 436 | .class = &omap2xxx_timer_hwmod_class, |
@@ -455,6 +467,7 @@ static struct omap_hwmod omap2430_timer3_hwmod = { | |||
455 | .idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT, | 467 | .idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT, |
456 | }, | 468 | }, |
457 | }, | 469 | }, |
470 | .dev_attr = &capability_alwon_dev_attr, | ||
458 | .slaves = omap2430_timer3_slaves, | 471 | .slaves = omap2430_timer3_slaves, |
459 | .slaves_cnt = ARRAY_SIZE(omap2430_timer3_slaves), | 472 | .slaves_cnt = ARRAY_SIZE(omap2430_timer3_slaves), |
460 | .class = &omap2xxx_timer_hwmod_class, | 473 | .class = &omap2xxx_timer_hwmod_class, |
@@ -491,6 +504,7 @@ static struct omap_hwmod omap2430_timer4_hwmod = { | |||
491 | .idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT, | 504 | .idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT, |
492 | }, | 505 | }, |
493 | }, | 506 | }, |
507 | .dev_attr = &capability_alwon_dev_attr, | ||
494 | .slaves = omap2430_timer4_slaves, | 508 | .slaves = omap2430_timer4_slaves, |
495 | .slaves_cnt = ARRAY_SIZE(omap2430_timer4_slaves), | 509 | .slaves_cnt = ARRAY_SIZE(omap2430_timer4_slaves), |
496 | .class = &omap2xxx_timer_hwmod_class, | 510 | .class = &omap2xxx_timer_hwmod_class, |
@@ -527,6 +541,7 @@ static struct omap_hwmod omap2430_timer5_hwmod = { | |||
527 | .idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT, | 541 | .idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT, |
528 | }, | 542 | }, |
529 | }, | 543 | }, |
544 | .dev_attr = &capability_alwon_dev_attr, | ||
530 | .slaves = omap2430_timer5_slaves, | 545 | .slaves = omap2430_timer5_slaves, |
531 | .slaves_cnt = ARRAY_SIZE(omap2430_timer5_slaves), | 546 | .slaves_cnt = ARRAY_SIZE(omap2430_timer5_slaves), |
532 | .class = &omap2xxx_timer_hwmod_class, | 547 | .class = &omap2xxx_timer_hwmod_class, |
@@ -563,6 +578,7 @@ static struct omap_hwmod omap2430_timer6_hwmod = { | |||
563 | .idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT, | 578 | .idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT, |
564 | }, | 579 | }, |
565 | }, | 580 | }, |
581 | .dev_attr = &capability_alwon_dev_attr, | ||
566 | .slaves = omap2430_timer6_slaves, | 582 | .slaves = omap2430_timer6_slaves, |
567 | .slaves_cnt = ARRAY_SIZE(omap2430_timer6_slaves), | 583 | .slaves_cnt = ARRAY_SIZE(omap2430_timer6_slaves), |
568 | .class = &omap2xxx_timer_hwmod_class, | 584 | .class = &omap2xxx_timer_hwmod_class, |
@@ -599,6 +615,7 @@ static struct omap_hwmod omap2430_timer7_hwmod = { | |||
599 | .idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT, | 615 | .idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT, |
600 | }, | 616 | }, |
601 | }, | 617 | }, |
618 | .dev_attr = &capability_alwon_dev_attr, | ||
602 | .slaves = omap2430_timer7_slaves, | 619 | .slaves = omap2430_timer7_slaves, |
603 | .slaves_cnt = ARRAY_SIZE(omap2430_timer7_slaves), | 620 | .slaves_cnt = ARRAY_SIZE(omap2430_timer7_slaves), |
604 | .class = &omap2xxx_timer_hwmod_class, | 621 | .class = &omap2xxx_timer_hwmod_class, |
@@ -635,6 +652,7 @@ static struct omap_hwmod omap2430_timer8_hwmod = { | |||
635 | .idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT, | 652 | .idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT, |
636 | }, | 653 | }, |
637 | }, | 654 | }, |
655 | .dev_attr = &capability_alwon_dev_attr, | ||
638 | .slaves = omap2430_timer8_slaves, | 656 | .slaves = omap2430_timer8_slaves, |
639 | .slaves_cnt = ARRAY_SIZE(omap2430_timer8_slaves), | 657 | .slaves_cnt = ARRAY_SIZE(omap2430_timer8_slaves), |
640 | .class = &omap2xxx_timer_hwmod_class, | 658 | .class = &omap2xxx_timer_hwmod_class, |
@@ -671,6 +689,7 @@ static struct omap_hwmod omap2430_timer9_hwmod = { | |||
671 | .idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT, | 689 | .idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT, |
672 | }, | 690 | }, |
673 | }, | 691 | }, |
692 | .dev_attr = &capability_pwm_dev_attr, | ||
674 | .slaves = omap2430_timer9_slaves, | 693 | .slaves = omap2430_timer9_slaves, |
675 | .slaves_cnt = ARRAY_SIZE(omap2430_timer9_slaves), | 694 | .slaves_cnt = ARRAY_SIZE(omap2430_timer9_slaves), |
676 | .class = &omap2xxx_timer_hwmod_class, | 695 | .class = &omap2xxx_timer_hwmod_class, |
@@ -707,6 +726,7 @@ static struct omap_hwmod omap2430_timer10_hwmod = { | |||
707 | .idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT, | 726 | .idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT, |
708 | }, | 727 | }, |
709 | }, | 728 | }, |
729 | .dev_attr = &capability_pwm_dev_attr, | ||
710 | .slaves = omap2430_timer10_slaves, | 730 | .slaves = omap2430_timer10_slaves, |
711 | .slaves_cnt = ARRAY_SIZE(omap2430_timer10_slaves), | 731 | .slaves_cnt = ARRAY_SIZE(omap2430_timer10_slaves), |
712 | .class = &omap2xxx_timer_hwmod_class, | 732 | .class = &omap2xxx_timer_hwmod_class, |
@@ -743,6 +763,7 @@ static struct omap_hwmod omap2430_timer11_hwmod = { | |||
743 | .idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT, | 763 | .idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT, |
744 | }, | 764 | }, |
745 | }, | 765 | }, |
766 | .dev_attr = &capability_pwm_dev_attr, | ||
746 | .slaves = omap2430_timer11_slaves, | 767 | .slaves = omap2430_timer11_slaves, |
747 | .slaves_cnt = ARRAY_SIZE(omap2430_timer11_slaves), | 768 | .slaves_cnt = ARRAY_SIZE(omap2430_timer11_slaves), |
748 | .class = &omap2xxx_timer_hwmod_class, | 769 | .class = &omap2xxx_timer_hwmod_class, |
@@ -779,6 +800,7 @@ static struct omap_hwmod omap2430_timer12_hwmod = { | |||
779 | .idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT, | 800 | .idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT, |
780 | }, | 801 | }, |
781 | }, | 802 | }, |
803 | .dev_attr = &capability_pwm_dev_attr, | ||
782 | .slaves = omap2430_timer12_slaves, | 804 | .slaves = omap2430_timer12_slaves, |
783 | .slaves_cnt = ARRAY_SIZE(omap2430_timer12_slaves), | 805 | .slaves_cnt = ARRAY_SIZE(omap2430_timer12_slaves), |
784 | .class = &omap2xxx_timer_hwmod_class, | 806 | .class = &omap2xxx_timer_hwmod_class, |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index e787731cf3dc..3008e1672c7a 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -564,6 +564,21 @@ static struct omap_hwmod_class omap3xxx_timer_hwmod_class = { | |||
564 | .rev = OMAP_TIMER_IP_VERSION_1, | 564 | .rev = OMAP_TIMER_IP_VERSION_1, |
565 | }; | 565 | }; |
566 | 566 | ||
567 | /* secure timers dev attribute */ | ||
568 | static struct omap_timer_capability_dev_attr capability_secure_dev_attr = { | ||
569 | .timer_capability = OMAP_TIMER_SECURE, | ||
570 | }; | ||
571 | |||
572 | /* always-on timers dev attribute */ | ||
573 | static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = { | ||
574 | .timer_capability = OMAP_TIMER_ALWON, | ||
575 | }; | ||
576 | |||
577 | /* pwm timers dev attribute */ | ||
578 | static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = { | ||
579 | .timer_capability = OMAP_TIMER_HAS_PWM, | ||
580 | }; | ||
581 | |||
567 | /* timer1 */ | 582 | /* timer1 */ |
568 | static struct omap_hwmod omap3xxx_timer1_hwmod; | 583 | static struct omap_hwmod omap3xxx_timer1_hwmod; |
569 | 584 | ||
@@ -604,6 +619,7 @@ static struct omap_hwmod omap3xxx_timer1_hwmod = { | |||
604 | .idlest_idle_bit = OMAP3430_ST_GPT1_SHIFT, | 619 | .idlest_idle_bit = OMAP3430_ST_GPT1_SHIFT, |
605 | }, | 620 | }, |
606 | }, | 621 | }, |
622 | .dev_attr = &capability_alwon_dev_attr, | ||
607 | .slaves = omap3xxx_timer1_slaves, | 623 | .slaves = omap3xxx_timer1_slaves, |
608 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer1_slaves), | 624 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer1_slaves), |
609 | .class = &omap3xxx_timer_1ms_hwmod_class, | 625 | .class = &omap3xxx_timer_1ms_hwmod_class, |
@@ -649,6 +665,7 @@ static struct omap_hwmod omap3xxx_timer2_hwmod = { | |||
649 | .idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT, | 665 | .idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT, |
650 | }, | 666 | }, |
651 | }, | 667 | }, |
668 | .dev_attr = &capability_alwon_dev_attr, | ||
652 | .slaves = omap3xxx_timer2_slaves, | 669 | .slaves = omap3xxx_timer2_slaves, |
653 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer2_slaves), | 670 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer2_slaves), |
654 | .class = &omap3xxx_timer_1ms_hwmod_class, | 671 | .class = &omap3xxx_timer_1ms_hwmod_class, |
@@ -694,6 +711,7 @@ static struct omap_hwmod omap3xxx_timer3_hwmod = { | |||
694 | .idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT, | 711 | .idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT, |
695 | }, | 712 | }, |
696 | }, | 713 | }, |
714 | .dev_attr = &capability_alwon_dev_attr, | ||
697 | .slaves = omap3xxx_timer3_slaves, | 715 | .slaves = omap3xxx_timer3_slaves, |
698 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer3_slaves), | 716 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer3_slaves), |
699 | .class = &omap3xxx_timer_hwmod_class, | 717 | .class = &omap3xxx_timer_hwmod_class, |
@@ -739,6 +757,7 @@ static struct omap_hwmod omap3xxx_timer4_hwmod = { | |||
739 | .idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT, | 757 | .idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT, |
740 | }, | 758 | }, |
741 | }, | 759 | }, |
760 | .dev_attr = &capability_alwon_dev_attr, | ||
742 | .slaves = omap3xxx_timer4_slaves, | 761 | .slaves = omap3xxx_timer4_slaves, |
743 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer4_slaves), | 762 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer4_slaves), |
744 | .class = &omap3xxx_timer_hwmod_class, | 763 | .class = &omap3xxx_timer_hwmod_class, |
@@ -784,6 +803,7 @@ static struct omap_hwmod omap3xxx_timer5_hwmod = { | |||
784 | .idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT, | 803 | .idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT, |
785 | }, | 804 | }, |
786 | }, | 805 | }, |
806 | .dev_attr = &capability_alwon_dev_attr, | ||
787 | .slaves = omap3xxx_timer5_slaves, | 807 | .slaves = omap3xxx_timer5_slaves, |
788 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer5_slaves), | 808 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer5_slaves), |
789 | .class = &omap3xxx_timer_hwmod_class, | 809 | .class = &omap3xxx_timer_hwmod_class, |
@@ -829,6 +849,7 @@ static struct omap_hwmod omap3xxx_timer6_hwmod = { | |||
829 | .idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT, | 849 | .idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT, |
830 | }, | 850 | }, |
831 | }, | 851 | }, |
852 | .dev_attr = &capability_alwon_dev_attr, | ||
832 | .slaves = omap3xxx_timer6_slaves, | 853 | .slaves = omap3xxx_timer6_slaves, |
833 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer6_slaves), | 854 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer6_slaves), |
834 | .class = &omap3xxx_timer_hwmod_class, | 855 | .class = &omap3xxx_timer_hwmod_class, |
@@ -874,6 +895,7 @@ static struct omap_hwmod omap3xxx_timer7_hwmod = { | |||
874 | .idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT, | 895 | .idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT, |
875 | }, | 896 | }, |
876 | }, | 897 | }, |
898 | .dev_attr = &capability_alwon_dev_attr, | ||
877 | .slaves = omap3xxx_timer7_slaves, | 899 | .slaves = omap3xxx_timer7_slaves, |
878 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer7_slaves), | 900 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer7_slaves), |
879 | .class = &omap3xxx_timer_hwmod_class, | 901 | .class = &omap3xxx_timer_hwmod_class, |
@@ -919,6 +941,7 @@ static struct omap_hwmod omap3xxx_timer8_hwmod = { | |||
919 | .idlest_idle_bit = OMAP3430_ST_GPT8_SHIFT, | 941 | .idlest_idle_bit = OMAP3430_ST_GPT8_SHIFT, |
920 | }, | 942 | }, |
921 | }, | 943 | }, |
944 | .dev_attr = &capability_pwm_dev_attr, | ||
922 | .slaves = omap3xxx_timer8_slaves, | 945 | .slaves = omap3xxx_timer8_slaves, |
923 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer8_slaves), | 946 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer8_slaves), |
924 | .class = &omap3xxx_timer_hwmod_class, | 947 | .class = &omap3xxx_timer_hwmod_class, |
@@ -964,6 +987,7 @@ static struct omap_hwmod omap3xxx_timer9_hwmod = { | |||
964 | .idlest_idle_bit = OMAP3430_ST_GPT9_SHIFT, | 987 | .idlest_idle_bit = OMAP3430_ST_GPT9_SHIFT, |
965 | }, | 988 | }, |
966 | }, | 989 | }, |
990 | .dev_attr = &capability_pwm_dev_attr, | ||
967 | .slaves = omap3xxx_timer9_slaves, | 991 | .slaves = omap3xxx_timer9_slaves, |
968 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer9_slaves), | 992 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer9_slaves), |
969 | .class = &omap3xxx_timer_hwmod_class, | 993 | .class = &omap3xxx_timer_hwmod_class, |
@@ -1000,6 +1024,7 @@ static struct omap_hwmod omap3xxx_timer10_hwmod = { | |||
1000 | .idlest_idle_bit = OMAP3430_ST_GPT10_SHIFT, | 1024 | .idlest_idle_bit = OMAP3430_ST_GPT10_SHIFT, |
1001 | }, | 1025 | }, |
1002 | }, | 1026 | }, |
1027 | .dev_attr = &capability_pwm_dev_attr, | ||
1003 | .slaves = omap3xxx_timer10_slaves, | 1028 | .slaves = omap3xxx_timer10_slaves, |
1004 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer10_slaves), | 1029 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer10_slaves), |
1005 | .class = &omap3xxx_timer_1ms_hwmod_class, | 1030 | .class = &omap3xxx_timer_1ms_hwmod_class, |
@@ -1036,6 +1061,7 @@ static struct omap_hwmod omap3xxx_timer11_hwmod = { | |||
1036 | .idlest_idle_bit = OMAP3430_ST_GPT11_SHIFT, | 1061 | .idlest_idle_bit = OMAP3430_ST_GPT11_SHIFT, |
1037 | }, | 1062 | }, |
1038 | }, | 1063 | }, |
1064 | .dev_attr = &capability_pwm_dev_attr, | ||
1039 | .slaves = omap3xxx_timer11_slaves, | 1065 | .slaves = omap3xxx_timer11_slaves, |
1040 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer11_slaves), | 1066 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer11_slaves), |
1041 | .class = &omap3xxx_timer_hwmod_class, | 1067 | .class = &omap3xxx_timer_hwmod_class, |
@@ -1085,6 +1111,7 @@ static struct omap_hwmod omap3xxx_timer12_hwmod = { | |||
1085 | .idlest_idle_bit = OMAP3430_ST_GPT12_SHIFT, | 1111 | .idlest_idle_bit = OMAP3430_ST_GPT12_SHIFT, |
1086 | }, | 1112 | }, |
1087 | }, | 1113 | }, |
1114 | .dev_attr = &capability_secure_dev_attr, | ||
1088 | .slaves = omap3xxx_timer12_slaves, | 1115 | .slaves = omap3xxx_timer12_slaves, |
1089 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer12_slaves), | 1116 | .slaves_cnt = ARRAY_SIZE(omap3xxx_timer12_slaves), |
1090 | .class = &omap3xxx_timer_hwmod_class, | 1117 | .class = &omap3xxx_timer_hwmod_class, |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index caaf40911dd4..393afac9caf6 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <plat/mcbsp.h> | 29 | #include <plat/mcbsp.h> |
30 | #include <plat/mmc.h> | 30 | #include <plat/mmc.h> |
31 | #include <plat/i2c.h> | 31 | #include <plat/i2c.h> |
32 | #include <plat/dmtimer.h> | ||
32 | 33 | ||
33 | #include "omap_hwmod_common_data.h" | 34 | #include "omap_hwmod_common_data.h" |
34 | 35 | ||
@@ -4201,6 +4202,16 @@ static struct omap_hwmod_class omap44xx_timer_hwmod_class = { | |||
4201 | .sysc = &omap44xx_timer_sysc, | 4202 | .sysc = &omap44xx_timer_sysc, |
4202 | }; | 4203 | }; |
4203 | 4204 | ||
4205 | /* always-on timers dev attribute */ | ||
4206 | static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = { | ||
4207 | .timer_capability = OMAP_TIMER_ALWON, | ||
4208 | }; | ||
4209 | |||
4210 | /* pwm timers dev attribute */ | ||
4211 | static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = { | ||
4212 | .timer_capability = OMAP_TIMER_HAS_PWM, | ||
4213 | }; | ||
4214 | |||
4204 | /* timer1 */ | 4215 | /* timer1 */ |
4205 | static struct omap_hwmod omap44xx_timer1_hwmod; | 4216 | static struct omap_hwmod omap44xx_timer1_hwmod; |
4206 | static struct omap_hwmod_irq_info omap44xx_timer1_irqs[] = { | 4217 | static struct omap_hwmod_irq_info omap44xx_timer1_irqs[] = { |
@@ -4244,6 +4255,7 @@ static struct omap_hwmod omap44xx_timer1_hwmod = { | |||
4244 | .modulemode = MODULEMODE_SWCTRL, | 4255 | .modulemode = MODULEMODE_SWCTRL, |
4245 | }, | 4256 | }, |
4246 | }, | 4257 | }, |
4258 | .dev_attr = &capability_alwon_dev_attr, | ||
4247 | .slaves = omap44xx_timer1_slaves, | 4259 | .slaves = omap44xx_timer1_slaves, |
4248 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer1_slaves), | 4260 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer1_slaves), |
4249 | }; | 4261 | }; |
@@ -4291,6 +4303,7 @@ static struct omap_hwmod omap44xx_timer2_hwmod = { | |||
4291 | .modulemode = MODULEMODE_SWCTRL, | 4303 | .modulemode = MODULEMODE_SWCTRL, |
4292 | }, | 4304 | }, |
4293 | }, | 4305 | }, |
4306 | .dev_attr = &capability_alwon_dev_attr, | ||
4294 | .slaves = omap44xx_timer2_slaves, | 4307 | .slaves = omap44xx_timer2_slaves, |
4295 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer2_slaves), | 4308 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer2_slaves), |
4296 | }; | 4309 | }; |
@@ -4338,6 +4351,7 @@ static struct omap_hwmod omap44xx_timer3_hwmod = { | |||
4338 | .modulemode = MODULEMODE_SWCTRL, | 4351 | .modulemode = MODULEMODE_SWCTRL, |
4339 | }, | 4352 | }, |
4340 | }, | 4353 | }, |
4354 | .dev_attr = &capability_alwon_dev_attr, | ||
4341 | .slaves = omap44xx_timer3_slaves, | 4355 | .slaves = omap44xx_timer3_slaves, |
4342 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer3_slaves), | 4356 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer3_slaves), |
4343 | }; | 4357 | }; |
@@ -4385,6 +4399,7 @@ static struct omap_hwmod omap44xx_timer4_hwmod = { | |||
4385 | .modulemode = MODULEMODE_SWCTRL, | 4399 | .modulemode = MODULEMODE_SWCTRL, |
4386 | }, | 4400 | }, |
4387 | }, | 4401 | }, |
4402 | .dev_attr = &capability_alwon_dev_attr, | ||
4388 | .slaves = omap44xx_timer4_slaves, | 4403 | .slaves = omap44xx_timer4_slaves, |
4389 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer4_slaves), | 4404 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer4_slaves), |
4390 | }; | 4405 | }; |
@@ -4451,6 +4466,7 @@ static struct omap_hwmod omap44xx_timer5_hwmod = { | |||
4451 | .modulemode = MODULEMODE_SWCTRL, | 4466 | .modulemode = MODULEMODE_SWCTRL, |
4452 | }, | 4467 | }, |
4453 | }, | 4468 | }, |
4469 | .dev_attr = &capability_alwon_dev_attr, | ||
4454 | .slaves = omap44xx_timer5_slaves, | 4470 | .slaves = omap44xx_timer5_slaves, |
4455 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer5_slaves), | 4471 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer5_slaves), |
4456 | }; | 4472 | }; |
@@ -4518,6 +4534,7 @@ static struct omap_hwmod omap44xx_timer6_hwmod = { | |||
4518 | .modulemode = MODULEMODE_SWCTRL, | 4534 | .modulemode = MODULEMODE_SWCTRL, |
4519 | }, | 4535 | }, |
4520 | }, | 4536 | }, |
4537 | .dev_attr = &capability_alwon_dev_attr, | ||
4521 | .slaves = omap44xx_timer6_slaves, | 4538 | .slaves = omap44xx_timer6_slaves, |
4522 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer6_slaves), | 4539 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer6_slaves), |
4523 | }; | 4540 | }; |
@@ -4584,6 +4601,7 @@ static struct omap_hwmod omap44xx_timer7_hwmod = { | |||
4584 | .modulemode = MODULEMODE_SWCTRL, | 4601 | .modulemode = MODULEMODE_SWCTRL, |
4585 | }, | 4602 | }, |
4586 | }, | 4603 | }, |
4604 | .dev_attr = &capability_alwon_dev_attr, | ||
4587 | .slaves = omap44xx_timer7_slaves, | 4605 | .slaves = omap44xx_timer7_slaves, |
4588 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer7_slaves), | 4606 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer7_slaves), |
4589 | }; | 4607 | }; |
@@ -4650,6 +4668,7 @@ static struct omap_hwmod omap44xx_timer8_hwmod = { | |||
4650 | .modulemode = MODULEMODE_SWCTRL, | 4668 | .modulemode = MODULEMODE_SWCTRL, |
4651 | }, | 4669 | }, |
4652 | }, | 4670 | }, |
4671 | .dev_attr = &capability_pwm_dev_attr, | ||
4653 | .slaves = omap44xx_timer8_slaves, | 4672 | .slaves = omap44xx_timer8_slaves, |
4654 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer8_slaves), | 4673 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer8_slaves), |
4655 | }; | 4674 | }; |
@@ -4697,6 +4716,7 @@ static struct omap_hwmod omap44xx_timer9_hwmod = { | |||
4697 | .modulemode = MODULEMODE_SWCTRL, | 4716 | .modulemode = MODULEMODE_SWCTRL, |
4698 | }, | 4717 | }, |
4699 | }, | 4718 | }, |
4719 | .dev_attr = &capability_pwm_dev_attr, | ||
4700 | .slaves = omap44xx_timer9_slaves, | 4720 | .slaves = omap44xx_timer9_slaves, |
4701 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer9_slaves), | 4721 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer9_slaves), |
4702 | }; | 4722 | }; |
@@ -4744,6 +4764,7 @@ static struct omap_hwmod omap44xx_timer10_hwmod = { | |||
4744 | .modulemode = MODULEMODE_SWCTRL, | 4764 | .modulemode = MODULEMODE_SWCTRL, |
4745 | }, | 4765 | }, |
4746 | }, | 4766 | }, |
4767 | .dev_attr = &capability_pwm_dev_attr, | ||
4747 | .slaves = omap44xx_timer10_slaves, | 4768 | .slaves = omap44xx_timer10_slaves, |
4748 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer10_slaves), | 4769 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer10_slaves), |
4749 | }; | 4770 | }; |
@@ -4791,6 +4812,7 @@ static struct omap_hwmod omap44xx_timer11_hwmod = { | |||
4791 | .modulemode = MODULEMODE_SWCTRL, | 4812 | .modulemode = MODULEMODE_SWCTRL, |
4792 | }, | 4813 | }, |
4793 | }, | 4814 | }, |
4815 | .dev_attr = &capability_pwm_dev_attr, | ||
4794 | .slaves = omap44xx_timer11_slaves, | 4816 | .slaves = omap44xx_timer11_slaves, |
4795 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer11_slaves), | 4817 | .slaves_cnt = ARRAY_SIZE(omap44xx_timer11_slaves), |
4796 | }; | 4818 | }; |
diff --git a/arch/arm/mach-omap2/omap_l3_noc.c b/arch/arm/mach-omap2/omap_l3_noc.c index 7b9f1909ddb2..07a3d3ede768 100644 --- a/arch/arm/mach-omap2/omap_l3_noc.c +++ b/arch/arm/mach-omap2/omap_l3_noc.c | |||
@@ -1,25 +1,25 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP4XXX L3 Interconnect error handling driver | 2 | * OMAP4XXX L3 Interconnect error handling driver |
3 | * | 3 | * |
4 | * Copyright (C) 2011 Texas Corporation | 4 | * Copyright (C) 2011 Texas Corporation |
5 | * Santosh Shilimkar <santosh.shilimkar@ti.com> | 5 | * Santosh Shilimkar <santosh.shilimkar@ti.com> |
6 | * Sricharan <r.sricharan@ti.com> | 6 | * Sricharan <r.sricharan@ti.com> |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or | 10 | * the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. | 11 | * (at your option) any later version. |
12 | * | 12 | * |
13 | * This program is distributed in the hope that it will be useful, | 13 | * This program is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. | 16 | * GNU General Public License for more details. |
17 | * | 17 | * |
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 | 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
21 | * USA | 21 | * USA |
22 | */ | 22 | */ |
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
@@ -55,12 +55,12 @@ | |||
55 | static irqreturn_t l3_interrupt_handler(int irq, void *_l3) | 55 | static irqreturn_t l3_interrupt_handler(int irq, void *_l3) |
56 | { | 56 | { |
57 | 57 | ||
58 | struct omap4_l3 *l3 = _l3; | 58 | struct omap4_l3 *l3 = _l3; |
59 | int inttype, i, j; | 59 | int inttype, i, k; |
60 | int err_src = 0; | 60 | int err_src = 0; |
61 | u32 std_err_main_addr, std_err_main, err_reg; | 61 | u32 std_err_main, err_reg, clear, masterid; |
62 | u32 base, slave_addr, clear; | 62 | void __iomem *base, *l3_targ_base; |
63 | char *source_name; | 63 | char *target_name, *master_name = "UN IDENTIFIED"; |
64 | 64 | ||
65 | /* Get the Type of interrupt */ | 65 | /* Get the Type of interrupt */ |
66 | inttype = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR; | 66 | inttype = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR; |
@@ -70,43 +70,50 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3) | |||
70 | * Read the regerr register of the clock domain | 70 | * Read the regerr register of the clock domain |
71 | * to determine the source | 71 | * to determine the source |
72 | */ | 72 | */ |
73 | base = (u32)l3->l3_base[i]; | 73 | base = l3->l3_base[i]; |
74 | err_reg = readl(base + l3_flagmux[i] + (inttype << 3)); | 74 | err_reg = __raw_readl(base + l3_flagmux[i] + |
75 | + L3_FLAGMUX_REGERR0 + (inttype << 3)); | ||
75 | 76 | ||
76 | /* Get the corresponding error and analyse */ | 77 | /* Get the corresponding error and analyse */ |
77 | if (err_reg) { | 78 | if (err_reg) { |
78 | /* Identify the source from control status register */ | 79 | /* Identify the source from control status register */ |
79 | for (j = 0; !(err_reg & (1 << j)); j++) | 80 | err_src = __ffs(err_reg); |
80 | ; | ||
81 | 81 | ||
82 | err_src = j; | ||
83 | /* Read the stderrlog_main_source from clk domain */ | 82 | /* Read the stderrlog_main_source from clk domain */ |
84 | std_err_main_addr = base + *(l3_targ[i] + err_src); | 83 | l3_targ_base = base + *(l3_targ[i] + err_src); |
85 | std_err_main = readl(std_err_main_addr); | 84 | std_err_main = __raw_readl(l3_targ_base + |
85 | L3_TARG_STDERRLOG_MAIN); | ||
86 | masterid = __raw_readl(l3_targ_base + | ||
87 | L3_TARG_STDERRLOG_MSTADDR); | ||
86 | 88 | ||
87 | switch (std_err_main & CUSTOM_ERROR) { | 89 | switch (std_err_main & CUSTOM_ERROR) { |
88 | case STANDARD_ERROR: | 90 | case STANDARD_ERROR: |
89 | source_name = | 91 | target_name = |
90 | l3_targ_stderrlog_main_name[i][err_src]; | 92 | l3_targ_inst_name[i][err_src]; |
91 | 93 | WARN(true, "L3 standard error: TARGET:%s at address 0x%x\n", | |
92 | slave_addr = std_err_main_addr + | 94 | target_name, |
93 | L3_SLAVE_ADDRESS_OFFSET; | 95 | __raw_readl(l3_targ_base + |
94 | WARN(true, "L3 standard error: SOURCE:%s at address 0x%x\n", | 96 | L3_TARG_STDERRLOG_SLVOFSLSB)); |
95 | source_name, readl(slave_addr)); | ||
96 | /* clear the std error log*/ | 97 | /* clear the std error log*/ |
97 | clear = std_err_main | CLEAR_STDERR_LOG; | 98 | clear = std_err_main | CLEAR_STDERR_LOG; |
98 | writel(clear, std_err_main_addr); | 99 | writel(clear, l3_targ_base + |
100 | L3_TARG_STDERRLOG_MAIN); | ||
99 | break; | 101 | break; |
100 | 102 | ||
101 | case CUSTOM_ERROR: | 103 | case CUSTOM_ERROR: |
102 | source_name = | 104 | target_name = |
103 | l3_targ_stderrlog_main_name[i][err_src]; | 105 | l3_targ_inst_name[i][err_src]; |
104 | 106 | for (k = 0; k < NUM_OF_L3_MASTERS; k++) { | |
105 | WARN(true, "CUSTOM SRESP error with SOURCE:%s\n", | 107 | if (masterid == l3_masters[k].id) |
106 | source_name); | 108 | master_name = |
109 | l3_masters[k].name; | ||
110 | } | ||
111 | WARN(true, "L3 custom error: MASTER:%s TARGET:%s\n", | ||
112 | master_name, target_name); | ||
107 | /* clear the std error log*/ | 113 | /* clear the std error log*/ |
108 | clear = std_err_main | CLEAR_STDERR_LOG; | 114 | clear = std_err_main | CLEAR_STDERR_LOG; |
109 | writel(clear, std_err_main_addr); | 115 | writel(clear, l3_targ_base + |
116 | L3_TARG_STDERRLOG_MAIN); | ||
110 | break; | 117 | break; |
111 | 118 | ||
112 | default: | 119 | default: |
@@ -122,10 +129,9 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3) | |||
122 | 129 | ||
123 | static int __init omap4_l3_probe(struct platform_device *pdev) | 130 | static int __init omap4_l3_probe(struct platform_device *pdev) |
124 | { | 131 | { |
125 | static struct omap4_l3 *l3; | 132 | static struct omap4_l3 *l3; |
126 | struct resource *res; | 133 | struct resource *res; |
127 | int ret; | 134 | int ret; |
128 | int irq; | ||
129 | 135 | ||
130 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); | 136 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); |
131 | if (!l3) | 137 | if (!l3) |
@@ -177,27 +183,25 @@ static int __init omap4_l3_probe(struct platform_device *pdev) | |||
177 | /* | 183 | /* |
178 | * Setup interrupt Handlers | 184 | * Setup interrupt Handlers |
179 | */ | 185 | */ |
180 | irq = platform_get_irq(pdev, 0); | 186 | l3->debug_irq = platform_get_irq(pdev, 0); |
181 | ret = request_irq(irq, | 187 | ret = request_irq(l3->debug_irq, |
182 | l3_interrupt_handler, | 188 | l3_interrupt_handler, |
183 | IRQF_DISABLED, "l3-dbg-irq", l3); | 189 | IRQF_DISABLED, "l3-dbg-irq", l3); |
184 | if (ret) { | 190 | if (ret) { |
185 | pr_crit("L3: request_irq failed to register for 0x%x\n", | 191 | pr_crit("L3: request_irq failed to register for 0x%x\n", |
186 | OMAP44XX_IRQ_L3_DBG); | 192 | OMAP44XX_IRQ_L3_DBG); |
187 | goto err3; | 193 | goto err3; |
188 | } | 194 | } |
189 | l3->debug_irq = irq; | ||
190 | 195 | ||
191 | irq = platform_get_irq(pdev, 1); | 196 | l3->app_irq = platform_get_irq(pdev, 1); |
192 | ret = request_irq(irq, | 197 | ret = request_irq(l3->app_irq, |
193 | l3_interrupt_handler, | 198 | l3_interrupt_handler, |
194 | IRQF_DISABLED, "l3-app-irq", l3); | 199 | IRQF_DISABLED, "l3-app-irq", l3); |
195 | if (ret) { | 200 | if (ret) { |
196 | pr_crit("L3: request_irq failed to register for 0x%x\n", | 201 | pr_crit("L3: request_irq failed to register for 0x%x\n", |
197 | OMAP44XX_IRQ_L3_APP); | 202 | OMAP44XX_IRQ_L3_APP); |
198 | goto err4; | 203 | goto err4; |
199 | } | 204 | } |
200 | l3->app_irq = irq; | ||
201 | 205 | ||
202 | return 0; | 206 | return 0; |
203 | 207 | ||
@@ -216,7 +220,7 @@ err0: | |||
216 | 220 | ||
217 | static int __exit omap4_l3_remove(struct platform_device *pdev) | 221 | static int __exit omap4_l3_remove(struct platform_device *pdev) |
218 | { | 222 | { |
219 | struct omap4_l3 *l3 = platform_get_drvdata(pdev); | 223 | struct omap4_l3 *l3 = platform_get_drvdata(pdev); |
220 | 224 | ||
221 | free_irq(l3->app_irq, l3); | 225 | free_irq(l3->app_irq, l3); |
222 | free_irq(l3->debug_irq, l3); | 226 | free_irq(l3->debug_irq, l3); |
@@ -229,9 +233,9 @@ static int __exit omap4_l3_remove(struct platform_device *pdev) | |||
229 | } | 233 | } |
230 | 234 | ||
231 | static struct platform_driver omap4_l3_driver = { | 235 | static struct platform_driver omap4_l3_driver = { |
232 | .remove = __exit_p(omap4_l3_remove), | 236 | .remove = __exit_p(omap4_l3_remove), |
233 | .driver = { | 237 | .driver = { |
234 | .name = "omap_l3_noc", | 238 | .name = "omap_l3_noc", |
235 | }, | 239 | }, |
236 | }; | 240 | }; |
237 | 241 | ||
diff --git a/arch/arm/mach-omap2/omap_l3_noc.h b/arch/arm/mach-omap2/omap_l3_noc.h index 359b83348aed..90b50984cd2e 100644 --- a/arch/arm/mach-omap2/omap_l3_noc.h +++ b/arch/arm/mach-omap2/omap_l3_noc.h | |||
@@ -1,132 +1,162 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP4XXX L3 Interconnect error handling driver header | 2 | * OMAP4XXX L3 Interconnect error handling driver header |
3 | * | 3 | * |
4 | * Copyright (C) 2011 Texas Corporation | 4 | * Copyright (C) 2011 Texas Corporation |
5 | * Santosh Shilimkar <santosh.shilimkar@ti.com> | 5 | * Santosh Shilimkar <santosh.shilimkar@ti.com> |
6 | * sricharan <r.sricharan@ti.com> | 6 | * sricharan <r.sricharan@ti.com> |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or | 10 | * the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. | 11 | * (at your option) any later version. |
12 | * | 12 | * |
13 | * This program is distributed in the hope that it will be useful, | 13 | * This program is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. | 16 | * GNU General Public License for more details. |
17 | * | 17 | * |
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 | 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
21 | * USA | 21 | * USA |
22 | */ | 22 | */ |
23 | #ifndef __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H | 23 | #ifndef __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H |
24 | #define __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H | 24 | #define __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H |
25 | 25 | ||
26 | /* | ||
27 | * L3 register offsets | ||
28 | */ | ||
29 | #define L3_MODULES 3 | 26 | #define L3_MODULES 3 |
30 | #define CLEAR_STDERR_LOG (1 << 31) | 27 | #define CLEAR_STDERR_LOG (1 << 31) |
31 | #define CUSTOM_ERROR 0x2 | 28 | #define CUSTOM_ERROR 0x2 |
32 | #define STANDARD_ERROR 0x0 | 29 | #define STANDARD_ERROR 0x0 |
33 | #define INBAND_ERROR 0x0 | 30 | #define INBAND_ERROR 0x0 |
34 | #define EMIF_KERRLOG_OFFSET 0x10 | ||
35 | #define L3_SLAVE_ADDRESS_OFFSET 0x14 | ||
36 | #define LOGICAL_ADDR_ERRORLOG 0x4 | ||
37 | #define L3_APPLICATION_ERROR 0x0 | 31 | #define L3_APPLICATION_ERROR 0x0 |
38 | #define L3_DEBUG_ERROR 0x1 | 32 | #define L3_DEBUG_ERROR 0x1 |
39 | 33 | ||
40 | u32 l3_flagmux[L3_MODULES] = { | 34 | /* L3 TARG register offsets */ |
41 | 0x50C, | 35 | #define L3_TARG_STDERRLOG_MAIN 0x48 |
42 | 0x100C, | 36 | #define L3_TARG_STDERRLOG_SLVOFSLSB 0x5c |
43 | 0X020C | 37 | #define L3_TARG_STDERRLOG_MSTADDR 0x68 |
38 | #define L3_FLAGMUX_REGERR0 0xc | ||
39 | |||
40 | #define NUM_OF_L3_MASTERS (sizeof(l3_masters)/sizeof(l3_masters[0])) | ||
41 | |||
42 | static u32 l3_flagmux[L3_MODULES] = { | ||
43 | 0x500, | ||
44 | 0x1000, | ||
45 | 0X0200 | ||
44 | }; | 46 | }; |
45 | 47 | ||
46 | /* | 48 | /* L3 Target standard Error register offsets */ |
47 | * L3 Target standard Error register offsets | 49 | static u32 l3_targ_inst_clk1[] = { |
48 | */ | 50 | 0x100, /* DMM1 */ |
49 | u32 l3_targ_stderrlog_main_clk1[] = { | 51 | 0x200, /* DMM2 */ |
50 | 0x148, /* DMM1 */ | 52 | 0x300, /* ABE */ |
51 | 0x248, /* DMM2 */ | 53 | 0x400, /* L4CFG */ |
52 | 0x348, /* ABE */ | 54 | 0x600 /* CLK2 PWR DISC */ |
53 | 0x448, /* L4CFG */ | ||
54 | 0x648 /* CLK2 PWR DISC */ | ||
55 | }; | 55 | }; |
56 | 56 | ||
57 | u32 l3_targ_stderrlog_main_clk2[] = { | 57 | static u32 l3_targ_inst_clk2[] = { |
58 | 0x548, /* CORTEX M3 */ | 58 | 0x500, /* CORTEX M3 */ |
59 | 0x348, /* DSS */ | 59 | 0x300, /* DSS */ |
60 | 0x148, /* GPMC */ | 60 | 0x100, /* GPMC */ |
61 | 0x448, /* ISS */ | 61 | 0x400, /* ISS */ |
62 | 0x748, /* IVAHD */ | 62 | 0x700, /* IVAHD */ |
63 | 0xD48, /* missing in TRM corresponds to AES1*/ | 63 | 0xD00, /* missing in TRM corresponds to AES1*/ |
64 | 0x948, /* L4 PER0*/ | 64 | 0x900, /* L4 PER0*/ |
65 | 0x248, /* OCMRAM */ | 65 | 0x200, /* OCMRAM */ |
66 | 0x148, /* missing in TRM corresponds to GPMC sERROR*/ | 66 | 0x100, /* missing in TRM corresponds to GPMC sERROR*/ |
67 | 0x648, /* SGX */ | 67 | 0x600, /* SGX */ |
68 | 0x848, /* SL2 */ | 68 | 0x800, /* SL2 */ |
69 | 0x1648, /* C2C */ | 69 | 0x1600, /* C2C */ |
70 | 0x1148, /* missing in TRM corresponds PWR DISC CLK1*/ | 70 | 0x1100, /* missing in TRM corresponds PWR DISC CLK1*/ |
71 | 0xF48, /* missing in TRM corrsponds to SHA1*/ | 71 | 0xF00, /* missing in TRM corrsponds to SHA1*/ |
72 | 0xE48, /* missing in TRM corresponds to AES2*/ | 72 | 0xE00, /* missing in TRM corresponds to AES2*/ |
73 | 0xC48, /* L4 PER3 */ | 73 | 0xC00, /* L4 PER3 */ |
74 | 0xA48, /* L4 PER1*/ | 74 | 0xA00, /* L4 PER1*/ |
75 | 0xB48 /* L4 PER2*/ | 75 | 0xB00 /* L4 PER2*/ |
76 | }; | 76 | }; |
77 | 77 | ||
78 | u32 l3_targ_stderrlog_main_clk3[] = { | 78 | static u32 l3_targ_inst_clk3[] = { |
79 | 0x0148 /* EMUSS */ | 79 | 0x0100 /* EMUSS */ |
80 | }; | 80 | }; |
81 | 81 | ||
82 | char *l3_targ_stderrlog_main_name[L3_MODULES][18] = { | 82 | static struct l3_masters_data { |
83 | u32 id; | ||
84 | char name[10]; | ||
85 | } l3_masters[] = { | ||
86 | { 0x0 , "MPU"}, | ||
87 | { 0x10, "CS_ADP"}, | ||
88 | { 0x14, "xxx"}, | ||
89 | { 0x20, "DSP"}, | ||
90 | { 0x30, "IVAHD"}, | ||
91 | { 0x40, "ISS"}, | ||
92 | { 0x44, "DucatiM3"}, | ||
93 | { 0x48, "FaceDetect"}, | ||
94 | { 0x50, "SDMA_Rd"}, | ||
95 | { 0x54, "SDMA_Wr"}, | ||
96 | { 0x58, "xxx"}, | ||
97 | { 0x5C, "xxx"}, | ||
98 | { 0x60, "SGX"}, | ||
99 | { 0x70, "DSS"}, | ||
100 | { 0x80, "C2C"}, | ||
101 | { 0x88, "xxx"}, | ||
102 | { 0x8C, "xxx"}, | ||
103 | { 0x90, "HSI"}, | ||
104 | { 0xA0, "MMC1"}, | ||
105 | { 0xA4, "MMC2"}, | ||
106 | { 0xA8, "MMC6"}, | ||
107 | { 0xB0, "UNIPRO1"}, | ||
108 | { 0xC0, "USBHOSTHS"}, | ||
109 | { 0xC4, "USBOTGHS"}, | ||
110 | { 0xC8, "USBHOSTFS"} | ||
111 | }; | ||
112 | |||
113 | static char *l3_targ_inst_name[L3_MODULES][18] = { | ||
83 | { | 114 | { |
84 | "DMM1", | 115 | "DMM1", |
85 | "DMM2", | 116 | "DMM2", |
86 | "ABE", | 117 | "ABE", |
87 | "L4CFG", | 118 | "L4CFG", |
88 | "CLK2 PWR DISC", | 119 | "CLK2 PWR DISC", |
89 | }, | 120 | }, |
90 | { | 121 | { |
91 | "CORTEX M3" , | 122 | "CORTEX M3" , |
92 | "DSS ", | 123 | "DSS ", |
93 | "GPMC ", | 124 | "GPMC ", |
94 | "ISS ", | 125 | "ISS ", |
95 | "IVAHD ", | 126 | "IVAHD ", |
96 | "AES1", | 127 | "AES1", |
97 | "L4 PER0", | 128 | "L4 PER0", |
98 | "OCMRAM ", | 129 | "OCMRAM ", |
99 | "GPMC sERROR", | 130 | "GPMC sERROR", |
100 | "SGX ", | 131 | "SGX ", |
101 | "SL2 ", | 132 | "SL2 ", |
102 | "C2C ", | 133 | "C2C ", |
103 | "PWR DISC CLK1", | 134 | "PWR DISC CLK1", |
104 | "SHA1", | 135 | "SHA1", |
105 | "AES2", | 136 | "AES2", |
106 | "L4 PER3", | 137 | "L4 PER3", |
107 | "L4 PER1", | 138 | "L4 PER1", |
108 | "L4 PER2", | 139 | "L4 PER2", |
109 | }, | 140 | }, |
110 | { | 141 | { |
111 | "EMUSS", | 142 | "EMUSS", |
112 | }, | 143 | }, |
113 | }; | 144 | }; |
114 | 145 | ||
115 | u32 *l3_targ[L3_MODULES] = { | 146 | static u32 *l3_targ[L3_MODULES] = { |
116 | l3_targ_stderrlog_main_clk1, | 147 | l3_targ_inst_clk1, |
117 | l3_targ_stderrlog_main_clk2, | 148 | l3_targ_inst_clk2, |
118 | l3_targ_stderrlog_main_clk3, | 149 | l3_targ_inst_clk3, |
119 | }; | 150 | }; |
120 | 151 | ||
121 | struct omap4_l3 { | 152 | struct omap4_l3 { |
122 | struct device *dev; | 153 | struct device *dev; |
123 | struct clk *ick; | 154 | struct clk *ick; |
124 | 155 | ||
125 | /* memory base */ | 156 | /* memory base */ |
126 | void __iomem *l3_base[4]; | 157 | void __iomem *l3_base[L3_MODULES]; |
127 | 158 | ||
128 | int debug_irq; | 159 | int debug_irq; |
129 | int app_irq; | 160 | int app_irq; |
130 | }; | 161 | }; |
131 | |||
132 | #endif | 162 | #endif |
diff --git a/arch/arm/mach-omap2/omap_l3_smx.c b/arch/arm/mach-omap2/omap_l3_smx.c index 873c0e33b512..a05a62f9ee5b 100644 --- a/arch/arm/mach-omap2/omap_l3_smx.c +++ b/arch/arm/mach-omap2/omap_l3_smx.c | |||
@@ -1,26 +1,26 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP3XXX L3 Interconnect Driver | 2 | * OMAP3XXX L3 Interconnect Driver |
3 | * | 3 | * |
4 | * Copyright (C) 2011 Texas Corporation | 4 | * Copyright (C) 2011 Texas Corporation |
5 | * Felipe Balbi <balbi@ti.com> | 5 | * Felipe Balbi <balbi@ti.com> |
6 | * Santosh Shilimkar <santosh.shilimkar@ti.com> | 6 | * Santosh Shilimkar <santosh.shilimkar@ti.com> |
7 | * Sricharan <r.sricharan@ti.com> | 7 | * Sricharan <r.sricharan@ti.com> |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
11 | * the Free Software Foundation; either version 2 of the License, or | 11 | * the Free Software Foundation; either version 2 of the License, or |
12 | * (at your option) any later version. | 12 | * (at your option) any later version. |
13 | * | 13 | * |
14 | * This program is distributed in the hope that it will be useful, | 14 | * This program is distributed in the hope that it will be useful, |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | * GNU General Public License for more details. | 17 | * GNU General Public License for more details. |
18 | * | 18 | * |
19 | * You should have received a copy of the GNU General Public License | 19 | * You should have received a copy of the GNU General Public License |
20 | * along with this program; if not, write to the Free Software | 20 | * along with this program; if not, write to the Free Software |
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
22 | * USA | 22 | * USA |
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
@@ -135,7 +135,7 @@ static char *omap3_l3_initiator_string(u8 initid) | |||
135 | } | 135 | } |
136 | } | 136 | } |
137 | 137 | ||
138 | /** | 138 | /* |
139 | * omap3_l3_block_irq - handles a register block's irq | 139 | * omap3_l3_block_irq - handles a register block's irq |
140 | * @l3: struct omap3_l3 * | 140 | * @l3: struct omap3_l3 * |
141 | * @base: register block base address | 141 | * @base: register block base address |
@@ -150,30 +150,29 @@ static char *omap3_l3_initiator_string(u8 initid) | |||
150 | static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3, | 150 | static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3, |
151 | u64 error, int error_addr) | 151 | u64 error, int error_addr) |
152 | { | 152 | { |
153 | u8 code = omap3_l3_decode_error_code(error); | 153 | u8 code = omap3_l3_decode_error_code(error); |
154 | u8 initid = omap3_l3_decode_initid(error); | 154 | u8 initid = omap3_l3_decode_initid(error); |
155 | u8 multi = error & L3_ERROR_LOG_MULTI; | 155 | u8 multi = error & L3_ERROR_LOG_MULTI; |
156 | u32 address = omap3_l3_decode_addr(error_addr); | 156 | u32 address = omap3_l3_decode_addr(error_addr); |
157 | 157 | ||
158 | WARN(true, "%s seen by %s %s at address %x\n", | 158 | WARN(true, "%s seen by %s %s at address %x\n", |
159 | omap3_l3_code_string(code), | 159 | omap3_l3_code_string(code), |
160 | omap3_l3_initiator_string(initid), | 160 | omap3_l3_initiator_string(initid), |
161 | multi ? "Multiple Errors" : "", | 161 | multi ? "Multiple Errors" : "", address); |
162 | address); | ||
163 | 162 | ||
164 | return IRQ_HANDLED; | 163 | return IRQ_HANDLED; |
165 | } | 164 | } |
166 | 165 | ||
167 | static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) | 166 | static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) |
168 | { | 167 | { |
169 | struct omap3_l3 *l3 = _l3; | 168 | struct omap3_l3 *l3 = _l3; |
170 | u64 status, clear; | 169 | u64 status, clear; |
171 | u64 error; | 170 | u64 error; |
172 | u64 error_addr; | 171 | u64 error_addr; |
173 | u64 err_source = 0; | 172 | u64 err_source = 0; |
174 | void __iomem *base; | 173 | void __iomem *base; |
175 | int int_type; | 174 | int int_type; |
176 | irqreturn_t ret = IRQ_NONE; | 175 | irqreturn_t ret = IRQ_NONE; |
177 | 176 | ||
178 | int_type = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR; | 177 | int_type = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR; |
179 | if (!int_type) { | 178 | if (!int_type) { |
@@ -191,14 +190,12 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) | |||
191 | } | 190 | } |
192 | 191 | ||
193 | /* identify the error source */ | 192 | /* identify the error source */ |
194 | for (err_source = 0; !(status & (1 << err_source)); err_source++) | 193 | err_source = __ffs(status); |
195 | ; | ||
196 | 194 | ||
197 | base = l3->rt + *(omap3_l3_bases[int_type] + err_source); | 195 | base = l3->rt + omap3_l3_bases[int_type][err_source]; |
198 | error = omap3_l3_readll(base, L3_ERROR_LOG); | 196 | error = omap3_l3_readll(base, L3_ERROR_LOG); |
199 | if (error) { | 197 | if (error) { |
200 | error_addr = omap3_l3_readll(base, L3_ERROR_LOG_ADDR); | 198 | error_addr = omap3_l3_readll(base, L3_ERROR_LOG_ADDR); |
201 | |||
202 | ret |= omap3_l3_block_irq(l3, error, error_addr); | 199 | ret |= omap3_l3_block_irq(l3, error, error_addr); |
203 | } | 200 | } |
204 | 201 | ||
@@ -215,9 +212,9 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) | |||
215 | 212 | ||
216 | static int __init omap3_l3_probe(struct platform_device *pdev) | 213 | static int __init omap3_l3_probe(struct platform_device *pdev) |
217 | { | 214 | { |
218 | struct omap3_l3 *l3; | 215 | struct omap3_l3 *l3; |
219 | struct resource *res; | 216 | struct resource *res; |
220 | int ret; | 217 | int ret; |
221 | 218 | ||
222 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); | 219 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); |
223 | if (!l3) | 220 | if (!l3) |
diff --git a/arch/arm/mach-omap2/omap_l3_smx.h b/arch/arm/mach-omap2/omap_l3_smx.h index ba2ed9a850cc..4f3cebca4179 100644 --- a/arch/arm/mach-omap2/omap_l3_smx.h +++ b/arch/arm/mach-omap2/omap_l3_smx.h | |||
@@ -1,26 +1,26 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP3XXX L3 Interconnect Driver header | 2 | * OMAP3XXX L3 Interconnect Driver header |
3 | * | 3 | * |
4 | * Copyright (C) 2011 Texas Corporation | 4 | * Copyright (C) 2011 Texas Corporation |
5 | * Felipe Balbi <balbi@ti.com> | 5 | * Felipe Balbi <balbi@ti.com> |
6 | * Santosh Shilimkar <santosh.shilimkar@ti.com> | 6 | * Santosh Shilimkar <santosh.shilimkar@ti.com> |
7 | * sricharan <r.sricharan@ti.com> | 7 | * sricharan <r.sricharan@ti.com> |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
11 | * the Free Software Foundation; either version 2 of the License, or | 11 | * the Free Software Foundation; either version 2 of the License, or |
12 | * (at your option) any later version. | 12 | * (at your option) any later version. |
13 | * | 13 | * |
14 | * This program is distributed in the hope that it will be useful, | 14 | * This program is distributed in the hope that it will be useful, |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | * GNU General Public License for more details. | 17 | * GNU General Public License for more details. |
18 | * | 18 | * |
19 | * You should have received a copy of the GNU General Public License | 19 | * You should have received a copy of the GNU General Public License |
20 | * along with this program; if not, write to the Free Software | 20 | * along with this program; if not, write to the Free Software |
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
22 | * USA | 22 | * USA |
23 | */ | 23 | */ |
24 | #ifndef __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H | 24 | #ifndef __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H |
25 | #define __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H | 25 | #define __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H |
26 | 26 | ||
@@ -40,7 +40,7 @@ | |||
40 | #define L3_SI_CONTROL 0x020 | 40 | #define L3_SI_CONTROL 0x020 |
41 | #define L3_SI_FLAG_STATUS_0 0x510 | 41 | #define L3_SI_FLAG_STATUS_0 0x510 |
42 | 42 | ||
43 | const u64 shift = 1; | 43 | static const u64 shift = 1; |
44 | 44 | ||
45 | #define L3_STATUS_0_MPUIA_BRST (shift << 0) | 45 | #define L3_STATUS_0_MPUIA_BRST (shift << 0) |
46 | #define L3_STATUS_0_MPUIA_RSP (shift << 1) | 46 | #define L3_STATUS_0_MPUIA_RSP (shift << 1) |
@@ -78,32 +78,32 @@ const u64 shift = 1; | |||
78 | #define L3_STATUS_0_L4EMUTA_REQ (shift << 60) | 78 | #define L3_STATUS_0_L4EMUTA_REQ (shift << 60) |
79 | #define L3_STATUS_0_MAD2DTA_REQ (shift << 61) | 79 | #define L3_STATUS_0_MAD2DTA_REQ (shift << 61) |
80 | 80 | ||
81 | #define L3_STATUS_0_TIMEOUT_MASK (L3_STATUS_0_MPUIA_BRST \ | 81 | #define L3_STATUS_0_TIMEOUT_MASK (L3_STATUS_0_MPUIA_BRST \ |
82 | | L3_STATUS_0_MPUIA_RSP \ | 82 | | L3_STATUS_0_MPUIA_RSP \ |
83 | | L3_STATUS_0_IVAIA_BRST \ | 83 | | L3_STATUS_0_IVAIA_BRST \ |
84 | | L3_STATUS_0_IVAIA_RSP \ | 84 | | L3_STATUS_0_IVAIA_RSP \ |
85 | | L3_STATUS_0_SGXIA_BRST \ | 85 | | L3_STATUS_0_SGXIA_BRST \ |
86 | | L3_STATUS_0_SGXIA_RSP \ | 86 | | L3_STATUS_0_SGXIA_RSP \ |
87 | | L3_STATUS_0_CAMIA_BRST \ | 87 | | L3_STATUS_0_CAMIA_BRST \ |
88 | | L3_STATUS_0_CAMIA_RSP \ | 88 | | L3_STATUS_0_CAMIA_RSP \ |
89 | | L3_STATUS_0_DISPIA_BRST \ | 89 | | L3_STATUS_0_DISPIA_BRST \ |
90 | | L3_STATUS_0_DISPIA_RSP \ | 90 | | L3_STATUS_0_DISPIA_RSP \ |
91 | | L3_STATUS_0_DMARDIA_BRST \ | 91 | | L3_STATUS_0_DMARDIA_BRST \ |
92 | | L3_STATUS_0_DMARDIA_RSP \ | 92 | | L3_STATUS_0_DMARDIA_RSP \ |
93 | | L3_STATUS_0_DMAWRIA_BRST \ | 93 | | L3_STATUS_0_DMAWRIA_BRST \ |
94 | | L3_STATUS_0_DMAWRIA_RSP \ | 94 | | L3_STATUS_0_DMAWRIA_RSP \ |
95 | | L3_STATUS_0_USBOTGIA_BRST \ | 95 | | L3_STATUS_0_USBOTGIA_BRST \ |
96 | | L3_STATUS_0_USBOTGIA_RSP \ | 96 | | L3_STATUS_0_USBOTGIA_RSP \ |
97 | | L3_STATUS_0_USBHOSTIA_BRST \ | 97 | | L3_STATUS_0_USBHOSTIA_BRST \ |
98 | | L3_STATUS_0_SMSTA_REQ \ | 98 | | L3_STATUS_0_SMSTA_REQ \ |
99 | | L3_STATUS_0_GPMCTA_REQ \ | 99 | | L3_STATUS_0_GPMCTA_REQ \ |
100 | | L3_STATUS_0_OCMRAMTA_REQ \ | 100 | | L3_STATUS_0_OCMRAMTA_REQ \ |
101 | | L3_STATUS_0_OCMROMTA_REQ \ | 101 | | L3_STATUS_0_OCMROMTA_REQ \ |
102 | | L3_STATUS_0_IVATA_REQ \ | 102 | | L3_STATUS_0_IVATA_REQ \ |
103 | | L3_STATUS_0_SGXTA_REQ \ | 103 | | L3_STATUS_0_SGXTA_REQ \ |
104 | | L3_STATUS_0_L4CORETA_REQ \ | 104 | | L3_STATUS_0_L4CORETA_REQ \ |
105 | | L3_STATUS_0_L4PERTA_REQ \ | 105 | | L3_STATUS_0_L4PERTA_REQ \ |
106 | | L3_STATUS_0_L4EMUTA_REQ \ | 106 | | L3_STATUS_0_L4EMUTA_REQ \ |
107 | | L3_STATUS_0_MAD2DTA_REQ) | 107 | | L3_STATUS_0_MAD2DTA_REQ) |
108 | 108 | ||
109 | #define L3_SI_FLAG_STATUS_1 0x530 | 109 | #define L3_SI_FLAG_STATUS_1 0x530 |
@@ -137,19 +137,19 @@ const u64 shift = 1; | |||
137 | 137 | ||
138 | enum omap3_l3_initiator_id { | 138 | enum omap3_l3_initiator_id { |
139 | /* LCD has 1 ID */ | 139 | /* LCD has 1 ID */ |
140 | OMAP_L3_LCD = 29, | 140 | OMAP_L3_LCD = 29, |
141 | /* SAD2D has 1 ID */ | 141 | /* SAD2D has 1 ID */ |
142 | OMAP_L3_SAD2D = 28, | 142 | OMAP_L3_SAD2D = 28, |
143 | /* MPU has 5 IDs */ | 143 | /* MPU has 5 IDs */ |
144 | OMAP_L3_IA_MPU_SS_1 = 27, | 144 | OMAP_L3_IA_MPU_SS_1 = 27, |
145 | OMAP_L3_IA_MPU_SS_2 = 26, | 145 | OMAP_L3_IA_MPU_SS_2 = 26, |
146 | OMAP_L3_IA_MPU_SS_3 = 25, | 146 | OMAP_L3_IA_MPU_SS_3 = 25, |
147 | OMAP_L3_IA_MPU_SS_4 = 24, | 147 | OMAP_L3_IA_MPU_SS_4 = 24, |
148 | OMAP_L3_IA_MPU_SS_5 = 23, | 148 | OMAP_L3_IA_MPU_SS_5 = 23, |
149 | /* IVA2.2 SS has 3 IDs*/ | 149 | /* IVA2.2 SS has 3 IDs*/ |
150 | OMAP_L3_IA_IVA_SS_1 = 22, | 150 | OMAP_L3_IA_IVA_SS_1 = 22, |
151 | OMAP_L3_IA_IVA_SS_2 = 21, | 151 | OMAP_L3_IA_IVA_SS_2 = 21, |
152 | OMAP_L3_IA_IVA_SS_3 = 20, | 152 | OMAP_L3_IA_IVA_SS_3 = 20, |
153 | /* IVA 2.2 SS DMA has 6 IDS */ | 153 | /* IVA 2.2 SS DMA has 6 IDS */ |
154 | OMAP_L3_IA_IVA_SS_DMA_1 = 19, | 154 | OMAP_L3_IA_IVA_SS_DMA_1 = 19, |
155 | OMAP_L3_IA_IVA_SS_DMA_2 = 18, | 155 | OMAP_L3_IA_IVA_SS_DMA_2 = 18, |
@@ -158,25 +158,25 @@ enum omap3_l3_initiator_id { | |||
158 | OMAP_L3_IA_IVA_SS_DMA_5 = 15, | 158 | OMAP_L3_IA_IVA_SS_DMA_5 = 15, |
159 | OMAP_L3_IA_IVA_SS_DMA_6 = 14, | 159 | OMAP_L3_IA_IVA_SS_DMA_6 = 14, |
160 | /* SGX has 1 ID */ | 160 | /* SGX has 1 ID */ |
161 | OMAP_L3_IA_SGX = 13, | 161 | OMAP_L3_IA_SGX = 13, |
162 | /* CAM has 3 ID */ | 162 | /* CAM has 3 ID */ |
163 | OMAP_L3_IA_CAM_1 = 12, | 163 | OMAP_L3_IA_CAM_1 = 12, |
164 | OMAP_L3_IA_CAM_2 = 11, | 164 | OMAP_L3_IA_CAM_2 = 11, |
165 | OMAP_L3_IA_CAM_3 = 10, | 165 | OMAP_L3_IA_CAM_3 = 10, |
166 | /* DAP has 1 ID */ | 166 | /* DAP has 1 ID */ |
167 | OMAP_L3_IA_DAP = 9, | 167 | OMAP_L3_IA_DAP = 9, |
168 | /* SDMA WR has 2 IDs */ | 168 | /* SDMA WR has 2 IDs */ |
169 | OMAP_L3_SDMA_WR_1 = 8, | 169 | OMAP_L3_SDMA_WR_1 = 8, |
170 | OMAP_L3_SDMA_WR_2 = 7, | 170 | OMAP_L3_SDMA_WR_2 = 7, |
171 | /* SDMA RD has 4 IDs */ | 171 | /* SDMA RD has 4 IDs */ |
172 | OMAP_L3_SDMA_RD_1 = 6, | 172 | OMAP_L3_SDMA_RD_1 = 6, |
173 | OMAP_L3_SDMA_RD_2 = 5, | 173 | OMAP_L3_SDMA_RD_2 = 5, |
174 | OMAP_L3_SDMA_RD_3 = 4, | 174 | OMAP_L3_SDMA_RD_3 = 4, |
175 | OMAP_L3_SDMA_RD_4 = 3, | 175 | OMAP_L3_SDMA_RD_4 = 3, |
176 | /* HSUSB OTG has 1 ID */ | 176 | /* HSUSB OTG has 1 ID */ |
177 | OMAP_L3_USBOTG = 2, | 177 | OMAP_L3_USBOTG = 2, |
178 | /* HSUSB HOST has 1 ID */ | 178 | /* HSUSB HOST has 1 ID */ |
179 | OMAP_L3_USBHOST = 1, | 179 | OMAP_L3_USBHOST = 1, |
180 | }; | 180 | }; |
181 | 181 | ||
182 | enum omap3_l3_code { | 182 | enum omap3_l3_code { |
@@ -192,21 +192,21 @@ enum omap3_l3_code { | |||
192 | }; | 192 | }; |
193 | 193 | ||
194 | struct omap3_l3 { | 194 | struct omap3_l3 { |
195 | struct device *dev; | 195 | struct device *dev; |
196 | struct clk *ick; | 196 | struct clk *ick; |
197 | 197 | ||
198 | /* memory base*/ | 198 | /* memory base*/ |
199 | void __iomem *rt; | 199 | void __iomem *rt; |
200 | 200 | ||
201 | int debug_irq; | 201 | int debug_irq; |
202 | int app_irq; | 202 | int app_irq; |
203 | 203 | ||
204 | /* true when and inband functional error occurs */ | 204 | /* true when and inband functional error occurs */ |
205 | unsigned inband:1; | 205 | unsigned inband:1; |
206 | }; | 206 | }; |
207 | 207 | ||
208 | /* offsets for l3 agents in order with the Flag status register */ | 208 | /* offsets for l3 agents in order with the Flag status register */ |
209 | unsigned int __iomem omap3_l3_app_bases[] = { | 209 | static unsigned int omap3_l3_app_bases[] = { |
210 | /* MPU IA */ | 210 | /* MPU IA */ |
211 | 0x1400, | 211 | 0x1400, |
212 | 0x1400, | 212 | 0x1400, |
@@ -305,7 +305,7 @@ unsigned int __iomem omap3_l3_app_bases[] = { | |||
305 | 0, | 305 | 0, |
306 | }; | 306 | }; |
307 | 307 | ||
308 | unsigned int __iomem omap3_l3_debug_bases[] = { | 308 | static unsigned int omap3_l3_debug_bases[] = { |
309 | /* MPU DATA IA */ | 309 | /* MPU DATA IA */ |
310 | 0x1400, | 310 | 0x1400, |
311 | /* RESERVED */ | 311 | /* RESERVED */ |
@@ -321,7 +321,7 @@ unsigned int __iomem omap3_l3_debug_bases[] = { | |||
321 | /* REST RESERVED */ | 321 | /* REST RESERVED */ |
322 | }; | 322 | }; |
323 | 323 | ||
324 | u32 *omap3_l3_bases[] = { | 324 | static u32 *omap3_l3_bases[] = { |
325 | omap3_l3_app_bases, | 325 | omap3_l3_app_bases, |
326 | omap3_l3_debug_bases, | 326 | omap3_l3_debug_bases, |
327 | }; | 327 | }; |
diff --git a/arch/arm/mach-omap2/opp.c b/arch/arm/mach-omap2/opp.c index ab8b35b780b5..9262a6b47702 100644 --- a/arch/arm/mach-omap2/opp.c +++ b/arch/arm/mach-omap2/opp.c | |||
@@ -69,7 +69,7 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def, | |||
69 | opp_def->hwmod_name, i); | 69 | opp_def->hwmod_name, i); |
70 | return -EINVAL; | 70 | return -EINVAL; |
71 | } | 71 | } |
72 | dev = &oh->od->pdev.dev; | 72 | dev = &oh->od->pdev->dev; |
73 | 73 | ||
74 | r = opp_add(dev, opp_def->freq, opp_def->u_volt); | 74 | r = opp_add(dev, opp_def->freq, opp_def->u_volt); |
75 | if (r) { | 75 | if (r) { |
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index d34fc5206b4a..0844e2ecfb4a 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c | |||
@@ -60,19 +60,19 @@ EXPORT_SYMBOL(omap4_get_dsp_device); | |||
60 | static int _init_omap_device(char *name, struct device **new_dev) | 60 | static int _init_omap_device(char *name, struct device **new_dev) |
61 | { | 61 | { |
62 | struct omap_hwmod *oh; | 62 | struct omap_hwmod *oh; |
63 | struct omap_device *od; | 63 | struct platform_device *pdev; |
64 | 64 | ||
65 | oh = omap_hwmod_lookup(name); | 65 | oh = omap_hwmod_lookup(name); |
66 | if (WARN(!oh, "%s: could not find omap_hwmod for %s\n", | 66 | if (WARN(!oh, "%s: could not find omap_hwmod for %s\n", |
67 | __func__, name)) | 67 | __func__, name)) |
68 | return -ENODEV; | 68 | return -ENODEV; |
69 | 69 | ||
70 | od = omap_device_build(oh->name, 0, oh, NULL, 0, pm_lats, 0, false); | 70 | pdev = omap_device_build(oh->name, 0, oh, NULL, 0, pm_lats, 0, false); |
71 | if (WARN(IS_ERR(od), "%s: could not build omap_device for %s\n", | 71 | if (WARN(IS_ERR(pdev), "%s: could not build omap_device for %s\n", |
72 | __func__, name)) | 72 | __func__, name)) |
73 | return -ENODEV; | 73 | return -ENODEV; |
74 | 74 | ||
75 | *new_dev = &od->pdev.dev; | 75 | *new_dev = &pdev->dev; |
76 | 76 | ||
77 | return 0; | 77 | return 0; |
78 | } | 78 | } |
@@ -136,8 +136,8 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state) | |||
136 | 136 | ||
137 | ret = pwrdm_set_next_pwrst(pwrdm, state); | 137 | ret = pwrdm_set_next_pwrst(pwrdm, state); |
138 | if (ret) { | 138 | if (ret) { |
139 | printk(KERN_ERR "Unable to set state of powerdomain: %s\n", | 139 | pr_err("%s: unable to set state of powerdomain: %s\n", |
140 | pwrdm->name); | 140 | __func__, pwrdm->name); |
141 | goto err; | 141 | goto err; |
142 | } | 142 | } |
143 | 143 | ||
@@ -161,11 +161,11 @@ err: | |||
161 | } | 161 | } |
162 | 162 | ||
163 | /* | 163 | /* |
164 | * This API is to be called during init to put the various voltage | 164 | * This API is to be called during init to set the various voltage |
165 | * domains to the voltage as per the opp table. Typically we boot up | 165 | * domains to the voltage as per the opp table. Typically we boot up |
166 | * at the nominal voltage. So this function finds out the rate of | 166 | * at the nominal voltage. So this function finds out the rate of |
167 | * the clock associated with the voltage domain, finds out the correct | 167 | * the clock associated with the voltage domain, finds out the correct |
168 | * opp entry and puts the voltage domain to the voltage specifies | 168 | * opp entry and sets the voltage domain to the voltage specified |
169 | * in the opp entry | 169 | * in the opp entry |
170 | */ | 170 | */ |
171 | static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, | 171 | static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, |
@@ -177,21 +177,20 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, | |||
177 | unsigned long freq, bootup_volt; | 177 | unsigned long freq, bootup_volt; |
178 | 178 | ||
179 | if (!vdd_name || !clk_name || !dev) { | 179 | if (!vdd_name || !clk_name || !dev) { |
180 | printk(KERN_ERR "%s: Invalid parameters!\n", __func__); | 180 | pr_err("%s: invalid parameters\n", __func__); |
181 | goto exit; | 181 | goto exit; |
182 | } | 182 | } |
183 | 183 | ||
184 | voltdm = voltdm_lookup(vdd_name); | 184 | voltdm = voltdm_lookup(vdd_name); |
185 | if (IS_ERR(voltdm)) { | 185 | if (IS_ERR(voltdm)) { |
186 | printk(KERN_ERR "%s: Unable to get vdd pointer for vdd_%s\n", | 186 | pr_err("%s: unable to get vdd pointer for vdd_%s\n", |
187 | __func__, vdd_name); | 187 | __func__, vdd_name); |
188 | goto exit; | 188 | goto exit; |
189 | } | 189 | } |
190 | 190 | ||
191 | clk = clk_get(NULL, clk_name); | 191 | clk = clk_get(NULL, clk_name); |
192 | if (IS_ERR(clk)) { | 192 | if (IS_ERR(clk)) { |
193 | printk(KERN_ERR "%s: unable to get clk %s\n", | 193 | pr_err("%s: unable to get clk %s\n", __func__, clk_name); |
194 | __func__, clk_name); | ||
195 | goto exit; | 194 | goto exit; |
196 | } | 195 | } |
197 | 196 | ||
@@ -200,14 +199,14 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, | |||
200 | 199 | ||
201 | opp = opp_find_freq_ceil(dev, &freq); | 200 | opp = opp_find_freq_ceil(dev, &freq); |
202 | if (IS_ERR(opp)) { | 201 | if (IS_ERR(opp)) { |
203 | printk(KERN_ERR "%s: unable to find boot up OPP for vdd_%s\n", | 202 | pr_err("%s: unable to find boot up OPP for vdd_%s\n", |
204 | __func__, vdd_name); | 203 | __func__, vdd_name); |
205 | goto exit; | 204 | goto exit; |
206 | } | 205 | } |
207 | 206 | ||
208 | bootup_volt = opp_get_voltage(opp); | 207 | bootup_volt = opp_get_voltage(opp); |
209 | if (!bootup_volt) { | 208 | if (!bootup_volt) { |
210 | printk(KERN_ERR "%s: unable to find voltage corresponding" | 209 | pr_err("%s: unable to find voltage corresponding " |
211 | "to the bootup OPP for vdd_%s\n", __func__, vdd_name); | 210 | "to the bootup OPP for vdd_%s\n", __func__, vdd_name); |
212 | goto exit; | 211 | goto exit; |
213 | } | 212 | } |
@@ -216,8 +215,7 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, | |||
216 | return 0; | 215 | return 0; |
217 | 216 | ||
218 | exit: | 217 | exit: |
219 | printk(KERN_ERR "%s: Unable to put vdd_%s to its init voltage\n\n", | 218 | pr_err("%s: unable to set vdd_%s\n", __func__, vdd_name); |
220 | __func__, vdd_name); | ||
221 | return -EINVAL; | 219 | return -EINVAL; |
222 | } | 220 | } |
223 | 221 | ||
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index bf089e743ed9..cf0c216132ab 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -53,8 +53,6 @@ | |||
53 | #include "powerdomain.h" | 53 | #include "powerdomain.h" |
54 | #include "clockdomain.h" | 54 | #include "clockdomain.h" |
55 | 55 | ||
56 | static int omap2_pm_debug; | ||
57 | |||
58 | #ifdef CONFIG_SUSPEND | 56 | #ifdef CONFIG_SUSPEND |
59 | static suspend_state_t suspend_state = PM_SUSPEND_ON; | 57 | static suspend_state_t suspend_state = PM_SUSPEND_ON; |
60 | static inline bool is_suspending(void) | 58 | static inline bool is_suspending(void) |
@@ -96,7 +94,6 @@ static int omap2_fclks_active(void) | |||
96 | static void omap2_enter_full_retention(void) | 94 | static void omap2_enter_full_retention(void) |
97 | { | 95 | { |
98 | u32 l; | 96 | u32 l; |
99 | struct timespec ts_preidle, ts_postidle, ts_idle; | ||
100 | 97 | ||
101 | /* There is 1 reference hold for all children of the oscillator | 98 | /* There is 1 reference hold for all children of the oscillator |
102 | * clock, the following will remove it. If no one else uses the | 99 | * clock, the following will remove it. If no one else uses the |
@@ -124,10 +121,6 @@ static void omap2_enter_full_retention(void) | |||
124 | 121 | ||
125 | omap2_gpio_prepare_for_idle(0); | 122 | omap2_gpio_prepare_for_idle(0); |
126 | 123 | ||
127 | if (omap2_pm_debug) { | ||
128 | getnstimeofday(&ts_preidle); | ||
129 | } | ||
130 | |||
131 | /* One last check for pending IRQs to avoid extra latency due | 124 | /* One last check for pending IRQs to avoid extra latency due |
132 | * to sleeping unnecessarily. */ | 125 | * to sleeping unnecessarily. */ |
133 | if (omap_irq_pending()) | 126 | if (omap_irq_pending()) |
@@ -155,13 +148,6 @@ static void omap2_enter_full_retention(void) | |||
155 | console_unlock(); | 148 | console_unlock(); |
156 | 149 | ||
157 | no_sleep: | 150 | no_sleep: |
158 | if (omap2_pm_debug) { | ||
159 | unsigned long long tmp; | ||
160 | |||
161 | getnstimeofday(&ts_postidle); | ||
162 | ts_idle = timespec_sub(ts_postidle, ts_preidle); | ||
163 | tmp = timespec_to_ns(&ts_idle) * NSEC_PER_USEC; | ||
164 | } | ||
165 | omap2_gpio_resume_after_idle(); | 151 | omap2_gpio_resume_after_idle(); |
166 | 152 | ||
167 | clk_enable(osc_ck); | 153 | clk_enable(osc_ck); |
@@ -219,7 +205,6 @@ static int omap2_allow_mpu_retention(void) | |||
219 | static void omap2_enter_mpu_retention(void) | 205 | static void omap2_enter_mpu_retention(void) |
220 | { | 206 | { |
221 | int only_idle = 0; | 207 | int only_idle = 0; |
222 | struct timespec ts_preidle, ts_postidle, ts_idle; | ||
223 | 208 | ||
224 | /* Putting MPU into the WFI state while a transfer is active | 209 | /* Putting MPU into the WFI state while a transfer is active |
225 | * seems to cause the I2C block to timeout. Why? Good question. */ | 210 | * seems to cause the I2C block to timeout. Why? Good question. */ |
@@ -246,19 +231,7 @@ static void omap2_enter_mpu_retention(void) | |||
246 | only_idle = 1; | 231 | only_idle = 1; |
247 | } | 232 | } |
248 | 233 | ||
249 | if (omap2_pm_debug) { | ||
250 | getnstimeofday(&ts_preidle); | ||
251 | } | ||
252 | |||
253 | omap2_sram_idle(); | 234 | omap2_sram_idle(); |
254 | |||
255 | if (omap2_pm_debug) { | ||
256 | unsigned long long tmp; | ||
257 | |||
258 | getnstimeofday(&ts_postidle); | ||
259 | ts_idle = timespec_sub(ts_postidle, ts_preidle); | ||
260 | tmp = timespec_to_ns(&ts_idle) * NSEC_PER_USEC; | ||
261 | } | ||
262 | } | 235 | } |
263 | 236 | ||
264 | static int omap2_can_sleep(void) | 237 | static int omap2_can_sleep(void) |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 7255d9bce868..c8cbd00a41af 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -55,7 +55,7 @@ | |||
55 | static suspend_state_t suspend_state = PM_SUSPEND_ON; | 55 | static suspend_state_t suspend_state = PM_SUSPEND_ON; |
56 | static inline bool is_suspending(void) | 56 | static inline bool is_suspending(void) |
57 | { | 57 | { |
58 | return (suspend_state != PM_SUSPEND_ON); | 58 | return (suspend_state != PM_SUSPEND_ON) && console_suspend_enabled; |
59 | } | 59 | } |
60 | #else | 60 | #else |
61 | static inline bool is_suspending(void) | 61 | static inline bool is_suspending(void) |
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 466fc722fa0f..3d1c1d393f8f 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
@@ -711,7 +711,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata) | |||
711 | { | 711 | { |
712 | struct omap_uart_state *uart; | 712 | struct omap_uart_state *uart; |
713 | struct omap_hwmod *oh; | 713 | struct omap_hwmod *oh; |
714 | struct omap_device *od; | 714 | struct platform_device *pdev; |
715 | void *pdata = NULL; | 715 | void *pdata = NULL; |
716 | u32 pdata_size = 0; | 716 | u32 pdata_size = 0; |
717 | char *name; | 717 | char *name; |
@@ -799,20 +799,20 @@ void __init omap_serial_init_port(struct omap_board_data *bdata) | |||
799 | if (WARN_ON(!oh)) | 799 | if (WARN_ON(!oh)) |
800 | return; | 800 | return; |
801 | 801 | ||
802 | od = omap_device_build(name, uart->num, oh, pdata, pdata_size, | 802 | pdev = omap_device_build(name, uart->num, oh, pdata, pdata_size, |
803 | omap_uart_latency, | 803 | omap_uart_latency, |
804 | ARRAY_SIZE(omap_uart_latency), false); | 804 | ARRAY_SIZE(omap_uart_latency), false); |
805 | WARN(IS_ERR(od), "Could not build omap_device for %s: %s.\n", | 805 | WARN(IS_ERR(pdev), "Could not build omap_device for %s: %s.\n", |
806 | name, oh->name); | 806 | name, oh->name); |
807 | 807 | ||
808 | omap_device_disable_idle_on_suspend(od); | 808 | omap_device_disable_idle_on_suspend(pdev); |
809 | oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt); | 809 | oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt); |
810 | 810 | ||
811 | uart->irq = oh->mpu_irqs[0].irq; | 811 | uart->irq = oh->mpu_irqs[0].irq; |
812 | uart->regshift = 2; | 812 | uart->regshift = 2; |
813 | uart->mapbase = oh->slaves[0]->addr->pa_start; | 813 | uart->mapbase = oh->slaves[0]->addr->pa_start; |
814 | uart->membase = omap_hwmod_get_mpu_rt_va(oh); | 814 | uart->membase = omap_hwmod_get_mpu_rt_va(oh); |
815 | uart->pdev = &od->pdev; | 815 | uart->pdev = pdev; |
816 | 816 | ||
817 | oh->dev_attr = uart; | 817 | oh->dev_attr = uart; |
818 | 818 | ||
@@ -846,8 +846,8 @@ void __init omap_serial_init_port(struct omap_board_data *bdata) | |||
846 | 846 | ||
847 | if ((cpu_is_omap34xx() && uart->padconf) || | 847 | if ((cpu_is_omap34xx() && uart->padconf) || |
848 | (uart->wk_en && uart->wk_mask)) { | 848 | (uart->wk_en && uart->wk_mask)) { |
849 | device_init_wakeup(&od->pdev.dev, true); | 849 | device_init_wakeup(&pdev->dev, true); |
850 | DEV_CREATE_FILE(&od->pdev.dev, &dev_attr_sleep_timeout); | 850 | DEV_CREATE_FILE(&pdev->dev, &dev_attr_sleep_timeout); |
851 | } | 851 | } |
852 | 852 | ||
853 | /* Enable the MDR1 errata for OMAP3 */ | 853 | /* Enable the MDR1 errata for OMAP3 */ |
diff --git a/arch/arm/mach-omap2/sr_device.c b/arch/arm/mach-omap2/sr_device.c index 2782d3f604ca..eba9f9a8ab65 100644 --- a/arch/arm/mach-omap2/sr_device.c +++ b/arch/arm/mach-omap2/sr_device.c | |||
@@ -80,7 +80,7 @@ static void __init sr_set_nvalues(struct omap_volt_data *volt_data, | |||
80 | static int sr_dev_init(struct omap_hwmod *oh, void *user) | 80 | static int sr_dev_init(struct omap_hwmod *oh, void *user) |
81 | { | 81 | { |
82 | struct omap_sr_data *sr_data; | 82 | struct omap_sr_data *sr_data; |
83 | struct omap_device *od; | 83 | struct platform_device *pdev; |
84 | struct omap_volt_data *volt_data; | 84 | struct omap_volt_data *volt_data; |
85 | char *name = "smartreflex"; | 85 | char *name = "smartreflex"; |
86 | static int i; | 86 | static int i; |
@@ -120,10 +120,10 @@ static int sr_dev_init(struct omap_hwmod *oh, void *user) | |||
120 | 120 | ||
121 | sr_data->enable_on_init = sr_enable_on_init; | 121 | sr_data->enable_on_init = sr_enable_on_init; |
122 | 122 | ||
123 | od = omap_device_build(name, i, oh, sr_data, sizeof(*sr_data), | 123 | pdev = omap_device_build(name, i, oh, sr_data, sizeof(*sr_data), |
124 | omap_sr_latency, | 124 | omap_sr_latency, |
125 | ARRAY_SIZE(omap_sr_latency), 0); | 125 | ARRAY_SIZE(omap_sr_latency), 0); |
126 | if (IS_ERR(od)) | 126 | if (IS_ERR(pdev)) |
127 | pr_warning("%s: Could not build omap_device for %s: %s.\n\n", | 127 | pr_warning("%s: Could not build omap_device for %s: %s.\n\n", |
128 | __func__, name, oh->name); | 128 | __func__, name, oh->name); |
129 | exit: | 129 | exit: |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index cf1de7d2630d..e49fc7be2229 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/irq.h> | 35 | #include <linux/irq.h> |
36 | #include <linux/clocksource.h> | 36 | #include <linux/clocksource.h> |
37 | #include <linux/clockchips.h> | 37 | #include <linux/clockchips.h> |
38 | #include <linux/slab.h> | ||
38 | 39 | ||
39 | #include <asm/mach/time.h> | 40 | #include <asm/mach/time.h> |
40 | #include <plat/dmtimer.h> | 41 | #include <plat/dmtimer.h> |
@@ -42,6 +43,10 @@ | |||
42 | #include <asm/sched_clock.h> | 43 | #include <asm/sched_clock.h> |
43 | #include <plat/common.h> | 44 | #include <plat/common.h> |
44 | #include <plat/omap_hwmod.h> | 45 | #include <plat/omap_hwmod.h> |
46 | #include <plat/omap_device.h> | ||
47 | #include <plat/omap-pm.h> | ||
48 | |||
49 | #include "powerdomain.h" | ||
45 | 50 | ||
46 | /* Parent clocks, eventually these will come from the clock framework */ | 51 | /* Parent clocks, eventually these will come from the clock framework */ |
47 | 52 | ||
@@ -67,7 +72,7 @@ | |||
67 | /* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ | 72 | /* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ |
68 | #define MAX_GPTIMER_ID 12 | 73 | #define MAX_GPTIMER_ID 12 |
69 | 74 | ||
70 | u32 sys_timer_reserved; | 75 | static u32 sys_timer_reserved; |
71 | 76 | ||
72 | /* Clockevent code */ | 77 | /* Clockevent code */ |
73 | 78 | ||
@@ -78,7 +83,7 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id) | |||
78 | { | 83 | { |
79 | struct clock_event_device *evt = &clockevent_gpt; | 84 | struct clock_event_device *evt = &clockevent_gpt; |
80 | 85 | ||
81 | __omap_dm_timer_write_status(clkev.io_base, OMAP_TIMER_INT_OVERFLOW); | 86 | __omap_dm_timer_write_status(&clkev, OMAP_TIMER_INT_OVERFLOW); |
82 | 87 | ||
83 | evt->event_handler(evt); | 88 | evt->event_handler(evt); |
84 | return IRQ_HANDLED; | 89 | return IRQ_HANDLED; |
@@ -93,7 +98,7 @@ static struct irqaction omap2_gp_timer_irq = { | |||
93 | static int omap2_gp_timer_set_next_event(unsigned long cycles, | 98 | static int omap2_gp_timer_set_next_event(unsigned long cycles, |
94 | struct clock_event_device *evt) | 99 | struct clock_event_device *evt) |
95 | { | 100 | { |
96 | __omap_dm_timer_load_start(clkev.io_base, OMAP_TIMER_CTRL_ST, | 101 | __omap_dm_timer_load_start(&clkev, OMAP_TIMER_CTRL_ST, |
97 | 0xffffffff - cycles, 1); | 102 | 0xffffffff - cycles, 1); |
98 | 103 | ||
99 | return 0; | 104 | return 0; |
@@ -104,16 +109,16 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode, | |||
104 | { | 109 | { |
105 | u32 period; | 110 | u32 period; |
106 | 111 | ||
107 | __omap_dm_timer_stop(clkev.io_base, 1, clkev.rate); | 112 | __omap_dm_timer_stop(&clkev, 1, clkev.rate); |
108 | 113 | ||
109 | switch (mode) { | 114 | switch (mode) { |
110 | case CLOCK_EVT_MODE_PERIODIC: | 115 | case CLOCK_EVT_MODE_PERIODIC: |
111 | period = clkev.rate / HZ; | 116 | period = clkev.rate / HZ; |
112 | period -= 1; | 117 | period -= 1; |
113 | /* Looks like we need to first set the load value separately */ | 118 | /* Looks like we need to first set the load value separately */ |
114 | __omap_dm_timer_write(clkev.io_base, OMAP_TIMER_LOAD_REG, | 119 | __omap_dm_timer_write(&clkev, OMAP_TIMER_LOAD_REG, |
115 | 0xffffffff - period, 1); | 120 | 0xffffffff - period, 1); |
116 | __omap_dm_timer_load_start(clkev.io_base, | 121 | __omap_dm_timer_load_start(&clkev, |
117 | OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST, | 122 | OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST, |
118 | 0xffffffff - period, 1); | 123 | 0xffffffff - period, 1); |
119 | break; | 124 | break; |
@@ -189,7 +194,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, | |||
189 | clk_put(src); | 194 | clk_put(src); |
190 | } | 195 | } |
191 | } | 196 | } |
192 | __omap_dm_timer_reset(timer->io_base, 1, 1); | 197 | __omap_dm_timer_init_regs(timer); |
198 | __omap_dm_timer_reset(timer, 1, 1); | ||
193 | timer->posted = 1; | 199 | timer->posted = 1; |
194 | 200 | ||
195 | timer->rate = clk_get_rate(timer->fclk); | 201 | timer->rate = clk_get_rate(timer->fclk); |
@@ -210,7 +216,7 @@ static void __init omap2_gp_clockevent_init(int gptimer_id, | |||
210 | omap2_gp_timer_irq.dev_id = (void *)&clkev; | 216 | omap2_gp_timer_irq.dev_id = (void *)&clkev; |
211 | setup_irq(clkev.irq, &omap2_gp_timer_irq); | 217 | setup_irq(clkev.irq, &omap2_gp_timer_irq); |
212 | 218 | ||
213 | __omap_dm_timer_int_enable(clkev.io_base, OMAP_TIMER_INT_OVERFLOW); | 219 | __omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW); |
214 | 220 | ||
215 | clockevent_gpt.mult = div_sc(clkev.rate, NSEC_PER_SEC, | 221 | clockevent_gpt.mult = div_sc(clkev.rate, NSEC_PER_SEC, |
216 | clockevent_gpt.shift); | 222 | clockevent_gpt.shift); |
@@ -251,7 +257,7 @@ static struct omap_dm_timer clksrc; | |||
251 | static DEFINE_CLOCK_DATA(cd); | 257 | static DEFINE_CLOCK_DATA(cd); |
252 | static cycle_t clocksource_read_cycles(struct clocksource *cs) | 258 | static cycle_t clocksource_read_cycles(struct clocksource *cs) |
253 | { | 259 | { |
254 | return (cycle_t)__omap_dm_timer_read_counter(clksrc.io_base, 1); | 260 | return (cycle_t)__omap_dm_timer_read_counter(&clksrc, 1); |
255 | } | 261 | } |
256 | 262 | ||
257 | static struct clocksource clocksource_gpt = { | 263 | static struct clocksource clocksource_gpt = { |
@@ -266,7 +272,7 @@ static void notrace dmtimer_update_sched_clock(void) | |||
266 | { | 272 | { |
267 | u32 cyc; | 273 | u32 cyc; |
268 | 274 | ||
269 | cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1); | 275 | cyc = __omap_dm_timer_read_counter(&clksrc, 1); |
270 | 276 | ||
271 | update_sched_clock(&cd, cyc, (u32)~0); | 277 | update_sched_clock(&cd, cyc, (u32)~0); |
272 | } | 278 | } |
@@ -276,7 +282,7 @@ unsigned long long notrace sched_clock(void) | |||
276 | u32 cyc = 0; | 282 | u32 cyc = 0; |
277 | 283 | ||
278 | if (clksrc.reserved) | 284 | if (clksrc.reserved) |
279 | cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1); | 285 | cyc = __omap_dm_timer_read_counter(&clksrc, 1); |
280 | 286 | ||
281 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | 287 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); |
282 | } | 288 | } |
@@ -293,7 +299,7 @@ static void __init omap2_gp_clocksource_init(int gptimer_id, | |||
293 | pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n", | 299 | pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n", |
294 | gptimer_id, clksrc.rate); | 300 | gptimer_id, clksrc.rate); |
295 | 301 | ||
296 | __omap_dm_timer_load_start(clksrc.io_base, | 302 | __omap_dm_timer_load_start(&clksrc, |
297 | OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, 1); | 303 | OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, 1); |
298 | init_sched_clock(&cd, dmtimer_update_sched_clock, 32, clksrc.rate); | 304 | init_sched_clock(&cd, dmtimer_update_sched_clock, 32, clksrc.rate); |
299 | 305 | ||
@@ -341,3 +347,167 @@ static void __init omap4_timer_init(void) | |||
341 | } | 347 | } |
342 | OMAP_SYS_TIMER(4) | 348 | OMAP_SYS_TIMER(4) |
343 | #endif | 349 | #endif |
350 | |||
351 | /** | ||
352 | * omap2_dm_timer_set_src - change the timer input clock source | ||
353 | * @pdev: timer platform device pointer | ||
354 | * @source: array index of parent clock source | ||
355 | */ | ||
356 | static int omap2_dm_timer_set_src(struct platform_device *pdev, int source) | ||
357 | { | ||
358 | int ret; | ||
359 | struct dmtimer_platform_data *pdata = pdev->dev.platform_data; | ||
360 | struct clk *fclk, *parent; | ||
361 | char *parent_name = NULL; | ||
362 | |||
363 | fclk = clk_get(&pdev->dev, "fck"); | ||
364 | if (IS_ERR_OR_NULL(fclk)) { | ||
365 | dev_err(&pdev->dev, "%s: %d: clk_get() FAILED\n", | ||
366 | __func__, __LINE__); | ||
367 | return -EINVAL; | ||
368 | } | ||
369 | |||
370 | switch (source) { | ||
371 | case OMAP_TIMER_SRC_SYS_CLK: | ||
372 | parent_name = "sys_ck"; | ||
373 | break; | ||
374 | |||
375 | case OMAP_TIMER_SRC_32_KHZ: | ||
376 | parent_name = "32k_ck"; | ||
377 | break; | ||
378 | |||
379 | case OMAP_TIMER_SRC_EXT_CLK: | ||
380 | if (pdata->timer_ip_version == OMAP_TIMER_IP_VERSION_1) { | ||
381 | parent_name = "alt_ck"; | ||
382 | break; | ||
383 | } | ||
384 | dev_err(&pdev->dev, "%s: %d: invalid clk src.\n", | ||
385 | __func__, __LINE__); | ||
386 | clk_put(fclk); | ||
387 | return -EINVAL; | ||
388 | } | ||
389 | |||
390 | parent = clk_get(&pdev->dev, parent_name); | ||
391 | if (IS_ERR_OR_NULL(parent)) { | ||
392 | dev_err(&pdev->dev, "%s: %d: clk_get() %s FAILED\n", | ||
393 | __func__, __LINE__, parent_name); | ||
394 | clk_put(fclk); | ||
395 | return -EINVAL; | ||
396 | } | ||
397 | |||
398 | ret = clk_set_parent(fclk, parent); | ||
399 | if (IS_ERR_VALUE(ret)) { | ||
400 | dev_err(&pdev->dev, "%s: clk_set_parent() to %s FAILED\n", | ||
401 | __func__, parent_name); | ||
402 | ret = -EINVAL; | ||
403 | } | ||
404 | |||
405 | clk_put(parent); | ||
406 | clk_put(fclk); | ||
407 | |||
408 | return ret; | ||
409 | } | ||
410 | |||
411 | struct omap_device_pm_latency omap2_dmtimer_latency[] = { | ||
412 | { | ||
413 | .deactivate_func = omap_device_idle_hwmods, | ||
414 | .activate_func = omap_device_enable_hwmods, | ||
415 | .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST, | ||
416 | }, | ||
417 | }; | ||
418 | |||
419 | /** | ||
420 | * omap_timer_init - build and register timer device with an | ||
421 | * associated timer hwmod | ||
422 | * @oh: timer hwmod pointer to be used to build timer device | ||
423 | * @user: parameter that can be passed from calling hwmod API | ||
424 | * | ||
425 | * Called by omap_hwmod_for_each_by_class to register each of the timer | ||
426 | * devices present in the system. The number of timer devices is known | ||
427 | * by parsing through the hwmod database for a given class name. At the | ||
428 | * end of function call memory is allocated for timer device and it is | ||
429 | * registered to the framework ready to be proved by the driver. | ||
430 | */ | ||
431 | static int __init omap_timer_init(struct omap_hwmod *oh, void *unused) | ||
432 | { | ||
433 | int id; | ||
434 | int ret = 0; | ||
435 | char *name = "omap_timer"; | ||
436 | struct dmtimer_platform_data *pdata; | ||
437 | struct platform_device *pdev; | ||
438 | struct omap_timer_capability_dev_attr *timer_dev_attr; | ||
439 | struct powerdomain *pwrdm; | ||
440 | |||
441 | pr_debug("%s: %s\n", __func__, oh->name); | ||
442 | |||
443 | /* on secure device, do not register secure timer */ | ||
444 | timer_dev_attr = oh->dev_attr; | ||
445 | if (omap_type() != OMAP2_DEVICE_TYPE_GP && timer_dev_attr) | ||
446 | if (timer_dev_attr->timer_capability == OMAP_TIMER_SECURE) | ||
447 | return ret; | ||
448 | |||
449 | pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); | ||
450 | if (!pdata) { | ||
451 | pr_err("%s: No memory for [%s]\n", __func__, oh->name); | ||
452 | return -ENOMEM; | ||
453 | } | ||
454 | |||
455 | /* | ||
456 | * Extract the IDs from name field in hwmod database | ||
457 | * and use the same for constructing ids' for the | ||
458 | * timer devices. In a way, we are avoiding usage of | ||
459 | * static variable witin the function to do the same. | ||
460 | * CAUTION: We have to be careful and make sure the | ||
461 | * name in hwmod database does not change in which case | ||
462 | * we might either make corresponding change here or | ||
463 | * switch back static variable mechanism. | ||
464 | */ | ||
465 | sscanf(oh->name, "timer%2d", &id); | ||
466 | |||
467 | pdata->set_timer_src = omap2_dm_timer_set_src; | ||
468 | pdata->timer_ip_version = oh->class->rev; | ||
469 | |||
470 | /* Mark clocksource and clockevent timers as reserved */ | ||
471 | if ((sys_timer_reserved >> (id - 1)) & 0x1) | ||
472 | pdata->reserved = 1; | ||
473 | |||
474 | pwrdm = omap_hwmod_get_pwrdm(oh); | ||
475 | pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm); | ||
476 | #ifdef CONFIG_PM | ||
477 | pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count; | ||
478 | #endif | ||
479 | pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata), | ||
480 | omap2_dmtimer_latency, | ||
481 | ARRAY_SIZE(omap2_dmtimer_latency), | ||
482 | 0); | ||
483 | |||
484 | if (IS_ERR(pdev)) { | ||
485 | pr_err("%s: Can't build omap_device for %s: %s.\n", | ||
486 | __func__, name, oh->name); | ||
487 | ret = -EINVAL; | ||
488 | } | ||
489 | |||
490 | kfree(pdata); | ||
491 | |||
492 | return ret; | ||
493 | } | ||
494 | |||
495 | /** | ||
496 | * omap2_dm_timer_init - top level regular device initialization | ||
497 | * | ||
498 | * Uses dedicated hwmod api to parse through hwmod database for | ||
499 | * given class name and then build and register the timer device. | ||
500 | */ | ||
501 | static int __init omap2_dm_timer_init(void) | ||
502 | { | ||
503 | int ret; | ||
504 | |||
505 | ret = omap_hwmod_for_each_by_class("timer", omap_timer_init, NULL); | ||
506 | if (unlikely(ret)) { | ||
507 | pr_err("%s: device registration failed.\n", __func__); | ||
508 | return -EINVAL; | ||
509 | } | ||
510 | |||
511 | return 0; | ||
512 | } | ||
513 | arch_initcall(omap2_dm_timer_init); | ||
diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c index a65145b02a55..d86af3cda8c7 100644 --- a/arch/arm/mach-omap2/usb-musb.c +++ b/arch/arm/mach-omap2/usb-musb.c | |||
@@ -115,7 +115,6 @@ static struct omap_musb_board_data musb_default_board_data = { | |||
115 | void __init usb_musb_init(struct omap_musb_board_data *musb_board_data) | 115 | void __init usb_musb_init(struct omap_musb_board_data *musb_board_data) |
116 | { | 116 | { |
117 | struct omap_hwmod *oh; | 117 | struct omap_hwmod *oh; |
118 | struct omap_device *od; | ||
119 | struct platform_device *pdev; | 118 | struct platform_device *pdev; |
120 | struct device *dev; | 119 | struct device *dev; |
121 | int bus_id = -1; | 120 | int bus_id = -1; |
@@ -137,9 +136,6 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data) | |||
137 | musb_plat.mode = board_data->mode; | 136 | musb_plat.mode = board_data->mode; |
138 | musb_plat.extvbus = board_data->extvbus; | 137 | musb_plat.extvbus = board_data->extvbus; |
139 | 138 | ||
140 | if (cpu_is_omap44xx()) | ||
141 | omap4430_phy_init(dev); | ||
142 | |||
143 | if (cpu_is_omap3517() || cpu_is_omap3505()) { | 139 | if (cpu_is_omap3517() || cpu_is_omap3505()) { |
144 | oh_name = "am35x_otg_hs"; | 140 | oh_name = "am35x_otg_hs"; |
145 | name = "musb-am35x"; | 141 | name = "musb-am35x"; |
@@ -148,22 +144,20 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data) | |||
148 | name = "musb-omap2430"; | 144 | name = "musb-omap2430"; |
149 | } | 145 | } |
150 | 146 | ||
151 | oh = omap_hwmod_lookup(oh_name); | 147 | oh = omap_hwmod_lookup(oh_name); |
152 | if (!oh) { | 148 | if (WARN(!oh, "%s: could not find omap_hwmod for %s\n", |
153 | pr_err("Could not look up %s\n", oh_name); | 149 | __func__, oh_name)) |
154 | return; | 150 | return; |
155 | } | ||
156 | 151 | ||
157 | od = omap_device_build(name, bus_id, oh, &musb_plat, | 152 | pdev = omap_device_build(name, bus_id, oh, &musb_plat, |
158 | sizeof(musb_plat), omap_musb_latency, | 153 | sizeof(musb_plat), omap_musb_latency, |
159 | ARRAY_SIZE(omap_musb_latency), false); | 154 | ARRAY_SIZE(omap_musb_latency), false); |
160 | if (IS_ERR(od)) { | 155 | if (IS_ERR(pdev)) { |
161 | pr_err("Could not build omap_device for %s %s\n", | 156 | pr_err("Could not build omap_device for %s %s\n", |
162 | name, oh_name); | 157 | name, oh_name); |
163 | return; | 158 | return; |
164 | } | 159 | } |
165 | 160 | ||
166 | pdev = &od->pdev; | ||
167 | dev = &pdev->dev; | 161 | dev = &pdev->dev; |
168 | get_device(dev); | 162 | get_device(dev); |
169 | dev->dma_mask = &musb_dmamask; | 163 | dev->dma_mask = &musb_dmamask; |
diff --git a/arch/arm/mach-orion5x/dns323-setup.c b/arch/arm/mach-orion5x/dns323-setup.c index a6eddae82a0b..c105556a0ee1 100644 --- a/arch/arm/mach-orion5x/dns323-setup.c +++ b/arch/arm/mach-orion5x/dns323-setup.c | |||
@@ -77,7 +77,7 @@ static int __init dns323_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | |||
77 | /* | 77 | /* |
78 | * Check for devices with hard-wired IRQs. | 78 | * Check for devices with hard-wired IRQs. |
79 | */ | 79 | */ |
80 | irq = orion5x_pci_map_irq(const dev, slot, pin); | 80 | irq = orion5x_pci_map_irq(dev, slot, pin); |
81 | if (irq != -1) | 81 | if (irq != -1) |
82 | return irq; | 82 | return irq; |
83 | 83 | ||
diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index 28b8760ab9fa..bc4a920e26ee 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
16 | #include <linux/mbus.h> | 16 | #include <linux/mbus.h> |
17 | #include <video/vga.h> | ||
17 | #include <asm/irq.h> | 18 | #include <asm/irq.h> |
18 | #include <asm/mach/pci.h> | 19 | #include <asm/mach/pci.h> |
19 | #include <plat/pcie.h> | 20 | #include <plat/pcie.h> |
diff --git a/arch/arm/mach-prima2/clock.c b/arch/arm/mach-prima2/clock.c index f9a2aaf63f71..615a4e75ceab 100644 --- a/arch/arm/mach-prima2/clock.c +++ b/arch/arm/mach-prima2/clock.c | |||
@@ -481,6 +481,7 @@ static void __init sirfsoc_clk_init(void) | |||
481 | 481 | ||
482 | static struct of_device_id clkc_ids[] = { | 482 | static struct of_device_id clkc_ids[] = { |
483 | { .compatible = "sirf,prima2-clkc" }, | 483 | { .compatible = "sirf,prima2-clkc" }, |
484 | {}, | ||
484 | }; | 485 | }; |
485 | 486 | ||
486 | void __init sirfsoc_of_clk_init(void) | 487 | void __init sirfsoc_of_clk_init(void) |
diff --git a/arch/arm/mach-prima2/irq.c b/arch/arm/mach-prima2/irq.c index c3404cbb6ff7..7af254d046ba 100644 --- a/arch/arm/mach-prima2/irq.c +++ b/arch/arm/mach-prima2/irq.c | |||
@@ -51,6 +51,7 @@ static __init void sirfsoc_irq_init(void) | |||
51 | 51 | ||
52 | static struct of_device_id intc_ids[] = { | 52 | static struct of_device_id intc_ids[] = { |
53 | { .compatible = "sirf,prima2-intc" }, | 53 | { .compatible = "sirf,prima2-intc" }, |
54 | {}, | ||
54 | }; | 55 | }; |
55 | 56 | ||
56 | void __init sirfsoc_of_irq_init(void) | 57 | void __init sirfsoc_of_irq_init(void) |
diff --git a/arch/arm/mach-prima2/rstc.c b/arch/arm/mach-prima2/rstc.c index d074786e83d4..492cfa8d2610 100644 --- a/arch/arm/mach-prima2/rstc.c +++ b/arch/arm/mach-prima2/rstc.c | |||
@@ -19,6 +19,7 @@ static DEFINE_MUTEX(rstc_lock); | |||
19 | 19 | ||
20 | static struct of_device_id rstc_ids[] = { | 20 | static struct of_device_id rstc_ids[] = { |
21 | { .compatible = "sirf,prima2-rstc" }, | 21 | { .compatible = "sirf,prima2-rstc" }, |
22 | {}, | ||
22 | }; | 23 | }; |
23 | 24 | ||
24 | static int __init sirfsoc_of_rstc_init(void) | 25 | static int __init sirfsoc_of_rstc_init(void) |
diff --git a/arch/arm/mach-prima2/timer.c b/arch/arm/mach-prima2/timer.c index 44027f34a88a..ed7ec48d11da 100644 --- a/arch/arm/mach-prima2/timer.c +++ b/arch/arm/mach-prima2/timer.c | |||
@@ -190,6 +190,7 @@ static void __init sirfsoc_timer_init(void) | |||
190 | 190 | ||
191 | static struct of_device_id timer_ids[] = { | 191 | static struct of_device_id timer_ids[] = { |
192 | { .compatible = "sirf,prima2-tick" }, | 192 | { .compatible = "sirf,prima2-tick" }, |
193 | {}, | ||
193 | }; | 194 | }; |
194 | 195 | ||
195 | static void __init sirfsoc_of_timer_map(void) | 196 | static void __init sirfsoc_of_timer_map(void) |
diff --git a/arch/arm/mach-realview/include/mach/system.h b/arch/arm/mach-realview/include/mach/system.h index a30f2e3ec178..6657ff231161 100644 --- a/arch/arm/mach-realview/include/mach/system.h +++ b/arch/arm/mach-realview/include/mach/system.h | |||
@@ -44,6 +44,7 @@ static inline void arch_reset(char mode, const char *cmd) | |||
44 | */ | 44 | */ |
45 | if (realview_reset) | 45 | if (realview_reset) |
46 | realview_reset(mode); | 46 | realview_reset(mode); |
47 | dsb(); | ||
47 | } | 48 | } |
48 | 49 | ||
49 | #endif | 50 | #endif |
diff --git a/arch/arm/mach-s3c2443/clock.c b/arch/arm/mach-s3c2443/clock.c index a1a7176675b9..38058af48972 100644 --- a/arch/arm/mach-s3c2443/clock.c +++ b/arch/arm/mach-s3c2443/clock.c | |||
@@ -128,7 +128,7 @@ static int s3c2443_armclk_setrate(struct clk *clk, unsigned long rate) | |||
128 | unsigned long clkcon0; | 128 | unsigned long clkcon0; |
129 | 129 | ||
130 | clkcon0 = __raw_readl(S3C2443_CLKDIV0); | 130 | clkcon0 = __raw_readl(S3C2443_CLKDIV0); |
131 | clkcon0 &= S3C2443_CLKDIV0_ARMDIV_MASK; | 131 | clkcon0 &= ~S3C2443_CLKDIV0_ARMDIV_MASK; |
132 | clkcon0 |= val << S3C2443_CLKDIV0_ARMDIV_SHIFT; | 132 | clkcon0 |= val << S3C2443_CLKDIV0_ARMDIV_SHIFT; |
133 | __raw_writel(clkcon0, S3C2443_CLKDIV0); | 133 | __raw_writel(clkcon0, S3C2443_CLKDIV0); |
134 | } | 134 | } |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index ecbea92bf83b..a9f3183e0290 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
@@ -262,45 +262,6 @@ static struct samsung_keypad_platdata smdk6410_keypad_data __initdata = { | |||
262 | .cols = 8, | 262 | .cols = 8, |
263 | }; | 263 | }; |
264 | 264 | ||
265 | static int smdk6410_backlight_init(struct device *dev) | ||
266 | { | ||
267 | int ret; | ||
268 | |||
269 | ret = gpio_request(S3C64XX_GPF(15), "Backlight"); | ||
270 | if (ret) { | ||
271 | printk(KERN_ERR "failed to request GPF for PWM-OUT1\n"); | ||
272 | return ret; | ||
273 | } | ||
274 | |||
275 | /* Configure GPIO pin with S3C64XX_GPF15_PWM_TOUT1 */ | ||
276 | s3c_gpio_cfgpin(S3C64XX_GPF(15), S3C_GPIO_SFN(2)); | ||
277 | |||
278 | return 0; | ||
279 | } | ||
280 | |||
281 | static void smdk6410_backlight_exit(struct device *dev) | ||
282 | { | ||
283 | s3c_gpio_cfgpin(S3C64XX_GPF(15), S3C_GPIO_OUTPUT); | ||
284 | gpio_free(S3C64XX_GPF(15)); | ||
285 | } | ||
286 | |||
287 | static struct platform_pwm_backlight_data smdk6410_backlight_data = { | ||
288 | .pwm_id = 1, | ||
289 | .max_brightness = 255, | ||
290 | .dft_brightness = 255, | ||
291 | .pwm_period_ns = 78770, | ||
292 | .init = smdk6410_backlight_init, | ||
293 | .exit = smdk6410_backlight_exit, | ||
294 | }; | ||
295 | |||
296 | static struct platform_device smdk6410_backlight_device = { | ||
297 | .name = "pwm-backlight", | ||
298 | .dev = { | ||
299 | .parent = &s3c_device_timer[1].dev, | ||
300 | .platform_data = &smdk6410_backlight_data, | ||
301 | }, | ||
302 | }; | ||
303 | |||
304 | static struct map_desc smdk6410_iodesc[] = {}; | 265 | static struct map_desc smdk6410_iodesc[] = {}; |
305 | 266 | ||
306 | static struct platform_device *smdk6410_devices[] __initdata = { | 267 | static struct platform_device *smdk6410_devices[] __initdata = { |
diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c index 8bad64370689..055e2858b0dd 100644 --- a/arch/arm/mach-s3c64xx/pm.c +++ b/arch/arm/mach-s3c64xx/pm.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/suspend.h> | 16 | #include <linux/suspend.h> |
17 | #include <linux/serial_core.h> | 17 | #include <linux/serial_core.h> |
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | #include <linux/gpio.h> | ||
19 | 20 | ||
20 | #include <mach/map.h> | 21 | #include <mach/map.h> |
21 | #include <mach/irqs.h> | 22 | #include <mach/irqs.h> |
diff --git a/arch/arm/mach-s5p64x0/irq-eint.c b/arch/arm/mach-s5p64x0/irq-eint.c index 69ed4545112b..fe7380f5c3cd 100644 --- a/arch/arm/mach-s5p64x0/irq-eint.c +++ b/arch/arm/mach-s5p64x0/irq-eint.c | |||
@@ -129,7 +129,7 @@ static int s5p64x0_alloc_gc(void) | |||
129 | } | 129 | } |
130 | 130 | ||
131 | ct = gc->chip_types; | 131 | ct = gc->chip_types; |
132 | ct->chip.irq_ack = irq_gc_ack; | 132 | ct->chip.irq_ack = irq_gc_ack_set_bit; |
133 | ct->chip.irq_mask = irq_gc_mask_set_bit; | 133 | ct->chip.irq_mask = irq_gc_mask_set_bit; |
134 | ct->chip.irq_unmask = irq_gc_mask_clr_bit; | 134 | ct->chip.irq_unmask = irq_gc_mask_clr_bit; |
135 | ct->chip.irq_set_type = s5p64x0_irq_eint_set_type; | 135 | ct->chip.irq_set_type = s5p64x0_irq_eint_set_type; |
diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c index 52a8e607bcc2..f5f8fa89679c 100644 --- a/arch/arm/mach-s5pv210/clock.c +++ b/arch/arm/mach-s5pv210/clock.c | |||
@@ -815,8 +815,7 @@ static struct clksrc_clk clksrcs[] = { | |||
815 | .reg_div = { .reg = S5P_CLK_DIV3, .shift = 20, .size = 4 }, | 815 | .reg_div = { .reg = S5P_CLK_DIV3, .shift = 20, .size = 4 }, |
816 | }, { | 816 | }, { |
817 | .clk = { | 817 | .clk = { |
818 | .name = "sclk_cam", | 818 | .name = "sclk_cam0", |
819 | .devname = "s5pv210-fimc.0", | ||
820 | .enable = s5pv210_clk_mask0_ctrl, | 819 | .enable = s5pv210_clk_mask0_ctrl, |
821 | .ctrlbit = (1 << 3), | 820 | .ctrlbit = (1 << 3), |
822 | }, | 821 | }, |
@@ -825,8 +824,7 @@ static struct clksrc_clk clksrcs[] = { | |||
825 | .reg_div = { .reg = S5P_CLK_DIV1, .shift = 12, .size = 4 }, | 824 | .reg_div = { .reg = S5P_CLK_DIV1, .shift = 12, .size = 4 }, |
826 | }, { | 825 | }, { |
827 | .clk = { | 826 | .clk = { |
828 | .name = "sclk_cam", | 827 | .name = "sclk_cam1", |
829 | .devname = "s5pv210-fimc.1", | ||
830 | .enable = s5pv210_clk_mask0_ctrl, | 828 | .enable = s5pv210_clk_mask0_ctrl, |
831 | .ctrlbit = (1 << 4), | 829 | .ctrlbit = (1 << 4), |
832 | }, | 830 | }, |
diff --git a/arch/arm/mach-s5pv210/pm.c b/arch/arm/mach-s5pv210/pm.c index 309e388a8a83..f149d278377b 100644 --- a/arch/arm/mach-s5pv210/pm.c +++ b/arch/arm/mach-s5pv210/pm.c | |||
@@ -88,7 +88,7 @@ static struct sleep_save s5pv210_core_save[] = { | |||
88 | SAVE_ITEM(S3C2410_TCNTO(0)), | 88 | SAVE_ITEM(S3C2410_TCNTO(0)), |
89 | }; | 89 | }; |
90 | 90 | ||
91 | void s5pv210_cpu_suspend(unsigned long arg) | 91 | static int s5pv210_cpu_suspend(unsigned long arg) |
92 | { | 92 | { |
93 | unsigned long tmp; | 93 | unsigned long tmp; |
94 | 94 | ||
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index ce5c2513c6ce..cdfdd624d21d 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
@@ -341,6 +341,7 @@ static struct platform_device mipidsi0_device = { | |||
341 | static struct sh_mobile_sdhi_info sdhi0_info = { | 341 | static struct sh_mobile_sdhi_info sdhi0_info = { |
342 | .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, | 342 | .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, |
343 | .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, | 343 | .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, |
344 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT, | ||
344 | .tmio_caps = MMC_CAP_SD_HIGHSPEED, | 345 | .tmio_caps = MMC_CAP_SD_HIGHSPEED, |
345 | .tmio_ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, | 346 | .tmio_ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, |
346 | }; | 347 | }; |
@@ -382,7 +383,7 @@ void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state) | |||
382 | } | 383 | } |
383 | 384 | ||
384 | static struct sh_mobile_sdhi_info sh_sdhi1_info = { | 385 | static struct sh_mobile_sdhi_info sh_sdhi1_info = { |
385 | .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE, | 386 | .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_HAS_IDLE_WAIT, |
386 | .tmio_caps = MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ, | 387 | .tmio_caps = MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ, |
387 | .tmio_ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, | 388 | .tmio_ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, |
388 | .set_pwr = ag5evm_sdhi1_set_pwr, | 389 | .set_pwr = ag5evm_sdhi1_set_pwr, |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 0ea71f8d4b89..17c19dc25604 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
@@ -641,6 +641,8 @@ static struct usbhs_private usbhs0_private = { | |||
641 | }, | 641 | }, |
642 | .driver_param = { | 642 | .driver_param = { |
643 | .buswait_bwait = 4, | 643 | .buswait_bwait = 4, |
644 | .d0_tx_id = SHDMA_SLAVE_USB0_TX, | ||
645 | .d1_rx_id = SHDMA_SLAVE_USB0_RX, | ||
644 | }, | 646 | }, |
645 | }, | 647 | }, |
646 | }; | 648 | }; |
@@ -810,6 +812,8 @@ static struct usbhs_private usbhs1_private = { | |||
810 | .buswait_bwait = 4, | 812 | .buswait_bwait = 4, |
811 | .pipe_type = usbhs1_pipe_cfg, | 813 | .pipe_type = usbhs1_pipe_cfg, |
812 | .pipe_size = ARRAY_SIZE(usbhs1_pipe_cfg), | 814 | .pipe_size = ARRAY_SIZE(usbhs1_pipe_cfg), |
815 | .d0_tx_id = SHDMA_SLAVE_USB1_TX, | ||
816 | .d1_rx_id = SHDMA_SLAVE_USB1_RX, | ||
813 | }, | 817 | }, |
814 | }, | 818 | }, |
815 | }; | 819 | }; |
diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c index e6e11e4e2d43..66975921e646 100644 --- a/arch/arm/mach-shmobile/clock-sh7372.c +++ b/arch/arm/mach-shmobile/clock-sh7372.c | |||
@@ -503,16 +503,17 @@ static struct clk *late_main_clks[] = { | |||
503 | &sh7372_fsidivb_clk, | 503 | &sh7372_fsidivb_clk, |
504 | }; | 504 | }; |
505 | 505 | ||
506 | enum { MSTP001, | 506 | enum { MSTP001, MSTP000, |
507 | MSTP131, MSTP130, | 507 | MSTP131, MSTP130, |
508 | MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, | 508 | MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, |
509 | MSTP118, MSTP117, MSTP116, MSTP113, | 509 | MSTP118, MSTP117, MSTP116, MSTP113, |
510 | MSTP106, MSTP101, MSTP100, | 510 | MSTP106, MSTP101, MSTP100, |
511 | MSTP223, | 511 | MSTP223, |
512 | MSTP218, MSTP217, MSTP216, | 512 | MSTP218, MSTP217, MSTP216, MSTP214, MSTP208, MSTP207, |
513 | MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, | 513 | MSTP206, MSTP205, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, |
514 | MSTP329, MSTP328, MSTP323, MSTP322, MSTP314, MSTP313, MSTP312, | 514 | MSTP328, MSTP323, MSTP322, MSTP314, MSTP313, MSTP312, |
515 | MSTP423, MSTP415, MSTP413, MSTP411, MSTP410, MSTP406, MSTP403, | 515 | MSTP423, MSTP415, MSTP413, MSTP411, MSTP410, MSTP407, MSTP406, |
516 | MSTP405, MSTP404, MSTP403, MSTP400, | ||
516 | MSTP_NR }; | 517 | MSTP_NR }; |
517 | 518 | ||
518 | #define MSTP(_parent, _reg, _bit, _flags) \ | 519 | #define MSTP(_parent, _reg, _bit, _flags) \ |
@@ -520,6 +521,7 @@ enum { MSTP001, | |||
520 | 521 | ||
521 | static struct clk mstp_clks[MSTP_NR] = { | 522 | static struct clk mstp_clks[MSTP_NR] = { |
522 | [MSTP001] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR0, 1, 0), /* IIC2 */ | 523 | [MSTP001] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR0, 1, 0), /* IIC2 */ |
524 | [MSTP000] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR0, 0, 0), /* MSIOF0 */ | ||
523 | [MSTP131] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 31, 0), /* VEU3 */ | 525 | [MSTP131] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 31, 0), /* VEU3 */ |
524 | [MSTP130] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 30, 0), /* VEU2 */ | 526 | [MSTP130] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 30, 0), /* VEU2 */ |
525 | [MSTP129] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 29, 0), /* VEU1 */ | 527 | [MSTP129] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 29, 0), /* VEU1 */ |
@@ -538,14 +540,16 @@ static struct clk mstp_clks[MSTP_NR] = { | |||
538 | [MSTP218] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 18, 0), /* DMAC1 */ | 540 | [MSTP218] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 18, 0), /* DMAC1 */ |
539 | [MSTP217] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 17, 0), /* DMAC2 */ | 541 | [MSTP217] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 17, 0), /* DMAC2 */ |
540 | [MSTP216] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 16, 0), /* DMAC3 */ | 542 | [MSTP216] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 16, 0), /* DMAC3 */ |
543 | [MSTP214] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 14, 0), /* USBDMAC */ | ||
544 | [MSTP208] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 8, 0), /* MSIOF1 */ | ||
541 | [MSTP207] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 7, 0), /* SCIFA5 */ | 545 | [MSTP207] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 7, 0), /* SCIFA5 */ |
542 | [MSTP206] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 6, 0), /* SCIFB */ | 546 | [MSTP206] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 6, 0), /* SCIFB */ |
547 | [MSTP205] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 5, 0), /* MSIOF2 */ | ||
543 | [MSTP204] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 4, 0), /* SCIFA0 */ | 548 | [MSTP204] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 4, 0), /* SCIFA0 */ |
544 | [MSTP203] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 3, 0), /* SCIFA1 */ | 549 | [MSTP203] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 3, 0), /* SCIFA1 */ |
545 | [MSTP202] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 2, 0), /* SCIFA2 */ | 550 | [MSTP202] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 2, 0), /* SCIFA2 */ |
546 | [MSTP201] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 1, 0), /* SCIFA3 */ | 551 | [MSTP201] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 1, 0), /* SCIFA3 */ |
547 | [MSTP200] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 0, 0), /* SCIFA4 */ | 552 | [MSTP200] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 0, 0), /* SCIFA4 */ |
548 | [MSTP329] = MSTP(&r_clk, SMSTPCR3, 29, 0), /* CMT10 */ | ||
549 | [MSTP328] = MSTP(&div6_clks[DIV6_SPU], SMSTPCR3, 28, 0), /* FSI2 */ | 553 | [MSTP328] = MSTP(&div6_clks[DIV6_SPU], SMSTPCR3, 28, 0), /* FSI2 */ |
550 | [MSTP323] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 23, 0), /* IIC1 */ | 554 | [MSTP323] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 23, 0), /* IIC1 */ |
551 | [MSTP322] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 22, 0), /* USB0 */ | 555 | [MSTP322] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 22, 0), /* USB0 */ |
@@ -557,8 +561,12 @@ static struct clk mstp_clks[MSTP_NR] = { | |||
557 | [MSTP413] = MSTP(&pllc1_div2_clk, SMSTPCR4, 13, 0), /* HDMI */ | 561 | [MSTP413] = MSTP(&pllc1_div2_clk, SMSTPCR4, 13, 0), /* HDMI */ |
558 | [MSTP411] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR4, 11, 0), /* IIC3 */ | 562 | [MSTP411] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR4, 11, 0), /* IIC3 */ |
559 | [MSTP410] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR4, 10, 0), /* IIC4 */ | 563 | [MSTP410] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR4, 10, 0), /* IIC4 */ |
564 | [MSTP407] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 7, 0), /* USB-DMAC1 */ | ||
560 | [MSTP406] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR4, 6, 0), /* USB1 */ | 565 | [MSTP406] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR4, 6, 0), /* USB1 */ |
566 | [MSTP405] = MSTP(&r_clk, SMSTPCR4, 5, 0), /* CMT4 */ | ||
567 | [MSTP404] = MSTP(&r_clk, SMSTPCR4, 4, 0), /* CMT3 */ | ||
561 | [MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */ | 568 | [MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */ |
569 | [MSTP400] = MSTP(&r_clk, SMSTPCR4, 0, 0), /* CMT2 */ | ||
562 | }; | 570 | }; |
563 | 571 | ||
564 | static struct clk_lookup lookups[] = { | 572 | static struct clk_lookup lookups[] = { |
@@ -609,6 +617,7 @@ static struct clk_lookup lookups[] = { | |||
609 | 617 | ||
610 | /* MSTP32 clocks */ | 618 | /* MSTP32 clocks */ |
611 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* IIC2 */ | 619 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* IIC2 */ |
620 | CLKDEV_DEV_ID("spi_sh_msiof.0", &mstp_clks[MSTP000]), /* MSIOF0 */ | ||
612 | CLKDEV_DEV_ID("uio_pdrv_genirq.4", &mstp_clks[MSTP131]), /* VEU3 */ | 621 | CLKDEV_DEV_ID("uio_pdrv_genirq.4", &mstp_clks[MSTP131]), /* VEU3 */ |
613 | CLKDEV_DEV_ID("uio_pdrv_genirq.3", &mstp_clks[MSTP130]), /* VEU2 */ | 622 | CLKDEV_DEV_ID("uio_pdrv_genirq.3", &mstp_clks[MSTP130]), /* VEU2 */ |
614 | CLKDEV_DEV_ID("uio_pdrv_genirq.2", &mstp_clks[MSTP129]), /* VEU1 */ | 623 | CLKDEV_DEV_ID("uio_pdrv_genirq.2", &mstp_clks[MSTP129]), /* VEU1 */ |
@@ -629,14 +638,16 @@ static struct clk_lookup lookups[] = { | |||
629 | CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), /* DMAC1 */ | 638 | CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), /* DMAC1 */ |
630 | CLKDEV_DEV_ID("sh-dma-engine.1", &mstp_clks[MSTP217]), /* DMAC2 */ | 639 | CLKDEV_DEV_ID("sh-dma-engine.1", &mstp_clks[MSTP217]), /* DMAC2 */ |
631 | CLKDEV_DEV_ID("sh-dma-engine.2", &mstp_clks[MSTP216]), /* DMAC3 */ | 640 | CLKDEV_DEV_ID("sh-dma-engine.2", &mstp_clks[MSTP216]), /* DMAC3 */ |
641 | CLKDEV_DEV_ID("sh-dma-engine.3", &mstp_clks[MSTP214]), /* USB-DMAC0 */ | ||
642 | CLKDEV_DEV_ID("spi_sh_msiof.1", &mstp_clks[MSTP208]), /* MSIOF1 */ | ||
632 | CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */ | 643 | CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */ |
633 | CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP206]), /* SCIFB */ | 644 | CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP206]), /* SCIFB */ |
645 | CLKDEV_DEV_ID("spi_sh_msiof.2", &mstp_clks[MSTP205]), /* MSIOF2 */ | ||
634 | CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), /* SCIFA0 */ | 646 | CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), /* SCIFA0 */ |
635 | CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), /* SCIFA1 */ | 647 | CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), /* SCIFA1 */ |
636 | CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP202]), /* SCIFA2 */ | 648 | CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP202]), /* SCIFA2 */ |
637 | CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]), /* SCIFA3 */ | 649 | CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]), /* SCIFA3 */ |
638 | CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */ | 650 | CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */ |
639 | CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[MSTP329]), /* CMT10 */ | ||
640 | CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI2 */ | 651 | CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI2 */ |
641 | CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */ | 652 | CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */ |
642 | CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP322]), /* USB0 */ | 653 | CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP322]), /* USB0 */ |
@@ -650,10 +661,14 @@ static struct clk_lookup lookups[] = { | |||
650 | CLKDEV_DEV_ID("sh-mobile-hdmi", &mstp_clks[MSTP413]), /* HDMI */ | 661 | CLKDEV_DEV_ID("sh-mobile-hdmi", &mstp_clks[MSTP413]), /* HDMI */ |
651 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* IIC3 */ | 662 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* IIC3 */ |
652 | CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* IIC4 */ | 663 | CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* IIC4 */ |
664 | CLKDEV_DEV_ID("sh-dma-engine.4", &mstp_clks[MSTP407]), /* USB-DMAC1 */ | ||
653 | CLKDEV_DEV_ID("r8a66597_hcd.1", &mstp_clks[MSTP406]), /* USB1 */ | 665 | CLKDEV_DEV_ID("r8a66597_hcd.1", &mstp_clks[MSTP406]), /* USB1 */ |
654 | CLKDEV_DEV_ID("r8a66597_udc.1", &mstp_clks[MSTP406]), /* USB1 */ | 666 | CLKDEV_DEV_ID("r8a66597_udc.1", &mstp_clks[MSTP406]), /* USB1 */ |
655 | CLKDEV_DEV_ID("renesas_usbhs.1", &mstp_clks[MSTP406]), /* USB1 */ | 667 | CLKDEV_DEV_ID("renesas_usbhs.1", &mstp_clks[MSTP406]), /* USB1 */ |
668 | CLKDEV_DEV_ID("sh_cmt.4", &mstp_clks[MSTP405]), /* CMT4 */ | ||
669 | CLKDEV_DEV_ID("sh_cmt.3", &mstp_clks[MSTP404]), /* CMT3 */ | ||
656 | CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */ | 670 | CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */ |
671 | CLKDEV_DEV_ID("sh_cmt.2", &mstp_clks[MSTP400]), /* CMT2 */ | ||
657 | 672 | ||
658 | CLKDEV_ICK_ID("hdmi", "sh_mobile_lcdc_fb.1", | 673 | CLKDEV_ICK_ID("hdmi", "sh_mobile_lcdc_fb.1", |
659 | &div6_reparent_clks[DIV6_HDMI]), | 674 | &div6_reparent_clks[DIV6_HDMI]), |
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index 6db2ccabc2bf..61a846bb30f2 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c | |||
@@ -365,7 +365,7 @@ void __init sh73a0_clock_init(void) | |||
365 | __raw_writel(0x108, SD2CKCR); | 365 | __raw_writel(0x108, SD2CKCR); |
366 | 366 | ||
367 | /* detect main clock parent */ | 367 | /* detect main clock parent */ |
368 | switch ((__raw_readl(CKSCR) >> 24) & 0x03) { | 368 | switch ((__raw_readl(CKSCR) >> 28) & 0x03) { |
369 | case 0: | 369 | case 0: |
370 | main_clk.parent = &sh73a0_extal1_clk; | 370 | main_clk.parent = &sh73a0_extal1_clk; |
371 | break; | 371 | break; |
diff --git a/arch/arm/mach-shmobile/include/mach/sh7372.h b/arch/arm/mach-shmobile/include/mach/sh7372.h index ce595cee86cd..24e63a85e669 100644 --- a/arch/arm/mach-shmobile/include/mach/sh7372.h +++ b/arch/arm/mach-shmobile/include/mach/sh7372.h | |||
@@ -459,6 +459,10 @@ enum { | |||
459 | SHDMA_SLAVE_SDHI2_TX, | 459 | SHDMA_SLAVE_SDHI2_TX, |
460 | SHDMA_SLAVE_MMCIF_RX, | 460 | SHDMA_SLAVE_MMCIF_RX, |
461 | SHDMA_SLAVE_MMCIF_TX, | 461 | SHDMA_SLAVE_MMCIF_TX, |
462 | SHDMA_SLAVE_USB0_TX, | ||
463 | SHDMA_SLAVE_USB0_RX, | ||
464 | SHDMA_SLAVE_USB1_TX, | ||
465 | SHDMA_SLAVE_USB1_RX, | ||
462 | }; | 466 | }; |
463 | 467 | ||
464 | extern struct clk sh7372_extal1_clk; | 468 | extern struct clk sh7372_extal1_clk; |
diff --git a/arch/arm/mach-shmobile/intc-sh7372.c b/arch/arm/mach-shmobile/intc-sh7372.c index 3b28743c77eb..739315e30eb9 100644 --- a/arch/arm/mach-shmobile/intc-sh7372.c +++ b/arch/arm/mach-shmobile/intc-sh7372.c | |||
@@ -379,7 +379,7 @@ enum { | |||
379 | /* BBIF2 */ | 379 | /* BBIF2 */ |
380 | VPU, | 380 | VPU, |
381 | TSIF1, | 381 | TSIF1, |
382 | _3DG_SGX530, | 382 | /* 3DG */ |
383 | _2DDMAC, | 383 | _2DDMAC, |
384 | IIC2_ALI2, IIC2_TACKI2, IIC2_WAITI2, IIC2_DTEI2, | 384 | IIC2_ALI2, IIC2_TACKI2, IIC2_WAITI2, IIC2_DTEI2, |
385 | IPMMU_IPMMUR, IPMMU_IPMMUR2, | 385 | IPMMU_IPMMUR, IPMMU_IPMMUR2, |
@@ -436,7 +436,7 @@ static struct intc_vect intcs_vectors[] = { | |||
436 | /* BBIF2 */ | 436 | /* BBIF2 */ |
437 | INTCS_VECT(VPU, 0x980), | 437 | INTCS_VECT(VPU, 0x980), |
438 | INTCS_VECT(TSIF1, 0x9a0), | 438 | INTCS_VECT(TSIF1, 0x9a0), |
439 | INTCS_VECT(_3DG_SGX530, 0x9e0), | 439 | /* 3DG */ |
440 | INTCS_VECT(_2DDMAC, 0xa00), | 440 | INTCS_VECT(_2DDMAC, 0xa00), |
441 | INTCS_VECT(IIC2_ALI2, 0xa80), INTCS_VECT(IIC2_TACKI2, 0xaa0), | 441 | INTCS_VECT(IIC2_ALI2, 0xa80), INTCS_VECT(IIC2_TACKI2, 0xaa0), |
442 | INTCS_VECT(IIC2_WAITI2, 0xac0), INTCS_VECT(IIC2_DTEI2, 0xae0), | 442 | INTCS_VECT(IIC2_WAITI2, 0xac0), INTCS_VECT(IIC2_DTEI2, 0xae0), |
@@ -521,7 +521,7 @@ static struct intc_mask_reg intcs_mask_registers[] = { | |||
521 | RTDMAC_1_DEI3, RTDMAC_1_DEI2, RTDMAC_1_DEI1, RTDMAC_1_DEI0 } }, | 521 | RTDMAC_1_DEI3, RTDMAC_1_DEI2, RTDMAC_1_DEI1, RTDMAC_1_DEI0 } }, |
522 | { 0xffd20198, 0xffd201d8, 8, /* IMR6SA / IMCR6SA */ | 522 | { 0xffd20198, 0xffd201d8, 8, /* IMR6SA / IMCR6SA */ |
523 | { 0, 0, MSIOF, 0, | 523 | { 0, 0, MSIOF, 0, |
524 | _3DG_SGX530, 0, 0, 0 } }, | 524 | 0, 0, 0, 0 } }, |
525 | { 0xffd2019c, 0xffd201dc, 8, /* IMR7SA / IMCR7SA */ | 525 | { 0xffd2019c, 0xffd201dc, 8, /* IMR7SA / IMCR7SA */ |
526 | { 0, TMU_TUNI2, TMU_TUNI1, TMU_TUNI0, | 526 | { 0, TMU_TUNI2, TMU_TUNI1, TMU_TUNI0, |
527 | 0, 0, 0, 0 } }, | 527 | 0, 0, 0, 0 } }, |
@@ -561,7 +561,6 @@ static struct intc_prio_reg intcs_prio_registers[] = { | |||
561 | TMU_TUNI2, TSIF1 } }, | 561 | TMU_TUNI2, TSIF1 } }, |
562 | { 0xffd2001c, 0, 16, 4, /* IPRHS */ { 0, 0, VEU, BEU } }, | 562 | { 0xffd2001c, 0, 16, 4, /* IPRHS */ { 0, 0, VEU, BEU } }, |
563 | { 0xffd20020, 0, 16, 4, /* IPRIS */ { 0, MSIOF, TSIF0, IIC0 } }, | 563 | { 0xffd20020, 0, 16, 4, /* IPRIS */ { 0, MSIOF, TSIF0, IIC0 } }, |
564 | { 0xffd20024, 0, 16, 4, /* IPRJS */ { 0, _3DG_SGX530, 0, 0 } }, | ||
565 | { 0xffd20028, 0, 16, 4, /* IPRKS */ { 0, 0, LMB, 0 } }, | 564 | { 0xffd20028, 0, 16, 4, /* IPRKS */ { 0, 0, LMB, 0 } }, |
566 | { 0xffd2002c, 0, 16, 4, /* IPRLS */ { IPMMU, 0, 0, 0 } }, | 565 | { 0xffd2002c, 0, 16, 4, /* IPRLS */ { IPMMU, 0, 0, 0 } }, |
567 | { 0xffd20030, 0, 16, 4, /* IPRMS */ { IIC2, 0, 0, 0 } }, | 566 | { 0xffd20030, 0, 16, 4, /* IPRMS */ { IIC2, 0, 0, 0 } }, |
diff --git a/arch/arm/mach-shmobile/setup-sh7372.c b/arch/arm/mach-shmobile/setup-sh7372.c index 79f0413d8725..2d9b1b1a2538 100644 --- a/arch/arm/mach-shmobile/setup-sh7372.c +++ b/arch/arm/mach-shmobile/setup-sh7372.c | |||
@@ -169,35 +169,35 @@ static struct platform_device scif6_device = { | |||
169 | }; | 169 | }; |
170 | 170 | ||
171 | /* CMT */ | 171 | /* CMT */ |
172 | static struct sh_timer_config cmt10_platform_data = { | 172 | static struct sh_timer_config cmt2_platform_data = { |
173 | .name = "CMT10", | 173 | .name = "CMT2", |
174 | .channel_offset = 0x10, | 174 | .channel_offset = 0x40, |
175 | .timer_bit = 0, | 175 | .timer_bit = 5, |
176 | .clockevent_rating = 125, | 176 | .clockevent_rating = 125, |
177 | .clocksource_rating = 125, | 177 | .clocksource_rating = 125, |
178 | }; | 178 | }; |
179 | 179 | ||
180 | static struct resource cmt10_resources[] = { | 180 | static struct resource cmt2_resources[] = { |
181 | [0] = { | 181 | [0] = { |
182 | .name = "CMT10", | 182 | .name = "CMT2", |
183 | .start = 0xe6138010, | 183 | .start = 0xe6130040, |
184 | .end = 0xe613801b, | 184 | .end = 0xe613004b, |
185 | .flags = IORESOURCE_MEM, | 185 | .flags = IORESOURCE_MEM, |
186 | }, | 186 | }, |
187 | [1] = { | 187 | [1] = { |
188 | .start = evt2irq(0x0b00), /* CMT1_CMT10 */ | 188 | .start = evt2irq(0x0b80), /* CMT2 */ |
189 | .flags = IORESOURCE_IRQ, | 189 | .flags = IORESOURCE_IRQ, |
190 | }, | 190 | }, |
191 | }; | 191 | }; |
192 | 192 | ||
193 | static struct platform_device cmt10_device = { | 193 | static struct platform_device cmt2_device = { |
194 | .name = "sh_cmt", | 194 | .name = "sh_cmt", |
195 | .id = 10, | 195 | .id = 2, |
196 | .dev = { | 196 | .dev = { |
197 | .platform_data = &cmt10_platform_data, | 197 | .platform_data = &cmt2_platform_data, |
198 | }, | 198 | }, |
199 | .resource = cmt10_resources, | 199 | .resource = cmt2_resources, |
200 | .num_resources = ARRAY_SIZE(cmt10_resources), | 200 | .num_resources = ARRAY_SIZE(cmt2_resources), |
201 | }; | 201 | }; |
202 | 202 | ||
203 | /* TMU */ | 203 | /* TMU */ |
@@ -602,6 +602,150 @@ static struct platform_device dma2_device = { | |||
602 | }, | 602 | }, |
603 | }; | 603 | }; |
604 | 604 | ||
605 | /* | ||
606 | * USB-DMAC | ||
607 | */ | ||
608 | |||
609 | unsigned int usbts_shift[] = {3, 4, 5}; | ||
610 | |||
611 | enum { | ||
612 | XMIT_SZ_8BYTE = 0, | ||
613 | XMIT_SZ_16BYTE = 1, | ||
614 | XMIT_SZ_32BYTE = 2, | ||
615 | }; | ||
616 | |||
617 | #define USBTS_INDEX2VAL(i) (((i) & 3) << 6) | ||
618 | |||
619 | static const struct sh_dmae_channel sh7372_usb_dmae_channels[] = { | ||
620 | { | ||
621 | .offset = 0, | ||
622 | }, { | ||
623 | .offset = 0x20, | ||
624 | }, | ||
625 | }; | ||
626 | |||
627 | /* USB DMAC0 */ | ||
628 | static const struct sh_dmae_slave_config sh7372_usb_dmae0_slaves[] = { | ||
629 | { | ||
630 | .slave_id = SHDMA_SLAVE_USB0_TX, | ||
631 | .chcr = USBTS_INDEX2VAL(XMIT_SZ_8BYTE), | ||
632 | }, { | ||
633 | .slave_id = SHDMA_SLAVE_USB0_RX, | ||
634 | .chcr = USBTS_INDEX2VAL(XMIT_SZ_8BYTE), | ||
635 | }, | ||
636 | }; | ||
637 | |||
638 | static struct sh_dmae_pdata usb_dma0_platform_data = { | ||
639 | .slave = sh7372_usb_dmae0_slaves, | ||
640 | .slave_num = ARRAY_SIZE(sh7372_usb_dmae0_slaves), | ||
641 | .channel = sh7372_usb_dmae_channels, | ||
642 | .channel_num = ARRAY_SIZE(sh7372_usb_dmae_channels), | ||
643 | .ts_low_shift = 6, | ||
644 | .ts_low_mask = 0xc0, | ||
645 | .ts_high_shift = 0, | ||
646 | .ts_high_mask = 0, | ||
647 | .ts_shift = usbts_shift, | ||
648 | .ts_shift_num = ARRAY_SIZE(usbts_shift), | ||
649 | .dmaor_init = DMAOR_DME, | ||
650 | .chcr_offset = 0x14, | ||
651 | .chcr_ie_bit = 1 << 5, | ||
652 | .dmaor_is_32bit = 1, | ||
653 | .needs_tend_set = 1, | ||
654 | .no_dmars = 1, | ||
655 | }; | ||
656 | |||
657 | static struct resource sh7372_usb_dmae0_resources[] = { | ||
658 | { | ||
659 | /* Channel registers and DMAOR */ | ||
660 | .start = 0xe68a0020, | ||
661 | .end = 0xe68a0064 - 1, | ||
662 | .flags = IORESOURCE_MEM, | ||
663 | }, | ||
664 | { | ||
665 | /* VCR/SWR/DMICR */ | ||
666 | .start = 0xe68a0000, | ||
667 | .end = 0xe68a0014 - 1, | ||
668 | .flags = IORESOURCE_MEM, | ||
669 | }, | ||
670 | { | ||
671 | /* IRQ for channels */ | ||
672 | .start = evt2irq(0x0a00), | ||
673 | .end = evt2irq(0x0a00), | ||
674 | .flags = IORESOURCE_IRQ, | ||
675 | }, | ||
676 | }; | ||
677 | |||
678 | static struct platform_device usb_dma0_device = { | ||
679 | .name = "sh-dma-engine", | ||
680 | .id = 3, | ||
681 | .resource = sh7372_usb_dmae0_resources, | ||
682 | .num_resources = ARRAY_SIZE(sh7372_usb_dmae0_resources), | ||
683 | .dev = { | ||
684 | .platform_data = &usb_dma0_platform_data, | ||
685 | }, | ||
686 | }; | ||
687 | |||
688 | /* USB DMAC1 */ | ||
689 | static const struct sh_dmae_slave_config sh7372_usb_dmae1_slaves[] = { | ||
690 | { | ||
691 | .slave_id = SHDMA_SLAVE_USB1_TX, | ||
692 | .chcr = USBTS_INDEX2VAL(XMIT_SZ_8BYTE), | ||
693 | }, { | ||
694 | .slave_id = SHDMA_SLAVE_USB1_RX, | ||
695 | .chcr = USBTS_INDEX2VAL(XMIT_SZ_8BYTE), | ||
696 | }, | ||
697 | }; | ||
698 | |||
699 | static struct sh_dmae_pdata usb_dma1_platform_data = { | ||
700 | .slave = sh7372_usb_dmae1_slaves, | ||
701 | .slave_num = ARRAY_SIZE(sh7372_usb_dmae1_slaves), | ||
702 | .channel = sh7372_usb_dmae_channels, | ||
703 | .channel_num = ARRAY_SIZE(sh7372_usb_dmae_channels), | ||
704 | .ts_low_shift = 6, | ||
705 | .ts_low_mask = 0xc0, | ||
706 | .ts_high_shift = 0, | ||
707 | .ts_high_mask = 0, | ||
708 | .ts_shift = usbts_shift, | ||
709 | .ts_shift_num = ARRAY_SIZE(usbts_shift), | ||
710 | .dmaor_init = DMAOR_DME, | ||
711 | .chcr_offset = 0x14, | ||
712 | .chcr_ie_bit = 1 << 5, | ||
713 | .dmaor_is_32bit = 1, | ||
714 | .needs_tend_set = 1, | ||
715 | .no_dmars = 1, | ||
716 | }; | ||
717 | |||
718 | static struct resource sh7372_usb_dmae1_resources[] = { | ||
719 | { | ||
720 | /* Channel registers and DMAOR */ | ||
721 | .start = 0xe68c0020, | ||
722 | .end = 0xe68c0064 - 1, | ||
723 | .flags = IORESOURCE_MEM, | ||
724 | }, | ||
725 | { | ||
726 | /* VCR/SWR/DMICR */ | ||
727 | .start = 0xe68c0000, | ||
728 | .end = 0xe68c0014 - 1, | ||
729 | .flags = IORESOURCE_MEM, | ||
730 | }, | ||
731 | { | ||
732 | /* IRQ for channels */ | ||
733 | .start = evt2irq(0x1d00), | ||
734 | .end = evt2irq(0x1d00), | ||
735 | .flags = IORESOURCE_IRQ, | ||
736 | }, | ||
737 | }; | ||
738 | |||
739 | static struct platform_device usb_dma1_device = { | ||
740 | .name = "sh-dma-engine", | ||
741 | .id = 4, | ||
742 | .resource = sh7372_usb_dmae1_resources, | ||
743 | .num_resources = ARRAY_SIZE(sh7372_usb_dmae1_resources), | ||
744 | .dev = { | ||
745 | .platform_data = &usb_dma1_platform_data, | ||
746 | }, | ||
747 | }; | ||
748 | |||
605 | /* VPU */ | 749 | /* VPU */ |
606 | static struct uio_info vpu_platform_data = { | 750 | static struct uio_info vpu_platform_data = { |
607 | .name = "VPU5HG", | 751 | .name = "VPU5HG", |
@@ -818,7 +962,7 @@ static struct platform_device *sh7372_early_devices[] __initdata = { | |||
818 | &scif4_device, | 962 | &scif4_device, |
819 | &scif5_device, | 963 | &scif5_device, |
820 | &scif6_device, | 964 | &scif6_device, |
821 | &cmt10_device, | 965 | &cmt2_device, |
822 | &tmu00_device, | 966 | &tmu00_device, |
823 | &tmu01_device, | 967 | &tmu01_device, |
824 | }; | 968 | }; |
@@ -829,6 +973,8 @@ static struct platform_device *sh7372_late_devices[] __initdata = { | |||
829 | &dma0_device, | 973 | &dma0_device, |
830 | &dma1_device, | 974 | &dma1_device, |
831 | &dma2_device, | 975 | &dma2_device, |
976 | &usb_dma0_device, | ||
977 | &usb_dma1_device, | ||
832 | &vpu_device, | 978 | &vpu_device, |
833 | &veu0_device, | 979 | &veu0_device, |
834 | &veu1_device, | 980 | &veu1_device, |
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 9e6b93b1a043..d0d267a8d3f9 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c | |||
@@ -318,6 +318,10 @@ static struct clk v2m_sp804_clk = { | |||
318 | .rate = 1000000, | 318 | .rate = 1000000, |
319 | }; | 319 | }; |
320 | 320 | ||
321 | static struct clk v2m_ref_clk = { | ||
322 | .rate = 32768, | ||
323 | }; | ||
324 | |||
321 | static struct clk dummy_apb_pclk; | 325 | static struct clk dummy_apb_pclk; |
322 | 326 | ||
323 | static struct clk_lookup v2m_lookups[] = { | 327 | static struct clk_lookup v2m_lookups[] = { |
@@ -348,6 +352,9 @@ static struct clk_lookup v2m_lookups[] = { | |||
348 | }, { /* CLCD */ | 352 | }, { /* CLCD */ |
349 | .dev_id = "mb:clcd", | 353 | .dev_id = "mb:clcd", |
350 | .clk = &osc1_clk, | 354 | .clk = &osc1_clk, |
355 | }, { /* SP805 WDT */ | ||
356 | .dev_id = "mb:wdt", | ||
357 | .clk = &v2m_ref_clk, | ||
351 | }, { /* SP804 timers */ | 358 | }, { /* SP804 timers */ |
352 | .dev_id = "sp804", | 359 | .dev_id = "sp804", |
353 | .con_id = "v2m-timer0", | 360 | .con_id = "v2m-timer0", |
diff --git a/arch/arm/mm/abort-macro.S b/arch/arm/mm/abort-macro.S index 52162d59407a..2cbf68ef0e83 100644 --- a/arch/arm/mm/abort-macro.S +++ b/arch/arm/mm/abort-macro.S | |||
@@ -17,7 +17,7 @@ | |||
17 | cmp \tmp, # 0x5600 @ Is it ldrsb? | 17 | cmp \tmp, # 0x5600 @ Is it ldrsb? |
18 | orreq \tmp, \tmp, #1 << 11 @ Set L-bit if yes | 18 | orreq \tmp, \tmp, #1 << 11 @ Set L-bit if yes |
19 | tst \tmp, #1 << 11 @ L = 0 -> write | 19 | tst \tmp, #1 << 11 @ L = 0 -> write |
20 | orreq \psr, \psr, #1 << 11 @ yes. | 20 | orreq \fsr, \fsr, #1 << 11 @ yes. |
21 | b do_DataAbort | 21 | b do_DataAbort |
22 | not_thumb: | 22 | not_thumb: |
23 | .endm | 23 | .endm |
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 44c086710d2b..9ecfdb511951 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
@@ -277,6 +277,25 @@ static void l2x0_disable(void) | |||
277 | spin_unlock_irqrestore(&l2x0_lock, flags); | 277 | spin_unlock_irqrestore(&l2x0_lock, flags); |
278 | } | 278 | } |
279 | 279 | ||
280 | static void __init l2x0_unlock(__u32 cache_id) | ||
281 | { | ||
282 | int lockregs; | ||
283 | int i; | ||
284 | |||
285 | if (cache_id == L2X0_CACHE_ID_PART_L310) | ||
286 | lockregs = 8; | ||
287 | else | ||
288 | /* L210 and unknown types */ | ||
289 | lockregs = 1; | ||
290 | |||
291 | for (i = 0; i < lockregs; i++) { | ||
292 | writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_D_BASE + | ||
293 | i * L2X0_LOCKDOWN_STRIDE); | ||
294 | writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_I_BASE + | ||
295 | i * L2X0_LOCKDOWN_STRIDE); | ||
296 | } | ||
297 | } | ||
298 | |||
280 | void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask) | 299 | void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask) |
281 | { | 300 | { |
282 | __u32 aux; | 301 | __u32 aux; |
@@ -328,6 +347,8 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask) | |||
328 | * accessing the below registers will fault. | 347 | * accessing the below registers will fault. |
329 | */ | 348 | */ |
330 | if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { | 349 | if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { |
350 | /* Make sure that I&D is not locked down when starting */ | ||
351 | l2x0_unlock(cache_id); | ||
331 | 352 | ||
332 | /* l2x0 controller is disabled */ | 353 | /* l2x0 controller is disabled */ |
333 | writel_relaxed(aux, l2x0_base + L2X0_AUX_CTRL); | 354 | writel_relaxed(aux, l2x0_base + L2X0_AUX_CTRL); |
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index 3b24bfa3b828..07c4bc8ea0a4 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
@@ -174,6 +174,10 @@ ENTRY(v7_coherent_user_range) | |||
174 | dcache_line_size r2, r3 | 174 | dcache_line_size r2, r3 |
175 | sub r3, r2, #1 | 175 | sub r3, r2, #1 |
176 | bic r12, r0, r3 | 176 | bic r12, r0, r3 |
177 | #ifdef CONFIG_ARM_ERRATA_764369 | ||
178 | ALT_SMP(W(dsb)) | ||
179 | ALT_UP(W(nop)) | ||
180 | #endif | ||
177 | 1: | 181 | 1: |
178 | USER( mcr p15, 0, r12, c7, c11, 1 ) @ clean D line to the point of unification | 182 | USER( mcr p15, 0, r12, c7, c11, 1 ) @ clean D line to the point of unification |
179 | add r12, r12, r2 | 183 | add r12, r12, r2 |
@@ -223,6 +227,10 @@ ENTRY(v7_flush_kern_dcache_area) | |||
223 | add r1, r0, r1 | 227 | add r1, r0, r1 |
224 | sub r3, r2, #1 | 228 | sub r3, r2, #1 |
225 | bic r0, r0, r3 | 229 | bic r0, r0, r3 |
230 | #ifdef CONFIG_ARM_ERRATA_764369 | ||
231 | ALT_SMP(W(dsb)) | ||
232 | ALT_UP(W(nop)) | ||
233 | #endif | ||
226 | 1: | 234 | 1: |
227 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line / unified line | 235 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line / unified line |
228 | add r0, r0, r2 | 236 | add r0, r0, r2 |
@@ -247,6 +255,10 @@ v7_dma_inv_range: | |||
247 | sub r3, r2, #1 | 255 | sub r3, r2, #1 |
248 | tst r0, r3 | 256 | tst r0, r3 |
249 | bic r0, r0, r3 | 257 | bic r0, r0, r3 |
258 | #ifdef CONFIG_ARM_ERRATA_764369 | ||
259 | ALT_SMP(W(dsb)) | ||
260 | ALT_UP(W(nop)) | ||
261 | #endif | ||
250 | mcrne p15, 0, r0, c7, c14, 1 @ clean & invalidate D / U line | 262 | mcrne p15, 0, r0, c7, c14, 1 @ clean & invalidate D / U line |
251 | 263 | ||
252 | tst r1, r3 | 264 | tst r1, r3 |
@@ -270,6 +282,10 @@ v7_dma_clean_range: | |||
270 | dcache_line_size r2, r3 | 282 | dcache_line_size r2, r3 |
271 | sub r3, r2, #1 | 283 | sub r3, r2, #1 |
272 | bic r0, r0, r3 | 284 | bic r0, r0, r3 |
285 | #ifdef CONFIG_ARM_ERRATA_764369 | ||
286 | ALT_SMP(W(dsb)) | ||
287 | ALT_UP(W(nop)) | ||
288 | #endif | ||
273 | 1: | 289 | 1: |
274 | mcr p15, 0, r0, c7, c10, 1 @ clean D / U line | 290 | mcr p15, 0, r0, c7, c10, 1 @ clean D / U line |
275 | add r0, r0, r2 | 291 | add r0, r0, r2 |
@@ -288,6 +304,10 @@ ENTRY(v7_dma_flush_range) | |||
288 | dcache_line_size r2, r3 | 304 | dcache_line_size r2, r3 |
289 | sub r3, r2, #1 | 305 | sub r3, r2, #1 |
290 | bic r0, r0, r3 | 306 | bic r0, r0, r3 |
307 | #ifdef CONFIG_ARM_ERRATA_764369 | ||
308 | ALT_SMP(W(dsb)) | ||
309 | ALT_UP(W(nop)) | ||
310 | #endif | ||
291 | 1: | 311 | 1: |
292 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D / U line | 312 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D / U line |
293 | add r0, r0, r2 | 313 | add r0, r0, r2 |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 0a0a1e7c20d2..c3ff82f92d9c 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -324,6 +324,8 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | |||
324 | 324 | ||
325 | if (addr) | 325 | if (addr) |
326 | *handle = pfn_to_dma(dev, page_to_pfn(page)); | 326 | *handle = pfn_to_dma(dev, page_to_pfn(page)); |
327 | else | ||
328 | __dma_free_buffer(page, size); | ||
327 | 329 | ||
328 | return addr; | 330 | return addr; |
329 | } | 331 | } |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 91bca355cd31..cc7e2d8be9aa 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -298,7 +298,7 @@ static void __init arm_bootmem_free(unsigned long min, unsigned long max_low, | |||
298 | #ifdef CONFIG_HAVE_ARCH_PFN_VALID | 298 | #ifdef CONFIG_HAVE_ARCH_PFN_VALID |
299 | int pfn_valid(unsigned long pfn) | 299 | int pfn_valid(unsigned long pfn) |
300 | { | 300 | { |
301 | return memblock_is_memory(pfn << PAGE_SHIFT); | 301 | return memblock_is_memory(__pfn_to_phys(pfn)); |
302 | } | 302 | } |
303 | EXPORT_SYMBOL(pfn_valid); | 303 | EXPORT_SYMBOL(pfn_valid); |
304 | #endif | 304 | #endif |
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index 92bd102e3982..2e6849b41f66 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S | |||
@@ -379,7 +379,7 @@ ENTRY(cpu_arm920_set_pte_ext) | |||
379 | 379 | ||
380 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ | 380 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ |
381 | .globl cpu_arm920_suspend_size | 381 | .globl cpu_arm920_suspend_size |
382 | .equ cpu_arm920_suspend_size, 4 * 3 | 382 | .equ cpu_arm920_suspend_size, 4 * 4 |
383 | #ifdef CONFIG_PM_SLEEP | 383 | #ifdef CONFIG_PM_SLEEP |
384 | ENTRY(cpu_arm920_do_suspend) | 384 | ENTRY(cpu_arm920_do_suspend) |
385 | stmfd sp!, {r4 - r7, lr} | 385 | stmfd sp!, {r4 - r7, lr} |
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index 2bbcf053dffd..cd8f79c3a282 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S | |||
@@ -394,7 +394,7 @@ ENTRY(cpu_arm926_set_pte_ext) | |||
394 | 394 | ||
395 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ | 395 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ |
396 | .globl cpu_arm926_suspend_size | 396 | .globl cpu_arm926_suspend_size |
397 | .equ cpu_arm926_suspend_size, 4 * 3 | 397 | .equ cpu_arm926_suspend_size, 4 * 4 |
398 | #ifdef CONFIG_PM_SLEEP | 398 | #ifdef CONFIG_PM_SLEEP |
399 | ENTRY(cpu_arm926_do_suspend) | 399 | ENTRY(cpu_arm926_do_suspend) |
400 | stmfd sp!, {r4 - r7, lr} | 400 | stmfd sp!, {r4 - r7, lr} |
diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 07219c2ae114..69e7f2ef7384 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S | |||
@@ -182,11 +182,11 @@ ENDPROC(cpu_sa1100_do_suspend) | |||
182 | 182 | ||
183 | ENTRY(cpu_sa1100_do_resume) | 183 | ENTRY(cpu_sa1100_do_resume) |
184 | ldmia r0, {r4 - r7} @ load cp regs | 184 | ldmia r0, {r4 - r7} @ load cp regs |
185 | mov r1, #0 | 185 | mov ip, #0 |
186 | mcr p15, 0, r1, c8, c7, 0 @ flush I+D TLBs | 186 | mcr p15, 0, ip, c8, c7, 0 @ flush I+D TLBs |
187 | mcr p15, 0, r1, c7, c7, 0 @ flush I&D cache | 187 | mcr p15, 0, ip, c7, c7, 0 @ flush I&D cache |
188 | mcr p15, 0, r1, c9, c0, 0 @ invalidate RB | 188 | mcr p15, 0, ip, c9, c0, 0 @ invalidate RB |
189 | mcr p15, 0, r1, c9, c0, 5 @ allow user space to use RB | 189 | mcr p15, 0, ip, c9, c0, 5 @ allow user space to use RB |
190 | 190 | ||
191 | mcr p15, 0, r4, c3, c0, 0 @ domain ID | 191 | mcr p15, 0, r4, c3, c0, 0 @ domain ID |
192 | mcr p15, 0, r5, c2, c0, 0 @ translation table base addr | 192 | mcr p15, 0, r5, c2, c0, 0 @ translation table base addr |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 219138d2f158..a923aa0fd00d 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -223,6 +223,22 @@ __v6_setup: | |||
223 | mrc p15, 0, r0, c1, c0, 0 @ read control register | 223 | mrc p15, 0, r0, c1, c0, 0 @ read control register |
224 | bic r0, r0, r5 @ clear bits them | 224 | bic r0, r0, r5 @ clear bits them |
225 | orr r0, r0, r6 @ set them | 225 | orr r0, r0, r6 @ set them |
226 | #ifdef CONFIG_ARM_ERRATA_364296 | ||
227 | /* | ||
228 | * Workaround for the 364296 ARM1136 r0p2 erratum (possible cache data | ||
229 | * corruption with hit-under-miss enabled). The conditional code below | ||
230 | * (setting the undocumented bit 31 in the auxiliary control register | ||
231 | * and the FI bit in the control register) disables hit-under-miss | ||
232 | * without putting the processor into full low interrupt latency mode. | ||
233 | */ | ||
234 | ldr r6, =0x4107b362 @ id for ARM1136 r0p2 | ||
235 | mrc p15, 0, r5, c0, c0, 0 @ get processor id | ||
236 | teq r5, r6 @ check for the faulty core | ||
237 | mrceq p15, 0, r5, c1, c0, 1 @ load aux control reg | ||
238 | orreq r5, r5, #(1 << 31) @ set the undocumented bit 31 | ||
239 | mcreq p15, 0, r5, c1, c0, 1 @ write aux control reg | ||
240 | orreq r0, r0, #(1 << 21) @ low interrupt latency configuration | ||
241 | #endif | ||
226 | mov pc, lr @ return to head.S:__ret | 242 | mov pc, lr @ return to head.S:__ret |
227 | 243 | ||
228 | /* | 244 | /* |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index a30e78542ccf..9049c0764db2 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -66,6 +66,7 @@ ENDPROC(cpu_v7_proc_fin) | |||
66 | ENTRY(cpu_v7_reset) | 66 | ENTRY(cpu_v7_reset) |
67 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register | 67 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register |
68 | bic r1, r1, #0x1 @ ...............m | 68 | bic r1, r1, #0x1 @ ...............m |
69 | THUMB( bic r1, r1, #1 << 30 ) @ SCTLR.TE (Thumb exceptions) | ||
69 | mcr p15, 0, r1, c1, c0, 0 @ disable MMU | 70 | mcr p15, 0, r1, c1, c0, 0 @ disable MMU |
70 | isb | 71 | isb |
71 | mov pc, r0 | 72 | mov pc, r0 |
@@ -247,13 +248,16 @@ ENTRY(cpu_v7_do_resume) | |||
247 | mcr p15, 0, r7, c2, c0, 0 @ TTB 0 | 248 | mcr p15, 0, r7, c2, c0, 0 @ TTB 0 |
248 | mcr p15, 0, r8, c2, c0, 1 @ TTB 1 | 249 | mcr p15, 0, r8, c2, c0, 1 @ TTB 1 |
249 | mcr p15, 0, ip, c2, c0, 2 @ TTB control register | 250 | mcr p15, 0, ip, c2, c0, 2 @ TTB control register |
250 | mcr p15, 0, r10, c1, c0, 1 @ Auxiliary control register | 251 | mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register |
252 | teq r4, r10 @ Is it already set? | ||
253 | mcrne p15, 0, r10, c1, c0, 1 @ No, so write it | ||
251 | mcr p15, 0, r11, c1, c0, 2 @ Co-processor access control | 254 | mcr p15, 0, r11, c1, c0, 2 @ Co-processor access control |
252 | ldr r4, =PRRR @ PRRR | 255 | ldr r4, =PRRR @ PRRR |
253 | ldr r5, =NMRR @ NMRR | 256 | ldr r5, =NMRR @ NMRR |
254 | mcr p15, 0, r4, c10, c2, 0 @ write PRRR | 257 | mcr p15, 0, r4, c10, c2, 0 @ write PRRR |
255 | mcr p15, 0, r5, c10, c2, 1 @ write NMRR | 258 | mcr p15, 0, r5, c10, c2, 1 @ write NMRR |
256 | isb | 259 | isb |
260 | dsb | ||
257 | mov r0, r9 @ control register | 261 | mov r0, r9 @ control register |
258 | mov r2, r7, lsr #14 @ get TTB0 base | 262 | mov r2, r7, lsr #14 @ get TTB0 base |
259 | mov r2, r2, lsl #14 | 263 | mov r2, r2, lsl #14 |
diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S index 28c72a2006a1..755e1bf22681 100644 --- a/arch/arm/mm/proc-xsc3.S +++ b/arch/arm/mm/proc-xsc3.S | |||
@@ -406,7 +406,7 @@ ENTRY(cpu_xsc3_set_pte_ext) | |||
406 | .align | 406 | .align |
407 | 407 | ||
408 | .globl cpu_xsc3_suspend_size | 408 | .globl cpu_xsc3_suspend_size |
409 | .equ cpu_xsc3_suspend_size, 4 * 8 | 409 | .equ cpu_xsc3_suspend_size, 4 * 7 |
410 | #ifdef CONFIG_PM_SLEEP | 410 | #ifdef CONFIG_PM_SLEEP |
411 | ENTRY(cpu_xsc3_do_suspend) | 411 | ENTRY(cpu_xsc3_do_suspend) |
412 | stmfd sp!, {r4 - r10, lr} | 412 | stmfd sp!, {r4 - r10, lr} |
@@ -418,12 +418,12 @@ ENTRY(cpu_xsc3_do_suspend) | |||
418 | mrc p15, 0, r9, c1, c0, 1 @ auxiliary control reg | 418 | mrc p15, 0, r9, c1, c0, 1 @ auxiliary control reg |
419 | mrc p15, 0, r10, c1, c0, 0 @ control reg | 419 | mrc p15, 0, r10, c1, c0, 0 @ control reg |
420 | bic r4, r4, #2 @ clear frequency change bit | 420 | bic r4, r4, #2 @ clear frequency change bit |
421 | stmia r0, {r1, r4 - r10} @ store v:p offset + cp regs | 421 | stmia r0, {r4 - r10} @ store cp regs |
422 | ldmia sp!, {r4 - r10, pc} | 422 | ldmia sp!, {r4 - r10, pc} |
423 | ENDPROC(cpu_xsc3_do_suspend) | 423 | ENDPROC(cpu_xsc3_do_suspend) |
424 | 424 | ||
425 | ENTRY(cpu_xsc3_do_resume) | 425 | ENTRY(cpu_xsc3_do_resume) |
426 | ldmia r0, {r1, r4 - r10} @ load v:p offset + cp regs | 426 | ldmia r0, {r4 - r10} @ load cp regs |
427 | mov ip, #0 | 427 | mov ip, #0 |
428 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I & D caches, BTB | 428 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I & D caches, BTB |
429 | mcr p15, 0, ip, c7, c10, 4 @ drain write (&fill) buffer | 429 | mcr p15, 0, ip, c7, c10, 4 @ drain write (&fill) buffer |
diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index ea28f98d5d6a..bd9a06b3ee89 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c | |||
@@ -26,54 +26,8 @@ | |||
26 | #include <plat/mmc.h> | 26 | #include <plat/mmc.h> |
27 | #include <mach/gpio.h> | 27 | #include <mach/gpio.h> |
28 | #include <plat/menelaus.h> | 28 | #include <plat/menelaus.h> |
29 | #include <plat/mcbsp.h> | ||
30 | #include <plat/omap44xx.h> | 29 | #include <plat/omap44xx.h> |
31 | 30 | ||
32 | /*-------------------------------------------------------------------------*/ | ||
33 | |||
34 | #if defined(CONFIG_OMAP_MCBSP) || defined(CONFIG_OMAP_MCBSP_MODULE) | ||
35 | |||
36 | static struct platform_device **omap_mcbsp_devices; | ||
37 | |||
38 | void omap_mcbsp_register_board_cfg(struct resource *res, int res_count, | ||
39 | struct omap_mcbsp_platform_data *config, int size) | ||
40 | { | ||
41 | int i; | ||
42 | |||
43 | omap_mcbsp_devices = kzalloc(size * sizeof(struct platform_device *), | ||
44 | GFP_KERNEL); | ||
45 | if (!omap_mcbsp_devices) { | ||
46 | printk(KERN_ERR "Could not register McBSP devices\n"); | ||
47 | return; | ||
48 | } | ||
49 | |||
50 | for (i = 0; i < size; i++) { | ||
51 | struct platform_device *new_mcbsp; | ||
52 | int ret; | ||
53 | |||
54 | new_mcbsp = platform_device_alloc("omap-mcbsp", i + 1); | ||
55 | if (!new_mcbsp) | ||
56 | continue; | ||
57 | platform_device_add_resources(new_mcbsp, &res[i * res_count], | ||
58 | res_count); | ||
59 | new_mcbsp->dev.platform_data = &config[i]; | ||
60 | ret = platform_device_add(new_mcbsp); | ||
61 | if (ret) { | ||
62 | platform_device_put(new_mcbsp); | ||
63 | continue; | ||
64 | } | ||
65 | omap_mcbsp_devices[i] = new_mcbsp; | ||
66 | } | ||
67 | } | ||
68 | |||
69 | #else | ||
70 | void omap_mcbsp_register_board_cfg(struct resource *res, int res_count, | ||
71 | struct omap_mcbsp_platform_data *config, int size) | ||
72 | { } | ||
73 | #endif | ||
74 | |||
75 | /*-------------------------------------------------------------------------*/ | ||
76 | |||
77 | #if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \ | 31 | #if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \ |
78 | defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE) | 32 | defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE) |
79 | 33 | ||
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 75a847dd776a..de7896fd9b33 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
@@ -3,6 +3,12 @@ | |||
3 | * | 3 | * |
4 | * OMAP Dual-Mode Timers | 4 | * OMAP Dual-Mode Timers |
5 | * | 5 | * |
6 | * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ | ||
7 | * Tarun Kanti DebBarma <tarun.kanti@ti.com> | ||
8 | * Thara Gopinath <thara@ti.com> | ||
9 | * | ||
10 | * dmtimer adaptation to platform_driver. | ||
11 | * | ||
6 | * Copyright (C) 2005 Nokia Corporation | 12 | * Copyright (C) 2005 Nokia Corporation |
7 | * OMAP2 support by Juha Yrjola | 13 | * OMAP2 support by Juha Yrjola |
8 | * API improvements and OMAP2 clock framework support by Timo Teras | 14 | * API improvements and OMAP2 clock framework support by Timo Teras |
@@ -29,168 +35,80 @@ | |||
29 | * 675 Mass Ave, Cambridge, MA 02139, USA. | 35 | * 675 Mass Ave, Cambridge, MA 02139, USA. |
30 | */ | 36 | */ |
31 | 37 | ||
32 | #include <linux/init.h> | ||
33 | #include <linux/spinlock.h> | ||
34 | #include <linux/errno.h> | ||
35 | #include <linux/list.h> | ||
36 | #include <linux/clk.h> | ||
37 | #include <linux/delay.h> | ||
38 | #include <linux/io.h> | 38 | #include <linux/io.h> |
39 | #include <linux/module.h> | 39 | #include <linux/slab.h> |
40 | #include <mach/hardware.h> | 40 | #include <linux/err.h> |
41 | #include <plat/dmtimer.h> | 41 | #include <linux/pm_runtime.h> |
42 | #include <mach/irqs.h> | ||
43 | |||
44 | static int dm_timer_count; | ||
45 | |||
46 | #ifdef CONFIG_ARCH_OMAP1 | ||
47 | static struct omap_dm_timer omap1_dm_timers[] = { | ||
48 | { .phys_base = 0xfffb1400, .irq = INT_1610_GPTIMER1 }, | ||
49 | { .phys_base = 0xfffb1c00, .irq = INT_1610_GPTIMER2 }, | ||
50 | { .phys_base = 0xfffb2400, .irq = INT_1610_GPTIMER3 }, | ||
51 | { .phys_base = 0xfffb2c00, .irq = INT_1610_GPTIMER4 }, | ||
52 | { .phys_base = 0xfffb3400, .irq = INT_1610_GPTIMER5 }, | ||
53 | { .phys_base = 0xfffb3c00, .irq = INT_1610_GPTIMER6 }, | ||
54 | { .phys_base = 0xfffb7400, .irq = INT_1610_GPTIMER7 }, | ||
55 | { .phys_base = 0xfffbd400, .irq = INT_1610_GPTIMER8 }, | ||
56 | }; | ||
57 | |||
58 | static const int omap1_dm_timer_count = ARRAY_SIZE(omap1_dm_timers); | ||
59 | |||
60 | #else | ||
61 | #define omap1_dm_timers NULL | ||
62 | #define omap1_dm_timer_count 0 | ||
63 | #endif /* CONFIG_ARCH_OMAP1 */ | ||
64 | |||
65 | #ifdef CONFIG_ARCH_OMAP2 | ||
66 | static struct omap_dm_timer omap2_dm_timers[] = { | ||
67 | { .phys_base = 0x48028000, .irq = INT_24XX_GPTIMER1 }, | ||
68 | { .phys_base = 0x4802a000, .irq = INT_24XX_GPTIMER2 }, | ||
69 | { .phys_base = 0x48078000, .irq = INT_24XX_GPTIMER3 }, | ||
70 | { .phys_base = 0x4807a000, .irq = INT_24XX_GPTIMER4 }, | ||
71 | { .phys_base = 0x4807c000, .irq = INT_24XX_GPTIMER5 }, | ||
72 | { .phys_base = 0x4807e000, .irq = INT_24XX_GPTIMER6 }, | ||
73 | { .phys_base = 0x48080000, .irq = INT_24XX_GPTIMER7 }, | ||
74 | { .phys_base = 0x48082000, .irq = INT_24XX_GPTIMER8 }, | ||
75 | { .phys_base = 0x48084000, .irq = INT_24XX_GPTIMER9 }, | ||
76 | { .phys_base = 0x48086000, .irq = INT_24XX_GPTIMER10 }, | ||
77 | { .phys_base = 0x48088000, .irq = INT_24XX_GPTIMER11 }, | ||
78 | { .phys_base = 0x4808a000, .irq = INT_24XX_GPTIMER12 }, | ||
79 | }; | ||
80 | |||
81 | static const char *omap2_dm_source_names[] __initdata = { | ||
82 | "sys_ck", | ||
83 | "func_32k_ck", | ||
84 | "alt_ck", | ||
85 | NULL | ||
86 | }; | ||
87 | |||
88 | static struct clk *omap2_dm_source_clocks[3]; | ||
89 | static const int omap2_dm_timer_count = ARRAY_SIZE(omap2_dm_timers); | ||
90 | |||
91 | #else | ||
92 | #define omap2_dm_timers NULL | ||
93 | #define omap2_dm_timer_count 0 | ||
94 | #define omap2_dm_source_names NULL | ||
95 | #define omap2_dm_source_clocks NULL | ||
96 | #endif /* CONFIG_ARCH_OMAP2 */ | ||
97 | |||
98 | #ifdef CONFIG_ARCH_OMAP3 | ||
99 | static struct omap_dm_timer omap3_dm_timers[] = { | ||
100 | { .phys_base = 0x48318000, .irq = INT_24XX_GPTIMER1 }, | ||
101 | { .phys_base = 0x49032000, .irq = INT_24XX_GPTIMER2 }, | ||
102 | { .phys_base = 0x49034000, .irq = INT_24XX_GPTIMER3 }, | ||
103 | { .phys_base = 0x49036000, .irq = INT_24XX_GPTIMER4 }, | ||
104 | { .phys_base = 0x49038000, .irq = INT_24XX_GPTIMER5 }, | ||
105 | { .phys_base = 0x4903A000, .irq = INT_24XX_GPTIMER6 }, | ||
106 | { .phys_base = 0x4903C000, .irq = INT_24XX_GPTIMER7 }, | ||
107 | { .phys_base = 0x4903E000, .irq = INT_24XX_GPTIMER8 }, | ||
108 | { .phys_base = 0x49040000, .irq = INT_24XX_GPTIMER9 }, | ||
109 | { .phys_base = 0x48086000, .irq = INT_24XX_GPTIMER10 }, | ||
110 | { .phys_base = 0x48088000, .irq = INT_24XX_GPTIMER11 }, | ||
111 | { .phys_base = 0x48304000, .irq = INT_34XX_GPT12_IRQ }, | ||
112 | }; | ||
113 | |||
114 | static const char *omap3_dm_source_names[] __initdata = { | ||
115 | "sys_ck", | ||
116 | "omap_32k_fck", | ||
117 | NULL | ||
118 | }; | ||
119 | |||
120 | static struct clk *omap3_dm_source_clocks[2]; | ||
121 | static const int omap3_dm_timer_count = ARRAY_SIZE(omap3_dm_timers); | ||
122 | 42 | ||
123 | #else | 43 | #include <plat/dmtimer.h> |
124 | #define omap3_dm_timers NULL | ||
125 | #define omap3_dm_timer_count 0 | ||
126 | #define omap3_dm_source_names NULL | ||
127 | #define omap3_dm_source_clocks NULL | ||
128 | #endif /* CONFIG_ARCH_OMAP3 */ | ||
129 | |||
130 | #ifdef CONFIG_ARCH_OMAP4 | ||
131 | static struct omap_dm_timer omap4_dm_timers[] = { | ||
132 | { .phys_base = 0x4a318000, .irq = OMAP44XX_IRQ_GPT1 }, | ||
133 | { .phys_base = 0x48032000, .irq = OMAP44XX_IRQ_GPT2 }, | ||
134 | { .phys_base = 0x48034000, .irq = OMAP44XX_IRQ_GPT3 }, | ||
135 | { .phys_base = 0x48036000, .irq = OMAP44XX_IRQ_GPT4 }, | ||
136 | { .phys_base = 0x40138000, .irq = OMAP44XX_IRQ_GPT5 }, | ||
137 | { .phys_base = 0x4013a000, .irq = OMAP44XX_IRQ_GPT6 }, | ||
138 | { .phys_base = 0x4013a000, .irq = OMAP44XX_IRQ_GPT7 }, | ||
139 | { .phys_base = 0x4013e000, .irq = OMAP44XX_IRQ_GPT8 }, | ||
140 | { .phys_base = 0x4803e000, .irq = OMAP44XX_IRQ_GPT9 }, | ||
141 | { .phys_base = 0x48086000, .irq = OMAP44XX_IRQ_GPT10 }, | ||
142 | { .phys_base = 0x48088000, .irq = OMAP44XX_IRQ_GPT11 }, | ||
143 | { .phys_base = 0x4a320000, .irq = OMAP44XX_IRQ_GPT12 }, | ||
144 | }; | ||
145 | static const char *omap4_dm_source_names[] __initdata = { | ||
146 | "sys_clkin_ck", | ||
147 | "sys_32k_ck", | ||
148 | NULL | ||
149 | }; | ||
150 | static struct clk *omap4_dm_source_clocks[2]; | ||
151 | static const int omap4_dm_timer_count = ARRAY_SIZE(omap4_dm_timers); | ||
152 | |||
153 | #else | ||
154 | #define omap4_dm_timers NULL | ||
155 | #define omap4_dm_timer_count 0 | ||
156 | #define omap4_dm_source_names NULL | ||
157 | #define omap4_dm_source_clocks NULL | ||
158 | #endif /* CONFIG_ARCH_OMAP4 */ | ||
159 | |||
160 | static struct omap_dm_timer *dm_timers; | ||
161 | static const char **dm_source_names; | ||
162 | static struct clk **dm_source_clocks; | ||
163 | 44 | ||
164 | static spinlock_t dm_timer_lock; | 45 | static LIST_HEAD(omap_timer_list); |
46 | static DEFINE_SPINLOCK(dm_timer_lock); | ||
165 | 47 | ||
166 | /* | 48 | /** |
167 | * Reads timer registers in posted and non-posted mode. The posted mode bit | 49 | * omap_dm_timer_read_reg - read timer registers in posted and non-posted mode |
168 | * is encoded in reg. Note that in posted mode write pending bit must be | 50 | * @timer: timer pointer over which read operation to perform |
169 | * checked. Otherwise a read of a non completed write will produce an error. | 51 | * @reg: lowest byte holds the register offset |
52 | * | ||
53 | * The posted mode bit is encoded in reg. Note that in posted mode write | ||
54 | * pending bit must be checked. Otherwise a read of a non completed write | ||
55 | * will produce an error. | ||
170 | */ | 56 | */ |
171 | static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg) | 57 | static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg) |
172 | { | 58 | { |
173 | return __omap_dm_timer_read(timer->io_base, reg, timer->posted); | 59 | WARN_ON((reg & 0xff) < _OMAP_TIMER_WAKEUP_EN_OFFSET); |
60 | return __omap_dm_timer_read(timer, reg, timer->posted); | ||
174 | } | 61 | } |
175 | 62 | ||
176 | /* | 63 | /** |
177 | * Writes timer registers in posted and non-posted mode. The posted mode bit | 64 | * omap_dm_timer_write_reg - write timer registers in posted and non-posted mode |
178 | * is encoded in reg. Note that in posted mode the write pending bit must be | 65 | * @timer: timer pointer over which write operation is to perform |
179 | * checked. Otherwise a write on a register which has a pending write will be | 66 | * @reg: lowest byte holds the register offset |
180 | * lost. | 67 | * @value: data to write into the register |
68 | * | ||
69 | * The posted mode bit is encoded in reg. Note that in posted mode the write | ||
70 | * pending bit must be checked. Otherwise a write on a register which has a | ||
71 | * pending write will be lost. | ||
181 | */ | 72 | */ |
182 | static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, | 73 | static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, |
183 | u32 value) | 74 | u32 value) |
184 | { | 75 | { |
185 | __omap_dm_timer_write(timer->io_base, reg, value, timer->posted); | 76 | WARN_ON((reg & 0xff) < _OMAP_TIMER_WAKEUP_EN_OFFSET); |
77 | __omap_dm_timer_write(timer, reg, value, timer->posted); | ||
78 | } | ||
79 | |||
80 | static void omap_timer_restore_context(struct omap_dm_timer *timer) | ||
81 | { | ||
82 | omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_OFFSET, | ||
83 | timer->context.tiocp_cfg); | ||
84 | if (timer->revision > 1) | ||
85 | __raw_writel(timer->context.tistat, timer->sys_stat); | ||
86 | |||
87 | __raw_writel(timer->context.tisr, timer->irq_stat); | ||
88 | omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, | ||
89 | timer->context.twer); | ||
90 | omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, | ||
91 | timer->context.tcrr); | ||
92 | omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, | ||
93 | timer->context.tldr); | ||
94 | omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, | ||
95 | timer->context.tmar); | ||
96 | omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, | ||
97 | timer->context.tsicr); | ||
98 | __raw_writel(timer->context.tier, timer->irq_ena); | ||
99 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, | ||
100 | timer->context.tclr); | ||
186 | } | 101 | } |
187 | 102 | ||
188 | static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer) | 103 | static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer) |
189 | { | 104 | { |
190 | int c; | 105 | int c; |
191 | 106 | ||
107 | if (!timer->sys_stat) | ||
108 | return; | ||
109 | |||
192 | c = 0; | 110 | c = 0; |
193 | while (!(omap_dm_timer_read_reg(timer, OMAP_TIMER_SYS_STAT_REG) & 1)) { | 111 | while (!(__raw_readl(timer->sys_stat) & 1)) { |
194 | c++; | 112 | c++; |
195 | if (c > 100000) { | 113 | if (c > 100000) { |
196 | printk(KERN_ERR "Timer failed to reset\n"); | 114 | printk(KERN_ERR "Timer failed to reset\n"); |
@@ -201,53 +119,65 @@ static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer) | |||
201 | 119 | ||
202 | static void omap_dm_timer_reset(struct omap_dm_timer *timer) | 120 | static void omap_dm_timer_reset(struct omap_dm_timer *timer) |
203 | { | 121 | { |
204 | int autoidle = 0, wakeup = 0; | 122 | omap_dm_timer_enable(timer); |
205 | 123 | if (timer->pdev->id != 1) { | |
206 | if (!cpu_class_is_omap2() || timer != &dm_timers[0]) { | ||
207 | omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); | 124 | omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); |
208 | omap_dm_timer_wait_for_reset(timer); | 125 | omap_dm_timer_wait_for_reset(timer); |
209 | } | 126 | } |
210 | omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); | ||
211 | |||
212 | /* Enable autoidle on OMAP2+ */ | ||
213 | if (cpu_class_is_omap2()) | ||
214 | autoidle = 1; | ||
215 | |||
216 | /* | ||
217 | * Enable wake-up on OMAP2 CPUs. | ||
218 | */ | ||
219 | if (cpu_class_is_omap2()) | ||
220 | wakeup = 1; | ||
221 | 127 | ||
222 | __omap_dm_timer_reset(timer->io_base, autoidle, wakeup); | 128 | __omap_dm_timer_reset(timer, 0, 0); |
129 | omap_dm_timer_disable(timer); | ||
223 | timer->posted = 1; | 130 | timer->posted = 1; |
224 | } | 131 | } |
225 | 132 | ||
226 | void omap_dm_timer_prepare(struct omap_dm_timer *timer) | 133 | int omap_dm_timer_prepare(struct omap_dm_timer *timer) |
227 | { | 134 | { |
228 | omap_dm_timer_enable(timer); | 135 | struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data; |
229 | omap_dm_timer_reset(timer); | 136 | int ret; |
137 | |||
138 | timer->fclk = clk_get(&timer->pdev->dev, "fck"); | ||
139 | if (WARN_ON_ONCE(IS_ERR_OR_NULL(timer->fclk))) { | ||
140 | timer->fclk = NULL; | ||
141 | dev_err(&timer->pdev->dev, ": No fclk handle.\n"); | ||
142 | return -EINVAL; | ||
143 | } | ||
144 | |||
145 | if (pdata->needs_manual_reset) | ||
146 | omap_dm_timer_reset(timer); | ||
147 | |||
148 | ret = omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); | ||
149 | |||
150 | timer->posted = 1; | ||
151 | return ret; | ||
230 | } | 152 | } |
231 | 153 | ||
232 | struct omap_dm_timer *omap_dm_timer_request(void) | 154 | struct omap_dm_timer *omap_dm_timer_request(void) |
233 | { | 155 | { |
234 | struct omap_dm_timer *timer = NULL; | 156 | struct omap_dm_timer *timer = NULL, *t; |
235 | unsigned long flags; | 157 | unsigned long flags; |
236 | int i; | 158 | int ret = 0; |
237 | 159 | ||
238 | spin_lock_irqsave(&dm_timer_lock, flags); | 160 | spin_lock_irqsave(&dm_timer_lock, flags); |
239 | for (i = 0; i < dm_timer_count; i++) { | 161 | list_for_each_entry(t, &omap_timer_list, node) { |
240 | if (dm_timers[i].reserved) | 162 | if (t->reserved) |
241 | continue; | 163 | continue; |
242 | 164 | ||
243 | timer = &dm_timers[i]; | 165 | timer = t; |
244 | timer->reserved = 1; | 166 | timer->reserved = 1; |
245 | break; | 167 | break; |
246 | } | 168 | } |
169 | |||
170 | if (timer) { | ||
171 | ret = omap_dm_timer_prepare(timer); | ||
172 | if (ret) { | ||
173 | timer->reserved = 0; | ||
174 | timer = NULL; | ||
175 | } | ||
176 | } | ||
247 | spin_unlock_irqrestore(&dm_timer_lock, flags); | 177 | spin_unlock_irqrestore(&dm_timer_lock, flags); |
248 | 178 | ||
249 | if (timer != NULL) | 179 | if (!timer) |
250 | omap_dm_timer_prepare(timer); | 180 | pr_debug("%s: timer request failed!\n", __func__); |
251 | 181 | ||
252 | return timer; | 182 | return timer; |
253 | } | 183 | } |
@@ -255,74 +185,65 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_request); | |||
255 | 185 | ||
256 | struct omap_dm_timer *omap_dm_timer_request_specific(int id) | 186 | struct omap_dm_timer *omap_dm_timer_request_specific(int id) |
257 | { | 187 | { |
258 | struct omap_dm_timer *timer; | 188 | struct omap_dm_timer *timer = NULL, *t; |
259 | unsigned long flags; | 189 | unsigned long flags; |
190 | int ret = 0; | ||
260 | 191 | ||
261 | spin_lock_irqsave(&dm_timer_lock, flags); | 192 | spin_lock_irqsave(&dm_timer_lock, flags); |
262 | if (id <= 0 || id > dm_timer_count || dm_timers[id-1].reserved) { | 193 | list_for_each_entry(t, &omap_timer_list, node) { |
263 | spin_unlock_irqrestore(&dm_timer_lock, flags); | 194 | if (t->pdev->id == id && !t->reserved) { |
264 | printk("BUG: warning at %s:%d/%s(): unable to get timer %d\n", | 195 | timer = t; |
265 | __FILE__, __LINE__, __func__, id); | 196 | timer->reserved = 1; |
266 | dump_stack(); | 197 | break; |
267 | return NULL; | 198 | } |
268 | } | 199 | } |
269 | 200 | ||
270 | timer = &dm_timers[id-1]; | 201 | if (timer) { |
271 | timer->reserved = 1; | 202 | ret = omap_dm_timer_prepare(timer); |
203 | if (ret) { | ||
204 | timer->reserved = 0; | ||
205 | timer = NULL; | ||
206 | } | ||
207 | } | ||
272 | spin_unlock_irqrestore(&dm_timer_lock, flags); | 208 | spin_unlock_irqrestore(&dm_timer_lock, flags); |
273 | 209 | ||
274 | omap_dm_timer_prepare(timer); | 210 | if (!timer) |
211 | pr_debug("%s: timer%d request failed!\n", __func__, id); | ||
275 | 212 | ||
276 | return timer; | 213 | return timer; |
277 | } | 214 | } |
278 | EXPORT_SYMBOL_GPL(omap_dm_timer_request_specific); | 215 | EXPORT_SYMBOL_GPL(omap_dm_timer_request_specific); |
279 | 216 | ||
280 | void omap_dm_timer_free(struct omap_dm_timer *timer) | 217 | int omap_dm_timer_free(struct omap_dm_timer *timer) |
281 | { | 218 | { |
282 | omap_dm_timer_enable(timer); | 219 | if (unlikely(!timer)) |
283 | omap_dm_timer_reset(timer); | 220 | return -EINVAL; |
284 | omap_dm_timer_disable(timer); | 221 | |
222 | clk_put(timer->fclk); | ||
285 | 223 | ||
286 | WARN_ON(!timer->reserved); | 224 | WARN_ON(!timer->reserved); |
287 | timer->reserved = 0; | 225 | timer->reserved = 0; |
226 | return 0; | ||
288 | } | 227 | } |
289 | EXPORT_SYMBOL_GPL(omap_dm_timer_free); | 228 | EXPORT_SYMBOL_GPL(omap_dm_timer_free); |
290 | 229 | ||
291 | void omap_dm_timer_enable(struct omap_dm_timer *timer) | 230 | void omap_dm_timer_enable(struct omap_dm_timer *timer) |
292 | { | 231 | { |
293 | if (timer->enabled) | 232 | pm_runtime_get_sync(&timer->pdev->dev); |
294 | return; | ||
295 | |||
296 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
297 | if (cpu_class_is_omap2()) { | ||
298 | clk_enable(timer->fclk); | ||
299 | clk_enable(timer->iclk); | ||
300 | } | ||
301 | #endif | ||
302 | |||
303 | timer->enabled = 1; | ||
304 | } | 233 | } |
305 | EXPORT_SYMBOL_GPL(omap_dm_timer_enable); | 234 | EXPORT_SYMBOL_GPL(omap_dm_timer_enable); |
306 | 235 | ||
307 | void omap_dm_timer_disable(struct omap_dm_timer *timer) | 236 | void omap_dm_timer_disable(struct omap_dm_timer *timer) |
308 | { | 237 | { |
309 | if (!timer->enabled) | 238 | pm_runtime_put(&timer->pdev->dev); |
310 | return; | ||
311 | |||
312 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
313 | if (cpu_class_is_omap2()) { | ||
314 | clk_disable(timer->iclk); | ||
315 | clk_disable(timer->fclk); | ||
316 | } | ||
317 | #endif | ||
318 | |||
319 | timer->enabled = 0; | ||
320 | } | 239 | } |
321 | EXPORT_SYMBOL_GPL(omap_dm_timer_disable); | 240 | EXPORT_SYMBOL_GPL(omap_dm_timer_disable); |
322 | 241 | ||
323 | int omap_dm_timer_get_irq(struct omap_dm_timer *timer) | 242 | int omap_dm_timer_get_irq(struct omap_dm_timer *timer) |
324 | { | 243 | { |
325 | return timer->irq; | 244 | if (timer) |
245 | return timer->irq; | ||
246 | return -EINVAL; | ||
326 | } | 247 | } |
327 | EXPORT_SYMBOL_GPL(omap_dm_timer_get_irq); | 248 | EXPORT_SYMBOL_GPL(omap_dm_timer_get_irq); |
328 | 249 | ||
@@ -334,24 +255,29 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_get_irq); | |||
334 | */ | 255 | */ |
335 | __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask) | 256 | __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask) |
336 | { | 257 | { |
337 | int i; | 258 | int i = 0; |
259 | struct omap_dm_timer *timer = NULL; | ||
260 | unsigned long flags; | ||
338 | 261 | ||
339 | /* If ARMXOR cannot be idled this function call is unnecessary */ | 262 | /* If ARMXOR cannot be idled this function call is unnecessary */ |
340 | if (!(inputmask & (1 << 1))) | 263 | if (!(inputmask & (1 << 1))) |
341 | return inputmask; | 264 | return inputmask; |
342 | 265 | ||
343 | /* If any active timer is using ARMXOR return modified mask */ | 266 | /* If any active timer is using ARMXOR return modified mask */ |
344 | for (i = 0; i < dm_timer_count; i++) { | 267 | spin_lock_irqsave(&dm_timer_lock, flags); |
268 | list_for_each_entry(timer, &omap_timer_list, node) { | ||
345 | u32 l; | 269 | u32 l; |
346 | 270 | ||
347 | l = omap_dm_timer_read_reg(&dm_timers[i], OMAP_TIMER_CTRL_REG); | 271 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); |
348 | if (l & OMAP_TIMER_CTRL_ST) { | 272 | if (l & OMAP_TIMER_CTRL_ST) { |
349 | if (((omap_readl(MOD_CONF_CTRL_1) >> (i * 2)) & 0x03) == 0) | 273 | if (((omap_readl(MOD_CONF_CTRL_1) >> (i * 2)) & 0x03) == 0) |
350 | inputmask &= ~(1 << 1); | 274 | inputmask &= ~(1 << 1); |
351 | else | 275 | else |
352 | inputmask &= ~(1 << 2); | 276 | inputmask &= ~(1 << 2); |
353 | } | 277 | } |
278 | i++; | ||
354 | } | 279 | } |
280 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
355 | 281 | ||
356 | return inputmask; | 282 | return inputmask; |
357 | } | 283 | } |
@@ -361,7 +287,9 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask); | |||
361 | 287 | ||
362 | struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) | 288 | struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) |
363 | { | 289 | { |
364 | return timer->fclk; | 290 | if (timer) |
291 | return timer->fclk; | ||
292 | return NULL; | ||
365 | } | 293 | } |
366 | EXPORT_SYMBOL_GPL(omap_dm_timer_get_fclk); | 294 | EXPORT_SYMBOL_GPL(omap_dm_timer_get_fclk); |
367 | 295 | ||
@@ -375,70 +303,91 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask); | |||
375 | 303 | ||
376 | #endif | 304 | #endif |
377 | 305 | ||
378 | void omap_dm_timer_trigger(struct omap_dm_timer *timer) | 306 | int omap_dm_timer_trigger(struct omap_dm_timer *timer) |
379 | { | 307 | { |
308 | if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { | ||
309 | pr_err("%s: timer not available or enabled.\n", __func__); | ||
310 | return -EINVAL; | ||
311 | } | ||
312 | |||
380 | omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); | 313 | omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); |
314 | return 0; | ||
381 | } | 315 | } |
382 | EXPORT_SYMBOL_GPL(omap_dm_timer_trigger); | 316 | EXPORT_SYMBOL_GPL(omap_dm_timer_trigger); |
383 | 317 | ||
384 | void omap_dm_timer_start(struct omap_dm_timer *timer) | 318 | int omap_dm_timer_start(struct omap_dm_timer *timer) |
385 | { | 319 | { |
386 | u32 l; | 320 | u32 l; |
387 | 321 | ||
322 | if (unlikely(!timer)) | ||
323 | return -EINVAL; | ||
324 | |||
325 | omap_dm_timer_enable(timer); | ||
326 | |||
327 | if (timer->loses_context) { | ||
328 | u32 ctx_loss_cnt_after = | ||
329 | timer->get_context_loss_count(&timer->pdev->dev); | ||
330 | if (ctx_loss_cnt_after != timer->ctx_loss_count) | ||
331 | omap_timer_restore_context(timer); | ||
332 | } | ||
333 | |||
388 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); | 334 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); |
389 | if (!(l & OMAP_TIMER_CTRL_ST)) { | 335 | if (!(l & OMAP_TIMER_CTRL_ST)) { |
390 | l |= OMAP_TIMER_CTRL_ST; | 336 | l |= OMAP_TIMER_CTRL_ST; |
391 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); | 337 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); |
392 | } | 338 | } |
339 | |||
340 | /* Save the context */ | ||
341 | timer->context.tclr = l; | ||
342 | return 0; | ||
393 | } | 343 | } |
394 | EXPORT_SYMBOL_GPL(omap_dm_timer_start); | 344 | EXPORT_SYMBOL_GPL(omap_dm_timer_start); |
395 | 345 | ||
396 | void omap_dm_timer_stop(struct omap_dm_timer *timer) | 346 | int omap_dm_timer_stop(struct omap_dm_timer *timer) |
397 | { | 347 | { |
398 | unsigned long rate = 0; | 348 | unsigned long rate = 0; |
349 | struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data; | ||
399 | 350 | ||
400 | #ifdef CONFIG_ARCH_OMAP2PLUS | 351 | if (unlikely(!timer)) |
401 | rate = clk_get_rate(timer->fclk); | 352 | return -EINVAL; |
402 | #endif | ||
403 | 353 | ||
404 | __omap_dm_timer_stop(timer->io_base, timer->posted, rate); | 354 | if (!pdata->needs_manual_reset) |
355 | rate = clk_get_rate(timer->fclk); | ||
356 | |||
357 | __omap_dm_timer_stop(timer, timer->posted, rate); | ||
358 | |||
359 | return 0; | ||
405 | } | 360 | } |
406 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); | 361 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); |
407 | 362 | ||
408 | #ifdef CONFIG_ARCH_OMAP1 | ||
409 | |||
410 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) | 363 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) |
411 | { | 364 | { |
412 | int n = (timer - dm_timers) << 1; | 365 | int ret; |
413 | u32 l; | 366 | struct dmtimer_platform_data *pdata; |
414 | |||
415 | l = omap_readl(MOD_CONF_CTRL_1) & ~(0x03 << n); | ||
416 | l |= source << n; | ||
417 | omap_writel(l, MOD_CONF_CTRL_1); | ||
418 | 367 | ||
419 | return 0; | 368 | if (unlikely(!timer)) |
420 | } | 369 | return -EINVAL; |
421 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); | ||
422 | 370 | ||
423 | #else | 371 | pdata = timer->pdev->dev.platform_data; |
424 | 372 | ||
425 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) | ||
426 | { | ||
427 | if (source < 0 || source >= 3) | 373 | if (source < 0 || source >= 3) |
428 | return -EINVAL; | 374 | return -EINVAL; |
429 | 375 | ||
430 | return __omap_dm_timer_set_source(timer->fclk, | 376 | ret = pdata->set_timer_src(timer->pdev, source); |
431 | dm_source_clocks[source]); | 377 | |
378 | return ret; | ||
432 | } | 379 | } |
433 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); | 380 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); |
434 | 381 | ||
435 | #endif | 382 | int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, |
436 | |||
437 | void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, | ||
438 | unsigned int load) | 383 | unsigned int load) |
439 | { | 384 | { |
440 | u32 l; | 385 | u32 l; |
441 | 386 | ||
387 | if (unlikely(!timer)) | ||
388 | return -EINVAL; | ||
389 | |||
390 | omap_dm_timer_enable(timer); | ||
442 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); | 391 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); |
443 | if (autoreload) | 392 | if (autoreload) |
444 | l |= OMAP_TIMER_CTRL_AR; | 393 | l |= OMAP_TIMER_CTRL_AR; |
@@ -448,15 +397,32 @@ void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, | |||
448 | omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); | 397 | omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); |
449 | 398 | ||
450 | omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); | 399 | omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); |
400 | /* Save the context */ | ||
401 | timer->context.tclr = l; | ||
402 | timer->context.tldr = load; | ||
403 | omap_dm_timer_disable(timer); | ||
404 | return 0; | ||
451 | } | 405 | } |
452 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_load); | 406 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_load); |
453 | 407 | ||
454 | /* Optimized set_load which removes costly spin wait in timer_start */ | 408 | /* Optimized set_load which removes costly spin wait in timer_start */ |
455 | void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, | 409 | int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, |
456 | unsigned int load) | 410 | unsigned int load) |
457 | { | 411 | { |
458 | u32 l; | 412 | u32 l; |
459 | 413 | ||
414 | if (unlikely(!timer)) | ||
415 | return -EINVAL; | ||
416 | |||
417 | omap_dm_timer_enable(timer); | ||
418 | |||
419 | if (timer->loses_context) { | ||
420 | u32 ctx_loss_cnt_after = | ||
421 | timer->get_context_loss_count(&timer->pdev->dev); | ||
422 | if (ctx_loss_cnt_after != timer->ctx_loss_count) | ||
423 | omap_timer_restore_context(timer); | ||
424 | } | ||
425 | |||
460 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); | 426 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); |
461 | if (autoreload) { | 427 | if (autoreload) { |
462 | l |= OMAP_TIMER_CTRL_AR; | 428 | l |= OMAP_TIMER_CTRL_AR; |
@@ -466,15 +432,25 @@ void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, | |||
466 | } | 432 | } |
467 | l |= OMAP_TIMER_CTRL_ST; | 433 | l |= OMAP_TIMER_CTRL_ST; |
468 | 434 | ||
469 | __omap_dm_timer_load_start(timer->io_base, l, load, timer->posted); | 435 | __omap_dm_timer_load_start(timer, l, load, timer->posted); |
436 | |||
437 | /* Save the context */ | ||
438 | timer->context.tclr = l; | ||
439 | timer->context.tldr = load; | ||
440 | timer->context.tcrr = load; | ||
441 | return 0; | ||
470 | } | 442 | } |
471 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_load_start); | 443 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_load_start); |
472 | 444 | ||
473 | void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, | 445 | int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, |
474 | unsigned int match) | 446 | unsigned int match) |
475 | { | 447 | { |
476 | u32 l; | 448 | u32 l; |
477 | 449 | ||
450 | if (unlikely(!timer)) | ||
451 | return -EINVAL; | ||
452 | |||
453 | omap_dm_timer_enable(timer); | ||
478 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); | 454 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); |
479 | if (enable) | 455 | if (enable) |
480 | l |= OMAP_TIMER_CTRL_CE; | 456 | l |= OMAP_TIMER_CTRL_CE; |
@@ -482,14 +458,24 @@ void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, | |||
482 | l &= ~OMAP_TIMER_CTRL_CE; | 458 | l &= ~OMAP_TIMER_CTRL_CE; |
483 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); | 459 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); |
484 | omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); | 460 | omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); |
461 | |||
462 | /* Save the context */ | ||
463 | timer->context.tclr = l; | ||
464 | timer->context.tmar = match; | ||
465 | omap_dm_timer_disable(timer); | ||
466 | return 0; | ||
485 | } | 467 | } |
486 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_match); | 468 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_match); |
487 | 469 | ||
488 | void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, | 470 | int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, |
489 | int toggle, int trigger) | 471 | int toggle, int trigger) |
490 | { | 472 | { |
491 | u32 l; | 473 | u32 l; |
492 | 474 | ||
475 | if (unlikely(!timer)) | ||
476 | return -EINVAL; | ||
477 | |||
478 | omap_dm_timer_enable(timer); | ||
493 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); | 479 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); |
494 | l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM | | 480 | l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM | |
495 | OMAP_TIMER_CTRL_PT | (0x03 << 10)); | 481 | OMAP_TIMER_CTRL_PT | (0x03 << 10)); |
@@ -499,13 +485,22 @@ void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, | |||
499 | l |= OMAP_TIMER_CTRL_PT; | 485 | l |= OMAP_TIMER_CTRL_PT; |
500 | l |= trigger << 10; | 486 | l |= trigger << 10; |
501 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); | 487 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); |
488 | |||
489 | /* Save the context */ | ||
490 | timer->context.tclr = l; | ||
491 | omap_dm_timer_disable(timer); | ||
492 | return 0; | ||
502 | } | 493 | } |
503 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_pwm); | 494 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_pwm); |
504 | 495 | ||
505 | void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler) | 496 | int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler) |
506 | { | 497 | { |
507 | u32 l; | 498 | u32 l; |
508 | 499 | ||
500 | if (unlikely(!timer)) | ||
501 | return -EINVAL; | ||
502 | |||
503 | omap_dm_timer_enable(timer); | ||
509 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); | 504 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); |
510 | l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2)); | 505 | l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2)); |
511 | if (prescaler >= 0x00 && prescaler <= 0x07) { | 506 | if (prescaler >= 0x00 && prescaler <= 0x07) { |
@@ -513,13 +508,28 @@ void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler) | |||
513 | l |= prescaler << 2; | 508 | l |= prescaler << 2; |
514 | } | 509 | } |
515 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); | 510 | omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); |
511 | |||
512 | /* Save the context */ | ||
513 | timer->context.tclr = l; | ||
514 | omap_dm_timer_disable(timer); | ||
515 | return 0; | ||
516 | } | 516 | } |
517 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_prescaler); | 517 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_prescaler); |
518 | 518 | ||
519 | void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, | 519 | int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, |
520 | unsigned int value) | 520 | unsigned int value) |
521 | { | 521 | { |
522 | __omap_dm_timer_int_enable(timer->io_base, value); | 522 | if (unlikely(!timer)) |
523 | return -EINVAL; | ||
524 | |||
525 | omap_dm_timer_enable(timer); | ||
526 | __omap_dm_timer_int_enable(timer, value); | ||
527 | |||
528 | /* Save the context */ | ||
529 | timer->context.tier = value; | ||
530 | timer->context.twer = value; | ||
531 | omap_dm_timer_disable(timer); | ||
532 | return 0; | ||
523 | } | 533 | } |
524 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable); | 534 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable); |
525 | 535 | ||
@@ -527,40 +537,61 @@ unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) | |||
527 | { | 537 | { |
528 | unsigned int l; | 538 | unsigned int l; |
529 | 539 | ||
530 | l = omap_dm_timer_read_reg(timer, OMAP_TIMER_STAT_REG); | 540 | if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { |
541 | pr_err("%s: timer not available or enabled.\n", __func__); | ||
542 | return 0; | ||
543 | } | ||
544 | |||
545 | l = __raw_readl(timer->irq_stat); | ||
531 | 546 | ||
532 | return l; | 547 | return l; |
533 | } | 548 | } |
534 | EXPORT_SYMBOL_GPL(omap_dm_timer_read_status); | 549 | EXPORT_SYMBOL_GPL(omap_dm_timer_read_status); |
535 | 550 | ||
536 | void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) | 551 | int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) |
537 | { | 552 | { |
538 | __omap_dm_timer_write_status(timer->io_base, value); | 553 | if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) |
554 | return -EINVAL; | ||
555 | |||
556 | __omap_dm_timer_write_status(timer, value); | ||
557 | /* Save the context */ | ||
558 | timer->context.tisr = value; | ||
559 | return 0; | ||
539 | } | 560 | } |
540 | EXPORT_SYMBOL_GPL(omap_dm_timer_write_status); | 561 | EXPORT_SYMBOL_GPL(omap_dm_timer_write_status); |
541 | 562 | ||
542 | unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) | 563 | unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) |
543 | { | 564 | { |
544 | return __omap_dm_timer_read_counter(timer->io_base, timer->posted); | 565 | if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { |
566 | pr_err("%s: timer not iavailable or enabled.\n", __func__); | ||
567 | return 0; | ||
568 | } | ||
569 | |||
570 | return __omap_dm_timer_read_counter(timer, timer->posted); | ||
545 | } | 571 | } |
546 | EXPORT_SYMBOL_GPL(omap_dm_timer_read_counter); | 572 | EXPORT_SYMBOL_GPL(omap_dm_timer_read_counter); |
547 | 573 | ||
548 | void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value) | 574 | int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value) |
549 | { | 575 | { |
576 | if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { | ||
577 | pr_err("%s: timer not available or enabled.\n", __func__); | ||
578 | return -EINVAL; | ||
579 | } | ||
580 | |||
550 | omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value); | 581 | omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value); |
582 | |||
583 | /* Save the context */ | ||
584 | timer->context.tcrr = value; | ||
585 | return 0; | ||
551 | } | 586 | } |
552 | EXPORT_SYMBOL_GPL(omap_dm_timer_write_counter); | 587 | EXPORT_SYMBOL_GPL(omap_dm_timer_write_counter); |
553 | 588 | ||
554 | int omap_dm_timers_active(void) | 589 | int omap_dm_timers_active(void) |
555 | { | 590 | { |
556 | int i; | 591 | struct omap_dm_timer *timer; |
557 | |||
558 | for (i = 0; i < dm_timer_count; i++) { | ||
559 | struct omap_dm_timer *timer; | ||
560 | |||
561 | timer = &dm_timers[i]; | ||
562 | 592 | ||
563 | if (!timer->enabled) | 593 | list_for_each_entry(timer, &omap_timer_list, node) { |
594 | if (!timer->reserved) | ||
564 | continue; | 595 | continue; |
565 | 596 | ||
566 | if (omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG) & | 597 | if (omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG) & |
@@ -572,69 +603,147 @@ int omap_dm_timers_active(void) | |||
572 | } | 603 | } |
573 | EXPORT_SYMBOL_GPL(omap_dm_timers_active); | 604 | EXPORT_SYMBOL_GPL(omap_dm_timers_active); |
574 | 605 | ||
575 | static int __init omap_dm_timer_init(void) | 606 | /** |
607 | * omap_dm_timer_probe - probe function called for every registered device | ||
608 | * @pdev: pointer to current timer platform device | ||
609 | * | ||
610 | * Called by driver framework at the end of device registration for all | ||
611 | * timer devices. | ||
612 | */ | ||
613 | static int __devinit omap_dm_timer_probe(struct platform_device *pdev) | ||
576 | { | 614 | { |
615 | int ret; | ||
616 | unsigned long flags; | ||
577 | struct omap_dm_timer *timer; | 617 | struct omap_dm_timer *timer; |
578 | int i, map_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */ | 618 | struct resource *mem, *irq, *ioarea; |
619 | struct dmtimer_platform_data *pdata = pdev->dev.platform_data; | ||
579 | 620 | ||
580 | if (!(cpu_is_omap16xx() || cpu_class_is_omap2())) | 621 | if (!pdata) { |
622 | dev_err(&pdev->dev, "%s: no platform data.\n", __func__); | ||
581 | return -ENODEV; | 623 | return -ENODEV; |
624 | } | ||
582 | 625 | ||
583 | spin_lock_init(&dm_timer_lock); | 626 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
584 | 627 | if (unlikely(!irq)) { | |
585 | if (cpu_class_is_omap1()) { | 628 | dev_err(&pdev->dev, "%s: no IRQ resource.\n", __func__); |
586 | dm_timers = omap1_dm_timers; | 629 | return -ENODEV; |
587 | dm_timer_count = omap1_dm_timer_count; | ||
588 | map_size = SZ_2K; | ||
589 | } else if (cpu_is_omap24xx()) { | ||
590 | dm_timers = omap2_dm_timers; | ||
591 | dm_timer_count = omap2_dm_timer_count; | ||
592 | dm_source_names = omap2_dm_source_names; | ||
593 | dm_source_clocks = omap2_dm_source_clocks; | ||
594 | } else if (cpu_is_omap34xx()) { | ||
595 | dm_timers = omap3_dm_timers; | ||
596 | dm_timer_count = omap3_dm_timer_count; | ||
597 | dm_source_names = omap3_dm_source_names; | ||
598 | dm_source_clocks = omap3_dm_source_clocks; | ||
599 | } else if (cpu_is_omap44xx()) { | ||
600 | dm_timers = omap4_dm_timers; | ||
601 | dm_timer_count = omap4_dm_timer_count; | ||
602 | dm_source_names = omap4_dm_source_names; | ||
603 | dm_source_clocks = omap4_dm_source_clocks; | ||
604 | } | 630 | } |
605 | 631 | ||
606 | if (cpu_class_is_omap2()) | 632 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
607 | for (i = 0; dm_source_names[i] != NULL; i++) | 633 | if (unlikely(!mem)) { |
608 | dm_source_clocks[i] = clk_get(NULL, dm_source_names[i]); | 634 | dev_err(&pdev->dev, "%s: no memory resource.\n", __func__); |
635 | return -ENODEV; | ||
636 | } | ||
609 | 637 | ||
610 | if (cpu_is_omap243x()) | 638 | ioarea = request_mem_region(mem->start, resource_size(mem), |
611 | dm_timers[0].phys_base = 0x49018000; | 639 | pdev->name); |
640 | if (!ioarea) { | ||
641 | dev_err(&pdev->dev, "%s: region already claimed.\n", __func__); | ||
642 | return -EBUSY; | ||
643 | } | ||
612 | 644 | ||
613 | for (i = 0; i < dm_timer_count; i++) { | 645 | timer = kzalloc(sizeof(struct omap_dm_timer), GFP_KERNEL); |
614 | timer = &dm_timers[i]; | 646 | if (!timer) { |
647 | dev_err(&pdev->dev, "%s: no memory for omap_dm_timer.\n", | ||
648 | __func__); | ||
649 | ret = -ENOMEM; | ||
650 | goto err_free_ioregion; | ||
651 | } | ||
615 | 652 | ||
616 | /* Static mapping, never released */ | 653 | timer->io_base = ioremap(mem->start, resource_size(mem)); |
617 | timer->io_base = ioremap(timer->phys_base, map_size); | 654 | if (!timer->io_base) { |
618 | BUG_ON(!timer->io_base); | 655 | dev_err(&pdev->dev, "%s: ioremap failed.\n", __func__); |
656 | ret = -ENOMEM; | ||
657 | goto err_free_mem; | ||
658 | } | ||
619 | 659 | ||
620 | #ifdef CONFIG_ARCH_OMAP2PLUS | 660 | timer->id = pdev->id; |
621 | if (cpu_class_is_omap2()) { | 661 | timer->irq = irq->start; |
622 | char clk_name[16]; | 662 | timer->reserved = pdata->reserved; |
623 | sprintf(clk_name, "gpt%d_ick", i + 1); | 663 | timer->pdev = pdev; |
624 | timer->iclk = clk_get(NULL, clk_name); | 664 | timer->loses_context = pdata->loses_context; |
625 | sprintf(clk_name, "gpt%d_fck", i + 1); | 665 | timer->get_context_loss_count = pdata->get_context_loss_count; |
626 | timer->fclk = clk_get(NULL, clk_name); | 666 | |
627 | } | 667 | /* Skip pm_runtime_enable for OMAP1 */ |
668 | if (!pdata->needs_manual_reset) { | ||
669 | pm_runtime_enable(&pdev->dev); | ||
670 | pm_runtime_irq_safe(&pdev->dev); | ||
671 | } | ||
628 | 672 | ||
629 | /* One or two timers may be set up early for sys_timer */ | 673 | if (!timer->reserved) { |
630 | if (sys_timer_reserved & (1 << i)) { | 674 | pm_runtime_get_sync(&pdev->dev); |
631 | timer->reserved = 1; | 675 | __omap_dm_timer_init_regs(timer); |
632 | timer->posted = 1; | 676 | pm_runtime_put(&pdev->dev); |
633 | } | ||
634 | #endif | ||
635 | } | 677 | } |
636 | 678 | ||
679 | /* add the timer element to the list */ | ||
680 | spin_lock_irqsave(&dm_timer_lock, flags); | ||
681 | list_add_tail(&timer->node, &omap_timer_list); | ||
682 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
683 | |||
684 | dev_dbg(&pdev->dev, "Device Probed.\n"); | ||
685 | |||
637 | return 0; | 686 | return 0; |
687 | |||
688 | err_free_mem: | ||
689 | kfree(timer); | ||
690 | |||
691 | err_free_ioregion: | ||
692 | release_mem_region(mem->start, resource_size(mem)); | ||
693 | |||
694 | return ret; | ||
638 | } | 695 | } |
639 | 696 | ||
640 | arch_initcall(omap_dm_timer_init); | 697 | /** |
698 | * omap_dm_timer_remove - cleanup a registered timer device | ||
699 | * @pdev: pointer to current timer platform device | ||
700 | * | ||
701 | * Called by driver framework whenever a timer device is unregistered. | ||
702 | * In addition to freeing platform resources it also deletes the timer | ||
703 | * entry from the local list. | ||
704 | */ | ||
705 | static int __devexit omap_dm_timer_remove(struct platform_device *pdev) | ||
706 | { | ||
707 | struct omap_dm_timer *timer; | ||
708 | unsigned long flags; | ||
709 | int ret = -EINVAL; | ||
710 | |||
711 | spin_lock_irqsave(&dm_timer_lock, flags); | ||
712 | list_for_each_entry(timer, &omap_timer_list, node) | ||
713 | if (timer->pdev->id == pdev->id) { | ||
714 | list_del(&timer->node); | ||
715 | kfree(timer); | ||
716 | ret = 0; | ||
717 | break; | ||
718 | } | ||
719 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
720 | |||
721 | return ret; | ||
722 | } | ||
723 | |||
724 | static struct platform_driver omap_dm_timer_driver = { | ||
725 | .probe = omap_dm_timer_probe, | ||
726 | .remove = omap_dm_timer_remove, | ||
727 | .driver = { | ||
728 | .name = "omap_timer", | ||
729 | }, | ||
730 | }; | ||
731 | |||
732 | static int __init omap_dm_timer_driver_init(void) | ||
733 | { | ||
734 | return platform_driver_register(&omap_dm_timer_driver); | ||
735 | } | ||
736 | |||
737 | static void __exit omap_dm_timer_driver_exit(void) | ||
738 | { | ||
739 | platform_driver_unregister(&omap_dm_timer_driver); | ||
740 | } | ||
741 | |||
742 | early_platform_init("earlytimer", &omap_dm_timer_driver); | ||
743 | module_init(omap_dm_timer_driver_init); | ||
744 | module_exit(omap_dm_timer_driver_exit); | ||
745 | |||
746 | MODULE_DESCRIPTION("OMAP Dual-Mode Timer Driver"); | ||
747 | MODULE_LICENSE("GPL"); | ||
748 | MODULE_ALIAS("platform:" DRIVER_NAME); | ||
749 | MODULE_AUTHOR("Texas Instruments Inc"); | ||
diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c index 3341ca4703e9..0c7caf2458b4 100644 --- a/arch/arm/plat-omap/i2c.c +++ b/arch/arm/plat-omap/i2c.c | |||
@@ -135,7 +135,7 @@ static inline int omap2_i2c_add_bus(int bus_id) | |||
135 | { | 135 | { |
136 | int l; | 136 | int l; |
137 | struct omap_hwmod *oh; | 137 | struct omap_hwmod *oh; |
138 | struct omap_device *od; | 138 | struct platform_device *pdev; |
139 | char oh_name[MAX_OMAP_I2C_HWMOD_NAME_LEN]; | 139 | char oh_name[MAX_OMAP_I2C_HWMOD_NAME_LEN]; |
140 | struct omap_i2c_bus_platform_data *pdata; | 140 | struct omap_i2c_bus_platform_data *pdata; |
141 | 141 | ||
@@ -160,12 +160,12 @@ static inline int omap2_i2c_add_bus(int bus_id) | |||
160 | */ | 160 | */ |
161 | if (cpu_is_omap34xx()) | 161 | if (cpu_is_omap34xx()) |
162 | pdata->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat; | 162 | pdata->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat; |
163 | od = omap_device_build(name, bus_id, oh, pdata, | 163 | pdev = omap_device_build(name, bus_id, oh, pdata, |
164 | sizeof(struct omap_i2c_bus_platform_data), | 164 | sizeof(struct omap_i2c_bus_platform_data), |
165 | omap_i2c_latency, ARRAY_SIZE(omap_i2c_latency), 0); | 165 | omap_i2c_latency, ARRAY_SIZE(omap_i2c_latency), 0); |
166 | WARN(IS_ERR(od), "Could not build omap_device for %s\n", name); | 166 | WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", name); |
167 | 167 | ||
168 | return PTR_ERR(od); | 168 | return PTR_ERR(pdev); |
169 | } | 169 | } |
170 | #else | 170 | #else |
171 | static inline int omap2_i2c_add_bus(int bus_id) | 171 | static inline int omap2_i2c_add_bus(int bus_id) |
diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index 5cac97e36079..abda2c7e499b 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h | |||
@@ -83,7 +83,11 @@ void omap2_set_globals_sdrc(struct omap_globals *); | |||
83 | void omap2_set_globals_control(struct omap_globals *); | 83 | void omap2_set_globals_control(struct omap_globals *); |
84 | void omap2_set_globals_prcm(struct omap_globals *); | 84 | void omap2_set_globals_prcm(struct omap_globals *); |
85 | 85 | ||
86 | void omap242x_map_io(void); | ||
87 | void omap243x_map_io(void); | ||
86 | void omap3_map_io(void); | 88 | void omap3_map_io(void); |
89 | void omap4_map_io(void); | ||
90 | |||
87 | 91 | ||
88 | /** | 92 | /** |
89 | * omap_test_timeout - busy-loop, testing a condition | 93 | * omap_test_timeout - busy-loop, testing a condition |
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index eb5d16c60cd9..d11025e6e7a4 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * arch/arm/plat-omap/include/mach/dmtimer.h | 2 | * arch/arm/plat-omap/include/plat/dmtimer.h |
3 | * | 3 | * |
4 | * OMAP Dual-Mode Timers | 4 | * OMAP Dual-Mode Timers |
5 | * | 5 | * |
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/clk.h> | 35 | #include <linux/clk.h> |
36 | #include <linux/delay.h> | 36 | #include <linux/delay.h> |
37 | #include <linux/io.h> | 37 | #include <linux/io.h> |
38 | #include <linux/platform_device.h> | ||
38 | 39 | ||
39 | #ifndef __ASM_ARCH_DMTIMER_H | 40 | #ifndef __ASM_ARCH_DMTIMER_H |
40 | #define __ASM_ARCH_DMTIMER_H | 41 | #define __ASM_ARCH_DMTIMER_H |
@@ -59,12 +60,56 @@ | |||
59 | * in OMAP4 can be distinguished. | 60 | * in OMAP4 can be distinguished. |
60 | */ | 61 | */ |
61 | #define OMAP_TIMER_IP_VERSION_1 0x1 | 62 | #define OMAP_TIMER_IP_VERSION_1 0x1 |
63 | |||
64 | /* timer capabilities used in hwmod database */ | ||
65 | #define OMAP_TIMER_SECURE 0x80000000 | ||
66 | #define OMAP_TIMER_ALWON 0x40000000 | ||
67 | #define OMAP_TIMER_HAS_PWM 0x20000000 | ||
68 | |||
69 | struct omap_timer_capability_dev_attr { | ||
70 | u32 timer_capability; | ||
71 | }; | ||
72 | |||
62 | struct omap_dm_timer; | 73 | struct omap_dm_timer; |
63 | struct clk; | 74 | struct clk; |
64 | 75 | ||
76 | struct timer_regs { | ||
77 | u32 tidr; | ||
78 | u32 tiocp_cfg; | ||
79 | u32 tistat; | ||
80 | u32 tisr; | ||
81 | u32 tier; | ||
82 | u32 twer; | ||
83 | u32 tclr; | ||
84 | u32 tcrr; | ||
85 | u32 tldr; | ||
86 | u32 ttrg; | ||
87 | u32 twps; | ||
88 | u32 tmar; | ||
89 | u32 tcar1; | ||
90 | u32 tsicr; | ||
91 | u32 tcar2; | ||
92 | u32 tpir; | ||
93 | u32 tnir; | ||
94 | u32 tcvr; | ||
95 | u32 tocr; | ||
96 | u32 towr; | ||
97 | }; | ||
98 | |||
99 | struct dmtimer_platform_data { | ||
100 | int (*set_timer_src)(struct platform_device *pdev, int source); | ||
101 | int timer_ip_version; | ||
102 | u32 needs_manual_reset:1; | ||
103 | bool reserved; | ||
104 | |||
105 | bool loses_context; | ||
106 | |||
107 | u32 (*get_context_loss_count)(struct device *dev); | ||
108 | }; | ||
109 | |||
65 | struct omap_dm_timer *omap_dm_timer_request(void); | 110 | struct omap_dm_timer *omap_dm_timer_request(void); |
66 | struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); | 111 | struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); |
67 | void omap_dm_timer_free(struct omap_dm_timer *timer); | 112 | int omap_dm_timer_free(struct omap_dm_timer *timer); |
68 | void omap_dm_timer_enable(struct omap_dm_timer *timer); | 113 | void omap_dm_timer_enable(struct omap_dm_timer *timer); |
69 | void omap_dm_timer_disable(struct omap_dm_timer *timer); | 114 | void omap_dm_timer_disable(struct omap_dm_timer *timer); |
70 | 115 | ||
@@ -73,23 +118,23 @@ int omap_dm_timer_get_irq(struct omap_dm_timer *timer); | |||
73 | u32 omap_dm_timer_modify_idlect_mask(u32 inputmask); | 118 | u32 omap_dm_timer_modify_idlect_mask(u32 inputmask); |
74 | struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer); | 119 | struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer); |
75 | 120 | ||
76 | void omap_dm_timer_trigger(struct omap_dm_timer *timer); | 121 | int omap_dm_timer_trigger(struct omap_dm_timer *timer); |
77 | void omap_dm_timer_start(struct omap_dm_timer *timer); | 122 | int omap_dm_timer_start(struct omap_dm_timer *timer); |
78 | void omap_dm_timer_stop(struct omap_dm_timer *timer); | 123 | int omap_dm_timer_stop(struct omap_dm_timer *timer); |
79 | 124 | ||
80 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source); | 125 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source); |
81 | void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value); | 126 | int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value); |
82 | void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value); | 127 | int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value); |
83 | void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match); | 128 | int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match); |
84 | void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, int trigger); | 129 | int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, int trigger); |
85 | void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler); | 130 | int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler); |
86 | 131 | ||
87 | void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value); | 132 | int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value); |
88 | 133 | ||
89 | unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer); | 134 | unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer); |
90 | void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value); | 135 | int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value); |
91 | unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer); | 136 | unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer); |
92 | void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value); | 137 | int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value); |
93 | 138 | ||
94 | int omap_dm_timers_active(void); | 139 | int omap_dm_timers_active(void); |
95 | 140 | ||
@@ -98,12 +143,30 @@ int omap_dm_timers_active(void); | |||
98 | * used by dmtimer.c and sys_timer related code. | 143 | * used by dmtimer.c and sys_timer related code. |
99 | */ | 144 | */ |
100 | 145 | ||
101 | /* register offsets */ | 146 | /* |
102 | #define _OMAP_TIMER_ID_OFFSET 0x00 | 147 | * The interrupt registers are different between v1 and v2 ip. |
103 | #define _OMAP_TIMER_OCP_CFG_OFFSET 0x10 | 148 | * These registers are offsets from timer->iobase. |
104 | #define _OMAP_TIMER_SYS_STAT_OFFSET 0x14 | 149 | */ |
105 | #define _OMAP_TIMER_STAT_OFFSET 0x18 | 150 | #define OMAP_TIMER_ID_OFFSET 0x00 |
106 | #define _OMAP_TIMER_INT_EN_OFFSET 0x1c | 151 | #define OMAP_TIMER_OCP_CFG_OFFSET 0x10 |
152 | |||
153 | #define OMAP_TIMER_V1_SYS_STAT_OFFSET 0x14 | ||
154 | #define OMAP_TIMER_V1_STAT_OFFSET 0x18 | ||
155 | #define OMAP_TIMER_V1_INT_EN_OFFSET 0x1c | ||
156 | |||
157 | #define OMAP_TIMER_V2_IRQSTATUS_RAW 0x24 | ||
158 | #define OMAP_TIMER_V2_IRQSTATUS 0x28 | ||
159 | #define OMAP_TIMER_V2_IRQENABLE_SET 0x2c | ||
160 | #define OMAP_TIMER_V2_IRQENABLE_CLR 0x30 | ||
161 | |||
162 | /* | ||
163 | * The functional registers have a different base on v1 and v2 ip. | ||
164 | * These registers are offsets from timer->func_base. The func_base | ||
165 | * is samae as io_base for v1 and io_base + 0x14 for v2 ip. | ||
166 | * | ||
167 | */ | ||
168 | #define OMAP_TIMER_V2_FUNC_OFFSET 0x14 | ||
169 | |||
107 | #define _OMAP_TIMER_WAKEUP_EN_OFFSET 0x20 | 170 | #define _OMAP_TIMER_WAKEUP_EN_OFFSET 0x20 |
108 | #define _OMAP_TIMER_CTRL_OFFSET 0x24 | 171 | #define _OMAP_TIMER_CTRL_OFFSET 0x24 |
109 | #define OMAP_TIMER_CTRL_GPOCFG (1 << 14) | 172 | #define OMAP_TIMER_CTRL_GPOCFG (1 << 14) |
@@ -147,21 +210,6 @@ int omap_dm_timers_active(void); | |||
147 | /* register offsets with the write pending bit encoded */ | 210 | /* register offsets with the write pending bit encoded */ |
148 | #define WPSHIFT 16 | 211 | #define WPSHIFT 16 |
149 | 212 | ||
150 | #define OMAP_TIMER_ID_REG (_OMAP_TIMER_ID_OFFSET \ | ||
151 | | (WP_NONE << WPSHIFT)) | ||
152 | |||
153 | #define OMAP_TIMER_OCP_CFG_REG (_OMAP_TIMER_OCP_CFG_OFFSET \ | ||
154 | | (WP_NONE << WPSHIFT)) | ||
155 | |||
156 | #define OMAP_TIMER_SYS_STAT_REG (_OMAP_TIMER_SYS_STAT_OFFSET \ | ||
157 | | (WP_NONE << WPSHIFT)) | ||
158 | |||
159 | #define OMAP_TIMER_STAT_REG (_OMAP_TIMER_STAT_OFFSET \ | ||
160 | | (WP_NONE << WPSHIFT)) | ||
161 | |||
162 | #define OMAP_TIMER_INT_EN_REG (_OMAP_TIMER_INT_EN_OFFSET \ | ||
163 | | (WP_NONE << WPSHIFT)) | ||
164 | |||
165 | #define OMAP_TIMER_WAKEUP_EN_REG (_OMAP_TIMER_WAKEUP_EN_OFFSET \ | 213 | #define OMAP_TIMER_WAKEUP_EN_REG (_OMAP_TIMER_WAKEUP_EN_OFFSET \ |
166 | | (WP_NONE << WPSHIFT)) | 214 | | (WP_NONE << WPSHIFT)) |
167 | 215 | ||
@@ -209,49 +257,88 @@ int omap_dm_timers_active(void); | |||
209 | 257 | ||
210 | struct omap_dm_timer { | 258 | struct omap_dm_timer { |
211 | unsigned long phys_base; | 259 | unsigned long phys_base; |
260 | int id; | ||
212 | int irq; | 261 | int irq; |
213 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
214 | struct clk *iclk, *fclk; | 262 | struct clk *iclk, *fclk; |
215 | #endif | 263 | |
216 | void __iomem *io_base; | 264 | void __iomem *io_base; |
265 | void __iomem *sys_stat; /* TISTAT timer status */ | ||
266 | void __iomem *irq_stat; /* TISR/IRQSTATUS interrupt status */ | ||
267 | void __iomem *irq_ena; /* irq enable */ | ||
268 | void __iomem *irq_dis; /* irq disable, only on v2 ip */ | ||
269 | void __iomem *pend; /* write pending */ | ||
270 | void __iomem *func_base; /* function register base */ | ||
271 | |||
217 | unsigned long rate; | 272 | unsigned long rate; |
218 | unsigned reserved:1; | 273 | unsigned reserved:1; |
219 | unsigned enabled:1; | ||
220 | unsigned posted:1; | 274 | unsigned posted:1; |
275 | struct timer_regs context; | ||
276 | bool loses_context; | ||
277 | int ctx_loss_count; | ||
278 | int revision; | ||
279 | struct platform_device *pdev; | ||
280 | struct list_head node; | ||
281 | |||
282 | u32 (*get_context_loss_count)(struct device *dev); | ||
221 | }; | 283 | }; |
222 | 284 | ||
223 | extern u32 sys_timer_reserved; | 285 | int omap_dm_timer_prepare(struct omap_dm_timer *timer); |
224 | void omap_dm_timer_prepare(struct omap_dm_timer *timer); | ||
225 | 286 | ||
226 | static inline u32 __omap_dm_timer_read(void __iomem *base, u32 reg, | 287 | static inline u32 __omap_dm_timer_read(struct omap_dm_timer *timer, u32 reg, |
227 | int posted) | 288 | int posted) |
228 | { | 289 | { |
229 | if (posted) | 290 | if (posted) |
230 | while (__raw_readl(base + (OMAP_TIMER_WRITE_PEND_REG & 0xff)) | 291 | while (__raw_readl(timer->pend) & (reg >> WPSHIFT)) |
231 | & (reg >> WPSHIFT)) | ||
232 | cpu_relax(); | 292 | cpu_relax(); |
233 | 293 | ||
234 | return __raw_readl(base + (reg & 0xff)); | 294 | return __raw_readl(timer->func_base + (reg & 0xff)); |
235 | } | 295 | } |
236 | 296 | ||
237 | static inline void __omap_dm_timer_write(void __iomem *base, u32 reg, u32 val, | 297 | static inline void __omap_dm_timer_write(struct omap_dm_timer *timer, |
238 | int posted) | 298 | u32 reg, u32 val, int posted) |
239 | { | 299 | { |
240 | if (posted) | 300 | if (posted) |
241 | while (__raw_readl(base + (OMAP_TIMER_WRITE_PEND_REG & 0xff)) | 301 | while (__raw_readl(timer->pend) & (reg >> WPSHIFT)) |
242 | & (reg >> WPSHIFT)) | ||
243 | cpu_relax(); | 302 | cpu_relax(); |
244 | 303 | ||
245 | __raw_writel(val, base + (reg & 0xff)); | 304 | __raw_writel(val, timer->func_base + (reg & 0xff)); |
305 | } | ||
306 | |||
307 | static inline void __omap_dm_timer_init_regs(struct omap_dm_timer *timer) | ||
308 | { | ||
309 | u32 tidr; | ||
310 | |||
311 | /* Assume v1 ip if bits [31:16] are zero */ | ||
312 | tidr = __raw_readl(timer->io_base); | ||
313 | if (!(tidr >> 16)) { | ||
314 | timer->revision = 1; | ||
315 | timer->sys_stat = timer->io_base + | ||
316 | OMAP_TIMER_V1_SYS_STAT_OFFSET; | ||
317 | timer->irq_stat = timer->io_base + OMAP_TIMER_V1_STAT_OFFSET; | ||
318 | timer->irq_ena = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET; | ||
319 | timer->irq_dis = 0; | ||
320 | timer->pend = timer->io_base + _OMAP_TIMER_WRITE_PEND_OFFSET; | ||
321 | timer->func_base = timer->io_base; | ||
322 | } else { | ||
323 | timer->revision = 2; | ||
324 | timer->sys_stat = 0; | ||
325 | timer->irq_stat = timer->io_base + OMAP_TIMER_V2_IRQSTATUS; | ||
326 | timer->irq_ena = timer->io_base + OMAP_TIMER_V2_IRQENABLE_SET; | ||
327 | timer->irq_dis = timer->io_base + OMAP_TIMER_V2_IRQENABLE_CLR; | ||
328 | timer->pend = timer->io_base + | ||
329 | _OMAP_TIMER_WRITE_PEND_OFFSET + | ||
330 | OMAP_TIMER_V2_FUNC_OFFSET; | ||
331 | timer->func_base = timer->io_base + OMAP_TIMER_V2_FUNC_OFFSET; | ||
332 | } | ||
246 | } | 333 | } |
247 | 334 | ||
248 | /* Assumes the source clock has been set by caller */ | 335 | /* Assumes the source clock has been set by caller */ |
249 | static inline void __omap_dm_timer_reset(void __iomem *base, int autoidle, | 336 | static inline void __omap_dm_timer_reset(struct omap_dm_timer *timer, |
250 | int wakeup) | 337 | int autoidle, int wakeup) |
251 | { | 338 | { |
252 | u32 l; | 339 | u32 l; |
253 | 340 | ||
254 | l = __omap_dm_timer_read(base, OMAP_TIMER_OCP_CFG_REG, 0); | 341 | l = __raw_readl(timer->io_base + OMAP_TIMER_OCP_CFG_OFFSET); |
255 | l |= 0x02 << 3; /* Set to smart-idle mode */ | 342 | l |= 0x02 << 3; /* Set to smart-idle mode */ |
256 | l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */ | 343 | l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */ |
257 | 344 | ||
@@ -261,10 +348,10 @@ static inline void __omap_dm_timer_reset(void __iomem *base, int autoidle, | |||
261 | if (wakeup) | 348 | if (wakeup) |
262 | l |= 1 << 2; | 349 | l |= 1 << 2; |
263 | 350 | ||
264 | __omap_dm_timer_write(base, OMAP_TIMER_OCP_CFG_REG, l, 0); | 351 | __raw_writel(l, timer->io_base + OMAP_TIMER_OCP_CFG_OFFSET); |
265 | 352 | ||
266 | /* Match hardware reset default of posted mode */ | 353 | /* Match hardware reset default of posted mode */ |
267 | __omap_dm_timer_write(base, OMAP_TIMER_IF_CTRL_REG, | 354 | __omap_dm_timer_write(timer, OMAP_TIMER_IF_CTRL_REG, |
268 | OMAP_TIMER_CTRL_POSTED, 0); | 355 | OMAP_TIMER_CTRL_POSTED, 0); |
269 | } | 356 | } |
270 | 357 | ||
@@ -286,18 +373,18 @@ static inline int __omap_dm_timer_set_source(struct clk *timer_fck, | |||
286 | return ret; | 373 | return ret; |
287 | } | 374 | } |
288 | 375 | ||
289 | static inline void __omap_dm_timer_stop(void __iomem *base, int posted, | 376 | static inline void __omap_dm_timer_stop(struct omap_dm_timer *timer, |
290 | unsigned long rate) | 377 | int posted, unsigned long rate) |
291 | { | 378 | { |
292 | u32 l; | 379 | u32 l; |
293 | 380 | ||
294 | l = __omap_dm_timer_read(base, OMAP_TIMER_CTRL_REG, posted); | 381 | l = __omap_dm_timer_read(timer, OMAP_TIMER_CTRL_REG, posted); |
295 | if (l & OMAP_TIMER_CTRL_ST) { | 382 | if (l & OMAP_TIMER_CTRL_ST) { |
296 | l &= ~0x1; | 383 | l &= ~0x1; |
297 | __omap_dm_timer_write(base, OMAP_TIMER_CTRL_REG, l, posted); | 384 | __omap_dm_timer_write(timer, OMAP_TIMER_CTRL_REG, l, posted); |
298 | #ifdef CONFIG_ARCH_OMAP2PLUS | 385 | #ifdef CONFIG_ARCH_OMAP2PLUS |
299 | /* Readback to make sure write has completed */ | 386 | /* Readback to make sure write has completed */ |
300 | __omap_dm_timer_read(base, OMAP_TIMER_CTRL_REG, posted); | 387 | __omap_dm_timer_read(timer, OMAP_TIMER_CTRL_REG, posted); |
301 | /* | 388 | /* |
302 | * Wait for functional clock period x 3.5 to make sure that | 389 | * Wait for functional clock period x 3.5 to make sure that |
303 | * timer is stopped | 390 | * timer is stopped |
@@ -307,34 +394,34 @@ static inline void __omap_dm_timer_stop(void __iomem *base, int posted, | |||
307 | } | 394 | } |
308 | 395 | ||
309 | /* Ack possibly pending interrupt */ | 396 | /* Ack possibly pending interrupt */ |
310 | __omap_dm_timer_write(base, OMAP_TIMER_STAT_REG, | 397 | __raw_writel(OMAP_TIMER_INT_OVERFLOW, timer->irq_stat); |
311 | OMAP_TIMER_INT_OVERFLOW, 0); | ||
312 | } | 398 | } |
313 | 399 | ||
314 | static inline void __omap_dm_timer_load_start(void __iomem *base, u32 ctrl, | 400 | static inline void __omap_dm_timer_load_start(struct omap_dm_timer *timer, |
315 | unsigned int load, int posted) | 401 | u32 ctrl, unsigned int load, |
402 | int posted) | ||
316 | { | 403 | { |
317 | __omap_dm_timer_write(base, OMAP_TIMER_COUNTER_REG, load, posted); | 404 | __omap_dm_timer_write(timer, OMAP_TIMER_COUNTER_REG, load, posted); |
318 | __omap_dm_timer_write(base, OMAP_TIMER_CTRL_REG, ctrl, posted); | 405 | __omap_dm_timer_write(timer, OMAP_TIMER_CTRL_REG, ctrl, posted); |
319 | } | 406 | } |
320 | 407 | ||
321 | static inline void __omap_dm_timer_int_enable(void __iomem *base, | 408 | static inline void __omap_dm_timer_int_enable(struct omap_dm_timer *timer, |
322 | unsigned int value) | 409 | unsigned int value) |
323 | { | 410 | { |
324 | __omap_dm_timer_write(base, OMAP_TIMER_INT_EN_REG, value, 0); | 411 | __raw_writel(value, timer->irq_ena); |
325 | __omap_dm_timer_write(base, OMAP_TIMER_WAKEUP_EN_REG, value, 0); | 412 | __omap_dm_timer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, value, 0); |
326 | } | 413 | } |
327 | 414 | ||
328 | static inline unsigned int __omap_dm_timer_read_counter(void __iomem *base, | 415 | static inline unsigned int |
329 | int posted) | 416 | __omap_dm_timer_read_counter(struct omap_dm_timer *timer, int posted) |
330 | { | 417 | { |
331 | return __omap_dm_timer_read(base, OMAP_TIMER_COUNTER_REG, posted); | 418 | return __omap_dm_timer_read(timer, OMAP_TIMER_COUNTER_REG, posted); |
332 | } | 419 | } |
333 | 420 | ||
334 | static inline void __omap_dm_timer_write_status(void __iomem *base, | 421 | static inline void __omap_dm_timer_write_status(struct omap_dm_timer *timer, |
335 | unsigned int value) | 422 | unsigned int value) |
336 | { | 423 | { |
337 | __omap_dm_timer_write(base, OMAP_TIMER_STAT_REG, value, 0); | 424 | __raw_writel(value, timer->irq_stat); |
338 | } | 425 | } |
339 | 426 | ||
340 | #endif /* __ASM_ARCH_DMTIMER_H */ | 427 | #endif /* __ASM_ARCH_DMTIMER_H */ |
diff --git a/arch/arm/plat-omap/include/plat/io.h b/arch/arm/plat-omap/include/plat/io.h index 75311fc9c018..6591875486d5 100644 --- a/arch/arm/plat-omap/include/plat/io.h +++ b/arch/arm/plat-omap/include/plat/io.h | |||
@@ -228,13 +228,13 @@ | |||
228 | 228 | ||
229 | #define OMAP44XX_EMIF2_PHYS OMAP44XX_EMIF2_BASE | 229 | #define OMAP44XX_EMIF2_PHYS OMAP44XX_EMIF2_BASE |
230 | /* 0x4d000000 --> 0xfd200000 */ | 230 | /* 0x4d000000 --> 0xfd200000 */ |
231 | #define OMAP44XX_EMIF2_VIRT (OMAP44XX_EMIF2_PHYS + OMAP4_L3_PER_IO_OFFSET) | ||
232 | #define OMAP44XX_EMIF2_SIZE SZ_1M | 231 | #define OMAP44XX_EMIF2_SIZE SZ_1M |
232 | #define OMAP44XX_EMIF2_VIRT (OMAP44XX_EMIF1_VIRT + OMAP44XX_EMIF1_SIZE) | ||
233 | 233 | ||
234 | #define OMAP44XX_DMM_PHYS OMAP44XX_DMM_BASE | 234 | #define OMAP44XX_DMM_PHYS OMAP44XX_DMM_BASE |
235 | /* 0x4e000000 --> 0xfd300000 */ | 235 | /* 0x4e000000 --> 0xfd300000 */ |
236 | #define OMAP44XX_DMM_VIRT (OMAP44XX_DMM_PHYS + OMAP4_L3_PER_IO_OFFSET) | ||
237 | #define OMAP44XX_DMM_SIZE SZ_1M | 236 | #define OMAP44XX_DMM_SIZE SZ_1M |
237 | #define OMAP44XX_DMM_VIRT (OMAP44XX_EMIF2_VIRT + OMAP44XX_EMIF2_SIZE) | ||
238 | /* | 238 | /* |
239 | * ---------------------------------------------------------------------------- | 239 | * ---------------------------------------------------------------------------- |
240 | * Omap specific register access | 240 | * Omap specific register access |
diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h index 9882c657b2d4..8fa74e2c9d6e 100644 --- a/arch/arm/plat-omap/include/plat/mcbsp.h +++ b/arch/arm/plat-omap/include/plat/mcbsp.h | |||
@@ -25,9 +25,7 @@ | |||
25 | #define __ASM_ARCH_OMAP_MCBSP_H | 25 | #define __ASM_ARCH_OMAP_MCBSP_H |
26 | 26 | ||
27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
28 | 28 | #include <linux/clk.h> | |
29 | #include <mach/hardware.h> | ||
30 | #include <plat/clock.h> | ||
31 | 29 | ||
32 | /* macro for building platform_device for McBSP ports */ | 30 | /* macro for building platform_device for McBSP ports */ |
33 | #define OMAP_MCBSP_PLATFORM_DEVICE(port_nr) \ | 31 | #define OMAP_MCBSP_PLATFORM_DEVICE(port_nr) \ |
@@ -40,104 +38,60 @@ static struct platform_device omap_mcbsp##port_nr = { \ | |||
40 | #define MCBSP_CONFIG_TYPE3 0x3 | 38 | #define MCBSP_CONFIG_TYPE3 0x3 |
41 | #define MCBSP_CONFIG_TYPE4 0x4 | 39 | #define MCBSP_CONFIG_TYPE4 0x4 |
42 | 40 | ||
43 | #define OMAP7XX_MCBSP1_BASE 0xfffb1000 | 41 | /* McBSP register numbers. Register address offset = num * reg_step */ |
44 | #define OMAP7XX_MCBSP2_BASE 0xfffb1800 | 42 | enum { |
45 | 43 | /* Common registers */ | |
46 | #define OMAP1510_MCBSP1_BASE 0xe1011800 | 44 | OMAP_MCBSP_REG_SPCR2 = 4, |
47 | #define OMAP1510_MCBSP2_BASE 0xfffb1000 | 45 | OMAP_MCBSP_REG_SPCR1, |
48 | #define OMAP1510_MCBSP3_BASE 0xe1017000 | 46 | OMAP_MCBSP_REG_RCR2, |
49 | 47 | OMAP_MCBSP_REG_RCR1, | |
50 | #define OMAP1610_MCBSP1_BASE 0xe1011800 | 48 | OMAP_MCBSP_REG_XCR2, |
51 | #define OMAP1610_MCBSP2_BASE 0xfffb1000 | 49 | OMAP_MCBSP_REG_XCR1, |
52 | #define OMAP1610_MCBSP3_BASE 0xe1017000 | 50 | OMAP_MCBSP_REG_SRGR2, |
53 | 51 | OMAP_MCBSP_REG_SRGR1, | |
54 | #ifdef CONFIG_ARCH_OMAP1 | 52 | OMAP_MCBSP_REG_MCR2, |
55 | 53 | OMAP_MCBSP_REG_MCR1, | |
56 | #define OMAP_MCBSP_REG_DRR2 0x00 | 54 | OMAP_MCBSP_REG_RCERA, |
57 | #define OMAP_MCBSP_REG_DRR1 0x02 | 55 | OMAP_MCBSP_REG_RCERB, |
58 | #define OMAP_MCBSP_REG_DXR2 0x04 | 56 | OMAP_MCBSP_REG_XCERA, |
59 | #define OMAP_MCBSP_REG_DXR1 0x06 | 57 | OMAP_MCBSP_REG_XCERB, |
60 | #define OMAP_MCBSP_REG_DRR 0x02 | 58 | OMAP_MCBSP_REG_PCR0, |
61 | #define OMAP_MCBSP_REG_DXR 0x06 | 59 | OMAP_MCBSP_REG_RCERC, |
62 | #define OMAP_MCBSP_REG_SPCR2 0x08 | 60 | OMAP_MCBSP_REG_RCERD, |
63 | #define OMAP_MCBSP_REG_SPCR1 0x0a | 61 | OMAP_MCBSP_REG_XCERC, |
64 | #define OMAP_MCBSP_REG_RCR2 0x0c | 62 | OMAP_MCBSP_REG_XCERD, |
65 | #define OMAP_MCBSP_REG_RCR1 0x0e | 63 | OMAP_MCBSP_REG_RCERE, |
66 | #define OMAP_MCBSP_REG_XCR2 0x10 | 64 | OMAP_MCBSP_REG_RCERF, |
67 | #define OMAP_MCBSP_REG_XCR1 0x12 | 65 | OMAP_MCBSP_REG_XCERE, |
68 | #define OMAP_MCBSP_REG_SRGR2 0x14 | 66 | OMAP_MCBSP_REG_XCERF, |
69 | #define OMAP_MCBSP_REG_SRGR1 0x16 | 67 | OMAP_MCBSP_REG_RCERG, |
70 | #define OMAP_MCBSP_REG_MCR2 0x18 | 68 | OMAP_MCBSP_REG_RCERH, |
71 | #define OMAP_MCBSP_REG_MCR1 0x1a | 69 | OMAP_MCBSP_REG_XCERG, |
72 | #define OMAP_MCBSP_REG_RCERA 0x1c | 70 | OMAP_MCBSP_REG_XCERH, |
73 | #define OMAP_MCBSP_REG_RCERB 0x1e | 71 | |
74 | #define OMAP_MCBSP_REG_XCERA 0x20 | 72 | /* OMAP1-OMAP2420 registers */ |
75 | #define OMAP_MCBSP_REG_XCERB 0x22 | 73 | OMAP_MCBSP_REG_DRR2 = 0, |
76 | #define OMAP_MCBSP_REG_PCR0 0x24 | 74 | OMAP_MCBSP_REG_DRR1, |
77 | #define OMAP_MCBSP_REG_RCERC 0x26 | 75 | OMAP_MCBSP_REG_DXR2, |
78 | #define OMAP_MCBSP_REG_RCERD 0x28 | 76 | OMAP_MCBSP_REG_DXR1, |
79 | #define OMAP_MCBSP_REG_XCERC 0x2A | 77 | |
80 | #define OMAP_MCBSP_REG_XCERD 0x2C | 78 | /* OMAP2430 and onwards */ |
81 | #define OMAP_MCBSP_REG_RCERE 0x2E | 79 | OMAP_MCBSP_REG_DRR = 0, |
82 | #define OMAP_MCBSP_REG_RCERF 0x30 | 80 | OMAP_MCBSP_REG_DXR = 2, |
83 | #define OMAP_MCBSP_REG_XCERE 0x32 | 81 | OMAP_MCBSP_REG_SYSCON = 35, |
84 | #define OMAP_MCBSP_REG_XCERF 0x34 | 82 | OMAP_MCBSP_REG_THRSH2, |
85 | #define OMAP_MCBSP_REG_RCERG 0x36 | 83 | OMAP_MCBSP_REG_THRSH1, |
86 | #define OMAP_MCBSP_REG_RCERH 0x38 | 84 | OMAP_MCBSP_REG_IRQST = 40, |
87 | #define OMAP_MCBSP_REG_XCERG 0x3A | 85 | OMAP_MCBSP_REG_IRQEN, |
88 | #define OMAP_MCBSP_REG_XCERH 0x3C | 86 | OMAP_MCBSP_REG_WAKEUPEN, |
89 | 87 | OMAP_MCBSP_REG_XCCR, | |
90 | /* Dummy defines, these are not available on omap1 */ | 88 | OMAP_MCBSP_REG_RCCR, |
91 | #define OMAP_MCBSP_REG_XCCR 0x00 | 89 | OMAP_MCBSP_REG_XBUFFSTAT, |
92 | #define OMAP_MCBSP_REG_RCCR 0x00 | 90 | OMAP_MCBSP_REG_RBUFFSTAT, |
93 | 91 | OMAP_MCBSP_REG_SSELCR, | |
94 | #else | 92 | }; |
95 | |||
96 | #define OMAP_MCBSP_REG_DRR2 0x00 | ||
97 | #define OMAP_MCBSP_REG_DRR1 0x04 | ||
98 | #define OMAP_MCBSP_REG_DXR2 0x08 | ||
99 | #define OMAP_MCBSP_REG_DXR1 0x0C | ||
100 | #define OMAP_MCBSP_REG_DRR 0x00 | ||
101 | #define OMAP_MCBSP_REG_DXR 0x08 | ||
102 | #define OMAP_MCBSP_REG_SPCR2 0x10 | ||
103 | #define OMAP_MCBSP_REG_SPCR1 0x14 | ||
104 | #define OMAP_MCBSP_REG_RCR2 0x18 | ||
105 | #define OMAP_MCBSP_REG_RCR1 0x1C | ||
106 | #define OMAP_MCBSP_REG_XCR2 0x20 | ||
107 | #define OMAP_MCBSP_REG_XCR1 0x24 | ||
108 | #define OMAP_MCBSP_REG_SRGR2 0x28 | ||
109 | #define OMAP_MCBSP_REG_SRGR1 0x2C | ||
110 | #define OMAP_MCBSP_REG_MCR2 0x30 | ||
111 | #define OMAP_MCBSP_REG_MCR1 0x34 | ||
112 | #define OMAP_MCBSP_REG_RCERA 0x38 | ||
113 | #define OMAP_MCBSP_REG_RCERB 0x3C | ||
114 | #define OMAP_MCBSP_REG_XCERA 0x40 | ||
115 | #define OMAP_MCBSP_REG_XCERB 0x44 | ||
116 | #define OMAP_MCBSP_REG_PCR0 0x48 | ||
117 | #define OMAP_MCBSP_REG_RCERC 0x4C | ||
118 | #define OMAP_MCBSP_REG_RCERD 0x50 | ||
119 | #define OMAP_MCBSP_REG_XCERC 0x54 | ||
120 | #define OMAP_MCBSP_REG_XCERD 0x58 | ||
121 | #define OMAP_MCBSP_REG_RCERE 0x5C | ||
122 | #define OMAP_MCBSP_REG_RCERF 0x60 | ||
123 | #define OMAP_MCBSP_REG_XCERE 0x64 | ||
124 | #define OMAP_MCBSP_REG_XCERF 0x68 | ||
125 | #define OMAP_MCBSP_REG_RCERG 0x6C | ||
126 | #define OMAP_MCBSP_REG_RCERH 0x70 | ||
127 | #define OMAP_MCBSP_REG_XCERG 0x74 | ||
128 | #define OMAP_MCBSP_REG_XCERH 0x78 | ||
129 | #define OMAP_MCBSP_REG_SYSCON 0x8C | ||
130 | #define OMAP_MCBSP_REG_THRSH2 0x90 | ||
131 | #define OMAP_MCBSP_REG_THRSH1 0x94 | ||
132 | #define OMAP_MCBSP_REG_IRQST 0xA0 | ||
133 | #define OMAP_MCBSP_REG_IRQEN 0xA4 | ||
134 | #define OMAP_MCBSP_REG_WAKEUPEN 0xA8 | ||
135 | #define OMAP_MCBSP_REG_XCCR 0xAC | ||
136 | #define OMAP_MCBSP_REG_RCCR 0xB0 | ||
137 | #define OMAP_MCBSP_REG_XBUFFSTAT 0xB4 | ||
138 | #define OMAP_MCBSP_REG_RBUFFSTAT 0xB8 | ||
139 | #define OMAP_MCBSP_REG_SSELCR 0xBC | ||
140 | 93 | ||
94 | /* OMAP3 sidetone control registers */ | ||
141 | #define OMAP_ST_REG_REV 0x00 | 95 | #define OMAP_ST_REG_REV 0x00 |
142 | #define OMAP_ST_REG_SYSCONFIG 0x10 | 96 | #define OMAP_ST_REG_SYSCONFIG 0x10 |
143 | #define OMAP_ST_REG_IRQSTATUS 0x18 | 97 | #define OMAP_ST_REG_IRQSTATUS 0x18 |
@@ -146,8 +100,6 @@ static struct platform_device omap_mcbsp##port_nr = { \ | |||
146 | #define OMAP_ST_REG_SFIRCR 0x28 | 100 | #define OMAP_ST_REG_SFIRCR 0x28 |
147 | #define OMAP_ST_REG_SSELCR 0x2C | 101 | #define OMAP_ST_REG_SSELCR 0x2C |
148 | 102 | ||
149 | #endif | ||
150 | |||
151 | /************************** McBSP SPCR1 bit definitions ***********************/ | 103 | /************************** McBSP SPCR1 bit definitions ***********************/ |
152 | #define RRST 0x0001 | 104 | #define RRST 0x0001 |
153 | #define RRDY 0x0002 | 105 | #define RRDY 0x0002 |
@@ -344,20 +296,20 @@ typedef enum { | |||
344 | struct omap_mcbsp_ops { | 296 | struct omap_mcbsp_ops { |
345 | void (*request)(unsigned int); | 297 | void (*request)(unsigned int); |
346 | void (*free)(unsigned int); | 298 | void (*free)(unsigned int); |
347 | int (*set_clks_src)(u8, u8); | ||
348 | }; | 299 | }; |
349 | 300 | ||
350 | struct omap_mcbsp_platform_data { | 301 | struct omap_mcbsp_platform_data { |
351 | unsigned long phys_base; | ||
352 | u8 dma_rx_sync, dma_tx_sync; | ||
353 | u16 rx_irq, tx_irq; | ||
354 | struct omap_mcbsp_ops *ops; | 302 | struct omap_mcbsp_ops *ops; |
355 | #ifdef CONFIG_ARCH_OMAP3 | ||
356 | /* Sidetone block for McBSP 2 and 3 */ | ||
357 | unsigned long phys_base_st; | ||
358 | #endif | ||
359 | u16 buffer_size; | 303 | u16 buffer_size; |
360 | unsigned int mcbsp_config_type; | 304 | u8 reg_size; |
305 | u8 reg_step; | ||
306 | |||
307 | /* McBSP platform and instance specific features */ | ||
308 | bool has_wakeup; /* Wakeup capability */ | ||
309 | bool has_ccr; /* Transceiver has configuration control registers */ | ||
310 | int (*enable_st_clock)(unsigned int, bool); | ||
311 | int (*set_clk_src)(struct device *dev, struct clk *clk, const char *src); | ||
312 | int (*mux_signal)(struct device *dev, const char *signal, const char *src); | ||
361 | }; | 313 | }; |
362 | 314 | ||
363 | struct omap_mcbsp_st_data { | 315 | struct omap_mcbsp_st_data { |
@@ -389,14 +341,12 @@ struct omap_mcbsp { | |||
389 | spinlock_t lock; | 341 | spinlock_t lock; |
390 | struct omap_mcbsp_platform_data *pdata; | 342 | struct omap_mcbsp_platform_data *pdata; |
391 | struct clk *fclk; | 343 | struct clk *fclk; |
392 | #ifdef CONFIG_ARCH_OMAP3 | ||
393 | struct omap_mcbsp_st_data *st_data; | 344 | struct omap_mcbsp_st_data *st_data; |
394 | int dma_op_mode; | 345 | int dma_op_mode; |
395 | u16 max_tx_thres; | 346 | u16 max_tx_thres; |
396 | u16 max_rx_thres; | 347 | u16 max_rx_thres; |
397 | #endif | ||
398 | void *reg_cache; | 348 | void *reg_cache; |
399 | unsigned int mcbsp_config_type; | 349 | int reg_cache_size; |
400 | }; | 350 | }; |
401 | 351 | ||
402 | /** | 352 | /** |
@@ -408,16 +358,10 @@ struct omap_mcbsp_dev_attr { | |||
408 | }; | 358 | }; |
409 | 359 | ||
410 | extern struct omap_mcbsp **mcbsp_ptr; | 360 | extern struct omap_mcbsp **mcbsp_ptr; |
411 | extern int omap_mcbsp_count, omap_mcbsp_cache_size; | 361 | extern int omap_mcbsp_count; |
412 | |||
413 | #define omap_mcbsp_check_valid_id(id) (id < omap_mcbsp_count) | ||
414 | #define id_to_mcbsp_ptr(id) mcbsp_ptr[id]; | ||
415 | 362 | ||
416 | int omap_mcbsp_init(void); | 363 | int omap_mcbsp_init(void); |
417 | void omap_mcbsp_register_board_cfg(struct resource *res, int res_count, | ||
418 | struct omap_mcbsp_platform_data *config, int size); | ||
419 | void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config); | 364 | void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config); |
420 | #ifdef CONFIG_ARCH_OMAP3 | ||
421 | void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold); | 365 | void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold); |
422 | void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold); | 366 | void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold); |
423 | u16 omap_mcbsp_get_max_tx_threshold(unsigned int id); | 367 | u16 omap_mcbsp_get_max_tx_threshold(unsigned int id); |
@@ -426,18 +370,6 @@ u16 omap_mcbsp_get_fifo_size(unsigned int id); | |||
426 | u16 omap_mcbsp_get_tx_delay(unsigned int id); | 370 | u16 omap_mcbsp_get_tx_delay(unsigned int id); |
427 | u16 omap_mcbsp_get_rx_delay(unsigned int id); | 371 | u16 omap_mcbsp_get_rx_delay(unsigned int id); |
428 | int omap_mcbsp_get_dma_op_mode(unsigned int id); | 372 | int omap_mcbsp_get_dma_op_mode(unsigned int id); |
429 | #else | ||
430 | static inline void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold) | ||
431 | { } | ||
432 | static inline void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold) | ||
433 | { } | ||
434 | static inline u16 omap_mcbsp_get_max_tx_threshold(unsigned int id) { return 0; } | ||
435 | static inline u16 omap_mcbsp_get_max_rx_threshold(unsigned int id) { return 0; } | ||
436 | static inline u16 omap_mcbsp_get_fifo_size(unsigned int id) { return 0; } | ||
437 | static inline u16 omap_mcbsp_get_tx_delay(unsigned int id) { return 0; } | ||
438 | static inline u16 omap_mcbsp_get_rx_delay(unsigned int id) { return 0; } | ||
439 | static inline int omap_mcbsp_get_dma_op_mode(unsigned int id) { return 0; } | ||
440 | #endif | ||
441 | int omap_mcbsp_request(unsigned int id); | 373 | int omap_mcbsp_request(unsigned int id); |
442 | void omap_mcbsp_free(unsigned int id); | 374 | void omap_mcbsp_free(unsigned int id); |
443 | void omap_mcbsp_start(unsigned int id, int tx, int rx); | 375 | void omap_mcbsp_start(unsigned int id, int tx, int rx); |
@@ -453,21 +385,11 @@ void omap2_mcbsp1_mux_fsr_src(u8 mux); | |||
453 | int omap_mcbsp_dma_ch_params(unsigned int id, unsigned int stream); | 385 | int omap_mcbsp_dma_ch_params(unsigned int id, unsigned int stream); |
454 | int omap_mcbsp_dma_reg_params(unsigned int id, unsigned int stream); | 386 | int omap_mcbsp_dma_reg_params(unsigned int id, unsigned int stream); |
455 | 387 | ||
456 | #ifdef CONFIG_ARCH_OMAP3 | ||
457 | /* Sidetone specific API */ | 388 | /* Sidetone specific API */ |
458 | int omap_st_set_chgain(unsigned int id, int channel, s16 chgain); | 389 | int omap_st_set_chgain(unsigned int id, int channel, s16 chgain); |
459 | int omap_st_get_chgain(unsigned int id, int channel, s16 *chgain); | 390 | int omap_st_get_chgain(unsigned int id, int channel, s16 *chgain); |
460 | int omap_st_enable(unsigned int id); | 391 | int omap_st_enable(unsigned int id); |
461 | int omap_st_disable(unsigned int id); | 392 | int omap_st_disable(unsigned int id); |
462 | int omap_st_is_enabled(unsigned int id); | 393 | int omap_st_is_enabled(unsigned int id); |
463 | #else | ||
464 | static inline int omap_st_set_chgain(unsigned int id, int channel, | ||
465 | s16 chgain) { return 0; } | ||
466 | static inline int omap_st_get_chgain(unsigned int id, int channel, | ||
467 | s16 *chgain) { return 0; } | ||
468 | static inline int omap_st_enable(unsigned int id) { return 0; } | ||
469 | static inline int omap_st_disable(unsigned int id) { return 0; } | ||
470 | static inline int omap_st_is_enabled(unsigned int id) { return 0; } | ||
471 | #endif | ||
472 | 394 | ||
473 | #endif | 395 | #endif |
diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h index ee405b36df4b..d4d9b96f961e 100644 --- a/arch/arm/plat-omap/include/plat/omap_device.h +++ b/arch/arm/plat-omap/include/plat/omap_device.h | |||
@@ -68,7 +68,7 @@ extern struct device omap_device_parent; | |||
68 | * | 68 | * |
69 | */ | 69 | */ |
70 | struct omap_device { | 70 | struct omap_device { |
71 | struct platform_device pdev; | 71 | struct platform_device *pdev; |
72 | struct omap_hwmod **hwmods; | 72 | struct omap_hwmod **hwmods; |
73 | struct omap_device_pm_latency *pm_lats; | 73 | struct omap_device_pm_latency *pm_lats; |
74 | u32 dev_wakeup_lat; | 74 | u32 dev_wakeup_lat; |
@@ -88,24 +88,18 @@ int omap_device_shutdown(struct platform_device *pdev); | |||
88 | 88 | ||
89 | /* Core code interface */ | 89 | /* Core code interface */ |
90 | 90 | ||
91 | int omap_device_count_resources(struct omap_device *od); | 91 | struct platform_device *omap_device_build(const char *pdev_name, int pdev_id, |
92 | int omap_device_fill_resources(struct omap_device *od, struct resource *res); | ||
93 | |||
94 | struct omap_device *omap_device_build(const char *pdev_name, int pdev_id, | ||
95 | struct omap_hwmod *oh, void *pdata, | 92 | struct omap_hwmod *oh, void *pdata, |
96 | int pdata_len, | 93 | int pdata_len, |
97 | struct omap_device_pm_latency *pm_lats, | 94 | struct omap_device_pm_latency *pm_lats, |
98 | int pm_lats_cnt, int is_early_device); | 95 | int pm_lats_cnt, int is_early_device); |
99 | 96 | ||
100 | struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | 97 | struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id, |
101 | struct omap_hwmod **oh, int oh_cnt, | 98 | struct omap_hwmod **oh, int oh_cnt, |
102 | void *pdata, int pdata_len, | 99 | void *pdata, int pdata_len, |
103 | struct omap_device_pm_latency *pm_lats, | 100 | struct omap_device_pm_latency *pm_lats, |
104 | int pm_lats_cnt, int is_early_device); | 101 | int pm_lats_cnt, int is_early_device); |
105 | 102 | ||
106 | int omap_device_register(struct omap_device *od); | ||
107 | int omap_early_device_register(struct omap_device *od); | ||
108 | |||
109 | void __iomem *omap_device_get_rt_va(struct omap_device *od); | 103 | void __iomem *omap_device_get_rt_va(struct omap_device *od); |
110 | 104 | ||
111 | /* OMAP PM interface */ | 105 | /* OMAP PM interface */ |
@@ -122,11 +116,6 @@ int omap_device_enable_hwmods(struct omap_device *od); | |||
122 | int omap_device_disable_clocks(struct omap_device *od); | 116 | int omap_device_disable_clocks(struct omap_device *od); |
123 | int omap_device_enable_clocks(struct omap_device *od); | 117 | int omap_device_enable_clocks(struct omap_device *od); |
124 | 118 | ||
125 | static inline void omap_device_disable_idle_on_suspend(struct omap_device *od) | ||
126 | { | ||
127 | od->flags |= OMAP_DEVICE_NO_IDLE_ON_SUSPEND; | ||
128 | } | ||
129 | |||
130 | /* | 119 | /* |
131 | * Entries should be kept in latency order ascending | 120 | * Entries should be kept in latency order ascending |
132 | * | 121 | * |
@@ -157,6 +146,17 @@ struct omap_device_pm_latency { | |||
157 | #define OMAP_DEVICE_LATENCY_AUTO_ADJUST BIT(1) | 146 | #define OMAP_DEVICE_LATENCY_AUTO_ADJUST BIT(1) |
158 | 147 | ||
159 | /* Get omap_device pointer from platform_device pointer */ | 148 | /* Get omap_device pointer from platform_device pointer */ |
160 | #define to_omap_device(x) container_of((x), struct omap_device, pdev) | 149 | static inline struct omap_device *to_omap_device(struct platform_device *pdev) |
150 | { | ||
151 | return pdev ? pdev->archdata.od : NULL; | ||
152 | } | ||
153 | |||
154 | static inline | ||
155 | void omap_device_disable_idle_on_suspend(struct platform_device *pdev) | ||
156 | { | ||
157 | struct omap_device *od = to_omap_device(pdev); | ||
158 | |||
159 | od->flags |= OMAP_DEVICE_NO_IDLE_ON_SUSPEND; | ||
160 | } | ||
161 | 161 | ||
162 | #endif | 162 | #endif |
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index 6c62af108710..4b15cd7926d7 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c | |||
@@ -24,45 +24,40 @@ | |||
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | 25 | ||
26 | #include <plat/mcbsp.h> | 26 | #include <plat/mcbsp.h> |
27 | #include <plat/omap_device.h> | ||
28 | #include <linux/pm_runtime.h> | 27 | #include <linux/pm_runtime.h> |
29 | 28 | ||
30 | /* XXX These "sideways" includes are a sign that something is wrong */ | ||
31 | #include "../mach-omap2/cm2xxx_3xxx.h" | ||
32 | #include "../mach-omap2/cm-regbits-34xx.h" | ||
33 | |||
34 | struct omap_mcbsp **mcbsp_ptr; | 29 | struct omap_mcbsp **mcbsp_ptr; |
35 | int omap_mcbsp_count, omap_mcbsp_cache_size; | 30 | int omap_mcbsp_count; |
31 | |||
32 | #define omap_mcbsp_check_valid_id(id) (id < omap_mcbsp_count) | ||
33 | #define id_to_mcbsp_ptr(id) mcbsp_ptr[id]; | ||
36 | 34 | ||
37 | static void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val) | 35 | static void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val) |
38 | { | 36 | { |
39 | if (cpu_class_is_omap1()) { | 37 | void __iomem *addr = mcbsp->io_base + reg * mcbsp->pdata->reg_step; |
40 | ((u16 *)mcbsp->reg_cache)[reg / sizeof(u16)] = (u16)val; | 38 | |
41 | __raw_writew((u16)val, mcbsp->io_base + reg); | 39 | if (mcbsp->pdata->reg_size == 2) { |
42 | } else if (cpu_is_omap2420()) { | 40 | ((u16 *)mcbsp->reg_cache)[reg] = (u16)val; |
43 | ((u16 *)mcbsp->reg_cache)[reg / sizeof(u32)] = (u16)val; | 41 | __raw_writew((u16)val, addr); |
44 | __raw_writew((u16)val, mcbsp->io_base + reg); | ||
45 | } else { | 42 | } else { |
46 | ((u32 *)mcbsp->reg_cache)[reg / sizeof(u32)] = val; | 43 | ((u32 *)mcbsp->reg_cache)[reg] = val; |
47 | __raw_writel(val, mcbsp->io_base + reg); | 44 | __raw_writel(val, addr); |
48 | } | 45 | } |
49 | } | 46 | } |
50 | 47 | ||
51 | static int omap_mcbsp_read(struct omap_mcbsp *mcbsp, u16 reg, bool from_cache) | 48 | static int omap_mcbsp_read(struct omap_mcbsp *mcbsp, u16 reg, bool from_cache) |
52 | { | 49 | { |
53 | if (cpu_class_is_omap1()) { | 50 | void __iomem *addr = mcbsp->io_base + reg * mcbsp->pdata->reg_step; |
54 | return !from_cache ? __raw_readw(mcbsp->io_base + reg) : | 51 | |
55 | ((u16 *)mcbsp->reg_cache)[reg / sizeof(u16)]; | 52 | if (mcbsp->pdata->reg_size == 2) { |
56 | } else if (cpu_is_omap2420()) { | 53 | return !from_cache ? __raw_readw(addr) : |
57 | return !from_cache ? __raw_readw(mcbsp->io_base + reg) : | 54 | ((u16 *)mcbsp->reg_cache)[reg]; |
58 | ((u16 *)mcbsp->reg_cache)[reg / sizeof(u32)]; | ||
59 | } else { | 55 | } else { |
60 | return !from_cache ? __raw_readl(mcbsp->io_base + reg) : | 56 | return !from_cache ? __raw_readl(addr) : |
61 | ((u32 *)mcbsp->reg_cache)[reg / sizeof(u32)]; | 57 | ((u32 *)mcbsp->reg_cache)[reg]; |
62 | } | 58 | } |
63 | } | 59 | } |
64 | 60 | ||
65 | #ifdef CONFIG_ARCH_OMAP3 | ||
66 | static void omap_mcbsp_st_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val) | 61 | static void omap_mcbsp_st_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val) |
67 | { | 62 | { |
68 | __raw_writel(val, mcbsp->st_data->io_base_st + reg); | 63 | __raw_writel(val, mcbsp->st_data->io_base_st + reg); |
@@ -72,7 +67,6 @@ static int omap_mcbsp_st_read(struct omap_mcbsp *mcbsp, u16 reg) | |||
72 | { | 67 | { |
73 | return __raw_readl(mcbsp->st_data->io_base_st + reg); | 68 | return __raw_readl(mcbsp->st_data->io_base_st + reg); |
74 | } | 69 | } |
75 | #endif | ||
76 | 70 | ||
77 | #define MCBSP_READ(mcbsp, reg) \ | 71 | #define MCBSP_READ(mcbsp, reg) \ |
78 | omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 0) | 72 | omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 0) |
@@ -187,7 +181,7 @@ void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config) | |||
187 | MCBSP_WRITE(mcbsp, MCR2, config->mcr2); | 181 | MCBSP_WRITE(mcbsp, MCR2, config->mcr2); |
188 | MCBSP_WRITE(mcbsp, MCR1, config->mcr1); | 182 | MCBSP_WRITE(mcbsp, MCR1, config->mcr1); |
189 | MCBSP_WRITE(mcbsp, PCR0, config->pcr0); | 183 | MCBSP_WRITE(mcbsp, PCR0, config->pcr0); |
190 | if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { | 184 | if (mcbsp->pdata->has_ccr) { |
191 | MCBSP_WRITE(mcbsp, XCCR, config->xccr); | 185 | MCBSP_WRITE(mcbsp, XCCR, config->xccr); |
192 | MCBSP_WRITE(mcbsp, RCCR, config->rccr); | 186 | MCBSP_WRITE(mcbsp, RCCR, config->rccr); |
193 | } | 187 | } |
@@ -239,46 +233,28 @@ int omap_mcbsp_dma_reg_params(unsigned int id, unsigned int stream) | |||
239 | } | 233 | } |
240 | mcbsp = id_to_mcbsp_ptr(id); | 234 | mcbsp = id_to_mcbsp_ptr(id); |
241 | 235 | ||
242 | data_reg = mcbsp->phys_dma_base; | 236 | if (mcbsp->pdata->reg_size == 2) { |
243 | |||
244 | if (mcbsp->mcbsp_config_type < MCBSP_CONFIG_TYPE2) { | ||
245 | if (stream) | 237 | if (stream) |
246 | data_reg += OMAP_MCBSP_REG_DRR1; | 238 | data_reg = OMAP_MCBSP_REG_DRR1; |
247 | else | 239 | else |
248 | data_reg += OMAP_MCBSP_REG_DXR1; | 240 | data_reg = OMAP_MCBSP_REG_DXR1; |
249 | } else { | 241 | } else { |
250 | if (stream) | 242 | if (stream) |
251 | data_reg += OMAP_MCBSP_REG_DRR; | 243 | data_reg = OMAP_MCBSP_REG_DRR; |
252 | else | 244 | else |
253 | data_reg += OMAP_MCBSP_REG_DXR; | 245 | data_reg = OMAP_MCBSP_REG_DXR; |
254 | } | 246 | } |
255 | 247 | ||
256 | return data_reg; | 248 | return mcbsp->phys_dma_base + data_reg * mcbsp->pdata->reg_step; |
257 | } | 249 | } |
258 | EXPORT_SYMBOL(omap_mcbsp_dma_reg_params); | 250 | EXPORT_SYMBOL(omap_mcbsp_dma_reg_params); |
259 | 251 | ||
260 | #ifdef CONFIG_ARCH_OMAP3 | ||
261 | static struct omap_device *find_omap_device_by_dev(struct device *dev) | ||
262 | { | ||
263 | struct platform_device *pdev = container_of(dev, | ||
264 | struct platform_device, dev); | ||
265 | return container_of(pdev, struct omap_device, pdev); | ||
266 | } | ||
267 | |||
268 | static void omap_st_on(struct omap_mcbsp *mcbsp) | 252 | static void omap_st_on(struct omap_mcbsp *mcbsp) |
269 | { | 253 | { |
270 | unsigned int w; | 254 | unsigned int w; |
271 | struct omap_device *od; | ||
272 | 255 | ||
273 | od = find_omap_device_by_dev(mcbsp->dev); | 256 | if (mcbsp->pdata->enable_st_clock) |
274 | 257 | mcbsp->pdata->enable_st_clock(mcbsp->id, 1); | |
275 | /* | ||
276 | * Sidetone uses McBSP ICLK - which must not idle when sidetones | ||
277 | * are enabled or sidetones start sounding ugly. | ||
278 | */ | ||
279 | w = omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE); | ||
280 | w &= ~(1 << (mcbsp->id - 2)); | ||
281 | omap2_cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE); | ||
282 | 258 | ||
283 | /* Enable McBSP Sidetone */ | 259 | /* Enable McBSP Sidetone */ |
284 | w = MCBSP_READ(mcbsp, SSELCR); | 260 | w = MCBSP_READ(mcbsp, SSELCR); |
@@ -292,9 +268,6 @@ static void omap_st_on(struct omap_mcbsp *mcbsp) | |||
292 | static void omap_st_off(struct omap_mcbsp *mcbsp) | 268 | static void omap_st_off(struct omap_mcbsp *mcbsp) |
293 | { | 269 | { |
294 | unsigned int w; | 270 | unsigned int w; |
295 | struct omap_device *od; | ||
296 | |||
297 | od = find_omap_device_by_dev(mcbsp->dev); | ||
298 | 271 | ||
299 | w = MCBSP_ST_READ(mcbsp, SSELCR); | 272 | w = MCBSP_ST_READ(mcbsp, SSELCR); |
300 | MCBSP_ST_WRITE(mcbsp, SSELCR, w & ~(ST_SIDETONEEN)); | 273 | MCBSP_ST_WRITE(mcbsp, SSELCR, w & ~(ST_SIDETONEEN)); |
@@ -302,17 +275,13 @@ static void omap_st_off(struct omap_mcbsp *mcbsp) | |||
302 | w = MCBSP_READ(mcbsp, SSELCR); | 275 | w = MCBSP_READ(mcbsp, SSELCR); |
303 | MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN)); | 276 | MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN)); |
304 | 277 | ||
305 | w = omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE); | 278 | if (mcbsp->pdata->enable_st_clock) |
306 | w |= 1 << (mcbsp->id - 2); | 279 | mcbsp->pdata->enable_st_clock(mcbsp->id, 0); |
307 | omap2_cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE); | ||
308 | } | 280 | } |
309 | 281 | ||
310 | static void omap_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir) | 282 | static void omap_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir) |
311 | { | 283 | { |
312 | u16 val, i; | 284 | u16 val, i; |
313 | struct omap_device *od; | ||
314 | |||
315 | od = find_omap_device_by_dev(mcbsp->dev); | ||
316 | 285 | ||
317 | val = MCBSP_ST_READ(mcbsp, SSELCR); | 286 | val = MCBSP_ST_READ(mcbsp, SSELCR); |
318 | 287 | ||
@@ -340,9 +309,6 @@ static void omap_st_chgain(struct omap_mcbsp *mcbsp) | |||
340 | { | 309 | { |
341 | u16 w; | 310 | u16 w; |
342 | struct omap_mcbsp_st_data *st_data = mcbsp->st_data; | 311 | struct omap_mcbsp_st_data *st_data = mcbsp->st_data; |
343 | struct omap_device *od; | ||
344 | |||
345 | od = find_omap_device_by_dev(mcbsp->dev); | ||
346 | 312 | ||
347 | w = MCBSP_ST_READ(mcbsp, SSELCR); | 313 | w = MCBSP_ST_READ(mcbsp, SSELCR); |
348 | 314 | ||
@@ -525,14 +491,13 @@ void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold) | |||
525 | { | 491 | { |
526 | struct omap_mcbsp *mcbsp; | 492 | struct omap_mcbsp *mcbsp; |
527 | 493 | ||
528 | if (!cpu_is_omap34xx() && !cpu_is_omap44xx()) | ||
529 | return; | ||
530 | |||
531 | if (!omap_mcbsp_check_valid_id(id)) { | 494 | if (!omap_mcbsp_check_valid_id(id)) { |
532 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | 495 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); |
533 | return; | 496 | return; |
534 | } | 497 | } |
535 | mcbsp = id_to_mcbsp_ptr(id); | 498 | mcbsp = id_to_mcbsp_ptr(id); |
499 | if (mcbsp->pdata->buffer_size == 0) | ||
500 | return; | ||
536 | 501 | ||
537 | if (threshold && threshold <= mcbsp->max_tx_thres) | 502 | if (threshold && threshold <= mcbsp->max_tx_thres) |
538 | MCBSP_WRITE(mcbsp, THRSH2, threshold - 1); | 503 | MCBSP_WRITE(mcbsp, THRSH2, threshold - 1); |
@@ -548,14 +513,13 @@ void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold) | |||
548 | { | 513 | { |
549 | struct omap_mcbsp *mcbsp; | 514 | struct omap_mcbsp *mcbsp; |
550 | 515 | ||
551 | if (!cpu_is_omap34xx() && !cpu_is_omap44xx()) | ||
552 | return; | ||
553 | |||
554 | if (!omap_mcbsp_check_valid_id(id)) { | 516 | if (!omap_mcbsp_check_valid_id(id)) { |
555 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | 517 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); |
556 | return; | 518 | return; |
557 | } | 519 | } |
558 | mcbsp = id_to_mcbsp_ptr(id); | 520 | mcbsp = id_to_mcbsp_ptr(id); |
521 | if (mcbsp->pdata->buffer_size == 0) | ||
522 | return; | ||
559 | 523 | ||
560 | if (threshold && threshold <= mcbsp->max_rx_thres) | 524 | if (threshold && threshold <= mcbsp->max_rx_thres) |
561 | MCBSP_WRITE(mcbsp, THRSH1, threshold - 1); | 525 | MCBSP_WRITE(mcbsp, THRSH1, threshold - 1); |
@@ -625,6 +589,8 @@ u16 omap_mcbsp_get_tx_delay(unsigned int id) | |||
625 | return -ENODEV; | 589 | return -ENODEV; |
626 | } | 590 | } |
627 | mcbsp = id_to_mcbsp_ptr(id); | 591 | mcbsp = id_to_mcbsp_ptr(id); |
592 | if (mcbsp->pdata->buffer_size == 0) | ||
593 | return 0; | ||
628 | 594 | ||
629 | /* Returns the number of free locations in the buffer */ | 595 | /* Returns the number of free locations in the buffer */ |
630 | buffstat = MCBSP_READ(mcbsp, XBUFFSTAT); | 596 | buffstat = MCBSP_READ(mcbsp, XBUFFSTAT); |
@@ -648,6 +614,8 @@ u16 omap_mcbsp_get_rx_delay(unsigned int id) | |||
648 | return -ENODEV; | 614 | return -ENODEV; |
649 | } | 615 | } |
650 | mcbsp = id_to_mcbsp_ptr(id); | 616 | mcbsp = id_to_mcbsp_ptr(id); |
617 | if (mcbsp->pdata->buffer_size == 0) | ||
618 | return 0; | ||
651 | 619 | ||
652 | /* Returns the number of used locations in the buffer */ | 620 | /* Returns the number of used locations in the buffer */ |
653 | buffstat = MCBSP_READ(mcbsp, RBUFFSTAT); | 621 | buffstat = MCBSP_READ(mcbsp, RBUFFSTAT); |
@@ -683,46 +651,6 @@ int omap_mcbsp_get_dma_op_mode(unsigned int id) | |||
683 | } | 651 | } |
684 | EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode); | 652 | EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode); |
685 | 653 | ||
686 | static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp) | ||
687 | { | ||
688 | struct omap_device *od; | ||
689 | |||
690 | od = find_omap_device_by_dev(mcbsp->dev); | ||
691 | /* | ||
692 | * Enable wakup behavior, smart idle and all wakeups | ||
693 | * REVISIT: some wakeups may be unnecessary | ||
694 | */ | ||
695 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) { | ||
696 | MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN); | ||
697 | } | ||
698 | } | ||
699 | |||
700 | static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp) | ||
701 | { | ||
702 | struct omap_device *od; | ||
703 | |||
704 | od = find_omap_device_by_dev(mcbsp->dev); | ||
705 | |||
706 | /* | ||
707 | * Disable wakup behavior, smart idle and all wakeups | ||
708 | */ | ||
709 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) { | ||
710 | /* | ||
711 | * HW bug workaround - If no_idle mode is taken, we need to | ||
712 | * go to smart_idle before going to always_idle, or the | ||
713 | * device will not hit retention anymore. | ||
714 | */ | ||
715 | |||
716 | MCBSP_WRITE(mcbsp, WAKEUPEN, 0); | ||
717 | } | ||
718 | } | ||
719 | #else | ||
720 | static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp) {} | ||
721 | static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp) {} | ||
722 | static inline void omap_st_start(struct omap_mcbsp *mcbsp) {} | ||
723 | static inline void omap_st_stop(struct omap_mcbsp *mcbsp) {} | ||
724 | #endif | ||
725 | |||
726 | int omap_mcbsp_request(unsigned int id) | 654 | int omap_mcbsp_request(unsigned int id) |
727 | { | 655 | { |
728 | struct omap_mcbsp *mcbsp; | 656 | struct omap_mcbsp *mcbsp; |
@@ -735,7 +663,7 @@ int omap_mcbsp_request(unsigned int id) | |||
735 | } | 663 | } |
736 | mcbsp = id_to_mcbsp_ptr(id); | 664 | mcbsp = id_to_mcbsp_ptr(id); |
737 | 665 | ||
738 | reg_cache = kzalloc(omap_mcbsp_cache_size, GFP_KERNEL); | 666 | reg_cache = kzalloc(mcbsp->reg_cache_size, GFP_KERNEL); |
739 | if (!reg_cache) { | 667 | if (!reg_cache) { |
740 | return -ENOMEM; | 668 | return -ENOMEM; |
741 | } | 669 | } |
@@ -757,8 +685,9 @@ int omap_mcbsp_request(unsigned int id) | |||
757 | 685 | ||
758 | pm_runtime_get_sync(mcbsp->dev); | 686 | pm_runtime_get_sync(mcbsp->dev); |
759 | 687 | ||
760 | /* Do procedure specific to omap34xx arch, if applicable */ | 688 | /* Enable wakeup behavior */ |
761 | omap34xx_mcbsp_request(mcbsp); | 689 | if (mcbsp->pdata->has_wakeup) |
690 | MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN); | ||
762 | 691 | ||
763 | /* | 692 | /* |
764 | * Make sure that transmitter, receiver and sample-rate generator are | 693 | * Make sure that transmitter, receiver and sample-rate generator are |
@@ -795,8 +724,9 @@ err_clk_disable: | |||
795 | if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) | 724 | if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) |
796 | mcbsp->pdata->ops->free(id); | 725 | mcbsp->pdata->ops->free(id); |
797 | 726 | ||
798 | /* Do procedure specific to omap34xx arch, if applicable */ | 727 | /* Disable wakeup behavior */ |
799 | omap34xx_mcbsp_free(mcbsp); | 728 | if (mcbsp->pdata->has_wakeup) |
729 | MCBSP_WRITE(mcbsp, WAKEUPEN, 0); | ||
800 | 730 | ||
801 | pm_runtime_put_sync(mcbsp->dev); | 731 | pm_runtime_put_sync(mcbsp->dev); |
802 | 732 | ||
@@ -825,8 +755,9 @@ void omap_mcbsp_free(unsigned int id) | |||
825 | if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) | 755 | if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) |
826 | mcbsp->pdata->ops->free(id); | 756 | mcbsp->pdata->ops->free(id); |
827 | 757 | ||
828 | /* Do procedure specific to omap34xx arch, if applicable */ | 758 | /* Disable wakeup behavior */ |
829 | omap34xx_mcbsp_free(mcbsp); | 759 | if (mcbsp->pdata->has_wakeup) |
760 | MCBSP_WRITE(mcbsp, WAKEUPEN, 0); | ||
830 | 761 | ||
831 | pm_runtime_put_sync(mcbsp->dev); | 762 | pm_runtime_put_sync(mcbsp->dev); |
832 | 763 | ||
@@ -866,7 +797,7 @@ void omap_mcbsp_start(unsigned int id, int tx, int rx) | |||
866 | } | 797 | } |
867 | mcbsp = id_to_mcbsp_ptr(id); | 798 | mcbsp = id_to_mcbsp_ptr(id); |
868 | 799 | ||
869 | if (cpu_is_omap34xx()) | 800 | if (mcbsp->st_data) |
870 | omap_st_start(mcbsp); | 801 | omap_st_start(mcbsp); |
871 | 802 | ||
872 | /* Only enable SRG, if McBSP is master */ | 803 | /* Only enable SRG, if McBSP is master */ |
@@ -904,7 +835,7 @@ void omap_mcbsp_start(unsigned int id, int tx, int rx) | |||
904 | MCBSP_WRITE(mcbsp, SPCR2, w | (1 << 7)); | 835 | MCBSP_WRITE(mcbsp, SPCR2, w | (1 << 7)); |
905 | } | 836 | } |
906 | 837 | ||
907 | if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { | 838 | if (mcbsp->pdata->has_ccr) { |
908 | /* Release the transmitter and receiver */ | 839 | /* Release the transmitter and receiver */ |
909 | w = MCBSP_READ_CACHE(mcbsp, XCCR); | 840 | w = MCBSP_READ_CACHE(mcbsp, XCCR); |
910 | w &= ~(tx ? XDISABLE : 0); | 841 | w &= ~(tx ? XDISABLE : 0); |
@@ -934,7 +865,7 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx) | |||
934 | 865 | ||
935 | /* Reset transmitter */ | 866 | /* Reset transmitter */ |
936 | tx &= 1; | 867 | tx &= 1; |
937 | if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { | 868 | if (mcbsp->pdata->has_ccr) { |
938 | w = MCBSP_READ_CACHE(mcbsp, XCCR); | 869 | w = MCBSP_READ_CACHE(mcbsp, XCCR); |
939 | w |= (tx ? XDISABLE : 0); | 870 | w |= (tx ? XDISABLE : 0); |
940 | MCBSP_WRITE(mcbsp, XCCR, w); | 871 | MCBSP_WRITE(mcbsp, XCCR, w); |
@@ -944,7 +875,7 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx) | |||
944 | 875 | ||
945 | /* Reset receiver */ | 876 | /* Reset receiver */ |
946 | rx &= 1; | 877 | rx &= 1; |
947 | if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { | 878 | if (mcbsp->pdata->has_ccr) { |
948 | w = MCBSP_READ_CACHE(mcbsp, RCCR); | 879 | w = MCBSP_READ_CACHE(mcbsp, RCCR); |
949 | w |= (rx ? RDISABLE : 0); | 880 | w |= (rx ? RDISABLE : 0); |
950 | MCBSP_WRITE(mcbsp, RCCR, w); | 881 | MCBSP_WRITE(mcbsp, RCCR, w); |
@@ -961,39 +892,72 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx) | |||
961 | MCBSP_WRITE(mcbsp, SPCR2, w & ~(1 << 6)); | 892 | MCBSP_WRITE(mcbsp, SPCR2, w & ~(1 << 6)); |
962 | } | 893 | } |
963 | 894 | ||
964 | if (cpu_is_omap34xx()) | 895 | if (mcbsp->st_data) |
965 | omap_st_stop(mcbsp); | 896 | omap_st_stop(mcbsp); |
966 | } | 897 | } |
967 | EXPORT_SYMBOL(omap_mcbsp_stop); | 898 | EXPORT_SYMBOL(omap_mcbsp_stop); |
968 | 899 | ||
969 | /* | ||
970 | * The following functions are only required on an OMAP1-only build. | ||
971 | * mach-omap2/mcbsp.c contains the real functions | ||
972 | */ | ||
973 | #ifndef CONFIG_ARCH_OMAP2PLUS | ||
974 | int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id) | 900 | int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id) |
975 | { | 901 | { |
976 | WARN(1, "%s: should never be called on an OMAP1-only kernel\n", | 902 | struct omap_mcbsp *mcbsp; |
977 | __func__); | 903 | const char *src; |
978 | return -EINVAL; | 904 | |
905 | if (!omap_mcbsp_check_valid_id(id)) { | ||
906 | pr_err("%s: Invalid id (%d)\n", __func__, id + 1); | ||
907 | return -EINVAL; | ||
908 | } | ||
909 | mcbsp = id_to_mcbsp_ptr(id); | ||
910 | |||
911 | if (fck_src_id == MCBSP_CLKS_PAD_SRC) | ||
912 | src = "clks_ext"; | ||
913 | else if (fck_src_id == MCBSP_CLKS_PRCM_SRC) | ||
914 | src = "clks_fclk"; | ||
915 | else | ||
916 | return -EINVAL; | ||
917 | |||
918 | if (mcbsp->pdata->set_clk_src) | ||
919 | return mcbsp->pdata->set_clk_src(mcbsp->dev, mcbsp->fclk, src); | ||
920 | else | ||
921 | return -EINVAL; | ||
979 | } | 922 | } |
923 | EXPORT_SYMBOL(omap2_mcbsp_set_clks_src); | ||
980 | 924 | ||
981 | void omap2_mcbsp1_mux_clkr_src(u8 mux) | 925 | void omap2_mcbsp1_mux_clkr_src(u8 mux) |
982 | { | 926 | { |
983 | WARN(1, "%s: should never be called on an OMAP1-only kernel\n", | 927 | struct omap_mcbsp *mcbsp; |
984 | __func__); | 928 | const char *src; |
985 | return; | 929 | |
930 | if (mux == CLKR_SRC_CLKR) | ||
931 | src = "clkr"; | ||
932 | else if (mux == CLKR_SRC_CLKX) | ||
933 | src = "clkx"; | ||
934 | else | ||
935 | return; | ||
936 | |||
937 | mcbsp = id_to_mcbsp_ptr(0); | ||
938 | if (mcbsp->pdata->mux_signal) | ||
939 | mcbsp->pdata->mux_signal(mcbsp->dev, "clkr", src); | ||
986 | } | 940 | } |
941 | EXPORT_SYMBOL(omap2_mcbsp1_mux_clkr_src); | ||
987 | 942 | ||
988 | void omap2_mcbsp1_mux_fsr_src(u8 mux) | 943 | void omap2_mcbsp1_mux_fsr_src(u8 mux) |
989 | { | 944 | { |
990 | WARN(1, "%s: should never be called on an OMAP1-only kernel\n", | 945 | struct omap_mcbsp *mcbsp; |
991 | __func__); | 946 | const char *src; |
992 | return; | 947 | |
948 | if (mux == FSR_SRC_FSR) | ||
949 | src = "fsr"; | ||
950 | else if (mux == FSR_SRC_FSX) | ||
951 | src = "fsx"; | ||
952 | else | ||
953 | return; | ||
954 | |||
955 | mcbsp = id_to_mcbsp_ptr(0); | ||
956 | if (mcbsp->pdata->mux_signal) | ||
957 | mcbsp->pdata->mux_signal(mcbsp->dev, "fsr", src); | ||
993 | } | 958 | } |
994 | #endif | 959 | EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src); |
995 | 960 | ||
996 | #ifdef CONFIG_ARCH_OMAP3 | ||
997 | #define max_thres(m) (mcbsp->pdata->buffer_size) | 961 | #define max_thres(m) (mcbsp->pdata->buffer_size) |
998 | #define valid_threshold(m, val) ((val) <= max_thres(m)) | 962 | #define valid_threshold(m, val) ((val) <= max_thres(m)) |
999 | #define THRESHOLD_PROP_BUILDER(prop) \ | 963 | #define THRESHOLD_PROP_BUILDER(prop) \ |
@@ -1084,6 +1048,17 @@ unlock: | |||
1084 | 1048 | ||
1085 | static DEVICE_ATTR(dma_op_mode, 0644, dma_op_mode_show, dma_op_mode_store); | 1049 | static DEVICE_ATTR(dma_op_mode, 0644, dma_op_mode_show, dma_op_mode_store); |
1086 | 1050 | ||
1051 | static const struct attribute *additional_attrs[] = { | ||
1052 | &dev_attr_max_tx_thres.attr, | ||
1053 | &dev_attr_max_rx_thres.attr, | ||
1054 | &dev_attr_dma_op_mode.attr, | ||
1055 | NULL, | ||
1056 | }; | ||
1057 | |||
1058 | static const struct attribute_group additional_attr_group = { | ||
1059 | .attrs = (struct attribute **)additional_attrs, | ||
1060 | }; | ||
1061 | |||
1087 | static ssize_t st_taps_show(struct device *dev, | 1062 | static ssize_t st_taps_show(struct device *dev, |
1088 | struct device_attribute *attr, char *buf) | 1063 | struct device_attribute *attr, char *buf) |
1089 | { | 1064 | { |
@@ -1142,27 +1117,6 @@ out: | |||
1142 | 1117 | ||
1143 | static DEVICE_ATTR(st_taps, 0644, st_taps_show, st_taps_store); | 1118 | static DEVICE_ATTR(st_taps, 0644, st_taps_show, st_taps_store); |
1144 | 1119 | ||
1145 | static const struct attribute *additional_attrs[] = { | ||
1146 | &dev_attr_max_tx_thres.attr, | ||
1147 | &dev_attr_max_rx_thres.attr, | ||
1148 | &dev_attr_dma_op_mode.attr, | ||
1149 | NULL, | ||
1150 | }; | ||
1151 | |||
1152 | static const struct attribute_group additional_attr_group = { | ||
1153 | .attrs = (struct attribute **)additional_attrs, | ||
1154 | }; | ||
1155 | |||
1156 | static inline int __devinit omap_additional_add(struct device *dev) | ||
1157 | { | ||
1158 | return sysfs_create_group(&dev->kobj, &additional_attr_group); | ||
1159 | } | ||
1160 | |||
1161 | static inline void __devexit omap_additional_remove(struct device *dev) | ||
1162 | { | ||
1163 | sysfs_remove_group(&dev->kobj, &additional_attr_group); | ||
1164 | } | ||
1165 | |||
1166 | static const struct attribute *sidetone_attrs[] = { | 1120 | static const struct attribute *sidetone_attrs[] = { |
1167 | &dev_attr_st_taps.attr, | 1121 | &dev_attr_st_taps.attr, |
1168 | NULL, | 1122 | NULL, |
@@ -1172,10 +1126,9 @@ static const struct attribute_group sidetone_attr_group = { | |||
1172 | .attrs = (struct attribute **)sidetone_attrs, | 1126 | .attrs = (struct attribute **)sidetone_attrs, |
1173 | }; | 1127 | }; |
1174 | 1128 | ||
1175 | static int __devinit omap_st_add(struct omap_mcbsp *mcbsp) | 1129 | static int __devinit omap_st_add(struct omap_mcbsp *mcbsp, |
1130 | struct resource *res) | ||
1176 | { | 1131 | { |
1177 | struct platform_device *pdev; | ||
1178 | struct resource *res; | ||
1179 | struct omap_mcbsp_st_data *st_data; | 1132 | struct omap_mcbsp_st_data *st_data; |
1180 | int err; | 1133 | int err; |
1181 | 1134 | ||
@@ -1185,9 +1138,6 @@ static int __devinit omap_st_add(struct omap_mcbsp *mcbsp) | |||
1185 | goto err1; | 1138 | goto err1; |
1186 | } | 1139 | } |
1187 | 1140 | ||
1188 | pdev = container_of(mcbsp->dev, struct platform_device, dev); | ||
1189 | |||
1190 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sidetone"); | ||
1191 | st_data->io_base_st = ioremap(res->start, resource_size(res)); | 1141 | st_data->io_base_st = ioremap(res->start, resource_size(res)); |
1192 | if (!st_data->io_base_st) { | 1142 | if (!st_data->io_base_st) { |
1193 | err = -ENOMEM; | 1143 | err = -ENOMEM; |
@@ -1214,59 +1164,10 @@ static void __devexit omap_st_remove(struct omap_mcbsp *mcbsp) | |||
1214 | { | 1164 | { |
1215 | struct omap_mcbsp_st_data *st_data = mcbsp->st_data; | 1165 | struct omap_mcbsp_st_data *st_data = mcbsp->st_data; |
1216 | 1166 | ||
1217 | if (st_data) { | 1167 | sysfs_remove_group(&mcbsp->dev->kobj, &sidetone_attr_group); |
1218 | sysfs_remove_group(&mcbsp->dev->kobj, &sidetone_attr_group); | 1168 | iounmap(st_data->io_base_st); |
1219 | iounmap(st_data->io_base_st); | 1169 | kfree(st_data); |
1220 | kfree(st_data); | ||
1221 | } | ||
1222 | } | ||
1223 | |||
1224 | static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) | ||
1225 | { | ||
1226 | mcbsp->dma_op_mode = MCBSP_DMA_MODE_ELEMENT; | ||
1227 | if (cpu_is_omap34xx()) { | ||
1228 | /* | ||
1229 | * Initially configure the maximum thresholds to a safe value. | ||
1230 | * The McBSP FIFO usage with these values should not go under | ||
1231 | * 16 locations. | ||
1232 | * If the whole FIFO without safety buffer is used, than there | ||
1233 | * is a possibility that the DMA will be not able to push the | ||
1234 | * new data on time, causing channel shifts in runtime. | ||
1235 | */ | ||
1236 | mcbsp->max_tx_thres = max_thres(mcbsp) - 0x10; | ||
1237 | mcbsp->max_rx_thres = max_thres(mcbsp) - 0x10; | ||
1238 | /* | ||
1239 | * REVISIT: Set dmap_op_mode to THRESHOLD as default | ||
1240 | * for mcbsp2 instances. | ||
1241 | */ | ||
1242 | if (omap_additional_add(mcbsp->dev)) | ||
1243 | dev_warn(mcbsp->dev, | ||
1244 | "Unable to create additional controls\n"); | ||
1245 | |||
1246 | if (mcbsp->id == 2 || mcbsp->id == 3) | ||
1247 | if (omap_st_add(mcbsp)) | ||
1248 | dev_warn(mcbsp->dev, | ||
1249 | "Unable to create sidetone controls\n"); | ||
1250 | |||
1251 | } else { | ||
1252 | mcbsp->max_tx_thres = -EINVAL; | ||
1253 | mcbsp->max_rx_thres = -EINVAL; | ||
1254 | } | ||
1255 | } | ||
1256 | |||
1257 | static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) | ||
1258 | { | ||
1259 | if (cpu_is_omap34xx()) { | ||
1260 | omap_additional_remove(mcbsp->dev); | ||
1261 | |||
1262 | if (mcbsp->id == 2 || mcbsp->id == 3) | ||
1263 | omap_st_remove(mcbsp); | ||
1264 | } | ||
1265 | } | 1170 | } |
1266 | #else | ||
1267 | static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) {} | ||
1268 | static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) {} | ||
1269 | #endif /* CONFIG_ARCH_OMAP3 */ | ||
1270 | 1171 | ||
1271 | /* | 1172 | /* |
1272 | * McBSP1 and McBSP3 are directly mapped on 1610 and 1510. | 1173 | * McBSP1 and McBSP3 are directly mapped on 1610 and 1510. |
@@ -1316,7 +1217,7 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev) | |||
1316 | } | 1217 | } |
1317 | } | 1218 | } |
1318 | mcbsp->phys_base = res->start; | 1219 | mcbsp->phys_base = res->start; |
1319 | omap_mcbsp_cache_size = resource_size(res); | 1220 | mcbsp->reg_cache_size = resource_size(res); |
1320 | mcbsp->io_base = ioremap(res->start, resource_size(res)); | 1221 | mcbsp->io_base = ioremap(res->start, resource_size(res)); |
1321 | if (!mcbsp->io_base) { | 1222 | if (!mcbsp->io_base) { |
1322 | ret = -ENOMEM; | 1223 | ret = -ENOMEM; |
@@ -1364,15 +1265,52 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev) | |||
1364 | mcbsp->pdata = pdata; | 1265 | mcbsp->pdata = pdata; |
1365 | mcbsp->dev = &pdev->dev; | 1266 | mcbsp->dev = &pdev->dev; |
1366 | mcbsp_ptr[id] = mcbsp; | 1267 | mcbsp_ptr[id] = mcbsp; |
1367 | mcbsp->mcbsp_config_type = pdata->mcbsp_config_type; | ||
1368 | platform_set_drvdata(pdev, mcbsp); | 1268 | platform_set_drvdata(pdev, mcbsp); |
1369 | pm_runtime_enable(mcbsp->dev); | 1269 | pm_runtime_enable(mcbsp->dev); |
1370 | 1270 | ||
1371 | /* Initialize mcbsp properties for OMAP34XX if needed / applicable */ | 1271 | mcbsp->dma_op_mode = MCBSP_DMA_MODE_ELEMENT; |
1372 | omap34xx_device_init(mcbsp); | 1272 | if (mcbsp->pdata->buffer_size) { |
1273 | /* | ||
1274 | * Initially configure the maximum thresholds to a safe value. | ||
1275 | * The McBSP FIFO usage with these values should not go under | ||
1276 | * 16 locations. | ||
1277 | * If the whole FIFO without safety buffer is used, than there | ||
1278 | * is a possibility that the DMA will be not able to push the | ||
1279 | * new data on time, causing channel shifts in runtime. | ||
1280 | */ | ||
1281 | mcbsp->max_tx_thres = max_thres(mcbsp) - 0x10; | ||
1282 | mcbsp->max_rx_thres = max_thres(mcbsp) - 0x10; | ||
1283 | |||
1284 | ret = sysfs_create_group(&mcbsp->dev->kobj, | ||
1285 | &additional_attr_group); | ||
1286 | if (ret) { | ||
1287 | dev_err(mcbsp->dev, | ||
1288 | "Unable to create additional controls\n"); | ||
1289 | goto err_thres; | ||
1290 | } | ||
1291 | } else { | ||
1292 | mcbsp->max_tx_thres = -EINVAL; | ||
1293 | mcbsp->max_rx_thres = -EINVAL; | ||
1294 | } | ||
1295 | |||
1296 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sidetone"); | ||
1297 | if (res) { | ||
1298 | ret = omap_st_add(mcbsp, res); | ||
1299 | if (ret) { | ||
1300 | dev_err(mcbsp->dev, | ||
1301 | "Unable to create sidetone controls\n"); | ||
1302 | goto err_st; | ||
1303 | } | ||
1304 | } | ||
1373 | 1305 | ||
1374 | return 0; | 1306 | return 0; |
1375 | 1307 | ||
1308 | err_st: | ||
1309 | if (mcbsp->pdata->buffer_size) | ||
1310 | sysfs_remove_group(&mcbsp->dev->kobj, | ||
1311 | &additional_attr_group); | ||
1312 | err_thres: | ||
1313 | clk_put(mcbsp->fclk); | ||
1376 | err_res: | 1314 | err_res: |
1377 | iounmap(mcbsp->io_base); | 1315 | iounmap(mcbsp->io_base); |
1378 | err_ioremap: | 1316 | err_ioremap: |
@@ -1392,7 +1330,12 @@ static int __devexit omap_mcbsp_remove(struct platform_device *pdev) | |||
1392 | mcbsp->pdata->ops->free) | 1330 | mcbsp->pdata->ops->free) |
1393 | mcbsp->pdata->ops->free(mcbsp->id); | 1331 | mcbsp->pdata->ops->free(mcbsp->id); |
1394 | 1332 | ||
1395 | omap34xx_device_exit(mcbsp); | 1333 | if (mcbsp->pdata->buffer_size) |
1334 | sysfs_remove_group(&mcbsp->dev->kobj, | ||
1335 | &additional_attr_group); | ||
1336 | |||
1337 | if (mcbsp->st_data) | ||
1338 | omap_st_remove(mcbsp); | ||
1396 | 1339 | ||
1397 | clk_put(mcbsp->fclk); | 1340 | clk_put(mcbsp->fclk); |
1398 | 1341 | ||
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index 9a6a53854911..26aee5cc1fc1 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c | |||
@@ -94,6 +94,9 @@ | |||
94 | #define USE_WAKEUP_LAT 0 | 94 | #define USE_WAKEUP_LAT 0 |
95 | #define IGNORE_WAKEUP_LAT 1 | 95 | #define IGNORE_WAKEUP_LAT 1 |
96 | 96 | ||
97 | static int omap_device_register(struct platform_device *pdev); | ||
98 | static int omap_early_device_register(struct platform_device *pdev); | ||
99 | |||
97 | /* Private functions */ | 100 | /* Private functions */ |
98 | 101 | ||
99 | /** | 102 | /** |
@@ -114,7 +117,7 @@ static int _omap_device_activate(struct omap_device *od, u8 ignore_lat) | |||
114 | { | 117 | { |
115 | struct timespec a, b, c; | 118 | struct timespec a, b, c; |
116 | 119 | ||
117 | pr_debug("omap_device: %s: activating\n", od->pdev.name); | 120 | dev_dbg(&od->pdev->dev, "omap_device: activating\n"); |
118 | 121 | ||
119 | while (od->pm_lat_level > 0) { | 122 | while (od->pm_lat_level > 0) { |
120 | struct omap_device_pm_latency *odpl; | 123 | struct omap_device_pm_latency *odpl; |
@@ -138,25 +141,24 @@ static int _omap_device_activate(struct omap_device *od, u8 ignore_lat) | |||
138 | c = timespec_sub(b, a); | 141 | c = timespec_sub(b, a); |
139 | act_lat = timespec_to_ns(&c); | 142 | act_lat = timespec_to_ns(&c); |
140 | 143 | ||
141 | pr_debug("omap_device: %s: pm_lat %d: activate: elapsed time " | 144 | dev_dbg(&od->pdev->dev, |
142 | "%llu nsec\n", od->pdev.name, od->pm_lat_level, | 145 | "omap_device: pm_lat %d: activate: elapsed time " |
143 | act_lat); | 146 | "%llu nsec\n", od->pm_lat_level, act_lat); |
144 | 147 | ||
145 | if (act_lat > odpl->activate_lat) { | 148 | if (act_lat > odpl->activate_lat) { |
146 | odpl->activate_lat_worst = act_lat; | 149 | odpl->activate_lat_worst = act_lat; |
147 | if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) { | 150 | if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) { |
148 | odpl->activate_lat = act_lat; | 151 | odpl->activate_lat = act_lat; |
149 | pr_warning("omap_device: %s.%d: new worst case " | 152 | dev_dbg(&od->pdev->dev, |
150 | "activate latency %d: %llu\n", | 153 | "new worst case activate latency " |
151 | od->pdev.name, od->pdev.id, | 154 | "%d: %llu\n", |
152 | od->pm_lat_level, act_lat); | 155 | od->pm_lat_level, act_lat); |
153 | } else | 156 | } else |
154 | pr_warning("omap_device: %s.%d: activate " | 157 | dev_warn(&od->pdev->dev, |
155 | "latency %d higher than exptected. " | 158 | "activate latency %d " |
156 | "(%llu > %d)\n", | 159 | "higher than exptected. (%llu > %d)\n", |
157 | od->pdev.name, od->pdev.id, | 160 | od->pm_lat_level, act_lat, |
158 | od->pm_lat_level, act_lat, | 161 | odpl->activate_lat); |
159 | odpl->activate_lat); | ||
160 | } | 162 | } |
161 | 163 | ||
162 | od->dev_wakeup_lat -= odpl->activate_lat; | 164 | od->dev_wakeup_lat -= odpl->activate_lat; |
@@ -183,7 +185,7 @@ static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat) | |||
183 | { | 185 | { |
184 | struct timespec a, b, c; | 186 | struct timespec a, b, c; |
185 | 187 | ||
186 | pr_debug("omap_device: %s: deactivating\n", od->pdev.name); | 188 | dev_dbg(&od->pdev->dev, "omap_device: deactivating\n"); |
187 | 189 | ||
188 | while (od->pm_lat_level < od->pm_lats_cnt) { | 190 | while (od->pm_lat_level < od->pm_lats_cnt) { |
189 | struct omap_device_pm_latency *odpl; | 191 | struct omap_device_pm_latency *odpl; |
@@ -206,28 +208,26 @@ static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat) | |||
206 | c = timespec_sub(b, a); | 208 | c = timespec_sub(b, a); |
207 | deact_lat = timespec_to_ns(&c); | 209 | deact_lat = timespec_to_ns(&c); |
208 | 210 | ||
209 | pr_debug("omap_device: %s: pm_lat %d: deactivate: elapsed time " | 211 | dev_dbg(&od->pdev->dev, |
210 | "%llu nsec\n", od->pdev.name, od->pm_lat_level, | 212 | "omap_device: pm_lat %d: deactivate: elapsed time " |
211 | deact_lat); | 213 | "%llu nsec\n", od->pm_lat_level, deact_lat); |
212 | 214 | ||
213 | if (deact_lat > odpl->deactivate_lat) { | 215 | if (deact_lat > odpl->deactivate_lat) { |
214 | odpl->deactivate_lat_worst = deact_lat; | 216 | odpl->deactivate_lat_worst = deact_lat; |
215 | if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) { | 217 | if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) { |
216 | odpl->deactivate_lat = deact_lat; | 218 | odpl->deactivate_lat = deact_lat; |
217 | pr_warning("omap_device: %s.%d: new worst case " | 219 | dev_dbg(&od->pdev->dev, |
218 | "deactivate latency %d: %llu\n", | 220 | "new worst case deactivate latency " |
219 | od->pdev.name, od->pdev.id, | 221 | "%d: %llu\n", |
220 | od->pm_lat_level, deact_lat); | 222 | od->pm_lat_level, deact_lat); |
221 | } else | 223 | } else |
222 | pr_warning("omap_device: %s.%d: deactivate " | 224 | dev_warn(&od->pdev->dev, |
223 | "latency %d higher than exptected. " | 225 | "deactivate latency %d " |
224 | "(%llu > %d)\n", | 226 | "higher than exptected. (%llu > %d)\n", |
225 | od->pdev.name, od->pdev.id, | 227 | od->pm_lat_level, deact_lat, |
226 | od->pm_lat_level, deact_lat, | 228 | odpl->deactivate_lat); |
227 | odpl->deactivate_lat); | ||
228 | } | 229 | } |
229 | 230 | ||
230 | |||
231 | od->dev_wakeup_lat += odpl->activate_lat; | 231 | od->dev_wakeup_lat += odpl->activate_lat; |
232 | 232 | ||
233 | od->pm_lat_level++; | 233 | od->pm_lat_level++; |
@@ -245,28 +245,27 @@ static void _add_clkdev(struct omap_device *od, const char *clk_alias, | |||
245 | if (!clk_alias || !clk_name) | 245 | if (!clk_alias || !clk_name) |
246 | return; | 246 | return; |
247 | 247 | ||
248 | pr_debug("omap_device: %s: Creating %s -> %s\n", | 248 | dev_dbg(&od->pdev->dev, "Creating %s -> %s\n", clk_alias, clk_name); |
249 | dev_name(&od->pdev.dev), clk_alias, clk_name); | ||
250 | 249 | ||
251 | r = clk_get_sys(dev_name(&od->pdev.dev), clk_alias); | 250 | r = clk_get_sys(dev_name(&od->pdev->dev), clk_alias); |
252 | if (!IS_ERR(r)) { | 251 | if (!IS_ERR(r)) { |
253 | pr_warning("omap_device: %s: alias %s already exists\n", | 252 | dev_warn(&od->pdev->dev, |
254 | dev_name(&od->pdev.dev), clk_alias); | 253 | "alias %s already exists\n", clk_alias); |
255 | clk_put(r); | 254 | clk_put(r); |
256 | return; | 255 | return; |
257 | } | 256 | } |
258 | 257 | ||
259 | r = omap_clk_get_by_name(clk_name); | 258 | r = omap_clk_get_by_name(clk_name); |
260 | if (IS_ERR(r)) { | 259 | if (IS_ERR(r)) { |
261 | pr_err("omap_device: %s: omap_clk_get_by_name for %s failed\n", | 260 | dev_err(&od->pdev->dev, |
262 | dev_name(&od->pdev.dev), clk_name); | 261 | "omap_clk_get_by_name for %s failed\n", clk_name); |
263 | return; | 262 | return; |
264 | } | 263 | } |
265 | 264 | ||
266 | l = clkdev_alloc(r, clk_alias, dev_name(&od->pdev.dev)); | 265 | l = clkdev_alloc(r, clk_alias, dev_name(&od->pdev->dev)); |
267 | if (!l) { | 266 | if (!l) { |
268 | pr_err("omap_device: %s: clkdev_alloc for %s failed\n", | 267 | dev_err(&od->pdev->dev, |
269 | dev_name(&od->pdev.dev), clk_alias); | 268 | "clkdev_alloc for %s failed\n", clk_alias); |
270 | return; | 269 | return; |
271 | } | 270 | } |
272 | 271 | ||
@@ -343,7 +342,7 @@ u32 omap_device_get_context_loss_count(struct platform_device *pdev) | |||
343 | * much memory to allocate before calling | 342 | * much memory to allocate before calling |
344 | * omap_device_fill_resources(). Returns the count. | 343 | * omap_device_fill_resources(). Returns the count. |
345 | */ | 344 | */ |
346 | int omap_device_count_resources(struct omap_device *od) | 345 | static int omap_device_count_resources(struct omap_device *od) |
347 | { | 346 | { |
348 | int c = 0; | 347 | int c = 0; |
349 | int i; | 348 | int i; |
@@ -352,7 +351,7 @@ int omap_device_count_resources(struct omap_device *od) | |||
352 | c += omap_hwmod_count_resources(od->hwmods[i]); | 351 | c += omap_hwmod_count_resources(od->hwmods[i]); |
353 | 352 | ||
354 | pr_debug("omap_device: %s: counted %d total resources across %d " | 353 | pr_debug("omap_device: %s: counted %d total resources across %d " |
355 | "hwmods\n", od->pdev.name, c, od->hwmods_cnt); | 354 | "hwmods\n", od->pdev->name, c, od->hwmods_cnt); |
356 | 355 | ||
357 | return c; | 356 | return c; |
358 | } | 357 | } |
@@ -374,7 +373,8 @@ int omap_device_count_resources(struct omap_device *od) | |||
374 | * functions to get device resources. Hacking around the existing | 373 | * functions to get device resources. Hacking around the existing |
375 | * platform_device code wastes memory. Returns 0. | 374 | * platform_device code wastes memory. Returns 0. |
376 | */ | 375 | */ |
377 | int omap_device_fill_resources(struct omap_device *od, struct resource *res) | 376 | static int omap_device_fill_resources(struct omap_device *od, |
377 | struct resource *res) | ||
378 | { | 378 | { |
379 | int c = 0; | 379 | int c = 0; |
380 | int i, r; | 380 | int i, r; |
@@ -405,7 +405,7 @@ int omap_device_fill_resources(struct omap_device *od, struct resource *res) | |||
405 | * information. Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise, | 405 | * information. Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise, |
406 | * passes along the return value of omap_device_build_ss(). | 406 | * passes along the return value of omap_device_build_ss(). |
407 | */ | 407 | */ |
408 | struct omap_device *omap_device_build(const char *pdev_name, int pdev_id, | 408 | struct platform_device *omap_device_build(const char *pdev_name, int pdev_id, |
409 | struct omap_hwmod *oh, void *pdata, | 409 | struct omap_hwmod *oh, void *pdata, |
410 | int pdata_len, | 410 | int pdata_len, |
411 | struct omap_device_pm_latency *pm_lats, | 411 | struct omap_device_pm_latency *pm_lats, |
@@ -438,15 +438,15 @@ struct omap_device *omap_device_build(const char *pdev_name, int pdev_id, | |||
438 | * platform_device record. Returns an ERR_PTR() on error, or passes | 438 | * platform_device record. Returns an ERR_PTR() on error, or passes |
439 | * along the return value of omap_device_register(). | 439 | * along the return value of omap_device_register(). |
440 | */ | 440 | */ |
441 | struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | 441 | struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id, |
442 | struct omap_hwmod **ohs, int oh_cnt, | 442 | struct omap_hwmod **ohs, int oh_cnt, |
443 | void *pdata, int pdata_len, | 443 | void *pdata, int pdata_len, |
444 | struct omap_device_pm_latency *pm_lats, | 444 | struct omap_device_pm_latency *pm_lats, |
445 | int pm_lats_cnt, int is_early_device) | 445 | int pm_lats_cnt, int is_early_device) |
446 | { | 446 | { |
447 | int ret = -ENOMEM; | 447 | int ret = -ENOMEM; |
448 | struct platform_device *pdev; | ||
448 | struct omap_device *od; | 449 | struct omap_device *od; |
449 | char *pdev_name2; | ||
450 | struct resource *res = NULL; | 450 | struct resource *res = NULL; |
451 | int i, res_count; | 451 | int i, res_count; |
452 | struct omap_hwmod **hwmods; | 452 | struct omap_hwmod **hwmods; |
@@ -457,72 +457,76 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | |||
457 | if (!pdata && pdata_len > 0) | 457 | if (!pdata && pdata_len > 0) |
458 | return ERR_PTR(-EINVAL); | 458 | return ERR_PTR(-EINVAL); |
459 | 459 | ||
460 | pdev = platform_device_alloc(pdev_name, pdev_id); | ||
461 | if (!pdev) { | ||
462 | ret = -ENOMEM; | ||
463 | goto odbs_exit; | ||
464 | } | ||
465 | |||
460 | pr_debug("omap_device: %s: building with %d hwmods\n", pdev_name, | 466 | pr_debug("omap_device: %s: building with %d hwmods\n", pdev_name, |
461 | oh_cnt); | 467 | oh_cnt); |
462 | 468 | ||
463 | od = kzalloc(sizeof(struct omap_device), GFP_KERNEL); | 469 | od = kzalloc(sizeof(struct omap_device), GFP_KERNEL); |
464 | if (!od) | 470 | if (!od) { |
465 | return ERR_PTR(-ENOMEM); | 471 | ret = -ENOMEM; |
466 | 472 | goto odbs_exit1; | |
473 | } | ||
467 | od->hwmods_cnt = oh_cnt; | 474 | od->hwmods_cnt = oh_cnt; |
468 | 475 | ||
469 | hwmods = kzalloc(sizeof(struct omap_hwmod *) * oh_cnt, | 476 | hwmods = kzalloc(sizeof(struct omap_hwmod *) * oh_cnt, |
470 | GFP_KERNEL); | 477 | GFP_KERNEL); |
471 | if (!hwmods) | 478 | if (!hwmods) |
472 | goto odbs_exit1; | 479 | goto odbs_exit2; |
473 | 480 | ||
474 | memcpy(hwmods, ohs, sizeof(struct omap_hwmod *) * oh_cnt); | 481 | memcpy(hwmods, ohs, sizeof(struct omap_hwmod *) * oh_cnt); |
475 | od->hwmods = hwmods; | 482 | od->hwmods = hwmods; |
476 | 483 | od->pdev = pdev; | |
477 | pdev_name2 = kzalloc(strlen(pdev_name) + 1, GFP_KERNEL); | ||
478 | if (!pdev_name2) | ||
479 | goto odbs_exit2; | ||
480 | strcpy(pdev_name2, pdev_name); | ||
481 | |||
482 | od->pdev.name = pdev_name2; | ||
483 | od->pdev.id = pdev_id; | ||
484 | 484 | ||
485 | res_count = omap_device_count_resources(od); | 485 | res_count = omap_device_count_resources(od); |
486 | if (res_count > 0) { | 486 | if (res_count > 0) { |
487 | res = kzalloc(sizeof(struct resource) * res_count, GFP_KERNEL); | 487 | res = kzalloc(sizeof(struct resource) * res_count, GFP_KERNEL); |
488 | if (!res) | 488 | if (!res) |
489 | goto odbs_exit3; | 489 | goto odbs_exit3; |
490 | } | ||
491 | omap_device_fill_resources(od, res); | ||
492 | 490 | ||
493 | od->pdev.num_resources = res_count; | 491 | omap_device_fill_resources(od, res); |
494 | od->pdev.resource = res; | 492 | |
493 | ret = platform_device_add_resources(pdev, res, res_count); | ||
494 | kfree(res); | ||
495 | 495 | ||
496 | ret = platform_device_add_data(&od->pdev, pdata, pdata_len); | 496 | if (ret) |
497 | goto odbs_exit3; | ||
498 | } | ||
499 | |||
500 | ret = platform_device_add_data(pdev, pdata, pdata_len); | ||
497 | if (ret) | 501 | if (ret) |
498 | goto odbs_exit4; | 502 | goto odbs_exit3; |
499 | 503 | ||
500 | od->pm_lats = pm_lats; | 504 | pdev->archdata.od = od; |
501 | od->pm_lats_cnt = pm_lats_cnt; | ||
502 | 505 | ||
503 | if (is_early_device) | 506 | if (is_early_device) |
504 | ret = omap_early_device_register(od); | 507 | ret = omap_early_device_register(pdev); |
505 | else | 508 | else |
506 | ret = omap_device_register(od); | 509 | ret = omap_device_register(pdev); |
510 | if (ret) | ||
511 | goto odbs_exit3; | ||
512 | |||
513 | od->pm_lats = pm_lats; | ||
514 | od->pm_lats_cnt = pm_lats_cnt; | ||
507 | 515 | ||
508 | for (i = 0; i < oh_cnt; i++) { | 516 | for (i = 0; i < oh_cnt; i++) { |
509 | hwmods[i]->od = od; | 517 | hwmods[i]->od = od; |
510 | _add_hwmod_clocks_clkdev(od, hwmods[i]); | 518 | _add_hwmod_clocks_clkdev(od, hwmods[i]); |
511 | } | 519 | } |
512 | 520 | ||
513 | if (ret) | 521 | return pdev; |
514 | goto odbs_exit4; | ||
515 | |||
516 | return od; | ||
517 | 522 | ||
518 | odbs_exit4: | ||
519 | kfree(res); | ||
520 | odbs_exit3: | 523 | odbs_exit3: |
521 | kfree(pdev_name2); | ||
522 | odbs_exit2: | ||
523 | kfree(hwmods); | 524 | kfree(hwmods); |
524 | odbs_exit1: | 525 | odbs_exit2: |
525 | kfree(od); | 526 | kfree(od); |
527 | odbs_exit1: | ||
528 | platform_device_put(pdev); | ||
529 | odbs_exit: | ||
526 | 530 | ||
527 | pr_err("omap_device: %s: build failed (%d)\n", pdev_name, ret); | 531 | pr_err("omap_device: %s: build failed (%d)\n", pdev_name, ret); |
528 | 532 | ||
@@ -538,11 +542,11 @@ odbs_exit1: | |||
538 | * platform_early_add_device() on the underlying platform_device. | 542 | * platform_early_add_device() on the underlying platform_device. |
539 | * Returns 0 by default. | 543 | * Returns 0 by default. |
540 | */ | 544 | */ |
541 | int omap_early_device_register(struct omap_device *od) | 545 | static int omap_early_device_register(struct platform_device *pdev) |
542 | { | 546 | { |
543 | struct platform_device *devices[1]; | 547 | struct platform_device *devices[1]; |
544 | 548 | ||
545 | devices[0] = &(od->pdev); | 549 | devices[0] = pdev; |
546 | early_platform_add_devices(devices, 1); | 550 | early_platform_add_devices(devices, 1); |
547 | return 0; | 551 | return 0; |
548 | } | 552 | } |
@@ -615,6 +619,9 @@ static int _od_resume_noirq(struct device *dev) | |||
615 | 619 | ||
616 | return pm_generic_resume_noirq(dev); | 620 | return pm_generic_resume_noirq(dev); |
617 | } | 621 | } |
622 | #else | ||
623 | #define _od_suspend_noirq NULL | ||
624 | #define _od_resume_noirq NULL | ||
618 | #endif | 625 | #endif |
619 | 626 | ||
620 | static struct dev_pm_domain omap_device_pm_domain = { | 627 | static struct dev_pm_domain omap_device_pm_domain = { |
@@ -635,13 +642,13 @@ static struct dev_pm_domain omap_device_pm_domain = { | |||
635 | * platform_device_register() on the underlying platform_device. | 642 | * platform_device_register() on the underlying platform_device. |
636 | * Returns the return value of platform_device_register(). | 643 | * Returns the return value of platform_device_register(). |
637 | */ | 644 | */ |
638 | int omap_device_register(struct omap_device *od) | 645 | static int omap_device_register(struct platform_device *pdev) |
639 | { | 646 | { |
640 | pr_debug("omap_device: %s: registering\n", od->pdev.name); | 647 | pr_debug("omap_device: %s: registering\n", pdev->name); |
641 | 648 | ||
642 | od->pdev.dev.parent = &omap_device_parent; | 649 | pdev->dev.parent = &omap_device_parent; |
643 | od->pdev.dev.pm_domain = &omap_device_pm_domain; | 650 | pdev->dev.pm_domain = &omap_device_pm_domain; |
644 | return platform_device_register(&od->pdev); | 651 | return platform_device_add(pdev); |
645 | } | 652 | } |
646 | 653 | ||
647 | 654 | ||
@@ -668,8 +675,9 @@ int omap_device_enable(struct platform_device *pdev) | |||
668 | od = to_omap_device(pdev); | 675 | od = to_omap_device(pdev); |
669 | 676 | ||
670 | if (od->_state == OMAP_DEVICE_STATE_ENABLED) { | 677 | if (od->_state == OMAP_DEVICE_STATE_ENABLED) { |
671 | WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n", | 678 | dev_warn(&pdev->dev, |
672 | od->pdev.name, od->pdev.id, __func__, od->_state); | 679 | "omap_device: %s() called from invalid state %d\n", |
680 | __func__, od->_state); | ||
673 | return -EINVAL; | 681 | return -EINVAL; |
674 | } | 682 | } |
675 | 683 | ||
@@ -707,8 +715,9 @@ int omap_device_idle(struct platform_device *pdev) | |||
707 | od = to_omap_device(pdev); | 715 | od = to_omap_device(pdev); |
708 | 716 | ||
709 | if (od->_state != OMAP_DEVICE_STATE_ENABLED) { | 717 | if (od->_state != OMAP_DEVICE_STATE_ENABLED) { |
710 | WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n", | 718 | dev_warn(&pdev->dev, |
711 | od->pdev.name, od->pdev.id, __func__, od->_state); | 719 | "omap_device: %s() called from invalid state %d\n", |
720 | __func__, od->_state); | ||
712 | return -EINVAL; | 721 | return -EINVAL; |
713 | } | 722 | } |
714 | 723 | ||
@@ -739,8 +748,9 @@ int omap_device_shutdown(struct platform_device *pdev) | |||
739 | 748 | ||
740 | if (od->_state != OMAP_DEVICE_STATE_ENABLED && | 749 | if (od->_state != OMAP_DEVICE_STATE_ENABLED && |
741 | od->_state != OMAP_DEVICE_STATE_IDLE) { | 750 | od->_state != OMAP_DEVICE_STATE_IDLE) { |
742 | WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n", | 751 | dev_warn(&pdev->dev, |
743 | od->pdev.name, od->pdev.id, __func__, od->_state); | 752 | "omap_device: %s() called from invalid state %d\n", |
753 | __func__, od->_state); | ||
744 | return -EINVAL; | 754 | return -EINVAL; |
745 | } | 755 | } |
746 | 756 | ||
diff --git a/arch/arm/plat-s5p/clock.c b/arch/arm/plat-s5p/clock.c index 02af235298e2..5f84a3f13ef9 100644 --- a/arch/arm/plat-s5p/clock.c +++ b/arch/arm/plat-s5p/clock.c | |||
@@ -192,7 +192,7 @@ unsigned long s5p_spdif_get_rate(struct clk *clk) | |||
192 | if (IS_ERR(pclk)) | 192 | if (IS_ERR(pclk)) |
193 | return -EINVAL; | 193 | return -EINVAL; |
194 | 194 | ||
195 | rate = pclk->ops->get_rate(clk); | 195 | rate = pclk->ops->get_rate(pclk); |
196 | clk_put(pclk); | 196 | clk_put(pclk); |
197 | 197 | ||
198 | return rate; | 198 | return rate; |
diff --git a/arch/arm/plat-s5p/irq-gpioint.c b/arch/arm/plat-s5p/irq-gpioint.c index 327ab9f662e8..f88216d23991 100644 --- a/arch/arm/plat-s5p/irq-gpioint.c +++ b/arch/arm/plat-s5p/irq-gpioint.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <plat/gpio-core.h> | 23 | #include <plat/gpio-core.h> |
24 | #include <plat/gpio-cfg.h> | 24 | #include <plat/gpio-cfg.h> |
25 | 25 | ||
26 | #include <asm/mach/irq.h> | ||
27 | |||
26 | #define GPIO_BASE(chip) (((unsigned long)(chip)->base) & 0xFFFFF000u) | 28 | #define GPIO_BASE(chip) (((unsigned long)(chip)->base) & 0xFFFFF000u) |
27 | 29 | ||
28 | #define CON_OFFSET 0x700 | 30 | #define CON_OFFSET 0x700 |
@@ -81,6 +83,9 @@ static void s5p_gpioint_handler(unsigned int irq, struct irq_desc *desc) | |||
81 | int group, pend_offset, mask_offset; | 83 | int group, pend_offset, mask_offset; |
82 | unsigned int pend, mask; | 84 | unsigned int pend, mask; |
83 | 85 | ||
86 | struct irq_chip *chip = irq_get_chip(irq); | ||
87 | chained_irq_enter(chip, desc); | ||
88 | |||
84 | for (group = 0; group < bank->nr_groups; group++) { | 89 | for (group = 0; group < bank->nr_groups; group++) { |
85 | struct s3c_gpio_chip *chip = bank->chips[group]; | 90 | struct s3c_gpio_chip *chip = bank->chips[group]; |
86 | if (!chip) | 91 | if (!chip) |
@@ -102,23 +107,25 @@ static void s5p_gpioint_handler(unsigned int irq, struct irq_desc *desc) | |||
102 | pend &= ~BIT(offset); | 107 | pend &= ~BIT(offset); |
103 | } | 108 | } |
104 | } | 109 | } |
110 | chained_irq_exit(chip, desc); | ||
105 | } | 111 | } |
106 | 112 | ||
107 | static __init int s5p_gpioint_add(struct s3c_gpio_chip *chip) | 113 | static __init int s5p_gpioint_add(struct s3c_gpio_chip *chip) |
108 | { | 114 | { |
109 | static int used_gpioint_groups = 0; | 115 | static int used_gpioint_groups = 0; |
110 | int group = chip->group; | 116 | int group = chip->group; |
111 | struct s5p_gpioint_bank *bank = NULL; | 117 | struct s5p_gpioint_bank *b, *bank = NULL; |
112 | struct irq_chip_generic *gc; | 118 | struct irq_chip_generic *gc; |
113 | struct irq_chip_type *ct; | 119 | struct irq_chip_type *ct; |
114 | 120 | ||
115 | if (used_gpioint_groups >= S5P_GPIOINT_GROUP_COUNT) | 121 | if (used_gpioint_groups >= S5P_GPIOINT_GROUP_COUNT) |
116 | return -ENOMEM; | 122 | return -ENOMEM; |
117 | 123 | ||
118 | list_for_each_entry(bank, &banks, list) { | 124 | list_for_each_entry(b, &banks, list) { |
119 | if (group >= bank->start && | 125 | if (group >= b->start && group < b->start + b->nr_groups) { |
120 | group < bank->start + bank->nr_groups) | 126 | bank = b; |
121 | break; | 127 | break; |
128 | } | ||
122 | } | 129 | } |
123 | if (!bank) | 130 | if (!bank) |
124 | return -EINVAL; | 131 | return -EINVAL; |
diff --git a/arch/arm/plat-samsung/clock.c b/arch/arm/plat-samsung/clock.c index 302c42670bd1..3b4451979d1b 100644 --- a/arch/arm/plat-samsung/clock.c +++ b/arch/arm/plat-samsung/clock.c | |||
@@ -64,6 +64,17 @@ static LIST_HEAD(clocks); | |||
64 | */ | 64 | */ |
65 | DEFINE_SPINLOCK(clocks_lock); | 65 | DEFINE_SPINLOCK(clocks_lock); |
66 | 66 | ||
67 | /* Global watchdog clock used by arch_wtd_reset() callback */ | ||
68 | struct clk *s3c2410_wdtclk; | ||
69 | static int __init s3c_wdt_reset_init(void) | ||
70 | { | ||
71 | s3c2410_wdtclk = clk_get(NULL, "watchdog"); | ||
72 | if (IS_ERR(s3c2410_wdtclk)) | ||
73 | printk(KERN_WARNING "%s: warning: cannot get watchdog clock\n", __func__); | ||
74 | return 0; | ||
75 | } | ||
76 | arch_initcall(s3c_wdt_reset_init); | ||
77 | |||
67 | /* enable and disable calls for use with the clk struct */ | 78 | /* enable and disable calls for use with the clk struct */ |
68 | 79 | ||
69 | static int clk_null_enable(struct clk *clk, int enable) | 80 | static int clk_null_enable(struct clk *clk, int enable) |
diff --git a/arch/arm/plat-samsung/include/plat/backlight.h b/arch/arm/plat-samsung/include/plat/backlight.h index 51d8da846a62..ad530c78fe8c 100644 --- a/arch/arm/plat-samsung/include/plat/backlight.h +++ b/arch/arm/plat-samsung/include/plat/backlight.h | |||
@@ -20,7 +20,7 @@ struct samsung_bl_gpio_info { | |||
20 | int func; | 20 | int func; |
21 | }; | 21 | }; |
22 | 22 | ||
23 | extern void samsung_bl_set(struct samsung_bl_gpio_info *gpio_info, | 23 | extern void __init samsung_bl_set(struct samsung_bl_gpio_info *gpio_info, |
24 | struct platform_pwm_backlight_data *bl_data); | 24 | struct platform_pwm_backlight_data *bl_data); |
25 | 25 | ||
26 | #endif /* __ASM_PLAT_BACKLIGHT_H */ | 26 | #endif /* __ASM_PLAT_BACKLIGHT_H */ |
diff --git a/arch/arm/plat-samsung/include/plat/clock.h b/arch/arm/plat-samsung/include/plat/clock.h index 87d5b38a86fb..73c66d4d10fa 100644 --- a/arch/arm/plat-samsung/include/plat/clock.h +++ b/arch/arm/plat-samsung/include/plat/clock.h | |||
@@ -9,6 +9,9 @@ | |||
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #ifndef __ASM_PLAT_CLOCK_H | ||
13 | #define __ASM_PLAT_CLOCK_H __FILE__ | ||
14 | |||
12 | #include <linux/spinlock.h> | 15 | #include <linux/spinlock.h> |
13 | #include <linux/clkdev.h> | 16 | #include <linux/clkdev.h> |
14 | 17 | ||
@@ -121,3 +124,8 @@ extern int s3c64xx_sclk_ctrl(struct clk *clk, int enable); | |||
121 | 124 | ||
122 | extern void s3c_pwmclk_init(void); | 125 | extern void s3c_pwmclk_init(void); |
123 | 126 | ||
127 | /* Global watchdog clock used by arch_wtd_reset() callback */ | ||
128 | |||
129 | extern struct clk *s3c2410_wdtclk; | ||
130 | |||
131 | #endif /* __ASM_PLAT_CLOCK_H */ | ||
diff --git a/arch/arm/plat-samsung/include/plat/watchdog-reset.h b/arch/arm/plat-samsung/include/plat/watchdog-reset.h index 54b762acb5a0..40dbb2b0ae22 100644 --- a/arch/arm/plat-samsung/include/plat/watchdog-reset.h +++ b/arch/arm/plat-samsung/include/plat/watchdog-reset.h | |||
@@ -10,6 +10,7 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <plat/clock.h> | ||
13 | #include <plat/regs-watchdog.h> | 14 | #include <plat/regs-watchdog.h> |
14 | #include <mach/map.h> | 15 | #include <mach/map.h> |
15 | 16 | ||
@@ -19,17 +20,12 @@ | |||
19 | 20 | ||
20 | static inline void arch_wdt_reset(void) | 21 | static inline void arch_wdt_reset(void) |
21 | { | 22 | { |
22 | struct clk *wdtclk; | ||
23 | |||
24 | printk("arch_reset: attempting watchdog reset\n"); | 23 | printk("arch_reset: attempting watchdog reset\n"); |
25 | 24 | ||
26 | __raw_writel(0, S3C2410_WTCON); /* disable watchdog, to be safe */ | 25 | __raw_writel(0, S3C2410_WTCON); /* disable watchdog, to be safe */ |
27 | 26 | ||
28 | wdtclk = clk_get(NULL, "watchdog"); | 27 | if (s3c2410_wdtclk) |
29 | if (!IS_ERR(wdtclk)) { | 28 | clk_enable(s3c2410_wdtclk); |
30 | clk_enable(wdtclk); | ||
31 | } else | ||
32 | printk(KERN_WARNING "%s: warning: cannot get watchdog clock\n", __func__); | ||
33 | 29 | ||
34 | /* put initial values into count and data */ | 30 | /* put initial values into count and data */ |
35 | __raw_writel(0x80, S3C2410_WTCNT); | 31 | __raw_writel(0x80, S3C2410_WTCNT); |
diff --git a/arch/arm/plat-samsung/irq-vic-timer.c b/arch/arm/plat-samsung/irq-vic-timer.c index f714d060370d..51583cd30164 100644 --- a/arch/arm/plat-samsung/irq-vic-timer.c +++ b/arch/arm/plat-samsung/irq-vic-timer.c | |||
@@ -22,9 +22,14 @@ | |||
22 | #include <plat/irq-vic-timer.h> | 22 | #include <plat/irq-vic-timer.h> |
23 | #include <plat/regs-timer.h> | 23 | #include <plat/regs-timer.h> |
24 | 24 | ||
25 | #include <asm/mach/irq.h> | ||
26 | |||
25 | static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc) | 27 | static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc) |
26 | { | 28 | { |
29 | struct irq_chip *chip = irq_get_chip(irq); | ||
30 | chained_irq_enter(chip, desc); | ||
27 | generic_handle_irq((int)desc->irq_data.handler_data); | 31 | generic_handle_irq((int)desc->irq_data.handler_data); |
32 | chained_irq_exit(chip, desc); | ||
28 | } | 33 | } |
29 | 34 | ||
30 | /* We assume the IRQ_TIMER0..IRQ_TIMER4 range is continuous. */ | 35 | /* We assume the IRQ_TIMER0..IRQ_TIMER4 range is continuous. */ |
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index fff68d0d521b..62cc8f981171 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types | |||
@@ -351,7 +351,7 @@ centro MACH_CENTRO CENTRO 1944 | |||
351 | nokia_rx51 MACH_NOKIA_RX51 NOKIA_RX51 1955 | 351 | nokia_rx51 MACH_NOKIA_RX51 NOKIA_RX51 1955 |
352 | omap_zoom2 MACH_OMAP_ZOOM2 OMAP_ZOOM2 1967 | 352 | omap_zoom2 MACH_OMAP_ZOOM2 OMAP_ZOOM2 1967 |
353 | cpuat9260 MACH_CPUAT9260 CPUAT9260 1973 | 353 | cpuat9260 MACH_CPUAT9260 CPUAT9260 1973 |
354 | eukrea_cpuimx27 MACH_CPUIMX27 CPUIMX27 1975 | 354 | eukrea_cpuimx27 MACH_EUKREA_CPUIMX27 EUKREA_CPUIMX27 1975 |
355 | acs5k MACH_ACS5K ACS5K 1982 | 355 | acs5k MACH_ACS5K ACS5K 1982 |
356 | snapper_9260 MACH_SNAPPER_9260 SNAPPER_9260 1987 | 356 | snapper_9260 MACH_SNAPPER_9260 SNAPPER_9260 1987 |
357 | dsm320 MACH_DSM320 DSM320 1988 | 357 | dsm320 MACH_DSM320 DSM320 1988 |
@@ -476,8 +476,8 @@ cns3420vb MACH_CNS3420VB CNS3420VB 2776 | |||
476 | omap4_panda MACH_OMAP4_PANDA OMAP4_PANDA 2791 | 476 | omap4_panda MACH_OMAP4_PANDA OMAP4_PANDA 2791 |
477 | ti8168evm MACH_TI8168EVM TI8168EVM 2800 | 477 | ti8168evm MACH_TI8168EVM TI8168EVM 2800 |
478 | teton_bga MACH_TETON_BGA TETON_BGA 2816 | 478 | teton_bga MACH_TETON_BGA TETON_BGA 2816 |
479 | eukrea_cpuimx25sd MACH_EUKREA_CPUIMX25 EUKREA_CPUIMX25 2820 | 479 | eukrea_cpuimx25sd MACH_EUKREA_CPUIMX25SD EUKREA_CPUIMX25SD 2820 |
480 | eukrea_cpuimx35sd MACH_EUKREA_CPUIMX35 EUKREA_CPUIMX35 2821 | 480 | eukrea_cpuimx35sd MACH_EUKREA_CPUIMX35SD EUKREA_CPUIMX35SD 2821 |
481 | eukrea_cpuimx51sd MACH_EUKREA_CPUIMX51SD EUKREA_CPUIMX51SD 2822 | 481 | eukrea_cpuimx51sd MACH_EUKREA_CPUIMX51SD EUKREA_CPUIMX51SD 2822 |
482 | eukrea_cpuimx51 MACH_EUKREA_CPUIMX51 EUKREA_CPUIMX51 2823 | 482 | eukrea_cpuimx51 MACH_EUKREA_CPUIMX51 EUKREA_CPUIMX51 2823 |
483 | smdkc210 MACH_SMDKC210 SMDKC210 2838 | 483 | smdkc210 MACH_SMDKC210 SMDKC210 2838 |
diff --git a/arch/openrisc/include/asm/dma-mapping.h b/arch/openrisc/include/asm/dma-mapping.h index 052f877b52a5..60b472233900 100644 --- a/arch/openrisc/include/asm/dma-mapping.h +++ b/arch/openrisc/include/asm/dma-mapping.h | |||
@@ -31,7 +31,6 @@ | |||
31 | 31 | ||
32 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) | 32 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) |
33 | 33 | ||
34 | int dma_mapping_error(struct device *dev, dma_addr_t dma_addr); | ||
35 | 34 | ||
36 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | 35 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) |
37 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | 36 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) |
@@ -47,6 +46,12 @@ dma_addr_t or1k_map_page(struct device *dev, struct page *page, | |||
47 | void or1k_unmap_page(struct device *dev, dma_addr_t dma_handle, | 46 | void or1k_unmap_page(struct device *dev, dma_addr_t dma_handle, |
48 | size_t size, enum dma_data_direction dir, | 47 | size_t size, enum dma_data_direction dir, |
49 | struct dma_attrs *attrs); | 48 | struct dma_attrs *attrs); |
49 | int or1k_map_sg(struct device *dev, struct scatterlist *sg, | ||
50 | int nents, enum dma_data_direction dir, | ||
51 | struct dma_attrs *attrs); | ||
52 | void or1k_unmap_sg(struct device *dev, struct scatterlist *sg, | ||
53 | int nents, enum dma_data_direction dir, | ||
54 | struct dma_attrs *attrs); | ||
50 | void or1k_sync_single_for_cpu(struct device *dev, | 55 | void or1k_sync_single_for_cpu(struct device *dev, |
51 | dma_addr_t dma_handle, size_t size, | 56 | dma_addr_t dma_handle, size_t size, |
52 | enum dma_data_direction dir); | 57 | enum dma_data_direction dir); |
@@ -98,6 +103,51 @@ static inline void dma_unmap_single(struct device *dev, dma_addr_t addr, | |||
98 | debug_dma_unmap_page(dev, addr, size, dir, true); | 103 | debug_dma_unmap_page(dev, addr, size, dir, true); |
99 | } | 104 | } |
100 | 105 | ||
106 | static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, | ||
107 | int nents, enum dma_data_direction dir) | ||
108 | { | ||
109 | int i, ents; | ||
110 | struct scatterlist *s; | ||
111 | |||
112 | for_each_sg(sg, s, nents, i) | ||
113 | kmemcheck_mark_initialized(sg_virt(s), s->length); | ||
114 | BUG_ON(!valid_dma_direction(dir)); | ||
115 | ents = or1k_map_sg(dev, sg, nents, dir, NULL); | ||
116 | debug_dma_map_sg(dev, sg, nents, ents, dir); | ||
117 | |||
118 | return ents; | ||
119 | } | ||
120 | |||
121 | static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, | ||
122 | int nents, enum dma_data_direction dir) | ||
123 | { | ||
124 | BUG_ON(!valid_dma_direction(dir)); | ||
125 | debug_dma_unmap_sg(dev, sg, nents, dir); | ||
126 | or1k_unmap_sg(dev, sg, nents, dir, NULL); | ||
127 | } | ||
128 | |||
129 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, | ||
130 | size_t offset, size_t size, | ||
131 | enum dma_data_direction dir) | ||
132 | { | ||
133 | dma_addr_t addr; | ||
134 | |||
135 | kmemcheck_mark_initialized(page_address(page) + offset, size); | ||
136 | BUG_ON(!valid_dma_direction(dir)); | ||
137 | addr = or1k_map_page(dev, page, offset, size, dir, NULL); | ||
138 | debug_dma_map_page(dev, page, offset, size, dir, addr, false); | ||
139 | |||
140 | return addr; | ||
141 | } | ||
142 | |||
143 | static inline void dma_unmap_page(struct device *dev, dma_addr_t addr, | ||
144 | size_t size, enum dma_data_direction dir) | ||
145 | { | ||
146 | BUG_ON(!valid_dma_direction(dir)); | ||
147 | or1k_unmap_page(dev, addr, size, dir, NULL); | ||
148 | debug_dma_unmap_page(dev, addr, size, dir, true); | ||
149 | } | ||
150 | |||
101 | static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr, | 151 | static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr, |
102 | size_t size, | 152 | size_t size, |
103 | enum dma_data_direction dir) | 153 | enum dma_data_direction dir) |
@@ -119,7 +169,12 @@ static inline void dma_sync_single_for_device(struct device *dev, | |||
119 | static inline int dma_supported(struct device *dev, u64 dma_mask) | 169 | static inline int dma_supported(struct device *dev, u64 dma_mask) |
120 | { | 170 | { |
121 | /* Support 32 bit DMA mask exclusively */ | 171 | /* Support 32 bit DMA mask exclusively */ |
122 | return dma_mask == 0xffffffffULL; | 172 | return dma_mask == DMA_BIT_MASK(32); |
173 | } | ||
174 | |||
175 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | ||
176 | { | ||
177 | return 0; | ||
123 | } | 178 | } |
124 | 179 | ||
125 | static inline int dma_set_mask(struct device *dev, u64 dma_mask) | 180 | static inline int dma_set_mask(struct device *dev, u64 dma_mask) |
diff --git a/arch/openrisc/include/asm/sigcontext.h b/arch/openrisc/include/asm/sigcontext.h index 54a5c50132e3..b79c2b19afbe 100644 --- a/arch/openrisc/include/asm/sigcontext.h +++ b/arch/openrisc/include/asm/sigcontext.h | |||
@@ -23,16 +23,11 @@ | |||
23 | 23 | ||
24 | /* This struct is saved by setup_frame in signal.c, to keep the current | 24 | /* This struct is saved by setup_frame in signal.c, to keep the current |
25 | context while a signal handler is executed. It's restored by sys_sigreturn. | 25 | context while a signal handler is executed. It's restored by sys_sigreturn. |
26 | |||
27 | To keep things simple, we use pt_regs here even though normally you just | ||
28 | specify the list of regs to save. Then we can use copy_from_user on the | ||
29 | entire regs instead of a bunch of get_user's as well... | ||
30 | */ | 26 | */ |
31 | 27 | ||
32 | struct sigcontext { | 28 | struct sigcontext { |
33 | struct pt_regs regs; /* needs to be first */ | 29 | struct user_regs_struct regs; /* needs to be first */ |
34 | unsigned long oldmask; | 30 | unsigned long oldmask; |
35 | unsigned long usp; /* usp before stacking this gunk on it */ | ||
36 | }; | 31 | }; |
37 | 32 | ||
38 | #endif /* __ASM_OPENRISC_SIGCONTEXT_H */ | 33 | #endif /* __ASM_OPENRISC_SIGCONTEXT_H */ |
diff --git a/arch/openrisc/kernel/dma.c b/arch/openrisc/kernel/dma.c index 968d3ee477e3..f1c8ee2895d0 100644 --- a/arch/openrisc/kernel/dma.c +++ b/arch/openrisc/kernel/dma.c | |||
@@ -154,6 +154,33 @@ void or1k_unmap_page(struct device *dev, dma_addr_t dma_handle, | |||
154 | /* Nothing special to do here... */ | 154 | /* Nothing special to do here... */ |
155 | } | 155 | } |
156 | 156 | ||
157 | int or1k_map_sg(struct device *dev, struct scatterlist *sg, | ||
158 | int nents, enum dma_data_direction dir, | ||
159 | struct dma_attrs *attrs) | ||
160 | { | ||
161 | struct scatterlist *s; | ||
162 | int i; | ||
163 | |||
164 | for_each_sg(sg, s, nents, i) { | ||
165 | s->dma_address = or1k_map_page(dev, sg_page(s), s->offset, | ||
166 | s->length, dir, NULL); | ||
167 | } | ||
168 | |||
169 | return nents; | ||
170 | } | ||
171 | |||
172 | void or1k_unmap_sg(struct device *dev, struct scatterlist *sg, | ||
173 | int nents, enum dma_data_direction dir, | ||
174 | struct dma_attrs *attrs) | ||
175 | { | ||
176 | struct scatterlist *s; | ||
177 | int i; | ||
178 | |||
179 | for_each_sg(sg, s, nents, i) { | ||
180 | or1k_unmap_page(dev, sg_dma_address(s), sg_dma_len(s), dir, NULL); | ||
181 | } | ||
182 | } | ||
183 | |||
157 | void or1k_sync_single_for_cpu(struct device *dev, | 184 | void or1k_sync_single_for_cpu(struct device *dev, |
158 | dma_addr_t dma_handle, size_t size, | 185 | dma_addr_t dma_handle, size_t size, |
159 | enum dma_data_direction dir) | 186 | enum dma_data_direction dir) |
@@ -187,5 +214,4 @@ static int __init dma_init(void) | |||
187 | 214 | ||
188 | return 0; | 215 | return 0; |
189 | } | 216 | } |
190 | |||
191 | fs_initcall(dma_init); | 217 | fs_initcall(dma_init); |
diff --git a/arch/openrisc/kernel/signal.c b/arch/openrisc/kernel/signal.c index 5f759c76834e..95207ab0c99e 100644 --- a/arch/openrisc/kernel/signal.c +++ b/arch/openrisc/kernel/signal.c | |||
@@ -52,31 +52,25 @@ struct rt_sigframe { | |||
52 | static int restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) | 52 | static int restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) |
53 | { | 53 | { |
54 | unsigned int err = 0; | 54 | unsigned int err = 0; |
55 | unsigned long old_usp; | ||
56 | 55 | ||
57 | /* Alwys make any pending restarted system call return -EINTR */ | 56 | /* Alwys make any pending restarted system call return -EINTR */ |
58 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 57 | current_thread_info()->restart_block.fn = do_no_restart_syscall; |
59 | 58 | ||
60 | /* restore the regs from &sc->regs (same as sc, since regs is first) | 59 | /* |
60 | * Restore the regs from &sc->regs. | ||
61 | * (sc is already checked for VERIFY_READ since the sigframe was | 61 | * (sc is already checked for VERIFY_READ since the sigframe was |
62 | * checked in sys_sigreturn previously) | 62 | * checked in sys_sigreturn previously) |
63 | */ | 63 | */ |
64 | 64 | if (__copy_from_user(regs, sc->regs.gpr, 32 * sizeof(unsigned long))) | |
65 | if (__copy_from_user(regs, sc, sizeof(struct pt_regs))) | 65 | goto badframe; |
66 | if (__copy_from_user(®s->pc, &sc->regs.pc, sizeof(unsigned long))) | ||
67 | goto badframe; | ||
68 | if (__copy_from_user(®s->sr, &sc->regs.sr, sizeof(unsigned long))) | ||
66 | goto badframe; | 69 | goto badframe; |
67 | 70 | ||
68 | /* make sure the SM-bit is cleared so user-mode cannot fool us */ | 71 | /* make sure the SM-bit is cleared so user-mode cannot fool us */ |
69 | regs->sr &= ~SPR_SR_SM; | 72 | regs->sr &= ~SPR_SR_SM; |
70 | 73 | ||
71 | /* restore the old USP as it was before we stacked the sc etc. | ||
72 | * (we cannot just pop the sigcontext since we aligned the sp and | ||
73 | * stuff after pushing it) | ||
74 | */ | ||
75 | |||
76 | err |= __get_user(old_usp, &sc->usp); | ||
77 | |||
78 | regs->sp = old_usp; | ||
79 | |||
80 | /* TODO: the other ports use regs->orig_XX to disable syscall checks | 74 | /* TODO: the other ports use regs->orig_XX to disable syscall checks |
81 | * after this completes, but we don't use that mechanism. maybe we can | 75 | * after this completes, but we don't use that mechanism. maybe we can |
82 | * use it now ? | 76 | * use it now ? |
@@ -137,18 +131,17 @@ static int setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, | |||
137 | unsigned long mask) | 131 | unsigned long mask) |
138 | { | 132 | { |
139 | int err = 0; | 133 | int err = 0; |
140 | unsigned long usp = regs->sp; | ||
141 | 134 | ||
142 | /* copy the regs. they are first in sc so we can use sc directly */ | 135 | /* copy the regs */ |
143 | 136 | ||
144 | err |= __copy_to_user(sc, regs, sizeof(struct pt_regs)); | 137 | err |= __copy_to_user(sc->regs.gpr, regs, 32 * sizeof(unsigned long)); |
138 | err |= __copy_to_user(&sc->regs.pc, ®s->pc, sizeof(unsigned long)); | ||
139 | err |= __copy_to_user(&sc->regs.sr, ®s->sr, sizeof(unsigned long)); | ||
145 | 140 | ||
146 | /* then some other stuff */ | 141 | /* then some other stuff */ |
147 | 142 | ||
148 | err |= __put_user(mask, &sc->oldmask); | 143 | err |= __put_user(mask, &sc->oldmask); |
149 | 144 | ||
150 | err |= __put_user(usp, &sc->usp); | ||
151 | |||
152 | return err; | 145 | return err; |
153 | } | 146 | } |
154 | 147 | ||
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index e66366fd2abc..3735abd7f8f6 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
@@ -259,7 +259,7 @@ | |||
259 | ENTRY_SAME(ni_syscall) /* query_module */ | 259 | ENTRY_SAME(ni_syscall) /* query_module */ |
260 | ENTRY_SAME(poll) | 260 | ENTRY_SAME(poll) |
261 | /* structs contain pointers and an in_addr... */ | 261 | /* structs contain pointers and an in_addr... */ |
262 | ENTRY_COMP(nfsservctl) | 262 | ENTRY_SAME(ni_syscall) /* was nfsservctl */ |
263 | ENTRY_SAME(setresgid) /* 170 */ | 263 | ENTRY_SAME(setresgid) /* 170 */ |
264 | ENTRY_SAME(getresgid) | 264 | ENTRY_SAME(getresgid) |
265 | ENTRY_SAME(prctl) | 265 | ENTRY_SAME(prctl) |
diff --git a/arch/powerpc/boot/dts/p1023rds.dts b/arch/powerpc/boot/dts/p1023rds.dts index bfa96aa8f2ca..d9b776740a67 100644 --- a/arch/powerpc/boot/dts/p1023rds.dts +++ b/arch/powerpc/boot/dts/p1023rds.dts | |||
@@ -387,7 +387,7 @@ | |||
387 | #size-cells = <1>; | 387 | #size-cells = <1>; |
388 | compatible = "cfi-flash"; | 388 | compatible = "cfi-flash"; |
389 | reg = <0x0 0x0 0x02000000>; | 389 | reg = <0x0 0x0 0x02000000>; |
390 | bank-width = <1>; | 390 | bank-width = <2>; |
391 | device-width = <1>; | 391 | device-width = <1>; |
392 | partition@0 { | 392 | partition@0 { |
393 | label = "ramdisk"; | 393 | label = "ramdisk"; |
diff --git a/arch/powerpc/configs/85xx/p1023rds_defconfig b/arch/powerpc/configs/85xx/p1023rds_defconfig index 980ff8f61fd4..3ff5a81c709f 100644 --- a/arch/powerpc/configs/85xx/p1023rds_defconfig +++ b/arch/powerpc/configs/85xx/p1023rds_defconfig | |||
@@ -171,3 +171,4 @@ CONFIG_CRYPTO_SHA256=y | |||
171 | CONFIG_CRYPTO_SHA512=y | 171 | CONFIG_CRYPTO_SHA512=y |
172 | CONFIG_CRYPTO_AES=y | 172 | CONFIG_CRYPTO_AES=y |
173 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 173 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
174 | CONFIG_CRYPTO_DEV_FSL_CAAM=y | ||
diff --git a/arch/powerpc/configs/corenet32_smp_defconfig b/arch/powerpc/configs/corenet32_smp_defconfig index 10562a5c65b9..4311d02a3bfd 100644 --- a/arch/powerpc/configs/corenet32_smp_defconfig +++ b/arch/powerpc/configs/corenet32_smp_defconfig | |||
@@ -185,3 +185,4 @@ CONFIG_CRYPTO_SHA256=y | |||
185 | CONFIG_CRYPTO_SHA512=y | 185 | CONFIG_CRYPTO_SHA512=y |
186 | CONFIG_CRYPTO_AES=y | 186 | CONFIG_CRYPTO_AES=y |
187 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 187 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
188 | CONFIG_CRYPTO_DEV_FSL_CAAM=y | ||
diff --git a/arch/powerpc/configs/corenet64_smp_defconfig b/arch/powerpc/configs/corenet64_smp_defconfig index d32283555b53..c92c204a204b 100644 --- a/arch/powerpc/configs/corenet64_smp_defconfig +++ b/arch/powerpc/configs/corenet64_smp_defconfig | |||
@@ -100,5 +100,8 @@ CONFIG_DEBUG_INFO=y | |||
100 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 100 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
101 | CONFIG_VIRQ_DEBUG=y | 101 | CONFIG_VIRQ_DEBUG=y |
102 | CONFIG_CRYPTO_PCBC=m | 102 | CONFIG_CRYPTO_PCBC=m |
103 | CONFIG_CRYPTO_SHA256=y | ||
104 | CONFIG_CRYPTO_SHA512=y | ||
105 | CONFIG_CRYPTO_AES=y | ||
103 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 106 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
104 | CONFIG_CRYPTO_DEV_TALITOS=y | 107 | CONFIG_CRYPTO_DEV_FSL_CAAM=y |
diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig index fcd85d2c72dc..a3467bfb7671 100644 --- a/arch/powerpc/configs/mpc85xx_defconfig +++ b/arch/powerpc/configs/mpc85xx_defconfig | |||
@@ -139,6 +139,7 @@ CONFIG_SND=y | |||
139 | CONFIG_SND_INTEL8X0=y | 139 | CONFIG_SND_INTEL8X0=y |
140 | # CONFIG_SND_PPC is not set | 140 | # CONFIG_SND_PPC is not set |
141 | # CONFIG_SND_USB is not set | 141 | # CONFIG_SND_USB is not set |
142 | CONFIG_SND_SOC=y | ||
142 | CONFIG_HID_A4TECH=y | 143 | CONFIG_HID_A4TECH=y |
143 | CONFIG_HID_APPLE=y | 144 | CONFIG_HID_APPLE=y |
144 | CONFIG_HID_BELKIN=y | 145 | CONFIG_HID_BELKIN=y |
diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig index 908c941fc24c..9693f6ed3da0 100644 --- a/arch/powerpc/configs/mpc85xx_smp_defconfig +++ b/arch/powerpc/configs/mpc85xx_smp_defconfig | |||
@@ -140,6 +140,7 @@ CONFIG_SND=y | |||
140 | CONFIG_SND_INTEL8X0=y | 140 | CONFIG_SND_INTEL8X0=y |
141 | # CONFIG_SND_PPC is not set | 141 | # CONFIG_SND_PPC is not set |
142 | # CONFIG_SND_USB is not set | 142 | # CONFIG_SND_USB is not set |
143 | CONFIG_SND_SOC=y | ||
143 | CONFIG_HID_A4TECH=y | 144 | CONFIG_HID_A4TECH=y |
144 | CONFIG_HID_APPLE=y | 145 | CONFIG_HID_APPLE=y |
145 | CONFIG_HID_BELKIN=y | 146 | CONFIG_HID_BELKIN=y |
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index f6736b7da463..fa0d27a400de 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
@@ -171,7 +171,7 @@ SYSCALL_SPU(setresuid) | |||
171 | SYSCALL_SPU(getresuid) | 171 | SYSCALL_SPU(getresuid) |
172 | SYSCALL(ni_syscall) | 172 | SYSCALL(ni_syscall) |
173 | SYSCALL_SPU(poll) | 173 | SYSCALL_SPU(poll) |
174 | COMPAT_SYS(nfsservctl) | 174 | SYSCALL(ni_syscall) |
175 | SYSCALL_SPU(setresgid) | 175 | SYSCALL_SPU(setresgid) |
176 | SYSCALL_SPU(getresgid) | 176 | SYSCALL_SPU(getresgid) |
177 | COMPAT_SYS_SPU(prctl) | 177 | COMPAT_SYS_SPU(prctl) |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 519eb5f187ef..c0cb794bb365 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -658,12 +658,14 @@ static inline void pgste_set_pte(pte_t *ptep, pgste_t pgste) | |||
658 | * struct gmap_struct - guest address space | 658 | * struct gmap_struct - guest address space |
659 | * @mm: pointer to the parent mm_struct | 659 | * @mm: pointer to the parent mm_struct |
660 | * @table: pointer to the page directory | 660 | * @table: pointer to the page directory |
661 | * @asce: address space control element for gmap page table | ||
661 | * @crst_list: list of all crst tables used in the guest address space | 662 | * @crst_list: list of all crst tables used in the guest address space |
662 | */ | 663 | */ |
663 | struct gmap { | 664 | struct gmap { |
664 | struct list_head list; | 665 | struct list_head list; |
665 | struct mm_struct *mm; | 666 | struct mm_struct *mm; |
666 | unsigned long *table; | 667 | unsigned long *table; |
668 | unsigned long asce; | ||
667 | struct list_head crst_list; | 669 | struct list_head crst_list; |
668 | }; | 670 | }; |
669 | 671 | ||
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index 532fd4322156..2b45591e1582 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/sched.h> | 10 | #include <linux/sched.h> |
11 | #include <asm/vdso.h> | 11 | #include <asm/vdso.h> |
12 | #include <asm/sigp.h> | 12 | #include <asm/sigp.h> |
13 | #include <asm/pgtable.h> | ||
13 | 14 | ||
14 | /* | 15 | /* |
15 | * Make sure that the compiler is new enough. We want a compiler that | 16 | * Make sure that the compiler is new enough. We want a compiler that |
@@ -126,6 +127,7 @@ int main(void) | |||
126 | DEFINE(__LC_KERNEL_STACK, offsetof(struct _lowcore, kernel_stack)); | 127 | DEFINE(__LC_KERNEL_STACK, offsetof(struct _lowcore, kernel_stack)); |
127 | DEFINE(__LC_ASYNC_STACK, offsetof(struct _lowcore, async_stack)); | 128 | DEFINE(__LC_ASYNC_STACK, offsetof(struct _lowcore, async_stack)); |
128 | DEFINE(__LC_PANIC_STACK, offsetof(struct _lowcore, panic_stack)); | 129 | DEFINE(__LC_PANIC_STACK, offsetof(struct _lowcore, panic_stack)); |
130 | DEFINE(__LC_USER_ASCE, offsetof(struct _lowcore, user_asce)); | ||
129 | DEFINE(__LC_INT_CLOCK, offsetof(struct _lowcore, int_clock)); | 131 | DEFINE(__LC_INT_CLOCK, offsetof(struct _lowcore, int_clock)); |
130 | DEFINE(__LC_MCCK_CLOCK, offsetof(struct _lowcore, mcck_clock)); | 132 | DEFINE(__LC_MCCK_CLOCK, offsetof(struct _lowcore, mcck_clock)); |
131 | DEFINE(__LC_MACHINE_FLAGS, offsetof(struct _lowcore, machine_flags)); | 133 | DEFINE(__LC_MACHINE_FLAGS, offsetof(struct _lowcore, machine_flags)); |
@@ -151,6 +153,7 @@ int main(void) | |||
151 | DEFINE(__LC_VDSO_PER_CPU, offsetof(struct _lowcore, vdso_per_cpu_data)); | 153 | DEFINE(__LC_VDSO_PER_CPU, offsetof(struct _lowcore, vdso_per_cpu_data)); |
152 | DEFINE(__LC_GMAP, offsetof(struct _lowcore, gmap)); | 154 | DEFINE(__LC_GMAP, offsetof(struct _lowcore, gmap)); |
153 | DEFINE(__LC_CMF_HPP, offsetof(struct _lowcore, cmf_hpp)); | 155 | DEFINE(__LC_CMF_HPP, offsetof(struct _lowcore, cmf_hpp)); |
156 | DEFINE(__GMAP_ASCE, offsetof(struct gmap, asce)); | ||
154 | #endif /* CONFIG_32BIT */ | 157 | #endif /* CONFIG_32BIT */ |
155 | return 0; | 158 | return 0; |
156 | } | 159 | } |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 5f729d627cef..713da0760538 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -1076,6 +1076,11 @@ sie_loop: | |||
1076 | lg %r14,__LC_THREAD_INFO # pointer thread_info struct | 1076 | lg %r14,__LC_THREAD_INFO # pointer thread_info struct |
1077 | tm __TI_flags+7(%r14),_TIF_EXIT_SIE | 1077 | tm __TI_flags+7(%r14),_TIF_EXIT_SIE |
1078 | jnz sie_exit | 1078 | jnz sie_exit |
1079 | lg %r14,__LC_GMAP # get gmap pointer | ||
1080 | ltgr %r14,%r14 | ||
1081 | jz sie_gmap | ||
1082 | lctlg %c1,%c1,__GMAP_ASCE(%r14) # load primary asce | ||
1083 | sie_gmap: | ||
1079 | lg %r14,__SF_EMPTY(%r15) # get control block pointer | 1084 | lg %r14,__SF_EMPTY(%r15) # get control block pointer |
1080 | SPP __SF_EMPTY(%r15) # set guest id | 1085 | SPP __SF_EMPTY(%r15) # set guest id |
1081 | sie 0(%r14) | 1086 | sie 0(%r14) |
@@ -1083,6 +1088,7 @@ sie_done: | |||
1083 | SPP __LC_CMF_HPP # set host id | 1088 | SPP __LC_CMF_HPP # set host id |
1084 | lg %r14,__LC_THREAD_INFO # pointer thread_info struct | 1089 | lg %r14,__LC_THREAD_INFO # pointer thread_info struct |
1085 | sie_exit: | 1090 | sie_exit: |
1091 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce | ||
1086 | ni __TI_flags+6(%r14),255-(_TIF_SIE>>8) | 1092 | ni __TI_flags+6(%r14),255-(_TIF_SIE>>8) |
1087 | lg %r14,__SF_EMPTY+8(%r15) # load guest register save area | 1093 | lg %r14,__SF_EMPTY+8(%r15) # load guest register save area |
1088 | stmg %r0,%r13,0(%r14) # save guest gprs 0-13 | 1094 | stmg %r0,%r13,0(%r14) # save guest gprs 0-13 |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index f17296e4fc89..dc2b580e27bc 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -123,6 +123,7 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
123 | 123 | ||
124 | switch (ext) { | 124 | switch (ext) { |
125 | case KVM_CAP_S390_PSW: | 125 | case KVM_CAP_S390_PSW: |
126 | case KVM_CAP_S390_GMAP: | ||
126 | r = 1; | 127 | r = 1; |
127 | break; | 128 | break; |
128 | default: | 129 | default: |
@@ -263,10 +264,12 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | |||
263 | vcpu->arch.guest_fpregs.fpc &= FPC_VALID_MASK; | 264 | vcpu->arch.guest_fpregs.fpc &= FPC_VALID_MASK; |
264 | restore_fp_regs(&vcpu->arch.guest_fpregs); | 265 | restore_fp_regs(&vcpu->arch.guest_fpregs); |
265 | restore_access_regs(vcpu->arch.guest_acrs); | 266 | restore_access_regs(vcpu->arch.guest_acrs); |
267 | gmap_enable(vcpu->arch.gmap); | ||
266 | } | 268 | } |
267 | 269 | ||
268 | void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) | 270 | void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) |
269 | { | 271 | { |
272 | gmap_disable(vcpu->arch.gmap); | ||
270 | save_fp_regs(&vcpu->arch.guest_fpregs); | 273 | save_fp_regs(&vcpu->arch.guest_fpregs); |
271 | save_access_regs(vcpu->arch.guest_acrs); | 274 | save_access_regs(vcpu->arch.guest_acrs); |
272 | restore_fp_regs(&vcpu->arch.host_fpregs); | 275 | restore_fp_regs(&vcpu->arch.host_fpregs); |
@@ -461,7 +464,6 @@ static void __vcpu_run(struct kvm_vcpu *vcpu) | |||
461 | local_irq_disable(); | 464 | local_irq_disable(); |
462 | kvm_guest_enter(); | 465 | kvm_guest_enter(); |
463 | local_irq_enable(); | 466 | local_irq_enable(); |
464 | gmap_enable(vcpu->arch.gmap); | ||
465 | VCPU_EVENT(vcpu, 6, "entering sie flags %x", | 467 | VCPU_EVENT(vcpu, 6, "entering sie flags %x", |
466 | atomic_read(&vcpu->arch.sie_block->cpuflags)); | 468 | atomic_read(&vcpu->arch.sie_block->cpuflags)); |
467 | if (sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs)) { | 469 | if (sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs)) { |
@@ -470,7 +472,6 @@ static void __vcpu_run(struct kvm_vcpu *vcpu) | |||
470 | } | 472 | } |
471 | VCPU_EVENT(vcpu, 6, "exit sie icptcode %d", | 473 | VCPU_EVENT(vcpu, 6, "exit sie icptcode %d", |
472 | vcpu->arch.sie_block->icptcode); | 474 | vcpu->arch.sie_block->icptcode); |
473 | gmap_disable(vcpu->arch.gmap); | ||
474 | local_irq_disable(); | 475 | local_irq_disable(); |
475 | kvm_guest_exit(); | 476 | kvm_guest_exit(); |
476 | local_irq_enable(); | 477 | local_irq_enable(); |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 4d1f2bce87b3..f69ff3c13496 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -160,6 +160,8 @@ struct gmap *gmap_alloc(struct mm_struct *mm) | |||
160 | table = (unsigned long *) page_to_phys(page); | 160 | table = (unsigned long *) page_to_phys(page); |
161 | crst_table_init(table, _REGION1_ENTRY_EMPTY); | 161 | crst_table_init(table, _REGION1_ENTRY_EMPTY); |
162 | gmap->table = table; | 162 | gmap->table = table; |
163 | gmap->asce = _ASCE_TYPE_REGION1 | _ASCE_TABLE_LENGTH | | ||
164 | _ASCE_USER_BITS | __pa(table); | ||
163 | list_add(&gmap->list, &mm->context.gmap_list); | 165 | list_add(&gmap->list, &mm->context.gmap_list); |
164 | return gmap; | 166 | return gmap; |
165 | 167 | ||
@@ -240,10 +242,6 @@ EXPORT_SYMBOL_GPL(gmap_free); | |||
240 | */ | 242 | */ |
241 | void gmap_enable(struct gmap *gmap) | 243 | void gmap_enable(struct gmap *gmap) |
242 | { | 244 | { |
243 | /* Load primary space page table origin. */ | ||
244 | S390_lowcore.user_asce = _ASCE_TYPE_REGION1 | _ASCE_TABLE_LENGTH | | ||
245 | _ASCE_USER_BITS | __pa(gmap->table); | ||
246 | asm volatile("lctlg 1,1,%0\n" : : "m" (S390_lowcore.user_asce) ); | ||
247 | S390_lowcore.gmap = (unsigned long) gmap; | 245 | S390_lowcore.gmap = (unsigned long) gmap; |
248 | } | 246 | } |
249 | EXPORT_SYMBOL_GPL(gmap_enable); | 247 | EXPORT_SYMBOL_GPL(gmap_enable); |
@@ -254,10 +252,6 @@ EXPORT_SYMBOL_GPL(gmap_enable); | |||
254 | */ | 252 | */ |
255 | void gmap_disable(struct gmap *gmap) | 253 | void gmap_disable(struct gmap *gmap) |
256 | { | 254 | { |
257 | /* Load primary space page table origin. */ | ||
258 | S390_lowcore.user_asce = | ||
259 | gmap->mm->context.asce_bits | __pa(gmap->mm->pgd); | ||
260 | asm volatile("lctlg 1,1,%0\n" : : "m" (S390_lowcore.user_asce) ); | ||
261 | S390_lowcore.gmap = 0UL; | 255 | S390_lowcore.gmap = 0UL; |
262 | } | 256 | } |
263 | EXPORT_SYMBOL_GPL(gmap_disable); | 257 | EXPORT_SYMBOL_GPL(gmap_disable); |
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h index b97baf81a87b..2d3679b2447f 100644 --- a/arch/sh/include/asm/ptrace.h +++ b/arch/sh/include/asm/ptrace.h | |||
@@ -123,7 +123,7 @@ static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, | |||
123 | struct perf_event; | 123 | struct perf_event; |
124 | struct perf_sample_data; | 124 | struct perf_sample_data; |
125 | 125 | ||
126 | extern void ptrace_triggered(struct perf_event *bp, int nmi, | 126 | extern void ptrace_triggered(struct perf_event *bp, |
127 | struct perf_sample_data *data, struct pt_regs *regs); | 127 | struct perf_sample_data *data, struct pt_regs *regs); |
128 | 128 | ||
129 | #define task_pt_regs(task) \ | 129 | #define task_pt_regs(task) \ |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index e915deafac89..05559295d2ca 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/serial_sci.h> | 15 | #include <linux/serial_sci.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | #include <linux/dma-mapping.h> | ||
18 | #include <linux/sh_timer.h> | 19 | #include <linux/sh_timer.h> |
19 | #include <linux/sh_dma.h> | 20 | #include <linux/sh_dma.h> |
20 | 21 | ||
diff --git a/arch/sh/kernel/idle.c b/arch/sh/kernel/idle.c index 32114e0941ae..db4ecd731a00 100644 --- a/arch/sh/kernel/idle.c +++ b/arch/sh/kernel/idle.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/atomic.h> | 22 | #include <linux/atomic.h> |
23 | #include <asm/smp.h> | 23 | #include <asm/smp.h> |
24 | 24 | ||
25 | static void (*pm_idle)(void); | 25 | void (*pm_idle)(void); |
26 | 26 | ||
27 | static int hlt_counter; | 27 | static int hlt_counter; |
28 | 28 | ||
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index d9006f8ffc14..7bbef95c9d1b 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c | |||
@@ -316,6 +316,35 @@ static int handle_unaligned_ins(insn_size_t instruction, struct pt_regs *regs, | |||
316 | break; | 316 | break; |
317 | } | 317 | } |
318 | break; | 318 | break; |
319 | |||
320 | case 9: /* mov.w @(disp,PC),Rn */ | ||
321 | srcu = (unsigned char __user *)regs->pc; | ||
322 | srcu += 4; | ||
323 | srcu += (instruction & 0x00FF) << 1; | ||
324 | dst = (unsigned char *)rn; | ||
325 | *(unsigned long *)dst = 0; | ||
326 | |||
327 | #if !defined(__LITTLE_ENDIAN__) | ||
328 | dst += 2; | ||
329 | #endif | ||
330 | |||
331 | if (ma->from(dst, srcu, 2)) | ||
332 | goto fetch_fault; | ||
333 | sign_extend(2, dst); | ||
334 | ret = 0; | ||
335 | break; | ||
336 | |||
337 | case 0xd: /* mov.l @(disp,PC),Rn */ | ||
338 | srcu = (unsigned char __user *)(regs->pc & ~0x3); | ||
339 | srcu += 4; | ||
340 | srcu += (instruction & 0x00FF) << 2; | ||
341 | dst = (unsigned char *)rn; | ||
342 | *(unsigned long *)dst = 0; | ||
343 | |||
344 | if (ma->from(dst, srcu, 4)) | ||
345 | goto fetch_fault; | ||
346 | ret = 0; | ||
347 | break; | ||
319 | } | 348 | } |
320 | return ret; | 349 | return ret; |
321 | 350 | ||
@@ -466,6 +495,7 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, | |||
466 | case 0x0500: /* mov.w @(disp,Rm),R0 */ | 495 | case 0x0500: /* mov.w @(disp,Rm),R0 */ |
467 | goto simple; | 496 | goto simple; |
468 | case 0x0B00: /* bf lab - no delayslot*/ | 497 | case 0x0B00: /* bf lab - no delayslot*/ |
498 | ret = 0; | ||
469 | break; | 499 | break; |
470 | case 0x0F00: /* bf/s lab */ | 500 | case 0x0F00: /* bf/s lab */ |
471 | ret = handle_delayslot(regs, instruction, ma); | 501 | ret = handle_delayslot(regs, instruction, ma); |
@@ -479,6 +509,7 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, | |||
479 | } | 509 | } |
480 | break; | 510 | break; |
481 | case 0x0900: /* bt lab - no delayslot */ | 511 | case 0x0900: /* bt lab - no delayslot */ |
512 | ret = 0; | ||
482 | break; | 513 | break; |
483 | case 0x0D00: /* bt/s lab */ | 514 | case 0x0D00: /* bt/s lab */ |
484 | ret = handle_delayslot(regs, instruction, ma); | 515 | ret = handle_delayslot(regs, instruction, ma); |
@@ -494,6 +525,9 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, | |||
494 | } | 525 | } |
495 | break; | 526 | break; |
496 | 527 | ||
528 | case 0x9000: /* mov.w @(disp,Rm),Rn */ | ||
529 | goto simple; | ||
530 | |||
497 | case 0xA000: /* bra label */ | 531 | case 0xA000: /* bra label */ |
498 | ret = handle_delayslot(regs, instruction, ma); | 532 | ret = handle_delayslot(regs, instruction, ma); |
499 | if (ret==0) | 533 | if (ret==0) |
@@ -507,6 +541,9 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, | |||
507 | regs->pc += SH_PC_12BIT_OFFSET(instruction); | 541 | regs->pc += SH_PC_12BIT_OFFSET(instruction); |
508 | } | 542 | } |
509 | break; | 543 | break; |
544 | |||
545 | case 0xD000: /* mov.l @(disp,Rm),Rn */ | ||
546 | goto simple; | ||
510 | } | 547 | } |
511 | return ret; | 548 | return ret; |
512 | 549 | ||
diff --git a/arch/sparc/kernel/irq.h b/arch/sparc/kernel/irq.h index 100b9c204e78..42851122bbd9 100644 --- a/arch/sparc/kernel/irq.h +++ b/arch/sparc/kernel/irq.h | |||
@@ -88,7 +88,7 @@ BTFIXUPDEF_CALL(void, set_irq_udt, int) | |||
88 | #define set_irq_udt(cpu) BTFIXUP_CALL(set_irq_udt)(cpu) | 88 | #define set_irq_udt(cpu) BTFIXUP_CALL(set_irq_udt)(cpu) |
89 | 89 | ||
90 | /* All SUN4D IPIs are sent on this IRQ, may be shared with hard IRQs */ | 90 | /* All SUN4D IPIs are sent on this IRQ, may be shared with hard IRQs */ |
91 | #define SUN4D_IPI_IRQ 14 | 91 | #define SUN4D_IPI_IRQ 13 |
92 | 92 | ||
93 | extern void sun4d_ipi_interrupt(void); | 93 | extern void sun4d_ipi_interrupt(void); |
94 | 94 | ||
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index 3e9daea1653d..3c5bb784214f 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c | |||
@@ -440,8 +440,14 @@ static void __init init_sparc64_elf_hwcap(void) | |||
440 | cap |= AV_SPARC_VIS; | 440 | cap |= AV_SPARC_VIS; |
441 | if (tlb_type == cheetah || tlb_type == cheetah_plus) | 441 | if (tlb_type == cheetah || tlb_type == cheetah_plus) |
442 | cap |= AV_SPARC_VIS | AV_SPARC_VIS2; | 442 | cap |= AV_SPARC_VIS | AV_SPARC_VIS2; |
443 | if (tlb_type == cheetah_plus) | 443 | if (tlb_type == cheetah_plus) { |
444 | cap |= AV_SPARC_POPC; | 444 | unsigned long impl, ver; |
445 | |||
446 | __asm__ __volatile__("rdpr %%ver, %0" : "=r" (ver)); | ||
447 | impl = ((ver >> 32) & 0xffff); | ||
448 | if (impl == PANTHER_IMPL) | ||
449 | cap |= AV_SPARC_POPC; | ||
450 | } | ||
445 | if (tlb_type == hypervisor) { | 451 | if (tlb_type == hypervisor) { |
446 | if (sun4v_chip_type == SUN4V_CHIP_NIAGARA1) | 452 | if (sun4v_chip_type == SUN4V_CHIP_NIAGARA1) |
447 | cap |= AV_SPARC_ASI_BLK_INIT; | 453 | cap |= AV_SPARC_ASI_BLK_INIT; |
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index c9296ab0b1f4..edbec45d4688 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
@@ -68,7 +68,7 @@ sys_call_table32: | |||
68 | .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys32_mlockall | 68 | .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys32_mlockall |
69 | /*240*/ .word sys_munlockall, sys32_sched_setparam, sys32_sched_getparam, sys32_sched_setscheduler, sys32_sched_getscheduler | 69 | /*240*/ .word sys_munlockall, sys32_sched_setparam, sys32_sched_getparam, sys32_sched_setscheduler, sys32_sched_getscheduler |
70 | .word sys_sched_yield, sys32_sched_get_priority_max, sys32_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep | 70 | .word sys_sched_yield, sys32_sched_get_priority_max, sys32_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep |
71 | /*250*/ .word sys_mremap, compat_sys_sysctl, sys32_getsid, sys_fdatasync, sys32_nfsservctl | 71 | /*250*/ .word sys_mremap, compat_sys_sysctl, sys32_getsid, sys_fdatasync, sys_nis_syscall |
72 | .word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep | 72 | .word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep |
73 | /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun | 73 | /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun |
74 | .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy | 74 | .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy |
diff --git a/arch/um/Kconfig.x86 b/arch/um/Kconfig.x86 index d31ecf346b4e..21bebe63df66 100644 --- a/arch/um/Kconfig.x86 +++ b/arch/um/Kconfig.x86 | |||
@@ -10,6 +10,10 @@ config CMPXCHG_LOCAL | |||
10 | bool | 10 | bool |
11 | default n | 11 | default n |
12 | 12 | ||
13 | config CMPXCHG_DOUBLE | ||
14 | bool | ||
15 | default n | ||
16 | |||
13 | source "arch/x86/Kconfig.cpu" | 17 | source "arch/x86/Kconfig.cpu" |
14 | 18 | ||
15 | endmenu | 19 | endmenu |
diff --git a/arch/um/Makefile b/arch/um/Makefile index fab8121d2b32..c0f712cc7c5f 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile | |||
@@ -41,7 +41,7 @@ KBUILD_CPPFLAGS += -I$(srctree)/$(ARCH_DIR)/sys-$(SUBARCH) | |||
41 | KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ | 41 | KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ |
42 | $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \ | 42 | $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \ |
43 | -Din6addr_loopback=kernel_in6addr_loopback \ | 43 | -Din6addr_loopback=kernel_in6addr_loopback \ |
44 | -Din6addr_any=kernel_in6addr_any | 44 | -Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr |
45 | 45 | ||
46 | KBUILD_AFLAGS += $(ARCH_INCLUDE) | 46 | KBUILD_AFLAGS += $(ARCH_INCLUDE) |
47 | 47 | ||
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index d51c404239a8..364c8a15c4c3 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c | |||
@@ -399,8 +399,8 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data) | |||
399 | * is done under a spinlock. Checking whether the device is in use is | 399 | * is done under a spinlock. Checking whether the device is in use is |
400 | * line->tty->count > 1, also under the spinlock. | 400 | * line->tty->count > 1, also under the spinlock. |
401 | * | 401 | * |
402 | * tty->count serves to decide whether the device should be enabled or | 402 | * line->count serves to decide whether the device should be enabled or |
403 | * disabled on the host. If it's equal to 1, then we are doing the | 403 | * disabled on the host. If it's equal to 0, then we are doing the |
404 | * first open or last close. Otherwise, open and close just return. | 404 | * first open or last close. Otherwise, open and close just return. |
405 | */ | 405 | */ |
406 | 406 | ||
@@ -414,16 +414,16 @@ int line_open(struct line *lines, struct tty_struct *tty) | |||
414 | goto out_unlock; | 414 | goto out_unlock; |
415 | 415 | ||
416 | err = 0; | 416 | err = 0; |
417 | if (tty->count > 1) | 417 | if (line->count++) |
418 | goto out_unlock; | 418 | goto out_unlock; |
419 | 419 | ||
420 | spin_unlock(&line->count_lock); | 420 | BUG_ON(tty->driver_data); |
421 | |||
422 | tty->driver_data = line; | 421 | tty->driver_data = line; |
423 | line->tty = tty; | 422 | line->tty = tty; |
424 | 423 | ||
424 | spin_unlock(&line->count_lock); | ||
425 | err = enable_chan(line); | 425 | err = enable_chan(line); |
426 | if (err) | 426 | if (err) /* line_close() will be called by our caller */ |
427 | return err; | 427 | return err; |
428 | 428 | ||
429 | INIT_DELAYED_WORK(&line->task, line_timer_cb); | 429 | INIT_DELAYED_WORK(&line->task, line_timer_cb); |
@@ -436,7 +436,7 @@ int line_open(struct line *lines, struct tty_struct *tty) | |||
436 | chan_window_size(&line->chan_list, &tty->winsize.ws_row, | 436 | chan_window_size(&line->chan_list, &tty->winsize.ws_row, |
437 | &tty->winsize.ws_col); | 437 | &tty->winsize.ws_col); |
438 | 438 | ||
439 | return err; | 439 | return 0; |
440 | 440 | ||
441 | out_unlock: | 441 | out_unlock: |
442 | spin_unlock(&line->count_lock); | 442 | spin_unlock(&line->count_lock); |
@@ -460,17 +460,16 @@ void line_close(struct tty_struct *tty, struct file * filp) | |||
460 | flush_buffer(line); | 460 | flush_buffer(line); |
461 | 461 | ||
462 | spin_lock(&line->count_lock); | 462 | spin_lock(&line->count_lock); |
463 | if (!line->valid) | 463 | BUG_ON(!line->valid); |
464 | goto out_unlock; | ||
465 | 464 | ||
466 | if (tty->count > 1) | 465 | if (--line->count) |
467 | goto out_unlock; | 466 | goto out_unlock; |
468 | 467 | ||
469 | spin_unlock(&line->count_lock); | ||
470 | |||
471 | line->tty = NULL; | 468 | line->tty = NULL; |
472 | tty->driver_data = NULL; | 469 | tty->driver_data = NULL; |
473 | 470 | ||
471 | spin_unlock(&line->count_lock); | ||
472 | |||
474 | if (line->sigio) { | 473 | if (line->sigio) { |
475 | unregister_winch(tty); | 474 | unregister_winch(tty); |
476 | line->sigio = 0; | 475 | line->sigio = 0; |
@@ -498,7 +497,7 @@ static int setup_one_line(struct line *lines, int n, char *init, int init_prio, | |||
498 | 497 | ||
499 | spin_lock(&line->count_lock); | 498 | spin_lock(&line->count_lock); |
500 | 499 | ||
501 | if (line->tty != NULL) { | 500 | if (line->count) { |
502 | *error_out = "Device is already open"; | 501 | *error_out = "Device is already open"; |
503 | goto out; | 502 | goto out; |
504 | } | 503 | } |
@@ -722,41 +721,53 @@ struct winch { | |||
722 | int pid; | 721 | int pid; |
723 | struct tty_struct *tty; | 722 | struct tty_struct *tty; |
724 | unsigned long stack; | 723 | unsigned long stack; |
724 | struct work_struct work; | ||
725 | }; | 725 | }; |
726 | 726 | ||
727 | static void free_winch(struct winch *winch, int free_irq_ok) | 727 | static void __free_winch(struct work_struct *work) |
728 | { | 728 | { |
729 | if (free_irq_ok) | 729 | struct winch *winch = container_of(work, struct winch, work); |
730 | free_irq(WINCH_IRQ, winch); | 730 | free_irq(WINCH_IRQ, winch); |
731 | |||
732 | list_del(&winch->list); | ||
733 | 731 | ||
734 | if (winch->pid != -1) | 732 | if (winch->pid != -1) |
735 | os_kill_process(winch->pid, 1); | 733 | os_kill_process(winch->pid, 1); |
736 | if (winch->fd != -1) | ||
737 | os_close_file(winch->fd); | ||
738 | if (winch->stack != 0) | 734 | if (winch->stack != 0) |
739 | free_stack(winch->stack, 0); | 735 | free_stack(winch->stack, 0); |
740 | kfree(winch); | 736 | kfree(winch); |
741 | } | 737 | } |
742 | 738 | ||
739 | static void free_winch(struct winch *winch) | ||
740 | { | ||
741 | int fd = winch->fd; | ||
742 | winch->fd = -1; | ||
743 | if (fd != -1) | ||
744 | os_close_file(fd); | ||
745 | list_del(&winch->list); | ||
746 | __free_winch(&winch->work); | ||
747 | } | ||
748 | |||
743 | static irqreturn_t winch_interrupt(int irq, void *data) | 749 | static irqreturn_t winch_interrupt(int irq, void *data) |
744 | { | 750 | { |
745 | struct winch *winch = data; | 751 | struct winch *winch = data; |
746 | struct tty_struct *tty; | 752 | struct tty_struct *tty; |
747 | struct line *line; | 753 | struct line *line; |
754 | int fd = winch->fd; | ||
748 | int err; | 755 | int err; |
749 | char c; | 756 | char c; |
750 | 757 | ||
751 | if (winch->fd != -1) { | 758 | if (fd != -1) { |
752 | err = generic_read(winch->fd, &c, NULL); | 759 | err = generic_read(fd, &c, NULL); |
753 | if (err < 0) { | 760 | if (err < 0) { |
754 | if (err != -EAGAIN) { | 761 | if (err != -EAGAIN) { |
762 | winch->fd = -1; | ||
763 | list_del(&winch->list); | ||
764 | os_close_file(fd); | ||
755 | printk(KERN_ERR "winch_interrupt : " | 765 | printk(KERN_ERR "winch_interrupt : " |
756 | "read failed, errno = %d\n", -err); | 766 | "read failed, errno = %d\n", -err); |
757 | printk(KERN_ERR "fd %d is losing SIGWINCH " | 767 | printk(KERN_ERR "fd %d is losing SIGWINCH " |
758 | "support\n", winch->tty_fd); | 768 | "support\n", winch->tty_fd); |
759 | free_winch(winch, 0); | 769 | INIT_WORK(&winch->work, __free_winch); |
770 | schedule_work(&winch->work); | ||
760 | return IRQ_HANDLED; | 771 | return IRQ_HANDLED; |
761 | } | 772 | } |
762 | goto out; | 773 | goto out; |
@@ -828,7 +839,7 @@ static void unregister_winch(struct tty_struct *tty) | |||
828 | list_for_each_safe(ele, next, &winch_handlers) { | 839 | list_for_each_safe(ele, next, &winch_handlers) { |
829 | winch = list_entry(ele, struct winch, list); | 840 | winch = list_entry(ele, struct winch, list); |
830 | if (winch->tty == tty) { | 841 | if (winch->tty == tty) { |
831 | free_winch(winch, 1); | 842 | free_winch(winch); |
832 | break; | 843 | break; |
833 | } | 844 | } |
834 | } | 845 | } |
@@ -844,7 +855,7 @@ static void winch_cleanup(void) | |||
844 | 855 | ||
845 | list_for_each_safe(ele, next, &winch_handlers) { | 856 | list_for_each_safe(ele, next, &winch_handlers) { |
846 | winch = list_entry(ele, struct winch, list); | 857 | winch = list_entry(ele, struct winch, list); |
847 | free_winch(winch, 1); | 858 | free_winch(winch); |
848 | } | 859 | } |
849 | 860 | ||
850 | spin_unlock(&winch_handler_lock); | 861 | spin_unlock(&winch_handler_lock); |
diff --git a/arch/um/drivers/xterm.c b/arch/um/drivers/xterm.c index 8ac7146c237f..2e1de5728604 100644 --- a/arch/um/drivers/xterm.c +++ b/arch/um/drivers/xterm.c | |||
@@ -123,6 +123,7 @@ static int xterm_open(int input, int output, int primary, void *d, | |||
123 | err = -errno; | 123 | err = -errno; |
124 | printk(UM_KERN_ERR "xterm_open : unlink failed, errno = %d\n", | 124 | printk(UM_KERN_ERR "xterm_open : unlink failed, errno = %d\n", |
125 | errno); | 125 | errno); |
126 | close(fd); | ||
126 | return err; | 127 | return err; |
127 | } | 128 | } |
128 | close(fd); | 129 | close(fd); |
diff --git a/arch/um/include/asm/ptrace-generic.h b/arch/um/include/asm/ptrace-generic.h index ae084ad1a3a0..1a7d2757fe05 100644 --- a/arch/um/include/asm/ptrace-generic.h +++ b/arch/um/include/asm/ptrace-generic.h | |||
@@ -42,10 +42,6 @@ extern long subarch_ptrace(struct task_struct *child, long request, | |||
42 | unsigned long addr, unsigned long data); | 42 | unsigned long addr, unsigned long data); |
43 | extern unsigned long getreg(struct task_struct *child, int regno); | 43 | extern unsigned long getreg(struct task_struct *child, int regno); |
44 | extern int putreg(struct task_struct *child, int regno, unsigned long value); | 44 | extern int putreg(struct task_struct *child, int regno, unsigned long value); |
45 | extern int get_fpregs(struct user_i387_struct __user *buf, | ||
46 | struct task_struct *child); | ||
47 | extern int set_fpregs(struct user_i387_struct __user *buf, | ||
48 | struct task_struct *child); | ||
49 | 45 | ||
50 | extern int arch_copy_tls(struct task_struct *new); | 46 | extern int arch_copy_tls(struct task_struct *new); |
51 | extern void clear_flushed_tls(struct task_struct *task); | 47 | extern void clear_flushed_tls(struct task_struct *task); |
diff --git a/arch/um/include/shared/line.h b/arch/um/include/shared/line.h index 72f4f25af247..63df3ca02ac2 100644 --- a/arch/um/include/shared/line.h +++ b/arch/um/include/shared/line.h | |||
@@ -33,6 +33,7 @@ struct line_driver { | |||
33 | struct line { | 33 | struct line { |
34 | struct tty_struct *tty; | 34 | struct tty_struct *tty; |
35 | spinlock_t count_lock; | 35 | spinlock_t count_lock; |
36 | unsigned long count; | ||
36 | int valid; | 37 | int valid; |
37 | 38 | ||
38 | char *init_str; | 39 | char *init_str; |
diff --git a/arch/um/include/shared/registers.h b/arch/um/include/shared/registers.h index b0b4589e0ebc..f1e0aa56c52a 100644 --- a/arch/um/include/shared/registers.h +++ b/arch/um/include/shared/registers.h | |||
@@ -16,7 +16,7 @@ extern int restore_fpx_registers(int pid, unsigned long *fp_regs); | |||
16 | extern int save_registers(int pid, struct uml_pt_regs *regs); | 16 | extern int save_registers(int pid, struct uml_pt_regs *regs); |
17 | extern int restore_registers(int pid, struct uml_pt_regs *regs); | 17 | extern int restore_registers(int pid, struct uml_pt_regs *regs); |
18 | extern int init_registers(int pid); | 18 | extern int init_registers(int pid); |
19 | extern void get_safe_registers(unsigned long *regs); | 19 | extern void get_safe_registers(unsigned long *regs, unsigned long *fp_regs); |
20 | extern unsigned long get_thread_reg(int reg, jmp_buf *buf); | 20 | extern unsigned long get_thread_reg(int reg, jmp_buf *buf); |
21 | extern int get_fp_registers(int pid, unsigned long *regs); | 21 | extern int get_fp_registers(int pid, unsigned long *regs); |
22 | extern int put_fp_registers(int pid, unsigned long *regs); | 22 | extern int put_fp_registers(int pid, unsigned long *regs); |
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index fab4371184f6..21c1ae7c3d75 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c | |||
@@ -202,7 +202,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, | |||
202 | arch_copy_thread(¤t->thread.arch, &p->thread.arch); | 202 | arch_copy_thread(¤t->thread.arch, &p->thread.arch); |
203 | } | 203 | } |
204 | else { | 204 | else { |
205 | get_safe_registers(p->thread.regs.regs.gp); | 205 | get_safe_registers(p->thread.regs.regs.gp, p->thread.regs.regs.fp); |
206 | p->thread.request.u.thread = current->thread.request.u.thread; | 206 | p->thread.request.u.thread = current->thread.request.u.thread; |
207 | handler = new_thread_handler; | 207 | handler = new_thread_handler; |
208 | } | 208 | } |
diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c index 701b672c1122..c9da32b0c707 100644 --- a/arch/um/kernel/ptrace.c +++ b/arch/um/kernel/ptrace.c | |||
@@ -50,23 +50,11 @@ long arch_ptrace(struct task_struct *child, long request, | |||
50 | void __user *vp = p; | 50 | void __user *vp = p; |
51 | 51 | ||
52 | switch (request) { | 52 | switch (request) { |
53 | /* read word at location addr. */ | ||
54 | case PTRACE_PEEKTEXT: | ||
55 | case PTRACE_PEEKDATA: | ||
56 | ret = generic_ptrace_peekdata(child, addr, data); | ||
57 | break; | ||
58 | |||
59 | /* read the word at location addr in the USER area. */ | 53 | /* read the word at location addr in the USER area. */ |
60 | case PTRACE_PEEKUSR: | 54 | case PTRACE_PEEKUSR: |
61 | ret = peek_user(child, addr, data); | 55 | ret = peek_user(child, addr, data); |
62 | break; | 56 | break; |
63 | 57 | ||
64 | /* write the word at location addr. */ | ||
65 | case PTRACE_POKETEXT: | ||
66 | case PTRACE_POKEDATA: | ||
67 | ret = generic_ptrace_pokedata(child, addr, data); | ||
68 | break; | ||
69 | |||
70 | /* write the word at location addr in the USER area */ | 58 | /* write the word at location addr in the USER area */ |
71 | case PTRACE_POKEUSR: | 59 | case PTRACE_POKEUSR: |
72 | ret = poke_user(child, addr, data); | 60 | ret = poke_user(child, addr, data); |
@@ -107,16 +95,6 @@ long arch_ptrace(struct task_struct *child, long request, | |||
107 | break; | 95 | break; |
108 | } | 96 | } |
109 | #endif | 97 | #endif |
110 | #ifdef PTRACE_GETFPREGS | ||
111 | case PTRACE_GETFPREGS: /* Get the child FPU state. */ | ||
112 | ret = get_fpregs(vp, child); | ||
113 | break; | ||
114 | #endif | ||
115 | #ifdef PTRACE_SETFPREGS | ||
116 | case PTRACE_SETFPREGS: /* Set the child FPU state. */ | ||
117 | ret = set_fpregs(vp, child); | ||
118 | break; | ||
119 | #endif | ||
120 | case PTRACE_GET_THREAD_AREA: | 98 | case PTRACE_GET_THREAD_AREA: |
121 | ret = ptrace_get_thread_area(child, addr, vp); | 99 | ret = ptrace_get_thread_area(child, addr, vp); |
122 | break; | 100 | break; |
@@ -154,12 +132,6 @@ long arch_ptrace(struct task_struct *child, long request, | |||
154 | break; | 132 | break; |
155 | } | 133 | } |
156 | #endif | 134 | #endif |
157 | #ifdef PTRACE_ARCH_PRCTL | ||
158 | case PTRACE_ARCH_PRCTL: | ||
159 | /* XXX Calls ptrace on the host - needs some SMP thinking */ | ||
160 | ret = arch_prctl(child, data, (void __user *) addr); | ||
161 | break; | ||
162 | #endif | ||
163 | default: | 135 | default: |
164 | ret = ptrace_request(child, request, addr, data); | 136 | ret = ptrace_request(child, request, addr, data); |
165 | if (ret == -EIO) | 137 | if (ret == -EIO) |
diff --git a/arch/um/os-Linux/registers.c b/arch/um/os-Linux/registers.c index 830fe6a1518a..b866b9e3bef9 100644 --- a/arch/um/os-Linux/registers.c +++ b/arch/um/os-Linux/registers.c | |||
@@ -8,6 +8,8 @@ | |||
8 | #include <string.h> | 8 | #include <string.h> |
9 | #include <sys/ptrace.h> | 9 | #include <sys/ptrace.h> |
10 | #include "sysdep/ptrace.h" | 10 | #include "sysdep/ptrace.h" |
11 | #include "sysdep/ptrace_user.h" | ||
12 | #include "registers.h" | ||
11 | 13 | ||
12 | int save_registers(int pid, struct uml_pt_regs *regs) | 14 | int save_registers(int pid, struct uml_pt_regs *regs) |
13 | { | 15 | { |
@@ -32,6 +34,7 @@ int restore_registers(int pid, struct uml_pt_regs *regs) | |||
32 | /* This is set once at boot time and not changed thereafter */ | 34 | /* This is set once at boot time and not changed thereafter */ |
33 | 35 | ||
34 | static unsigned long exec_regs[MAX_REG_NR]; | 36 | static unsigned long exec_regs[MAX_REG_NR]; |
37 | static unsigned long exec_fp_regs[FP_SIZE]; | ||
35 | 38 | ||
36 | int init_registers(int pid) | 39 | int init_registers(int pid) |
37 | { | 40 | { |
@@ -42,10 +45,14 @@ int init_registers(int pid) | |||
42 | return -errno; | 45 | return -errno; |
43 | 46 | ||
44 | arch_init_registers(pid); | 47 | arch_init_registers(pid); |
48 | get_fp_registers(pid, exec_fp_regs); | ||
45 | return 0; | 49 | return 0; |
46 | } | 50 | } |
47 | 51 | ||
48 | void get_safe_registers(unsigned long *regs) | 52 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) |
49 | { | 53 | { |
50 | memcpy(regs, exec_regs, sizeof(exec_regs)); | 54 | memcpy(regs, exec_regs, sizeof(exec_regs)); |
55 | |||
56 | if (fp_regs) | ||
57 | memcpy(fp_regs, exec_fp_regs, sizeof(exec_fp_regs)); | ||
51 | } | 58 | } |
diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c index d261f170d120..e771398be5f3 100644 --- a/arch/um/os-Linux/skas/mem.c +++ b/arch/um/os-Linux/skas/mem.c | |||
@@ -39,7 +39,7 @@ static unsigned long syscall_regs[MAX_REG_NR]; | |||
39 | 39 | ||
40 | static int __init init_syscall_regs(void) | 40 | static int __init init_syscall_regs(void) |
41 | { | 41 | { |
42 | get_safe_registers(syscall_regs); | 42 | get_safe_registers(syscall_regs, NULL); |
43 | syscall_regs[REGS_IP_INDEX] = STUB_CODE + | 43 | syscall_regs[REGS_IP_INDEX] = STUB_CODE + |
44 | ((unsigned long) &batch_syscall_stub - | 44 | ((unsigned long) &batch_syscall_stub - |
45 | (unsigned long) &__syscall_stub_start); | 45 | (unsigned long) &__syscall_stub_start); |
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index d6e0a2234b86..dee0e8cf8ad0 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c | |||
@@ -373,6 +373,9 @@ void userspace(struct uml_pt_regs *regs) | |||
373 | if (ptrace(PTRACE_SETREGS, pid, 0, regs->gp)) | 373 | if (ptrace(PTRACE_SETREGS, pid, 0, regs->gp)) |
374 | fatal_sigsegv(); | 374 | fatal_sigsegv(); |
375 | 375 | ||
376 | if (put_fp_registers(pid, regs->fp)) | ||
377 | fatal_sigsegv(); | ||
378 | |||
376 | /* Now we set local_using_sysemu to be used for one loop */ | 379 | /* Now we set local_using_sysemu to be used for one loop */ |
377 | local_using_sysemu = get_using_sysemu(); | 380 | local_using_sysemu = get_using_sysemu(); |
378 | 381 | ||
@@ -399,6 +402,12 @@ void userspace(struct uml_pt_regs *regs) | |||
399 | fatal_sigsegv(); | 402 | fatal_sigsegv(); |
400 | } | 403 | } |
401 | 404 | ||
405 | if (get_fp_registers(pid, regs->fp)) { | ||
406 | printk(UM_KERN_ERR "userspace - get_fp_registers failed, " | ||
407 | "errno = %d\n", errno); | ||
408 | fatal_sigsegv(); | ||
409 | } | ||
410 | |||
402 | UPT_SYSCALL_NR(regs) = -1; /* Assume: It's not a syscall */ | 411 | UPT_SYSCALL_NR(regs) = -1; /* Assume: It's not a syscall */ |
403 | 412 | ||
404 | if (WIFSTOPPED(status)) { | 413 | if (WIFSTOPPED(status)) { |
@@ -457,10 +466,11 @@ void userspace(struct uml_pt_regs *regs) | |||
457 | } | 466 | } |
458 | 467 | ||
459 | static unsigned long thread_regs[MAX_REG_NR]; | 468 | static unsigned long thread_regs[MAX_REG_NR]; |
469 | static unsigned long thread_fp_regs[FP_SIZE]; | ||
460 | 470 | ||
461 | static int __init init_thread_regs(void) | 471 | static int __init init_thread_regs(void) |
462 | { | 472 | { |
463 | get_safe_registers(thread_regs); | 473 | get_safe_registers(thread_regs, thread_fp_regs); |
464 | /* Set parent's instruction pointer to start of clone-stub */ | 474 | /* Set parent's instruction pointer to start of clone-stub */ |
465 | thread_regs[REGS_IP_INDEX] = STUB_CODE + | 475 | thread_regs[REGS_IP_INDEX] = STUB_CODE + |
466 | (unsigned long) stub_clone_handler - | 476 | (unsigned long) stub_clone_handler - |
@@ -503,6 +513,13 @@ int copy_context_skas0(unsigned long new_stack, int pid) | |||
503 | return err; | 513 | return err; |
504 | } | 514 | } |
505 | 515 | ||
516 | err = put_fp_registers(pid, thread_fp_regs); | ||
517 | if (err < 0) { | ||
518 | printk(UM_KERN_ERR "copy_context_skas0 : put_fp_registers " | ||
519 | "failed, pid = %d, err = %d\n", pid, err); | ||
520 | return err; | ||
521 | } | ||
522 | |||
506 | /* set a well known return code for detection of child write failure */ | 523 | /* set a well known return code for detection of child write failure */ |
507 | child_data->err = 12345678; | 524 | child_data->err = 12345678; |
508 | 525 | ||
diff --git a/arch/um/sys-i386/asm/ptrace.h b/arch/um/sys-i386/asm/ptrace.h index 0273e4d09af7..5d2a59112537 100644 --- a/arch/um/sys-i386/asm/ptrace.h +++ b/arch/um/sys-i386/asm/ptrace.h | |||
@@ -42,11 +42,6 @@ | |||
42 | */ | 42 | */ |
43 | struct user_desc; | 43 | struct user_desc; |
44 | 44 | ||
45 | extern int get_fpxregs(struct user_fxsr_struct __user *buf, | ||
46 | struct task_struct *child); | ||
47 | extern int set_fpxregs(struct user_fxsr_struct __user *buf, | ||
48 | struct task_struct *tsk); | ||
49 | |||
50 | extern int ptrace_get_thread_area(struct task_struct *child, int idx, | 45 | extern int ptrace_get_thread_area(struct task_struct *child, int idx, |
51 | struct user_desc __user *user_desc); | 46 | struct user_desc __user *user_desc); |
52 | 47 | ||
diff --git a/arch/um/sys-i386/ptrace.c b/arch/um/sys-i386/ptrace.c index d23b2d3ea384..3375c2717851 100644 --- a/arch/um/sys-i386/ptrace.c +++ b/arch/um/sys-i386/ptrace.c | |||
@@ -145,7 +145,7 @@ int peek_user(struct task_struct *child, long addr, long data) | |||
145 | return put_user(tmp, (unsigned long __user *) data); | 145 | return put_user(tmp, (unsigned long __user *) data); |
146 | } | 146 | } |
147 | 147 | ||
148 | int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | 148 | static int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) |
149 | { | 149 | { |
150 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; | 150 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; |
151 | struct user_i387_struct fpregs; | 151 | struct user_i387_struct fpregs; |
@@ -161,7 +161,7 @@ int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | |||
161 | return n; | 161 | return n; |
162 | } | 162 | } |
163 | 163 | ||
164 | int set_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | 164 | static int set_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) |
165 | { | 165 | { |
166 | int n, cpu = ((struct thread_info *) child->stack)->cpu; | 166 | int n, cpu = ((struct thread_info *) child->stack)->cpu; |
167 | struct user_i387_struct fpregs; | 167 | struct user_i387_struct fpregs; |
@@ -174,7 +174,7 @@ int set_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | |||
174 | (unsigned long *) &fpregs); | 174 | (unsigned long *) &fpregs); |
175 | } | 175 | } |
176 | 176 | ||
177 | int get_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) | 177 | static int get_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) |
178 | { | 178 | { |
179 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; | 179 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; |
180 | struct user_fxsr_struct fpregs; | 180 | struct user_fxsr_struct fpregs; |
@@ -190,7 +190,7 @@ int get_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) | |||
190 | return n; | 190 | return n; |
191 | } | 191 | } |
192 | 192 | ||
193 | int set_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) | 193 | static int set_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) |
194 | { | 194 | { |
195 | int n, cpu = ((struct thread_info *) child->stack)->cpu; | 195 | int n, cpu = ((struct thread_info *) child->stack)->cpu; |
196 | struct user_fxsr_struct fpregs; | 196 | struct user_fxsr_struct fpregs; |
@@ -206,5 +206,23 @@ int set_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child) | |||
206 | long subarch_ptrace(struct task_struct *child, long request, | 206 | long subarch_ptrace(struct task_struct *child, long request, |
207 | unsigned long addr, unsigned long data) | 207 | unsigned long addr, unsigned long data) |
208 | { | 208 | { |
209 | return -EIO; | 209 | int ret = -EIO; |
210 | void __user *datap = (void __user *) data; | ||
211 | switch (request) { | ||
212 | case PTRACE_GETFPREGS: /* Get the child FPU state. */ | ||
213 | ret = get_fpregs(datap, child); | ||
214 | break; | ||
215 | case PTRACE_SETFPREGS: /* Set the child FPU state. */ | ||
216 | ret = set_fpregs(datap, child); | ||
217 | break; | ||
218 | case PTRACE_GETFPXREGS: /* Get the child FPU state. */ | ||
219 | ret = get_fpxregs(datap, child); | ||
220 | break; | ||
221 | case PTRACE_SETFPXREGS: /* Set the child FPU state. */ | ||
222 | ret = set_fpxregs(datap, child); | ||
223 | break; | ||
224 | default: | ||
225 | ret = -EIO; | ||
226 | } | ||
227 | return ret; | ||
210 | } | 228 | } |
diff --git a/arch/um/sys-i386/shared/sysdep/ptrace.h b/arch/um/sys-i386/shared/sysdep/ptrace.h index d50e62e07070..c398a5076111 100644 --- a/arch/um/sys-i386/shared/sysdep/ptrace.h +++ b/arch/um/sys-i386/shared/sysdep/ptrace.h | |||
@@ -53,6 +53,7 @@ extern int sysemu_supported; | |||
53 | 53 | ||
54 | struct uml_pt_regs { | 54 | struct uml_pt_regs { |
55 | unsigned long gp[MAX_REG_NR]; | 55 | unsigned long gp[MAX_REG_NR]; |
56 | unsigned long fp[HOST_FPX_SIZE]; | ||
56 | struct faultinfo faultinfo; | 57 | struct faultinfo faultinfo; |
57 | long syscall; | 58 | long syscall; |
58 | int is_user; | 59 | int is_user; |
diff --git a/arch/um/sys-x86_64/ptrace.c b/arch/um/sys-x86_64/ptrace.c index f43613643cdb..4005506834fd 100644 --- a/arch/um/sys-x86_64/ptrace.c +++ b/arch/um/sys-x86_64/ptrace.c | |||
@@ -145,7 +145,7 @@ int is_syscall(unsigned long addr) | |||
145 | return instr == 0x050f; | 145 | return instr == 0x050f; |
146 | } | 146 | } |
147 | 147 | ||
148 | int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | 148 | static int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) |
149 | { | 149 | { |
150 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; | 150 | int err, n, cpu = ((struct thread_info *) child->stack)->cpu; |
151 | long fpregs[HOST_FP_SIZE]; | 151 | long fpregs[HOST_FP_SIZE]; |
@@ -162,7 +162,7 @@ int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | |||
162 | return n; | 162 | return n; |
163 | } | 163 | } |
164 | 164 | ||
165 | int set_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) | 165 | static int set_fpregs(struct user_i387_struct __user *buf, struct task_struct *child) |
166 | { | 166 | { |
167 | int n, cpu = ((struct thread_info *) child->stack)->cpu; | 167 | int n, cpu = ((struct thread_info *) child->stack)->cpu; |
168 | long fpregs[HOST_FP_SIZE]; | 168 | long fpregs[HOST_FP_SIZE]; |
@@ -182,12 +182,16 @@ long subarch_ptrace(struct task_struct *child, long request, | |||
182 | void __user *datap = (void __user *) data; | 182 | void __user *datap = (void __user *) data; |
183 | 183 | ||
184 | switch (request) { | 184 | switch (request) { |
185 | case PTRACE_GETFPXREGS: /* Get the child FPU state. */ | 185 | case PTRACE_GETFPREGS: /* Get the child FPU state. */ |
186 | ret = get_fpregs(datap, child); | 186 | ret = get_fpregs(datap, child); |
187 | break; | 187 | break; |
188 | case PTRACE_SETFPXREGS: /* Set the child FPU state. */ | 188 | case PTRACE_SETFPREGS: /* Set the child FPU state. */ |
189 | ret = set_fpregs(datap, child); | 189 | ret = set_fpregs(datap, child); |
190 | break; | 190 | break; |
191 | case PTRACE_ARCH_PRCTL: | ||
192 | /* XXX Calls ptrace on the host - needs some SMP thinking */ | ||
193 | ret = arch_prctl(child, data, (void __user *) addr); | ||
194 | break; | ||
191 | } | 195 | } |
192 | 196 | ||
193 | return ret; | 197 | return ret; |
diff --git a/arch/um/sys-x86_64/shared/sysdep/ptrace.h b/arch/um/sys-x86_64/shared/sysdep/ptrace.h index fdba5457947a..8ee8f8e12af1 100644 --- a/arch/um/sys-x86_64/shared/sysdep/ptrace.h +++ b/arch/um/sys-x86_64/shared/sysdep/ptrace.h | |||
@@ -85,6 +85,7 @@ | |||
85 | 85 | ||
86 | struct uml_pt_regs { | 86 | struct uml_pt_regs { |
87 | unsigned long gp[MAX_REG_NR]; | 87 | unsigned long gp[MAX_REG_NR]; |
88 | unsigned long fp[HOST_FP_SIZE]; | ||
88 | struct faultinfo faultinfo; | 89 | struct faultinfo faultinfo; |
89 | long syscall; | 90 | long syscall; |
90 | int is_user; | 91 | int is_user; |
diff --git a/arch/x86/include/asm/alternative-asm.h b/arch/x86/include/asm/alternative-asm.h index 4554cc6fb96a..091508b533b4 100644 --- a/arch/x86/include/asm/alternative-asm.h +++ b/arch/x86/include/asm/alternative-asm.h | |||
@@ -16,7 +16,6 @@ | |||
16 | #endif | 16 | #endif |
17 | 17 | ||
18 | .macro altinstruction_entry orig alt feature orig_len alt_len | 18 | .macro altinstruction_entry orig alt feature orig_len alt_len |
19 | .align 8 | ||
20 | .long \orig - . | 19 | .long \orig - . |
21 | .long \alt - . | 20 | .long \alt - . |
22 | .word \feature | 21 | .word \feature |
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h index 23fb6d79f209..37ad100a2210 100644 --- a/arch/x86/include/asm/alternative.h +++ b/arch/x86/include/asm/alternative.h | |||
@@ -48,9 +48,6 @@ struct alt_instr { | |||
48 | u16 cpuid; /* cpuid bit set for replacement */ | 48 | u16 cpuid; /* cpuid bit set for replacement */ |
49 | u8 instrlen; /* length of original instruction */ | 49 | u8 instrlen; /* length of original instruction */ |
50 | u8 replacementlen; /* length of new instruction, <= instrlen */ | 50 | u8 replacementlen; /* length of new instruction, <= instrlen */ |
51 | #ifdef CONFIG_X86_64 | ||
52 | u32 pad2; | ||
53 | #endif | ||
54 | }; | 51 | }; |
55 | 52 | ||
56 | extern void alternative_instructions(void); | 53 | extern void alternative_instructions(void); |
@@ -83,7 +80,6 @@ static inline int alternatives_text_reserved(void *start, void *end) | |||
83 | \ | 80 | \ |
84 | "661:\n\t" oldinstr "\n662:\n" \ | 81 | "661:\n\t" oldinstr "\n662:\n" \ |
85 | ".section .altinstructions,\"a\"\n" \ | 82 | ".section .altinstructions,\"a\"\n" \ |
86 | _ASM_ALIGN "\n" \ | ||
87 | " .long 661b - .\n" /* label */ \ | 83 | " .long 661b - .\n" /* label */ \ |
88 | " .long 663f - .\n" /* new instruction */ \ | 84 | " .long 663f - .\n" /* new instruction */ \ |
89 | " .word " __stringify(feature) "\n" /* feature bit */ \ | 85 | " .word " __stringify(feature) "\n" /* feature bit */ \ |
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 4258aac99a6e..88b23a43f340 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -332,7 +332,6 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) | |||
332 | asm goto("1: jmp %l[t_no]\n" | 332 | asm goto("1: jmp %l[t_no]\n" |
333 | "2:\n" | 333 | "2:\n" |
334 | ".section .altinstructions,\"a\"\n" | 334 | ".section .altinstructions,\"a\"\n" |
335 | _ASM_ALIGN "\n" | ||
336 | " .long 1b - .\n" | 335 | " .long 1b - .\n" |
337 | " .long 0\n" /* no replacement */ | 336 | " .long 0\n" /* no replacement */ |
338 | " .word %P0\n" /* feature bit */ | 337 | " .word %P0\n" /* feature bit */ |
@@ -350,7 +349,6 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) | |||
350 | asm volatile("1: movb $0,%0\n" | 349 | asm volatile("1: movb $0,%0\n" |
351 | "2:\n" | 350 | "2:\n" |
352 | ".section .altinstructions,\"a\"\n" | 351 | ".section .altinstructions,\"a\"\n" |
353 | _ASM_ALIGN "\n" | ||
354 | " .long 1b - .\n" | 352 | " .long 1b - .\n" |
355 | " .long 3f - .\n" | 353 | " .long 3f - .\n" |
356 | " .word %P1\n" /* feature bit */ | 354 | " .word %P1\n" /* feature bit */ |
diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h index a518c0a45044..c59cc97fe6c1 100644 --- a/arch/x86/include/asm/pvclock.h +++ b/arch/x86/include/asm/pvclock.h | |||
@@ -44,7 +44,7 @@ static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift) | |||
44 | : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) ); | 44 | : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) ); |
45 | #elif defined(__x86_64__) | 45 | #elif defined(__x86_64__) |
46 | __asm__ ( | 46 | __asm__ ( |
47 | "mul %[mul_frac] ; shrd $32, %[hi], %[lo]" | 47 | "mulq %[mul_frac] ; shrd $32, %[hi], %[lo]" |
48 | : [lo]"=a"(product), | 48 | : [lo]"=a"(product), |
49 | [hi]"=d"(tmp) | 49 | [hi]"=d"(tmp) |
50 | : "0"(delta), | 50 | : "0"(delta), |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 4ee3abf20ed6..cfa62ec090ec 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -1900,6 +1900,9 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) | |||
1900 | 1900 | ||
1901 | perf_callchain_store(entry, regs->ip); | 1901 | perf_callchain_store(entry, regs->ip); |
1902 | 1902 | ||
1903 | if (!current->mm) | ||
1904 | return; | ||
1905 | |||
1903 | if (perf_callchain_user32(regs, entry)) | 1906 | if (perf_callchain_user32(regs, entry)) |
1904 | return; | 1907 | return; |
1905 | 1908 | ||
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 6f08bc940fa8..8b4cc5f067de 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -3603,7 +3603,7 @@ done_prefixes: | |||
3603 | break; | 3603 | break; |
3604 | case Src2CL: | 3604 | case Src2CL: |
3605 | ctxt->src2.bytes = 1; | 3605 | ctxt->src2.bytes = 1; |
3606 | ctxt->src2.val = ctxt->regs[VCPU_REGS_RCX] & 0x8; | 3606 | ctxt->src2.val = ctxt->regs[VCPU_REGS_RCX] & 0xff; |
3607 | break; | 3607 | break; |
3608 | case Src2ImmByte: | 3608 | case Src2ImmByte: |
3609 | rc = decode_imm(ctxt, &ctxt->src2, 1, true); | 3609 | rc = decode_imm(ctxt, &ctxt->src2, 1, true); |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 1c5b69373a00..8e8da7960dbe 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -400,7 +400,8 @@ static u64 __update_clear_spte_slow(u64 *sptep, u64 spte) | |||
400 | 400 | ||
401 | /* xchg acts as a barrier before the setting of the high bits */ | 401 | /* xchg acts as a barrier before the setting of the high bits */ |
402 | orig.spte_low = xchg(&ssptep->spte_low, sspte.spte_low); | 402 | orig.spte_low = xchg(&ssptep->spte_low, sspte.spte_low); |
403 | orig.spte_high = ssptep->spte_high = sspte.spte_high; | 403 | orig.spte_high = ssptep->spte_high; |
404 | ssptep->spte_high = sspte.spte_high; | ||
404 | count_spte_clear(sptep, spte); | 405 | count_spte_clear(sptep, spte); |
405 | 406 | ||
406 | return orig.spte; | 407 | return orig.spte; |
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index c95330267f08..039d91315bc5 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
@@ -365,8 +365,13 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root) | |||
365 | */ | 365 | */ |
366 | if (bus) { | 366 | if (bus) { |
367 | struct pci_bus *child; | 367 | struct pci_bus *child; |
368 | list_for_each_entry(child, &bus->children, node) | 368 | list_for_each_entry(child, &bus->children, node) { |
369 | pcie_bus_configure_settings(child, child->self->pcie_mpss); | 369 | struct pci_dev *self = child->self; |
370 | if (!self) | ||
371 | continue; | ||
372 | |||
373 | pcie_bus_configure_settings(child, self->pcie_mpss); | ||
374 | } | ||
370 | } | 375 | } |
371 | 376 | ||
372 | if (!bus) | 377 | if (!bus) |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 20a614275064..3dd53f997b11 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
@@ -1721,10 +1721,8 @@ void __init xen_setup_machphys_mapping(void) | |||
1721 | machine_to_phys_nr = MACH2PHYS_NR_ENTRIES; | 1721 | machine_to_phys_nr = MACH2PHYS_NR_ENTRIES; |
1722 | } | 1722 | } |
1723 | #ifdef CONFIG_X86_32 | 1723 | #ifdef CONFIG_X86_32 |
1724 | if ((machine_to_phys_mapping + machine_to_phys_nr) | 1724 | WARN_ON((machine_to_phys_mapping + (machine_to_phys_nr - 1)) |
1725 | < machine_to_phys_mapping) | 1725 | < machine_to_phys_mapping); |
1726 | machine_to_phys_nr = (unsigned long *)NULL | ||
1727 | - machine_to_phys_mapping; | ||
1728 | #endif | 1726 | #endif |
1729 | } | 1727 | } |
1730 | 1728 | ||
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index df118a825f39..46d6d21dbdbe 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -184,6 +184,19 @@ static unsigned long __init xen_set_identity(const struct e820entry *list, | |||
184 | PFN_UP(start_pci), PFN_DOWN(last)); | 184 | PFN_UP(start_pci), PFN_DOWN(last)); |
185 | return identity; | 185 | return identity; |
186 | } | 186 | } |
187 | |||
188 | static unsigned long __init xen_get_max_pages(void) | ||
189 | { | ||
190 | unsigned long max_pages = MAX_DOMAIN_PAGES; | ||
191 | domid_t domid = DOMID_SELF; | ||
192 | int ret; | ||
193 | |||
194 | ret = HYPERVISOR_memory_op(XENMEM_maximum_reservation, &domid); | ||
195 | if (ret > 0) | ||
196 | max_pages = ret; | ||
197 | return min(max_pages, MAX_DOMAIN_PAGES); | ||
198 | } | ||
199 | |||
187 | /** | 200 | /** |
188 | * machine_specific_memory_setup - Hook for machine specific memory setup. | 201 | * machine_specific_memory_setup - Hook for machine specific memory setup. |
189 | **/ | 202 | **/ |
@@ -292,6 +305,14 @@ char * __init xen_memory_setup(void) | |||
292 | 305 | ||
293 | sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); | 306 | sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); |
294 | 307 | ||
308 | extra_limit = xen_get_max_pages(); | ||
309 | if (max_pfn + extra_pages > extra_limit) { | ||
310 | if (extra_limit > max_pfn) | ||
311 | extra_pages = extra_limit - max_pfn; | ||
312 | else | ||
313 | extra_pages = 0; | ||
314 | } | ||
315 | |||
295 | extra_pages += xen_return_unused_memory(xen_start_info->nr_pages, &e820); | 316 | extra_pages += xen_return_unused_memory(xen_start_info->nr_pages, &e820); |
296 | 317 | ||
297 | /* | 318 | /* |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index e79dbb95482b..041d4fe9dfe4 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <xen/page.h> | 32 | #include <xen/page.h> |
33 | #include <xen/events.h> | 33 | #include <xen/events.h> |
34 | 34 | ||
35 | #include <xen/hvc-console.h> | ||
35 | #include "xen-ops.h" | 36 | #include "xen-ops.h" |
36 | #include "mmu.h" | 37 | #include "mmu.h" |
37 | 38 | ||
@@ -207,6 +208,15 @@ static void __init xen_smp_prepare_cpus(unsigned int max_cpus) | |||
207 | unsigned cpu; | 208 | unsigned cpu; |
208 | unsigned int i; | 209 | unsigned int i; |
209 | 210 | ||
211 | if (skip_ioapic_setup) { | ||
212 | char *m = (max_cpus == 0) ? | ||
213 | "The nosmp parameter is incompatible with Xen; " \ | ||
214 | "use Xen dom0_max_vcpus=1 parameter" : | ||
215 | "The noapic parameter is incompatible with Xen"; | ||
216 | |||
217 | xen_raw_printk(m); | ||
218 | panic(m); | ||
219 | } | ||
210 | xen_init_lock_cpu(0); | 220 | xen_init_lock_cpu(0); |
211 | 221 | ||
212 | smp_store_cpu_info(0); | 222 | smp_store_cpu_info(0); |
@@ -522,7 +532,6 @@ static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus) | |||
522 | WARN_ON(xen_smp_intr_init(0)); | 532 | WARN_ON(xen_smp_intr_init(0)); |
523 | 533 | ||
524 | xen_init_lock_cpu(0); | 534 | xen_init_lock_cpu(0); |
525 | xen_init_spinlocks(); | ||
526 | } | 535 | } |
527 | 536 | ||
528 | static int __cpuinit xen_hvm_cpu_up(unsigned int cpu) | 537 | static int __cpuinit xen_hvm_cpu_up(unsigned int cpu) |
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index 5158c505bef9..163b4679556e 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c | |||
@@ -168,9 +168,10 @@ cycle_t xen_clocksource_read(void) | |||
168 | struct pvclock_vcpu_time_info *src; | 168 | struct pvclock_vcpu_time_info *src; |
169 | cycle_t ret; | 169 | cycle_t ret; |
170 | 170 | ||
171 | src = &get_cpu_var(xen_vcpu)->time; | 171 | preempt_disable_notrace(); |
172 | src = &__get_cpu_var(xen_vcpu)->time; | ||
172 | ret = pvclock_clocksource_read(src); | 173 | ret = pvclock_clocksource_read(src); |
173 | put_cpu_var(xen_vcpu); | 174 | preempt_enable_notrace(); |
174 | return ret; | 175 | return ret; |
175 | } | 176 | } |
176 | 177 | ||
diff --git a/arch/x86/xen/xen-asm_32.S b/arch/x86/xen/xen-asm_32.S index 22a2093b5862..b040b0e518ca 100644 --- a/arch/x86/xen/xen-asm_32.S +++ b/arch/x86/xen/xen-asm_32.S | |||
@@ -113,11 +113,13 @@ xen_iret_start_crit: | |||
113 | 113 | ||
114 | /* | 114 | /* |
115 | * If there's something pending, mask events again so we can | 115 | * If there's something pending, mask events again so we can |
116 | * jump back into xen_hypervisor_callback | 116 | * jump back into xen_hypervisor_callback. Otherwise do not |
117 | * touch XEN_vcpu_info_mask. | ||
117 | */ | 118 | */ |
118 | sete XEN_vcpu_info_mask(%eax) | 119 | jne 1f |
120 | movb $1, XEN_vcpu_info_mask(%eax) | ||
119 | 121 | ||
120 | popl %eax | 122 | 1: popl %eax |
121 | 123 | ||
122 | /* | 124 | /* |
123 | * From this point on the registers are restored and the stack | 125 | * From this point on the registers are restored and the stack |