Thread (33 messages) 33 messages, 6 authors, 2011-09-13

[PATCH 11/24] C6X: interrupt handling

From: Thomas Gleixner <hidden>
Date: 2011-09-09 14:33:51
Also in: lkml

On Wed, 31 Aug 2011, Mark Salter wrote:
+ *
+ *  Large parts taken directly from powerpc.
Is it really necessary to copy that stuff instead of generalizing it ?
I guess that's mostly about the reverse map & Co.
+
+static spinlock_t core_irq_lock;
  raw_spinlock_t please
+static void mask_core_irq(struct irq_data *data)
+{
+	unsigned int prio = data->irq;
+	unsigned long flags;
+
+	BUG_ON(prio < 4 || prio >= NR_PRIORITY_IRQS);
+
+	spin_lock_irqsave(&core_irq_lock, flags);
The chip functions are called with interrupts disabled, so
raw_spin_lock() is sufficient
+/*
+ * IRQ controller and virtual interrupts
+ */
How different is this from PPC ? Looks fairly familiar to me :)
+struct megamod_pic {
+	struct irq_host	*irqhost;
+	struct megamod_regs __iomem *regs;
+	spinlock_t lock;
  raw_spinlock_t please
+
+	/* hw mux mapping */
+	unsigned int output_to_irq[NR_MUX_OUTPUTS];
+};
+
+static struct megamod_pic *mm_pic;
+
+struct megamod_cascade_data {
+	struct megamod_pic *pic;
+	int index;
+};
+
+static struct megamod_cascade_data cascade_data[NR_COMBINERS];
+
+static void mask_megamod(struct irq_data *data)
+{
+	struct megamod_pic *pic = irq_data_get_irq_chip_data(data);
+	irq_hw_number_t src = irqd_to_hwirq(data);
+	unsigned long flags;
+	u32 __iomem *evtmask = &pic->regs->evtmask[src / 32];
+
+	spin_lock_irqsave(&pic->lock, flags);
  raw_spin_lock() is sufficient
+	soc_writel(soc_readl(evtmask) | (1 << (src & 31)), evtmask);
+	spin_unlock_irqrestore(&pic->lock, flags);
+}
+
+static void megamod_irq_cascade(unsigned int irq, struct irq_desc *desc)
+{
+	struct irq_chip *chip = irq_desc_get_chip(desc);
+	struct irq_data *idata = irq_desc_get_irq_data(desc);
+	struct megamod_cascade_data *cascade;
+	struct megamod_pic *pic;
+	u32 events;
+	int n, idx;
+
+	cascade = irq_desc_get_handler_data(desc);
+
+	pic = cascade->pic;
+
+	raw_spin_lock(&desc->lock);
+
+	chip->irq_mask(idata);
This runs with interrupts disabled, so why the lock, mask and the
inprogress fiddling? That interrupt cannot be reentered and it is not
controlled by disable_irq/enable_irq and better not subject to
free_irq, so why do you need this?

Thanks,

	tglx
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help