Commit 22111fdf authored by Alexey Charkov's avatar Alexey Charkov Committed by Thomas Gleixner
Browse files

irqchip/irq-vt8500: Split up ack/mask functions



vt8500_irq_mask() really does the ACK for edge triggered interrupts and the
MASK for level triggered interrupts.  Edge triggered interrupts never
really are masked as a result, and there is unnecessary reading of the
status register before the ACK even though it's write-one-to-clear.

Split it up into a proper standalone vt8500_irq_ack() and an unconditional
vt8500_irq_mask().

No Fixes tag added, as it has survived this way for 15 years and nobody
complained, so apparently nothing really used edge triggered interrupts
anyway.

[ tglx: Tabularize the irqchip struct initializer ]

Signed-off-by: default avatarAlexey Charkov <alchark@gmail.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20250506-vt8500-intc-updates-v2-1-a3a0606cf92d@gmail.com
parent 76b66e8c
Loading
Loading
Loading
Loading
+20 −20
Original line number Diff line number Diff line
@@ -67,26 +67,26 @@ struct vt8500_irq_data {
static struct vt8500_irq_data intc[VT8500_INTC_MAX];
static u32 active_cnt = 0;

static void vt8500_irq_mask(struct irq_data *d)
static void vt8500_irq_ack(struct irq_data *d)
{
	struct vt8500_irq_data *priv = d->domain->host_data;
	void __iomem *base = priv->base;
	void __iomem *stat_reg = base + VT8500_ICIS + (d->hwirq < 32 ? 0 : 4);
	u8 edge, dctr;
	u32 status;

	edge = readb(base + VT8500_ICDC + d->hwirq) & VT8500_EDGE;
	if (edge) {
		status = readl(stat_reg);
	u32 status = (1 << (d->hwirq & 0x1f));

		status |= (1 << (d->hwirq & 0x1f));
	writel(status, stat_reg);
	} else {
}

static void vt8500_irq_mask(struct irq_data *d)
{
	struct vt8500_irq_data *priv = d->domain->host_data;
	void __iomem *base = priv->base;
	u8 dctr;

	dctr = readb(base + VT8500_ICDC + d->hwirq);
	dctr &= ~VT8500_INT_ENABLE;
	writeb(dctr, base + VT8500_ICDC + d->hwirq);
}
}

static void vt8500_irq_unmask(struct irq_data *d)
{
@@ -131,7 +131,7 @@ static int vt8500_irq_set_type(struct irq_data *d, unsigned int flow_type)

static struct irq_chip vt8500_irq_chip = {
	.name		= "vt8500",
	.irq_ack = vt8500_irq_mask,
	.irq_ack	= vt8500_irq_ack,
	.irq_mask	= vt8500_irq_mask,
	.irq_unmask	= vt8500_irq_unmask,
	.irq_set_type	= vt8500_irq_set_type,