diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-10-09 09:02:35 +0200 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-10-09 09:02:35 +0200 | 
| commit | 1236d6bb6e19fc72ffc6bbcdeb1bfefe450e54ee (patch) | |
| tree | 47da3feee8e263e8c9352c85cf518e624be3c211 /drivers/iio | |
| parent | 750b1a6894ecc9b178c6e3d0a1170122971b2036 (diff) | |
| parent | 8a5776a5f49812d29fe4b2d0a2d71675c3facf3f (diff) | |
Merge 4.14-rc4 into staging-next
We want the staging/iio fixes in here as well to handle merge issues.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/iio')
| -rw-r--r-- | drivers/iio/adc/ad7793.c | 4 | ||||
| -rw-r--r-- | drivers/iio/adc/ad_sigma_delta.c | 28 | ||||
| -rw-r--r-- | drivers/iio/adc/mcp320x.c | 25 | ||||
| -rw-r--r-- | drivers/iio/adc/stm32-adc.c | 2 | ||||
| -rw-r--r-- | drivers/iio/adc/ti-ads1015.c | 8 | ||||
| -rw-r--r-- | drivers/iio/adc/twl4030-madc.c | 14 | ||||
| -rw-r--r-- | drivers/iio/common/st_sensors/st_sensors_core.c | 11 | ||||
| -rw-r--r-- | drivers/iio/industrialio-core.c | 4 | ||||
| -rw-r--r-- | drivers/iio/magnetometer/st_magn_core.c | 4 | ||||
| -rw-r--r-- | drivers/iio/pressure/bmp280-core.c | 2 | ||||
| -rw-r--r-- | drivers/iio/trigger/stm32-timer-trigger.c | 4 | 
11 files changed, 83 insertions, 23 deletions
| diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c index c40263ad881f..801afb61310b 100644 --- a/drivers/iio/adc/ad7793.c +++ b/drivers/iio/adc/ad7793.c @@ -257,7 +257,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,  	unsigned int vref_mv)  {  	struct ad7793_state *st = iio_priv(indio_dev); -	int i, ret = -1; +	int i, ret;  	unsigned long long scale_uv;  	u32 id; @@ -266,7 +266,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,  		return ret;  	/* reset the serial interface */ -	ret = spi_write(st->sd.spi, (u8 *)&ret, sizeof(ret)); +	ret = ad_sd_reset(&st->sd, 32);  	if (ret < 0)  		goto out;  	usleep_range(500, 2000); /* Wait for at least 500us */ diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c index e3ed74ee41d1..cf1b048b0665 100644 --- a/drivers/iio/adc/ad_sigma_delta.c +++ b/drivers/iio/adc/ad_sigma_delta.c @@ -177,6 +177,34 @@ out:  }  EXPORT_SYMBOL_GPL(ad_sd_read_reg); +/** + * ad_sd_reset() - Reset the serial interface + * + * @sigma_delta: The sigma delta device + * @reset_length: Number of SCLKs with DIN = 1 + * + * Returns 0 on success, an error code otherwise. + **/ +int ad_sd_reset(struct ad_sigma_delta *sigma_delta, +	unsigned int reset_length) +{ +	uint8_t *buf; +	unsigned int size; +	int ret; + +	size = DIV_ROUND_UP(reset_length, 8); +	buf = kcalloc(size, sizeof(*buf), GFP_KERNEL); +	if (!buf) +		return -ENOMEM; + +	memset(buf, 0xff, size); +	ret = spi_write(sigma_delta->spi, buf, size); +	kfree(buf); + +	return ret; +} +EXPORT_SYMBOL_GPL(ad_sd_reset); +  static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,  	unsigned int mode, unsigned int channel)  { diff --git a/drivers/iio/adc/mcp320x.c b/drivers/iio/adc/mcp320x.c index a41956eb3379..32859188d653 100644 --- a/drivers/iio/adc/mcp320x.c +++ b/drivers/iio/adc/mcp320x.c @@ -17,6 +17,8 @@   * MCP3204   * MCP3208   * ------------ + * 13 bit converter + * MCP3301   *   * Datasheet can be found here:   * http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf  mcp3001 @@ -103,7 +105,7 @@ static int mcp320x_channel_to_tx_data(int device_index,  }  static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel, -				  bool differential, int device_index) +				  bool differential, int device_index, int *val)  {  	int ret; @@ -118,19 +120,25 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,  	switch (device_index) {  	case mcp3001: -		return (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3); +		*val = (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3); +		return 0;  	case mcp3002:  	case mcp3004:  	case mcp3008: -		return (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6); +		*val = (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6); +		return 0;  	case mcp3201: -		return (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1); +		*val = (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1); +		return 0;  	case mcp3202:  	case mcp3204:  	case mcp3208: -		return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4); +		*val = (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4); +		return 0;  	case mcp3301: -		return sign_extend32((adc->rx_buf[0] & 0x1f) << 8 | adc->rx_buf[1], 12); +		*val = sign_extend32((adc->rx_buf[0] & 0x1f) << 8 +				    | adc->rx_buf[1], 12); +		return 0;  	default:  		return -EINVAL;  	} @@ -151,12 +159,10 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev,  	switch (mask) {  	case IIO_CHAN_INFO_RAW:  		ret = mcp320x_adc_conversion(adc, channel->address, -			channel->differential, device_index); - +			channel->differential, device_index, val);  		if (ret < 0)  			goto out; -		*val = ret;  		ret = IIO_VAL_INT;  		break; @@ -312,6 +318,7 @@ static int mcp320x_probe(struct spi_device *spi)  	indio_dev->name = spi_get_device_id(spi)->name;  	indio_dev->modes = INDIO_DIRECT_MODE;  	indio_dev->info = &mcp320x_info; +	spi_set_drvdata(spi, indio_dev);  	chip_info = &mcp320x_chip_infos[spi_get_device_id(spi)->driver_data];  	indio_dev->channels = chip_info->channels; diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c index d965b6121e5d..8b7c24780a8a 100644 --- a/drivers/iio/adc/stm32-adc.c +++ b/drivers/iio/adc/stm32-adc.c @@ -1665,7 +1665,7 @@ static int stm32_adc_chan_of_init(struct iio_dev *indio_dev)  	num_channels = of_property_count_u32_elems(node, "st,adc-channels");  	if (num_channels < 0 || -	    num_channels >= adc_info->max_channels) { +	    num_channels > adc_info->max_channels) {  		dev_err(&indio_dev->dev, "Bad st,adc-channels?\n");  		return num_channels < 0 ? num_channels : -EINVAL;  	} diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c index 3e9719e8cf3b..6a114dcb4a3a 100644 --- a/drivers/iio/adc/ti-ads1015.c +++ b/drivers/iio/adc/ti-ads1015.c @@ -52,7 +52,7 @@  #define ADS1015_CFG_COMP_QUE_MASK	GENMASK(1, 0)  #define ADS1015_CFG_COMP_LAT_MASK	BIT(2) -#define ADS1015_CFG_COMP_POL_MASK	BIT(2) +#define ADS1015_CFG_COMP_POL_MASK	BIT(3)  #define ADS1015_CFG_COMP_MODE_MASK	BIT(4)  #define ADS1015_CFG_DR_MASK	GENMASK(7, 5)  #define ADS1015_CFG_MOD_MASK	BIT(8) @@ -1015,10 +1015,12 @@ static int ads1015_probe(struct i2c_client *client,  		switch (irq_trig) {  		case IRQF_TRIGGER_LOW: -			cfg_comp |= ADS1015_CFG_COMP_POL_LOW; +			cfg_comp |= ADS1015_CFG_COMP_POL_LOW << +					ADS1015_CFG_COMP_POL_SHIFT;  			break;  		case IRQF_TRIGGER_HIGH: -			cfg_comp |= ADS1015_CFG_COMP_POL_HIGH; +			cfg_comp |= ADS1015_CFG_COMP_POL_HIGH << +					ADS1015_CFG_COMP_POL_SHIFT;  			break;  		default:  			return -EINVAL; diff --git a/drivers/iio/adc/twl4030-madc.c b/drivers/iio/adc/twl4030-madc.c index 438aa25f548d..8c019bb6625f 100644 --- a/drivers/iio/adc/twl4030-madc.c +++ b/drivers/iio/adc/twl4030-madc.c @@ -886,21 +886,27 @@ static int twl4030_madc_probe(struct platform_device *pdev)  	/* Enable 3v1 bias regulator for MADC[3:6] */  	madc->usb3v1 = devm_regulator_get(madc->dev, "vusb3v1"); -	if (IS_ERR(madc->usb3v1)) -		return -ENODEV; +	if (IS_ERR(madc->usb3v1)) { +		ret = -ENODEV; +		goto err_i2c; +	}  	ret = regulator_enable(madc->usb3v1); -	if (ret) +	if (ret) {  		dev_err(madc->dev, "could not enable 3v1 bias regulator\n"); +		goto err_i2c; +	}  	ret = iio_device_register(iio_dev);  	if (ret) {  		dev_err(&pdev->dev, "could not register iio device\n"); -		goto err_i2c; +		goto err_usb3v1;  	}  	return 0; +err_usb3v1: +	regulator_disable(madc->usb3v1);  err_i2c:  	twl4030_madc_set_current_generator(madc, 0, 0);  err_current_generator: diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c index d99bb1460fe2..02e833b14db0 100644 --- a/drivers/iio/common/st_sensors/st_sensors_core.c +++ b/drivers/iio/common/st_sensors/st_sensors_core.c @@ -463,8 +463,17 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)  	u8 drdy_mask;  	struct st_sensor_data *sdata = iio_priv(indio_dev); -	if (!sdata->sensor_settings->drdy_irq.addr) +	if (!sdata->sensor_settings->drdy_irq.addr) { +		/* +		 * there are some devices (e.g. LIS3MDL) where drdy line is +		 * routed to a given pin and it is not possible to select a +		 * different one. Take into account irq status register +		 * to understand if irq trigger can be properly supported +		 */ +		if (sdata->sensor_settings->drdy_irq.addr_stat_drdy) +			sdata->hw_irq_trigger = enable;  		return 0; +	}  	/* Enable/Disable the interrupt generator 1. */  	if (sdata->sensor_settings->drdy_irq.ig1.en_addr > 0) { diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index 7a5aa127c52e..9c4cfd19b739 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -310,8 +310,10 @@ static ssize_t iio_debugfs_read_reg(struct file *file, char __user *userbuf,  	ret = indio_dev->info->debugfs_reg_access(indio_dev,  						  indio_dev->cached_reg_addr,  						  0, &val); -	if (ret) +	if (ret) {  		dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__); +		return ret; +	}  	len = snprintf(buf, sizeof(buf), "0x%X\n", val); diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c index 926031d64978..703de313c418 100644 --- a/drivers/iio/magnetometer/st_magn_core.c +++ b/drivers/iio/magnetometer/st_magn_core.c @@ -315,6 +315,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {  				},  			},  		}, +		.drdy_irq = { +			/* drdy line is routed drdy pin */ +			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, +		},  		.multi_read_bit = true,  		.bootime = 2,  	}, diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c index 8d5c7b250b11..fd1da26a62e4 100644 --- a/drivers/iio/pressure/bmp280-core.c +++ b/drivers/iio/pressure/bmp280-core.c @@ -572,7 +572,7 @@ static int bmp280_chip_config(struct bmp280_data *data)  	u8 osrs = BMP280_OSRS_TEMP_X(data->oversampling_temp + 1) |  		  BMP280_OSRS_PRESS_X(data->oversampling_press + 1); -	ret = regmap_update_bits(data->regmap, BMP280_REG_CTRL_MEAS, +	ret = regmap_write_bits(data->regmap, BMP280_REG_CTRL_MEAS,  				 BMP280_OSRS_TEMP_MASK |  				 BMP280_OSRS_PRESS_MASK |  				 BMP280_MODE_MASK, diff --git a/drivers/iio/trigger/stm32-timer-trigger.c b/drivers/iio/trigger/stm32-timer-trigger.c index d523b056f468..b542dc484969 100644 --- a/drivers/iio/trigger/stm32-timer-trigger.c +++ b/drivers/iio/trigger/stm32-timer-trigger.c @@ -174,6 +174,7 @@ static void stm32_timer_stop(struct stm32_timer_trigger *priv)  		clk_disable(priv->clk);  	/* Stop timer */ +	regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);  	regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);  	regmap_write(priv->regmap, TIM_PSC, 0);  	regmap_write(priv->regmap, TIM_ARR, 0); @@ -713,8 +714,9 @@ static ssize_t stm32_count_set_preset(struct iio_dev *indio_dev,  	if (ret)  		return ret; +	/* TIMx_ARR register shouldn't be buffered (ARPE=0) */ +	regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);  	regmap_write(priv->regmap, TIM_ARR, preset); -	regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE);  	return len;  } | 
