Skip to content

Commit 08bbc4f

Browse files
committed
Merge tag 'staging-4.14-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging/IIO fixes from Greg KH: "Here are some small staging/IIO driver fixes for 4.14-rc4 Most of these have been in my tree for a while due to travels, sorry for the delay. They resolve a number of small issues reported by people, mostly for the iio drivers. Nothing major in here, full details are in the shortlog. All have been linux-next for a few weeks with no reported issues" * tag 'staging-4.14-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (23 commits) staging: iio: ad7192: Fix - use the dedicated reset function avoiding dma from stack. iio: core: Return error for failed read_reg iio: ad7793: Fix the serial interface reset iio: ad_sigma_delta: Implement a dedicated reset function IIO: BME280: Updates to Humidity readings need ctrl_reg write! iio: adc: mcp320x: Fix readout of negative voltages iio: adc: mcp320x: Fix oops on module unload iio: adc: stm32: fix bad error check on max_channels iio: trigger: stm32-timer: fix a corner case to write preset iio: trigger: stm32-timer: preset shouldn't be buffered iio: adc: twl4030: Return an error if we can not enable the vusb3v1 regulator in 'twl4030_madc_probe()' iio: adc: twl4030: Disable the vusb3v1 rugulator in the error handling path of 'twl4030_madc_probe()' iio: adc: twl4030: Fix an error handling path in 'twl4030_madc_probe()' staging: rtl8723bs: avoid null pointer dereference on pmlmepriv staging: rtl8723bs: add missing range check on id staging: vchiq_2835_arm: Fix NULL ptr dereference in free_pagelist staging: speakup: fix speakup-r empty line lockup staging: pi433: Move limit check to switch default to kill warning staging: r8822be: fix null pointer dereferences with a null driver_adapter staging: mt29f_spinand: Enable the read ECC before program the page ...
2 parents c4142ed + b2e3120 commit 08bbc4f

File tree

22 files changed

+126
-51
lines changed

22 files changed

+126
-51
lines changed

drivers/iio/adc/ad7793.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
257257
unsigned int vref_mv)
258258
{
259259
struct ad7793_state *st = iio_priv(indio_dev);
260-
int i, ret = -1;
260+
int i, ret;
261261
unsigned long long scale_uv;
262262
u32 id;
263263

@@ -266,7 +266,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
266266
return ret;
267267

268268
/* reset the serial interface */
269-
ret = spi_write(st->sd.spi, (u8 *)&ret, sizeof(ret));
269+
ret = ad_sd_reset(&st->sd, 32);
270270
if (ret < 0)
271271
goto out;
272272
usleep_range(500, 2000); /* Wait for at least 500us */

drivers/iio/adc/ad_sigma_delta.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,34 @@ int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta,
177177
}
178178
EXPORT_SYMBOL_GPL(ad_sd_read_reg);
179179

