diff options
Diffstat (limited to 'arch')
107 files changed, 707 insertions, 309 deletions
diff --git a/arch/arm/common/it8152.c b/arch/arm/common/it8152.c index d1bcd7b13ebc..fb1f1cfce60c 100644 --- a/arch/arm/common/it8152.c +++ b/arch/arm/common/it8152.c | |||
| @@ -320,13 +320,6 @@ err0: | |||
| 320 | return -EBUSY; | 320 | return -EBUSY; |
| 321 | } | 321 | } |
| 322 | 322 | ||
| 323 | /* | ||
| 324 | * If we set up a device for bus mastering, we need to check the latency | ||
| 325 | * timer as we don't have even crappy BIOSes to set it properly. | ||
| 326 | * The implementation is from arch/i386/pci/i386.c | ||
| 327 | */ | ||
| 328 | unsigned int pcibios_max_latency = 255; | ||
| 329 | |||
| 330 | /* ITE bridge requires setting latency timer to avoid early bus access | 323 | /* ITE bridge requires setting latency timer to avoid early bus access |
| 331 | termination by PCI bus master devices | 324 | termination by PCI bus master devices |
| 332 | */ | 325 | */ |
diff --git a/arch/arm/common/pl330.c b/arch/arm/common/pl330.c index d8e44a43047c..ff3ad2244824 100644 --- a/arch/arm/common/pl330.c +++ b/arch/arm/common/pl330.c | |||
| @@ -1502,12 +1502,13 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op) | |||
| 1502 | struct pl330_thread *thrd = ch_id; | 1502 | struct pl330_thread *thrd = ch_id; |
| 1503 | struct pl330_dmac *pl330; | 1503 | struct pl330_dmac *pl330; |
| 1504 | unsigned long flags; | 1504 | unsigned long flags; |
| 1505 | int ret = 0, active = thrd->req_running; | 1505 | int ret = 0, active; |
| 1506 | 1506 | ||
| 1507 | if (!thrd || thrd->free || thrd->dmac->state == DYING) | 1507 | if (!thrd || thrd->free || thrd->dmac->state == DYING) |
| 1508 | return -EINVAL; | 1508 | return -EINVAL; |
| 1509 | 1509 | ||
| 1510 | pl330 = thrd->dmac; | 1510 | pl330 = thrd->dmac; |
| 1511 | active = thrd->req_running; | ||
| 1511 | 1512 | ||
| 1512 | spin_lock_irqsave(&pl330->lock, flags); | 1513 | spin_lock_irqsave(&pl330->lock, flags); |
| 1513 | 1514 | ||
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 62f8095d46de..23371b17b23e 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
| @@ -137,6 +137,11 @@ | |||
| 137 | disable_irq | 137 | disable_irq |
| 138 | .endm | 138 | .endm |
| 139 | 139 | ||
| 140 | .macro save_and_disable_irqs_notrace, oldcpsr | ||
| 141 | mrs \oldcpsr, cpsr | ||
| 142 | disable_irq_notrace | ||
| 143 | .endm | ||
| 144 | |||
| 140 | /* | 145 | /* |
| 141 | * Restore interrupt state previously stored in a register. We don't | 146 | * Restore interrupt state previously stored in a register. We don't |
| 142 | * guarantee that this will preserve the flags. | 147 | * guarantee that this will preserve the flags. |
diff --git a/arch/arm/include/asm/hardware/pl330.h b/arch/arm/include/asm/hardware/pl330.h index 575fa8186ca0..c1821385abfa 100644 --- a/arch/arm/include/asm/hardware/pl330.h +++ b/arch/arm/include/asm/hardware/pl330.h | |||
| @@ -41,7 +41,7 @@ enum pl330_dstcachectrl { | |||
| 41 | DCCTRL1, /* Bufferable only */ | 41 | DCCTRL1, /* Bufferable only */ |
| 42 | DCCTRL2, /* Cacheable, but do not allocate */ | 42 | DCCTRL2, /* Cacheable, but do not allocate */ |
| 43 | DCCTRL3, /* Cacheable and bufferable, but do not allocate */ | 43 | DCCTRL3, /* Cacheable and bufferable, but do not allocate */ |
| 44 | DINVALID1 = 8, | 44 | DINVALID1, /* AWCACHE = 0x1000 */ |
| 45 | DINVALID2, | 45 | DINVALID2, |
| 46 | DCCTRL6, /* Cacheable write-through, allocate on writes only */ | 46 | DCCTRL6, /* Cacheable write-through, allocate on writes only */ |
| 47 | DCCTRL7, /* Cacheable write-back, allocate on writes only */ | 47 | DCCTRL7, /* Cacheable write-back, allocate on writes only */ |
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index ce280b8d613c..cb8d638924fd 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <asm/hw_breakpoint.h> | 22 | #include <asm/hw_breakpoint.h> |
| 23 | #include <asm/ptrace.h> | 23 | #include <asm/ptrace.h> |
| 24 | #include <asm/types.h> | 24 | #include <asm/types.h> |
| 25 | #include <asm/system.h> | ||
| 25 | 26 | ||
| 26 | #ifdef __KERNEL__ | 27 | #ifdef __KERNEL__ |
| 27 | #define STACK_TOP ((current->personality & ADDR_LIMIT_32BIT) ? \ | 28 | #define STACK_TOP ((current->personality & ADDR_LIMIT_32BIT) ? \ |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index e33870ff0ac0..ede6443c34d9 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/perf_event.h> | 23 | #include <linux/perf_event.h> |
| 24 | #include <linux/hw_breakpoint.h> | 24 | #include <linux/hw_breakpoint.h> |
| 25 | #include <linux/regset.h> | 25 | #include <linux/regset.h> |
| 26 | #include <linux/audit.h> | ||
| 26 | 27 | ||
| 27 | #include <asm/pgtable.h> | 28 | #include <asm/pgtable.h> |
| 28 | #include <asm/system.h> | 29 | #include <asm/system.h> |
| @@ -904,6 +905,12 @@ long arch_ptrace(struct task_struct *child, long request, | |||
| 904 | return ret; | 905 | return ret; |
| 905 | } | 906 | } |
| 906 | 907 | ||
| 908 | #ifdef __ARMEB__ | ||
| 909 | #define AUDIT_ARCH_NR AUDIT_ARCH_ARMEB | ||
| 910 | #else | ||
| 911 | #define AUDIT_ARCH_NR AUDIT_ARCH_ARM | ||
| 912 | #endif | ||
| 913 | |||
| 907 | asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | 914 | asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) |
| 908 | { | 915 | { |
| 909 | unsigned long ip; | 916 | unsigned long ip; |
| @@ -918,7 +925,7 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | |||
| 918 | if (!ip) | 925 | if (!ip) |
| 919 | audit_syscall_exit(regs); | 926 | audit_syscall_exit(regs); |
| 920 | else | 927 | else |
| 921 | audit_syscall_entry(AUDIT_ARCH_ARMEB, scno, regs->ARM_r0, | 928 | audit_syscall_entry(AUDIT_ARCH_NR, scno, regs->ARM_r0, |
| 922 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); | 929 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); |
| 923 | 930 | ||
| 924 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 931 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) |
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 4285daa077b0..7a79b24597b2 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c | |||
| @@ -129,7 +129,7 @@ static struct notifier_block twd_cpufreq_nb = { | |||
| 129 | 129 | ||
| 130 | static int twd_cpufreq_init(void) | 130 | static int twd_cpufreq_init(void) |
| 131 | { | 131 | { |
| 132 | if (!IS_ERR(twd_clk)) | 132 | if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk)) |
| 133 | return cpufreq_register_notifier(&twd_cpufreq_nb, | 133 | return cpufreq_register_notifier(&twd_cpufreq_nb, |
| 134 | CPUFREQ_TRANSITION_NOTIFIER); | 134 | CPUFREQ_TRANSITION_NOTIFIER); |
| 135 | 135 | ||
diff --git a/arch/arm/mach-lpc32xx/include/mach/irqs.h b/arch/arm/mach-lpc32xx/include/mach/irqs.h index 2667f52e3b04..9e3b90df32e1 100644 --- a/arch/arm/mach-lpc32xx/include/mach/irqs.h +++ b/arch/arm/mach-lpc32xx/include/mach/irqs.h | |||
| @@ -61,7 +61,7 @@ | |||
| 61 | */ | 61 | */ |
| 62 | #define IRQ_LPC32XX_JTAG_COMM_TX LPC32XX_SIC1_IRQ(1) | 62 | #define IRQ_LPC32XX_JTAG_COMM_TX LPC32XX_SIC1_IRQ(1) |
| 63 | #define IRQ_LPC32XX_JTAG_COMM_RX LPC32XX_SIC1_IRQ(2) | 63 | #define IRQ_LPC32XX_JTAG_COMM_RX LPC32XX_SIC1_IRQ(2) |
| 64 | #define IRQ_LPC32XX_GPI_11 LPC32XX_SIC1_IRQ(4) | 64 | #define IRQ_LPC32XX_GPI_28 LPC32XX_SIC1_IRQ(4) |
| 65 | #define IRQ_LPC32XX_TS_P LPC32XX_SIC1_IRQ(6) | 65 | #define IRQ_LPC32XX_TS_P LPC32XX_SIC1_IRQ(6) |
| 66 | #define IRQ_LPC32XX_TS_IRQ LPC32XX_SIC1_IRQ(7) | 66 | #define IRQ_LPC32XX_TS_IRQ LPC32XX_SIC1_IRQ(7) |
| 67 | #define IRQ_LPC32XX_TS_AUX LPC32XX_SIC1_IRQ(8) | 67 | #define IRQ_LPC32XX_TS_AUX LPC32XX_SIC1_IRQ(8) |
diff --git a/arch/arm/mach-lpc32xx/irq.c b/arch/arm/mach-lpc32xx/irq.c index 4eae566dfdc7..c74de01ab5b6 100644 --- a/arch/arm/mach-lpc32xx/irq.c +++ b/arch/arm/mach-lpc32xx/irq.c | |||
| @@ -118,6 +118,10 @@ static const struct lpc32xx_event_info lpc32xx_events[NR_IRQS] = { | |||
| 118 | .event_group = &lpc32xx_event_pin_regs, | 118 | .event_group = &lpc32xx_event_pin_regs, |
| 119 | .mask = LPC32XX_CLKPWR_EXTSRC_GPI_06_BIT, | 119 | .mask = LPC32XX_CLKPWR_EXTSRC_GPI_06_BIT, |
| 120 | }, | 120 | }, |
| 121 | [IRQ_LPC32XX_GPI_28] = { | ||
| 122 | .event_group = &lpc32xx_event_pin_regs, | ||
| 123 | .mask = LPC32XX_CLKPWR_EXTSRC_GPI_28_BIT, | ||
| 124 | }, | ||
| 121 | [IRQ_LPC32XX_GPIO_00] = { | 125 | [IRQ_LPC32XX_GPIO_00] = { |
| 122 | .event_group = &lpc32xx_event_int_regs, | 126 | .event_group = &lpc32xx_event_int_regs, |
| 123 | .mask = LPC32XX_CLKPWR_INTSRC_GPIO_00_BIT, | 127 | .mask = LPC32XX_CLKPWR_INTSRC_GPIO_00_BIT, |
| @@ -305,9 +309,18 @@ static int lpc32xx_irq_wake(struct irq_data *d, unsigned int state) | |||
| 305 | 309 | ||
| 306 | if (state) | 310 | if (state) |
| 307 | eventreg |= lpc32xx_events[d->irq].mask; | 311 | eventreg |= lpc32xx_events[d->irq].mask; |
| 308 | else | 312 | else { |
| 309 | eventreg &= ~lpc32xx_events[d->irq].mask; | 313 | eventreg &= ~lpc32xx_events[d->irq].mask; |
| 310 | 314 | ||
| 315 | /* | ||
| 316 | * When disabling the wakeup, clear the latched | ||
| 317 | * event | ||
| 318 | */ | ||
| 319 | __raw_writel(lpc32xx_events[d->irq].mask, | ||
| 320 | lpc32xx_events[d->irq]. | ||
| 321 | event_group->rawstat_reg); | ||
| 322 | } | ||
| 323 | |||
| 311 | __raw_writel(eventreg, | 324 | __raw_writel(eventreg, |
| 312 | lpc32xx_events[d->irq].event_group->enab_reg); | 325 | lpc32xx_events[d->irq].event_group->enab_reg); |
| 313 | 326 | ||
| @@ -380,13 +393,15 @@ void __init lpc32xx_init_irq(void) | |||
| 380 | 393 | ||
| 381 | /* Setup SIC1 */ | 394 | /* Setup SIC1 */ |
| 382 | __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE)); | 395 | __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE)); |
| 383 | __raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE)); | 396 | __raw_writel(SIC1_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE)); |
| 384 | __raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE)); | 397 | __raw_writel(SIC1_ATR_DEFAULT, |
| 398 | LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE)); | ||
| 385 | 399 | ||
| 386 | /* Setup SIC2 */ | 400 | /* Setup SIC2 */ |
| 387 | __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE)); | 401 | __raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE)); |
| 388 | __raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE)); | 402 | __raw_writel(SIC2_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE)); |
| 389 | __raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE)); | 403 | __raw_writel(SIC2_ATR_DEFAULT, |
| 404 | LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE)); | ||
| 390 | 405 | ||
| 391 | /* Configure supported IRQ's */ | 406 | /* Configure supported IRQ's */ |
| 392 | for (i = 0; i < NR_IRQS; i++) { | 407 | for (i = 0; i < NR_IRQS; i++) { |
diff --git a/arch/arm/mach-lpc32xx/serial.c b/arch/arm/mach-lpc32xx/serial.c index 429cfdbb2b3d..f2735281616a 100644 --- a/arch/arm/mach-lpc32xx/serial.c +++ b/arch/arm/mach-lpc32xx/serial.c | |||
| @@ -88,6 +88,7 @@ struct uartinit { | |||
| 88 | char *uart_ck_name; | 88 | char *uart_ck_name; |
| 89 | u32 ck_mode_mask; | 89 | u32 ck_mode_mask; |
| 90 | void __iomem *pdiv_clk_reg; | 90 | void __iomem *pdiv_clk_reg; |
| 91 | resource_size_t mapbase; | ||
| 91 | }; | 92 | }; |
| 92 | 93 | ||
| 93 | static struct uartinit uartinit_data[] __initdata = { | 94 | static struct uartinit uartinit_data[] __initdata = { |
| @@ -97,6 +98,7 @@ static struct uartinit uartinit_data[] __initdata = { | |||
| 97 | .ck_mode_mask = | 98 | .ck_mode_mask = |
| 98 | LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 5), | 99 | LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 5), |
| 99 | .pdiv_clk_reg = LPC32XX_CLKPWR_UART5_CLK_CTRL, | 100 | .pdiv_clk_reg = LPC32XX_CLKPWR_UART5_CLK_CTRL, |
| 101 | .mapbase = LPC32XX_UART5_BASE, | ||
| 100 | }, | 102 | }, |
| 101 | #endif | 103 | #endif |
| 102 | #ifdef CONFIG_ARCH_LPC32XX_UART3_SELECT | 104 | #ifdef CONFIG_ARCH_LPC32XX_UART3_SELECT |
| @@ -105,6 +107,7 @@ static struct uartinit uartinit_data[] __initdata = { | |||
| 105 | .ck_mode_mask = | 107 | .ck_mode_mask = |
| 106 | LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 3), | 108 | LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 3), |
| 107 | .pdiv_clk_reg = LPC32XX_CLKPWR_UART3_CLK_CTRL, | 109 | .pdiv_clk_reg = LPC32XX_CLKPWR_UART3_CLK_CTRL, |
| 110 | .mapbase = LPC32XX_UART3_BASE, | ||
| 108 | }, | 111 | }, |
| 109 | #endif | 112 | #endif |
| 110 | #ifdef CONFIG_ARCH_LPC32XX_UART4_SELECT | 113 | #ifdef CONFIG_ARCH_LPC32XX_UART4_SELECT |
| @@ -113,6 +116,7 @@ static struct uartinit uartinit_data[] __initdata = { | |||
| 113 | .ck_mode_mask = | 116 | .ck_mode_mask = |
| 114 | LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 4), | 117 | LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 4), |
| 115 | .pdiv_clk_reg = LPC32XX_CLKPWR_UART4_CLK_CTRL, | 118 | .pdiv_clk_reg = LPC32XX_CLKPWR_UART4_CLK_CTRL, |
| 119 | .mapbase = LPC32XX_UART4_BASE, | ||
| 116 | }, | 120 | }, |
| 117 | #endif | 121 | #endif |
| 118 | #ifdef CONFIG_ARCH_LPC32XX_UART6_SELECT | 122 | #ifdef CONFIG_ARCH_LPC32XX_UART6_SELECT |
| @@ -121,6 +125,7 @@ static struct uartinit uartinit_data[] __initdata = { | |||
| 121 | .ck_mode_mask = | 125 | .ck_mode_mask = |
| 122 | LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 6), | 126 | LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 6), |
| 123 | .pdiv_clk_reg = LPC32XX_CLKPWR_UART6_CLK_CTRL, | 127 | .pdiv_clk_reg = LPC32XX_CLKPWR_UART6_CLK_CTRL, |
| 128 | .mapbase = LPC32XX_UART6_BASE, | ||
| 124 | }, | 129 | }, |
| 125 | #endif | 130 | #endif |
| 126 | }; | 131 | }; |
| @@ -165,11 +170,24 @@ void __init lpc32xx_serial_init(void) | |||
| 165 | 170 | ||
| 166 | /* pre-UART clock divider set to 1 */ | 171 | /* pre-UART clock divider set to 1 */ |
| 167 | __raw_writel(0x0101, uartinit_data[i].pdiv_clk_reg); | 172 | __raw_writel(0x0101, uartinit_data[i].pdiv_clk_reg); |
| 173 | |||
| 174 | /* | ||
| 175 | * Force a flush of the RX FIFOs to work around a | ||
| 176 | * HW bug | ||
| 177 | */ | ||
| 178 | puart = uartinit_data[i].mapbase; | ||
| 179 | __raw_writel(0xC1, LPC32XX_UART_IIR_FCR(puart)); | ||
| 180 | __raw_writel(0x00, LPC32XX_UART_DLL_FIFO(puart)); | ||
| 181 | j = LPC32XX_SUART_FIFO_SIZE; | ||
| 182 | while (j--) | ||
| 183 | tmp = __raw_readl( | ||
| 184 | LPC32XX_UART_DLL_FIFO(puart)); | ||
| 185 | __raw_writel(0, LPC32XX_UART_IIR_FCR(puart)); | ||
| 168 | } | 186 | } |
| 169 | 187 | ||
| 170 | /* This needs to be done after all UART clocks are setup */ | 188 | /* This needs to be done after all UART clocks are setup */ |
| 171 | __raw_writel(clkmodes, LPC32XX_UARTCTL_CLKMODE); | 189 | __raw_writel(clkmodes, LPC32XX_UARTCTL_CLKMODE); |
| 172 | for (i = 0; i < ARRAY_SIZE(uartinit_data) - 1; i++) { | 190 | for (i = 0; i < ARRAY_SIZE(uartinit_data); i++) { |
| 173 | /* Force a flush of the RX FIFOs to work around a HW bug */ | 191 | /* Force a flush of the RX FIFOs to work around a HW bug */ |
| 174 | puart = serial_std_platform_data[i].mapbase; | 192 | puart = serial_std_platform_data[i].mapbase; |
| 175 | __raw_writel(0xC1, LPC32XX_UART_IIR_FCR(puart)); | 193 | __raw_writel(0xC1, LPC32XX_UART_IIR_FCR(puart)); |
diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c index 17cb76060125..3588a5584153 100644 --- a/arch/arm/mach-mmp/aspenite.c +++ b/arch/arm/mach-mmp/aspenite.c | |||
| @@ -17,7 +17,6 @@ | |||
| 17 | #include <linux/mtd/partitions.h> | 17 | #include <linux/mtd/partitions.h> |
| 18 | #include <linux/mtd/nand.h> | 18 | #include <linux/mtd/nand.h> |
| 19 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
| 20 | #include <linux/gpio.h> | ||
| 21 | 20 | ||
| 22 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
| 23 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c index 7bc17eaa12eb..ada1213982b4 100644 --- a/arch/arm/mach-mmp/pxa168.c +++ b/arch/arm/mach-mmp/pxa168.c | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | #include <mach/dma.h> | 24 | #include <mach/dma.h> |
| 25 | #include <mach/devices.h> | 25 | #include <mach/devices.h> |
| 26 | #include <mach/mfp.h> | 26 | #include <mach/mfp.h> |
| 27 | #include <linux/platform_device.h> | ||
| 28 | #include <linux/dma-mapping.h> | 27 | #include <linux/dma-mapping.h> |
| 29 | #include <mach/pxa168.h> | 28 | #include <mach/pxa168.h> |
| 30 | 29 | ||
diff --git a/arch/arm/mach-mmp/tavorevb.c b/arch/arm/mach-mmp/tavorevb.c index 8e3b5af04a57..bc97170125bf 100644 --- a/arch/arm/mach-mmp/tavorevb.c +++ b/arch/arm/mach-mmp/tavorevb.c | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
| 13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
| 14 | #include <linux/smc91x.h> | 14 | #include <linux/smc91x.h> |
| 15 | #include <linux/gpio.h> | ||
| 16 | 15 | ||
| 17 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
| 18 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 309369ea6978..be2002f42dea 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c | |||
| @@ -416,13 +416,13 @@ static void __init innovator_init(void) | |||
| 416 | #ifdef CONFIG_ARCH_OMAP15XX | 416 | #ifdef CONFIG_ARCH_OMAP15XX |
| 417 | if (cpu_is_omap1510()) { | 417 | if (cpu_is_omap1510()) { |
| 418 | omap1_usb_init(&innovator1510_usb_config); | 418 | omap1_usb_init(&innovator1510_usb_config); |
| 419 | innovator_config[1].data = &innovator1510_lcd_config; | 419 | innovator_config[0].data = &innovator1510_lcd_config; |
| 420 | } | 420 | } |
| 421 | #endif | 421 | #endif |
| 422 | #ifdef CONFIG_ARCH_OMAP16XX | 422 | #ifdef CONFIG_ARCH_OMAP16XX |
| 423 | if (cpu_is_omap1610()) { | 423 | if (cpu_is_omap1610()) { |
| 424 | omap1_usb_init(&h2_usb_config); | 424 | omap1_usb_init(&h2_usb_config); |
| 425 | innovator_config[1].data = &innovator1610_lcd_config; | 425 | innovator_config[0].data = &innovator1610_lcd_config; |
| 426 | } | 426 | } |
| 427 | #endif | 427 | #endif |
| 428 | omap_board_config = innovator_config; | 428 | omap_board_config = innovator_config; |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index d965da45160e..e20c8ab80b0e 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
| @@ -364,8 +364,8 @@ config OMAP3_SDRC_AC_TIMING | |||
| 364 | going on could result in system crashes; | 364 | going on could result in system crashes; |
| 365 | 365 | ||
| 366 | config OMAP4_ERRATA_I688 | 366 | config OMAP4_ERRATA_I688 |
| 367 | bool "OMAP4 errata: Async Bridge Corruption (BROKEN)" | 367 | bool "OMAP4 errata: Async Bridge Corruption" |
| 368 | depends on ARCH_OMAP4 && BROKEN | 368 | depends on ARCH_OMAP4 |
| 369 | select ARCH_HAS_BARRIERS | 369 | select ARCH_HAS_BARRIERS |
| 370 | help | 370 | help |
| 371 | If a data is stalled inside asynchronous bridge because of back | 371 | If a data is stalled inside asynchronous bridge because of back |
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 42a4d11fad23..672262717601 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
| @@ -371,7 +371,11 @@ static void n8x0_mmc_callback(void *data, u8 card_mask) | |||
| 371 | else | 371 | else |
| 372 | *openp = 0; | 372 | *openp = 0; |
| 373 | 373 | ||
| 374 | #ifdef CONFIG_MMC_OMAP | ||
| 374 | omap_mmc_notify_cover_event(mmc_device, index, *openp); | 375 | omap_mmc_notify_cover_event(mmc_device, index, *openp); |
| 376 | #else | ||
| 377 | pr_warn("MMC: notify cover event not available\n"); | ||
| 378 | #endif | ||
| 375 | } | 379 | } |
| 376 | 380 | ||
| 377 | static int n8x0_mmc_late_init(struct device *dev) | 381 | static int n8x0_mmc_late_init(struct device *dev) |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index c775bead1497..c877236a8442 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
| @@ -381,7 +381,7 @@ static int omap3evm_twl_gpio_setup(struct device *dev, | |||
| 381 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI"); | 381 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI"); |
| 382 | 382 | ||
| 383 | /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ | 383 | /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ |
| 384 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; | 384 | gpio_leds[0].gpio = gpio + TWL4030_GPIO_MAX + 1; |
| 385 | 385 | ||
| 386 | platform_device_register(&leds_gpio); | 386 | platform_device_register(&leds_gpio); |
| 387 | 387 | ||
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index febffde2ff10..7e9338e8d684 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
| @@ -132,6 +132,7 @@ void omap3_map_io(void); | |||
| 132 | void am33xx_map_io(void); | 132 | void am33xx_map_io(void); |
| 133 | void omap4_map_io(void); | 133 | void omap4_map_io(void); |
| 134 | void ti81xx_map_io(void); | 134 | void ti81xx_map_io(void); |
| 135 | void omap_barriers_init(void); | ||
| 135 | 136 | ||
| 136 | /** | 137 | /** |
| 137 | * omap_test_timeout - busy-loop, testing a condition | 138 | * omap_test_timeout - busy-loop, testing a condition |
diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c index cfdbb86bc84e..72e018b9b260 100644 --- a/arch/arm/mach-omap2/cpuidle44xx.c +++ b/arch/arm/mach-omap2/cpuidle44xx.c | |||
| @@ -65,7 +65,6 @@ static int omap4_enter_idle(struct cpuidle_device *dev, | |||
| 65 | struct timespec ts_preidle, ts_postidle, ts_idle; | 65 | struct timespec ts_preidle, ts_postidle, ts_idle; |
| 66 | u32 cpu1_state; | 66 | u32 cpu1_state; |
| 67 | int idle_time; | 67 | int idle_time; |
| 68 | int new_state_idx; | ||
| 69 | int cpu_id = smp_processor_id(); | 68 | int cpu_id = smp_processor_id(); |
| 70 | 69 | ||
| 71 | /* Used to keep track of the total time in idle */ | 70 | /* Used to keep track of the total time in idle */ |
| @@ -84,8 +83,8 @@ static int omap4_enter_idle(struct cpuidle_device *dev, | |||
| 84 | */ | 83 | */ |
| 85 | cpu1_state = pwrdm_read_pwrst(cpu1_pd); | 84 | cpu1_state = pwrdm_read_pwrst(cpu1_pd); |
| 86 | if (cpu1_state != PWRDM_POWER_OFF) { | 85 | if (cpu1_state != PWRDM_POWER_OFF) { |
| 87 | new_state_idx = drv->safe_state_index; | 86 | index = drv->safe_state_index; |
| 88 | cx = cpuidle_get_statedata(&dev->states_usage[new_state_idx]); | 87 | cx = cpuidle_get_statedata(&dev->states_usage[index]); |
| 89 | } | 88 | } |
| 90 | 89 | ||
| 91 | if (index > 0) | 90 | if (index > 0) |
diff --git a/arch/arm/mach-omap2/gpmc-smsc911x.c b/arch/arm/mach-omap2/gpmc-smsc911x.c index 997033129d26..bbb870c04a5e 100644 --- a/arch/arm/mach-omap2/gpmc-smsc911x.c +++ b/arch/arm/mach-omap2/gpmc-smsc911x.c | |||
| @@ -19,6 +19,8 @@ | |||
| 19 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
| 20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
| 21 | #include <linux/smsc911x.h> | 21 | #include <linux/smsc911x.h> |
| 22 | #include <linux/regulator/fixed.h> | ||
| 23 | #include <linux/regulator/machine.h> | ||
| 22 | 24 | ||
| 23 | #include <plat/board.h> | 25 | #include <plat/board.h> |
| 24 | #include <plat/gpmc.h> | 26 | #include <plat/gpmc.h> |
| @@ -42,6 +44,50 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = { | |||
| 42 | .flags = SMSC911X_USE_16BIT, | 44 | .flags = SMSC911X_USE_16BIT, |
| 43 | }; | 45 | }; |
| 44 | 46 | ||
| 47 | static struct regulator_consumer_supply gpmc_smsc911x_supply[] = { | ||
| 48 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 49 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 50 | }; | ||
| 51 | |||
| 52 | /* Generic regulator definition to satisfy smsc911x */ | ||
| 53 | static struct regulator_init_data gpmc_smsc911x_reg_init_data = { | ||
| 54 | .constraints = { | ||
| 55 | .min_uV = 3300000, | ||
| 56 | .max_uV = 3300000, | ||
| 57 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
| 58 | | REGULATOR_MODE_STANDBY, | ||
| 59 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
| 60 | | REGULATOR_CHANGE_STATUS, | ||
| 61 | }, | ||
| 62 | .num_consumer_supplies = ARRAY_SIZE(gpmc_smsc911x_supply), | ||
| 63 | .consumer_supplies = gpmc_smsc911x_supply, | ||
| 64 | }; | ||
| 65 | |||
| 66 | static struct fixed_voltage_config gpmc_smsc911x_fixed_reg_data = { | ||
| 67 | .supply_name = "gpmc_smsc911x", | ||
| 68 | .microvolts = 3300000, | ||
| 69 | .gpio = -EINVAL, | ||
| 70 | .startup_delay = 0, | ||
| 71 | .enable_high = 0, | ||
| 72 | .enabled_at_boot = 1, | ||
| 73 | .init_data = &gpmc_smsc911x_reg_init_data, | ||
| 74 | }; | ||
| 75 | |||
| 76 | /* | ||
| 77 | * Platform device id of 42 is a temporary fix to avoid conflicts | ||
| 78 | * with other reg-fixed-voltage devices. The real fix should | ||
| 79 | * involve the driver core providing a way of dynamically | ||
| 80 | * assigning a unique id on registration for platform devices | ||
| 81 | * in the same name space. | ||
| 82 | */ | ||
| 83 | static struct platform_device gpmc_smsc911x_regulator = { | ||
| 84 | .name = "reg-fixed-voltage", | ||
| 85 | .id = 42, | ||
| 86 | .dev = { | ||
| 87 | .platform_data = &gpmc_smsc911x_fixed_reg_data, | ||
| 88 | }, | ||
| 89 | }; | ||
| 90 | |||
| 45 | /* | 91 | /* |
| 46 | * Initialize smsc911x device connected to the GPMC. Note that we | 92 | * Initialize smsc911x device connected to the GPMC. Note that we |
| 47 | * assume that pin multiplexing is done in the board-*.c file, | 93 | * assume that pin multiplexing is done in the board-*.c file, |
| @@ -55,6 +101,12 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) | |||
| 55 | 101 | ||
| 56 | gpmc_cfg = board_data; | 102 | gpmc_cfg = board_data; |
| 57 | 103 | ||
| 104 | ret = platform_device_register(&gpmc_smsc911x_regulator); | ||
| 105 | if (ret < 0) { | ||
| 106 | pr_err("Unable to register smsc911x regulators: %d\n", ret); | ||
| 107 | return; | ||
| 108 | } | ||
| 109 | |||
| 58 | if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { | 110 | if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { |
| 59 | pr_err("Failed to request GPMC mem region\n"); | 111 | pr_err("Failed to request GPMC mem region\n"); |
| 60 | return; | 112 | return; |
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index b40c28895298..19dd1657245c 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
| @@ -428,6 +428,7 @@ static int omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | |||
| 428 | return 0; | 428 | return 0; |
| 429 | } | 429 | } |
| 430 | 430 | ||
| 431 | static int omap_hsmmc_done; | ||
| 431 | #define MAX_OMAP_MMC_HWMOD_NAME_LEN 16 | 432 | #define MAX_OMAP_MMC_HWMOD_NAME_LEN 16 |
| 432 | 433 | ||
| 433 | void omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) | 434 | void omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) |
| @@ -491,6 +492,11 @@ void omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) | |||
| 491 | { | 492 | { |
| 492 | u32 reg; | 493 | u32 reg; |
| 493 | 494 | ||
| 495 | if (omap_hsmmc_done) | ||
| 496 | return; | ||
| 497 | |||
| 498 | omap_hsmmc_done = 1; | ||
| 499 | |||
| 494 | if (!cpu_is_omap44xx()) { | 500 | if (!cpu_is_omap44xx()) { |
| 495 | if (cpu_is_omap2430()) { | 501 | if (cpu_is_omap2430()) { |
| 496 | control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE; | 502 | control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE; |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index eb50c29fb644..fb11b44fbdec 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -307,6 +307,7 @@ void __init omapam33xx_map_common_io(void) | |||
| 307 | void __init omap44xx_map_common_io(void) | 307 | void __init omap44xx_map_common_io(void) |
| 308 | { | 308 | { |
| 309 | iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc)); | 309 | iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc)); |
| 310 | omap_barriers_init(); | ||
| 310 | } | 311 | } |
| 311 | #endif | 312 | #endif |
| 312 | 313 | ||
diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 609ea2ded7e3..2cc1aa004b94 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c | |||
| @@ -281,8 +281,16 @@ static struct omap_mbox mbox_iva_info = { | |||
| 281 | .ops = &omap2_mbox_ops, | 281 | .ops = &omap2_mbox_ops, |
| 282 | .priv = &omap2_mbox_iva_priv, | 282 | .priv = &omap2_mbox_iva_priv, |
| 283 | }; | 283 | }; |
| 284 | #endif | ||
| 284 | 285 | ||
| 285 | struct omap_mbox *omap2_mboxes[] = { &mbox_dsp_info, &mbox_iva_info, NULL }; | 286 | #ifdef CONFIG_ARCH_OMAP2 |
| 287 | struct omap_mbox *omap2_mboxes[] = { | ||
| 288 | &mbox_dsp_info, | ||
| 289 | #ifdef CONFIG_SOC_OMAP2420 | ||
| 290 | &mbox_iva_info, | ||
| 291 | #endif | ||
| 292 | NULL | ||
| 293 | }; | ||
| 286 | #endif | 294 | #endif |
| 287 | 295 | ||
| 288 | #if defined(CONFIG_ARCH_OMAP4) | 296 | #if defined(CONFIG_ARCH_OMAP4) |
| @@ -412,7 +420,8 @@ static void __exit omap2_mbox_exit(void) | |||
| 412 | platform_driver_unregister(&omap2_mbox_driver); | 420 | platform_driver_unregister(&omap2_mbox_driver); |
| 413 | } | 421 | } |
| 414 | 422 | ||
| 415 | module_init(omap2_mbox_init); | 423 | /* must be ready before omap3isp is probed */ |
| 424 | subsys_initcall(omap2_mbox_init); | ||
| 416 | module_exit(omap2_mbox_exit); | 425 | module_exit(omap2_mbox_exit); |
| 417 | 426 | ||
| 418 | MODULE_LICENSE("GPL v2"); | 427 | MODULE_LICENSE("GPL v2"); |
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index fb8bc9fa43b1..611a0e3d54ca 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
| @@ -218,7 +218,7 @@ static int _omap_mux_get_by_name(struct omap_mux_partition *partition, | |||
| 218 | return -ENODEV; | 218 | return -ENODEV; |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | static int __init | 221 | static int |
| 222 | omap_mux_get_by_name(const char *muxname, | 222 | omap_mux_get_by_name(const char *muxname, |
| 223 | struct omap_mux_partition **found_partition, | 223 | struct omap_mux_partition **found_partition, |
| 224 | struct omap_mux **found_mux) | 224 | struct omap_mux **found_mux) |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 40a8fbc07e4b..ebc595091312 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | 24 | ||
| 25 | #include <plat/irqs.h> | 25 | #include <plat/irqs.h> |
| 26 | #include <plat/sram.h> | 26 | #include <plat/sram.h> |
| 27 | #include <plat/omap-secure.h> | ||
| 27 | 28 | ||
| 28 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
| 29 | #include <mach/omap-wakeupgen.h> | 30 | #include <mach/omap-wakeupgen.h> |
| @@ -43,6 +44,9 @@ static void __iomem *sar_ram_base; | |||
| 43 | 44 | ||
| 44 | void __iomem *dram_sync, *sram_sync; | 45 | void __iomem *dram_sync, *sram_sync; |
| 45 | 46 | ||
| 47 | static phys_addr_t paddr; | ||
| 48 | static u32 size; | ||
| 49 | |||
| 46 | void omap_bus_sync(void) | 50 | void omap_bus_sync(void) |
| 47 | { | 51 | { |
| 48 | if (dram_sync && sram_sync) { | 52 | if (dram_sync && sram_sync) { |
| @@ -52,18 +56,20 @@ void omap_bus_sync(void) | |||
| 52 | } | 56 | } |
| 53 | } | 57 | } |
| 54 | 58 | ||
| 55 | static int __init omap_barriers_init(void) | 59 | /* Steal one page physical memory for barrier implementation */ |
| 60 | int __init omap_barrier_reserve_memblock(void) | ||
| 56 | { | 61 | { |
| 57 | struct map_desc dram_io_desc[1]; | ||
| 58 | phys_addr_t paddr; | ||
| 59 | u32 size; | ||
| 60 | |||
| 61 | if (!cpu_is_omap44xx()) | ||
| 62 | return -ENODEV; | ||
| 63 | 62 | ||
| 64 | size = ALIGN(PAGE_SIZE, SZ_1M); | 63 | size = ALIGN(PAGE_SIZE, SZ_1M); |
| 65 | paddr = arm_memblock_steal(size, SZ_1M); | 64 | paddr = arm_memblock_steal(size, SZ_1M); |
| 66 | 65 | ||
| 66 | return 0; | ||
| 67 | } | ||
| 68 | |||
| 69 | void __init omap_barriers_init(void) | ||
| 70 | { | ||
| 71 | struct map_desc dram_io_desc[1]; | ||
| 72 | |||
| 67 | dram_io_desc[0].virtual = OMAP4_DRAM_BARRIER_VA; | 73 | dram_io_desc[0].virtual = OMAP4_DRAM_BARRIER_VA; |
| 68 | dram_io_desc[0].pfn = __phys_to_pfn(paddr); | 74 | dram_io_desc[0].pfn = __phys_to_pfn(paddr); |
| 69 | dram_io_desc[0].length = size; | 75 | dram_io_desc[0].length = size; |
| @@ -75,9 +81,10 @@ static int __init omap_barriers_init(void) | |||
| 75 | pr_info("OMAP4: Map 0x%08llx to 0x%08lx for dram barrier\n", | 81 | pr_info("OMAP4: Map 0x%08llx to 0x%08lx for dram barrier\n", |
| 76 | (long long) paddr, dram_io_desc[0].virtual); | 82 | (long long) paddr, dram_io_desc[0].virtual); |
| 77 | 83 | ||
| 78 | return 0; | ||
| 79 | } | 84 | } |
| 80 | core_initcall(omap_barriers_init); | 85 | #else |
| 86 | void __init omap_barriers_init(void) | ||
| 87 | {} | ||
| 81 | #endif | 88 | #endif |
| 82 | 89 | ||
| 83 | void __init gic_init_irq(void) | 90 | void __init gic_init_irq(void) |
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 1881fe915149..5a65dd04aa38 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c | |||
| @@ -174,14 +174,17 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, | |||
| 174 | freq = clk->rate; | 174 | freq = clk->rate; |
| 175 | clk_put(clk); | 175 | clk_put(clk); |
| 176 | 176 | ||
| 177 | rcu_read_lock(); | ||
| 177 | opp = opp_find_freq_ceil(dev, &freq); | 178 | opp = opp_find_freq_ceil(dev, &freq); |
| 178 | if (IS_ERR(opp)) { | 179 | if (IS_ERR(opp)) { |
| 180 | rcu_read_unlock(); | ||
| 179 | pr_err("%s: unable to find boot up OPP for vdd_%s\n", | 181 | pr_err("%s: unable to find boot up OPP for vdd_%s\n", |
| 180 | __func__, vdd_name); | 182 | __func__, vdd_name); |
| 181 | goto exit; | 183 | goto exit; |
| 182 | } | 184 | } |
| 183 | 185 | ||
| 184 | bootup_volt = opp_get_voltage(opp); | 186 | bootup_volt = opp_get_voltage(opp); |
| 187 | rcu_read_unlock(); | ||
| 185 | if (!bootup_volt) { | 188 | if (!bootup_volt) { |
| 186 | pr_err("%s: unable to find voltage corresponding " | 189 | pr_err("%s: unable to find voltage corresponding " |
| 187 | "to the bootup OPP for vdd_%s\n", __func__, vdd_name); | 190 | "to the bootup OPP for vdd_%s\n", __func__, vdd_name); |
diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c index 771dc781b746..f51348dafafd 100644 --- a/arch/arm/mach-omap2/usb-host.c +++ b/arch/arm/mach-omap2/usb-host.c | |||
| @@ -486,7 +486,7 @@ static void setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | |||
| 486 | void __init usbhs_init(const struct usbhs_omap_board_data *pdata) | 486 | void __init usbhs_init(const struct usbhs_omap_board_data *pdata) |
| 487 | { | 487 | { |
| 488 | struct omap_hwmod *oh[2]; | 488 | struct omap_hwmod *oh[2]; |
| 489 | struct omap_device *od; | 489 | struct platform_device *pdev; |
| 490 | int bus_id = -1; | 490 | int bus_id = -1; |
| 491 | int i; | 491 | int i; |
| 492 | 492 | ||
| @@ -522,11 +522,11 @@ void __init usbhs_init(const struct usbhs_omap_board_data *pdata) | |||
| 522 | return; | 522 | return; |
| 523 | } | 523 | } |
| 524 | 524 | ||
| 525 | od = omap_device_build_ss(OMAP_USBHS_DEVICE, bus_id, oh, 2, | 525 | pdev = omap_device_build_ss(OMAP_USBHS_DEVICE, bus_id, oh, 2, |
| 526 | (void *)&usbhs_data, sizeof(usbhs_data), | 526 | (void *)&usbhs_data, sizeof(usbhs_data), |
| 527 | omap_uhhtll_latency, | 527 | omap_uhhtll_latency, |
| 528 | ARRAY_SIZE(omap_uhhtll_latency), false); | 528 | ARRAY_SIZE(omap_uhhtll_latency), false); |
| 529 | if (IS_ERR(od)) { | 529 | if (IS_ERR(pdev)) { |
| 530 | pr_err("Could not build hwmod devices %s,%s\n", | 530 | pr_err("Could not build hwmod devices %s,%s\n", |
| 531 | USBHS_UHH_HWMODNAME, USBHS_TLL_HWMODNAME); | 531 | USBHS_UHH_HWMODNAME, USBHS_TLL_HWMODNAME); |
| 532 | return; | 532 | return; |
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c index c005e2f5e383..57db2038b23c 100644 --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c | |||
| @@ -108,6 +108,7 @@ void __init omap3xxx_voltagedomains_init(void) | |||
| 108 | * XXX Will depend on the process, validation, and binning | 108 | * XXX Will depend on the process, validation, and binning |
| 109 | * for the currently-running IC | 109 | * for the currently-running IC |
| 110 | */ | 110 | */ |
| 111 | #ifdef CONFIG_PM_OPP | ||
| 111 | if (cpu_is_omap3630()) { | 112 | if (cpu_is_omap3630()) { |
| 112 | omap3_voltdm_mpu.volt_data = omap36xx_vddmpu_volt_data; | 113 | omap3_voltdm_mpu.volt_data = omap36xx_vddmpu_volt_data; |
| 113 | omap3_voltdm_core.volt_data = omap36xx_vddcore_volt_data; | 114 | omap3_voltdm_core.volt_data = omap36xx_vddcore_volt_data; |
| @@ -115,6 +116,7 @@ void __init omap3xxx_voltagedomains_init(void) | |||
| 115 | omap3_voltdm_mpu.volt_data = omap34xx_vddmpu_volt_data; | 116 | omap3_voltdm_mpu.volt_data = omap34xx_vddmpu_volt_data; |
| 116 | omap3_voltdm_core.volt_data = omap34xx_vddcore_volt_data; | 117 | omap3_voltdm_core.volt_data = omap34xx_vddcore_volt_data; |
| 117 | } | 118 | } |
| 119 | #endif | ||
| 118 | 120 | ||
| 119 | if (cpu_is_omap3517() || cpu_is_omap3505()) | 121 | if (cpu_is_omap3517() || cpu_is_omap3505()) |
| 120 | voltdms = voltagedomains_am35xx; | 122 | voltdms = voltagedomains_am35xx; |
diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c index 4e11d022595d..c3115f6853d4 100644 --- a/arch/arm/mach-omap2/voltagedomains44xx_data.c +++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c | |||
| @@ -100,9 +100,11 @@ void __init omap44xx_voltagedomains_init(void) | |||
| 100 | * XXX Will depend on the process, validation, and binning | 100 | * XXX Will depend on the process, validation, and binning |
| 101 | * for the currently-running IC | 101 | * for the currently-running IC |
| 102 | */ | 102 | */ |
| 103 | #ifdef CONFIG_PM_OPP | ||
| 103 | omap4_voltdm_mpu.volt_data = omap44xx_vdd_mpu_volt_data; | 104 | omap4_voltdm_mpu.volt_data = omap44xx_vdd_mpu_volt_data; |
| 104 | omap4_voltdm_iva.volt_data = omap44xx_vdd_iva_volt_data; | 105 | omap4_voltdm_iva.volt_data = omap44xx_vdd_iva_volt_data; |
| 105 | omap4_voltdm_core.volt_data = omap44xx_vdd_core_volt_data; | 106 | omap4_voltdm_core.volt_data = omap44xx_vdd_core_volt_data; |
| 107 | #endif | ||
| 106 | 108 | ||
| 107 | for (i = 0; voltdm = voltagedomains_omap4[i], voltdm; i++) | 109 | for (i = 0; voltdm = voltagedomains_omap4[i], voltdm; i++) |
| 108 | voltdm->sys_clk.name = sys_clk_name; | 110 | voltdm->sys_clk.name = sys_clk_name; |
diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c index fb9b62dcf4ca..208eef1c0485 100644 --- a/arch/arm/mach-pxa/hx4700.c +++ b/arch/arm/mach-pxa/hx4700.c | |||
| @@ -45,6 +45,7 @@ | |||
| 45 | #include <mach/hx4700.h> | 45 | #include <mach/hx4700.h> |
| 46 | #include <mach/irda.h> | 46 | #include <mach/irda.h> |
| 47 | 47 | ||
| 48 | #include <sound/ak4641.h> | ||
| 48 | #include <video/platform_lcd.h> | 49 | #include <video/platform_lcd.h> |
| 49 | #include <video/w100fb.h> | 50 | #include <video/w100fb.h> |
| 50 | 51 | ||
| @@ -765,6 +766,28 @@ static struct i2c_board_info __initdata pi2c_board_info[] = { | |||
| 765 | }; | 766 | }; |
| 766 | 767 | ||
| 767 | /* | 768 | /* |
| 769 | * Asahi Kasei AK4641 on I2C | ||
| 770 | */ | ||
| 771 | |||
| 772 | static struct ak4641_platform_data ak4641_info = { | ||
| 773 | .gpio_power = GPIO27_HX4700_CODEC_ON, | ||
| 774 | .gpio_npdn = GPIO109_HX4700_CODEC_nPDN, | ||
| 775 | }; | ||
| 776 | |||
| 777 | static struct i2c_board_info i2c_board_info[] __initdata = { | ||
| 778 | { | ||
| 779 | I2C_BOARD_INFO("ak4641", 0x12), | ||
| 780 | .platform_data = &ak4641_info, | ||
| 781 | }, | ||
| 782 | }; | ||
| 783 | |||
| 784 | static struct platform_device audio = { | ||
| 785 | .name = "hx4700-audio", | ||
| 786 | .id = -1, | ||
| 787 | }; | ||
| 788 | |||
| 789 | |||
| 790 | /* | ||
| 768 | * PCMCIA | 791 | * PCMCIA |
| 769 | */ | 792 | */ |
| 770 | 793 | ||
| @@ -790,6 +813,7 @@ static struct platform_device *devices[] __initdata = { | |||
| 790 | &gpio_vbus, | 813 | &gpio_vbus, |
| 791 | &power_supply, | 814 | &power_supply, |
| 792 | &strataflash, | 815 | &strataflash, |
| 816 | &audio, | ||
| 793 | &pcmcia, | 817 | &pcmcia, |
| 794 | }; | 818 | }; |
| 795 | 819 | ||
| @@ -827,6 +851,7 @@ static void __init hx4700_init(void) | |||
| 827 | pxa_set_ficp_info(&ficp_info); | 851 | pxa_set_ficp_info(&ficp_info); |
| 828 | pxa27x_set_i2c_power_info(NULL); | 852 | pxa27x_set_i2c_power_info(NULL); |
| 829 | pxa_set_i2c_info(NULL); | 853 | pxa_set_i2c_info(NULL); |
| 854 | i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info)); | ||
| 830 | i2c_register_board_info(1, ARRAY_AND_SIZE(pi2c_board_info)); | 855 | i2c_register_board_info(1, ARRAY_AND_SIZE(pi2c_board_info)); |
| 831 | pxa2xx_set_spi_info(2, &pxa_ssp2_master_info); | 856 | pxa2xx_set_spi_info(2, &pxa_ssp2_master_info); |
| 832 | spi_register_board_info(ARRAY_AND_SIZE(tsc2046_board_info)); | 857 | spi_register_board_info(ARRAY_AND_SIZE(tsc2046_board_info)); |
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index 91e4f6c03766..00d6eacab8e4 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/suspend.h> | 25 | #include <linux/suspend.h> |
| 26 | #include <linux/syscore_ops.h> | 26 | #include <linux/syscore_ops.h> |
| 27 | #include <linux/irq.h> | 27 | #include <linux/irq.h> |
| 28 | #include <linux/gpio.h> | ||
| 29 | 28 | ||
| 30 | #include <asm/mach/map.h> | 29 | #include <asm/mach/map.h> |
| 31 | #include <asm/suspend.h> | 30 | #include <asm/suspend.h> |
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index aed6cbcf3866..c1673b3441d4 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
| 23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
| 24 | #include <linux/i2c/pxa-i2c.h> | 24 | #include <linux/i2c/pxa-i2c.h> |
| 25 | #include <linux/gpio.h> | ||
| 26 | 25 | ||
| 27 | #include <asm/mach/map.h> | 26 | #include <asm/mach/map.h> |
| 28 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
diff --git a/arch/arm/mach-pxa/saarb.c b/arch/arm/mach-pxa/saarb.c index febc809ed5a6..5aded5e6148f 100644 --- a/arch/arm/mach-pxa/saarb.c +++ b/arch/arm/mach-pxa/saarb.c | |||
| @@ -15,7 +15,6 @@ | |||
| 15 | #include <linux/i2c.h> | 15 | #include <linux/i2c.h> |
| 16 | #include <linux/i2c/pxa-i2c.h> | 16 | #include <linux/i2c/pxa-i2c.h> |
| 17 | #include <linux/mfd/88pm860x.h> | 17 | #include <linux/mfd/88pm860x.h> |
| 18 | #include <linux/gpio.h> | ||
| 19 | 18 | ||
| 20 | #include <asm/mach-types.h> | 19 | #include <asm/mach-types.h> |
| 21 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
diff --git a/arch/arm/mach-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c index 8d5168d253a9..30989baf7f2a 100644 --- a/arch/arm/mach-pxa/sharpsl_pm.c +++ b/arch/arm/mach-pxa/sharpsl_pm.c | |||
| @@ -168,6 +168,7 @@ struct battery_thresh sharpsl_battery_levels_noac[] = { | |||
| 168 | #define MAXCTRL_SEL_SH 4 | 168 | #define MAXCTRL_SEL_SH 4 |
| 169 | #define MAXCTRL_STR (1u << 7) | 169 | #define MAXCTRL_STR (1u << 7) |
| 170 | 170 | ||
| 171 | extern int max1111_read_channel(int); | ||
| 171 | /* | 172 | /* |
| 172 | * Read MAX1111 ADC | 173 | * Read MAX1111 ADC |
| 173 | */ | 174 | */ |
| @@ -177,8 +178,6 @@ int sharpsl_pm_pxa_read_max1111(int channel) | |||
| 177 | if (machine_is_tosa()) | 178 | if (machine_is_tosa()) |
| 178 | return 0; | 179 | return 0; |
| 179 | 180 | ||
| 180 | extern int max1111_read_channel(int); | ||
| 181 | |||
| 182 | /* max1111 accepts channels from 0-3, however, | 181 | /* max1111 accepts channels from 0-3, however, |
| 183 | * it is encoded from 0-7 here in the code. | 182 | * it is encoded from 0-7 here in the code. |
| 184 | */ | 183 | */ |
diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c index 34cbdac51525..438f02fe122a 100644 --- a/arch/arm/mach-pxa/spitz_pm.c +++ b/arch/arm/mach-pxa/spitz_pm.c | |||
| @@ -172,10 +172,9 @@ static int spitz_should_wakeup(unsigned int resume_on_alarm) | |||
| 172 | static unsigned long spitz_charger_wakeup(void) | 172 | static unsigned long spitz_charger_wakeup(void) |
| 173 | { | 173 | { |
| 174 | unsigned long ret; | 174 | unsigned long ret; |
| 175 | ret = (!gpio_get_value(SPITZ_GPIO_KEY_INT) | 175 | ret = ((!gpio_get_value(SPITZ_GPIO_KEY_INT) |
| 176 | << GPIO_bit(SPITZ_GPIO_KEY_INT)) | 176 | << GPIO_bit(SPITZ_GPIO_KEY_INT)) |
| 177 | | (!gpio_get_value(SPITZ_GPIO_SYNC) | 177 | | gpio_get_value(SPITZ_GPIO_SYNC)); |
| 178 | << GPIO_bit(SPITZ_GPIO_SYNC)); | ||
| 179 | return ret; | 178 | return ret; |
| 180 | } | 179 | } |
| 181 | 180 | ||
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index eff8a96c75ee..068b754bc348 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/serial_sci.h> | 30 | #include <linux/serial_sci.h> |
| 31 | #include <linux/smsc911x.h> | 31 | #include <linux/smsc911x.h> |
| 32 | #include <linux/gpio.h> | 32 | #include <linux/gpio.h> |
| 33 | #include <linux/videodev2.h> | ||
| 33 | #include <linux/input.h> | 34 | #include <linux/input.h> |
| 34 | #include <linux/input/sh_keysc.h> | 35 | #include <linux/input/sh_keysc.h> |
| 35 | #include <linux/mmc/host.h> | 36 | #include <linux/mmc/host.h> |
| @@ -37,7 +38,6 @@ | |||
| 37 | #include <linux/mmc/sh_mobile_sdhi.h> | 38 | #include <linux/mmc/sh_mobile_sdhi.h> |
| 38 | #include <linux/mfd/tmio.h> | 39 | #include <linux/mfd/tmio.h> |
| 39 | #include <linux/sh_clk.h> | 40 | #include <linux/sh_clk.h> |
| 40 | #include <linux/dma-mapping.h> | ||
| 41 | #include <video/sh_mobile_lcdc.h> | 41 | #include <video/sh_mobile_lcdc.h> |
| 42 | #include <video/sh_mipi_dsi.h> | 42 | #include <video/sh_mipi_dsi.h> |
| 43 | #include <sound/sh_fsi.h> | 43 | #include <sound/sh_fsi.h> |
| @@ -159,19 +159,12 @@ static struct resource sh_mmcif_resources[] = { | |||
| 159 | }, | 159 | }, |
| 160 | }; | 160 | }; |
| 161 | 161 | ||
| 162 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
| 163 | .chan_priv_rx = { | ||
| 164 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 165 | }, | ||
| 166 | .chan_priv_tx = { | ||
| 167 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 168 | }, | ||
| 169 | }; | ||
| 170 | static struct sh_mmcif_plat_data sh_mmcif_platdata = { | 162 | static struct sh_mmcif_plat_data sh_mmcif_platdata = { |
| 171 | .sup_pclk = 0, | 163 | .sup_pclk = 0, |
| 172 | .ocr = MMC_VDD_165_195, | 164 | .ocr = MMC_VDD_165_195, |
| 173 | .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, | 165 | .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, |
| 174 | .dma = &sh_mmcif_dma, | 166 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, |
| 167 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 175 | }; | 168 | }; |
| 176 | 169 | ||
| 177 | static struct platform_device mmc_device = { | 170 | static struct platform_device mmc_device = { |
| @@ -321,12 +314,11 @@ static struct resource mipidsi0_resources[] = { | |||
| 321 | }, | 314 | }, |
| 322 | }; | 315 | }; |
| 323 | 316 | ||
| 324 | #define DSI0PHYCR 0xe615006c | ||
| 325 | static int sh_mipi_set_dot_clock(struct platform_device *pdev, | 317 | static int sh_mipi_set_dot_clock(struct platform_device *pdev, |
| 326 | void __iomem *base, | 318 | void __iomem *base, |
| 327 | int enable) | 319 | int enable) |
| 328 | { | 320 | { |
| 329 | struct clk *pck; | 321 | struct clk *pck, *phy; |
| 330 | int ret; | 322 | int ret; |
| 331 | 323 | ||
| 332 | pck = clk_get(&pdev->dev, "dsip_clk"); | 324 | pck = clk_get(&pdev->dev, "dsip_clk"); |
| @@ -335,18 +327,27 @@ static int sh_mipi_set_dot_clock(struct platform_device *pdev, | |||
| 335 | goto sh_mipi_set_dot_clock_pck_err; | 327 | goto sh_mipi_set_dot_clock_pck_err; |
| 336 | } | 328 | } |
| 337 | 329 | ||
| 330 | phy = clk_get(&pdev->dev, "dsiphy_clk"); | ||
| 331 | if (IS_ERR(phy)) { | ||
| 332 | ret = PTR_ERR(phy); | ||
| 333 | goto sh_mipi_set_dot_clock_phy_err; | ||
| 334 | } | ||
| 335 | |||
| 338 | if (enable) { | 336 | if (enable) { |
| 339 | clk_set_rate(pck, clk_round_rate(pck, 24000000)); | 337 | clk_set_rate(pck, clk_round_rate(pck, 24000000)); |
| 340 | __raw_writel(0x2a809010, DSI0PHYCR); | 338 | clk_set_rate(phy, clk_round_rate(pck, 510000000)); |
| 341 | clk_enable(pck); | 339 | clk_enable(pck); |
| 340 | clk_enable(phy); | ||
| 342 | } else { | 341 | } else { |
| 343 | clk_disable(pck); | 342 | clk_disable(pck); |
| 343 | clk_disable(phy); | ||
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | ret = 0; | 346 | ret = 0; |
| 347 | 347 | ||
| 348 | clk_put(phy); | ||
| 349 | sh_mipi_set_dot_clock_phy_err: | ||
| 348 | clk_put(pck); | 350 | clk_put(pck); |
| 349 | |||
| 350 | sh_mipi_set_dot_clock_pck_err: | 351 | sh_mipi_set_dot_clock_pck_err: |
| 351 | return ret; | 352 | return ret; |
| 352 | } | 353 | } |
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index aab0a349f759..eeb4d9664584 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
| @@ -295,15 +295,6 @@ static struct resource sh_mmcif_resources[] = { | |||
| 295 | }, | 295 | }, |
| 296 | }; | 296 | }; |
| 297 | 297 | ||
| 298 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
| 299 | .chan_priv_rx = { | ||
| 300 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 301 | }, | ||
| 302 | .chan_priv_tx = { | ||
| 303 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 304 | }, | ||
| 305 | }; | ||
| 306 | |||
| 307 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 298 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
| 308 | .sup_pclk = 0, | 299 | .sup_pclk = 0, |
| 309 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, | 300 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, |
| @@ -311,7 +302,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = { | |||
| 311 | MMC_CAP_8_BIT_DATA | | 302 | MMC_CAP_8_BIT_DATA | |
| 312 | MMC_CAP_NEEDS_POLL, | 303 | MMC_CAP_NEEDS_POLL, |
| 313 | .get_cd = slot_cn7_get_cd, | 304 | .get_cd = slot_cn7_get_cd, |
| 314 | .dma = &sh_mmcif_dma, | 305 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, |
| 306 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 315 | }; | 307 | }; |
| 316 | 308 | ||
| 317 | static struct platform_device sh_mmcif_device = { | 309 | static struct platform_device sh_mmcif_device = { |
diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index 857ceeec1bb0..c8e7ca23fc06 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c | |||
| @@ -143,11 +143,10 @@ static struct gpio_keys_button gpio_buttons[] = { | |||
| 143 | static struct gpio_keys_platform_data gpio_key_info = { | 143 | static struct gpio_keys_platform_data gpio_key_info = { |
| 144 | .buttons = gpio_buttons, | 144 | .buttons = gpio_buttons, |
| 145 | .nbuttons = ARRAY_SIZE(gpio_buttons), | 145 | .nbuttons = ARRAY_SIZE(gpio_buttons), |
| 146 | .poll_interval = 250, /* polled for now */ | ||
| 147 | }; | 146 | }; |
| 148 | 147 | ||
| 149 | static struct platform_device gpio_keys_device = { | 148 | static struct platform_device gpio_keys_device = { |
| 150 | .name = "gpio-keys-polled", /* polled for now */ | 149 | .name = "gpio-keys", |
| 151 | .id = -1, | 150 | .id = -1, |
| 152 | .dev = { | 151 | .dev = { |
| 153 | .platform_data = &gpio_key_info, | 152 | .platform_data = &gpio_key_info, |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 9b42fbd10f8e..a2813247b455 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
| @@ -43,7 +43,6 @@ | |||
| 43 | #include <linux/smsc911x.h> | 43 | #include <linux/smsc911x.h> |
| 44 | #include <linux/sh_intc.h> | 44 | #include <linux/sh_intc.h> |
| 45 | #include <linux/tca6416_keypad.h> | 45 | #include <linux/tca6416_keypad.h> |
| 46 | #include <linux/usb/r8a66597.h> | ||
| 47 | #include <linux/usb/renesas_usbhs.h> | 46 | #include <linux/usb/renesas_usbhs.h> |
| 48 | #include <linux/dma-mapping.h> | 47 | #include <linux/dma-mapping.h> |
| 49 | 48 | ||
| @@ -145,11 +144,6 @@ | |||
| 145 | * 1-2 short | VBUS 5V | Host | 144 | * 1-2 short | VBUS 5V | Host |
| 146 | * open | external VBUS | Function | 145 | * open | external VBUS | Function |
| 147 | * | 146 | * |
| 148 | * *1 | ||
| 149 | * CN31 is used as | ||
| 150 | * CONFIG_USB_R8A66597_HCD Host | ||
| 151 | * CONFIG_USB_RENESAS_USBHS Function | ||
| 152 | * | ||
| 153 | * CAUTION | 147 | * CAUTION |
| 154 | * | 148 | * |
| 155 | * renesas_usbhs driver can use external interrupt mode | 149 | * renesas_usbhs driver can use external interrupt mode |
| @@ -161,15 +155,6 @@ | |||
| 161 | * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0", | 155 | * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0", |
| 162 | * because Touchscreen is using IRQ7-PORT40. | 156 | * because Touchscreen is using IRQ7-PORT40. |
| 163 | * It is impossible to use IRQ7 demux on this board. | 157 | * It is impossible to use IRQ7 demux on this board. |
| 164 | * | ||
| 165 | * We can use external interrupt mode USB-Function on "USB1". | ||
| 166 | * USB1 can become Host by r8a66597, and become Function by renesas_usbhs. | ||
| 167 | * But don't select both drivers in same time. | ||
| 168 | * These uses same IRQ number for request_irq(), and aren't supporting | ||
| 169 | * IRQF_SHARED / IORESOURCE_IRQ_SHAREABLE. | ||
| 170 | * | ||
| 171 | * Actually these are old/new version of USB driver. | ||
| 172 | * This mean its register will be broken if it supports shared IRQ, | ||
| 173 | */ | 158 | */ |
| 174 | 159 | ||
| 175 | /* | 160 | /* |
| @@ -208,6 +193,16 @@ | |||
| 208 | */ | 193 | */ |
| 209 | 194 | ||
| 210 | /* | 195 | /* |
| 196 | * FSI - AK4642 | ||
| 197 | * | ||
| 198 | * it needs amixer settings for playing | ||
| 199 | * | ||
| 200 | * amixer set "Headphone" on | ||
| 201 | * amixer set "HPOUTL Mixer DACH" on | ||
| 202 | * amixer set "HPOUTR Mixer DACH" on | ||
| 203 | */ | ||
| 204 | |||
| 205 | /* | ||
| 211 | * FIXME !! | 206 | * FIXME !! |
| 212 | * | 207 | * |
| 213 | * gpio_no_direction | 208 | * gpio_no_direction |
| @@ -676,51 +671,16 @@ static struct platform_device usbhs0_device = { | |||
| 676 | * Use J30 to select between Host and Function. This setting | 671 | * Use J30 to select between Host and Function. This setting |
| 677 | * can however not be detected by software. Hotplug of USBHS1 | 672 | * can however not be detected by software. Hotplug of USBHS1 |
| 678 | * is provided via IRQ8. | 673 | * is provided via IRQ8. |
| 674 | * | ||
| 675 | * Current USB1 works as "USB Host". | ||
| 676 | * - set J30 "short" | ||
| 677 | * | ||
| 678 | * If you want to use it as "USB gadget", | ||
| 679 | * - J30 "open" | ||
| 680 | * - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET | ||
| 681 | * - add .get_vbus = usbhs_get_vbus in usbhs1_private | ||
| 679 | */ | 682 | */ |
| 680 | #define IRQ8 evt2irq(0x0300) | 683 | #define IRQ8 evt2irq(0x0300) |
| 681 | |||
| 682 | /* USBHS1 USB Host support via r8a66597_hcd */ | ||
| 683 | static void usb1_host_port_power(int port, int power) | ||
| 684 | { | ||
| 685 | if (!power) /* only power-on is supported for now */ | ||
| 686 | return; | ||
| 687 | |||
| 688 | /* set VBOUT/PWEN and EXTLP1 in DVSTCTR */ | ||
| 689 | __raw_writew(__raw_readw(0xE68B0008) | 0x600, 0xE68B0008); | ||
| 690 | } | ||
| 691 | |||
| 692 | static struct r8a66597_platdata usb1_host_data = { | ||
| 693 | .on_chip = 1, | ||
| 694 | .port_power = usb1_host_port_power, | ||
| 695 | }; | ||
| 696 | |||
| 697 | static struct resource usb1_host_resources[] = { | ||
| 698 | [0] = { | ||
| 699 | .name = "USBHS1", | ||
| 700 | .start = 0xe68b0000, | ||
| 701 | .end = 0xe68b00e6 - 1, | ||
| 702 | .flags = IORESOURCE_MEM, | ||
| 703 | }, | ||
| 704 | [1] = { | ||
| 705 | .start = evt2irq(0x1ce0) /* USB1_USB1I0 */, | ||
| 706 | .flags = IORESOURCE_IRQ, | ||
| 707 | }, | ||
| 708 | }; | ||
| 709 | |||
| 710 | static struct platform_device usb1_host_device = { | ||
| 711 | .name = "r8a66597_hcd", | ||
| 712 | .id = 1, | ||
| 713 | .dev = { | ||
| 714 | .dma_mask = NULL, /* not use dma */ | ||
| 715 | .coherent_dma_mask = 0xffffffff, | ||
| 716 | .platform_data = &usb1_host_data, | ||
| 717 | }, | ||
| 718 | .num_resources = ARRAY_SIZE(usb1_host_resources), | ||
| 719 | .resource = usb1_host_resources, | ||
| 720 | }; | ||
| 721 | |||
| 722 | /* USBHS1 USB Function support via renesas_usbhs */ | ||
| 723 | |||
| 724 | #define USB_PHY_MODE (1 << 4) | 684 | #define USB_PHY_MODE (1 << 4) |
| 725 | #define USB_PHY_INT_EN ((1 << 3) | (1 << 2)) | 685 | #define USB_PHY_INT_EN ((1 << 3) | (1 << 2)) |
| 726 | #define USB_PHY_ON (1 << 1) | 686 | #define USB_PHY_ON (1 << 1) |
| @@ -776,7 +736,7 @@ static void usbhs1_hardware_exit(struct platform_device *pdev) | |||
| 776 | 736 | ||
| 777 | static int usbhs1_get_id(struct platform_device *pdev) | 737 | static int usbhs1_get_id(struct platform_device *pdev) |
| 778 | { | 738 | { |
| 779 | return USBHS_GADGET; | 739 | return USBHS_HOST; |
| 780 | } | 740 | } |
| 781 | 741 | ||
| 782 | static u32 usbhs1_pipe_cfg[] = { | 742 | static u32 usbhs1_pipe_cfg[] = { |
| @@ -807,7 +767,6 @@ static struct usbhs_private usbhs1_private = { | |||
| 807 | .hardware_exit = usbhs1_hardware_exit, | 767 | .hardware_exit = usbhs1_hardware_exit, |
| 808 | .get_id = usbhs1_get_id, | 768 | .get_id = usbhs1_get_id, |
| 809 | .phy_reset = usbhs_phy_reset, | 769 | .phy_reset = usbhs_phy_reset, |
| 810 | .get_vbus = usbhs_get_vbus, | ||
| 811 | }, | 770 | }, |
| 812 | .driver_param = { | 771 | .driver_param = { |
| 813 | .buswait_bwait = 4, | 772 | .buswait_bwait = 4, |
| @@ -1184,15 +1143,6 @@ static struct resource sh_mmcif_resources[] = { | |||
| 1184 | }, | 1143 | }, |
| 1185 | }; | 1144 | }; |
| 1186 | 1145 | ||
| 1187 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
| 1188 | .chan_priv_rx = { | ||
| 1189 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 1190 | }, | ||
| 1191 | .chan_priv_tx = { | ||
| 1192 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 1193 | }, | ||
| 1194 | }; | ||
| 1195 | |||
| 1196 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 1146 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
| 1197 | .sup_pclk = 0, | 1147 | .sup_pclk = 0, |
| 1198 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, | 1148 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, |
| @@ -1200,7 +1150,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = { | |||
| 1200 | MMC_CAP_8_BIT_DATA | | 1150 | MMC_CAP_8_BIT_DATA | |
| 1201 | MMC_CAP_NEEDS_POLL, | 1151 | MMC_CAP_NEEDS_POLL, |
| 1202 | .get_cd = slot_cn7_get_cd, | 1152 | .get_cd = slot_cn7_get_cd, |
| 1203 | .dma = &sh_mmcif_dma, | 1153 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, |
| 1154 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 1204 | }; | 1155 | }; |
| 1205 | 1156 | ||
| 1206 | static struct platform_device sh_mmcif_device = { | 1157 | static struct platform_device sh_mmcif_device = { |
| @@ -1311,7 +1262,6 @@ static struct platform_device *mackerel_devices[] __initdata = { | |||
| 1311 | &nor_flash_device, | 1262 | &nor_flash_device, |
| 1312 | &smc911x_device, | 1263 | &smc911x_device, |
| 1313 | &lcdc_device, | 1264 | &lcdc_device, |
| 1314 | &usb1_host_device, | ||
| 1315 | &usbhs1_device, | 1265 | &usbhs1_device, |
| 1316 | &usbhs0_device, | 1266 | &usbhs0_device, |
| 1317 | &leds_device, | 1267 | &leds_device, |
| @@ -1473,9 +1423,6 @@ static void __init mackerel_init(void) | |||
| 1473 | gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */ | 1423 | gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */ |
| 1474 | gpio_request(GPIO_FN_IDIN_1_113, NULL); | 1424 | gpio_request(GPIO_FN_IDIN_1_113, NULL); |
| 1475 | 1425 | ||
| 1476 | /* USB phy tweak to make the r8a66597_hcd host driver work */ | ||
| 1477 | __raw_writew(0x8a0a, 0xe6058130); /* USBCR4 */ | ||
| 1478 | |||
| 1479 | /* enable FSI2 port A (ak4643) */ | 1426 | /* enable FSI2 port A (ak4643) */ |
| 1480 | gpio_request(GPIO_FN_FSIAIBT, NULL); | 1427 | gpio_request(GPIO_FN_FSIAIBT, NULL); |
| 1481 | gpio_request(GPIO_FN_FSIAILR, NULL); | 1428 | gpio_request(GPIO_FN_FSIAILR, NULL); |
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index afbead6a6e17..7727cca6136c 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c | |||
| @@ -365,6 +365,114 @@ static struct clk div6_clks[DIV6_NR] = { | |||
| 365 | dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3), | 365 | dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3), |
| 366 | }; | 366 | }; |
| 367 | 367 | ||
| 368 | /* DSI DIV */ | ||
| 369 | static unsigned long dsiphy_recalc(struct clk *clk) | ||
| 370 | { | ||
| 371 | u32 value; | ||
| 372 | |||
| 373 | value = __raw_readl(clk->mapping->base); | ||
| 374 | |||
| 375 | /* FIXME */ | ||
| 376 | if (!(value & 0x000B8000)) | ||
| 377 | return clk->parent->rate; | ||
| 378 | |||
| 379 | value &= 0x3f; | ||
| 380 | value += 1; | ||
| 381 | |||
| 382 | if ((value < 12) || | ||
| 383 | (value > 33)) { | ||
| 384 | pr_err("DSIPHY has wrong value (%d)", value); | ||
| 385 | return 0; | ||
| 386 | } | ||
| 387 | |||
| 388 | return clk->parent->rate / value; | ||
| 389 | } | ||
| 390 | |||
| 391 | static long dsiphy_round_rate(struct clk *clk, unsigned long rate) | ||
| 392 | { | ||
| 393 | return clk_rate_mult_range_round(clk, 12, 33, rate); | ||
| 394 | } | ||
| 395 | |||
| 396 | static void dsiphy_disable(struct clk *clk) | ||
| 397 | { | ||
| 398 | u32 value; | ||
| 399 | |||
| 400 | value = __raw_readl(clk->mapping->base); | ||
| 401 | value &= ~0x000B8000; | ||
| 402 | |||
| 403 | __raw_writel(value , clk->mapping->base); | ||
| 404 | } | ||
| 405 | |||
| 406 | static int dsiphy_enable(struct clk *clk) | ||
| 407 | { | ||
| 408 | u32 value; | ||
| 409 | int multi; | ||
| 410 | |||
| 411 | value = __raw_readl(clk->mapping->base); | ||
| 412 | multi = (value & 0x3f) + 1; | ||
| 413 | |||
| 414 | if ((multi < 12) || (multi > 33)) | ||
| 415 | return -EIO; | ||
| 416 | |||
| 417 | __raw_writel(value | 0x000B8000, clk->mapping->base); | ||
| 418 | |||
| 419 | return 0; | ||
| 420 | } | ||
| 421 | |||
| 422 | static int dsiphy_set_rate(struct clk *clk, unsigned long rate) | ||
| 423 | { | ||
| 424 | u32 value; | ||
| 425 | int idx; | ||
| 426 | |||
| 427 | idx = rate / clk->parent->rate; | ||
| 428 | if ((idx < 12) || (idx > 33)) | ||
| 429 | return -EINVAL; | ||
| 430 | |||
| 431 | idx += -1; | ||
| 432 | |||
| 433 | value = __raw_readl(clk->mapping->base); | ||
| 434 | value = (value & ~0x3f) + idx; | ||
| 435 | |||
| 436 | __raw_writel(value, clk->mapping->base); | ||
| 437 | |||
| 438 | return 0; | ||
| 439 | } | ||
| 440 | |||
| 441 | static struct clk_ops dsiphy_clk_ops = { | ||
| 442 | .recalc = dsiphy_recalc, | ||
| 443 | .round_rate = dsiphy_round_rate, | ||
| 444 | .set_rate = dsiphy_set_rate, | ||
| 445 | .enable = dsiphy_enable, | ||
| 446 | .disable = dsiphy_disable, | ||
| 447 | }; | ||
| 448 | |||
| 449 | static struct clk_mapping dsi0phy_clk_mapping = { | ||
| 450 | .phys = DSI0PHYCR, | ||
| 451 | .len = 4, | ||
| 452 | }; | ||
| 453 | |||
| 454 | static struct clk_mapping dsi1phy_clk_mapping = { | ||
| 455 | .phys = DSI1PHYCR, | ||
| 456 | .len = 4, | ||
| 457 | }; | ||
| 458 | |||
| 459 | static struct clk dsi0phy_clk = { | ||
| 460 | .ops = &dsiphy_clk_ops, | ||
| 461 | .parent = &div6_clks[DIV6_DSI0P], /* late install */ | ||
| 462 | .mapping = &dsi0phy_clk_mapping, | ||
| 463 | }; | ||
| 464 | |||
| 465 | static struct clk dsi1phy_clk = { | ||
| 466 | .ops = &dsiphy_clk_ops, | ||
| 467 | .parent = &div6_clks[DIV6_DSI1P], /* late install */ | ||
| 468 | .mapping = &dsi1phy_clk_mapping, | ||
| 469 | }; | ||
| 470 | |||
| 471 | static struct clk *late_main_clks[] = { | ||
| 472 | &dsi0phy_clk, | ||
| 473 | &dsi1phy_clk, | ||
| 474 | }; | ||
| 475 | |||
| 368 | enum { MSTP001, | 476 | enum { MSTP001, |
| 369 | MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100, | 477 | MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100, |
| 370 | MSTP219, | 478 | MSTP219, |
| @@ -429,6 +537,8 @@ static struct clk_lookup lookups[] = { | |||
| 429 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]), | 537 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]), |
| 430 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), | 538 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), |
| 431 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSI1P]), | 539 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSI1P]), |
| 540 | CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.0", &dsi0phy_clk), | ||
| 541 | CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.1", &dsi1phy_clk), | ||
| 432 | 542 | ||
| 433 | /* MSTP32 clocks */ | 543 | /* MSTP32 clocks */ |
| 434 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ | 544 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ |
| @@ -504,6 +614,9 @@ void __init sh73a0_clock_init(void) | |||
| 504 | if (!ret) | 614 | if (!ret) |
| 505 | ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); | 615 | ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); |
| 506 | 616 | ||
| 617 | for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++) | ||
| 618 | ret = clk_register(late_main_clks[k]); | ||
| 619 | |||
| 507 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 620 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
| 508 | 621 | ||
| 509 | if (!ret) | 622 | if (!ret) |
diff --git a/arch/arm/mach-shmobile/include/mach/sh73a0.h b/arch/arm/mach-shmobile/include/mach/sh73a0.h index 881d515a9686..cad57578ceed 100644 --- a/arch/arm/mach-shmobile/include/mach/sh73a0.h +++ b/arch/arm/mach-shmobile/include/mach/sh73a0.h | |||
| @@ -515,8 +515,8 @@ enum { | |||
| 515 | SHDMA_SLAVE_MMCIF_RX, | 515 | SHDMA_SLAVE_MMCIF_RX, |
| 516 | }; | 516 | }; |
| 517 | 517 | ||
| 518 | /* PINT interrupts are located at Linux IRQ 768 and up */ | 518 | /* PINT interrupts are located at Linux IRQ 800 and up */ |
| 519 | #define SH73A0_PINT0_IRQ(irq) ((irq) + 768) | 519 | #define SH73A0_PINT0_IRQ(irq) ((irq) + 800) |
| 520 | #define SH73A0_PINT1_IRQ(irq) ((irq) + 800) | 520 | #define SH73A0_PINT1_IRQ(irq) ((irq) + 832) |
| 521 | 521 | ||
| 522 | #endif /* __ASM_SH73A0_H__ */ | 522 | #endif /* __ASM_SH73A0_H__ */ |
diff --git a/arch/arm/mach-shmobile/intc-sh73a0.c b/arch/arm/mach-shmobile/intc-sh73a0.c index 1eda6b0b69e3..9857595eaa79 100644 --- a/arch/arm/mach-shmobile/intc-sh73a0.c +++ b/arch/arm/mach-shmobile/intc-sh73a0.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| 20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
| 21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
| 22 | #include <linux/module.h> | ||
| 22 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
| 23 | #include <linux/io.h> | 24 | #include <linux/io.h> |
| 24 | #include <linux/sh_intc.h> | 25 | #include <linux/sh_intc.h> |
| @@ -445,6 +446,7 @@ void __init sh73a0_init_irq(void) | |||
| 445 | setup_irq(gic_spi(1 + k), &sh73a0_irq_pin_cascade[k]); | 446 | setup_irq(gic_spi(1 + k), &sh73a0_irq_pin_cascade[k]); |
| 446 | 447 | ||
| 447 | n = intcs_evt2irq(to_intc_vect(gic_spi(1 + k))); | 448 | n = intcs_evt2irq(to_intc_vect(gic_spi(1 + k))); |
| 449 | WARN_ON(irq_alloc_desc_at(n, numa_node_id()) != n); | ||
| 448 | irq_set_chip_and_handler_name(n, &intca_gic_irq_chip, | 450 | irq_set_chip_and_handler_name(n, &intca_gic_irq_chip, |
| 449 | handle_level_irq, "level"); | 451 | handle_level_irq, "level"); |
| 450 | set_irq_flags(n, IRQF_VALID); /* yuck */ | 452 | set_irq_flags(n, IRQF_VALID); /* yuck */ |
diff --git a/arch/arm/mach-shmobile/pfc-r8a7779.c b/arch/arm/mach-shmobile/pfc-r8a7779.c index 963532f2b2c4..d14c9b048077 100644 --- a/arch/arm/mach-shmobile/pfc-r8a7779.c +++ b/arch/arm/mach-shmobile/pfc-r8a7779.c | |||
| @@ -2120,7 +2120,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = { | |||
| 2120 | FN_AUDATA3, 0, 0, 0 } | 2120 | FN_AUDATA3, 0, 0, 0 } |
| 2121 | }, | 2121 | }, |
| 2122 | { PINMUX_CFG_REG_VAR("IPSR4", 0xfffc0030, 32, | 2122 | { PINMUX_CFG_REG_VAR("IPSR4", 0xfffc0030, 32, |
| 2123 | 3, 1, 1, 1, 1, 1, 1, 3, 3, 1, | 2123 | 3, 1, 1, 1, 1, 1, 1, 3, 3, |
| 2124 | 1, 1, 1, 1, 1, 1, 3, 3, 3, 2) { | 2124 | 1, 1, 1, 1, 1, 1, 3, 3, 3, 2) { |
| 2125 | /* IP4_31_29 [3] */ | 2125 | /* IP4_31_29 [3] */ |
| 2126 | FN_DU1_DB0, FN_VI2_DATA4_VI2_B4, FN_SCL2_B, FN_SD3_DAT0, | 2126 | FN_DU1_DB0, FN_VI2_DATA4_VI2_B4, FN_SCL2_B, FN_SD3_DAT0, |
diff --git a/arch/arm/mach-shmobile/pfc-sh7372.c b/arch/arm/mach-shmobile/pfc-sh7372.c index 1bd6585a6acf..336093f9210a 100644 --- a/arch/arm/mach-shmobile/pfc-sh7372.c +++ b/arch/arm/mach-shmobile/pfc-sh7372.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
| 24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
| 25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
| 26 | #include <mach/irqs.h> | ||
| 26 | #include <mach/sh7372.h> | 27 | #include <mach/sh7372.h> |
| 27 | 28 | ||
| 28 | #define CPU_ALL_PORT(fn, pfx, sfx) \ | 29 | #define CPU_ALL_PORT(fn, pfx, sfx) \ |
| @@ -1594,6 +1595,43 @@ static struct pinmux_data_reg pinmux_data_regs[] = { | |||
| 1594 | { }, | 1595 | { }, |
| 1595 | }; | 1596 | }; |
| 1596 | 1597 | ||
| 1598 | #define EXT_IRQ16L(n) evt2irq(0x200 + ((n) << 5)) | ||
| 1599 | #define EXT_IRQ16H(n) evt2irq(0x3200 + (((n) - 16) << 5)) | ||
| 1600 | static struct pinmux_irq pinmux_irqs[] = { | ||
| 1601 | PINMUX_IRQ(EXT_IRQ16L(0), PORT6_FN0, PORT162_FN0), | ||
| 1602 | PINMUX_IRQ(EXT_IRQ16L(1), PORT12_FN0), | ||
| 1603 | PINMUX_IRQ(EXT_IRQ16L(2), PORT4_FN0, PORT5_FN0), | ||
| 1604 | PINMUX_IRQ(EXT_IRQ16L(3), PORT8_FN0, PORT16_FN0), | ||
| 1605 | PINMUX_IRQ(EXT_IRQ16L(4), PORT17_FN0, PORT163_FN0), | ||
| 1606 | PINMUX_IRQ(EXT_IRQ16L(5), PORT18_FN0), | ||
| 1607 | PINMUX_IRQ(EXT_IRQ16L(6), PORT39_FN0, PORT164_FN0), | ||
| 1608 | PINMUX_IRQ(EXT_IRQ16L(7), PORT40_FN0, PORT167_FN0), | ||
| 1609 | PINMUX_IRQ(EXT_IRQ16L(8), PORT41_FN0, PORT168_FN0), | ||
| 1610 | PINMUX_IRQ(EXT_IRQ16L(9), PORT42_FN0, PORT169_FN0), | ||
| 1611 | PINMUX_IRQ(EXT_IRQ16L(10), PORT65_FN0), | ||
| 1612 | PINMUX_IRQ(EXT_IRQ16L(11), PORT67_FN0), | ||
| 1613 | PINMUX_IRQ(EXT_IRQ16L(12), PORT80_FN0, PORT137_FN0), | ||
| 1614 | PINMUX_IRQ(EXT_IRQ16L(13), PORT81_FN0, PORT145_FN0), | ||
| 1615 | PINMUX_IRQ(EXT_IRQ16L(14), PORT82_FN0, PORT146_FN0), | ||
| 1616 | PINMUX_IRQ(EXT_IRQ16L(15), PORT83_FN0, PORT147_FN0), | ||
| 1617 | PINMUX_IRQ(EXT_IRQ16H(16), PORT84_FN0, PORT170_FN0), | ||
| 1618 | PINMUX_IRQ(EXT_IRQ16H(17), PORT85_FN0), | ||
| 1619 | PINMUX_IRQ(EXT_IRQ16H(18), PORT86_FN0), | ||
| 1620 | PINMUX_IRQ(EXT_IRQ16H(19), PORT87_FN0), | ||
| 1621 | PINMUX_IRQ(EXT_IRQ16H(20), PORT92_FN0), | ||
| 1622 | PINMUX_IRQ(EXT_IRQ16H(21), PORT93_FN0), | ||
| 1623 | PINMUX_IRQ(EXT_IRQ16H(22), PORT94_FN0), | ||
| 1624 | PINMUX_IRQ(EXT_IRQ16H(23), PORT95_FN0), | ||
| 1625 | PINMUX_IRQ(EXT_IRQ16H(24), PORT112_FN0), | ||
| 1626 | PINMUX_IRQ(EXT_IRQ16H(25), PORT119_FN0), | ||
| 1627 | PINMUX_IRQ(EXT_IRQ16H(26), PORT121_FN0, PORT172_FN0), | ||
| 1628 | PINMUX_IRQ(EXT_IRQ16H(27), PORT122_FN0, PORT180_FN0), | ||
| 1629 | PINMUX_IRQ(EXT_IRQ16H(28), PORT123_FN0, PORT181_FN0), | ||
| 1630 | PINMUX_IRQ(EXT_IRQ16H(29), PORT129_FN0, PORT182_FN0), | ||
| 1631 | PINMUX_IRQ(EXT_IRQ16H(30), PORT130_FN0, PORT183_FN0), | ||
| 1632 | PINMUX_IRQ(EXT_IRQ16H(31), PORT138_FN0, PORT184_FN0), | ||
| 1633 | }; | ||
| 1634 | |||
| 1597 | static struct pinmux_info sh7372_pinmux_info = { | 1635 | static struct pinmux_info sh7372_pinmux_info = { |
| 1598 | .name = "sh7372_pfc", | 1636 | .name = "sh7372_pfc", |
| 1599 | .reserved_id = PINMUX_RESERVED, | 1637 | .reserved_id = PINMUX_RESERVED, |
| @@ -1614,6 +1652,9 @@ static struct pinmux_info sh7372_pinmux_info = { | |||
| 1614 | 1652 | ||
| 1615 | .gpio_data = pinmux_data, | 1653 | .gpio_data = pinmux_data, |
| 1616 | .gpio_data_size = ARRAY_SIZE(pinmux_data), | 1654 | .gpio_data_size = ARRAY_SIZE(pinmux_data), |
| 1655 | |||
| 1656 | .gpio_irq = pinmux_irqs, | ||
| 1657 | .gpio_irq_size = ARRAY_SIZE(pinmux_irqs), | ||
| 1617 | }; | 1658 | }; |
| 1618 | 1659 | ||
| 1619 | void sh7372_pinmux_init(void) | 1660 | void sh7372_pinmux_init(void) |
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index 0d159d64a345..2d0d4212be41 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c | |||
| @@ -80,7 +80,7 @@ int __cpuinit sh73a0_boot_secondary(unsigned int cpu) | |||
| 80 | /* enable cache coherency */ | 80 | /* enable cache coherency */ |
| 81 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); | 81 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); |
| 82 | 82 | ||
| 83 | if (((__raw_readw(__io(PSTR)) >> (4 * cpu)) & 3) == 3) | 83 | if (((__raw_readl(__io(PSTR)) >> (4 * cpu)) & 3) == 3) |
| 84 | __raw_writel(1 << cpu, __io(WUPCR)); /* wake up */ | 84 | __raw_writel(1 << cpu, __io(WUPCR)); /* wake up */ |
| 85 | else | 85 | else |
| 86 | __raw_writel(1 << cpu, __io(SRESCR)); /* reset */ | 86 | __raw_writel(1 << cpu, __io(SRESCR)); /* reset */ |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 1a3ca2488164..7edef9121632 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
| @@ -631,7 +631,8 @@ comment "Processor Features" | |||
| 631 | 631 | ||
| 632 | config ARM_LPAE | 632 | config ARM_LPAE |
| 633 | bool "Support for the Large Physical Address Extension" | 633 | bool "Support for the Large Physical Address Extension" |
| 634 | depends on MMU && CPU_V7 | 634 | depends on MMU && CPU_32v7 && !CPU_32v6 && !CPU_32v5 && \ |
| 635 | !CPU_32v4 && !CPU_32v3 | ||
| 635 | help | 636 | help |
| 636 | Say Y if you have an ARMv7 processor supporting the LPAE page | 637 | Say Y if you have an ARMv7 processor supporting the LPAE page |
| 637 | table format and you would like to access memory beyond the | 638 | table format and you would like to access memory beyond the |
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index 7a24d39661f0..a655d3da386d 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
| @@ -55,7 +55,7 @@ loop1: | |||
| 55 | cmp r1, #2 @ see what cache we have at this level | 55 | cmp r1, #2 @ see what cache we have at this level |
| 56 | blt skip @ skip if no cache, or just i-cache | 56 | blt skip @ skip if no cache, or just i-cache |
| 57 | #ifdef CONFIG_PREEMPT | 57 | #ifdef CONFIG_PREEMPT |
| 58 | save_and_disable_irqs r9 @ make cssr&csidr read atomic | 58 | save_and_disable_irqs_notrace r9 @ make cssr&csidr read atomic |
| 59 | #endif | 59 | #endif |
| 60 | mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr | 60 | mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr |
| 61 | isb @ isb to sych the new cssr&csidr | 61 | isb @ isb to sych the new cssr&csidr |
diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c index 06383b51e655..4de7d1e79e73 100644 --- a/arch/arm/plat-omap/common.c +++ b/arch/arm/plat-omap/common.c | |||
| @@ -69,6 +69,7 @@ void __init omap_reserve(void) | |||
| 69 | omap_vram_reserve_sdram_memblock(); | 69 | omap_vram_reserve_sdram_memblock(); |
| 70 | omap_dsp_reserve_sdram_memblock(); | 70 | omap_dsp_reserve_sdram_memblock(); |
| 71 | omap_secure_ram_reserve_memblock(); | 71 | omap_secure_ram_reserve_memblock(); |
| 72 | omap_barrier_reserve_memblock(); | ||
| 72 | } | 73 | } |
| 73 | 74 | ||
| 74 | void __init omap_init_consistent_dma_size(void) | 75 | void __init omap_init_consistent_dma_size(void) |
diff --git a/arch/arm/plat-omap/include/plat/omap-secure.h b/arch/arm/plat-omap/include/plat/omap-secure.h index 3047ff923a63..8c7994ce9869 100644 --- a/arch/arm/plat-omap/include/plat/omap-secure.h +++ b/arch/arm/plat-omap/include/plat/omap-secure.h | |||
| @@ -10,4 +10,10 @@ static inline void omap_secure_ram_reserve_memblock(void) | |||
| 10 | { } | 10 | { } |
| 11 | #endif | 11 | #endif |
| 12 | 12 | ||
| 13 | #ifdef CONFIG_OMAP4_ERRATA_I688 | ||
| 14 | extern int omap_barrier_reserve_memblock(void); | ||
| 15 | #else | ||
| 16 | static inline void omap_barrier_reserve_memblock(void) | ||
| 17 | { } | ||
| 18 | #endif | ||
| 13 | #endif /* __OMAP_SECURE_H__ */ | 19 | #endif /* __OMAP_SECURE_H__ */ |
diff --git a/arch/c6x/boot/Makefile b/arch/c6x/boot/Makefile index ecca820e6041..6891257d514c 100644 --- a/arch/c6x/boot/Makefile +++ b/arch/c6x/boot/Makefile | |||
| @@ -13,7 +13,7 @@ obj-y += linked_dtb.o | |||
| 13 | endif | 13 | endif |
| 14 | 14 | ||
| 15 | $(obj)/%.dtb: $(src)/dts/%.dts FORCE | 15 | $(obj)/%.dtb: $(src)/dts/%.dts FORCE |
| 16 | $(call cmd,dtc) | 16 | $(call if_changed_dep,dtc) |
| 17 | 17 | ||
| 18 | quiet_cmd_cp = CP $< $@$2 | 18 | quiet_cmd_cp = CP $< $@$2 |
| 19 | cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) | 19 | cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) |
diff --git a/arch/m68k/include/asm/mcf_pgtable.h b/arch/m68k/include/asm/mcf_pgtable.h index 756bde4fb4f8..3c793682e5d9 100644 --- a/arch/m68k/include/asm/mcf_pgtable.h +++ b/arch/m68k/include/asm/mcf_pgtable.h | |||
| @@ -78,7 +78,8 @@ | |||
| 78 | | CF_PAGE_READABLE \ | 78 | | CF_PAGE_READABLE \ |
| 79 | | CF_PAGE_WRITABLE \ | 79 | | CF_PAGE_WRITABLE \ |
| 80 | | CF_PAGE_EXEC \ | 80 | | CF_PAGE_EXEC \ |
| 81 | | CF_PAGE_SYSTEM) | 81 | | CF_PAGE_SYSTEM \ |
| 82 | | CF_PAGE_SHARED) | ||
| 82 | 83 | ||
| 83 | #define PAGE_COPY __pgprot(CF_PAGE_VALID \ | 84 | #define PAGE_COPY __pgprot(CF_PAGE_VALID \ |
| 84 | | CF_PAGE_ACCESSED \ | 85 | | CF_PAGE_ACCESSED \ |
diff --git a/arch/m68k/mm/mcfmmu.c b/arch/m68k/mm/mcfmmu.c index babd5a97cdcb..875b800ef0dd 100644 --- a/arch/m68k/mm/mcfmmu.c +++ b/arch/m68k/mm/mcfmmu.c | |||
| @@ -87,7 +87,7 @@ void __init paging_init(void) | |||
| 87 | 87 | ||
| 88 | int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) | 88 | int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) |
| 89 | { | 89 | { |
| 90 | unsigned long flags, mmuar; | 90 | unsigned long flags, mmuar, mmutr; |
| 91 | struct mm_struct *mm; | 91 | struct mm_struct *mm; |
| 92 | pgd_t *pgd; | 92 | pgd_t *pgd; |
| 93 | pmd_t *pmd; | 93 | pmd_t *pmd; |
| @@ -137,9 +137,10 @@ int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) | |||
| 137 | if (!pte_dirty(*pte) && !KMAPAREA(mmuar)) | 137 | if (!pte_dirty(*pte) && !KMAPAREA(mmuar)) |
| 138 | set_pte(pte, pte_wrprotect(*pte)); | 138 | set_pte(pte, pte_wrprotect(*pte)); |
| 139 | 139 | ||
| 140 | mmu_write(MMUTR, (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | | 140 | mmutr = (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | MMUTR_V; |
| 141 | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK) | 141 | if ((mmuar < TASK_UNMAPPED_BASE) || (mmuar >= TASK_SIZE)) |
| 142 | >> CF_PAGE_MMUTR_SHIFT) | MMUTR_V); | 142 | mmutr |= (pte->pte & CF_PAGE_MMUTR_MASK) >> CF_PAGE_MMUTR_SHIFT; |
| 143 | mmu_write(MMUTR, mmutr); | ||
| 143 | 144 | ||
| 144 | mmu_write(MMUDR, (pte_val(*pte) & PAGE_MASK) | | 145 | mmu_write(MMUDR, (pte_val(*pte) & PAGE_MASK) | |
| 145 | ((pte->pte) & CF_PAGE_MMUDR_MASK) | MMUDR_SZ_8KB | MMUDR_X); | 146 | ((pte->pte) & CF_PAGE_MMUDR_MASK) | MMUDR_SZ_8KB | MMUDR_X); |
diff --git a/arch/m68k/platform/coldfire/entry.S b/arch/m68k/platform/coldfire/entry.S index 863889fc31c9..281e38c2b6c7 100644 --- a/arch/m68k/platform/coldfire/entry.S +++ b/arch/m68k/platform/coldfire/entry.S | |||
| @@ -136,7 +136,7 @@ Luser_return: | |||
| 136 | movel %sp,%d1 /* get thread_info pointer */ | 136 | movel %sp,%d1 /* get thread_info pointer */ |
| 137 | andl #-THREAD_SIZE,%d1 /* at base of kernel stack */ | 137 | andl #-THREAD_SIZE,%d1 /* at base of kernel stack */ |
| 138 | movel %d1,%a0 | 138 | movel %d1,%a0 |
| 139 | movel %a0@(TINFO_FLAGS),%d1 /* get thread_info->flags */ | 139 | moveb %a0@(TINFO_FLAGS+3),%d1 /* thread_info->flags (low 8 bits) */ |
| 140 | jne Lwork_to_do /* still work to do */ | 140 | jne Lwork_to_do /* still work to do */ |
| 141 | 141 | ||
| 142 | Lreturn: | 142 | Lreturn: |
| @@ -148,8 +148,6 @@ Lwork_to_do: | |||
| 148 | btst #TIF_NEED_RESCHED,%d1 | 148 | btst #TIF_NEED_RESCHED,%d1 |
| 149 | jne reschedule | 149 | jne reschedule |
| 150 | 150 | ||
| 151 | /* GERG: do we need something here for TRACEing?? */ | ||
| 152 | |||
| 153 | Lsignal_return: | 151 | Lsignal_return: |
| 154 | subql #4,%sp /* dummy return address */ | 152 | subql #4,%sp /* dummy return address */ |
| 155 | SAVE_SWITCH_STACK | 153 | SAVE_SWITCH_STACK |
diff --git a/arch/openrisc/include/asm/ptrace.h b/arch/openrisc/include/asm/ptrace.h index 054537c5f9c9..e612ce4512c7 100644 --- a/arch/openrisc/include/asm/ptrace.h +++ b/arch/openrisc/include/asm/ptrace.h | |||
| @@ -77,7 +77,6 @@ struct pt_regs { | |||
| 77 | long syscallno; /* Syscall number (used by strace) */ | 77 | long syscallno; /* Syscall number (used by strace) */ |
| 78 | long dummy; /* Cheap alignment fix */ | 78 | long dummy; /* Cheap alignment fix */ |
| 79 | }; | 79 | }; |
| 80 | #endif /* __ASSEMBLY__ */ | ||
| 81 | 80 | ||
| 82 | /* TODO: Rename this to REDZONE because that's what it is */ | 81 | /* TODO: Rename this to REDZONE because that's what it is */ |
| 83 | #define STACK_FRAME_OVERHEAD 128 /* size of minimum stack frame */ | 82 | #define STACK_FRAME_OVERHEAD 128 /* size of minimum stack frame */ |
| @@ -87,6 +86,13 @@ struct pt_regs { | |||
| 87 | #define user_stack_pointer(regs) ((unsigned long)(regs)->sp) | 86 | #define user_stack_pointer(regs) ((unsigned long)(regs)->sp) |
| 88 | #define profile_pc(regs) instruction_pointer(regs) | 87 | #define profile_pc(regs) instruction_pointer(regs) |
| 89 | 88 | ||
| 89 | static inline long regs_return_value(struct pt_regs *regs) | ||
| 90 | { | ||
| 91 | return regs->gpr[11]; | ||
| 92 | } | ||
| 93 | |||
| 94 | #endif /* __ASSEMBLY__ */ | ||
| 95 | |||
| 90 | /* | 96 | /* |
| 91 | * Offsets used by 'ptrace' system call interface. | 97 | * Offsets used by 'ptrace' system call interface. |
| 92 | */ | 98 | */ |
diff --git a/arch/openrisc/kernel/init_task.c b/arch/openrisc/kernel/init_task.c index 45744a384927..ca534082d5f3 100644 --- a/arch/openrisc/kernel/init_task.c +++ b/arch/openrisc/kernel/init_task.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | 17 | ||
| 18 | #include <linux/init_task.h> | 18 | #include <linux/init_task.h> |
| 19 | #include <linux/mqueue.h> | 19 | #include <linux/mqueue.h> |
| 20 | #include <linux/export.h> | ||
| 20 | 21 | ||
| 21 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 22 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
| 22 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 23 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
diff --git a/arch/openrisc/kernel/irq.c b/arch/openrisc/kernel/irq.c index 59b302338331..4bfead220956 100644 --- a/arch/openrisc/kernel/irq.c +++ b/arch/openrisc/kernel/irq.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
| 24 | #include <linux/seq_file.h> | 24 | #include <linux/seq_file.h> |
| 25 | #include <linux/kernel_stat.h> | 25 | #include <linux/kernel_stat.h> |
| 26 | #include <linux/export.h> | ||
| 26 | 27 | ||
| 27 | #include <linux/irqflags.h> | 28 | #include <linux/irqflags.h> |
| 28 | 29 | ||
diff --git a/arch/openrisc/kernel/ptrace.c b/arch/openrisc/kernel/ptrace.c index 656b94beab89..7259047d5f9d 100644 --- a/arch/openrisc/kernel/ptrace.c +++ b/arch/openrisc/kernel/ptrace.c | |||
| @@ -188,11 +188,9 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | |||
| 188 | */ | 188 | */ |
| 189 | ret = -1L; | 189 | ret = -1L; |
| 190 | 190 | ||
| 191 | /* Are these regs right??? */ | 191 | audit_syscall_entry(audit_arch(), regs->syscallno, |
| 192 | if (unlikely(current->audit_context)) | 192 | regs->gpr[3], regs->gpr[4], |
| 193 | audit_syscall_entry(audit_arch(), regs->syscallno, | 193 | regs->gpr[5], regs->gpr[6]); |
| 194 | regs->gpr[3], regs->gpr[4], | ||
| 195 | regs->gpr[5], regs->gpr[6]); | ||
| 196 | 194 | ||
| 197 | return ret ? : regs->syscallno; | 195 | return ret ? : regs->syscallno; |
| 198 | } | 196 | } |
| @@ -201,9 +199,7 @@ asmlinkage void do_syscall_trace_leave(struct pt_regs *regs) | |||
| 201 | { | 199 | { |
| 202 | int step; | 200 | int step; |
| 203 | 201 | ||
| 204 | if (unlikely(current->audit_context)) | 202 | audit_syscall_exit(regs); |
| 205 | audit_syscall_exit(AUDITSC_RESULT(regs->gpr[11]), | ||
| 206 | regs->gpr[11]); | ||
| 207 | 203 | ||
| 208 | step = test_thread_flag(TIF_SINGLESTEP); | 204 | step = test_thread_flag(TIF_SINGLESTEP); |
| 209 | if (step || test_thread_flag(TIF_SYSCALL_TRACE)) | 205 | if (step || test_thread_flag(TIF_SYSCALL_TRACE)) |
diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile index 55cca1dac431..19ab7b2ea1cd 100644 --- a/arch/parisc/Makefile +++ b/arch/parisc/Makefile | |||
| @@ -31,7 +31,11 @@ ifdef CONFIG_64BIT | |||
| 31 | UTS_MACHINE := parisc64 | 31 | UTS_MACHINE := parisc64 |
| 32 | CHECKFLAGS += -D__LP64__=1 -m64 | 32 | CHECKFLAGS += -D__LP64__=1 -m64 |
| 33 | WIDTH := 64 | 33 | WIDTH := 64 |
| 34 | |||
| 35 | # FIXME: if no default set, should really try to locate dynamically | ||
| 36 | ifeq ($(CROSS_COMPILE),) | ||
| 34 | CROSS_COMPILE := hppa64-linux-gnu- | 37 | CROSS_COMPILE := hppa64-linux-gnu- |
| 38 | endif | ||
| 35 | else # 32-bit | 39 | else # 32-bit |
| 36 | WIDTH := | 40 | WIDTH := |
| 37 | endif | 41 | endif |
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 4f80cf1ce77b..3e57a00b8cba 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
| @@ -1213,7 +1213,7 @@ do_user_signal: /* r10 contains MSR_KERNEL here */ | |||
| 1213 | stw r3,_TRAP(r1) | 1213 | stw r3,_TRAP(r1) |
| 1214 | 2: addi r3,r1,STACK_FRAME_OVERHEAD | 1214 | 2: addi r3,r1,STACK_FRAME_OVERHEAD |
| 1215 | mr r4,r9 | 1215 | mr r4,r9 |
| 1216 | bl do_signal | 1216 | bl do_notify_resume |
| 1217 | REST_NVGPRS(r1) | 1217 | REST_NVGPRS(r1) |
| 1218 | b recheck | 1218 | b recheck |
| 1219 | 1219 | ||
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index d834425186ae..866462cbe2d8 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
| @@ -751,12 +751,16 @@ user_work: | |||
| 751 | 751 | ||
| 752 | andi. r0,r4,_TIF_NEED_RESCHED | 752 | andi. r0,r4,_TIF_NEED_RESCHED |
| 753 | beq 1f | 753 | beq 1f |
| 754 | li r5,1 | ||
| 755 | TRACE_AND_RESTORE_IRQ(r5); | ||
| 754 | bl .schedule | 756 | bl .schedule |
| 755 | b .ret_from_except_lite | 757 | b .ret_from_except_lite |
| 756 | 758 | ||
| 757 | 1: bl .save_nvgprs | 759 | 1: bl .save_nvgprs |
| 760 | li r5,1 | ||
| 761 | TRACE_AND_RESTORE_IRQ(r5); | ||
| 758 | addi r3,r1,STACK_FRAME_OVERHEAD | 762 | addi r3,r1,STACK_FRAME_OVERHEAD |
| 759 | bl .do_signal | 763 | bl .do_notify_resume |
| 760 | b .ret_from_except | 764 | b .ret_from_except |
| 761 | 765 | ||
| 762 | unrecov_restore: | 766 | unrecov_restore: |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 3844ca7c5099..15c5a4f6de01 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
| @@ -774,8 +774,8 @@ alignment_common: | |||
| 774 | program_check_common: | 774 | program_check_common: |
| 775 | EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN) | 775 | EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN) |
| 776 | bl .save_nvgprs | 776 | bl .save_nvgprs |
| 777 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
| 778 | DISABLE_INTS | 777 | DISABLE_INTS |
| 778 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
| 779 | bl .program_check_exception | 779 | bl .program_check_exception |
| 780 | b .ret_from_except | 780 | b .ret_from_except |
| 781 | 781 | ||
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 2300426e531a..ac6e437b1021 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | #include <linux/tracehook.h> | 12 | #include <linux/tracehook.h> |
| 13 | #include <linux/signal.h> | 13 | #include <linux/signal.h> |
| 14 | #include <linux/key.h> | ||
| 14 | #include <asm/hw_breakpoint.h> | 15 | #include <asm/hw_breakpoint.h> |
| 15 | #include <asm/uaccess.h> | 16 | #include <asm/uaccess.h> |
| 16 | #include <asm/unistd.h> | 17 | #include <asm/unistd.h> |
| @@ -113,8 +114,9 @@ static void check_syscall_restart(struct pt_regs *regs, struct k_sigaction *ka, | |||
| 113 | } | 114 | } |
| 114 | } | 115 | } |
| 115 | 116 | ||
| 116 | static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) | 117 | static int do_signal(struct pt_regs *regs) |
| 117 | { | 118 | { |
| 119 | sigset_t *oldset; | ||
| 118 | siginfo_t info; | 120 | siginfo_t info; |
| 119 | int signr; | 121 | int signr; |
| 120 | struct k_sigaction ka; | 122 | struct k_sigaction ka; |
| @@ -123,7 +125,7 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) | |||
| 123 | 125 | ||
| 124 | if (current_thread_info()->local_flags & _TLF_RESTORE_SIGMASK) | 126 | if (current_thread_info()->local_flags & _TLF_RESTORE_SIGMASK) |
| 125 | oldset = ¤t->saved_sigmask; | 127 | oldset = ¤t->saved_sigmask; |
| 126 | else if (!oldset) | 128 | else |
| 127 | oldset = ¤t->blocked; | 129 | oldset = ¤t->blocked; |
| 128 | 130 | ||
| 129 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 131 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| @@ -191,14 +193,16 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) | |||
| 191 | return ret; | 193 | return ret; |
| 192 | } | 194 | } |
| 193 | 195 | ||
| 194 | void do_signal(struct pt_regs *regs, unsigned long thread_info_flags) | 196 | void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) |
| 195 | { | 197 | { |
| 196 | if (thread_info_flags & _TIF_SIGPENDING) | 198 | if (thread_info_flags & _TIF_SIGPENDING) |
| 197 | do_signal_pending(NULL, regs); | 199 | do_signal(regs); |
| 198 | 200 | ||
| 199 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | 201 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { |
| 200 | clear_thread_flag(TIF_NOTIFY_RESUME); | 202 | clear_thread_flag(TIF_NOTIFY_RESUME); |
| 201 | tracehook_notify_resume(regs); | 203 | tracehook_notify_resume(regs); |
| 204 | if (current->replacement_session_keyring) | ||
| 205 | key_replace_session_keyring(); | ||
| 202 | } | 206 | } |
| 203 | } | 207 | } |
| 204 | 208 | ||
diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h index 6c0ddfc0603e..8dde973aaaf5 100644 --- a/arch/powerpc/kernel/signal.h +++ b/arch/powerpc/kernel/signal.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 13 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
| 14 | 14 | ||
| 15 | extern void do_signal(struct pt_regs *regs, unsigned long thread_info_flags); | 15 | extern void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags); |
| 16 | 16 | ||
| 17 | extern void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | 17 | extern void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, |
| 18 | size_t frame_size, int is_32); | 18 | size_t frame_size, int is_32); |
diff --git a/arch/powerpc/platforms/wsp/smp.c b/arch/powerpc/platforms/wsp/smp.c index 71bd105f3863..0ba103ae83a5 100644 --- a/arch/powerpc/platforms/wsp/smp.c +++ b/arch/powerpc/platforms/wsp/smp.c | |||
| @@ -71,7 +71,7 @@ int __devinit smp_a2_kick_cpu(int nr) | |||
| 71 | 71 | ||
| 72 | static int __init smp_a2_probe(void) | 72 | static int __init smp_a2_probe(void) |
| 73 | { | 73 | { |
| 74 | return cpus_weight(cpu_possible_map); | 74 | return num_possible_cpus(); |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | static struct smp_ops_t a2_smp_ops = { | 77 | static struct smp_ops_t a2_smp_ops = { |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index d1727584230a..6d99a5fcc090 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
| @@ -227,6 +227,9 @@ config COMPAT | |||
| 227 | config SYSVIPC_COMPAT | 227 | config SYSVIPC_COMPAT |
| 228 | def_bool y if COMPAT && SYSVIPC | 228 | def_bool y if COMPAT && SYSVIPC |
| 229 | 229 | ||
| 230 | config KEYS_COMPAT | ||
| 231 | def_bool y if COMPAT && KEYS | ||
| 232 | |||
| 230 | config AUDIT_ARCH | 233 | config AUDIT_ARCH |
| 231 | def_bool y | 234 | def_bool y |
| 232 | 235 | ||
diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h index 2e49748b27da..234f1d859cea 100644 --- a/arch/s390/include/asm/compat.h +++ b/arch/s390/include/asm/compat.h | |||
| @@ -172,13 +172,6 @@ static inline int is_compat_task(void) | |||
| 172 | return is_32bit_task(); | 172 | return is_32bit_task(); |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | #else | ||
| 176 | |||
| 177 | static inline int is_compat_task(void) | ||
| 178 | { | ||
| 179 | return 0; | ||
| 180 | } | ||
| 181 | |||
| 182 | #endif | 175 | #endif |
| 183 | 176 | ||
| 184 | static inline void __user *arch_compat_alloc_user_space(long len) | 177 | static inline void __user *arch_compat_alloc_user_space(long len) |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 18c51df9fe06..ff605a39cf43 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
| @@ -662,7 +662,7 @@ ENTRY(sys32_getresuid16_wrapper) | |||
| 662 | ENTRY(sys32_poll_wrapper) | 662 | ENTRY(sys32_poll_wrapper) |
| 663 | llgtr %r2,%r2 # struct pollfd * | 663 | llgtr %r2,%r2 # struct pollfd * |
| 664 | llgfr %r3,%r3 # unsigned int | 664 | llgfr %r3,%r3 # unsigned int |
| 665 | lgfr %r4,%r4 # long | 665 | lgfr %r4,%r4 # int |
| 666 | jg sys_poll # branch to system call | 666 | jg sys_poll # branch to system call |
| 667 | 667 | ||
| 668 | ENTRY(sys32_setresgid16_wrapper) | 668 | ENTRY(sys32_setresgid16_wrapper) |
diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c index 39f8fd4438fc..c383ce440d99 100644 --- a/arch/s390/kernel/crash_dump.c +++ b/arch/s390/kernel/crash_dump.c | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 12 | #include <linux/gfp.h> | 12 | #include <linux/gfp.h> |
| 13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
| 14 | #include <linux/crash_dump.h> | ||
| 15 | #include <linux/bootmem.h> | 14 | #include <linux/bootmem.h> |
| 16 | #include <linux/elf.h> | 15 | #include <linux/elf.h> |
| 17 | #include <asm/ipl.h> | 16 | #include <asm/ipl.h> |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 3201ae447990..e795933eb2cb 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
| 30 | #include <asm/timer.h> | 30 | #include <asm/timer.h> |
| 31 | #include <asm/nmi.h> | 31 | #include <asm/nmi.h> |
| 32 | #include <asm/compat.h> | ||
| 33 | #include <asm/smp.h> | 32 | #include <asm/smp.h> |
| 34 | #include "entry.h" | 33 | #include "entry.h" |
| 35 | 34 | ||
| @@ -76,7 +75,6 @@ static void default_idle(void) | |||
| 76 | if (test_thread_flag(TIF_MCCK_PENDING)) { | 75 | if (test_thread_flag(TIF_MCCK_PENDING)) { |
| 77 | local_mcck_enable(); | 76 | local_mcck_enable(); |
| 78 | local_irq_enable(); | 77 | local_irq_enable(); |
| 79 | s390_handle_mcck(); | ||
| 80 | return; | 78 | return; |
| 81 | } | 79 | } |
| 82 | trace_hardirqs_on(); | 80 | trace_hardirqs_on(); |
| @@ -93,10 +91,12 @@ void cpu_idle(void) | |||
| 93 | for (;;) { | 91 | for (;;) { |
| 94 | tick_nohz_idle_enter(); | 92 | tick_nohz_idle_enter(); |
| 95 | rcu_idle_enter(); | 93 | rcu_idle_enter(); |
| 96 | while (!need_resched()) | 94 | while (!need_resched() && !test_thread_flag(TIF_MCCK_PENDING)) |
| 97 | default_idle(); | 95 | default_idle(); |
| 98 | rcu_idle_exit(); | 96 | rcu_idle_exit(); |
| 99 | tick_nohz_idle_exit(); | 97 | tick_nohz_idle_exit(); |
| 98 | if (test_thread_flag(TIF_MCCK_PENDING)) | ||
| 99 | s390_handle_mcck(); | ||
| 100 | preempt_enable_no_resched(); | 100 | preempt_enable_no_resched(); |
| 101 | schedule(); | 101 | schedule(); |
| 102 | preempt_disable(); | 102 | preempt_disable(); |
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 9d82ed4bcb27..61f95489d70c 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
| @@ -20,8 +20,8 @@ | |||
| 20 | #include <linux/regset.h> | 20 | #include <linux/regset.h> |
| 21 | #include <linux/tracehook.h> | 21 | #include <linux/tracehook.h> |
| 22 | #include <linux/seccomp.h> | 22 | #include <linux/seccomp.h> |
| 23 | #include <linux/compat.h> | ||
| 23 | #include <trace/syscall.h> | 24 | #include <trace/syscall.h> |
| 24 | #include <asm/compat.h> | ||
| 25 | #include <asm/segment.h> | 25 | #include <asm/segment.h> |
| 26 | #include <asm/page.h> | 26 | #include <asm/page.h> |
| 27 | #include <asm/pgtable.h> | 27 | #include <asm/pgtable.h> |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 354de0763eff..3b2efc81f34e 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | #include <linux/kexec.h> | 46 | #include <linux/kexec.h> |
| 47 | #include <linux/crash_dump.h> | 47 | #include <linux/crash_dump.h> |
| 48 | #include <linux/memory.h> | 48 | #include <linux/memory.h> |
| 49 | #include <linux/compat.h> | ||
| 49 | 50 | ||
| 50 | #include <asm/ipl.h> | 51 | #include <asm/ipl.h> |
| 51 | #include <asm/uaccess.h> | 52 | #include <asm/uaccess.h> |
| @@ -59,7 +60,6 @@ | |||
| 59 | #include <asm/ptrace.h> | 60 | #include <asm/ptrace.h> |
| 60 | #include <asm/sections.h> | 61 | #include <asm/sections.h> |
| 61 | #include <asm/ebcdic.h> | 62 | #include <asm/ebcdic.h> |
| 62 | #include <asm/compat.h> | ||
| 63 | #include <asm/kvm_virtio.h> | 63 | #include <asm/kvm_virtio.h> |
| 64 | #include <asm/diag.h> | 64 | #include <asm/diag.h> |
| 65 | 65 | ||
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index a8ba840294ff..2d421d90fada 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
| @@ -30,7 +30,6 @@ | |||
| 30 | #include <asm/ucontext.h> | 30 | #include <asm/ucontext.h> |
| 31 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
| 32 | #include <asm/lowcore.h> | 32 | #include <asm/lowcore.h> |
| 33 | #include <asm/compat.h> | ||
| 34 | #include "entry.h" | 33 | #include "entry.h" |
| 35 | 34 | ||
| 36 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 35 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index fa02f443f5f6..14da278febbf 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
| @@ -113,11 +113,14 @@ static void fixup_clock_comparator(unsigned long long delta) | |||
| 113 | static int s390_next_ktime(ktime_t expires, | 113 | static int s390_next_ktime(ktime_t expires, |
| 114 | struct clock_event_device *evt) | 114 | struct clock_event_device *evt) |
| 115 | { | 115 | { |
| 116 | struct timespec ts; | ||
| 116 | u64 nsecs; | 117 | u64 nsecs; |
| 117 | 118 | ||
| 118 | nsecs = ktime_to_ns(ktime_sub(expires, ktime_get_monotonic_offset())); | 119 | ts.tv_sec = ts.tv_nsec = 0; |
| 120 | monotonic_to_bootbased(&ts); | ||
| 121 | nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires)); | ||
| 119 | do_div(nsecs, 125); | 122 | do_div(nsecs, 125); |
| 120 | S390_lowcore.clock_comparator = TOD_UNIX_EPOCH + (nsecs << 9); | 123 | S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9); |
| 121 | set_clock_comparator(S390_lowcore.clock_comparator); | 124 | set_clock_comparator(S390_lowcore.clock_comparator); |
| 122 | return 0; | 125 | return 0; |
| 123 | } | 126 | } |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 354dd39073ef..e8fcd928dc78 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
| @@ -36,7 +36,6 @@ | |||
| 36 | #include <asm/pgtable.h> | 36 | #include <asm/pgtable.h> |
| 37 | #include <asm/irq.h> | 37 | #include <asm/irq.h> |
| 38 | #include <asm/mmu_context.h> | 38 | #include <asm/mmu_context.h> |
| 39 | #include <asm/compat.h> | ||
| 40 | #include "../kernel/entry.h" | 39 | #include "../kernel/entry.h" |
| 41 | 40 | ||
| 42 | #ifndef CONFIG_64BIT | 41 | #ifndef CONFIG_64BIT |
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index 5d633019d8f3..50236610de83 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c | |||
| @@ -223,16 +223,38 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
| 223 | #ifdef CONFIG_MEMORY_HOTPLUG | 223 | #ifdef CONFIG_MEMORY_HOTPLUG |
| 224 | int arch_add_memory(int nid, u64 start, u64 size) | 224 | int arch_add_memory(int nid, u64 start, u64 size) |
| 225 | { | 225 | { |
| 226 | struct pglist_data *pgdat; | 226 | unsigned long zone_start_pfn, zone_end_pfn, nr_pages; |
| 227 | unsigned long start_pfn = PFN_DOWN(start); | ||
| 228 | unsigned long size_pages = PFN_DOWN(size); | ||
| 227 | struct zone *zone; | 229 | struct zone *zone; |
| 228 | int rc; | 230 | int rc; |
| 229 | 231 | ||
| 230 | pgdat = NODE_DATA(nid); | ||
| 231 | zone = pgdat->node_zones + ZONE_MOVABLE; | ||
| 232 | rc = vmem_add_mapping(start, size); | 232 | rc = vmem_add_mapping(start, size); |
| 233 | if (rc) | 233 | if (rc) |
| 234 | return rc; | 234 | return rc; |
| 235 | rc = __add_pages(nid, zone, PFN_DOWN(start), PFN_DOWN(size)); | 235 | for_each_zone(zone) { |
| 236 | if (zone_idx(zone) != ZONE_MOVABLE) { | ||
| 237 | /* Add range within existing zone limits */ | ||
| 238 | zone_start_pfn = zone->zone_start_pfn; | ||
| 239 | zone_end_pfn = zone->zone_start_pfn + | ||
| 240 | zone->spanned_pages; | ||
| 241 | } else { | ||
| 242 | /* Add remaining range to ZONE_MOVABLE */ | ||
| 243 | zone_start_pfn = start_pfn; | ||
| 244 | zone_end_pfn = start_pfn + size_pages; | ||
| 245 | } | ||
| 246 | if (start_pfn < zone_start_pfn || start_pfn >= zone_end_pfn) | ||
| 247 | continue; | ||
| 248 | nr_pages = (start_pfn + size_pages > zone_end_pfn) ? | ||
| 249 | zone_end_pfn - start_pfn : size_pages; | ||
| 250 | rc = __add_pages(nid, zone, start_pfn, nr_pages); | ||
| 251 | if (rc) | ||
| 252 | break; | ||
| 253 | start_pfn += nr_pages; | ||
| 254 | size_pages -= nr_pages; | ||
| 255 | if (!size_pages) | ||
| 256 | break; | ||
| 257 | } | ||
| 236 | if (rc) | 258 | if (rc) |
| 237 | vmem_remove_mapping(start, size); | 259 | vmem_remove_mapping(start, size); |
| 238 | return rc; | 260 | return rc; |
diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index f09c74881b7e..a0155c02e324 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c | |||
| @@ -29,8 +29,8 @@ | |||
| 29 | #include <linux/mman.h> | 29 | #include <linux/mman.h> |
| 30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
| 31 | #include <linux/random.h> | 31 | #include <linux/random.h> |
| 32 | #include <linux/compat.h> | ||
| 32 | #include <asm/pgalloc.h> | 33 | #include <asm/pgalloc.h> |
| 33 | #include <asm/compat.h> | ||
| 34 | 34 | ||
| 35 | static unsigned long stack_maxrandom_size(void) | 35 | static unsigned long stack_maxrandom_size(void) |
| 36 | { | 36 | { |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 9a4d02f64f16..51b0738e13d1 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
| @@ -574,7 +574,7 @@ static inline void page_table_free_pgste(unsigned long *table) | |||
| 574 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); | 574 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); |
| 575 | mp = (struct gmap_pgtable *) page->index; | 575 | mp = (struct gmap_pgtable *) page->index; |
| 576 | BUG_ON(!list_empty(&mp->mapper)); | 576 | BUG_ON(!list_empty(&mp->mapper)); |
| 577 | pgtable_page_ctor(page); | 577 | pgtable_page_dtor(page); |
| 578 | atomic_set(&page->_mapcount, -1); | 578 | atomic_set(&page->_mapcount, -1); |
| 579 | kfree(mp); | 579 | kfree(mp); |
| 580 | __free_page(page); | 580 | __free_page(page); |
diff --git a/arch/sh/boards/board-sh7757lcr.c b/arch/sh/boards/board-sh7757lcr.c index 0838154dd216..24b1ee410daa 100644 --- a/arch/sh/boards/board-sh7757lcr.c +++ b/arch/sh/boards/board-sh7757lcr.c | |||
| @@ -169,6 +169,11 @@ static struct resource sh_eth_giga1_resources[] = { | |||
| 169 | .end = 0xfee00fff, | 169 | .end = 0xfee00fff, |
| 170 | .flags = IORESOURCE_MEM, | 170 | .flags = IORESOURCE_MEM, |
| 171 | }, { | 171 | }, { |
| 172 | /* TSU */ | ||
| 173 | .start = 0xfee01800, | ||
| 174 | .end = 0xfee01fff, | ||
| 175 | .flags = IORESOURCE_MEM, | ||
| 176 | }, { | ||
| 172 | .start = 316, | 177 | .start = 316, |
| 173 | .end = 316, | 178 | .end = 316, |
| 174 | .flags = IORESOURCE_IRQ, | 179 | .flags = IORESOURCE_IRQ, |
| @@ -210,20 +215,13 @@ static struct resource sh_mmcif_resources[] = { | |||
| 210 | }, | 215 | }, |
| 211 | }; | 216 | }; |
| 212 | 217 | ||
| 213 | static struct sh_mmcif_dma sh7757lcr_mmcif_dma = { | ||
| 214 | .chan_priv_tx = { | ||
| 215 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 216 | }, | ||
| 217 | .chan_priv_rx = { | ||
| 218 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 219 | } | ||
| 220 | }; | ||
| 221 | |||
| 222 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 218 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
| 223 | .dma = &sh7757lcr_mmcif_dma, | ||
| 224 | .sup_pclk = 0x0f, | 219 | .sup_pclk = 0x0f, |
| 225 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, | 220 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA | |
| 221 | MMC_CAP_NONREMOVABLE, | ||
| 226 | .ocr = MMC_VDD_32_33 | MMC_VDD_33_34, | 222 | .ocr = MMC_VDD_32_33 | MMC_VDD_33_34, |
| 223 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, | ||
| 224 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 227 | }; | 225 | }; |
| 228 | 226 | ||
| 229 | static struct platform_device sh_mmcif_device = { | 227 | static struct platform_device sh_mmcif_device = { |
diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c index 6418e95c2b6b..ebd0f818a25f 100644 --- a/arch/sh/boards/mach-ap325rxa/setup.c +++ b/arch/sh/boards/mach-ap325rxa/setup.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/i2c.h> | 22 | #include <linux/i2c.h> |
| 23 | #include <linux/smsc911x.h> | 23 | #include <linux/smsc911x.h> |
| 24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
| 25 | #include <linux/videodev2.h> | ||
| 25 | #include <media/ov772x.h> | 26 | #include <media/ov772x.h> |
| 26 | #include <media/soc_camera.h> | 27 | #include <media/soc_camera.h> |
| 27 | #include <media/soc_camera_platform.h> | 28 | #include <media/soc_camera_platform.h> |
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 033ef2ba621f..cde7c0085ced 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
| @@ -29,9 +29,11 @@ | |||
| 29 | #include <linux/input.h> | 29 | #include <linux/input.h> |
| 30 | #include <linux/input/sh_keysc.h> | 30 | #include <linux/input/sh_keysc.h> |
| 31 | #include <linux/sh_eth.h> | 31 | #include <linux/sh_eth.h> |
| 32 | #include <linux/videodev2.h> | ||
| 32 | #include <video/sh_mobile_lcdc.h> | 33 | #include <video/sh_mobile_lcdc.h> |
| 33 | #include <sound/sh_fsi.h> | 34 | #include <sound/sh_fsi.h> |
| 34 | #include <media/sh_mobile_ceu.h> | 35 | #include <media/sh_mobile_ceu.h> |
| 36 | #include <media/soc_camera.h> | ||
| 35 | #include <media/tw9910.h> | 37 | #include <media/tw9910.h> |
| 36 | #include <media/mt9t112.h> | 38 | #include <media/mt9t112.h> |
| 37 | #include <asm/heartbeat.h> | 39 | #include <asm/heartbeat.h> |
diff --git a/arch/sh/boards/mach-kfr2r09/setup.c b/arch/sh/boards/mach-kfr2r09/setup.c index 2a18b06abdaf..5b382e1afaea 100644 --- a/arch/sh/boards/mach-kfr2r09/setup.c +++ b/arch/sh/boards/mach-kfr2r09/setup.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/input/sh_keysc.h> | 22 | #include <linux/input/sh_keysc.h> |
| 23 | #include <linux/i2c.h> | 23 | #include <linux/i2c.h> |
| 24 | #include <linux/usb/r8a66597.h> | 24 | #include <linux/usb/r8a66597.h> |
| 25 | #include <linux/videodev2.h> | ||
| 25 | #include <media/rj54n1cb0c.h> | 26 | #include <media/rj54n1cb0c.h> |
| 26 | #include <media/soc_camera.h> | 27 | #include <media/soc_camera.h> |
| 27 | #include <media/sh_mobile_ceu.h> | 28 | #include <media/sh_mobile_ceu.h> |
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index 68c3d6f42896..d37ba2720527 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c | |||
| @@ -21,9 +21,11 @@ | |||
| 21 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
| 22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
| 23 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
| 24 | #include <linux/videodev2.h> | ||
| 24 | #include <video/sh_mobile_lcdc.h> | 25 | #include <video/sh_mobile_lcdc.h> |
| 25 | #include <media/sh_mobile_ceu.h> | 26 | #include <media/sh_mobile_ceu.h> |
| 26 | #include <media/ov772x.h> | 27 | #include <media/ov772x.h> |
| 28 | #include <media/soc_camera.h> | ||
| 27 | #include <media/tw9910.h> | 29 | #include <media/tw9910.h> |
| 28 | #include <asm/clock.h> | 30 | #include <asm/clock.h> |
| 29 | #include <asm/machvec.h> | 31 | #include <asm/machvec.h> |
diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index 036fe1adaef1..2b07fc016950 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/input/sh_keysc.h> | 24 | #include <linux/input/sh_keysc.h> |
| 25 | #include <linux/usb/r8a66597.h> | 25 | #include <linux/usb/r8a66597.h> |
| 26 | #include <linux/sh_eth.h> | 26 | #include <linux/sh_eth.h> |
| 27 | #include <linux/videodev2.h> | ||
| 27 | #include <video/sh_mobile_lcdc.h> | 28 | #include <video/sh_mobile_lcdc.h> |
| 28 | #include <media/sh_mobile_ceu.h> | 29 | #include <media/sh_mobile_ceu.h> |
| 29 | #include <sound/sh_fsi.h> | 30 | #include <sound/sh_fsi.h> |
diff --git a/arch/sh/drivers/pci/pci-sh7780.c b/arch/sh/drivers/pci/pci-sh7780.c index fa7b978cc727..fb8f14990743 100644 --- a/arch/sh/drivers/pci/pci-sh7780.c +++ b/arch/sh/drivers/pci/pci-sh7780.c | |||
| @@ -74,7 +74,7 @@ struct pci_errors { | |||
| 74 | { SH4_PCIINT_MLCK, "master lock error" }, | 74 | { SH4_PCIINT_MLCK, "master lock error" }, |
| 75 | { SH4_PCIINT_TABT, "target-target abort" }, | 75 | { SH4_PCIINT_TABT, "target-target abort" }, |
| 76 | { SH4_PCIINT_TRET, "target retry time out" }, | 76 | { SH4_PCIINT_TRET, "target retry time out" }, |
| 77 | { SH4_PCIINT_MFDE, "master function disable erorr" }, | 77 | { SH4_PCIINT_MFDE, "master function disable error" }, |
| 78 | { SH4_PCIINT_PRTY, "address parity error" }, | 78 | { SH4_PCIINT_PRTY, "address parity error" }, |
| 79 | { SH4_PCIINT_SERR, "SERR" }, | 79 | { SH4_PCIINT_SERR, "SERR" }, |
| 80 | { SH4_PCIINT_TWDP, "data parity error for target write" }, | 80 | { SH4_PCIINT_TWDP, "data parity error for target write" }, |
diff --git a/arch/sh/include/asm/device.h b/arch/sh/include/asm/device.h index a1c9c0daec10..071bcb4d4bfd 100644 --- a/arch/sh/include/asm/device.h +++ b/arch/sh/include/asm/device.h | |||
| @@ -3,9 +3,10 @@ | |||
| 3 | * | 3 | * |
| 4 | * This file is released under the GPLv2 | 4 | * This file is released under the GPLv2 |
| 5 | */ | 5 | */ |
| 6 | #ifndef __ASM_SH_DEVICE_H | ||
| 7 | #define __ASM_SH_DEVICE_H | ||
| 6 | 8 | ||
| 7 | struct dev_archdata { | 9 | #include <asm-generic/device.h> |
| 8 | }; | ||
| 9 | 10 | ||
| 10 | struct platform_device; | 11 | struct platform_device; |
| 11 | /* allocate contiguous memory chunk and fill in struct resource */ | 12 | /* allocate contiguous memory chunk and fill in struct resource */ |
| @@ -14,5 +15,4 @@ int platform_resource_setup_memory(struct platform_device *pdev, | |||
| 14 | 15 | ||
| 15 | void plat_early_device_setup(void); | 16 | void plat_early_device_setup(void); |
| 16 | 17 | ||
| 17 | struct pdev_archdata { | 18 | #endif /* __ASM_SH_DEVICE_H */ |
| 18 | }; | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c b/arch/sh/kernel/cpu/sh4a/clock-sh7724.c index b3c039a5064a..70bd96646f42 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7724.c | |||
| @@ -343,7 +343,7 @@ static struct clk_lookup lookups[] = { | |||
| 343 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[HWBLK_CEU1]), | 343 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[HWBLK_CEU1]), |
| 344 | CLKDEV_CON_ID("beu1", &mstp_clks[HWBLK_BEU1]), | 344 | CLKDEV_CON_ID("beu1", &mstp_clks[HWBLK_BEU1]), |
| 345 | CLKDEV_CON_ID("2ddmac0", &mstp_clks[HWBLK_2DDMAC]), | 345 | CLKDEV_CON_ID("2ddmac0", &mstp_clks[HWBLK_2DDMAC]), |
| 346 | CLKDEV_CON_ID("spu0", &mstp_clks[HWBLK_SPU]), | 346 | CLKDEV_DEV_ID("sh_fsi.0", &mstp_clks[HWBLK_SPU]), |
| 347 | CLKDEV_CON_ID("jpu0", &mstp_clks[HWBLK_JPU]), | 347 | CLKDEV_CON_ID("jpu0", &mstp_clks[HWBLK_JPU]), |
| 348 | CLKDEV_DEV_ID("sh-vou.0", &mstp_clks[HWBLK_VOU]), | 348 | CLKDEV_DEV_ID("sh-vou.0", &mstp_clks[HWBLK_VOU]), |
| 349 | CLKDEV_CON_ID("beu0", &mstp_clks[HWBLK_BEU0]), | 349 | CLKDEV_CON_ID("beu0", &mstp_clks[HWBLK_BEU0]), |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index a7b2da6b3a1a..2875e8be4f72 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c | |||
| @@ -133,7 +133,7 @@ static struct resource spi0_resources[] = { | |||
| 133 | [0] = { | 133 | [0] = { |
| 134 | .start = 0xfe002000, | 134 | .start = 0xfe002000, |
| 135 | .end = 0xfe0020ff, | 135 | .end = 0xfe0020ff, |
| 136 | .flags = IORESOURCE_MEM, | 136 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, |
| 137 | }, | 137 | }, |
| 138 | [1] = { | 138 | [1] = { |
| 139 | .start = 86, | 139 | .start = 86, |
| @@ -661,6 +661,25 @@ static struct platform_device spi0_device = { | |||
| 661 | .resource = spi0_resources, | 661 | .resource = spi0_resources, |
| 662 | }; | 662 | }; |
| 663 | 663 | ||
| 664 | static struct resource spi1_resources[] = { | ||
| 665 | { | ||
| 666 | .start = 0xffd8ee70, | ||
| 667 | .end = 0xffd8eeff, | ||
| 668 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT, | ||
| 669 | }, | ||
| 670 | { | ||
| 671 | .start = 54, | ||
| 672 | .flags = IORESOURCE_IRQ, | ||
| 673 | }, | ||
| 674 | }; | ||
| 675 | |||
| 676 | static struct platform_device spi1_device = { | ||
| 677 | .name = "sh_spi", | ||
| 678 | .id = 1, | ||
| 679 | .num_resources = ARRAY_SIZE(spi1_resources), | ||
| 680 | .resource = spi1_resources, | ||
| 681 | }; | ||
| 682 | |||
| 664 | static struct resource usb_ehci_resources[] = { | 683 | static struct resource usb_ehci_resources[] = { |
| 665 | [0] = { | 684 | [0] = { |
| 666 | .start = 0xfe4f1000, | 685 | .start = 0xfe4f1000, |
| @@ -720,6 +739,7 @@ static struct platform_device *sh7757_devices[] __initdata = { | |||
| 720 | &dma2_device, | 739 | &dma2_device, |
| 721 | &dma3_device, | 740 | &dma3_device, |
| 722 | &spi0_device, | 741 | &spi0_device, |
| 742 | &spi1_device, | ||
| 723 | &usb_ehci_device, | 743 | &usb_ehci_device, |
| 724 | &usb_ohci_device, | 744 | &usb_ohci_device, |
| 725 | }; | 745 | }; |
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index 3147a9a6fb8b..f624174bf239 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c | |||
| @@ -63,7 +63,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
| 63 | mp_ops->prepare_cpus(max_cpus); | 63 | mp_ops->prepare_cpus(max_cpus); |
| 64 | 64 | ||
| 65 | #ifndef CONFIG_HOTPLUG_CPU | 65 | #ifndef CONFIG_HOTPLUG_CPU |
| 66 | init_cpu_present(&cpu_possible_map); | 66 | init_cpu_present(cpu_possible_mask); |
| 67 | #endif | 67 | #endif |
| 68 | } | 68 | } |
| 69 | 69 | ||
diff --git a/arch/sh/kernel/topology.c b/arch/sh/kernel/topology.c index 4649a6ff0cfe..772caffba22f 100644 --- a/arch/sh/kernel/topology.c +++ b/arch/sh/kernel/topology.c | |||
| @@ -27,7 +27,7 @@ static cpumask_t cpu_coregroup_map(unsigned int cpu) | |||
| 27 | * Presently all SH-X3 SMP cores are multi-cores, so just keep it | 27 | * Presently all SH-X3 SMP cores are multi-cores, so just keep it |
| 28 | * simple until we have a method for determining topology.. | 28 | * simple until we have a method for determining topology.. |
| 29 | */ | 29 | */ |
| 30 | return cpu_possible_map; | 30 | return *cpu_possible_mask; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | const struct cpumask *cpu_coregroup_mask(unsigned int cpu) | 33 | const struct cpumask *cpu_coregroup_mask(unsigned int cpu) |
diff --git a/arch/sh/mm/cache-sh2a.c b/arch/sh/mm/cache-sh2a.c index ae08cbbfa569..949e2d3138a0 100644 --- a/arch/sh/mm/cache-sh2a.c +++ b/arch/sh/mm/cache-sh2a.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #define MAX_OCACHE_PAGES 32 | 23 | #define MAX_OCACHE_PAGES 32 |
| 24 | #define MAX_ICACHE_PAGES 32 | 24 | #define MAX_ICACHE_PAGES 32 |
| 25 | 25 | ||
| 26 | #ifdef CONFIG_CACHE_WRITEBACK | ||
| 26 | static void sh2a_flush_oc_line(unsigned long v, int way) | 27 | static void sh2a_flush_oc_line(unsigned long v, int way) |
| 27 | { | 28 | { |
| 28 | unsigned long addr = (v & 0x000007f0) | (way << 11); | 29 | unsigned long addr = (v & 0x000007f0) | (way << 11); |
| @@ -34,6 +35,7 @@ static void sh2a_flush_oc_line(unsigned long v, int way) | |||
| 34 | __raw_writel(data, CACHE_OC_ADDRESS_ARRAY | addr); | 35 | __raw_writel(data, CACHE_OC_ADDRESS_ARRAY | addr); |
| 35 | } | 36 | } |
| 36 | } | 37 | } |
| 38 | #endif | ||
| 37 | 39 | ||
| 38 | static void sh2a_invalidate_line(unsigned long cache_addr, unsigned long v) | 40 | static void sh2a_invalidate_line(unsigned long cache_addr, unsigned long v) |
| 39 | { | 41 | { |
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index fd843877e841..39e49091f648 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c | |||
| @@ -315,6 +315,13 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
| 315 | current->mm->free_area_cache = TASK_UNMAPPED_BASE; | 315 | current->mm->free_area_cache = TASK_UNMAPPED_BASE; |
| 316 | current->mm->cached_hole_size = 0; | 316 | current->mm->cached_hole_size = 0; |
| 317 | 317 | ||
| 318 | retval = setup_arg_pages(bprm, IA32_STACK_TOP, EXSTACK_DEFAULT); | ||
| 319 | if (retval < 0) { | ||
| 320 | /* Someone check-me: is this error path enough? */ | ||
| 321 | send_sig(SIGKILL, current, 0); | ||
| 322 | return retval; | ||
| 323 | } | ||
| 324 | |||
| 318 | install_exec_creds(bprm); | 325 | install_exec_creds(bprm); |
| 319 | current->flags &= ~PF_FORKNOEXEC; | 326 | current->flags &= ~PF_FORKNOEXEC; |
| 320 | 327 | ||
| @@ -410,13 +417,6 @@ beyond_if: | |||
| 410 | 417 | ||
| 411 | set_brk(current->mm->start_brk, current->mm->brk); | 418 | set_brk(current->mm->start_brk, current->mm->brk); |
| 412 | 419 | ||
| 413 | retval = setup_arg_pages(bprm, IA32_STACK_TOP, EXSTACK_DEFAULT); | ||
| 414 | if (retval < 0) { | ||
| 415 | /* Someone check-me: is this error path enough? */ | ||
| 416 | send_sig(SIGKILL, current, 0); | ||
| 417 | return retval; | ||
| 418 | } | ||
| 419 | |||
| 420 | current->mm->start_stack = | 420 | current->mm->start_stack = |
| 421 | (unsigned long)create_aout_tables((char __user *)bprm->p, bprm); | 421 | (unsigned long)create_aout_tables((char __user *)bprm->p, bprm); |
| 422 | /* start thread */ | 422 | /* start thread */ |
diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h index a850b4d8d14d..247904945d3f 100644 --- a/arch/x86/include/asm/i387.h +++ b/arch/x86/include/asm/i387.h | |||
| @@ -29,10 +29,11 @@ extern unsigned int sig_xstate_size; | |||
| 29 | extern void fpu_init(void); | 29 | extern void fpu_init(void); |
| 30 | extern void mxcsr_feature_mask_init(void); | 30 | extern void mxcsr_feature_mask_init(void); |
| 31 | extern int init_fpu(struct task_struct *child); | 31 | extern int init_fpu(struct task_struct *child); |
| 32 | extern void __math_state_restore(struct task_struct *); | ||
| 33 | extern void math_state_restore(void); | 32 | extern void math_state_restore(void); |
| 34 | extern int dump_fpu(struct pt_regs *, struct user_i387_struct *); | 33 | extern int dump_fpu(struct pt_regs *, struct user_i387_struct *); |
| 35 | 34 | ||
| 35 | DECLARE_PER_CPU(struct task_struct *, fpu_owner_task); | ||
| 36 | |||
| 36 | extern user_regset_active_fn fpregs_active, xfpregs_active; | 37 | extern user_regset_active_fn fpregs_active, xfpregs_active; |
| 37 | extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get, | 38 | extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get, |
| 38 | xstateregs_get; | 39 | xstateregs_get; |
| @@ -269,6 +270,16 @@ static inline int fpu_restore_checking(struct fpu *fpu) | |||
| 269 | 270 | ||
| 270 | static inline int restore_fpu_checking(struct task_struct *tsk) | 271 | static inline int restore_fpu_checking(struct task_struct *tsk) |
| 271 | { | 272 | { |
| 273 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception | ||
| 274 | is pending. Clear the x87 state here by setting it to fixed | ||
| 275 | values. "m" is a random variable that should be in L1 */ | ||
| 276 | alternative_input( | ||
| 277 | ASM_NOP8 ASM_NOP2, | ||
| 278 | "emms\n\t" /* clear stack tags */ | ||
| 279 | "fildl %P[addr]", /* set F?P to defined value */ | ||
| 280 | X86_FEATURE_FXSAVE_LEAK, | ||
| 281 | [addr] "m" (tsk->thread.fpu.has_fpu)); | ||
| 282 | |||
| 272 | return fpu_restore_checking(&tsk->thread.fpu); | 283 | return fpu_restore_checking(&tsk->thread.fpu); |
| 273 | } | 284 | } |
| 274 | 285 | ||
| @@ -279,19 +290,21 @@ static inline int restore_fpu_checking(struct task_struct *tsk) | |||
| 279 | */ | 290 | */ |
| 280 | static inline int __thread_has_fpu(struct task_struct *tsk) | 291 | static inline int __thread_has_fpu(struct task_struct *tsk) |
| 281 | { | 292 | { |
| 282 | return tsk->thread.has_fpu; | 293 | return tsk->thread.fpu.has_fpu; |
| 283 | } | 294 | } |
| 284 | 295 | ||
| 285 | /* Must be paired with an 'stts' after! */ | 296 | /* Must be paired with an 'stts' after! */ |
| 286 | static inline void __thread_clear_has_fpu(struct task_struct *tsk) | 297 | static inline void __thread_clear_has_fpu(struct task_struct *tsk) |
| 287 | { | 298 | { |
| 288 | tsk->thread.has_fpu = 0; | 299 | tsk->thread.fpu.has_fpu = 0; |
| 300 | percpu_write(fpu_owner_task, NULL); | ||
| 289 | } | 301 | } |
| 290 | 302 | ||
| 291 | /* Must be paired with a 'clts' before! */ | 303 | /* Must be paired with a 'clts' before! */ |
| 292 | static inline void __thread_set_has_fpu(struct task_struct *tsk) | 304 | static inline void __thread_set_has_fpu(struct task_struct *tsk) |
| 293 | { | 305 | { |
| 294 | tsk->thread.has_fpu = 1; | 306 | tsk->thread.fpu.has_fpu = 1; |
| 307 | percpu_write(fpu_owner_task, tsk); | ||
| 295 | } | 308 | } |
| 296 | 309 | ||
| 297 | /* | 310 | /* |
| @@ -336,30 +349,36 @@ typedef struct { int preload; } fpu_switch_t; | |||
| 336 | * We don't do that yet, so "fpu_lazy_restore()" always returns | 349 | * We don't do that yet, so "fpu_lazy_restore()" always returns |
| 337 | * false, but some day.. | 350 | * false, but some day.. |
| 338 | */ | 351 | */ |
| 339 | #define fpu_lazy_restore(tsk) (0) | 352 | static inline int fpu_lazy_restore(struct task_struct *new, unsigned int cpu) |
| 340 | #define fpu_lazy_state_intact(tsk) do { } while (0) | 353 | { |
| 354 | return new == percpu_read_stable(fpu_owner_task) && | ||
| 355 | cpu == new->thread.fpu.last_cpu; | ||
| 356 | } | ||
| 341 | 357 | ||
| 342 | static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct task_struct *new) | 358 | static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct task_struct *new, int cpu) |
| 343 | { | 359 | { |
| 344 | fpu_switch_t fpu; | 360 | fpu_switch_t fpu; |
| 345 | 361 | ||
| 346 | fpu.preload = tsk_used_math(new) && new->fpu_counter > 5; | 362 | fpu.preload = tsk_used_math(new) && new->fpu_counter > 5; |
| 347 | if (__thread_has_fpu(old)) { | 363 | if (__thread_has_fpu(old)) { |
| 348 | if (__save_init_fpu(old)) | 364 | if (!__save_init_fpu(old)) |
| 349 | fpu_lazy_state_intact(old); | 365 | cpu = ~0; |
| 350 | __thread_clear_has_fpu(old); | 366 | old->thread.fpu.last_cpu = cpu; |
| 351 | old->fpu_counter++; | 367 | old->thread.fpu.has_fpu = 0; /* But leave fpu_owner_task! */ |
| 352 | 368 | ||
| 353 | /* Don't change CR0.TS if we just switch! */ | 369 | /* Don't change CR0.TS if we just switch! */ |
| 354 | if (fpu.preload) { | 370 | if (fpu.preload) { |
| 371 | new->fpu_counter++; | ||
| 355 | __thread_set_has_fpu(new); | 372 | __thread_set_has_fpu(new); |
| 356 | prefetch(new->thread.fpu.state); | 373 | prefetch(new->thread.fpu.state); |
| 357 | } else | 374 | } else |
| 358 | stts(); | 375 | stts(); |
| 359 | } else { | 376 | } else { |
| 360 | old->fpu_counter = 0; | 377 | old->fpu_counter = 0; |
| 378 | old->thread.fpu.last_cpu = ~0; | ||
| 361 | if (fpu.preload) { | 379 | if (fpu.preload) { |
| 362 | if (fpu_lazy_restore(new)) | 380 | new->fpu_counter++; |
| 381 | if (fpu_lazy_restore(new, cpu)) | ||
| 363 | fpu.preload = 0; | 382 | fpu.preload = 0; |
| 364 | else | 383 | else |
| 365 | prefetch(new->thread.fpu.state); | 384 | prefetch(new->thread.fpu.state); |
| @@ -377,8 +396,10 @@ static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct ta | |||
| 377 | */ | 396 | */ |
| 378 | static inline void switch_fpu_finish(struct task_struct *new, fpu_switch_t fpu) | 397 | static inline void switch_fpu_finish(struct task_struct *new, fpu_switch_t fpu) |
| 379 | { | 398 | { |
| 380 | if (fpu.preload) | 399 | if (fpu.preload) { |
| 381 | __math_state_restore(new); | 400 | if (unlikely(restore_fpu_checking(new))) |
| 401 | __thread_fpu_end(new); | ||
| 402 | } | ||
| 382 | } | 403 | } |
| 383 | 404 | ||
| 384 | /* | 405 | /* |
| @@ -451,8 +472,10 @@ static inline void kernel_fpu_begin(void) | |||
| 451 | __save_init_fpu(me); | 472 | __save_init_fpu(me); |
| 452 | __thread_clear_has_fpu(me); | 473 | __thread_clear_has_fpu(me); |
| 453 | /* We do 'stts()' in kernel_fpu_end() */ | 474 | /* We do 'stts()' in kernel_fpu_end() */ |
| 454 | } else | 475 | } else { |
| 476 | percpu_write(fpu_owner_task, NULL); | ||
| 455 | clts(); | 477 | clts(); |
| 478 | } | ||
| 456 | } | 479 | } |
| 457 | 480 | ||
| 458 | static inline void kernel_fpu_end(void) | 481 | static inline void kernel_fpu_end(void) |
diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index 096c975e099f..461ce432b1c2 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h | |||
| @@ -242,4 +242,12 @@ static inline void perf_get_x86_pmu_capability(struct x86_pmu_capability *cap) | |||
| 242 | static inline void perf_events_lapic_init(void) { } | 242 | static inline void perf_events_lapic_init(void) { } |
| 243 | #endif | 243 | #endif |
| 244 | 244 | ||
| 245 | #if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_AMD) | ||
| 246 | extern void amd_pmu_enable_virt(void); | ||
| 247 | extern void amd_pmu_disable_virt(void); | ||
| 248 | #else | ||
| 249 | static inline void amd_pmu_enable_virt(void) { } | ||
| 250 | static inline void amd_pmu_disable_virt(void) { } | ||
| 251 | #endif | ||
| 252 | |||
| 245 | #endif /* _ASM_X86_PERF_EVENT_H */ | 253 | #endif /* _ASM_X86_PERF_EVENT_H */ |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index f7c89e231c6c..58545c97d071 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -374,6 +374,8 @@ union thread_xstate { | |||
| 374 | }; | 374 | }; |
| 375 | 375 | ||
| 376 | struct fpu { | 376 | struct fpu { |
| 377 | unsigned int last_cpu; | ||
| 378 | unsigned int has_fpu; | ||
| 377 | union thread_xstate *state; | 379 | union thread_xstate *state; |
| 378 | }; | 380 | }; |
| 379 | 381 | ||
| @@ -454,7 +456,6 @@ struct thread_struct { | |||
| 454 | unsigned long trap_no; | 456 | unsigned long trap_no; |
| 455 | unsigned long error_code; | 457 | unsigned long error_code; |
| 456 | /* floating point and extended processor state */ | 458 | /* floating point and extended processor state */ |
| 457 | unsigned long has_fpu; | ||
| 458 | struct fpu fpu; | 459 | struct fpu fpu; |
| 459 | #ifdef CONFIG_X86_32 | 460 | #ifdef CONFIG_X86_32 |
| 460 | /* Virtual 86 mode info */ | 461 | /* Virtual 86 mode info */ |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index d43cad74f166..c0f7d68d318f 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -1044,6 +1044,9 @@ DEFINE_PER_CPU(char *, irq_stack_ptr) = | |||
| 1044 | 1044 | ||
| 1045 | DEFINE_PER_CPU(unsigned int, irq_count) = -1; | 1045 | DEFINE_PER_CPU(unsigned int, irq_count) = -1; |
| 1046 | 1046 | ||
| 1047 | DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); | ||
| 1048 | EXPORT_PER_CPU_SYMBOL(fpu_owner_task); | ||
| 1049 | |||
| 1047 | /* | 1050 | /* |
| 1048 | * Special IST stacks which the CPU switches to when it calls | 1051 | * Special IST stacks which the CPU switches to when it calls |
| 1049 | * an IST-marked descriptor entry. Up to 7 stacks (hardware | 1052 | * an IST-marked descriptor entry. Up to 7 stacks (hardware |
| @@ -1111,6 +1114,8 @@ void debug_stack_reset(void) | |||
| 1111 | 1114 | ||
| 1112 | DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task; | 1115 | DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task; |
| 1113 | EXPORT_PER_CPU_SYMBOL(current_task); | 1116 | EXPORT_PER_CPU_SYMBOL(current_task); |
| 1117 | DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); | ||
| 1118 | EXPORT_PER_CPU_SYMBOL(fpu_owner_task); | ||
| 1114 | 1119 | ||
| 1115 | #ifdef CONFIG_CC_STACKPROTECTOR | 1120 | #ifdef CONFIG_CC_STACKPROTECTOR |
| 1116 | DEFINE_PER_CPU_ALIGNED(struct stack_canary, stack_canary); | 1121 | DEFINE_PER_CPU_ALIGNED(struct stack_canary, stack_canary); |
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index 6b45e5e7a901..73d08ed98a64 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
| @@ -326,8 +326,7 @@ static void __cpuinit amd_calc_l3_indices(struct amd_northbridge *nb) | |||
| 326 | l3->indices = (max(max3(sc0, sc1, sc2), sc3) << 10) - 1; | 326 | l3->indices = (max(max3(sc0, sc1, sc2), sc3) << 10) - 1; |
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf, | 329 | static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf, int index) |
| 330 | int index) | ||
| 331 | { | 330 | { |
| 332 | int node; | 331 | int node; |
| 333 | 332 | ||
| @@ -725,14 +724,16 @@ static DEFINE_PER_CPU(struct _cpuid4_info *, ici_cpuid4_info); | |||
| 725 | #define CPUID4_INFO_IDX(x, y) (&((per_cpu(ici_cpuid4_info, x))[y])) | 724 | #define CPUID4_INFO_IDX(x, y) (&((per_cpu(ici_cpuid4_info, x))[y])) |
| 726 | 725 | ||
| 727 | #ifdef CONFIG_SMP | 726 | #ifdef CONFIG_SMP |
| 728 | static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) | 727 | |
| 728 | static int __cpuinit cache_shared_amd_cpu_map_setup(unsigned int cpu, int index) | ||
| 729 | { | 729 | { |
| 730 | struct _cpuid4_info *this_leaf, *sibling_leaf; | 730 | struct _cpuid4_info *this_leaf; |
| 731 | unsigned long num_threads_sharing; | 731 | int ret, i, sibling; |
| 732 | int index_msb, i, sibling; | ||
| 733 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 732 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
| 734 | 733 | ||
| 735 | if ((index == 3) && (c->x86_vendor == X86_VENDOR_AMD)) { | 734 | ret = 0; |
| 735 | if (index == 3) { | ||
| 736 | ret = 1; | ||
| 736 | for_each_cpu(i, cpu_llc_shared_mask(cpu)) { | 737 | for_each_cpu(i, cpu_llc_shared_mask(cpu)) { |
| 737 | if (!per_cpu(ici_cpuid4_info, i)) | 738 | if (!per_cpu(ici_cpuid4_info, i)) |
| 738 | continue; | 739 | continue; |
| @@ -743,8 +744,35 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) | |||
| 743 | set_bit(sibling, this_leaf->shared_cpu_map); | 744 | set_bit(sibling, this_leaf->shared_cpu_map); |
| 744 | } | 745 | } |
| 745 | } | 746 | } |
| 746 | return; | 747 | } else if ((c->x86 == 0x15) && ((index == 1) || (index == 2))) { |
| 748 | ret = 1; | ||
| 749 | for_each_cpu(i, cpu_sibling_mask(cpu)) { | ||
| 750 | if (!per_cpu(ici_cpuid4_info, i)) | ||
| 751 | continue; | ||
| 752 | this_leaf = CPUID4_INFO_IDX(i, index); | ||
| 753 | for_each_cpu(sibling, cpu_sibling_mask(cpu)) { | ||
| 754 | if (!cpu_online(sibling)) | ||
| 755 | continue; | ||
| 756 | set_bit(sibling, this_leaf->shared_cpu_map); | ||
| 757 | } | ||
| 758 | } | ||
| 747 | } | 759 | } |
| 760 | |||
| 761 | return ret; | ||
| 762 | } | ||
| 763 | |||
| 764 | static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) | ||
| 765 | { | ||
| 766 | struct _cpuid4_info *this_leaf, *sibling_leaf; | ||
| 767 | unsigned long num_threads_sharing; | ||
| 768 | int index_msb, i; | ||
| 769 | struct cpuinfo_x86 *c = &cpu_data(cpu); | ||
| 770 | |||
| 771 | if (c->x86_vendor == X86_VENDOR_AMD) { | ||
| 772 | if (cache_shared_amd_cpu_map_setup(cpu, index)) | ||
| 773 | return; | ||
| 774 | } | ||
| 775 | |||
| 748 | this_leaf = CPUID4_INFO_IDX(cpu, index); | 776 | this_leaf = CPUID4_INFO_IDX(cpu, index); |
| 749 | num_threads_sharing = 1 + this_leaf->base.eax.split.num_threads_sharing; | 777 | num_threads_sharing = 1 + this_leaf->base.eax.split.num_threads_sharing; |
| 750 | 778 | ||
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index 786e76a86322..e4eeaaf58a47 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c | |||
| @@ -528,6 +528,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
| 528 | 528 | ||
| 529 | sprintf(name, "threshold_bank%i", bank); | 529 | sprintf(name, "threshold_bank%i", bank); |
| 530 | 530 | ||
| 531 | #ifdef CONFIG_SMP | ||
| 531 | if (cpu_data(cpu).cpu_core_id && shared_bank[bank]) { /* symlink */ | 532 | if (cpu_data(cpu).cpu_core_id && shared_bank[bank]) { /* symlink */ |
| 532 | i = cpumask_first(cpu_llc_shared_mask(cpu)); | 533 | i = cpumask_first(cpu_llc_shared_mask(cpu)); |
| 533 | 534 | ||
| @@ -553,6 +554,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
| 553 | 554 | ||
| 554 | goto out; | 555 | goto out; |
| 555 | } | 556 | } |
| 557 | #endif | ||
| 556 | 558 | ||
| 557 | b = kzalloc(sizeof(struct threshold_bank), GFP_KERNEL); | 559 | b = kzalloc(sizeof(struct threshold_bank), GFP_KERNEL); |
| 558 | if (!b) { | 560 | if (!b) { |
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index 8944062f46e2..c30c807ddc72 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
| @@ -147,7 +147,9 @@ struct cpu_hw_events { | |||
| 147 | /* | 147 | /* |
| 148 | * AMD specific bits | 148 | * AMD specific bits |
| 149 | */ | 149 | */ |
| 150 | struct amd_nb *amd_nb; | 150 | struct amd_nb *amd_nb; |
| 151 | /* Inverted mask of bits to clear in the perf_ctr ctrl registers */ | ||
| 152 | u64 perf_ctr_virt_mask; | ||
| 151 | 153 | ||
| 152 | void *kfree_on_online; | 154 | void *kfree_on_online; |
| 153 | }; | 155 | }; |
| @@ -417,9 +419,11 @@ void x86_pmu_disable_all(void); | |||
| 417 | static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc, | 419 | static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc, |
| 418 | u64 enable_mask) | 420 | u64 enable_mask) |
| 419 | { | 421 | { |
| 422 | u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask); | ||
| 423 | |||
| 420 | if (hwc->extra_reg.reg) | 424 | if (hwc->extra_reg.reg) |
| 421 | wrmsrl(hwc->extra_reg.reg, hwc->extra_reg.config); | 425 | wrmsrl(hwc->extra_reg.reg, hwc->extra_reg.config); |
| 422 | wrmsrl(hwc->config_base, hwc->config | enable_mask); | 426 | wrmsrl(hwc->config_base, (hwc->config | enable_mask) & ~disable_mask); |
| 423 | } | 427 | } |
| 424 | 428 | ||
| 425 | void x86_pmu_enable_all(int added); | 429 | void x86_pmu_enable_all(int added); |
diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c index 0397b23be8e9..67250a52430b 100644 --- a/arch/x86/kernel/cpu/perf_event_amd.c +++ b/arch/x86/kernel/cpu/perf_event_amd.c | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | #include <linux/perf_event.h> | 1 | #include <linux/perf_event.h> |
| 2 | #include <linux/export.h> | ||
| 2 | #include <linux/types.h> | 3 | #include <linux/types.h> |
| 3 | #include <linux/init.h> | 4 | #include <linux/init.h> |
| 4 | #include <linux/slab.h> | 5 | #include <linux/slab.h> |
| @@ -357,7 +358,9 @@ static void amd_pmu_cpu_starting(int cpu) | |||
| 357 | struct amd_nb *nb; | 358 | struct amd_nb *nb; |
| 358 | int i, nb_id; | 359 | int i, nb_id; |
| 359 | 360 | ||
| 360 | if (boot_cpu_data.x86_max_cores < 2) | 361 | cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY; |
| 362 | |||
| 363 | if (boot_cpu_data.x86_max_cores < 2 || boot_cpu_data.x86 == 0x15) | ||
| 361 | return; | 364 | return; |
| 362 | 365 | ||
| 363 | nb_id = amd_get_nb_id(cpu); | 366 | nb_id = amd_get_nb_id(cpu); |
| @@ -587,9 +590,9 @@ static __initconst const struct x86_pmu amd_pmu_f15h = { | |||
| 587 | .put_event_constraints = amd_put_event_constraints, | 590 | .put_event_constraints = amd_put_event_constraints, |
| 588 | 591 | ||
| 589 | .cpu_prepare = amd_pmu_cpu_prepare, | 592 | .cpu_prepare = amd_pmu_cpu_prepare, |
| 590 | .cpu_starting = amd_pmu_cpu_starting, | ||
| 591 | .cpu_dead = amd_pmu_cpu_dead, | 593 | .cpu_dead = amd_pmu_cpu_dead, |
| 592 | #endif | 594 | #endif |
| 595 | .cpu_starting = amd_pmu_cpu_starting, | ||
| 593 | }; | 596 | }; |
| 594 | 597 | ||
| 595 | __init int amd_pmu_init(void) | 598 | __init int amd_pmu_init(void) |
| @@ -621,3 +624,33 @@ __init int amd_pmu_init(void) | |||
| 621 | 624 | ||
| 622 | return 0; | 625 | return 0; |
| 623 | } | 626 | } |
| 627 | |||
| 628 | void amd_pmu_enable_virt(void) | ||
| 629 | { | ||
| 630 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); | ||
| 631 | |||
| 632 | cpuc->perf_ctr_virt_mask = 0; | ||
| 633 | |||
| 634 | /* Reload all events */ | ||
| 635 | x86_pmu_disable_all(); | ||
| 636 | x86_pmu_enable_all(0); | ||
| 637 | } | ||
| 638 | EXPORT_SYMBOL_GPL(amd_pmu_enable_virt); | ||
| 639 | |||
| 640 | void amd_pmu_disable_virt(void) | ||
| 641 | { | ||
| 642 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); | ||
| 643 | |||
| 644 | /* | ||
| 645 | * We only mask out the Host-only bit so that host-only counting works | ||
| 646 | * when SVM is disabled. If someone sets up a guest-only counter when | ||
| 647 | * SVM is disabled the Guest-only bits still gets set and the counter | ||
| 648 | * will not count anything. | ||
| 649 | */ | ||
| 650 | cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY; | ||
| 651 | |||
| 652 | /* Reload all events */ | ||
| 653 | x86_pmu_disable_all(); | ||
| 654 | x86_pmu_enable_all(0); | ||
| 655 | } | ||
| 656 | EXPORT_SYMBOL_GPL(amd_pmu_disable_virt); | ||
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 3fe8239fd8fb..1333d9851778 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -1532,10 +1532,17 @@ ENTRY(nmi) | |||
| 1532 | pushq_cfi %rdx | 1532 | pushq_cfi %rdx |
| 1533 | 1533 | ||
| 1534 | /* | 1534 | /* |
| 1535 | * If %cs was not the kernel segment, then the NMI triggered in user | ||
| 1536 | * space, which means it is definitely not nested. | ||
| 1537 | */ | ||
| 1538 | cmpl $__KERNEL_CS, 16(%rsp) | ||
| 1539 | jne first_nmi | ||
| 1540 | |||
| 1541 | /* | ||
| 1535 | * Check the special variable on the stack to see if NMIs are | 1542 | * Check the special variable on the stack to see if NMIs are |
| 1536 | * executing. | 1543 | * executing. |
| 1537 | */ | 1544 | */ |
| 1538 | cmp $1, -8(%rsp) | 1545 | cmpl $1, -8(%rsp) |
| 1539 | je nested_nmi | 1546 | je nested_nmi |
| 1540 | 1547 | ||
| 1541 | /* | 1548 | /* |
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index ac0417be9131..73465aab28f8 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
| @@ -360,7 +360,6 @@ out: | |||
| 360 | static enum ucode_state | 360 | static enum ucode_state |
| 361 | request_microcode_user(int cpu, const void __user *buf, size_t size) | 361 | request_microcode_user(int cpu, const void __user *buf, size_t size) |
| 362 | { | 362 | { |
| 363 | pr_info("AMD microcode update via /dev/cpu/microcode not supported\n"); | ||
| 364 | return UCODE_ERROR; | 363 | return UCODE_ERROR; |
| 365 | } | 364 | } |
| 366 | 365 | ||
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 80bfe1ab0031..c08d1ff12b7c 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -214,6 +214,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, | |||
| 214 | 214 | ||
| 215 | task_user_gs(p) = get_user_gs(regs); | 215 | task_user_gs(p) = get_user_gs(regs); |
| 216 | 216 | ||
| 217 | p->fpu_counter = 0; | ||
| 217 | p->thread.io_bitmap_ptr = NULL; | 218 | p->thread.io_bitmap_ptr = NULL; |
| 218 | tsk = current; | 219 | tsk = current; |
| 219 | err = -ENOMEM; | 220 | err = -ENOMEM; |
| @@ -303,7 +304,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 303 | 304 | ||
| 304 | /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ | 305 | /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ |
| 305 | 306 | ||
| 306 | fpu = switch_fpu_prepare(prev_p, next_p); | 307 | fpu = switch_fpu_prepare(prev_p, next_p, cpu); |
| 307 | 308 | ||
| 308 | /* | 309 | /* |
| 309 | * Reload esp0. | 310 | * Reload esp0. |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 1fd94bc4279d..cfa5c90c01db 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -286,6 +286,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, | |||
| 286 | 286 | ||
| 287 | set_tsk_thread_flag(p, TIF_FORK); | 287 | set_tsk_thread_flag(p, TIF_FORK); |
| 288 | 288 | ||
| 289 | p->fpu_counter = 0; | ||
| 289 | p->thread.io_bitmap_ptr = NULL; | 290 | p->thread.io_bitmap_ptr = NULL; |
| 290 | 291 | ||
| 291 | savesegment(gs, p->thread.gsindex); | 292 | savesegment(gs, p->thread.gsindex); |
| @@ -388,7 +389,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 388 | unsigned fsindex, gsindex; | 389 | unsigned fsindex, gsindex; |
| 389 | fpu_switch_t fpu; | 390 | fpu_switch_t fpu; |
| 390 | 391 | ||
| 391 | fpu = switch_fpu_prepare(prev_p, next_p); | 392 | fpu = switch_fpu_prepare(prev_p, next_p, cpu); |
| 392 | 393 | ||
| 393 | /* | 394 | /* |
| 394 | * Reload esp0, LDT and the page table pointer: | 395 | * Reload esp0, LDT and the page table pointer: |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 77da5b475ad2..4bbe04d96744 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -571,37 +571,6 @@ asmlinkage void __attribute__((weak)) smp_threshold_interrupt(void) | |||
| 571 | } | 571 | } |
| 572 | 572 | ||
| 573 | /* | 573 | /* |
| 574 | * This gets called with the process already owning the | ||
| 575 | * FPU state, and with CR0.TS cleared. It just needs to | ||
| 576 | * restore the FPU register state. | ||
| 577 | */ | ||
| 578 | void __math_state_restore(struct task_struct *tsk) | ||
| 579 | { | ||
| 580 | /* We need a safe address that is cheap to find and that is already | ||
| 581 | in L1. We've just brought in "tsk->thread.has_fpu", so use that */ | ||
| 582 | #define safe_address (tsk->thread.has_fpu) | ||
| 583 | |||
| 584 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception | ||
| 585 | is pending. Clear the x87 state here by setting it to fixed | ||
| 586 | values. safe_address is a random variable that should be in L1 */ | ||
| 587 | alternative_input( | ||
| 588 | ASM_NOP8 ASM_NOP2, | ||
| 589 | "emms\n\t" /* clear stack tags */ | ||
| 590 | "fildl %P[addr]", /* set F?P to defined value */ | ||
| 591 | X86_FEATURE_FXSAVE_LEAK, | ||
| 592 | [addr] "m" (safe_address)); | ||
| 593 | |||
| 594 | /* | ||
| 595 | * Paranoid restore. send a SIGSEGV if we fail to restore the state. | ||
| 596 | */ | ||
| 597 | if (unlikely(restore_fpu_checking(tsk))) { | ||
| 598 | __thread_fpu_end(tsk); | ||
| 599 | force_sig(SIGSEGV, tsk); | ||
| 600 | return; | ||
| 601 | } | ||
| 602 | } | ||
| 603 | |||
| 604 | /* | ||
| 605 | * 'math_state_restore()' saves the current math information in the | 574 | * 'math_state_restore()' saves the current math information in the |
| 606 | * old math state array, and gets the new ones from the current task | 575 | * old math state array, and gets the new ones from the current task |
| 607 | * | 576 | * |
| @@ -631,7 +600,14 @@ void math_state_restore(void) | |||
| 631 | } | 600 | } |
| 632 | 601 | ||
| 633 | __thread_fpu_begin(tsk); | 602 | __thread_fpu_begin(tsk); |
| 634 | __math_state_restore(tsk); | 603 | /* |
| 604 | * Paranoid restore. send a SIGSEGV if we fail to restore the state. | ||
| 605 | */ | ||
| 606 | if (unlikely(restore_fpu_checking(tsk))) { | ||
| 607 | __thread_fpu_end(tsk); | ||
| 608 | force_sig(SIGSEGV, tsk); | ||
| 609 | return; | ||
| 610 | } | ||
| 635 | 611 | ||
| 636 | tsk->fpu_counter++; | 612 | tsk->fpu_counter++; |
| 637 | } | 613 | } |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 5fa553babe56..e385214711cb 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/ftrace_event.h> | 29 | #include <linux/ftrace_event.h> |
| 30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
| 31 | 31 | ||
| 32 | #include <asm/perf_event.h> | ||
| 32 | #include <asm/tlbflush.h> | 33 | #include <asm/tlbflush.h> |
| 33 | #include <asm/desc.h> | 34 | #include <asm/desc.h> |
| 34 | #include <asm/kvm_para.h> | 35 | #include <asm/kvm_para.h> |
| @@ -575,6 +576,8 @@ static void svm_hardware_disable(void *garbage) | |||
| 575 | wrmsrl(MSR_AMD64_TSC_RATIO, TSC_RATIO_DEFAULT); | 576 | wrmsrl(MSR_AMD64_TSC_RATIO, TSC_RATIO_DEFAULT); |
| 576 | 577 | ||
| 577 | cpu_svm_disable(); | 578 | cpu_svm_disable(); |
| 579 | |||
| 580 | amd_pmu_disable_virt(); | ||
| 578 | } | 581 | } |
| 579 | 582 | ||
| 580 | static int svm_hardware_enable(void *garbage) | 583 | static int svm_hardware_enable(void *garbage) |
| @@ -622,6 +625,8 @@ static int svm_hardware_enable(void *garbage) | |||
| 622 | 625 | ||
| 623 | svm_init_erratum_383(); | 626 | svm_init_erratum_383(); |
| 624 | 627 | ||
| 628 | amd_pmu_enable_virt(); | ||
| 629 | |||
| 625 | return 0; | 630 | return 0; |
| 626 | } | 631 | } |
| 627 | 632 | ||
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 12eb07bfb267..4172af8ceeb3 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -1141,7 +1141,9 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1141 | 1141 | ||
| 1142 | /* Prevent unwanted bits from being set in PTEs. */ | 1142 | /* Prevent unwanted bits from being set in PTEs. */ |
| 1143 | __supported_pte_mask &= ~_PAGE_GLOBAL; | 1143 | __supported_pte_mask &= ~_PAGE_GLOBAL; |
| 1144 | #if 0 | ||
| 1144 | if (!xen_initial_domain()) | 1145 | if (!xen_initial_domain()) |
| 1146 | #endif | ||
| 1145 | __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); | 1147 | __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); |
| 1146 | 1148 | ||
| 1147 | __supported_pte_mask |= _PAGE_IOMAP; | 1149 | __supported_pte_mask |= _PAGE_IOMAP; |
| @@ -1204,10 +1206,6 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1204 | 1206 | ||
| 1205 | pgd = (pgd_t *)xen_start_info->pt_base; | 1207 | pgd = (pgd_t *)xen_start_info->pt_base; |
| 1206 | 1208 | ||
| 1207 | if (!xen_initial_domain()) | ||
| 1208 | __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); | ||
| 1209 | |||
| 1210 | __supported_pte_mask |= _PAGE_IOMAP; | ||
| 1211 | /* Don't do the full vcpu_info placement stuff until we have a | 1209 | /* Don't do the full vcpu_info placement stuff until we have a |
| 1212 | possible map and a non-dummy shared_info. */ | 1210 | possible map and a non-dummy shared_info. */ |
| 1213 | per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; | 1211 | per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 58a0e46c404d..95c1cf60c669 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -415,13 +415,13 @@ static pteval_t iomap_pte(pteval_t val) | |||
| 415 | static pteval_t xen_pte_val(pte_t pte) | 415 | static pteval_t xen_pte_val(pte_t pte) |
| 416 | { | 416 | { |
| 417 | pteval_t pteval = pte.pte; | 417 | pteval_t pteval = pte.pte; |
| 418 | 418 | #if 0 | |
| 419 | /* If this is a WC pte, convert back from Xen WC to Linux WC */ | 419 | /* If this is a WC pte, convert back from Xen WC to Linux WC */ |
| 420 | if ((pteval & (_PAGE_PAT | _PAGE_PCD | _PAGE_PWT)) == _PAGE_PAT) { | 420 | if ((pteval & (_PAGE_PAT | _PAGE_PCD | _PAGE_PWT)) == _PAGE_PAT) { |
| 421 | WARN_ON(!pat_enabled); | 421 | WARN_ON(!pat_enabled); |
| 422 | pteval = (pteval & ~_PAGE_PAT) | _PAGE_PWT; | 422 | pteval = (pteval & ~_PAGE_PAT) | _PAGE_PWT; |
| 423 | } | 423 | } |
| 424 | 424 | #endif | |
| 425 | if (xen_initial_domain() && (pteval & _PAGE_IOMAP)) | 425 | if (xen_initial_domain() && (pteval & _PAGE_IOMAP)) |
| 426 | return pteval; | 426 | return pteval; |
| 427 | 427 | ||
| @@ -463,7 +463,7 @@ void xen_set_pat(u64 pat) | |||
| 463 | static pte_t xen_make_pte(pteval_t pte) | 463 | static pte_t xen_make_pte(pteval_t pte) |
| 464 | { | 464 | { |
| 465 | phys_addr_t addr = (pte & PTE_PFN_MASK); | 465 | phys_addr_t addr = (pte & PTE_PFN_MASK); |
| 466 | 466 | #if 0 | |
| 467 | /* If Linux is trying to set a WC pte, then map to the Xen WC. | 467 | /* If Linux is trying to set a WC pte, then map to the Xen WC. |
| 468 | * If _PAGE_PAT is set, then it probably means it is really | 468 | * If _PAGE_PAT is set, then it probably means it is really |
| 469 | * _PAGE_PSE, so avoid fiddling with the PAT mapping and hope | 469 | * _PAGE_PSE, so avoid fiddling with the PAT mapping and hope |
| @@ -476,7 +476,7 @@ static pte_t xen_make_pte(pteval_t pte) | |||
| 476 | if ((pte & (_PAGE_PCD | _PAGE_PWT)) == _PAGE_PWT) | 476 | if ((pte & (_PAGE_PCD | _PAGE_PWT)) == _PAGE_PWT) |
| 477 | pte = (pte & ~(_PAGE_PCD | _PAGE_PWT)) | _PAGE_PAT; | 477 | pte = (pte & ~(_PAGE_PCD | _PAGE_PWT)) | _PAGE_PAT; |
| 478 | } | 478 | } |
| 479 | 479 | #endif | |
| 480 | /* | 480 | /* |
| 481 | * Unprivileged domains are allowed to do IOMAPpings for | 481 | * Unprivileged domains are allowed to do IOMAPpings for |
| 482 | * PCI passthrough, but not map ISA space. The ISA | 482 | * PCI passthrough, but not map ISA space. The ISA |
