arch/m68k/atari/ataints.c

Source file repositories/reference/linux-study-clean/arch/m68k/atari/ataints.c

File Facts

System
Linux kernel
Corpus path
arch/m68k/atari/ataints.c
Extension
.c
Size
10047 bytes
Lines
387
Domain
Architecture Layer
Bucket
arch/m68k
Inferred role
Architecture Layer: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

struct mfptimerbase {
	volatile struct MFP *mfp;
	unsigned char mfp_mask, mfp_data;
	unsigned short int_mask;
	int handler_irq, mfptimer_irq, server_irq;
	char *name;
} stmfp_base = {
	.mfp		= &st_mfp,
	.int_mask	= 0x0,
	.handler_irq	= IRQ_MFP_TIMD,
	.mfptimer_irq	= IRQ_MFP_TIMER1,
	.name		= "MFP Timer D"
};

static irqreturn_t mfp_timer_d_handler(int irq, void *dev_id)
{
	struct mfptimerbase *base = dev_id;
	int mach_irq;
	unsigned char ints;

	mach_irq = base->mfptimer_irq;
	ints = base->int_mask;
	for (; ints; mach_irq++, ints >>= 1) {
		if (ints & 1)
			generic_handle_irq(mach_irq);
	}
	return IRQ_HANDLED;
}


static void atari_mfptimer_enable(struct irq_data *data)
{
	int mfp_num = data->irq - IRQ_MFP_TIMER1;
	stmfp_base.int_mask |= 1 << mfp_num;
	atari_enable_irq(IRQ_MFP_TIMD);
}

static void atari_mfptimer_disable(struct irq_data *data)
{
	int mfp_num = data->irq - IRQ_MFP_TIMER1;
	stmfp_base.int_mask &= ~(1 << mfp_num);
	if (!stmfp_base.int_mask)
		atari_disable_irq(IRQ_MFP_TIMD);
}

static struct irq_chip atari_mfptimer_chip = {
	.name		= "timer_d",
	.irq_enable	= atari_mfptimer_enable,
	.irq_disable	= atari_mfptimer_disable,
};


/*
 * EtherNAT CPLD interrupt handling
 * CPLD interrupt register is at phys. 0x80000023
 * Need this mapped in at interrupt startup time
 * Possibly need this mapped on demand anyway -
 * EtherNAT USB driver needs to disable IRQ before
 * startup!
 */

static unsigned char *enat_cpld;

static unsigned int atari_ethernat_startup(struct irq_data *data)
{
	int enat_num = 140 - data->irq + 1;

	m68k_irq_startup(data);
	/*
	* map CPLD interrupt register
	*/
	if (!enat_cpld)
		enat_cpld = (unsigned char *)ioremap((ATARI_ETHERNAT_PHYS_ADDR+0x23), 0x2);
	/*
	 * do _not_ enable the USB chip interrupt here - causes interrupt storm
	 * and triggers dead interrupt watchdog
	 * Need to reset the USB chip to a sane state in early startup before
	 * removing this hack
	 */
	if (enat_num == 1)
		*enat_cpld |= 1 << enat_num;

	return 0;
}

static void atari_ethernat_enable(struct irq_data *data)
{
	int enat_num = 140 - data->irq + 1;
	/*
	* map CPLD interrupt register

Annotation

Implementation Notes