diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-04-14 17:28:32 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-04-14 17:28:32 -0400 |
| commit | 4b2f8838479eb2abe042e094f7d2cced6d5ea772 (patch) | |
| tree | 5ef3236b354a494c8d71a572896283e44989c696 /arch | |
| parent | c848791f0336914a3081ea3fe029cf177d81de81 (diff) | |
| parent | 9fd85eb502a78bd812db58bd1f668b2a06ee30a5 (diff) | |
Merge branch 'devel-stable' into for-next
Diffstat (limited to 'arch')
172 files changed, 2138 insertions, 758 deletions
diff --git a/arch/arc/include/asm/processor.h b/arch/arc/include/asm/processor.h index 4e547296831d..52312cb5dbe2 100644 --- a/arch/arc/include/asm/processor.h +++ b/arch/arc/include/asm/processor.h | |||
| @@ -47,9 +47,6 @@ struct thread_struct { | |||
| 47 | /* Forward declaration, a strange C thing */ | 47 | /* Forward declaration, a strange C thing */ |
| 48 | struct task_struct; | 48 | struct task_struct; |
| 49 | 49 | ||
| 50 | /* Return saved PC of a blocked thread */ | ||
| 51 | unsigned long thread_saved_pc(struct task_struct *t); | ||
| 52 | |||
| 53 | #define task_pt_regs(p) \ | 50 | #define task_pt_regs(p) \ |
| 54 | ((struct pt_regs *)(THREAD_SIZE + (void *)task_stack_page(p)) - 1) | 51 | ((struct pt_regs *)(THREAD_SIZE + (void *)task_stack_page(p)) - 1) |
| 55 | 52 | ||
| @@ -72,18 +69,21 @@ unsigned long thread_saved_pc(struct task_struct *t); | |||
| 72 | #define release_segments(mm) do { } while (0) | 69 | #define release_segments(mm) do { } while (0) |
| 73 | 70 | ||
| 74 | #define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret) | 71 | #define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret) |
| 72 | #define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp) | ||
| 75 | 73 | ||
| 76 | /* | 74 | /* |
| 77 | * Where abouts of Task's sp, fp, blink when it was last seen in kernel mode. | 75 | * Where abouts of Task's sp, fp, blink when it was last seen in kernel mode. |
| 78 | * Look in process.c for details of kernel stack layout | 76 | * Look in process.c for details of kernel stack layout |
| 79 | */ | 77 | */ |
| 80 | #define KSTK_ESP(tsk) (tsk->thread.ksp) | 78 | #define TSK_K_ESP(tsk) (tsk->thread.ksp) |
| 81 | 79 | ||
| 82 | #define KSTK_REG(tsk, off) (*((unsigned int *)(KSTK_ESP(tsk) + \ | 80 | #define TSK_K_REG(tsk, off) (*((unsigned int *)(TSK_K_ESP(tsk) + \ |
| 83 | sizeof(struct callee_regs) + off))) | 81 | sizeof(struct callee_regs) + off))) |
| 84 | 82 | ||
| 85 | #define KSTK_BLINK(tsk) KSTK_REG(tsk, 4) | 83 | #define TSK_K_BLINK(tsk) TSK_K_REG(tsk, 4) |
| 86 | #define KSTK_FP(tsk) KSTK_REG(tsk, 0) | 84 | #define TSK_K_FP(tsk) TSK_K_REG(tsk, 0) |
| 85 | |||
| 86 | #define thread_saved_pc(tsk) TSK_K_BLINK(tsk) | ||
| 87 | 87 | ||
| 88 | extern void start_thread(struct pt_regs * regs, unsigned long pc, | 88 | extern void start_thread(struct pt_regs * regs, unsigned long pc, |
| 89 | unsigned long usp); | 89 | unsigned long usp); |
diff --git a/arch/arc/include/asm/stacktrace.h b/arch/arc/include/asm/stacktrace.h new file mode 100644 index 000000000000..b29b6064ea14 --- /dev/null +++ b/arch/arc/include/asm/stacktrace.h | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) | ||
| 3 | * Copyright (C) 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License version 2 as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef __ASM_STACKTRACE_H | ||
| 11 | #define __ASM_STACKTRACE_H | ||
| 12 | |||
| 13 | #include <linux/sched.h> | ||
| 14 | |||
| 15 | /** | ||
| 16 | * arc_unwind_core - Unwind the kernel mode stack for an execution context | ||
| 17 | * @tsk: NULL for current task, specific task otherwise | ||
| 18 | * @regs: pt_regs used to seed the unwinder {SP, FP, BLINK, PC} | ||
| 19 | * If NULL, use pt_regs of @tsk (if !NULL) otherwise | ||
| 20 | * use the current values of {SP, FP, BLINK, PC} | ||
| 21 | * @consumer_fn: Callback invoked for each frame unwound | ||
| 22 | * Returns 0 to continue unwinding, -1 to stop | ||
| 23 | * @arg: Arg to callback | ||
| 24 | * | ||
| 25 | * Returns the address of first function in stack | ||
| 26 | * | ||
| 27 | * Semantics: | ||
| 28 | * - synchronous unwinding (e.g. dump_stack): @tsk NULL, @regs NULL | ||
| 29 | * - Asynchronous unwinding of sleeping task: @tsk !NULL, @regs NULL | ||
| 30 | * - Asynchronous unwinding of intr/excp etc: @tsk !NULL, @regs !NULL | ||
| 31 | */ | ||
| 32 | notrace noinline unsigned int arc_unwind_core( | ||
| 33 | struct task_struct *tsk, struct pt_regs *regs, | ||
| 34 | int (*consumer_fn) (unsigned int, void *), | ||
| 35 | void *arg); | ||
| 36 | |||
| 37 | #endif /* __ASM_STACKTRACE_H */ | ||
diff --git a/arch/arc/kernel/process.c b/arch/arc/kernel/process.c index fdd89715d2d3..98c00a2d4dd9 100644 --- a/arch/arc/kernel/process.c +++ b/arch/arc/kernel/process.c | |||
| @@ -192,29 +192,6 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu) | |||
| 192 | return 0; | 192 | return 0; |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | /* | ||
| 196 | * API: expected by schedular Code: If thread is sleeping where is that. | ||
| 197 | * What is this good for? it will be always the scheduler or ret_from_fork. | ||
| 198 | * So we hard code that anyways. | ||
| 199 | */ | ||
| 200 | unsigned long thread_saved_pc(struct task_struct *t) | ||
| 201 | { | ||
| 202 | struct pt_regs *regs = task_pt_regs(t); | ||
| 203 | unsigned long blink = 0; | ||
| 204 | |||
| 205 | /* | ||
| 206 | * If the thread being queried for in not itself calling this, then it | ||
| 207 | * implies it is not executing, which in turn implies it is sleeping, | ||
| 208 | * which in turn implies it got switched OUT by the schedular. | ||
| 209 | * In that case, it's kernel mode blink can reliably retrieved as per | ||
| 210 | * the picture above (right above pt_regs). | ||
| 211 | */ | ||
| 212 | if (t != current && t->state != TASK_RUNNING) | ||
| 213 | blink = *((unsigned int *)regs - 1); | ||
| 214 | |||
| 215 | return blink; | ||
| 216 | } | ||
| 217 | |||
| 218 | int elf_check_arch(const struct elf32_hdr *x) | 195 | int elf_check_arch(const struct elf32_hdr *x) |
| 219 | { | 196 | { |
| 220 | unsigned int eflags; | 197 | unsigned int eflags; |
diff --git a/arch/arc/kernel/stacktrace.c b/arch/arc/kernel/stacktrace.c index 9ce47cfe2303..92320d6f737c 100644 --- a/arch/arc/kernel/stacktrace.c +++ b/arch/arc/kernel/stacktrace.c | |||
| @@ -43,6 +43,10 @@ static void seed_unwind_frame_info(struct task_struct *tsk, | |||
| 43 | struct pt_regs *regs, | 43 | struct pt_regs *regs, |
| 44 | struct unwind_frame_info *frame_info) | 44 | struct unwind_frame_info *frame_info) |
| 45 | { | 45 | { |
| 46 | /* | ||
| 47 | * synchronous unwinding (e.g. dump_stack) | ||
| 48 | * - uses current values of SP and friends | ||
| 49 | */ | ||
| 46 | if (tsk == NULL && regs == NULL) { | 50 | if (tsk == NULL && regs == NULL) { |
| 47 | unsigned long fp, sp, blink, ret; | 51 | unsigned long fp, sp, blink, ret; |
| 48 | frame_info->task = current; | 52 | frame_info->task = current; |
| @@ -61,12 +65,17 @@ static void seed_unwind_frame_info(struct task_struct *tsk, | |||
| 61 | frame_info->regs.r63 = ret; | 65 | frame_info->regs.r63 = ret; |
| 62 | frame_info->call_frame = 0; | 66 | frame_info->call_frame = 0; |
| 63 | } else if (regs == NULL) { | 67 | } else if (regs == NULL) { |
| 68 | /* | ||
| 69 | * Asynchronous unwinding of sleeping task | ||
| 70 | * - Gets SP etc from task's pt_regs (saved bottom of kernel | ||
| 71 | * mode stack of task) | ||
| 72 | */ | ||
| 64 | 73 | ||
| 65 | frame_info->task = tsk; | 74 | frame_info->task = tsk; |
| 66 | 75 | ||
| 67 | frame_info->regs.r27 = KSTK_FP(tsk); | 76 | frame_info->regs.r27 = TSK_K_FP(tsk); |
| 68 | frame_info->regs.r28 = KSTK_ESP(tsk); | 77 | frame_info->regs.r28 = TSK_K_ESP(tsk); |
| 69 | frame_info->regs.r31 = KSTK_BLINK(tsk); | 78 | frame_info->regs.r31 = TSK_K_BLINK(tsk); |
| 70 | frame_info->regs.r63 = (unsigned int)__switch_to; | 79 | frame_info->regs.r63 = (unsigned int)__switch_to; |
| 71 | 80 | ||
| 72 | /* In the prologue of __switch_to, first FP is saved on stack | 81 | /* In the prologue of __switch_to, first FP is saved on stack |
| @@ -83,6 +92,10 @@ static void seed_unwind_frame_info(struct task_struct *tsk, | |||
| 83 | frame_info->call_frame = 0; | 92 | frame_info->call_frame = 0; |
| 84 | 93 | ||
| 85 | } else { | 94 | } else { |
| 95 | /* | ||
| 96 | * Asynchronous unwinding of intr/exception | ||
| 97 | * - Just uses the pt_regs passed | ||
| 98 | */ | ||
| 86 | frame_info->task = tsk; | 99 | frame_info->task = tsk; |
| 87 | 100 | ||
| 88 | frame_info->regs.r27 = regs->fp; | 101 | frame_info->regs.r27 = regs->fp; |
| @@ -95,7 +108,7 @@ static void seed_unwind_frame_info(struct task_struct *tsk, | |||
| 95 | 108 | ||
| 96 | #endif | 109 | #endif |
| 97 | 110 | ||
| 98 | static noinline unsigned int | 111 | notrace noinline unsigned int |
| 99 | arc_unwind_core(struct task_struct *tsk, struct pt_regs *regs, | 112 | arc_unwind_core(struct task_struct *tsk, struct pt_regs *regs, |
| 100 | int (*consumer_fn) (unsigned int, void *), void *arg) | 113 | int (*consumer_fn) (unsigned int, void *), void *arg) |
| 101 | { | 114 | { |
diff --git a/arch/arc/kernel/unaligned.c b/arch/arc/kernel/unaligned.c index 7ff5b5c183bb..74db59b6f392 100644 --- a/arch/arc/kernel/unaligned.c +++ b/arch/arc/kernel/unaligned.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
| 15 | #include <linux/perf_event.h> | ||
| 15 | #include <linux/ptrace.h> | 16 | #include <linux/ptrace.h> |
| 16 | #include <linux/uaccess.h> | 17 | #include <linux/uaccess.h> |
| 17 | #include <asm/disasm.h> | 18 | #include <asm/disasm.h> |
| @@ -253,6 +254,7 @@ int misaligned_fixup(unsigned long address, struct pt_regs *regs, | |||
| 253 | } | 254 | } |
| 254 | } | 255 | } |
| 255 | 256 | ||
| 257 | perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, address); | ||
| 256 | return 0; | 258 | return 0; |
| 257 | 259 | ||
| 258 | fault: | 260 | fault: |
diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c index 563cb27e37f5..6a2e006cbcce 100644 --- a/arch/arc/mm/fault.c +++ b/arch/arc/mm/fault.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/ptrace.h> | 14 | #include <linux/ptrace.h> |
| 15 | #include <linux/uaccess.h> | 15 | #include <linux/uaccess.h> |
| 16 | #include <linux/kdebug.h> | 16 | #include <linux/kdebug.h> |
| 17 | #include <linux/perf_event.h> | ||
| 17 | #include <asm/pgalloc.h> | 18 | #include <asm/pgalloc.h> |
| 18 | #include <asm/mmu.h> | 19 | #include <asm/mmu.h> |
| 19 | 20 | ||
| @@ -139,13 +140,20 @@ good_area: | |||
| 139 | return; | 140 | return; |
| 140 | } | 141 | } |
| 141 | 142 | ||
| 143 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); | ||
| 144 | |||
| 142 | if (likely(!(fault & VM_FAULT_ERROR))) { | 145 | if (likely(!(fault & VM_FAULT_ERROR))) { |
| 143 | if (flags & FAULT_FLAG_ALLOW_RETRY) { | 146 | if (flags & FAULT_FLAG_ALLOW_RETRY) { |
| 144 | /* To avoid updating stats twice for retry case */ | 147 | /* To avoid updating stats twice for retry case */ |
| 145 | if (fault & VM_FAULT_MAJOR) | 148 | if (fault & VM_FAULT_MAJOR) { |
| 146 | tsk->maj_flt++; | 149 | tsk->maj_flt++; |
| 147 | else | 150 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, |
| 151 | regs, address); | ||
| 152 | } else { | ||
| 148 | tsk->min_flt++; | 153 | tsk->min_flt++; |
| 154 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, | ||
| 155 | regs, address); | ||
| 156 | } | ||
| 149 | 157 | ||
| 150 | if (fault & VM_FAULT_RETRY) { | 158 | if (fault & VM_FAULT_RETRY) { |
| 151 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | 159 | flags &= ~FAULT_FLAG_ALLOW_RETRY; |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index e9d1fd6067c6..5575d9fa8806 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
| @@ -150,6 +150,7 @@ machine-$(CONFIG_ARCH_BERLIN) += berlin | |||
| 150 | machine-$(CONFIG_ARCH_CLPS711X) += clps711x | 150 | machine-$(CONFIG_ARCH_CLPS711X) += clps711x |
| 151 | machine-$(CONFIG_ARCH_CNS3XXX) += cns3xxx | 151 | machine-$(CONFIG_ARCH_CNS3XXX) += cns3xxx |
| 152 | machine-$(CONFIG_ARCH_DAVINCI) += davinci | 152 | machine-$(CONFIG_ARCH_DAVINCI) += davinci |
| 153 | machine-$(CONFIG_ARCH_DIGICOLOR) += digicolor | ||
| 153 | machine-$(CONFIG_ARCH_DOVE) += dove | 154 | machine-$(CONFIG_ARCH_DOVE) += dove |
| 154 | machine-$(CONFIG_ARCH_EBSA110) += ebsa110 | 155 | machine-$(CONFIG_ARCH_EBSA110) += ebsa110 |
| 155 | machine-$(CONFIG_ARCH_EFM32) += efm32 | 156 | machine-$(CONFIG_ARCH_EFM32) += efm32 |
diff --git a/arch/arm/boot/dts/am335x-bone-common.dtsi b/arch/arm/boot/dts/am335x-bone-common.dtsi index 6cc25ed912ee..c3255e0c90aa 100644 --- a/arch/arm/boot/dts/am335x-bone-common.dtsi +++ b/arch/arm/boot/dts/am335x-bone-common.dtsi | |||
| @@ -195,6 +195,7 @@ | |||
| 195 | 195 | ||
| 196 | &usb0 { | 196 | &usb0 { |
| 197 | status = "okay"; | 197 | status = "okay"; |
| 198 | dr_mode = "peripheral"; | ||
| 198 | }; | 199 | }; |
| 199 | 200 | ||
| 200 | &usb1 { | 201 | &usb1 { |
| @@ -300,3 +301,11 @@ | |||
| 300 | cd-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>; | 301 | cd-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>; |
| 301 | cd-inverted; | 302 | cd-inverted; |
| 302 | }; | 303 | }; |
| 304 | |||
| 305 | &aes { | ||
| 306 | status = "okay"; | ||
| 307 | }; | ||
| 308 | |||
| 309 | &sham { | ||
| 310 | status = "okay"; | ||
| 311 | }; | ||
diff --git a/arch/arm/boot/dts/am335x-bone.dts b/arch/arm/boot/dts/am335x-bone.dts index 83d40f7655e5..6b8493720424 100644 --- a/arch/arm/boot/dts/am335x-bone.dts +++ b/arch/arm/boot/dts/am335x-bone.dts | |||
| @@ -24,11 +24,3 @@ | |||
| 24 | &mmc1 { | 24 | &mmc1 { |
| 25 | vmmc-supply = <&ldo3_reg>; | 25 | vmmc-supply = <&ldo3_reg>; |
| 26 | }; | 26 | }; |
| 27 | |||
| 28 | &sham { | ||
| 29 | status = "okay"; | ||
| 30 | }; | ||
| 31 | |||
| 32 | &aes { | ||
| 33 | status = "okay"; | ||
| 34 | }; | ||
diff --git a/arch/arm/boot/dts/am335x-lxm.dts b/arch/arm/boot/dts/am335x-lxm.dts index 7266a00aab2e..5c5667a3624d 100644 --- a/arch/arm/boot/dts/am335x-lxm.dts +++ b/arch/arm/boot/dts/am335x-lxm.dts | |||
| @@ -328,6 +328,10 @@ | |||
| 328 | dual_emac_res_vlan = <3>; | 328 | dual_emac_res_vlan = <3>; |
| 329 | }; | 329 | }; |
| 330 | 330 | ||
| 331 | &phy_sel { | ||
| 332 | rmii-clock-ext; | ||
| 333 | }; | ||
| 334 | |||
| 331 | &mac { | 335 | &mac { |
| 332 | pinctrl-names = "default", "sleep"; | 336 | pinctrl-names = "default", "sleep"; |
| 333 | pinctrl-0 = <&cpsw_default>; | 337 | pinctrl-0 = <&cpsw_default>; |
diff --git a/arch/arm/boot/dts/am33xx-clocks.dtsi b/arch/arm/boot/dts/am33xx-clocks.dtsi index 712edce7d6fb..071b56aa0c7e 100644 --- a/arch/arm/boot/dts/am33xx-clocks.dtsi +++ b/arch/arm/boot/dts/am33xx-clocks.dtsi | |||
| @@ -99,7 +99,7 @@ | |||
| 99 | ehrpwm0_tbclk: ehrpwm0_tbclk@44e10664 { | 99 | ehrpwm0_tbclk: ehrpwm0_tbclk@44e10664 { |
| 100 | #clock-cells = <0>; | 100 | #clock-cells = <0>; |
| 101 | compatible = "ti,gate-clock"; | 101 | compatible = "ti,gate-clock"; |
| 102 | clocks = <&dpll_per_m2_ck>; | 102 | clocks = <&l4ls_gclk>; |
| 103 | ti,bit-shift = <0>; | 103 | ti,bit-shift = <0>; |
| 104 | reg = <0x0664>; | 104 | reg = <0x0664>; |
| 105 | }; | 105 | }; |
| @@ -107,7 +107,7 @@ | |||
| 107 | ehrpwm1_tbclk: ehrpwm1_tbclk@44e10664 { | 107 | ehrpwm1_tbclk: ehrpwm1_tbclk@44e10664 { |
| 108 | #clock-cells = <0>; | 108 | #clock-cells = <0>; |
| 109 | compatible = "ti,gate-clock"; | 109 | compatible = "ti,gate-clock"; |
| 110 | clocks = <&dpll_per_m2_ck>; | 110 | clocks = <&l4ls_gclk>; |
| 111 | ti,bit-shift = <1>; | 111 | ti,bit-shift = <1>; |
| 112 | reg = <0x0664>; | 112 | reg = <0x0664>; |
| 113 | }; | 113 | }; |
| @@ -115,7 +115,7 @@ | |||
| 115 | ehrpwm2_tbclk: ehrpwm2_tbclk@44e10664 { | 115 | ehrpwm2_tbclk: ehrpwm2_tbclk@44e10664 { |
| 116 | #clock-cells = <0>; | 116 | #clock-cells = <0>; |
| 117 | compatible = "ti,gate-clock"; | 117 | compatible = "ti,gate-clock"; |
| 118 | clocks = <&dpll_per_m2_ck>; | 118 | clocks = <&l4ls_gclk>; |
| 119 | ti,bit-shift = <2>; | 119 | ti,bit-shift = <2>; |
| 120 | reg = <0x0664>; | 120 | reg = <0x0664>; |
| 121 | }; | 121 | }; |
diff --git a/arch/arm/boot/dts/am437x-idk-evm.dts b/arch/arm/boot/dts/am437x-idk-evm.dts index f9a17e2ca8cb..0198f5a62b96 100644 --- a/arch/arm/boot/dts/am437x-idk-evm.dts +++ b/arch/arm/boot/dts/am437x-idk-evm.dts | |||
| @@ -133,20 +133,6 @@ | |||
| 133 | >; | 133 | >; |
| 134 | }; | 134 | }; |
| 135 | 135 | ||
| 136 | i2c1_pins_default: i2c1_pins_default { | ||
| 137 | pinctrl-single,pins = < | ||
| 138 | 0x15c (PIN_INPUT | SLEWCTRL_FAST | MUX_MODE2) /* spi0_cs0.i2c1_scl */ | ||
| 139 | 0x158 (PIN_INPUT | SLEWCTRL_FAST | MUX_MODE2) /* spi0_d1.i2c1_sda */ | ||
| 140 | >; | ||
| 141 | }; | ||
| 142 | |||
| 143 | i2c1_pins_sleep: i2c1_pins_sleep { | ||
| 144 | pinctrl-single,pins = < | ||
| 145 | 0x15c (PIN_INPUT_PULLDOWN | MUX_MODE7) /* spi0_cs0.i2c1_scl */ | ||
| 146 | 0x158 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* spi0_d1.i2c1_sda */ | ||
| 147 | >; | ||
| 148 | }; | ||
| 149 | |||
| 150 | mmc1_pins_default: pinmux_mmc1_pins_default { | 136 | mmc1_pins_default: pinmux_mmc1_pins_default { |
| 151 | pinctrl-single,pins = < | 137 | pinctrl-single,pins = < |
| 152 | 0x100 (PIN_INPUT | MUX_MODE0) /* mmc0_clk.mmc0_clk */ | 138 | 0x100 (PIN_INPUT | MUX_MODE0) /* mmc0_clk.mmc0_clk */ |
| @@ -254,7 +240,7 @@ | |||
| 254 | status = "okay"; | 240 | status = "okay"; |
| 255 | pinctrl-names = "default", "sleep"; | 241 | pinctrl-names = "default", "sleep"; |
| 256 | pinctrl-0 = <&i2c0_pins_default>; | 242 | pinctrl-0 = <&i2c0_pins_default>; |
| 257 | pinctrl-1 = <&i2c0_pins_default>; | 243 | pinctrl-1 = <&i2c0_pins_sleep>; |
| 258 | clock-frequency = <400000>; | 244 | clock-frequency = <400000>; |
| 259 | 245 | ||
| 260 | at24@50 { | 246 | at24@50 { |
| @@ -262,17 +248,10 @@ | |||
| 262 | pagesize = <64>; | 248 | pagesize = <64>; |
| 263 | reg = <0x50>; | 249 | reg = <0x50>; |
| 264 | }; | 250 | }; |
| 265 | }; | ||
| 266 | |||
| 267 | &i2c1 { | ||
| 268 | status = "okay"; | ||
| 269 | pinctrl-names = "default", "sleep"; | ||
| 270 | pinctrl-0 = <&i2c1_pins_default>; | ||
| 271 | pinctrl-1 = <&i2c1_pins_default>; | ||
| 272 | clock-frequency = <400000>; | ||
| 273 | 251 | ||
| 274 | tps: tps62362@60 { | 252 | tps: tps62362@60 { |
| 275 | compatible = "ti,tps62362"; | 253 | compatible = "ti,tps62362"; |
| 254 | reg = <0x60>; | ||
| 276 | regulator-name = "VDD_MPU"; | 255 | regulator-name = "VDD_MPU"; |
| 277 | regulator-min-microvolt = <950000>; | 256 | regulator-min-microvolt = <950000>; |
| 278 | regulator-max-microvolt = <1330000>; | 257 | regulator-max-microvolt = <1330000>; |
diff --git a/arch/arm/boot/dts/am43xx-clocks.dtsi b/arch/arm/boot/dts/am43xx-clocks.dtsi index c7dc9dab93a4..cfb49686ab6a 100644 --- a/arch/arm/boot/dts/am43xx-clocks.dtsi +++ b/arch/arm/boot/dts/am43xx-clocks.dtsi | |||
| @@ -107,7 +107,7 @@ | |||
| 107 | ehrpwm0_tbclk: ehrpwm0_tbclk { | 107 | ehrpwm0_tbclk: ehrpwm0_tbclk { |
| 108 | #clock-cells = <0>; | 108 | #clock-cells = <0>; |
| 109 | compatible = "ti,gate-clock"; | 109 | compatible = "ti,gate-clock"; |
| 110 | clocks = <&dpll_per_m2_ck>; | 110 | clocks = <&l4ls_gclk>; |
| 111 | ti,bit-shift = <0>; | 111 | ti,bit-shift = <0>; |
| 112 | reg = <0x0664>; | 112 | reg = <0x0664>; |
| 113 | }; | 113 | }; |
| @@ -115,7 +115,7 @@ | |||
| 115 | ehrpwm1_tbclk: ehrpwm1_tbclk { | 115 | ehrpwm1_tbclk: ehrpwm1_tbclk { |
| 116 | #clock-cells = <0>; | 116 | #clock-cells = <0>; |
| 117 | compatible = "ti,gate-clock"; | 117 | compatible = "ti,gate-clock"; |
| 118 | clocks = <&dpll_per_m2_ck>; | 118 | clocks = <&l4ls_gclk>; |
| 119 | ti,bit-shift = <1>; | 119 | ti,bit-shift = <1>; |
| 120 | reg = <0x0664>; | 120 | reg = <0x0664>; |
| 121 | }; | 121 | }; |
| @@ -123,7 +123,7 @@ | |||
| 123 | ehrpwm2_tbclk: ehrpwm2_tbclk { | 123 | ehrpwm2_tbclk: ehrpwm2_tbclk { |
| 124 | #clock-cells = <0>; | 124 | #clock-cells = <0>; |
| 125 | compatible = "ti,gate-clock"; | 125 | compatible = "ti,gate-clock"; |
| 126 | clocks = <&dpll_per_m2_ck>; | 126 | clocks = <&l4ls_gclk>; |
| 127 | ti,bit-shift = <2>; | 127 | ti,bit-shift = <2>; |
| 128 | reg = <0x0664>; | 128 | reg = <0x0664>; |
| 129 | }; | 129 | }; |
| @@ -131,7 +131,7 @@ | |||
| 131 | ehrpwm3_tbclk: ehrpwm3_tbclk { | 131 | ehrpwm3_tbclk: ehrpwm3_tbclk { |
| 132 | #clock-cells = <0>; | 132 | #clock-cells = <0>; |
| 133 | compatible = "ti,gate-clock"; | 133 | compatible = "ti,gate-clock"; |
| 134 | clocks = <&dpll_per_m2_ck>; | 134 | clocks = <&l4ls_gclk>; |
| 135 | ti,bit-shift = <4>; | 135 | ti,bit-shift = <4>; |
| 136 | reg = <0x0664>; | 136 | reg = <0x0664>; |
| 137 | }; | 137 | }; |
| @@ -139,7 +139,7 @@ | |||
| 139 | ehrpwm4_tbclk: ehrpwm4_tbclk { | 139 | ehrpwm4_tbclk: ehrpwm4_tbclk { |
| 140 | #clock-cells = <0>; | 140 | #clock-cells = <0>; |
| 141 | compatible = "ti,gate-clock"; | 141 | compatible = "ti,gate-clock"; |
| 142 | clocks = <&dpll_per_m2_ck>; | 142 | clocks = <&l4ls_gclk>; |
| 143 | ti,bit-shift = <5>; | 143 | ti,bit-shift = <5>; |
| 144 | reg = <0x0664>; | 144 | reg = <0x0664>; |
| 145 | }; | 145 | }; |
| @@ -147,7 +147,7 @@ | |||
| 147 | ehrpwm5_tbclk: ehrpwm5_tbclk { | 147 | ehrpwm5_tbclk: ehrpwm5_tbclk { |
| 148 | #clock-cells = <0>; | 148 | #clock-cells = <0>; |
| 149 | compatible = "ti,gate-clock"; | 149 | compatible = "ti,gate-clock"; |
| 150 | clocks = <&dpll_per_m2_ck>; | 150 | clocks = <&l4ls_gclk>; |
| 151 | ti,bit-shift = <6>; | 151 | ti,bit-shift = <6>; |
| 152 | reg = <0x0664>; | 152 | reg = <0x0664>; |
| 153 | }; | 153 | }; |
diff --git a/arch/arm/boot/dts/am57xx-beagle-x15.dts b/arch/arm/boot/dts/am57xx-beagle-x15.dts index 03750af3b49a..6463f9ef2b54 100644 --- a/arch/arm/boot/dts/am57xx-beagle-x15.dts +++ b/arch/arm/boot/dts/am57xx-beagle-x15.dts | |||
| @@ -549,14 +549,6 @@ | |||
| 549 | pinctrl-0 = <&usb1_pins>; | 549 | pinctrl-0 = <&usb1_pins>; |
| 550 | }; | 550 | }; |
| 551 | 551 | ||
| 552 | &omap_dwc3_1 { | ||
| 553 | extcon = <&extcon_usb1>; | ||
| 554 | }; | ||
| 555 | |||
| 556 | &omap_dwc3_2 { | ||
| 557 | extcon = <&extcon_usb2>; | ||
| 558 | }; | ||
| 559 | |||
| 560 | &usb2 { | 552 | &usb2 { |
| 561 | dr_mode = "peripheral"; | 553 | dr_mode = "peripheral"; |
| 562 | }; | 554 | }; |
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index fff0ee69aab4..e7f0a4ae271c 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi | |||
| @@ -494,12 +494,12 @@ | |||
| 494 | 494 | ||
| 495 | pinctrl_usart3_rts: usart3_rts-0 { | 495 | pinctrl_usart3_rts: usart3_rts-0 { |
| 496 | atmel,pins = | 496 | atmel,pins = |
| 497 | <AT91_PIOB 8 AT91_PERIPH_B AT91_PINCTRL_NONE>; /* PC8 periph B */ | 497 | <AT91_PIOC 8 AT91_PERIPH_B AT91_PINCTRL_NONE>; |
| 498 | }; | 498 | }; |
| 499 | 499 | ||
| 500 | pinctrl_usart3_cts: usart3_cts-0 { | 500 | pinctrl_usart3_cts: usart3_cts-0 { |
| 501 | atmel,pins = | 501 | atmel,pins = |
| 502 | <AT91_PIOB 10 AT91_PERIPH_B AT91_PINCTRL_NONE>; /* PC10 periph B */ | 502 | <AT91_PIOC 10 AT91_PERIPH_B AT91_PINCTRL_NONE>; |
| 503 | }; | 503 | }; |
| 504 | }; | 504 | }; |
| 505 | 505 | ||
| @@ -853,7 +853,7 @@ | |||
| 853 | }; | 853 | }; |
| 854 | 854 | ||
| 855 | usb1: gadget@fffa4000 { | 855 | usb1: gadget@fffa4000 { |
| 856 | compatible = "atmel,at91rm9200-udc"; | 856 | compatible = "atmel,at91sam9260-udc"; |
| 857 | reg = <0xfffa4000 0x4000>; | 857 | reg = <0xfffa4000 0x4000>; |
| 858 | interrupts = <10 IRQ_TYPE_LEVEL_HIGH 2>; | 858 | interrupts = <10 IRQ_TYPE_LEVEL_HIGH 2>; |
| 859 | clocks = <&udc_clk>, <&udpck>; | 859 | clocks = <&udc_clk>, <&udpck>; |
| @@ -976,7 +976,6 @@ | |||
| 976 | atmel,watchdog-type = "hardware"; | 976 | atmel,watchdog-type = "hardware"; |
| 977 | atmel,reset-type = "all"; | 977 | atmel,reset-type = "all"; |
| 978 | atmel,dbg-halt; | 978 | atmel,dbg-halt; |
| 979 | atmel,idle-halt; | ||
| 980 | status = "disabled"; | 979 | status = "disabled"; |
| 981 | }; | 980 | }; |
| 982 | 981 | ||
diff --git a/arch/arm/boot/dts/at91sam9261.dtsi b/arch/arm/boot/dts/at91sam9261.dtsi index e247b0b5fdab..d55fdf2487ef 100644 --- a/arch/arm/boot/dts/at91sam9261.dtsi +++ b/arch/arm/boot/dts/at91sam9261.dtsi | |||
| @@ -124,11 +124,12 @@ | |||
| 124 | }; | 124 | }; |
| 125 | 125 | ||
| 126 | usb1: gadget@fffa4000 { | 126 | usb1: gadget@fffa4000 { |
| 127 | compatible = "atmel,at91rm9200-udc"; | 127 | compatible = "atmel,at91sam9261-udc"; |
| 128 | reg = <0xfffa4000 0x4000>; | 128 | reg = <0xfffa4000 0x4000>; |
| 129 | interrupts = <10 IRQ_TYPE_LEVEL_HIGH 2>; | 129 | interrupts = <10 IRQ_TYPE_LEVEL_HIGH 2>; |
| 130 | clocks = <&usb>, <&udc_clk>, <&udpck>; | 130 | clocks = <&udc_clk>, <&udpck>; |
| 131 | clock-names = "usb_clk", "udc_clk", "udpck"; | 131 | clock-names = "pclk", "hclk"; |
| 132 | atmel,matrix = <&matrix>; | ||
| 132 | status = "disabled"; | 133 | status = "disabled"; |
| 133 | }; | 134 | }; |
| 134 | 135 | ||
| @@ -262,7 +263,7 @@ | |||
| 262 | }; | 263 | }; |
| 263 | 264 | ||
| 264 | matrix: matrix@ffffee00 { | 265 | matrix: matrix@ffffee00 { |
| 265 | compatible = "atmel,at91sam9260-bus-matrix"; | 266 | compatible = "atmel,at91sam9260-bus-matrix", "syscon"; |
| 266 | reg = <0xffffee00 0x200>; | 267 | reg = <0xffffee00 0x200>; |
| 267 | }; | 268 | }; |
| 268 | 269 | ||
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 1f67bb4c144e..fce301c4e9d6 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi | |||
| @@ -69,7 +69,7 @@ | |||
| 69 | 69 | ||
| 70 | sram1: sram@00500000 { | 70 | sram1: sram@00500000 { |
| 71 | compatible = "mmio-sram"; | 71 | compatible = "mmio-sram"; |
| 72 | reg = <0x00300000 0x4000>; | 72 | reg = <0x00500000 0x4000>; |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| 75 | ahb { | 75 | ahb { |
| @@ -856,7 +856,7 @@ | |||
| 856 | }; | 856 | }; |
| 857 | 857 | ||
| 858 | usb1: gadget@fff78000 { | 858 | usb1: gadget@fff78000 { |
| 859 | compatible = "atmel,at91rm9200-udc"; | 859 | compatible = "atmel,at91sam9263-udc"; |
| 860 | reg = <0xfff78000 0x4000>; | 860 | reg = <0xfff78000 0x4000>; |
| 861 | interrupts = <24 IRQ_TYPE_LEVEL_HIGH 2>; | 861 | interrupts = <24 IRQ_TYPE_LEVEL_HIGH 2>; |
| 862 | clocks = <&udc_clk>, <&udpck>; | 862 | clocks = <&udc_clk>, <&udpck>; |
| @@ -905,7 +905,6 @@ | |||
| 905 | atmel,watchdog-type = "hardware"; | 905 | atmel,watchdog-type = "hardware"; |
| 906 | atmel,reset-type = "all"; | 906 | atmel,reset-type = "all"; |
| 907 | atmel,dbg-halt; | 907 | atmel,dbg-halt; |
| 908 | atmel,idle-halt; | ||
| 909 | status = "disabled"; | 908 | status = "disabled"; |
| 910 | }; | 909 | }; |
| 911 | 910 | ||
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index ee80aa9c0759..488af63d5174 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi | |||
| @@ -1116,7 +1116,6 @@ | |||
| 1116 | atmel,watchdog-type = "hardware"; | 1116 | atmel,watchdog-type = "hardware"; |
| 1117 | atmel,reset-type = "all"; | 1117 | atmel,reset-type = "all"; |
| 1118 | atmel,dbg-halt; | 1118 | atmel,dbg-halt; |
| 1119 | atmel,idle-halt; | ||
| 1120 | status = "disabled"; | 1119 | status = "disabled"; |
| 1121 | }; | 1120 | }; |
| 1122 | 1121 | ||
| @@ -1301,7 +1300,7 @@ | |||
| 1301 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; | 1300 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; |
| 1302 | reg = <0x00800000 0x100000>; | 1301 | reg = <0x00800000 0x100000>; |
| 1303 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>; | 1302 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>; |
| 1304 | clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>, <&uhpck>; | 1303 | clocks = <&utmi>, <&uhphs_clk>, <&uhphs_clk>, <&uhpck>; |
| 1305 | clock-names = "usb_clk", "ehci_clk", "hclk", "uhpck"; | 1304 | clock-names = "usb_clk", "ehci_clk", "hclk", "uhpck"; |
| 1306 | status = "disabled"; | 1305 | status = "disabled"; |
| 1307 | }; | 1306 | }; |
diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index c2666a7cb5b1..0c53a375ba99 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi | |||
| @@ -894,7 +894,6 @@ | |||
| 894 | atmel,watchdog-type = "hardware"; | 894 | atmel,watchdog-type = "hardware"; |
| 895 | atmel,reset-type = "all"; | 895 | atmel,reset-type = "all"; |
| 896 | atmel,dbg-halt; | 896 | atmel,dbg-halt; |
| 897 | atmel,idle-halt; | ||
| 898 | status = "disabled"; | 897 | status = "disabled"; |
| 899 | }; | 898 | }; |
| 900 | 899 | ||
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 818dabdd8c0e..d221179d0f1a 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
| @@ -1066,7 +1066,7 @@ | |||
| 1066 | reg = <0x00500000 0x80000 | 1066 | reg = <0x00500000 0x80000 |
| 1067 | 0xf803c000 0x400>; | 1067 | 0xf803c000 0x400>; |
| 1068 | interrupts = <23 IRQ_TYPE_LEVEL_HIGH 0>; | 1068 | interrupts = <23 IRQ_TYPE_LEVEL_HIGH 0>; |
| 1069 | clocks = <&usb>, <&udphs_clk>; | 1069 | clocks = <&utmi>, <&udphs_clk>; |
| 1070 | clock-names = "hclk", "pclk"; | 1070 | clock-names = "hclk", "pclk"; |
| 1071 | status = "disabled"; | 1071 | status = "disabled"; |
| 1072 | 1072 | ||
| @@ -1130,7 +1130,6 @@ | |||
| 1130 | atmel,watchdog-type = "hardware"; | 1130 | atmel,watchdog-type = "hardware"; |
| 1131 | atmel,reset-type = "all"; | 1131 | atmel,reset-type = "all"; |
| 1132 | atmel,dbg-halt; | 1132 | atmel,dbg-halt; |
| 1133 | atmel,idle-halt; | ||
| 1134 | status = "disabled"; | 1133 | status = "disabled"; |
| 1135 | }; | 1134 | }; |
| 1136 | 1135 | ||
| @@ -1186,7 +1185,7 @@ | |||
| 1186 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; | 1185 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; |
| 1187 | reg = <0x00700000 0x100000>; | 1186 | reg = <0x00700000 0x100000>; |
| 1188 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>; | 1187 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>; |
| 1189 | clocks = <&usb>, <&uhphs_clk>, <&uhpck>; | 1188 | clocks = <&utmi>, <&uhphs_clk>, <&uhpck>; |
| 1190 | clock-names = "usb_clk", "ehci_clk", "uhpck"; | 1189 | clock-names = "usb_clk", "ehci_clk", "uhpck"; |
| 1191 | status = "disabled"; | 1190 | status = "disabled"; |
| 1192 | }; | 1191 | }; |
diff --git a/arch/arm/boot/dts/dm8168-evm.dts b/arch/arm/boot/dts/dm8168-evm.dts index 857d0289ad4d..d3a29c1b8417 100644 --- a/arch/arm/boot/dts/dm8168-evm.dts +++ b/arch/arm/boot/dts/dm8168-evm.dts | |||
| @@ -35,6 +35,18 @@ | |||
| 35 | DM816X_IOPAD(0x0aac, PIN_INPUT | MUX_MODE0) /* SPI_D1 */ | 35 | DM816X_IOPAD(0x0aac, PIN_INPUT | MUX_MODE0) /* SPI_D1 */ |
| 36 | >; | 36 | >; |
| 37 | }; | 37 | }; |
| 38 | |||
| 39 | usb0_pins: pinmux_usb0_pins { | ||
| 40 | pinctrl-single,pins = < | ||
| 41 | DM816X_IOPAD(0x0d00, MUX_MODE0) /* USB0_DRVVBUS */ | ||
| 42 | >; | ||
| 43 | }; | ||
| 44 | |||
| 45 | usb1_pins: pinmux_usb0_pins { | ||
| 46 | pinctrl-single,pins = < | ||
| 47 | DM816X_IOPAD(0x0d04, MUX_MODE0) /* USB1_DRVVBUS */ | ||
| 48 | >; | ||
| 49 | }; | ||
| 38 | }; | 50 | }; |
| 39 | 51 | ||
| 40 | &i2c1 { | 52 | &i2c1 { |
| @@ -127,3 +139,16 @@ | |||
| 127 | &mmc1 { | 139 | &mmc1 { |
| 128 | vmmc-supply = <&vmmcsd_fixed>; | 140 | vmmc-supply = <&vmmcsd_fixed>; |
| 129 | }; | 141 | }; |
| 142 | |||
| 143 | /* At least dm8168-evm rev c won't support multipoint, later may */ | ||
| 144 | &usb0 { | ||
| 145 | pinctrl-names = "default"; | ||
| 146 | pinctrl-0 = <&usb0_pins>; | ||
| 147 | mentor,multipoint = <0>; | ||
| 148 | }; | ||
| 149 | |||
| 150 | &usb1 { | ||
| 151 | pinctrl-names = "default"; | ||
| 152 | pinctrl-0 = <&usb1_pins>; | ||
| 153 | mentor,multipoint = <0>; | ||
| 154 | }; | ||
diff --git a/arch/arm/boot/dts/dm816x.dtsi b/arch/arm/boot/dts/dm816x.dtsi index d98d0f7de380..3c97b5f2addc 100644 --- a/arch/arm/boot/dts/dm816x.dtsi +++ b/arch/arm/boot/dts/dm816x.dtsi | |||
| @@ -97,10 +97,31 @@ | |||
| 97 | 97 | ||
| 98 | /* Device Configuration Registers */ | 98 | /* Device Configuration Registers */ |
| 99 | scm_conf: syscon@600 { | 99 | scm_conf: syscon@600 { |
| 100 | compatible = "syscon"; | 100 | compatible = "syscon", "simple-bus"; |
| 101 | reg = <0x600 0x110>; | 101 | reg = <0x600 0x110>; |
| 102 | #address-cells = <1>; | 102 | #address-cells = <1>; |
| 103 | #size-cells = <1>; | 103 | #size-cells = <1>; |
| 104 | ranges = <0 0x600 0x110>; | ||
| 105 | |||
| 106 | usb_phy0: usb-phy@20 { | ||
| 107 | compatible = "ti,dm8168-usb-phy"; | ||
| 108 | reg = <0x20 0x8>; | ||
| 109 | reg-names = "phy"; | ||
| 110 | clocks = <&main_fapll 6>; | ||
| 111 | clock-names = "refclk"; | ||
| 112 | #phy-cells = <0>; | ||
| 113 | syscon = <&scm_conf>; | ||
| 114 | }; | ||
| 115 | |||
| 116 | usb_phy1: usb-phy@28 { | ||
| 117 | compatible = "ti,dm8168-usb-phy"; | ||
| 118 | reg = <0x28 0x8>; | ||
| 119 | reg-names = "phy"; | ||
| 120 | clocks = <&main_fapll 6>; | ||
| 121 | clock-names = "refclk"; | ||
| 122 | #phy-cells = <0>; | ||
| 123 | syscon = <&scm_conf>; | ||
| 124 | }; | ||
| 104 | }; | 125 | }; |
| 105 | 126 | ||
| 106 | scrm_clocks: clocks { | 127 | scrm_clocks: clocks { |
| @@ -357,7 +378,10 @@ | |||
| 357 | reg-names = "mc", "control"; | 378 | reg-names = "mc", "control"; |
| 358 | interrupts = <18>; | 379 | interrupts = <18>; |
| 359 | interrupt-names = "mc"; | 380 | interrupt-names = "mc"; |
| 360 | dr_mode = "otg"; | 381 | dr_mode = "host"; |
| 382 | interface-type = <0>; | ||
| 383 | phys = <&usb_phy0>; | ||
| 384 | phy-names = "usb2-phy"; | ||
| 361 | mentor,multipoint = <1>; | 385 | mentor,multipoint = <1>; |
| 362 | mentor,num-eps = <16>; | 386 | mentor,num-eps = <16>; |
| 363 | mentor,ram-bits = <12>; | 387 | mentor,ram-bits = <12>; |
| @@ -366,13 +390,15 @@ | |||
| 366 | 390 | ||
| 367 | usb1: usb@47401800 { | 391 | usb1: usb@47401800 { |
| 368 | compatible = "ti,musb-am33xx"; | 392 | compatible = "ti,musb-am33xx"; |
| 369 | status = "disabled"; | ||
| 370 | reg = <0x47401c00 0x400 | 393 | reg = <0x47401c00 0x400 |
| 371 | 0x47401800 0x200>; | 394 | 0x47401800 0x200>; |
| 372 | reg-names = "mc", "control"; | 395 | reg-names = "mc", "control"; |
| 373 | interrupts = <19>; | 396 | interrupts = <19>; |
| 374 | interrupt-names = "mc"; | 397 | interrupt-names = "mc"; |
| 375 | dr_mode = "otg"; | 398 | dr_mode = "host"; |
| 399 | interface-type = <0>; | ||
| 400 | phys = <&usb_phy1>; | ||
| 401 | phy-names = "usb2-phy"; | ||
| 376 | mentor,multipoint = <1>; | 402 | mentor,multipoint = <1>; |
| 377 | mentor,num-eps = <16>; | 403 | mentor,num-eps = <16>; |
| 378 | mentor,ram-bits = <12>; | 404 | mentor,ram-bits = <12>; |
diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts index 746cddb1b8f5..7563d7ce01bb 100644 --- a/arch/arm/boot/dts/dra7-evm.dts +++ b/arch/arm/boot/dts/dra7-evm.dts | |||
| @@ -263,17 +263,15 @@ | |||
| 263 | 263 | ||
| 264 | dcan1_pins_default: dcan1_pins_default { | 264 | dcan1_pins_default: dcan1_pins_default { |
| 265 | pinctrl-single,pins = < | 265 | pinctrl-single,pins = < |
| 266 | 0x3d0 (PIN_OUTPUT | MUX_MODE0) /* dcan1_tx */ | 266 | 0x3d0 (PIN_OUTPUT_PULLUP | MUX_MODE0) /* dcan1_tx */ |
| 267 | 0x3d4 (MUX_MODE15) /* dcan1_rx.off */ | 267 | 0x418 (PULL_UP | MUX_MODE1) /* wakeup0.dcan1_rx */ |
| 268 | 0x418 (PULL_DIS | MUX_MODE1) /* wakeup0.dcan1_rx */ | ||
| 269 | >; | 268 | >; |
| 270 | }; | 269 | }; |
| 271 | 270 | ||
| 272 | dcan1_pins_sleep: dcan1_pins_sleep { | 271 | dcan1_pins_sleep: dcan1_pins_sleep { |
| 273 | pinctrl-single,pins = < | 272 | pinctrl-single,pins = < |
| 274 | 0x3d0 (MUX_MODE15) /* dcan1_tx.off */ | 273 | 0x3d0 (MUX_MODE15 | PULL_UP) /* dcan1_tx.off */ |
| 275 | 0x3d4 (MUX_MODE15) /* dcan1_rx.off */ | 274 | 0x418 (MUX_MODE15 | PULL_UP) /* wakeup0.off */ |
| 276 | 0x418 (MUX_MODE15) /* wakeup0.off */ | ||
| 277 | >; | 275 | >; |
| 278 | }; | 276 | }; |
| 279 | }; | 277 | }; |
| @@ -543,14 +541,6 @@ | |||
| 543 | }; | 541 | }; |
| 544 | }; | 542 | }; |
| 545 | 543 | ||
| 546 | &omap_dwc3_1 { | ||
| 547 | extcon = <&extcon_usb1>; | ||
| 548 | }; | ||
| 549 | |||
| 550 | &omap_dwc3_2 { | ||
| 551 | extcon = <&extcon_usb2>; | ||
| 552 | }; | ||
| 553 | |||
| 554 | &usb1 { | 544 | &usb1 { |
| 555 | dr_mode = "peripheral"; | 545 | dr_mode = "peripheral"; |
| 556 | pinctrl-names = "default"; | 546 | pinctrl-names = "default"; |
diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi index 5827fedafd43..127608d79033 100644 --- a/arch/arm/boot/dts/dra7.dtsi +++ b/arch/arm/boot/dts/dra7.dtsi | |||
| @@ -249,8 +249,8 @@ | |||
| 249 | <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, | 249 | <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, |
| 250 | <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; | 250 | <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; |
| 251 | #dma-cells = <1>; | 251 | #dma-cells = <1>; |
| 252 | #dma-channels = <32>; | 252 | dma-channels = <32>; |
| 253 | #dma-requests = <127>; | 253 | dma-requests = <127>; |
| 254 | }; | 254 | }; |
| 255 | 255 | ||
| 256 | gpio1: gpio@4ae10000 { | 256 | gpio1: gpio@4ae10000 { |
| @@ -1090,8 +1090,8 @@ | |||
| 1090 | <0x4A096800 0x40>; /* pll_ctrl */ | 1090 | <0x4A096800 0x40>; /* pll_ctrl */ |
| 1091 | reg-names = "phy_rx", "phy_tx", "pll_ctrl"; | 1091 | reg-names = "phy_rx", "phy_tx", "pll_ctrl"; |
| 1092 | ctrl-module = <&omap_control_sata>; | 1092 | ctrl-module = <&omap_control_sata>; |
| 1093 | clocks = <&sys_clkin1>; | 1093 | clocks = <&sys_clkin1>, <&sata_ref_clk>; |
| 1094 | clock-names = "sysclk"; | 1094 | clock-names = "sysclk", "refclk"; |
| 1095 | #phy-cells = <0>; | 1095 | #phy-cells = <0>; |
| 1096 | }; | 1096 | }; |
| 1097 | 1097 | ||
diff --git a/arch/arm/boot/dts/dra72-evm.dts b/arch/arm/boot/dts/dra72-evm.dts index 4d8711713610..40ed539ce474 100644 --- a/arch/arm/boot/dts/dra72-evm.dts +++ b/arch/arm/boot/dts/dra72-evm.dts | |||
| @@ -119,17 +119,15 @@ | |||
| 119 | 119 | ||
| 120 | dcan1_pins_default: dcan1_pins_default { | 120 | dcan1_pins_default: dcan1_pins_default { |
| 121 | pinctrl-single,pins = < | 121 | pinctrl-single,pins = < |
| 122 | 0x3d0 (PIN_OUTPUT | MUX_MODE0) /* dcan1_tx */ | 122 | 0x3d0 (PIN_OUTPUT_PULLUP | MUX_MODE0) /* dcan1_tx */ |
| 123 | 0x3d4 (MUX_MODE15) /* dcan1_rx.off */ | 123 | 0x418 (PULL_UP | MUX_MODE1) /* wakeup0.dcan1_rx */ |
| 124 | 0x418 (PULL_DIS | MUX_MODE1) /* wakeup0.dcan1_rx */ | ||
| 125 | >; | 124 | >; |
| 126 | }; | 125 | }; |
| 127 | 126 | ||
| 128 | dcan1_pins_sleep: dcan1_pins_sleep { | 127 | dcan1_pins_sleep: dcan1_pins_sleep { |
| 129 | pinctrl-single,pins = < | 128 | pinctrl-single,pins = < |
| 130 | 0x3d0 (MUX_MODE15) /* dcan1_tx.off */ | 129 | 0x3d0 (MUX_MODE15 | PULL_UP) /* dcan1_tx.off */ |
| 131 | 0x3d4 (MUX_MODE15) /* dcan1_rx.off */ | 130 | 0x418 (MUX_MODE15 | PULL_UP) /* wakeup0.off */ |
| 132 | 0x418 (MUX_MODE15) /* wakeup0.off */ | ||
| 133 | >; | 131 | >; |
| 134 | }; | 132 | }; |
| 135 | 133 | ||
| @@ -380,14 +378,6 @@ | |||
| 380 | phy-supply = <&ldo4_reg>; | 378 | phy-supply = <&ldo4_reg>; |
| 381 | }; | 379 | }; |
| 382 | 380 | ||
| 383 | &omap_dwc3_1 { | ||
| 384 | extcon = <&extcon_usb1>; | ||
| 385 | }; | ||
| 386 | |||
| 387 | &omap_dwc3_2 { | ||
| 388 | extcon = <&extcon_usb2>; | ||
| 389 | }; | ||
| 390 | |||
| 391 | &usb1 { | 381 | &usb1 { |
| 392 | dr_mode = "peripheral"; | 382 | dr_mode = "peripheral"; |
| 393 | pinctrl-names = "default"; | 383 | pinctrl-names = "default"; |
diff --git a/arch/arm/boot/dts/dra7xx-clocks.dtsi b/arch/arm/boot/dts/dra7xx-clocks.dtsi index 4bdcbd61ce47..99b09a44e269 100644 --- a/arch/arm/boot/dts/dra7xx-clocks.dtsi +++ b/arch/arm/boot/dts/dra7xx-clocks.dtsi | |||
| @@ -243,10 +243,18 @@ | |||
| 243 | ti,invert-autoidle-bit; | 243 | ti,invert-autoidle-bit; |
| 244 | }; | 244 | }; |
| 245 | 245 | ||
| 246 | dpll_core_byp_mux: dpll_core_byp_mux { | ||
| 247 | #clock-cells = <0>; | ||
| 248 | compatible = "ti,mux-clock"; | ||
| 249 | clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
| 250 | ti,bit-shift = <23>; | ||
| 251 | reg = <0x012c>; | ||
| 252 | }; | ||
| 253 | |||
| 246 | dpll_core_ck: dpll_core_ck { | 254 | dpll_core_ck: dpll_core_ck { |
| 247 | #clock-cells = <0>; | 255 | #clock-cells = <0>; |
| 248 | compatible = "ti,omap4-dpll-core-clock"; | 256 | compatible = "ti,omap4-dpll-core-clock"; |
| 249 | clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | 257 | clocks = <&sys_clkin1>, <&dpll_core_byp_mux>; |
| 250 | reg = <0x0120>, <0x0124>, <0x012c>, <0x0128>; | 258 | reg = <0x0120>, <0x0124>, <0x012c>, <0x0128>; |
| 251 | }; | 259 | }; |
| 252 | 260 | ||
| @@ -309,10 +317,18 @@ | |||
| 309 | clock-div = <1>; | 317 | clock-div = <1>; |
| 310 | }; | 318 | }; |
| 311 | 319 | ||
| 320 | dpll_dsp_byp_mux: dpll_dsp_byp_mux { | ||
| 321 | #clock-cells = <0>; | ||
| 322 | compatible = "ti,mux-clock"; | ||
| 323 | clocks = <&sys_clkin1>, <&dsp_dpll_hs_clk_div>; | ||
| 324 | ti,bit-shift = <23>; | ||
| 325 | reg = <0x0240>; | ||
| 326 | }; | ||
| 327 | |||
| 312 | dpll_dsp_ck: dpll_dsp_ck { | 328 | dpll_dsp_ck: dpll_dsp_ck { |
| 313 | #clock-cells = <0>; | 329 | #clock-cells = <0>; |
| 314 | compatible = "ti,omap4-dpll-clock"; | 330 | compatible = "ti,omap4-dpll-clock"; |
| 315 | clocks = <&sys_clkin1>, <&dsp_dpll_hs_clk_div>; | 331 | clocks = <&sys_clkin1>, <&dpll_dsp_byp_mux>; |
| 316 | reg = <0x0234>, <0x0238>, <0x0240>, <0x023c>; | 332 | reg = <0x0234>, <0x0238>, <0x0240>, <0x023c>; |
| 317 | }; | 333 | }; |
| 318 | 334 | ||
| @@ -335,10 +351,18 @@ | |||
| 335 | clock-div = <1>; | 351 | clock-div = <1>; |
| 336 | }; | 352 | }; |
| 337 | 353 | ||
| 354 | dpll_iva_byp_mux: dpll_iva_byp_mux { | ||
| 355 | #clock-cells = <0>; | ||
| 356 | compatible = "ti,mux-clock"; | ||
| 357 | clocks = <&sys_clkin1>, <&iva_dpll_hs_clk_div>; | ||
| 358 | ti,bit-shift = <23>; | ||
| 359 | reg = <0x01ac>; | ||
| 360 | }; | ||
| 361 | |||
| 338 | dpll_iva_ck: dpll_iva_ck { | 362 | dpll_iva_ck: dpll_iva_ck { |
| 339 | #clock-cells = <0>; | 363 | #clock-cells = <0>; |
| 340 | compatible = "ti,omap4-dpll-clock"; | 364 | compatible = "ti,omap4-dpll-clock"; |
| 341 | clocks = <&sys_clkin1>, <&iva_dpll_hs_clk_div>; | 365 | clocks = <&sys_clkin1>, <&dpll_iva_byp_mux>; |
| 342 | reg = <0x01a0>, <0x01a4>, <0x01ac>, <0x01a8>; | 366 | reg = <0x01a0>, <0x01a4>, <0x01ac>, <0x01a8>; |
| 343 | }; | 367 | }; |
| 344 | 368 | ||
| @@ -361,10 +385,18 @@ | |||
| 361 | clock-div = <1>; | 385 | clock-div = <1>; |
| 362 | }; | 386 | }; |
| 363 | 387 | ||
| 388 | dpll_gpu_byp_mux: dpll_gpu_byp_mux { | ||
| 389 | #clock-cells = <0>; | ||
| 390 | compatible = "ti,mux-clock"; | ||
| 391 | clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
| 392 | ti,bit-shift = <23>; | ||
| 393 | reg = <0x02e4>; | ||
| 394 | }; | ||
| 395 | |||
| 364 | dpll_gpu_ck: dpll_gpu_ck { | 396 | dpll_gpu_ck: dpll_gpu_ck { |
| 365 | #clock-cells = <0>; | 397 | #clock-cells = <0>; |
| 366 | compatible = "ti,omap4-dpll-clock"; | 398 | compatible = "ti,omap4-dpll-clock"; |
| 367 | clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | 399 | clocks = <&sys_clkin1>, <&dpll_gpu_byp_mux>; |
| 368 | reg = <0x02d8>, <0x02dc>, <0x02e4>, <0x02e0>; | 400 | reg = <0x02d8>, <0x02dc>, <0x02e4>, <0x02e0>; |
| 369 | }; | 401 | }; |
| 370 | 402 | ||
| @@ -398,10 +430,18 @@ | |||
| 398 | clock-div = <1>; | 430 | clock-div = <1>; |
| 399 | }; | 431 | }; |
| 400 | 432 | ||
| 433 | dpll_ddr_byp_mux: dpll_ddr_byp_mux { | ||
| 434 | #clock-cells = <0>; | ||
| 435 | compatible = "ti,mux-clock"; | ||
| 436 | clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
| 437 | ti,bit-shift = <23>; | ||
| 438 | reg = <0x021c>; | ||
| 439 | }; | ||
| 440 | |||
| 401 | dpll_ddr_ck: dpll_ddr_ck { | 441 | dpll_ddr_ck: dpll_ddr_ck { |
| 402 | #clock-cells = <0>; | 442 | #clock-cells = <0>; |
| 403 | compatible = "ti,omap4-dpll-clock"; | 443 | compatible = "ti,omap4-dpll-clock"; |
| 404 | clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | 444 | clocks = <&sys_clkin1>, <&dpll_ddr_byp_mux>; |
| 405 | reg = <0x0210>, <0x0214>, <0x021c>, <0x0218>; | 445 | reg = <0x0210>, <0x0214>, <0x021c>, <0x0218>; |
| 406 | }; | 446 | }; |
| 407 | 447 | ||
| @@ -416,10 +456,18 @@ | |||
| 416 | ti,invert-autoidle-bit; | 456 | ti,invert-autoidle-bit; |
| 417 | }; | 457 | }; |
| 418 | 458 | ||
| 459 | dpll_gmac_byp_mux: dpll_gmac_byp_mux { | ||
| 460 | #clock-cells = <0>; | ||
| 461 | compatible = "ti,mux-clock"; | ||
| 462 | clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
| 463 | ti,bit-shift = <23>; | ||
| 464 | reg = <0x02b4>; | ||
| 465 | }; | ||
| 466 | |||
| 419 | dpll_gmac_ck: dpll_gmac_ck { | 467 | dpll_gmac_ck: dpll_gmac_ck { |
| 420 | #clock-cells = <0>; | 468 | #clock-cells = <0>; |
| 421 | compatible = "ti,omap4-dpll-clock"; | 469 | compatible = "ti,omap4-dpll-clock"; |
| 422 | clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | 470 | clocks = <&sys_clkin1>, <&dpll_gmac_byp_mux>; |
| 423 | reg = <0x02a8>, <0x02ac>, <0x02b4>, <0x02b0>; | 471 | reg = <0x02a8>, <0x02ac>, <0x02b4>, <0x02b0>; |
| 424 | }; | 472 | }; |
| 425 | 473 | ||
| @@ -482,10 +530,18 @@ | |||
| 482 | clock-div = <1>; | 530 | clock-div = <1>; |
| 483 | }; | 531 | }; |
| 484 | 532 | ||
| 533 | dpll_eve_byp_mux: dpll_eve_byp_mux { | ||
| 534 | #clock-cells = <0>; | ||
| 535 | compatible = "ti,mux-clock"; | ||
| 536 | clocks = <&sys_clkin1>, <&eve_dpll_hs_clk_div>; | ||
| 537 | ti,bit-shift = <23>; | ||
| 538 | reg = <0x0290>; | ||
| 539 | }; | ||
| 540 | |||
| 485 | dpll_eve_ck: dpll_eve_ck { | 541 | dpll_eve_ck: dpll_eve_ck { |
| 486 | #clock-cells = <0>; | 542 | #clock-cells = <0>; |
| 487 | compatible = "ti,omap4-dpll-clock"; | 543 | compatible = "ti,omap4-dpll-clock"; |
| 488 | clocks = <&sys_clkin1>, <&eve_dpll_hs_clk_div>; | 544 | clocks = <&sys_clkin1>, <&dpll_eve_byp_mux>; |
| 489 | reg = <0x0284>, <0x0288>, <0x0290>, <0x028c>; | 545 | reg = <0x0284>, <0x0288>, <0x0290>, <0x028c>; |
| 490 | }; | 546 | }; |
| 491 | 547 | ||
| @@ -1249,10 +1305,18 @@ | |||
| 1249 | clock-div = <1>; | 1305 | clock-div = <1>; |
| 1250 | }; | 1306 | }; |
| 1251 | 1307 | ||
| 1308 | dpll_per_byp_mux: dpll_per_byp_mux { | ||
| 1309 | #clock-cells = <0>; | ||
| 1310 | compatible = "ti,mux-clock"; | ||
| 1311 | clocks = <&sys_clkin1>, <&per_dpll_hs_clk_div>; | ||
| 1312 | ti,bit-shift = <23>; | ||
| 1313 | reg = <0x014c>; | ||
| 1314 | }; | ||
| 1315 | |||
| 1252 | dpll_per_ck: dpll_per_ck { | 1316 | dpll_per_ck: dpll_per_ck { |
| 1253 | #clock-cells = <0>; | 1317 | #clock-cells = <0>; |
| 1254 | compatible = "ti,omap4-dpll-clock"; | 1318 | compatible = "ti,omap4-dpll-clock"; |
| 1255 | clocks = <&sys_clkin1>, <&per_dpll_hs_clk_div>; | 1319 | clocks = <&sys_clkin1>, <&dpll_per_byp_mux>; |
| 1256 | reg = <0x0140>, <0x0144>, <0x014c>, <0x0148>; | 1320 | reg = <0x0140>, <0x0144>, <0x014c>, <0x0148>; |
| 1257 | }; | 1321 | }; |
| 1258 | 1322 | ||
| @@ -1275,10 +1339,18 @@ | |||
| 1275 | clock-div = <1>; | 1339 | clock-div = <1>; |
| 1276 | }; | 1340 | }; |
| 1277 | 1341 | ||
| 1342 | dpll_usb_byp_mux: dpll_usb_byp_mux { | ||
| 1343 | #clock-cells = <0>; | ||
| 1344 | compatible = "ti,mux-clock"; | ||
| 1345 | clocks = <&sys_clkin1>, <&usb_dpll_hs_clk_div>; | ||
| 1346 | ti,bit-shift = <23>; | ||
| 1347 | reg = <0x018c>; | ||
| 1348 | }; | ||
| 1349 | |||
| 1278 | dpll_usb_ck: dpll_usb_ck { | 1350 | dpll_usb_ck: dpll_usb_ck { |
| 1279 | #clock-cells = <0>; | 1351 | #clock-cells = <0>; |
| 1280 | compatible = "ti,omap4-dpll-j-type-clock"; | 1352 | compatible = "ti,omap4-dpll-j-type-clock"; |
| 1281 | clocks = <&sys_clkin1>, <&usb_dpll_hs_clk_div>; | 1353 | clocks = <&sys_clkin1>, <&dpll_usb_byp_mux>; |
| 1282 | reg = <0x0180>, <0x0184>, <0x018c>, <0x0188>; | 1354 | reg = <0x0180>, <0x0184>, <0x018c>, <0x0188>; |
| 1283 | }; | 1355 | }; |
| 1284 | 1356 | ||
diff --git a/arch/arm/boot/dts/exynos3250.dtsi b/arch/arm/boot/dts/exynos3250.dtsi index 277b48b0b6f9..ac6b0ae42caf 100644 --- a/arch/arm/boot/dts/exynos3250.dtsi +++ b/arch/arm/boot/dts/exynos3250.dtsi | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #include "skeleton.dtsi" | 20 | #include "skeleton.dtsi" |
| 21 | #include "exynos4-cpu-thermal.dtsi" | ||
| 21 | #include <dt-bindings/clock/exynos3250.h> | 22 | #include <dt-bindings/clock/exynos3250.h> |
| 22 | 23 | ||
| 23 | / { | 24 | / { |
| @@ -193,6 +194,7 @@ | |||
| 193 | interrupts = <0 216 0>; | 194 | interrupts = <0 216 0>; |
| 194 | clocks = <&cmu CLK_TMU_APBIF>; | 195 | clocks = <&cmu CLK_TMU_APBIF>; |
| 195 | clock-names = "tmu_apbif"; | 196 | clock-names = "tmu_apbif"; |
| 197 | #include "exynos4412-tmu-sensor-conf.dtsi" | ||
| 196 | status = "disabled"; | 198 | status = "disabled"; |
| 197 | }; | 199 | }; |
| 198 | 200 | ||
diff --git a/arch/arm/boot/dts/exynos4-cpu-thermal.dtsi b/arch/arm/boot/dts/exynos4-cpu-thermal.dtsi new file mode 100644 index 000000000000..735cb2f10817 --- /dev/null +++ b/arch/arm/boot/dts/exynos4-cpu-thermal.dtsi | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | /* | ||
| 2 | * Device tree sources for Exynos4 thermal zone | ||
| 3 | * | ||
| 4 | * Copyright (c) 2014 Lukasz Majewski <l.majewski@samsung.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <dt-bindings/thermal/thermal.h> | ||
| 13 | |||
| 14 | / { | ||
| 15 | thermal-zones { | ||
| 16 | cpu_thermal: cpu-thermal { | ||
| 17 | thermal-sensors = <&tmu 0>; | ||
| 18 | polling-delay-passive = <0>; | ||
| 19 | polling-delay = <0>; | ||
| 20 | trips { | ||
| 21 | cpu_alert0: cpu-alert-0 { | ||
| 22 | temperature = <70000>; /* millicelsius */ | ||
| 23 | hysteresis = <10000>; /* millicelsius */ | ||
| 24 | type = "active"; | ||
| 25 | }; | ||
| 26 | cpu_alert1: cpu-alert-1 { | ||
| 27 | temperature = <95000>; /* millicelsius */ | ||
| 28 | hysteresis = <10000>; /* millicelsius */ | ||
| 29 | type = "active"; | ||
| 30 | }; | ||
| 31 | cpu_alert2: cpu-alert-2 { | ||
| 32 | temperature = <110000>; /* millicelsius */ | ||
| 33 | hysteresis = <10000>; /* millicelsius */ | ||
| 34 | type = "active"; | ||
| 35 | }; | ||
| 36 | cpu_crit0: cpu-crit-0 { | ||
| 37 | temperature = <120000>; /* millicelsius */ | ||
| 38 | hysteresis = <0>; /* millicelsius */ | ||
| 39 | type = "critical"; | ||
| 40 | }; | ||
| 41 | }; | ||
| 42 | cooling-maps { | ||
| 43 | map0 { | ||
| 44 | trip = <&cpu_alert0>; | ||
| 45 | }; | ||
| 46 | map1 { | ||
| 47 | trip = <&cpu_alert1>; | ||
| 48 | }; | ||
| 49 | }; | ||
| 50 | }; | ||
| 51 | }; | ||
| 52 | }; | ||
diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi index 76173cacd450..77ea547768f4 100644 --- a/arch/arm/boot/dts/exynos4.dtsi +++ b/arch/arm/boot/dts/exynos4.dtsi | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | i2c5 = &i2c_5; | 38 | i2c5 = &i2c_5; |
| 39 | i2c6 = &i2c_6; | 39 | i2c6 = &i2c_6; |
| 40 | i2c7 = &i2c_7; | 40 | i2c7 = &i2c_7; |
| 41 | i2c8 = &i2c_8; | ||
| 41 | csis0 = &csis_0; | 42 | csis0 = &csis_0; |
| 42 | csis1 = &csis_1; | 43 | csis1 = &csis_1; |
| 43 | fimc0 = &fimc_0; | 44 | fimc0 = &fimc_0; |
| @@ -104,6 +105,7 @@ | |||
| 104 | compatible = "samsung,exynos4210-pd"; | 105 | compatible = "samsung,exynos4210-pd"; |
| 105 | reg = <0x10023C20 0x20>; | 106 | reg = <0x10023C20 0x20>; |
| 106 | #power-domain-cells = <0>; | 107 | #power-domain-cells = <0>; |
| 108 | power-domains = <&pd_lcd0>; | ||
| 107 | }; | 109 | }; |
| 108 | 110 | ||
| 109 | pd_cam: cam-power-domain@10023C00 { | 111 | pd_cam: cam-power-domain@10023C00 { |
| @@ -554,6 +556,22 @@ | |||
| 554 | status = "disabled"; | 556 | status = "disabled"; |
| 555 | }; | 557 | }; |
| 556 | 558 | ||
| 559 | i2c_8: i2c@138E0000 { | ||
| 560 | #address-cells = <1>; | ||
| 561 | #size-cells = <0>; | ||
| 562 | compatible = "samsung,s3c2440-hdmiphy-i2c"; | ||
| 563 | reg = <0x138E0000 0x100>; | ||
| 564 | interrupts = <0 93 0>; | ||
| 565 | clocks = <&clock CLK_I2C_HDMI>; | ||
| 566 | clock-names = "i2c"; | ||
| 567 | status = "disabled"; | ||
| 568 | |||
| 569 | hdmi_i2c_phy: hdmiphy@38 { | ||
| 570 | compatible = "exynos4210-hdmiphy"; | ||
| 571 | reg = <0x38>; | ||
| 572 | }; | ||
| 573 | }; | ||
| 574 | |||
| 557 | spi_0: spi@13920000 { | 575 | spi_0: spi@13920000 { |
| 558 | compatible = "samsung,exynos4210-spi"; | 576 | compatible = "samsung,exynos4210-spi"; |
| 559 | reg = <0x13920000 0x100>; | 577 | reg = <0x13920000 0x100>; |
| @@ -663,6 +681,33 @@ | |||
| 663 | status = "disabled"; | 681 | status = "disabled"; |
| 664 | }; | 682 | }; |
| 665 | 683 | ||
| 684 | tmu: tmu@100C0000 { | ||
| 685 | #include "exynos4412-tmu-sensor-conf.dtsi" | ||
| 686 | }; | ||
| 687 | |||
| 688 | hdmi: hdmi@12D00000 { | ||
| 689 | compatible = "samsung,exynos4210-hdmi"; | ||
| 690 | reg = <0x12D00000 0x70000>; | ||
| 691 | interrupts = <0 92 0>; | ||
| 692 | clock-names = "hdmi", "sclk_hdmi", "sclk_pixel", "sclk_hdmiphy", | ||
| 693 | "mout_hdmi"; | ||
| 694 | clocks = <&clock CLK_HDMI>, <&clock CLK_SCLK_HDMI>, | ||
| 695 | <&clock CLK_SCLK_PIXEL>, <&clock CLK_SCLK_HDMIPHY>, | ||
| 696 | <&clock CLK_MOUT_HDMI>; | ||
| 697 | phy = <&hdmi_i2c_phy>; | ||
| 698 | power-domains = <&pd_tv>; | ||
| 699 | samsung,syscon-phandle = <&pmu_system_controller>; | ||
| 700 | status = "disabled"; | ||
| 701 | }; | ||
| 702 | |||
| 703 | mixer: mixer@12C10000 { | ||
| 704 | compatible = "samsung,exynos4210-mixer"; | ||
| 705 | interrupts = <0 91 0>; | ||
| 706 | reg = <0x12C10000 0x2100>, <0x12c00000 0x300>; | ||
| 707 | power-domains = <&pd_tv>; | ||
| 708 | status = "disabled"; | ||
| 709 | }; | ||
| 710 | |||
| 666 | ppmu_dmc0: ppmu_dmc0@106a0000 { | 711 | ppmu_dmc0: ppmu_dmc0@106a0000 { |
| 667 | compatible = "samsung,exynos-ppmu"; | 712 | compatible = "samsung,exynos-ppmu"; |
| 668 | reg = <0x106a0000 0x2000>; | 713 | reg = <0x106a0000 0x2000>; |
diff --git a/arch/arm/boot/dts/exynos4210-trats.dts b/arch/arm/boot/dts/exynos4210-trats.dts index 3d6652a4b6cb..32c5fd8f6269 100644 --- a/arch/arm/boot/dts/exynos4210-trats.dts +++ b/arch/arm/boot/dts/exynos4210-trats.dts | |||
| @@ -426,6 +426,25 @@ | |||
| 426 | status = "okay"; | 426 | status = "okay"; |
| 427 | }; | 427 | }; |
| 428 | 428 | ||
| 429 | tmu@100C0000 { | ||
| 430 | status = "okay"; | ||
| 431 | }; | ||
| 432 | |||
| 433 | thermal-zones { | ||
| 434 | cpu_thermal: cpu-thermal { | ||
| 435 | cooling-maps { | ||
| 436 | map0 { | ||
| 437 | /* Corresponds to 800MHz at freq_table */ | ||
| 438 | cooling-device = <&cpu0 2 2>; | ||
| 439 | }; | ||
| 440 | map1 { | ||
| 441 | /* Corresponds to 200MHz at freq_table */ | ||
| 442 | cooling-device = <&cpu0 4 4>; | ||
| 443 | }; | ||
| 444 | }; | ||
| 445 | }; | ||
| 446 | }; | ||
| 447 | |||
| 429 | camera { | 448 | camera { |
| 430 | pinctrl-names = "default"; | 449 | pinctrl-names = "default"; |
| 431 | pinctrl-0 = <>; | 450 | pinctrl-0 = <>; |
diff --git a/arch/arm/boot/dts/exynos4210-universal_c210.dts b/arch/arm/boot/dts/exynos4210-universal_c210.dts index b57e6b82ea20..d4f2b11319dd 100644 --- a/arch/arm/boot/dts/exynos4210-universal_c210.dts +++ b/arch/arm/boot/dts/exynos4210-universal_c210.dts | |||
| @@ -505,6 +505,63 @@ | |||
| 505 | assigned-clock-rates = <0>, <160000000>; | 505 | assigned-clock-rates = <0>, <160000000>; |
| 506 | }; | 506 | }; |
| 507 | }; | 507 | }; |
| 508 | |||
| 509 | hdmi_en: voltage-regulator-hdmi-5v { | ||
| 510 | compatible = "regulator-fixed"; | ||
| 511 | regulator-name = "HDMI_5V"; | ||
| 512 | regulator-min-microvolt = <5000000>; | ||
| 513 | regulator-max-microvolt = <5000000>; | ||
| 514 | gpio = <&gpe0 1 0>; | ||
| 515 | enable-active-high; | ||
| 516 | }; | ||
| 517 | |||
| 518 | hdmi_ddc: i2c-ddc { | ||
| 519 | compatible = "i2c-gpio"; | ||
| 520 | gpios = <&gpe4 2 0 &gpe4 3 0>; | ||
| 521 | i2c-gpio,delay-us = <100>; | ||
| 522 | #address-cells = <1>; | ||
| 523 | #size-cells = <0>; | ||
| 524 | |||
| 525 | pinctrl-0 = <&i2c_ddc_bus>; | ||
| 526 | pinctrl-names = "default"; | ||
| 527 | status = "okay"; | ||
| 528 | }; | ||
| 529 | |||
| 530 | mixer@12C10000 { | ||
| 531 | status = "okay"; | ||
| 532 | }; | ||
| 533 | |||
| 534 | hdmi@12D00000 { | ||
| 535 | hpd-gpio = <&gpx3 7 0>; | ||
| 536 | pinctrl-names = "default"; | ||
| 537 | pinctrl-0 = <&hdmi_hpd>; | ||
| 538 | hdmi-en-supply = <&hdmi_en>; | ||
| 539 | vdd-supply = <&ldo3_reg>; | ||
| 540 | vdd_osc-supply = <&ldo4_reg>; | ||
| 541 | vdd_pll-supply = <&ldo3_reg>; | ||
| 542 | ddc = <&hdmi_ddc>; | ||
| 543 | status = "okay"; | ||
| 544 | }; | ||
| 545 | |||
| 546 | i2c@138E0000 { | ||
| 547 | status = "okay"; | ||
| 548 | }; | ||
| 549 | }; | ||
| 550 | |||
| 551 | &pinctrl_1 { | ||
| 552 | hdmi_hpd: hdmi-hpd { | ||
| 553 | samsung,pins = "gpx3-7"; | ||
| 554 | samsung,pin-pud = <0>; | ||
| 555 | }; | ||
| 556 | }; | ||
| 557 | |||
| 558 | &pinctrl_0 { | ||
| 559 | i2c_ddc_bus: i2c-ddc-bus { | ||
| 560 | samsung,pins = "gpe4-2", "gpe4-3"; | ||
| 561 | samsung,pin-function = <2>; | ||
| 562 | samsung,pin-pud = <3>; | ||
| 563 | samsung,pin-drv = <0>; | ||
| 564 | }; | ||
| 508 | }; | 565 | }; |
| 509 | 566 | ||
| 510 | &mdma1 { | 567 | &mdma1 { |
diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi index 67c832c9dcf1..be89f83f70e7 100644 --- a/arch/arm/boot/dts/exynos4210.dtsi +++ b/arch/arm/boot/dts/exynos4210.dtsi | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | 21 | ||
| 22 | #include "exynos4.dtsi" | 22 | #include "exynos4.dtsi" |
| 23 | #include "exynos4210-pinctrl.dtsi" | 23 | #include "exynos4210-pinctrl.dtsi" |
| 24 | #include "exynos4-cpu-thermal.dtsi" | ||
| 24 | 25 | ||
| 25 | / { | 26 | / { |
| 26 | compatible = "samsung,exynos4210", "samsung,exynos4"; | 27 | compatible = "samsung,exynos4210", "samsung,exynos4"; |
| @@ -35,10 +36,13 @@ | |||
| 35 | #address-cells = <1>; | 36 | #address-cells = <1>; |
| 36 | #size-cells = <0>; | 37 | #size-cells = <0>; |
| 37 | 38 | ||
| 38 | cpu@900 { | 39 | cpu0: cpu@900 { |
| 39 | device_type = "cpu"; | 40 | device_type = "cpu"; |
| 40 | compatible = "arm,cortex-a9"; | 41 | compatible = "arm,cortex-a9"; |
| 41 | reg = <0x900>; | 42 | reg = <0x900>; |
| 43 | cooling-min-level = <4>; | ||
| 44 | cooling-max-level = <2>; | ||
| 45 | #cooling-cells = <2>; /* min followed by max */ | ||
| 42 | }; | 46 | }; |
| 43 | 47 | ||
| 44 | cpu@901 { | 48 | cpu@901 { |
| @@ -153,16 +157,38 @@ | |||
| 153 | reg = <0x03860000 0x1000>; | 157 | reg = <0x03860000 0x1000>; |
| 154 | }; | 158 | }; |
| 155 | 159 | ||
| 156 | tmu@100C0000 { | 160 | tmu: tmu@100C0000 { |
| 157 | compatible = "samsung,exynos4210-tmu"; | 161 | compatible = "samsung,exynos4210-tmu"; |
| 158 | interrupt-parent = <&combiner>; | 162 | interrupt-parent = <&combiner>; |
| 159 | reg = <0x100C0000 0x100>; | 163 | reg = <0x100C0000 0x100>; |
| 160 | interrupts = <2 4>; | 164 | interrupts = <2 4>; |
| 161 | clocks = <&clock CLK_TMU_APBIF>; | 165 | clocks = <&clock CLK_TMU_APBIF>; |
| 162 | clock-names = "tmu_apbif"; | 166 | clock-names = "tmu_apbif"; |
| 167 | samsung,tmu_gain = <15>; | ||
| 168 | samsung,tmu_reference_voltage = <7>; | ||
| 163 | status = "disabled"; | 169 | status = "disabled"; |
| 164 | }; | 170 | }; |
| 165 | 171 | ||
| 172 | thermal-zones { | ||
| 173 | cpu_thermal: cpu-thermal { | ||
| 174 | polling-delay-passive = <0>; | ||
| 175 | polling-delay = <0>; | ||
| 176 | thermal-sensors = <&tmu 0>; | ||
| 177 | |||
| 178 | trips { | ||
| 179 | cpu_alert0: cpu-alert-0 { | ||
| 180 | temperature = <85000>; /* millicelsius */ | ||
| 181 | }; | ||
| 182 | cpu_alert1: cpu-alert-1 { | ||
| 183 | temperature = <100000>; /* millicelsius */ | ||
| 184 | }; | ||
| 185 | cpu_alert2: cpu-alert-2 { | ||
| 186 | temperature = <110000>; /* millicelsius */ | ||
| 187 | }; | ||
| 188 | }; | ||
| 189 | }; | ||
| 190 | }; | ||
| 191 | |||
| 166 | g2d@12800000 { | 192 | g2d@12800000 { |
| 167 | compatible = "samsung,s5pv210-g2d"; | 193 | compatible = "samsung,s5pv210-g2d"; |
| 168 | reg = <0x12800000 0x1000>; | 194 | reg = <0x12800000 0x1000>; |
| @@ -203,6 +229,14 @@ | |||
| 203 | }; | 229 | }; |
| 204 | }; | 230 | }; |
| 205 | 231 | ||
| 232 | mixer: mixer@12C10000 { | ||
| 233 | clock-names = "mixer", "hdmi", "sclk_hdmi", "vp", "mout_mixer", | ||
| 234 | "sclk_mixer"; | ||
| 235 | clocks = <&clock CLK_MIXER>, <&clock CLK_HDMI>, | ||
| 236 | <&clock CLK_SCLK_HDMI>, <&clock CLK_VP>, | ||
| 237 | <&clock CLK_MOUT_MIXER>, <&clock CLK_SCLK_MIXER>; | ||
| 238 | }; | ||
| 239 | |||
| 206 | ppmu_lcd1: ppmu_lcd1@12240000 { | 240 | ppmu_lcd1: ppmu_lcd1@12240000 { |
| 207 | compatible = "samsung,exynos-ppmu"; | 241 | compatible = "samsung,exynos-ppmu"; |
| 208 | reg = <0x12240000 0x2000>; | 242 | reg = <0x12240000 0x2000>; |
diff --git a/arch/arm/boot/dts/exynos4212.dtsi b/arch/arm/boot/dts/exynos4212.dtsi index dd0a43ec56da..5be03288f1ee 100644 --- a/arch/arm/boot/dts/exynos4212.dtsi +++ b/arch/arm/boot/dts/exynos4212.dtsi | |||
| @@ -26,10 +26,13 @@ | |||
| 26 | #address-cells = <1>; | 26 | #address-cells = <1>; |
| 27 | #size-cells = <0>; | 27 | #size-cells = <0>; |
| 28 | 28 | ||
| 29 | cpu@A00 { | 29 | cpu0: cpu@A00 { |
| 30 | device_type = "cpu"; | 30 | device_type = "cpu"; |
| 31 | compatible = "arm,cortex-a9"; | 31 | compatible = "arm,cortex-a9"; |
| 32 | reg = <0xA00>; | 32 | reg = <0xA00>; |
| 33 | cooling-min-level = <13>; | ||
| 34 | cooling-max-level = <7>; | ||
| 35 | #cooling-cells = <2>; /* min followed by max */ | ||
| 33 | }; | 36 | }; |
| 34 | 37 | ||
| 35 | cpu@A01 { | 38 | cpu@A01 { |
diff --git a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi index de80b5bba204..adb4f6a97a1d 100644 --- a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi +++ b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi | |||
| @@ -249,6 +249,20 @@ | |||
| 249 | regulator-always-on; | 249 | regulator-always-on; |
| 250 | }; | 250 | }; |
| 251 | 251 | ||
| 252 | ldo8_reg: ldo@8 { | ||
| 253 | regulator-compatible = "LDO8"; | ||
| 254 | regulator-name = "VDD10_HDMI_1.0V"; | ||
| 255 | regulator-min-microvolt = <1000000>; | ||
| 256 | regulator-max-microvolt = <1000000>; | ||
| 257 | }; | ||
| 258 | |||
| 259 | ldo10_reg: ldo@10 { | ||
| 260 | regulator-compatible = "LDO10"; | ||
| 261 | regulator-name = "VDDQ_MIPIHSI_1.8V"; | ||
| 262 | regulator-min-microvolt = <1800000>; | ||
| 263 | regulator-max-microvolt = <1800000>; | ||
| 264 | }; | ||
| 265 | |||
| 252 | ldo11_reg: LDO11 { | 266 | ldo11_reg: LDO11 { |
| 253 | regulator-name = "VDD18_ABB1_1.8V"; | 267 | regulator-name = "VDD18_ABB1_1.8V"; |
| 254 | regulator-min-microvolt = <1800000>; | 268 | regulator-min-microvolt = <1800000>; |
| @@ -411,6 +425,51 @@ | |||
| 411 | ehci: ehci@12580000 { | 425 | ehci: ehci@12580000 { |
| 412 | status = "okay"; | 426 | status = "okay"; |
| 413 | }; | 427 | }; |
| 428 | |||
| 429 | tmu@100C0000 { | ||
| 430 | vtmu-supply = <&ldo10_reg>; | ||
| 431 | status = "okay"; | ||
| 432 | }; | ||
| 433 | |||
| 434 | thermal-zones { | ||
| 435 | cpu_thermal: cpu-thermal { | ||
| 436 | cooling-maps { | ||
| 437 | map0 { | ||
| 438 | /* Corresponds to 800MHz at freq_table */ | ||
| 439 | cooling-device = <&cpu0 7 7>; | ||
| 440 | }; | ||
| 441 | map1 { | ||
| 442 | /* Corresponds to 200MHz at freq_table */ | ||
| 443 | cooling-device = <&cpu0 13 13>; | ||
| 444 | }; | ||
| 445 | }; | ||
| 446 | }; | ||
| 447 | }; | ||
| 448 | |||
| 449 | mixer: mixer@12C10000 { | ||
| 450 | status = "okay"; | ||
| 451 | }; | ||
| 452 | |||
| 453 | hdmi@12D00000 { | ||
| 454 | hpd-gpio = <&gpx3 7 0>; | ||
| 455 | pinctrl-names = "default"; | ||
| 456 | pinctrl-0 = <&hdmi_hpd>; | ||
| 457 | vdd-supply = <&ldo8_reg>; | ||
| 458 | vdd_osc-supply = <&ldo10_reg>; | ||
| 459 | vdd_pll-supply = <&ldo8_reg>; | ||
| 460 | ddc = <&hdmi_ddc>; | ||
| 461 | status = "okay"; | ||
| 462 | }; | ||
| 463 | |||
| 464 | hdmi_ddc: i2c@13880000 { | ||
| 465 | status = "okay"; | ||
| 466 | pinctrl-names = "default"; | ||
| 467 | pinctrl-0 = <&i2c2_bus>; | ||
| 468 | }; | ||
| 469 | |||
| 470 | i2c@138E0000 { | ||
| 471 | status = "okay"; | ||
| 472 | }; | ||
| 414 | }; | 473 | }; |
| 415 | 474 | ||
| 416 | &pinctrl_1 { | 475 | &pinctrl_1 { |
| @@ -425,4 +484,9 @@ | |||
| 425 | samsung,pin-pud = <0>; | 484 | samsung,pin-pud = <0>; |
| 426 | samsung,pin-drv = <0>; | 485 | samsung,pin-drv = <0>; |
| 427 | }; | 486 | }; |
| 487 | |||
| 488 | hdmi_hpd: hdmi-hpd { | ||
| 489 | samsung,pins = "gpx3-7"; | ||
| 490 | samsung,pin-pud = <1>; | ||
| 491 | }; | ||
| 428 | }; | 492 | }; |
diff --git a/arch/arm/boot/dts/exynos4412-tmu-sensor-conf.dtsi b/arch/arm/boot/dts/exynos4412-tmu-sensor-conf.dtsi new file mode 100644 index 000000000000..e3f7934d19d0 --- /dev/null +++ b/arch/arm/boot/dts/exynos4412-tmu-sensor-conf.dtsi | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | /* | ||
| 2 | * Device tree sources for Exynos4412 TMU sensor configuration | ||
| 3 | * | ||
| 4 | * Copyright (c) 2014 Lukasz Majewski <l.majewski@samsung.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <dt-bindings/thermal/thermal_exynos.h> | ||
| 13 | |||
| 14 | #thermal-sensor-cells = <0>; | ||
| 15 | samsung,tmu_gain = <8>; | ||
| 16 | samsung,tmu_reference_voltage = <16>; | ||
| 17 | samsung,tmu_noise_cancel_mode = <4>; | ||
| 18 | samsung,tmu_efuse_value = <55>; | ||
| 19 | samsung,tmu_min_efuse_value = <40>; | ||
| 20 | samsung,tmu_max_efuse_value = <100>; | ||
| 21 | samsung,tmu_first_point_trim = <25>; | ||
| 22 | samsung,tmu_second_point_trim = <85>; | ||
| 23 | samsung,tmu_default_temp_offset = <50>; | ||
| 24 | samsung,tmu_cal_type = <TYPE_ONE_POINT_TRIMMING>; | ||
diff --git a/arch/arm/boot/dts/exynos4412-trats2.dts b/arch/arm/boot/dts/exynos4412-trats2.dts index 21f748083586..173ffa479ad3 100644 --- a/arch/arm/boot/dts/exynos4412-trats2.dts +++ b/arch/arm/boot/dts/exynos4412-trats2.dts | |||
| @@ -927,6 +927,21 @@ | |||
| 927 | pulldown-ohm = <100000>; /* 100K */ | 927 | pulldown-ohm = <100000>; /* 100K */ |
| 928 | io-channels = <&adc 2>; /* Battery temperature */ | 928 | io-channels = <&adc 2>; /* Battery temperature */ |
| 929 | }; | 929 | }; |
| 930 | |||
| 931 | thermal-zones { | ||
| 932 | cpu_thermal: cpu-thermal { | ||
| 933 | cooling-maps { | ||
| 934 | map0 { | ||
| 935 | /* Corresponds to 800MHz at freq_table */ | ||
| 936 | cooling-device = <&cpu0 7 7>; | ||
| 937 | }; | ||
| 938 | map1 { | ||
| 939 | /* Corresponds to 200MHz at freq_table */ | ||
| 940 | cooling-device = <&cpu0 13 13>; | ||
| 941 | }; | ||
| 942 | }; | ||
| 943 | }; | ||
| 944 | }; | ||
| 930 | }; | 945 | }; |
| 931 | 946 | ||
| 932 | &pmu_system_controller { | 947 | &pmu_system_controller { |
diff --git a/arch/arm/boot/dts/exynos4412.dtsi b/arch/arm/boot/dts/exynos4412.dtsi index 0f6ec93bb1d8..68ad43b391ae 100644 --- a/arch/arm/boot/dts/exynos4412.dtsi +++ b/arch/arm/boot/dts/exynos4412.dtsi | |||
| @@ -26,10 +26,13 @@ | |||
| 26 | #address-cells = <1>; | 26 | #address-cells = <1>; |
| 27 | #size-cells = <0>; | 27 | #size-cells = <0>; |
| 28 | 28 | ||
| 29 | cpu@A00 { | 29 | cpu0: cpu@A00 { |
| 30 | device_type = "cpu"; | 30 | device_type = "cpu"; |
| 31 | compatible = "arm,cortex-a9"; | 31 | compatible = "arm,cortex-a9"; |
| 32 | reg = <0xA00>; | 32 | reg = <0xA00>; |
| 33 | cooling-min-level = <13>; | ||
| 34 | cooling-max-level = <7>; | ||
| 35 | #cooling-cells = <2>; /* min followed by max */ | ||
| 33 | }; | 36 | }; |
| 34 | 37 | ||
| 35 | cpu@A01 { | 38 | cpu@A01 { |
diff --git a/arch/arm/boot/dts/exynos4x12.dtsi b/arch/arm/boot/dts/exynos4x12.dtsi index f5e0ae780d6c..6a6abe14fd9b 100644 --- a/arch/arm/boot/dts/exynos4x12.dtsi +++ b/arch/arm/boot/dts/exynos4x12.dtsi | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | #include "exynos4.dtsi" | 20 | #include "exynos4.dtsi" |
| 21 | #include "exynos4x12-pinctrl.dtsi" | 21 | #include "exynos4x12-pinctrl.dtsi" |
| 22 | #include "exynos4-cpu-thermal.dtsi" | ||
| 22 | 23 | ||
| 23 | / { | 24 | / { |
| 24 | aliases { | 25 | aliases { |
| @@ -297,4 +298,15 @@ | |||
| 297 | clock-names = "tmu_apbif"; | 298 | clock-names = "tmu_apbif"; |
| 298 | status = "disabled"; | 299 | status = "disabled"; |
| 299 | }; | 300 | }; |
| 301 | |||
| 302 | hdmi: hdmi@12D00000 { | ||
| 303 | compatible = "samsung,exynos4212-hdmi"; | ||
| 304 | }; | ||
| 305 | |||
| 306 | mixer: mixer@12C10000 { | ||
| 307 | compatible = "samsung,exynos4212-mixer"; | ||
| 308 | clock-names = "mixer", "hdmi", "sclk_hdmi", "vp"; | ||
| 309 | clocks = <&clock CLK_MIXER>, <&clock CLK_HDMI>, | ||
| 310 | <&clock CLK_SCLK_HDMI>, <&clock CLK_VP>; | ||
| 311 | }; | ||
| 300 | }; | 312 | }; |
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 9bb1b0b738f5..adbde1adad95 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | #include <dt-bindings/clock/exynos5250.h> | 20 | #include <dt-bindings/clock/exynos5250.h> |
| 21 | #include "exynos5.dtsi" | 21 | #include "exynos5.dtsi" |
| 22 | #include "exynos5250-pinctrl.dtsi" | 22 | #include "exynos5250-pinctrl.dtsi" |
| 23 | 23 | #include "exynos4-cpu-thermal.dtsi" | |
| 24 | #include <dt-bindings/clock/exynos-audss-clk.h> | 24 | #include <dt-bindings/clock/exynos-audss-clk.h> |
| 25 | 25 | ||
| 26 | / { | 26 | / { |
| @@ -58,11 +58,14 @@ | |||
| 58 | #address-cells = <1>; | 58 | #address-cells = <1>; |
| 59 | #size-cells = <0>; | 59 | #size-cells = <0>; |
| 60 | 60 | ||
| 61 | cpu@0 { | 61 | cpu0: cpu@0 { |
| 62 | device_type = "cpu"; | 62 | device_type = "cpu"; |
| 63 | compatible = "arm,cortex-a15"; | 63 | compatible = "arm,cortex-a15"; |
| 64 | reg = <0>; | 64 | reg = <0>; |
| 65 | clock-frequency = <1700000000>; | 65 | clock-frequency = <1700000000>; |
| 66 | cooling-min-level = <15>; | ||
| 67 | cooling-max-level = <9>; | ||
| 68 | #cooling-cells = <2>; /* min followed by max */ | ||
| 66 | }; | 69 | }; |
| 67 | cpu@1 { | 70 | cpu@1 { |
| 68 | device_type = "cpu"; | 71 | device_type = "cpu"; |
| @@ -102,6 +105,12 @@ | |||
| 102 | #power-domain-cells = <0>; | 105 | #power-domain-cells = <0>; |
| 103 | }; | 106 | }; |
| 104 | 107 | ||
| 108 | pd_disp1: disp1-power-domain@100440A0 { | ||
| 109 | compatible = "samsung,exynos4210-pd"; | ||
| 110 | reg = <0x100440A0 0x20>; | ||
| 111 | #power-domain-cells = <0>; | ||
| 112 | }; | ||
| 113 | |||
| 105 | clock: clock-controller@10010000 { | 114 | clock: clock-controller@10010000 { |
| 106 | compatible = "samsung,exynos5250-clock"; | 115 | compatible = "samsung,exynos5250-clock"; |
| 107 | reg = <0x10010000 0x30000>; | 116 | reg = <0x10010000 0x30000>; |
| @@ -235,12 +244,32 @@ | |||
| 235 | status = "disabled"; | 244 | status = "disabled"; |
| 236 | }; | 245 | }; |
| 237 | 246 | ||
| 238 | tmu@10060000 { | 247 | tmu: tmu@10060000 { |
| 239 | compatible = "samsung,exynos5250-tmu"; | 248 | compatible = "samsung,exynos5250-tmu"; |
| 240 | reg = <0x10060000 0x100>; | 249 | reg = <0x10060000 0x100>; |
| 241 | interrupts = <0 65 0>; | 250 | interrupts = <0 65 0>; |
| 242 | clocks = <&clock CLK_TMU>; | 251 | clocks = <&clock CLK_TMU>; |
| 243 | clock-names = "tmu_apbif"; | 252 | clock-names = "tmu_apbif"; |
| 253 | #include "exynos4412-tmu-sensor-conf.dtsi" | ||
| 254 | }; | ||
| 255 | |||
| 256 | thermal-zones { | ||
| 257 | cpu_thermal: cpu-thermal { | ||
| 258 | polling-delay-passive = <0>; | ||
| 259 | polling-delay = <0>; | ||
| 260 | thermal-sensors = <&tmu 0>; | ||
| 261 | |||
| 262 | cooling-maps { | ||
| 263 | map0 { | ||
| 264 | /* Corresponds to 800MHz at freq_table */ | ||
| 265 | cooling-device = <&cpu0 9 9>; | ||
| 266 | }; | ||
| 267 | map1 { | ||
| 268 | /* Corresponds to 200MHz at freq_table */ | ||
| 269 | cooling-device = <&cpu0 15 15>; | ||
| 270 | }; | ||
| 271 | }; | ||
| 272 | }; | ||
| 244 | }; | 273 | }; |
| 245 | 274 | ||
| 246 | serial@12C00000 { | 275 | serial@12C00000 { |
| @@ -719,6 +748,7 @@ | |||
| 719 | hdmi: hdmi { | 748 | hdmi: hdmi { |
| 720 | compatible = "samsung,exynos4212-hdmi"; | 749 | compatible = "samsung,exynos4212-hdmi"; |
| 721 | reg = <0x14530000 0x70000>; | 750 | reg = <0x14530000 0x70000>; |
| 751 | power-domains = <&pd_disp1>; | ||
| 722 | interrupts = <0 95 0>; | 752 | interrupts = <0 95 0>; |
| 723 | clocks = <&clock CLK_HDMI>, <&clock CLK_SCLK_HDMI>, | 753 | clocks = <&clock CLK_HDMI>, <&clock CLK_SCLK_HDMI>, |
| 724 | <&clock CLK_SCLK_PIXEL>, <&clock CLK_SCLK_HDMIPHY>, | 754 | <&clock CLK_SCLK_PIXEL>, <&clock CLK_SCLK_HDMIPHY>, |
| @@ -731,9 +761,11 @@ | |||
| 731 | mixer { | 761 | mixer { |
| 732 | compatible = "samsung,exynos5250-mixer"; | 762 | compatible = "samsung,exynos5250-mixer"; |
| 733 | reg = <0x14450000 0x10000>; | 763 | reg = <0x14450000 0x10000>; |
| 764 | power-domains = <&pd_disp1>; | ||
| 734 | interrupts = <0 94 0>; | 765 | interrupts = <0 94 0>; |
| 735 | clocks = <&clock CLK_MIXER>, <&clock CLK_SCLK_HDMI>; | 766 | clocks = <&clock CLK_MIXER>, <&clock CLK_HDMI>, |
| 736 | clock-names = "mixer", "sclk_hdmi"; | 767 | <&clock CLK_SCLK_HDMI>; |
| 768 | clock-names = "mixer", "hdmi", "sclk_hdmi"; | ||
| 737 | }; | 769 | }; |
| 738 | 770 | ||
| 739 | dp_phy: video-phy@10040720 { | 771 | dp_phy: video-phy@10040720 { |
| @@ -743,6 +775,7 @@ | |||
| 743 | }; | 775 | }; |
| 744 | 776 | ||
| 745 | dp: dp-controller@145B0000 { | 777 | dp: dp-controller@145B0000 { |
| 778 | power-domains = <&pd_disp1>; | ||
| 746 | clocks = <&clock CLK_DP>; | 779 | clocks = <&clock CLK_DP>; |
| 747 | clock-names = "dp"; | 780 | clock-names = "dp"; |
| 748 | phys = <&dp_phy>; | 781 | phys = <&dp_phy>; |
| @@ -750,6 +783,7 @@ | |||
| 750 | }; | 783 | }; |
| 751 | 784 | ||
| 752 | fimd: fimd@14400000 { | 785 | fimd: fimd@14400000 { |
| 786 | power-domains = <&pd_disp1>; | ||
| 753 | clocks = <&clock CLK_SCLK_FIMD1>, <&clock CLK_FIMD1>; | 787 | clocks = <&clock CLK_SCLK_FIMD1>, <&clock CLK_FIMD1>; |
| 754 | clock-names = "sclk_fimd", "fimd"; | 788 | clock-names = "sclk_fimd", "fimd"; |
| 755 | }; | 789 | }; |
diff --git a/arch/arm/boot/dts/exynos5420-trip-points.dtsi b/arch/arm/boot/dts/exynos5420-trip-points.dtsi new file mode 100644 index 000000000000..5d31fc140823 --- /dev/null +++ b/arch/arm/boot/dts/exynos5420-trip-points.dtsi | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | /* | ||
| 2 | * Device tree sources for default Exynos5420 thermal zone definition | ||
| 3 | * | ||
| 4 | * Copyright (c) 2014 Lukasz Majewski <l.majewski@samsung.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | polling-delay-passive = <0>; | ||
| 13 | polling-delay = <0>; | ||
| 14 | trips { | ||
| 15 | cpu-alert-0 { | ||
| 16 | temperature = <85000>; /* millicelsius */ | ||
| 17 | hysteresis = <10000>; /* millicelsius */ | ||
| 18 | type = "active"; | ||
| 19 | }; | ||
| 20 | cpu-alert-1 { | ||
| 21 | temperature = <103000>; /* millicelsius */ | ||
| 22 | hysteresis = <10000>; /* millicelsius */ | ||
| 23 | type = "active"; | ||
| 24 | }; | ||
| 25 | cpu-alert-2 { | ||
| 26 | temperature = <110000>; /* millicelsius */ | ||
| 27 | hysteresis = <10000>; /* millicelsius */ | ||
| 28 | type = "active"; | ||
| 29 | }; | ||
| 30 | cpu-crit-0 { | ||
| 31 | temperature = <1200000>; /* millicelsius */ | ||
| 32 | hysteresis = <0>; /* millicelsius */ | ||
| 33 | type = "critical"; | ||
| 34 | }; | ||
| 35 | }; | ||
diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi index 9dc2e9773b30..c0e98cf3514f 100644 --- a/arch/arm/boot/dts/exynos5420.dtsi +++ b/arch/arm/boot/dts/exynos5420.dtsi | |||
| @@ -740,8 +740,9 @@ | |||
| 740 | compatible = "samsung,exynos5420-mixer"; | 740 | compatible = "samsung,exynos5420-mixer"; |
| 741 | reg = <0x14450000 0x10000>; | 741 | reg = <0x14450000 0x10000>; |
| 742 | interrupts = <0 94 0>; | 742 | interrupts = <0 94 0>; |
| 743 | clocks = <&clock CLK_MIXER>, <&clock CLK_SCLK_HDMI>; | 743 | clocks = <&clock CLK_MIXER>, <&clock CLK_HDMI>, |
| 744 | clock-names = "mixer", "sclk_hdmi"; | 744 | <&clock CLK_SCLK_HDMI>; |
| 745 | clock-names = "mixer", "hdmi", "sclk_hdmi"; | ||
| 745 | power-domains = <&disp_pd>; | 746 | power-domains = <&disp_pd>; |
| 746 | }; | 747 | }; |
| 747 | 748 | ||
| @@ -782,6 +783,7 @@ | |||
| 782 | interrupts = <0 65 0>; | 783 | interrupts = <0 65 0>; |
| 783 | clocks = <&clock CLK_TMU>; | 784 | clocks = <&clock CLK_TMU>; |
| 784 | clock-names = "tmu_apbif"; | 785 | clock-names = "tmu_apbif"; |
| 786 | #include "exynos4412-tmu-sensor-conf.dtsi" | ||
| 785 | }; | 787 | }; |
| 786 | 788 | ||
| 787 | tmu_cpu1: tmu@10064000 { | 789 | tmu_cpu1: tmu@10064000 { |
| @@ -790,6 +792,7 @@ | |||
| 790 | interrupts = <0 183 0>; | 792 | interrupts = <0 183 0>; |
| 791 | clocks = <&clock CLK_TMU>; | 793 | clocks = <&clock CLK_TMU>; |
| 792 | clock-names = "tmu_apbif"; | 794 | clock-names = "tmu_apbif"; |
| 795 | #include "exynos4412-tmu-sensor-conf.dtsi" | ||
| 793 | }; | 796 | }; |
| 794 | 797 | ||
| 795 | tmu_cpu2: tmu@10068000 { | 798 | tmu_cpu2: tmu@10068000 { |
| @@ -798,6 +801,7 @@ | |||
| 798 | interrupts = <0 184 0>; | 801 | interrupts = <0 184 0>; |
| 799 | clocks = <&clock CLK_TMU>, <&clock CLK_TMU>; | 802 | clocks = <&clock CLK_TMU>, <&clock CLK_TMU>; |
| 800 | clock-names = "tmu_apbif", "tmu_triminfo_apbif"; | 803 | clock-names = "tmu_apbif", "tmu_triminfo_apbif"; |
| 804 | #include "exynos4412-tmu-sensor-conf.dtsi" | ||
| 801 | }; | 805 | }; |
| 802 | 806 | ||
| 803 | tmu_cpu3: tmu@1006c000 { | 807 | tmu_cpu3: tmu@1006c000 { |
| @@ -806,6 +810,7 @@ | |||
| 806 | interrupts = <0 185 0>; | 810 | interrupts = <0 185 0>; |
| 807 | clocks = <&clock CLK_TMU>, <&clock CLK_TMU_GPU>; | 811 | clocks = <&clock CLK_TMU>, <&clock CLK_TMU_GPU>; |
| 808 | clock-names = "tmu_apbif", "tmu_triminfo_apbif"; | 812 | clock-names = "tmu_apbif", "tmu_triminfo_apbif"; |
| 813 | #include "exynos4412-tmu-sensor-conf.dtsi" | ||
| 809 | }; | 814 | }; |
| 810 | 815 | ||
| 811 | tmu_gpu: tmu@100a0000 { | 816 | tmu_gpu: tmu@100a0000 { |
| @@ -814,6 +819,30 @@ | |||
| 814 | interrupts = <0 215 0>; | 819 | interrupts = <0 215 0>; |
| 815 | clocks = <&clock CLK_TMU_GPU>, <&clock CLK_TMU>; | 820 | clocks = <&clock CLK_TMU_GPU>, <&clock CLK_TMU>; |
| 816 | clock-names = "tmu_apbif", "tmu_triminfo_apbif"; | 821 | clock-names = "tmu_apbif", "tmu_triminfo_apbif"; |
| 822 | #include "exynos4412-tmu-sensor-conf.dtsi" | ||
| 823 | }; | ||
| 824 | |||
| 825 | thermal-zones { | ||
| 826 | cpu0_thermal: cpu0-thermal { | ||
| 827 | thermal-sensors = <&tmu_cpu0>; | ||
| 828 | #include "exynos5420-trip-points.dtsi" | ||
| 829 | }; | ||
| 830 | cpu1_thermal: cpu1-thermal { | ||
| 831 | thermal-sensors = <&tmu_cpu1>; | ||
| 832 | #include "exynos5420-trip-points.dtsi" | ||
| 833 | }; | ||
| 834 | cpu2_thermal: cpu2-thermal { | ||
| 835 | thermal-sensors = <&tmu_cpu2>; | ||
| 836 | #include "exynos5420-trip-points.dtsi" | ||
| 837 | }; | ||
| 838 | cpu3_thermal: cpu3-thermal { | ||
| 839 | thermal-sensors = <&tmu_cpu3>; | ||
| 840 | #include "exynos5420-trip-points.dtsi" | ||
| 841 | }; | ||
| 842 | gpu_thermal: gpu-thermal { | ||
| 843 | thermal-sensors = <&tmu_gpu>; | ||
| 844 | #include "exynos5420-trip-points.dtsi" | ||
| 845 | }; | ||
| 817 | }; | 846 | }; |
| 818 | 847 | ||
| 819 | watchdog: watchdog@101D0000 { | 848 | watchdog: watchdog@101D0000 { |
diff --git a/arch/arm/boot/dts/exynos5440-tmu-sensor-conf.dtsi b/arch/arm/boot/dts/exynos5440-tmu-sensor-conf.dtsi new file mode 100644 index 000000000000..7b2fba0ae92b --- /dev/null +++ b/arch/arm/boot/dts/exynos5440-tmu-sensor-conf.dtsi | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | /* | ||
| 2 | * Device tree sources for Exynos5440 TMU sensor configuration | ||
| 3 | * | ||
| 4 | * Copyright (c) 2014 Lukasz Majewski <l.majewski@samsung.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <dt-bindings/thermal/thermal_exynos.h> | ||
| 13 | |||
| 14 | #thermal-sensor-cells = <0>; | ||
| 15 | samsung,tmu_gain = <5>; | ||
| 16 | samsung,tmu_reference_voltage = <16>; | ||
| 17 | samsung,tmu_noise_cancel_mode = <4>; | ||
| 18 | samsung,tmu_efuse_value = <0x5d2d>; | ||
| 19 | samsung,tmu_min_efuse_value = <16>; | ||
| 20 | samsung,tmu_max_efuse_value = <76>; | ||
| 21 | samsung,tmu_first_point_trim = <25>; | ||
| 22 | samsung,tmu_second_point_trim = <70>; | ||
| 23 | samsung,tmu_default_temp_offset = <25>; | ||
| 24 | samsung,tmu_cal_type = <TYPE_ONE_POINT_TRIMMING>; | ||
diff --git a/arch/arm/boot/dts/exynos5440-trip-points.dtsi b/arch/arm/boot/dts/exynos5440-trip-points.dtsi new file mode 100644 index 000000000000..48adfa8f4300 --- /dev/null +++ b/arch/arm/boot/dts/exynos5440-trip-points.dtsi | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | /* | ||
| 2 | * Device tree sources for default Exynos5440 thermal zone definition | ||
| 3 | * | ||
| 4 | * Copyright (c) 2014 Lukasz Majewski <l.majewski@samsung.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | polling-delay-passive = <0>; | ||
| 13 | polling-delay = <0>; | ||
| 14 | trips { | ||
| 15 | cpu-alert-0 { | ||
| 16 | temperature = <100000>; /* millicelsius */ | ||
| 17 | hysteresis = <0>; /* millicelsius */ | ||
| 18 | type = "active"; | ||
| 19 | }; | ||
| 20 | cpu-crit-0 { | ||
| 21 | temperature = <1050000>; /* millicelsius */ | ||
| 22 | hysteresis = <0>; /* millicelsius */ | ||
| 23 | type = "critical"; | ||
| 24 | }; | ||
| 25 | }; | ||
diff --git a/arch/arm/boot/dts/exynos5440.dtsi b/arch/arm/boot/dts/exynos5440.dtsi index 8f3373cd7b87..59d9416b3b03 100644 --- a/arch/arm/boot/dts/exynos5440.dtsi +++ b/arch/arm/boot/dts/exynos5440.dtsi | |||
| @@ -219,6 +219,7 @@ | |||
| 219 | interrupts = <0 58 0>; | 219 | interrupts = <0 58 0>; |
| 220 | clocks = <&clock CLK_B_125>; | 220 | clocks = <&clock CLK_B_125>; |
| 221 | clock-names = "tmu_apbif"; | 221 | clock-names = "tmu_apbif"; |
| 222 | #include "exynos5440-tmu-sensor-conf.dtsi" | ||
| 222 | }; | 223 | }; |
| 223 | 224 | ||
| 224 | tmuctrl_1: tmuctrl@16011C { | 225 | tmuctrl_1: tmuctrl@16011C { |
| @@ -227,6 +228,7 @@ | |||
| 227 | interrupts = <0 58 0>; | 228 | interrupts = <0 58 0>; |
| 228 | clocks = <&clock CLK_B_125>; | 229 | clocks = <&clock CLK_B_125>; |
| 229 | clock-names = "tmu_apbif"; | 230 | clock-names = "tmu_apbif"; |
| 231 | #include "exynos5440-tmu-sensor-conf.dtsi" | ||
| 230 | }; | 232 | }; |
| 231 | 233 | ||
| 232 | tmuctrl_2: tmuctrl@160120 { | 234 | tmuctrl_2: tmuctrl@160120 { |
| @@ -235,6 +237,22 @@ | |||
| 235 | interrupts = <0 58 0>; | 237 | interrupts = <0 58 0>; |
| 236 | clocks = <&clock CLK_B_125>; | 238 | clocks = <&clock CLK_B_125>; |
| 237 | clock-names = "tmu_apbif"; | 239 | clock-names = "tmu_apbif"; |
| 240 | #include "exynos5440-tmu-sensor-conf.dtsi" | ||
| 241 | }; | ||
| 242 | |||
| 243 | thermal-zones { | ||
| 244 | cpu0_thermal: cpu0-thermal { | ||
| 245 | thermal-sensors = <&tmuctrl_0>; | ||
| 246 | #include "exynos5440-trip-points.dtsi" | ||
| 247 | }; | ||
| 248 | cpu1_thermal: cpu1-thermal { | ||
| 249 | thermal-sensors = <&tmuctrl_1>; | ||
| 250 | #include "exynos5440-trip-points.dtsi" | ||
| 251 | }; | ||
| 252 | cpu2_thermal: cpu2-thermal { | ||
| 253 | thermal-sensors = <&tmuctrl_2>; | ||
| 254 | #include "exynos5440-trip-points.dtsi" | ||
| 255 | }; | ||
| 238 | }; | 256 | }; |
| 239 | 257 | ||
| 240 | sata@210000 { | 258 | sata@210000 { |
diff --git a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi index f1cd2147421d..a626e6dd8022 100644 --- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi +++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | regulator-max-microvolt = <5000000>; | 35 | regulator-max-microvolt = <5000000>; |
| 36 | gpio = <&gpio3 22 0>; | 36 | gpio = <&gpio3 22 0>; |
| 37 | enable-active-high; | 37 | enable-active-high; |
| 38 | vin-supply = <&swbst_reg>; | ||
| 38 | }; | 39 | }; |
| 39 | 40 | ||
| 40 | reg_usb_h1_vbus: regulator@1 { | 41 | reg_usb_h1_vbus: regulator@1 { |
| @@ -45,6 +46,7 @@ | |||
| 45 | regulator-max-microvolt = <5000000>; | 46 | regulator-max-microvolt = <5000000>; |
| 46 | gpio = <&gpio1 29 0>; | 47 | gpio = <&gpio1 29 0>; |
| 47 | enable-active-high; | 48 | enable-active-high; |
| 49 | vin-supply = <&swbst_reg>; | ||
| 48 | }; | 50 | }; |
| 49 | 51 | ||
| 50 | reg_audio: regulator@2 { | 52 | reg_audio: regulator@2 { |
diff --git a/arch/arm/boot/dts/imx6sl-evk.dts b/arch/arm/boot/dts/imx6sl-evk.dts index fda4932faefd..945887d3fdb3 100644 --- a/arch/arm/boot/dts/imx6sl-evk.dts +++ b/arch/arm/boot/dts/imx6sl-evk.dts | |||
| @@ -52,6 +52,7 @@ | |||
| 52 | regulator-max-microvolt = <5000000>; | 52 | regulator-max-microvolt = <5000000>; |
| 53 | gpio = <&gpio4 0 0>; | 53 | gpio = <&gpio4 0 0>; |
| 54 | enable-active-high; | 54 | enable-active-high; |
| 55 | vin-supply = <&swbst_reg>; | ||
| 55 | }; | 56 | }; |
| 56 | 57 | ||
| 57 | reg_usb_otg2_vbus: regulator@1 { | 58 | reg_usb_otg2_vbus: regulator@1 { |
| @@ -62,6 +63,7 @@ | |||
| 62 | regulator-max-microvolt = <5000000>; | 63 | regulator-max-microvolt = <5000000>; |
| 63 | gpio = <&gpio4 2 0>; | 64 | gpio = <&gpio4 2 0>; |
| 64 | enable-active-high; | 65 | enable-active-high; |
| 66 | vin-supply = <&swbst_reg>; | ||
| 65 | }; | 67 | }; |
| 66 | 68 | ||
| 67 | reg_aud3v: regulator@2 { | 69 | reg_aud3v: regulator@2 { |
diff --git a/arch/arm/boot/dts/omap2.dtsi b/arch/arm/boot/dts/omap2.dtsi index 59d1c297bb30..578fa2a54dce 100644 --- a/arch/arm/boot/dts/omap2.dtsi +++ b/arch/arm/boot/dts/omap2.dtsi | |||
| @@ -87,8 +87,8 @@ | |||
| 87 | <14>, | 87 | <14>, |
| 88 | <15>; | 88 | <15>; |
| 89 | #dma-cells = <1>; | 89 | #dma-cells = <1>; |
| 90 | #dma-channels = <32>; | 90 | dma-channels = <32>; |
| 91 | #dma-requests = <64>; | 91 | dma-requests = <64>; |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| 94 | i2c1: i2c@48070000 { | 94 | i2c1: i2c@48070000 { |
diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts index 60403273f83e..db80f9d376fa 100644 --- a/arch/arm/boot/dts/omap3-n900.dts +++ b/arch/arm/boot/dts/omap3-n900.dts | |||
| @@ -16,6 +16,13 @@ | |||
| 16 | model = "Nokia N900"; | 16 | model = "Nokia N900"; |
| 17 | compatible = "nokia,omap3-n900", "ti,omap3430", "ti,omap3"; | 17 | compatible = "nokia,omap3-n900", "ti,omap3430", "ti,omap3"; |
| 18 | 18 | ||
| 19 | aliases { | ||
| 20 | i2c0; | ||
| 21 | i2c1 = &i2c1; | ||
| 22 | i2c2 = &i2c2; | ||
| 23 | i2c3 = &i2c3; | ||
| 24 | }; | ||
| 25 | |||
| 19 | cpus { | 26 | cpus { |
| 20 | cpu@0 { | 27 | cpu@0 { |
| 21 | cpu0-supply = <&vcc>; | 28 | cpu0-supply = <&vcc>; |
| @@ -704,7 +711,7 @@ | |||
| 704 | compatible = "smsc,lan91c94"; | 711 | compatible = "smsc,lan91c94"; |
| 705 | interrupt-parent = <&gpio2>; | 712 | interrupt-parent = <&gpio2>; |
| 706 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; /* gpio54 */ | 713 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; /* gpio54 */ |
| 707 | reg = <1 0x300 0xf>; /* 16 byte IO range at offset 0x300 */ | 714 | reg = <1 0 0xf>; /* 16 byte IO range */ |
| 708 | bank-width = <2>; | 715 | bank-width = <2>; |
| 709 | pinctrl-names = "default"; | 716 | pinctrl-names = "default"; |
| 710 | pinctrl-0 = <ðernet_pins>; | 717 | pinctrl-0 = <ðernet_pins>; |
diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 01b71111bd55..f4f78c40b564 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi | |||
| @@ -155,8 +155,8 @@ | |||
| 155 | <14>, | 155 | <14>, |
| 156 | <15>; | 156 | <15>; |
| 157 | #dma-cells = <1>; | 157 | #dma-cells = <1>; |
| 158 | #dma-channels = <32>; | 158 | dma-channels = <32>; |
| 159 | #dma-requests = <96>; | 159 | dma-requests = <96>; |
| 160 | }; | 160 | }; |
| 161 | 161 | ||
| 162 | omap3_pmx_core: pinmux@48002030 { | 162 | omap3_pmx_core: pinmux@48002030 { |
diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index 074147cebae4..87401d9f4d8b 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi | |||
| @@ -223,8 +223,8 @@ | |||
| 223 | <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, | 223 | <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, |
| 224 | <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; | 224 | <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; |
| 225 | #dma-cells = <1>; | 225 | #dma-cells = <1>; |
| 226 | #dma-channels = <32>; | 226 | dma-channels = <32>; |
| 227 | #dma-requests = <127>; | 227 | dma-requests = <127>; |
| 228 | }; | 228 | }; |
| 229 | 229 | ||
| 230 | gpio1: gpio@4a310000 { | 230 | gpio1: gpio@4a310000 { |
diff --git a/arch/arm/boot/dts/omap5-core-thermal.dtsi b/arch/arm/boot/dts/omap5-core-thermal.dtsi index 19212ac6eef0..de8a3d456cf7 100644 --- a/arch/arm/boot/dts/omap5-core-thermal.dtsi +++ b/arch/arm/boot/dts/omap5-core-thermal.dtsi | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | core_thermal: core_thermal { | 14 | core_thermal: core_thermal { |
| 15 | polling-delay-passive = <250>; /* milliseconds */ | 15 | polling-delay-passive = <250>; /* milliseconds */ |
| 16 | polling-delay = <1000>; /* milliseconds */ | 16 | polling-delay = <500>; /* milliseconds */ |
| 17 | 17 | ||
| 18 | /* sensor ID */ | 18 | /* sensor ID */ |
| 19 | thermal-sensors = <&bandgap 2>; | 19 | thermal-sensors = <&bandgap 2>; |
diff --git a/arch/arm/boot/dts/omap5-gpu-thermal.dtsi b/arch/arm/boot/dts/omap5-gpu-thermal.dtsi index 1b87aca88b77..bc3090f2e84b 100644 --- a/arch/arm/boot/dts/omap5-gpu-thermal.dtsi +++ b/arch/arm/boot/dts/omap5-gpu-thermal.dtsi | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | gpu_thermal: gpu_thermal { | 14 | gpu_thermal: gpu_thermal { |
| 15 | polling-delay-passive = <250>; /* milliseconds */ | 15 | polling-delay-passive = <250>; /* milliseconds */ |
| 16 | polling-delay = <1000>; /* milliseconds */ | 16 | polling-delay = <500>; /* milliseconds */ |
| 17 | 17 | ||
| 18 | /* sensor ID */ | 18 | /* sensor ID */ |
| 19 | thermal-sensors = <&bandgap 1>; | 19 | thermal-sensors = <&bandgap 1>; |
diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi index b321fdf42c9f..4a485b63a141 100644 --- a/arch/arm/boot/dts/omap5.dtsi +++ b/arch/arm/boot/dts/omap5.dtsi | |||
| @@ -238,8 +238,8 @@ | |||
| 238 | <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, | 238 | <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, |
| 239 | <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; | 239 | <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; |
| 240 | #dma-cells = <1>; | 240 | #dma-cells = <1>; |
| 241 | #dma-channels = <32>; | 241 | dma-channels = <32>; |
| 242 | #dma-requests = <127>; | 242 | dma-requests = <127>; |
| 243 | }; | 243 | }; |
| 244 | 244 | ||
| 245 | gpio1: gpio@4ae10000 { | 245 | gpio1: gpio@4ae10000 { |
| @@ -929,8 +929,8 @@ | |||
| 929 | <0x4A096800 0x40>; /* pll_ctrl */ | 929 | <0x4A096800 0x40>; /* pll_ctrl */ |
| 930 | reg-names = "phy_rx", "phy_tx", "pll_ctrl"; | 930 | reg-names = "phy_rx", "phy_tx", "pll_ctrl"; |
| 931 | ctrl-module = <&omap_control_sata>; | 931 | ctrl-module = <&omap_control_sata>; |
| 932 | clocks = <&sys_clkin>; | 932 | clocks = <&sys_clkin>, <&sata_ref_clk>; |
| 933 | clock-names = "sysclk"; | 933 | clock-names = "sysclk", "refclk"; |
| 934 | #phy-cells = <0>; | 934 | #phy-cells = <0>; |
| 935 | }; | 935 | }; |
| 936 | }; | 936 | }; |
| @@ -1079,4 +1079,8 @@ | |||
| 1079 | }; | 1079 | }; |
| 1080 | }; | 1080 | }; |
| 1081 | 1081 | ||
| 1082 | &cpu_thermal { | ||
| 1083 | polling-delay = <500>; /* milliseconds */ | ||
| 1084 | }; | ||
| 1085 | |||
| 1082 | /include/ "omap54xx-clocks.dtsi" | 1086 | /include/ "omap54xx-clocks.dtsi" |
diff --git a/arch/arm/boot/dts/omap54xx-clocks.dtsi b/arch/arm/boot/dts/omap54xx-clocks.dtsi index 58c27466f012..83b425fb3ac2 100644 --- a/arch/arm/boot/dts/omap54xx-clocks.dtsi +++ b/arch/arm/boot/dts/omap54xx-clocks.dtsi | |||
| @@ -167,10 +167,18 @@ | |||
| 167 | ti,index-starts-at-one; | 167 | ti,index-starts-at-one; |
| 168 | }; | 168 | }; |
| 169 | 169 | ||
| 170 | dpll_core_byp_mux: dpll_core_byp_mux { | ||
| 171 | #clock-cells = <0>; | ||
| 172 | compatible = "ti,mux-clock"; | ||
| 173 | clocks = <&sys_clkin>, <&dpll_abe_m3x2_ck>; | ||
| 174 | ti,bit-shift = <23>; | ||
| 175 | reg = <0x012c>; | ||
| 176 | }; | ||
| 177 | |||
| 170 | dpll_core_ck: dpll_core_ck { | 178 | dpll_core_ck: dpll_core_ck { |
| 171 | #clock-cells = <0>; | 179 | #clock-cells = <0>; |
| 172 | compatible = "ti,omap4-dpll-core-clock"; | 180 | compatible = "ti,omap4-dpll-core-clock"; |
| 173 | clocks = <&sys_clkin>, <&dpll_abe_m3x2_ck>; | 181 | clocks = <&sys_clkin>, <&dpll_core_byp_mux>; |
| 174 | reg = <0x0120>, <0x0124>, <0x012c>, <0x0128>; | 182 | reg = <0x0120>, <0x0124>, <0x012c>, <0x0128>; |
| 175 | }; | 183 | }; |
| 176 | 184 | ||
| @@ -294,10 +302,18 @@ | |||
| 294 | clock-div = <1>; | 302 | clock-div = <1>; |
| 295 | }; | 303 | }; |
| 296 | 304 | ||
| 305 | dpll_iva_byp_mux: dpll_iva_byp_mux { | ||
| 306 | #clock-cells = <0>; | ||
| 307 | compatible = "ti,mux-clock"; | ||
| 308 | clocks = <&sys_clkin>, <&iva_dpll_hs_clk_div>; | ||
| 309 | ti,bit-shift = <23>; | ||
| 310 | reg = <0x01ac>; | ||
| 311 | }; | ||
| 312 | |||
| 297 | dpll_iva_ck: dpll_iva_ck { | 313 | dpll_iva_ck: dpll_iva_ck { |
| 298 | #clock-cells = <0>; | 314 | #clock-cells = <0>; |
| 299 | compatible = "ti,omap4-dpll-clock"; | 315 | compatible = "ti,omap4-dpll-clock"; |
| 300 | clocks = <&sys_clkin>, <&iva_dpll_hs_clk_div>; | 316 | clocks = <&sys_clkin>, <&dpll_iva_byp_mux>; |
| 301 | reg = <0x01a0>, <0x01a4>, <0x01ac>, <0x01a8>; | 317 | reg = <0x01a0>, <0x01a4>, <0x01ac>, <0x01a8>; |
| 302 | }; | 318 | }; |
| 303 | 319 | ||
| @@ -599,10 +615,19 @@ | |||
| 599 | }; | 615 | }; |
| 600 | }; | 616 | }; |
| 601 | &cm_core_clocks { | 617 | &cm_core_clocks { |
| 618 | |||
| 619 | dpll_per_byp_mux: dpll_per_byp_mux { | ||
| 620 | #clock-cells = <0>; | ||
| 621 | compatible = "ti,mux-clock"; | ||
| 622 | clocks = <&sys_clkin>, <&per_dpll_hs_clk_div>; | ||
| 623 | ti,bit-shift = <23>; | ||
| 624 | reg = <0x014c>; | ||
| 625 | }; | ||
| 626 | |||
| 602 | dpll_per_ck: dpll_per_ck { | 627 | dpll_per_ck: dpll_per_ck { |
| 603 | #clock-cells = <0>; | 628 | #clock-cells = <0>; |
| 604 | compatible = "ti,omap4-dpll-clock"; | 629 | compatible = "ti,omap4-dpll-clock"; |
| 605 | clocks = <&sys_clkin>, <&per_dpll_hs_clk_div>; | 630 | clocks = <&sys_clkin>, <&dpll_per_byp_mux>; |
| 606 | reg = <0x0140>, <0x0144>, <0x014c>, <0x0148>; | 631 | reg = <0x0140>, <0x0144>, <0x014c>, <0x0148>; |
| 607 | }; | 632 | }; |
| 608 | 633 | ||
| @@ -714,10 +739,18 @@ | |||
| 714 | ti,index-starts-at-one; | 739 | ti,index-starts-at-one; |
| 715 | }; | 740 | }; |
| 716 | 741 | ||
| 742 | dpll_usb_byp_mux: dpll_usb_byp_mux { | ||
| 743 | #clock-cells = <0>; | ||
| 744 | compatible = "ti,mux-clock"; | ||
| 745 | clocks = <&sys_clkin>, <&usb_dpll_hs_clk_div>; | ||
| 746 | ti,bit-shift = <23>; | ||
| 747 | reg = <0x018c>; | ||
| 748 | }; | ||
| 749 | |||
| 717 | dpll_usb_ck: dpll_usb_ck { | 750 | dpll_usb_ck: dpll_usb_ck { |
| 718 | #clock-cells = <0>; | 751 | #clock-cells = <0>; |
| 719 | compatible = "ti,omap4-dpll-j-type-clock"; | 752 | compatible = "ti,omap4-dpll-j-type-clock"; |
| 720 | clocks = <&sys_clkin>, <&usb_dpll_hs_clk_div>; | 753 | clocks = <&sys_clkin>, <&dpll_usb_byp_mux>; |
| 721 | reg = <0x0180>, <0x0184>, <0x018c>, <0x0188>; | 754 | reg = <0x0180>, <0x0184>, <0x018c>, <0x0188>; |
| 722 | }; | 755 | }; |
| 723 | 756 | ||
diff --git a/arch/arm/boot/dts/sama5d3.dtsi b/arch/arm/boot/dts/sama5d3.dtsi index 261311bdf65b..367af53c1b84 100644 --- a/arch/arm/boot/dts/sama5d3.dtsi +++ b/arch/arm/boot/dts/sama5d3.dtsi | |||
| @@ -1248,7 +1248,6 @@ | |||
| 1248 | atmel,watchdog-type = "hardware"; | 1248 | atmel,watchdog-type = "hardware"; |
| 1249 | atmel,reset-type = "all"; | 1249 | atmel,reset-type = "all"; |
| 1250 | atmel,dbg-halt; | 1250 | atmel,dbg-halt; |
| 1251 | atmel,idle-halt; | ||
| 1252 | status = "disabled"; | 1251 | status = "disabled"; |
| 1253 | }; | 1252 | }; |
| 1254 | 1253 | ||
| @@ -1416,7 +1415,7 @@ | |||
| 1416 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; | 1415 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; |
| 1417 | reg = <0x00700000 0x100000>; | 1416 | reg = <0x00700000 0x100000>; |
| 1418 | interrupts = <32 IRQ_TYPE_LEVEL_HIGH 2>; | 1417 | interrupts = <32 IRQ_TYPE_LEVEL_HIGH 2>; |
| 1419 | clocks = <&usb>, <&uhphs_clk>, <&uhpck>; | 1418 | clocks = <&utmi>, <&uhphs_clk>, <&uhpck>; |
| 1420 | clock-names = "usb_clk", "ehci_clk", "uhpck"; | 1419 | clock-names = "usb_clk", "ehci_clk", "uhpck"; |
| 1421 | status = "disabled"; | 1420 | status = "disabled"; |
| 1422 | }; | 1421 | }; |
diff --git a/arch/arm/boot/dts/sama5d4.dtsi b/arch/arm/boot/dts/sama5d4.dtsi index d986b41b9654..4303874889c6 100644 --- a/arch/arm/boot/dts/sama5d4.dtsi +++ b/arch/arm/boot/dts/sama5d4.dtsi | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | gpio4 = &pioE; | 66 | gpio4 = &pioE; |
| 67 | tcb0 = &tcb0; | 67 | tcb0 = &tcb0; |
| 68 | tcb1 = &tcb1; | 68 | tcb1 = &tcb1; |
| 69 | i2c0 = &i2c0; | ||
| 69 | i2c2 = &i2c2; | 70 | i2c2 = &i2c2; |
| 70 | }; | 71 | }; |
| 71 | cpus { | 72 | cpus { |
| @@ -259,7 +260,7 @@ | |||
| 259 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; | 260 | compatible = "atmel,at91sam9g45-ehci", "usb-ehci"; |
| 260 | reg = <0x00600000 0x100000>; | 261 | reg = <0x00600000 0x100000>; |
| 261 | interrupts = <46 IRQ_TYPE_LEVEL_HIGH 2>; | 262 | interrupts = <46 IRQ_TYPE_LEVEL_HIGH 2>; |
| 262 | clocks = <&usb>, <&uhphs_clk>, <&uhpck>; | 263 | clocks = <&utmi>, <&uhphs_clk>, <&uhpck>; |
| 263 | clock-names = "usb_clk", "ehci_clk", "uhpck"; | 264 | clock-names = "usb_clk", "ehci_clk", "uhpck"; |
| 264 | status = "disabled"; | 265 | status = "disabled"; |
| 265 | }; | 266 | }; |
| @@ -461,8 +462,8 @@ | |||
| 461 | 462 | ||
| 462 | lcdck: lcdck { | 463 | lcdck: lcdck { |
| 463 | #clock-cells = <0>; | 464 | #clock-cells = <0>; |
| 464 | reg = <4>; | 465 | reg = <3>; |
| 465 | clocks = <&smd>; | 466 | clocks = <&mck>; |
| 466 | }; | 467 | }; |
| 467 | 468 | ||
| 468 | smdck: smdck { | 469 | smdck: smdck { |
| @@ -770,7 +771,7 @@ | |||
| 770 | reg = <50>; | 771 | reg = <50>; |
| 771 | }; | 772 | }; |
| 772 | 773 | ||
| 773 | lcd_clk: lcd_clk { | 774 | lcdc_clk: lcdc_clk { |
| 774 | #clock-cells = <0>; | 775 | #clock-cells = <0>; |
| 775 | reg = <51>; | 776 | reg = <51>; |
| 776 | }; | 777 | }; |
diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi index 252c3d1bda50..9d8760956752 100644 --- a/arch/arm/boot/dts/socfpga.dtsi +++ b/arch/arm/boot/dts/socfpga.dtsi | |||
| @@ -713,6 +713,9 @@ | |||
| 713 | reg-shift = <2>; | 713 | reg-shift = <2>; |
| 714 | reg-io-width = <4>; | 714 | reg-io-width = <4>; |
| 715 | clocks = <&l4_sp_clk>; | 715 | clocks = <&l4_sp_clk>; |
| 716 | dmas = <&pdma 28>, | ||
| 717 | <&pdma 29>; | ||
| 718 | dma-names = "tx", "rx"; | ||
| 716 | }; | 719 | }; |
| 717 | 720 | ||
| 718 | uart1: serial1@ffc03000 { | 721 | uart1: serial1@ffc03000 { |
| @@ -722,6 +725,9 @@ | |||
| 722 | reg-shift = <2>; | 725 | reg-shift = <2>; |
| 723 | reg-io-width = <4>; | 726 | reg-io-width = <4>; |
| 724 | clocks = <&l4_sp_clk>; | 727 | clocks = <&l4_sp_clk>; |
| 728 | dmas = <&pdma 30>, | ||
| 729 | <&pdma 31>; | ||
| 730 | dma-names = "tx", "rx"; | ||
| 725 | }; | 731 | }; |
| 726 | 732 | ||
| 727 | rst: rstmgr@ffd05000 { | 733 | rst: rstmgr@ffd05000 { |
diff --git a/arch/arm/configs/at91_dt_defconfig b/arch/arm/configs/at91_dt_defconfig index f2670f638e97..811e72bbe642 100644 --- a/arch/arm/configs/at91_dt_defconfig +++ b/arch/arm/configs/at91_dt_defconfig | |||
| @@ -70,6 +70,7 @@ CONFIG_SCSI=y | |||
| 70 | CONFIG_BLK_DEV_SD=y | 70 | CONFIG_BLK_DEV_SD=y |
| 71 | # CONFIG_SCSI_LOWLEVEL is not set | 71 | # CONFIG_SCSI_LOWLEVEL is not set |
| 72 | CONFIG_NETDEVICES=y | 72 | CONFIG_NETDEVICES=y |
| 73 | CONFIG_ARM_AT91_ETHER=y | ||
| 73 | CONFIG_MACB=y | 74 | CONFIG_MACB=y |
| 74 | # CONFIG_NET_VENDOR_BROADCOM is not set | 75 | # CONFIG_NET_VENDOR_BROADCOM is not set |
| 75 | CONFIG_DM9000=y | 76 | CONFIG_DM9000=y |
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig index e8a4c955241b..06075b6d2463 100644 --- a/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig | |||
| @@ -62,6 +62,17 @@ CONFIG_MACH_SPEAR1340=y | |||
| 62 | CONFIG_ARCH_STI=y | 62 | CONFIG_ARCH_STI=y |
| 63 | CONFIG_ARCH_EXYNOS=y | 63 | CONFIG_ARCH_EXYNOS=y |
| 64 | CONFIG_EXYNOS5420_MCPM=y | 64 | CONFIG_EXYNOS5420_MCPM=y |
| 65 | CONFIG_ARCH_SHMOBILE_MULTI=y | ||
| 66 | CONFIG_ARCH_EMEV2=y | ||
| 67 | CONFIG_ARCH_R7S72100=y | ||
| 68 | CONFIG_ARCH_R8A73A4=y | ||
| 69 | CONFIG_ARCH_R8A7740=y | ||
| 70 | CONFIG_ARCH_R8A7779=y | ||
| 71 | CONFIG_ARCH_R8A7790=y | ||
| 72 | CONFIG_ARCH_R8A7791=y | ||
| 73 | CONFIG_ARCH_R8A7794=y | ||
| 74 | CONFIG_ARCH_SH73A0=y | ||
| 75 | CONFIG_MACH_MARZEN=y | ||
| 65 | CONFIG_ARCH_SUNXI=y | 76 | CONFIG_ARCH_SUNXI=y |
| 66 | CONFIG_ARCH_SIRF=y | 77 | CONFIG_ARCH_SIRF=y |
| 67 | CONFIG_ARCH_TEGRA=y | 78 | CONFIG_ARCH_TEGRA=y |
| @@ -84,9 +95,11 @@ CONFIG_PCI_KEYSTONE=y | |||
| 84 | CONFIG_PCI_MSI=y | 95 | CONFIG_PCI_MSI=y |
| 85 | CONFIG_PCI_MVEBU=y | 96 | CONFIG_PCI_MVEBU=y |
| 86 | CONFIG_PCI_TEGRA=y | 97 | CONFIG_PCI_TEGRA=y |
| 98 | CONFIG_PCI_RCAR_GEN2=y | ||
| 99 | CONFIG_PCI_RCAR_GEN2_PCIE=y | ||
| 87 | CONFIG_PCIEPORTBUS=y | 100 | CONFIG_PCIEPORTBUS=y |
| 88 | CONFIG_SMP=y | 101 | CONFIG_SMP=y |
| 89 | CONFIG_NR_CPUS=8 | 102 | CONFIG_NR_CPUS=16 |
| 90 | CONFIG_HIGHPTE=y | 103 | CONFIG_HIGHPTE=y |
| 91 | CONFIG_CMA=y | 104 | CONFIG_CMA=y |
| 92 | CONFIG_ARM_APPENDED_DTB=y | 105 | CONFIG_ARM_APPENDED_DTB=y |
| @@ -130,6 +143,7 @@ CONFIG_DEVTMPFS_MOUNT=y | |||
| 130 | CONFIG_DMA_CMA=y | 143 | CONFIG_DMA_CMA=y |
| 131 | CONFIG_CMA_SIZE_MBYTES=64 | 144 | CONFIG_CMA_SIZE_MBYTES=64 |
| 132 | CONFIG_OMAP_OCP2SCP=y | 145 | CONFIG_OMAP_OCP2SCP=y |
| 146 | CONFIG_SIMPLE_PM_BUS=y | ||
| 133 | CONFIG_MTD=y | 147 | CONFIG_MTD=y |
| 134 | CONFIG_MTD_CMDLINE_PARTS=y | 148 | CONFIG_MTD_CMDLINE_PARTS=y |
| 135 | CONFIG_MTD_BLOCK=y | 149 | CONFIG_MTD_BLOCK=y |
| @@ -157,6 +171,7 @@ CONFIG_AHCI_SUNXI=y | |||
| 157 | CONFIG_AHCI_TEGRA=y | 171 | CONFIG_AHCI_TEGRA=y |
| 158 | CONFIG_SATA_HIGHBANK=y | 172 | CONFIG_SATA_HIGHBANK=y |
| 159 | CONFIG_SATA_MV=y | 173 | CONFIG_SATA_MV=y |
| 174 | CONFIG_SATA_RCAR=y | ||
| 160 | CONFIG_NETDEVICES=y | 175 | CONFIG_NETDEVICES=y |
| 161 | CONFIG_HIX5HD2_GMAC=y | 176 | CONFIG_HIX5HD2_GMAC=y |
| 162 | CONFIG_SUN4I_EMAC=y | 177 | CONFIG_SUN4I_EMAC=y |
| @@ -167,14 +182,17 @@ CONFIG_MV643XX_ETH=y | |||
| 167 | CONFIG_MVNETA=y | 182 | CONFIG_MVNETA=y |
| 168 | CONFIG_KS8851=y | 183 | CONFIG_KS8851=y |
| 169 | CONFIG_R8169=y | 184 | CONFIG_R8169=y |
| 185 | CONFIG_SH_ETH=y | ||
| 170 | CONFIG_SMSC911X=y | 186 | CONFIG_SMSC911X=y |
| 171 | CONFIG_STMMAC_ETH=y | 187 | CONFIG_STMMAC_ETH=y |
| 172 | CONFIG_TI_CPSW=y | 188 | CONFIG_TI_CPSW=y |
| 173 | CONFIG_XILINX_EMACLITE=y | 189 | CONFIG_XILINX_EMACLITE=y |
| 174 | CONFIG_AT803X_PHY=y | 190 | CONFIG_AT803X_PHY=y |
| 175 | CONFIG_MARVELL_PHY=y | 191 | CONFIG_MARVELL_PHY=y |
| 192 | CONFIG_SMSC_PHY=y | ||
| 176 | CONFIG_BROADCOM_PHY=y | 193 | CONFIG_BROADCOM_PHY=y |
| 177 | CONFIG_ICPLUS_PHY=y | 194 | CONFIG_ICPLUS_PHY=y |
| 195 | CONFIG_MICREL_PHY=y | ||
| 178 | CONFIG_USB_PEGASUS=y | 196 | CONFIG_USB_PEGASUS=y |
| 179 | CONFIG_USB_USBNET=y | 197 | CONFIG_USB_USBNET=y |
| 180 | CONFIG_USB_NET_SMSC75XX=y | 198 | CONFIG_USB_NET_SMSC75XX=y |
| @@ -192,15 +210,18 @@ CONFIG_KEYBOARD_CROS_EC=y | |||
| 192 | CONFIG_MOUSE_PS2_ELANTECH=y | 210 | CONFIG_MOUSE_PS2_ELANTECH=y |
| 193 | CONFIG_INPUT_TOUCHSCREEN=y | 211 | CONFIG_INPUT_TOUCHSCREEN=y |
| 194 | CONFIG_TOUCHSCREEN_ATMEL_MXT=y | 212 | CONFIG_TOUCHSCREEN_ATMEL_MXT=y |
| 213 | CONFIG_TOUCHSCREEN_ST1232=m | ||
| 195 | CONFIG_TOUCHSCREEN_STMPE=y | 214 | CONFIG_TOUCHSCREEN_STMPE=y |
| 196 | CONFIG_TOUCHSCREEN_SUN4I=y | 215 | CONFIG_TOUCHSCREEN_SUN4I=y |
| 197 | CONFIG_INPUT_MISC=y | 216 | CONFIG_INPUT_MISC=y |
| 198 | CONFIG_INPUT_MPU3050=y | 217 | CONFIG_INPUT_MPU3050=y |
| 199 | CONFIG_INPUT_AXP20X_PEK=y | 218 | CONFIG_INPUT_AXP20X_PEK=y |
| 219 | CONFIG_INPUT_ADXL34X=m | ||
| 200 | CONFIG_SERIO_AMBAKMI=y | 220 | CONFIG_SERIO_AMBAKMI=y |
| 201 | CONFIG_SERIAL_8250=y | 221 | CONFIG_SERIAL_8250=y |
| 202 | CONFIG_SERIAL_8250_CONSOLE=y | 222 | CONFIG_SERIAL_8250_CONSOLE=y |
| 203 | CONFIG_SERIAL_8250_DW=y | 223 | CONFIG_SERIAL_8250_DW=y |
| 224 | CONFIG_SERIAL_8250_EM=y | ||
| 204 | CONFIG_SERIAL_8250_MT6577=y | 225 | CONFIG_SERIAL_8250_MT6577=y |
| 205 | CONFIG_SERIAL_AMBA_PL011=y | 226 | CONFIG_SERIAL_AMBA_PL011=y |
| 206 | CONFIG_SERIAL_AMBA_PL011_CONSOLE=y | 227 | CONFIG_SERIAL_AMBA_PL011_CONSOLE=y |
| @@ -213,6 +234,9 @@ CONFIG_SERIAL_SIRFSOC_CONSOLE=y | |||
| 213 | CONFIG_SERIAL_TEGRA=y | 234 | CONFIG_SERIAL_TEGRA=y |
| 214 | CONFIG_SERIAL_IMX=y | 235 | CONFIG_SERIAL_IMX=y |
| 215 | CONFIG_SERIAL_IMX_CONSOLE=y | 236 | CONFIG_SERIAL_IMX_CONSOLE=y |
| 237 | CONFIG_SERIAL_SH_SCI=y | ||
| 238 | CONFIG_SERIAL_SH_SCI_NR_UARTS=20 | ||
| 239 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
| 216 | CONFIG_SERIAL_MSM=y | 240 | CONFIG_SERIAL_MSM=y |
| 217 | CONFIG_SERIAL_MSM_CONSOLE=y | 241 | CONFIG_SERIAL_MSM_CONSOLE=y |
| 218 | CONFIG_SERIAL_VT8500=y | 242 | CONFIG_SERIAL_VT8500=y |
| @@ -233,19 +257,26 @@ CONFIG_I2C_MUX_PCA954x=y | |||
| 233 | CONFIG_I2C_MUX_PINCTRL=y | 257 | CONFIG_I2C_MUX_PINCTRL=y |
| 234 | CONFIG_I2C_CADENCE=y | 258 | CONFIG_I2C_CADENCE=y |
| 235 | CONFIG_I2C_DESIGNWARE_PLATFORM=y | 259 | CONFIG_I2C_DESIGNWARE_PLATFORM=y |
| 260 | CONFIG_I2C_GPIO=m | ||
| 236 | CONFIG_I2C_EXYNOS5=y | 261 | CONFIG_I2C_EXYNOS5=y |
| 237 | CONFIG_I2C_MV64XXX=y | 262 | CONFIG_I2C_MV64XXX=y |
| 263 | CONFIG_I2C_RIIC=y | ||
| 238 | CONFIG_I2C_S3C2410=y | 264 | CONFIG_I2C_S3C2410=y |
| 265 | CONFIG_I2C_SH_MOBILE=y | ||
| 239 | CONFIG_I2C_SIRF=y | 266 | CONFIG_I2C_SIRF=y |
| 240 | CONFIG_I2C_TEGRA=y | ||
| 241 | CONFIG_I2C_ST=y | 267 | CONFIG_I2C_ST=y |
| 242 | CONFIG_SPI=y | 268 | CONFIG_I2C_TEGRA=y |
| 243 | CONFIG_I2C_XILINX=y | 269 | CONFIG_I2C_XILINX=y |
| 244 | CONFIG_SPI_DAVINCI=y | 270 | CONFIG_I2C_RCAR=y |
| 271 | CONFIG_SPI=y | ||
| 245 | CONFIG_SPI_CADENCE=y | 272 | CONFIG_SPI_CADENCE=y |
| 273 | CONFIG_SPI_DAVINCI=y | ||
| 246 | CONFIG_SPI_OMAP24XX=y | 274 | CONFIG_SPI_OMAP24XX=y |
| 247 | CONFIG_SPI_ORION=y | 275 | CONFIG_SPI_ORION=y |
| 248 | CONFIG_SPI_PL022=y | 276 | CONFIG_SPI_PL022=y |
| 277 | CONFIG_SPI_RSPI=y | ||
| 278 | CONFIG_SPI_SH_MSIOF=m | ||
| 279 | CONFIG_SPI_SH_HSPI=y | ||
| 249 | CONFIG_SPI_SIRF=y | 280 | CONFIG_SPI_SIRF=y |
| 250 | CONFIG_SPI_SUN4I=y | 281 | CONFIG_SPI_SUN4I=y |
| 251 | CONFIG_SPI_SUN6I=y | 282 | CONFIG_SPI_SUN6I=y |
| @@ -259,12 +290,15 @@ CONFIG_PINCTRL_PALMAS=y | |||
| 259 | CONFIG_PINCTRL_APQ8084=y | 290 | CONFIG_PINCTRL_APQ8084=y |
| 260 | CONFIG_GPIO_SYSFS=y | 291 | CONFIG_GPIO_SYSFS=y |
| 261 | CONFIG_GPIO_GENERIC_PLATFORM=y | 292 | CONFIG_GPIO_GENERIC_PLATFORM=y |
| 262 | CONFIG_GPIO_DWAPB=y | ||
| 263 | CONFIG_GPIO_DAVINCI=y | 293 | CONFIG_GPIO_DAVINCI=y |
| 294 | CONFIG_GPIO_DWAPB=y | ||
| 295 | CONFIG_GPIO_EM=y | ||
| 296 | CONFIG_GPIO_RCAR=y | ||
| 264 | CONFIG_GPIO_XILINX=y | 297 | CONFIG_GPIO_XILINX=y |
| 265 | CONFIG_GPIO_ZYNQ=y | 298 | CONFIG_GPIO_ZYNQ=y |
| 266 | CONFIG_GPIO_PCA953X=y | 299 | CONFIG_GPIO_PCA953X=y |
| 267 | CONFIG_GPIO_PCA953X_IRQ=y | 300 | CONFIG_GPIO_PCA953X_IRQ=y |
| 301 | CONFIG_GPIO_PCF857X=y | ||
| 268 | CONFIG_GPIO_TWL4030=y | 302 | CONFIG_GPIO_TWL4030=y |
| 269 | CONFIG_GPIO_PALMAS=y | 303 | CONFIG_GPIO_PALMAS=y |
| 270 | CONFIG_GPIO_SYSCON=y | 304 | CONFIG_GPIO_SYSCON=y |
| @@ -276,10 +310,12 @@ CONFIG_POWER_RESET_AS3722=y | |||
| 276 | CONFIG_POWER_RESET_GPIO=y | 310 | CONFIG_POWER_RESET_GPIO=y |
| 277 | CONFIG_POWER_RESET_KEYSTONE=y | 311 | CONFIG_POWER_RESET_KEYSTONE=y |
| 278 | CONFIG_POWER_RESET_SUN6I=y | 312 | CONFIG_POWER_RESET_SUN6I=y |
| 313 | CONFIG_POWER_RESET_RMOBILE=y | ||
| 279 | CONFIG_SENSORS_LM90=y | 314 | CONFIG_SENSORS_LM90=y |
| 280 | CONFIG_SENSORS_LM95245=y | 315 | CONFIG_SENSORS_LM95245=y |
| 281 | CONFIG_THERMAL=y | 316 | CONFIG_THERMAL=y |
| 282 | CONFIG_CPU_THERMAL=y | 317 | CONFIG_CPU_THERMAL=y |
| 318 | CONFIG_RCAR_THERMAL=y | ||
| 283 | CONFIG_ARMADA_THERMAL=y | 319 | CONFIG_ARMADA_THERMAL=y |
| 284 | CONFIG_DAVINCI_WATCHDOG | 320 | CONFIG_DAVINCI_WATCHDOG |
| 285 | CONFIG_ST_THERMAL_SYSCFG=y | 321 | CONFIG_ST_THERMAL_SYSCFG=y |
| @@ -290,6 +326,7 @@ CONFIG_ARM_SP805_WATCHDOG=y | |||
| 290 | CONFIG_ORION_WATCHDOG=y | 326 | CONFIG_ORION_WATCHDOG=y |
| 291 | CONFIG_SUNXI_WATCHDOG=y | 327 | CONFIG_SUNXI_WATCHDOG=y |
| 292 | CONFIG_MESON_WATCHDOG=y | 328 | CONFIG_MESON_WATCHDOG=y |
| 329 | CONFIG_MFD_AS3711=y | ||
| 293 | CONFIG_MFD_AS3722=y | 330 | CONFIG_MFD_AS3722=y |
| 294 | CONFIG_MFD_BCM590XX=y | 331 | CONFIG_MFD_BCM590XX=y |
| 295 | CONFIG_MFD_AXP20X=y | 332 | CONFIG_MFD_AXP20X=y |
| @@ -304,13 +341,16 @@ CONFIG_MFD_TPS65090=y | |||
| 304 | CONFIG_MFD_TPS6586X=y | 341 | CONFIG_MFD_TPS6586X=y |
| 305 | CONFIG_MFD_TPS65910=y | 342 | CONFIG_MFD_TPS65910=y |
| 306 | CONFIG_REGULATOR_AB8500=y | 343 | CONFIG_REGULATOR_AB8500=y |
| 344 | CONFIG_REGULATOR_AS3711=y | ||
| 307 | CONFIG_REGULATOR_AS3722=y | 345 | CONFIG_REGULATOR_AS3722=y |
| 308 | CONFIG_REGULATOR_AXP20X=y | 346 | CONFIG_REGULATOR_AXP20X=y |
| 309 | CONFIG_REGULATOR_BCM590XX=y | 347 | CONFIG_REGULATOR_BCM590XX=y |
| 348 | CONFIG_REGULATOR_DA9210=y | ||
| 310 | CONFIG_REGULATOR_GPIO=y | 349 | CONFIG_REGULATOR_GPIO=y |
| 311 | CONFIG_MFD_SYSCON=y | 350 | CONFIG_MFD_SYSCON=y |
| 312 | CONFIG_POWER_RESET_SYSCON=y | 351 | CONFIG_POWER_RESET_SYSCON=y |
| 313 | CONFIG_REGULATOR_MAX8907=y | 352 | CONFIG_REGULATOR_MAX8907=y |
| 353 | CONFIG_REGULATOR_MAX8973=y | ||
| 314 | CONFIG_REGULATOR_MAX77686=y | 354 | CONFIG_REGULATOR_MAX77686=y |
| 315 | CONFIG_REGULATOR_PALMAS=y | 355 | CONFIG_REGULATOR_PALMAS=y |
| 316 | CONFIG_REGULATOR_S2MPS11=y | 356 | CONFIG_REGULATOR_S2MPS11=y |
| @@ -324,18 +364,32 @@ CONFIG_REGULATOR_TWL4030=y | |||
| 324 | CONFIG_REGULATOR_VEXPRESS=y | 364 | CONFIG_REGULATOR_VEXPRESS=y |
| 325 | CONFIG_MEDIA_SUPPORT=y | 365 | CONFIG_MEDIA_SUPPORT=y |
| 326 | CONFIG_MEDIA_CAMERA_SUPPORT=y | 366 | CONFIG_MEDIA_CAMERA_SUPPORT=y |
| 367 | CONFIG_MEDIA_CONTROLLER=y | ||
| 368 | CONFIG_VIDEO_V4L2_SUBDEV_API=y | ||
| 327 | CONFIG_MEDIA_USB_SUPPORT=y | 369 | CONFIG_MEDIA_USB_SUPPORT=y |
| 328 | CONFIG_USB_VIDEO_CLASS=y | 370 | CONFIG_USB_VIDEO_CLASS=y |
| 329 | CONFIG_USB_GSPCA=y | 371 | CONFIG_USB_GSPCA=y |
| 372 | CONFIG_V4L_PLATFORM_DRIVERS=y | ||
| 373 | CONFIG_SOC_CAMERA=m | ||
| 374 | CONFIG_SOC_CAMERA_PLATFORM=m | ||
| 375 | CONFIG_VIDEO_RCAR_VIN=m | ||
| 376 | CONFIG_V4L_MEM2MEM_DRIVERS=y | ||
| 377 | CONFIG_VIDEO_RENESAS_VSP1=m | ||
| 378 | # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set | ||
| 379 | CONFIG_VIDEO_ADV7180=m | ||
| 330 | CONFIG_DRM=y | 380 | CONFIG_DRM=y |
| 381 | CONFIG_DRM_RCAR_DU=m | ||
| 331 | CONFIG_DRM_TEGRA=y | 382 | CONFIG_DRM_TEGRA=y |
| 332 | CONFIG_DRM_PANEL_SIMPLE=y | 383 | CONFIG_DRM_PANEL_SIMPLE=y |
| 333 | CONFIG_FB_ARMCLCD=y | 384 | CONFIG_FB_ARMCLCD=y |
| 334 | CONFIG_FB_WM8505=y | 385 | CONFIG_FB_WM8505=y |
| 386 | CONFIG_FB_SH_MOBILE_LCDC=y | ||
| 335 | CONFIG_FB_SIMPLE=y | 387 | CONFIG_FB_SIMPLE=y |
| 388 | CONFIG_FB_SH_MOBILE_MERAM=y | ||
| 336 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | 389 | CONFIG_BACKLIGHT_LCD_SUPPORT=y |
| 337 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | 390 | CONFIG_BACKLIGHT_CLASS_DEVICE=y |
| 338 | CONFIG_BACKLIGHT_PWM=y | 391 | CONFIG_BACKLIGHT_PWM=y |
| 392 | CONFIG_BACKLIGHT_AS3711=y | ||
| 339 | CONFIG_FRAMEBUFFER_CONSOLE=y | 393 | CONFIG_FRAMEBUFFER_CONSOLE=y |
| 340 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | 394 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y |
| 341 | CONFIG_SOUND=y | 395 | CONFIG_SOUND=y |
| @@ -343,6 +397,8 @@ CONFIG_SND=y | |||
| 343 | CONFIG_SND_DYNAMIC_MINORS=y | 397 | CONFIG_SND_DYNAMIC_MINORS=y |
| 344 | CONFIG_SND_USB_AUDIO=y | 398 | CONFIG_SND_USB_AUDIO=y |
| 345 | CONFIG_SND_SOC=y | 399 | CONFIG_SND_SOC=y |
| 400 | CONFIG_SND_SOC_SH4_FSI=m | ||
| 401 | CONFIG_SND_SOC_RCAR=m | ||
| 346 | CONFIG_SND_SOC_TEGRA=y | 402 | CONFIG_SND_SOC_TEGRA=y |
| 347 | CONFIG_SND_SOC_TEGRA_RT5640=y | 403 | CONFIG_SND_SOC_TEGRA_RT5640=y |
| 348 | CONFIG_SND_SOC_TEGRA_WM8753=y | 404 | CONFIG_SND_SOC_TEGRA_WM8753=y |
| @@ -350,6 +406,8 @@ CONFIG_SND_SOC_TEGRA_WM8903=y | |||
| 350 | CONFIG_SND_SOC_TEGRA_TRIMSLICE=y | 406 | CONFIG_SND_SOC_TEGRA_TRIMSLICE=y |
| 351 | CONFIG_SND_SOC_TEGRA_ALC5632=y | 407 | CONFIG_SND_SOC_TEGRA_ALC5632=y |
| 352 | CONFIG_SND_SOC_TEGRA_MAX98090=y | 408 | CONFIG_SND_SOC_TEGRA_MAX98090=y |
| 409 | CONFIG_SND_SOC_AK4642=m | ||
| 410 | CONFIG_SND_SOC_WM8978=m | ||
| 353 | CONFIG_USB=y | 411 | CONFIG_USB=y |
| 354 | CONFIG_USB_XHCI_HCD=y | 412 | CONFIG_USB_XHCI_HCD=y |
| 355 | CONFIG_USB_XHCI_MVEBU=y | 413 | CONFIG_USB_XHCI_MVEBU=y |
| @@ -362,6 +420,8 @@ CONFIG_USB_ISP1760_HCD=y | |||
| 362 | CONFIG_USB_OHCI_HCD=y | 420 | CONFIG_USB_OHCI_HCD=y |
| 363 | CONFIG_USB_OHCI_HCD_STI=y | 421 | CONFIG_USB_OHCI_HCD_STI=y |
| 364 | CONFIG_USB_OHCI_HCD_PLATFORM=y | 422 | CONFIG_USB_OHCI_HCD_PLATFORM=y |
| 423 | CONFIG_USB_R8A66597_HCD=m | ||
| 424 | CONFIG_USB_RENESAS_USBHS=m | ||
| 365 | CONFIG_USB_STORAGE=y | 425 | CONFIG_USB_STORAGE=y |
| 366 | CONFIG_USB_DWC3=y | 426 | CONFIG_USB_DWC3=y |
| 367 | CONFIG_USB_CHIPIDEA=y | 427 | CONFIG_USB_CHIPIDEA=y |
| @@ -374,6 +434,10 @@ CONFIG_SAMSUNG_USB3PHY=y | |||
| 374 | CONFIG_USB_GPIO_VBUS=y | 434 | CONFIG_USB_GPIO_VBUS=y |
| 375 | CONFIG_USB_ISP1301=y | 435 | CONFIG_USB_ISP1301=y |
| 376 | CONFIG_USB_MXS_PHY=y | 436 | CONFIG_USB_MXS_PHY=y |
| 437 | CONFIG_USB_RCAR_PHY=m | ||
| 438 | CONFIG_USB_RCAR_GEN2_PHY=m | ||
| 439 | CONFIG_USB_GADGET=y | ||
| 440 | CONFIG_USB_RENESAS_USBHS_UDC=m | ||
| 377 | CONFIG_MMC=y | 441 | CONFIG_MMC=y |
| 378 | CONFIG_MMC_BLOCK_MINORS=16 | 442 | CONFIG_MMC_BLOCK_MINORS=16 |
| 379 | CONFIG_MMC_ARMMMCI=y | 443 | CONFIG_MMC_ARMMMCI=y |
| @@ -392,12 +456,14 @@ CONFIG_MMC_SDHCI_ST=y | |||
| 392 | CONFIG_MMC_OMAP=y | 456 | CONFIG_MMC_OMAP=y |
| 393 | CONFIG_MMC_OMAP_HS=y | 457 | CONFIG_MMC_OMAP_HS=y |
| 394 | CONFIG_MMC_MVSDIO=y | 458 | CONFIG_MMC_MVSDIO=y |
| 395 | CONFIG_MMC_SUNXI=y | 459 | CONFIG_MMC_SDHI=y |
| 396 | CONFIG_MMC_DW=y | 460 | CONFIG_MMC_DW=y |
| 397 | CONFIG_MMC_DW_IDMAC=y | 461 | CONFIG_MMC_DW_IDMAC=y |
| 398 | CONFIG_MMC_DW_PLTFM=y | 462 | CONFIG_MMC_DW_PLTFM=y |
| 399 | CONFIG_MMC_DW_EXYNOS=y | 463 | CONFIG_MMC_DW_EXYNOS=y |
| 400 | CONFIG_MMC_DW_ROCKCHIP=y | 464 | CONFIG_MMC_DW_ROCKCHIP=y |
| 465 | CONFIG_MMC_SH_MMCIF=y | ||
| 466 | CONFIG_MMC_SUNXI=y | ||
| 401 | CONFIG_NEW_LEDS=y | 467 | CONFIG_NEW_LEDS=y |
| 402 | CONFIG_LEDS_CLASS=y | 468 | CONFIG_LEDS_CLASS=y |
| 403 | CONFIG_LEDS_GPIO=y | 469 | CONFIG_LEDS_GPIO=y |
| @@ -421,10 +487,12 @@ CONFIG_RTC_DRV_AS3722=y | |||
| 421 | CONFIG_RTC_DRV_DS1307=y | 487 | CONFIG_RTC_DRV_DS1307=y |
| 422 | CONFIG_RTC_DRV_MAX8907=y | 488 | CONFIG_RTC_DRV_MAX8907=y |
| 423 | CONFIG_RTC_DRV_MAX77686=y | 489 | CONFIG_RTC_DRV_MAX77686=y |
| 490 | CONFIG_RTC_DRV_RS5C372=m | ||
| 424 | CONFIG_RTC_DRV_PALMAS=y | 491 | CONFIG_RTC_DRV_PALMAS=y |
| 425 | CONFIG_RTC_DRV_TWL4030=y | 492 | CONFIG_RTC_DRV_TWL4030=y |
| 426 | CONFIG_RTC_DRV_TPS6586X=y | 493 | CONFIG_RTC_DRV_TPS6586X=y |
| 427 | CONFIG_RTC_DRV_TPS65910=y | 494 | CONFIG_RTC_DRV_TPS65910=y |
| 495 | CONFIG_RTC_DRV_S35390A=m | ||
| 428 | CONFIG_RTC_DRV_EM3027=y | 496 | CONFIG_RTC_DRV_EM3027=y |
| 429 | CONFIG_RTC_DRV_PL031=y | 497 | CONFIG_RTC_DRV_PL031=y |
| 430 | CONFIG_RTC_DRV_VT8500=y | 498 | CONFIG_RTC_DRV_VT8500=y |
| @@ -436,6 +504,9 @@ CONFIG_DMADEVICES=y | |||
| 436 | CONFIG_DW_DMAC=y | 504 | CONFIG_DW_DMAC=y |
| 437 | CONFIG_MV_XOR=y | 505 | CONFIG_MV_XOR=y |
| 438 | CONFIG_TEGRA20_APB_DMA=y | 506 | CONFIG_TEGRA20_APB_DMA=y |
| 507 | CONFIG_SH_DMAE=y | ||
| 508 | CONFIG_RCAR_AUDMAC_PP=m | ||
| 509 | CONFIG_RCAR_DMAC=y | ||
| 439 | CONFIG_STE_DMA40=y | 510 | CONFIG_STE_DMA40=y |
| 440 | CONFIG_SIRF_DMA=y | 511 | CONFIG_SIRF_DMA=y |
| 441 | CONFIG_TI_EDMA=y | 512 | CONFIG_TI_EDMA=y |
| @@ -468,6 +539,7 @@ CONFIG_IIO=y | |||
| 468 | CONFIG_XILINX_XADC=y | 539 | CONFIG_XILINX_XADC=y |
| 469 | CONFIG_AK8975=y | 540 | CONFIG_AK8975=y |
| 470 | CONFIG_PWM=y | 541 | CONFIG_PWM=y |
| 542 | CONFIG_PWM_RENESAS_TPU=y | ||
| 471 | CONFIG_PWM_TEGRA=y | 543 | CONFIG_PWM_TEGRA=y |
| 472 | CONFIG_PWM_VT8500=y | 544 | CONFIG_PWM_VT8500=y |
| 473 | CONFIG_PHY_HIX5HD2_SATA=y | 545 | CONFIG_PHY_HIX5HD2_SATA=y |
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index b7386524c356..8e108599e1af 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig | |||
| @@ -114,6 +114,7 @@ CONFIG_MTD_PHYSMAP_OF=y | |||
| 114 | CONFIG_MTD_NAND=y | 114 | CONFIG_MTD_NAND=y |
| 115 | CONFIG_MTD_NAND_ECC_BCH=y | 115 | CONFIG_MTD_NAND_ECC_BCH=y |
| 116 | CONFIG_MTD_NAND_OMAP2=y | 116 | CONFIG_MTD_NAND_OMAP2=y |
| 117 | CONFIG_MTD_NAND_OMAP_BCH=y | ||
| 117 | CONFIG_MTD_ONENAND=y | 118 | CONFIG_MTD_ONENAND=y |
| 118 | CONFIG_MTD_ONENAND_VERIFY_WRITE=y | 119 | CONFIG_MTD_ONENAND_VERIFY_WRITE=y |
| 119 | CONFIG_MTD_ONENAND_OMAP2=y | 120 | CONFIG_MTD_ONENAND_OMAP2=y |
| @@ -248,6 +249,7 @@ CONFIG_TWL6040_CORE=y | |||
| 248 | CONFIG_REGULATOR_PALMAS=y | 249 | CONFIG_REGULATOR_PALMAS=y |
| 249 | CONFIG_REGULATOR_PBIAS=y | 250 | CONFIG_REGULATOR_PBIAS=y |
| 250 | CONFIG_REGULATOR_TI_ABB=y | 251 | CONFIG_REGULATOR_TI_ABB=y |
| 252 | CONFIG_REGULATOR_TPS62360=m | ||
| 251 | CONFIG_REGULATOR_TPS65023=y | 253 | CONFIG_REGULATOR_TPS65023=y |
| 252 | CONFIG_REGULATOR_TPS6507X=y | 254 | CONFIG_REGULATOR_TPS6507X=y |
| 253 | CONFIG_REGULATOR_TPS65217=y | 255 | CONFIG_REGULATOR_TPS65217=y |
| @@ -374,7 +376,8 @@ CONFIG_PWM_TIEHRPWM=m | |||
| 374 | CONFIG_PWM_TWL=m | 376 | CONFIG_PWM_TWL=m |
| 375 | CONFIG_PWM_TWL_LED=m | 377 | CONFIG_PWM_TWL_LED=m |
| 376 | CONFIG_OMAP_USB2=m | 378 | CONFIG_OMAP_USB2=m |
| 377 | CONFIG_TI_PIPE3=m | 379 | CONFIG_TI_PIPE3=y |
| 380 | CONFIG_TWL4030_USB=m | ||
| 378 | CONFIG_EXT2_FS=y | 381 | CONFIG_EXT2_FS=y |
| 379 | CONFIG_EXT3_FS=y | 382 | CONFIG_EXT3_FS=y |
| 380 | # CONFIG_EXT3_FS_XATTR is not set | 383 | # CONFIG_EXT3_FS_XATTR is not set |
diff --git a/arch/arm/configs/sama5_defconfig b/arch/arm/configs/sama5_defconfig index 41d856effe6c..510c747c65b4 100644 --- a/arch/arm/configs/sama5_defconfig +++ b/arch/arm/configs/sama5_defconfig | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | CONFIG_SYSVIPC=y | 3 | CONFIG_SYSVIPC=y |
| 4 | CONFIG_IRQ_DOMAIN_DEBUG=y | 4 | CONFIG_IRQ_DOMAIN_DEBUG=y |
| 5 | CONFIG_LOG_BUF_SHIFT=14 | 5 | CONFIG_LOG_BUF_SHIFT=14 |
| 6 | CONFIG_SYSFS_DEPRECATED=y | ||
| 7 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 8 | CONFIG_BLK_DEV_INITRD=y | 6 | CONFIG_BLK_DEV_INITRD=y |
| 9 | CONFIG_EMBEDDED=y | 7 | CONFIG_EMBEDDED=y |
| 10 | CONFIG_SLAB=y | 8 | CONFIG_SLAB=y |
diff --git a/arch/arm/configs/sunxi_defconfig b/arch/arm/configs/sunxi_defconfig index 38840a812924..8f6a5702b696 100644 --- a/arch/arm/configs/sunxi_defconfig +++ b/arch/arm/configs/sunxi_defconfig | |||
| @@ -4,6 +4,7 @@ CONFIG_BLK_DEV_INITRD=y | |||
| 4 | CONFIG_PERF_EVENTS=y | 4 | CONFIG_PERF_EVENTS=y |
| 5 | CONFIG_ARCH_SUNXI=y | 5 | CONFIG_ARCH_SUNXI=y |
| 6 | CONFIG_SMP=y | 6 | CONFIG_SMP=y |
| 7 | CONFIG_NR_CPUS=8 | ||
| 7 | CONFIG_AEABI=y | 8 | CONFIG_AEABI=y |
| 8 | CONFIG_HIGHMEM=y | 9 | CONFIG_HIGHMEM=y |
| 9 | CONFIG_HIGHPTE=y | 10 | CONFIG_HIGHPTE=y |
diff --git a/arch/arm/configs/vexpress_defconfig b/arch/arm/configs/vexpress_defconfig index f489fdaa19b8..37fe607a4ede 100644 --- a/arch/arm/configs/vexpress_defconfig +++ b/arch/arm/configs/vexpress_defconfig | |||
| @@ -118,8 +118,8 @@ CONFIG_HID_ZEROPLUS=y | |||
| 118 | CONFIG_USB=y | 118 | CONFIG_USB=y |
| 119 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y | 119 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y |
| 120 | CONFIG_USB_MON=y | 120 | CONFIG_USB_MON=y |
| 121 | CONFIG_USB_ISP1760_HCD=y | ||
| 122 | CONFIG_USB_STORAGE=y | 121 | CONFIG_USB_STORAGE=y |
| 122 | CONFIG_USB_ISP1760=y | ||
| 123 | CONFIG_MMC=y | 123 | CONFIG_MMC=y |
| 124 | CONFIG_MMC_ARMMMCI=y | 124 | CONFIG_MMC_ARMMMCI=y |
| 125 | CONFIG_NEW_LEDS=y | 125 | CONFIG_NEW_LEDS=y |
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h index 37ca2a4c6f09..bf0fe99e8ca9 100644 --- a/arch/arm/include/asm/kvm_mmu.h +++ b/arch/arm/include/asm/kvm_mmu.h | |||
| @@ -207,7 +207,7 @@ static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn, | |||
| 207 | 207 | ||
| 208 | bool need_flush = !vcpu_has_cache_enabled(vcpu) || ipa_uncached; | 208 | bool need_flush = !vcpu_has_cache_enabled(vcpu) || ipa_uncached; |
| 209 | 209 | ||
| 210 | VM_BUG_ON(size & PAGE_MASK); | 210 | VM_BUG_ON(size & ~PAGE_MASK); |
| 211 | 211 | ||
| 212 | if (!need_flush && !icache_is_pipt()) | 212 | if (!need_flush && !icache_is_pipt()) |
| 213 | goto vipt_cache; | 213 | goto vipt_cache; |
diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index b1596bd59129..675e4ab79f68 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h | |||
| @@ -92,6 +92,7 @@ struct pmu_hw_events { | |||
| 92 | struct arm_pmu { | 92 | struct arm_pmu { |
| 93 | struct pmu pmu; | 93 | struct pmu pmu; |
| 94 | cpumask_t active_irqs; | 94 | cpumask_t active_irqs; |
| 95 | int *irq_affinity; | ||
| 95 | char *name; | 96 | char *name; |
| 96 | irqreturn_t (*handle_irq)(int irq_num, void *dev); | 97 | irqreturn_t (*handle_irq)(int irq_num, void *dev); |
| 97 | void (*enable)(struct perf_event *event); | 98 | void (*enable)(struct perf_event *event); |
diff --git a/arch/arm/include/debug/at91.S b/arch/arm/include/debug/at91.S index 80a6501b4d50..c3c45e628e33 100644 --- a/arch/arm/include/debug/at91.S +++ b/arch/arm/include/debug/at91.S | |||
| @@ -18,8 +18,11 @@ | |||
| 18 | #define AT91_DBGU 0xfc00c000 /* SAMA5D4_BASE_USART3 */ | 18 | #define AT91_DBGU 0xfc00c000 /* SAMA5D4_BASE_USART3 */ |
| 19 | #endif | 19 | #endif |
| 20 | 20 | ||
| 21 | /* Keep in sync with mach-at91/include/mach/hardware.h */ | 21 | #ifdef CONFIG_MMU |
| 22 | #define AT91_IO_P2V(x) ((x) - 0x01000000) | 22 | #define AT91_IO_P2V(x) ((x) - 0x01000000) |
| 23 | #else | ||
| 24 | #define AT91_IO_P2V(x) (x) | ||
| 25 | #endif | ||
| 23 | 26 | ||
| 24 | #define AT91_DBGU_SR (0x14) /* Status Register */ | 27 | #define AT91_DBGU_SR (0x14) /* Status Register */ |
| 25 | #define AT91_DBGU_THR (0x1c) /* Transmitter Holding Register */ | 28 | #define AT91_DBGU_THR (0x1c) /* Transmitter Holding Register */ |
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 557e128e4df0..4a86a0133ac3 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
| @@ -259,20 +259,29 @@ out: | |||
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | static int | 261 | static int |
| 262 | validate_event(struct pmu_hw_events *hw_events, | 262 | validate_event(struct pmu *pmu, struct pmu_hw_events *hw_events, |
| 263 | struct perf_event *event) | 263 | struct perf_event *event) |
| 264 | { | 264 | { |
| 265 | struct arm_pmu *armpmu = to_arm_pmu(event->pmu); | 265 | struct arm_pmu *armpmu; |
| 266 | 266 | ||
| 267 | if (is_software_event(event)) | 267 | if (is_software_event(event)) |
| 268 | return 1; | 268 | return 1; |
| 269 | 269 | ||
| 270 | /* | ||
| 271 | * Reject groups spanning multiple HW PMUs (e.g. CPU + CCI). The | ||
| 272 | * core perf code won't check that the pmu->ctx == leader->ctx | ||
| 273 | * until after pmu->event_init(event). | ||
| 274 | */ | ||
| 275 | if (event->pmu != pmu) | ||
| 276 | return 0; | ||
| 277 | |||
| 270 | if (event->state < PERF_EVENT_STATE_OFF) | 278 | if (event->state < PERF_EVENT_STATE_OFF) |
| 271 | return 1; | 279 | return 1; |
| 272 | 280 | ||
| 273 | if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec) | 281 | if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec) |
| 274 | return 1; | 282 | return 1; |
| 275 | 283 | ||
| 284 | armpmu = to_arm_pmu(event->pmu); | ||
| 276 | return armpmu->get_event_idx(hw_events, event) >= 0; | 285 | return armpmu->get_event_idx(hw_events, event) >= 0; |
| 277 | } | 286 | } |
| 278 | 287 | ||
| @@ -288,15 +297,15 @@ validate_group(struct perf_event *event) | |||
| 288 | */ | 297 | */ |
| 289 | memset(&fake_pmu.used_mask, 0, sizeof(fake_pmu.used_mask)); | 298 | memset(&fake_pmu.used_mask, 0, sizeof(fake_pmu.used_mask)); |
| 290 | 299 | ||
| 291 | if (!validate_event(&fake_pmu, leader)) | 300 | if (!validate_event(event->pmu, &fake_pmu, leader)) |
| 292 | return -EINVAL; | 301 | return -EINVAL; |
| 293 | 302 | ||
| 294 | list_for_each_entry(sibling, &leader->sibling_list, group_entry) { | 303 | list_for_each_entry(sibling, &leader->sibling_list, group_entry) { |
| 295 | if (!validate_event(&fake_pmu, sibling)) | 304 | if (!validate_event(event->pmu, &fake_pmu, sibling)) |
| 296 | return -EINVAL; | 305 | return -EINVAL; |
| 297 | } | 306 | } |
| 298 | 307 | ||
| 299 | if (!validate_event(&fake_pmu, event)) | 308 | if (!validate_event(event->pmu, &fake_pmu, event)) |
| 300 | return -EINVAL; | 309 | return -EINVAL; |
| 301 | 310 | ||
| 302 | return 0; | 311 | return 0; |
diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index 61b53c46edfa..91c7ba182dcd 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c | |||
| @@ -92,11 +92,16 @@ static void cpu_pmu_free_irq(struct arm_pmu *cpu_pmu) | |||
| 92 | free_percpu_irq(irq, &hw_events->percpu_pmu); | 92 | free_percpu_irq(irq, &hw_events->percpu_pmu); |
| 93 | } else { | 93 | } else { |
| 94 | for (i = 0; i < irqs; ++i) { | 94 | for (i = 0; i < irqs; ++i) { |
| 95 | if (!cpumask_test_and_clear_cpu(i, &cpu_pmu->active_irqs)) | 95 | int cpu = i; |
| 96 | |||
| 97 | if (cpu_pmu->irq_affinity) | ||
| 98 | cpu = cpu_pmu->irq_affinity[i]; | ||
| 99 | |||
| 100 | if (!cpumask_test_and_clear_cpu(cpu, &cpu_pmu->active_irqs)) | ||
| 96 | continue; | 101 | continue; |
| 97 | irq = platform_get_irq(pmu_device, i); | 102 | irq = platform_get_irq(pmu_device, i); |
| 98 | if (irq >= 0) | 103 | if (irq >= 0) |
| 99 | free_irq(irq, per_cpu_ptr(&hw_events->percpu_pmu, i)); | 104 | free_irq(irq, per_cpu_ptr(&hw_events->percpu_pmu, cpu)); |
| 100 | } | 105 | } |
| 101 | } | 106 | } |
| 102 | } | 107 | } |
| @@ -128,32 +133,37 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler) | |||
| 128 | on_each_cpu(cpu_pmu_enable_percpu_irq, &irq, 1); | 133 | on_each_cpu(cpu_pmu_enable_percpu_irq, &irq, 1); |
| 129 | } else { | 134 | } else { |
| 130 | for (i = 0; i < irqs; ++i) { | 135 | for (i = 0; i < irqs; ++i) { |
| 136 | int cpu = i; | ||
| 137 | |||
| 131 | err = 0; | 138 | err = 0; |
| 132 | irq = platform_get_irq(pmu_device, i); | 139 | irq = platform_get_irq(pmu_device, i); |
| 133 | if (irq < 0) | 140 | if (irq < 0) |
| 134 | continue; | 141 | continue; |
| 135 | 142 | ||
| 143 | if (cpu_pmu->irq_affinity) | ||
| 144 | cpu = cpu_pmu->irq_affinity[i]; | ||
| 145 | |||
| 136 | /* | 146 | /* |
| 137 | * If we have a single PMU interrupt that we can't shift, | 147 | * If we have a single PMU interrupt that we can't shift, |
| 138 | * assume that we're running on a uniprocessor machine and | 148 | * assume that we're running on a uniprocessor machine and |
| 139 | * continue. Otherwise, continue without this interrupt. | 149 | * continue. Otherwise, continue without this interrupt. |
| 140 | */ | 150 | */ |
| 141 | if (irq_set_affinity(irq, cpumask_of(i)) && irqs > 1) { | 151 | if (irq_set_affinity(irq, cpumask_of(cpu)) && irqs > 1) { |
| 142 | pr_warn("unable to set irq affinity (irq=%d, cpu=%u)\n", | 152 | pr_warn("unable to set irq affinity (irq=%d, cpu=%u)\n", |
| 143 | irq, i); | 153 | irq, cpu); |
| 144 | continue; | 154 | continue; |
| 145 | } | 155 | } |
| 146 | 156 | ||
| 147 | err = request_irq(irq, handler, | 157 | err = request_irq(irq, handler, |
| 148 | IRQF_NOBALANCING | IRQF_NO_THREAD, "arm-pmu", | 158 | IRQF_NOBALANCING | IRQF_NO_THREAD, "arm-pmu", |
| 149 | per_cpu_ptr(&hw_events->percpu_pmu, i)); | 159 | per_cpu_ptr(&hw_events->percpu_pmu, cpu)); |
| 150 | if (err) { | 160 | if (err) { |
| 151 | pr_err("unable to request IRQ%d for ARM PMU counters\n", | 161 | pr_err("unable to request IRQ%d for ARM PMU counters\n", |
| 152 | irq); | 162 | irq); |
| 153 | return err; | 163 | return err; |
| 154 | } | 164 | } |
| 155 | 165 | ||
| 156 | cpumask_set_cpu(i, &cpu_pmu->active_irqs); | 166 | cpumask_set_cpu(cpu, &cpu_pmu->active_irqs); |
| 157 | } | 167 | } |
| 158 | } | 168 | } |
| 159 | 169 | ||
| @@ -243,6 +253,8 @@ static const struct of_device_id cpu_pmu_of_device_ids[] = { | |||
| 243 | {.compatible = "arm,arm1176-pmu", .data = armv6_1176_pmu_init}, | 253 | {.compatible = "arm,arm1176-pmu", .data = armv6_1176_pmu_init}, |
| 244 | {.compatible = "arm,arm1136-pmu", .data = armv6_1136_pmu_init}, | 254 | {.compatible = "arm,arm1136-pmu", .data = armv6_1136_pmu_init}, |
| 245 | {.compatible = "qcom,krait-pmu", .data = krait_pmu_init}, | 255 | {.compatible = "qcom,krait-pmu", .data = krait_pmu_init}, |
| 256 | {.compatible = "qcom,scorpion-pmu", .data = scorpion_pmu_init}, | ||
| 257 | {.compatible = "qcom,scorpion-mp-pmu", .data = scorpion_mp_pmu_init}, | ||
| 246 | {}, | 258 | {}, |
| 247 | }; | 259 | }; |
| 248 | 260 | ||
| @@ -289,6 +301,48 @@ static int probe_current_pmu(struct arm_pmu *pmu) | |||
| 289 | return ret; | 301 | return ret; |
| 290 | } | 302 | } |
| 291 | 303 | ||
| 304 | static int of_pmu_irq_cfg(struct platform_device *pdev) | ||
| 305 | { | ||
| 306 | int i; | ||
| 307 | int *irqs = kcalloc(pdev->num_resources, sizeof(*irqs), GFP_KERNEL); | ||
| 308 | |||
| 309 | if (!irqs) | ||
| 310 | return -ENOMEM; | ||
| 311 | |||
| 312 | for (i = 0; i < pdev->num_resources; ++i) { | ||
| 313 | struct device_node *dn; | ||
| 314 | int cpu; | ||
| 315 | |||
| 316 | dn = of_parse_phandle(pdev->dev.of_node, "interrupt-affinity", | ||
| 317 | i); | ||
| 318 | if (!dn) { | ||
| 319 | pr_warn("Failed to parse %s/interrupt-affinity[%d]\n", | ||
| 320 | of_node_full_name(dn), i); | ||
| 321 | break; | ||
| 322 | } | ||
| 323 | |||
| 324 | for_each_possible_cpu(cpu) | ||
| 325 | if (arch_find_n_match_cpu_physical_id(dn, cpu, NULL)) | ||
| 326 | break; | ||
| 327 | |||
| 328 | of_node_put(dn); | ||
| 329 | if (cpu >= nr_cpu_ids) { | ||
| 330 | pr_warn("Failed to find logical CPU for %s\n", | ||
| 331 | dn->name); | ||
| 332 | break; | ||
| 333 | } | ||
| 334 | |||
| 335 | irqs[i] = cpu; | ||
| 336 | } | ||
| 337 | |||
| 338 | if (i == pdev->num_resources) | ||
| 339 | cpu_pmu->irq_affinity = irqs; | ||
| 340 | else | ||
| 341 | kfree(irqs); | ||
| 342 | |||
| 343 | return 0; | ||
| 344 | } | ||
| 345 | |||
| 292 | static int cpu_pmu_device_probe(struct platform_device *pdev) | 346 | static int cpu_pmu_device_probe(struct platform_device *pdev) |
| 293 | { | 347 | { |
| 294 | const struct of_device_id *of_id; | 348 | const struct of_device_id *of_id; |
| @@ -313,7 +367,10 @@ static int cpu_pmu_device_probe(struct platform_device *pdev) | |||
| 313 | 367 | ||
| 314 | if (node && (of_id = of_match_node(cpu_pmu_of_device_ids, pdev->dev.of_node))) { | 368 | if (node && (of_id = of_match_node(cpu_pmu_of_device_ids, pdev->dev.of_node))) { |
| 315 | init_fn = of_id->data; | 369 | init_fn = of_id->data; |
| 316 | ret = init_fn(pmu); | 370 | |
| 371 | ret = of_pmu_irq_cfg(pdev); | ||
| 372 | if (!ret) | ||
| 373 | ret = init_fn(pmu); | ||
| 317 | } else { | 374 | } else { |
| 318 | ret = probe_current_pmu(pmu); | 375 | ret = probe_current_pmu(pmu); |
| 319 | } | 376 | } |
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 8993770c47de..f4207a4dcb01 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c | |||
| @@ -140,6 +140,23 @@ enum krait_perf_types { | |||
| 140 | KRAIT_PERFCTR_L1_DTLB_ACCESS = 0x12210, | 140 | KRAIT_PERFCTR_L1_DTLB_ACCESS = 0x12210, |
| 141 | }; | 141 | }; |
| 142 | 142 | ||
| 143 | /* ARMv7 Scorpion specific event types */ | ||
| 144 | enum scorpion_perf_types { | ||
| 145 | SCORPION_LPM0_GROUP0 = 0x4c, | ||
| 146 | SCORPION_LPM1_GROUP0 = 0x50, | ||
| 147 | SCORPION_LPM2_GROUP0 = 0x54, | ||
| 148 | SCORPION_L2LPM_GROUP0 = 0x58, | ||
| 149 | SCORPION_VLPM_GROUP0 = 0x5c, | ||
| 150 | |||
| 151 | SCORPION_ICACHE_ACCESS = 0x10053, | ||
| 152 | SCORPION_ICACHE_MISS = 0x10052, | ||
| 153 | |||
| 154 | SCORPION_DTLB_ACCESS = 0x12013, | ||
| 155 | SCORPION_DTLB_MISS = 0x12012, | ||
| 156 | |||
| 157 | SCORPION_ITLB_MISS = 0x12021, | ||
| 158 | }; | ||
| 159 | |||
| 143 | /* | 160 | /* |
| 144 | * Cortex-A8 HW events mapping | 161 | * Cortex-A8 HW events mapping |
| 145 | * | 162 | * |
| @@ -482,6 +499,49 @@ static const unsigned krait_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
| 482 | }; | 499 | }; |
| 483 | 500 | ||
| 484 | /* | 501 | /* |
| 502 | * Scorpion HW events mapping | ||
| 503 | */ | ||
| 504 | static const unsigned scorpion_perf_map[PERF_COUNT_HW_MAX] = { | ||
| 505 | PERF_MAP_ALL_UNSUPPORTED, | ||
| 506 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | ||
| 507 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, | ||
| 508 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, | ||
| 509 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
| 510 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES, | ||
| 511 | }; | ||
| 512 | |||
| 513 | static const unsigned scorpion_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | ||
| 514 | [PERF_COUNT_HW_CACHE_OP_MAX] | ||
| 515 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | ||
| 516 | PERF_CACHE_MAP_ALL_UNSUPPORTED, | ||
| 517 | /* | ||
| 518 | * The performance counters don't differentiate between read and write | ||
| 519 | * accesses/misses so this isn't strictly correct, but it's the best we | ||
| 520 | * can do. Writes and reads get combined. | ||
| 521 | */ | ||
| 522 | [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, | ||
| 523 | [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, | ||
| 524 | [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, | ||
| 525 | [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, | ||
| 526 | [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = SCORPION_ICACHE_ACCESS, | ||
| 527 | [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = SCORPION_ICACHE_MISS, | ||
| 528 | /* | ||
| 529 | * Only ITLB misses and DTLB refills are supported. If users want the | ||
| 530 | * DTLB refills misses a raw counter must be used. | ||
| 531 | */ | ||
| 532 | [C(DTLB)][C(OP_READ)][C(RESULT_ACCESS)] = SCORPION_DTLB_ACCESS, | ||
| 533 | [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = SCORPION_DTLB_MISS, | ||
| 534 | [C(DTLB)][C(OP_WRITE)][C(RESULT_ACCESS)] = SCORPION_DTLB_ACCESS, | ||
| 535 | [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = SCORPION_DTLB_MISS, | ||
| 536 | [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = SCORPION_ITLB_MISS, | ||
| 537 | [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = SCORPION_ITLB_MISS, | ||
| 538 | [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | ||
| 539 | [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
| 540 | [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | ||
| 541 | [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
| 542 | }; | ||
| 543 | |||
| 544 | /* | ||
| 485 | * Perf Events' indices | 545 | * Perf Events' indices |
| 486 | */ | 546 | */ |
| 487 | #define ARMV7_IDX_CYCLE_COUNTER 0 | 547 | #define ARMV7_IDX_CYCLE_COUNTER 0 |
| @@ -976,6 +1036,12 @@ static int krait_map_event_no_branch(struct perf_event *event) | |||
| 976 | &krait_perf_cache_map, 0xFFFFF); | 1036 | &krait_perf_cache_map, 0xFFFFF); |
| 977 | } | 1037 | } |
| 978 | 1038 | ||
| 1039 | static int scorpion_map_event(struct perf_event *event) | ||
| 1040 | { | ||
| 1041 | return armpmu_map_event(event, &scorpion_perf_map, | ||
| 1042 | &scorpion_perf_cache_map, 0xFFFFF); | ||
| 1043 | } | ||
| 1044 | |||
| 979 | static void armv7pmu_init(struct arm_pmu *cpu_pmu) | 1045 | static void armv7pmu_init(struct arm_pmu *cpu_pmu) |
| 980 | { | 1046 | { |
| 981 | cpu_pmu->handle_irq = armv7pmu_handle_irq; | 1047 | cpu_pmu->handle_irq = armv7pmu_handle_irq; |
| @@ -1103,6 +1169,12 @@ static int armv7_a17_pmu_init(struct arm_pmu *cpu_pmu) | |||
| 1103 | #define KRAIT_EVENT_MASK (KRAIT_EVENT | VENUM_EVENT) | 1169 | #define KRAIT_EVENT_MASK (KRAIT_EVENT | VENUM_EVENT) |
| 1104 | #define PMRESRn_EN BIT(31) | 1170 | #define PMRESRn_EN BIT(31) |
| 1105 | 1171 | ||
| 1172 | #define EVENT_REGION(event) (((event) >> 12) & 0xf) /* R */ | ||
| 1173 | #define EVENT_GROUP(event) ((event) & 0xf) /* G */ | ||
| 1174 | #define EVENT_CODE(event) (((event) >> 4) & 0xff) /* CC */ | ||
| 1175 | #define EVENT_VENUM(event) (!!(event & VENUM_EVENT)) /* N=2 */ | ||
| 1176 | #define EVENT_CPU(event) (!!(event & KRAIT_EVENT)) /* N=1 */ | ||
| 1177 | |||
| 1106 | static u32 krait_read_pmresrn(int n) | 1178 | static u32 krait_read_pmresrn(int n) |
| 1107 | { | 1179 | { |
| 1108 | u32 val; | 1180 | u32 val; |
| @@ -1141,19 +1213,19 @@ static void krait_write_pmresrn(int n, u32 val) | |||
| 1141 | } | 1213 | } |
| 1142 | } | 1214 | } |
| 1143 | 1215 | ||
| 1144 | static u32 krait_read_vpmresr0(void) | 1216 | static u32 venum_read_pmresr(void) |
| 1145 | { | 1217 | { |
| 1146 | u32 val; | 1218 | u32 val; |
| 1147 | asm volatile("mrc p10, 7, %0, c11, c0, 0" : "=r" (val)); | 1219 | asm volatile("mrc p10, 7, %0, c11, c0, 0" : "=r" (val)); |
| 1148 | return val; | 1220 | return val; |
| 1149 | } | 1221 | } |
| 1150 | 1222 | ||
| 1151 | static void krait_write_vpmresr0(u32 val) | 1223 | static void venum_write_pmresr(u32 val) |
| 1152 | { | 1224 | { |
| 1153 | asm volatile("mcr p10, 7, %0, c11, c0, 0" : : "r" (val)); | 1225 | asm volatile("mcr p10, 7, %0, c11, c0, 0" : : "r" (val)); |
| 1154 | } | 1226 | } |
| 1155 | 1227 | ||
| 1156 | static void krait_pre_vpmresr0(u32 *venum_orig_val, u32 *fp_orig_val) | 1228 | static void venum_pre_pmresr(u32 *venum_orig_val, u32 *fp_orig_val) |
| 1157 | { | 1229 | { |
| 1158 | u32 venum_new_val; | 1230 | u32 venum_new_val; |
| 1159 | u32 fp_new_val; | 1231 | u32 fp_new_val; |
| @@ -1170,7 +1242,7 @@ static void krait_pre_vpmresr0(u32 *venum_orig_val, u32 *fp_orig_val) | |||
| 1170 | fmxr(FPEXC, fp_new_val); | 1242 | fmxr(FPEXC, fp_new_val); |
| 1171 | } | 1243 | } |
| 1172 | 1244 | ||
| 1173 | static void krait_post_vpmresr0(u32 venum_orig_val, u32 fp_orig_val) | 1245 | static void venum_post_pmresr(u32 venum_orig_val, u32 fp_orig_val) |
| 1174 | { | 1246 | { |
| 1175 | BUG_ON(preemptible()); | 1247 | BUG_ON(preemptible()); |
| 1176 | /* Restore FPEXC */ | 1248 | /* Restore FPEXC */ |
| @@ -1193,16 +1265,11 @@ static void krait_evt_setup(int idx, u32 config_base) | |||
| 1193 | u32 val; | 1265 | u32 val; |
| 1194 | u32 mask; | 1266 | u32 mask; |
| 1195 | u32 vval, fval; | 1267 | u32 vval, fval; |
| 1196 | unsigned int region; | 1268 | unsigned int region = EVENT_REGION(config_base); |
| 1197 | unsigned int group; | 1269 | unsigned int group = EVENT_GROUP(config_base); |
| 1198 | unsigned int code; | 1270 | unsigned int code = EVENT_CODE(config_base); |
| 1199 | unsigned int group_shift; | 1271 | unsigned int group_shift; |
| 1200 | bool venum_event; | 1272 | bool venum_event = EVENT_VENUM(config_base); |
| 1201 | |||
| 1202 | venum_event = !!(config_base & VENUM_EVENT); | ||
| 1203 | region = (config_base >> 12) & 0xf; | ||
| 1204 | code = (config_base >> 4) & 0xff; | ||
| 1205 | group = (config_base >> 0) & 0xf; | ||
| 1206 | 1273 | ||
| 1207 | group_shift = group * 8; | 1274 | group_shift = group * 8; |
| 1208 | mask = 0xff << group_shift; | 1275 | mask = 0xff << group_shift; |
| @@ -1217,16 +1284,14 @@ static void krait_evt_setup(int idx, u32 config_base) | |||
| 1217 | val |= config_base & (ARMV7_EXCLUDE_USER | ARMV7_EXCLUDE_PL1); | 1284 | val |= config_base & (ARMV7_EXCLUDE_USER | ARMV7_EXCLUDE_PL1); |
| 1218 | armv7_pmnc_write_evtsel(idx, val); | 1285 | armv7_pmnc_write_evtsel(idx, val); |
| 1219 | 1286 | ||
| 1220 | asm volatile("mcr p15, 0, %0, c9, c15, 0" : : "r" (0)); | ||
| 1221 | |||
| 1222 | if (venum_event) { | 1287 | if (venum_event) { |
| 1223 | krait_pre_vpmresr0(&vval, &fval); | 1288 | venum_pre_pmresr(&vval, &fval); |
| 1224 | val = krait_read_vpmresr0(); | 1289 | val = venum_read_pmresr(); |
| 1225 | val &= ~mask; | 1290 | val &= ~mask; |
| 1226 | val |= code << group_shift; | 1291 | val |= code << group_shift; |
| 1227 | val |= PMRESRn_EN; | 1292 | val |= PMRESRn_EN; |
| 1228 | krait_write_vpmresr0(val); | 1293 | venum_write_pmresr(val); |
| 1229 | krait_post_vpmresr0(vval, fval); | 1294 | venum_post_pmresr(vval, fval); |
| 1230 | } else { | 1295 | } else { |
| 1231 | val = krait_read_pmresrn(region); | 1296 | val = krait_read_pmresrn(region); |
| 1232 | val &= ~mask; | 1297 | val &= ~mask; |
| @@ -1236,7 +1301,7 @@ static void krait_evt_setup(int idx, u32 config_base) | |||
| 1236 | } | 1301 | } |
| 1237 | } | 1302 | } |
| 1238 | 1303 | ||
| 1239 | static u32 krait_clear_pmresrn_group(u32 val, int group) | 1304 | static u32 clear_pmresrn_group(u32 val, int group) |
| 1240 | { | 1305 | { |
| 1241 | u32 mask; | 1306 | u32 mask; |
| 1242 | int group_shift; | 1307 | int group_shift; |
| @@ -1256,23 +1321,19 @@ static void krait_clearpmu(u32 config_base) | |||
| 1256 | { | 1321 | { |
| 1257 | u32 val; | 1322 | u32 val; |
| 1258 | u32 vval, fval; | 1323 | u32 vval, fval; |
| 1259 | unsigned int region; | 1324 | unsigned int region = EVENT_REGION(config_base); |
| 1260 | unsigned int group; | 1325 | unsigned int group = EVENT_GROUP(config_base); |
| 1261 | bool venum_event; | 1326 | bool venum_event = EVENT_VENUM(config_base); |
| 1262 | |||
| 1263 | venum_event = !!(config_base & VENUM_EVENT); | ||
| 1264 | region = (config_base >> 12) & 0xf; | ||
| 1265 | group = (config_base >> 0) & 0xf; | ||
| 1266 | 1327 | ||
| 1267 | if (venum_event) { | 1328 | if (venum_event) { |
| 1268 | krait_pre_vpmresr0(&vval, &fval); | 1329 | venum_pre_pmresr(&vval, &fval); |
| 1269 | val = krait_read_vpmresr0(); | 1330 | val = venum_read_pmresr(); |
| 1270 | val = krait_clear_pmresrn_group(val, group); | 1331 | val = clear_pmresrn_group(val, group); |
| 1271 | krait_write_vpmresr0(val); | 1332 | venum_write_pmresr(val); |
| 1272 | krait_post_vpmresr0(vval, fval); | 1333 | venum_post_pmresr(vval, fval); |
| 1273 | } else { | 1334 | } else { |
| 1274 | val = krait_read_pmresrn(region); | 1335 | val = krait_read_pmresrn(region); |
| 1275 | val = krait_clear_pmresrn_group(val, group); | 1336 | val = clear_pmresrn_group(val, group); |
| 1276 | krait_write_pmresrn(region, val); | 1337 | krait_write_pmresrn(region, val); |
| 1277 | } | 1338 | } |
| 1278 | } | 1339 | } |
| @@ -1342,6 +1403,8 @@ static void krait_pmu_enable_event(struct perf_event *event) | |||
| 1342 | static void krait_pmu_reset(void *info) | 1403 | static void krait_pmu_reset(void *info) |
| 1343 | { | 1404 | { |
| 1344 | u32 vval, fval; | 1405 | u32 vval, fval; |
| 1406 | struct arm_pmu *cpu_pmu = info; | ||
| 1407 | u32 idx, nb_cnt = cpu_pmu->num_events; | ||
| 1345 | 1408 | ||
| 1346 | armv7pmu_reset(info); | 1409 | armv7pmu_reset(info); |
| 1347 | 1410 | ||
| @@ -1350,9 +1413,16 @@ static void krait_pmu_reset(void *info) | |||
| 1350 | krait_write_pmresrn(1, 0); | 1413 | krait_write_pmresrn(1, 0); |
| 1351 | krait_write_pmresrn(2, 0); | 1414 | krait_write_pmresrn(2, 0); |
| 1352 | 1415 | ||
| 1353 | krait_pre_vpmresr0(&vval, &fval); | 1416 | venum_pre_pmresr(&vval, &fval); |
| 1354 | krait_write_vpmresr0(0); | 1417 | venum_write_pmresr(0); |
| 1355 | krait_post_vpmresr0(vval, fval); | 1418 | venum_post_pmresr(vval, fval); |
| 1419 | |||
| 1420 | /* Reset PMxEVNCTCR to sane default */ | ||
| 1421 | for (idx = ARMV7_IDX_CYCLE_COUNTER; idx < nb_cnt; ++idx) { | ||
| 1422 | armv7_pmnc_select_counter(idx); | ||
| 1423 | asm volatile("mcr p15, 0, %0, c9, c15, 0" : : "r" (0)); | ||
| 1424 | } | ||
| 1425 | |||
| 1356 | } | 1426 | } |
| 1357 | 1427 | ||
| 1358 | static int krait_event_to_bit(struct perf_event *event, unsigned int region, | 1428 | static int krait_event_to_bit(struct perf_event *event, unsigned int region, |
| @@ -1386,26 +1456,18 @@ static int krait_pmu_get_event_idx(struct pmu_hw_events *cpuc, | |||
| 1386 | { | 1456 | { |
| 1387 | int idx; | 1457 | int idx; |
| 1388 | int bit = -1; | 1458 | int bit = -1; |
| 1389 | unsigned int prefix; | ||
| 1390 | unsigned int region; | ||
| 1391 | unsigned int code; | ||
| 1392 | unsigned int group; | ||
| 1393 | bool krait_event; | ||
| 1394 | struct hw_perf_event *hwc = &event->hw; | 1459 | struct hw_perf_event *hwc = &event->hw; |
| 1460 | unsigned int region = EVENT_REGION(hwc->config_base); | ||
| 1461 | unsigned int code = EVENT_CODE(hwc->config_base); | ||
| 1462 | unsigned int group = EVENT_GROUP(hwc->config_base); | ||
| 1463 | bool venum_event = EVENT_VENUM(hwc->config_base); | ||
| 1464 | bool krait_event = EVENT_CPU(hwc->config_base); | ||
| 1395 | 1465 | ||
| 1396 | region = (hwc->config_base >> 12) & 0xf; | 1466 | if (venum_event || krait_event) { |
| 1397 | code = (hwc->config_base >> 4) & 0xff; | ||
| 1398 | group = (hwc->config_base >> 0) & 0xf; | ||
| 1399 | krait_event = !!(hwc->config_base & KRAIT_EVENT_MASK); | ||
| 1400 | |||
| 1401 | if (krait_event) { | ||
| 1402 | /* Ignore invalid events */ | 1467 | /* Ignore invalid events */ |
| 1403 | if (group > 3 || region > 2) | 1468 | if (group > 3 || region > 2) |
| 1404 | return -EINVAL; | 1469 | return -EINVAL; |
| 1405 | prefix = hwc->config_base & KRAIT_EVENT_MASK; | 1470 | if (venum_event && (code & 0xe0)) |
| 1406 | if (prefix != KRAIT_EVENT && prefix != VENUM_EVENT) | ||
| 1407 | return -EINVAL; | ||
| 1408 | if (prefix == VENUM_EVENT && (code & 0xe0)) | ||
| 1409 | return -EINVAL; | 1471 | return -EINVAL; |
| 1410 | 1472 | ||
| 1411 | bit = krait_event_to_bit(event, region, group); | 1473 | bit = krait_event_to_bit(event, region, group); |
| @@ -1425,15 +1487,12 @@ static void krait_pmu_clear_event_idx(struct pmu_hw_events *cpuc, | |||
| 1425 | { | 1487 | { |
| 1426 | int bit; | 1488 | int bit; |
| 1427 | struct hw_perf_event *hwc = &event->hw; | 1489 | struct hw_perf_event *hwc = &event->hw; |
| 1428 | unsigned int region; | 1490 | unsigned int region = EVENT_REGION(hwc->config_base); |
| 1429 | unsigned int group; | 1491 | unsigned int group = EVENT_GROUP(hwc->config_base); |
| 1430 | bool krait_event; | 1492 | bool venum_event = EVENT_VENUM(hwc->config_base); |
| 1493 | bool krait_event = EVENT_CPU(hwc->config_base); | ||
| 1431 | 1494 | ||
| 1432 | region = (hwc->config_base >> 12) & 0xf; | 1495 | if (venum_event || krait_event) { |
| 1433 | group = (hwc->config_base >> 0) & 0xf; | ||
| 1434 | krait_event = !!(hwc->config_base & KRAIT_EVENT_MASK); | ||
| 1435 | |||
| 1436 | if (krait_event) { | ||
| 1437 | bit = krait_event_to_bit(event, region, group); | 1496 | bit = krait_event_to_bit(event, region, group); |
| 1438 | clear_bit(bit, cpuc->used_mask); | 1497 | clear_bit(bit, cpuc->used_mask); |
| 1439 | } | 1498 | } |
| @@ -1458,6 +1517,344 @@ static int krait_pmu_init(struct arm_pmu *cpu_pmu) | |||
| 1458 | cpu_pmu->clear_event_idx = krait_pmu_clear_event_idx; | 1517 | cpu_pmu->clear_event_idx = krait_pmu_clear_event_idx; |
| 1459 | return 0; | 1518 | return 0; |
| 1460 | } | 1519 | } |
| 1520 | |||
| 1521 | /* | ||
| 1522 | * Scorpion Local Performance Monitor Register (LPMn) | ||
| 1523 | * | ||
| 1524 | * 31 30 24 16 8 0 | ||
| 1525 | * +--------------------------------+ | ||
| 1526 | * LPM0 | EN | CC | CC | CC | CC | N = 1, R = 0 | ||
| 1527 | * +--------------------------------+ | ||
| 1528 | * LPM1 | EN | CC | CC | CC | CC | N = 1, R = 1 | ||
| 1529 | * +--------------------------------+ | ||
| 1530 | * LPM2 | EN | CC | CC | CC | CC | N = 1, R = 2 | ||
| 1531 | * +--------------------------------+ | ||
| 1532 | * L2LPM | EN | CC | CC | CC | CC | N = 1, R = 3 | ||
| 1533 | * +--------------------------------+ | ||
| 1534 | * VLPM | EN | CC | CC | CC | CC | N = 2, R = ? | ||
| 1535 | * +--------------------------------+ | ||
| 1536 | * EN | G=3 | G=2 | G=1 | G=0 | ||
| 1537 | * | ||
| 1538 | * | ||
| 1539 | * Event Encoding: | ||
| 1540 | * | ||
| 1541 | * hwc->config_base = 0xNRCCG | ||
| 1542 | * | ||
| 1543 | * N = prefix, 1 for Scorpion CPU (LPMn/L2LPM), 2 for Venum VFP (VLPM) | ||
| 1544 | * R = region register | ||
| 1545 | * CC = class of events the group G is choosing from | ||
| 1546 | * G = group or particular event | ||
| 1547 | * | ||
| 1548 | * Example: 0x12021 is a Scorpion CPU event in LPM2's group 1 with code 2 | ||
| 1549 | * | ||
| 1550 | * A region (R) corresponds to a piece of the CPU (execution unit, instruction | ||
| 1551 | * unit, etc.) while the event code (CC) corresponds to a particular class of | ||
| 1552 | * events (interrupts for example). An event code is broken down into | ||
| 1553 | * groups (G) that can be mapped into the PMU (irq, fiqs, and irq+fiqs for | ||
| 1554 | * example). | ||
| 1555 | */ | ||
| 1556 | |||
| 1557 | static u32 scorpion_read_pmresrn(int n) | ||
| 1558 | { | ||
| 1559 | u32 val; | ||
| 1560 | |||
| 1561 | switch (n) { | ||
| 1562 | case 0: | ||
| 1563 | asm volatile("mrc p15, 0, %0, c15, c0, 0" : "=r" (val)); | ||
| 1564 | break; | ||
| 1565 | case 1: | ||
| 1566 | asm volatile("mrc p15, 1, %0, c15, c0, 0" : "=r" (val)); | ||
| 1567 | break; | ||
| 1568 | case 2: | ||
| 1569 | asm volatile("mrc p15, 2, %0, c15, c0, 0" : "=r" (val)); | ||
| 1570 | break; | ||
| 1571 | case 3: | ||
| 1572 | asm volatile("mrc p15, 3, %0, c15, c2, 0" : "=r" (val)); | ||
| 1573 | break; | ||
| 1574 | default: | ||
| 1575 | BUG(); /* Should be validated in scorpion_pmu_get_event_idx() */ | ||
| 1576 | } | ||
| 1577 | |||
| 1578 | return val; | ||
| 1579 | } | ||
| 1580 | |||
| 1581 | static void scorpion_write_pmresrn(int n, u32 val) | ||
| 1582 | { | ||
| 1583 | switch (n) { | ||
| 1584 | case 0: | ||
| 1585 | asm volatile("mcr p15, 0, %0, c15, c0, 0" : : "r" (val)); | ||
| 1586 | break; | ||
| 1587 | case 1: | ||
| 1588 | asm volatile("mcr p15, 1, %0, c15, c0, 0" : : "r" (val)); | ||
| 1589 | break; | ||
| 1590 | case 2: | ||
| 1591 | asm volatile("mcr p15, 2, %0, c15, c0, 0" : : "r" (val)); | ||
| 1592 | break; | ||
| 1593 | case 3: | ||
| 1594 | asm volatile("mcr p15, 3, %0, c15, c2, 0" : : "r" (val)); | ||
| 1595 | break; | ||
| 1596 | default: | ||
| 1597 | BUG(); /* Should be validated in scorpion_pmu_get_event_idx() */ | ||
| 1598 | } | ||
| 1599 | } | ||
| 1600 | |||
| 1601 | static u32 scorpion_get_pmresrn_event(unsigned int region) | ||
| 1602 | { | ||
| 1603 | static const u32 pmresrn_table[] = { SCORPION_LPM0_GROUP0, | ||
| 1604 | SCORPION_LPM1_GROUP0, | ||
| 1605 | SCORPION_LPM2_GROUP0, | ||
| 1606 | SCORPION_L2LPM_GROUP0 }; | ||
| 1607 | return pmresrn_table[region]; | ||
| 1608 | } | ||
| 1609 | |||
| 1610 | static void scorpion_evt_setup(int idx, u32 config_base) | ||
| 1611 | { | ||
| 1612 | u32 val; | ||
| 1613 | u32 mask; | ||
| 1614 | u32 vval, fval; | ||
| 1615 | unsigned int region = EVENT_REGION(config_base); | ||
| 1616 | unsigned int group = EVENT_GROUP(config_base); | ||
| 1617 | unsigned int code = EVENT_CODE(config_base); | ||
| 1618 | unsigned int group_shift; | ||
| 1619 | bool venum_event = EVENT_VENUM(config_base); | ||
| 1620 | |||
| 1621 | group_shift = group * 8; | ||
| 1622 | mask = 0xff << group_shift; | ||
| 1623 | |||
| 1624 | /* Configure evtsel for the region and group */ | ||
| 1625 | if (venum_event) | ||
| 1626 | val = SCORPION_VLPM_GROUP0; | ||
| 1627 | else | ||
| 1628 | val = scorpion_get_pmresrn_event(region); | ||
| 1629 | val += group; | ||
| 1630 | /* Mix in mode-exclusion bits */ | ||
| 1631 | val |= config_base & (ARMV7_EXCLUDE_USER | ARMV7_EXCLUDE_PL1); | ||
| 1632 | armv7_pmnc_write_evtsel(idx, val); | ||
| 1633 | |||
| 1634 | asm volatile("mcr p15, 0, %0, c9, c15, 0" : : "r" (0)); | ||
| 1635 | |||
| 1636 | if (venum_event) { | ||
| 1637 | venum_pre_pmresr(&vval, &fval); | ||
| 1638 | val = venum_read_pmresr(); | ||
| 1639 | val &= ~mask; | ||
| 1640 | val |= code << group_shift; | ||
| 1641 | val |= PMRESRn_EN; | ||
| 1642 | venum_write_pmresr(val); | ||
| 1643 | venum_post_pmresr(vval, fval); | ||
| 1644 | } else { | ||
| 1645 | val = scorpion_read_pmresrn(region); | ||
| 1646 | val &= ~mask; | ||
| 1647 | val |= code << group_shift; | ||
| 1648 | val |= PMRESRn_EN; | ||
| 1649 | scorpion_write_pmresrn(region, val); | ||
| 1650 | } | ||
| 1651 | } | ||
| 1652 | |||
| 1653 | static void scorpion_clearpmu(u32 config_base) | ||
| 1654 | { | ||
| 1655 | u32 val; | ||
| 1656 | u32 vval, fval; | ||
| 1657 | unsigned int region = EVENT_REGION(config_base); | ||
| 1658 | unsigned int group = EVENT_GROUP(config_base); | ||
| 1659 | bool venum_event = EVENT_VENUM(config_base); | ||
| 1660 | |||
| 1661 | if (venum_event) { | ||
| 1662 | venum_pre_pmresr(&vval, &fval); | ||
| 1663 | val = venum_read_pmresr(); | ||
| 1664 | val = clear_pmresrn_group(val, group); | ||
| 1665 | venum_write_pmresr(val); | ||
| 1666 | venum_post_pmresr(vval, fval); | ||
| 1667 | } else { | ||
| 1668 | val = scorpion_read_pmresrn(region); | ||
| 1669 | val = clear_pmresrn_group(val, group); | ||
| 1670 | scorpion_write_pmresrn(region, val); | ||
| 1671 | } | ||
| 1672 | } | ||
| 1673 | |||
| 1674 | static void scorpion_pmu_disable_event(struct perf_event *event) | ||
| 1675 | { | ||
| 1676 | unsigned long flags; | ||
| 1677 | struct hw_perf_event *hwc = &event->hw; | ||
| 1678 | int idx = hwc->idx; | ||
| 1679 | struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); | ||
| 1680 | struct pmu_hw_events *events = this_cpu_ptr(cpu_pmu->hw_events); | ||
| 1681 | |||
| 1682 | /* Disable counter and interrupt */ | ||
| 1683 | raw_spin_lock_irqsave(&events->pmu_lock, flags); | ||
| 1684 | |||
| 1685 | /* Disable counter */ | ||
| 1686 | armv7_pmnc_disable_counter(idx); | ||
| 1687 | |||
| 1688 | /* | ||
| 1689 | * Clear pmresr code (if destined for PMNx counters) | ||
| 1690 | */ | ||
| 1691 | if (hwc->config_base & KRAIT_EVENT_MASK) | ||
| 1692 | scorpion_clearpmu(hwc->config_base); | ||
| 1693 | |||
| 1694 | /* Disable interrupt for this counter */ | ||
| 1695 | armv7_pmnc_disable_intens(idx); | ||
| 1696 | |||
| 1697 | raw_spin_unlock_irqrestore(&events->pmu_lock, flags); | ||
| 1698 | } | ||
| 1699 | |||
| 1700 | static void scorpion_pmu_enable_event(struct perf_event *event) | ||
| 1701 | { | ||
| 1702 | unsigned long flags; | ||
| 1703 | struct hw_perf_event *hwc = &event->hw; | ||
| 1704 | int idx = hwc->idx; | ||
| 1705 | struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); | ||
| 1706 | struct pmu_hw_events *events = this_cpu_ptr(cpu_pmu->hw_events); | ||
| 1707 | |||
| 1708 | /* | ||
| 1709 | * Enable counter and interrupt, and set the counter to count | ||
| 1710 | * the event that we're interested in. | ||
| 1711 | */ | ||
| 1712 | raw_spin_lock_irqsave(&events->pmu_lock, flags); | ||
| 1713 | |||
| 1714 | /* Disable counter */ | ||
| 1715 | armv7_pmnc_disable_counter(idx); | ||
| 1716 | |||
| 1717 | /* | ||
| 1718 | * Set event (if destined for PMNx counters) | ||
| 1719 | * We don't set the event for the cycle counter because we | ||
| 1720 | * don't have the ability to perform event filtering. | ||
| 1721 | */ | ||
| 1722 | if (hwc->config_base & KRAIT_EVENT_MASK) | ||
| 1723 | scorpion_evt_setup(idx, hwc->config_base); | ||
| 1724 | else if (idx != ARMV7_IDX_CYCLE_COUNTER) | ||
| 1725 | armv7_pmnc_write_evtsel(idx, hwc->config_base); | ||
| 1726 | |||
| 1727 | /* Enable interrupt for this counter */ | ||
| 1728 | armv7_pmnc_enable_intens(idx); | ||
| 1729 | |||
| 1730 | /* Enable counter */ | ||
| 1731 | armv7_pmnc_enable_counter(idx); | ||
| 1732 | |||
| 1733 | raw_spin_unlock_irqrestore(&events->pmu_lock, flags); | ||
| 1734 | } | ||
| 1735 | |||
| 1736 | static void scorpion_pmu_reset(void *info) | ||
| 1737 | { | ||
| 1738 | u32 vval, fval; | ||
| 1739 | struct arm_pmu *cpu_pmu = info; | ||
| 1740 | u32 idx, nb_cnt = cpu_pmu->num_events; | ||
| 1741 | |||
| 1742 | armv7pmu_reset(info); | ||
| 1743 | |||
| 1744 | /* Clear all pmresrs */ | ||
| 1745 | scorpion_write_pmresrn(0, 0); | ||
| 1746 | scorpion_write_pmresrn(1, 0); | ||
| 1747 | scorpion_write_pmresrn(2, 0); | ||
| 1748 | scorpion_write_pmresrn(3, 0); | ||
| 1749 | |||
| 1750 | venum_pre_pmresr(&vval, &fval); | ||
| 1751 | venum_write_pmresr(0); | ||
| 1752 | venum_post_pmresr(vval, fval); | ||
| 1753 | |||
| 1754 | /* Reset PMxEVNCTCR to sane default */ | ||
| 1755 | for (idx = ARMV7_IDX_CYCLE_COUNTER; idx < nb_cnt; ++idx) { | ||
| 1756 | armv7_pmnc_select_counter(idx); | ||
| 1757 | asm volatile("mcr p15, 0, %0, c9, c15, 0" : : "r" (0)); | ||
| 1758 | } | ||
| 1759 | } | ||
| 1760 | |||
| 1761 | static int scorpion_event_to_bit(struct perf_event *event, unsigned int region, | ||
| 1762 | unsigned int group) | ||
| 1763 | { | ||
| 1764 | int bit; | ||
| 1765 | struct hw_perf_event *hwc = &event->hw; | ||
| 1766 | struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); | ||
| 1767 | |||
| 1768 | if (hwc->config_base & VENUM_EVENT) | ||
| 1769 | bit = SCORPION_VLPM_GROUP0; | ||
| 1770 | else | ||
| 1771 | bit = scorpion_get_pmresrn_event(region); | ||
| 1772 | bit -= scorpion_get_pmresrn_event(0); | ||
| 1773 | bit += group; | ||
| 1774 | /* | ||
| 1775 | * Lower bits are reserved for use by the counters (see | ||
| 1776 | * armv7pmu_get_event_idx() for more info) | ||
| 1777 | */ | ||
| 1778 | bit += ARMV7_IDX_COUNTER_LAST(cpu_pmu) + 1; | ||
| 1779 | |||
| 1780 | return bit; | ||
| 1781 | } | ||
| 1782 | |||
| 1783 | /* | ||
| 1784 | * We check for column exclusion constraints here. | ||
| 1785 | * Two events cant use the same group within a pmresr register. | ||
| 1786 | */ | ||
| 1787 | static int scorpion_pmu_get_event_idx(struct pmu_hw_events *cpuc, | ||
| 1788 | struct perf_event *event) | ||
| 1789 | { | ||
| 1790 | int idx; | ||
| 1791 | int bit = -1; | ||
| 1792 | struct hw_perf_event *hwc = &event->hw; | ||
| 1793 | unsigned int region = EVENT_REGION(hwc->config_base); | ||
| 1794 | unsigned int group = EVENT_GROUP(hwc->config_base); | ||
| 1795 | bool venum_event = EVENT_VENUM(hwc->config_base); | ||
| 1796 | bool scorpion_event = EVENT_CPU(hwc->config_base); | ||
| 1797 | |||
| 1798 | if (venum_event || scorpion_event) { | ||
| 1799 | /* Ignore invalid events */ | ||
| 1800 | if (group > 3 || region > 3) | ||
| 1801 | return -EINVAL; | ||
| 1802 | |||
| 1803 | bit = scorpion_event_to_bit(event, region, group); | ||
| 1804 | if (test_and_set_bit(bit, cpuc->used_mask)) | ||
| 1805 | return -EAGAIN; | ||
| 1806 | } | ||
| 1807 | |||
| 1808 | idx = armv7pmu_get_event_idx(cpuc, event); | ||
| 1809 | if (idx < 0 && bit >= 0) | ||
| 1810 | clear_bit(bit, cpuc->used_mask); | ||
| 1811 | |||
| 1812 | return idx; | ||
| 1813 | } | ||
| 1814 | |||
| 1815 | static void scorpion_pmu_clear_event_idx(struct pmu_hw_events *cpuc, | ||
| 1816 | struct perf_event *event) | ||
| 1817 | { | ||
| 1818 | int bit; | ||
| 1819 | struct hw_perf_event *hwc = &event->hw; | ||
| 1820 | unsigned int region = EVENT_REGION(hwc->config_base); | ||
| 1821 | unsigned int group = EVENT_GROUP(hwc->config_base); | ||
| 1822 | bool venum_event = EVENT_VENUM(hwc->config_base); | ||
| 1823 | bool scorpion_event = EVENT_CPU(hwc->config_base); | ||
| 1824 | |||
| 1825 | if (venum_event || scorpion_event) { | ||
| 1826 | bit = scorpion_event_to_bit(event, region, group); | ||
| 1827 | clear_bit(bit, cpuc->used_mask); | ||
| 1828 | } | ||
| 1829 | } | ||
| 1830 | |||
| 1831 | static int scorpion_pmu_init(struct arm_pmu *cpu_pmu) | ||
| 1832 | { | ||
| 1833 | armv7pmu_init(cpu_pmu); | ||
| 1834 | cpu_pmu->name = "armv7_scorpion"; | ||
| 1835 | cpu_pmu->map_event = scorpion_map_event; | ||
| 1836 | cpu_pmu->num_events = armv7_read_num_pmnc_events(); | ||
| 1837 | cpu_pmu->reset = scorpion_pmu_reset; | ||
| 1838 | cpu_pmu->enable = scorpion_pmu_enable_event; | ||
| 1839 | cpu_pmu->disable = scorpion_pmu_disable_event; | ||
| 1840 | cpu_pmu->get_event_idx = scorpion_pmu_get_event_idx; | ||
| 1841 | cpu_pmu->clear_event_idx = scorpion_pmu_clear_event_idx; | ||
| 1842 | return 0; | ||
| 1843 | } | ||
| 1844 | |||
| 1845 | static int scorpion_mp_pmu_init(struct arm_pmu *cpu_pmu) | ||
| 1846 | { | ||
| 1847 | armv7pmu_init(cpu_pmu); | ||
| 1848 | cpu_pmu->name = "armv7_scorpion_mp"; | ||
| 1849 | cpu_pmu->map_event = scorpion_map_event; | ||
| 1850 | cpu_pmu->num_events = armv7_read_num_pmnc_events(); | ||
| 1851 | cpu_pmu->reset = scorpion_pmu_reset; | ||
| 1852 | cpu_pmu->enable = scorpion_pmu_enable_event; | ||
| 1853 | cpu_pmu->disable = scorpion_pmu_disable_event; | ||
| 1854 | cpu_pmu->get_event_idx = scorpion_pmu_get_event_idx; | ||
| 1855 | cpu_pmu->clear_event_idx = scorpion_pmu_clear_event_idx; | ||
| 1856 | return 0; | ||
| 1857 | } | ||
| 1461 | #else | 1858 | #else |
| 1462 | static inline int armv7_a8_pmu_init(struct arm_pmu *cpu_pmu) | 1859 | static inline int armv7_a8_pmu_init(struct arm_pmu *cpu_pmu) |
| 1463 | { | 1860 | { |
| @@ -1498,4 +1895,14 @@ static inline int krait_pmu_init(struct arm_pmu *cpu_pmu) | |||
| 1498 | { | 1895 | { |
| 1499 | return -ENODEV; | 1896 | return -ENODEV; |
| 1500 | } | 1897 | } |
| 1898 | |||
| 1899 | static inline int scorpion_pmu_init(struct arm_pmu *cpu_pmu) | ||
| 1900 | { | ||
| 1901 | return -ENODEV; | ||
| 1902 | } | ||
| 1903 | |||
| 1904 | static inline int scorpion_mp_pmu_init(struct arm_pmu *cpu_pmu) | ||
| 1905 | { | ||
| 1906 | return -ENODEV; | ||
| 1907 | } | ||
| 1501 | #endif /* CONFIG_CPU_V7 */ | 1908 | #endif /* CONFIG_CPU_V7 */ |
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 07e7eb1d7ab6..5560f74f9eee 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
| @@ -540,7 +540,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 540 | 540 | ||
| 541 | vcpu->mode = OUTSIDE_GUEST_MODE; | 541 | vcpu->mode = OUTSIDE_GUEST_MODE; |
| 542 | kvm_guest_exit(); | 542 | kvm_guest_exit(); |
| 543 | trace_kvm_exit(*vcpu_pc(vcpu)); | 543 | trace_kvm_exit(kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu)); |
| 544 | /* | 544 | /* |
| 545 | * We may have taken a host interrupt in HYP mode (ie | 545 | * We may have taken a host interrupt in HYP mode (ie |
| 546 | * while executing the guest). This interrupt is still | 546 | * while executing the guest). This interrupt is still |
diff --git a/arch/arm/kvm/trace.h b/arch/arm/kvm/trace.h index 881874b1a036..6817664b46b8 100644 --- a/arch/arm/kvm/trace.h +++ b/arch/arm/kvm/trace.h | |||
| @@ -25,18 +25,22 @@ TRACE_EVENT(kvm_entry, | |||
| 25 | ); | 25 | ); |
| 26 | 26 | ||
| 27 | TRACE_EVENT(kvm_exit, | 27 | TRACE_EVENT(kvm_exit, |
| 28 | TP_PROTO(unsigned long vcpu_pc), | 28 | TP_PROTO(unsigned int exit_reason, unsigned long vcpu_pc), |
| 29 | TP_ARGS(vcpu_pc), | 29 | TP_ARGS(exit_reason, vcpu_pc), |
| 30 | 30 | ||
| 31 | TP_STRUCT__entry( | 31 | TP_STRUCT__entry( |
| 32 | __field( unsigned int, exit_reason ) | ||
| 32 | __field( unsigned long, vcpu_pc ) | 33 | __field( unsigned long, vcpu_pc ) |
| 33 | ), | 34 | ), |
| 34 | 35 | ||
| 35 | TP_fast_assign( | 36 | TP_fast_assign( |
| 37 | __entry->exit_reason = exit_reason; | ||
| 36 | __entry->vcpu_pc = vcpu_pc; | 38 | __entry->vcpu_pc = vcpu_pc; |
| 37 | ), | 39 | ), |
| 38 | 40 | ||
| 39 | TP_printk("PC: 0x%08lx", __entry->vcpu_pc) | 41 | TP_printk("HSR_EC: 0x%04x, PC: 0x%08lx", |
| 42 | __entry->exit_reason, | ||
| 43 | __entry->vcpu_pc) | ||
| 40 | ); | 44 | ); |
| 41 | 45 | ||
| 42 | TRACE_EVENT(kvm_guest_fault, | 46 | TRACE_EVENT(kvm_guest_fault, |
diff --git a/arch/arm/mach-asm9260/Kconfig b/arch/arm/mach-asm9260/Kconfig index 8423be76080e..52241207a82a 100644 --- a/arch/arm/mach-asm9260/Kconfig +++ b/arch/arm/mach-asm9260/Kconfig | |||
| @@ -2,5 +2,7 @@ config MACH_ASM9260 | |||
| 2 | bool "Alphascale ASM9260" | 2 | bool "Alphascale ASM9260" |
| 3 | depends on ARCH_MULTI_V5 | 3 | depends on ARCH_MULTI_V5 |
| 4 | select CPU_ARM926T | 4 | select CPU_ARM926T |
| 5 | select ASM9260_TIMER | ||
| 6 | select GENERIC_CLOCKEVENTS | ||
| 5 | help | 7 | help |
| 6 | Support for Alphascale ASM9260 based platform. | 8 | Support for Alphascale ASM9260 based platform. |
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 5e34fb143309..aa4116e9452f 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c | |||
| @@ -270,37 +270,35 @@ static void __init at91_pm_sram_init(void) | |||
| 270 | phys_addr_t sram_pbase; | 270 | phys_addr_t sram_pbase; |
| 271 | unsigned long sram_base; | 271 | unsigned long sram_base; |
| 272 | struct device_node *node; | 272 | struct device_node *node; |
| 273 | struct platform_device *pdev; | 273 | struct platform_device *pdev = NULL; |
| 274 | 274 | ||
| 275 | node = of_find_compatible_node(NULL, NULL, "mmio-sram"); | 275 | for_each_compatible_node(node, NULL, "mmio-sram") { |
| 276 | if (!node) { | 276 | pdev = of_find_device_by_node(node); |
| 277 | pr_warn("%s: failed to find sram node!\n", __func__); | 277 | if (pdev) { |
| 278 | return; | 278 | of_node_put(node); |
| 279 | break; | ||
| 280 | } | ||
| 279 | } | 281 | } |
| 280 | 282 | ||
| 281 | pdev = of_find_device_by_node(node); | ||
| 282 | if (!pdev) { | 283 | if (!pdev) { |
| 283 | pr_warn("%s: failed to find sram device!\n", __func__); | 284 | pr_warn("%s: failed to find sram device!\n", __func__); |
| 284 | goto put_node; | 285 | return; |
| 285 | } | 286 | } |
| 286 | 287 | ||
| 287 | sram_pool = dev_get_gen_pool(&pdev->dev); | 288 | sram_pool = dev_get_gen_pool(&pdev->dev); |
| 288 | if (!sram_pool) { | 289 | if (!sram_pool) { |
| 289 | pr_warn("%s: sram pool unavailable!\n", __func__); | 290 | pr_warn("%s: sram pool unavailable!\n", __func__); |
| 290 | goto put_node; | 291 | return; |
| 291 | } | 292 | } |
| 292 | 293 | ||
| 293 | sram_base = gen_pool_alloc(sram_pool, at91_slow_clock_sz); | 294 | sram_base = gen_pool_alloc(sram_pool, at91_slow_clock_sz); |
| 294 | if (!sram_base) { | 295 | if (!sram_base) { |
| 295 | pr_warn("%s: unable to alloc ocram!\n", __func__); | 296 | pr_warn("%s: unable to alloc ocram!\n", __func__); |
| 296 | goto put_node; | 297 | return; |
| 297 | } | 298 | } |
| 298 | 299 | ||
| 299 | sram_pbase = gen_pool_virt_to_phys(sram_pool, sram_base); | 300 | sram_pbase = gen_pool_virt_to_phys(sram_pool, sram_base); |
| 300 | slow_clock = __arm_ioremap_exec(sram_pbase, at91_slow_clock_sz, false); | 301 | slow_clock = __arm_ioremap_exec(sram_pbase, at91_slow_clock_sz, false); |
| 301 | |||
| 302 | put_node: | ||
| 303 | of_node_put(node); | ||
| 304 | } | 302 | } |
| 305 | #endif | 303 | #endif |
| 306 | 304 | ||
diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h index d2c89963af2d..86c0aa819d25 100644 --- a/arch/arm/mach-at91/pm.h +++ b/arch/arm/mach-at91/pm.h | |||
| @@ -44,7 +44,7 @@ static inline void at91rm9200_standby(void) | |||
| 44 | " mcr p15, 0, %0, c7, c0, 4\n\t" | 44 | " mcr p15, 0, %0, c7, c0, 4\n\t" |
| 45 | " str %5, [%1, %2]" | 45 | " str %5, [%1, %2]" |
| 46 | : | 46 | : |
| 47 | : "r" (0), "r" (AT91_BASE_SYS), "r" (AT91RM9200_SDRAMC_LPR), | 47 | : "r" (0), "r" (at91_ramc_base[0]), "r" (AT91RM9200_SDRAMC_LPR), |
| 48 | "r" (1), "r" (AT91RM9200_SDRAMC_SRR), | 48 | "r" (1), "r" (AT91RM9200_SDRAMC_SRR), |
| 49 | "r" (lpr)); | 49 | "r" (lpr)); |
| 50 | } | 50 | } |
diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S index 556151e85ec4..931f0e302c03 100644 --- a/arch/arm/mach-at91/pm_slowclock.S +++ b/arch/arm/mach-at91/pm_slowclock.S | |||
| @@ -25,11 +25,6 @@ | |||
| 25 | */ | 25 | */ |
| 26 | #undef SLOWDOWN_MASTER_CLOCK | 26 | #undef SLOWDOWN_MASTER_CLOCK |
| 27 | 27 | ||
| 28 | #define MCKRDY_TIMEOUT 1000 | ||
| 29 | #define MOSCRDY_TIMEOUT 1000 | ||
| 30 | #define PLLALOCK_TIMEOUT 1000 | ||
| 31 | #define PLLBLOCK_TIMEOUT 1000 | ||
| 32 | |||
| 33 | pmc .req r0 | 28 | pmc .req r0 |
| 34 | sdramc .req r1 | 29 | sdramc .req r1 |
| 35 | ramc1 .req r2 | 30 | ramc1 .req r2 |
| @@ -41,60 +36,42 @@ tmp2 .req r5 | |||
| 41 | * Wait until master clock is ready (after switching master clock source) | 36 | * Wait until master clock is ready (after switching master clock source) |
| 42 | */ | 37 | */ |
| 43 | .macro wait_mckrdy | 38 | .macro wait_mckrdy |
| 44 | mov tmp2, #MCKRDY_TIMEOUT | 39 | 1: ldr tmp1, [pmc, #AT91_PMC_SR] |
| 45 | 1: sub tmp2, tmp2, #1 | ||
| 46 | cmp tmp2, #0 | ||
| 47 | beq 2f | ||
| 48 | ldr tmp1, [pmc, #AT91_PMC_SR] | ||
| 49 | tst tmp1, #AT91_PMC_MCKRDY | 40 | tst tmp1, #AT91_PMC_MCKRDY |
| 50 | beq 1b | 41 | beq 1b |
| 51 | 2: | ||
| 52 | .endm | 42 | .endm |
| 53 | 43 | ||
| 54 | /* | 44 | /* |
| 55 | * Wait until master oscillator has stabilized. | 45 | * Wait until master oscillator has stabilized. |
| 56 | */ | 46 | */ |
| 57 | .macro wait_moscrdy | 47 | .macro wait_moscrdy |
| 58 | mov tmp2, #MOSCRDY_TIMEOUT | 48 | 1: ldr tmp1, [pmc, #AT91_PMC_SR] |
| 59 | 1: sub tmp2, tmp2, #1 | ||
| 60 | cmp tmp2, #0 | ||
| 61 | beq 2f | ||
| 62 | ldr tmp1, [pmc, #AT91_PMC_SR] | ||
| 63 | tst tmp1, #AT91_PMC_MOSCS | 49 | tst tmp1, #AT91_PMC_MOSCS |
| 64 | beq 1b | 50 | beq 1b |
| 65 | 2: | ||
| 66 | .endm | 51 | .endm |
| 67 | 52 | ||
| 68 | /* | 53 | /* |
| 69 | * Wait until PLLA has locked. | 54 | * Wait until PLLA has locked. |
| 70 | */ | 55 | */ |
| 71 | .macro wait_pllalock | 56 | .macro wait_pllalock |
| 72 | mov tmp2, #PLLALOCK_TIMEOUT | 57 | 1: ldr tmp1, [pmc, #AT91_PMC_SR] |
| 73 | 1: sub tmp2, tmp2, #1 | ||
| 74 | cmp tmp2, #0 | ||
| 75 | beq 2f | ||
| 76 | ldr tmp1, [pmc, #AT91_PMC_SR] | ||
| 77 | tst tmp1, #AT91_PMC_LOCKA | 58 | tst tmp1, #AT91_PMC_LOCKA |
| 78 | beq 1b | 59 | beq 1b |
| 79 | 2: | ||
| 80 | .endm | 60 | .endm |
| 81 | 61 | ||
| 82 | /* | 62 | /* |
| 83 | * Wait until PLLB has locked. | 63 | * Wait until PLLB has locked. |
| 84 | */ | 64 | */ |
| 85 | .macro wait_pllblock | 65 | .macro wait_pllblock |
| 86 | mov tmp2, #PLLBLOCK_TIMEOUT | 66 | 1: ldr tmp1, [pmc, #AT91_PMC_SR] |
| 87 | 1: sub tmp2, tmp2, #1 | ||
| 88 | cmp tmp2, #0 | ||
| 89 | beq 2f | ||
| 90 | ldr tmp1, [pmc, #AT91_PMC_SR] | ||
| 91 | tst tmp1, #AT91_PMC_LOCKB | 67 | tst tmp1, #AT91_PMC_LOCKB |
| 92 | beq 1b | 68 | beq 1b |
| 93 | 2: | ||
| 94 | .endm | 69 | .endm |
| 95 | 70 | ||
| 96 | .text | 71 | .text |
| 97 | 72 | ||
| 73 | .arm | ||
| 74 | |||
| 98 | /* void at91_slow_clock(void __iomem *pmc, void __iomem *sdramc, | 75 | /* void at91_slow_clock(void __iomem *pmc, void __iomem *sdramc, |
| 99 | * void __iomem *ramc1, int memctrl) | 76 | * void __iomem *ramc1, int memctrl) |
| 100 | */ | 77 | */ |
| @@ -134,6 +111,16 @@ ddr_sr_enable: | |||
| 134 | cmp memctrl, #AT91_MEMCTRL_DDRSDR | 111 | cmp memctrl, #AT91_MEMCTRL_DDRSDR |
| 135 | bne sdr_sr_enable | 112 | bne sdr_sr_enable |
| 136 | 113 | ||
| 114 | /* LPDDR1 --> force DDR2 mode during self-refresh */ | ||
| 115 | ldr tmp1, [sdramc, #AT91_DDRSDRC_MDR] | ||
| 116 | str tmp1, .saved_sam9_mdr | ||
| 117 | bic tmp1, tmp1, #~AT91_DDRSDRC_MD | ||
| 118 | cmp tmp1, #AT91_DDRSDRC_MD_LOW_POWER_DDR | ||
| 119 | ldreq tmp1, [sdramc, #AT91_DDRSDRC_MDR] | ||
| 120 | biceq tmp1, tmp1, #AT91_DDRSDRC_MD | ||
| 121 | orreq tmp1, tmp1, #AT91_DDRSDRC_MD_DDR2 | ||
| 122 | streq tmp1, [sdramc, #AT91_DDRSDRC_MDR] | ||
| 123 | |||
| 137 | /* prepare for DDRAM self-refresh mode */ | 124 | /* prepare for DDRAM self-refresh mode */ |
| 138 | ldr tmp1, [sdramc, #AT91_DDRSDRC_LPR] | 125 | ldr tmp1, [sdramc, #AT91_DDRSDRC_LPR] |
| 139 | str tmp1, .saved_sam9_lpr | 126 | str tmp1, .saved_sam9_lpr |
| @@ -142,14 +129,26 @@ ddr_sr_enable: | |||
| 142 | 129 | ||
| 143 | /* figure out if we use the second ram controller */ | 130 | /* figure out if we use the second ram controller */ |
| 144 | cmp ramc1, #0 | 131 | cmp ramc1, #0 |
| 145 | ldrne tmp2, [ramc1, #AT91_DDRSDRC_LPR] | 132 | beq ddr_no_2nd_ctrl |
| 146 | strne tmp2, .saved_sam9_lpr1 | 133 | |
| 147 | bicne tmp2, #AT91_DDRSDRC_LPCB | 134 | ldr tmp2, [ramc1, #AT91_DDRSDRC_MDR] |
| 148 | orrne tmp2, #AT91_DDRSDRC_LPCB_SELF_REFRESH | 135 | str tmp2, .saved_sam9_mdr1 |
| 136 | bic tmp2, tmp2, #~AT91_DDRSDRC_MD | ||
| 137 | cmp tmp2, #AT91_DDRSDRC_MD_LOW_POWER_DDR | ||
| 138 | ldreq tmp2, [ramc1, #AT91_DDRSDRC_MDR] | ||
| 139 | biceq tmp2, tmp2, #AT91_DDRSDRC_MD | ||
| 140 | orreq tmp2, tmp2, #AT91_DDRSDRC_MD_DDR2 | ||
| 141 | streq tmp2, [ramc1, #AT91_DDRSDRC_MDR] | ||
| 142 | |||
| 143 | ldr tmp2, [ramc1, #AT91_DDRSDRC_LPR] | ||
| 144 | str tmp2, .saved_sam9_lpr1 | ||
| 145 | bic tmp2, #AT91_DDRSDRC_LPCB | ||
| 146 | orr tmp2, #AT91_DDRSDRC_LPCB_SELF_REFRESH | ||
| 149 | 147 | ||
| 150 | /* Enable DDRAM self-refresh mode */ | 148 | /* Enable DDRAM self-refresh mode */ |
| 149 | str tmp2, [ramc1, #AT91_DDRSDRC_LPR] | ||
| 150 | ddr_no_2nd_ctrl: | ||
| 151 | str tmp1, [sdramc, #AT91_DDRSDRC_LPR] | 151 | str tmp1, [sdramc, #AT91_DDRSDRC_LPR] |
| 152 | strne tmp2, [ramc1, #AT91_DDRSDRC_LPR] | ||
| 153 | 152 | ||
| 154 | b sdr_sr_done | 153 | b sdr_sr_done |
| 155 | 154 | ||
| @@ -208,6 +207,7 @@ sdr_sr_done: | |||
| 208 | /* Turn off the main oscillator */ | 207 | /* Turn off the main oscillator */ |
| 209 | ldr tmp1, [pmc, #AT91_CKGR_MOR] | 208 | ldr tmp1, [pmc, #AT91_CKGR_MOR] |
| 210 | bic tmp1, tmp1, #AT91_PMC_MOSCEN | 209 | bic tmp1, tmp1, #AT91_PMC_MOSCEN |
| 210 | orr tmp1, tmp1, #AT91_PMC_KEY | ||
| 211 | str tmp1, [pmc, #AT91_CKGR_MOR] | 211 | str tmp1, [pmc, #AT91_CKGR_MOR] |
| 212 | 212 | ||
| 213 | /* Wait for interrupt */ | 213 | /* Wait for interrupt */ |
| @@ -216,6 +216,7 @@ sdr_sr_done: | |||
| 216 | /* Turn on the main oscillator */ | 216 | /* Turn on the main oscillator */ |
| 217 | ldr tmp1, [pmc, #AT91_CKGR_MOR] | 217 | ldr tmp1, [pmc, #AT91_CKGR_MOR] |
| 218 | orr tmp1, tmp1, #AT91_PMC_MOSCEN | 218 | orr tmp1, tmp1, #AT91_PMC_MOSCEN |
| 219 | orr tmp1, tmp1, #AT91_PMC_KEY | ||
| 219 | str tmp1, [pmc, #AT91_CKGR_MOR] | 220 | str tmp1, [pmc, #AT91_CKGR_MOR] |
| 220 | 221 | ||
| 221 | wait_moscrdy | 222 | wait_moscrdy |
| @@ -280,12 +281,17 @@ sdr_sr_done: | |||
| 280 | */ | 281 | */ |
| 281 | cmp memctrl, #AT91_MEMCTRL_DDRSDR | 282 | cmp memctrl, #AT91_MEMCTRL_DDRSDR |
| 282 | bne sdr_en_restore | 283 | bne sdr_en_restore |
| 284 | /* Restore MDR in case of LPDDR1 */ | ||
| 285 | ldr tmp1, .saved_sam9_mdr | ||
| 286 | str tmp1, [sdramc, #AT91_DDRSDRC_MDR] | ||
| 283 | /* Restore LPR on AT91 with DDRAM */ | 287 | /* Restore LPR on AT91 with DDRAM */ |
| 284 | ldr tmp1, .saved_sam9_lpr | 288 | ldr tmp1, .saved_sam9_lpr |
| 285 | str tmp1, [sdramc, #AT91_DDRSDRC_LPR] | 289 | str tmp1, [sdramc, #AT91_DDRSDRC_LPR] |
| 286 | 290 | ||
| 287 | /* if we use the second ram controller */ | 291 | /* if we use the second ram controller */ |
| 288 | cmp ramc1, #0 | 292 | cmp ramc1, #0 |
| 293 | ldrne tmp2, .saved_sam9_mdr1 | ||
| 294 | strne tmp2, [ramc1, #AT91_DDRSDRC_MDR] | ||
| 289 | ldrne tmp2, .saved_sam9_lpr1 | 295 | ldrne tmp2, .saved_sam9_lpr1 |
| 290 | strne tmp2, [ramc1, #AT91_DDRSDRC_LPR] | 296 | strne tmp2, [ramc1, #AT91_DDRSDRC_LPR] |
| 291 | 297 | ||
| @@ -319,5 +325,11 @@ ram_restored: | |||
| 319 | .saved_sam9_lpr1: | 325 | .saved_sam9_lpr1: |
| 320 | .word 0 | 326 | .word 0 |
| 321 | 327 | ||
| 328 | .saved_sam9_mdr: | ||
| 329 | .word 0 | ||
| 330 | |||
| 331 | .saved_sam9_mdr1: | ||
| 332 | .word 0 | ||
| 333 | |||
| 322 | ENTRY(at91_slow_clock_sz) | 334 | ENTRY(at91_slow_clock_sz) |
| 323 | .word .-at91_slow_clock | 335 | .word .-at91_slow_clock |
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index 3f32c47a6d74..d2e9f12d12f1 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c | |||
| @@ -126,8 +126,7 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious) | |||
| 126 | */ | 126 | */ |
| 127 | void exynos_cpu_power_down(int cpu) | 127 | void exynos_cpu_power_down(int cpu) |
| 128 | { | 128 | { |
| 129 | if (cpu == 0 && (of_machine_is_compatible("samsung,exynos5420") || | 129 | if (cpu == 0 && (soc_is_exynos5420() || soc_is_exynos5800())) { |
| 130 | of_machine_is_compatible("samsung,exynos5800"))) { | ||
| 131 | /* | 130 | /* |
| 132 | * Bypass power down for CPU0 during suspend. Check for | 131 | * Bypass power down for CPU0 during suspend. Check for |
| 133 | * the SYS_PWR_REG value to decide if we are suspending | 132 | * the SYS_PWR_REG value to decide if we are suspending |
diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c index 20f267121b3e..37266a826437 100644 --- a/arch/arm/mach-exynos/pm_domains.c +++ b/arch/arm/mach-exynos/pm_domains.c | |||
| @@ -161,6 +161,34 @@ no_clk: | |||
| 161 | of_genpd_add_provider_simple(np, &pd->pd); | 161 | of_genpd_add_provider_simple(np, &pd->pd); |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | /* Assign the child power domains to their parents */ | ||
| 165 | for_each_compatible_node(np, NULL, "samsung,exynos4210-pd") { | ||
| 166 | struct generic_pm_domain *child_domain, *parent_domain; | ||
| 167 | struct of_phandle_args args; | ||
| 168 | |||
| 169 | args.np = np; | ||
| 170 | args.args_count = 0; | ||
| 171 | child_domain = of_genpd_get_from_provider(&args); | ||
| 172 | if (!child_domain) | ||
| 173 | continue; | ||
| 174 | |||
| 175 | if (of_parse_phandle_with_args(np, "power-domains", | ||
| 176 | "#power-domain-cells", 0, &args) != 0) | ||
| 177 | continue; | ||
| 178 | |||
| 179 | parent_domain = of_genpd_get_from_provider(&args); | ||
| 180 | if (!parent_domain) | ||
| 181 | continue; | ||
| 182 | |||
| 183 | if (pm_genpd_add_subdomain(parent_domain, child_domain)) | ||
| 184 | pr_warn("%s failed to add subdomain: %s\n", | ||
| 185 | parent_domain->name, child_domain->name); | ||
| 186 | else | ||
| 187 | pr_info("%s has as child subdomain: %s.\n", | ||
| 188 | parent_domain->name, child_domain->name); | ||
| 189 | of_node_put(np); | ||
| 190 | } | ||
| 191 | |||
| 164 | return 0; | 192 | return 0; |
| 165 | } | 193 | } |
| 166 | arch_initcall(exynos4_pm_init_power_domain); | 194 | arch_initcall(exynos4_pm_init_power_domain); |
diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c index 52e2b1a2fddb..318d127df147 100644 --- a/arch/arm/mach-exynos/suspend.c +++ b/arch/arm/mach-exynos/suspend.c | |||
| @@ -87,8 +87,8 @@ static unsigned int exynos_pmu_spare3; | |||
| 87 | static u32 exynos_irqwake_intmask = 0xffffffff; | 87 | static u32 exynos_irqwake_intmask = 0xffffffff; |
| 88 | 88 | ||
| 89 | static const struct exynos_wkup_irq exynos3250_wkup_irq[] = { | 89 | static const struct exynos_wkup_irq exynos3250_wkup_irq[] = { |
| 90 | { 73, BIT(1) }, /* RTC alarm */ | 90 | { 105, BIT(1) }, /* RTC alarm */ |
| 91 | { 74, BIT(2) }, /* RTC tick */ | 91 | { 106, BIT(2) }, /* RTC tick */ |
| 92 | { /* sentinel */ }, | 92 | { /* sentinel */ }, |
| 93 | }; | 93 | }; |
| 94 | 94 | ||
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 4ad6e473cf83..9de3412af406 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c | |||
| @@ -211,8 +211,9 @@ static void __init imx6q_1588_init(void) | |||
| 211 | * set bit IOMUXC_GPR1[21]. Or the PTP clock must be from pad | 211 | * set bit IOMUXC_GPR1[21]. Or the PTP clock must be from pad |
| 212 | * (external OSC), and we need to clear the bit. | 212 | * (external OSC), and we need to clear the bit. |
| 213 | */ | 213 | */ |
| 214 | clksel = ptp_clk == enet_ref ? IMX6Q_GPR1_ENET_CLK_SEL_ANATOP : | 214 | clksel = clk_is_match(ptp_clk, enet_ref) ? |
| 215 | IMX6Q_GPR1_ENET_CLK_SEL_PAD; | 215 | IMX6Q_GPR1_ENET_CLK_SEL_ANATOP : |
| 216 | IMX6Q_GPR1_ENET_CLK_SEL_PAD; | ||
| 216 | gpr = syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr"); | 217 | gpr = syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr"); |
| 217 | if (!IS_ERR(gpr)) | 218 | if (!IS_ERR(gpr)) |
| 218 | regmap_update_bits(gpr, IOMUXC_GPR1, | 219 | regmap_update_bits(gpr, IOMUXC_GPR1, |
diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c index 61bfe584a9d7..fc832040c6e9 100644 --- a/arch/arm/mach-msm/board-halibut.c +++ b/arch/arm/mach-msm/board-halibut.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/input.h> | 20 | #include <linux/input.h> |
| 21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
| 22 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
| 23 | #include <linux/smc91x.h> | ||
| 23 | 24 | ||
| 24 | #include <mach/hardware.h> | 25 | #include <mach/hardware.h> |
| 25 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
| @@ -46,15 +47,20 @@ static struct resource smc91x_resources[] = { | |||
| 46 | [1] = { | 47 | [1] = { |
| 47 | .start = MSM_GPIO_TO_INT(49), | 48 | .start = MSM_GPIO_TO_INT(49), |
| 48 | .end = MSM_GPIO_TO_INT(49), | 49 | .end = MSM_GPIO_TO_INT(49), |
| 49 | .flags = IORESOURCE_IRQ, | 50 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, |
| 50 | }, | 51 | }, |
| 51 | }; | 52 | }; |
| 52 | 53 | ||
| 54 | static struct smc91x_platdata smc91x_platdata = { | ||
| 55 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | ||
| 56 | }; | ||
| 57 | |||
| 53 | static struct platform_device smc91x_device = { | 58 | static struct platform_device smc91x_device = { |
| 54 | .name = "smc91x", | 59 | .name = "smc91x", |
| 55 | .id = 0, | 60 | .id = 0, |
| 56 | .num_resources = ARRAY_SIZE(smc91x_resources), | 61 | .num_resources = ARRAY_SIZE(smc91x_resources), |
| 57 | .resource = smc91x_resources, | 62 | .resource = smc91x_resources, |
| 63 | .dev.platform_data = &smc91x_platdata, | ||
| 58 | }; | 64 | }; |
| 59 | 65 | ||
| 60 | static struct platform_device *devices[] __initdata = { | 66 | static struct platform_device *devices[] __initdata = { |
diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c index 4c748616ef47..10016a3bc698 100644 --- a/arch/arm/mach-msm/board-qsd8x50.c +++ b/arch/arm/mach-msm/board-qsd8x50.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/usb/msm_hsusb.h> | 22 | #include <linux/usb/msm_hsusb.h> |
| 23 | #include <linux/err.h> | 23 | #include <linux/err.h> |
| 24 | #include <linux/clkdev.h> | 24 | #include <linux/clkdev.h> |
| 25 | #include <linux/smc91x.h> | ||
| 25 | 26 | ||
| 26 | #include <asm/mach-types.h> | 27 | #include <asm/mach-types.h> |
| 27 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
| @@ -49,15 +50,20 @@ static struct resource smc91x_resources[] = { | |||
| 49 | .flags = IORESOURCE_MEM, | 50 | .flags = IORESOURCE_MEM, |
| 50 | }, | 51 | }, |
| 51 | [1] = { | 52 | [1] = { |
| 52 | .flags = IORESOURCE_IRQ, | 53 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, |
| 53 | }, | 54 | }, |
| 54 | }; | 55 | }; |
| 55 | 56 | ||
| 57 | static struct smc91x_platdata smc91x_platdata = { | ||
| 58 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | ||
| 59 | }; | ||
| 60 | |||
| 56 | static struct platform_device smc91x_device = { | 61 | static struct platform_device smc91x_device = { |
| 57 | .name = "smc91x", | 62 | .name = "smc91x", |
| 58 | .id = 0, | 63 | .id = 0, |
| 59 | .num_resources = ARRAY_SIZE(smc91x_resources), | 64 | .num_resources = ARRAY_SIZE(smc91x_resources), |
| 60 | .resource = smc91x_resources, | 65 | .resource = smc91x_resources, |
| 66 | .dev.platform_data = &smc91x_platdata, | ||
| 61 | }; | 67 | }; |
| 62 | 68 | ||
| 63 | static int __init msm_init_smc91x(void) | 69 | static int __init msm_init_smc91x(void) |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 92afb723dcfc..355b08936871 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -1692,16 +1692,15 @@ static int _deassert_hardreset(struct omap_hwmod *oh, const char *name) | |||
| 1692 | if (ret == -EBUSY) | 1692 | if (ret == -EBUSY) |
| 1693 | pr_warn("omap_hwmod: %s: failed to hardreset\n", oh->name); | 1693 | pr_warn("omap_hwmod: %s: failed to hardreset\n", oh->name); |
| 1694 | 1694 | ||
| 1695 | if (!ret) { | 1695 | if (oh->clkdm) { |
| 1696 | /* | 1696 | /* |
| 1697 | * Set the clockdomain to HW_AUTO, assuming that the | 1697 | * Set the clockdomain to HW_AUTO, assuming that the |
| 1698 | * previous state was HW_AUTO. | 1698 | * previous state was HW_AUTO. |
| 1699 | */ | 1699 | */ |
| 1700 | if (oh->clkdm && hwsup) | 1700 | if (hwsup) |
| 1701 | clkdm_allow_idle(oh->clkdm); | 1701 | clkdm_allow_idle(oh->clkdm); |
| 1702 | } else { | 1702 | |
| 1703 | if (oh->clkdm) | 1703 | clkdm_hwmod_disable(oh->clkdm, oh); |
| 1704 | clkdm_hwmod_disable(oh->clkdm, oh); | ||
| 1705 | } | 1704 | } |
| 1706 | 1705 | ||
| 1707 | return ret; | 1706 | return ret; |
| @@ -2698,6 +2697,7 @@ static int __init _register(struct omap_hwmod *oh) | |||
| 2698 | INIT_LIST_HEAD(&oh->master_ports); | 2697 | INIT_LIST_HEAD(&oh->master_ports); |
| 2699 | INIT_LIST_HEAD(&oh->slave_ports); | 2698 | INIT_LIST_HEAD(&oh->slave_ports); |
| 2700 | spin_lock_init(&oh->_lock); | 2699 | spin_lock_init(&oh->_lock); |
| 2700 | lockdep_set_class(&oh->_lock, &oh->hwmod_key); | ||
| 2701 | 2701 | ||
| 2702 | oh->_state = _HWMOD_STATE_REGISTERED; | 2702 | oh->_state = _HWMOD_STATE_REGISTERED; |
| 2703 | 2703 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index 9d4bec6ee742..9611c91d9b82 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
| @@ -674,6 +674,7 @@ struct omap_hwmod { | |||
| 674 | u32 _sysc_cache; | 674 | u32 _sysc_cache; |
| 675 | void __iomem *_mpu_rt_va; | 675 | void __iomem *_mpu_rt_va; |
| 676 | spinlock_t _lock; | 676 | spinlock_t _lock; |
| 677 | struct lock_class_key hwmod_key; /* unique lock class */ | ||
| 677 | struct list_head node; | 678 | struct list_head node; |
| 678 | struct omap_hwmod_ocp_if *_mpu_port; | 679 | struct omap_hwmod_ocp_if *_mpu_port; |
| 679 | unsigned int (*xlate_irq)(unsigned int); | 680 | unsigned int (*xlate_irq)(unsigned int); |
diff --git a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c index e8692e7675b8..16fe7a1b7a35 100644 --- a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c | |||
| @@ -1466,55 +1466,18 @@ static struct omap_hwmod dra7xx_ocp2scp3_hwmod = { | |||
| 1466 | * | 1466 | * |
| 1467 | */ | 1467 | */ |
| 1468 | 1468 | ||
| 1469 | static struct omap_hwmod_class dra7xx_pcie_hwmod_class = { | 1469 | static struct omap_hwmod_class dra7xx_pciess_hwmod_class = { |
| 1470 | .name = "pcie", | 1470 | .name = "pcie", |
| 1471 | }; | 1471 | }; |
| 1472 | 1472 | ||
| 1473 | /* pcie1 */ | 1473 | /* pcie1 */ |
| 1474 | static struct omap_hwmod dra7xx_pcie1_hwmod = { | 1474 | static struct omap_hwmod dra7xx_pciess1_hwmod = { |
| 1475 | .name = "pcie1", | 1475 | .name = "pcie1", |
| 1476 | .class = &dra7xx_pcie_hwmod_class, | 1476 | .class = &dra7xx_pciess_hwmod_class, |
| 1477 | .clkdm_name = "pcie_clkdm", | 1477 | .clkdm_name = "pcie_clkdm", |
| 1478 | .main_clk = "l4_root_clk_div", | 1478 | .main_clk = "l4_root_clk_div", |
| 1479 | .prcm = { | 1479 | .prcm = { |
| 1480 | .omap4 = { | 1480 | .omap4 = { |
| 1481 | .clkctrl_offs = DRA7XX_CM_PCIE_CLKSTCTRL_OFFSET, | ||
| 1482 | .modulemode = MODULEMODE_SWCTRL, | ||
| 1483 | }, | ||
| 1484 | }, | ||
| 1485 | }; | ||
| 1486 | |||
| 1487 | /* pcie2 */ | ||
| 1488 | static struct omap_hwmod dra7xx_pcie2_hwmod = { | ||
| 1489 | .name = "pcie2", | ||
| 1490 | .class = &dra7xx_pcie_hwmod_class, | ||
| 1491 | .clkdm_name = "pcie_clkdm", | ||
| 1492 | .main_clk = "l4_root_clk_div", | ||
| 1493 | .prcm = { | ||
| 1494 | .omap4 = { | ||
| 1495 | .clkctrl_offs = DRA7XX_CM_PCIE_CLKSTCTRL_OFFSET, | ||
| 1496 | .modulemode = MODULEMODE_SWCTRL, | ||
| 1497 | }, | ||
| 1498 | }, | ||
| 1499 | }; | ||
| 1500 | |||
| 1501 | /* | ||
| 1502 | * 'PCIE PHY' class | ||
| 1503 | * | ||
| 1504 | */ | ||
| 1505 | |||
| 1506 | static struct omap_hwmod_class dra7xx_pcie_phy_hwmod_class = { | ||
| 1507 | .name = "pcie-phy", | ||
| 1508 | }; | ||
| 1509 | |||
| 1510 | /* pcie1 phy */ | ||
| 1511 | static struct omap_hwmod dra7xx_pcie1_phy_hwmod = { | ||
| 1512 | .name = "pcie1-phy", | ||
| 1513 | .class = &dra7xx_pcie_phy_hwmod_class, | ||
| 1514 | .clkdm_name = "l3init_clkdm", | ||
| 1515 | .main_clk = "l4_root_clk_div", | ||
| 1516 | .prcm = { | ||
| 1517 | .omap4 = { | ||
| 1518 | .clkctrl_offs = DRA7XX_CM_L3INIT_PCIESS1_CLKCTRL_OFFSET, | 1481 | .clkctrl_offs = DRA7XX_CM_L3INIT_PCIESS1_CLKCTRL_OFFSET, |
| 1519 | .context_offs = DRA7XX_RM_L3INIT_PCIESS1_CONTEXT_OFFSET, | 1482 | .context_offs = DRA7XX_RM_L3INIT_PCIESS1_CONTEXT_OFFSET, |
| 1520 | .modulemode = MODULEMODE_SWCTRL, | 1483 | .modulemode = MODULEMODE_SWCTRL, |
| @@ -1522,11 +1485,11 @@ static struct omap_hwmod dra7xx_pcie1_phy_hwmod = { | |||
| 1522 | }, | 1485 | }, |
| 1523 | }; | 1486 | }; |
| 1524 | 1487 | ||
| 1525 | /* pcie2 phy */ | 1488 | /* pcie2 */ |
| 1526 | static struct omap_hwmod dra7xx_pcie2_phy_hwmod = { | 1489 | static struct omap_hwmod dra7xx_pciess2_hwmod = { |
| 1527 | .name = "pcie2-phy", | 1490 | .name = "pcie2", |
| 1528 | .class = &dra7xx_pcie_phy_hwmod_class, | 1491 | .class = &dra7xx_pciess_hwmod_class, |
| 1529 | .clkdm_name = "l3init_clkdm", | 1492 | .clkdm_name = "pcie_clkdm", |
| 1530 | .main_clk = "l4_root_clk_div", | 1493 | .main_clk = "l4_root_clk_div", |
| 1531 | .prcm = { | 1494 | .prcm = { |
| 1532 | .omap4 = { | 1495 | .omap4 = { |
| @@ -2877,50 +2840,34 @@ static struct omap_hwmod_ocp_if dra7xx_l4_cfg__ocp2scp3 = { | |||
| 2877 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 2840 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 2878 | }; | 2841 | }; |
| 2879 | 2842 | ||
| 2880 | /* l3_main_1 -> pcie1 */ | 2843 | /* l3_main_1 -> pciess1 */ |
| 2881 | static struct omap_hwmod_ocp_if dra7xx_l3_main_1__pcie1 = { | 2844 | static struct omap_hwmod_ocp_if dra7xx_l3_main_1__pciess1 = { |
| 2882 | .master = &dra7xx_l3_main_1_hwmod, | 2845 | .master = &dra7xx_l3_main_1_hwmod, |
| 2883 | .slave = &dra7xx_pcie1_hwmod, | 2846 | .slave = &dra7xx_pciess1_hwmod, |
| 2884 | .clk = "l3_iclk_div", | 2847 | .clk = "l3_iclk_div", |
| 2885 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 2848 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 2886 | }; | 2849 | }; |
| 2887 | 2850 | ||
| 2888 | /* l4_cfg -> pcie1 */ | 2851 | /* l4_cfg -> pciess1 */ |
| 2889 | static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pcie1 = { | 2852 | static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pciess1 = { |
| 2890 | .master = &dra7xx_l4_cfg_hwmod, | 2853 | .master = &dra7xx_l4_cfg_hwmod, |
| 2891 | .slave = &dra7xx_pcie1_hwmod, | 2854 | .slave = &dra7xx_pciess1_hwmod, |
| 2892 | .clk = "l4_root_clk_div", | 2855 | .clk = "l4_root_clk_div", |
| 2893 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 2856 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 2894 | }; | 2857 | }; |
| 2895 | 2858 | ||
| 2896 | /* l3_main_1 -> pcie2 */ | 2859 | /* l3_main_1 -> pciess2 */ |
| 2897 | static struct omap_hwmod_ocp_if dra7xx_l3_main_1__pcie2 = { | 2860 | static struct omap_hwmod_ocp_if dra7xx_l3_main_1__pciess2 = { |
| 2898 | .master = &dra7xx_l3_main_1_hwmod, | 2861 | .master = &dra7xx_l3_main_1_hwmod, |
| 2899 | .slave = &dra7xx_pcie2_hwmod, | 2862 | .slave = &dra7xx_pciess2_hwmod, |
| 2900 | .clk = "l3_iclk_div", | 2863 | .clk = "l3_iclk_div", |
| 2901 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 2864 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 2902 | }; | 2865 | }; |
| 2903 | 2866 | ||
| 2904 | /* l4_cfg -> pcie2 */ | 2867 | /* l4_cfg -> pciess2 */ |
| 2905 | static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pcie2 = { | 2868 | static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pciess2 = { |
| 2906 | .master = &dra7xx_l4_cfg_hwmod, | ||
| 2907 | .slave = &dra7xx_pcie2_hwmod, | ||
| 2908 | .clk = "l4_root_clk_div", | ||
| 2909 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 2910 | }; | ||
| 2911 | |||
| 2912 | /* l4_cfg -> pcie1 phy */ | ||
| 2913 | static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pcie1_phy = { | ||
| 2914 | .master = &dra7xx_l4_cfg_hwmod, | ||
| 2915 | .slave = &dra7xx_pcie1_phy_hwmod, | ||
| 2916 | .clk = "l4_root_clk_div", | ||
| 2917 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 2918 | }; | ||
| 2919 | |||
| 2920 | /* l4_cfg -> pcie2 phy */ | ||
| 2921 | static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pcie2_phy = { | ||
| 2922 | .master = &dra7xx_l4_cfg_hwmod, | 2869 | .master = &dra7xx_l4_cfg_hwmod, |
| 2923 | .slave = &dra7xx_pcie2_phy_hwmod, | 2870 | .slave = &dra7xx_pciess2_hwmod, |
| 2924 | .clk = "l4_root_clk_div", | 2871 | .clk = "l4_root_clk_div", |
| 2925 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 2872 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 2926 | }; | 2873 | }; |
| @@ -3327,12 +3274,10 @@ static struct omap_hwmod_ocp_if *dra7xx_hwmod_ocp_ifs[] __initdata = { | |||
| 3327 | &dra7xx_l4_cfg__mpu, | 3274 | &dra7xx_l4_cfg__mpu, |
| 3328 | &dra7xx_l4_cfg__ocp2scp1, | 3275 | &dra7xx_l4_cfg__ocp2scp1, |
| 3329 | &dra7xx_l4_cfg__ocp2scp3, | 3276 | &dra7xx_l4_cfg__ocp2scp3, |
| 3330 | &dra7xx_l3_main_1__pcie1, | 3277 | &dra7xx_l3_main_1__pciess1, |
| 3331 | &dra7xx_l4_cfg__pcie1, | 3278 | &dra7xx_l4_cfg__pciess1, |
| 3332 | &dra7xx_l3_main_1__pcie2, | 3279 | &dra7xx_l3_main_1__pciess2, |
| 3333 | &dra7xx_l4_cfg__pcie2, | 3280 | &dra7xx_l4_cfg__pciess2, |
| 3334 | &dra7xx_l4_cfg__pcie1_phy, | ||
| 3335 | &dra7xx_l4_cfg__pcie2_phy, | ||
| 3336 | &dra7xx_l3_main_1__qspi, | 3281 | &dra7xx_l3_main_1__qspi, |
| 3337 | &dra7xx_l4_per3__rtcss, | 3282 | &dra7xx_l4_per3__rtcss, |
| 3338 | &dra7xx_l4_cfg__sata, | 3283 | &dra7xx_l4_cfg__sata, |
diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c index 190fa43e7479..e642b079e9f3 100644 --- a/arch/arm/mach-omap2/pdata-quirks.c +++ b/arch/arm/mach-omap2/pdata-quirks.c | |||
| @@ -173,6 +173,7 @@ static void __init omap3_igep0030_rev_g_legacy_init(void) | |||
| 173 | 173 | ||
| 174 | static void __init omap3_evm_legacy_init(void) | 174 | static void __init omap3_evm_legacy_init(void) |
| 175 | { | 175 | { |
| 176 | hsmmc2_internal_input_clk(); | ||
| 176 | legacy_init_wl12xx(WL12XX_REFCLOCK_38, 0, 149); | 177 | legacy_init_wl12xx(WL12XX_REFCLOCK_38, 0, 149); |
| 177 | } | 178 | } |
| 178 | 179 | ||
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index a08a617a6c11..d6d6bc39e05c 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
| @@ -252,10 +252,10 @@ static void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) | |||
| 252 | { | 252 | { |
| 253 | saved_mask[0] = | 253 | saved_mask[0] = |
| 254 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, | 254 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
| 255 | OMAP4_PRM_IRQSTATUS_MPU_OFFSET); | 255 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); |
| 256 | saved_mask[1] = | 256 | saved_mask[1] = |
| 257 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, | 257 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
| 258 | OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET); | 258 | OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); |
| 259 | 259 | ||
| 260 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST, | 260 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST, |
| 261 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); | 261 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); |
diff --git a/arch/arm/mach-pxa/idp.c b/arch/arm/mach-pxa/idp.c index 343c4e3a7c5d..f6d02e4cbcda 100644 --- a/arch/arm/mach-pxa/idp.c +++ b/arch/arm/mach-pxa/idp.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/platform_data/video-pxafb.h> | 36 | #include <linux/platform_data/video-pxafb.h> |
| 37 | #include <mach/bitfield.h> | 37 | #include <mach/bitfield.h> |
| 38 | #include <linux/platform_data/mmc-pxamci.h> | 38 | #include <linux/platform_data/mmc-pxamci.h> |
| 39 | #include <linux/smc91x.h> | ||
| 39 | 40 | ||
| 40 | #include "generic.h" | 41 | #include "generic.h" |
| 41 | #include "devices.h" | 42 | #include "devices.h" |
| @@ -81,11 +82,16 @@ static struct resource smc91x_resources[] = { | |||
| 81 | } | 82 | } |
| 82 | }; | 83 | }; |
| 83 | 84 | ||
| 85 | static struct smc91x_platdata smc91x_platdata = { | ||
| 86 | .flags = SMC91X_USE_32BIT | SMC91X_USE_DMA | SMC91X_NOWAIT, | ||
| 87 | }; | ||
| 88 | |||
| 84 | static struct platform_device smc91x_device = { | 89 | static struct platform_device smc91x_device = { |
| 85 | .name = "smc91x", | 90 | .name = "smc91x", |
| 86 | .id = 0, | 91 | .id = 0, |
| 87 | .num_resources = ARRAY_SIZE(smc91x_resources), | 92 | .num_resources = ARRAY_SIZE(smc91x_resources), |
| 88 | .resource = smc91x_resources, | 93 | .resource = smc91x_resources, |
| 94 | .dev.platform_data = &smc91x_platdata, | ||
| 89 | }; | 95 | }; |
| 90 | 96 | ||
| 91 | static void idp_backlight_power(int on) | 97 | static void idp_backlight_power(int on) |
diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c index ad777b353bd5..eaee2c20b189 100644 --- a/arch/arm/mach-pxa/lpd270.c +++ b/arch/arm/mach-pxa/lpd270.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/mtd/mtd.h> | 24 | #include <linux/mtd/mtd.h> |
| 25 | #include <linux/mtd/partitions.h> | 25 | #include <linux/mtd/partitions.h> |
| 26 | #include <linux/pwm_backlight.h> | 26 | #include <linux/pwm_backlight.h> |
| 27 | #include <linux/smc91x.h> | ||
| 27 | 28 | ||
| 28 | #include <asm/types.h> | 29 | #include <asm/types.h> |
| 29 | #include <asm/setup.h> | 30 | #include <asm/setup.h> |
| @@ -189,15 +190,20 @@ static struct resource smc91x_resources[] = { | |||
| 189 | [1] = { | 190 | [1] = { |
| 190 | .start = LPD270_ETHERNET_IRQ, | 191 | .start = LPD270_ETHERNET_IRQ, |
| 191 | .end = LPD270_ETHERNET_IRQ, | 192 | .end = LPD270_ETHERNET_IRQ, |
| 192 | .flags = IORESOURCE_IRQ, | 193 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, |
| 193 | }, | 194 | }, |
| 194 | }; | 195 | }; |
| 195 | 196 | ||
| 197 | struct smc91x_platdata smc91x_platdata = { | ||
| 198 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | ||
| 199 | }; | ||
| 200 | |||
| 196 | static struct platform_device smc91x_device = { | 201 | static struct platform_device smc91x_device = { |
| 197 | .name = "smc91x", | 202 | .name = "smc91x", |
| 198 | .id = 0, | 203 | .id = 0, |
| 199 | .num_resources = ARRAY_SIZE(smc91x_resources), | 204 | .num_resources = ARRAY_SIZE(smc91x_resources), |
| 200 | .resource = smc91x_resources, | 205 | .resource = smc91x_resources, |
| 206 | .dev.platform_data = &smc91x_platdata, | ||
| 201 | }; | 207 | }; |
| 202 | 208 | ||
| 203 | static struct resource lpd270_flash_resources[] = { | 209 | static struct resource lpd270_flash_resources[] = { |
diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c index 850e506926df..c309593abdb2 100644 --- a/arch/arm/mach-realview/core.c +++ b/arch/arm/mach-realview/core.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/platform_data/video-clcd-versatile.h> | 28 | #include <linux/platform_data/video-clcd-versatile.h> |
| 29 | #include <linux/io.h> | 29 | #include <linux/io.h> |
| 30 | #include <linux/smsc911x.h> | 30 | #include <linux/smsc911x.h> |
| 31 | #include <linux/smc91x.h> | ||
| 31 | #include <linux/ata_platform.h> | 32 | #include <linux/ata_platform.h> |
| 32 | #include <linux/amba/mmci.h> | 33 | #include <linux/amba/mmci.h> |
| 33 | #include <linux/gfp.h> | 34 | #include <linux/gfp.h> |
| @@ -94,6 +95,10 @@ static struct smsc911x_platform_config smsc911x_config = { | |||
| 94 | .phy_interface = PHY_INTERFACE_MODE_MII, | 95 | .phy_interface = PHY_INTERFACE_MODE_MII, |
| 95 | }; | 96 | }; |
| 96 | 97 | ||
| 98 | static struct smc91x_platdata smc91x_platdata = { | ||
| 99 | .flags = SMC91X_USE_32BIT | SMC91X_NOWAIT, | ||
| 100 | }; | ||
| 101 | |||
| 97 | static struct platform_device realview_eth_device = { | 102 | static struct platform_device realview_eth_device = { |
| 98 | .name = "smsc911x", | 103 | .name = "smsc911x", |
| 99 | .id = 0, | 104 | .id = 0, |
| @@ -107,6 +112,8 @@ int realview_eth_register(const char *name, struct resource *res) | |||
| 107 | realview_eth_device.resource = res; | 112 | realview_eth_device.resource = res; |
| 108 | if (strcmp(realview_eth_device.name, "smsc911x") == 0) | 113 | if (strcmp(realview_eth_device.name, "smsc911x") == 0) |
| 109 | realview_eth_device.dev.platform_data = &smsc911x_config; | 114 | realview_eth_device.dev.platform_data = &smsc911x_config; |
| 115 | else | ||
| 116 | realview_eth_device.dev.platform_data = &smc91x_platdata; | ||
| 110 | 117 | ||
| 111 | return platform_device_register(&realview_eth_device); | 118 | return platform_device_register(&realview_eth_device); |
| 112 | } | 119 | } |
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 64c88d657f9e..b3869cbbcc68 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
| @@ -234,7 +234,7 @@ static struct resource realview_eb_eth_resources[] = { | |||
| 234 | [1] = { | 234 | [1] = { |
| 235 | .start = IRQ_EB_ETH, | 235 | .start = IRQ_EB_ETH, |
| 236 | .end = IRQ_EB_ETH, | 236 | .end = IRQ_EB_ETH, |
| 237 | .flags = IORESOURCE_IRQ, | 237 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, |
| 238 | }, | 238 | }, |
| 239 | }; | 239 | }; |
| 240 | 240 | ||
diff --git a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c index 169262e3040d..af868d258e66 100644 --- a/arch/arm/mach-sa1100/neponset.c +++ b/arch/arm/mach-sa1100/neponset.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/pm.h> | 12 | #include <linux/pm.h> |
| 13 | #include <linux/serial_core.h> | 13 | #include <linux/serial_core.h> |
| 14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
| 15 | #include <linux/smc91x.h> | ||
| 15 | 16 | ||
| 16 | #include <asm/mach-types.h> | 17 | #include <asm/mach-types.h> |
| 17 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
| @@ -258,12 +259,17 @@ static int neponset_probe(struct platform_device *dev) | |||
| 258 | 0x02000000, "smc91x-attrib"), | 259 | 0x02000000, "smc91x-attrib"), |
| 259 | { .flags = IORESOURCE_IRQ }, | 260 | { .flags = IORESOURCE_IRQ }, |
| 260 | }; | 261 | }; |
| 262 | struct smc91x_platdata smc91x_platdata = { | ||
| 263 | .flags = SMC91X_USE_8BIT | SMC91X_IO_SHIFT_2 | SMC91X_NOWAIT, | ||
| 264 | }; | ||
| 261 | struct platform_device_info smc91x_devinfo = { | 265 | struct platform_device_info smc91x_devinfo = { |
| 262 | .parent = &dev->dev, | 266 | .parent = &dev->dev, |
| 263 | .name = "smc91x", | 267 | .name = "smc91x", |
| 264 | .id = 0, | 268 | .id = 0, |
| 265 | .res = smc91x_resources, | 269 | .res = smc91x_resources, |
| 266 | .num_res = ARRAY_SIZE(smc91x_resources), | 270 | .num_res = ARRAY_SIZE(smc91x_resources), |
| 271 | .data = &smc91x_platdata, | ||
| 272 | .size_data = sizeof(smc91x_platdata), | ||
| 267 | }; | 273 | }; |
| 268 | int ret, irq; | 274 | int ret, irq; |
| 269 | 275 | ||
diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c index 091261878eff..1525d7b5f1b7 100644 --- a/arch/arm/mach-sa1100/pleb.c +++ b/arch/arm/mach-sa1100/pleb.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
| 12 | #include <linux/io.h> | 12 | #include <linux/io.h> |
| 13 | #include <linux/mtd/partitions.h> | 13 | #include <linux/mtd/partitions.h> |
| 14 | #include <linux/smc91x.h> | ||
| 14 | 15 | ||
| 15 | #include <mach/hardware.h> | 16 | #include <mach/hardware.h> |
| 16 | #include <asm/setup.h> | 17 | #include <asm/setup.h> |
| @@ -43,12 +44,18 @@ static struct resource smc91x_resources[] = { | |||
| 43 | #endif | 44 | #endif |
| 44 | }; | 45 | }; |
| 45 | 46 | ||
| 47 | static struct smc91x_platdata smc91x_platdata = { | ||
| 48 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | ||
| 49 | }; | ||
| 46 | 50 | ||
| 47 | static struct platform_device smc91x_device = { | 51 | static struct platform_device smc91x_device = { |
| 48 | .name = "smc91x", | 52 | .name = "smc91x", |
| 49 | .id = 0, | 53 | .id = 0, |
| 50 | .num_resources = ARRAY_SIZE(smc91x_resources), | 54 | .num_resources = ARRAY_SIZE(smc91x_resources), |
| 51 | .resource = smc91x_resources, | 55 | .resource = smc91x_resources, |
| 56 | .dev = { | ||
| 57 | .platform_data = &smc91x_platdata, | ||
| 58 | }, | ||
| 52 | }; | 59 | }; |
| 53 | 60 | ||
| 54 | static struct platform_device *devices[] __initdata = { | 61 | static struct platform_device *devices[] __initdata = { |
diff --git a/arch/arm/mach-socfpga/core.h b/arch/arm/mach-socfpga/core.h index 483cb467bf65..a0f3b1cd497c 100644 --- a/arch/arm/mach-socfpga/core.h +++ b/arch/arm/mach-socfpga/core.h | |||
| @@ -45,6 +45,6 @@ extern char secondary_trampoline, secondary_trampoline_end; | |||
| 45 | 45 | ||
| 46 | extern unsigned long socfpga_cpu1start_addr; | 46 | extern unsigned long socfpga_cpu1start_addr; |
| 47 | 47 | ||
| 48 | #define SOCFPGA_SCU_VIRT_BASE 0xfffec000 | 48 | #define SOCFPGA_SCU_VIRT_BASE 0xfee00000 |
| 49 | 49 | ||
| 50 | #endif | 50 | #endif |
diff --git a/arch/arm/mach-socfpga/socfpga.c b/arch/arm/mach-socfpga/socfpga.c index 383d61e138af..f5e597c207b9 100644 --- a/arch/arm/mach-socfpga/socfpga.c +++ b/arch/arm/mach-socfpga/socfpga.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <asm/hardware/cache-l2x0.h> | 23 | #include <asm/hardware/cache-l2x0.h> |
| 24 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
| 25 | #include <asm/mach/map.h> | 25 | #include <asm/mach/map.h> |
| 26 | #include <asm/cacheflush.h> | ||
| 26 | 27 | ||
| 27 | #include "core.h" | 28 | #include "core.h" |
| 28 | 29 | ||
| @@ -73,6 +74,10 @@ void __init socfpga_sysmgr_init(void) | |||
| 73 | (u32 *) &socfpga_cpu1start_addr)) | 74 | (u32 *) &socfpga_cpu1start_addr)) |
| 74 | pr_err("SMP: Need cpu1-start-addr in device tree.\n"); | 75 | pr_err("SMP: Need cpu1-start-addr in device tree.\n"); |
| 75 | 76 | ||
| 77 | /* Ensure that socfpga_cpu1start_addr is visible to other CPUs */ | ||
| 78 | smp_wmb(); | ||
| 79 | sync_cache_w(&socfpga_cpu1start_addr); | ||
| 80 | |||
| 76 | sys_manager_base_addr = of_iomap(np, 0); | 81 | sys_manager_base_addr = of_iomap(np, 0); |
| 77 | 82 | ||
| 78 | np = of_find_compatible_node(NULL, NULL, "altr,rst-mgr"); | 83 | np = of_find_compatible_node(NULL, NULL, "altr,rst-mgr"); |
diff --git a/arch/arm/mach-sti/board-dt.c b/arch/arm/mach-sti/board-dt.c index b067390cef4e..b373acade338 100644 --- a/arch/arm/mach-sti/board-dt.c +++ b/arch/arm/mach-sti/board-dt.c | |||
| @@ -18,6 +18,7 @@ static const char *stih41x_dt_match[] __initdata = { | |||
| 18 | "st,stih415", | 18 | "st,stih415", |
| 19 | "st,stih416", | 19 | "st,stih416", |
| 20 | "st,stih407", | 20 | "st,stih407", |
| 21 | "st,stih410", | ||
| 21 | "st,stih418", | 22 | "st,stih418", |
| 22 | NULL | 23 | NULL |
| 23 | }; | 24 | }; |
diff --git a/arch/arm64/boot/dts/apm/apm-storm.dtsi b/arch/arm64/boot/dts/apm/apm-storm.dtsi index f1ad9c2ab2e9..a857794432d6 100644 --- a/arch/arm64/boot/dts/apm/apm-storm.dtsi +++ b/arch/arm64/boot/dts/apm/apm-storm.dtsi | |||
| @@ -622,7 +622,7 @@ | |||
| 622 | }; | 622 | }; |
| 623 | 623 | ||
| 624 | sgenet0: ethernet@1f210000 { | 624 | sgenet0: ethernet@1f210000 { |
| 625 | compatible = "apm,xgene-enet"; | 625 | compatible = "apm,xgene1-sgenet"; |
| 626 | status = "disabled"; | 626 | status = "disabled"; |
| 627 | reg = <0x0 0x1f210000 0x0 0xd100>, | 627 | reg = <0x0 0x1f210000 0x0 0xd100>, |
| 628 | <0x0 0x1f200000 0x0 0Xc300>, | 628 | <0x0 0x1f200000 0x0 0Xc300>, |
| @@ -636,7 +636,7 @@ | |||
| 636 | }; | 636 | }; |
| 637 | 637 | ||
| 638 | xgenet: ethernet@1f610000 { | 638 | xgenet: ethernet@1f610000 { |
| 639 | compatible = "apm,xgene-enet"; | 639 | compatible = "apm,xgene1-xgenet"; |
| 640 | status = "disabled"; | 640 | status = "disabled"; |
| 641 | reg = <0x0 0x1f610000 0x0 0xd100>, | 641 | reg = <0x0 0x1f610000 0x0 0xd100>, |
| 642 | <0x0 0x1f600000 0x0 0Xc300>, | 642 | <0x0 0x1f600000 0x0 0Xc300>, |
diff --git a/arch/arm64/boot/dts/arm/foundation-v8.dts b/arch/arm64/boot/dts/arm/foundation-v8.dts index 27f32962e55c..4eac8dcea423 100644 --- a/arch/arm64/boot/dts/arm/foundation-v8.dts +++ b/arch/arm64/boot/dts/arm/foundation-v8.dts | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | reg = <0x0 0x0>; | 34 | reg = <0x0 0x0>; |
| 35 | enable-method = "spin-table"; | 35 | enable-method = "spin-table"; |
| 36 | cpu-release-addr = <0x0 0x8000fff8>; | 36 | cpu-release-addr = <0x0 0x8000fff8>; |
| 37 | next-level-cache = <&L2_0>; | ||
| 37 | }; | 38 | }; |
| 38 | cpu@1 { | 39 | cpu@1 { |
| 39 | device_type = "cpu"; | 40 | device_type = "cpu"; |
| @@ -41,6 +42,7 @@ | |||
| 41 | reg = <0x0 0x1>; | 42 | reg = <0x0 0x1>; |
| 42 | enable-method = "spin-table"; | 43 | enable-method = "spin-table"; |
| 43 | cpu-release-addr = <0x0 0x8000fff8>; | 44 | cpu-release-addr = <0x0 0x8000fff8>; |
| 45 | next-level-cache = <&L2_0>; | ||
| 44 | }; | 46 | }; |
| 45 | cpu@2 { | 47 | cpu@2 { |
| 46 | device_type = "cpu"; | 48 | device_type = "cpu"; |
| @@ -48,6 +50,7 @@ | |||
| 48 | reg = <0x0 0x2>; | 50 | reg = <0x0 0x2>; |
| 49 | enable-method = "spin-table"; | 51 | enable-method = "spin-table"; |
| 50 | cpu-release-addr = <0x0 0x8000fff8>; | 52 | cpu-release-addr = <0x0 0x8000fff8>; |
| 53 | next-level-cache = <&L2_0>; | ||
| 51 | }; | 54 | }; |
| 52 | cpu@3 { | 55 | cpu@3 { |
| 53 | device_type = "cpu"; | 56 | device_type = "cpu"; |
| @@ -55,6 +58,11 @@ | |||
| 55 | reg = <0x0 0x3>; | 58 | reg = <0x0 0x3>; |
| 56 | enable-method = "spin-table"; | 59 | enable-method = "spin-table"; |
| 57 | cpu-release-addr = <0x0 0x8000fff8>; | 60 | cpu-release-addr = <0x0 0x8000fff8>; |
| 61 | next-level-cache = <&L2_0>; | ||
| 62 | }; | ||
| 63 | |||
| 64 | L2_0: l2-cache0 { | ||
| 65 | compatible = "cache"; | ||
| 58 | }; | 66 | }; |
| 59 | }; | 67 | }; |
| 60 | 68 | ||
diff --git a/arch/arm64/boot/dts/arm/juno.dts b/arch/arm64/boot/dts/arm/juno.dts index d429129ecb3d..133ee59de2d7 100644 --- a/arch/arm64/boot/dts/arm/juno.dts +++ b/arch/arm64/boot/dts/arm/juno.dts | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | reg = <0x0 0x0>; | 39 | reg = <0x0 0x0>; |
| 40 | device_type = "cpu"; | 40 | device_type = "cpu"; |
| 41 | enable-method = "psci"; | 41 | enable-method = "psci"; |
| 42 | next-level-cache = <&A57_L2>; | ||
| 42 | }; | 43 | }; |
| 43 | 44 | ||
| 44 | A57_1: cpu@1 { | 45 | A57_1: cpu@1 { |
| @@ -46,6 +47,7 @@ | |||
| 46 | reg = <0x0 0x1>; | 47 | reg = <0x0 0x1>; |
| 47 | device_type = "cpu"; | 48 | device_type = "cpu"; |
| 48 | enable-method = "psci"; | 49 | enable-method = "psci"; |
| 50 | next-level-cache = <&A57_L2>; | ||
| 49 | }; | 51 | }; |
| 50 | 52 | ||
| 51 | A53_0: cpu@100 { | 53 | A53_0: cpu@100 { |
| @@ -53,6 +55,7 @@ | |||
| 53 | reg = <0x0 0x100>; | 55 | reg = <0x0 0x100>; |
| 54 | device_type = "cpu"; | 56 | device_type = "cpu"; |
| 55 | enable-method = "psci"; | 57 | enable-method = "psci"; |
| 58 | next-level-cache = <&A53_L2>; | ||
| 56 | }; | 59 | }; |
| 57 | 60 | ||
| 58 | A53_1: cpu@101 { | 61 | A53_1: cpu@101 { |
| @@ -60,6 +63,7 @@ | |||
| 60 | reg = <0x0 0x101>; | 63 | reg = <0x0 0x101>; |
| 61 | device_type = "cpu"; | 64 | device_type = "cpu"; |
| 62 | enable-method = "psci"; | 65 | enable-method = "psci"; |
| 66 | next-level-cache = <&A53_L2>; | ||
| 63 | }; | 67 | }; |
| 64 | 68 | ||
| 65 | A53_2: cpu@102 { | 69 | A53_2: cpu@102 { |
| @@ -67,6 +71,7 @@ | |||
| 67 | reg = <0x0 0x102>; | 71 | reg = <0x0 0x102>; |
| 68 | device_type = "cpu"; | 72 | device_type = "cpu"; |
| 69 | enable-method = "psci"; | 73 | enable-method = "psci"; |
| 74 | next-level-cache = <&A53_L2>; | ||
| 70 | }; | 75 | }; |
| 71 | 76 | ||
| 72 | A53_3: cpu@103 { | 77 | A53_3: cpu@103 { |
| @@ -74,6 +79,15 @@ | |||
| 74 | reg = <0x0 0x103>; | 79 | reg = <0x0 0x103>; |
| 75 | device_type = "cpu"; | 80 | device_type = "cpu"; |
| 76 | enable-method = "psci"; | 81 | enable-method = "psci"; |
| 82 | next-level-cache = <&A53_L2>; | ||
| 83 | }; | ||
| 84 | |||
| 85 | A57_L2: l2-cache0 { | ||
| 86 | compatible = "cache"; | ||
| 87 | }; | ||
| 88 | |||
| 89 | A53_L2: l2-cache1 { | ||
| 90 | compatible = "cache"; | ||
| 77 | }; | 91 | }; |
| 78 | }; | 92 | }; |
| 79 | 93 | ||
diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts b/arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts index efc59b3baf63..20addabbd127 100644 --- a/arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts +++ b/arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | reg = <0x0 0x0>; | 37 | reg = <0x0 0x0>; |
| 38 | enable-method = "spin-table"; | 38 | enable-method = "spin-table"; |
| 39 | cpu-release-addr = <0x0 0x8000fff8>; | 39 | cpu-release-addr = <0x0 0x8000fff8>; |
| 40 | next-level-cache = <&L2_0>; | ||
| 40 | }; | 41 | }; |
| 41 | cpu@1 { | 42 | cpu@1 { |
| 42 | device_type = "cpu"; | 43 | device_type = "cpu"; |
| @@ -44,6 +45,7 @@ | |||
| 44 | reg = <0x0 0x1>; | 45 | reg = <0x0 0x1>; |
| 45 | enable-method = "spin-table"; | 46 | enable-method = "spin-table"; |
| 46 | cpu-release-addr = <0x0 0x8000fff8>; | 47 | cpu-release-addr = <0x0 0x8000fff8>; |
| 48 | next-level-cache = <&L2_0>; | ||
| 47 | }; | 49 | }; |
| 48 | cpu@2 { | 50 | cpu@2 { |
| 49 | device_type = "cpu"; | 51 | device_type = "cpu"; |
| @@ -51,6 +53,7 @@ | |||
| 51 | reg = <0x0 0x2>; | 53 | reg = <0x0 0x2>; |
| 52 | enable-method = "spin-table"; | 54 | enable-method = "spin-table"; |
| 53 | cpu-release-addr = <0x0 0x8000fff8>; | 55 | cpu-release-addr = <0x0 0x8000fff8>; |
| 56 | next-level-cache = <&L2_0>; | ||
| 54 | }; | 57 | }; |
| 55 | cpu@3 { | 58 | cpu@3 { |
| 56 | device_type = "cpu"; | 59 | device_type = "cpu"; |
| @@ -58,6 +61,11 @@ | |||
| 58 | reg = <0x0 0x3>; | 61 | reg = <0x0 0x3>; |
| 59 | enable-method = "spin-table"; | 62 | enable-method = "spin-table"; |
| 60 | cpu-release-addr = <0x0 0x8000fff8>; | 63 | cpu-release-addr = <0x0 0x8000fff8>; |
| 64 | next-level-cache = <&L2_0>; | ||
| 65 | }; | ||
| 66 | |||
| 67 | L2_0: l2-cache0 { | ||
| 68 | compatible = "cache"; | ||
| 61 | }; | 69 | }; |
| 62 | }; | 70 | }; |
| 63 | 71 | ||
diff --git a/arch/arm64/crypto/Makefile b/arch/arm64/crypto/Makefile index 5720608c50b1..abb79b3cfcfe 100644 --- a/arch/arm64/crypto/Makefile +++ b/arch/arm64/crypto/Makefile | |||
| @@ -29,7 +29,7 @@ aes-ce-blk-y := aes-glue-ce.o aes-ce.o | |||
| 29 | obj-$(CONFIG_CRYPTO_AES_ARM64_NEON_BLK) += aes-neon-blk.o | 29 | obj-$(CONFIG_CRYPTO_AES_ARM64_NEON_BLK) += aes-neon-blk.o |
| 30 | aes-neon-blk-y := aes-glue-neon.o aes-neon.o | 30 | aes-neon-blk-y := aes-glue-neon.o aes-neon.o |
| 31 | 31 | ||
| 32 | AFLAGS_aes-ce.o := -DINTERLEAVE=2 -DINTERLEAVE_INLINE | 32 | AFLAGS_aes-ce.o := -DINTERLEAVE=4 |
| 33 | AFLAGS_aes-neon.o := -DINTERLEAVE=4 | 33 | AFLAGS_aes-neon.o := -DINTERLEAVE=4 |
| 34 | 34 | ||
| 35 | CFLAGS_aes-glue-ce.o := -DUSE_V8_CRYPTO_EXTENSIONS | 35 | CFLAGS_aes-glue-ce.o := -DUSE_V8_CRYPTO_EXTENSIONS |
diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h index 5901480bfdca..750bac4e637e 100644 --- a/arch/arm64/include/asm/assembler.h +++ b/arch/arm64/include/asm/assembler.h | |||
| @@ -20,6 +20,9 @@ | |||
| 20 | #error "Only include this from assembly code" | 20 | #error "Only include this from assembly code" |
| 21 | #endif | 21 | #endif |
| 22 | 22 | ||
| 23 | #ifndef __ASM_ASSEMBLER_H | ||
| 24 | #define __ASM_ASSEMBLER_H | ||
| 25 | |||
| 23 | #include <asm/ptrace.h> | 26 | #include <asm/ptrace.h> |
| 24 | #include <asm/thread_info.h> | 27 | #include <asm/thread_info.h> |
| 25 | 28 | ||
| @@ -155,3 +158,5 @@ lr .req x30 // link register | |||
| 155 | #endif | 158 | #endif |
| 156 | orr \rd, \lbits, \hbits, lsl #32 | 159 | orr \rd, \lbits, \hbits, lsl #32 |
| 157 | .endm | 160 | .endm |
| 161 | |||
| 162 | #endif /* __ASM_ASSEMBLER_H */ | ||
diff --git a/arch/arm64/include/asm/cpuidle.h b/arch/arm64/include/asm/cpuidle.h index 0710654631e7..c60643f14cda 100644 --- a/arch/arm64/include/asm/cpuidle.h +++ b/arch/arm64/include/asm/cpuidle.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef __ASM_CPUIDLE_H | 1 | #ifndef __ASM_CPUIDLE_H |
| 2 | #define __ASM_CPUIDLE_H | 2 | #define __ASM_CPUIDLE_H |
| 3 | 3 | ||
| 4 | #include <asm/proc-fns.h> | ||
| 5 | |||
| 4 | #ifdef CONFIG_CPU_IDLE | 6 | #ifdef CONFIG_CPU_IDLE |
| 5 | extern int cpu_init_idle(unsigned int cpu); | 7 | extern int cpu_init_idle(unsigned int cpu); |
| 6 | extern int cpu_suspend(unsigned long arg); | 8 | extern int cpu_suspend(unsigned long arg); |
diff --git a/arch/arm64/include/asm/insn.h b/arch/arm64/include/asm/insn.h index e2ff32a93b5c..d2f49423c5dc 100644 --- a/arch/arm64/include/asm/insn.h +++ b/arch/arm64/include/asm/insn.h | |||
| @@ -264,8 +264,10 @@ __AARCH64_INSN_FUNCS(ands, 0x7F200000, 0x6A000000) | |||
| 264 | __AARCH64_INSN_FUNCS(bics, 0x7F200000, 0x6A200000) | 264 | __AARCH64_INSN_FUNCS(bics, 0x7F200000, 0x6A200000) |
| 265 | __AARCH64_INSN_FUNCS(b, 0xFC000000, 0x14000000) | 265 | __AARCH64_INSN_FUNCS(b, 0xFC000000, 0x14000000) |
| 266 | __AARCH64_INSN_FUNCS(bl, 0xFC000000, 0x94000000) | 266 | __AARCH64_INSN_FUNCS(bl, 0xFC000000, 0x94000000) |
| 267 | __AARCH64_INSN_FUNCS(cbz, 0xFE000000, 0x34000000) | 267 | __AARCH64_INSN_FUNCS(cbz, 0x7F000000, 0x34000000) |
| 268 | __AARCH64_INSN_FUNCS(cbnz, 0xFE000000, 0x35000000) | 268 | __AARCH64_INSN_FUNCS(cbnz, 0x7F000000, 0x35000000) |
| 269 | __AARCH64_INSN_FUNCS(tbz, 0x7F000000, 0x36000000) | ||
| 270 | __AARCH64_INSN_FUNCS(tbnz, 0x7F000000, 0x37000000) | ||
| 269 | __AARCH64_INSN_FUNCS(bcond, 0xFF000010, 0x54000000) | 271 | __AARCH64_INSN_FUNCS(bcond, 0xFF000010, 0x54000000) |
| 270 | __AARCH64_INSN_FUNCS(svc, 0xFFE0001F, 0xD4000001) | 272 | __AARCH64_INSN_FUNCS(svc, 0xFFE0001F, 0xD4000001) |
| 271 | __AARCH64_INSN_FUNCS(hvc, 0xFFE0001F, 0xD4000002) | 273 | __AARCH64_INSN_FUNCS(hvc, 0xFFE0001F, 0xD4000002) |
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 16449c535e50..800ec0e87ed9 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
| @@ -460,7 +460,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long addr) | |||
| 460 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | 460 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
| 461 | { | 461 | { |
| 462 | const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY | | 462 | const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY | |
| 463 | PTE_PROT_NONE | PTE_VALID | PTE_WRITE; | 463 | PTE_PROT_NONE | PTE_WRITE | PTE_TYPE_MASK; |
| 464 | pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); | 464 | pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); |
| 465 | return pte; | 465 | return pte; |
| 466 | } | 466 | } |
diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index f9be30ea1cbd..20e9591a60cf 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h | |||
| @@ -45,7 +45,8 @@ | |||
| 45 | #define STACK_TOP STACK_TOP_MAX | 45 | #define STACK_TOP STACK_TOP_MAX |
| 46 | #endif /* CONFIG_COMPAT */ | 46 | #endif /* CONFIG_COMPAT */ |
| 47 | 47 | ||
| 48 | #define ARCH_LOW_ADDRESS_LIMIT PHYS_MASK | 48 | extern phys_addr_t arm64_dma_phys_limit; |
| 49 | #define ARCH_LOW_ADDRESS_LIMIT (arm64_dma_phys_limit - 1) | ||
| 49 | #endif /* __KERNEL__ */ | 50 | #endif /* __KERNEL__ */ |
| 50 | 51 | ||
| 51 | struct debug_info { | 52 | struct debug_info { |
diff --git a/arch/arm64/include/asm/tlb.h b/arch/arm64/include/asm/tlb.h index c028fe37456f..53d9c354219f 100644 --- a/arch/arm64/include/asm/tlb.h +++ b/arch/arm64/include/asm/tlb.h | |||
| @@ -48,6 +48,7 @@ static inline void tlb_flush(struct mmu_gather *tlb) | |||
| 48 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | 48 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, |
| 49 | unsigned long addr) | 49 | unsigned long addr) |
| 50 | { | 50 | { |
| 51 | __flush_tlb_pgtable(tlb->mm, addr); | ||
| 51 | pgtable_page_dtor(pte); | 52 | pgtable_page_dtor(pte); |
| 52 | tlb_remove_entry(tlb, pte); | 53 | tlb_remove_entry(tlb, pte); |
| 53 | } | 54 | } |
| @@ -56,6 +57,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | |||
| 56 | static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, | 57 | static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, |
| 57 | unsigned long addr) | 58 | unsigned long addr) |
| 58 | { | 59 | { |
| 60 | __flush_tlb_pgtable(tlb->mm, addr); | ||
| 59 | tlb_remove_entry(tlb, virt_to_page(pmdp)); | 61 | tlb_remove_entry(tlb, virt_to_page(pmdp)); |
| 60 | } | 62 | } |
| 61 | #endif | 63 | #endif |
| @@ -64,6 +66,7 @@ static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, | |||
| 64 | static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pudp, | 66 | static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pudp, |
| 65 | unsigned long addr) | 67 | unsigned long addr) |
| 66 | { | 68 | { |
| 69 | __flush_tlb_pgtable(tlb->mm, addr); | ||
| 67 | tlb_remove_entry(tlb, virt_to_page(pudp)); | 70 | tlb_remove_entry(tlb, virt_to_page(pudp)); |
| 68 | } | 71 | } |
| 69 | #endif | 72 | #endif |
diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h index 73f0ce570fb3..c3bb05b98616 100644 --- a/arch/arm64/include/asm/tlbflush.h +++ b/arch/arm64/include/asm/tlbflush.h | |||
| @@ -24,11 +24,6 @@ | |||
| 24 | #include <linux/sched.h> | 24 | #include <linux/sched.h> |
| 25 | #include <asm/cputype.h> | 25 | #include <asm/cputype.h> |
| 26 | 26 | ||
| 27 | extern void __cpu_flush_user_tlb_range(unsigned long, unsigned long, struct vm_area_struct *); | ||
| 28 | extern void __cpu_flush_kern_tlb_range(unsigned long, unsigned long); | ||
| 29 | |||
| 30 | extern struct cpu_tlb_fns cpu_tlb; | ||
| 31 | |||
| 32 | /* | 27 | /* |
| 33 | * TLB Management | 28 | * TLB Management |
| 34 | * ============== | 29 | * ============== |
| @@ -149,6 +144,19 @@ static inline void flush_tlb_kernel_range(unsigned long start, unsigned long end | |||
| 149 | } | 144 | } |
| 150 | 145 | ||
| 151 | /* | 146 | /* |
| 147 | * Used to invalidate the TLB (walk caches) corresponding to intermediate page | ||
| 148 | * table levels (pgd/pud/pmd). | ||
| 149 | */ | ||
| 150 | static inline void __flush_tlb_pgtable(struct mm_struct *mm, | ||
| 151 | unsigned long uaddr) | ||
| 152 | { | ||
| 153 | unsigned long addr = uaddr >> 12 | ((unsigned long)ASID(mm) << 48); | ||
| 154 | |||
| 155 | dsb(ishst); | ||
| 156 | asm("tlbi vae1is, %0" : : "r" (addr)); | ||
| 157 | dsb(ish); | ||
| 158 | } | ||
| 159 | /* | ||
| 152 | * On AArch64, the cache coherency is handled via the set_pte_at() function. | 160 | * On AArch64, the cache coherency is handled via the set_pte_at() function. |
| 153 | */ | 161 | */ |
| 154 | static inline void update_mmu_cache(struct vm_area_struct *vma, | 162 | static inline void update_mmu_cache(struct vm_area_struct *vma, |
diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index bef04afd6031..5ee07eee80c2 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile | |||
| @@ -15,8 +15,9 @@ CFLAGS_REMOVE_return_address.o = -pg | |||
| 15 | arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ | 15 | arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ |
| 16 | entry-fpsimd.o process.o ptrace.o setup.o signal.o \ | 16 | entry-fpsimd.o process.o ptrace.o setup.o signal.o \ |
| 17 | sys.o stacktrace.o time.o traps.o io.o vdso.o \ | 17 | sys.o stacktrace.o time.o traps.o io.o vdso.o \ |
| 18 | hyp-stub.o psci.o cpu_ops.o insn.o return_address.o \ | 18 | hyp-stub.o psci.o psci-call.o cpu_ops.o insn.o \ |
| 19 | cpuinfo.o cpu_errata.o alternative.o cacheinfo.o | 19 | return_address.o cpuinfo.o cpu_errata.o \ |
| 20 | alternative.o cacheinfo.o | ||
| 20 | 21 | ||
| 21 | arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ | 22 | arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ |
| 22 | sys_compat.o entry32.o \ | 23 | sys_compat.o entry32.o \ |
diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c index b42c7b480e1e..2b8d70164428 100644 --- a/arch/arm64/kernel/efi.c +++ b/arch/arm64/kernel/efi.c | |||
| @@ -354,3 +354,12 @@ void efi_virtmap_unload(void) | |||
| 354 | efi_set_pgd(current->active_mm); | 354 | efi_set_pgd(current->active_mm); |
| 355 | preempt_enable(); | 355 | preempt_enable(); |
| 356 | } | 356 | } |
| 357 | |||
| 358 | /* | ||
| 359 | * UpdateCapsule() depends on the system being shutdown via | ||
| 360 | * ResetSystem(). | ||
| 361 | */ | ||
| 362 | bool efi_poweroff_required(void) | ||
| 363 | { | ||
| 364 | return efi_enabled(EFI_RUNTIME_SERVICES); | ||
| 365 | } | ||
diff --git a/arch/arm64/kernel/ftrace.c b/arch/arm64/kernel/ftrace.c index cf8556ae09d0..c851be795080 100644 --- a/arch/arm64/kernel/ftrace.c +++ b/arch/arm64/kernel/ftrace.c | |||
| @@ -156,7 +156,7 @@ static int ftrace_modify_graph_caller(bool enable) | |||
| 156 | 156 | ||
| 157 | branch = aarch64_insn_gen_branch_imm(pc, | 157 | branch = aarch64_insn_gen_branch_imm(pc, |
| 158 | (unsigned long)ftrace_graph_caller, | 158 | (unsigned long)ftrace_graph_caller, |
| 159 | AARCH64_INSN_BRANCH_LINK); | 159 | AARCH64_INSN_BRANCH_NOLINK); |
| 160 | nop = aarch64_insn_gen_nop(); | 160 | nop = aarch64_insn_gen_nop(); |
| 161 | 161 | ||
| 162 | if (enable) | 162 | if (enable) |
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 8ce88e08c030..07f930540f4a 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S | |||
| @@ -585,8 +585,8 @@ ENDPROC(set_cpu_boot_mode_flag) | |||
| 585 | * zeroing of .bss would clobber it. | 585 | * zeroing of .bss would clobber it. |
| 586 | */ | 586 | */ |
| 587 | .pushsection .data..cacheline_aligned | 587 | .pushsection .data..cacheline_aligned |
| 588 | ENTRY(__boot_cpu_mode) | ||
| 589 | .align L1_CACHE_SHIFT | 588 | .align L1_CACHE_SHIFT |
| 589 | ENTRY(__boot_cpu_mode) | ||
| 590 | .long BOOT_CPU_MODE_EL2 | 590 | .long BOOT_CPU_MODE_EL2 |
| 591 | .long 0 | 591 | .long 0 |
| 592 | .popsection | 592 | .popsection |
diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c index 27d4864577e5..c8eca88f12e6 100644 --- a/arch/arm64/kernel/insn.c +++ b/arch/arm64/kernel/insn.c | |||
| @@ -87,8 +87,10 @@ static void __kprobes *patch_map(void *addr, int fixmap) | |||
| 87 | 87 | ||
| 88 | if (module && IS_ENABLED(CONFIG_DEBUG_SET_MODULE_RONX)) | 88 | if (module && IS_ENABLED(CONFIG_DEBUG_SET_MODULE_RONX)) |
| 89 | page = vmalloc_to_page(addr); | 89 | page = vmalloc_to_page(addr); |
| 90 | else | 90 | else if (!module && IS_ENABLED(CONFIG_DEBUG_RODATA)) |
| 91 | page = virt_to_page(addr); | 91 | page = virt_to_page(addr); |
| 92 | else | ||
| 93 | return addr; | ||
| 92 | 94 | ||
| 93 | BUG_ON(!page); | 95 | BUG_ON(!page); |
| 94 | set_fixmap(fixmap, page_to_phys(page)); | 96 | set_fixmap(fixmap, page_to_phys(page)); |
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index fde9923af859..c6b1f3b96f45 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <stdarg.h> | 21 | #include <stdarg.h> |
| 22 | 22 | ||
| 23 | #include <linux/compat.h> | 23 | #include <linux/compat.h> |
| 24 | #include <linux/efi.h> | ||
| 24 | #include <linux/export.h> | 25 | #include <linux/export.h> |
| 25 | #include <linux/sched.h> | 26 | #include <linux/sched.h> |
| 26 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
| @@ -150,6 +151,13 @@ void machine_restart(char *cmd) | |||
| 150 | local_irq_disable(); | 151 | local_irq_disable(); |
| 151 | smp_send_stop(); | 152 | smp_send_stop(); |
| 152 | 153 | ||
| 154 | /* | ||
| 155 | * UpdateCapsule() depends on the system being reset via | ||
| 156 | * ResetSystem(). | ||
| 157 | */ | ||
| 158 | if (efi_enabled(EFI_RUNTIME_SERVICES)) | ||
| 159 | efi_reboot(reboot_mode, NULL); | ||
| 160 | |||
| 153 | /* Now call the architecture specific reboot code. */ | 161 | /* Now call the architecture specific reboot code. */ |
| 154 | if (arm_pm_restart) | 162 | if (arm_pm_restart) |
| 155 | arm_pm_restart(reboot_mode, cmd); | 163 | arm_pm_restart(reboot_mode, cmd); |
diff --git a/arch/arm64/kernel/psci-call.S b/arch/arm64/kernel/psci-call.S new file mode 100644 index 000000000000..cf83e61cd3b5 --- /dev/null +++ b/arch/arm64/kernel/psci-call.S | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License version 2 as | ||
| 4 | * published by the Free Software Foundation. | ||
| 5 | * | ||
| 6 | * This program is distributed in the hope that it will be useful, | ||
| 7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 9 | * GNU General Public License for more details. | ||
| 10 | * | ||
| 11 | * Copyright (C) 2015 ARM Limited | ||
| 12 | * | ||
| 13 | * Author: Will Deacon <will.deacon@arm.com> | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <linux/linkage.h> | ||
| 17 | |||
| 18 | /* int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */ | ||
| 19 | ENTRY(__invoke_psci_fn_hvc) | ||
| 20 | hvc #0 | ||
| 21 | ret | ||
| 22 | ENDPROC(__invoke_psci_fn_hvc) | ||
| 23 | |||
| 24 | /* int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */ | ||
| 25 | ENTRY(__invoke_psci_fn_smc) | ||
| 26 | smc #0 | ||
| 27 | ret | ||
| 28 | ENDPROC(__invoke_psci_fn_smc) | ||
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c index 3425f311c49e..9b8a70ae64a1 100644 --- a/arch/arm64/kernel/psci.c +++ b/arch/arm64/kernel/psci.c | |||
| @@ -57,6 +57,9 @@ static struct psci_operations psci_ops; | |||
| 57 | static int (*invoke_psci_fn)(u64, u64, u64, u64); | 57 | static int (*invoke_psci_fn)(u64, u64, u64, u64); |
| 58 | typedef int (*psci_initcall_t)(const struct device_node *); | 58 | typedef int (*psci_initcall_t)(const struct device_node *); |
| 59 | 59 | ||
| 60 | asmlinkage int __invoke_psci_fn_hvc(u64, u64, u64, u64); | ||
| 61 | asmlinkage int __invoke_psci_fn_smc(u64, u64, u64, u64); | ||
| 62 | |||
| 60 | enum psci_function { | 63 | enum psci_function { |
| 61 | PSCI_FN_CPU_SUSPEND, | 64 | PSCI_FN_CPU_SUSPEND, |
| 62 | PSCI_FN_CPU_ON, | 65 | PSCI_FN_CPU_ON, |
| @@ -109,40 +112,6 @@ static void psci_power_state_unpack(u32 power_state, | |||
| 109 | PSCI_0_2_POWER_STATE_AFFL_SHIFT; | 112 | PSCI_0_2_POWER_STATE_AFFL_SHIFT; |
| 110 | } | 113 | } |
| 111 | 114 | ||
| 112 | /* | ||
| 113 | * The following two functions are invoked via the invoke_psci_fn pointer | ||
| 114 | * and will not be inlined, allowing us to piggyback on the AAPCS. | ||
| 115 | */ | ||
| 116 | static noinline int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1, | ||
| 117 | u64 arg2) | ||
| 118 | { | ||
| 119 | asm volatile( | ||
| 120 | __asmeq("%0", "x0") | ||
| 121 | __asmeq("%1", "x1") | ||
| 122 | __asmeq("%2", "x2") | ||
| 123 | __asmeq("%3", "x3") | ||
| 124 | "hvc #0\n" | ||
| 125 | : "+r" (function_id) | ||
| 126 | : "r" (arg0), "r" (arg1), "r" (arg2)); | ||
| 127 | |||
| 128 | return function_id; | ||
| 129 | } | ||
| 130 | |||
| 131 | static noinline int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1, | ||
| 132 | u64 arg2) | ||
| 133 | { | ||
| 134 | asm volatile( | ||
| 135 | __asmeq("%0", "x0") | ||
| 136 | __asmeq("%1", "x1") | ||
| 137 | __asmeq("%2", "x2") | ||
| 138 | __asmeq("%3", "x3") | ||
| 139 | "smc #0\n" | ||
| 140 | : "+r" (function_id) | ||
| 141 | : "r" (arg0), "r" (arg1), "r" (arg2)); | ||
| 142 | |||
| 143 | return function_id; | ||
| 144 | } | ||
| 145 | |||
| 146 | static int psci_get_version(void) | 115 | static int psci_get_version(void) |
| 147 | { | 116 | { |
| 148 | int err; | 117 | int err; |
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index c20a300e2213..d26fcd4cd6e6 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c | |||
| @@ -154,8 +154,7 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) | |||
| 154 | case __SI_TIMER: | 154 | case __SI_TIMER: |
| 155 | err |= __put_user(from->si_tid, &to->si_tid); | 155 | err |= __put_user(from->si_tid, &to->si_tid); |
| 156 | err |= __put_user(from->si_overrun, &to->si_overrun); | 156 | err |= __put_user(from->si_overrun, &to->si_overrun); |
| 157 | err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, | 157 | err |= __put_user(from->si_int, &to->si_int); |
| 158 | &to->si_ptr); | ||
| 159 | break; | 158 | break; |
| 160 | case __SI_POLL: | 159 | case __SI_POLL: |
| 161 | err |= __put_user(from->si_band, &to->si_band); | 160 | err |= __put_user(from->si_band, &to->si_band); |
| @@ -184,7 +183,7 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) | |||
| 184 | case __SI_MESGQ: /* But this is */ | 183 | case __SI_MESGQ: /* But this is */ |
| 185 | err |= __put_user(from->si_pid, &to->si_pid); | 184 | err |= __put_user(from->si_pid, &to->si_pid); |
| 186 | err |= __put_user(from->si_uid, &to->si_uid); | 185 | err |= __put_user(from->si_uid, &to->si_uid); |
| 187 | err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, &to->si_ptr); | 186 | err |= __put_user(from->si_int, &to->si_int); |
| 188 | break; | 187 | break; |
| 189 | case __SI_SYS: | 188 | case __SI_SYS: |
| 190 | err |= __put_user((compat_uptr_t)(unsigned long) | 189 | err |= __put_user((compat_uptr_t)(unsigned long) |
diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index fe652ffd34c2..efa79e8d4196 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S | |||
| @@ -174,8 +174,6 @@ ENDPROC(__kernel_clock_gettime) | |||
| 174 | /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */ | 174 | /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */ |
| 175 | ENTRY(__kernel_clock_getres) | 175 | ENTRY(__kernel_clock_getres) |
| 176 | .cfi_startproc | 176 | .cfi_startproc |
| 177 | cbz w1, 3f | ||
| 178 | |||
| 179 | cmp w0, #CLOCK_REALTIME | 177 | cmp w0, #CLOCK_REALTIME |
| 180 | ccmp w0, #CLOCK_MONOTONIC, #0x4, ne | 178 | ccmp w0, #CLOCK_MONOTONIC, #0x4, ne |
| 181 | b.ne 1f | 179 | b.ne 1f |
| @@ -188,6 +186,7 @@ ENTRY(__kernel_clock_getres) | |||
| 188 | b.ne 4f | 186 | b.ne 4f |
| 189 | ldr x2, 6f | 187 | ldr x2, 6f |
| 190 | 2: | 188 | 2: |
| 189 | cbz w1, 3f | ||
| 191 | stp xzr, x2, [x1] | 190 | stp xzr, x2, [x1] |
| 192 | 191 | ||
| 193 | 3: /* res == NULL. */ | 192 | 3: /* res == NULL. */ |
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 0a24b9b8c698..58e0c2bdde04 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c | |||
| @@ -348,8 +348,6 @@ static struct dma_map_ops swiotlb_dma_ops = { | |||
| 348 | .mapping_error = swiotlb_dma_mapping_error, | 348 | .mapping_error = swiotlb_dma_mapping_error, |
| 349 | }; | 349 | }; |
| 350 | 350 | ||
| 351 | extern int swiotlb_late_init_with_default_size(size_t default_size); | ||
| 352 | |||
| 353 | static int __init atomic_pool_init(void) | 351 | static int __init atomic_pool_init(void) |
| 354 | { | 352 | { |
| 355 | pgprot_t prot = __pgprot(PROT_NORMAL_NC); | 353 | pgprot_t prot = __pgprot(PROT_NORMAL_NC); |
| @@ -411,21 +409,13 @@ out: | |||
| 411 | return -ENOMEM; | 409 | return -ENOMEM; |
| 412 | } | 410 | } |
| 413 | 411 | ||
| 414 | static int __init swiotlb_late_init(void) | 412 | static int __init arm64_dma_init(void) |
| 415 | { | 413 | { |
| 416 | size_t swiotlb_size = min(SZ_64M, MAX_ORDER_NR_PAGES << PAGE_SHIFT); | 414 | int ret; |
| 417 | 415 | ||
| 418 | dma_ops = &swiotlb_dma_ops; | 416 | dma_ops = &swiotlb_dma_ops; |
| 419 | 417 | ||
| 420 | return swiotlb_late_init_with_default_size(swiotlb_size); | 418 | ret = atomic_pool_init(); |
| 421 | } | ||
| 422 | |||
| 423 | static int __init arm64_dma_init(void) | ||
| 424 | { | ||
| 425 | int ret = 0; | ||
| 426 | |||
| 427 | ret |= swiotlb_late_init(); | ||
| 428 | ret |= atomic_pool_init(); | ||
| 429 | 419 | ||
| 430 | return ret; | 420 | return ret; |
| 431 | } | 421 | } |
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 71145f952070..ae85da6307bb 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/dma-mapping.h> | 33 | #include <linux/dma-mapping.h> |
| 34 | #include <linux/dma-contiguous.h> | 34 | #include <linux/dma-contiguous.h> |
| 35 | #include <linux/efi.h> | 35 | #include <linux/efi.h> |
| 36 | #include <linux/swiotlb.h> | ||
| 36 | 37 | ||
| 37 | #include <asm/fixmap.h> | 38 | #include <asm/fixmap.h> |
| 38 | #include <asm/memory.h> | 39 | #include <asm/memory.h> |
| @@ -45,6 +46,7 @@ | |||
| 45 | #include "mm.h" | 46 | #include "mm.h" |
| 46 | 47 | ||
| 47 | phys_addr_t memstart_addr __read_mostly = 0; | 48 | phys_addr_t memstart_addr __read_mostly = 0; |
| 49 | phys_addr_t arm64_dma_phys_limit __read_mostly; | ||
| 48 | 50 | ||
| 49 | #ifdef CONFIG_BLK_DEV_INITRD | 51 | #ifdef CONFIG_BLK_DEV_INITRD |
| 50 | static int __init early_initrd(char *p) | 52 | static int __init early_initrd(char *p) |
| @@ -85,7 +87,7 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max) | |||
| 85 | 87 | ||
| 86 | /* 4GB maximum for 32-bit only capable devices */ | 88 | /* 4GB maximum for 32-bit only capable devices */ |
| 87 | if (IS_ENABLED(CONFIG_ZONE_DMA)) { | 89 | if (IS_ENABLED(CONFIG_ZONE_DMA)) { |
| 88 | max_dma = PFN_DOWN(max_zone_dma_phys()); | 90 | max_dma = PFN_DOWN(arm64_dma_phys_limit); |
| 89 | zone_size[ZONE_DMA] = max_dma - min; | 91 | zone_size[ZONE_DMA] = max_dma - min; |
| 90 | } | 92 | } |
| 91 | zone_size[ZONE_NORMAL] = max - max_dma; | 93 | zone_size[ZONE_NORMAL] = max - max_dma; |
| @@ -156,8 +158,6 @@ early_param("mem", early_mem); | |||
| 156 | 158 | ||
| 157 | void __init arm64_memblock_init(void) | 159 | void __init arm64_memblock_init(void) |
| 158 | { | 160 | { |
| 159 | phys_addr_t dma_phys_limit = 0; | ||
| 160 | |||
| 161 | memblock_enforce_memory_limit(memory_limit); | 161 | memblock_enforce_memory_limit(memory_limit); |
| 162 | 162 | ||
| 163 | /* | 163 | /* |
| @@ -174,8 +174,10 @@ void __init arm64_memblock_init(void) | |||
| 174 | 174 | ||
| 175 | /* 4GB maximum for 32-bit only capable devices */ | 175 | /* 4GB maximum for 32-bit only capable devices */ |
| 176 | if (IS_ENABLED(CONFIG_ZONE_DMA)) | 176 | if (IS_ENABLED(CONFIG_ZONE_DMA)) |
| 177 | dma_phys_limit = max_zone_dma_phys(); | 177 | arm64_dma_phys_limit = max_zone_dma_phys(); |
| 178 | dma_contiguous_reserve(dma_phys_limit); | 178 | else |
| 179 | arm64_dma_phys_limit = PHYS_MASK + 1; | ||
| 180 | dma_contiguous_reserve(arm64_dma_phys_limit); | ||
| 179 | 181 | ||
| 180 | memblock_allow_resize(); | 182 | memblock_allow_resize(); |
| 181 | memblock_dump_all(); | 183 | memblock_dump_all(); |
| @@ -276,6 +278,8 @@ static void __init free_unused_memmap(void) | |||
| 276 | */ | 278 | */ |
| 277 | void __init mem_init(void) | 279 | void __init mem_init(void) |
| 278 | { | 280 | { |
| 281 | swiotlb_init(1); | ||
| 282 | |||
| 279 | set_max_mapnr(pfn_to_page(max_pfn) - mem_map); | 283 | set_max_mapnr(pfn_to_page(max_pfn) - mem_map); |
| 280 | 284 | ||
| 281 | #ifndef CONFIG_SPARSEMEM_VMEMMAP | 285 | #ifndef CONFIG_SPARSEMEM_VMEMMAP |
diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index bb0ea94c4ba1..1d3ec3ddd84b 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c | |||
| @@ -51,7 +51,10 @@ static int change_memory_common(unsigned long addr, int numpages, | |||
| 51 | WARN_ON_ONCE(1); | 51 | WARN_ON_ONCE(1); |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | if (!is_module_address(start) || !is_module_address(end - 1)) | 54 | if (start < MODULES_VADDR || start >= MODULES_END) |
| 55 | return -EINVAL; | ||
| 56 | |||
| 57 | if (end < MODULES_VADDR || end >= MODULES_END) | ||
| 55 | return -EINVAL; | 58 | return -EINVAL; |
| 56 | 59 | ||
| 57 | data.set_mask = set_mask; | 60 | data.set_mask = set_mask; |
diff --git a/arch/c6x/include/asm/pgtable.h b/arch/c6x/include/asm/pgtable.h index 78d4483ba40c..ec4db6df5e0d 100644 --- a/arch/c6x/include/asm/pgtable.h +++ b/arch/c6x/include/asm/pgtable.h | |||
| @@ -67,6 +67,11 @@ extern unsigned long empty_zero_page; | |||
| 67 | */ | 67 | */ |
| 68 | #define pgtable_cache_init() do { } while (0) | 68 | #define pgtable_cache_init() do { } while (0) |
| 69 | 69 | ||
| 70 | /* | ||
| 71 | * c6x is !MMU, so define the simpliest implementation | ||
| 72 | */ | ||
| 73 | #define pgprot_writecombine pgprot_noncached | ||
| 74 | |||
| 70 | #include <asm-generic/pgtable.h> | 75 | #include <asm-generic/pgtable.h> |
| 71 | 76 | ||
| 72 | #endif /* _ASM_C6X_PGTABLE_H */ | 77 | #endif /* _ASM_C6X_PGTABLE_H */ |
diff --git a/arch/frv/include/asm/pgtable.h b/arch/frv/include/asm/pgtable.h index 93bcf2abd1a1..07d7a7ef8bd5 100644 --- a/arch/frv/include/asm/pgtable.h +++ b/arch/frv/include/asm/pgtable.h | |||
| @@ -123,12 +123,14 @@ extern unsigned long empty_zero_page; | |||
| 123 | #define PGDIR_MASK (~(PGDIR_SIZE - 1)) | 123 | #define PGDIR_MASK (~(PGDIR_SIZE - 1)) |
| 124 | #define PTRS_PER_PGD 64 | 124 | #define PTRS_PER_PGD 64 |
| 125 | 125 | ||
| 126 | #define __PAGETABLE_PUD_FOLDED | ||
| 126 | #define PUD_SHIFT 26 | 127 | #define PUD_SHIFT 26 |
| 127 | #define PTRS_PER_PUD 1 | 128 | #define PTRS_PER_PUD 1 |
| 128 | #define PUD_SIZE (1UL << PUD_SHIFT) | 129 | #define PUD_SIZE (1UL << PUD_SHIFT) |
| 129 | #define PUD_MASK (~(PUD_SIZE - 1)) | 130 | #define PUD_MASK (~(PUD_SIZE - 1)) |
| 130 | #define PUE_SIZE 256 | 131 | #define PUE_SIZE 256 |
| 131 | 132 | ||
| 133 | #define __PAGETABLE_PMD_FOLDED | ||
| 132 | #define PMD_SHIFT 26 | 134 | #define PMD_SHIFT 26 |
| 133 | #define PMD_SIZE (1UL << PMD_SHIFT) | 135 | #define PMD_SIZE (1UL << PMD_SHIFT) |
| 134 | #define PMD_MASK (~(PMD_SIZE - 1)) | 136 | #define PMD_MASK (~(PMD_SIZE - 1)) |
diff --git a/arch/m32r/include/asm/pgtable-2level.h b/arch/m32r/include/asm/pgtable-2level.h index 8fd8ee70266a..421e6ba3a173 100644 --- a/arch/m32r/include/asm/pgtable-2level.h +++ b/arch/m32r/include/asm/pgtable-2level.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | * the M32R is two-level, so we don't really have any | 13 | * the M32R is two-level, so we don't really have any |
| 14 | * PMD directory physically. | 14 | * PMD directory physically. |
| 15 | */ | 15 | */ |
| 16 | #define __PAGETABLE_PMD_FOLDED | ||
| 16 | #define PMD_SHIFT 22 | 17 | #define PMD_SHIFT 22 |
| 17 | #define PTRS_PER_PMD 1 | 18 | #define PTRS_PER_PMD 1 |
| 18 | 19 | ||
diff --git a/arch/m68k/include/asm/pgtable_mm.h b/arch/m68k/include/asm/pgtable_mm.h index 28a145bfbb71..35ed4a9981ae 100644 --- a/arch/m68k/include/asm/pgtable_mm.h +++ b/arch/m68k/include/asm/pgtable_mm.h | |||
| @@ -54,10 +54,12 @@ | |||
| 54 | */ | 54 | */ |
| 55 | #ifdef CONFIG_SUN3 | 55 | #ifdef CONFIG_SUN3 |
| 56 | #define PTRS_PER_PTE 16 | 56 | #define PTRS_PER_PTE 16 |
| 57 | #define __PAGETABLE_PMD_FOLDED | ||
| 57 | #define PTRS_PER_PMD 1 | 58 | #define PTRS_PER_PMD 1 |
| 58 | #define PTRS_PER_PGD 2048 | 59 | #define PTRS_PER_PGD 2048 |
| 59 | #elif defined(CONFIG_COLDFIRE) | 60 | #elif defined(CONFIG_COLDFIRE) |
| 60 | #define PTRS_PER_PTE 512 | 61 | #define PTRS_PER_PTE 512 |
| 62 | #define __PAGETABLE_PMD_FOLDED | ||
| 61 | #define PTRS_PER_PMD 1 | 63 | #define PTRS_PER_PMD 1 |
| 62 | #define PTRS_PER_PGD 1024 | 64 | #define PTRS_PER_PGD 1024 |
| 63 | #else | 65 | #else |
diff --git a/arch/metag/include/asm/processor.h b/arch/metag/include/asm/processor.h index 881071c07942..13272fd5a5ba 100644 --- a/arch/metag/include/asm/processor.h +++ b/arch/metag/include/asm/processor.h | |||
| @@ -149,8 +149,8 @@ extern void exit_thread(void); | |||
| 149 | 149 | ||
| 150 | unsigned long get_wchan(struct task_struct *p); | 150 | unsigned long get_wchan(struct task_struct *p); |
| 151 | 151 | ||
| 152 | #define KSTK_EIP(tsk) ((tsk)->thread.kernel_context->CurrPC) | 152 | #define KSTK_EIP(tsk) (task_pt_regs(tsk)->ctx.CurrPC) |
| 153 | #define KSTK_ESP(tsk) ((tsk)->thread.kernel_context->AX[0].U0) | 153 | #define KSTK_ESP(tsk) (task_pt_regs(tsk)->ctx.AX[0].U0) |
| 154 | 154 | ||
| 155 | #define user_stack_pointer(regs) ((regs)->ctx.AX[0].U0) | 155 | #define user_stack_pointer(regs) ((regs)->ctx.AX[0].U0) |
| 156 | 156 | ||
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index 0536bc021cc6..ef548510b951 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S | |||
| @@ -348,8 +348,9 @@ C_ENTRY(_user_exception): | |||
| 348 | * The LP register should point to the location where the called function | 348 | * The LP register should point to the location where the called function |
| 349 | * should return. [note that MAKE_SYS_CALL uses label 1] */ | 349 | * should return. [note that MAKE_SYS_CALL uses label 1] */ |
| 350 | /* See if the system call number is valid */ | 350 | /* See if the system call number is valid */ |
| 351 | blti r12, 5f | ||
| 351 | addi r11, r12, -__NR_syscalls; | 352 | addi r11, r12, -__NR_syscalls; |
| 352 | bgei r11,5f; | 353 | bgei r11, 5f; |
| 353 | /* Figure out which function to use for this system call. */ | 354 | /* Figure out which function to use for this system call. */ |
| 354 | /* Note Microblaze barrel shift is optional, so don't rely on it */ | 355 | /* Note Microblaze barrel shift is optional, so don't rely on it */ |
| 355 | add r12, r12, r12; /* convert num -> ptr */ | 356 | add r12, r12, r12; /* convert num -> ptr */ |
| @@ -375,7 +376,7 @@ C_ENTRY(_user_exception): | |||
| 375 | 376 | ||
| 376 | /* The syscall number is invalid, return an error. */ | 377 | /* The syscall number is invalid, return an error. */ |
| 377 | 5: | 378 | 5: |
| 378 | rtsd r15, 8; /* looks like a normal subroutine return */ | 379 | braid ret_from_trap |
| 379 | addi r3, r0, -ENOSYS; | 380 | addi r3, r0, -ENOSYS; |
| 380 | 381 | ||
| 381 | /* Entry point used to return from a syscall/trap */ | 382 | /* Entry point used to return from a syscall/trap */ |
| @@ -411,7 +412,7 @@ C_ENTRY(ret_from_trap): | |||
| 411 | bri 1b | 412 | bri 1b |
| 412 | 413 | ||
| 413 | /* Maybe handle a signal */ | 414 | /* Maybe handle a signal */ |
| 414 | 5: | 415 | 5: |
| 415 | andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; | 416 | andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; |
| 416 | beqi r11, 4f; /* Signals to handle, handle them */ | 417 | beqi r11, 4f; /* Signals to handle, handle them */ |
| 417 | 418 | ||
diff --git a/arch/mips/kvm/tlb.c b/arch/mips/kvm/tlb.c index bbcd82242059..b6beb0e07b1b 100644 --- a/arch/mips/kvm/tlb.c +++ b/arch/mips/kvm/tlb.c | |||
| @@ -216,6 +216,7 @@ int kvm_mips_host_tlb_write(struct kvm_vcpu *vcpu, unsigned long entryhi, | |||
| 216 | if (idx > current_cpu_data.tlbsize) { | 216 | if (idx > current_cpu_data.tlbsize) { |
| 217 | kvm_err("%s: Invalid Index: %d\n", __func__, idx); | 217 | kvm_err("%s: Invalid Index: %d\n", __func__, idx); |
| 218 | kvm_mips_dump_host_tlbs(); | 218 | kvm_mips_dump_host_tlbs(); |
| 219 | local_irq_restore(flags); | ||
| 219 | return -1; | 220 | return -1; |
| 220 | } | 221 | } |
| 221 | 222 | ||
diff --git a/arch/mips/kvm/trace.h b/arch/mips/kvm/trace.h index c1388d40663b..bd6437f67dc0 100644 --- a/arch/mips/kvm/trace.h +++ b/arch/mips/kvm/trace.h | |||
| @@ -24,18 +24,18 @@ TRACE_EVENT(kvm_exit, | |||
| 24 | TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason), | 24 | TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason), |
| 25 | TP_ARGS(vcpu, reason), | 25 | TP_ARGS(vcpu, reason), |
| 26 | TP_STRUCT__entry( | 26 | TP_STRUCT__entry( |
| 27 | __field(struct kvm_vcpu *, vcpu) | 27 | __field(unsigned long, pc) |
| 28 | __field(unsigned int, reason) | 28 | __field(unsigned int, reason) |
| 29 | ), | 29 | ), |
| 30 | 30 | ||
| 31 | TP_fast_assign( | 31 | TP_fast_assign( |
| 32 | __entry->vcpu = vcpu; | 32 | __entry->pc = vcpu->arch.pc; |
| 33 | __entry->reason = reason; | 33 | __entry->reason = reason; |
| 34 | ), | 34 | ), |
| 35 | 35 | ||
| 36 | TP_printk("[%s]PC: 0x%08lx", | 36 | TP_printk("[%s]PC: 0x%08lx", |
| 37 | kvm_mips_exit_types_str[__entry->reason], | 37 | kvm_mips_exit_types_str[__entry->reason], |
| 38 | __entry->vcpu->arch.pc) | 38 | __entry->pc) |
| 39 | ); | 39 | ); |
| 40 | 40 | ||
| 41 | #endif /* _TRACE_KVM_H */ | 41 | #endif /* _TRACE_KVM_H */ |
diff --git a/arch/mn10300/include/asm/pgtable.h b/arch/mn10300/include/asm/pgtable.h index afab728ab65e..96d3f9deb59c 100644 --- a/arch/mn10300/include/asm/pgtable.h +++ b/arch/mn10300/include/asm/pgtable.h | |||
| @@ -56,7 +56,9 @@ extern void paging_init(void); | |||
| 56 | #define PGDIR_SHIFT 22 | 56 | #define PGDIR_SHIFT 22 |
| 57 | #define PTRS_PER_PGD 1024 | 57 | #define PTRS_PER_PGD 1024 |
| 58 | #define PTRS_PER_PUD 1 /* we don't really have any PUD physically */ | 58 | #define PTRS_PER_PUD 1 /* we don't really have any PUD physically */ |
| 59 | #define __PAGETABLE_PUD_FOLDED | ||
| 59 | #define PTRS_PER_PMD 1 /* we don't really have any PMD physically */ | 60 | #define PTRS_PER_PMD 1 /* we don't really have any PMD physically */ |
| 61 | #define __PAGETABLE_PMD_FOLDED | ||
| 60 | #define PTRS_PER_PTE 1024 | 62 | #define PTRS_PER_PTE 1024 |
| 61 | 63 | ||
| 62 | #define PGD_SIZE PAGE_SIZE | 64 | #define PGD_SIZE PAGE_SIZE |
diff --git a/arch/nios2/include/asm/ptrace.h b/arch/nios2/include/asm/ptrace.h index 20fb1cf2dab6..642462144872 100644 --- a/arch/nios2/include/asm/ptrace.h +++ b/arch/nios2/include/asm/ptrace.h | |||
| @@ -15,7 +15,54 @@ | |||
| 15 | 15 | ||
| 16 | #include <uapi/asm/ptrace.h> | 16 | #include <uapi/asm/ptrace.h> |
| 17 | 17 | ||
| 18 | /* This struct defines the way the registers are stored on the | ||
| 19 | stack during a system call. */ | ||
| 20 | |||
| 18 | #ifndef __ASSEMBLY__ | 21 | #ifndef __ASSEMBLY__ |
| 22 | struct pt_regs { | ||
| 23 | unsigned long r8; /* r8-r15 Caller-saved GP registers */ | ||
| 24 | unsigned long r9; | ||
| 25 | unsigned long r10; | ||
| 26 | unsigned long r11; | ||
| 27 | unsigned long r12; | ||
| 28 | unsigned long r13; | ||
| 29 | unsigned long r14; | ||
| 30 | unsigned long r15; | ||
| 31 | unsigned long r1; /* Assembler temporary */ | ||
| 32 | unsigned long r2; /* Retval LS 32bits */ | ||
| 33 | unsigned long r3; /* Retval MS 32bits */ | ||
| 34 | unsigned long r4; /* r4-r7 Register arguments */ | ||
| 35 | unsigned long r5; | ||
| 36 | unsigned long r6; | ||
| 37 | unsigned long r7; | ||
| 38 | unsigned long orig_r2; /* Copy of r2 ?? */ | ||
| 39 | unsigned long ra; /* Return address */ | ||
| 40 | unsigned long fp; /* Frame pointer */ | ||
| 41 | unsigned long sp; /* Stack pointer */ | ||
| 42 | unsigned long gp; /* Global pointer */ | ||
| 43 | unsigned long estatus; | ||
| 44 | unsigned long ea; /* Exception return address (pc) */ | ||
| 45 | unsigned long orig_r7; | ||
| 46 | }; | ||
| 47 | |||
| 48 | /* | ||
| 49 | * This is the extended stack used by signal handlers and the context | ||
| 50 | * switcher: it's pushed after the normal "struct pt_regs". | ||
| 51 | */ | ||
| 52 | struct switch_stack { | ||
| 53 | unsigned long r16; /* r16-r23 Callee-saved GP registers */ | ||
| 54 | unsigned long r17; | ||
| 55 | unsigned long r18; | ||
| 56 | unsigned long r19; | ||
| 57 | unsigned long r20; | ||
| 58 | unsigned long r21; | ||
| 59 | unsigned long r22; | ||
| 60 | unsigned long r23; | ||
| 61 | unsigned long fp; | ||
| 62 | unsigned long gp; | ||
| 63 | unsigned long ra; | ||
| 64 | }; | ||
| 65 | |||
| 19 | #define user_mode(regs) (((regs)->estatus & ESTATUS_EU)) | 66 | #define user_mode(regs) (((regs)->estatus & ESTATUS_EU)) |
| 20 | 67 | ||
| 21 | #define instruction_pointer(regs) ((regs)->ra) | 68 | #define instruction_pointer(regs) ((regs)->ra) |
diff --git a/arch/nios2/include/asm/ucontext.h b/arch/nios2/include/asm/ucontext.h deleted file mode 100644 index 2c87614b0f6e..000000000000 --- a/arch/nios2/include/asm/ucontext.h +++ /dev/null | |||
| @@ -1,32 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch> | ||
| 3 | * Copyright (C) 2004 Microtronix Datacom Ltd | ||
| 4 | * | ||
| 5 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 6 | * License. See the file "COPYING" in the main directory of this archive | ||
| 7 | * for more details. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef _ASM_NIOS2_UCONTEXT_H | ||
| 11 | #define _ASM_NIOS2_UCONTEXT_H | ||
| 12 | |||
| 13 | typedef int greg_t; | ||
| 14 | #define NGREG 32 | ||
| 15 | typedef greg_t gregset_t[NGREG]; | ||
| 16 | |||
| 17 | struct mcontext { | ||
| 18 | int version; | ||
| 19 | gregset_t gregs; | ||
| 20 | }; | ||
| 21 | |||
| 22 | #define MCONTEXT_VERSION 2 | ||
| 23 | |||
| 24 | struct ucontext { | ||
| 25 | unsigned long uc_flags; | ||
| 26 | struct ucontext *uc_link; | ||
| 27 | stack_t uc_stack; | ||
| 28 | struct mcontext uc_mcontext; | ||
| 29 | sigset_t uc_sigmask; /* mask last for extensibility */ | ||
| 30 | }; | ||
| 31 | |||
| 32 | #endif | ||
diff --git a/arch/nios2/include/uapi/asm/Kbuild b/arch/nios2/include/uapi/asm/Kbuild index 4f07ca3f8d10..376131194cc3 100644 --- a/arch/nios2/include/uapi/asm/Kbuild +++ b/arch/nios2/include/uapi/asm/Kbuild | |||
| @@ -2,3 +2,5 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 2 | 2 | ||
| 3 | header-y += elf.h | 3 | header-y += elf.h |
| 4 | header-y += ucontext.h | 4 | header-y += ucontext.h |
| 5 | |||
| 6 | generic-y += ucontext.h | ||
diff --git a/arch/nios2/include/uapi/asm/elf.h b/arch/nios2/include/uapi/asm/elf.h index a5b91ae5cf56..6f06d3b2949e 100644 --- a/arch/nios2/include/uapi/asm/elf.h +++ b/arch/nios2/include/uapi/asm/elf.h | |||
| @@ -50,9 +50,7 @@ | |||
| 50 | 50 | ||
| 51 | typedef unsigned long elf_greg_t; | 51 | typedef unsigned long elf_greg_t; |
| 52 | 52 | ||
| 53 | #define ELF_NGREG \ | 53 | #define ELF_NGREG 49 |
| 54 | ((sizeof(struct pt_regs) + sizeof(struct switch_stack)) / \ | ||
| 55 | sizeof(elf_greg_t)) | ||
| 56 | typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | 54 | typedef elf_greg_t elf_gregset_t[ELF_NGREG]; |
| 57 | 55 | ||
| 58 | typedef unsigned long elf_fpregset_t; | 56 | typedef unsigned long elf_fpregset_t; |
diff --git a/arch/nios2/include/uapi/asm/ptrace.h b/arch/nios2/include/uapi/asm/ptrace.h index e83a7c9d1c36..71a330597adf 100644 --- a/arch/nios2/include/uapi/asm/ptrace.h +++ b/arch/nios2/include/uapi/asm/ptrace.h | |||
| @@ -67,53 +67,9 @@ | |||
| 67 | 67 | ||
| 68 | #define NUM_PTRACE_REG (PTR_TLBMISC + 1) | 68 | #define NUM_PTRACE_REG (PTR_TLBMISC + 1) |
| 69 | 69 | ||
| 70 | /* this struct defines the way the registers are stored on the | 70 | /* User structures for general purpose registers. */ |
| 71 | stack during a system call. | 71 | struct user_pt_regs { |
| 72 | 72 | __u32 regs[49]; | |
| 73 | There is a fake_regs in setup.c that has to match pt_regs.*/ | ||
| 74 | |||
| 75 | struct pt_regs { | ||
| 76 | unsigned long r8; /* r8-r15 Caller-saved GP registers */ | ||
| 77 | unsigned long r9; | ||
| 78 | unsigned long r10; | ||
| 79 | unsigned long r11; | ||
| 80 | unsigned long r12; | ||
| 81 | unsigned long r13; | ||
| 82 | unsigned long r14; | ||
| 83 | unsigned long r15; | ||
| 84 | unsigned long r1; /* Assembler temporary */ | ||
| 85 | unsigned long r2; /* Retval LS 32bits */ | ||
| 86 | unsigned long r3; /* Retval MS 32bits */ | ||
| 87 | unsigned long r4; /* r4-r7 Register arguments */ | ||
| 88 | unsigned long r5; | ||
| 89 | unsigned long r6; | ||
| 90 | unsigned long r7; | ||
| 91 | unsigned long orig_r2; /* Copy of r2 ?? */ | ||
| 92 | unsigned long ra; /* Return address */ | ||
| 93 | unsigned long fp; /* Frame pointer */ | ||
| 94 | unsigned long sp; /* Stack pointer */ | ||
| 95 | unsigned long gp; /* Global pointer */ | ||
| 96 | unsigned long estatus; | ||
| 97 | unsigned long ea; /* Exception return address (pc) */ | ||
| 98 | unsigned long orig_r7; | ||
| 99 | }; | ||
| 100 | |||
| 101 | /* | ||
| 102 | * This is the extended stack used by signal handlers and the context | ||
| 103 | * switcher: it's pushed after the normal "struct pt_regs". | ||
| 104 | */ | ||
| 105 | struct switch_stack { | ||
| 106 | unsigned long r16; /* r16-r23 Callee-saved GP registers */ | ||
| 107 | unsigned long r17; | ||
| 108 | unsigned long r18; | ||
| 109 | unsigned long r19; | ||
| 110 | unsigned long r20; | ||
| 111 | unsigned long r21; | ||
| 112 | unsigned long r22; | ||
| 113 | unsigned long r23; | ||
| 114 | unsigned long fp; | ||
| 115 | unsigned long gp; | ||
| 116 | unsigned long ra; | ||
| 117 | }; | 73 | }; |
| 118 | 74 | ||
| 119 | #endif /* __ASSEMBLY__ */ | 75 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/nios2/include/uapi/asm/sigcontext.h b/arch/nios2/include/uapi/asm/sigcontext.h index 7b8bb41867d4..b67944a50927 100644 --- a/arch/nios2/include/uapi/asm/sigcontext.h +++ b/arch/nios2/include/uapi/asm/sigcontext.h | |||
| @@ -15,14 +15,16 @@ | |||
| 15 | * details. | 15 | * details. |
| 16 | */ | 16 | */ |
| 17 | 17 | ||
| 18 | #ifndef _ASM_NIOS2_SIGCONTEXT_H | 18 | #ifndef _UAPI__ASM_SIGCONTEXT_H |
| 19 | #define _ASM_NIOS2_SIGCONTEXT_H | 19 | #define _UAPI__ASM_SIGCONTEXT_H |
| 20 | 20 | ||
| 21 | #include <asm/ptrace.h> | 21 | #include <linux/types.h> |
| 22 | |||
| 23 | #define MCONTEXT_VERSION 2 | ||
| 22 | 24 | ||
| 23 | struct sigcontext { | 25 | struct sigcontext { |
| 24 | struct pt_regs regs; | 26 | int version; |
| 25 | unsigned long sc_mask; /* old sigmask */ | 27 | unsigned long gregs[32]; |
| 26 | }; | 28 | }; |
| 27 | 29 | ||
| 28 | #endif | 30 | #endif |
diff --git a/arch/nios2/kernel/signal.c b/arch/nios2/kernel/signal.c index 2d0ea25be171..dda41e4fe707 100644 --- a/arch/nios2/kernel/signal.c +++ b/arch/nios2/kernel/signal.c | |||
| @@ -39,7 +39,7 @@ static inline int rt_restore_ucontext(struct pt_regs *regs, | |||
| 39 | struct ucontext *uc, int *pr2) | 39 | struct ucontext *uc, int *pr2) |
| 40 | { | 40 | { |
| 41 | int temp; | 41 | int temp; |
| 42 | greg_t *gregs = uc->uc_mcontext.gregs; | 42 | unsigned long *gregs = uc->uc_mcontext.gregs; |
| 43 | int err; | 43 | int err; |
| 44 | 44 | ||
| 45 | /* Always make any pending restarted system calls return -EINTR */ | 45 | /* Always make any pending restarted system calls return -EINTR */ |
| @@ -127,7 +127,7 @@ badframe: | |||
| 127 | static inline int rt_setup_ucontext(struct ucontext *uc, struct pt_regs *regs) | 127 | static inline int rt_setup_ucontext(struct ucontext *uc, struct pt_regs *regs) |
| 128 | { | 128 | { |
| 129 | struct switch_stack *sw = (struct switch_stack *)regs - 1; | 129 | struct switch_stack *sw = (struct switch_stack *)regs - 1; |
| 130 | greg_t *gregs = uc->uc_mcontext.gregs; | 130 | unsigned long *gregs = uc->uc_mcontext.gregs; |
| 131 | int err = 0; | 131 | int err = 0; |
| 132 | 132 | ||
| 133 | err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version); | 133 | err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version); |
diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h index 8c966b2270aa..15207b9362bf 100644 --- a/arch/parisc/include/asm/pgtable.h +++ b/arch/parisc/include/asm/pgtable.h | |||
| @@ -96,6 +96,7 @@ extern void purge_tlb_entries(struct mm_struct *, unsigned long); | |||
| 96 | #if PT_NLEVELS == 3 | 96 | #if PT_NLEVELS == 3 |
| 97 | #define BITS_PER_PMD (PAGE_SHIFT + PMD_ORDER - BITS_PER_PMD_ENTRY) | 97 | #define BITS_PER_PMD (PAGE_SHIFT + PMD_ORDER - BITS_PER_PMD_ENTRY) |
| 98 | #else | 98 | #else |
| 99 | #define __PAGETABLE_PMD_FOLDED | ||
| 99 | #define BITS_PER_PMD 0 | 100 | #define BITS_PER_PMD 0 |
| 100 | #endif | 101 | #endif |
| 101 | #define PTRS_PER_PMD (1UL << BITS_PER_PMD) | 102 | #define PTRS_PER_PMD (1UL << BITS_PER_PMD) |
diff --git a/arch/powerpc/include/asm/iommu.h b/arch/powerpc/include/asm/iommu.h index 9cfa3706a1b8..f1ea5972f6ec 100644 --- a/arch/powerpc/include/asm/iommu.h +++ b/arch/powerpc/include/asm/iommu.h | |||
| @@ -113,6 +113,7 @@ extern void iommu_register_group(struct iommu_table *tbl, | |||
| 113 | int pci_domain_number, unsigned long pe_num); | 113 | int pci_domain_number, unsigned long pe_num); |
| 114 | extern int iommu_add_device(struct device *dev); | 114 | extern int iommu_add_device(struct device *dev); |
| 115 | extern void iommu_del_device(struct device *dev); | 115 | extern void iommu_del_device(struct device *dev); |
| 116 | extern int __init tce_iommu_bus_notifier_init(void); | ||
| 116 | #else | 117 | #else |
| 117 | static inline void iommu_register_group(struct iommu_table *tbl, | 118 | static inline void iommu_register_group(struct iommu_table *tbl, |
| 118 | int pci_domain_number, | 119 | int pci_domain_number, |
| @@ -128,6 +129,11 @@ static inline int iommu_add_device(struct device *dev) | |||
| 128 | static inline void iommu_del_device(struct device *dev) | 129 | static inline void iommu_del_device(struct device *dev) |
| 129 | { | 130 | { |
| 130 | } | 131 | } |
| 132 | |||
| 133 | static inline int __init tce_iommu_bus_notifier_init(void) | ||
| 134 | { | ||
| 135 | return 0; | ||
| 136 | } | ||
| 131 | #endif /* !CONFIG_IOMMU_API */ | 137 | #endif /* !CONFIG_IOMMU_API */ |
| 132 | 138 | ||
| 133 | static inline void set_iommu_table_base_and_group(struct device *dev, | 139 | static inline void set_iommu_table_base_and_group(struct device *dev, |
diff --git a/arch/powerpc/include/asm/irq_work.h b/arch/powerpc/include/asm/irq_work.h new file mode 100644 index 000000000000..744fd54de374 --- /dev/null +++ b/arch/powerpc/include/asm/irq_work.h | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | #ifndef _ASM_POWERPC_IRQ_WORK_H | ||
| 2 | #define _ASM_POWERPC_IRQ_WORK_H | ||
| 3 | |||
| 4 | static inline bool arch_irq_work_has_interrupt(void) | ||
| 5 | { | ||
| 6 | return true; | ||
| 7 | } | ||
| 8 | |||
| 9 | #endif /* _ASM_POWERPC_IRQ_WORK_H */ | ||
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index 5d3968c4d799..b054f33ab1fb 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
| @@ -1175,4 +1175,30 @@ void iommu_del_device(struct device *dev) | |||
| 1175 | } | 1175 | } |
| 1176 | EXPORT_SYMBOL_GPL(iommu_del_device); | 1176 | EXPORT_SYMBOL_GPL(iommu_del_device); |
| 1177 | 1177 | ||
| 1178 | static int tce_iommu_bus_notifier(struct notifier_block *nb, | ||
| 1179 | unsigned long action, void *data) | ||
| 1180 | { | ||
| 1181 | struct device *dev = data; | ||
| 1182 | |||
| 1183 | switch (action) { | ||
| 1184 | case BUS_NOTIFY_ADD_DEVICE: | ||
| 1185 | return iommu_add_device(dev); | ||
| 1186 | case BUS_NOTIFY_DEL_DEVICE: | ||
| 1187 | if (dev->iommu_group) | ||
| 1188 | iommu_del_device(dev); | ||
| 1189 | return 0; | ||
| 1190 | default: | ||
| 1191 | return 0; | ||
| 1192 | } | ||
| 1193 | } | ||
| 1194 | |||
| 1195 | static struct notifier_block tce_iommu_bus_nb = { | ||
| 1196 | .notifier_call = tce_iommu_bus_notifier, | ||
| 1197 | }; | ||
| 1198 | |||
| 1199 | int __init tce_iommu_bus_notifier_init(void) | ||
| 1200 | { | ||
| 1201 | bus_register_notifier(&pci_bus_type, &tce_iommu_bus_nb); | ||
| 1202 | return 0; | ||
| 1203 | } | ||
| 1178 | #endif /* CONFIG_IOMMU_API */ | 1204 | #endif /* CONFIG_IOMMU_API */ |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 6e19afa35a15..ec9ec2058d2d 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
| @@ -541,8 +541,8 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
| 541 | if (smp_ops->give_timebase) | 541 | if (smp_ops->give_timebase) |
| 542 | smp_ops->give_timebase(); | 542 | smp_ops->give_timebase(); |
| 543 | 543 | ||
| 544 | /* Wait until cpu puts itself in the online map */ | 544 | /* Wait until cpu puts itself in the online & active maps */ |
| 545 | while (!cpu_online(cpu)) | 545 | while (!cpu_online(cpu) || !cpu_active(cpu)) |
| 546 | cpu_relax(); | 546 | cpu_relax(); |
| 547 | 547 | ||
| 548 | return 0; | 548 | return 0; |
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index e69142f4af08..54323d6b5166 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c | |||
| @@ -836,30 +836,4 @@ void __init pnv_pci_init(void) | |||
| 836 | #endif | 836 | #endif |
| 837 | } | 837 | } |
| 838 | 838 | ||
| 839 | static int tce_iommu_bus_notifier(struct notifier_block *nb, | ||
| 840 | unsigned long action, void *data) | ||
| 841 | { | ||
| 842 | struct device *dev = data; | ||
| 843 | |||
| 844 | switch (action) { | ||
| 845 | case BUS_NOTIFY_ADD_DEVICE: | ||
| 846 | return iommu_add_device(dev); | ||
| 847 | case BUS_NOTIFY_DEL_DEVICE: | ||
| 848 | if (dev->iommu_group) | ||
| 849 | iommu_del_device(dev); | ||
| 850 | return 0; | ||
| 851 | default: | ||
| 852 | return 0; | ||
| 853 | } | ||
| 854 | } | ||
| 855 | |||
| 856 | static struct notifier_block tce_iommu_bus_nb = { | ||
| 857 | .notifier_call = tce_iommu_bus_notifier, | ||
| 858 | }; | ||
| 859 | |||
| 860 | static int __init tce_iommu_bus_notifier_init(void) | ||
| 861 | { | ||
| 862 | bus_register_notifier(&pci_bus_type, &tce_iommu_bus_nb); | ||
| 863 | return 0; | ||
| 864 | } | ||
| 865 | machine_subsys_initcall_sync(powernv, tce_iommu_bus_notifier_init); | 839 | machine_subsys_initcall_sync(powernv, tce_iommu_bus_notifier_init); |
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index 1d3d52dc3ff3..7803a19adb31 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
| @@ -1340,3 +1340,5 @@ static int __init disable_multitce(char *str) | |||
| 1340 | } | 1340 | } |
| 1341 | 1341 | ||
| 1342 | __setup("multitce=", disable_multitce); | 1342 | __setup("multitce=", disable_multitce); |
| 1343 | |||
| 1344 | machine_subsys_initcall_sync(pseries, tce_iommu_bus_notifier_init); | ||
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index d84559e31f32..f407bbf5ee94 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
| @@ -515,15 +515,15 @@ struct s390_io_adapter { | |||
| 515 | #define S390_ARCH_FAC_MASK_SIZE_U64 \ | 515 | #define S390_ARCH_FAC_MASK_SIZE_U64 \ |
| 516 | (S390_ARCH_FAC_MASK_SIZE_BYTE / sizeof(u64)) | 516 | (S390_ARCH_FAC_MASK_SIZE_BYTE / sizeof(u64)) |
| 517 | 517 | ||
| 518 | struct s390_model_fac { | 518 | struct kvm_s390_fac { |
| 519 | /* facilities used in SIE context */ | 519 | /* facility list requested by guest */ |
| 520 | __u64 sie[S390_ARCH_FAC_LIST_SIZE_U64]; | 520 | __u64 list[S390_ARCH_FAC_LIST_SIZE_U64]; |
| 521 | /* subset enabled by kvm */ | 521 | /* facility mask supported by kvm & hosting machine */ |
| 522 | __u64 kvm[S390_ARCH_FAC_LIST_SIZE_U64]; | 522 | __u64 mask[S390_ARCH_FAC_LIST_SIZE_U64]; |
| 523 | }; | 523 | }; |
| 524 | 524 | ||
| 525 | struct kvm_s390_cpu_model { | 525 | struct kvm_s390_cpu_model { |
| 526 | struct s390_model_fac *fac; | 526 | struct kvm_s390_fac *fac; |
| 527 | struct cpuid cpu_id; | 527 | struct cpuid cpu_id; |
| 528 | unsigned short ibc; | 528 | unsigned short ibc; |
| 529 | }; | 529 | }; |
diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h index f49b71954654..8fb3802f8fad 100644 --- a/arch/s390/include/asm/mmu_context.h +++ b/arch/s390/include/asm/mmu_context.h | |||
| @@ -62,6 +62,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | |||
| 62 | { | 62 | { |
| 63 | int cpu = smp_processor_id(); | 63 | int cpu = smp_processor_id(); |
| 64 | 64 | ||
| 65 | S390_lowcore.user_asce = next->context.asce_bits | __pa(next->pgd); | ||
| 65 | if (prev == next) | 66 | if (prev == next) |
| 66 | return; | 67 | return; |
| 67 | if (MACHINE_HAS_TLB_LC) | 68 | if (MACHINE_HAS_TLB_LC) |
| @@ -73,7 +74,6 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | |||
| 73 | atomic_dec(&prev->context.attach_count); | 74 | atomic_dec(&prev->context.attach_count); |
| 74 | if (MACHINE_HAS_TLB_LC) | 75 | if (MACHINE_HAS_TLB_LC) |
| 75 | cpumask_clear_cpu(cpu, &prev->context.cpu_attach_mask); | 76 | cpumask_clear_cpu(cpu, &prev->context.cpu_attach_mask); |
| 76 | S390_lowcore.user_asce = next->context.asce_bits | __pa(next->pgd); | ||
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | #define finish_arch_post_lock_switch finish_arch_post_lock_switch | 79 | #define finish_arch_post_lock_switch finish_arch_post_lock_switch |
diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h index 7b2ac6e44166..53eacbd4f09b 100644 --- a/arch/s390/include/asm/page.h +++ b/arch/s390/include/asm/page.h | |||
| @@ -37,16 +37,7 @@ static inline void storage_key_init_range(unsigned long start, unsigned long end | |||
| 37 | #endif | 37 | #endif |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | static inline void clear_page(void *page) | 40 | #define clear_page(page) memset((page), 0, PAGE_SIZE) |
| 41 | { | ||
| 42 | register unsigned long reg1 asm ("1") = 0; | ||
| 43 | register void *reg2 asm ("2") = page; | ||
| 44 | register unsigned long reg3 asm ("3") = 4096; | ||
| 45 | asm volatile( | ||
| 46 | " mvcl 2,0" | ||
| 47 | : "+d" (reg2), "+d" (reg3) : "d" (reg1) | ||
| 48 | : "memory", "cc"); | ||
| 49 | } | ||
| 50 | 41 | ||
| 51 | /* | 42 | /* |
| 52 | * copy_page uses the mvcl instruction with 0xb0 padding byte in order to | 43 | * copy_page uses the mvcl instruction with 0xb0 padding byte in order to |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index fbb5ee3ae57c..e08ec38f8c6e 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
| @@ -91,7 +91,9 @@ extern unsigned long zero_page_mask; | |||
| 91 | */ | 91 | */ |
| 92 | #define PTRS_PER_PTE 256 | 92 | #define PTRS_PER_PTE 256 |
| 93 | #ifndef CONFIG_64BIT | 93 | #ifndef CONFIG_64BIT |
| 94 | #define __PAGETABLE_PUD_FOLDED | ||
| 94 | #define PTRS_PER_PMD 1 | 95 | #define PTRS_PER_PMD 1 |
| 96 | #define __PAGETABLE_PMD_FOLDED | ||
| 95 | #define PTRS_PER_PUD 1 | 97 | #define PTRS_PER_PUD 1 |
| 96 | #else /* CONFIG_64BIT */ | 98 | #else /* CONFIG_64BIT */ |
| 97 | #define PTRS_PER_PMD 2048 | 99 | #define PTRS_PER_PMD 2048 |
diff --git a/arch/s390/kernel/jump_label.c b/arch/s390/kernel/jump_label.c index cb2d51e779df..830066f936c8 100644 --- a/arch/s390/kernel/jump_label.c +++ b/arch/s390/kernel/jump_label.c | |||
| @@ -36,16 +36,20 @@ static void jump_label_make_branch(struct jump_entry *entry, struct insn *insn) | |||
| 36 | insn->offset = (entry->target - entry->code) >> 1; | 36 | insn->offset = (entry->target - entry->code) >> 1; |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | static void jump_label_bug(struct jump_entry *entry, struct insn *insn) | 39 | static void jump_label_bug(struct jump_entry *entry, struct insn *expected, |
| 40 | struct insn *new) | ||
| 40 | { | 41 | { |
| 41 | unsigned char *ipc = (unsigned char *)entry->code; | 42 | unsigned char *ipc = (unsigned char *)entry->code; |
| 42 | unsigned char *ipe = (unsigned char *)insn; | 43 | unsigned char *ipe = (unsigned char *)expected; |
| 44 | unsigned char *ipn = (unsigned char *)new; | ||
| 43 | 45 | ||
| 44 | pr_emerg("Jump label code mismatch at %pS [%p]\n", ipc, ipc); | 46 | pr_emerg("Jump label code mismatch at %pS [%p]\n", ipc, ipc); |
| 45 | pr_emerg("Found: %02x %02x %02x %02x %02x %02x\n", | 47 | pr_emerg("Found: %02x %02x %02x %02x %02x %02x\n", |
| 46 | ipc[0], ipc[1], ipc[2], ipc[3], ipc[4], ipc[5]); | 48 | ipc[0], ipc[1], ipc[2], ipc[3], ipc[4], ipc[5]); |
| 47 | pr_emerg("Expected: %02x %02x %02x %02x %02x %02x\n", | 49 | pr_emerg("Expected: %02x %02x %02x %02x %02x %02x\n", |
| 48 | ipe[0], ipe[1], ipe[2], ipe[3], ipe[4], ipe[5]); | 50 | ipe[0], ipe[1], ipe[2], ipe[3], ipe[4], ipe[5]); |
| 51 | pr_emerg("New: %02x %02x %02x %02x %02x %02x\n", | ||
| 52 | ipn[0], ipn[1], ipn[2], ipn[3], ipn[4], ipn[5]); | ||
| 49 | panic("Corrupted kernel text"); | 53 | panic("Corrupted kernel text"); |
| 50 | } | 54 | } |
| 51 | 55 | ||
| @@ -69,10 +73,10 @@ static void __jump_label_transform(struct jump_entry *entry, | |||
| 69 | } | 73 | } |
| 70 | if (init) { | 74 | if (init) { |
| 71 | if (memcmp((void *)entry->code, &orignop, sizeof(orignop))) | 75 | if (memcmp((void *)entry->code, &orignop, sizeof(orignop))) |
| 72 | jump_label_bug(entry, &old); | 76 | jump_label_bug(entry, &orignop, &new); |
| 73 | } else { | 77 | } else { |
| 74 | if (memcmp((void *)entry->code, &old, sizeof(old))) | 78 | if (memcmp((void *)entry->code, &old, sizeof(old))) |
| 75 | jump_label_bug(entry, &old); | 79 | jump_label_bug(entry, &old, &new); |
| 76 | } | 80 | } |
| 77 | probe_kernel_write((void *)entry->code, &new, sizeof(new)); | 81 | probe_kernel_write((void *)entry->code, &new, sizeof(new)); |
| 78 | } | 82 | } |
diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c index 36154a2f1814..2ca95862e336 100644 --- a/arch/s390/kernel/module.c +++ b/arch/s390/kernel/module.c | |||
| @@ -436,6 +436,7 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
| 436 | const Elf_Shdr *sechdrs, | 436 | const Elf_Shdr *sechdrs, |
| 437 | struct module *me) | 437 | struct module *me) |
| 438 | { | 438 | { |
| 439 | jump_label_apply_nops(me); | ||
| 439 | vfree(me->arch.syminfo); | 440 | vfree(me->arch.syminfo); |
| 440 | me->arch.syminfo = NULL; | 441 | me->arch.syminfo = NULL; |
| 441 | return 0; | 442 | return 0; |
diff --git a/arch/s390/kernel/processor.c b/arch/s390/kernel/processor.c index 26108232fcaa..dc488e13b7e3 100644 --- a/arch/s390/kernel/processor.c +++ b/arch/s390/kernel/processor.c | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | 18 | ||
| 19 | static DEFINE_PER_CPU(struct cpuid, cpu_id); | 19 | static DEFINE_PER_CPU(struct cpuid, cpu_id); |
| 20 | 20 | ||
| 21 | void cpu_relax(void) | 21 | void notrace cpu_relax(void) |
| 22 | { | 22 | { |
| 23 | if (!smp_cpu_mtid && MACHINE_HAS_DIAG44) | 23 | if (!smp_cpu_mtid && MACHINE_HAS_DIAG44) |
| 24 | asm volatile("diag 0,0,0x44"); | 24 | asm volatile("diag 0,0,0x44"); |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 0c3623927563..f6579cfde2df 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
| @@ -522,7 +522,7 @@ static int kvm_s390_set_processor(struct kvm *kvm, struct kvm_device_attr *attr) | |||
| 522 | memcpy(&kvm->arch.model.cpu_id, &proc->cpuid, | 522 | memcpy(&kvm->arch.model.cpu_id, &proc->cpuid, |
| 523 | sizeof(struct cpuid)); | 523 | sizeof(struct cpuid)); |
| 524 | kvm->arch.model.ibc = proc->ibc; | 524 | kvm->arch.model.ibc = proc->ibc; |
| 525 | memcpy(kvm->arch.model.fac->kvm, proc->fac_list, | 525 | memcpy(kvm->arch.model.fac->list, proc->fac_list, |
| 526 | S390_ARCH_FAC_LIST_SIZE_BYTE); | 526 | S390_ARCH_FAC_LIST_SIZE_BYTE); |
| 527 | } else | 527 | } else |
| 528 | ret = -EFAULT; | 528 | ret = -EFAULT; |
| @@ -556,7 +556,7 @@ static int kvm_s390_get_processor(struct kvm *kvm, struct kvm_device_attr *attr) | |||
| 556 | } | 556 | } |
| 557 | memcpy(&proc->cpuid, &kvm->arch.model.cpu_id, sizeof(struct cpuid)); | 557 | memcpy(&proc->cpuid, &kvm->arch.model.cpu_id, sizeof(struct cpuid)); |
| 558 | proc->ibc = kvm->arch.model.ibc; | 558 | proc->ibc = kvm->arch.model.ibc; |
| 559 | memcpy(&proc->fac_list, kvm->arch.model.fac->kvm, S390_ARCH_FAC_LIST_SIZE_BYTE); | 559 | memcpy(&proc->fac_list, kvm->arch.model.fac->list, S390_ARCH_FAC_LIST_SIZE_BYTE); |
| 560 | if (copy_to_user((void __user *)attr->addr, proc, sizeof(*proc))) | 560 | if (copy_to_user((void __user *)attr->addr, proc, sizeof(*proc))) |
| 561 | ret = -EFAULT; | 561 | ret = -EFAULT; |
| 562 | kfree(proc); | 562 | kfree(proc); |
| @@ -576,10 +576,10 @@ static int kvm_s390_get_machine(struct kvm *kvm, struct kvm_device_attr *attr) | |||
| 576 | } | 576 | } |
| 577 | get_cpu_id((struct cpuid *) &mach->cpuid); | 577 | get_cpu_id((struct cpuid *) &mach->cpuid); |
| 578 | mach->ibc = sclp_get_ibc(); | 578 | mach->ibc = sclp_get_ibc(); |
| 579 | memcpy(&mach->fac_mask, kvm_s390_fac_list_mask, | 579 | memcpy(&mach->fac_mask, kvm->arch.model.fac->mask, |
| 580 | kvm_s390_fac_list_mask_size() * sizeof(u64)); | 580 | S390_ARCH_FAC_LIST_SIZE_BYTE); |
| 581 | memcpy((unsigned long *)&mach->fac_list, S390_lowcore.stfle_fac_list, | 581 | memcpy((unsigned long *)&mach->fac_list, S390_lowcore.stfle_fac_list, |
| 582 | S390_ARCH_FAC_LIST_SIZE_U64); | 582 | S390_ARCH_FAC_LIST_SIZE_BYTE); |
| 583 | if (copy_to_user((void __user *)attr->addr, mach, sizeof(*mach))) | 583 | if (copy_to_user((void __user *)attr->addr, mach, sizeof(*mach))) |
| 584 | ret = -EFAULT; | 584 | ret = -EFAULT; |
| 585 | kfree(mach); | 585 | kfree(mach); |
| @@ -778,15 +778,18 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
| 778 | static int kvm_s390_query_ap_config(u8 *config) | 778 | static int kvm_s390_query_ap_config(u8 *config) |
| 779 | { | 779 | { |
| 780 | u32 fcn_code = 0x04000000UL; | 780 | u32 fcn_code = 0x04000000UL; |
| 781 | u32 cc; | 781 | u32 cc = 0; |
| 782 | 782 | ||
| 783 | memset(config, 0, 128); | ||
| 783 | asm volatile( | 784 | asm volatile( |
| 784 | "lgr 0,%1\n" | 785 | "lgr 0,%1\n" |
| 785 | "lgr 2,%2\n" | 786 | "lgr 2,%2\n" |
| 786 | ".long 0xb2af0000\n" /* PQAP(QCI) */ | 787 | ".long 0xb2af0000\n" /* PQAP(QCI) */ |
| 787 | "ipm %0\n" | 788 | "0: ipm %0\n" |
| 788 | "srl %0,28\n" | 789 | "srl %0,28\n" |
| 789 | : "=r" (cc) | 790 | "1:\n" |
| 791 | EX_TABLE(0b, 1b) | ||
| 792 | : "+r" (cc) | ||
| 790 | : "r" (fcn_code), "r" (config) | 793 | : "r" (fcn_code), "r" (config) |
| 791 | : "cc", "0", "2", "memory" | 794 | : "cc", "0", "2", "memory" |
| 792 | ); | 795 | ); |
| @@ -839,9 +842,13 @@ static int kvm_s390_crypto_init(struct kvm *kvm) | |||
| 839 | 842 | ||
| 840 | kvm_s390_set_crycb_format(kvm); | 843 | kvm_s390_set_crycb_format(kvm); |
| 841 | 844 | ||
| 842 | /* Disable AES/DEA protected key functions by default */ | 845 | /* Enable AES/DEA protected key functions by default */ |
| 843 | kvm->arch.crypto.aes_kw = 0; | 846 | kvm->arch.crypto.aes_kw = 1; |
| 844 | kvm->arch.crypto.dea_kw = 0; | 847 | kvm->arch.crypto.dea_kw = 1; |
| 848 | get_random_bytes(kvm->arch.crypto.crycb->aes_wrapping_key_mask, | ||
| 849 | sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask)); | ||
| 850 | get_random_bytes(kvm->arch.crypto.crycb->dea_wrapping_key_mask, | ||
| 851 | sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask)); | ||
| 845 | 852 | ||
| 846 | return 0; | 853 | return 0; |
| 847 | } | 854 | } |
| @@ -886,40 +893,29 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
| 886 | /* | 893 | /* |
| 887 | * The architectural maximum amount of facilities is 16 kbit. To store | 894 | * The architectural maximum amount of facilities is 16 kbit. To store |
| 888 | * this amount, 2 kbyte of memory is required. Thus we need a full | 895 | * this amount, 2 kbyte of memory is required. Thus we need a full |
| 889 | * page to hold the active copy (arch.model.fac->sie) and the current | 896 | * page to hold the guest facility list (arch.model.fac->list) and the |
| 890 | * facilities set (arch.model.fac->kvm). Its address size has to be | 897 | * facility mask (arch.model.fac->mask). Its address size has to be |
| 891 | * 31 bits and word aligned. | 898 | * 31 bits and word aligned. |
| 892 | */ | 899 | */ |
| 893 | kvm->arch.model.fac = | 900 | kvm->arch.model.fac = |
| 894 | (struct s390_model_fac *) get_zeroed_page(GFP_KERNEL | GFP_DMA); | 901 | (struct kvm_s390_fac *) get_zeroed_page(GFP_KERNEL | GFP_DMA); |
| 895 | if (!kvm->arch.model.fac) | 902 | if (!kvm->arch.model.fac) |
| 896 | goto out_nofac; | 903 | goto out_nofac; |
| 897 | 904 | ||
| 898 | memcpy(kvm->arch.model.fac->kvm, S390_lowcore.stfle_fac_list, | 905 | /* Populate the facility mask initially. */ |
| 899 | S390_ARCH_FAC_LIST_SIZE_U64); | 906 | memcpy(kvm->arch.model.fac->mask, S390_lowcore.stfle_fac_list, |
| 900 | 907 | S390_ARCH_FAC_LIST_SIZE_BYTE); | |
| 901 | /* | ||
| 902 | * If this KVM host runs *not* in a LPAR, relax the facility bits | ||
| 903 | * of the kvm facility mask by all missing facilities. This will allow | ||
| 904 | * to determine the right CPU model by means of the remaining facilities. | ||
| 905 | * Live guest migration must prohibit the migration of KVMs running in | ||
| 906 | * a LPAR to non LPAR hosts. | ||
| 907 | */ | ||
| 908 | if (!MACHINE_IS_LPAR) | ||
| 909 | for (i = 0; i < kvm_s390_fac_list_mask_size(); i++) | ||
| 910 | kvm_s390_fac_list_mask[i] &= kvm->arch.model.fac->kvm[i]; | ||
| 911 | |||
| 912 | /* | ||
| 913 | * Apply the kvm facility mask to limit the kvm supported/tolerated | ||
| 914 | * facility list. | ||
| 915 | */ | ||
| 916 | for (i = 0; i < S390_ARCH_FAC_LIST_SIZE_U64; i++) { | 908 | for (i = 0; i < S390_ARCH_FAC_LIST_SIZE_U64; i++) { |
| 917 | if (i < kvm_s390_fac_list_mask_size()) | 909 | if (i < kvm_s390_fac_list_mask_size()) |
| 918 | kvm->arch.model.fac->kvm[i] &= kvm_s390_fac_list_mask[i]; | 910 | kvm->arch.model.fac->mask[i] &= kvm_s390_fac_list_mask[i]; |
| 919 | else | 911 | else |
| 920 | kvm->arch.model.fac->kvm[i] = 0UL; | 912 | kvm->arch.model.fac->mask[i] = 0UL; |
| 921 | } | 913 | } |
| 922 | 914 | ||
| 915 | /* Populate the facility list initially. */ | ||
| 916 | memcpy(kvm->arch.model.fac->list, kvm->arch.model.fac->mask, | ||
| 917 | S390_ARCH_FAC_LIST_SIZE_BYTE); | ||
| 918 | |||
| 923 | kvm_s390_get_cpu_id(&kvm->arch.model.cpu_id); | 919 | kvm_s390_get_cpu_id(&kvm->arch.model.cpu_id); |
| 924 | kvm->arch.model.ibc = sclp_get_ibc() & 0x0fff; | 920 | kvm->arch.model.ibc = sclp_get_ibc() & 0x0fff; |
| 925 | 921 | ||
| @@ -1165,8 +1161,6 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | |||
| 1165 | 1161 | ||
| 1166 | mutex_lock(&vcpu->kvm->lock); | 1162 | mutex_lock(&vcpu->kvm->lock); |
| 1167 | vcpu->arch.cpu_id = vcpu->kvm->arch.model.cpu_id; | 1163 | vcpu->arch.cpu_id = vcpu->kvm->arch.model.cpu_id; |
| 1168 | memcpy(vcpu->kvm->arch.model.fac->sie, vcpu->kvm->arch.model.fac->kvm, | ||
| 1169 | S390_ARCH_FAC_LIST_SIZE_BYTE); | ||
| 1170 | vcpu->arch.sie_block->ibc = vcpu->kvm->arch.model.ibc; | 1164 | vcpu->arch.sie_block->ibc = vcpu->kvm->arch.model.ibc; |
| 1171 | mutex_unlock(&vcpu->kvm->lock); | 1165 | mutex_unlock(&vcpu->kvm->lock); |
| 1172 | 1166 | ||
| @@ -1212,7 +1206,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, | |||
| 1212 | vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca; | 1206 | vcpu->arch.sie_block->scaol = (__u32)(__u64)kvm->arch.sca; |
| 1213 | set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn); | 1207 | set_bit(63 - id, (unsigned long *) &kvm->arch.sca->mcn); |
| 1214 | } | 1208 | } |
| 1215 | vcpu->arch.sie_block->fac = (int) (long) kvm->arch.model.fac->sie; | 1209 | vcpu->arch.sie_block->fac = (int) (long) kvm->arch.model.fac->list; |
| 1216 | 1210 | ||
| 1217 | spin_lock_init(&vcpu->arch.local_int.lock); | 1211 | spin_lock_init(&vcpu->arch.local_int.lock); |
| 1218 | vcpu->arch.local_int.float_int = &kvm->arch.float_int; | 1212 | vcpu->arch.local_int.float_int = &kvm->arch.float_int; |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 985c2114d7ef..c34109aa552d 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
| @@ -128,7 +128,8 @@ static inline void kvm_s390_set_psw_cc(struct kvm_vcpu *vcpu, unsigned long cc) | |||
| 128 | /* test availability of facility in a kvm intance */ | 128 | /* test availability of facility in a kvm intance */ |
| 129 | static inline int test_kvm_facility(struct kvm *kvm, unsigned long nr) | 129 | static inline int test_kvm_facility(struct kvm *kvm, unsigned long nr) |
| 130 | { | 130 | { |
| 131 | return __test_facility(nr, kvm->arch.model.fac->kvm); | 131 | return __test_facility(nr, kvm->arch.model.fac->mask) && |
| 132 | __test_facility(nr, kvm->arch.model.fac->list); | ||
| 132 | } | 133 | } |
| 133 | 134 | ||
| 134 | /* are cpu states controlled by user space */ | 135 | /* are cpu states controlled by user space */ |
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index bdd9b5b17e03..351116939ea2 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
| @@ -348,7 +348,7 @@ static int handle_stfl(struct kvm_vcpu *vcpu) | |||
| 348 | * We need to shift the lower 32 facility bits (bit 0-31) from a u64 | 348 | * We need to shift the lower 32 facility bits (bit 0-31) from a u64 |
| 349 | * into a u32 memory representation. They will remain bits 0-31. | 349 | * into a u32 memory representation. They will remain bits 0-31. |
| 350 | */ | 350 | */ |
| 351 | fac = *vcpu->kvm->arch.model.fac->sie >> 32; | 351 | fac = *vcpu->kvm->arch.model.fac->list >> 32; |
| 352 | rc = write_guest_lc(vcpu, offsetof(struct _lowcore, stfl_fac_list), | 352 | rc = write_guest_lc(vcpu, offsetof(struct _lowcore, stfl_fac_list), |
| 353 | &fac, sizeof(fac)); | 353 | &fac, sizeof(fac)); |
| 354 | if (rc) | 354 | if (rc) |
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 753a56731951..f0b85443e060 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c | |||
| @@ -287,7 +287,7 @@ void __iomem *pci_iomap_range(struct pci_dev *pdev, | |||
| 287 | addr = ZPCI_IOMAP_ADDR_BASE | ((u64) idx << 48); | 287 | addr = ZPCI_IOMAP_ADDR_BASE | ((u64) idx << 48); |
| 288 | return (void __iomem *) addr + offset; | 288 | return (void __iomem *) addr + offset; |
| 289 | } | 289 | } |
| 290 | EXPORT_SYMBOL_GPL(pci_iomap_range); | 290 | EXPORT_SYMBOL(pci_iomap_range); |
| 291 | 291 | ||
| 292 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | 292 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) |
| 293 | { | 293 | { |
| @@ -309,7 +309,7 @@ void pci_iounmap(struct pci_dev *pdev, void __iomem *addr) | |||
| 309 | } | 309 | } |
| 310 | spin_unlock(&zpci_iomap_lock); | 310 | spin_unlock(&zpci_iomap_lock); |
| 311 | } | 311 | } |
| 312 | EXPORT_SYMBOL_GPL(pci_iounmap); | 312 | EXPORT_SYMBOL(pci_iounmap); |
| 313 | 313 | ||
| 314 | static int pci_read(struct pci_bus *bus, unsigned int devfn, int where, | 314 | static int pci_read(struct pci_bus *bus, unsigned int devfn, int where, |
| 315 | int size, u32 *val) | 315 | int size, u32 *val) |
| @@ -483,9 +483,8 @@ void arch_teardown_msi_irqs(struct pci_dev *pdev) | |||
| 483 | airq_iv_free_bit(zpci_aisb_iv, zdev->aisb); | 483 | airq_iv_free_bit(zpci_aisb_iv, zdev->aisb); |
| 484 | } | 484 | } |
| 485 | 485 | ||
| 486 | static void zpci_map_resources(struct zpci_dev *zdev) | 486 | static void zpci_map_resources(struct pci_dev *pdev) |
| 487 | { | 487 | { |
| 488 | struct pci_dev *pdev = zdev->pdev; | ||
| 489 | resource_size_t len; | 488 | resource_size_t len; |
| 490 | int i; | 489 | int i; |
| 491 | 490 | ||
| @@ -499,9 +498,8 @@ static void zpci_map_resources(struct zpci_dev *zdev) | |||
| 499 | } | 498 | } |
| 500 | } | 499 | } |
| 501 | 500 | ||
| 502 | static void zpci_unmap_resources(struct zpci_dev *zdev) | 501 | static void zpci_unmap_resources(struct pci_dev *pdev) |
| 503 | { | 502 | { |
| 504 | struct pci_dev *pdev = zdev->pdev; | ||
| 505 | resource_size_t len; | 503 | resource_size_t len; |
| 506 | int i; | 504 | int i; |
| 507 | 505 | ||
| @@ -651,7 +649,7 @@ int pcibios_add_device(struct pci_dev *pdev) | |||
| 651 | 649 | ||
| 652 | zdev->pdev = pdev; | 650 | zdev->pdev = pdev; |
| 653 | pdev->dev.groups = zpci_attr_groups; | 651 | pdev->dev.groups = zpci_attr_groups; |
| 654 | zpci_map_resources(zdev); | 652 | zpci_map_resources(pdev); |
| 655 | 653 | ||
| 656 | for (i = 0; i < PCI_BAR_COUNT; i++) { | 654 | for (i = 0; i < PCI_BAR_COUNT; i++) { |
| 657 | res = &pdev->resource[i]; | 655 | res = &pdev->resource[i]; |
| @@ -663,6 +661,11 @@ int pcibios_add_device(struct pci_dev *pdev) | |||
| 663 | return 0; | 661 | return 0; |
| 664 | } | 662 | } |
| 665 | 663 | ||
| 664 | void pcibios_release_device(struct pci_dev *pdev) | ||
| 665 | { | ||
| 666 | zpci_unmap_resources(pdev); | ||
| 667 | } | ||
| 668 | |||
| 666 | int pcibios_enable_device(struct pci_dev *pdev, int mask) | 669 | int pcibios_enable_device(struct pci_dev *pdev, int mask) |
| 667 | { | 670 | { |
| 668 | struct zpci_dev *zdev = get_zdev(pdev); | 671 | struct zpci_dev *zdev = get_zdev(pdev); |
| @@ -670,7 +673,6 @@ int pcibios_enable_device(struct pci_dev *pdev, int mask) | |||
| 670 | zdev->pdev = pdev; | 673 | zdev->pdev = pdev; |
| 671 | zpci_debug_init_device(zdev); | 674 | zpci_debug_init_device(zdev); |
| 672 | zpci_fmb_enable_device(zdev); | 675 | zpci_fmb_enable_device(zdev); |
| 673 | zpci_map_resources(zdev); | ||
| 674 | 676 | ||
| 675 | return pci_enable_resources(pdev, mask); | 677 | return pci_enable_resources(pdev, mask); |
| 676 | } | 678 | } |
| @@ -679,7 +681,6 @@ void pcibios_disable_device(struct pci_dev *pdev) | |||
| 679 | { | 681 | { |
| 680 | struct zpci_dev *zdev = get_zdev(pdev); | 682 | struct zpci_dev *zdev = get_zdev(pdev); |
| 681 | 683 | ||
| 682 | zpci_unmap_resources(zdev); | ||
| 683 | zpci_fmb_disable_device(zdev); | 684 | zpci_fmb_disable_device(zdev); |
| 684 | zpci_debug_exit_device(zdev); | 685 | zpci_debug_exit_device(zdev); |
| 685 | zdev->pdev = NULL; | 686 | zdev->pdev = NULL; |
| @@ -688,7 +689,8 @@ void pcibios_disable_device(struct pci_dev *pdev) | |||
| 688 | #ifdef CONFIG_HIBERNATE_CALLBACKS | 689 | #ifdef CONFIG_HIBERNATE_CALLBACKS |
| 689 | static int zpci_restore(struct device *dev) | 690 | static int zpci_restore(struct device *dev) |
| 690 | { | 691 | { |
| 691 | struct zpci_dev *zdev = get_zdev(to_pci_dev(dev)); | 692 | struct pci_dev *pdev = to_pci_dev(dev); |
| 693 | struct zpci_dev *zdev = get_zdev(pdev); | ||
| 692 | int ret = 0; | 694 | int ret = 0; |
| 693 | 695 | ||
| 694 | if (zdev->state != ZPCI_FN_STATE_ONLINE) | 696 | if (zdev->state != ZPCI_FN_STATE_ONLINE) |
| @@ -698,7 +700,7 @@ static int zpci_restore(struct device *dev) | |||
| 698 | if (ret) | 700 | if (ret) |
| 699 | goto out; | 701 | goto out; |
| 700 | 702 | ||
| 701 | zpci_map_resources(zdev); | 703 | zpci_map_resources(pdev); |
| 702 | zpci_register_ioat(zdev, 0, zdev->start_dma + PAGE_OFFSET, | 704 | zpci_register_ioat(zdev, 0, zdev->start_dma + PAGE_OFFSET, |
| 703 | zdev->start_dma + zdev->iommu_size - 1, | 705 | zdev->start_dma + zdev->iommu_size - 1, |
| 704 | (u64) zdev->dma_table); | 706 | (u64) zdev->dma_table); |
| @@ -709,12 +711,14 @@ out: | |||
| 709 | 711 | ||
| 710 | static int zpci_freeze(struct device *dev) | 712 | static int zpci_freeze(struct device *dev) |
| 711 | { | 713 | { |
| 712 | struct zpci_dev *zdev = get_zdev(to_pci_dev(dev)); | 714 | struct pci_dev *pdev = to_pci_dev(dev); |
| 715 | struct zpci_dev *zdev = get_zdev(pdev); | ||
| 713 | 716 | ||
| 714 | if (zdev->state != ZPCI_FN_STATE_ONLINE) | 717 | if (zdev->state != ZPCI_FN_STATE_ONLINE) |
| 715 | return 0; | 718 | return 0; |
| 716 | 719 | ||
| 717 | zpci_unregister_ioat(zdev, 0); | 720 | zpci_unregister_ioat(zdev, 0); |
| 721 | zpci_unmap_resources(pdev); | ||
| 718 | return clp_disable_fh(zdev); | 722 | return clp_disable_fh(zdev); |
| 719 | } | 723 | } |
| 720 | 724 | ||
diff --git a/arch/s390/pci/pci_mmio.c b/arch/s390/pci/pci_mmio.c index 8aa271b3d1ad..b1bb2b72302c 100644 --- a/arch/s390/pci/pci_mmio.c +++ b/arch/s390/pci/pci_mmio.c | |||
| @@ -64,8 +64,7 @@ SYSCALL_DEFINE3(s390_pci_mmio_write, unsigned long, mmio_addr, | |||
| 64 | if (copy_from_user(buf, user_buffer, length)) | 64 | if (copy_from_user(buf, user_buffer, length)) |
| 65 | goto out; | 65 | goto out; |
| 66 | 66 | ||
| 67 | memcpy_toio(io_addr, buf, length); | 67 | ret = zpci_memcpy_toio(io_addr, buf, length); |
| 68 | ret = 0; | ||
| 69 | out: | 68 | out: |
| 70 | if (buf != local_buf) | 69 | if (buf != local_buf) |
| 71 | kfree(buf); | 70 | kfree(buf); |
| @@ -98,16 +97,16 @@ SYSCALL_DEFINE3(s390_pci_mmio_read, unsigned long, mmio_addr, | |||
| 98 | goto out; | 97 | goto out; |
| 99 | io_addr = (void __iomem *)((pfn << PAGE_SHIFT) | (mmio_addr & ~PAGE_MASK)); | 98 | io_addr = (void __iomem *)((pfn << PAGE_SHIFT) | (mmio_addr & ~PAGE_MASK)); |
| 100 | 99 | ||
| 101 | ret = -EFAULT; | 100 | if ((unsigned long) io_addr < ZPCI_IOMAP_ADDR_BASE) { |
| 102 | if ((unsigned long) io_addr < ZPCI_IOMAP_ADDR_BASE) | 101 | ret = -EFAULT; |
| 103 | goto out; | 102 | goto out; |
| 104 | 103 | } | |
| 105 | memcpy_fromio(buf, io_addr, length); | 104 | ret = zpci_memcpy_fromio(buf, io_addr, length); |
| 106 | 105 | if (ret) | |
| 107 | if (copy_to_user(user_buffer, buf, length)) | ||
| 108 | goto out; | 106 | goto out; |
| 107 | if (copy_to_user(user_buffer, buf, length)) | ||
| 108 | ret = -EFAULT; | ||
| 109 | 109 | ||
| 110 | ret = 0; | ||
| 111 | out: | 110 | out: |
| 112 | if (buf != local_buf) | 111 | if (buf != local_buf) |
| 113 | kfree(buf); | 112 | kfree(buf); |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index c2fb8a87dccb..b7d31ca55187 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -499,6 +499,7 @@ config X86_INTEL_QUARK | |||
| 499 | depends on X86_IO_APIC | 499 | depends on X86_IO_APIC |
| 500 | select IOSF_MBI | 500 | select IOSF_MBI |
| 501 | select INTEL_IMR | 501 | select INTEL_IMR |
| 502 | select COMMON_CLK | ||
| 502 | ---help--- | 503 | ---help--- |
| 503 | Select to include support for Quark X1000 SoC. | 504 | Select to include support for Quark X1000 SoC. |
| 504 | Say Y here if you have a Quark based system such as the Arduino | 505 | Say Y here if you have a Quark based system such as the Arduino |
diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h index 5fa9770035dc..c9a6d68b8d62 100644 --- a/arch/x86/include/asm/xsave.h +++ b/arch/x86/include/asm/xsave.h | |||
| @@ -82,18 +82,15 @@ static inline int xsave_state_booting(struct xsave_struct *fx, u64 mask) | |||
| 82 | if (boot_cpu_has(X86_FEATURE_XSAVES)) | 82 | if (boot_cpu_has(X86_FEATURE_XSAVES)) |
| 83 | asm volatile("1:"XSAVES"\n\t" | 83 | asm volatile("1:"XSAVES"\n\t" |
| 84 | "2:\n\t" | 84 | "2:\n\t" |
| 85 | : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | 85 | xstate_fault |
| 86 | : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | ||
| 86 | : "memory"); | 87 | : "memory"); |
| 87 | else | 88 | else |
| 88 | asm volatile("1:"XSAVE"\n\t" | 89 | asm volatile("1:"XSAVE"\n\t" |
| 89 | "2:\n\t" | 90 | "2:\n\t" |
| 90 | : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | 91 | xstate_fault |
| 92 | : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | ||
| 91 | : "memory"); | 93 | : "memory"); |
| 92 | |||
| 93 | asm volatile(xstate_fault | ||
| 94 | : "0" (0) | ||
| 95 | : "memory"); | ||
| 96 | |||
| 97 | return err; | 94 | return err; |
| 98 | } | 95 | } |
| 99 | 96 | ||
| @@ -112,18 +109,15 @@ static inline int xrstor_state_booting(struct xsave_struct *fx, u64 mask) | |||
| 112 | if (boot_cpu_has(X86_FEATURE_XSAVES)) | 109 | if (boot_cpu_has(X86_FEATURE_XSAVES)) |
| 113 | asm volatile("1:"XRSTORS"\n\t" | 110 | asm volatile("1:"XRSTORS"\n\t" |
| 114 | "2:\n\t" | 111 | "2:\n\t" |
| 115 | : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | 112 | xstate_fault |
| 113 | : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | ||
| 116 | : "memory"); | 114 | : "memory"); |
| 117 | else | 115 | else |
| 118 | asm volatile("1:"XRSTOR"\n\t" | 116 | asm volatile("1:"XRSTOR"\n\t" |
| 119 | "2:\n\t" | 117 | "2:\n\t" |
| 120 | : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | 118 | xstate_fault |
| 119 | : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | ||
| 121 | : "memory"); | 120 | : "memory"); |
| 122 | |||
| 123 | asm volatile(xstate_fault | ||
| 124 | : "0" (0) | ||
| 125 | : "memory"); | ||
| 126 | |||
| 127 | return err; | 121 | return err; |
| 128 | } | 122 | } |
| 129 | 123 | ||
| @@ -149,9 +143,9 @@ static inline int xsave_state(struct xsave_struct *fx, u64 mask) | |||
| 149 | */ | 143 | */ |
| 150 | alternative_input_2( | 144 | alternative_input_2( |
| 151 | "1:"XSAVE, | 145 | "1:"XSAVE, |
| 152 | "1:"XSAVEOPT, | 146 | XSAVEOPT, |
| 153 | X86_FEATURE_XSAVEOPT, | 147 | X86_FEATURE_XSAVEOPT, |
| 154 | "1:"XSAVES, | 148 | XSAVES, |
| 155 | X86_FEATURE_XSAVES, | 149 | X86_FEATURE_XSAVES, |
| 156 | [fx] "D" (fx), "a" (lmask), "d" (hmask) : | 150 | [fx] "D" (fx), "a" (lmask), "d" (hmask) : |
| 157 | "memory"); | 151 | "memory"); |
| @@ -178,7 +172,7 @@ static inline int xrstor_state(struct xsave_struct *fx, u64 mask) | |||
| 178 | */ | 172 | */ |
| 179 | alternative_input( | 173 | alternative_input( |
| 180 | "1: " XRSTOR, | 174 | "1: " XRSTOR, |
| 181 | "1: " XRSTORS, | 175 | XRSTORS, |
| 182 | X86_FEATURE_XSAVES, | 176 | X86_FEATURE_XSAVES, |
| 183 | "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | 177 | "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) |
| 184 | : "memory"); | 178 | : "memory"); |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index b5c8ff5e9dfc..2346c95c6ab1 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -1396,6 +1396,12 @@ void cpu_init(void) | |||
| 1396 | 1396 | ||
| 1397 | wait_for_master_cpu(cpu); | 1397 | wait_for_master_cpu(cpu); |
| 1398 | 1398 | ||
| 1399 | /* | ||
| 1400 | * Initialize the CR4 shadow before doing anything that could | ||
| 1401 | * try to read it. | ||
| 1402 | */ | ||
| 1403 | cr4_init_shadow(); | ||
| 1404 | |||
| 1399 | show_ucode_info_early(); | 1405 | show_ucode_info_early(); |
| 1400 | 1406 | ||
| 1401 | printk(KERN_INFO "Initializing CPU#%d\n", cpu); | 1407 | printk(KERN_INFO "Initializing CPU#%d\n", cpu); |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 94d7dcb12145..50163fa9034f 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
| @@ -565,8 +565,8 @@ static const struct _tlb_table intel_tlb_table[] = { | |||
| 565 | { 0xb2, TLB_INST_4K, 64, " TLB_INST 4KByte pages, 4-way set associative" }, | 565 | { 0xb2, TLB_INST_4K, 64, " TLB_INST 4KByte pages, 4-way set associative" }, |
| 566 | { 0xb3, TLB_DATA_4K, 128, " TLB_DATA 4 KByte pages, 4-way set associative" }, | 566 | { 0xb3, TLB_DATA_4K, 128, " TLB_DATA 4 KByte pages, 4-way set associative" }, |
| 567 | { 0xb4, TLB_DATA_4K, 256, " TLB_DATA 4 KByte pages, 4-way associative" }, | 567 | { 0xb4, TLB_DATA_4K, 256, " TLB_DATA 4 KByte pages, 4-way associative" }, |
| 568 | { 0xb5, TLB_INST_4K, 64, " TLB_INST 4 KByte pages, 8-way set ssociative" }, | 568 | { 0xb5, TLB_INST_4K, 64, " TLB_INST 4 KByte pages, 8-way set associative" }, |
| 569 | { 0xb6, TLB_INST_4K, 128, " TLB_INST 4 KByte pages, 8-way set ssociative" }, | 569 | { 0xb6, TLB_INST_4K, 128, " TLB_INST 4 KByte pages, 8-way set associative" }, |
| 570 | { 0xba, TLB_DATA_4K, 64, " TLB_DATA 4 KByte pages, 4-way associative" }, | 570 | { 0xba, TLB_DATA_4K, 64, " TLB_DATA 4 KByte pages, 4-way associative" }, |
| 571 | { 0xc0, TLB_DATA_4K_4M, 8, " TLB_DATA 4 KByte and 4 MByte pages, 4-way associative" }, | 571 | { 0xc0, TLB_DATA_4K_4M, 8, " TLB_DATA 4 KByte and 4 MByte pages, 4-way associative" }, |
| 572 | { 0xc1, STLB_4K_2M, 1024, " STLB 4 KByte and 2 MByte pages, 8-way associative" }, | 572 | { 0xc1, STLB_4K_2M, 1024, " STLB 4 KByte and 2 MByte pages, 8-way associative" }, |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 000d4199b03e..31e2d5bf3e38 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -982,6 +982,9 @@ ENTRY(xen_hypervisor_callback) | |||
| 982 | ENTRY(xen_do_upcall) | 982 | ENTRY(xen_do_upcall) |
| 983 | 1: mov %esp, %eax | 983 | 1: mov %esp, %eax |
| 984 | call xen_evtchn_do_upcall | 984 | call xen_evtchn_do_upcall |
| 985 | #ifndef CONFIG_PREEMPT | ||
| 986 | call xen_maybe_preempt_hcall | ||
| 987 | #endif | ||
| 985 | jmp ret_from_intr | 988 | jmp ret_from_intr |
| 986 | CFI_ENDPROC | 989 | CFI_ENDPROC |
| 987 | ENDPROC(xen_hypervisor_callback) | 990 | ENDPROC(xen_hypervisor_callback) |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index db13655c3a2a..1d74d161687c 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -269,11 +269,14 @@ ENTRY(ret_from_fork) | |||
| 269 | testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread? | 269 | testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread? |
| 270 | jz 1f | 270 | jz 1f |
| 271 | 271 | ||
| 272 | testl $_TIF_IA32, TI_flags(%rcx) # 32-bit compat task needs IRET | 272 | /* |
| 273 | jnz int_ret_from_sys_call | 273 | * By the time we get here, we have no idea whether our pt_regs, |
| 274 | 274 | * ti flags, and ti status came from the 64-bit SYSCALL fast path, | |
| 275 | RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET | 275 | * the slow path, or one of the ia32entry paths. |
| 276 | jmp ret_from_sys_call # go to the SYSRET fastpath | 276 | * Use int_ret_from_sys_call to return, since it can safely handle |
| 277 | * all of the above. | ||
| 278 | */ | ||
| 279 | jmp int_ret_from_sys_call | ||
| 277 | 280 | ||
| 278 | 1: | 281 | 1: |
| 279 | subq $REST_SKIP, %rsp # leave space for volatiles | 282 | subq $REST_SKIP, %rsp # leave space for volatiles |
| @@ -1208,6 +1211,9 @@ ENTRY(xen_do_hypervisor_callback) # do_hypervisor_callback(struct *pt_regs) | |||
| 1208 | popq %rsp | 1211 | popq %rsp |
| 1209 | CFI_DEF_CFA_REGISTER rsp | 1212 | CFI_DEF_CFA_REGISTER rsp |
| 1210 | decl PER_CPU_VAR(irq_count) | 1213 | decl PER_CPU_VAR(irq_count) |
| 1214 | #ifndef CONFIG_PREEMPT | ||
| 1215 | call xen_maybe_preempt_hcall | ||
| 1216 | #endif | ||
| 1211 | jmp error_exit | 1217 | jmp error_exit |
| 1212 | CFI_ENDPROC | 1218 | CFI_ENDPROC |
| 1213 | END(xen_do_hypervisor_callback) | 1219 | END(xen_do_hypervisor_callback) |
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index 6a1146ea4d4d..4e3d5a9621fe 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c | |||
| @@ -223,27 +223,48 @@ static unsigned long | |||
| 223 | __recover_probed_insn(kprobe_opcode_t *buf, unsigned long addr) | 223 | __recover_probed_insn(kprobe_opcode_t *buf, unsigned long addr) |
| 224 | { | 224 | { |
| 225 | struct kprobe *kp; | 225 | struct kprobe *kp; |
| 226 | unsigned long faddr; | ||
| 226 | 227 | ||
| 227 | kp = get_kprobe((void *)addr); | 228 | kp = get_kprobe((void *)addr); |
| 228 | /* There is no probe, return original address */ | 229 | faddr = ftrace_location(addr); |
| 229 | if (!kp) | 230 | /* |
| 231 | * Addresses inside the ftrace location are refused by | ||
| 232 | * arch_check_ftrace_location(). Something went terribly wrong | ||
| 233 | * if such an address is checked here. | ||
| 234 | */ | ||
| 235 | if (WARN_ON(faddr && faddr != addr)) | ||
| 236 | return 0UL; | ||
| 237 | /* | ||
| 238 | * Use the current code if it is not modified by Kprobe | ||
| 239 | * and it cannot be modified by ftrace. | ||
| 240 | */ | ||
| 241 | if (!kp && !faddr) | ||
| 230 | return addr; | 242 | return addr; |
| 231 | 243 | ||
| 232 | /* | 244 | /* |
| 233 | * Basically, kp->ainsn.insn has an original instruction. | 245 | * Basically, kp->ainsn.insn has an original instruction. |
| 234 | * However, RIP-relative instruction can not do single-stepping | 246 | * However, RIP-relative instruction can not do single-stepping |
| 235 | * at different place, __copy_instruction() tweaks the displacement of | 247 | * at different place, __copy_instruction() tweaks the displacement of |
| 236 | * that instruction. In that case, we can't recover the instruction | 248 | * that instruction. In that case, we can't recover the instruction |
| 237 | * from the kp->ainsn.insn. | 249 | * from the kp->ainsn.insn. |
| 238 | * | 250 | * |
| 239 | * On the other hand, kp->opcode has a copy of the first byte of | 251 | * On the other hand, in case on normal Kprobe, kp->opcode has a copy |
| 240 | * the probed instruction, which is overwritten by int3. And | 252 | * of the first byte of the probed instruction, which is overwritten |
| 241 | * the instruction at kp->addr is not modified by kprobes except | 253 | * by int3. And the instruction at kp->addr is not modified by kprobes |
| 242 | * for the first byte, we can recover the original instruction | 254 | * except for the first byte, we can recover the original instruction |
| 243 | * from it and kp->opcode. | 255 | * from it and kp->opcode. |
| 256 | * | ||
| 257 | * In case of Kprobes using ftrace, we do not have a copy of | ||
| 258 | * the original instruction. In fact, the ftrace location might | ||
| 259 | * be modified at anytime and even could be in an inconsistent state. | ||
| 260 | * Fortunately, we know that the original code is the ideal 5-byte | ||
| 261 | * long NOP. | ||
| 244 | */ | 262 | */ |
| 245 | memcpy(buf, kp->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); | 263 | memcpy(buf, (void *)addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); |
| 246 | buf[0] = kp->opcode; | 264 | if (faddr) |
| 265 | memcpy(buf, ideal_nops[NOP_ATOMIC5], 5); | ||
| 266 | else | ||
| 267 | buf[0] = kp->opcode; | ||
| 247 | return (unsigned long)buf; | 268 | return (unsigned long)buf; |
| 248 | } | 269 | } |
| 249 | 270 | ||
| @@ -251,6 +272,7 @@ __recover_probed_insn(kprobe_opcode_t *buf, unsigned long addr) | |||
| 251 | * Recover the probed instruction at addr for further analysis. | 272 | * Recover the probed instruction at addr for further analysis. |
| 252 | * Caller must lock kprobes by kprobe_mutex, or disable preemption | 273 | * Caller must lock kprobes by kprobe_mutex, or disable preemption |
| 253 | * for preventing to release referencing kprobes. | 274 | * for preventing to release referencing kprobes. |
| 275 | * Returns zero if the instruction can not get recovered. | ||
| 254 | */ | 276 | */ |
| 255 | unsigned long recover_probed_instruction(kprobe_opcode_t *buf, unsigned long addr) | 277 | unsigned long recover_probed_instruction(kprobe_opcode_t *buf, unsigned long addr) |
| 256 | { | 278 | { |
| @@ -285,6 +307,8 @@ static int can_probe(unsigned long paddr) | |||
| 285 | * normally used, we just go through if there is no kprobe. | 307 | * normally used, we just go through if there is no kprobe. |
| 286 | */ | 308 | */ |
| 287 | __addr = recover_probed_instruction(buf, addr); | 309 | __addr = recover_probed_instruction(buf, addr); |
| 310 | if (!__addr) | ||
| 311 | return 0; | ||
| 288 | kernel_insn_init(&insn, (void *)__addr, MAX_INSN_SIZE); | 312 | kernel_insn_init(&insn, (void *)__addr, MAX_INSN_SIZE); |
| 289 | insn_get_length(&insn); | 313 | insn_get_length(&insn); |
| 290 | 314 | ||
| @@ -333,6 +357,8 @@ int __copy_instruction(u8 *dest, u8 *src) | |||
| 333 | unsigned long recovered_insn = | 357 | unsigned long recovered_insn = |
| 334 | recover_probed_instruction(buf, (unsigned long)src); | 358 | recover_probed_instruction(buf, (unsigned long)src); |
| 335 | 359 | ||
| 360 | if (!recovered_insn) | ||
| 361 | return 0; | ||
| 336 | kernel_insn_init(&insn, (void *)recovered_insn, MAX_INSN_SIZE); | 362 | kernel_insn_init(&insn, (void *)recovered_insn, MAX_INSN_SIZE); |
| 337 | insn_get_length(&insn); | 363 | insn_get_length(&insn); |
| 338 | /* Another subsystem puts a breakpoint, failed to recover */ | 364 | /* Another subsystem puts a breakpoint, failed to recover */ |
diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c index 0dd8d089c315..7b3b9d15c47a 100644 --- a/arch/x86/kernel/kprobes/opt.c +++ b/arch/x86/kernel/kprobes/opt.c | |||
| @@ -259,6 +259,8 @@ static int can_optimize(unsigned long paddr) | |||
| 259 | */ | 259 | */ |
| 260 | return 0; | 260 | return 0; |
| 261 | recovered_insn = recover_probed_instruction(buf, addr); | 261 | recovered_insn = recover_probed_instruction(buf, addr); |
| 262 | if (!recovered_insn) | ||
| 263 | return 0; | ||
| 262 | kernel_insn_init(&insn, (void *)recovered_insn, MAX_INSN_SIZE); | 264 | kernel_insn_init(&insn, (void *)recovered_insn, MAX_INSN_SIZE); |
| 263 | insn_get_length(&insn); | 265 | insn_get_length(&insn); |
| 264 | /* Another subsystem puts a breakpoint */ | 266 | /* Another subsystem puts a breakpoint */ |
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index e0b794a84c35..106c01557f2b 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
| @@ -4950,7 +4950,8 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) | |||
| 4950 | goto done; | 4950 | goto done; |
| 4951 | } | 4951 | } |
| 4952 | } | 4952 | } |
| 4953 | ctxt->dst.orig_val = ctxt->dst.val; | 4953 | /* Copy full 64-bit value for CMPXCHG8B. */ |
| 4954 | ctxt->dst.orig_val64 = ctxt->dst.val64; | ||
| 4954 | 4955 | ||
| 4955 | special_insn: | 4956 | special_insn: |
| 4956 | 4957 | ||
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index e55b5fc344eb..bd4e34de24c7 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
| @@ -1572,7 +1572,7 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu) | |||
| 1572 | apic_set_reg(apic, APIC_TMR + 0x10 * i, 0); | 1572 | apic_set_reg(apic, APIC_TMR + 0x10 * i, 0); |
| 1573 | } | 1573 | } |
| 1574 | apic->irr_pending = kvm_apic_vid_enabled(vcpu->kvm); | 1574 | apic->irr_pending = kvm_apic_vid_enabled(vcpu->kvm); |
| 1575 | apic->isr_count = kvm_apic_vid_enabled(vcpu->kvm); | 1575 | apic->isr_count = kvm_x86_ops->hwapic_isr_update ? 1 : 0; |
| 1576 | apic->highest_isr_cache = -1; | 1576 | apic->highest_isr_cache = -1; |
| 1577 | update_divide_count(apic); | 1577 | update_divide_count(apic); |
| 1578 | atomic_set(&apic->lapic_timer.pending, 0); | 1578 | atomic_set(&apic->lapic_timer.pending, 0); |
| @@ -1782,7 +1782,7 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu, | |||
| 1782 | update_divide_count(apic); | 1782 | update_divide_count(apic); |
| 1783 | start_apic_timer(apic); | 1783 | start_apic_timer(apic); |
| 1784 | apic->irr_pending = true; | 1784 | apic->irr_pending = true; |
| 1785 | apic->isr_count = kvm_apic_vid_enabled(vcpu->kvm) ? | 1785 | apic->isr_count = kvm_x86_ops->hwapic_isr_update ? |
| 1786 | 1 : count_vectors(apic->regs + APIC_ISR); | 1786 | 1 : count_vectors(apic->regs + APIC_ISR); |
| 1787 | apic->highest_isr_cache = -1; | 1787 | apic->highest_isr_cache = -1; |
| 1788 | if (kvm_x86_ops->hwapic_irr_update) | 1788 | if (kvm_x86_ops->hwapic_irr_update) |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index d319e0c24758..cc618c882f90 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -3649,11 +3649,6 @@ static void svm_load_eoi_exitmap(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap) | |||
| 3649 | return; | 3649 | return; |
| 3650 | } | 3650 | } |
| 3651 | 3651 | ||
| 3652 | static void svm_hwapic_isr_update(struct kvm *kvm, int isr) | ||
| 3653 | { | ||
| 3654 | return; | ||
| 3655 | } | ||
| 3656 | |||
| 3657 | static void svm_sync_pir_to_irr(struct kvm_vcpu *vcpu) | 3652 | static void svm_sync_pir_to_irr(struct kvm_vcpu *vcpu) |
| 3658 | { | 3653 | { |
| 3659 | return; | 3654 | return; |
| @@ -4403,7 +4398,6 @@ static struct kvm_x86_ops svm_x86_ops = { | |||
| 4403 | .set_virtual_x2apic_mode = svm_set_virtual_x2apic_mode, | 4398 | .set_virtual_x2apic_mode = svm_set_virtual_x2apic_mode, |
| 4404 | .vm_has_apicv = svm_vm_has_apicv, | 4399 | .vm_has_apicv = svm_vm_has_apicv, |
| 4405 | .load_eoi_exitmap = svm_load_eoi_exitmap, | 4400 | .load_eoi_exitmap = svm_load_eoi_exitmap, |
| 4406 | .hwapic_isr_update = svm_hwapic_isr_update, | ||
| 4407 | .sync_pir_to_irr = svm_sync_pir_to_irr, | 4401 | .sync_pir_to_irr = svm_sync_pir_to_irr, |
| 4408 | 4402 | ||
| 4409 | .set_tss_addr = svm_set_tss_addr, | 4403 | .set_tss_addr = svm_set_tss_addr, |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 14c1a18d206a..f7b20b417a3a 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -4367,6 +4367,18 @@ static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) | |||
| 4367 | return 0; | 4367 | return 0; |
| 4368 | } | 4368 | } |
| 4369 | 4369 | ||
| 4370 | static inline bool kvm_vcpu_trigger_posted_interrupt(struct kvm_vcpu *vcpu) | ||
| 4371 | { | ||
| 4372 | #ifdef CONFIG_SMP | ||
| 4373 | if (vcpu->mode == IN_GUEST_MODE) { | ||
| 4374 | apic->send_IPI_mask(get_cpu_mask(vcpu->cpu), | ||
| 4375 | POSTED_INTR_VECTOR); | ||
| 4376 | return true; | ||
| 4377 | } | ||
| 4378 | #endif | ||
| 4379 | return false; | ||
| 4380 | } | ||
| 4381 | |||
| 4370 | static int vmx_deliver_nested_posted_interrupt(struct kvm_vcpu *vcpu, | 4382 | static int vmx_deliver_nested_posted_interrupt(struct kvm_vcpu *vcpu, |
| 4371 | int vector) | 4383 | int vector) |
| 4372 | { | 4384 | { |
| @@ -4375,9 +4387,7 @@ static int vmx_deliver_nested_posted_interrupt(struct kvm_vcpu *vcpu, | |||
| 4375 | if (is_guest_mode(vcpu) && | 4387 | if (is_guest_mode(vcpu) && |
| 4376 | vector == vmx->nested.posted_intr_nv) { | 4388 | vector == vmx->nested.posted_intr_nv) { |
| 4377 | /* the PIR and ON have been set by L1. */ | 4389 | /* the PIR and ON have been set by L1. */ |
| 4378 | if (vcpu->mode == IN_GUEST_MODE) | 4390 | kvm_vcpu_trigger_posted_interrupt(vcpu); |
| 4379 | apic->send_IPI_mask(get_cpu_mask(vcpu->cpu), | ||
| 4380 | POSTED_INTR_VECTOR); | ||
| 4381 | /* | 4391 | /* |
| 4382 | * If a posted intr is not recognized by hardware, | 4392 | * If a posted intr is not recognized by hardware, |
| 4383 | * we will accomplish it in the next vmentry. | 4393 | * we will accomplish it in the next vmentry. |
| @@ -4409,12 +4419,7 @@ static void vmx_deliver_posted_interrupt(struct kvm_vcpu *vcpu, int vector) | |||
| 4409 | 4419 | ||
| 4410 | r = pi_test_and_set_on(&vmx->pi_desc); | 4420 | r = pi_test_and_set_on(&vmx->pi_desc); |
| 4411 | kvm_make_request(KVM_REQ_EVENT, vcpu); | 4421 | kvm_make_request(KVM_REQ_EVENT, vcpu); |
| 4412 | #ifdef CONFIG_SMP | 4422 | if (r || !kvm_vcpu_trigger_posted_interrupt(vcpu)) |
| 4413 | if (!r && (vcpu->mode == IN_GUEST_MODE)) | ||
| 4414 | apic->send_IPI_mask(get_cpu_mask(vcpu->cpu), | ||
| 4415 | POSTED_INTR_VECTOR); | ||
| 4416 | else | ||
| 4417 | #endif | ||
| 4418 | kvm_vcpu_kick(vcpu); | 4423 | kvm_vcpu_kick(vcpu); |
| 4419 | } | 4424 | } |
| 4420 | 4425 | ||
diff --git a/arch/x86/lguest/Kconfig b/arch/x86/lguest/Kconfig index 4a0890f815c4..08f41caada45 100644 --- a/arch/x86/lguest/Kconfig +++ b/arch/x86/lguest/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config LGUEST_GUEST | 1 | config LGUEST_GUEST |
| 2 | bool "Lguest guest support" | 2 | bool "Lguest guest support" |
| 3 | depends on X86_32 && PARAVIRT | 3 | depends on X86_32 && PARAVIRT && PCI |
| 4 | select TTY | 4 | select TTY |
| 5 | select VIRTUALIZATION | 5 | select VIRTUALIZATION |
| 6 | select VIRTIO | 6 | select VIRTIO |
| @@ -8,7 +8,7 @@ config LGUEST_GUEST | |||
| 8 | help | 8 | help |
| 9 | Lguest is a tiny in-kernel hypervisor. Selecting this will | 9 | Lguest is a tiny in-kernel hypervisor. Selecting this will |
| 10 | allow your kernel to boot under lguest. This option will increase | 10 | allow your kernel to boot under lguest. This option will increase |
| 11 | your kernel size by about 6k. If in doubt, say N. | 11 | your kernel size by about 10k. If in doubt, say N. |
| 12 | 12 | ||
| 13 | If you say Y here, make sure you say Y (or M) to the virtio block | 13 | If you say Y here, make sure you say Y (or M) to the virtio block |
| 14 | and net drivers which lguest needs. | 14 | and net drivers which lguest needs. |
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 6ac273832f28..e4695985f9de 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
| @@ -331,7 +331,7 @@ static void probe_pci_root_info(struct pci_root_info *info, | |||
| 331 | struct list_head *list) | 331 | struct list_head *list) |
| 332 | { | 332 | { |
| 333 | int ret; | 333 | int ret; |
| 334 | struct resource_entry *entry; | 334 | struct resource_entry *entry, *tmp; |
| 335 | 335 | ||
| 336 | sprintf(info->name, "PCI Bus %04x:%02x", domain, busnum); | 336 | sprintf(info->name, "PCI Bus %04x:%02x", domain, busnum); |
| 337 | info->bridge = device; | 337 | info->bridge = device; |
| @@ -345,8 +345,13 @@ static void probe_pci_root_info(struct pci_root_info *info, | |||
| 345 | dev_dbg(&device->dev, | 345 | dev_dbg(&device->dev, |
| 346 | "no IO and memory resources present in _CRS\n"); | 346 | "no IO and memory resources present in _CRS\n"); |
| 347 | else | 347 | else |
| 348 | resource_list_for_each_entry(entry, list) | 348 | resource_list_for_each_entry_safe(entry, tmp, list) { |
| 349 | entry->res->name = info->name; | 349 | if ((entry->res->flags & IORESOURCE_WINDOW) == 0 || |
| 350 | (entry->res->flags & IORESOURCE_DISABLED)) | ||
| 351 | resource_list_destroy_entry(entry); | ||
| 352 | else | ||
| 353 | entry->res->name = info->name; | ||
| 354 | } | ||
| 350 | } | 355 | } |
| 351 | 356 | ||
| 352 | struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) | 357 | struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) |
diff --git a/arch/x86/platform/intel-mid/intel-mid.c b/arch/x86/platform/intel-mid/intel-mid.c index 1bbedc4b0f88..3005f0c89f2e 100644 --- a/arch/x86/platform/intel-mid/intel-mid.c +++ b/arch/x86/platform/intel-mid/intel-mid.c | |||
| @@ -130,7 +130,7 @@ static void intel_mid_arch_setup(void) | |||
| 130 | intel_mid_ops = get_intel_mid_ops[__intel_mid_cpu_chip](); | 130 | intel_mid_ops = get_intel_mid_ops[__intel_mid_cpu_chip](); |
| 131 | else { | 131 | else { |
| 132 | intel_mid_ops = get_intel_mid_ops[INTEL_MID_CPU_CHIP_PENWELL](); | 132 | intel_mid_ops = get_intel_mid_ops[INTEL_MID_CPU_CHIP_PENWELL](); |
| 133 | pr_info("ARCH: Uknown SoC, assuming PENWELL!\n"); | 133 | pr_info("ARCH: Unknown SoC, assuming PENWELL!\n"); |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | out: | 136 | out: |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index bd8b8459c3d0..5240f563076d 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -1070,6 +1070,23 @@ static inline void xen_write_cr8(unsigned long val) | |||
| 1070 | BUG_ON(val); | 1070 | BUG_ON(val); |
| 1071 | } | 1071 | } |
| 1072 | #endif | 1072 | #endif |
| 1073 | |||
| 1074 | static u64 xen_read_msr_safe(unsigned int msr, int *err) | ||
| 1075 | { | ||
| 1076 | u64 val; | ||
| 1077 | |||
| 1078 | val = native_read_msr_safe(msr, err); | ||
| 1079 | switch (msr) { | ||
| 1080 | case MSR_IA32_APICBASE: | ||
| 1081 | #ifdef CONFIG_X86_X2APIC | ||
| 1082 | if (!(cpuid_ecx(1) & (1 << (X86_FEATURE_X2APIC & 31)))) | ||
| 1083 | #endif | ||
| 1084 | val &= ~X2APIC_ENABLE; | ||
| 1085 | break; | ||
| 1086 | } | ||
| 1087 | return val; | ||
| 1088 | } | ||
| 1089 | |||
| 1073 | static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) | 1090 | static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) |
| 1074 | { | 1091 | { |
| 1075 | int ret; | 1092 | int ret; |
| @@ -1240,7 +1257,7 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = { | |||
| 1240 | 1257 | ||
| 1241 | .wbinvd = native_wbinvd, | 1258 | .wbinvd = native_wbinvd, |
| 1242 | 1259 | ||
| 1243 | .read_msr = native_read_msr_safe, | 1260 | .read_msr = xen_read_msr_safe, |
| 1244 | .write_msr = xen_write_msr_safe, | 1261 | .write_msr = xen_write_msr_safe, |
| 1245 | 1262 | ||
| 1246 | .read_tsc = native_read_tsc, | 1263 | .read_tsc = native_read_tsc, |
| @@ -1741,6 +1758,7 @@ asmlinkage __visible void __init xen_start_kernel(void) | |||
| 1741 | #ifdef CONFIG_X86_32 | 1758 | #ifdef CONFIG_X86_32 |
| 1742 | i386_start_kernel(); | 1759 | i386_start_kernel(); |
| 1743 | #else | 1760 | #else |
| 1761 | cr4_init_shadow(); /* 32b kernel does this in i386_start_kernel() */ | ||
| 1744 | x86_64_start_reservations((char *)__pa_symbol(&boot_params)); | 1762 | x86_64_start_reservations((char *)__pa_symbol(&boot_params)); |
| 1745 | #endif | 1763 | #endif |
| 1746 | } | 1764 | } |
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index 740ae3026a14..9f93af56a5fc 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c | |||
| @@ -563,7 +563,7 @@ static bool alloc_p2m(unsigned long pfn) | |||
| 563 | if (p2m_pfn == PFN_DOWN(__pa(p2m_missing))) | 563 | if (p2m_pfn == PFN_DOWN(__pa(p2m_missing))) |
| 564 | p2m_init(p2m); | 564 | p2m_init(p2m); |
| 565 | else | 565 | else |
| 566 | p2m_init_identity(p2m, pfn); | 566 | p2m_init_identity(p2m, pfn & ~(P2M_PER_PAGE - 1)); |
| 567 | 567 | ||
| 568 | spin_lock_irqsave(&p2m_update_lock, flags); | 568 | spin_lock_irqsave(&p2m_update_lock, flags); |
| 569 | 569 | ||
