linux/arch/m68k/apollo/dn_ints.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <linux/interrupt.h>
   3#include <linux/irq.h>
   4
   5#include <asm/traps.h>
   6#include <asm/apollohw.h>
   7
   8unsigned int apollo_irq_startup(struct irq_data *data)
   9{
  10        unsigned int irq = data->irq;
  11
  12        if (irq < 8)
  13                *(volatile unsigned char *)(pica+1) &= ~(1 << irq);
  14        else
  15                *(volatile unsigned char *)(picb+1) &= ~(1 << (irq - 8));
  16        return 0;
  17}
  18
  19void apollo_irq_shutdown(struct irq_data *data)
  20{
  21        unsigned int irq = data->irq;
  22
  23        if (irq < 8)
  24                *(volatile unsigned char *)(pica+1) |= (1 << irq);
  25        else
  26                *(volatile unsigned char *)(picb+1) |= (1 << (irq - 8));
  27}
  28
  29void apollo_irq_eoi(struct irq_data *data)
  30{
  31        *(volatile unsigned char *)(pica) = 0x20;
  32        *(volatile unsigned char *)(picb) = 0x20;
  33}
  34
  35static struct irq_chip apollo_irq_chip = {
  36        .name           = "apollo",
  37        .irq_startup    = apollo_irq_startup,
  38        .irq_shutdown   = apollo_irq_shutdown,
  39        .irq_eoi        = apollo_irq_eoi,
  40};
  41
  42
  43void __init dn_init_IRQ(void)
  44{
  45        m68k_setup_user_interrupt(VEC_USER + 96, 16);
  46        m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq,
  47                                  IRQ_APOLLO, 16);
  48}
  49