diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-16 02:27:22 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-16 02:27:22 +0400 |
commit | 6c0514ddd973ff13c3d2b2e7ac1422c982afb8eb (patch) | |
tree | beccc0d9aa9df71f4af081736e8c0b007dfcb603 /arch/blackfin/mach-common/smp.c | |
parent | 98d38dd2ee30322fc9934d7490be3c5bee80950e (diff) | |
parent | 36855dcfc980f247909b8f63776664c6ccb6f183 (diff) | |
download | linux-6c0514ddd973ff13c3d2b2e7ac1422c982afb8eb.tar.xz |
Merge tag 'blackfin-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/realmz6/blackfin-linux
Pull blackfin updates from Steven Miao:
"Blackfin gpio changes, add adi pinctrl driver, and bug fixes"
* tag 'blackfin-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/realmz6/blackfin-linux:
blackfin: fix build warning for unused variable
smp: bf561: and smb_wmb()/smp_rmb() at ipi send/receive
pm: use GFP_ATOMIC when pm core call this function
blackfin: serial: Add serial port_fer and port_mux early platform resources.
blackfin: pinctrl-adi2: code cleanup after using pinctrl-adi2
blackfin: adi gpio driver and pinctrl driver support
bf609: update default config for spi
Blackfin: bfin_gpio: Use proper mask for comparing pfunc
Diffstat (limited to 'arch/blackfin/mach-common/smp.c')
-rw-r--r-- | arch/blackfin/mach-common/smp.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/arch/blackfin/mach-common/smp.c b/arch/blackfin/mach-common/smp.c index 82f301c117a5..2bbae0783819 100644 --- a/arch/blackfin/mach-common/smp.c +++ b/arch/blackfin/mach-common/smp.c @@ -146,6 +146,7 @@ static irqreturn_t ipi_handler_int1(int irq, void *dev_instance) platform_clear_ipi(cpu, IRQ_SUPPLE_1); + smp_rmb(); bfin_ipi_data = &__get_cpu_var(bfin_ipi); while ((pending = atomic_xchg(&bfin_ipi_data->bits, 0)) != 0) { msg = 0; @@ -161,18 +162,20 @@ static irqreturn_t ipi_handler_int1(int irq, void *dev_instance) case BFIN_IPI_CALL_FUNC: generic_smp_call_function_interrupt(); break; - case BFIN_IPI_CALL_FUNC_SINGLE: generic_smp_call_function_single_interrupt(); break; - case BFIN_IPI_CPU_STOP: ipi_cpu_stop(cpu); break; + default: + goto out; } atomic_dec(&bfin_ipi_data->count); } while (msg < BITS_PER_LONG); + } +out: return IRQ_HANDLED; } @@ -198,10 +201,11 @@ void send_ipi(const struct cpumask *cpumask, enum ipi_message_type msg) bfin_ipi_data = &per_cpu(bfin_ipi, cpu); atomic_set_mask((1 << msg), &bfin_ipi_data->bits); atomic_inc(&bfin_ipi_data->count); - platform_send_ipi_cpu(cpu, IRQ_SUPPLE_1); } - local_irq_restore(flags); + smp_wmb(); + for_each_cpu(cpu, cpumask) + platform_send_ipi_cpu(cpu, IRQ_SUPPLE_1); } void arch_send_call_function_single_ipi(int cpu) |