forked from luck/tmp_suning_uos_patched
First round of IIO fixes for the 4.14 cycle
Note this includes fixes from recent merge window. As such the tree is based on top of a prior staging/staging-next tree. * iio core - return and error for a failed read_reg debugfs call rather than eating the error. * ad7192 - Use the dedicated reset function in the ad_sigma_delta library instead of an spi transfer with the data on the stack which could cause problems with DMA. * ad7793 - Implement a dedicate reset function in the ad_sigma_delta library and use it to correctly reset this part. * bme280 - ctrl_reg write must occur after any register writes for updates to take effect. * mcp320x - negative voltage readout was broken. - Fix an oops on module unload due to spi_set_drvdata not being called in probe. * st_magn - Fix the data ready line configuration for the lis3mdl. It is not configurable so the st_magn core was assuming it didn't exist and so wasn't consuming interrupts resulting in an unhandled interrupt. * stm32-adc - off by one error on max channels checking. * stm32-timer - preset should not be buffered - reorganising register writes avoids this. - fix a corner case in which write preset goes wrong when a timer is used first as a trigger then as a counter with preset. Odd case but you never know. * ti-ads1015 - Fix setting of comparator polarity by fixing bitfield definition. * twl4030 - Error path handling fix to cleanup in event of regulator registration failure. - Disable the vusb3v1 regulator correctly in error handling - Don't paper over a regulator enable failure. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEbilms4eEBlKRJoGxVIU0mcT0FogFAlnH2PkRHGppYzIzQGtl cm5lbC5vcmcACgkQVIU0mcT0FoiNFw//XKT/CRq7R8Dg5vy4FT7NRw/SpSVH9u8M JsIISyAoh0jfOFJFkVv2Ll+Zs+SkbXJOPMUreaFJMnftSCkBdteT9D5kz5cYiUkO sFn58YEEqKCqQVJBEi0yM00HMxbpNKiNHXzo9WC8ZiUVRJqSigq1coznSqaZngRd yf4a9Z33jiH/NXalqy5Vb4CSn76UWpvvYJ11tuNxXqOldkyU4sm8bvsPWnBg1qG3 YIuVZs83Rv1HW0t6ktYf3WwC2rBhKEM8st2fUCLkU+4+foDuqQBiFdWJzTcxe6Ru 8za+q3ngOo7rRkLS8cSTsh8hbfKwIV0e3rQvsN3zqodqjPilw9uH3eybMYzLK/0I j9o12jaD1Ow7zQfiQnNnyJqDLddEt+f6GcrI/iYQPlTIQIhqDii4YInDyCrF4xbr i/8saOr5n4PsdHRovTUl2rrgiX+Jix6OmNLEtUdp1HWrc0XwbZ5L/1g6pXFL98QZ Kq8MwjNu+6x+66Hga/1fll19hZ/VMYGqxFtoP+6S28TS1bO9dXm6XNl5/U5Nh5mN J255UFCdFkBmJO9nP7tmbDscMCAbhc6AOHKxjUebuoNnyhyV+20W9S/gpzTIilnO Gv9D0z29zITc8Hpfhl2YKC6F00BuRAdPFJo05rSE/KoWX3bkPCiXFTfQ+aPwB72h bYT4oJeUoQg= =CcjQ -----END PGP SIGNATURE----- Merge tag 'iio-fixes-for-4.14a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus Jonathan writes: First round of IIO fixes for the 4.14 cycle Note this includes fixes from recent merge window. As such the tree is based on top of a prior staging/staging-next tree. * iio core - return and error for a failed read_reg debugfs call rather than eating the error. * ad7192 - Use the dedicated reset function in the ad_sigma_delta library instead of an spi transfer with the data on the stack which could cause problems with DMA. * ad7793 - Implement a dedicate reset function in the ad_sigma_delta library and use it to correctly reset this part. * bme280 - ctrl_reg write must occur after any register writes for updates to take effect. * mcp320x - negative voltage readout was broken. - Fix an oops on module unload due to spi_set_drvdata not being called in probe. * st_magn - Fix the data ready line configuration for the lis3mdl. It is not configurable so the st_magn core was assuming it didn't exist and so wasn't consuming interrupts resulting in an unhandled interrupt. * stm32-adc - off by one error on max channels checking. * stm32-timer - preset should not be buffered - reorganising register writes avoids this. - fix a corner case in which write preset goes wrong when a timer is used first as a trigger then as a counter with preset. Odd case but you never know. * ti-ads1015 - Fix setting of comparator polarity by fixing bitfield definition. * twl4030 - Error path handling fix to cleanup in event of regulator registration failure. - Disable the vusb3v1 regulator correctly in error handling - Don't paper over a regulator enable failure.
This commit is contained in:
commit
b2e312061c
|
@ -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 */
|
||||
|
|
|
@ -177,6 +177,34 @@ int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta,
|
|||
}
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
@ -96,7 +98,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;
|
||||
|
||||
|
@ -117,19 +119,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;
|
||||
}
|
||||
|
@ -150,12 +158,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;
|
||||
|
|
|
@ -1666,7 +1666,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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
@ -1017,10 +1017,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;
|
||||
|
|
|
@ -887,21 +887,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:
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
|
|
|
@ -573,7 +573,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,
|
||||
|
|
|
@ -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);
|
||||
|
@ -715,8 +716,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;
|
||||
}
|
||||
|
|
|
@ -223,11 +223,9 @@ static int ad7192_setup(struct ad7192_state *st,
|
|||
struct iio_dev *indio_dev = spi_get_drvdata(st->sd.spi);
|
||||
unsigned long long scale_uv;
|
||||
int i, ret, id;
|
||||
u8 ones[6];
|
||||
|
||||
/* reset the serial interface */
|
||||
memset(&ones, 0xFF, 6);
|
||||
ret = spi_write(st->sd.spi, &ones, 6);
|
||||
ret = ad_sd_reset(&st->sd, 48);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
usleep_range(500, 1000); /* Wait for at least 500us */
|
||||
|
|
|
@ -111,6 +111,9 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
|
|||
int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
|
||||
unsigned int size, unsigned int *val);
|
||||
|
||||
int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
|
||||
unsigned int reset_length);
|
||||
|
||||
int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan, int *val);
|
||||
int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta,
|
||||
|
|
Loading…
Reference in New Issue
Block a user