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

Commit df47c0a6 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'iio-fixes-for-4.11e' of...

Merge tag 'iio-fixes-for-4.11e' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-next

Jonathan writes:

Fifth set of IIO fixes for the 4.11 cycle.

As these are rather late in the cycle, they may sneak over into 4.12.
There is a fix for a regression caused by another fix (hid sensors
hardware seems to vary a lot in how various corner cases are handled).

* ad7303
  - fix channel description. Numeric values were being passed as characters
  presumably leading to garbage from the userspace interface.
* as3935
  - the write data macro was wrong so fix it.
* bmp280
  - incorrect handling of negative values as being unsigned broke humidity
  calculation.
* hid-sensor
  - Restore the poll and hysteresis values after resume as some hardware
  doesn't do it.
* stm32-trigger
  - buglet in reading the sampling frequency
parents d47e5382 ed3730c4
Loading
Loading
Loading
Loading
+24 −2
Original line number Original line Diff line number Diff line
@@ -232,7 +232,15 @@ int hid_sensor_write_samp_freq_value(struct hid_sensor_common *st,
	if (ret < 0 || value < 0)
	if (ret < 0 || value < 0)
		ret = -EINVAL;
		ret = -EINVAL;


	return ret;
	ret = sensor_hub_get_feature(st->hsdev,
				     st->poll.report_id,
				     st->poll.index, sizeof(value), &value);
	if (ret < 0 || value < 0)
		return -EINVAL;

	st->poll_interval = value;

	return 0;
}
}
EXPORT_SYMBOL(hid_sensor_write_samp_freq_value);
EXPORT_SYMBOL(hid_sensor_write_samp_freq_value);


@@ -277,7 +285,16 @@ int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,
	if (ret < 0 || value < 0)
	if (ret < 0 || value < 0)
		ret = -EINVAL;
		ret = -EINVAL;


	return ret;
	ret = sensor_hub_get_feature(st->hsdev,
				     st->sensitivity.report_id,
				     st->sensitivity.index, sizeof(value),
				     &value);
	if (ret < 0 || value < 0)
		return -EINVAL;

	st->raw_hystersis = value;

	return 0;
}
}
EXPORT_SYMBOL(hid_sensor_write_raw_hyst_value);
EXPORT_SYMBOL(hid_sensor_write_raw_hyst_value);


@@ -380,6 +397,9 @@ int hid_sensor_get_reporting_interval(struct hid_sensor_hub_device *hsdev,
	/* Default unit of measure is milliseconds */
	/* Default unit of measure is milliseconds */
	if (st->poll.units == 0)
	if (st->poll.units == 0)
		st->poll.units = HID_USAGE_SENSOR_UNITS_MILLISECOND;
		st->poll.units = HID_USAGE_SENSOR_UNITS_MILLISECOND;

	st->poll_interval = -1;

	return 0;
	return 0;


}
}
@@ -410,6 +430,8 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev,
			HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS,
			HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS,
			 &st->sensitivity);
			 &st->sensitivity);


	st->raw_hystersis = -1;

	sensor_hub_input_get_attribute_info(hsdev,
	sensor_hub_input_get_attribute_info(hsdev,
					    HID_INPUT_REPORT, usage_id,
					    HID_INPUT_REPORT, usage_id,
					    HID_USAGE_SENSOR_TIME_TIMESTAMP,
					    HID_USAGE_SENSOR_TIME_TIMESTAMP,
+17 −3
Original line number Original line Diff line number Diff line
@@ -51,6 +51,8 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)
			st->report_state.report_id,
			st->report_state.report_id,
			st->report_state.index,
			st->report_state.index,
			HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM);
			HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM);

		poll_value = hid_sensor_read_poll_value(st);
	} else {
	} else {
		int val;
		int val;


@@ -87,9 +89,7 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)
	sensor_hub_get_feature(st->hsdev, st->power_state.report_id,
	sensor_hub_get_feature(st->hsdev, st->power_state.report_id,
			       st->power_state.index,
			       st->power_state.index,
			       sizeof(state_val), &state_val);
			       sizeof(state_val), &state_val);
	if (state)
	if (state && poll_value)
		poll_value = hid_sensor_read_poll_value(st);
	if (poll_value > 0)
		msleep_interruptible(poll_value * 2);
		msleep_interruptible(poll_value * 2);


	return 0;
	return 0;