180+
/**
181+
* ad_sd_reset() - Reset the serial interface
182+
*
183+
* @sigma_delta: The sigma delta device
184+
* @reset_length: Number of SCLKs with DIN = 1
185+
*
186+
* Returns 0 on success, an error code otherwise.
187+
**/
188+
int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
189+
unsigned int reset_length)
190+
{
191+
uint8_t *buf;
192+
unsigned int size;
193+
int ret;
194+
195+
size = DIV_ROUND_UP(reset_length, 8);
196+
buf = kcalloc(size, sizeof(*buf), GFP_KERNEL);
197+
if (!buf)
198+
return -ENOMEM;
199+
200+
memset(buf, 0xff, size);
201+
ret = spi_write(sigma_delta->spi, buf, size);
202+
kfree(buf);
203+
204+
return ret;
205+
}
206+
EXPORT_SYMBOL_GPL(ad_sd_reset);
207+
180208
static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
181209
unsigned int mode, unsigned int channel)
182210
{

drivers/iio/adc/mcp320x.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
* MCP3204
1818
* MCP3208
1919
* ------------
20+
* 13 bit converter
21+
* MCP3301
2022
*
2123
* Datasheet can be found here:
2224
* http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf mcp3001
@@ -96,7 +98,7 @@ static int mcp320x_channel_to_tx_data(int device_index,
9698
}
9799

98100
static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
99-
bool differential, int device_index)
101+
bool differential, int device_index, int *val)
100102
{
101103
int ret;
102104

@@ -117,19 +119,25 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
117119

118120
switch (device_index) {
119121
case mcp3001:
120-
return (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3);
122+
*val = (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3);
123+
return 0;
121124
case mcp3002:
122125
case mcp3004:
123126
case mcp3008:
124-
return (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6);
127+
*val = (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6);
128+
return 0;
125129
case mcp3201:
126-
return (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1);
130+
*val = (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1);
131+
return 0;
127132
case mcp3202:
128133
case mcp3204:
129134
case mcp3208:
130-
return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4);
135+
*val = (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4);
136+
return 0;
131137
case mcp3301:
132-
return sign_extend32((adc->rx_buf[0] & 0x1f) << 8 | adc->rx_buf[1], 12);
138+
*val = sign_extend32((adc->rx_buf[0] & 0x1f) << 8
139+
| adc->rx_buf[1], 12);
140+
return 0;
133141
default:
134142
return -EINVAL;
135143
}
@@ -150,12 +158,10 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev,
150158
switch (mask) {
151159
case IIO_CHAN_INFO_RAW:
152160
ret = mcp320x_adc_conversion(adc, channel->address,
153-
channel->differential, device_index);
154-
161+
channel->differential, device_index, val);
155162
if (ret < 0)
156163
goto out;
157164

158-
*val = ret;
159165
ret = IIO_VAL_INT;
160166
break;
161167

@@ -312,6 +318,7 @@ static int mcp320x_probe(struct spi_device *spi)
312318
indio_dev->name = spi_get_device_id(spi)->name;
313319
indio_dev->modes = INDIO_DIRECT_MODE;
314320
indio_dev->info = &mcp320x_info;
321+
spi_set_drvdata(spi, indio_dev);
315322

316323
chip_info = &mcp320x_chip_infos[spi_get_device_id(spi)->driver_data];
317324
indio_dev->channels = chip_info->channels;

drivers/iio/adc/stm32-adc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1666,7 +1666,7 @@ static int stm32_adc_chan_of_init(struct iio_dev *indio_dev)
16661666

16671667
num_channels = of_property_count_u32_elems(node, "st,adc-channels");
16681668
if (num_channels < 0 ||
1669-
num_channels >= adc_info->max_channels) {
1669+
num_channels > adc_info->max_channels) {
16701670
dev_err(&indio_dev->dev, "Bad st,adc-channels?\n");
16711671
return num_channels < 0 ? num_channels : -EINVAL;
16721672
}

drivers/iio/adc/ti-ads1015.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252

