Commit deaecbef authored by Brian Masney's avatar Brian Masney Committed by Jonathan Cameron
Browse files

staging: iio: tsl2x7x: migrate *_thresh_period sysfs attributes to iio_event_spec



The sysfs attributes in_intensity0_thresh_period and
in_proximity0_thresh_period are currently directly created by the driver.
This patch migrates the creation of these sysfs attributes from the driver
to using the IIO core via iio_event_spec.

Signed-off-by: default avatarBrian Masney <masneyb@onstation.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 59dba8fa
Loading
Loading
Loading
Loading
+52 −144
Original line number Diff line number Diff line
@@ -932,108 +932,6 @@ static ssize_t in_illuminance0_target_input_store(struct device *dev,
	return len;
}

/* persistence settings */
static ssize_t in_intensity0_thresh_period_show(struct device *dev,
					    struct device_attribute *attr,
					    char *buf)
{
	struct tsl2X7X_chip *chip = iio_priv(dev_to_iio_dev(dev));
	int y, z, filter_delay;

	/* Determine integration time */
	y = (TSL2X7X_MAX_TIMER_CNT - (u8)chip->settings.als_time) + 1;
	z = y * TSL2X7X_MIN_ITIME;
	filter_delay = z * (chip->settings.persistence & 0x0F);
	y = filter_delay / 1000;
	z = filter_delay % 1000;

	return snprintf(buf, PAGE_SIZE, "%d.%03d\n", y, z);
}

static ssize_t in_intensity0_thresh_period_store(struct device *dev,
					     struct device_attribute *attr,
					     const char *buf, size_t len)
{
	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
	struct tsl2X7X_chip *chip = iio_priv(indio_dev);
	struct tsl2x7x_parse_result result;
	int y, z, filter_delay;
	int ret;

	ret = iio_str_to_fixpoint(buf, 100, &result.integer, &result.fract);
	if (ret)
		return ret;

	y = (TSL2X7X_MAX_TIMER_CNT - (u8)chip->settings.als_time) + 1;
	z = y * TSL2X7X_MIN_ITIME;

	filter_delay =
		DIV_ROUND_UP((result.integer * 1000) + result.fract, z);

	chip->settings.persistence &= 0xF0;
	chip->settings.persistence |= (filter_delay & 0x0F);

	dev_info(&chip->client->dev, "%s: als persistence = %d",
		 __func__, filter_delay);

	ret = tsl2x7x_invoke_change(indio_dev);
	if (ret < 0)
		return ret;

	return IIO_VAL_INT_PLUS_MICRO;
}

static ssize_t in_proximity0_thresh_period_show(struct device *dev,
					     struct device_attribute *attr,
					     char *buf)
{
	struct tsl2X7X_chip *chip = iio_priv(dev_to_iio_dev(dev));
	int y, z, filter_delay;

	/* Determine integration time */
	y = (TSL2X7X_MAX_TIMER_CNT - (u8)chip->settings.prx_time) + 1;
	z = y * TSL2X7X_MIN_ITIME;
	filter_delay = z * ((chip->settings.persistence & 0xF0) >> 4);
	y = filter_delay / 1000;
	z = filter_delay % 1000;

	return snprintf(buf, PAGE_SIZE, "%d.%03d\n", y, z);
}

static ssize_t in_proximity0_thresh_period_store(struct device *dev,
					      struct device_attribute *attr,
					      const char *buf, size_t len)
{
	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
	struct tsl2X7X_chip *chip = iio_priv(indio_dev);
	struct tsl2x7x_parse_result result;
	int y, z, filter_delay;
	int ret;

	ret = iio_str_to_fixpoint(buf, 100, &result.integer, &result.fract);
	if (ret)
		return ret;

	y = (TSL2X7X_MAX_TIMER_CNT - (u8)chip->settings.prx_time) + 1;
	z = y * TSL2X7X_MIN_ITIME;

	filter_delay =
		DIV_ROUND_UP((result.integer * 1000) + result.fract, z);

	chip->settings.persistence &= 0x0F;
	chip->settings.persistence |= ((filter_delay << 4) & 0xF0);

	dev_info(&chip->client->dev, "%s: prox persistence = %d",
		 __func__, filter_delay);

	ret = tsl2x7x_invoke_change(indio_dev);
	if (ret < 0)
		return ret;


	return IIO_VAL_INT_PLUS_MICRO;
}

