]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge tag 'iio-fixes-for-4.11e' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 18 Apr 2017 17:38:38 +0000 (19:38 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 18 Apr 2017 17:38:38 +0000 (19:38 +0200)
Jonathan writes:

Fifth set of IIO fixes for the 4.11 cycle.

As these are rather late in the cycle, they may sneak over into 4.12.
There is a fix for a regression caused by another fix (hid sensors
hardware seems to vary a lot in how various corner cases are handled).

* ad7303
  - fix channel description. Numeric values were being passed as characters
  presumably leading to garbage from the userspace interface.
* as3935
  - the write data macro was wrong so fix it.
* bmp280
  - incorrect handling of negative values as being unsigned broke humidity
  calculation.
* hid-sensor
  - Restore the poll and hysteresis values after resume as some hardware
  doesn't do it.
* stm32-trigger
  - buglet in reading the sampling frequency

drivers/iio/common/hid-sensors/hid-sensor-attributes.c
drivers/iio/common/hid-sensors/hid-sensor-trigger.c
drivers/iio/dac/ad7303.c
drivers/iio/pressure/bmp280-core.c
drivers/iio/proximity/as3935.c
drivers/iio/trigger/stm32-timer-trigger.c
include/linux/hid-sensor-hub.h

index 2d72c6000e73dd009b1bd9e11cd52047aadc5d5d..1c0874cdf665c8b3928fc1b725edf86a9441c2a3 100644 (file)
@@ -232,7 +232,15 @@ int hid_sensor_write_samp_freq_value(struct hid_sensor_common *st,
        if (ret < 0 || value < 0)
                ret = -EINVAL;
 
-       return ret;
+       ret = sensor_hub_get_feature(st->hsdev,
+                                    st->poll.report_id,
+                                    st->poll.index, sizeof(value), &value);
+       if (ret < 0 || value < 0)
+               return -EINVAL;
+
+       st->poll_interval = value;
+
+       return 0;
 }
 EXPORT_SYMBOL(hid_sensor_write_samp_freq_value);
 
@@ -277,7 +285,16 @@ int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,
        if (ret < 0 || value < 0)
                ret = -EINVAL;
 
-       return ret;
+       ret = sensor_hub_get_feature(st->hsdev,
+                                    st->sensitivity.report_id,
+                                    st->sensitivity.index, sizeof(value),
+                                    &value);
+       if (ret < 0 || value < 0)
+               return -EINVAL;
+
+       st->raw_hystersis = value;
+
+       return 0;
 }
 EXPORT_SYMBOL(hid_sensor_write_raw_hyst_value);
 
@@ -380,6 +397,9 @@ int hid_sensor_get_reporting_interval(struct hid_sensor_hub_device *hsdev,
        /* Default unit of measure is milliseconds */
        if (st->poll.units == 0)
                st->poll.units = HID_USAGE_SENSOR_UNITS_MILLISECOND;
+
+       st->poll_interval = -1;
+
        return 0;
 
 }
@@ -410,6 +430,8 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev,
                        HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS,
                         &st->sensitivity);
 
+       st->raw_hystersis = -1;
+
        sensor_hub_input_get_attribute_info(hsdev,
                                            HID_INPUT_REPORT, usage_id,
                                            HID_USAGE_SENSOR_TIME_TIMESTAMP,
index 8cadc4880359ac81b8f8cc42655130001b0712c4..0b5dea0502398b767d45bd36f37c8530f0f287ac 100644 (file)
@@ -51,6 +51,8 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)
                        st->report_state.report_id,
                        st->report_state.index,
                        HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM);
+
+               poll_value = hid_sensor_read_poll_value(st);
        } else {
                int val;
 
@@ -87,9 +89,7 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)
        sensor_hub_get_feature(st->hsdev, st->power_state.report_id,
                               st->power_state.index,
                               sizeof(state_val), &state_val);
-       if (state)
-               poll_value = hid_sensor_read_poll_value(st);
-       if (poll_value > 0)
+       if (state && poll_value)
                msleep_interruptible(poll_value * 2);
 
        return 0;
@@ -127,6 +127,20 @@ static void hid_sensor_set_power_work(struct work_struct *work)
        struct hid_sensor_common *attrb = container_of(work,
                                                       struct hid_sensor_common,
                                                       work);
