static inline int bma250_calibration_end(struct device *dev) { int rc = 0; struct driver_data *dd = dev_get_drvdata(dev); /* power down */ bma250_power_down(dd); dev_dbg(dev, "%s: -> power down.\n", __func__); if (dd->recovery_power && dd->ip_dev->users) { /* power up & reset*/ rc = bma250_power_up(dd); if (rc) goto calib_end_error; /* re-schedule by a delay */ rc = bma250_config(dd, TRUE, TRUE); if (rc) goto calib_end_error; schedule_delayed_work(&dd->work_data, dd->delay_jiffies); dev_dbg(dev, "%s: -> power up.\n", __func__); } return rc; calib_end_error: dev_err(dev, "%s: Calibration end failure.(%d)\n", __func__, rc); return -EIO; }
static int bma250_open(struct input_dev *dev) { int rc = 0; struct driver_data *dd = input_get_drvdata(dev); rc = bma250_power_up(dd); if (rc) return rc; rc = bma250_config(dd); return rc; }
static int bma250_config(struct driver_data *dd) { int rc; u8 rx_buf[2]; const struct registers *preg = &use_chip_default; struct bma250_platform_data *pdata = dd->ic_dev->dev.platform_data; /* use platform data register values if they exist */ if (pdata && pdata->reg) preg = pdata->reg; rc = bma250_power_up(dd); if (rc) goto config_exit; rc = bma250_ic_read(dd->ic_dev, BMA250_CHIP_ID_REG, rx_buf, 2); if (rc) goto config_exit; if ((rx_buf[0] == 0x00) || (rx_buf[1] == 0x00)) { printk(KERN_ERR "bma250: device not found.\n"); rc = -ENODEV; goto config_exit; } printk(KERN_INFO "bma250: detected chip id %d, rev 0x%X\n", rx_buf[0] & 0x07, rx_buf[1]); if (preg->int_pin1 >= 0) { rc = bma250_ic_write(dd->ic_dev, BMA250_INT_PIN1_REG, preg->int_pin1); if (rc) goto config_exit; } if (preg->int_pin2 >= 0) { rc = bma250_ic_write(dd->ic_dev, BMA250_INT_PIN2_REG, preg->int_pin2); if (rc) goto config_exit; } rc = bma250_ic_write(dd->ic_dev, BMA250_INT_CTRL_REG, BMA250_INT_MODE_LATCHED); if (rc) goto config_exit; rc = bma250_update_settings(dd); config_exit: return rc; }
static int bma250_resume(struct i2c_client *ic_dev) { struct driver_data *dd = bma250_ic_get_data(ic_dev); int rc = 0; if (dd->ip_dev->users) { rc = bma250_power_up(dd); if (rc) return rc; rc = bma250_config(dd); } return rc; }
static int bma250_open(struct input_dev *dev) { int rc = 0; struct driver_data *dd = input_get_drvdata(dev); rc = bma250_power_up(dd); if (rc) return rc; rc = bma250_config(dd, TRUE, TRUE); schedule_delayed_work(&dd->work_data, dd->delay_jiffies); return rc; }
static int bma250_resume(struct i2c_client *ic_dev) { struct driver_data *dd = bma250_ic_get_data(ic_dev); int rc = 0; if (dd->ip_dev->users) { rc = bma250_power_up(dd); if (rc) return rc; rc = bma250_config(dd, TRUE, TRUE); schedule_delayed_work(&dd->work_data, dd->delay_jiffies); } return rc; }
static inline int bma250_calibration_init(struct device *dev) { int rc; char bypass = 0; struct driver_data *dd = dev_get_drvdata(dev); struct bma250_platform_data *pdata = dd->ic_dev->dev.platform_data; /* Check whether Gyro had been activated. */ if (slave_hw) pdata->bypass_state(READ_BYPASS_STATE, &bypass); if (slave_hw && bypass) { rc = -EBUSY; goto calib_init_error_end; } /* Save POWER flag for recovery */ dd->recovery_power = dd->power; if (!(dd->recovery_power)) { /* Power ON if accelerometer is suspend state. */ rc = bma250_power_up(dd); if (rc) goto calib_init_error; } else { /* Stop data updating if accelerometer is active state. */ cancel_delayed_work(&dd->work_data); } /* Set +/-2g Range Mode and 15.63 Hz Low Pass Filter Mode */ rc = bma250_ic_write(dd->ic_dev, BMA250_RANGE_REG, BMA250_RANGE_2G); if (rc) goto calib_init_error; rc = bma250_ic_write(dd->ic_dev, BMA250_BW_SEL_REG, BMA250_BW_15_63HZ); if (rc) goto calib_init_error; msleep(BMA250_CALIB_SET_INTERVAL); return rc; calib_init_error: dev_err(&dd->ic_dev->dev, "%s: Calibration start failure.(%d)\n", __func__, rc); rc = -EIO; calib_init_error_end: return rc; }
static int __devinit bma250_probe(struct i2c_client *ic_dev, const struct i2c_device_id *id) { struct driver_data *dd; int rc; struct bma250_platform_data *pdata = ic_dev->dev.platform_data; if (!pdata || !pdata->hw_config || !pdata->setup || !pdata->teardown) return -ENODEV; dd = kzalloc(sizeof(struct driver_data), GFP_KERNEL); if (!dd) { rc = -ENOMEM; goto probe_exit; } mutex_lock(&bma250_dd_lock); list_add_tail(&dd->next_dd, &dd_list); mutex_unlock(&bma250_dd_lock); dd->ic_dev = ic_dev; INIT_DELAYED_WORK(&dd->work_data, bma250_work_f); dd->pdata = pdata; /* initial configuration */ dd->rate = pdata->rate; dd->delay_jiffies = msecs_to_jiffies(dd->rate); dd->bw_sel = pdata->reg->bw_sel; dd->range = pdata->reg->range; rc = bma250_power_up(dd); if (rc) goto probe_err_cfg; rc = bma250_hwid(dd); bma250_power_down(dd); if (rc) goto probe_err_cfg; bma250_create_dbfs_entry(dd); bma250_ic_set_data(ic_dev, dd); dd->ip_dev = input_allocate_device(); if (!dd->ip_dev) { rc = -ENOMEM; goto probe_err_reg; } input_set_drvdata(dd->ip_dev, dd); dd->ip_dev->open = bma250_open; dd->ip_dev->close = bma250_release; dd->ip_dev->name = BMA250_NAME; dd->ip_dev->id.vendor = BMA250_VENDORID; dd->ip_dev->id.product = 1; dd->ip_dev->id.version = 1; __set_bit(EV_ABS, dd->ip_dev->evbit); __set_bit(ABS_X, dd->ip_dev->absbit); __set_bit(ABS_Y, dd->ip_dev->absbit); __set_bit(ABS_Z, dd->ip_dev->absbit); __set_bit(ABS_MISC, dd->ip_dev->absbit); input_set_abs_params(dd->ip_dev, ABS_X, -4096, 4095, 0, 0); input_set_abs_params(dd->ip_dev, ABS_Y, -4096, 4095, 0, 0); input_set_abs_params(dd->ip_dev, ABS_Z, -4096, 4095, 0, 0); input_set_abs_params(dd->ip_dev, ABS_MISC, -80, 175, 0, 0); rc = input_register_device(dd->ip_dev); if (rc) { input_free_device(dd->ip_dev); goto probe_err_reg; } rc = add_sysfs_interfaces(&dd->ip_dev->dev); if (rc) goto probe_err_sysfs; return rc; probe_err_sysfs: input_unregister_device(dd->ip_dev); probe_err_reg: bma250_remove_dbfs_entry(dd); bma250_ic_set_data(ic_dev, NULL); probe_err_cfg: mutex_lock(&bma250_dd_lock); list_del(&dd->next_dd); mutex_unlock(&bma250_dd_lock); kfree(dd); probe_exit: return rc; }