19static u32 _get_reg(u32 *reg)
29 __asm__
volatile(
"nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
38static void _set_reg(u32 *reg, u32 val)
45u32 SBUS_get_reg(
int reg_no) {
return (_get_reg((u32 *)R_LOCAL_SBUS(reg_no))); }
48void SBUS_set_reg(
int reg_no, u32 val) { _set_reg((u32 *)R_LOCAL_SBUS(reg_no), val); }
51int __local_sbus_irq_handler(
void)
56 flag = SBUS_get_reg(PS2_SBUS_RL_FLAG);
59 for (irq = 31; ((flag != 0) && (irq >= 0)); irq--) {
60 if (flag & (1 << irq)) {
61 if (_sbus_irq_handlers[irq].func) {
62 _sbus_irq_handlers[irq].func(irq, _sbus_irq_handlers[irq].param);
65 SBUS_set_reg(PS2_SBUS_RL_FLAG, (1 << irq));
75void *SBUS_set_irq_handler(
int irq, SBUS_IrqHandlerFunc func,
void *param)
82 rv = _sbus_irq_handlers[irq].func;
83 _sbus_irq_handlers[irq].func = func;
84 _sbus_irq_handlers[irq].param = param;
93int SBUS_rem_irq_handler(
int irq)
99 _sbus_irq_handlers[irq].func = NULL;
100 _sbus_irq_handlers[irq].param = NULL;
108static int __sbus_init = 0;
120 M_SuspendIntr(&old_intr_state);
122 M_DisableIrq(PS2_IRQ_SBUS, &old_irq_state);
124 M_ReleaseIrqHandler(PS2_IRQ_SBUS);
126 for (i = 0; i < 32; i++) {
127 _sbus_irq_handlers[i].func = NULL;
128 _sbus_irq_handlers[i].param = NULL;
131 M_RegisterIrqHandler(PS2_IRQ_SBUS, (
void *)__local_sbus_irq_handler, NULL);
133 M_EnableIrq(PS2_IRQ_SBUS);
135 M_ResumeIntr(old_intr_state);
151 M_SuspendIntr(&old_intr_state);
153 M_DisableIrq(PS2_IRQ_SBUS, &old_irq_state);
154 M_ReleaseIrqHandler(PS2_IRQ_SBUS);
156 M_ResumeIntr(old_intr_state);