/* interrupt happened due to transition/change of near/far proximity state */ irqreturn_t gp2a_irq_handler(int irq, void *data) { struct gp2a_data *ip = data; u8 setting; int val = gpio_get_value(ip->pdata->p_out); if (val < 0) { pr_err("%s: gpio_get_value error %d\n", __func__, val); return IRQ_HANDLED; } if (val != ip->val_state) { if (val) setting = 0x40; else setting = 0x20; gp2a_i2c_write(ip, REGS_HYS, &setting); } ip->val_state = val; pr_err("gp2a: proximity val = %d\n", val); if (!val) { proximity = true; } else { proximity = false; } pr_info("proximity %u\n", proximity); #ifdef CONFIG_TOUCH_WAKE if (!val) { proximity_detected(); } else { proximity_off(); } #endif /* 0 is close, 1 is far */ input_report_abs(ip->proximity_input_dev, ABS_DISTANCE, val); input_sync(ip->proximity_input_dev); wake_lock_timeout(&ip->prx_wake_lock, 3*HZ); return IRQ_HANDLED; }
/* interrupt happened due to transition/change of near/far proximity state */ irqreturn_t gp2a_irq_handler(int irq, void *data) { struct gp2a_data *ip = data; int val = gpio_get_value(ip->pdata->p_out); if (val < 0) { pr_err("%s: gpio_get_value error %d\n", __func__, val); return IRQ_HANDLED; } gp2a_dbgmsg("gp2a: proximity val=%d\n", val); #ifdef CONFIG_TOUCH_WAKE if (!val) { proximity_detected(); } #endif /* 0 is close, 1 is far */ input_report_abs(ip->proximity_input_dev, ABS_DISTANCE, val); input_sync(ip->proximity_input_dev); wake_lock_timeout(&ip->prx_wake_lock, 3*HZ); return IRQ_HANDLED; }