Commit 935c200a authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'staging-4.16-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging

Pull staging/IIO fixes from Greg KH:
 "Here are a few small staging and IIO fixes for various reported
  issues.

  All of them are tiny, the majority being iio driver fixes for small
  issues, and one staging driver fix for a memory corruption issue.

  All have been in linux-next with no reported issues"

* tag 'staging-4.16-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
  staging: ncpfs: memory corruption in ncp_read_kernel()
  iio: st_pressure: st_accel: pass correct platform data to init
  Revert "iio: accel: st_accel: remove redundant pointer pdata"
  iio: adc: meson-saradc: unlock on error in meson_sar_adc_lock()
  dt-bindings: iio: adc: sd-modulator: fix io-channel-cells
  iio: adc: stm32-dfsdm: fix multiple channel initialization
  iio: adc: stm32-dfsdm: fix clock source selection
  iio: adc: stm32-dfsdm: fix call to stop channel
  iio: adc: stm32-dfsdm: fix compatible data use
  iio: chemical: ccs811: Corrected firmware boot/application mode transition
parents 97235e74 4c41aa24
...@@ -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;
......
...@@ -981,6 +981,10 @@ ncp_read_kernel(struct ncp_server *server, const char *file_id, ...@@ -981,6 +981,10 @@ ncp_read_kernel(struct ncp_server *server, const char *file_id,
goto out; goto out;
} }
*bytes_read = ncp_reply_be16(server, 0); *bytes_read = ncp_reply_be16(server, 0);
if (*bytes_read > to_read) {
result = -EINVAL;
goto out;
}
source = ncp_reply_data(server, 2 + (offset & 1)); source = ncp_reply_data(server, 2 + (offset & 1));
memcpy(target, source, *bytes_read); memcpy(target, source, *bytes_read);
......
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