irq_clear_status_flags(irq, IRQ_NOREQUEST|IRQ_NOAUTOEN);
 
-       return 0;
+       return xen_evtchn_port_setup(info);
 }
 
 static int xen_irq_info_evtchn_setup(unsigned irq,
 
 #define PIRQ_SHAREABLE (1 << 1)
 
 struct evtchn_ops {
+       int (*setup)(struct irq_info *info);
        void (*bind_to_cpu)(struct irq_info *info, unsigned cpu);
 
        void (*clear_pending)(unsigned port);
 unsigned cpu_from_irq(unsigned irq);
 unsigned cpu_from_evtchn(unsigned int evtchn);
 
+/*
+ * Do any ABI specific setup for a bound event channel before it can
+ * be unmasked and used.
+ */
+static inline int xen_evtchn_port_setup(struct irq_info *info)
+{
+       if (evtchn_ops->setup)
+               return evtchn_ops->setup(info);
+       return 0;
+}
+
 static inline void xen_evtchn_port_bind_to_cpu(struct irq_info *info,
                                               unsigned cpu)
 {