Commit 9a8e5d41 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'fixes' of git://git.linaro.org/people/rmk/linux-arm

Pull ARM fixes from Russell King:
 "Nothing too disasterous, the biggest thing being the removal of the
  regulator support for vcore in the AMBA driver; only one SoC was using
  this and it got broken during the last merge window, which then
  started causing problems for other people.  Mutual agreement was
  reached for it to be removed."

* 'fixes' of git://git.linaro.org/people/rmk/linux-arm:
  ARM: 7386/1: jump_label: fixup for rename to static_key
  ARM: 7384/1: ThumbEE: Disable userspace TEEHBR access for !CONFIG_ARM_THUMBEE
  ARM: 7382/1: mm: truncate memory banks to fit in 4GB space for classic MMU
  ARM: 7359/2: smp_twd: Only wait for reprogramming on active cpus
  ARM: 7383/1: nommu: populate vectors page from paging_init
  ARM: 7381/1: nommu: fix typo in mm/Kconfig
  ARM: 7380/1: DT: do not add a zero-sized memory property
  ARM: 7379/1: DT: fix atags_to_fdt() second call site
  ARM: 7366/3: amba: Remove AMBA level regulator support
  ARM: 7377/1: vic: re-read status register before dispatching each IRQ handler
  ARM: 7368/1: fault.c: correct how the tsk->[maj|min]_flt gets incremented
