Commit e6251f00 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'arc-4.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc

Pull ARC fixes from Vineet Gupta:

 - mmap handler for dma ops as generic handler no longer works for us
   [Alexey]

 - Fixes for EZChip platform [Noam]

 - Fix RTC clocksource driver build issue

 - ARC IRQ handling fixes [Yuriy]

 - Revert a recent makefile change which doesn't go well with oldish
   tools out in the wild

* tag 'arc-4.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc:
  ARCv2: MCIP: Use IDU_M_DISTRI_DEST mode if there is only 1 destination core
  ARC: IRQ: Do not use hwirq as virq and vice versa
  ARC: [plat-eznps] set default baud for early console
  ARC: [plat-eznps] remove IPI clear from SMP operations
  Revert "ARC: build: retire old toggles"
  ARC: timer: rtc: implement read loop in "C" vs. inline asm
  ARC: change return value of userspace cmpxchg assist syscall
  arc: Implement arch-specific dma_map_ops.mmap
  ARC: [SMP] avoid overriding present cpumask
  ARC: Enable PERF_EVENTS in nSIM driven platforms
parents e3d183c0 0a0a047d
...@@ -50,6 +50,9 @@ atleast_gcc44 := $(call cc-ifversion, -ge, 0404, y) ...@@ -50,6 +50,9 @@ atleast_gcc44 := $(call cc-ifversion, -ge, 0404, y)
cflags-$(atleast_gcc44) += -fsection-anchors cflags-$(atleast_gcc44) += -fsection-anchors
cflags-$(CONFIG_ARC_HAS_LLSC) += -mlock
cflags-$(CONFIG_ARC_HAS_SWAPE) += -mswape
ifdef CONFIG_ISA_ARCV2 ifdef CONFIG_ISA_ARCV2
ifndef CONFIG_ARC_HAS_LL64 ifndef CONFIG_ARC_HAS_LL64
......
...@@ -71,7 +71,7 @@ debug_uart: dw-apb-uart@0x5000 { ...@@ -71,7 +71,7 @@ debug_uart: dw-apb-uart@0x5000 {
reg-io-width = <4>; reg-io-width = <4>;
}; };
arcpmu0: pmu { arcpct0: pct {
compatible = "snps,arc700-pct"; compatible = "snps,arc700-pct";
}; };
}; };
......
...@@ -69,7 +69,7 @@ phy0: ethernet-phy@0 { ...@@ -69,7 +69,7 @@ phy0: ethernet-phy@0 {
}; };
}; };
arcpmu0: pmu { arcpct0: pct {
compatible = "snps,arc700-pct"; compatible = "snps,arc700-pct";
}; };
}; };
......
...@@ -83,5 +83,9 @@ eth0: ethernet@f0003000 { ...@@ -83,5 +83,9 @@ eth0: ethernet@f0003000 {
reg = <0xf0003000 0x44>; reg = <0xf0003000 0x44>;
interrupts = <7>; interrupts = <7>;
}; };
arcpct0: pct {
compatible = "snps,arc700-pct";
};
}; };
}; };
...@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y ...@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/" CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ALL=y
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_PERF_EVENTS=y
# CONFIG_SLUB_DEBUG is not set # CONFIG_SLUB_DEBUG is not set
# CONFIG_COMPAT_BRK is not set # CONFIG_COMPAT_BRK is not set
CONFIG_KPROBES=y CONFIG_KPROBES=y
......
...@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y ...@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/" CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/"
CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ALL=y
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_PERF_EVENTS=y
# CONFIG_SLUB_DEBUG is not set # CONFIG_SLUB_DEBUG is not set
# CONFIG_COMPAT_BRK is not set # CONFIG_COMPAT_BRK is not set
CONFIG_KPROBES=y CONFIG_KPROBES=y
......
...@@ -12,6 +12,7 @@ CONFIG_BLK_DEV_INITRD=y ...@@ -12,6 +12,7 @@ CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/" CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ALL=y
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_PERF_EVENTS=y
# CONFIG_SLUB_DEBUG is not set # CONFIG_SLUB_DEBUG is not set
# CONFIG_COMPAT_BRK is not set # CONFIG_COMPAT_BRK is not set
CONFIG_KPROBES=y CONFIG_KPROBES=y
......
...@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y ...@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/" CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ALL=y
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_PERF_EVENTS=y
# CONFIG_SLUB_DEBUG is not set # CONFIG_SLUB_DEBUG is not set
# CONFIG_COMPAT_BRK is not set # CONFIG_COMPAT_BRK is not set
CONFIG_KPROBES=y CONFIG_KPROBES=y
......
...@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y ...@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/" CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ALL=y
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_PERF_EVENTS=y
# CONFIG_SLUB_DEBUG is not set # CONFIG_SLUB_DEBUG is not set
# CONFIG_COMPAT_BRK is not set # CONFIG_COMPAT_BRK is not set
CONFIG_KPROBES=y CONFIG_KPROBES=y
......
...@@ -10,6 +10,7 @@ CONFIG_IKCONFIG_PROC=y ...@@ -10,6 +10,7 @@ CONFIG_IKCONFIG_PROC=y
# CONFIG_PID_NS is not set # CONFIG_PID_NS is not set
CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/" CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
CONFIG_PERF_EVENTS=y
# CONFIG_COMPAT_BRK is not set # CONFIG_COMPAT_BRK is not set
CONFIG_KPROBES=y CONFIG_KPROBES=y
CONFIG_MODULES=y CONFIG_MODULES=y
...@@ -34,7 +35,6 @@ CONFIG_INET=y ...@@ -34,7 +35,6 @@ CONFIG_INET=y
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set
# CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set
# CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_XFRM_MODE_BEET is not set
# CONFIG_INET_LRO is not set
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
# CONFIG_WIRELESS is not set # CONFIG_WIRELESS is not set
CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS=y
...@@ -72,7 +72,6 @@ CONFIG_SERIAL_OF_PLATFORM=y ...@@ -72,7 +72,6 @@ CONFIG_SERIAL_OF_PLATFORM=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_DRM=y CONFIG_DRM=y
CONFIG_DRM_ARCPGU=y CONFIG_DRM_ARCPGU=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y CONFIG_LOGO=y
# CONFIG_HID is not set # CONFIG_HID is not set
# CONFIG_USB_SUPPORT is not set # CONFIG_USB_SUPPORT is not set
......
...@@ -43,12 +43,14 @@ ...@@ -43,12 +43,14 @@
#define STATUS_AE_BIT 5 /* Exception active */ #define STATUS_AE_BIT 5 /* Exception active */
#define STATUS_DE_BIT 6 /* PC is in delay slot */ #define STATUS_DE_BIT 6 /* PC is in delay slot */
#define STATUS_U_BIT 7 /* User/Kernel mode */ #define STATUS_U_BIT 7 /* User/Kernel mode */
#define STATUS_Z_BIT 11
#define STATUS_L_BIT 12 /* Loop inhibit */ #define STATUS_L_BIT 12 /* Loop inhibit */
/* These masks correspond to the status word(STATUS_32) bits */ /* These masks correspond to the status word(STATUS_32) bits */
#define STATUS_AE_MASK (1<<STATUS_AE_BIT) #define STATUS_AE_MASK (1<<STATUS_AE_BIT)
#define STATUS_DE_MASK (1<<STATUS_DE_BIT) #define STATUS_DE_MASK (1<<STATUS_DE_BIT)
#define STATUS_U_MASK (1<<STATUS_U_BIT) #define STATUS_U_MASK (1<<STATUS_U_BIT)
#define STATUS_Z_MASK (1<<STATUS_Z_BIT)
#define STATUS_L_MASK (1<<STATUS_L_BIT) #define STATUS_L_MASK (1<<STATUS_L_BIT)
/* /*
......
...@@ -37,9 +37,9 @@ extern const char *arc_platform_smp_cpuinfo(void); ...@@ -37,9 +37,9 @@ extern const char *arc_platform_smp_cpuinfo(void);
* API expected BY platform smp code (FROM arch smp code) * API expected BY platform smp code (FROM arch smp code)
* *
* smp_ipi_irq_setup: * smp_ipi_irq_setup:
* Takes @cpu and @irq to which the arch-common ISR is hooked up * Takes @cpu and @hwirq to which the arch-common ISR is hooked up
*/ */
extern int smp_ipi_irq_setup(int cpu, int irq); extern int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq);
/* /*
* struct plat_smp_ops - SMP callbacks provided by platform to ARC SMP * struct plat_smp_ops - SMP callbacks provided by platform to ARC SMP
......
...@@ -31,6 +31,8 @@ static void __init arc_set_early_base_baud(unsigned long dt_root) ...@@ -31,6 +31,8 @@ static void __init arc_set_early_base_baud(unsigned long dt_root)
arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */ arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */
else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp")) else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp"))
arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x) */ arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x) */
else if (of_flat_dt_is_compatible(dt_root, "ezchip,arc-nps"))
arc_base_baud = 800000000; /* Fixed 800MHz clk (NPS) */
else else
arc_base_baud = 50000000; /* Fixed default 50MHz */ arc_base_baud = 50000000; /* Fixed default 50MHz */
} }
......
...@@ -181,6 +181,8 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask, ...@@ -181,6 +181,8 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
{ {
unsigned long flags; unsigned long flags;
cpumask_t online; cpumask_t online;
unsigned int destination_bits;
unsigned int distribution_mode;
/* errout if no online cpu per @cpumask */ /* errout if no online cpu per @cpumask */
if (!cpumask_and(&online, cpumask, cpu_online_mask)) if (!cpumask_and(&online, cpumask, cpu_online_mask))
...@@ -188,8 +190,15 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask, ...@@ -188,8 +190,15 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
raw_spin_lock_irqsave(&mcip_lock, flags); raw_spin_lock_irqsave(&mcip_lock, flags);
idu_set_dest(data->hwirq, cpumask_bits(&online)[0]); destination_bits = cpumask_bits(&online)[0];
idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, IDU_M_DISTRI_RR); idu_set_dest(data->hwirq, destination_bits);
if (ffs(destination_bits) == fls(destination_bits))
distribution_mode = IDU_M_DISTRI_DEST;
else
distribution_mode = IDU_M_DISTRI_RR;
idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, distribution_mode);
raw_spin_unlock_irqrestore(&mcip_lock, flags); raw_spin_unlock_irqrestore(&mcip_lock, flags);
...@@ -207,16 +216,15 @@ static struct irq_chip idu_irq_chip = { ...@@ -207,16 +216,15 @@ static struct irq_chip idu_irq_chip = {
}; };
static int idu_first_irq; static irq_hw_number_t idu_first_hwirq;
static void idu_cascade_isr(struct irq_desc *desc) static void idu_cascade_isr(struct irq_desc *desc)
{ {
struct irq_domain *domain = irq_desc_get_handler_data(desc); struct irq_domain *idu_domain = irq_desc_get_handler_data(desc);
unsigned int core_irq = irq_desc_get_irq(desc); irq_hw_number_t core_hwirq = irqd_to_hwirq(irq_desc_get_irq_data(desc));
unsigned int idu_irq; irq_hw_number_t idu_hwirq = core_hwirq - idu_first_hwirq;
idu_irq = core_irq - idu_first_irq; generic_handle_irq(irq_find_mapping(idu_domain, idu_hwirq));
generic_handle_irq(irq_find_mapping(domain, idu_irq));
} }
static int idu_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq) static int idu_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq)
...@@ -282,7 +290,7 @@ idu_of_init(struct device_node *intc, struct device_node *parent) ...@@ -282,7 +290,7 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
struct irq_domain *domain; struct irq_domain *domain;
/* Read IDU BCR to confirm nr_irqs */ /* Read IDU BCR to confirm nr_irqs */
int nr_irqs = of_irq_count(intc); int nr_irqs = of_irq_count(intc);
int i, irq; int i, virq;
struct mcip_bcr mp; struct mcip_bcr mp;
READ_BCR(ARC_REG_MCIP_BCR, mp); READ_BCR(ARC_REG_MCIP_BCR, mp);
...@@ -303,11 +311,11 @@ idu_of_init(struct device_node *intc, struct device_node *parent) ...@@ -303,11 +311,11 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
* however we need it to get the parent virq and set IDU handler * however we need it to get the parent virq and set IDU handler
* as first level isr * as first level isr
*/ */
irq = irq_of_parse_and_map(intc, i); virq = irq_of_parse_and_map(intc, i);
if (!i) if (!i)
idu_first_irq = irq; idu_first_hwirq = irqd_to_hwirq(irq_get_irq_data(virq));
irq_set_chained_handler_and_data(irq, idu_cascade_isr, domain); irq_set_chained_handler_and_data(virq, idu_cascade_isr, domain);
} }
__mcip_cmd(CMD_IDU_ENABLE, 0); __mcip_cmd(CMD_IDU_ENABLE, 0);
......
...@@ -43,8 +43,8 @@ SYSCALL_DEFINE0(arc_gettls) ...@@ -43,8 +43,8 @@ SYSCALL_DEFINE0(arc_gettls)
SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new) SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
{ {
int uval; struct pt_regs *regs = current_pt_regs();
int ret; int uval = -EFAULT;
/* /*
* This is only for old cores lacking LLOCK/SCOND, which by defintion * This is only for old cores lacking LLOCK/SCOND, which by defintion
...@@ -54,24 +54,26 @@ SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new) ...@@ -54,24 +54,26 @@ SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
*/ */
WARN_ON_ONCE(IS_ENABLED(CONFIG_SMP)); WARN_ON_ONCE(IS_ENABLED(CONFIG_SMP));
/* Z indicates to userspace if operation succeded */
regs->status32 &= ~STATUS_Z_MASK;
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
return -EFAULT; return -EFAULT;
preempt_disable(); preempt_disable();
ret = __get_user(uval, uaddr); if (__get_user(uval, uaddr))
if (ret)
goto done; goto done;
if (uval != expected) if (uval == expected) {
ret = -EAGAIN; if (!__put_user(new, uaddr))
else regs->status32 |= STATUS_Z_MASK;
ret = __put_user(new, uaddr); }
done: done:
preempt_enable(); preempt_enable();
return ret; return uval;
} }
void arch_cpu_idle(void) void arch_cpu_idle(void)
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <linux/irqdomain.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach_desc.h> #include <asm/mach_desc.h>
...@@ -67,11 +68,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus) ...@@ -67,11 +68,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
int i; int i;
/* /*
* Initialise the present map, which describes the set of CPUs * if platform didn't set the present map already, do it now
* actually populated at the present time. * boot cpu is set to present already by init/main.c
*/ */
if (num_present_cpus() <= 1) {
for (i = 0; i < max_cpus; i++) for (i = 0; i < max_cpus; i++)
set_cpu_present(i, true); set_cpu_present(i, true);
}
} }
void __init smp_cpus_done(unsigned int max_cpus) void __init smp_cpus_done(unsigned int max_cpus)
...@@ -351,20 +354,24 @@ irqreturn_t do_IPI(int irq, void *dev_id) ...@@ -351,20 +354,24 @@ irqreturn_t do_IPI(int irq, void *dev_id)
*/ */
static DEFINE_PER_CPU(int, ipi_dev); static DEFINE_PER_CPU(int, ipi_dev);
int smp_ipi_irq_setup(int cpu, int irq) int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq)
{ {
int *dev = per_cpu_ptr(&ipi_dev, cpu); int *dev = per_cpu_ptr(&ipi_dev, cpu);
unsigned int virq = irq_find_mapping(NULL, hwirq);
if (!virq)
panic("Cannot find virq for root domain and hwirq=%lu", hwirq);
/* Boot cpu calls request, all call enable */ /* Boot cpu calls request, all call enable */
if (!cpu) { if (!cpu) {
int rc; int rc;
rc = request_percpu_irq(irq, do_IPI, "IPI Interrupt", dev); rc = request_percpu_irq(virq, do_IPI, "IPI Interrupt", dev);
if (rc) if (rc)
panic("Percpu IRQ request failed for %d\n", irq); panic("Percpu IRQ request failed for %u\n", virq);
} }
enable_percpu_irq(irq, 0); enable_percpu_irq(virq, 0);
return 0; return 0;
} }
...@@ -152,14 +152,17 @@ static cycle_t arc_read_rtc(struct clocksource *cs) ...@@ -152,14 +152,17 @@ static cycle_t arc_read_rtc(struct clocksource *cs)
cycle_t full; cycle_t full;
} stamp; } stamp;
/*
__asm__ __volatile( * hardware has an internal state machine which tracks readout of
"1: \n" * low/high and updates the CTRL.status if
" lr %0, [AUX_RTC_LOW] \n" * - interrupt/exception taken between the two reads
" lr %1, [AUX_RTC_HIGH] \n" * - high increments after low has been read
" lr %2, [AUX_RTC_CTRL] \n" */
" bbit0.nt %2, 31, 1b \n" do {
: "=r" (stamp.low), "=r" (stamp.high), "=r" (status)); stamp.low = read_aux_reg(AUX_RTC_LOW);
stamp.high = read_aux_reg(AUX_RTC_HIGH);
status = read_aux_reg(AUX_RTC_CTRL);
} while (!(status & _BITUL(31)));
return stamp.full; return stamp.full;
} }
......
...@@ -105,6 +105,31 @@ static void arc_dma_free(struct device *dev, size_t size, void *vaddr, ...@@ -105,6 +105,31 @@ static void arc_dma_free(struct device *dev, size_t size, void *vaddr,
__free_pages(page, get_order(size)); __free_pages(page, get_order(size));
} }
static int arc_dma_mmap(struct device *dev, struct vm_area_struct *vma,
void *cpu_addr, dma_addr_t dma_addr, size_t size,
unsigned long attrs)
{
unsigned long user_count = vma_pages(vma);
unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
unsigned long pfn = __phys_to_pfn(plat_dma_to_phys(dev, dma_addr));
unsigned long off = vma->vm_pgoff;
int ret = -ENXIO;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret))
return ret;
if (off < count && user_count <= (count - off)) {
ret = remap_pfn_range(vma, vma->vm_start,
pfn + off,
user_count << PAGE_SHIFT,
vma->vm_page_prot);
}
return ret;
}
/* /*
* streaming DMA Mapping API... * streaming DMA Mapping API...
* CPU accesses page via normal paddr, thus needs to explicitly made * CPU accesses page via normal paddr, thus needs to explicitly made
...@@ -193,6 +218,7 @@ static int arc_dma_supported(struct device *dev, u64 dma_mask) ...@@ -193,6 +218,7 @@ static int arc_dma_supported(struct device *dev, u64 dma_mask)
struct dma_map_ops arc_dma_ops = { struct dma_map_ops arc_dma_ops = {
.alloc = arc_dma_alloc, .alloc = arc_dma_alloc,
.free = arc_dma_free, .free = arc_dma_free,
.mmap = arc_dma_mmap,
.map_page = arc_dma_map_page, .map_page = arc_dma_map_page,
.map_sg = arc_dma_map_sg, .map_sg = arc_dma_map_sg,
.sync_single_for_device = arc_dma_sync_single_for_device, .sync_single_for_device = arc_dma_sync_single_for_device,
......
...@@ -140,16 +140,10 @@ static void eznps_init_per_cpu(int cpu) ...@@ -140,16 +140,10 @@ static void eznps_init_per_cpu(int cpu)
mtm_enable_core(cpu); mtm_enable_core(cpu);
} }
static void eznps_ipi_clear(int irq)
{
write_aux_reg(CTOP_AUX_IACK, 1 << irq);
}
struct plat_smp_ops plat_smp_ops = { struct plat_smp_ops plat_smp_ops = {
.info = smp_cpuinfo_buf, .info = smp_cpuinfo_buf,
.init_early_smp = eznps_init_cpumasks, .init_early_smp = eznps_init_cpumasks,
.cpu_kick = eznps_smp_wakeup_cpu, .cpu_kick = eznps_smp_wakeup_cpu,
.ipi_send = eznps_ipi_send, .ipi_send = eznps_ipi_send,
.init_per_cpu = eznps_init_per_cpu, .init_per_cpu = eznps_init_per_cpu,
.ipi_clear = eznps_ipi_clear,
}; };
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