iio: ltr501: Export near level property for proximity sensor
authorNikita Travkin <nikita@trvn.ru>
Thu, 25 Nov 2021 12:56:46 +0000 (17:56 +0500)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 4 Dec 2021 15:34:18 +0000 (15:34 +0000)
Userspace tools like iio-sensor-proxy need to know the proximity level
that should be considered "near". This value is hardware-specific and
can be defined via the devicetree. Allow the driver to export the near
level.

Signed-off-by: Nikita Travkin <nikita@trvn.ru>
Link: https://lore.kernel.org/r/20211125125646.54831-2-nikita@trvn.ru
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/light/ltr501.c

index bab5b78..902b9c7 100644 (file)
@@ -166,6 +166,7 @@ struct ltr501_data {
        struct regmap_field *reg_ps_rate;
        struct regmap_field *reg_als_prst;
        struct regmap_field *reg_ps_prst;
+       uint32_t near_level;
 };
 
 static const struct ltr501_samp_table ltr501_als_samp_table[] = {
@@ -525,6 +526,25 @@ static int ltr501_write_intr_prst(struct ltr501_data *data,
        return -EINVAL;
 }
 
+static ssize_t ltr501_read_near_level(struct iio_dev *indio_dev,
+                                     uintptr_t priv,
+                                     const struct iio_chan_spec *chan,
+                                     char *buf)
+{
+       struct ltr501_data *data = iio_priv(indio_dev);
+
+       return sprintf(buf, "%u\n", data->near_level);
+}
+
+static const struct iio_chan_spec_ext_info ltr501_ext_info[] = {
+       {
+               .name = "nearlevel",
+               .shared = IIO_SEPARATE,
+               .read = ltr501_read_near_level,
+       },
+       { /* sentinel */ }
+};
+
 static const struct iio_event_spec ltr501_als_event_spec[] = {
        {
                .type = IIO_EV_TYPE_THRESH,
@@ -609,6 +629,7 @@ static const struct iio_chan_spec ltr501_channels[] = {
                },
                .event_spec = ltr501_pxs_event_spec,
                .num_event_specs = ARRAY_SIZE(ltr501_pxs_event_spec),
+               .ext_info = ltr501_ext_info,
        },
        IIO_CHAN_SOFT_TIMESTAMP(3),
 };
@@ -1531,6 +1552,10 @@ static int ltr501_probe(struct i2c_client *client,
        if ((partid >> 4) != data->chip_info->partid)
                return -ENODEV;
 
+       if (device_property_read_u32(&client->dev, "proximity-near-level",
+                                    &data->near_level))
+               data->near_level = 0;
+
        indio_dev->info = data->chip_info->info;
        indio_dev->channels = data->chip_info->channels;
        indio_dev->num_channels = data->chip_info->no_channels;