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

Commit 82c94e86 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: add sensors class support for akm09911 sensor"

parents 599ec3da 6052609f
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;