static void gp2a_prox_work_func(struct work_struct *work) { unsigned char value; unsigned char int_val = GP2A_REG_PROX; unsigned char vout = 0; int ret=0; /* Read VO & INT Clear */ debug("[PROXIMITY] %s : \n",__func__); if((ret=gp2a_i2c_read((u8)(int_val), &value))<0) { error("gp2a_i2c_read failed\n"); gp2a_prox_reset(); if(proximity_enable == 1) gp2a_prox_mode(1); else gp2a_prox_mode(0); return; } vout = value & 0x01; printk(KERN_INFO "[GP2A] vout = %d \n",vout); /* Report proximity information */ proximity_value = vout; input_report_abs(gp2a_data->prox_input_dev, ABS_DISTANCE,((vout == 1)? 0:1)); input_sync(gp2a_data->prox_input_dev); mdelay(1); /* Write HYS Register */ gp2a_prox_offset(vout); /* Forcing vout terminal to go high */ value = 0x18; gp2a_i2c_write((u8)(GP2A_REG_CON),&value); /* enable INT */ enable_irq(gp2a_data->irq); printk(KERN_INFO "[GP2A] enable_irq IRQ_NO:%d\n",gp2a_data->irq); /* enabling VOUT terminal in nomal operation */ value = 0x00; gp2a_i2c_write((u8)(GP2A_REG_CON),&value); }
static void gp2a_prox_work_func(struct work_struct *work) { unsigned char value; unsigned char int_val = GP2A_REG_PROX; unsigned char vout = 0; int ret=0; /* Read VO & INT Clear */ debug("[PROXIMITY] %s : \n",__func__); if(INT_CLEAR) { //int_val = GP2A_REG_PROX | (1 <<7); } if((ret=gp2a_i2c_read((u8)(int_val), &value))<0) { error("gp2a_i2c_read failed\n"); gp2a_prox_reset(); if(proximity_enable == 1) gp2a_prox_mode(1); else gp2a_prox_mode(0); return; } vout = value & 0x01; printk(KERN_INFO "[GP2A] vout = %d \n",vout); /* Report proximity information */ proximity_value = vout; if(proximity_value ==0) { timeB = ktime_get(); timeSub = ktime_sub(timeB,timeA); debug("[PROXIMITY] timeSub sec = %d, timeSub nsec = %d \n",timeSub.tv.sec,timeSub.tv.nsec); if (timeSub.tv.sec>=3 ) { wake_lock_timeout(&prx_wake_lock,HZ/2); debug("[PROXIMITY] wake_lock_timeout : HZ/2 \n"); } else error("[PROXIMITY] wake_lock is already set \n"); } if(USE_INPUT_DEVICE) { input_report_abs(gp2a_data->prox_input_dev, ABS_DISTANCE,(int)vout); input_sync(gp2a_data->prox_input_dev); mdelay(1); } /* Write HYS Register */ if(!vout) { value = 0x40; } else { value = 0x20; } gp2a_i2c_write((u8)(GP2A_REG_HYS),&value); /* Forcing vout terminal to go high */ value = 0x18; gp2a_i2c_write((u8)(GP2A_REG_CON),&value); /* enable INT */ enable_irq(gp2a_data->irq); printk(KERN_INFO "[GP2A] enable_irq IRQ_NO:%d\n",gp2a_data->irq); /* enabling VOUT terminal in nomal operation */ value = 0x00; gp2a_i2c_write((u8)(GP2A_REG_CON),&value); }