linux/arch/nios2/kernel/irq.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright (C) 2013 Altera Corporation
   4 * Copyright (C) 2011 Tobias Klauser <tklauser@distanz.ch>
   5 * Copyright (C) 2008 Thomas Chou <thomas@wytron.com.tw>
   6 *
   7 * based on irq.c from m68k which is:
   8 *
   9 * Copyright (C) 2007 Greg Ungerer <gerg@snapgear.com>
  10 */
  11
  12#include <linux/init.h>
  13#include <linux/interrupt.h>
  14#include <linux/of.h>
  15
  16static u32 ienable;
  17
  18asmlinkage void do_IRQ(int hwirq, struct pt_regs *regs)
  19{
  20        struct pt_regs *oldregs = set_irq_regs(regs);
  21        int irq;
  22
  23        irq_enter();
  24        irq = irq_find_mapping(NULL, hwirq);
  25        generic_handle_irq(irq);
  26        irq_exit();
  27
  28        set_irq_regs(oldregs);
  29}
  30
  31static void chip_unmask(struct irq_data *d)
  32{
  33        ienable |= (1 << d->hwirq);
  34        WRCTL(CTL_IENABLE, ienable);
  35}
  36
  37static void chip_mask(struct irq_data *d)
  38{
  39        ienable &= ~(1 << d->hwirq);
  40        WRCTL(CTL_IENABLE, ienable);
  41}
  42
  43static struct irq_chip m_irq_chip = {
  44        .name           = "NIOS2-INTC",
  45        .irq_unmask     = chip_unmask,
  46        .irq_mask       = chip_mask,
  47};
  48
  49static int irq_map(struct irq_domain *h, unsigned int virq,
  50                                irq_hw_number_t hw_irq_num)
  51{
  52        irq_set_chip_and_handler(virq, &m_irq_chip, handle_level_irq);
  53
  54        return 0;
  55}
  56
  57static const struct irq_domain_ops irq_ops = {
  58        .map    = irq_map,
  59        .xlate  = irq_domain_xlate_onecell,
  60};
  61
  62void __init init_IRQ(void)
  63{
  64        struct irq_domain *domain;
  65        struct device_node *node;
  66
  67        node = of_find_compatible_node(NULL, NULL, "altr,nios2-1.0");
  68        if (!node)
  69                node = of_find_compatible_node(NULL, NULL, "altr,nios2-1.1");
  70
  71        BUG_ON(!node);
  72
  73        domain = irq_domain_add_linear(node, NIOS2_CPU_NR_IRQS, &irq_ops, NULL);
  74        BUG_ON(!domain);
  75
  76        irq_set_default_host(domain);
  77        of_node_put(node);
  78        /* Load the initial ienable value */
  79        ienable = RDCTL(CTL_IENABLE);
  80}
  81