Rev 3343 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3343 | Rev 3665 | ||
|---|---|---|---|
| Line 41... | Line 41... | ||
| 41 | #include <arch/drivers/z8530.h> |
41 | #include <arch/drivers/z8530.h> |
| 42 | #include <ddi/irq.h> |
42 | #include <ddi/irq.h> |
| 43 | #include <ipc/irq.h> |
43 | #include <ipc/irq.h> |
| 44 | #include <arch/interrupt.h> |
44 | #include <arch/interrupt.h> |
| 45 | #include <arch/drivers/kbd.h> |
45 | #include <arch/drivers/kbd.h> |
| 46 | #include <arch/drivers/fhc.h> |
- | |
| 47 | #include <cpu.h> |
46 | #include <cpu.h> |
| 48 | #include <arch/asm.h> |
47 | #include <arch/asm.h> |
| 49 | #include <arch.h> |
48 | #include <arch.h> |
| 50 | #include <console/chardev.h> |
49 | #include <console/chardev.h> |
| 51 | #include <console/console.h> |
50 | #include <console/console.h> |
| Line 81... | Line 80... | ||
| 81 | * Clear any pending TX interrupts or we never manage |
80 | * Clear any pending TX interrupts or we never manage |
| 82 | * to set FHC UART interrupt state to idle. |
81 | * to set FHC UART interrupt state to idle. |
| 83 | */ |
82 | */ |
| 84 | z8530_write_a(&z8530, WR0, WR0_TX_IP_RST); |
83 | z8530_write_a(&z8530, WR0, WR0_TX_IP_RST); |
| 85 | 84 | ||
| - | 85 | /* interrupt on all characters */ |
|
| 86 | z8530_write_a(&z8530, WR1, WR1_IARCSC); /* interrupt on all characters */ |
86 | z8530_write_a(&z8530, WR1, WR1_IARCSC); |
| 87 | 87 | ||
| 88 | /* 8 bits per character and enable receiver */ |
88 | /* 8 bits per character and enable receiver */ |
| 89 | z8530_write_a(&z8530, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE); |
89 | z8530_write_a(&z8530, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE); |
| 90 | 90 | ||
| - | 91 | /* Master Interrupt Enable. */ |
|
| 91 | z8530_write_a(&z8530, WR9, WR9_MIE); /* Master Interrupt Enable. */ |
92 | z8530_write_a(&z8530, WR9, WR9_MIE); |
| 92 | 93 | ||
| 93 | spinlock_lock(&z8530_irq.lock); |
94 | spinlock_lock(&z8530_irq.lock); |
| 94 | z8530_irq.notif_cfg.notify = false; |
95 | z8530_irq.notif_cfg.notify = false; |
| 95 | spinlock_unlock(&z8530_irq.lock); |
96 | spinlock_unlock(&z8530_irq.lock); |
| 96 | interrupts_restore(ipl); |
97 | interrupts_restore(ipl); |
| Line 106... | Line 107... | ||
| 106 | spinlock_unlock(&z8530_irq.lock); |
107 | spinlock_unlock(&z8530_irq.lock); |
| 107 | interrupts_restore(ipl); |
108 | interrupts_restore(ipl); |
| 108 | } |
109 | } |
| 109 | 110 | ||
| 110 | /** Initialize z8530. */ |
111 | /** Initialize z8530. */ |
| - | 112 | void |
|
| 111 | void z8530_init(devno_t devno, inr_t inr, uintptr_t vaddr) |
113 | z8530_init(devno_t devno, uintptr_t vaddr, inr_t inr, cir_t cir, void *cir_arg) |
| 112 | { |
114 | { |
| 113 | chardev_initialize("z8530_kbd", &kbrd, &ops); |
115 | chardev_initialize("z8530_kbd", &kbrd, &ops); |
| 114 | stdin = &kbrd; |
116 | stdin = &kbrd; |
| 115 | 117 | ||
| 116 | z8530.devno = devno; |
118 | z8530.devno = devno; |
| Line 119... | Line 121... | ||
| 119 | irq_initialize(&z8530_irq); |
121 | irq_initialize(&z8530_irq); |
| 120 | z8530_irq.devno = devno; |
122 | z8530_irq.devno = devno; |
| 121 | z8530_irq.inr = inr; |
123 | z8530_irq.inr = inr; |
| 122 | z8530_irq.claim = z8530_claim; |
124 | z8530_irq.claim = z8530_claim; |
| 123 | z8530_irq.handler = z8530_irq_handler; |
125 | z8530_irq.handler = z8530_irq_handler; |
| - | 126 | z8530_irq.cir = cir; |
|
| - | 127 | z8530_irq.cir_arg = cir_arg; |
|
| 124 | irq_register(&z8530_irq); |
128 | irq_register(&z8530_irq); |
| 125 | 129 | ||
| 126 | sysinfo_set_item_val("kbd", NULL, true); |
130 | sysinfo_set_item_val("kbd", NULL, true); |
| 127 | sysinfo_set_item_val("kbd.type", NULL, KBD_Z8530); |
131 | sysinfo_set_item_val("kbd.type", NULL, KBD_Z8530); |
| 128 | sysinfo_set_item_val("kbd.devno", NULL, devno); |
132 | sysinfo_set_item_val("kbd.devno", NULL, devno); |
| Line 195... | Line 199... | ||
| 195 | return (z8530_read_a(&z8530, RR0) & RR0_RCA); |
199 | return (z8530_read_a(&z8530, RR0) & RR0_RCA); |
| 196 | } |
200 | } |
| 197 | 201 | ||
| 198 | void z8530_irq_handler(irq_t *irq, void *arg, ...) |
202 | void z8530_irq_handler(irq_t *irq, void *arg, ...) |
| 199 | { |
203 | { |
| 200 | /* |
- | |
| 201 | * So far, we know we got this interrupt through the FHC. |
- | |
| 202 | * Since we don't have enough documentation about the FHC |
- | |
| 203 | * and because the interrupt looks like level sensitive, |
- | |
| 204 | * we cannot handle it by scheduling one of the level |
- | |
| 205 | * interrupt traps. Process the interrupt directly. |
- | |
| 206 | */ |
- | |
| 207 | if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
204 | if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
| 208 | ipc_irq_send_notif(irq); |
205 | ipc_irq_send_notif(irq); |
| 209 | else |
206 | else |
| 210 | z8530_interrupt(); |
207 | z8530_interrupt(); |
| 211 | fhc_clear_interrupt(central_fhc, irq->inr); |
- | |
| 212 | } |
208 | } |
| 213 | 209 | ||
| 214 | /** @} |
210 | /** @} |
| 215 | */ |
211 | */ |