49 lines
1.2 KiB
C
49 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Aspeed AST2700 Interrupt Controller.
|
|
*
|
|
* Copyright (C) 2026 ASPEED Technology Inc.
|
|
*/
|
|
#ifndef DRIVERS_IRQCHIP_AST2700
|
|
#define DRIVERS_IRQCHIP_AST2700
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/irqdomain.h>
|
|
|
|
#define AST2700_INTC_INVALID_ROUTE (~0U)
|
|
#define ASPEED_INTC_RANGES_BASE 0U
|
|
#define ASPEED_INTC_RANGES_COUNT 1U
|
|
|
|
struct aspeed_intc_interrupt_range {
|
|
u32 start;
|
|
u32 count;
|
|
struct irq_fwspec upstream;
|
|
struct irq_domain *domain;
|
|
};
|
|
|
|
struct aspeed_intc_interrupt_ranges {
|
|
struct aspeed_intc_interrupt_range *ranges;
|
|
unsigned int nranges;
|
|
};
|
|
|
|
struct aspeed_intc0 {
|
|
struct device *dev;
|
|
void __iomem *base;
|
|
raw_spinlock_t intc_lock;
|
|
struct irq_domain *local;
|
|
struct device_node *parent;
|
|
struct aspeed_intc_interrupt_ranges ranges;
|
|
};
|
|
|
|
int aspeed_intc_populate_ranges(struct device *dev,
|
|
struct aspeed_intc_interrupt_ranges *ranges);
|
|
|
|
int aspeed_intc0_resolve_route(const struct irq_domain *c0domain,
|
|
size_t nc1outs,
|
|
const u32 *c1outs,
|
|
size_t nc1ranges,
|
|
const struct aspeed_intc_interrupt_range *c1ranges,
|
|
struct aspeed_intc_interrupt_range *resolved);
|
|
|
|
#endif
|