5353
#define ADS1015_CFG_COMP_QUE_MASK GENMASK(1, 0)
5454
#define ADS1015_CFG_COMP_LAT_MASK BIT(2)
55-
#define ADS1015_CFG_COMP_POL_MASK BIT(2)
55+
#define ADS1015_CFG_COMP_POL_MASK BIT(3)
5656
#define ADS1015_CFG_COMP_MODE_MASK BIT(4)
5757
#define ADS1015_CFG_DR_MASK GENMASK(7, 5)
5858
#define ADS1015_CFG_MOD_MASK BIT(8)
@@ -1017,10 +1017,12 @@ static int ads1015_probe(struct i2c_client *client,
10171017

10181018
switch (irq_trig) {
10191019
case IRQF_TRIGGER_LOW:
1020-
cfg_comp |= ADS1015_CFG_COMP_POL_LOW;
1020+
cfg_comp |= ADS1015_CFG_COMP_POL_LOW <<
1021+
ADS1015_CFG_COMP_POL_SHIFT;
10211022
break;
10221023
case IRQF_TRIGGER_HIGH:
1023-
cfg_comp |= ADS1015_CFG_COMP_POL_HIGH;
1024+
cfg_comp |= ADS1015_CFG_COMP_POL_HIGH <<
1025+
ADS1015_CFG_COMP_POL_SHIFT;
10241026
break;
10251027
default:
10261028
return -EINVAL;

drivers/iio/adc/twl4030-madc.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -887,21 +887,27 @@ static int twl4030_madc_probe(struct platform_device *pdev)
887887

888888
/* Enable 3v1 bias regulator for MADC[3:6] */
889889
madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1");
890-
if (IS_ERR(madc->usb3v1))
891-
return -ENODEV;
890+
if (IS_ERR(madc->usb3v1)) {
891+
ret = -ENODEV;
892+
goto err_i2c;
893+
}
892894

893895
ret = regulator_enable(madc->usb3v1);
894-
if (ret)
896+
if (ret) {
895897
dev_err(madc->dev, "could not enable 3v1 bias regulator\n");
898+
goto err_i2c;
899+
}
896900

897901
ret = iio_device_register(iio_dev);
898902
if (ret) {
899903
dev_err(&pdev->dev, "could not register iio device\n");
900-
goto err_i2c;
904+
goto err_usb3v1;
901905
}
902906

903907
return 0;
904908

909+
err_usb3v1:
910+
regulator_disable(madc->usb3v1);
905911
err_i2c:
906912
twl4030_madc_set_current_generator(madc, 0, 0);
907913
err_current_generator:

drivers/iio/common/st_sensors/st_sensors_core.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,8 +463,17 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
463463
u8 drdy_mask;
464464
struct st_sensor_data *sdata = iio_priv(indio_dev);
465465

466-
if (!sdata->sensor_settings->drdy_irq.addr)
466+
if (!sdata->sensor_settings->drdy_irq.addr) {
467+
/*
468+
* there are some devices (e.g. LIS3MDL) where drdy line is
469+
* routed to a given pin and it is not possible to select a
470+
* different one. Take into account irq status register
471+
* to understand if irq trigger can be properly supported
472+
*/
473+
if (sdata->sensor_settings->drdy_irq.addr_stat_drdy)
474+
sdata->hw_irq_trigger = enable;
467475
return 0;
476+
}
468477

469478
/* Enable/Disable the interrupt generator 1. */
470479
if (sdata->sensor_settings->drdy_irq.ig1.en_addr > 0) {

drivers/iio/industrialio-core.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,10 @@ static ssize_t iio_debugfs_read_reg(struct file *file, char __user *userbuf,
310310
ret = indio_dev->info->debugfs_reg_access(indio_dev,
311311
indio_dev->cached_reg_addr,
312312
0, &val);
313-
if (ret)
313+
if (ret) {
314314
dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__);
315+
return ret;
316+
}
315317

316318
len = snprintf(buf, sizeof(buf), "0x%X\n", val);
317319

drivers/iio/magnetometer/st_magn_core.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
315315
},
316316
},
317317
},
318+
.drdy_irq = {
319+
/* drdy line is routed drdy pin */
320+
.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
321+
},
318322
.multi_read_bit = true,
319323
.bootime = 2,
320324
},

drivers/iio/pressure/bmp280-core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ static int bmp280_chip_config(struct bmp280_data *data)
573573
u8 osrs = BMP280_OSRS_TEMP_X(data->oversampling_temp + 1) |
574574
BMP280_OSRS_PRESS_X(data->oversampling_press + 1);
575575

576-
ret = regmap_update_bits(data->regmap, BMP280_REG_CTRL_MEAS,
576+
ret = regmap_write_bits(data->regmap, BMP280_REG_CTRL_MEAS,
577577
BMP280_OSRS_TEMP_MASK |
578578
BMP280_OSRS_PRESS_MASK |
579579
BMP280_MODE_MASK,

drivers/iio/trigger/stm32-timer-trigger.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ static void stm32_timer_stop(struct stm32_timer_trigger *priv)
174174
clk_disable(priv->clk);
175175

176176
/* Stop timer */
177+
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);
177178
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
178179
regmap_write(priv->regmap, TIM_PSC, 0);
179180
regmap_write(priv->regmap, TIM_ARR, 0);
@@ -715,8 +716,9 @@ static ssize_t stm32_count_set_preset(struct iio_dev *indio_dev,
715716
if (ret)
716717
return ret;
717718

719+
/* TIMx_ARR register shouldn't be buffered (ARPE=0) */
720+
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);
718721
regmap_write(priv->regmap, TIM_ARR, preset);
719-
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE);
720722

