/* * Register the handler for a given RETU interrupt source. */ int retu_request_irq(int id, void *irq_handler, unsigned long arg, char *name) { struct retu_irq_handler_desc *hnd; if (irq_handler == NULL || id >= MAX_RETU_IRQ_HANDLERS || name == NULL) { printk(KERN_ERR PFX "Invalid arguments to %s\n", __FUNCTION__); return -EINVAL; } hnd = &retu_irq_handlers[id]; if (hnd->func != NULL) { printk(KERN_ERR PFX "IRQ %d already reserved\n", id); return -EBUSY; } printk(KERN_INFO PFX "Registering interrupt %d for device %s\n", id, name); hnd->func = irq_handler; hnd->arg = arg; strlcpy(hnd->name, name, sizeof(hnd->name)); retu_ack_irq(id); retu_enable_irq(id); return 0; }
static void retu_headset_det_enable(struct retu_headset *hs) { mutex_lock(&hs->mutex); if (!hs->detection_enabled) { hs->detection_enabled = 1; retu_set_clear_reg_bits(RETU_REG_CC1, (1 << 10) | (1 << 8), 0); retu_enable_irq(RETU_INT_HOOK); } mutex_unlock(&hs->mutex); }