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