@@ -127,6 +127,20 @@ static void hid_sensor_set_power_work(struct work_struct *work)
	struct hid_sensor_common *attrb = container_of(work,
	struct hid_sensor_common *attrb = container_of(work,
						       struct hid_sensor_common,
						       struct hid_sensor_common,
						       work);
						       work);

	if (attrb->poll_interval >= 0)
		sensor_hub_set_feature(attrb->hsdev, attrb->poll.report_id,
				       attrb->poll.index,
				       sizeof(attrb->poll_interval),
				       &attrb->poll_interval);

	if (attrb->raw_hystersis >= 0)
		sensor_hub_set_feature(attrb->hsdev,
				       attrb->sensitivity.report_id,
				       attrb->sensitivity.index,
				       sizeof(attrb->raw_hystersis),
				       &attrb->raw_hystersis);

	_hid_sensor_power_state(attrb, true);
	_hid_sensor_power_state(attrb, true);
}
}


+3 −3
Original line number Original line Diff line number Diff line
@@ -184,9 +184,9 @@ static const struct iio_chan_spec_ext_info ad7303_ext_info[] = {
	.address = (chan),					\
	.address = (chan),					\
	.scan_type = {						\
	.scan_type = {						\
		.sign = 'u',					\
		.sign = 'u',					\
		.realbits = '8',				\
		.realbits = 8,					\
		.storagebits = '8',				\
		.storagebits = 8,				\
		.shift = '0',					\
		.shift = 0,					\
	},							\
	},							\
	.ext_info = ad7303_ext_info,				\
	.ext_info = ad7303_ext_info,				\
}
}
+6 −5
Original line number Original line Diff line number Diff line
@@ -175,11 +175,12 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data,
	}
	}
	H6 = sign_extend32(tmp, 7);
	H6 = sign_extend32(tmp, 7);


	var = ((s32)data->t_fine) - 76800;
	var = ((s32)data->t_fine) - (s32)76800;
	var = ((((adc_humidity << 14) - (H4 << 20) - (H5 * var)) + 16384) >> 15)
	var = ((((adc_humidity << 14) - (H4 << 20) - (H5 * var))
		* (((((((var * H6) >> 10) * (((var * H3) >> 11) + 32768)) >> 10)
		+ (s32)16384) >> 15) * (((((((var * H6) >> 10)
		+ 2097152) * H2 + 8192) >> 14);
		* (((var * (s32)H3) >> 11) + (s32)32768)) >> 10)
	var -= ((((var >> 15) * (var >> 15)) >> 7) * H1) >> 4;
		+ (s32)2097152) * H2 + 8192) >> 14);
	var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)H1) >> 4;


	return var >> 12;
	return var >> 12;
};
};
+1 −2
Original line number Original line Diff line number Diff line
@@ -50,7 +50,6 @@
#define AS3935_TUNE_CAP		0x08
#define AS3935_TUNE_CAP		0x08
#define AS3935_CALIBRATE	0x3D
#define AS3935_CALIBRATE	0x3D


#define AS3935_WRITE_DATA	BIT(15)
#define AS3935_READ_DATA	BIT(14)
#define AS3935_READ_DATA	BIT(14)
#define AS3935_ADDRESS(x)	((x) << 8)
#define AS3935_ADDRESS(x)	((x) << 8)


@@ -105,7 +104,7 @@ static int as3935_write(struct as3935_state *st,
{
{
	u8 *buf = st->buf;
	u8 *buf = st->buf;


	buf[0] = (AS3935_WRITE_DATA | AS3935_ADDRESS(reg)) >> 8;
	buf[0] = AS3935_ADDRESS(reg) >> 8;
	buf[1] = val;
	buf[1] = val;


	return spi_write(st->spi, buf, 2);
	return spi_write(st->spi, buf, 2);
Loading