Commit b7699499 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'iio-fixes-for-4.16b' of...

Merge tag 'iio-fixes-for-4.16b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus

Jonathan writes:

Second set of IIO fixes for the 4.16 cycle.

A slightly fiddly revert then fix pair in here as the bug lead to
an unused local variable that was then removed without us noticing
the bug.  The revert should only be needed on 4.16 - the fix
goes back futher.

* ccs811
  - Fix the transition from 'boot' to 'application' mode.  Fixes the case
    where the power is not cut between boot cycles.
* meson-saradc
  - Fix missing mutex_unlock in an error path.
* sd-modulator
  - Fix bindings doc to have the right value of io-channel-cells to reflect
    that this device type only ever outputs one channel.
* st-accel
  - Revert drop of redundant pointer patch.
  - Use the now available pointer to avoid overwriting the platform data
    pointer and causing trouble on reprobing the driver.
* st-pressure
  - Use local copy of the platform data pointer to avoid overwriting the
    one associated with the device, which would cause issues on reprobing
    the driver.
* stm32-dfsdm
  - Use the right regmap_cfg for the type of device.
  - Correct the ID passed to stop channel to be the channel one.
  - Correct which clock is used to allow for the 'audio' clock.
  - Fix allocation of channels when more than one is enabled.
parents c698ca52 8b438686
...@@ -3,11 +3,11 @@ Device-Tree bindings for sigma delta modulator ...@@ -3,11 +3,11 @@ Device-Tree bindings for sigma delta modulator
Required properties: Required properties:
- compatible: should be "ads1201", "sd-modulator". "sd-modulator" can be use - compatible: should be "ads1201", "sd-modulator". "sd-modulator" can be use
as a generic SD modulator if modulator not specified in compatible list. as a generic SD modulator if modulator not specified in compatible list.
- #io-channel-cells = <1>: See the IIO bindings section "IIO consumers". - #io-channel-cells = <0>: See the IIO bindings section "IIO consumers".
Example node: Example node:
ads1202: adc@0 { ads1202: adc@0 {
compatible = "sd-modulator"; compatible = "sd-modulator";
#io-channel-cells = <1>; #io-channel-cells = <0>;
}; };
...@@ -920,6 +920,8 @@ static const struct iio_trigger_ops st_accel_trigger_ops = { ...@@ -920,6 +920,8 @@ static const struct iio_trigger_ops st_accel_trigger_ops = {
int st_accel_common_probe(struct iio_dev *indio_dev) int st_accel_common_probe(struct iio_dev *indio_dev)
{ {
struct st_sensor_data *adata = iio_priv(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 irq = adata->get_irq_data_ready(indio_dev);
int err; int err;
...@@ -946,7 +948,10 @@ int st_accel_common_probe(struct iio_dev *indio_dev) ...@@ -946,7 +948,10 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
&adata->sensor_settings->fs.fs_avl[0]; &adata->sensor_settings->fs.fs_avl[0];
adata->odr = adata->sensor_settings->odr.odr_avl[0].hz; adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
err = st_sensors_init_sensor(indio_dev, adata->dev->platform_data); if (!pdata)
pdata = (struct st_sensors_platform_data *)&default_accel_pdata;
err = st_sensors_init_sensor(indio_dev, pdata);
if (err < 0) if (err < 0)
goto st_accel_power_off; goto st_accel_power_off;
......
...@@ -462,8 +462,10 @@ static int meson_sar_adc_lock(struct iio_dev *indio_dev) ...@@ -462,8 +462,10 @@ static int meson_sar_adc_lock(struct iio_dev *indio_dev)
regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val); regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val);
} while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--); } while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--);
if (timeout < 0) if (timeout < 0) {
mutex_unlock(&indio_dev->mlock);
return -ETIMEDOUT; return -ETIMEDOUT;
}
} }
return 0; return 0;
......
...@@ -54,7 +54,6 @@ struct stm32_dfsdm_adc { ...@@ -54,7 +54,6 @@ struct stm32_dfsdm_adc {
struct stm32_dfsdm *dfsdm; struct stm32_dfsdm *dfsdm;
const struct stm32_dfsdm_dev_data *dev_data; const struct stm32_dfsdm_dev_data *dev_data;
unsigned int fl_id; unsigned int fl_id;
unsigned int ch_id;
/* ADC specific */ /* ADC specific */
unsigned int oversamp; unsigned int oversamp;
...@@ -384,7 +383,7 @@ static ssize_t dfsdm_adc_audio_set_spiclk(struct iio_dev *indio_dev, ...@@ -384,7 +383,7 @@ static ssize_t dfsdm_adc_audio_set_spiclk(struct iio_dev *indio_dev,
{ {
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id]; struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id];
struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[adc->ch_id]; struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[chan->channel];
unsigned int sample_freq = adc->sample_freq; unsigned int sample_freq = adc->sample_freq;
unsigned int spi_freq; unsigned int spi_freq;
int ret; int ret;
...@@ -419,18 +418,20 @@ static ssize_t dfsdm_adc_audio_set_spiclk(struct iio_dev *indio_dev, ...@@ -419,18 +418,20 @@ static ssize_t dfsdm_adc_audio_set_spiclk(struct iio_dev *indio_dev,
return len; return len;
} }
static int stm32_dfsdm_start_conv(struct stm32_dfsdm_adc *adc, bool dma) static int stm32_dfsdm_start_conv(struct stm32_dfsdm_adc *adc,
const struct iio_chan_spec *chan,
bool dma)
{ {
struct regmap *regmap = adc->dfsdm->regmap; struct regmap *regmap = adc->dfsdm->regmap;
int ret; int ret;
unsigned int dma_en = 0, cont_en = 0; unsigned int dma_en = 0, cont_en = 0;
ret = stm32_dfsdm_start_channel(adc->dfsdm, adc->ch_id); ret = stm32_dfsdm_start_channel(adc->dfsdm, chan->channel);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = stm32_dfsdm_filter_configure(adc->dfsdm, adc->fl_id, ret = stm32_dfsdm_filter_configure(adc->dfsdm, adc->fl_id,
adc->ch_id); chan->channel);
if (ret < 0) if (ret < 0)
goto stop_channels; goto stop_channels;
...@@ -464,12 +465,13 @@ static int stm32_dfsdm_start_conv(struct stm32_dfsdm_adc *adc, bool dma) ...@@ -464,12 +465,13 @@ static int stm32_dfsdm_start_conv(struct stm32_dfsdm_adc *adc, bool dma)
regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id),
DFSDM_CR1_RCONT_MASK, 0); DFSDM_CR1_RCONT_MASK, 0);
stm32_dfsdm_stop_channel(adc->dfsdm, adc->fl_id); stm32_dfsdm_stop_channel(adc->dfsdm, chan->channel);
return ret; return ret;
} }
static void stm32_dfsdm_stop_conv(struct stm32_dfsdm_adc *adc) static void stm32_dfsdm_stop_conv(struct stm32_dfsdm_adc *adc,
const struct iio_chan_spec *chan)
{ {
struct regmap *regmap = adc->dfsdm->regmap; struct regmap *regmap = adc->dfsdm->regmap;
...@@ -482,7 +484,7 @@ static void stm32_dfsdm_stop_conv(struct stm32_dfsdm_adc *adc) ...@@ -482,7 +484,7 @@ static void stm32_dfsdm_stop_conv(struct stm32_dfsdm_adc *adc)
regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id),
DFSDM_CR1_RCONT_MASK, 0); DFSDM_CR1_RCONT_MASK, 0);
stm32_dfsdm_stop_channel(adc->dfsdm, adc->ch_id); stm32_dfsdm_stop_channel(adc->dfsdm, chan->channel);
} }
static int stm32_dfsdm_set_watermark(struct iio_dev *indio_dev, static int stm32_dfsdm_set_watermark(struct iio_dev *indio_dev,
...@@ -609,6 +611,7 @@ static int stm32_dfsdm_adc_dma_start(struct iio_dev *indio_dev) ...@@ -609,6 +611,7 @@ static int stm32_dfsdm_adc_dma_start(struct iio_dev *indio_dev)
static int stm32_dfsdm_postenable(struct iio_dev *indio_dev) static int stm32_dfsdm_postenable(struct iio_dev *indio_dev)
{ {
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
const struct iio_chan_spec *chan = &indio_dev->channels[0];
int ret; int ret;
/* Reset adc buffer index */ /* Reset adc buffer index */
...@@ -618,7 +621,7 @@ static int stm32_dfsdm_postenable(struct iio_dev *indio_dev) ...@@ -618,7 +621,7 @@ static int stm32_dfsdm_postenable(struct iio_dev *indio_dev)
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = stm32_dfsdm_start_conv(adc, true); ret = stm32_dfsdm_start_conv(adc, chan, true);
if (ret) { if (ret) {
dev_err(&indio_dev->dev, "Can't start conversion\n"); dev_err(&indio_dev->dev, "Can't start conversion\n");
goto stop_dfsdm; goto stop_dfsdm;
...@@ -635,7 +638,7 @@ static int stm32_dfsdm_postenable(struct iio_dev *indio_dev) ...@@ -635,7 +638,7 @@ static int stm32_dfsdm_postenable(struct iio_dev *indio_dev)
return 0; return 0;
err_stop_conv: err_stop_conv:
stm32_dfsdm_stop_conv(adc); stm32_dfsdm_stop_conv(adc, chan);
stop_dfsdm: stop_dfsdm:
stm32_dfsdm_stop_dfsdm(adc->dfsdm); stm32_dfsdm_stop_dfsdm(adc->dfsdm);
...@@ -645,11 +648,12 @@ static int stm32_dfsdm_postenable(struct iio_dev *indio_dev) ...@@ -645,11 +648,12 @@ static int stm32_dfsdm_postenable(struct iio_dev *indio_dev)
static int stm32_dfsdm_predisable(struct iio_dev *indio_dev) static int stm32_dfsdm_predisable(struct iio_dev *indio_dev)
{ {
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
const struct iio_chan_spec *chan = &indio_dev->channels[0];
if (adc->dma_chan) if (adc->dma_chan)
dmaengine_terminate_all(adc->dma_chan); dmaengine_terminate_all(adc->dma_chan);
stm32_dfsdm_stop_conv(adc); stm32_dfsdm_stop_conv(adc, chan);
stm32_dfsdm_stop_dfsdm(adc->dfsdm); stm32_dfsdm_stop_dfsdm(adc->dfsdm);
...@@ -730,7 +734,7 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev, ...@@ -730,7 +734,7 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev,
if (ret < 0) if (ret < 0)
goto stop_dfsdm; goto stop_dfsdm;
ret = stm32_dfsdm_start_conv(adc, false); ret = stm32_dfsdm_start_conv(adc, chan, false);
if (ret < 0) { if (ret < 0) {
regmap_update_bits(adc->dfsdm->regmap, DFSDM_CR2(adc->fl_id), regmap_update_bits(adc->dfsdm->regmap, DFSDM_CR2(adc->fl_id),
DFSDM_CR2_REOCIE_MASK, DFSDM_CR2_REOCIE(0)); DFSDM_CR2_REOCIE_MASK, DFSDM_CR2_REOCIE(0));
...@@ -751,7 +755,7 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev, ...@@ -751,7 +755,7 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev,
else else
ret = IIO_VAL_INT; ret = IIO_VAL_INT;
stm32_dfsdm_stop_conv(adc); stm32_dfsdm_stop_conv(adc, chan);
stop_dfsdm: stop_dfsdm:
stm32_dfsdm_stop_dfsdm(adc->dfsdm); stm32_dfsdm_stop_dfsdm(adc->dfsdm);
...@@ -765,7 +769,7 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev, ...@@ -765,7 +769,7 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
{ {
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id]; struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id];
struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[adc->ch_id]; struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[chan->channel];
unsigned int spi_freq = adc->spi_freq; unsigned int spi_freq = adc->spi_freq;
int ret = -EINVAL; int ret = -EINVAL;
...@@ -972,7 +976,6 @@ static int stm32_dfsdm_adc_chan_init_one(struct iio_dev *indio_dev, ...@@ -972,7 +976,6 @@ static int stm32_dfsdm_adc_chan_init_one(struct iio_dev *indio_dev,
} }
ch->scan_type.realbits = 24; ch->scan_type.realbits = 24;
ch->scan_type.storagebits = 32; ch->scan_type.storagebits = 32;
adc->ch_id = ch->channel;
return stm32_dfsdm_chan_configure(adc->dfsdm, return stm32_dfsdm_chan_configure(adc->dfsdm,
&adc->dfsdm->ch_list[ch->channel]); &adc->dfsdm->ch_list[ch->channel]);
...@@ -1001,7 +1004,7 @@ static int stm32_dfsdm_audio_init(struct iio_dev *indio_dev) ...@@ -1001,7 +1004,7 @@ static int stm32_dfsdm_audio_init(struct iio_dev *indio_dev)
} }
ch->info_mask_separate = BIT(IIO_CHAN_INFO_SAMP_FREQ); ch->info_mask_separate = BIT(IIO_CHAN_INFO_SAMP_FREQ);
d_ch = &adc->dfsdm->ch_list[adc->ch_id]; d_ch = &adc->dfsdm->ch_list[ch->channel];
if (d_ch->src != DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL) if (d_ch->src != DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL)
adc->spi_freq = adc->dfsdm->spi_master_freq; adc->spi_freq = adc->dfsdm->spi_master_freq;
...@@ -1042,8 +1045,8 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev) ...@@ -1042,8 +1045,8 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
return -ENOMEM; return -ENOMEM;
for (chan_idx = 0; chan_idx < num_ch; chan_idx++) { for (chan_idx = 0; chan_idx < num_ch; chan_idx++) {
ch->scan_index = chan_idx; ch[chan_idx].scan_index = chan_idx;
ret = stm32_dfsdm_adc_chan_init_one(indio_dev, ch); ret = stm32_dfsdm_adc_chan_init_one(indio_dev, &ch[chan_idx]);
if (ret < 0) { if (ret < 0) {
dev_err(&indio_dev->dev, "Channels init failed\n"); dev_err(&indio_dev->dev, "Channels init failed\n");
return ret; return ret;
......
...@@ -83,7 +83,7 @@ int stm32_dfsdm_start_dfsdm(struct stm32_dfsdm *dfsdm) ...@@ -83,7 +83,7 @@ int stm32_dfsdm_start_dfsdm(struct stm32_dfsdm *dfsdm)
{ {
struct dfsdm_priv *priv = container_of(dfsdm, struct dfsdm_priv, dfsdm); struct dfsdm_priv *priv = container_of(dfsdm, struct dfsdm_priv, dfsdm);
struct device *dev = &priv->pdev->dev; struct device *dev = &priv->pdev->dev;
unsigned int clk_div = priv->spi_clk_out_div; unsigned int clk_div = priv->spi_clk_out_div, clk_src;
int ret; int ret;
if (atomic_inc_return(&priv->n_active_ch) == 1) { if (atomic_inc_return(&priv->n_active_ch) == 1) {
...@@ -100,6 +100,14 @@ int stm32_dfsdm_start_dfsdm(struct stm32_dfsdm *dfsdm) ...@@ -100,6 +100,14 @@ int stm32_dfsdm_start_dfsdm(struct stm32_dfsdm *dfsdm)
} }
} }
/* select clock source, e.g. 0 for "dfsdm" or 1 for "audio" */
clk_src = priv->aclk ? 1 : 0;
ret = regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(0),
DFSDM_CHCFGR1_CKOUTSRC_MASK,
DFSDM_CHCFGR1_CKOUTSRC(clk_src));
if (ret < 0)
goto disable_aclk;
/* Output the SPI CLKOUT (if clk_div == 0 clock if OFF) */ /* Output the SPI CLKOUT (if clk_div == 0 clock if OFF) */
ret = regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(0), ret = regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(0),
DFSDM_CHCFGR1_CKOUTDIV_MASK, DFSDM_CHCFGR1_CKOUTDIV_MASK,
...@@ -274,7 +282,7 @@ static int stm32_dfsdm_probe(struct platform_device *pdev) ...@@ -274,7 +282,7 @@ static int stm32_dfsdm_probe(struct platform_device *pdev)
dfsdm->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "dfsdm", dfsdm->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "dfsdm",
dfsdm->base, dfsdm->base,
&stm32h7_dfsdm_regmap_cfg); dev_data->regmap_cfg);
if (IS_ERR(dfsdm->regmap)) { if (IS_ERR(dfsdm->regmap)) {
ret = PTR_ERR(dfsdm->regmap); ret = PTR_ERR(dfsdm->regmap);
dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n", dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n",
......
...@@ -133,6 +133,9 @@ static int ccs811_start_sensor_application(struct i2c_client *client) ...@@ -133,6 +133,9 @@ static int ccs811_start_sensor_application(struct i2c_client *client)
if (ret < 0) if (ret < 0)
return ret; return ret;
if ((ret & CCS811_STATUS_FW_MODE_APPLICATION))
return 0;
if ((ret & CCS811_STATUS_APP_VALID_MASK) != if ((ret & CCS811_STATUS_APP_VALID_MASK) !=
CCS811_STATUS_APP_VALID_LOADED) CCS811_STATUS_APP_VALID_LOADED)
return -EIO; return -EIO;
......
...@@ -640,7 +640,7 @@ int st_press_common_probe(struct iio_dev *indio_dev) ...@@ -640,7 +640,7 @@ int st_press_common_probe(struct iio_dev *indio_dev)
press_data->sensor_settings->drdy_irq.int2.addr)) press_data->sensor_settings->drdy_irq.int2.addr))
pdata = (struct st_sensors_platform_data *)&default_press_pdata; pdata = (struct st_sensors_platform_data *)&default_press_pdata;
err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data); err = st_sensors_init_sensor(indio_dev, pdata);
if (err < 0) if (err < 0)
goto st_press_power_off; goto st_press_power_off;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment