cregit-Linux how code gets into the kernel

Release 4.14 arch/m68k/amiga/cia.c

Directory: arch/m68k/amiga
/*
 *  linux/arch/m68k/amiga/cia.c - CIA support
 *
 *  Copyright (C) 1996 Roman Zippel
 *
 *  The concept of some functions bases on the original Amiga OS function
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file COPYING in the main directory of this archive
 * for more details.
 */

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/errno.h>
#include <linux/kernel_stat.h>
#include <linux/init.h>
#include <linux/seq_file.h>
#include <linux/interrupt.h>
#include <linux/irq.h>

#include <asm/irq.h>
#include <asm/amigahw.h>
#include <asm/amigaints.h>


struct ciabase {
	
volatile struct CIA *cia;
	

unsigned char icr_mask, icr_data;
	
unsigned short int_mask;
	


int handler_irq, cia_irq, server_irq;
	
char *name;

} ciaa_base = {
	.cia		= &ciaa,
	.int_mask	= IF_PORTS,
	.handler_irq	= IRQ_AMIGA_PORTS,
	.cia_irq	= IRQ_AMIGA_CIAA,
	.name		= "CIAA"

}, ciab_base = {
	.cia		= &ciab,
	.int_mask	= IF_EXTER,
	.handler_irq	= IRQ_AMIGA_EXTER,
	.cia_irq	= IRQ_AMIGA_CIAB,
	.name		= "CIAB"
};

/*
 *  Cause or clear CIA interrupts, return old interrupt status.
 */


unsigned char cia_set_irq(struct ciabase *base, unsigned char mask) { unsigned char old; old = (base->icr_data |= base->cia->icr); if (mask & CIA_ICR_SETCLR) base->icr_data |= mask; else base->icr_data &= ~mask; if (base->icr_data & base->icr_mask) amiga_custom.intreq = IF_SETCLR | base->int_mask; return old & base->icr_mask; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)7796.25%133.33%
Linus Torvalds22.50%133.33%
Al Viro11.25%133.33%
Total80100.00%3100.00%

/* * Enable or disable CIA interrupts, return old interrupt mask, */
unsigned char cia_able_irq(struct ciabase *base, unsigned char mask) { unsigned char old; old = base->icr_mask; base->icr_data |= base->cia->icr; base->cia->icr = mask; if (mask & CIA_ICR_SETCLR) base->icr_mask |= mask; else base->icr_mask &= ~mask; base->icr_mask &= CIA_ICR_ALL; if (base->icr_data & base->icr_mask) amiga_custom.intreq = IF_SETCLR | base->int_mask; return old; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)8996.74%133.33%
Linus Torvalds22.17%133.33%
Al Viro11.09%133.33%
Total92100.00%3100.00%


static irqreturn_t cia_handler(int irq, void *dev_id) { struct ciabase *base = dev_id; int mach_irq; unsigned char ints; mach_irq = base->cia_irq; ints = cia_set_irq(base, CIA_ICR_ALL); amiga_custom.intreq = base->int_mask; for (; ints; mach_irq++, ints >>= 1) { if (ints & 1) generic_handle_irq(mach_irq); } return IRQ_HANDLED; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)6785.90%120.00%
Geert Uytterhoeven56.41%240.00%
Roman Zippel56.41%120.00%
Al Viro11.28%120.00%
Total78100.00%5100.00%


static void cia_irq_enable(struct irq_data *data) { unsigned int irq = data->irq; unsigned char mask; if (irq >= IRQ_AMIGA_CIAB) { mask = 1 << (irq - IRQ_AMIGA_CIAB); cia_set_irq(&ciab_base, mask); cia_able_irq(&ciab_base, CIA_ICR_SETCLR | mask); } else { mask = 1 << (irq - IRQ_AMIGA_CIAA); cia_set_irq(&ciaa_base, mask); cia_able_irq(&ciaa_base, CIA_ICR_SETCLR | mask); } }

Contributors

PersonTokensPropCommitsCommitProp
Roman Zippel5965.56%125.00%
Linus Torvalds (pre-git)1921.11%250.00%
Geert Uytterhoeven1213.33%125.00%
Total90100.00%4100.00%


static void cia_irq_disable(struct irq_data *data) { unsigned int irq = data->irq; if (irq >= IRQ_AMIGA_CIAB) cia_able_irq(&ciab_base, 1 << (irq - IRQ_AMIGA_CIAB)); else cia_able_irq(&ciaa_base, 1 << (irq - IRQ_AMIGA_CIAA)); }

Contributors

PersonTokensPropCommitsCommitProp
Roman Zippel3870.37%133.33%
Geert Uytterhoeven1222.22%133.33%
Linus Torvalds (pre-git)47.41%133.33%
Total54100.00%3100.00%

static struct irq_chip cia_irq_chip = { .name = "cia", .irq_enable = cia_irq_enable, .irq_disable = cia_irq_disable, }; /* * Override auto irq 2 & 6 and use them as general chain * for external interrupts, we link the CIA interrupt sources * into this chain. */
static void auto_irq_enable(struct irq_data *data) { switch (data->irq) { case IRQ_AUTO_2: amiga_custom.intena = IF_SETCLR | IF_PORTS; break; case IRQ_AUTO_6: amiga_custom.intena = IF_SETCLR | IF_EXTER; break; } }

Contributors

PersonTokensPropCommitsCommitProp
Roman Zippel2865.12%125.00%
Linus Torvalds (pre-git)716.28%125.00%
Geert Uytterhoeven716.28%125.00%
Al Viro12.33%125.00%
Total43100.00%4100.00%


static void auto_irq_disable(struct irq_data *data) { switch (data->irq) { case IRQ_AUTO_2: amiga_custom.intena = IF_PORTS; break; case IRQ_AUTO_6: amiga_custom.intena = IF_EXTER; break; } }

Contributors

PersonTokensPropCommitsCommitProp
Roman Zippel3282.05%150.00%
Geert Uytterhoeven717.95%150.00%
Total39100.00%2100.00%

static struct irq_chip auto_irq_chip = { .name = "auto", .irq_enable = auto_irq_enable, .irq_disable = auto_irq_disable, };
void __init cia_init_IRQ(struct ciabase *base) { m68k_setup_irq_controller(&cia_irq_chip, handle_simple_irq, base->cia_irq, CIA_IRQS); /* clear any pending interrupt and turn off all interrupts */ cia_set_irq(base, CIA_ICR_ALL); cia_able_irq(base, CIA_ICR_ALL); /* override auto int and install CIA handler */ m68k_setup_irq_controller(&auto_irq_chip, handle_simple_irq, base->handler_irq, 1); m68k_irq_startup_irq(base->handler_irq); if (request_irq(base->handler_irq, cia_handler, IRQF_SHARED, base->name, base)) pr_err("Couldn't register %s interrupt\n", base->name); }

Contributors

PersonTokensPropCommitsCommitProp
Roman Zippel4145.56%112.50%
Linus Torvalds (pre-git)2730.00%112.50%
Geert Uytterhoeven2022.22%450.00%
Thomas Gleixner11.11%112.50%
Andrew Morton11.11%112.50%
Total90100.00%8100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)37250.20%316.67%
Roman Zippel24132.52%15.56%
Geert Uytterhoeven10814.57%844.44%
Linus Torvalds111.48%211.11%
Thomas Gleixner40.54%211.11%
Al Viro40.54%15.56%
Andrew Morton10.13%15.56%
Total741100.00%18100.00%
Directory: arch/m68k/amiga
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.