static ssize_t in_illuminance0_calibrate_store(struct device *dev,
				    struct device_attribute *attr,
				    const char *buf, size_t len)
@@ -1198,7 +1096,8 @@ static int tsl2x7x_write_event_value(struct iio_dev *indio_dev,
				     int val, int val2)
{
	struct tsl2X7X_chip *chip = iio_priv(indio_dev);
	int ret = -EINVAL;
	int ret = -EINVAL, y, z, filter_delay;
	u8 time;

	switch (info) {
	case IIO_EV_INFO_VALUE:
@@ -1230,6 +1129,33 @@ static int tsl2x7x_write_event_value(struct iio_dev *indio_dev,
			}
		}
		break;
	case IIO_EV_INFO_PERIOD:
		if (chan->type == IIO_INTENSITY)
			time = chip->settings.als_time;
		else
			time = chip->settings.prx_time;

		y = (TSL2X7X_MAX_TIMER_CNT - time) + 1;
		z = y * TSL2X7X_MIN_ITIME;

		filter_delay = DIV_ROUND_UP((val * 1000) + val2, z);

		if (chan->type == IIO_INTENSITY) {
			chip->settings.persistence &= 0xF0;
			chip->settings.persistence |=
				(filter_delay & 0x0F);
			dev_info(&chip->client->dev, "%s: ALS persistence = %d",
				 __func__, filter_delay);
		} else {
			chip->settings.persistence &= 0x0F;
			chip->settings.persistence |=
				((filter_delay << 4) & 0xF0);
			dev_info(&chip->client->dev,
				 "%s: Proximity persistence = %d",
				 __func__, filter_delay);
		}
		ret = 0;
		break;
	default:
		break;
	}
@@ -1248,7 +1174,8 @@ static int tsl2x7x_read_event_value(struct iio_dev *indio_dev,
				    int *val, int *val2)
{
	struct tsl2X7X_chip *chip = iio_priv(indio_dev);
	int ret = -EINVAL;
	int ret = -EINVAL, filter_delay, mult;
	u8 time;

	switch (info) {
	case IIO_EV_INFO_VALUE:
@@ -1280,6 +1207,23 @@ static int tsl2x7x_read_event_value(struct iio_dev *indio_dev,
			}
		}
		break;
	case IIO_EV_INFO_PERIOD:
		if (chan->type == IIO_INTENSITY) {
			time = chip->settings.als_time;
			mult = chip->settings.persistence & 0x0F;
		} else {
			time = chip->settings.prx_time;
			mult = (chip->settings.persistence & 0xF0) >> 4;
		}

		/* Determine integration time */
		*val = (TSL2X7X_MAX_TIMER_CNT - time) + 1;
		*val2 = *val * TSL2X7X_MIN_ITIME;
		filter_delay = *val2 * mult;
		*val = filter_delay / 1000;
		*val2 = filter_delay % 1000;
		ret = IIO_VAL_INT_PLUS_MICRO;
		break;
	default:
		break;
	}
@@ -1444,10 +1388,6 @@ static DEVICE_ATTR_WO(in_proximity0_calibrate);

static DEVICE_ATTR_RW(in_illuminance0_lux_table);

static DEVICE_ATTR_RW(in_intensity0_thresh_period);

static DEVICE_ATTR_RW(in_proximity0_thresh_period);

