]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge tag 'iio-fixes-for-4.13a' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Jul 2017 03:54:31 +0000 (20:54 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Jul 2017 03:54:31 +0000 (20:54 -0700)
Jonathan writes:

First set of IIO fixes for the 4.13 cycle.

* ad2s1210
  - Fix negative angular velocity reads (identified by a gcc 7 warning)
* aspeed-adc
  - Wait for initialization sequence to finish before enabling channels.
  Without it no channels work.
* axp288
  - Revert a patch that dropped some bogus register mods.  No one is entirely
  sure why but it breaks charging on some devices.
  - Fix GPADC pin read returning 0. Turns out a small sleep is needed.
* bmc150
  - Make sure device is restored to normal state after suspend / resume
  cycle.  Otherwise, simple sysfs reads are broken.
* tsl2563
  - fix wrong event code.
* st-accel
  - add spi 3-wire support. Needed to fix the lsm303agr accelerometer
  which only had 3 wires in all cases.  Side effect is to enable optional
  3-wire support for other devices.
* st-pressure
  - disable multiread by default for LPS22HB (only effects SPI)
* sun4i-gpadc-iio
  - fix unbalanced irq enable / disable
* vf610
  - Fix VALT slection for REFSEL bits - ensures we are using the
  right reference pins.

1  2 
drivers/iio/accel/st_accel_core.c
drivers/iio/adc/aspeed_adc.c
drivers/iio/pressure/st_pressure_core.c

index 07d1489cd457a6b5445b8b3ba35dad95b1792acc,2ee3ae11eb2adb91779e2a7e96c42ba2ff65d48d..e44f62bf9caa9f1a45c6699875b885d497bb0a7a
@@@ -166,6 -166,10 +166,10 @@@ static const struct st_sensor_settings 
                        .mask_ihl = 0x02,
                        .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
                },
+               .sim = {
+                       .addr = 0x23,
+                       .value = BIT(0),
+               },
                .multi_read_bit = true,
                .bootime = 2,
        },
                        .mask_od = 0x40,
                        .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
                },
+               .sim = {
+                       .addr = 0x23,
+                       .value = BIT(0),
+               },
                .multi_read_bit = true,
                .bootime = 2,
        },
                                .en_mask = 0x08,
                        },
                },
+               .sim = {
+                       .addr = 0x24,
+                       .value = BIT(0),
+               },
                .multi_read_bit = false,
                .bootime = 2,
        },
                        .mask_int1 = 0x04,
                        .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
                },
+               .sim = {
+                       .addr = 0x21,
+                       .value = BIT(1),
+               },
                .multi_read_bit = true,
                .bootime = 2, /* guess */
        },
                        .mask_od = 0x40,
                        .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
                },
+               .sim = {
+                       .addr = 0x21,
+                       .value = BIT(7),
+               },
                .multi_read_bit = false,
                .bootime = 2, /* guess */
        },
                        .addr_ihl = 0x22,
                        .mask_ihl = 0x80,
                },
+               .sim = {
+                       .addr = 0x23,
+                       .value = BIT(0),
+               },
                .multi_read_bit = true,
                .bootime = 2,
        },
                        .mask_int1 = 0x04,
                        .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
                },
+               .sim = {
+                       .addr = 0x21,
+                       .value = BIT(1),
+               },
                .multi_read_bit = false,
                .bootime = 2,
        },
                        .mask_ihl = 0x02,
                        .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
                },
+               .sim = {
+                       .addr = 0x23,
+                       .value = BIT(0),
+               },
                .multi_read_bit = true,
                .bootime = 2,
        },
