Commit a5327b00 authored by Brett Witherspoon's avatar Brett Witherspoon Committed by Maureen Helm
Browse files

drivers: adxl362: clear status independently and before mapping



Clear status bits before mapping them to the interrupt pin, so the
interrupt will occur on the next event instead of a pending event. Also
the status bits are cleared independently, because the threshold and
data ready functions can be enabled simultaneously.

Signed-off-by: default avatarBrett Witherspoon <spoonb@cdspooner.com>
parent ed474e88
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -135,6 +135,13 @@ int adxl362_get_status(struct device *dev, u8_t *status)
{
	return adxl362_get_reg(dev, status, ADXL362_REG_STATUS, 1);
}

int adxl362_clear_data_ready(struct device *dev)
{
	u8_t buf;
	/* Reading any data register clears the data ready interrupt */
	return adxl362_get_reg(dev, &buf, ADXL362_REG_XDATA, 1);
}
#endif

static int adxl362_software_reset(struct device *dev)
+2 −0
Original line number Diff line number Diff line
@@ -249,6 +249,8 @@ int adxl362_trigger_set(struct device *dev,
int adxl362_init_interrupt(struct device *dev);

int adxl362_set_interrupt_mode(struct device *dev, u8_t mode);

int adxl362_clear_data_ready(struct device *dev);
#endif /* CONFIG_ADT7420_TRIGGER */

#endif /* ZEPHYR_DRIVERS_SENSOR_ADXL362_ADXL362_H_ */
+4 −11
Original line number Diff line number Diff line
@@ -85,7 +85,6 @@ int adxl362_trigger_set(struct device *dev,
{
	struct adxl362_data *drv_data = dev->driver_data;
	u8_t int_mask, int_en, status_buf;
	int ret;

	switch (trig->type) {
	case SENSOR_TRIG_THRESHOLD:
@@ -95,6 +94,8 @@ int adxl362_trigger_set(struct device *dev,
		k_mutex_unlock(&drv_data->trigger_mutex);
		int_mask = ADXL362_INTMAP1_ACT |
			   ADXL362_INTMAP1_INACT;
		/* Clear activity and inactivity interrupts */
		adxl362_get_status(dev, &status_buf);
		break;
	case SENSOR_TRIG_DATA_READY:
		k_mutex_lock(&drv_data->trigger_mutex, K_FOREVER);
@@ -102,6 +103,7 @@ int adxl362_trigger_set(struct device *dev,
		drv_data->drdy_trigger = *trig;
		k_mutex_unlock(&drv_data->trigger_mutex);
		int_mask = ADXL362_INTMAP1_DATA_READY;
		adxl362_clear_data_ready(dev);
		break;
	default:
		LOG_ERR("Unsupported sensor trigger");
@@ -114,16 +116,7 @@ int adxl362_trigger_set(struct device *dev,
		int_en = 0U;
	}

	ret = adxl362_reg_write_mask(dev, ADXL362_REG_INTMAP1,
				     int_mask, int_en);

	if (ret) {
		return -EFAULT;
	}

	ret = adxl362_get_status(dev, &status_buf);

	return ret;
	return adxl362_reg_write_mask(dev, ADXL362_REG_INTMAP1, int_mask, int_en);
}

int adxl362_init_interrupt(struct device *dev)