iio: chemical: atlas-sensor: allow probe without interrupt line
authorMatt Ranostay <matt.ranostay@konsulko.com>
Tue, 18 Feb 2020 03:42:37 +0000 (19:42 -0800)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 8 Mar 2020 17:28:40 +0000 (17:28 +0000)
Sensors don't actually need a interrupt line to give valid readings,
and can triggered with CONFIG_IIO_HRTIMER_TRIGGER as well. Remove
the required check for interrupt, and continue along in the probe
function.

Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/chemical/atlas-sensor.c

index 2f0a6fe..d95818b 100644 (file)
@@ -76,6 +76,7 @@ struct atlas_data {
        struct atlas_device *chip;
        struct regmap *regmap;
        struct irq_work work;
+       unsigned int interrupt_enabled;
 
        __be32 buffer[6]; /* 96-bit data + 32-bit pad + 64-bit timestamp */
 };
@@ -304,6 +305,9 @@ static int atlas_set_powermode(struct atlas_data *data, int on)
 
 static int atlas_set_interrupt(struct atlas_data *data, bool state)
 {
+       if (!data->interrupt_enabled)
+               return 0;
+
        return regmap_update_bits(data->regmap, ATLAS_REG_INT_CONTROL,
                                  ATLAS_REG_INT_CONTROL_EN,
                                  state ? ATLAS_REG_INT_CONTROL_EN : 0);
@@ -572,11 +576,6 @@ static int atlas_probe(struct i2c_client *client,
        if (ret)
                return ret;
 
-       if (client->irq <= 0) {
-               dev_err(&client->dev, "no valid irq defined\n");
-               return -EINVAL;
-       }
-
        ret = chip->calibration(data);
        if (ret)
                return ret;
@@ -596,16 +595,20 @@ static int atlas_probe(struct i2c_client *client,
 
        init_irq_work(&data->work, atlas_work_handler);
 
-       /* interrupt pin toggles on new conversion */
-       ret = devm_request_threaded_irq(&client->dev, client->irq,
-                                       NULL, atlas_interrupt_handler,
-                                       IRQF_TRIGGER_RISING |
-                                       IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-                                       "atlas_irq",
-                                       indio_dev);
-       if (ret) {
-               dev_err(&client->dev, "request irq (%d) failed\n", client->irq);
-               goto unregister_buffer;
+       if (client->irq > 0) {
+               /* interrupt pin toggles on new conversion */
+               ret = devm_request_threaded_irq(&client->dev, client->irq,
+                               NULL, atlas_interrupt_handler,
+                               IRQF_TRIGGER_RISING |
+                               IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+                               "atlas_irq",
+                               indio_dev);
+
+               if (ret)
+                       dev_warn(&client->dev,
+                               "request irq (%d) failed\n", client->irq);
+               else
+                       data->interrupt_enabled = 1;
        }
 
        ret = atlas_set_powermode(data, 1);