1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Baboon Custom IC Management 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * The Baboon custom IC controls the IDE, PCMCIA and media bay on the 61da177e4SLinus Torvalds * PowerBook 190. It multiplexes multiple interrupt sources onto the 71da177e4SLinus Torvalds * Nubus slot $C interrupt. 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include <linux/types.h> 111da177e4SLinus Torvalds #include <linux/kernel.h> 12ddc7fd25SGeert Uytterhoeven #include <linux/irq.h> 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds #include <asm/macintosh.h> 151da177e4SLinus Torvalds #include <asm/macints.h> 161da177e4SLinus Torvalds #include <asm/mac_baboon.h> 171da177e4SLinus Torvalds 18217f6710SFinn Thain int baboon_present; 198dfbdf4aSAdrian Bunk static volatile struct baboon *baboon; 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds /* 221da177e4SLinus Torvalds * Baboon initialization. 231da177e4SLinus Torvalds */ 241da177e4SLinus Torvalds baboon_init(void)251da177e4SLinus Torvaldsvoid __init baboon_init(void) 261da177e4SLinus Torvalds { 271da177e4SLinus Torvalds if (macintosh_config->ident != MAC_MODEL_PB190) { 281da177e4SLinus Torvalds baboon = NULL; 291da177e4SLinus Torvalds baboon_present = 0; 301da177e4SLinus Torvalds return; 311da177e4SLinus Torvalds } 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds baboon = (struct baboon *) BABOON_BASE; 341da177e4SLinus Torvalds baboon_present = 1; 351da177e4SLinus Torvalds 360e37a23eSFinn Thain pr_debug("Baboon detected at %p\n", baboon); 371da177e4SLinus Torvalds } 381da177e4SLinus Torvalds 391da177e4SLinus Torvalds /* 40*a1eb1cdfSFinn Thain * Baboon interrupt handler. 41*a1eb1cdfSFinn Thain * XXX how do you clear a pending IRQ? is it even necessary? 421da177e4SLinus Torvalds */ 431da177e4SLinus Torvalds baboon_irq(struct irq_desc * desc)44bd0b9ac4SThomas Gleixnerstatic void baboon_irq(struct irq_desc *desc) 459145db56SGeert Uytterhoeven { 46*a1eb1cdfSFinn Thain short events, irq_bit; 47*a1eb1cdfSFinn Thain int irq_num; 489145db56SGeert Uytterhoeven 499145db56SGeert Uytterhoeven events = baboon->mb_ifr & 0x07; 509145db56SGeert Uytterhoeven irq_num = IRQ_BABOON_0; 519145db56SGeert Uytterhoeven irq_bit = 1; 529145db56SGeert Uytterhoeven do { 539145db56SGeert Uytterhoeven if (events & irq_bit) { 54*a1eb1cdfSFinn Thain events &= ~irq_bit; 559145db56SGeert Uytterhoeven generic_handle_irq(irq_num); 569145db56SGeert Uytterhoeven } 57*a1eb1cdfSFinn Thain ++irq_num; 589145db56SGeert Uytterhoeven irq_bit <<= 1; 59*a1eb1cdfSFinn Thain } while (events); 609145db56SGeert Uytterhoeven } 611da177e4SLinus Torvalds 628dfbdf4aSAdrian Bunk /* 638dfbdf4aSAdrian Bunk * Register the Baboon interrupt dispatcher on nubus slot $C. 648dfbdf4aSAdrian Bunk */ 658dfbdf4aSAdrian Bunk baboon_register_interrupts(void)668dfbdf4aSAdrian Bunkvoid __init baboon_register_interrupts(void) 678dfbdf4aSAdrian Bunk { 689145db56SGeert Uytterhoeven irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq); 698dfbdf4aSAdrian Bunk } 708dfbdf4aSAdrian Bunk 71746e8d3bSFinn Thain /* 72feb11e8aSFinn Thain * The means for masking individual Baboon interrupts remains a mystery. 73feb11e8aSFinn Thain * However, since we only use the IDE IRQ, we can just enable/disable all 74feb11e8aSFinn Thain * Baboon interrupts. If/when we handle more than one Baboon IRQ, we must 75feb11e8aSFinn Thain * either figure out how to mask them individually or else implement the 76feb11e8aSFinn Thain * same workaround that's used for NuBus slots (see nubus_disabled and 77feb11e8aSFinn Thain * via_nubus_irq_shutdown). 78746e8d3bSFinn Thain */ 79746e8d3bSFinn Thain baboon_irq_enable(int irq)80746e8d3bSFinn Thainvoid baboon_irq_enable(int irq) 81746e8d3bSFinn Thain { 822690e214SFinn Thain mac_irq_enable(irq_get_irq_data(IRQ_NUBUS_C)); 831da177e4SLinus Torvalds } 841da177e4SLinus Torvalds baboon_irq_disable(int irq)85746e8d3bSFinn Thainvoid baboon_irq_disable(int irq) 86746e8d3bSFinn Thain { 872690e214SFinn Thain mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C)); 881da177e4SLinus Torvalds } 89