linux/arch/m68k/mac/baboon.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Baboon Custom IC Management
   4 *
   5 * The Baboon custom IC controls the IDE, PCMCIA and media bay on the
   6 * PowerBook 190. It multiplexes multiple interrupt sources onto the
   7 * Nubus slot $C interrupt.
   8 */
   9
  10#include <linux/types.h>
  11#include <linux/kernel.h>
  12#include <linux/irq.h>
  13
  14#include <asm/macintosh.h>
  15#include <asm/macints.h>
  16#include <asm/mac_baboon.h>
  17
  18int baboon_present;
  19static volatile struct baboon *baboon;
  20
  21/*
  22 * Baboon initialization.
  23 */
  24
  25void __init baboon_init(void)
  26{
  27        if (macintosh_config->ident != MAC_MODEL_PB190) {
  28                baboon = NULL;
  29                baboon_present = 0;
  30                return;
  31        }
  32
  33        baboon = (struct baboon *) BABOON_BASE;
  34        baboon_present = 1;
  35
  36        pr_debug("Baboon detected at %p\n", baboon);
  37}
  38
  39/*
  40 * Baboon interrupt handler.
  41 * XXX how do you clear a pending IRQ? is it even necessary?
  42 */
  43
  44static void baboon_irq(struct irq_desc *desc)
  45{
  46        short events, irq_bit;
  47        int irq_num;
  48
  49        events = baboon->mb_ifr & 0x07;
  50        irq_num = IRQ_BABOON_0;
  51        irq_bit = 1;
  52        do {
  53                if (events & irq_bit) {
  54                        events &= ~irq_bit;
  55                        generic_handle_irq(irq_num);
  56                }
  57                ++irq_num;
  58                irq_bit <<= 1;
  59        } while (events);
  60}
  61
  62/*
  63 * Register the Baboon interrupt dispatcher on nubus slot $C.
  64 */
  65
  66void __init baboon_register_interrupts(void)
  67{
  68        irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq);
  69}
  70
  71/*
  72 * The means for masking individual Baboon interrupts remains a mystery.
  73 * However, since we only use the IDE IRQ, we can just enable/disable all
  74 * Baboon interrupts. If/when we handle more than one Baboon IRQ, we must
  75 * either figure out how to mask them individually or else implement the
  76 * same workaround that's used for NuBus slots (see nubus_disabled and
  77 * via_nubus_irq_shutdown).
  78 */
  79
  80void baboon_irq_enable(int irq)
  81{
  82        mac_irq_enable(irq_get_irq_data(IRQ_NUBUS_C));
  83}
  84
  85void baboon_irq_disable(int irq)
  86{
  87        mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C));
  88}
  89