int pedestal_dect_irq_request(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) { int rc = 1; struct pedestal_driver_data *dd = dev_id; spin_lock_irq(&dd->pedestal_lock); if(g_gpio_irq_state.irq_dect_req_state > 0) { rc = 1; PEDESTAL_ERR("pedestal_dect_irq_request: request dect irq again!\n"); goto dect_irq_request_exit; } if(can_request_irq(irq,irqflags)) { rc = request_irq(irq,handler,irqflags,devname,dev_id); if (rc) { PEDESTAL_ERR("pedestal_dect_irq_request: request dect irq failed, err code = %d\n",rc); goto dect_irq_request_exit; } else { g_gpio_irq_state.irq_dect_req_state++; } } else { PEDESTAL_ERR("pedestal_dect_irq_request: can_request_irq failed !\n"); rc = 2; } dect_irq_request_exit: spin_unlock_irq(&dd->pedestal_lock); return rc; }
static void mu_work_handler(struct work_struct *work) { int ret; u32 irq, enable, idx, mask; pr_debug("receive M4 message 0x%x\n", m4_message); switch (m4_message) { case MU_LPM_M4_REQUEST_HIGH_BUS: request_bus_freq(BUS_FREQ_HIGH); imx6sx_set_m4_highfreq(true); imx_mu_send_message(MU_LPM_HANDSHAKE_INDEX, MU_LPM_BUS_HIGH_READY_FOR_M4); m4_freq_low = false; break; case MU_LPM_M4_RELEASE_HIGH_BUS: release_bus_freq(BUS_FREQ_HIGH); imx6sx_set_m4_highfreq(false); imx_mu_send_message(MU_LPM_HANDSHAKE_INDEX, MU_LPM_M4_FREQ_CHANGE_READY); m4_freq_low = true; break; default: if ((m4_message & MU_LPM_M4_WAKEUP_SRC_MASK) == MU_LPM_M4_WAKEUP_SRC_VAL) { irq = (m4_message & MU_LPM_M4_WAKEUP_IRQ_MASK) >> MU_LPM_M4_WAKEUP_IRQ_SHIFT; enable = (m4_message & MU_LPM_M4_WAKEUP_ENABLE_MASK) >> MU_LPM_M4_WAKEUP_ENABLE_SHIFT; idx = irq / 32 - 1; mask = 1 << irq % 32; if (enable && can_request_irq(irq, 0)) { ret = request_irq(irq, mcc_m4_dummy_isr, IRQF_NO_SUSPEND, "imx-m4-dummy", NULL); if (ret) { pr_err("%s: register interrupt %d failed, rc %d\n", __func__, irq, ret); break; } disable_irq(irq); m4_wake_irqs[idx] = m4_wake_irqs[idx] | mask; } imx_gpc_add_m4_wake_up_irq(irq, enable); } break; }
int pedestal_irq_request(unsigned int pedestal_type, unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) { int rc = 1; // struct pedestal_driver_data *dd = dev_id; if(pedestal_type >= PEDESTAL_TYPE_UNDEF) return -EINVAL; // spin_lock_irq(&dd->pedestal_lock); if(g_gpio_irq_state.pedestal_irq_req_state[pedestal_type] > 0) { rc = 1; PEDESTAL_ERR("pedestal_interface_irq_request: request dect irq again!\n"); goto dect_irq_request_exit; } if(can_request_irq(irq,irqflags)) { rc = request_irq(irq,handler,irqflags,devname,dev_id); if (rc) { PEDESTAL_ERR("pedestal_interface_irq_request: request dect irq failed, err code = %d\n",rc); goto dect_irq_request_exit; } else { g_gpio_irq_state.pedestal_irq_req_state[pedestal_type]++; } } else { PEDESTAL_ERR("pedestal_interface_irq_request: can_request_irq failed !\n"); rc = 2; } dect_irq_request_exit: // spin_unlock_irq(&dd->pedestal_lock); return rc; }
int irq_init (void) { int retval = 0; unsigned long irqflags = 0; memset (&mouse_info_ctx, 0, sizeof (CDD_MOUSE_INFO_T)); do { mouse_info_ctx.mutex_lock = (struct semaphore *) kmalloc(sizeof (struct semaphore), GFP_ATOMIC); if (mouse_info_ctx.mutex_lock == NULL) { break; } mouse_info_ctx.wq = create_workqueue(QUEUE_NAME); if (mouse_info_ctx.wq == NULL) { break; } irqflags = IRQF_SHARED; #if 0 if (!can_request_irq(CDD_MOUSE_IRQ, irqflags)) { /* Clean up if cannot requset the IRQ */ free_irq(CDD_MOUSE_IRQ, (void *) &dev_id); } #endif retval = request_irq(CDD_MOUSE_IRQ, (irq_handler_t) irq_handler, irqflags, (char *) "CDD Mouse IRQ handler", (void *) &dev_id); } while(0); return retval; }