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

Commit 29148543 authored by Jonathan Cameron's avatar Jonathan Cameron Committed by Greg Kroah-Hartman
Browse files

staging:iio:resolver:ad2s1210 minimal chan spec conversion.



Just convert the raw reads in this patch.

Signed-off-by: default avatarJonathan Cameron <jic23@cam.ac.uk>
Acked-by: default avatarMichael Hennerich <michael.hennerich@analog.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent bf52f059
Loading
Loading
Loading
Loading
+63 −51
Original line number Original line Diff line number Diff line
@@ -514,56 +514,49 @@ error_ret:
	return ret < 0 ? ret : len;
	return ret < 0 ? ret : len;
}
}


static ssize_t ad2s1210_show_pos(struct device *dev,
static int ad2s1210_read_raw(struct iio_dev *indio_dev,
				 struct device_attribute *attr,
			     struct iio_chan_spec const *chan,
				 char *buf)
			     int *val,
			     int *val2,
			     long m)
{
{
	struct ad2s1210_state *st = iio_priv(indio_dev);
	bool negative;
	int ret = 0;
	int ret = 0;
	ssize_t len = 0;
	u16 pos;
	u16 pos;
	struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev));
	s16 vel;


	mutex_lock(&st->lock);
	mutex_lock(&st->lock);
	gpio_set_value(st->pdata->sample, 0);
	gpio_set_value(st->pdata->sample, 0);
	/* delay (6 * tck + 20) nano seconds */
	/* delay (6 * tck + 20) nano seconds */
	udelay(1);
	udelay(1);


	switch (chan->type) {
	case IIO_ANGL:
		ad2s1210_set_mode(MOD_POS, st);
		ad2s1210_set_mode(MOD_POS, st);
		break;
	case IIO_ANGL_VEL:
		ad2s1210_set_mode(MOD_VEL, st);
		break;
	default:
	       ret = -EINVAL;
	       break;
	}
	if (ret < 0)
		goto error_ret;
	ret = spi_read(st->sdev, st->rx, 2);
	ret = spi_read(st->sdev, st->rx, 2);
	if (ret)
	if (ret < 0)
		goto error_ret;
		goto error_ret;

	switch (chan->type) {
	case IIO_ANGL:
		pos = be16_to_cpup((u16 *)st->rx);
		pos = be16_to_cpup((u16 *)st->rx);
		if (st->hysteresis)
		if (st->hysteresis)
			pos >>= 16 - st->resolution;
			pos >>= 16 - st->resolution;
	len = sprintf(buf, "%d\n", pos);
		*val = pos;
error_ret:
		ret = IIO_VAL_INT;
	gpio_set_value(st->pdata->sample, 1);
		break;
	/* delay (2 * tck + 20) nano seconds */
	case IIO_ANGL_VEL:
	udelay(1);
	mutex_unlock(&st->lock);

	return ret < 0 ? ret : len;
}

static ssize_t ad2s1210_show_vel(struct device *dev,
				 struct device_attribute *attr,
				 char *buf)
{
	unsigned short negative;
	int ret = 0;
	ssize_t len = 0;
	s16 vel;
	struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev));

	mutex_lock(&st->lock);
	gpio_set_value(st->pdata->sample, 0);
	/* delay (6 * tck + 20) nano seconds */
	udelay(1);

	ad2s1210_set_mode(MOD_VEL, st);
	ret = spi_read(st->sdev, st->rx, 2);
	if (ret)
		goto error_ret;
		negative = st->rx[0] & 0x80;
		negative = st->rx[0] & 0x80;
		vel = be16_to_cpup((s16 *)st->rx);
		vel = be16_to_cpup((s16 *)st->rx);
		vel >>= 16 - st->resolution;
		vel >>= 16 - st->resolution;
@@ -571,14 +564,20 @@ static ssize_t ad2s1210_show_vel(struct device *dev,
			negative = (0xffff >> st->resolution) << st->resolution;
			negative = (0xffff >> st->resolution) << st->resolution;
			vel |= negative;
			vel |= negative;
		}
		}
	len = sprintf(buf, "%d\n", vel);
		*val = vel;
		ret = IIO_VAL_INT;
		break;
	default:
		mutex_unlock(&st->lock);
		return -EINVAL;
	}

error_ret:
error_ret:
	gpio_set_value(st->pdata->sample, 1);
	gpio_set_value(st->pdata->sample, 1);
	/* delay (2 * tck + 20) nano seconds */
	/* delay (2 * tck + 20) nano seconds */
	udelay(1);
	udelay(1);
	mutex_unlock(&st->lock);
	mutex_unlock(&st->lock);

	return ret;
	return ret < 0 ? ret : len;
}
}


