Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0325f25a authored by Sonic Zhang's avatar Sonic Zhang Committed by Mike Frysinger
Browse files

Blackfin: SMP: add support for IRQ affinity



Now that the Blackfin IRQ controller supports this, drivers get the normal
functionality of controlling which CPU to bind IRQs to.

Signed-off-by: default avatarSonic Zhang <sonic.zhang@analog.com>
Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
parent 69e1d8a6
Loading
Loading
Loading
Loading
+34 −4
Original line number Original line Diff line number Diff line
@@ -173,7 +173,12 @@ static void bfin_internal_mask_irq(unsigned int irq)
	local_irq_restore_hw(flags);
	local_irq_restore_hw(flags);
}
}


#ifdef CONFIG_SMP
static void bfin_internal_unmask_irq_affinity(unsigned int irq,
		const struct cpumask *affinity)
#else
static void bfin_internal_unmask_irq(unsigned int irq)
static void bfin_internal_unmask_irq(unsigned int irq)
#endif
{
{
	unsigned long flags;
	unsigned long flags;


@@ -186,16 +191,38 @@ static void bfin_internal_unmask_irq(unsigned int irq)
	local_irq_save_hw(flags);
	local_irq_save_hw(flags);
	mask_bank = SIC_SYSIRQ(irq) / 32;
	mask_bank = SIC_SYSIRQ(irq) / 32;
	mask_bit = SIC_SYSIRQ(irq) % 32;
	mask_bit = SIC_SYSIRQ(irq) % 32;
	bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) |
#ifdef CONFIG_SMP
	if (cpumask_test_cpu(0, affinity))
#endif
		bfin_write_SIC_IMASK(mask_bank,
			bfin_read_SIC_IMASK(mask_bank) |
			(1 << mask_bit));
			(1 << mask_bit));
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
	bfin_write_SICB_IMASK(mask_bank, bfin_read_SICB_IMASK(mask_bank) |
	if (cpumask_test_cpu(1, affinity))
		bfin_write_SICB_IMASK(mask_bank,
			bfin_read_SICB_IMASK(mask_bank) |
			(1 << mask_bit));
			(1 << mask_bit));
#endif
#endif
#endif
#endif
	local_irq_restore_hw(flags);
	local_irq_restore_hw(flags);
}
}


#ifdef CONFIG_SMP
static void bfin_internal_unmask_irq(unsigned int irq)
{
	struct irq_desc *desc = irq_to_desc(irq);
	bfin_internal_unmask_irq_affinity(irq, desc->affinity);
}

static int bfin_internal_set_affinity(unsigned int irq, const struct cpumask *mask)
{
	bfin_internal_mask_irq(irq);
	bfin_internal_unmask_irq_affinity(irq, mask);

	return 0;
}
#endif

#ifdef CONFIG_PM
#ifdef CONFIG_PM
int bfin_internal_set_wake(unsigned int irq, unsigned int state)
int bfin_internal_set_wake(unsigned int irq, unsigned int state)
{
{
@@ -271,6 +298,9 @@ static struct irq_chip bfin_internal_irqchip = {
	.mask_ack = bfin_internal_mask_irq,
	.mask_ack = bfin_internal_mask_irq,
	.disable = bfin_internal_mask_irq,
	.disable = bfin_internal_mask_irq,
	.enable = bfin_internal_unmask_irq,
	.enable = bfin_internal_unmask_irq,
#ifdef CONFIG_SMP
	.set_affinity = bfin_internal_set_affinity,
#endif
#ifdef CONFIG_PM
#ifdef CONFIG_PM
	.set_wake = bfin_internal_set_wake,
	.set_wake = bfin_internal_set_wake,
#endif
#endif