Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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 );
}
Пример #4
0
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;
}
Пример #5
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;
}
Пример #6
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;
}
Пример #7
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;
}
Пример #8
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;
}
Пример #9
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 {
		
		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;
}