@@@ -710,8 -742,6 +742,8 @@@ static const struct iio_trigger_ops st_
  int st_accel_common_probe(struct iio_dev *indio_dev)
  {
        struct st_sensor_data *adata = iio_priv(indio_dev);
 +      struct st_sensors_platform_data *pdata =
 +              (struct st_sensors_platform_data *)adata->dev->platform_data;
        int irq = adata->get_irq_data_ready(indio_dev);
        int err;
  
                                        &adata->sensor_settings->fs.fs_avl[0];
        adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
  
 -      if (!adata->dev->platform_data)
 -              adata->dev->platform_data =
 -                      (struct st_sensors_platform_data *)&default_accel_pdata;
 +      if (!pdata)
 +              pdata = (struct st_sensors_platform_data *)&default_accel_pdata;
  
        err = st_sensors_init_sensor(indio_dev, adata->dev->platform_data);
        if (err < 0)
index e0ea411a0b2df9563085c70552086946843ba2ca,87fd6e0ce5ee000e871934b1ebeeb8221dd20039..c02b23d675cbc1540ec47769515da714c784cf67
@@@ -22,6 -22,7 +22,7 @@@
  
  #include <linux/iio/iio.h>
  #include <linux/iio/driver.h>
+ #include <linux/iopoll.h>
  
  #define ASPEED_RESOLUTION_BITS                10
  #define ASPEED_CLOCKS_PER_SAMPLE      12
  
  #define ASPEED_ENGINE_ENABLE          BIT(0)
  
+ #define ASPEED_ADC_CTRL_INIT_RDY      BIT(8)
+ #define ASPEED_ADC_INIT_POLLING_TIME  500
+ #define ASPEED_ADC_INIT_TIMEOUT               500000
  struct aspeed_adc_model_data {
        const char *model_name;
        unsigned int min_sampling_rate; // Hz
        unsigned int max_sampling_rate; // Hz
        unsigned int vref_voltage;      // mV
+       bool wait_init_sequence;
  };
  
  struct aspeed_adc_data {
@@@ -211,11 -218,26 +218,29 @@@ static int aspeed_adc_probe(struct plat
                goto scaler_error;
        }
  
+       model_data = of_device_get_match_data(&pdev->dev);
+       if (model_data->wait_init_sequence) {
+               /* Enable engine in normal mode. */
+               writel(ASPEED_OPERATION_MODE_NORMAL | ASPEED_ENGINE_ENABLE,
+                      data->base + ASPEED_REG_ENGINE_CONTROL);
+               /* Wait for initial sequence complete. */
+               ret = readl_poll_timeout(data->base + ASPEED_REG_ENGINE_CONTROL,
+                                        adc_engine_control_reg_val,
+                                        adc_engine_control_reg_val &
+                                        ASPEED_ADC_CTRL_INIT_RDY,
+                                        ASPEED_ADC_INIT_POLLING_TIME,
+                                        ASPEED_ADC_INIT_TIMEOUT);
+               if (ret)
+                       goto scaler_error;
+       }
        /* Start all channels in normal mode. */
 -      clk_prepare_enable(data->clk_scaler->clk);
 +      ret = clk_prepare_enable(data->clk_scaler->clk);
 +      if (ret)
 +              goto clk_enable_error;
 +
        adc_engine_control_reg_val = GENMASK(31, 16) |
                ASPEED_OPERATION_MODE_NORMAL | ASPEED_ENGINE_ENABLE;
        writel(adc_engine_control_reg_val,
@@@ -239,7 -261,6 +264,7 @@@ iio_register_error
        writel(ASPEED_OPERATION_MODE_POWER_DOWN,
                data->base + ASPEED_REG_ENGINE_CONTROL);
        clk_disable_unprepare(data->clk_scaler->clk);
 +clk_enable_error:
        clk_hw_unregister_divider(data->clk_scaler);
  
  scaler_error:
@@@ -274,6 -295,7 +299,7 @@@ static const struct aspeed_adc_model_da
        .vref_voltage = 1800, // mV
        .min_sampling_rate = 1,
        .max_sampling_rate = 1000000,
+       .wait_init_sequence = true,
  };
  
  static const struct of_device_id aspeed_adc_matches[] = {
index aa61ec15c1396ca3925ecf1a099fbf91a302dae7,99448012b47fd127afdd4ea0e0d42d23c21e1367..f1bce05ffa135703792f24317db81375d3e4ebb3
@@@ -456,7 -456,7 +456,7 @@@ static const struct st_sensor_settings 
                        .mask_od = 0x40,
                        .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
                },
-               .multi_read_bit = true,
+               .multi_read_bit = false,
                .bootime = 2,
        },
  };
@@@ -568,8 -568,6 +568,8 @@@ static const struct iio_trigger_ops st_
  int st_press_common_probe(struct iio_dev *indio_dev)
  {
        struct st_sensor_data *press_data = iio_priv(indio_dev);
 +      struct st_sensors_platform_data *pdata =
 +              (struct st_sensors_platform_data *)press_data->dev->platform_data;
        int irq = press_data->get_irq_data_ready(indio_dev);
        int err;
  
        press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
  
        /* Some devices don't support a data ready pin. */
 -      if (!press_data->dev->platform_data &&
 -                              press_data->sensor_settings->drdy_irq.addr)
 -              press_data->dev->platform_data =
 -                      (struct st_sensors_platform_data *)&default_press_pdata;
 +      if (!pdata && press_data->sensor_settings->drdy_irq.addr)
 +              pdata = (struct st_sensors_platform_data *)&default_press_pdata;
  
        err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data);
        if (err < 0)