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

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

Merge tag 'iio-fixes-for-3.14a' of...

Merge tag 'iio-fixes-for-3.14a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus

Jonathan writes:

First set of IIO fixes for the 3.14 cycle.

Included is the patch previously set as the fourth round for 3.13 which was
to late to be appropriate.

* Another endian fix (ad799x adc) due to missuse of the IIO_ST macro (which
  is going away very shortly)
* A reversed error check in ad5933 which will make the probe fail.
* A buffer overflow in the example code in the documentation.
* ad799x was freeing an irq that might or might not have been requested.
* tsl2563 was checking the wrong element of chan_spec for modifiers. Thus some
  sysfs reads would give the wrong values.
* A missing dependency on HAS_IOMEM in spear_adc and lpc32xx was causing some
  test build failures (on s390 and perhaps elsewhere).

I also have a few fixes queued up for things that went in during the 3.14
merge window which will follow as a separate pull request (to avoid rebasing
my tree).
parents 5a819ed6 8c314da5
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -460,10 +460,14 @@ static int tsl2563_write_raw(struct iio_dev *indio_dev,
{
	struct tsl2563_chip *chip = iio_priv(indio_dev);

	if (chan->channel == IIO_MOD_LIGHT_BOTH)
	if (mask != IIO_CHAN_INFO_CALIBSCALE)
		return -EINVAL;
	if (chan->channel2 == IIO_MOD_LIGHT_BOTH)
		chip->calib0 = calib_from_sysfs(val);
	else
	else if (chan->channel2 == IIO_MOD_LIGHT_IR)
		chip->calib1 = calib_from_sysfs(val);
	else
		return -EINVAL;

	return 0;
}
@@ -472,14 +476,14 @@ static int tsl2563_read_raw(struct iio_dev *indio_dev,
			    struct iio_chan_spec const *chan,
			    int *val,
			    int *val2,
			    long m)
			    long mask)
{
	int ret = -EINVAL;
	u32 calib0, calib1;
	struct tsl2563_chip *chip = iio_priv(indio_dev);

	mutex_lock(&chip->lock);
	switch (m) {
	switch (mask) {
	case IIO_CHAN_INFO_RAW:
	case IIO_CHAN_INFO_PROCESSED:
		switch (chan->type) {
@@ -498,7 +502,7 @@ static int tsl2563_read_raw(struct iio_dev *indio_dev,
			ret = tsl2563_get_adc(chip);
			if (ret)
				goto error_ret;
			if (chan->channel == 0)
			if (chan->channel2 == IIO_MOD_LIGHT_BOTH)
				*val = chip->data0;
			else
				*val = chip->data1;
@@ -510,7 +514,7 @@ static int tsl2563_read_raw(struct iio_dev *indio_dev,
		break;

	case IIO_CHAN_INFO_CALIBSCALE:
		if (chan->channel == 0)
		if (chan->channel2 == IIO_MOD_LIGHT_BOTH)
			*val = calib_to_sysfs(chip->calib0);
		else
			*val = calib_to_sysfs(chip->calib1);
+3 −3
Original line number Diff line number Diff line
@@ -77,7 +77,6 @@ struct iio_channel_info {
	uint64_t mask;
	unsigned be;
	unsigned is_signed;
	unsigned enabled;
	unsigned location;
};

@@ -335,6 +334,7 @@ inline int build_channel_array(const char *device_dir,
	while (ent = readdir(dp), ent != NULL) {
		if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"),
			   "_en") == 0) {
			int current_enabled = 0;
			current = &(*ci_array)[count++];
			ret = asprintf(&filename,
				       "%s/%s", scan_el_dir, ent->d_name);
@@ -350,10 +350,10 @@ inline int build_channel_array(const char *device_dir,
				ret = -errno;
				goto error_cleanup_array;
			}
			fscanf(sysfsfp, "%u", &current->enabled);
			fscanf(sysfsfp, "%u", &current_enabled);
			fclose(sysfsfp);

			if (!current->enabled) {
			if (!current_enabled) {
				free(filename);
				count--;
				continue;
+9 −2
Original line number Diff line number Diff line
@@ -409,7 +409,13 @@ static const struct iio_event_spec ad799x_events[] = {
	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
	.scan_index = (_index), \
	.scan_type = IIO_ST('u', _realbits, 16, 12 - (_realbits)), \
	.scan_type = { \
		.sign = 'u', \
		.realbits = (_realbits), \
		.storagebits = 16, \
		.shift = 12 - (_realbits), \
		.endianness = IIO_BE, \
	}, \
	.event_spec = _ev_spec, \
	.num_event_specs = _num_ev_spec, \
}
@@ -588,6 +594,7 @@ static int ad799x_probe(struct i2c_client *client,
	return 0;

error_free_irq:
	if (client->irq > 0)
		free_irq(client->irq, indio_dev);
error_cleanup_ring:
	ad799x_ring_cleanup(indio_dev);
+1 −1
Original line number Diff line number Diff line
@@ -629,7 +629,7 @@ static int ad5933_register_ring_funcs_and_init(struct iio_dev *indio_dev)
	struct iio_buffer *buffer;

	buffer = iio_kfifo_allocate(indio_dev);
	if (buffer)
	if (!buffer)
		return -ENOMEM;

	iio_device_attach_buffer(indio_dev, buffer);