parents 12e993b8 708e5978
...@@ -77,6 +77,8 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space) ...@@ -77,6 +77,8 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)
} else if (atag->hdr.tag == ATAG_MEM) { } else if (atag->hdr.tag == ATAG_MEM) {
if (memcount >= sizeof(mem_reg_property)/4) if (memcount >= sizeof(mem_reg_property)/4)
continue; continue;
if (!atag->u.mem.size)
continue;
mem_reg_property[memcount++] = cpu_to_fdt32(atag->u.mem.start); mem_reg_property[memcount++] = cpu_to_fdt32(atag->u.mem.start);
mem_reg_property[memcount++] = cpu_to_fdt32(atag->u.mem.size); mem_reg_property[memcount++] = cpu_to_fdt32(atag->u.mem.size);
} else if (atag->hdr.tag == ATAG_INITRD2) { } else if (atag->hdr.tag == ATAG_INITRD2) {
......
...@@ -273,7 +273,7 @@ restart: adr r0, LC0 ...@@ -273,7 +273,7 @@ restart: adr r0, LC0
add r0, r0, #0x100 add r0, r0, #0x100
mov r1, r6 mov r1, r6
sub r2, sp, r6 sub r2, sp, r6
blne atags_to_fdt bleq atags_to_fdt
ldmfd sp!, {r0-r3, ip, lr} ldmfd sp!, {r0-r3, ip, lr}
sub sp, sp, #0x10000 sub sp, sp, #0x10000
......
...@@ -427,19 +427,18 @@ int __init vic_of_init(struct device_node *node, struct device_node *parent) ...@@ -427,19 +427,18 @@ int __init vic_of_init(struct device_node *node, struct device_node *parent)
/* /*
* Handle each interrupt in a single VIC. Returns non-zero if we've * Handle each interrupt in a single VIC. Returns non-zero if we've
* handled at least one interrupt. This does a single read of the * handled at least one interrupt. This reads the status register
* status register and handles all interrupts in order from LSB first. * before handling each interrupt, which is necessary given that
* handle_IRQ may briefly re-enable interrupts for soft IRQ handling.
*/ */
static int handle_one_vic(struct vic_device *vic, struct pt_regs *regs) static int handle_one_vic(struct vic_device *vic, struct pt_regs *regs)
{ {
u32 stat, irq; u32 stat, irq;
int handled = 0; int handled = 0;
stat = readl_relaxed(vic->base + VIC_IRQ_STATUS); while ((stat = readl_relaxed(vic->base + VIC_IRQ_STATUS))) {
while (stat) {
irq = ffs(stat) - 1; irq = ffs(stat) - 1;
handle_IRQ(irq_find_mapping(vic->domain, irq), regs); handle_IRQ(irq_find_mapping(vic->domain, irq), regs);
stat &= ~(1 << irq);
handled = 1; handled = 1;
} }
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#define JUMP_LABEL_NOP "nop" #define JUMP_LABEL_NOP "nop"
#endif #endif
static __always_inline bool arch_static_branch(struct jump_label_key *key) static __always_inline bool arch_static_branch(struct static_key *key)
{ {
asm goto("1:\n\t" asm goto("1:\n\t"
JUMP_LABEL_NOP "\n\t" JUMP_LABEL_NOP "\n\t"
......
...@@ -523,6 +523,20 @@ int __init arm_add_memory(phys_addr_t start, unsigned long size) ...@@ -523,6 +523,20 @@ int __init arm_add_memory(phys_addr_t start, unsigned long size)
*/ */
size -= start & ~PAGE_MASK; size -= start & ~PAGE_MASK;
bank->start = PAGE_ALIGN(start); bank->start = PAGE_ALIGN(start);
#ifndef CONFIG_LPAE
if (bank->start + size < bank->start) {
printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in "
"32-bit physical address space\n", (long long)start);
/*
* To ensure bank->start + bank->size is representable in
* 32 bits, we use ULONG_MAX as the upper limit rather than 4GB.
* This means we lose a page after masking.
*/
size = ULONG_MAX - bank->start;
}
#endif
bank->size = size & PAGE_MASK; bank->size = size & PAGE_MASK;
/* /*
......
...@@ -118,10 +118,14 @@ static int twd_cpufreq_transition(struct notifier_block *nb, ...@@ -118,10 +118,14 @@ static int twd_cpufreq_transition(struct notifier_block *nb,
* The twd clock events must be reprogrammed to account for the new * The twd clock events must be reprogrammed to account for the new
* frequency. The timer is local to a cpu, so cross-call to the * frequency. The timer is local to a cpu, so cross-call to the
* changing cpu. * changing cpu.
*
* Only wait for it to finish, if the cpu is active to avoid
* deadlock when cpu1 is spinning on while(!cpu_active(cpu1)) during
* booting of that cpu.
*/ */
if (state == CPUFREQ_POSTCHANGE || state == CPUFREQ_RESUMECHANGE) if (state == CPUFREQ_POSTCHANGE || state == CPUFREQ_RESUMECHANGE)
smp_call_function_single(freqs->cpu, twd_update_frequency, smp_call_function_single(freqs->cpu, twd_update_frequency,
NULL, 1); NULL, cpu_active(freqs->cpu));
return NOTIFY_OK; return NOTIFY_OK;
} }
......
...@@ -723,7 +723,7 @@ config CPU_HIGH_VECTOR ...@@ -723,7 +723,7 @@ config CPU_HIGH_VECTOR
bool "Select the High exception vector" bool "Select the High exception vector"
help help
Say Y here to select high exception vector(0xFFFF0000~). Say Y here to select high exception vector(0xFFFF0000~).
The exception vector can be vary depending on the platform The exception vector can vary depending on the platform
design in nommu mode. If your platform needs to select design in nommu mode. If your platform needs to select
high exception vector, say Y. high exception vector, say Y.
Otherwise or if you are unsure, say N, and the low exception Otherwise or if you are unsure, say N, and the low exception
......
...@@ -320,7 +320,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) ...@@ -320,7 +320,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
*/ */
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr); perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr);
if (flags & FAULT_FLAG_ALLOW_RETRY) { if (!(fault & VM_FAULT_ERROR) && flags & FAULT_FLAG_ALLOW_RETRY) {
if (fault & VM_FAULT_MAJOR) { if (fault & VM_FAULT_MAJOR) {
tsk->maj_flt++; tsk->maj_flt++;
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1,
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/traps.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include "mm.h" #include "mm.h"
...@@ -39,6 +40,7 @@ void __init sanity_check_meminfo(void) ...@@ -39,6 +40,7 @@ void __init sanity_check_meminfo(void)
*/ */
void __init paging_init(struct machine_desc *mdesc) void __init paging_init(struct machine_desc *mdesc)
{ {
early_trap_init((void *)CONFIG_VECTORS_BASE);
bootmem_init(); bootmem_init();
} }
......
...@@ -254,6 +254,18 @@ __v7_setup: ...@@ -254,6 +254,18 @@ __v7_setup:
ldr r6, =NMRR @ NMRR ldr r6, =NMRR @ NMRR
mcr p15, 0, r5, c10, c2, 0 @ write PRRR mcr p15, 0, r5, c10, c2, 0 @ write PRRR
mcr p15, 0, r6, c10, c2, 1 @ write NMRR mcr p15, 0, r6, c10, c2, 1 @ write NMRR
#endif
#ifndef CONFIG_ARM_THUMBEE
mrc p15, 0, r0, c0, c1, 0 @ read ID_PFR0 for ThumbEE
and r0, r0, #(0xf << 12) @ ThumbEE enabled field
teq r0, #(1 << 12) @ check if ThumbEE is present
bne 1f
mov r5, #0
mcr p14, 6, r5, c1, c0, 0 @ Initialize TEEHBR to 0
mrc p14, 6, r0, c0, c0, 0 @ load TEECR
orr r0, r0, #1 @ set the 1st bit in order to
mcr p14, 6, r0, c0, c0, 0 @ stop userspace TEEHBR access
1:
#endif #endif
adr r5, v7_crval adr r5, v7_crval
ldmia r5, {r5, r6} ldmia r5, {r5, r6}
......
...@@ -247,8 +247,7 @@ static int amba_pm_restore(struct device *dev) ...@@ -247,8 +247,7 @@ static int amba_pm_restore(struct device *dev)
/* /*
* Hooks to provide runtime PM of the pclk (bus clock). It is safe to * Hooks to provide runtime PM of the pclk (bus clock). It is safe to
* enable/disable the bus clock at runtime PM suspend/resume as this * enable/disable the bus clock at runtime PM suspend/resume as this
* does not result in loss of context. However, disabling vcore power * does not result in loss of context.
* would do, so we leave that to the driver.
*/ */
static int amba_pm_runtime_suspend(struct device *dev) static int amba_pm_runtime_suspend(struct device *dev)
{ {
...@@ -354,39 +353,6 @@ static void amba_put_disable_pclk(struct amba_device *pcdev) ...@@ -354,39 +353,6 @@ static void amba_put_disable_pclk(struct amba_device *pcdev)
clk_put(pclk); clk_put(pclk);
} }
static int amba_get_enable_vcore(struct amba_device *pcdev)
{
struct regulator *vcore = regulator_get(&pcdev->dev, "vcore");
int ret;
pcdev->vcore = vcore;
if (IS_ERR(vcore)) {
/* It is OK not to supply a vcore regulator */
if (PTR_ERR(vcore) == -ENODEV)
return 0;
return PTR_ERR(vcore);
}
ret = regulator_enable(vcore);
if (ret) {
regulator_put(vcore);
pcdev->vcore = ERR_PTR(-ENODEV);
}
return ret;
}
static void amba_put_disable_vcore(struct amba_device *pcdev)
{
struct regulator *vcore = pcdev->vcore;
if (!IS_ERR(vcore)) {
regulator_disable(vcore);
regulator_put(vcore);
}
}
/* /*
* These are the device model conversion veneers; they convert the * These are the device model conversion veneers; they convert the
* device model structures to our more specific structures. * device model structures to our more specific structures.
...@@ -399,10 +365,6 @@ static int amba_probe(struct device *dev) ...@@ -399,10 +365,6 @@ static int amba_probe(struct device *dev)
int ret; int ret;
do { do {
ret = amba_get_enable_vcore(pcdev);
if (ret)
break;
ret = amba_get_enable_pclk(pcdev); ret = amba_get_enable_pclk(pcdev);
if (ret) if (ret)
break; break;
...@@ -420,7 +382,6 @@ static int amba_probe(struct device *dev) ...@@ -420,7 +382,6 @@ static int amba_probe(struct device *dev)
pm_runtime_put_noidle(dev); pm_runtime_put_noidle(dev);
amba_put_disable_pclk(pcdev); amba_put_disable_pclk(pcdev);
amba_put_disable_vcore(pcdev);
} while (0); } while (0);
return ret; return ret;
...@@ -442,7 +403,6 @@ static int amba_remove(struct device *dev) ...@@ -442,7 +403,6 @@ static int amba_remove(struct device *dev)
pm_runtime_put_noidle(dev); pm_runtime_put_noidle(dev);
amba_put_disable_pclk(pcdev); amba_put_disable_pclk(pcdev);
amba_put_disable_vcore(pcdev);
return ret; return ret;
} }
......
...@@ -2788,6 +2788,7 @@ static struct regulator_init_data db8500_regulators[DB8500_NUM_REGULATORS] = { ...@@ -2788,6 +2788,7 @@ static struct regulator_init_data db8500_regulators[DB8500_NUM_REGULATORS] = {
.constraints = { .constraints = {
.name = "db8500-vape", .name = "db8500-vape",
.valid_ops_mask = REGULATOR_CHANGE_STATUS, .valid_ops_mask = REGULATOR_CHANGE_STATUS,
.always_on = true,
}, },
.consumer_supplies = db8500_vape_consumers, .consumer_supplies = db8500_vape_consumers,
.num_consumer_supplies = ARRAY_SIZE(db8500_vape_consumers), .num_consumer_supplies = ARRAY_SIZE(db8500_vape_consumers),
......
...@@ -2195,7 +2195,6 @@ static int pl022_runtime_suspend(struct device *dev) ...@@ -2195,7 +2195,6 @@ static int pl022_runtime_suspend(struct device *dev)
struct pl022 *pl022 = dev_get_drvdata(dev); struct pl022 *pl022 = dev_get_drvdata(dev);
clk_disable(pl022->clk); clk_disable(pl022->clk);
amba_vcore_disable(pl022->adev);
return 0; return 0;
} }
...@@ -2204,7 +2203,6 @@ static int pl022_runtime_resume(struct device *dev) ...@@ -2204,7 +2203,6 @@ static int pl022_runtime_resume(struct device *dev)
{ {
struct pl022 *pl022 = dev_get_drvdata(dev); struct pl022 *pl022 = dev_get_drvdata(dev);
amba_vcore_enable(pl022->adev);
clk_enable(pl022->clk); clk_enable(pl022->clk);
return 0; return 0;
......
...@@ -30,7 +30,6 @@ struct amba_device { ...@@ -30,7 +30,6 @@ struct amba_device {
struct device dev; struct device dev;
struct resource res; struct resource res;
struct clk *pclk; struct clk *pclk;
struct regulator *vcore;
u64 dma_mask; u64 dma_mask;
unsigned int periphid; unsigned int periphid;
unsigned int irq[AMBA_NR_IRQS]; unsigned int irq[AMBA_NR_IRQS];
...@@ -75,12 +74,6 @@ void amba_release_regions(struct amba_device *); ...@@ -75,12 +74,6 @@ void amba_release_regions(struct amba_device *);
#define amba_pclk_disable(d) \ #define amba_pclk_disable(d) \
do { if (!IS_ERR((d)->pclk)) clk_disable((d)->pclk); } while (0) do { if (!IS_ERR((d)->pclk)) clk_disable((d)->pclk); } while (0)
#define amba_vcore_enable(d) \
(IS_ERR((d)->vcore) ? 0 : regulator_enable((d)->vcore))
#define amba_vcore_disable(d) \
do { if (!IS_ERR((d)->vcore)) regulator_disable((d)->vcore); } while (0)
/* Some drivers don't use the struct amba_device */ /* Some drivers don't use the struct amba_device */
#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff) #define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f) #define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment