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

Commit d5eb4ad2 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

genirq: Implement irq_get/put_desc_[bus]locked/unlock()



Most of the managing functions get the irq descriptor and lock it -
either with or without buslock. Instead of open coding this over and
over provide a common function to do that.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 091738a2
Loading
Loading
Loading
Loading
+28 −0
Original line number Original line Diff line number Diff line
@@ -126,6 +126,34 @@ static inline void chip_bus_sync_unlock(struct irq_desc *desc)
		desc->irq_data.chip->irq_bus_sync_unlock(&desc->irq_data);
		desc->irq_data.chip->irq_bus_sync_unlock(&desc->irq_data);
}
}


struct irq_desc *
__irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus);
void __irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags, bool bus);

static inline struct irq_desc *
irq_get_desc_buslock(unsigned int irq, unsigned long *flags)
{
	return __irq_get_desc_lock(irq, flags, true);
}

static inline void
irq_put_desc_busunlock(struct irq_desc *desc, unsigned long flags)
{
	__irq_put_desc_unlock(desc, flags, true);
}

static inline struct irq_desc *
irq_get_desc_lock(unsigned int irq, unsigned long *flags)
{
	return __irq_get_desc_lock(irq, flags, false);
}

static inline void
irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags)
{
	__irq_put_desc_unlock(desc, flags, false);
}

/*
/*
 * Manipulation functions for irq_data.state
 * Manipulation functions for irq_data.state
 */
 */
+20 −0
Original line number Original line Diff line number Diff line
@@ -402,6 +402,26 @@ unsigned int irq_get_next_irq(unsigned int offset)
	return find_next_bit(allocated_irqs, nr_irqs, offset);
	return find_next_bit(allocated_irqs, nr_irqs, offset);
}
}


struct irq_desc *
__irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus)
{
	struct irq_desc *desc = irq_to_desc(irq);

	if (desc) {
		if (bus)
			chip_bus_lock(desc);
		raw_spin_lock_irqsave(&desc->lock, *flags);
	}
	return desc;
}

void __irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags, bool bus)
{
	raw_spin_unlock_irqrestore(&desc->lock, flags);
	if (bus)
		chip_bus_sync_unlock(desc);
}

/**
/**
 * dynamic_irq_cleanup - cleanup a dynamically allocated irq
 * dynamic_irq_cleanup - cleanup a dynamically allocated irq
 * @irq:	irq number to initialize
 * @irq:	irq number to initialize