Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
	}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}