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

Merge tag 'iio-fixes-for-4.1a-take2' of...

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

Jonathan writes:

The usual mixed bag of fixes for IIO in the 4.1 cycle.

Second version of this pull request as a small fix to a fix turned
up before Greg pulled it for a cc10001 patch near the top of the tree.

One core fix

* Set updated for a iio kfifo was incorrectly set to false during a failed
  update, resulting in atttempts to repeat the failed operation appearing
  to succeed.

This time I've decided to list the driver fixes in alphabetical order rather
than 'randomly'.

* axp288_adc - a recent change added a check for valid info masks when
  reading channels from consumer drivers.
* bmp280 - temperature compensation was failing to read the tfine value, hence
  causing a temperature of 0 to always be returned and incorrect presure
  measurements.
* cc10001 - Fix channel number mapping when some channels are reserved for
  remote CPUs. Fix an issue with the use of the power-up/power-down register
  (basically wrong polarity). Fix an issue due to the missinterpretting the
  return value from regulator_get_voltage. Add a delay before the start bit
  as recommended for the hardware to avoid data corruption.
* hid pressure - fix channel spec of modfiied, but no modifier (which makes no
  sense!)
* hid proximity - fix channel spec of modified, but no modifier (which makes
  no sense!). Fix a memory leak in the probe function.
* mcp320x - occasional incorrect readings on dma using spi busses due to
  cacheline corruption. Fixed by forcing ___cacheline_aligned for the buffers.
* mma9551 - buffer overrun fix (miss specified maximum length of buffers)
* mma9553 - endian fix on status message. Add an enable element for activity
  channel. Input checking for activity period to avoid rather unpredictable
  results.
* spmi-vadc - fix an overflow in the output value normalization seen on some
  boards.
* st-snesors - oops due to use of a mutex that is not yet initialized during
  probe.
* xilinx adc - Some wrong register addresses, a wrong address for vccaux
  channel, incorrect scale on VREFP and incorrect sign on VREFN.
