static void atari_shutdown_irq(unsigned int irq) { atari_disable_irq(irq); atari_turnoff_irq(irq); m68k_irq_shutdown(irq); if (irq == IRQ_AUTO_4) vectors[VEC_INT4] = falcon_hblhandler; }
static void atari_irq_shutdown(struct irq_data *data) { unsigned int irq = data->irq; atari_disable_irq(irq); atari_turnoff_irq(irq); m68k_irq_shutdown(data); if (irq == IRQ_AUTO_4) vectors[VEC_INT4] = falcon_hblhandler; }
int atari_scsi_bus_reset(Scsi_Cmnd *cmd) { int rv; struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)cmd->device->host->hostdata; /* For doing the reset, SCSI interrupts must be disabled first, * since the 5380 raises its IRQ line while _RST is active and we * can't disable interrupts completely, since we need the timer. */ /* And abort a maybe active DMA transfer */ if (IS_A_TT()) { atari_turnoff_irq( IRQ_TT_MFP_SCSI ); #ifdef REAL_DMA tt_scsi_dma.dma_ctrl = 0; #endif /* REAL_DMA */ } else { atari_turnoff_irq( IRQ_MFP_FSCSI ); #ifdef REAL_DMA st_dma.dma_mode_status = 0x90; atari_dma_active = 0; atari_dma_orig_addr = NULL; #endif /* REAL_DMA */ } rv = NCR5380_bus_reset(cmd); /* Re-enable ints */ if (IS_A_TT()) { atari_turnon_irq( IRQ_TT_MFP_SCSI ); } else { atari_turnon_irq( IRQ_MFP_FSCSI ); } if ((rv & SCSI_RESET_ACTION) == SCSI_RESET_SUCCESS) falcon_release_lock_if_possible(hostdata); return( rv ); }
static int __init atari_debug_setup(char *arg) { if (!MACH_IS_ATARI) return 0; if (!strcmp(arg, "ser")) /* defaults to ser2 for a Falcon and ser1 otherwise */ arg = MACH_IS_FALCON ? "ser2" : "ser1"; if (!strcmp(arg, "ser1")) { /* ST-MFP Modem1 serial port */ atari_init_mfp_port(B9600|CS8); atari_console_driver.write = atari_mfp_console_write; } else if (!strcmp(arg, "ser2")) { /* SCC Modem2 serial port */ atari_init_scc_port(B9600|CS8); atari_console_driver.write = atari_scc_console_write; } else if (!strcmp(arg, "midi")) { /* MIDI port */ atari_init_midi_port(B9600|CS8); atari_console_driver.write = atari_midi_console_write; } else if (!strcmp(arg, "par")) { /* parallel printer */ atari_turnoff_irq(IRQ_MFP_BUSY); /* avoid ints */ sound_ym.rd_data_reg_sel = 7; /* select mixer control */ sound_ym.wd_data = 0xff; /* sound off, ports are output */ sound_ym.rd_data_reg_sel = 15; /* select port B */ sound_ym.wd_data = 0; /* no char */ sound_ym.rd_data_reg_sel = 14; /* select port A */ sound_ym.wd_data = sound_ym.rd_data_reg_sel | 0x20; /* strobe H */ atari_console_driver.write = atari_par_console_write; } if (atari_console_driver.write) register_console(&atari_console_driver); return 0; }
__initfunc(int atari_keyb_init(void)) { /* setup key map */ memcpy(key_maps[0], ataplain_map, sizeof(plain_map)); memcpy(key_maps[1], atashift_map, sizeof(plain_map)); memcpy(key_maps[4], atactrl_map, sizeof(plain_map)); memcpy(key_maps[5], atashift_ctrl_map, sizeof(plain_map)); memcpy(key_maps[8], ataalt_map, sizeof(plain_map)); /* Atari doesn't have an altgr_map, so we can reuse its memory for atashift_alt_map */ memcpy(key_maps[2], atashift_alt_map, sizeof(plain_map)); key_maps[9] = key_maps[2]; key_maps[2] = 0; /* ataaltgr_map */ memcpy(key_maps[12], atactrl_alt_map, sizeof(plain_map)); key_maps[13] = atashift_ctrl_alt_map; keymap_count = 8; /* say that we don't have an AltGr key */ keyboard_type = KB_84; kb_state.state = KEYBOARD; kb_state.len = 0; request_irq(IRQ_MFP_ACIA, keyboard_interrupt, IRQ_TYPE_SLOW, "keyboard/mouse/MIDI", keyboard_interrupt); atari_turnoff_irq(IRQ_MFP_ACIA); do { /* reset IKBD ACIA */ acia.key_ctrl = ACIA_RESET | (atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : 0; (void)acia.key_ctrl; (void)acia.key_data; /* reset MIDI ACIA */ acia.mid_ctrl = ACIA_RESET | (atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0; (void)acia.mid_ctrl; (void)acia.mid_data; /* divide 500kHz by 64 gives 7812.5 baud */ /* 8 data no parity 1 start 1 stop bit */ /* receive interrupt enabled */ /* RTS low (except if switch selected), transmit interrupt disabled */ acia.key_ctrl = (ACIA_DIV64|ACIA_D8N1S|ACIA_RIE) | ((atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : ACIA_RLTID); acia.mid_ctrl = ACIA_DIV16 | ACIA_D8N1S | (atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0; } /* make sure the interrupt line is up */ while ((mfp.par_dt_reg & 0x10) == 0); /* enable ACIA Interrupts */ mfp.active_edge &= ~0x10; atari_turnon_irq(IRQ_MFP_ACIA); ikbd_self_test = 1; ikbd_reset(); /* wait for a period of inactivity (here: 0.25s), then assume the IKBD's * self-test is finished */ self_test_last_rcv = jiffies; while (time_before(jiffies, self_test_last_rcv + HZ/4)) barrier(); /* if not incremented: no 0xf1 received */ if (ikbd_self_test == 1) printk( KERN_ERR "WARNING: keyboard self test failed!\n" ); ikbd_self_test = 0; ikbd_mouse_disable(); ikbd_joystick_disable(); atari_joystick_init(); return 0; }
int atari_remove_isr(unsigned long source, isrfunc isr, void *data) { unsigned long flags; int vector; isr_node_t **p, *q; source &= ~IRQ_MACHSPEC; if (!IS_VALID_INTNO(source)) { printk("atari_remove_isr: Unknown irq %ld\n", source); return 0; } vector = IRQ_SOURCE_TO_VECTOR(source); if (vectors[vector] == bad_interrupt) goto not_found; save_flags(flags); cli(); if (irq_handler[source].isr != atari_call_isr_list) { /* It's the only handler for the interrupt */ if (irq_handler[source].isr != isr && irq_handler[source].data != data) { restore_flags(flags); goto not_found; } irq_handler[source].isr = NULL; irq_handler[source].data = NULL; irq_param[source].name = NULL; vectors[vector] = bad_interrupt; /* If MFP int, also disable it */ atari_disable_irq(source); atari_turnoff_irq(source); restore_flags(flags); return 1; } /* The interrupt is chained, find the isr on the list */ for( p = (isr_node_t **)&irq_handler[source].data; *p; p = &(*p)->next ) { if ((*p)->isr == isr) break; } if (!*p) { restore_flags(flags); goto not_found; } (*p)->isr = NULL; /* Mark it as free for reallocation */ *p = (*p)->next; /* If there's now only one handler, unchain the interrupt, i.e. plug in * the handler directly again and omit atari_call_isr_list */ q = (isr_node_t *)irq_handler[source].data; if (q && !q->next) { irq_handler[source].isr = q->isr; irq_handler[source].data = q->data; irq_param[source].name = q->name; q->isr = NULL; /* Mark it as free for reallocation */ } restore_flags(flags); return 1; not_found: printk("atari_remove_isr: isr %p not found on list!\n", isr); return 0; }
int atari_keyb_init(void) { int error; if (atari_keyb_done) return 0; kb_state.state = KEYBOARD; kb_state.len = 0; error = request_irq(IRQ_MFP_ACIA, atari_keyboard_interrupt, IRQ_TYPE_SLOW, "keyboard,mouse,MIDI", atari_keyboard_interrupt); if (error) return error; atari_turnoff_irq(IRQ_MFP_ACIA); do { /* reset IKBD ACIA */ acia.key_ctrl = ACIA_RESET | ((atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : 0); (void)acia.key_ctrl; (void)acia.key_data; /* reset MIDI ACIA */ acia.mid_ctrl = ACIA_RESET | ((atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0); (void)acia.mid_ctrl; (void)acia.mid_data; /* divide 500kHz by 64 gives 7812.5 baud */ /* 8 data no parity 1 start 1 stop bit */ /* receive interrupt enabled */ /* RTS low (except if switch selected), transmit interrupt disabled */ acia.key_ctrl = (ACIA_DIV64|ACIA_D8N1S|ACIA_RIE) | ((atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : ACIA_RLTID); acia.mid_ctrl = ACIA_DIV16 | ACIA_D8N1S | ((atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0); /* make sure the interrupt line is up */ } while ((st_mfp.par_dt_reg & 0x10) == 0); /* enable ACIA Interrupts */ st_mfp.active_edge &= ~0x10; atari_turnon_irq(IRQ_MFP_ACIA); ikbd_self_test = 1; ikbd_reset(); /* wait for a period of inactivity (here: 0.25s), then assume the IKBD's * self-test is finished */ self_test_last_rcv = jiffies; while (time_before(jiffies, self_test_last_rcv + HZ/4)) barrier(); /* if not incremented: no 0xf1 received */ if (ikbd_self_test == 1) printk(KERN_ERR "WARNING: keyboard self test failed!\n"); ikbd_self_test = 0; ikbd_mouse_disable(); ikbd_joystick_disable(); #ifdef FIXED_ATARI_JOYSTICK atari_joystick_init(); #endif // flag init done atari_keyb_done = 1; return 0; }
void atari_free_irq(unsigned int irq, void *dev_id) { unsigned long flags; int vector; irq_node_t **list, *node; if (!IS_VALID_INTNO(irq)) { printk("%s: Unknown irq %d\n", __FUNCTION__, irq); return; } vector = IRQ_SOURCE_TO_VECTOR(irq); if (vectors[vector] == bad_interrupt) goto not_found; save_flags(flags); cli(); if (irq_handler[irq].handler != atari_call_irq_list) { /* It's the only handler for the interrupt */ if (irq_handler[irq].dev_id != dev_id) { restore_flags(flags); goto not_found; } irq_handler[irq].handler = NULL; irq_handler[irq].dev_id = NULL; irq_param[irq].devname = NULL; vectors[vector] = bad_interrupt; /* If MFP int, also disable it */ atari_disable_irq(irq); atari_turnoff_irq(irq); restore_flags(flags); return; } /* The interrupt is chained, find the irq on the list */ for(list = (irq_node_t **)&irq_handler[irq].dev_id; *list; list = &(*list)->next) { if ((*list)->dev_id == dev_id) break; } if (!*list) { restore_flags(flags); goto not_found; } (*list)->handler = NULL; /* Mark it as free for reallocation */ *list = (*list)->next; /* If there's now only one handler, unchain the interrupt, i.e. plug in * the handler directly again and omit atari_call_irq_list */ node = (irq_node_t *)irq_handler[irq].dev_id; if (node && !node->next) { irq_handler[irq].handler = node->handler; irq_handler[irq].dev_id = node->dev_id; irq_param[irq].devname = node->devname; node->handler = NULL; /* Mark it as free for reallocation */ } restore_flags(flags); return; not_found: printk("%s: tried to remove invalid irq\n", __FUNCTION__); return; }
int atari_keyb_init(void) { int error; if (atari_keyb_done) return 0; kb_state.state = KEYBOARD; kb_state.len = 0; error = request_irq(IRQ_MFP_ACIA, atari_keyboard_interrupt, IRQ_TYPE_SLOW, "keyboard,mouse,MIDI", atari_keyboard_interrupt); if (error) return error; atari_turnoff_irq(IRQ_MFP_ACIA); do { acia.key_ctrl = ACIA_RESET | ((atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : 0); (void)acia.key_ctrl; (void)acia.key_data; acia.mid_ctrl = ACIA_RESET | ((atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0); (void)acia.mid_ctrl; (void)acia.mid_data; acia.key_ctrl = (ACIA_DIV64|ACIA_D8N1S|ACIA_RIE) | ((atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : ACIA_RLTID); acia.mid_ctrl = ACIA_DIV16 | ACIA_D8N1S | ((atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0); } while ((st_mfp.par_dt_reg & 0x10) == 0); st_mfp.active_edge &= ~0x10; atari_turnon_irq(IRQ_MFP_ACIA); ikbd_self_test = 1; ikbd_reset(); self_test_last_rcv = jiffies; while (time_before(jiffies, self_test_last_rcv + HZ/4)) barrier(); if (ikbd_self_test == 1) printk(KERN_ERR "WARNING: keyboard self test failed!\n"); ikbd_self_test = 0; ikbd_mouse_disable(); ikbd_joystick_disable(); #ifdef FIXED_ATARI_JOYSTICK atari_joystick_init(); #endif atari_keyb_done = 1; return 0; }