1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * drivers/parisc/gsc.h 4*4882a593Smuzhiyun * Declarations for functions in gsc.c 5*4882a593Smuzhiyun * Copyright (c) 2000-2002 Helge Deller, Matthew Wilcox 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/interrupt.h> 9*4882a593Smuzhiyun #include <asm/hardware.h> 10*4882a593Smuzhiyun #include <asm/parisc-device.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define OFFSET_IRR 0x0000 /* Interrupt request register */ 13*4882a593Smuzhiyun #define OFFSET_IMR 0x0004 /* Interrupt mask register */ 14*4882a593Smuzhiyun #define OFFSET_IPR 0x0008 /* Interrupt pending register */ 15*4882a593Smuzhiyun #define OFFSET_ICR 0x000C /* Interrupt control register */ 16*4882a593Smuzhiyun #define OFFSET_IAR 0x0010 /* Interrupt address register */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* PA I/O Architected devices support at least 5 bits in the EIM register. */ 19*4882a593Smuzhiyun #define GSC_EIM_WIDTH 5 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct gsc_irq { 22*4882a593Smuzhiyun unsigned long txn_addr; /* IRQ "target" */ 23*4882a593Smuzhiyun int txn_data; /* HW "IRQ" */ 24*4882a593Smuzhiyun int irq; /* virtual IRQ */ 25*4882a593Smuzhiyun }; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun struct gsc_asic { 28*4882a593Smuzhiyun struct parisc_device *gsc; 29*4882a593Smuzhiyun unsigned long hpa; 30*4882a593Smuzhiyun char *name; 31*4882a593Smuzhiyun int version; 32*4882a593Smuzhiyun int type; 33*4882a593Smuzhiyun int eim; 34*4882a593Smuzhiyun struct gsc_irq gsc_irq; 35*4882a593Smuzhiyun int global_irq[32]; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic); 39*4882a593Smuzhiyun int gsc_alloc_irq(struct gsc_irq *dev); /* dev needs an irq */ 40*4882a593Smuzhiyun int gsc_claim_irq(struct gsc_irq *dev, int irq); /* dev needs this irq */ 41*4882a593Smuzhiyun int gsc_assign_irq(struct irq_chip *type, void *data); 42*4882a593Smuzhiyun int gsc_find_local_irq(unsigned int irq, int *global_irq, int limit); 43*4882a593Smuzhiyun void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl, 44*4882a593Smuzhiyun void (*choose)(struct parisc_device *child, void *ctrl)); 45*4882a593Smuzhiyun void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp); 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun irqreturn_t gsc_asic_intr(int irq, void *dev); 48