Merge back earlier cpufreq material for v4.8.
[cascardo/linux.git] / drivers / iio / common / st_sensors / st_sensors_core.c
index f5a2d44..9e59c90 100644 (file)
@@ -301,6 +301,14 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
                return -EINVAL;
        }
 
+       if (pdata->open_drain) {
+               if (!sdata->sensor_settings->drdy_irq.addr_od)
+                       dev_err(&indio_dev->dev,
+                               "open drain requested but unsupported.\n");
+               else
+                       sdata->int_pin_open_drain = true;
+       }
+
        return 0;
 }
 
@@ -321,6 +329,8 @@ static struct st_sensors_platform_data *st_sensors_of_probe(struct device *dev,
        else
                pdata->drdy_int_pin = defdata ? defdata->drdy_int_pin : 0;
 
+       pdata->open_drain = of_property_read_bool(np, "drive-open-drain");
+
        return pdata;
 }
 #else
@@ -353,6 +363,11 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
        if (err < 0)
                return err;
 
+       /* Disable DRDY, this might be still be enabled after reboot. */
+       err = st_sensors_set_dataready_irq(indio_dev, false);
+       if (err < 0)
+               return err;
+
        if (sdata->current_fullscale) {
                err = st_sensors_set_fullscale(indio_dev,
                                                sdata->current_fullscale->num);
@@ -374,6 +389,16 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
                        return err;
        }
 
+       if (sdata->int_pin_open_drain) {
+               dev_info(&indio_dev->dev,
+                        "set interrupt line to open drain mode\n");
+               err = st_sensors_write_data_with_mask(indio_dev,
+                               sdata->sensor_settings->drdy_irq.addr_od,
+                               sdata->sensor_settings->drdy_irq.mask_od, 1);
+               if (err < 0)
+                       return err;
+       }
+
        err = st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
 
        return err;
@@ -404,6 +429,9 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
        else
                drdy_mask = sdata->sensor_settings->drdy_irq.mask_int2;
 
+       /* Flag to the poll function that the hardware trigger is in use */
+       sdata->hw_irq_trigger = enable;
+
        /* Enable/Disable the interrupt generator for data ready. */
        err = st_sensors_write_data_with_mask(indio_dev,
                                        sdata->sensor_settings->drdy_irq.addr,