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

Commit 4aee61b8 authored by Oliver Wang's avatar Oliver Wang
Browse files

input: sensors: correct the reset procedure of akm09911



The reset pin of akm09911 should be set low & high in order to reset
it. It's still needed to call GPIOLIB to assign a gpio's value when
pinctrl is enabled.

Change-Id: Iadb38a5809ef7f0ede77b35596afd25d2189ffca
Signed-off-by: default avatarOliver Wang <mengmeng@codeaurora.org>
parent 5bc094e1
Loading
Loading
Loading
Loading
+12 −27
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ struct akm_compass_data {
	struct class		*compass;
	struct pinctrl		*pinctrl;
	struct pinctrl_state	*pin_default;
	struct pinctrl_state *pin_reset;
	struct pinctrl_state	*pin_sleep;
	struct sensors_classdev	cdev;

	wait_queue_head_t	drdy_wq;
@@ -258,7 +258,6 @@ static int AKECS_Reset(
	int hard)
{
	int err;
	struct i2c_client *client = akm->i2c;

#if AKM_HAS_RESET
	uint8_t buffer[2];
@@ -267,26 +266,10 @@ static int AKECS_Reset(
	mutex_lock(&akm->sensor_mutex);

	if (hard != 0) {
		if (!IS_ERR_OR_NULL(s_akm->pinctrl)) {
			err = pinctrl_select_state(s_akm->pinctrl,
					s_akm->pin_reset);
			if (err) {
				dev_err(&client->dev, "can't select state!!\n");
				goto exit;
			}
			udelay(5);
			err = pinctrl_select_state(s_akm->pinctrl,
					s_akm->pin_default);
			if (err) {
				dev_err(&client->dev, "can't select state!!\n");
				goto exit;
			}
		} else {
		gpio_set_value(akm->gpio_rstn, 0);
		udelay(5);
		gpio_set_value(akm->gpio_rstn, 1);
		/* No error is returned */
		}
		err = 0;
	} else {
		buffer[0] = AKM_REG_RESET;
@@ -304,7 +287,6 @@ static int AKECS_Reset(
	/* Clear status */
	akm->is_busy = 0;
	atomic_set(&akm->drdy, 0);
exit:
	mutex_unlock(&akm->sensor_mutex);
	/***** unlock *****/

@@ -1609,10 +1591,10 @@ static int akm_pinctrl_init(struct akm_compass_data *s_akm)
		return PTR_ERR(s_akm->pin_default);
	}

	s_akm->pin_reset = pinctrl_lookup_state(s_akm->pinctrl, "reset");
	if (IS_ERR_OR_NULL("s_akm->pin_reset")) {
	s_akm->pin_sleep = pinctrl_lookup_state(s_akm->pinctrl, "suspend");
	if (IS_ERR_OR_NULL(s_akm->pin_sleep)) {
		dev_err(&client->dev, "Failed to look up reset state\n");
		return PTR_ERR(s_akm->pin_reset);
		return PTR_ERR(s_akm->pin_sleep);
	}

	return 0;
@@ -1701,6 +1683,9 @@ int akm_compass_probe(struct i2c_client *client, const struct i2c_device_id *id)
		}
	}

	/* Pull up the reset pin */
	AKECS_Reset(s_akm, 1);

	/* check connection */
	err = akm_compass_power_set(s_akm, 1);
	if (err < 0)