1 From c546d49656143855093c7b7fde60866e6e23a69d Mon Sep 17 00:00:00 2001
2 From: Tomasz Duszynski <tduszyns@gmail.com>
3 Date: Tue, 18 Dec 2018 21:28:09 +0100
4 Subject: [PATCH] iio: chemical: sps30: add support for self cleaning
6 Self cleaning is especially useful in cases where sensor undergoes
7 frequent power on/off cycles. In such scenarios it is recommended to
8 turn self cleaning at least once per week in order to maintain reliable
11 Self cleaning is activated by writing 1 to a dedicated attribute.
12 Internal fan accelerates to its maximum speed and keeps spinning
13 for about 10 seconds blowing out accumulated dust.
15 Signed-off-by: Tomasz Duszynski <tduszyns@gmail.com>
16 Tested-by: Andreas Brauchli <andreas.brauchli@sensirion.com>
17 Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
19 Documentation/ABI/testing/sysfs-bus-iio-sps30 | 8 +++++
20 drivers/iio/chemical/sps30.c | 35 ++++++++++++++++++-
21 2 files changed, 42 insertions(+), 1 deletion(-)
22 create mode 100644 Documentation/ABI/testing/sysfs-bus-iio-sps30
25 +++ b/Documentation/ABI/testing/sysfs-bus-iio-sps30
27 +What: /sys/bus/iio/devices/iio:deviceX/start_cleaning
30 +Contact: linux-iio@vger.kernel.org
32 + Writing 1 starts sensor self cleaning. Internal fan accelerates
33 + to its maximum speed and keeps spinning for about 10 seconds in
34 + order to blow out accumulated dust.
35 --- a/drivers/iio/chemical/sps30.c
36 +++ b/drivers/iio/chemical/sps30.c
38 * I2C slave address: 0x69
41 - * - support for turning on fan cleaning
42 * - support for reading/setting auto cleaning interval
46 #define SPS30_READ_DATA_READY_FLAG 0x0202
47 #define SPS30_READ_DATA 0x0300
48 #define SPS30_READ_SERIAL 0xd033
49 +#define SPS30_START_FAN_CLEANING 0x5607
53 @@ -104,6 +104,7 @@ static int sps30_do_cmd(struct sps30_sta
57 + case SPS30_START_FAN_CLEANING:
58 ret = sps30_write_then_read(state, buf, 2, NULL, 0);
60 case SPS30_READ_DATA_READY_FLAG:
61 @@ -275,7 +276,39 @@ static int sps30_read_raw(struct iio_dev
65 +static ssize_t start_cleaning_store(struct device *dev,
66 + struct device_attribute *attr,
67 + const char *buf, size_t len)
69 + struct iio_dev *indio_dev = dev_to_iio_dev(dev);
70 + struct sps30_state *state = iio_priv(indio_dev);
73 + if (kstrtoint(buf, 0, &val) || val != 1)
76 + mutex_lock(&state->lock);
77 + ret = sps30_do_cmd(state, SPS30_START_FAN_CLEANING, NULL, 0);
78 + mutex_unlock(&state->lock);
85 +static IIO_DEVICE_ATTR_WO(start_cleaning, 0);
87 +static struct attribute *sps30_attrs[] = {
88 + &iio_dev_attr_start_cleaning.dev_attr.attr,
92 +static const struct attribute_group sps30_attr_group = {
93 + .attrs = sps30_attrs,
96 static const struct iio_info sps30_info = {
97 + .attrs = &sps30_attr_group,
98 .read_raw = sps30_read_raw,