xref: /openbmc/linux/arch/m68k/mac/baboon.c (revision c13aca79ff3c4af5fd31a5b2743a90eba6e36a26)
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 Torvalds void __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 Gleixner static 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 Bunk void __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 Thain void 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 Thain void baboon_irq_disable(int irq)
86746e8d3bSFinn Thain {
872690e214SFinn Thain 	mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C));
881da177e4SLinus Torvalds }
89