static int __devexit bma255_remove(struct i2c_client *client) { struct bma255_p *data = (struct bma255_p *)i2c_get_clientdata(client); if (atomic_read(&data->enable) == ON) bma255_set_enable(data, OFF); cancel_delayed_work_sync(&data->work); sensors_unregister(data->factory_device, sensor_attrs); sensors_remove_symlink(&data->input->dev.kobj, data->input->name); sysfs_remove_group(&data->input->dev.kobj, &bma255_attribute_group); input_unregister_device(data->input); free_irq(data->irq1, data); wake_lock_destroy(&data->reactive_wake_lock); mutex_destroy(&data->mode_mutex); gpio_free(data->acc_int2); gpio_free(data->acc_int1); kfree(data); return 0; }
static ssize_t bma255_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { u8 enable; int ret; struct bma255_p *data = dev_get_drvdata(dev); ret = kstrtou8(buf, 2, &enable); if (ret) { pr_err("[SENSOR]: %s - Invalid Argument\n", __func__); return ret; } pr_info("[SENSOR]: %s - new_value = %u\n", __func__, enable); if ((enable == ON) || (enable == OFF)) bma255_set_enable(data, (int)enable); return size; }
static int bma255_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret = -ENODEV; struct bma255_p *data = NULL; pr_info("##########################################################\n"); pr_info("[SENSOR]: %s - Probe Start!\n", __func__); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { pr_err("[SENSOR]: %s - i2c_check_functionality error\n", __func__); goto exit; } data = kzalloc(sizeof(struct bma255_p), GFP_KERNEL); if (data == NULL) { pr_err("[SENSOR]: %s - kzalloc error\n", __func__); ret = -ENOMEM; goto exit_kzalloc; } ret = bma255_parse_dt(data, &client->dev); if (ret < 0) { pr_err("[SENSOR]: %s - of_node error\n", __func__); ret = -ENODEV; goto exit_of_node; } /* read chip id */ ret = i2c_smbus_read_word_data(client, BMA255_CHIP_ID_REG); #if defined(CONFIG_MACH_CS03_SGLTE) if ((ret & 0x00ff) != 0x95) { #else if ((ret & 0x00ff) != BMA255_CHIP_ID) { #endif pr_err("[SENSOR]: %s - chip id failed %d\n", __func__, ret); ret = -ENODEV; goto exit_read_chipid; } i2c_set_clientdata(client, data); data->client = client; bma255_power_on(data, 1); ret = bma255_setup_pin(data); if (ret < 0) { pr_err("[SENSOR]: %s - could not setup pin\n", __func__); goto exit_setup_pin; } /* input device init */ ret = bma255_input_init(data); if (ret < 0) goto exit_input_init; sensors_register(data->factory_device, data, sensor_attrs, MODULE_NAME); /* workqueue init */ INIT_DELAYED_WORK(&data->work, bma255_work_func); atomic_set(&data->delay, BMA255_DEFAULT_DELAY); atomic_set(&data->enable, OFF); data->time_count = 0; data->irq_state = 0; data->recog_flag = OFF; bma255_set_bandwidth(data->client, BMA255_BW_125HZ); bma255_set_range(data->client, BMA255_RANGE_2G); bma255_set_mode(data->client, BMA255_MODE_SUSPEND); pr_info("[SENSOR]: %s - Probe done!(chip pos : %d)\n", __func__, data->chip_pos); return 0; exit_input_init: free_irq(data->irq1, data); wake_lock_destroy(&data->reactive_wake_lock); gpio_free(data->acc_int2); gpio_free(data->acc_int1); exit_read_chipid: exit_setup_pin: exit_of_node: kfree(data); exit_kzalloc: exit: pr_err("[SENSOR]: %s - Probe fail!\n", __func__); return ret; } static int __devexit bma255_remove(struct i2c_client *client) { struct bma255_p *data = (struct bma255_p *)i2c_get_clientdata(client); if (atomic_read(&data->enable) == ON) bma255_set_enable(data, OFF); cancel_delayed_work_sync(&data->work); sensors_unregister(data->factory_device); //sensors_delete_symlink(data->input->dev); sysfs_remove_group(&data->input->dev.kobj, &bma255_attribute_group); input_unregister_device(data->input); free_irq(data->irq1, data); wake_lock_destroy(&data->reactive_wake_lock); gpio_free(data->acc_int2); gpio_free(data->acc_int1); kfree(data); return 0; } static int bma255_suspend(struct device *dev) { struct bma255_p *data = dev_get_drvdata(dev); //struct bma255_p *data = bma_acc_get_data(); if (atomic_read(&data->enable) == ON) { if (data->recog_flag == ON) bma255_set_mode(data->client, BMA255_MODE_LOWPOWER1); else bma255_set_mode(data->client, BMA255_MODE_SUSPEND); cancel_delayed_work_sync(&data->work); } bma255_power_on(data, 0); return 0; } static int bma255_resume(struct device *dev) { struct bma255_p *data = dev_get_drvdata(dev); //struct bma255_p *data = bma_acc_get_data(); bma255_power_on(data, 1); if (atomic_read(&data->enable) == ON) { bma255_set_mode(data->client, BMA255_MODE_NORMAL); schedule_delayed_work(&data->work, msecs_to_jiffies(atomic_read(&data->delay))); } return 0; } static struct of_device_id bma255_match_table[] = { { .compatible = "bma255-i2c",}, {}, };