static void sensor_set_enable(struct device *dev, int enable) { struct input_dev *inputdev = to_input_dev(dev); struct sensor_data *sensordata = input_get_drvdata(inputdev); int delay = atomic_read(&sensordata->delay); dbg_func_in(); mutex_lock(&sensordata->enable_mutex); if (enable) { /* enable if state will be changed */ if (!atomic_cmpxchg(&sensordata->enable, 0, 1)) { sensordata->status = apds9900_control_enable(APDS9900_TYPE_PROXIMITY, true) ? 0 : 1; if(sensordata->status) { schedule_delayed_work(&sensordata->work, delay_to_jiffies(delay) + 1); } } } else { /* disable if state will be changed */ if (atomic_cmpxchg(&sensordata->enable, 1, 0) && sensordata->status) { if(sensordata->status) { cancel_delayed_work_sync(&sensordata->work); sensordata->status = apds9900_control_enable(APDS9900_TYPE_PROXIMITY, false) ? 0 : 1; } } } atomic_set(&sensordata->enable, enable); mutex_unlock(&sensordata->enable_mutex); dbg_func_out(); }
static void sensor_set_enable(struct device *dev, int enable) { struct input_dev *inputdev = to_input_dev(dev); struct sensor_data *sensordata = input_get_drvdata(inputdev); int delay = atomic_read(&sensordata->delay); dbg_func_in(); mutex_lock(&sensordata->enable_mutex); if (enable) { /* enable if state will be changed */ if (!atomic_cmpxchg(&sensordata->enable, 0, 1)) { apds9900_control_enable(E_ACTIVE_LIGHT, 1); schedule_delayed_work(&sensordata->work, delay_to_jiffies(delay) + 1); } } else { /* disable if state will be changed */ if (atomic_cmpxchg(&sensordata->enable, 1, 0)) { cancel_delayed_work_sync(&sensordata->work); apds9900_control_enable(E_ACTIVE_LIGHT, 0); } } atomic_set(&sensordata->enable, enable); mutex_unlock(&sensordata->enable_mutex); dbg_func_out(); }