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

Commit da1690e6 authored by Jonathan Cameron's avatar Jonathan Cameron
Browse files

iio:temperature:tmp006 put sampling_frequency in info_mask_shared_by_all



Doing this makes it possible to access this control from within the kernel.

Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
Acked-by: default avatarPeter Meerwald <pmeerw@pmeerw.net>
Reviewed-by: default avatarLars-Peter Clausen <lars@metafoo.de>
parent 6a63aa0a
Loading
Loading
Loading
Loading
+27 −30
Original line number Original line Diff line number Diff line
@@ -70,12 +70,16 @@ static int tmp006_read_measurement(struct tmp006_data *data, u8 reg)
	return i2c_smbus_read_word_swapped(data->client, reg);
	return i2c_smbus_read_word_swapped(data->client, reg);
}
}


static const int tmp006_freqs[5][2] = { {4, 0}, {2, 0}, {1, 0},
					{0, 500000}, {0, 250000} };

static int tmp006_read_raw(struct iio_dev *indio_dev,
static int tmp006_read_raw(struct iio_dev *indio_dev,
			    struct iio_chan_spec const *channel, int *val,
			    struct iio_chan_spec const *channel, int *val,
			    int *val2, long mask)
			    int *val2, long mask)
{
{
	struct tmp006_data *data = iio_priv(indio_dev);
	struct tmp006_data *data = iio_priv(indio_dev);
	s32 ret;
	s32 ret;
	int cr;


	switch (mask) {
	switch (mask) {
	case IIO_CHAN_INFO_RAW:
	case IIO_CHAN_INFO_RAW:
@@ -106,6 +110,12 @@ static int tmp006_read_raw(struct iio_dev *indio_dev,
			break;
			break;
		}
		}
		return IIO_VAL_INT_PLUS_MICRO;
		return IIO_VAL_INT_PLUS_MICRO;
	case IIO_CHAN_INFO_SAMP_FREQ:
		cr = (data->config & TMP006_CONFIG_CR_MASK)
			>> TMP006_CONFIG_CR_SHIFT;
		*val = tmp006_freqs[cr][0];
		*val2 = tmp006_freqs[cr][1];
		return IIO_VAL_INT_PLUS_MICRO;
	default:
	default:
		break;
		break;
	}
	}
@@ -113,48 +123,32 @@ static int tmp006_read_raw(struct iio_dev *indio_dev,
	return -EINVAL;
	return -EINVAL;
}
}


static const char * const tmp006_freqs[] = { "4", "2", "1", "0.5", "0.25" };
static int tmp006_write_raw(struct iio_dev *indio_dev,

			    struct iio_chan_spec const *chan,
static ssize_t tmp006_show_freq(struct device *dev,
			    int val,
				struct device_attribute *attr, char *buf)
			    int val2,
{
			    long mask)
	struct tmp006_data *data = iio_priv(dev_to_iio_dev(dev));
	int cr = (data->config & TMP006_CONFIG_CR_MASK)
		>> TMP006_CONFIG_CR_SHIFT;
	return sprintf(buf, "%s\n", tmp006_freqs[cr]);
}

static ssize_t tmp006_store_freq(struct device *dev,
				 struct device_attribute *attr,
				 const char *buf, size_t len)
{
{
	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
	struct tmp006_data *data = iio_priv(indio_dev);
	struct tmp006_data *data = iio_priv(indio_dev);
	int i;
	int i;
	bool found = false;


	for (i = 0; i < ARRAY_SIZE(tmp006_freqs); i++)
	for (i = 0; i < ARRAY_SIZE(tmp006_freqs); i++)
		if (sysfs_streq(buf, tmp006_freqs[i])) {
		if ((val == tmp006_freqs[i][0]) &&
			found = true;
		    (val2 == tmp006_freqs[i][1])) {
			break;
		}
	if (!found)
		return -EINVAL;

			data->config &= ~TMP006_CONFIG_CR_MASK;
			data->config &= ~TMP006_CONFIG_CR_MASK;
			data->config |= i << TMP006_CONFIG_CR_SHIFT;
			data->config |= i << TMP006_CONFIG_CR_SHIFT;


	return i2c_smbus_write_word_swapped(data->client, TMP006_CONFIG,
			return i2c_smbus_write_word_swapped(data->client,
							    TMP006_CONFIG,
							    data->config);
							    data->config);
}


static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR,
		}
			tmp006_show_freq, tmp006_store_freq);
	return -EINVAL;
}


static IIO_CONST_ATTR(sampling_frequency_available, "4 2 1 0.5 0.25");
static IIO_CONST_ATTR(sampling_frequency_available, "4 2 1 0.5 0.25");


static struct attribute *tmp006_attributes[] = {
static struct attribute *tmp006_attributes[] = {
	&iio_dev_attr_sampling_frequency.dev_attr.attr,
	&iio_const_attr_sampling_frequency_available.dev_attr.attr,
	&iio_const_attr_sampling_frequency_available.dev_attr.attr,
	NULL
	NULL
};
};
@@ -168,16 +162,19 @@ static const struct iio_chan_spec tmp006_channels[] = {
		.type = IIO_VOLTAGE,
		.type = IIO_VOLTAGE,
		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
			BIT(IIO_CHAN_INFO_SCALE),
			BIT(IIO_CHAN_INFO_SCALE),
		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
	},
	},
	{
	{
		.type = IIO_TEMP,
		.type = IIO_TEMP,
		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
			BIT(IIO_CHAN_INFO_SCALE),
			BIT(IIO_CHAN_INFO_SCALE),
		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
	}
	}
};
};


static const struct iio_info tmp006_info = {
static const struct iio_info tmp006_info = {
	.read_raw = tmp006_read_raw,
	.read_raw = tmp006_read_raw,
	.write_raw = tmp006_write_raw,
	.attrs = &tmp006_attribute_group,
	.attrs = &tmp006_attribute_group,
	.driver_module = THIS_MODULE,
	.driver_module = THIS_MODULE,
};
};