static IIO_DEVICE_ATTR(raw_io, S_IRUGO | S_IWUSR,
static IIO_DEVICE_ATTR(raw_io, S_IRUGO | S_IWUSR,
@@ -595,8 +594,7 @@ static IIO_DEVICE_ATTR(bits, S_IRUGO | S_IWUSR,
		       ad2s1210_show_resolution, ad2s1210_store_resolution, 0);
		       ad2s1210_show_resolution, ad2s1210_store_resolution, 0);
static IIO_DEVICE_ATTR(fault, S_IRUGO | S_IWUSR,
static IIO_DEVICE_ATTR(fault, S_IRUGO | S_IWUSR,
		       ad2s1210_show_fault, ad2s1210_clear_fault, 0);
		       ad2s1210_show_fault, ad2s1210_clear_fault, 0);
static IIO_DEVICE_ATTR(pos, S_IRUGO, ad2s1210_show_pos, NULL, 0);

static IIO_DEVICE_ATTR(vel, S_IRUGO,  ad2s1210_show_vel, NULL, 0);
static IIO_DEVICE_ATTR(los_thrd, S_IRUGO | S_IWUSR,
static IIO_DEVICE_ATTR(los_thrd, S_IRUGO | S_IWUSR,
		       ad2s1210_show_reg, ad2s1210_store_reg,
		       ad2s1210_show_reg, ad2s1210_store_reg,
		       AD2S1210_REG_LOS_THRD);
		       AD2S1210_REG_LOS_THRD);
@@ -619,6 +617,19 @@ static IIO_DEVICE_ATTR(lot_low_thrd, S_IRUGO | S_IWUSR,
		       ad2s1210_show_reg, ad2s1210_store_reg,
		       ad2s1210_show_reg, ad2s1210_store_reg,
		       AD2S1210_REG_LOT_LOW_THRD);
		       AD2S1210_REG_LOT_LOW_THRD);



static struct iio_chan_spec ad2s1210_channels[] = {
	{
		.type = IIO_ANGL,
		.indexed = 1,
		.channel = 0,
	}, {
		.type = IIO_ANGL_VEL,
		.indexed = 1,
		.channel = 0,
	}
};

static struct attribute *ad2s1210_attributes[] = {
static struct attribute *ad2s1210_attributes[] = {
	&iio_dev_attr_raw_io.dev_attr.attr,
	&iio_dev_attr_raw_io.dev_attr.attr,
	&iio_dev_attr_reset.dev_attr.attr,
	&iio_dev_attr_reset.dev_attr.attr,
@@ -627,8 +638,6 @@ static struct attribute *ad2s1210_attributes[] = {
	&iio_dev_attr_control.dev_attr.attr,
	&iio_dev_attr_control.dev_attr.attr,
	&iio_dev_attr_bits.dev_attr.attr,
	&iio_dev_attr_bits.dev_attr.attr,
	&iio_dev_attr_fault.dev_attr.attr,
	&iio_dev_attr_fault.dev_attr.attr,
	&iio_dev_attr_pos.dev_attr.attr,
	&iio_dev_attr_vel.dev_attr.attr,
	&iio_dev_attr_los_thrd.dev_attr.attr,
	&iio_dev_attr_los_thrd.dev_attr.attr,
	&iio_dev_attr_dos_ovr_thrd.dev_attr.attr,
	&iio_dev_attr_dos_ovr_thrd.dev_attr.attr,
	&iio_dev_attr_dos_mis_thrd.dev_attr.attr,
	&iio_dev_attr_dos_mis_thrd.dev_attr.attr,
@@ -681,6 +690,7 @@ error_ret:
}
}


static const struct iio_info ad2s1210_info = {
static const struct iio_info ad2s1210_info = {
	.read_raw = &ad2s1210_read_raw,
	.attrs = &ad2s1210_attribute_group,
	.attrs = &ad2s1210_attribute_group,
	.driver_module = THIS_MODULE,
	.driver_module = THIS_MODULE,
};
};
@@ -760,6 +770,8 @@ static int __devinit ad2s1210_probe(struct spi_device *spi)
	indio_dev->dev.parent = &spi->dev;
	indio_dev->dev.parent = &spi->dev;
	indio_dev->info = &ad2s1210_info;
	indio_dev->info = &ad2s1210_info;
	indio_dev->modes = INDIO_DIRECT_MODE;
	indio_dev->modes = INDIO_DIRECT_MODE;
	indio_dev->channels = ad2s1210_channels;
	indio_dev->num_channels = ARRAY_SIZE(ad2s1210_channels);
	indio_dev->name = spi_get_device_id(spi)->name;
	indio_dev->name = spi_get_device_id(spi)->name;


	ret = iio_device_register(indio_dev);
	ret = iio_device_register(indio_dev);