int rthal_irq_end(unsigned irq) { if (irq >= IPIPE_NR_XIRQS) return -EINVAL; if (rthal_irq_descp(irq)->handler == NULL || rthal_irq_descp(irq)->handler->enable == NULL) return -ENODEV; rthal_irq_descp(irq)->handler->enable(irq); return 0; }
int rthal_irq_disable(unsigned irq) { if (irq >= IPIPE_NR_XIRQS) return -EINVAL; if (rthal_irq_descp(irq)->handler == NULL || rthal_irq_descp(irq)->handler->disable == NULL) return -ENODEV; rthal_irq_descp(irq)->handler->disable(irq); rthal_irq_descp(irq)->status |= IRQ_DISABLED; return 0; }
int rthal_irq_end(unsigned irq) { if (irq >= NR_IRQS || rthal_irq_descp(irq) == NULL) return -EINVAL; return rthal_irq_chip_end(irq); }
int rthal_irq_enable(unsigned irq) { if (irq >= IPIPE_NR_XIRQS || rthal_irq_descp(irq) == NULL) return -EINVAL; return rthal_irq_chip_enable(irq); }
int rthal_irq_disable(unsigned int irq) { if (irq >= IPIPE_NR_XIRQS || rthal_irq_descp(irq) == NULL) return -EINVAL; rthal_mark_irq_disabled(irq); return rthal_irq_chip_disable(irq); }
int rthal_irq_host_release(unsigned irq, void *dev_id) { unsigned long flags; if (irq >= IPIPE_NR_XIRQS || rthal_linux_irq[irq].count == 0) return -EINVAL; free_irq(irq, dev_id); spin_lock_irqsave(&rthal_irq_descp(irq)->lock, flags); if (--rthal_linux_irq[irq].count == 0 && rthal_irq_descp(irq)->action) rthal_irq_descp(irq)->action->flags = rthal_linux_irq[irq].flags; spin_unlock_irqrestore(&rthal_irq_descp(irq)->lock, flags); return 0; }
int rthal_irq_host_release(unsigned irq, void *dev_id) { unsigned long flags; if (irq >= IPIPE_NR_XIRQS || rthal_linux_irq[irq].count == 0 || rthal_irq_descp(irq) == NULL) return -EINVAL; free_irq(irq, dev_id); rthal_irqdesc_lock(irq, flags); if (--rthal_linux_irq[irq].count == 0 && rthal_irq_descp(irq)->action) rthal_irq_descp(irq)->action->flags = rthal_linux_irq[irq].flags; rthal_irqdesc_unlock(irq, flags); return 0; }
int rthal_irq_host_request(unsigned irq, rthal_irq_host_handler_t handler, char *name, void *dev_id) { unsigned long flags; if (irq >= IPIPE_NR_XIRQS || !handler) return -EINVAL; spin_lock_irqsave(&rthal_irq_descp(irq)->lock, flags); if (rthal_linux_irq[irq].count++ == 0 && rthal_irq_descp(irq)->action) { rthal_linux_irq[irq].flags = rthal_irq_descp(irq)->action->flags; rthal_irq_descp(irq)->action->flags |= IRQF_SHARED; } spin_unlock_irqrestore(&rthal_irq_descp(irq)->lock, flags); return request_irq(irq, handler, IRQF_SHARED, name, dev_id); }
int rthal_irq_host_request(unsigned irq, rthal_irq_host_handler_t handler, char *name, void *dev_id) { unsigned long flags; if (irq >= IPIPE_NR_XIRQS || handler == NULL || rthal_irq_descp(irq) == NULL) return -EINVAL; rthal_irqdesc_lock(irq, flags); if (rthal_linux_irq[irq].count++ == 0 && rthal_irq_descp(irq)->action) { rthal_linux_irq[irq].flags = rthal_irq_descp(irq)->action->flags; rthal_irq_descp(irq)->action->flags |= IRQF_SHARED; } rthal_irqdesc_unlock(irq, flags); return request_irq(irq, handler, IRQF_SHARED, name, dev_id); }
int rthal_irq_enable(unsigned int irq) { if (irq >= IPIPE_NR_XIRQS || rthal_irq_descp(irq) == NULL) return -EINVAL; /* * We don't care of disable nesting level: real-time IRQ * channels are not meant to be shared with the regular * kernel. */ rthal_mark_irq_enabled(irq); return rthal_irq_chip_enable(irq); }