+
+       if (attrb->poll_interval >= 0)
+               sensor_hub_set_feature(attrb->hsdev, attrb->poll.report_id,
+                                      attrb->poll.index,
+                                      sizeof(attrb->poll_interval),
+                                      &attrb->poll_interval);
+
+       if (attrb->raw_hystersis >= 0)
+               sensor_hub_set_feature(attrb->hsdev,
+                                      attrb->sensitivity.report_id,
+                                      attrb->sensitivity.index,
+                                      sizeof(attrb->raw_hystersis),
+                                      &attrb->raw_hystersis);
+
        _hid_sensor_power_state(attrb, true);
 }
 
index e690dd11e99f64fa1270da8132010f34d94d7241..4b0f942b891458b5e9c1c11167bc37bc7d28cb23 100644 (file)
@@ -184,9 +184,9 @@ static const struct iio_chan_spec_ext_info ad7303_ext_info[] = {
        .address = (chan),                                      \
        .scan_type = {                                          \
                .sign = 'u',                                    \
-               .realbits = '8',                                \
-               .storagebits = '8',                             \
-               .shift = '0',                                   \
+               .realbits = 8,                                  \
+               .storagebits = 8,                               \
+               .shift = 0,                                     \
        },                                                      \
        .ext_info = ad7303_ext_info,                            \
 }
index 4d18826ac63c2eca6bde3c03e18600961a885c11..d82b788374b61ba617bc5a073e17d283e5e0cfc9 100644 (file)
@@ -175,11 +175,12 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data,
        }
        H6 = sign_extend32(tmp, 7);
 
-       var = ((s32)data->t_fine) - 76800;
-       var = ((((adc_humidity << 14) - (H4 << 20) - (H5 * var)) + 16384) >> 15)
-               * (((((((var * H6) >> 10) * (((var * H3) >> 11) + 32768)) >> 10)
-               + 2097152) * H2 + 8192) >> 14);
-       var -= ((((var >> 15) * (var >> 15)) >> 7) * H1) >> 4;
+       var = ((s32)data->t_fine) - (s32)76800;
+       var = ((((adc_humidity << 14) - (H4 << 20) - (H5 * var))
+               + (s32)16384) >> 15) * (((((((var * H6) >> 10)
+               * (((var * (s32)H3) >> 11) + (s32)32768)) >> 10)
+               + (s32)2097152) * H2 + 8192) >> 14);
+       var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)H1) >> 4;
 
        return var >> 12;
 };
index 1b8b4723bccaffcce004db5dccb6aa2a9c5a2a55..ddf9bee89f777872ec27db426a46c18dd5da2fc3 100644 (file)
@@ -50,7 +50,6 @@
 #define AS3935_TUNE_CAP                0x08
 #define AS3935_CALIBRATE       0x3D
 
-#define AS3935_WRITE_DATA      BIT(15)
 #define AS3935_READ_DATA       BIT(14)
 #define AS3935_ADDRESS(x)      ((x) << 8)
 
@@ -105,7 +104,7 @@ static int as3935_write(struct as3935_state *st,
 {
        u8 *buf = st->buf;
 
-       buf[0] = (AS3935_WRITE_DATA | AS3935_ADDRESS(reg)) >> 8;
+       buf[0] = AS3935_ADDRESS(reg) >> 8;
        buf[1] = val;
 
        return spi_write(st->spi, buf, 2);
index 0f1a2cf334bf29fee830aab71c4768c81623e7a5..25248d644e7cb2aafaa212b52be163679d4cfc31 100644 (file)
@@ -170,10 +170,10 @@ static ssize_t stm32_tt_read_frequency(struct device *dev,
        regmap_read(priv->regmap, TIM_PSC, &psc);
        regmap_read(priv->regmap, TIM_ARR, &arr);
 
-       if (psc && arr && (cr1 & TIM_CR1_CEN)) {
+       if (cr1 & TIM_CR1_CEN) {
                freq = (unsigned long long)clk_get_rate(priv->clk);
-               do_div(freq, psc);
-               do_div(freq, arr);
+               do_div(freq, psc + 1);
+               do_div(freq, arr + 1);
        }
 
        return sprintf(buf, "%d\n", (unsigned int)freq);
index 7ef111d3ecc5561c419dc16ff4c08d88016e9085..f32d7c392c1ec9532a51e801e45a22e4942d0661 100644 (file)
@@ -231,6 +231,8 @@ struct hid_sensor_common {
        unsigned usage_id;
        atomic_t data_ready;
        atomic_t user_requested_state;
+       int poll_interval;
+       int raw_hystersis;
        struct iio_trigger *trigger;
        int timestamp_ns_scale;
        struct hid_sensor_hub_attribute_info poll;