/* Use the default register values to identify the Taos device */
static int tsl2x7x_device_id(int *id, int target)
{
@@ -1554,22 +1494,6 @@ static struct attribute *tsl2x7x_ALSPRX2_device_attrs[] = {
	NULL
};

static struct attribute *tsl2X7X_ALS_event_attrs[] = {
	&dev_attr_in_intensity0_thresh_period.attr,
	NULL,
};

static struct attribute *tsl2X7X_PRX_event_attrs[] = {
	&dev_attr_in_proximity0_thresh_period.attr,
	NULL,
};

static struct attribute *tsl2X7X_ALSPRX_event_attrs[] = {
	&dev_attr_in_intensity0_thresh_period.attr,
	&dev_attr_in_proximity0_thresh_period.attr,
	NULL,
};

static const struct attribute_group tsl2X7X_device_attr_group_tbl[] = {
	[ALS] = {
		.attrs = tsl2x7x_ALS_device_attrs,
@@ -1588,25 +1512,9 @@ static const struct attribute_group tsl2X7X_device_attr_group_tbl[] = {
	},
};

static const struct attribute_group tsl2X7X_event_attr_group_tbl[] = {
	[ALS] = {
		.attrs = tsl2X7X_ALS_event_attrs,
		.name = "events",
	},
	[PRX] = {
		.attrs = tsl2X7X_PRX_event_attrs,
		.name = "events",
	},
	[ALSPRX] = {
		.attrs = tsl2X7X_ALSPRX_event_attrs,
		.name = "events",
	},
};

static const struct iio_info tsl2X7X_device_info[] = {
	[ALS] = {
		.attrs = &tsl2X7X_device_attr_group_tbl[ALS],
		.event_attrs = &tsl2X7X_event_attr_group_tbl[ALS],
		.read_raw = &tsl2x7x_read_raw,
		.write_raw = &tsl2x7x_write_raw,
		.read_event_value = &tsl2x7x_read_event_value,
@@ -1616,7 +1524,6 @@ static const struct iio_info tsl2X7X_device_info[] = {
	},
	[PRX] = {
		.attrs = &tsl2X7X_device_attr_group_tbl[PRX],
		.event_attrs = &tsl2X7X_event_attr_group_tbl[PRX],
		.read_raw = &tsl2x7x_read_raw,
		.write_raw = &tsl2x7x_write_raw,
		.read_event_value = &tsl2x7x_read_event_value,
@@ -1626,7 +1533,6 @@ static const struct iio_info tsl2X7X_device_info[] = {
	},
	[ALSPRX] = {
		.attrs = &tsl2X7X_device_attr_group_tbl[ALSPRX],
		.event_attrs = &tsl2X7X_event_attr_group_tbl[ALSPRX],
		.read_raw = &tsl2x7x_read_raw,
		.write_raw = &tsl2x7x_write_raw,
		.read_event_value = &tsl2x7x_read_event_value,
@@ -1636,7 +1542,6 @@ static const struct iio_info tsl2X7X_device_info[] = {
	},
	[PRX2] = {
		.attrs = &tsl2X7X_device_attr_group_tbl[PRX2],
		.event_attrs = &tsl2X7X_event_attr_group_tbl[PRX],
		.read_raw = &tsl2x7x_read_raw,
		.write_raw = &tsl2x7x_write_raw,
		.read_event_value = &tsl2x7x_read_event_value,
@@ -1646,7 +1551,6 @@ static const struct iio_info tsl2X7X_device_info[] = {
	},
	[ALSPRX2] = {
		.attrs = &tsl2X7X_device_attr_group_tbl[ALSPRX2],
		.event_attrs = &tsl2X7X_event_attr_group_tbl[ALSPRX],
		.read_raw = &tsl2x7x_read_raw,
		.write_raw = &tsl2x7x_write_raw,
		.read_event_value = &tsl2x7x_read_event_value,
@@ -1667,6 +1571,10 @@ static const struct iio_event_spec tsl2x7x_events[] = {
		.dir = IIO_EV_DIR_FALLING,
		.mask_separate = BIT(IIO_EV_INFO_VALUE) |
			BIT(IIO_EV_INFO_ENABLE),
	}, {
		.type = IIO_EV_TYPE_THRESH,
		.dir = IIO_EV_DIR_EITHER,
		.mask_separate = BIT(IIO_EV_INFO_PERIOD),
	},
};