static void gp2a_shutdown(struct i2c_client *client) { struct gp2a_data *data = i2c_get_clientdata(client); pr_info("%s, is called\n", __func__); if (data->light_enabled) { cancel_delayed_work_sync(&data->light_work); lightsensor_onoff(0, data); input_report_rel(data->light_input_dev, REL_MISC, data->lux + 1); input_sync(data->light_input_dev); } if (data->prox_enabled) { disable_irq(data->irq); disable_irq_wake(data->irq); gp2a_prox_onoff(0, data); wake_unlock(&data->prx_wake_lock); } wake_lock_destroy(&data->prx_wake_lock); mutex_destroy(&data->light_mutex); mutex_destroy(&data->data_mutex); sensors_unregister(data->prox_sensor_device, prox_sensor_attrs); sensors_unregister(data->light_sensor_device, light_sensor_attrs); sysfs_remove_group(&data->prox_input_dev->dev.kobj, &gp2a_prox_attribute_group); sensors_remove_symlink(&data->prox_input_dev->dev.kobj, data->prox_input_dev->name); input_unregister_device(data->prox_input_dev); input_free_device(data->prox_input_dev); gpio_free(data->gpio); sysfs_remove_group(&data->light_input_dev->dev.kobj, &gp2a_light_attribute_group); sensors_remove_symlink(&data->light_input_dev->dev.kobj, data->light_input_dev->name); input_unregister_device(data->light_input_dev); input_free_device(data->light_input_dev); sensor_power_on_vdd(data, 0); kfree(data); bShutdown = true; }
static void gp2a_shutdown(struct i2c_client *client) { struct gp2a_data *data = i2c_get_clientdata(client); pr_info("%s, is called\n", __func__); bShutdown = true; if (data->light_enabled) { cancel_delayed_work_sync(&data->light_work); lightsensor_onoff(0, data); input_report_rel(data->light_input_dev, REL_MISC, data->lux + 1); input_sync(data->light_input_dev); } input_unregister_device(data->light_input_dev); input_free_device(data->light_input_dev); #ifdef CONFIG_SENSORS_GP2A030A_PROX if (data->prox_enabled) { disable_irq(data->irq); disable_irq_wake(data->irq); gp2a_prox_onoff(0, data); wake_unlock(&data->prx_wake_lock); } wake_lock_destroy(&data->prx_wake_lock); input_unregister_device(data->prox_input_dev); input_free_device(data->prox_input_dev); gpio_free(data->gpio); if (system_rev >= 12) { gpio_free(data->con_gpio); } #ifndef CONFIG_SEC_BERLUTI_PROJECT gpio_free(data->vled_gpio); #endif #endif mutex_destroy(&data->light_mutex); mutex_destroy(&data->data_mutex); kfree(data); gp2a_regulator_onoff(&client->dev, false); }
static ssize_t gp2a_prox_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct gp2a_data *data = dev_get_drvdata(dev); int value; int err = 0; err = kstrtoint(buf, 10, &value); if (err) { pr_err("%s kstrtoint failed.", __func__); goto done; } pr_info("%s %d value = %d\n", __func__, __LINE__, value); if (value != SENSOR_DISABLE && value != SENSOR_ENABLE) goto done; if (value) { if (data->prox_enabled == SENSOR_DISABLE) { uint16_t thrd = 0; u8 reg; gp2a_prox_onoff(1, data); err = gp2a_prox_open_calibration(data); if (err < 0 && err != -ENOENT) pr_err("%s gp2a_prox_open_offset() failed\n", __func__); else { thrd = gp2a_reg[3][1]+(data->offset_value); THR_REG_LSB(thrd, reg); gp2a_i2c_write(data, gp2a_reg[3][0], ®); THR_REG_MSB(thrd, reg); gp2a_i2c_write(data, gp2a_reg[4][0], ®); thrd = gp2a_reg[5][1]+(data->offset_value); THR_REG_LSB(thrd, reg); gp2a_i2c_write(data, gp2a_reg[5][0], ®); THR_REG_MSB(thrd, reg); gp2a_i2c_write(data, gp2a_reg[6][0], ®); } enable_irq_wake(data->irq); enable_irq(data->irq); input_report_abs(data->prox_input_dev, ABS_DISTANCE, 1); input_sync(data->prox_input_dev); data->prox_enabled = SENSOR_ENABLE; } else { pr_err("%s already enabled\n", __func__); } } else { if (data->prox_enabled == SENSOR_ENABLE) { disable_irq(data->irq); disable_irq_wake(data->irq); gp2a_prox_onoff(0, data); data->prox_enabled = SENSOR_DISABLE; } else { pr_err("%s already disabled\n", __func__); } } done: return count; }