Merge tag 'nds32-for-linus-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/greentime/linux
Pull nds32 updates from Greentime Hu: - Perf support - Power management support - FPU support - Hardware prefetcher support - Build error fixed - Performance enhancement * tag 'nds32-for-linus-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/greentime/linux: nds32: support hardware prefetcher nds32: Fix the items of hwcap_str ordering issue. math-emu/soft-fp.h: (_FP_ROUND_ZERO) cast 0 to void to fix warning math-emu/op-2.h: Use statement expressions to prevent negative constant shift nds32: support denormalized result through FP emulator nds32: Support FP emulation nds32: nds32 FPU port nds32: Remove duplicated include from pm.c nds32: Power management for nds32 nds32: Add document for NDS32 PMU. nds32: Add perf call-graph support. nds32: Perf porting nds32: Fix bug in bitfield.h nds32: Fix gcc 8.0 compiler option incompatible. nds32: Fill all TLB entries with kernel image mapping nds32: Remove the redundant assignment
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
#include <linux/irqchip.h>
|
||||
#include <nds32_intrinsic.h>
|
||||
|
||||
unsigned long wake_mask;
|
||||
|
||||
static void ativic32_ack_irq(struct irq_data *data)
|
||||
{
|
||||
__nds32__mtsr_dsb(BIT(data->hwirq), NDS32_SR_INT_PEND2);
|
||||
@@ -27,11 +29,40 @@ static void ativic32_unmask_irq(struct irq_data *data)
|
||||
__nds32__mtsr_dsb(int_mask2 | (BIT(data->hwirq)), NDS32_SR_INT_MASK2);
|
||||
}
|
||||
|
||||
static int nointc_set_wake(struct irq_data *data, unsigned int on)
|
||||
{
|
||||
unsigned long int_mask = __nds32__mfsr(NDS32_SR_INT_MASK);
|
||||
static unsigned long irq_orig_bit;
|
||||
u32 bit = 1 << data->hwirq;
|
||||
|
||||
if (on) {
|
||||
if (int_mask & bit)
|
||||
__assign_bit(data->hwirq, &irq_orig_bit, true);
|
||||
else
|
||||
__assign_bit(data->hwirq, &irq_orig_bit, false);
|
||||
|
||||
__assign_bit(data->hwirq, &int_mask, true);
|
||||
__assign_bit(data->hwirq, &wake_mask, true);
|
||||
|
||||
} else {
|
||||
if (!(irq_orig_bit & bit))
|
||||
__assign_bit(data->hwirq, &int_mask, false);
|
||||
|
||||
__assign_bit(data->hwirq, &wake_mask, false);
|
||||
__assign_bit(data->hwirq, &irq_orig_bit, false);
|
||||
}
|
||||
|
||||
__nds32__mtsr_dsb(int_mask, NDS32_SR_INT_MASK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip ativic32_chip = {
|
||||
.name = "ativic32",
|
||||
.irq_ack = ativic32_ack_irq,
|
||||
.irq_mask = ativic32_mask_irq,
|
||||
.irq_unmask = ativic32_unmask_irq,
|
||||
.irq_set_wake = nointc_set_wake,
|
||||
};
|
||||
|
||||
static unsigned int __initdata nivic_map[6] = { 6, 2, 10, 16, 24, 32 };
|
||||
|
Reference in New Issue
Block a user