static int bma250_remove(struct i2c_client *client) { struct bma250_data *data = i2c_get_clientdata(client); bma250_set_enable(&client->dev, 0); unregister_early_suspend(&data->early_suspend); sysfs_remove_group(&data->input->dev.kobj, &bma250_attribute_group); bma250_input_delete(data); kfree(data); return 0; }
static int bma250_remove(struct i2c_client *client) { struct bma250_data *data = i2c_get_clientdata(client); bma250_set_enable(&client->dev, 0); #ifdef CONFIG_HAS_EARLYSUSPEND unregister_early_suspend(&data->early_suspend); #endif sysfs_remove_group(&data->input->dev.kobj, &bma250_attribute_group); bma250_input_delete(data); kfree(data); #if BMA250_PWROFF_EN if (bma250_set_power(false)) { printk(KERN_ERR "%s: bma250_set_power(false) fail \r\n", __func__); } #endif return 0; }
static int bma250_probe(struct i2c_client *client, const struct i2c_device_id *id) { int err = 0; int tempvalue; struct bma250_data *data; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { printk(KERN_INFO "i2c_check_functionality error\n"); goto exit; } data = kzalloc(sizeof(struct bma250_data), GFP_KERNEL); if (!data) { err = -ENOMEM; goto exit; } /* read chip id */ tempvalue = 0; tempvalue = i2c_smbus_read_word_data(client, BMA250_CHIP_ID_REG) & 0x00FF; /* SKUD board is using BMA250E chip! */ if (tempvalue == BMA250E_CHIP_ID1 || tempvalue == BMA250E_CHIP_ID2) { printk(KERN_INFO "Bosch Sensortec Device detected!\n" "BMA250 registered I2C driver!\n"); } else { printk(KERN_INFO "Bosch Sensortec Device not found, \ i2c error %d \n", tempvalue); err = -1; goto kfree_exit; } i2c_set_clientdata(client, data); data->bma250_client = client; mutex_init(&data->value_mutex); mutex_init(&data->mode_mutex); mutex_init(&data->enable_mutex); bma250_set_bandwidth(client, BMA250_BW_SET); bma250_set_range(client, BMA250_RANGE_SET); INIT_DELAYED_WORK(&data->work, bma250_work_func); atomic_set(&data->delay, BMA250_MAX_DELAY); atomic_set(&data->enable, 0); err = bma250_input_init(data); if (err < 0) goto kfree_exit; err = sysfs_create_group(&data->input->dev.kobj, &bma250_attribute_group); if (err < 0) goto error_sysfs; data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; data->early_suspend.suspend = bma250_early_suspend; data->early_suspend.resume = bma250_late_resume; register_early_suspend(&data->early_suspend); /* try to reduce the power comsuption */ bma250_set_mode(data->bma250_client, BMA250_MODE_SUSPEND); return 0; error_sysfs: bma250_input_delete(data); kfree_exit: kfree(data); exit: return err; }
static int bma250_probe(struct i2c_client *client, const struct i2c_device_id *id) { int err = 0; int tempvalue; struct bma250_data *data; printk(KERN_INFO "%s: entry \r\n", __func__); if (bma250_set_power(true)) { printk(KERN_ERR "%s: bma250_set_power(true) fail \r\n", __func__); return -1; } msleep(10); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { printk(KERN_INFO "i2c_check_functionality error\n"); goto exit; } data = kzalloc(sizeof(struct bma250_data), GFP_KERNEL); if (!data) { err = -ENOMEM; goto exit; } /* read chip id */ tempvalue = 0; tempvalue = i2c_smbus_read_word_data(client, BMA250_CHIP_ID_REG); if ((tempvalue&0x00FF) == BMA250_CHIP_ID) { printk(KERN_INFO "Bosch Sensortec Device detected!\n" \ "BMA250 registered I2C driver!\n"); } else{ printk(KERN_INFO "Bosch Sensortec Device not found, \ i2c error %d \n", tempvalue); err = -1; goto kfree_exit; } i2c_set_clientdata(client, data); data->bma250_client = client; mutex_init(&data->mode_mutex); mutex_init(&data->enable_mutex); bma250_set_bandwidth(client, BMA250_BW_SET); bma250_set_range(client, BMA250_RANGE_SET); INIT_DELAYED_WORK(&data->work, bma250_work_func); atomic_set(&data->delay, BMA250_DEFAULT_DELAY); atomic_set(&data->enable, 0); err = bma250_input_init(data); if (err < 0) goto kfree_exit; err = sysfs_create_group(&data->input->dev.kobj, &bma250_attribute_group); if (err < 0) goto error_sysfs; #ifdef CONFIG_HAS_EARLYSUSPEND data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; data->early_suspend.suspend = bma250_early_suspend; data->early_suspend.resume = bma250_late_resume; register_early_suspend(&data->early_suspend); #endif err = bma250_set_mode(client, BMA250_MODE_SUSPEND); if (err) goto error_sysfs; printk(KERN_INFO "%s: success \r\n", __func__); return 0; error_sysfs: bma250_input_delete(data); kfree_exit: kfree(data); exit: #if BMA250_PWROFF_EN if (bma250_set_power(false)) { printk(KERN_ERR "%s: bma250_set_power(false) fail \r\n", __func__); } #endif return err; }