* IN THE SOFTWARE.
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
int bind_evtchn_to_irqhandler(
unsigned int evtchn,
- irqreturn_t (*handler)(int, void *, struct pt_regs *),
+ irq_handler_t handler,
unsigned long irqflags,
const char *devname,
void *dev_id)
int bind_virq_to_irqhandler(
unsigned int virq,
unsigned int cpu,
- irqreturn_t (*handler)(int, void *, struct pt_regs *),
+ irq_handler_t handler,
unsigned long irqflags,
const char *devname,
void *dev_id)
int bind_ipi_to_irqhandler(
unsigned int ipi,
unsigned int cpu,
- irqreturn_t (*handler)(int, void *, struct pt_regs *),
+ irq_handler_t handler,
unsigned long irqflags,
const char *devname,
void *dev_id)
rebind_irq_to_cpu(irq, tcpu);
}
+static int retrigger_vector(unsigned int irq)
+{
+ int evtchn = evtchn_from_irq(irq);
+ shared_info_t *s = HYPERVISOR_shared_info;
+ if (!VALID_EVTCHN(evtchn))
+ return 1;
+ synch_set_bit(evtchn, &s->evtchn_pending[0]);
+ return 1;
+}
+
/*
* Interface to generic handling in irq.c
*/
-static unsigned int startup_dynirq(unsigned int irq)
+static unsigned int startup_dynirq_vector(unsigned int irq)
{
int evtchn = evtchn_from_irq(irq);
return 0;
}
-static void shutdown_dynirq(unsigned int irq)
-{
- int evtchn = evtchn_from_irq(irq);
-
- if (VALID_EVTCHN(evtchn))
- mask_evtchn(evtchn);
-}
-
-static void enable_dynirq(unsigned int irq)
+static void unmask_dynirq_vector(unsigned int irq)
{
int evtchn = evtchn_from_irq(irq);
unmask_evtchn(evtchn);
}
-static void disable_dynirq(unsigned int irq)
+static void mask_dynirq_vector(unsigned int irq)
{
int evtchn = evtchn_from_irq(irq);
mask_evtchn(evtchn);
}
-static void ack_dynirq(unsigned int irq)
+static void ack_dynirq_vector(unsigned int irq)
{
int evtchn = evtchn_from_irq(irq);
}
}
-static void end_dynirq(unsigned int irq)
+static void ack_dynirq_quirk_vector(unsigned int irq)
{
int evtchn = evtchn_from_irq(irq);
unmask_evtchn(evtchn);
}
-static struct hw_interrupt_type dynirq_type = {
- "Dynamic-irq",
- startup_dynirq,
- shutdown_dynirq,
- enable_dynirq,
- disable_dynirq,
- ack_dynirq,
- end_dynirq,
- set_affinity_irq
+static struct irq_chip dynirq_chip = {
+ .name = "Dynamic-irq",
+ .startup = startup_dynirq_vector,
+ .mask = mask_dynirq_vector,
+ .unmask = unmask_dynirq_vector,
+ .ack = ack_dynirq_vector,
+ .eoi = ack_dynirq_quirk_vector,
+#ifdef CONFIG_SMP
+ .set_affinity = set_affinity_irq,
+#endif
+ .retrigger = retrigger_vector,
};
static inline void pirq_unmask_notify(int pirq)
*/
#define probing_irq(_irq) (irq_desc[(_irq)].action == NULL)
-static unsigned int startup_pirq(unsigned int irq)
+static unsigned int startup_pirq_vector(unsigned int irq)
{
struct evtchn_bind_pirq bind_pirq;
int evtchn = evtchn_from_irq(irq);
return 0;
}
-static void shutdown_pirq(unsigned int irq)
-{
- struct evtchn_close close;
- int evtchn = evtchn_from_irq(irq);
-
- if (!VALID_EVTCHN(evtchn))
- return;
-
- mask_evtchn(evtchn);
-
- close.port = evtchn;
- if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
- BUG();
-
- bind_evtchn_to_cpu(evtchn, 0);
- evtchn_to_irq[evtchn] = -1;
- irq_info[irq] = IRQ_UNBOUND;
-}
-
-static void enable_pirq(unsigned int irq)
+static void unmask_pirq_vector(unsigned int irq)
{
int evtchn = evtchn_from_irq(irq);
}
}
-static void disable_pirq(unsigned int irq)
+static void mask_pirq_vector(unsigned int irq)
{
int evtchn = evtchn_from_irq(irq);
mask_evtchn(evtchn);
}
-static void ack_pirq(unsigned int irq)
+static void ack_pirq_vector(unsigned int irq)
{
int evtchn = evtchn_from_irq(irq);
}
}
-static void end_pirq(unsigned int irq)
+static void ack_pirq_quirk_vector(unsigned int irq)
{
int evtchn = evtchn_from_irq(irq);
}
}
-static struct hw_interrupt_type pirq_type = {
- "Phys-irq",
- startup_pirq,
- shutdown_pirq,
- enable_pirq,
- disable_pirq,
- ack_pirq,
- end_pirq,
- set_affinity_irq
+static struct irq_chip pirq_chip = {
+ .name = "Phys-irq",
+ .startup = startup_pirq_vector,
+ .mask = mask_pirq_vector,
+ .unmask = unmask_pirq_vector,
+ .ack = ack_pirq_vector,
+ .eoi = ack_pirq_quirk_vector,
+#ifdef CONFIG_SMP
+ .set_affinity = set_affinity_irq,
+#endif
+ .retrigger = retrigger_vector,
};
int irq_ignore_unhandled(unsigned int irq)
return !!(irq_status.flags & XENIRQSTAT_shared);
}
-void resend_irq_on_evtchn(struct hw_interrupt_type *h, unsigned int i)
+void resend_irq_on_evtchn(unsigned int i)
{
int evtchn = evtchn_from_irq(i);
shared_info_t *s = HYPERVISOR_shared_info;
irq_desc[dynirq_to_irq(i)].status = IRQ_DISABLED;
irq_desc[dynirq_to_irq(i)].action = NULL;
irq_desc[dynirq_to_irq(i)].depth = 1;
- irq_desc[dynirq_to_irq(i)].handler = &dynirq_type;
+ set_irq_chip_and_handler_name(dynirq_to_irq(i), &dynirq_chip,
+ handle_level_irq, "level");
}
/* Phys IRQ space is statically bound (1:1 mapping). Nail refcnts. */
#ifdef RTC_IRQ
/* If not domain 0, force our RTC driver to fail its probe. */
- if ((i == RTC_IRQ) &&
- !(xen_start_info->flags & SIF_INITDOMAIN))
+ if ((i == RTC_IRQ) && !is_initial_xendomain())
continue;
#endif
irq_desc[pirq_to_irq(i)].status = IRQ_DISABLED;
irq_desc[pirq_to_irq(i)].action = NULL;
irq_desc[pirq_to_irq(i)].depth = 1;
- irq_desc[pirq_to_irq(i)].handler = &pirq_type;
+ set_irq_chip_and_handler_name(pirq_to_irq(i), &pirq_chip,
+ handle_level_irq, "level");
}
}