162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * drivers/parisc/gsc.h
462306a36Sopenharmony_ci * Declarations for functions in gsc.c
562306a36Sopenharmony_ci * Copyright (c) 2000-2002 Helge Deller, Matthew Wilcox
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/interrupt.h>
962306a36Sopenharmony_ci#include <asm/hardware.h>
1062306a36Sopenharmony_ci#include <asm/parisc-device.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define OFFSET_IRR 0x0000   /* Interrupt request register */
1362306a36Sopenharmony_ci#define OFFSET_IMR 0x0004   /* Interrupt mask register */
1462306a36Sopenharmony_ci#define OFFSET_IPR 0x0008   /* Interrupt pending register */
1562306a36Sopenharmony_ci#define OFFSET_ICR 0x000C   /* Interrupt control register */
1662306a36Sopenharmony_ci#define OFFSET_IAR 0x0010   /* Interrupt address register */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* PA I/O Architected devices support at least 5 bits in the EIM register. */
1962306a36Sopenharmony_ci#define GSC_EIM_WIDTH 5
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistruct gsc_irq {
2262306a36Sopenharmony_ci	unsigned long txn_addr;	/* IRQ "target" */
2362306a36Sopenharmony_ci	int txn_data;		/* HW "IRQ" */
2462306a36Sopenharmony_ci	int irq;		/* virtual IRQ */
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct gsc_asic {
2862306a36Sopenharmony_ci	struct parisc_device *gsc;
2962306a36Sopenharmony_ci	unsigned long hpa;
3062306a36Sopenharmony_ci	char *name;
3162306a36Sopenharmony_ci	int version;
3262306a36Sopenharmony_ci	int type;
3362306a36Sopenharmony_ci	int eim;
3462306a36Sopenharmony_ci	struct gsc_irq gsc_irq;
3562306a36Sopenharmony_ci	int global_irq[32];
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciint gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic);
3962306a36Sopenharmony_ciint gsc_alloc_irq(struct gsc_irq *dev);			/* dev needs an irq */
4062306a36Sopenharmony_ciint gsc_claim_irq(struct gsc_irq *dev, int irq);	/* dev needs this irq */
4162306a36Sopenharmony_ciint gsc_assign_irq(struct irq_chip *type, void *data);
4262306a36Sopenharmony_ciint gsc_find_local_irq(unsigned int irq, int *global_irq, int limit);
4362306a36Sopenharmony_civoid gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
4462306a36Sopenharmony_ci		void (*choose)(struct parisc_device *child, void *ctrl));
4562306a36Sopenharmony_civoid gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ciirqreturn_t gsc_asic_intr(int irq, void *dev);
48