Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97a13253 authored by Oliver Wang's avatar Oliver Wang Committed by Bingzhe Cai
Browse files

input: sensors: add sensor class support for BOSCH bma2x2



Sensor class interface is required for sensor HAL to discover
the sensor. This change adds sensor class support for BOSCH
bma2x2 accelerometer.

CRs-fixed: 653165
Change-Id: If9dbddff3b4a58f21945a5da7dc4dbcec9c2e178
Signed-off-by: default avatarOliver Wang <mengmeng@codeaurora.org>
Signed-off-by: default avatarBingzhe Cai <bingzhec@codeaurora.org>
parent 3472d359
Loading
Loading
Loading
Loading
+75 −4
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@
#include <asm/mach/irq.h>
#include <asm/mach/irq.h>
#include <linux/regulator/consumer.h>
#include <linux/regulator/consumer.h>
#include <linux/of_gpio.h>
#include <linux/of_gpio.h>
#include <linux/sensors.h>


#ifdef CONFIG_HAS_EARLYSUSPEND
#ifdef CONFIG_HAS_EARLYSUSPEND
#include <linux/earlysuspend.h>
#include <linux/earlysuspend.h>
@@ -60,7 +61,7 @@
#define ISR_INFO(dev, fmt, arg...)
#define ISR_INFO(dev, fmt, arg...)
#endif
#endif


#define SENSOR_NAME                 "bma2x2"
#define SENSOR_NAME                 "accelerometer"
#define ABSMIN                      -512
#define ABSMIN                      -512
#define ABSMAX                      512
#define ABSMAX                      512
#define SLOPE_THRESHOLD_VALUE       32
#define SLOPE_THRESHOLD_VALUE       32
@@ -72,8 +73,10 @@
#define SLOPE_X_INDEX               5
#define SLOPE_X_INDEX               5
#define SLOPE_Y_INDEX               6
#define SLOPE_Y_INDEX               6
#define SLOPE_Z_INDEX               7
#define SLOPE_Z_INDEX               7
#define BMA2X2_MIN_DELAY            1
#define BMA2X2_MAX_DELAY            200
#define BMA2X2_MAX_DELAY            200
#define BMA2X2_RANGE_SET            3 /* +/- 2G */
#define BMA2X2_RANGE_SET            3 /* +/- 2G */
#define BMA2X2_RANGE_SHIFT          4 /* shift 4 bits for 2G */
#define BMA2X2_BW_SET               12 /* 125HZ  */
#define BMA2X2_BW_SET               12 /* 125HZ  */


