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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 8
0
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;
}