/***************************************************************************************** * * function : gp2a_work_func_prox * description : This function is for proximity sensor (using B-1 Mode ). * when INT signal is occured , it gets value from VO register. * * */ static void gp2a_work_func_prox(struct work_struct *work) { struct gp2a_data *gp2a = container_of((struct work_struct *)work, struct gp2a_data, work); char value; #ifdef PROX_MODE_B u8 reg = 0; #endif disable_irq(IRQ_GP2A_INT); value = get_ps_vout_value(); input_report_abs(gp2a->input_dev, ABS_X, value); input_sync(gp2a->input_dev); gp2a->prox_data= value; gprintk("proximity = %d\n",value); //Temp #ifdef PROX_MODE_B if(value == 1) //VO == 0 { reg = 0x40; opt_i2c_write(NOT_INT_CLR(REGS_HYS), ®); } else { reg = 0x20; opt_i2c_write(NOT_INT_CLR(REGS_HYS), ®); } reg = 0x18; opt_i2c_write(NOT_INT_CLR(REGS_CON), ®); #endif //PROX_MODE_B enable_irq(IRQ_GP2A_INT); #ifdef PROX_MODE_B reg = 0x00; opt_i2c_write(INT_CLR(REGS_CON), ®); #endif //PROX_MODE_B }
irqreturn_t gp2a_irq_handler(int irq, void *ptr) { struct gp2a_data *gp2a = ptr; char value; #ifdef PROX_MODE_B u8 reg = 0; #endif #ifdef PROX_MODE_A value = gpio_get_value_cansleep(gp2a->ps_status); #else opt_i2c_read(0x00, &value, 2); value &= 0x01; value ^= 0x01; #endif input_report_abs(gp2a->input_dev, ABS_DISTANCE, value); input_sync(gp2a->input_dev); gp2a->prox_data = value; #ifdef PROX_MODE_B if (value == 1) { reg = 0x40; opt_i2c_write(NOT_INT_CLR(REGS_HYS), ®); } else{ reg = 0x27; opt_i2c_write(NOT_INT_CLR(REGS_HYS), ®); } reg = 0x18; opt_i2c_write(NOT_INT_CLR(REGS_CON), ®); #endif #ifdef PROX_MODE_B reg = 0x00; opt_i2c_write(INT_CLR(REGS_CON), ®); #endif return IRQ_HANDLED; }