parents 892c89d5 f0828ba9
...@@ -389,7 +389,12 @@ int mma9551_read_config_words(struct i2c_client *client, u8 app_id, ...@@ -389,7 +389,12 @@ int mma9551_read_config_words(struct i2c_client *client, u8 app_id,
{ {
int ret, i; int ret, i;
int len_words = len / sizeof(u16); int len_words = len / sizeof(u16);
__be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS]; __be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS / 2];
if (len_words > ARRAY_SIZE(be_buf)) {
dev_err(&client->dev, "Invalid buffer size %d\n", len);
return -EINVAL;
}
ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_CONFIG, ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_CONFIG,
reg, NULL, 0, (u8 *) be_buf, len); reg, NULL, 0, (u8 *) be_buf, len);
...@@ -424,7 +429,12 @@ int mma9551_read_status_words(struct i2c_client *client, u8 app_id, ...@@ -424,7 +429,12 @@ int mma9551_read_status_words(struct i2c_client *client, u8 app_id,
{ {
int ret, i; int ret, i;
int len_words = len / sizeof(u16); int len_words = len / sizeof(u16);
__be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS]; __be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS / 2];
if (len_words > ARRAY_SIZE(be_buf)) {
dev_err(&client->dev, "Invalid buffer size %d\n", len);
return -EINVAL;
}
ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_STATUS, ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_STATUS,
reg, NULL, 0, (u8 *) be_buf, len); reg, NULL, 0, (u8 *) be_buf, len);
...@@ -459,7 +469,12 @@ int mma9551_write_config_words(struct i2c_client *client, u8 app_id, ...@@ -459,7 +469,12 @@ int mma9551_write_config_words(struct i2c_client *client, u8 app_id,
{ {
int i; int i;
int len_words = len / sizeof(u16); int len_words = len / sizeof(u16);
__be16 be_buf[MMA9551_MAX_MAILBOX_DATA_REGS]; __be16 be_buf[(MMA9551_MAX_MAILBOX_DATA_REGS - 1) / 2];
if (len_words > ARRAY_SIZE(be_buf)) {
dev_err(&client->dev, "Invalid buffer size %d\n", len);
return -EINVAL;
}
for (i = 0; i < len_words; i++) for (i = 0; i < len_words; i++)
be_buf[i] = cpu_to_be16(buf[i]); be_buf[i] = cpu_to_be16(buf[i]);
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#define MMA9553_MASK_CONF_STEPCOALESCE GENMASK(7, 0) #define MMA9553_MASK_CONF_STEPCOALESCE GENMASK(7, 0)
#define MMA9553_REG_CONF_ACTTHD 0x0E #define MMA9553_REG_CONF_ACTTHD 0x0E
#define MMA9553_MAX_ACTTHD GENMASK(15, 0)
/* Pedometer status registers (R-only) */ /* Pedometer status registers (R-only) */
#define MMA9553_REG_STATUS 0x00 #define MMA9553_REG_STATUS 0x00
...@@ -316,22 +317,19 @@ static int mma9553_set_config(struct mma9553_data *data, u16 reg, ...@@ -316,22 +317,19 @@ static int mma9553_set_config(struct mma9553_data *data, u16 reg,
static int mma9553_read_activity_stepcnt(struct mma9553_data *data, static int mma9553_read_activity_stepcnt(struct mma9553_data *data,
u8 *activity, u16 *stepcnt) u8 *activity, u16 *stepcnt)
{ {
u32 status_stepcnt; u16 buf[2];
u16 status;
int ret; int ret;
ret = mma9551_read_status_words(data->client, MMA9551_APPID_PEDOMETER, ret = mma9551_read_status_words(data->client, MMA9551_APPID_PEDOMETER,
MMA9553_REG_STATUS, sizeof(u32), MMA9553_REG_STATUS, sizeof(u32), buf);
(u16 *) &status_stepcnt);
if (ret < 0) { if (ret < 0) {
dev_err(&data->client->dev, dev_err(&data->client->dev,
"error reading status and stepcnt\n"); "error reading status and stepcnt\n");
return ret; return ret;
} }
status = status_stepcnt & MMA9553_MASK_CONF_WORD; *activity = mma9553_get_bits(buf[0], MMA9553_MASK_STATUS_ACTIVITY);
*activity = mma9553_get_bits(status, MMA9553_MASK_STATUS_ACTIVITY); *stepcnt = buf[1];
*stepcnt = status_stepcnt >> 16;
return 0; return 0;
} }
...@@ -872,6 +870,9 @@ static int mma9553_write_event_value(struct iio_dev *indio_dev, ...@@ -872,6 +870,9 @@ static int mma9553_write_event_value(struct iio_dev *indio_dev,
case IIO_EV_INFO_PERIOD: case IIO_EV_INFO_PERIOD:
switch (chan->type) { switch (chan->type) {
case IIO_ACTIVITY: case IIO_ACTIVITY:
if (val < 0 || val > MMA9553_ACTIVITY_THD_TO_SEC(
MMA9553_MAX_ACTTHD))
return -EINVAL;
mutex_lock(&data->mutex); mutex_lock(&data->mutex);
ret = mma9553_set_config(data, MMA9553_REG_CONF_ACTTHD, ret = mma9553_set_config(data, MMA9553_REG_CONF_ACTTHD,
&data->conf.actthd, &data->conf.actthd,
...@@ -971,7 +972,8 @@ static const struct iio_chan_spec_ext_info mma9553_ext_info[] = { ...@@ -971,7 +972,8 @@ static const struct iio_chan_spec_ext_info mma9553_ext_info[] = {
.modified = 1, \ .modified = 1, \
.channel2 = _chan2, \ .channel2 = _chan2, \
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), \ .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), \
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBHEIGHT), \ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBHEIGHT) | \
BIT(IIO_CHAN_INFO_ENABLE), \
.event_spec = mma9553_activity_events, \ .event_spec = mma9553_activity_events, \
.num_event_specs = ARRAY_SIZE(mma9553_activity_events), \ .num_event_specs = ARRAY_SIZE(mma9553_activity_events), \
.ext_info = mma9553_ext_info, \ .ext_info = mma9553_ext_info, \
......
...@@ -546,6 +546,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev) ...@@ -546,6 +546,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &accel_info; indio_dev->info = &accel_info;
mutex_init(&adata->tb.buf_lock);
st_sensors_power_enable(indio_dev); st_sensors_power_enable(indio_dev);
......
...@@ -53,39 +53,42 @@ static const struct iio_chan_spec const axp288_adc_channels[] = { ...@@ -53,39 +53,42 @@ static const struct iio_chan_spec const axp288_adc_channels[] = {
.channel = 0, .channel = 0,
.address = AXP288_TS_ADC_H, .address = AXP288_TS_ADC_H,
.datasheet_name = "TS_PIN", .datasheet_name = "TS_PIN",
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
}, { }, {
.indexed = 1, .indexed = 1,
.type = IIO_TEMP, .type = IIO_TEMP,
.channel = 1, .channel = 1,
.address = AXP288_PMIC_ADC_H, .address = AXP288_PMIC_ADC_H,
.datasheet_name = "PMIC_TEMP", .datasheet_name = "PMIC_TEMP",
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
}, { }, {
.indexed = 1, .indexed = 1,
.type = IIO_TEMP, .type = IIO_TEMP,
.channel = 2, .channel = 2,
.address = AXP288_GP_ADC_H, .address = AXP288_GP_ADC_H,
.datasheet_name = "GPADC", .datasheet_name = "GPADC",
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
}, { }, {
.indexed = 1, .indexed = 1,
.type = IIO_CURRENT, .type = IIO_CURRENT,
.channel = 3, .channel = 3,
.address = AXP20X_BATT_CHRG_I_H, .address = AXP20X_BATT_CHRG_I_H,
.datasheet_name = "BATT_CHG_I", .datasheet_name = "BATT_CHG_I",
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
}, { }, {
.indexed = 1, .indexed = 1,
.type = IIO_CURRENT, .type = IIO_CURRENT,
.channel = 4, .channel = 4,
.address = AXP20X_BATT_DISCHRG_I_H, .address = AXP20X_BATT_DISCHRG_I_H,
.datasheet_name = "BATT_DISCHRG_I", .datasheet_name = "BATT_DISCHRG_I",
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
}, { }, {
.indexed = 1, .indexed = 1,
.type = IIO_VOLTAGE, .type = IIO_VOLTAGE,
.channel = 5, .channel = 5,
.address = AXP20X_BATT_V_H, .address = AXP20X_BATT_V_H,
.datasheet_name = "BATT_V", .datasheet_name = "BATT_V",
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
}, },
}; };
...@@ -151,9 +154,6 @@ static int axp288_adc_read_raw(struct iio_dev *indio_dev, ...@@ -151,9 +154,6 @@ static int axp288_adc_read_raw(struct iio_dev *indio_dev,
chan->address)) chan->address))
dev_err(&indio_dev->dev, "TS pin restore\n"); dev_err(&indio_dev->dev, "TS pin restore\n");
break; break;
case IIO_CHAN_INFO_PROCESSED:
ret = axp288_adc_read_channel(val, chan->address, info->regmap);
break;
default: default:
ret = -EINVAL; ret = -EINVAL;
} }
......
...@@ -35,8 +35,9 @@ ...@@ -35,8 +35,9 @@
#define CC10001_ADC_EOC_SET BIT(0) #define CC10001_ADC_EOC_SET BIT(0)
#define CC10001_ADC_CHSEL_SAMPLED 0x0c #define CC10001_ADC_CHSEL_SAMPLED 0x0c
#define CC10001_ADC_POWER_UP 0x10 #define CC10001_ADC_POWER_DOWN 0x10
#define CC10001_ADC_POWER_UP_SET BIT(0) #define CC10001_ADC_POWER_DOWN_SET BIT(0)
#define CC10001_ADC_DEBUG 0x14 #define CC10001_ADC_DEBUG 0x14
#define CC10001_ADC_DATA_COUNT 0x20 #define CC10001_ADC_DATA_COUNT 0x20
...@@ -62,7 +63,6 @@ struct cc10001_adc_device { ...@@ -62,7 +63,6 @@ struct cc10001_adc_device {
u16 *buf; u16 *buf;
struct mutex lock; struct mutex lock;
unsigned long channel_map;
unsigned int start_delay_ns; unsigned int start_delay_ns;
unsigned int eoc_delay_ns; unsigned int eoc_delay_ns;
}; };
...@@ -79,6 +79,18 @@ static inline u32 cc10001_adc_read_reg(struct cc10001_adc_device *adc_dev, ...@@ -79,6 +79,18 @@ static inline u32 cc10001_adc_read_reg(struct cc10001_adc_device *adc_dev,
return readl(adc_dev->reg_base + reg); return readl(adc_dev->reg_base + reg);
} }
static void cc10001_adc_power_up(struct cc10001_adc_device *adc_dev)
{
cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_DOWN, 0);
ndelay(adc_dev->start_delay_ns);
}
static void cc10001_adc_power_down(struct cc10001_adc_device *adc_dev)
{
cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_DOWN,
CC10001_ADC_POWER_DOWN_SET);
}
static void cc10001_adc_start(struct cc10001_adc_device *adc_dev, static void cc10001_adc_start(struct cc10001_adc_device *adc_dev,
unsigned int channel) unsigned int channel)
{ {
...@@ -88,6 +100,7 @@ static void cc10001_adc_start(struct cc10001_adc_device *adc_dev, ...@@ -88,6 +100,7 @@ static void cc10001_adc_start(struct cc10001_adc_device *adc_dev,
val = (channel & CC10001_ADC_CH_MASK) | CC10001_ADC_MODE_SINGLE_CONV; val = (channel & CC10001_ADC_CH_MASK) | CC10001_ADC_MODE_SINGLE_CONV;
cc10001_adc_write_reg(adc_dev, CC10001_ADC_CONFIG, val); cc10001_adc_write_reg(adc_dev, CC10001_ADC_CONFIG, val);
udelay(1);
val = cc10001_adc_read_reg(adc_dev, CC10001_ADC_CONFIG); val = cc10001_adc_read_reg(adc_dev, CC10001_ADC_CONFIG);
val = val | CC10001_ADC_START_CONV; val = val | CC10001_ADC_START_CONV;
cc10001_adc_write_reg(adc_dev, CC10001_ADC_CONFIG, val); cc10001_adc_write_reg(adc_dev, CC10001_ADC_CONFIG, val);
...@@ -129,6 +142,7 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p) ...@@ -129,6 +142,7 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p)
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
unsigned int delay_ns; unsigned int delay_ns;
unsigned int channel; unsigned int channel;
unsigned int scan_idx;
bool sample_invalid; bool sample_invalid;
u16 *data; u16 *data;
int i; int i;
...@@ -139,20 +153,17 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p) ...@@ -139,20 +153,17 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p)
mutex_lock(&adc_dev->lock); mutex_lock(&adc_dev->lock);
cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, cc10001_adc_power_up(adc_dev);
CC10001_ADC_POWER_UP_SET);
/* Wait for 8 (6+2) clock cycles before activating START */
ndelay(adc_dev->start_delay_ns);
/* Calculate delay step for eoc and sampled data */ /* Calculate delay step for eoc and sampled data */
delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT; delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
i = 0; i = 0;
sample_invalid = false; sample_invalid = false;
for_each_set_bit(channel, indio_dev->active_scan_mask, for_each_set_bit(scan_idx, indio_dev->active_scan_mask,
indio_dev->masklength) { indio_dev->masklength) {
channel = indio_dev->channels[scan_idx].channel;
cc10001_adc_start(adc_dev, channel); cc10001_adc_start(adc_dev, channel);
data[i] = cc10001_adc_poll_done(indio_dev, channel, delay_ns); data[i] = cc10001_adc_poll_done(indio_dev, channel, delay_ns);
...@@ -166,7 +177,7 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p) ...@@ -166,7 +177,7 @@ static irqreturn_t cc10001_adc_trigger_h(int irq, void *p)
} }
done: done:
cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 0); cc10001_adc_power_down(adc_dev);
mutex_unlock(&adc_dev->lock); mutex_unlock(&adc_dev->lock);
...@@ -185,11 +196,7 @@ static u16 cc10001_adc_read_raw_voltage(struct iio_dev *indio_dev, ...@@ -185,11 +196,7 @@ static u16 cc10001_adc_read_raw_voltage(struct iio_dev *indio_dev,
unsigned int delay_ns; unsigned int delay_ns;
u16 val; u16 val;
cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, cc10001_adc_power_up(adc_dev);
CC10001_ADC_POWER_UP_SET);
/* Wait for 8 (6+2) clock cycles before activating START */
ndelay(adc_dev->start_delay_ns);
/* Calculate delay step for eoc and sampled data */ /* Calculate delay step for eoc and sampled data */
delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT; delay_ns = adc_dev->eoc_delay_ns / CC10001_MAX_POLL_COUNT;
...@@ -198,7 +205,7 @@ static u16 cc10001_adc_read_raw_voltage(struct iio_dev *indio_dev, ...@@ -198,7 +205,7 @@ static u16 cc10001_adc_read_raw_voltage(struct iio_dev *indio_dev,
val = cc10001_adc_poll_done(indio_dev, chan->channel, delay_ns); val = cc10001_adc_poll_done(indio_dev, chan->channel, delay_ns);
cc10001_adc_write_reg(adc_dev, CC10001_ADC_POWER_UP, 0); cc10001_adc_power_down(adc_dev);
return val; return val;
} }
...@@ -224,7 +231,7 @@ static int cc10001_adc_read_raw(struct iio_dev *indio_dev, ...@@ -224,7 +231,7 @@ static int cc10001_adc_read_raw(struct iio_dev *indio_dev,
case IIO_CHAN_INFO_SCALE: case IIO_CHAN_INFO_SCALE:
ret = regulator_get_voltage(adc_dev->reg); ret = regulator_get_voltage(adc_dev->reg);
if (ret) if (ret < 0)
return ret; return ret;
*val = ret / 1000; *val = ret / 1000;
...@@ -255,22 +262,22 @@ static const struct iio_info cc10001_adc_info = { ...@@ -255,22 +262,22 @@ static const struct iio_info cc10001_adc_info = {
.update_scan_mode = &cc10001_update_scan_mode, .update_scan_mode = &cc10001_update_scan_mode,
}; };
static int cc10001_adc_channel_init(struct iio_dev *indio_dev) static int cc10001_adc_channel_init(struct iio_dev *indio_dev,
unsigned long channel_map)
{ {
struct cc10001_adc_device *adc_dev = iio_priv(indio_dev);
struct iio_chan_spec *chan_array, *timestamp; struct iio_chan_spec *chan_array, *timestamp;
unsigned int bit, idx = 0; unsigned int bit, idx = 0;
indio_dev->num_channels = bitmap_weight(&adc_dev->channel_map, indio_dev->num_channels = bitmap_weight(&channel_map,
CC10001_ADC_NUM_CHANNELS); CC10001_ADC_NUM_CHANNELS) + 1;
chan_array = devm_kcalloc(&indio_dev->dev, indio_dev->num_channels + 1, chan_array = devm_kcalloc(&indio_dev->dev, indio_dev->num_channels,
sizeof(struct iio_chan_spec), sizeof(struct iio_chan_spec),
GFP_KERNEL); GFP_KERNEL);
if (!chan_array) if (!chan_array)
return -ENOMEM; return -ENOMEM;
for_each_set_bit(bit, &adc_dev->channel_map, CC10001_ADC_NUM_CHANNELS) { for_each_set_bit(bit, &channel_map, CC10001_ADC_NUM_CHANNELS) {
struct iio_chan_spec *chan = &chan_array[idx]; struct iio_chan_spec *chan = &chan_array[idx];
chan->type = IIO_VOLTAGE; chan->type = IIO_VOLTAGE;
...@@ -305,6 +312,7 @@ static int cc10001_adc_probe(struct platform_device *pdev) ...@@ -305,6 +312,7 @@ static int cc10001_adc_probe(struct platform_device *pdev)
unsigned long adc_clk_rate; unsigned long adc_clk_rate;
struct resource *res; struct resource *res;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
unsigned long channel_map;
int ret; int ret;
indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*adc_dev)); indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*adc_dev));
...@@ -313,9 +321,9 @@ static int cc10001_adc_probe(struct platform_device *pdev) ...@@ -313,9 +321,9 @@ static int cc10001_adc_probe(struct platform_device *pdev)
adc_dev = iio_priv(indio_dev); adc_dev = iio_priv(indio_dev);
adc_dev->channel_map = GENMASK(CC10001_ADC_NUM_CHANNELS - 1, 0); channel_map = GENMASK(CC10001_ADC_NUM_CHANNELS - 1, 0);
if (!of_property_read_u32(node, "adc-reserved-channels", &ret)) if (!of_property_read_u32(node, "adc-reserved-channels", &ret))
adc_dev->channel_map &= ~ret; channel_map &= ~ret;
adc_dev->reg = devm_regulator_get(&pdev->dev, "vref"); adc_dev->reg = devm_regulator_get(&pdev->dev, "vref");
if (IS_ERR(adc_dev->reg)) if (IS_ERR(adc_dev->reg))
...@@ -361,7 +369,7 @@ static int cc10001_adc_probe(struct platform_device *pdev) ...@@ -361,7 +369,7 @@ static int cc10001_adc_probe(struct platform_device *pdev)
adc_dev->start_delay_ns = adc_dev->eoc_delay_ns * CC10001_WAIT_CYCLES; adc_dev->start_delay_ns = adc_dev->eoc_delay_ns * CC10001_WAIT_CYCLES;
/* Setup the ADC channels available on the device */ /* Setup the ADC channels available on the device */
ret = cc10001_adc_channel_init(indio_dev); ret = cc10001_adc_channel_init(indio_dev, channel_map);
if (ret < 0) if (ret < 0)
goto err_disable_clk; goto err_disable_clk;
......
...@@ -60,12 +60,12 @@ struct mcp320x { ...@@ -60,12 +60,12 @@ struct mcp320x {
struct spi_message msg; struct spi_message msg;
struct spi_transfer transfer[2]; struct spi_transfer transfer[2];
u8 tx_buf;
u8 rx_buf[2];
struct regulator *reg; struct regulator *reg;
struct mutex lock; struct mutex lock;
const struct mcp320x_chip_info *chip_info; const struct mcp320x_chip_info *chip_info;
u8 tx_buf ____cacheline_aligned;
u8 rx_buf[2];
}; };
static int mcp320x_channel_to_tx_data(int device_index, static int mcp320x_channel_to_tx_data(int device_index,
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/math64.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -471,11 +472,11 @@ static s32 vadc_calibrate(struct vadc_priv *vadc, ...@@ -471,11 +472,11 @@ static s32 vadc_calibrate(struct vadc_priv *vadc,
const struct vadc_channel_prop *prop, u16 adc_code) const struct vadc_channel_prop *prop, u16 adc_code)
{ {
const struct vadc_prescale_ratio *prescale; const struct vadc_prescale_ratio *prescale;
s32 voltage; s64 voltage;
voltage = adc_code - vadc->graph[prop->calibration].gnd; voltage = adc_code - vadc->graph[prop->calibration].gnd;
voltage *= vadc->graph[prop->calibration].dx; voltage *= vadc->graph[prop->calibration].dx;
voltage = voltage / vadc->graph[prop->calibration].dy; voltage = div64_s64(voltage, vadc->graph[prop->calibration].dy);
if (prop->calibration == VADC_CALIB_ABSOLUTE) if (prop->calibration == VADC_CALIB_ABSOLUTE)
voltage += vadc->graph[prop->calibration].dx; voltage += vadc->graph[prop->calibration].dx;
...@@ -487,7 +488,7 @@ static s32 vadc_calibrate(struct vadc_priv *vadc, ...@@ -487,7 +488,7 @@ static s32 vadc_calibrate(struct vadc_priv *vadc,
voltage = voltage * prescale->den; voltage = voltage * prescale->den;
return voltage / prescale->num; return div64_s64(voltage, prescale->num);
} }
static int vadc_decimation_from_dt(u32 value) static int vadc_decimation_from_dt(u32 value)
......
...@@ -856,6 +856,7 @@ static int xadc_read_raw(struct iio_dev *indio_dev, ...@@ -856,6 +856,7 @@ static int xadc_read_raw(struct iio_dev *indio_dev,
switch (chan->address) { switch (chan->address) {
case XADC_REG_VCCINT: case XADC_REG_VCCINT:
case XADC_REG_VCCAUX: case XADC_REG_VCCAUX:
case XADC_REG_VREFP:
case XADC_REG_VCCBRAM: case XADC_REG_VCCBRAM:
case XADC_REG_VCCPINT: case XADC_REG_VCCPINT:
case XADC_REG_VCCPAUX: case XADC_REG_VCCPAUX:
...@@ -996,7 +997,7 @@ static const struct iio_event_spec xadc_voltage_events[] = { ...@@ -996,7 +997,7 @@ static const struct iio_event_spec xadc_voltage_events[] = {
.num_event_specs = (_alarm) ? ARRAY_SIZE(xadc_voltage_events) : 0, \ .num_event_specs = (_alarm) ? ARRAY_SIZE(xadc_voltage_events) : 0, \
.scan_index = (_scan_index), \ .scan_index = (_scan_index), \
.scan_type = { \ .scan_type = { \
.sign = 'u', \ .sign = ((_addr) == XADC_REG_VREFN) ? 's' : 'u', \
.realbits = 12, \ .realbits = 12, \
.storagebits = 16, \ .storagebits = 16, \
.shift = 4, \ .shift = 4, \
...@@ -1008,7 +1009,7 @@ static const struct iio_event_spec xadc_voltage_events[] = { ...@@ -1008,7 +1009,7 @@ static const struct iio_event_spec xadc_voltage_events[] = {
static const struct iio_chan_spec xadc_channels[] = { static const struct iio_chan_spec xadc_channels[] = {
XADC_CHAN_TEMP(0, 8, XADC_REG_TEMP), XADC_CHAN_TEMP(0, 8, XADC_REG_TEMP),
XADC_CHAN_VOLTAGE(0, 9, XADC_REG_VCCINT, "vccint", true), XADC_CHAN_VOLTAGE(0, 9, XADC_REG_VCCINT, "vccint", true),
XADC_CHAN_VOLTAGE(1, 10, XADC_REG_VCCINT, "vccaux", true), XADC_CHAN_VOLTAGE(1, 10, XADC_REG_VCCAUX, "vccaux", true),
XADC_CHAN_VOLTAGE(2, 14, XADC_REG_VCCBRAM, "vccbram", true), XADC_CHAN_VOLTAGE(2, 14, XADC_REG_VCCBRAM, "vccbram", true),
XADC_CHAN_VOLTAGE(3, 5, XADC_REG_VCCPINT, "vccpint", true), XADC_CHAN_VOLTAGE(3, 5, XADC_REG_VCCPINT, "vccpint", true),
XADC_CHAN_VOLTAGE(4, 6, XADC_REG_VCCPAUX, "vccpaux", true), XADC_CHAN_VOLTAGE(4, 6, XADC_REG_VCCPAUX, "vccpaux", true),
......
...@@ -145,9 +145,9 @@ static inline int xadc_write_adc_reg(struct xadc *xadc, unsigned int reg, ...@@ -145,9 +145,9 @@ static inline int xadc_write_adc_reg(struct xadc *xadc, unsigned int reg,
#define XADC_REG_MAX_VCCPINT 0x28 #define XADC_REG_MAX_VCCPINT 0x28
#define XADC_REG_MAX_VCCPAUX 0x29 #define XADC_REG_MAX_VCCPAUX 0x29
#define XADC_REG_MAX_VCCO_DDR 0x2a #define XADC_REG_MAX_VCCO_DDR 0x2a
#define XADC_REG_MIN_VCCPINT 0x2b #define XADC_REG_MIN_VCCPINT 0x2c
#define XADC_REG_MIN_VCCPAUX 0x2c #define XADC_REG_MIN_VCCPAUX 0x2d
#define XADC_REG_MIN_VCCO_DDR 0x2d #define XADC_REG_MIN_VCCO_DDR 0x2e
#define XADC_REG_CONF0 0x40 #define XADC_REG_CONF0 0x40
#define XADC_REG_CONF1 0x41 #define XADC_REG_CONF1 0x41
......
...@@ -304,8 +304,6 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev, ...@@ -304,8 +304,6 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
struct st_sensors_platform_data *of_pdata; struct st_sensors_platform_data *of_pdata;
int err = 0; int err = 0;
mutex_init(&sdata->tb.buf_lock);
/* If OF/DT pdata exists, it will take precedence of anything else */ /* If OF/DT pdata exists, it will take precedence of anything else */
of_pdata = st_sensors_of_probe(indio_dev->dev.parent, pdata); of_pdata = st_sensors_of_probe(indio_dev->dev.parent, pdata);
if (of_pdata) if (of_pdata)
......
...@@ -400,6 +400,7 @@ int st_gyro_common_probe(struct iio_dev *indio_dev) ...@@ -400,6 +400,7 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &gyro_info; indio_dev->info = &gyro_info;
mutex_init(&gdata->tb.buf_lock);
st_sensors_power_enable(indio_dev); st_sensors_power_enable(indio_dev);
......
...@@ -38,7 +38,8 @@ static int iio_request_update_kfifo(struct iio_buffer *r) ...@@ -38,7 +38,8 @@ static int iio_request_update_kfifo(struct iio_buffer *r)
kfifo_free(&buf->kf); kfifo_free(&buf->kf);
ret = __iio_allocate_kfifo(buf, buf->buffer.bytes_per_datum, ret = __iio_allocate_kfifo(buf, buf->buffer.bytes_per_datum,
buf->buffer.length); buf->buffer.length);
buf->update_needed = false; if (ret >= 0)
buf->update_needed = false;
} else { } else {
kfifo_reset_out(&buf->kf); kfifo_reset_out(&buf->kf);
} }
......
...@@ -43,8 +43,6 @@ struct prox_state { ...@@ -43,8 +43,6 @@ struct prox_state {
static const struct iio_chan_spec prox_channels[] = { static const struct iio_chan_spec prox_channels[] = {
{ {
.type = IIO_PROXIMITY, .type = IIO_PROXIMITY,
.modified = 1,
.channel2 = IIO_NO_MOD,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SCALE) |
...@@ -253,7 +251,6 @@ static int hid_prox_probe(struct platform_device *pdev) ...@@ -253,7 +251,6 @@ static int hid_prox_probe(struct platform_device *pdev)
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct prox_state *prox_state; struct prox_state *prox_state;
struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
struct iio_chan_spec *channels;
indio_dev = devm_iio_device_alloc(&pdev->dev, indio_dev = devm_iio_device_alloc(&pdev->dev,
sizeof(struct prox_state)); sizeof(struct prox_state));
...@@ -272,20 +269,21 @@ static int hid_prox_probe(struct platform_device *pdev) ...@@ -272,20 +269,21 @@ static int hid_prox_probe(struct platform_device *pdev)
return ret; return ret;
} }
channels = kmemdup(prox_channels, sizeof(prox_channels), GFP_KERNEL); indio_dev->channels = kmemdup(prox_channels, sizeof(prox_channels),
if (!channels) { GFP_KERNEL);
if (!indio_dev->channels) {
dev_err(&pdev->dev, "failed to duplicate channels\n"); dev_err(&pdev->dev, "failed to duplicate channels\n");
return -ENOMEM; return -ENOMEM;
} }
ret = prox_parse_report(pdev, hsdev, channels, ret = prox_parse_report(pdev, hsdev,
(struct iio_chan_spec *)indio_dev->channels,
HID_USAGE_SENSOR_PROX, prox_state); HID_USAGE_SENSOR_PROX, prox_state);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to setup attributes\n"); dev_err(&pdev->dev, "failed to setup attributes\n");
goto error_free_dev_mem; goto error_free_dev_mem;
} }
indio_dev->channels = channels;
indio_dev->num_channels = indio_dev->num_channels =
ARRAY_SIZE(prox_channels); ARRAY_SIZE(prox_channels);
indio_dev->dev.parent = &pdev->dev; indio_dev->dev.parent = &pdev->dev;
......
...@@ -369,6 +369,7 @@ int st_magn_common_probe(struct iio_dev *indio_dev) ...@@ -369,6 +369,7 @@ int st_magn_common_probe(struct iio_dev *indio_dev)
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &magn_info; indio_dev->info = &magn_info;
mutex_init(&mdata->tb.buf_lock);
st_sensors_power_enable(indio_dev); st_sensors_power_enable(indio_dev);
......
...@@ -172,6 +172,7 @@ static s32 bmp280_compensate_temp(struct bmp280_data *data, ...@@ -172,6 +172,7 @@ static s32 bmp280_compensate_temp(struct bmp280_data *data,
var2 = (((((adc_temp >> 4) - ((s32)le16_to_cpu(buf[T1]))) * var2 = (((((adc_temp >> 4) - ((s32)le16_to_cpu(buf[T1]))) *
((adc_temp >> 4) - ((s32)le16_to_cpu(buf[T1])))) >> 12) * ((adc_temp >> 4) - ((s32)le16_to_cpu(buf[T1])))) >> 12) *
((s32)(s16)le16_to_cpu(buf[T3]))) >> 14; ((s32)(s16)le16_to_cpu(buf[T3]))) >> 14;
data->t_fine = var1 + var2;
return (data->t_fine * 5 + 128) >> 8; return (data->t_fine * 5 + 128) >> 8;
} }
......
...@@ -47,8 +47,6 @@ struct press_state { ...@@ -47,8 +47,6 @@ struct press_state {
static const struct iio_chan_spec press_channels[] = { static const struct iio_chan_spec press_channels[] = {
{ {
.type = IIO_PRESSURE, .type = IIO_PRESSURE,
.modified = 1,
.channel2 = IIO_NO_MOD,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SCALE) |
......
...@@ -417,6 +417,7 @@ int st_press_common_probe(struct iio_dev *indio_dev) ...@@ -417,6 +417,7 @@ int st_press_common_probe(struct iio_dev *indio_dev)
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &press_info; indio_dev->info = &press_info;
mutex_init(&press_data->tb.buf_lock);
st_sensors_power_enable(indio_dev); st_sensors_power_enable(indio_dev);
......
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