First set of IIO fixes for the 5.1 cycle.
Mostly the usual mix, but the bme680 SPI fix is much larger than I would normally like. It never worked, but conversely we have code there that would make people expect it to do so. Chances of side effects are very low. * core - Fix an uninitialised bitaks that could potentially result in random channels being enabled on startup. * ad7192 - Fix a wrong channel address for ad7193. *ade7854
- Fix a typo that results in returning peak voltage instead of peak current. * at91 - Fix a potential hang due to a race on interrupt setting. * bmg160 - Fix scale factor of temperature * bme680 - Fix scale factor of temperature - Fix SPI read interface. This is a bit of a large patch as it seems that it never worked. It's major for this driver but is unlikely to have any negative side effects. * kxcjk1013 - restore sensor range setting after resume. * mcp4725 - make sure to store powerdown bits when storing to the eeprom. * mpu3050 - Mask the chip ID correctly as we have chips that set the bother bits of this register. * sgp30 - Fix a missing Kconfig block that means the driver doesn't actually ever get built. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEbilms4eEBlKRJoGxVIU0mcT0FogFAlyiZb4RHGppYzIzQGtl cm5lbC5vcmcACgkQVIU0mcT0FoiGfg//UcNcHoprXS7/QnJmf0h9sQkClvCpvfFR Z08JuI5hTg8Iiz3O6UwNoyehXrK/nVmztsdY7vb+IooK+87wgoF4FuIgFOrZE5ZK aid0appdaKrDQgwF1XB2SS/g1vHfvLRnbJhJfr2eiIDbnAANAobvE8HcrDnsplCy 2nnHiZsHmXkVGK5eaxmBes0lJf8PGdPkYV4U4lf8NrCIzCUe1znlc3UtKC6mA8vN AOE0pAY6Gc6lqWTZMRZYQmlHj9Dzs95tNEIcxGbiYs4zWg8//xcfipKEu5RxzX16 TGpzC0v/QSR1lPwlGyFDs7w4le2GVyr9gOP4PiKPC53d5Z9SoapNvWhBqm/p0/Ti C8U+2HFWxztiwOXowXGO5bXzLfje5WO0/02UJlC4S2Y3e5d5CpisEEF16H68snLO hlc215E+xcMFsSdOmQmZET7QvoBuXFR6+Sa2igKtxMTrIudsWRz4W+W4hyCRXEnD JDzP059fzwN62pSEWnAt0NEkdvXhO4tMaEa80+E6zGDmRSKoHIqdOfeTC3EUJ80l w6WJ5Lo5cuNMenbMZWyRWmu4atCGd/mBikSNZyg6nVW5LG3RD9hCL5O28I4gMaGf S6kz2874FYu03nblAQ7HAhjdQp4+0/zS0vrcnopLy3kuVjcRn6GdlaYg8c1QnyiS iMwQQwm7YU8= =DeBg -----END PGP SIGNATURE----- Merge tag 'iio-fixes-for-5.1a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus Jonathan writes: First set of IIO fixes for the 5.1 cycle. Mostly the usual mix, but the bme680 SPI fix is much larger than I would normally like. It never worked, but conversely we have code there that would make people expect it to do so. Chances of side effects are very low. * core - Fix an uninitialised bitaks that could potentially result in random channels being enabled on startup. * ad7192 - Fix a wrong channel address for ad7193. *ade7854
- Fix a typo that results in returning peak voltage instead of peak current. * at91 - Fix a potential hang due to a race on interrupt setting. * bmg160 - Fix scale factor of temperature * bme680 - Fix scale factor of temperature - Fix SPI read interface. This is a bit of a large patch as it seems that it never worked. It's major for this driver but is unlikely to have any negative side effects. * kxcjk1013 - restore sensor range setting after resume. * mcp4725 - make sure to store powerdown bits when storing to the eeprom. * mpu3050 - Mask the chip ID correctly as we have chips that set the bother bits of this register. * sgp30 - Fix a missing Kconfig block that means the driver doesn't actually ever get built. * tag 'iio-fixes-for-5.1a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio: iio: core: fix a possible circular locking dependency iio: ad_sigma_delta: select channel when reading register iio: pms7003: select IIO_TRIGGERED_BUFFER iio: cros_ec: Fix the maths for gyro scale calculation iio: adc: xilinx: prevent touching unclocked h/w on remove iio: adc: xilinx: fix potential use-after-free on probe iio: adc: xilinx: fix potential use-after-free on remove iio: dac: mcp4725: add missing powerdown bits in store eeprom io: accel: kxcjk1013: restore the range after resume. iio:chemical:bme680: Fix SPI read interface iio:chemical:bme680: Fix, report temperature in millidegrees iio: chemical: fix missing Kconfig block for sgp30 iio: adc: at91: disable adc channel interrupt in timeout case iio: gyro: mpu3050: fix chip ID reading iio: Fix scan mask selection staging: iio: ad7192: Fix ad7193 channel address iio/gyro/bmg160: Use millidegrees for temperature scale Staging: iio: meter: fixed typo
This commit is contained in:
commit
360b921bdf
|
@ -1437,6 +1437,8 @@ static int kxcjk1013_resume(struct device *dev)
|
|||
|
||||
mutex_lock(&data->mutex);
|
||||
ret = kxcjk1013_set_mode(data, OPERATION);
|
||||
if (ret == 0)
|
||||
ret = kxcjk1013_set_range(data, data->range);
|
||||
mutex_unlock(&data->mutex);
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -121,6 +121,7 @@ static int ad_sd_read_reg_raw(struct ad_sigma_delta *sigma_delta,
|
|||
if (sigma_delta->info->has_registers) {
|
||||
data[0] = reg << sigma_delta->info->addr_shift;
|
||||
data[0] |= sigma_delta->info->read_mask;
|
||||
data[0] |= sigma_delta->comm;
|
||||
spi_message_add_tail(&t[0], &m);
|
||||
}
|
||||
spi_message_add_tail(&t[1], &m);
|
||||
|
|
|
@ -704,23 +704,29 @@ static int at91_adc_read_raw(struct iio_dev *idev,
|
|||
ret = wait_event_interruptible_timeout(st->wq_data_avail,
|
||||
st->done,
|
||||
msecs_to_jiffies(1000));
|
||||
if (ret == 0)
|
||||
ret = -ETIMEDOUT;
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
*val = st->last_value;
|
||||
|
||||
/* Disable interrupts, regardless if adc conversion was
|
||||
* successful or not
|
||||
*/
|
||||
at91_adc_writel(st, AT91_ADC_CHDR,
|
||||
AT91_ADC_CH(chan->channel));
|
||||
at91_adc_writel(st, AT91_ADC_IDR, BIT(chan->channel));
|
||||
|
||||
st->last_value = 0;
|
||||
st->done = false;
|
||||
if (ret > 0) {
|
||||
/* a valid conversion took place */
|
||||
*val = st->last_value;
|
||||
st->last_value = 0;
|
||||
st->done = false;
|
||||
ret = IIO_VAL_INT;
|
||||
} else if (ret == 0) {
|
||||
/* conversion timeout */
|
||||
dev_err(&idev->dev, "ADC Channel %d timeout.\n",
|
||||
chan->channel);
|
||||
ret = -ETIMEDOUT;
|
||||
}
|
||||
|
||||
mutex_unlock(&st->lock);
|
||||
return IIO_VAL_INT;
|
||||
return ret;
|
||||
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
*val = st->vref_mv;
|
||||
|
|
|
@ -1292,6 +1292,7 @@ static int xadc_probe(struct platform_device *pdev)
|
|||
|
||||
err_free_irq:
|
||||
free_irq(xadc->irq, indio_dev);
|
||||
cancel_delayed_work_sync(&xadc->zynq_unmask_work);
|
||||
err_clk_disable_unprepare:
|
||||
clk_disable_unprepare(xadc->clk);
|
||||
err_free_samplerate_trigger:
|
||||
|
@ -1321,8 +1322,8 @@ static int xadc_remove(struct platform_device *pdev)
|
|||
iio_triggered_buffer_cleanup(indio_dev);
|
||||
}
|
||||
free_irq(xadc->irq, indio_dev);
|
||||
cancel_delayed_work_sync(&xadc->zynq_unmask_work);
|
||||
clk_disable_unprepare(xadc->clk);
|
||||
cancel_delayed_work(&xadc->zynq_unmask_work);
|
||||
kfree(xadc->data);
|
||||
kfree(indio_dev->channels);
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ config IAQCORE
|
|||
config PMS7003
|
||||
tristate "Plantower PMS7003 particulate matter sensor"
|
||||
depends on SERIAL_DEV_BUS
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
Say Y here to build support for the Plantower PMS7003 particulate
|
||||
matter sensor.
|
||||
|
@ -71,6 +72,19 @@ config PMS7003
|
|||
To compile this driver as a module, choose M here: the module will
|
||||
be called pms7003.
|
||||
|
||||
config SENSIRION_SGP30
|
||||
tristate "Sensirion SGPxx gas sensors"
|
||||
depends on I2C
|
||||
select CRC8
|
||||
help
|
||||
Say Y here to build I2C interface support for the following
|
||||
Sensirion SGP gas sensors:
|
||||
* SGP30 gas sensor
|
||||
* SGPC3 low power gas sensor
|
||||
|
||||
To compile this driver as module, choose M here: the
|
||||
module will be called sgp30.
|
||||
|
||||
config SPS30
|
||||
tristate "SPS30 particulate matter sensor"
|
||||
depends on I2C
|
||||
|
|
|
@ -2,11 +2,9 @@
|
|||
#ifndef BME680_H_
|
||||
#define BME680_H_
|
||||
|
||||
#define BME680_REG_CHIP_I2C_ID 0xD0
|
||||
#define BME680_REG_CHIP_SPI_ID 0x50
|
||||
#define BME680_REG_CHIP_ID 0xD0
|
||||
#define BME680_CHIP_ID_VAL 0x61
|
||||
#define BME680_REG_SOFT_RESET_I2C 0xE0
|
||||
#define BME680_REG_SOFT_RESET_SPI 0x60
|
||||
#define BME680_REG_SOFT_RESET 0xE0
|
||||
#define BME680_CMD_SOFTRESET 0xB6
|
||||
#define BME680_REG_STATUS 0x73
|
||||
#define BME680_SPI_MEM_PAGE_BIT BIT(4)
|
||||
|
|
|
@ -63,9 +63,23 @@ struct bme680_data {
|
|||
s32 t_fine;
|
||||
};
|
||||
|
||||
static const struct regmap_range bme680_volatile_ranges[] = {
|
||||
regmap_reg_range(BME680_REG_MEAS_STAT_0, BME680_REG_GAS_R_LSB),
|
||||
regmap_reg_range(BME680_REG_STATUS, BME680_REG_STATUS),
|
||||
regmap_reg_range(BME680_T2_LSB_REG, BME680_GH3_REG),
|
||||
};
|
||||
|
||||
static const struct regmap_access_table bme680_volatile_table = {
|
||||
.yes_ranges = bme680_volatile_ranges,
|
||||
.n_yes_ranges = ARRAY_SIZE(bme680_volatile_ranges),
|
||||
};
|
||||
|
||||
const struct regmap_config bme680_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.max_register = 0xef,
|
||||
.volatile_table = &bme680_volatile_table,
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
};
|
||||
EXPORT_SYMBOL(bme680_regmap_config);
|
||||
|
||||
|
@ -316,6 +330,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data,
|
|||
s64 var1, var2, var3;
|
||||
s16 calc_temp;
|
||||
|
||||
/* If the calibration is invalid, attempt to reload it */
|
||||
if (!calib->par_t2)
|
||||
bme680_read_calib(data, calib);
|
||||
|
||||
var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
|
||||
var2 = (var1 * calib->par_t2) >> 11;
|
||||
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
|
||||
|
@ -583,8 +601,7 @@ static int bme680_gas_config(struct bme680_data *data)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int bme680_read_temp(struct bme680_data *data,
|
||||
int *val, int *val2)
|
||||
static int bme680_read_temp(struct bme680_data *data, int *val)
|
||||
{
|
||||
struct device *dev = regmap_get_device(data->regmap);
|
||||
int ret;
|
||||
|
@ -617,10 +634,9 @@ static int bme680_read_temp(struct bme680_data *data,
|
|||
* compensate_press/compensate_humid to get compensated
|
||||
* pressure/humidity readings.
|
||||
*/
|
||||
if (val && val2) {
|
||||
*val = comp_temp;
|
||||
*val2 = 100;
|
||||
return IIO_VAL_FRACTIONAL;
|
||||
if (val) {
|
||||
*val = comp_temp * 10; /* Centidegrees to millidegrees */
|
||||
return IIO_VAL_INT;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -635,7 +651,7 @@ static int bme680_read_press(struct bme680_data *data,
|
|||
s32 adc_press;
|
||||
|
||||
/* Read and compensate temperature to get a reading of t_fine */
|
||||
ret = bme680_read_temp(data, NULL, NULL);
|
||||
ret = bme680_read_temp(data, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -668,7 +684,7 @@ static int bme680_read_humid(struct bme680_data *data,
|
|||
u32 comp_humidity;
|
||||
|
||||
/* Read and compensate temperature to get a reading of t_fine */
|
||||
ret = bme680_read_temp(data, NULL, NULL);
|
||||
ret = bme680_read_temp(data, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -761,7 +777,7 @@ static int bme680_read_raw(struct iio_dev *indio_dev,
|
|||
case IIO_CHAN_INFO_PROCESSED:
|
||||
switch (chan->type) {
|
||||
case IIO_TEMP:
|
||||
return bme680_read_temp(data, val, val2);
|
||||
return bme680_read_temp(data, val);
|
||||
case IIO_PRESSURE:
|
||||
return bme680_read_press(data, val, val2);
|
||||
case IIO_HUMIDITYRELATIVE:
|
||||
|
@ -867,8 +883,28 @@ int bme680_core_probe(struct device *dev, struct regmap *regmap,
|
|||
{
|
||||
struct iio_dev *indio_dev;
|
||||
struct bme680_data *data;
|
||||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
ret = regmap_write(regmap, BME680_REG_SOFT_RESET,
|
||||
BME680_CMD_SOFTRESET);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to reset chip\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regmap_read(regmap, BME680_REG_CHIP_ID, &val);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Error reading chip ID\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (val != BME680_CHIP_ID_VAL) {
|
||||
dev_err(dev, "Wrong chip ID, got %x expected %x\n",
|
||||
val, BME680_CHIP_ID_VAL);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
|
||||
if (!indio_dev)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -23,8 +23,6 @@ static int bme680_i2c_probe(struct i2c_client *client,
|
|||
{
|
||||
struct regmap *regmap;
|
||||
const char *name = NULL;
|
||||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
regmap = devm_regmap_init_i2c(client, &bme680_regmap_config);
|
||||
if (IS_ERR(regmap)) {
|
||||
|
@ -33,25 +31,6 @@ static int bme680_i2c_probe(struct i2c_client *client,
|
|||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
ret = regmap_write(regmap, BME680_REG_SOFT_RESET_I2C,
|
||||
BME680_CMD_SOFTRESET);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "Failed to reset chip\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regmap_read(regmap, BME680_REG_CHIP_I2C_ID, &val);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "Error reading I2C chip ID\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (val != BME680_CHIP_ID_VAL) {
|
||||
dev_err(&client->dev, "Wrong chip ID, got %x expected %x\n",
|
||||
val, BME680_CHIP_ID_VAL);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (id)
|
||||
name = id->name;
|
||||
|
||||
|
|
|
@ -12,28 +12,93 @@
|
|||
|
||||
#include "bme680.h"
|
||||
|
||||
struct bme680_spi_bus_context {
|
||||
struct spi_device *spi;
|
||||
u8 current_page;
|
||||
};
|
||||
|
||||
/*
|
||||
* In SPI mode there are only 7 address bits, a "page" register determines
|
||||
* which part of the 8-bit range is active. This function looks at the address
|
||||
* and writes the page selection bit if needed
|
||||
*/
|
||||
static int bme680_regmap_spi_select_page(
|
||||
struct bme680_spi_bus_context *ctx, u8 reg)
|
||||
{
|
||||
struct spi_device *spi = ctx->spi;
|
||||
int ret;
|
||||
u8 buf[2];
|
||||
u8 page = (reg & 0x80) ? 0 : 1; /* Page "1" is low range */
|
||||
|
||||
if (page == ctx->current_page)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Data sheet claims we're only allowed to change bit 4, so we must do
|
||||
* a read-modify-write on each and every page select
|
||||
*/
|
||||
buf[0] = BME680_REG_STATUS;
|
||||
ret = spi_write_then_read(spi, buf, 1, buf + 1, 1);
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "failed to set page %u\n", page);
|
||||
return ret;
|
||||
}
|
||||
|
||||
buf[0] = BME680_REG_STATUS;
|
||||
if (page)
|
||||
buf[1] |= BME680_SPI_MEM_PAGE_BIT;
|
||||
else
|
||||
buf[1] &= ~BME680_SPI_MEM_PAGE_BIT;
|
||||
|
||||
ret = spi_write(spi, buf, 2);
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "failed to set page %u\n", page);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ctx->current_page = page;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bme680_regmap_spi_write(void *context, const void *data,
|
||||
size_t count)
|
||||
{
|
||||
struct spi_device *spi = context;
|
||||
struct bme680_spi_bus_context *ctx = context;
|
||||
struct spi_device *spi = ctx->spi;
|
||||
int ret;
|
||||
u8 buf[2];
|
||||
|
||||
memcpy(buf, data, 2);
|
||||
|
||||
ret = bme680_regmap_spi_select_page(ctx, buf[0]);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* The SPI register address (= full register address without bit 7)
|
||||
* and the write command (bit7 = RW = '0')
|
||||
*/
|
||||
buf[0] &= ~0x80;
|
||||
|
||||
return spi_write_then_read(spi, buf, 2, NULL, 0);
|
||||
return spi_write(spi, buf, 2);
|
||||
}
|
||||
|
||||
static int bme680_regmap_spi_read(void *context, const void *reg,
|
||||
size_t reg_size, void *val, size_t val_size)
|
||||
{
|
||||
struct spi_device *spi = context;
|
||||
struct bme680_spi_bus_context *ctx = context;
|
||||
struct spi_device *spi = ctx->spi;
|
||||
int ret;
|
||||
u8 addr = *(const u8 *)reg;
|
||||
|
||||
return spi_write_then_read(spi, reg, reg_size, val, val_size);
|
||||
ret = bme680_regmap_spi_select_page(ctx, addr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
addr |= 0x80; /* bit7 = RW = '1' */
|
||||
|
||||
return spi_write_then_read(spi, &addr, 1, val, val_size);
|
||||
}
|
||||
|
||||
static struct regmap_bus bme680_regmap_bus = {
|
||||
|
@ -46,8 +111,8 @@ static struct regmap_bus bme680_regmap_bus = {
|
|||
static int bme680_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
const struct spi_device_id *id = spi_get_device_id(spi);
|
||||
struct bme680_spi_bus_context *bus_context;
|
||||
struct regmap *regmap;
|
||||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
spi->bits_per_word = 8;
|
||||
|
@ -57,45 +122,21 @@ static int bme680_spi_probe(struct spi_device *spi)
|
|||
return ret;
|
||||
}
|
||||
|
||||
bus_context = devm_kzalloc(&spi->dev, sizeof(*bus_context), GFP_KERNEL);
|
||||
if (!bus_context)
|
||||
return -ENOMEM;
|
||||
|
||||
bus_context->spi = spi;
|
||||
bus_context->current_page = 0xff; /* Undefined on warm boot */
|
||||
|
||||
regmap = devm_regmap_init(&spi->dev, &bme680_regmap_bus,
|
||||
&spi->dev, &bme680_regmap_config);
|
||||
bus_context, &bme680_regmap_config);
|
||||
if (IS_ERR(regmap)) {
|
||||
dev_err(&spi->dev, "Failed to register spi regmap %d\n",
|
||||
(int)PTR_ERR(regmap));
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
ret = regmap_write(regmap, BME680_REG_SOFT_RESET_SPI,
|
||||
BME680_CMD_SOFTRESET);
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "Failed to reset chip\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* after power-on reset, Page 0(0x80-0xFF) of spi_mem_page is active */
|
||||
ret = regmap_read(regmap, BME680_REG_CHIP_SPI_ID, &val);
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "Error reading SPI chip ID\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (val != BME680_CHIP_ID_VAL) {
|
||||
dev_err(&spi->dev, "Wrong chip ID, got %x expected %x\n",
|
||||
val, BME680_CHIP_ID_VAL);
|
||||
return -ENODEV;
|
||||
}
|
||||
/*
|
||||
* select Page 1 of spi_mem_page to enable access to
|
||||
* to registers from address 0x00 to 0x7F.
|
||||
*/
|
||||
ret = regmap_write_bits(regmap, BME680_REG_STATUS,
|
||||
BME680_SPI_MEM_PAGE_BIT,
|
||||
BME680_SPI_MEM_PAGE_1_VAL);
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "failed to set page 1 of spi_mem_page\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return bme680_core_probe(&spi->dev, regmap, id->name);
|
||||
}
|
||||
|
||||
|
|
|
@ -103,9 +103,10 @@ static int cros_ec_sensors_read(struct iio_dev *indio_dev,
|
|||
* Do not use IIO_DEGREE_TO_RAD to avoid precision
|
||||
* loss. Round to the nearest integer.
|
||||
*/
|
||||
*val = div_s64(val64 * 314159 + 9000000ULL, 1000);
|
||||
*val2 = 18000 << (CROS_EC_SENSOR_BITS - 1);
|
||||
ret = IIO_VAL_FRACTIONAL;
|
||||
*val = 0;
|
||||
*val2 = div_s64(val64 * 3141592653ULL,
|
||||
180 << (CROS_EC_SENSOR_BITS - 1));
|
||||
ret = IIO_VAL_INT_PLUS_NANO;
|
||||
break;
|
||||
case MOTIONSENSE_TYPE_MAG:
|
||||
/*
|
||||
|
|
|
@ -92,6 +92,7 @@ static ssize_t mcp4725_store_eeprom(struct device *dev,
|
|||
|
||||
inoutbuf[0] = 0x60; /* write EEPROM */
|
||||
inoutbuf[0] |= data->ref_mode << 3;
|
||||
inoutbuf[0] |= data->powerdown ? ((data->powerdown_mode + 1) << 1) : 0;
|
||||
inoutbuf[1] = data->dac_value >> 4;
|
||||
inoutbuf[2] = (data->dac_value & 0xf) << 4;
|
||||
|
||||
|
|
|
@ -582,11 +582,10 @@ static int bmg160_read_raw(struct iio_dev *indio_dev,
|
|||
case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
|
||||
return bmg160_get_filter(data, val);
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
*val = 0;
|
||||
switch (chan->type) {
|
||||
case IIO_TEMP:
|
||||
*val2 = 500000;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
*val = 500;
|
||||
return IIO_VAL_INT;
|
||||
case IIO_ANGL_VEL:
|
||||
{
|
||||
int i;
|
||||
|
@ -594,6 +593,7 @@ static int bmg160_read_raw(struct iio_dev *indio_dev,
|
|||
for (i = 0; i < ARRAY_SIZE(bmg160_scale_table); ++i) {
|
||||
if (bmg160_scale_table[i].dps_range ==
|
||||
data->dps_range) {
|
||||
*val = 0;
|
||||
*val2 = bmg160_scale_table[i].scale;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
}
|
||||
|
|
|
@ -29,7 +29,8 @@
|
|||
|
||||
#include "mpu3050.h"
|
||||
|
||||
#define MPU3050_CHIP_ID 0x69
|
||||
#define MPU3050_CHIP_ID 0x68
|
||||
#define MPU3050_CHIP_ID_MASK 0x7E
|
||||
|
||||
/*
|
||||
* Register map: anything suffixed *_H is a big-endian high byte and always
|
||||
|
@ -1176,8 +1177,9 @@ int mpu3050_common_probe(struct device *dev,
|
|||
goto err_power_down;
|
||||
}
|
||||
|
||||
if (val != MPU3050_CHIP_ID) {
|
||||
dev_err(dev, "unsupported chip id %02x\n", (u8)val);
|
||||
if ((val & MPU3050_CHIP_ID_MASK) != MPU3050_CHIP_ID) {
|
||||
dev_err(dev, "unsupported chip id %02x\n",
|
||||
(u8)(val & MPU3050_CHIP_ID_MASK));
|
||||
ret = -ENODEV;
|
||||
goto err_power_down;
|
||||
}
|
||||
|
|
|
@ -320,9 +320,8 @@ static int iio_scan_mask_set(struct iio_dev *indio_dev,
|
|||
const unsigned long *mask;
|
||||
unsigned long *trialmask;
|
||||
|
||||
trialmask = kmalloc_array(BITS_TO_LONGS(indio_dev->masklength),
|
||||
sizeof(*trialmask),
|
||||
GFP_KERNEL);
|
||||
trialmask = kcalloc(BITS_TO_LONGS(indio_dev->masklength),
|
||||
sizeof(*trialmask), GFP_KERNEL);
|
||||
if (trialmask == NULL)
|
||||
return -ENOMEM;
|
||||
if (!indio_dev->masklength) {
|
||||
|
|
|
@ -1743,10 +1743,10 @@ EXPORT_SYMBOL(__iio_device_register);
|
|||
**/
|
||||
void iio_device_unregister(struct iio_dev *indio_dev)
|
||||
{
|
||||
mutex_lock(&indio_dev->info_exist_lock);
|
||||
|
||||
cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
|
||||
|
||||
mutex_lock(&indio_dev->info_exist_lock);
|
||||
|
||||
iio_device_unregister_debugfs(indio_dev);
|
||||
|
||||
iio_disable_all_buffers(indio_dev);
|
||||
|
|
|
@ -109,10 +109,10 @@
|
|||
#define AD7192_CH_AIN3 BIT(6) /* AIN3 - AINCOM */
|
||||
#define AD7192_CH_AIN4 BIT(7) /* AIN4 - AINCOM */
|
||||
|
||||
#define AD7193_CH_AIN1P_AIN2M 0x000 /* AIN1(+) - AIN2(-) */
|
||||
#define AD7193_CH_AIN3P_AIN4M 0x001 /* AIN3(+) - AIN4(-) */
|
||||
#define AD7193_CH_AIN5P_AIN6M 0x002 /* AIN5(+) - AIN6(-) */
|
||||
#define AD7193_CH_AIN7P_AIN8M 0x004 /* AIN7(+) - AIN8(-) */
|
||||
#define AD7193_CH_AIN1P_AIN2M 0x001 /* AIN1(+) - AIN2(-) */
|
||||
#define AD7193_CH_AIN3P_AIN4M 0x002 /* AIN3(+) - AIN4(-) */
|
||||
#define AD7193_CH_AIN5P_AIN6M 0x004 /* AIN5(+) - AIN6(-) */
|
||||
#define AD7193_CH_AIN7P_AIN8M 0x008 /* AIN7(+) - AIN8(-) */
|
||||
#define AD7193_CH_TEMP 0x100 /* Temp senseor */
|
||||
#define AD7193_CH_AIN2P_AIN2M 0x200 /* AIN2(+) - AIN2(-) */
|
||||
#define AD7193_CH_AIN1 0x401 /* AIN1 - AINCOM */
|
||||
|
|
|
@ -269,7 +269,7 @@ static IIO_DEV_ATTR_VPEAK(0644,
|
|||
static IIO_DEV_ATTR_IPEAK(0644,
|
||||
ade7854_read_32bit,
|
||||
ade7854_write_32bit,
|
||||
ADE7854_VPEAK);
|
||||
ADE7854_IPEAK);
|
||||
static IIO_DEV_ATTR_APHCAL(0644,
|
||||
ade7854_read_16bit,
|
||||
ade7854_write_16bit,
|
||||
|
|
Loading…
Reference in New Issue