]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
1da177e4 LT |
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> | |
ddc7fd25 | 12 | #include <linux/irq.h> |
1da177e4 | 13 | |
1da177e4 LT |
14 | #include <asm/macintosh.h> |
15 | #include <asm/macints.h> | |
16 | #include <asm/mac_baboon.h> | |
17 | ||
217f6710 | 18 | int baboon_present; |
8dfbdf4a | 19 | static volatile struct baboon *baboon; |
1da177e4 LT |
20 | |
21 | #if 0 | |
22 | extern int macide_ack_intr(struct ata_channel *); | |
23 | #endif | |
24 | ||
25 | /* | |
26 | * Baboon initialization. | |
27 | */ | |
28 | ||
29 | void __init baboon_init(void) | |
30 | { | |
31 | if (macintosh_config->ident != MAC_MODEL_PB190) { | |
32 | baboon = NULL; | |
33 | baboon_present = 0; | |
34 | return; | |
35 | } | |
36 | ||
37 | baboon = (struct baboon *) BABOON_BASE; | |
38 | baboon_present = 1; | |
1da177e4 LT |
39 | |
40 | printk("Baboon detected at %p\n", baboon); | |
41 | } | |
42 | ||
1da177e4 LT |
43 | /* |
44 | * Baboon interrupt handler. This works a lot like a VIA. | |
45 | */ | |
46 | ||
bd0b9ac4 | 47 | static void baboon_irq(struct irq_desc *desc) |
9145db56 GU |
48 | { |
49 | int irq_bit, irq_num; | |
50 | unsigned char events; | |
51 | ||
9145db56 GU |
52 | events = baboon->mb_ifr & 0x07; |
53 | if (!events) | |
54 | return; | |
55 | ||
56 | irq_num = IRQ_BABOON_0; | |
57 | irq_bit = 1; | |
58 | do { | |
59 | if (events & irq_bit) { | |
60 | baboon->mb_ifr &= ~irq_bit; | |
61 | generic_handle_irq(irq_num); | |
62 | } | |
63 | irq_bit <<= 1; | |
64 | irq_num++; | |
65 | } while(events >= irq_bit); | |
66 | #if 0 | |
67 | if (baboon->mb_ifr & 0x02) macide_ack_intr(NULL); | |
68 | /* for now we need to smash all interrupts */ | |
69 | baboon->mb_ifr &= ~events; | |
70 | #endif | |
71 | } | |
1da177e4 | 72 | |
8dfbdf4a AB |
73 | /* |
74 | * Register the Baboon interrupt dispatcher on nubus slot $C. | |
75 | */ | |
76 | ||
77 | void __init baboon_register_interrupts(void) | |
78 | { | |
9145db56 | 79 | irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq); |
8dfbdf4a AB |
80 | } |
81 | ||
746e8d3b | 82 | /* |
feb11e8a FT |
83 | * The means for masking individual Baboon interrupts remains a mystery. |
84 | * However, since we only use the IDE IRQ, we can just enable/disable all | |
85 | * Baboon interrupts. If/when we handle more than one Baboon IRQ, we must | |
86 | * either figure out how to mask them individually or else implement the | |
87 | * same workaround that's used for NuBus slots (see nubus_disabled and | |
88 | * via_nubus_irq_shutdown). | |
746e8d3b FT |
89 | */ |
90 | ||
91 | void baboon_irq_enable(int irq) | |
92 | { | |
feb11e8a | 93 | mac_irq_enable(irq_get_irq_data(IRQ_NUBUS_C)); |
1da177e4 LT |
94 | } |
95 | ||
746e8d3b FT |
96 | void baboon_irq_disable(int irq) |
97 | { | |
feb11e8a | 98 | mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C)); |
1da177e4 | 99 | } |