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

Commit 83edf3ce authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "input: sensors: modify resolution for bma2x2 supported sensors"

parents 30cb53e4 da51ff74
Loading
Loading
Loading
Loading
+58 −15
Original line number Diff line number Diff line
@@ -60,6 +60,8 @@
#define ISR_INFO(dev, fmt, arg...)
#endif

#define BMA2X2_SENSOR_IDENTIFICATION_ENABLE

#define SENSOR_NAME                 "bma2x2-accel"
#define ABSMIN                      -512
#define ABSMAX                      512
@@ -1373,6 +1375,8 @@ static const struct interrupt_map_t int_map[] = {
#define POLL_INTERVAL_MAX_MS	4000
#define POLL_DEFAULT_INTERVAL_MS 200

#define MAX_RANGE_MAP	4

struct bma2x2_type_map_t {

	/*! bma2x2 sensor chip id */
@@ -1383,15 +1387,18 @@ struct bma2x2_type_map_t {

	/*! bma2x2 sensor name */
	const char *sensor_name;

	/*! bma2x2 sensor resolution */
	const char *resolution;
};

static const struct bma2x2_type_map_t sensor_type_map[] = {

	{BMA255_CHIP_ID, BMA255_TYPE, "BMA255/254"},
	{BMA355_CHIP_ID, BMA255_TYPE, "BMA355"},
	{BMA250E_CHIP_ID, BMA250E_TYPE, "BMA250E"},
	{BMA222E_CHIP_ID, BMA222E_TYPE, "BMA222E"},
	{BMA280_CHIP_ID, BMA280_TYPE, "BMA280"},
	{BMA255_CHIP_ID, BMA255_TYPE, "BMA255/254", "0.00957031"},
	{BMA355_CHIP_ID, BMA255_TYPE, "BMA355", "0.00957031"},
	{BMA250E_CHIP_ID, BMA250E_TYPE, "BMA250E", "0.03828125"},
	{BMA222E_CHIP_ID, BMA222E_TYPE, "BMA222E", "0.153125"},
	{BMA280_CHIP_ID, BMA280_TYPE, "BMA280", "0.00239258"},

};

@@ -1452,6 +1459,7 @@ struct bma2x2_data {
	atomic_t enable;
	atomic_t selftest_result;
	unsigned int chip_id;
	unsigned int chip_type;
	unsigned int fifo_count;
	unsigned char fifo_datasel;
	unsigned char mode;
@@ -1471,6 +1479,7 @@ struct bma2x2_data {
	bool power_enabled;
	unsigned char bandwidth;
	unsigned char range;
	int sensitivity;
#ifdef CONFIG_HAS_EARLYSUSPEND
	struct early_suspend early_suspend;
#endif
@@ -1517,6 +1526,7 @@ static int bma2x2_store_state(struct i2c_client *client,
			struct bma2x2_data *data);
static int bma2x2_power_ctl(struct bma2x2_data *data, bool on);
static int bma2x2_eeprom_prog(struct i2c_client *client);
static int bma2x2_get_sensitivity(struct bma2x2_data *bma2x2, int range);

static struct sensors_classdev sensors_cdev = {
		.name = "bma2x2-accel",
@@ -1525,7 +1535,7 @@ static struct sensors_classdev sensors_cdev = {
		.handle = SENSORS_ACCELERATION_HANDLE,
		.type = SENSOR_TYPE_ACCELEROMETER,
		.max_range = "156.8",	/* 16g */
		.resolution = "0.156",	/* 15.63mg */
		.resolution = "0.153125",	/* 15.6mg */
		.sensor_power = "0.13",	/* typical value */
		.min_delay = POLL_INTERVAL_MIN_MS * 1000, /* in microseconds */
		.max_latency = POLL_INTERVAL_MAX_MS,
@@ -1554,6 +1564,12 @@ bst_axis_remap_tab_dft[MAX_AXIS_REMAP_TAB_SZ] = {
	{  1,    0,    2,     1,      1,     -1 }, /* P7 */
};

static const int bosch_sensor_range_map[MAX_RANGE_MAP] = {
	0, /*2G range*/
	1, /*4G range*/
	2, /*8G range*/
	3  /*16G range*/
};

static void bst_remap_sensor_data(struct bosch_sensor_data *data,
		const struct bosch_sensor_axis_remap *remap)
@@ -1702,9 +1718,9 @@ static int bma2x2_check_chip_id(struct i2c_client *client,
					sensor_type_map[i].sensor_type;
				data->chip_id = chip_id;
				dev_dbg(&client->dev,
					"Bosch Sensortec Device detected,"
					" HW IC name: %s\n",
					"Bosch Sensortec Device detected, HW IC name: %s\n",
					sensor_type_map[i].sensor_name);
				data->chip_type = i;
				return err;
			}
		}
@@ -2974,6 +2990,7 @@ static int bma2x2_set_range(struct i2c_client *client, unsigned char Range)
{
	int comres = 0;
	unsigned char data1;
	struct bma2x2_data *bma2x2 = i2c_get_clientdata(client);

	if ((Range == 3) || (Range == 5) || (Range == 8) || (Range == 12)) {
		comres = bma2x2_smbus_read_byte(client, BMA2X2_RANGE_SEL_REG,
@@ -3000,6 +3017,7 @@ static int bma2x2_set_range(struct i2c_client *client, unsigned char Range)
		}
		comres += bma2x2_smbus_write_byte(client, BMA2X2_RANGE_SEL_REG,
				&data1);
		bma2x2_get_sensitivity(bma2x2, Range);
	} else {
		comres = -1;
	}
@@ -4799,6 +4817,29 @@ const int bma2x2_sensor_bitwidth[] = {
	12,  10,  8, 14
};

static int bma2x2_get_sensitivity(struct bma2x2_data *bma2x2, int range)
{

	switch (range) {
	case BMA2X2_RANGE_2G:
		bma2x2->sensitivity = bosch_sensor_range_map[0];
		break;
	case BMA2X2_RANGE_4G:
		bma2x2->sensitivity = bosch_sensor_range_map[1];
		break;
	case BMA2X2_RANGE_8G:
		bma2x2->sensitivity = bosch_sensor_range_map[2];
		break;
	case BMA2X2_RANGE_16G:
		bma2x2->sensitivity = bosch_sensor_range_map[3];
		break;
	default:
		bma2x2->sensitivity = bosch_sensor_range_map[0];
		break;
	}
	return 0;
}

static int bma2x2_read_accel_xyz(struct i2c_client *client,
		signed char sensor_type, struct bma2x2acc *acc)
{
@@ -4826,9 +4867,6 @@ static int bma2x2_read_accel_xyz(struct i2c_client *client,
#endif

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

@@ -4846,9 +4884,12 @@ static void bma2x2_report_axis_data(struct bma2x2_data *bma2x2)
			"read accel data failed! err = %d\n", err);
		return;
	}
	input_report_abs(bma2x2->input, ABS_X, acc.x);
	input_report_abs(bma2x2->input, ABS_Y, acc.y);
	input_report_abs(bma2x2->input, ABS_Z, acc.z);
	input_report_abs(bma2x2->input, ABS_X,
			(int)acc.x << bma2x2->sensitivity);
	input_report_abs(bma2x2->input, ABS_Y,
			(int)acc.y << bma2x2->sensitivity);
	input_report_abs(bma2x2->input, ABS_Z,
			(int)acc.z << bma2x2->sensitivity);
	input_event(bma2x2->input, EV_SYN, SYN_TIME_SEC,
			ktime_to_timespec(ts).tv_sec);
	input_event(bma2x2->input, EV_SYN, SYN_TIME_NSEC,
@@ -7131,6 +7172,7 @@ static int bma2x2_probe(struct i2c_client *client,
	mutex_init(&data->enable_mutex);
	data->bandwidth = BMA2X2_BW_SET;
	data->range = BMA2X2_RANGE_SET;
	data->sensitivity = bosch_sensor_range_map[0];
	err = bma2x2_open_init(client, data);
	if (err < 0) {
		err = -EINVAL;
@@ -7399,6 +7441,7 @@ static int bma2x2_probe(struct i2c_client *client,
	data->cdev.sensors_enable = bma2x2_cdev_enable;
	data->cdev.sensors_poll_delay = bma2x2_cdev_poll_delay;
	data->cdev.sensors_self_test = bma2x2_self_calibration_xyz;
	data->cdev.resolution = sensor_type_map[data->chip_type].resolution;
	err = sensors_classdev_register(&client->dev, &data->cdev);
	if (err) {
		dev_err(&client->dev, "create class device file failed!\n");