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

Commit 6052609f authored by Oliver Wang's avatar Oliver Wang
Browse files

input: sensors: add sensors class support for akm09911 sensor



The userspace sensor HAL use sensors class to interact with linux
kernel drivers. Thus add this feature in order to enable the ecompass
sensor.

Change-Id: I53a774b978ed32da60ea4a6cbd1fc7b8845dd664
Signed-off-by: default avatarOliver Wang <mengmeng@codeaurora.org>
parent abca3684
Loading
Loading
Loading
Loading
+59 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ struct akm_compass_data {
	struct pinctrl		*pinctrl;
	struct pinctrl_state *pin_default;
	struct pinctrl_state *pin_reset;
	struct sensors_classdev	cdev;

	wait_queue_head_t	drdy_wq;
	wait_queue_head_t	open_wq;
@@ -89,6 +90,24 @@ struct akm_compass_data {
	struct regulator *vio;
};

static struct sensors_classdev sensors_cdev = {
	.name = "akm09911-mag",
	.vendor = "Asahi Kasei Microdevices Corporation",
	.version = 1,
	.handle = SENSORS_MAGNETIC_FIELD_HANDLE,
	.type = SENSOR_TYPE_MAGNETIC_FIELD,
	.max_range = "1228.8",
	.resolution = "0.06",
	.sensor_power = "0.35",
	.min_delay = 10000,
	.fifo_reserved_event_count = 0,
	.fifo_max_event_count = 0,
	.enabled = 0,
	.delay_msec = 10,
	.sensors_enable = NULL,
	.sensors_poll_delay = NULL,
};

static struct akm_compass_data *s_akm;

/***** I2C I/O function ***********************************************/
@@ -829,6 +848,23 @@ static void akm_compass_sysfs_update_status(
		en, atomic_read(&akm->active));
}

static int akm_enable_set(struct sensors_classdev *sensors_cdev,
		unsigned int enable)
{

	struct akm_compass_data *akm = container_of(sensors_cdev,
			struct akm_compass_data, cdev);

	mutex_lock(&akm->val_mutex);
	akm->enable_flag &= ~(1<<MAG_DATA_FLAG);
	akm->enable_flag |= ((uint32_t)(enable))<<MAG_DATA_FLAG;
	mutex_unlock(&akm->val_mutex);

	akm_compass_sysfs_update_status(akm);

	return 0;
}

static ssize_t akm_compass_sysfs_enable_show(
	struct akm_compass_data *akm, char *buf, int pos)
{
@@ -913,6 +949,19 @@ static ssize_t akm_enable_fusion_store(
}

/***** sysfs delay **************************************************/
static int akm_poll_delay_set(struct sensors_classdev *sensors_cdev,
		unsigned int delay_msec)
{
	struct akm_compass_data *akm = container_of(sensors_cdev,
			struct akm_compass_data, cdev);

	mutex_lock(&akm->val_mutex);
	akm->delay[MAG_DATA_FLAG] = delay_msec * 1000000;
	mutex_unlock(&akm->val_mutex);

	return 0;
}

static ssize_t akm_compass_sysfs_delay_show(
	struct akm_compass_data *akm, char *buf, int pos)
{
@@ -1706,6 +1755,16 @@ int akm_compass_probe(struct i2c_client *client, const struct i2c_device_id *id)
		goto exit6;
	}

	s_akm->cdev = sensors_cdev;
	s_akm->cdev.sensors_enable = akm_enable_set;
	s_akm->cdev.sensors_poll_delay = akm_poll_delay_set;
	err = sensors_classdev_register(&client->dev, &s_akm->cdev);

	if (err) {
		dev_err(&client->dev, "class device create failed: %d\n", err);
		goto exit6;
	}

	dev_info(&client->dev, "successfully probed.");
	return 0;