コード例 #1
0
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;
}
コード例 #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;
}
コード例 #3
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;
}
コード例 #4
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, TRUE, TRUE);
	schedule_delayed_work(&dd->work_data, dd->delay_jiffies);

	return rc;
}
コード例 #5
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, TRUE, TRUE);
		schedule_delayed_work(&dd->work_data, dd->delay_jiffies);
	}
	return rc;
}
コード例 #6
0
static ssize_t bma250_rate_store(struct device *dev,
					struct device_attribute *attr,
					const char *buf, size_t count)
{
	struct driver_data *dd = dev_get_drvdata(dev);
	int rc;
	unsigned long val;

	rc = strict_strtoul(buf, 10, &val);
	if (rc)
		return rc;

	if ((val >= 1) && (val <= 10000)) {
		dd->rate = (unsigned int)val;
		dd->delay_jiffies = msecs_to_jiffies(dd->rate);
		rc = bma250_config(dd, TRUE, FALSE);
		return strnlen(buf, count);
	}
	return -EINVAL;
}
コード例 #7
0
ファイル: bma250.c プロジェクト: 325116067/semc-qsd8x50
static int bma250_resume(struct device *dev)
{
	struct driver_data *dd = dev_get_drvdata(dev);
	int rc;

	if (dd->pdata && dd->pdata->setup) {
		rc = dd->pdata->setup(&dd->ic_dev->dev);
		if (rc)
			return rc;
	}

	rc = bma250_config(dd);
	if (rc)
		return rc;

	if (dd->irq_pending) {
		dd->irq_pending= false;
		rc = bma250_report_data(dd);
		if (rc)
			return rc;
	}

	return rc;
}
コード例 #8
0
ファイル: bma250.c プロジェクト: 325116067/semc-qsd8x50
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;

	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);

	if (pdata && pdata->setup) {
		rc = pdata->setup(&ic_dev->dev);
		if (rc)
			goto probe_err_setup;
	}

	dd->pdata = pdata;

	/* initial configuration */
	dd->new_cnf.rate = 200;
	dd->new_cnf.range = 2;
	dd->new_cnf.resolution = INTERRUPT_RESOLUTION;

	rc = bma250_config(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:
	if (pdata && pdata->teardown)
		pdata->teardown(&ic_dev->dev);
probe_err_setup:
	mutex_lock(&bma250_dd_lock);
	list_del(&dd->next_dd);
	mutex_unlock(&bma250_dd_lock);
	kfree(dd);
probe_exit:
	return rc;
}