721723
return len;
722724
}

drivers/staging/iio/adc/ad7192.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,9 @@ static int ad7192_setup(struct ad7192_state *st,
223223
struct iio_dev *indio_dev = spi_get_drvdata(st->sd.spi);
224224
unsigned long long scale_uv;
225225
int i, ret, id;
226-
u8 ones[6];
227226

228227
/* reset the serial interface */
229-
memset(&ones, 0xFF, 6);
230-
ret = spi_write(st->sd.spi, &ones, 6);
228+
ret = ad_sd_reset(&st->sd, 48);
231229
if (ret < 0)
232230
goto out;
233231
usleep_range(500, 1000); /* Wait for at least 500us */

drivers/staging/mt29f_spinand/mt29f_spinand.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -496,8 +496,12 @@ static int spinand_program_page(struct spi_device *spi_nand,
496496
if (!wbuf)
497497
return -ENOMEM;
498498

499-
enable_read_hw_ecc = 0;
500-
spinand_read_page(spi_nand, page_id, 0, CACHE_BUF, wbuf);
499+
enable_read_hw_ecc = 1;
500+
retval = spinand_read_page(spi_nand, page_id, 0, CACHE_BUF, wbuf);
501+
if (retval < 0) {
502+
dev_err(&spi_nand->dev, "ecc error on read page!!!\n");
503+
return retval;
504+
}
501505

502506
for (i = offset, j = 0; i < len; i++, j++)
503507
wbuf[i] &= buf[j];

drivers/staging/pi433/rf69.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -570,19 +570,16 @@ int rf69_set_dio_mapping(struct spi_device *spi, u8 DIONumber, u8 value)
570570
dev_dbg(&spi->dev, "set: DIO mapping");
571571
#endif
572572

573-
// check DIO number
574-
if (DIONumber > 5) {
575-
dev_dbg(&spi->dev, "set: illegal input param");
576-
return -EINVAL;
577-
}
578-
579573
switch (DIONumber) {
580574
case 0: mask=MASK_DIO0; shift=SHIFT_DIO0; regaddr=REG_DIOMAPPING1; break;
581575
case 1: mask=MASK_DIO1; shift=SHIFT_DIO1; regaddr=REG_DIOMAPPING1; break;
582576
case 2: mask=MASK_DIO2; shift=SHIFT_DIO2; regaddr=REG_DIOMAPPING1; break;
583577
case 3: mask=MASK_DIO3; shift=SHIFT_DIO3; regaddr=REG_DIOMAPPING1; break;
584578
case 4: mask=MASK_DIO4; shift=SHIFT_DIO4; regaddr=REG_DIOMAPPING2; break;
585579
case 5: mask=MASK_DIO5; shift=SHIFT_DIO5; regaddr=REG_DIOMAPPING2; break;
580+
default:
581+
dev_dbg(&spi->dev, "set: illegal input param");
582+
return -EINVAL;
586583
}
587584

588585
// read reg

drivers/staging/rtl8723bs/core/rtw_mlme.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,8 @@ void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv)
119119

120120
void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv)
121121
{
122-
rtw_free_mlme_priv_ie_data(pmlmepriv);
123-
124122
if (pmlmepriv) {
123+
rtw_free_mlme_priv_ie_data(pmlmepriv);
125124
if (pmlmepriv->free_bss_buf) {
126125
vfree(pmlmepriv->free_bss_buf);
127126
}

drivers/staging/rtl8723bs/os_dep/rtw_proc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,8 @@ static ssize_t proc_set_cam(struct file *file, const char __user *buffer, size_t
311311

312312
if (num < 2)
313313
return count;
314+
if (id >= TOTAL_CAM_ENTRY)
315+
return -EINVAL;
314316

315317
if (strcmp("c", cmd) == 0) {
316318
_clear_cam_entry(adapter, id);

drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_api_88xx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2901,11 +2901,11 @@ halmac_update_datapack_88xx(struct halmac_adapter *halmac_adapter,
29012901
if (halmac_adapter->fw_version.h2c_version < 4)
29022902
return HALMAC_RET_FW_NO_SUPPORT;
29032903

2904+
driver_adapter = halmac_adapter->driver_adapter;
2905+
29042906
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
29052907
"[TRACE]%s ==========>\n", __func__);
29062908

2907-
driver_adapter = halmac_adapter->driver_adapter;
2908-
29092909
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
29102910
"[TRACE]%s <==========\n", __func__);
29112911

drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,10 +1618,11 @@ halmac_send_h2c_set_pwr_mode_88xx(struct halmac_adapter *halmac_adapter,
16181618
void *driver_adapter = NULL;
16191619
enum halmac_ret_status status = HALMAC_RET_SUCCESS;
16201620

1621+
driver_adapter = halmac_adapter->driver_adapter;
1622+
16211623
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
16221624
"%s!!\n", __func__);
16231625

1624-
driver_adapter = halmac_adapter->driver_adapter;
16251626
h2c_header = h2c_buff;
16261627
h2c_cmd = h2c_header + HALMAC_H2C_CMD_HDR_SIZE_88XX;
16271628

@@ -1713,10 +1714,11 @@ halmac_media_status_rpt_88xx(struct halmac_adapter *halmac_adapter, u8 op_mode,
17131714
void *driver_adapter = NULL;
17141715
enum halmac_ret_status status = HALMAC_RET_SUCCESS;
17151716

1717+
driver_adapter = halmac_adapter->driver_adapter;
1718+
17161719
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
17171720
"halmac_send_h2c_set_pwr_mode_88xx!!\n");
17181721

1719-
driver_adapter = halmac_adapter->driver_adapter;
17201722
h2c_header = H2c_buff;
17211723
h2c_cmd = h2c_header + HALMAC_H2C_CMD_HDR_SIZE_88XX;
17221724

@@ -2143,10 +2145,11 @@ halmac_func_ctrl_ch_switch_88xx(struct halmac_adapter *halmac_adapter,
21432145
enum halmac_cmd_process_status *process_status =
21442146
&halmac_adapter->halmac_state.scan_state_set.process_status;
21452147

2148+
driver_adapter = halmac_adapter->driver_adapter;
2149+
21462150
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
21472151
"halmac_ctrl_ch_switch!!\n");
21482152

2149-
driver_adapter = halmac_adapter->driver_adapter;
21502153
halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
21512154

21522155
if (halmac_transition_scan_state_88xx(
@@ -2276,15 +2279,13 @@ enum halmac_ret_status halmac_send_h2c_update_bcn_parse_info_88xx(
22762279
{
22772280
u8 h2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = {0};
22782281
u16 h2c_seq_mum = 0;
2279-
void *driver_adapter = NULL;
2282+
void *driver_adapter = halmac_adapter->driver_adapter;
22802283
struct halmac_h2c_header_info h2c_header_info;
22812284
enum halmac_ret_status status = HALMAC_RET_SUCCESS;
22822285

22832286
HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_H2C, DBG_DMESG,
22842287
"%s!!\n", __func__);
22852288

2286-
driver_adapter = halmac_adapter->driver_adapter;
2287-
22882289
UPDATE_BEACON_PARSING_INFO_SET_FUNC_EN(h2c_buff, bcn_ie_info->func_en);
22892290
UPDATE_BEACON_PARSING_INFO_SET_SIZE_TH(h2c_buff, bcn_ie_info->size_th);
22902291
UPDATE_BEACON_PARSING_INFO_SET_TIMEOUT(h2c_buff, bcn_ie_info->timeout);

0 commit comments

Comments
 (0)