#define I2C_RETRY_DELAY()           usleep_range(1000, 2000)
#define I2C_RETRY_DELAY()           usleep_range(1000, 2000)
@@ -1365,6 +1368,11 @@ static const struct interrupt_map_t int_map[] = {
#define BMA2x2_VIO_MIN_UV       1500000
#define BMA2x2_VIO_MIN_UV       1500000
#define BMA2x2_VIO_MAX_UV       3400000
#define BMA2x2_VIO_MAX_UV       3400000


/* Polling delay in msecs */
#define POLL_INTERVAL_MIN_MS	1
#define POLL_INTERVAL_MAX_MS	10000
#define POLL_DEFAULT_INTERVAL_MS 200

struct bma2x2_type_map_t {
struct bma2x2_type_map_t {


	/*! bma2x2 sensor chip id */
	/*! bma2x2 sensor chip id */
@@ -1435,6 +1443,7 @@ struct bma2x2_platform_data {


struct bma2x2_data {
struct bma2x2_data {
	struct i2c_client *bma2x2_client;
	struct i2c_client *bma2x2_client;
	struct sensors_classdev cdev;
	atomic_t delay;
	atomic_t delay;
	atomic_t enable;
	atomic_t enable;
	atomic_t selftest_result;
	atomic_t selftest_result;
@@ -1496,6 +1505,23 @@ static int bma2x2_set_fifo_mode(struct i2c_client *client, u8 fifo_mode);
static int bma2x2_normal_to_suspend(struct bma2x2_data *bma2x2,
static int bma2x2_normal_to_suspend(struct bma2x2_data *bma2x2,
				unsigned char data1, unsigned char data2);
				unsigned char data1, unsigned char data2);


static struct sensors_classdev sensors_cdev = {
		.name = "bma2x2-accel",
		.vendor = "bosch",
		.version = 1,
		.handle = SENSORS_ACCELERATION_HANDLE,
		.type = SENSOR_TYPE_ACCELEROMETER,
		.max_range = "156.8",	/* 16g */
		.resolution = "0.156",	/* 15.63mg */
		.sensor_power = "0.13",	/* typical value */
		.min_delay = POLL_INTERVAL_MIN_MS * 1000, /* in microseconds */
		.fifo_reserved_event_count = 0,
		.fifo_max_event_count = 0,
		.enabled = 0,
		.delay_msec = POLL_DEFAULT_INTERVAL_MS, /* in millisecond */
		.sensors_enable = NULL,
		.sensors_poll_delay = NULL,
};


/*Remapping for BMA2X2*/
/*Remapping for BMA2X2*/


@@ -4785,6 +4811,9 @@ static int bma2x2_read_accel_xyz(struct i2c_client *client,
#endif
#endif


	bma2x2_remap_sensor_data(acc, client_data);
	bma2x2_remap_sensor_data(acc, client_data);
	acc->x = acc->x << BMA2X2_RANGE_SHIFT;
	acc->y = acc->y << BMA2X2_RANGE_SHIFT;
	acc->z = acc->z << BMA2X2_RANGE_SHIFT;
	return comres;
	return comres;
}
}


@@ -5085,6 +5114,32 @@ static ssize_t bma2x2_enable_store(struct device *dev,


	return count;
	return count;
}
}

static int bma2x2_cdev_enable(struct sensors_classdev *sensors_cdev,
				unsigned int enable)
{
	struct bma2x2_data *data = container_of(sensors_cdev,
					struct bma2x2_data, cdev);

	bma2x2_set_enable(&data->bma2x2_client->dev, enable);
	return 0;
}

static int bma2x2_cdev_poll_delay(struct sensors_classdev *sensors_cdev,
				unsigned int delay_ms)
{
	struct bma2x2_data *data = container_of(sensors_cdev,
					struct bma2x2_data, cdev);

	if (delay_ms < BMA2X2_MIN_DELAY)
		delay_ms = BMA2X2_MIN_DELAY;
	if (delay_ms > BMA2X2_MAX_DELAY)
		delay_ms = BMA2X2_MAX_DELAY;
	atomic_set(&data->delay, (unsigned int) delay_ms);

	return 0;
}

static ssize_t bma2x2_fast_calibration_x_show(struct device *dev,
static ssize_t bma2x2_fast_calibration_x_show(struct device *dev,
		struct device_attribute *attr, char *buf)
		struct device_attribute *attr, char *buf)
{
{
@@ -7041,10 +7096,25 @@ static int bma2x2_probe(struct i2c_client *client,
			(unsigned long)data);
			(unsigned long)data);
#endif
#endif


	data->cdev = sensors_cdev;
	data->cdev.min_delay = POLL_INTERVAL_MIN_MS * 1000;
	data->cdev.delay_msec = pdata->poll_interval;
	data->cdev.sensors_enable = bma2x2_cdev_enable;
	data->cdev.sensors_poll_delay = bma2x2_cdev_poll_delay;
	err = sensors_classdev_register(&client->dev, &data->cdev);
	if (err) {
		dev_err(&client->dev, "create class device file failed!\n");
		err = -EINVAL;
		goto remove_bst_acc_sysfs_exit;
	}

	dev_notice(&client->dev, "BMA2x2 driver probe successfully");
	dev_notice(&client->dev, "BMA2x2 driver probe successfully");


	return 0;
	return 0;


remove_bst_acc_sysfs_exit:
	sysfs_remove_group(&data->bst_acc->dev.kobj,
			&bma2x2_attribute_group);
bst_free_exit:
bst_free_exit:
	bst_unregister_device(dev_acc);
	bst_unregister_device(dev_acc);


@@ -7138,7 +7208,7 @@ static int bma2x2_remove(struct i2c_client *client)
{
{
	struct bma2x2_data *data = i2c_get_clientdata(client);
	struct bma2x2_data *data = i2c_get_clientdata(client);


	bma2x2_set_enable(&client->dev, 0);
	sensors_classdev_unregister(&data->cdev);
#ifdef CONFIG_HAS_EARLYSUSPEND
#ifdef CONFIG_HAS_EARLYSUSPEND
	unregister_early_suspend(&data->early_suspend);
	unregister_early_suspend(&data->early_suspend);
#endif
#endif
@@ -7164,6 +7234,7 @@ static int bma2x2_remove(struct i2c_client *client)
		input_free_device(data->input);
		input_free_device(data->input);
	}
	}


	bma2x2_set_enable(&client->dev, 0);
	bma2x2_power_ctl(data, false);
	bma2x2_power_ctl(data, false);
	bma2x2_power_deinit(data);
	bma2x2_power_deinit(data);
	i2c_set_clientdata(client, NULL);
	i2c_set_clientdata(client, NULL);