Commit 7b2d7faa authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'iio-for-5.6b' of...

Merge tag 'iio-for-5.6b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-next

Jonathan writes:

Second set of new device support, features and minor fixes for IIO in the 5.6 cycle

Just a small set this time.

As we are very near the merge window, I've rolled a few fixes in here
rather than adding noise just before release.  A short delay here will
do little harm.

New device support
* adis16480
  - Add support for adis16490. After earlier rework this is simple ID plus
    chip info.

Features
* kxcjk1013
  - mount matrix support.
* lsm_6dsx
  - mount matrix support.

Cleanups / minor or late breaking fixes
* ad7124
  - add support to ad-sigma-delta and use it in this driver to allow
    the the interrupt type to be IRQF_TRIGGER_LOW unlike most other devices
    using this framework.
* adis
  - use delay structure now available in SPI to handle transfer delays
  - introduce a timeouts structure to allow support of new devices
* ak8975
  - drop platform data support.  No one is using it and it adds complexity.
  - use device_get_match_data rather than open coding much the same thing.
* dht11
  - drop meaningless todo
* at91-samad2_adc
  - switch to dma_request_chan
* altas-sensor
  - add a helper function to compute number of channels.  Needed for new device
    support that is under review.
* bma400
  - add a lower bound check on scale.
* inv_mpu6050
  - add support for temperature data in the fifos for all chips.
  - support an odd situation where a board supports only interrupt triggering
    on both edges.
* st_lsm6dsx
  - check and handle potential error return.
* st_sensors
  - fix some values for the LSM9DS0 which is ever so slightly different from
    other devices using the same whoami value.
  - switch over to generic functions from dt ones, avoiding need for separate
    ACPI support.
* stm32-adc
  - switch to dma_request_chan
  - suppress an error print in deferred probe case.
* stm32-dac
  - drop private data structure element for reset controller as only used in
    probe.
  - reflect more cleanly that the reset controller is optional whilst ensuring
    that if is specified any errors are caught.
* stm32-dfsdm
  - switch to dma_request_chan
  - fix missing application of formatting to single conversions.
  - ensure the sampling rate is updated when the oversampling ratio is changed.

* tag 'iio-for-5.6b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio: (29 commits)
  iio: dac: stm32-dac: better handle reset controller failures
  iio: dac: stm32-dac: use reset controller only at probe time
  dt-bindings: iio: accel: kxcjk1013: Document mount-matrix property
  iio: accel: kxcjk1013: Support orientation matrix
  iio: imu: st_lsm6dsx: add mount matrix support
  iio: adc: stm32-adc: don't print an error on probe deferral
  dt-bindings: iio: adis16480: add compatible entry for ADIS16490
  iio: imu: adis16480: Add support for ADIS16490
  iio: accel: bma400: prevent setting accel scale too low
  iio: imu/mpu6050: support dual-edge IRQ
  iio: imu: inv_mpu6050: add fifo temperature data support
  iio: magnetometer: ak8975: Convert to use device_get_match_data()
  iio: magnetometer: ak8975: Get rid of platform data
  iio: adc: ad7124: Set IRQ type to falling
  iio: adc: ad-sigma-delta: Allow custom IRQ flags
  iio: imu: adis: use new `delay` structure for SPI transfer delays
  iio: adc: stm32-dfsdm: adapt sampling rate to oversampling ratio
  iio: adc: stm32-dfsdm: fix single conversion
  iio: st_sensors: Make use of device properties
  iio: st_sensors: Drop redundant parameter from st_sensors_of_name_probe()
  ...
parents 270f104b d344961f
...@@ -9,9 +9,16 @@ Required properties: ...@@ -9,9 +9,16 @@ Required properties:
"kionix,kxtf9" "kionix,kxtf9"
- reg: i2c slave address - reg: i2c slave address
Optional properties:
- mount-matrix: an optional 3x3 mounting rotation matrix
Example: Example:
kxtf9@f { kxtf9@f {
compatible = "kionix,kxtf9"; compatible = "kionix,kxtf9";
reg = <0x0F>; reg = <0x0F>;
mount-matrix = "0", "1", "0",
"1", "0", "0",
"0", "0", "1";
}; };
...@@ -8,6 +8,7 @@ Required properties for the ADIS16480: ...@@ -8,6 +8,7 @@ Required properties for the ADIS16480:
* "adi,adis16480" * "adi,adis16480"
* "adi,adis16485" * "adi,adis16485"
* "adi,adis16488" * "adi,adis16488"
* "adi,adis16490"
* "adi,adis16495-1" * "adi,adis16495-1"
* "adi,adis16495-2" * "adi,adis16495-2"
* "adi,adis16495-3" * "adi,adis16495-3"
......
...@@ -233,6 +233,12 @@ static const char * const adis16201_status_error_msgs[] = { ...@@ -233,6 +233,12 @@ static const char * const adis16201_status_error_msgs[] = {
[ADIS16201_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.975V", [ADIS16201_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.975V",
}; };
static const struct adis_timeout adis16201_timeouts = {
.reset_ms = ADIS16201_STARTUP_DELAY_MS,
.sw_reset_ms = ADIS16201_STARTUP_DELAY_MS,
.self_test_ms = ADIS16201_STARTUP_DELAY_MS,
};
static const struct adis_data adis16201_data = { static const struct adis_data adis16201_data = {
.read_delay = 20, .read_delay = 20,
.msc_ctrl_reg = ADIS16201_MSC_CTRL_REG, .msc_ctrl_reg = ADIS16201_MSC_CTRL_REG,
...@@ -241,7 +247,7 @@ static const struct adis_data adis16201_data = { ...@@ -241,7 +247,7 @@ static const struct adis_data adis16201_data = {
.self_test_mask = ADIS16201_MSC_CTRL_SELF_TEST_EN, .self_test_mask = ADIS16201_MSC_CTRL_SELF_TEST_EN,
.self_test_no_autoclear = true, .self_test_no_autoclear = true,
.startup_delay = ADIS16201_STARTUP_DELAY_MS, .timeouts = &adis16201_timeouts,
.status_error_msgs = adis16201_status_error_msgs, .status_error_msgs = adis16201_status_error_msgs,
.status_error_mask = BIT(ADIS16201_DIAG_STAT_SPI_FAIL_BIT) | .status_error_mask = BIT(ADIS16201_DIAG_STAT_SPI_FAIL_BIT) |
......
...@@ -243,6 +243,12 @@ static const char * const adis16209_status_error_msgs[] = { ...@@ -243,6 +243,12 @@ static const char * const adis16209_status_error_msgs[] = {
[ADIS16209_STAT_POWER_LOW_BIT] = "Power supply below 2.975V", [ADIS16209_STAT_POWER_LOW_BIT] = "Power supply below 2.975V",
}; };
static const struct adis_timeout adis16209_timeouts = {
.reset_ms = ADIS16209_STARTUP_DELAY_MS,
.self_test_ms = ADIS16209_STARTUP_DELAY_MS,
.sw_reset_ms = ADIS16209_STARTUP_DELAY_MS,
};
static const struct adis_data adis16209_data = { static const struct adis_data adis16209_data = {
.read_delay = 30, .read_delay = 30,
.msc_ctrl_reg = ADIS16209_MSC_CTRL_REG, .msc_ctrl_reg = ADIS16209_MSC_CTRL_REG,
...@@ -251,7 +257,7 @@ static const struct adis_data adis16209_data = { ...@@ -251,7 +257,7 @@ static const struct adis_data adis16209_data = {
.self_test_mask = ADIS16209_MSC_CTRL_SELF_TEST_EN, .self_test_mask = ADIS16209_MSC_CTRL_SELF_TEST_EN,
.self_test_no_autoclear = true, .self_test_no_autoclear = true,
.startup_delay = ADIS16209_STARTUP_DELAY_MS, .timeouts = &adis16209_timeouts,
.status_error_msgs = adis16209_status_error_msgs, .status_error_msgs = adis16209_status_error_msgs,
.status_error_mask = BIT(ADIS16209_STAT_SELFTEST_FAIL_BIT) | .status_error_mask = BIT(ADIS16209_STAT_SELFTEST_FAIL_BIT) |
......
...@@ -752,7 +752,8 @@ static int bma400_write_raw(struct iio_dev *indio_dev, ...@@ -752,7 +752,8 @@ static int bma400_write_raw(struct iio_dev *indio_dev,
mutex_unlock(&data->mutex); mutex_unlock(&data->mutex);
return ret; return ret;
case IIO_CHAN_INFO_SCALE: case IIO_CHAN_INFO_SCALE:
if (val != 0 || val2 > BMA400_SCALE_MAX) if (val != 0 ||
val2 < BMA400_SCALE_MIN || val2 > BMA400_SCALE_MAX)
return -EINVAL; return -EINVAL;
mutex_lock(&data->mutex); mutex_lock(&data->mutex);
......
...@@ -130,6 +130,7 @@ struct kxcjk1013_data { ...@@ -130,6 +130,7 @@ struct kxcjk1013_data {
struct i2c_client *client; struct i2c_client *client;
struct iio_trigger *dready_trig; struct iio_trigger *dready_trig;
struct iio_trigger *motion_trig; struct iio_trigger *motion_trig;
struct iio_mount_matrix orientation;
struct mutex mutex; struct mutex mutex;
s16 buffer[8]; s16 buffer[8];
u8 odr_bits; u8 odr_bits;
...@@ -983,6 +984,20 @@ static const struct iio_event_spec kxcjk1013_event = { ...@@ -983,6 +984,20 @@ static const struct iio_event_spec kxcjk1013_event = {
BIT(IIO_EV_INFO_PERIOD) BIT(IIO_EV_INFO_PERIOD)
}; };
static const struct iio_mount_matrix *
kxcjk1013_get_mount_matrix(const struct iio_dev *indio_dev,
const struct iio_chan_spec *chan)
{
struct kxcjk1013_data *data = iio_priv(indio_dev);
return &data->orientation;
}
static const struct iio_chan_spec_ext_info kxcjk1013_ext_info[] = {
IIO_MOUNT_MATRIX(IIO_SHARED_BY_TYPE, kxcjk1013_get_mount_matrix),
{ }
};
#define KXCJK1013_CHANNEL(_axis) { \ #define KXCJK1013_CHANNEL(_axis) { \
.type = IIO_ACCEL, \ .type = IIO_ACCEL, \
.modified = 1, \ .modified = 1, \
...@@ -999,6 +1014,7 @@ static const struct iio_event_spec kxcjk1013_event = { ...@@ -999,6 +1014,7 @@ static const struct iio_event_spec kxcjk1013_event = {
.endianness = IIO_LE, \ .endianness = IIO_LE, \
}, \ }, \
.event_spec = &kxcjk1013_event, \ .event_spec = &kxcjk1013_event, \
.ext_info = kxcjk1013_ext_info, \
.num_event_specs = 1 \ .num_event_specs = 1 \
} }
...@@ -1267,11 +1283,18 @@ static int kxcjk1013_probe(struct i2c_client *client, ...@@ -1267,11 +1283,18 @@ static int kxcjk1013_probe(struct i2c_client *client,
data->client = client; data->client = client;
pdata = dev_get_platdata(&client->dev); pdata = dev_get_platdata(&client->dev);
if (pdata) if (pdata) {
data->active_high_intr = pdata->active_high_intr; data->active_high_intr = pdata->active_high_intr;
else data->orientation = pdata->orientation;
} else {
data->active_high_intr = true; /* default polarity */ data->active_high_intr = true; /* default polarity */
ret = iio_read_mount_matrix(&client->dev, "mount-matrix",
&data->orientation);
if (ret)
return ret;
}
if (id) { if (id) {
data->chipset = (enum kx_chipset)(id->driver_data); data->chipset = (enum kx_chipset)(id->driver_data);
name = id->name; name = id->name;
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include <linux/iio/common/st_sensors_i2c.h> #include <linux/iio/common/st_sensors_i2c.h>
#include "st_accel.h" #include "st_accel.h"
#ifdef CONFIG_OF
static const struct of_device_id st_accel_of_match[] = { static const struct of_device_id st_accel_of_match[] = {
{ {
/* An older compatible */ /* An older compatible */
...@@ -108,9 +107,6 @@ static const struct of_device_id st_accel_of_match[] = { ...@@ -108,9 +107,6 @@ static const struct of_device_id st_accel_of_match[] = {
{}, {},
}; };
MODULE_DEVICE_TABLE(of, st_accel_of_match); MODULE_DEVICE_TABLE(of, st_accel_of_match);
#else
#define st_accel_of_match NULL
#endif
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
static const struct acpi_device_id st_accel_acpi_match[] = { static const struct acpi_device_id st_accel_acpi_match[] = {
...@@ -193,7 +189,7 @@ static int st_accel_i2c_remove(struct i2c_client *client) ...@@ -193,7 +189,7 @@ static int st_accel_i2c_remove(struct i2c_client *client)
static struct i2c_driver st_accel_driver = { static struct i2c_driver st_accel_driver = {
.driver = { .driver = {
.name = "st-accel-i2c", .name = "st-accel-i2c",
.of_match_table = of_match_ptr(st_accel_of_match), .of_match_table = st_accel_of_match,
.acpi_match_table = ACPI_PTR(st_accel_acpi_match), .acpi_match_table = ACPI_PTR(st_accel_acpi_match),
}, },
.probe_new = st_accel_i2c_probe, .probe_new = st_accel_i2c_probe,
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/iio/common/st_sensors_spi.h> #include <linux/iio/common/st_sensors_spi.h>
#include "st_accel.h" #include "st_accel.h"
#ifdef CONFIG_OF
/* /*
* For new single-chip sensors use <device_name> as compatible string. * For new single-chip sensors use <device_name> as compatible string.
* For old single-chip devices keep <device_name>-accel to maintain * For old single-chip devices keep <device_name>-accel to maintain
...@@ -96,9 +95,6 @@ static const struct of_device_id st_accel_of_match[] = { ...@@ -96,9 +95,6 @@ static const struct of_device_id st_accel_of_match[] = {
{} {}
}; };
MODULE_DEVICE_TABLE(of, st_accel_of_match); MODULE_DEVICE_TABLE(of, st_accel_of_match);
#else
#define st_accel_of_match NULL
#endif
static int st_accel_spi_probe(struct spi_device *spi) static int st_accel_spi_probe(struct spi_device *spi)
{ {
...@@ -107,8 +103,7 @@ static int st_accel_spi_probe(struct spi_device *spi) ...@@ -107,8 +103,7 @@ static int st_accel_spi_probe(struct spi_device *spi)
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
int err; int err;
st_sensors_of_name_probe(&spi->dev, st_accel_of_match, st_sensors_dev_name_probe(&spi->dev, spi->modalias, sizeof(spi->modalias));
spi->modalias, sizeof(spi->modalias));
settings = st_accel_get_settings(spi->modalias); settings = st_accel_get_settings(spi->modalias);
if (!settings) { if (!settings) {
...@@ -166,7 +161,7 @@ MODULE_DEVICE_TABLE(spi, st_accel_id_table); ...@@ -166,7 +161,7 @@ MODULE_DEVICE_TABLE(spi, st_accel_id_table);
static struct spi_driver st_accel_driver = { static struct spi_driver st_accel_driver = {
.driver = { .driver = {
.name = "st-accel-spi", .name = "st-accel-spi",
.of_match_table = of_match_ptr(st_accel_of_match), .of_match_table = st_accel_of_match,
}, },
.probe = st_accel_spi_probe, .probe = st_accel_spi_probe,
.remove = st_accel_spi_remove, .remove = st_accel_spi_remove,
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/interrupt.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
...@@ -224,6 +225,7 @@ static const struct ad_sigma_delta_info ad7124_sigma_delta_info = { ...@@ -224,6 +225,7 @@ static const struct ad_sigma_delta_info ad7124_sigma_delta_info = {
.addr_shift = 0, .addr_shift = 0,
.read_mask = BIT(6), .read_mask = BIT(6),
.data_reg = AD7124_DATA, .data_reg = AD7124_DATA,
.irq_flags = IRQF_TRIGGER_FALLING,
}; };
static int ad7124_set_channel_odr(struct ad7124_state *st, static int ad7124_set_channel_odr(struct ad7124_state *st,
......
...@@ -203,6 +203,7 @@ static const struct ad_sigma_delta_info ad7780_sigma_delta_info = { ...@@ -203,6 +203,7 @@ static const struct ad_sigma_delta_info ad7780_sigma_delta_info = {
.set_mode = ad7780_set_mode, .set_mode = ad7780_set_mode,
.postprocess_sample = ad7780_postprocess_sample, .postprocess_sample = ad7780_postprocess_sample,
.has_registers = false, .has_registers = false,
.irq_flags = IRQF_TRIGGER_LOW,
}; };
#define AD7780_CHANNEL(bits, wordsize) \ #define AD7780_CHANNEL(bits, wordsize) \
......
...@@ -205,6 +205,7 @@ static const struct ad_sigma_delta_info ad7791_sigma_delta_info = { ...@@ -205,6 +205,7 @@ static const struct ad_sigma_delta_info ad7791_sigma_delta_info = {
.has_registers = true, .has_registers = true,
.addr_shift = 4, .addr_shift = 4,
.read_mask = BIT(3), .read_mask = BIT(3),
.irq_flags = IRQF_TRIGGER_LOW,
}; };
static int ad7791_read_raw(struct iio_dev *indio_dev, static int ad7791_read_raw(struct iio_dev *indio_dev,
......
...@@ -206,6 +206,7 @@ static const struct ad_sigma_delta_info ad7793_sigma_delta_info = { ...@@ -206,6 +206,7 @@ static const struct ad_sigma_delta_info ad7793_sigma_delta_info = {
.has_registers = true, .has_registers = true,
.addr_shift = 3, .addr_shift = 3,
.read_mask = BIT(6), .read_mask = BIT(6),
.irq_flags = IRQF_TRIGGER_LOW,
}; };
static const struct ad_sd_calib_data ad7793_calib_arr[6] = { static const struct ad_sd_calib_data ad7793_calib_arr[6] = {
......
...@@ -500,7 +500,7 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev) ...@@ -500,7 +500,7 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
ret = request_irq(sigma_delta->spi->irq, ret = request_irq(sigma_delta->spi->irq,
ad_sd_data_rdy_trig_poll, ad_sd_data_rdy_trig_poll,
IRQF_TRIGGER_LOW, sigma_delta->info->irq_flags,
indio_dev->name, indio_dev->name,
sigma_delta); sigma_delta);
if (ret) if (ret)
......
...@@ -1444,10 +1444,10 @@ static void at91_adc_dma_init(struct platform_device *pdev) ...@@ -1444,10 +1444,10 @@ static void at91_adc_dma_init(struct platform_device *pdev)
if (st->dma_st.dma_chan) if (st->dma_st.dma_chan)
return; return;
st->dma_st.dma_chan = dma_request_slave_channel(&pdev->dev, "rx"); st->dma_st.dma_chan = dma_request_chan(&pdev->dev, "rx");
if (IS_ERR(st->dma_st.dma_chan)) {
if (!st->dma_st.dma_chan) {
dev_info(&pdev->dev, "can't get DMA channel\n"); dev_info(&pdev->dev, "can't get DMA channel\n");
st->dma_st.dma_chan = NULL;
goto dma_exit; goto dma_exit;
} }
......
...@@ -688,7 +688,8 @@ static int stm32_adc_probe(struct platform_device *pdev) ...@@ -688,7 +688,8 @@ static int stm32_adc_probe(struct platform_device *pdev)
priv->vref = devm_regulator_get(&pdev->dev, "vref"); priv->vref = devm_regulator_get(&pdev->dev, "vref");
if (IS_ERR(priv->vref)) { if (IS_ERR(priv->vref)) {
ret = PTR_ERR(priv->vref); ret = PTR_ERR(priv->vref);
dev_err(&pdev->dev, "vref get failed, %d\n", ret); if (ret != -EPROBE_DEFER)
dev_err(&pdev->dev, "vref get failed, %d\n", ret);
return ret; return ret;
} }
...@@ -696,7 +697,8 @@ static int stm32_adc_probe(struct platform_device *pdev) ...@@ -696,7 +697,8 @@ static int stm32_adc_probe(struct platform_device *pdev)
if (IS_ERR(priv->aclk)) { if (IS_ERR(priv->aclk)) {
ret = PTR_ERR(priv->aclk); ret = PTR_ERR(priv->aclk);
if (ret != -ENOENT) { if (ret != -ENOENT) {
dev_err(&pdev->dev, "Can't get 'adc' clock\n"); if (ret != -EPROBE_DEFER)
dev_err(&pdev->dev, "Can't get 'adc' clock\n");
return ret; return ret;
} }
priv->aclk = NULL; priv->aclk = NULL;
...@@ -706,7 +708,8 @@ static int stm32_adc_probe(struct platform_device *pdev) ...@@ -706,7 +708,8 @@ static int stm32_adc_probe(struct platform_device *pdev)
if (IS_ERR(priv->bclk)) { if (IS_ERR(priv->bclk)) {
ret = PTR_ERR(priv->bclk); ret = PTR_ERR(priv->bclk);
if (ret != -ENOENT) { if (ret != -ENOENT) {
dev_err(&pdev->dev, "Can't get 'bus' clock\n"); if (ret != -EPROBE_DEFER)
dev_err(&pdev->dev, "Can't get 'bus' clock\n");
return ret; return ret;
} }
priv->bclk = NULL; priv->bclk = NULL;
......
...@@ -1796,9 +1796,21 @@ static int stm32_adc_dma_request(struct iio_dev *indio_dev) ...@@ -1796,9 +1796,21 @@ static int stm32_adc_dma_request(struct iio_dev *indio_dev)
struct dma_slave_config config; struct dma_slave_config config;
int ret; int ret;
adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx"); adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
if (!adc->dma_chan) if (IS_ERR(adc->dma_chan)) {
ret = PTR_ERR(adc->dma_chan);
if (ret != -ENODEV) {
if (ret != -EPROBE_DEFER)
dev_err(&indio_dev->dev,
"DMA channel request failed with %d\n",
ret);
return ret;
}
/* DMA is optional: fall back to IRQ mode */
adc->dma_chan = NULL;
return 0; return 0;
}
adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev, adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
STM32_DMA_BUFFER_SIZE, STM32_DMA_BUFFER_SIZE,
......
...@@ -1204,6 +1204,8 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev, ...@@ -1204,6 +1204,8 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev,
stm32_dfsdm_stop_conv(adc); stm32_dfsdm_stop_conv(adc);
stm32_dfsdm_process_data(adc, res);
stop_dfsdm: stop_dfsdm:
stm32_dfsdm_stop_dfsdm(adc->dfsdm); stm32_dfsdm_stop_dfsdm(adc->dfsdm);
...@@ -1219,14 +1221,32 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev, ...@@ -1219,14 +1221,32 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
unsigned int spi_freq; unsigned int spi_freq;
int ret = -EINVAL; int ret = -EINVAL;
switch (ch->src) {
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL:
spi_freq = adc->dfsdm->spi_master_freq;
break;
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING:
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING:
spi_freq = adc->dfsdm->spi_master_freq / 2;
break;
default:
spi_freq = adc->spi_freq;
}
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_OVERSAMPLING_RATIO: case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
ret = iio_device_claim_direct_mode(indio_dev); ret = iio_device_claim_direct_mode(indio_dev);
if (ret) if (ret)
return ret; return ret;
ret = stm32_dfsdm_compute_all_osrs(indio_dev, val); ret = stm32_dfsdm_compute_all_osrs(indio_dev, val);
if (!ret) if (!ret) {
dev_dbg(&indio_dev->dev,
"Sampling rate changed from (%u) to (%u)\n",
adc->sample_freq, spi_freq / val);
adc->oversamp = val; adc->oversamp = val;
adc->sample_freq = spi_freq / val;
}
iio_device_release_direct_mode(indio_dev); iio_device_release_direct_mode(indio_dev);
return ret; return ret;
...@@ -1238,18 +1258,6 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev, ...@@ -1238,18 +1258,6 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
if (ret) if (ret)
return ret; return ret;
switch (ch->src) {
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL:
spi_freq = adc->dfsdm->spi_master_freq;
break;
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING:
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING:
spi_freq = adc->dfsdm->spi_master_freq / 2;
break;
default:
spi_freq = adc->spi_freq;
}
ret = dfsdm_adc_set_samp_freq(indio_dev, val, spi_freq); ret = dfsdm_adc_set_samp_freq(indio_dev, val, spi_freq);
iio_device_release_direct_mode(indio_dev); iio_device_release_direct_mode(indio_dev);
return ret; return ret;
...@@ -1383,9 +1391,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev) ...@@ -1383,9 +1391,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev)
{ {
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx"); adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
if (!adc->dma_chan) if (IS_ERR(adc->dma_chan)) {
return -EINVAL; int ret = PTR_ERR(adc->dma_chan);
adc->dma_chan = NULL;
return ret;
}
adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev, adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
DFSDM_DMA_BUFFER_SIZE, DFSDM_DMA_BUFFER_SIZE,
...@@ -1509,7 +1521,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev) ...@@ -1509,7 +1521,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
init_completion(&adc->completion); init_completion(&adc->completion);
/* Optionally request DMA */ /* Optionally request DMA */
if (stm32_dfsdm_dma_request(indio_dev)) { ret = stm32_dfsdm_dma_request(indio_dev);
if (ret) {
if (ret != -ENODEV) {
if (ret != -EPROBE_DEFER)
dev_err(&indio_dev->dev,
"DMA channel request failed with %d\n",
ret);
return ret;
}
dev_dbg(&indio_dev->dev, "No DMA support\n"); dev_dbg(&indio_dev->dev, "No DMA support\n");
return 0; return 0;
} }
......
...@@ -86,6 +86,16 @@ static const struct regmap_config atlas_regmap_config = { ...@@ -86,6 +86,16 @@ static const struct regmap_config atlas_regmap_config = {
.val_bits = 8, .val_bits = 8,
}; };
static int atlas_buffer_num_channels(const struct iio_chan_spec *spec)
{
int idx = 0;
for (; spec->type != IIO_TIMESTAMP; spec++)
idx++;
return idx;
};
static const struct iio_chan_spec atlas_ph_channels[] = { static const struct iio_chan_spec atlas_ph_channels[] = {
{ {
.type = IIO_PH, .type = IIO_PH,
...@@ -354,11 +364,12 @@ static irqreturn_t atlas_trigger_handler(int irq, void *private) ...@@ -354,11 +364,12 @@ static irqreturn_t atlas_trigger_handler(int irq, void *private)
struct iio_poll_func *pf = private; struct iio_poll_func *pf = private;
struct iio_dev *indio_dev = pf->indio_dev; struct iio_dev *indio_dev = pf->indio_dev;
struct atlas_data *data = iio_priv(indio_dev); struct atlas_data *data = iio_priv(indio_dev);
int channels = atlas_buffer_num_channels(data->chip->channels);
int ret; int ret;
ret = regmap_bulk_read(data->regmap, data->chip->data_reg, ret = regmap_bulk_read(data->regmap, data->chip->data_reg,
(u8 *) &data->buffer, (u8 *) &data->buffer,
sizeof(__be32) * (data->chip->num_channels - 2)); sizeof(__be32) * channels);
if (!ret) if (!ret)
iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
......
...@@ -12,9 +12,8 @@ ...@@ -12,9 +12,8 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/property.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <linux/iio/common/st_sensors.h> #include <linux/iio/common/st_sensors.h>
...@@ -319,63 +318,49 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev, ...@@ -319,63 +318,49 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
return 0; return 0;
} }
#ifdef CONFIG_OF static struct st_sensors_platform_data *st_sensors_dev_probe(struct device *dev,
static struct st_sensors_platform_data *st_sensors_of_probe(struct device *dev,
struct st_sensors_platform_data *defdata) struct st_sensors_platform_data *defdata)
{ {
struct st_sensors_platform_data *pdata; struct st_sensors_platform_data *pdata;
struct device_node *np = dev->of_node;
u32 val; u32 val;
if (!np) if (!dev_fwnode(dev))
return NULL; return NULL;
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
if (!of_property_read_u32(np, "st,drdy-int-pin", &val) && (val <= 2)) if (!device_property_read_u32(dev, "st,drdy-int-pin", &val) && (val <= 2))
pdata->drdy_int_pin = (u8) val; pdata->drdy_int_pin = (u8) val;
else else
pdata->drdy_int_pin = defdata ? defdata->drdy_int_pin : 0; pdata->drdy_int_pin = defdata ? defdata->drdy_int_pin : 0;
pdata->open_drain = of_property_read_bool(np, "drive-open-drain"); pdata->open_drain = device_property_read_bool(dev, "drive-open-drain");
return pdata; return pdata;
} }
/** /**
* st_sensors_of_name_probe() - device tree probe for ST sensor name * st_sensors_dev_name_probe() - device probe for ST sensor name
* @dev: driver model representation of the device. * @dev: driver model representation of the device.
* @match: the OF match table for the device, containing compatible strings
* but also a .data field with the corresponding internal kernel name
* used by this sensor.
* @name: device name buffer reference. * @name: device name buffer reference.
* @len: device name buffer length. * @len: device name buffer length.
* *
* In effect this function matches a compatible string to an internal kernel * In effect this function matches an ID to an internal kernel
* name for a certain sensor device, so that the rest of the autodetection can * name for a certain sensor device, so that the rest of the autodetection can
* rely on that name from this point on. I2C/SPI devices will be renamed * rely on that name from this point on. I2C/SPI devices will be renamed
* to match the internal kernel convention. * to match the internal kernel convention.
*/ */
void st_sensors_of_name_probe(struct device *dev, void st_sensors_dev_name_probe(struct device *dev, char *name, int len)
const struct of_device_id *match,
char *name, int len)
{ {
const struct of_device_id *of_id; const void *match;
of_id = of_match_device(match, dev); match = device_get_match_data(dev);
if (!of_id || !of_id->data) if (!match)
return; return;
/* The name from the OF match takes precedence if present */ /* The name from the match takes precedence if present */
strlcpy(name, of_id->data, len); strlcpy(name, match, len);
} }
EXPORT_SYMBOL(st_sensors_of_name_probe); EXPORT_SYMBOL(st_sensors_dev_name_probe);
#else
static struct st_sensors_platform_data *st_sensors_of_probe(struct device *dev,
struct st_sensors_platform_data *defdata)
{
return NULL;
}
#endif
int st_sensors_init_sensor(struct iio_dev *indio_dev, int st_sensors_init_sensor(struct iio_dev *indio_dev,
struct st_sensors_platform_data *pdata) struct st_sensors_platform_data *pdata)
...@@ -385,7 +370,7 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev, ...@@ -385,7 +370,7 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
int err = 0; int err = 0;
/* 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_dev_probe(indio_dev->dev.parent, pdata);
if (of_pdata) if (of_pdata)
pdata = of_pdata; pdata = of_pdata;
......
...@@ -11,8 +11,6 @@ ...@@ -11,8 +11,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/of_device.h>
#include <linux/acpi.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/iio/common/st_sensors_i2c.h> #include <linux/iio/common/st_sensors_i2c.h>
...@@ -68,25 +66,6 @@ int st_sensors_i2c_configure(struct iio_dev *indio_dev, ...@@ -68,25 +66,6 @@ int st_sensors_i2c_configure(struct iio_dev *indio_dev,
} }
EXPORT_SYMBOL(st_sensors_i2c_configure); EXPORT_SYMBOL(st_sensors_i2c_configure);
#ifdef CONFIG_ACPI
int st_sensors_match_acpi_device(struct device *dev)
{
const struct acpi_device_id *acpi_id;
kernel_ulong_t driver_data = 0;
if (ACPI_HANDLE(dev)) {
acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev);
if (!acpi_id) {
dev_err(dev, "No driver data\n");
return -EINVAL;
}
driver_data = acpi_id->driver_data;
}
return driver_data;
}
EXPORT_SYMBOL(st_sensors_match_acpi_device);
#endif
MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>"); MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
MODULE_DESCRIPTION("STMicroelectronics ST-sensors i2c driver"); MODULE_DESCRIPTION("STMicroelectronics ST-sensors i2c driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/property.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/iio/common/st_sensors_spi.h> #include <linux/iio/common/st_sensors_spi.h>
...@@ -37,14 +38,15 @@ static const struct regmap_config st_sensors_spi_regmap_multiread_bit_config = { ...@@ -37,14 +38,15 @@ static const struct regmap_config st_sensors_spi_regmap_multiread_bit_config = {
*/ */
static bool st_sensors_is_spi_3_wire(struct spi_device *spi) static bool st_sensors_is_spi_3_wire(struct spi_device *spi)
{ {
struct device_node *np = spi->dev.of_node;
struct st_sensors_platform_data *pdata; struct st_sensors_platform_data *pdata;
struct device *dev = &spi->dev;
pdata = (struct st_sensors_platform_data *)spi->dev.platform_data; if (device_property_read_bool(dev, "spi-3wire"))
if ((np && of_property_read_bool(np, "spi-3wire")) || return true;
(pdata && pdata->spi_3wire)) {
pdata = (struct st_sensors_platform_data *)dev->platform_data;
if (pdata && pdata->spi_3wire)
return true; return true;
}
return false; return false;
} }
......
...@@ -20,13 +20,11 @@ ...@@ -20,13 +20,11 @@
/** /**
* struct stm32_dac_priv - stm32 DAC core private data * struct stm32_dac_priv - stm32 DAC core private data
* @pclk: peripheral clock common for all DACs * @pclk: peripheral clock common for all DACs
* @rst: peripheral reset control
* @vref: regulator reference * @vref: regulator reference
* @common: Common data for all DAC instances * @common: Common data for all DAC instances
*/ */
struct stm32_dac_priv { struct stm32_dac_priv {
struct clk *pclk; struct clk *pclk;
struct reset_control *rst;
struct regulator *vref; struct regulator *vref;
struct stm32_dac_common common; struct stm32_dac_common common;
}; };
...@@ -94,6 +92,7 @@ static int stm32_dac_probe(struct platform_device *pdev) ...@@ -94,6 +92,7 @@ static int stm32_dac_probe(struct platform_device *pdev)
struct regmap *regmap; struct regmap *regmap;
struct resource *res; struct resource *res;
void __iomem *mmio; void __iomem *mmio;
struct reset_control *rst;
int ret; int ret;
if (!dev->of_node) if (!dev->of_node)
...@@ -148,11 +147,19 @@ static int stm32_dac_probe(struct platform_device *pdev) ...@@ -148,11 +147,19 @@ static int stm32_dac_probe(struct platform_device *pdev)
priv->common.vref_mv = ret / 1000; priv->common.vref_mv = ret / 1000;
dev_dbg(dev, "vref+=%dmV\n", priv->common.vref_mv); dev_dbg(dev, "vref+=%dmV\n", priv->common.vref_mv);
priv->rst = devm_reset_control_get_exclusive(dev, NULL); rst = devm_reset_control_get_optional_exclusive(dev, NULL);
if (!IS_ERR(priv->rst)) { if (rst) {
reset_control_assert(priv->rst); if (IS_ERR(rst)) {
ret = PTR_ERR(rst);
if (ret != -EPROBE_DEFER)
dev_err(dev, "reset get failed, %d\n", ret);
goto err_hw_stop;
}
reset_control_assert(rst);
udelay(2); udelay(2);
reset_control_deassert(priv->rst); reset_control_deassert(rst);
} }
if (cfg && cfg->has_hfsel) { if (cfg && cfg->has_hfsel) {
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
struct adis16136_chip_info { struct adis16136_chip_info {
unsigned int precision; unsigned int precision;
unsigned int fullscale; unsigned int fullscale;
const struct adis_timeout *timeouts;
}; };
struct adis16136 { struct adis16136 {
...@@ -471,7 +472,6 @@ static const struct adis_data adis16136_data = { ...@@ -471,7 +472,6 @@ static const struct adis_data adis16136_data = {
.msc_ctrl_reg = ADIS16136_REG_MSC_CTRL, .msc_ctrl_reg = ADIS16136_REG_MSC_CTRL,
.self_test_mask = ADIS16136_MSC_CTRL_SELF_TEST, .self_test_mask = ADIS16136_MSC_CTRL_SELF_TEST,
.startup_delay = 80,
.read_delay = 10, .read_delay = 10,
.write_delay = 10, .write_delay = 10,
...@@ -490,30 +490,63 @@ enum adis16136_id { ...@@ -490,30 +490,63 @@ enum adis16136_id {
ID_ADIS16137, ID_ADIS16137,
}; };
static const struct adis_timeout adis16133_timeouts = {
.reset_ms = 75,
.sw_reset_ms = 75,
.self_test_ms = 50,
};
static const struct adis_timeout adis16136_timeouts = {
.reset_ms = 128,
.sw_reset_ms = 75,
.self_test_ms = 245,
};
static const struct adis16136_chip_info adis16136_chip_info[] = { static const struct adis16136_chip_info adis16136_chip_info[] = {
[ID_ADIS16133] = { [ID_ADIS16133] = {
.precision = IIO_DEGREE_TO_RAD(1200), .precision = IIO_DEGREE_TO_RAD(1200),
.fullscale = 24000, .fullscale = 24000,
.timeouts = &adis16133_timeouts,
}, },
[ID_ADIS16135] = { [ID_ADIS16135] = {
.precision = IIO_DEGREE_TO_RAD(300), .precision = IIO_DEGREE_TO_RAD(300),
.fullscale = 24000, .fullscale = 24000,
.timeouts = &adis16133_timeouts,
}, },
[ID_ADIS16136] = { [ID_ADIS16136] = {
.precision = IIO_DEGREE_TO_RAD(450), .precision = IIO_DEGREE_TO_RAD(450),
.fullscale = 24623, .fullscale = 24623,
.timeouts = &adis16136_timeouts,
}, },
[ID_ADIS16137] = { [ID_ADIS16137] = {
.precision = IIO_DEGREE_TO_RAD(1000), .precision = IIO_DEGREE_TO_RAD(1000),
.fullscale = 24609, .fullscale = 24609,
.timeouts = &adis16136_timeouts,
}, },
}; };
static struct adis_data *adis16136_adis_data_alloc(struct adis16136 *st,
struct device *dev)
{
struct adis_data *data;
data = devm_kmalloc(dev, sizeof(struct adis_data), GFP_KERNEL);
if (!data)
return ERR_PTR(-ENOMEM);
memcpy(data, &adis16136_data, sizeof(*data));
data->timeouts = st->chip_info->timeouts;
return data;
}
static int adis16136_probe(struct spi_device *spi) static int adis16136_probe(struct spi_device *spi)
{ {
const struct spi_device_id *id = spi_get_device_id(spi); const struct spi_device_id *id = spi_get_device_id(spi);
struct adis16136 *adis16136; struct adis16136 *adis16136;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
const struct adis_data *adis16136_data;
int ret; int ret;
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adis16136)); indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adis16136));
...@@ -532,7 +565,11 @@ static int adis16136_probe(struct spi_device *spi) ...@@ -532,7 +565,11 @@ static int adis16136_probe(struct spi_device *spi)
indio_dev->info = &adis16136_info; indio_dev->info = &adis16136_info;
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
ret = adis_init(&adis16136->adis, indio_dev, spi, &adis16136_data); adis16136_data = adis16136_adis_data_alloc(adis16136, &spi->dev);
if (IS_ERR(adis16136_data))
return PTR_ERR(adis16136_data);
ret = adis_init(&adis16136->adis, indio_dev, spi, adis16136_data);
if (ret) if (ret)
return ret; return ret;
......
...@@ -332,6 +332,12 @@ static const char * const adis1620_status_error_msgs[] = { ...@@ -332,6 +332,12 @@ static const char * const adis1620_status_error_msgs[] = {
[ADIS16260_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 4.75", [ADIS16260_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 4.75",
}; };
static const struct adis_timeout adis16260_timeouts = {
.reset_ms = ADIS16260_STARTUP_DELAY,
.sw_reset_ms = ADIS16260_STARTUP_DELAY,
.self_test_ms = ADIS16260_STARTUP_DELAY,
};
static const struct adis_data adis16260_data = { static const struct adis_data adis16260_data = {
.write_delay = 30, .write_delay = 30,
.read_delay = 30, .read_delay = 30,
...@@ -340,7 +346,7 @@ static const struct adis_data adis16260_data = { ...@@ -340,7 +346,7 @@ static const struct adis_data adis16260_data = {
.diag_stat_reg = ADIS16260_DIAG_STAT, .diag_stat_reg = ADIS16260_DIAG_STAT,
.self_test_mask = ADIS16260_MSC_CTRL_MEM_TEST, .self_test_mask = ADIS16260_MSC_CTRL_MEM_TEST,
.startup_delay = ADIS16260_STARTUP_DELAY, .timeouts = &adis16260_timeouts,
.status_error_msgs = adis1620_status_error_msgs, .status_error_msgs = adis1620_status_error_msgs,
.status_error_mask = BIT(ADIS16260_DIAG_STAT_FLASH_CHK_BIT) | .status_error_mask = BIT(ADIS16260_DIAG_STAT_FLASH_CHK_BIT) |
......
...@@ -138,7 +138,6 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = { ...@@ -138,7 +138,6 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
[2] = LSM330DLC_GYRO_DEV_NAME, [2] = LSM330DLC_GYRO_DEV_NAME,
[3] = L3G4IS_GYRO_DEV_NAME, [3] = L3G4IS_GYRO_DEV_NAME,
[4] = LSM330_GYRO_DEV_NAME, [4] = LSM330_GYRO_DEV_NAME,
[5] = LSM9DS0_GYRO_DEV_NAME,
}, },
.ch = (struct iio_chan_spec *)st_gyro_16bit_channels, .ch = (struct iio_chan_spec *)st_gyro_16bit_channels,
.odr = { .odr = {
...@@ -208,6 +207,80 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = { ...@@ -208,6 +207,80 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
.multi_read_bit = true, .multi_read_bit = true,
.bootime = 2, .bootime = 2,
}, },
{
.wai = 0xd4,
.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
.sensors_supported = {
[0] = LSM9DS0_GYRO_DEV_NAME,
},
.ch = (struct iio_chan_spec *)st_gyro_16bit_channels,
.odr = {
.addr = 0x20,
.mask = GENMASK(7, 6),
.odr_avl = {
{ .hz = 95, .value = 0x00, },
{ .hz = 190, .value = 0x01, },
{ .hz = 380, .value = 0x02, },
{ .hz = 760, .value = 0x03, },
},
},
.pw = {
.addr = 0x20,
.mask = BIT(3),
.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
},
.enable_axis = {
.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
},
.fs = {
.addr = 0x23,
.mask = GENMASK(5, 4),
.fs_avl = {
[0] = {
.num = ST_GYRO_FS_AVL_245DPS,
.value = 0x00,
.gain = IIO_DEGREE_TO_RAD(8750),
},
[1] = {
.num = ST_GYRO_FS_AVL_500DPS,
.value = 0x01,
.gain = IIO_DEGREE_TO_RAD(17500),
},
[2] = {
.num = ST_GYRO_FS_AVL_2000DPS,
.value = 0x02,
.gain = IIO_DEGREE_TO_RAD(70000),
},
},
},
.bdu = {
.addr = 0x23,
.mask = BIT(7),
},
.drdy_irq = {
.int2 = {
.addr = 0x22,
.mask = BIT(3),
},
/*
* The sensor has IHL (active low) and open
* drain settings, but only for INT1 and not
* for the DRDY line on INT2.
*/
.stat_drdy = {
.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
.mask = GENMASK(2, 0),
},
},
.sim = {
.addr = 0x23,
.value = BIT(0),
},
.multi_read_bit = true,
.bootime = 2,
},
{ {
.wai = 0xd7, .wai = 0xd7,
.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/iio/common/st_sensors_i2c.h> #include <linux/iio/common/st_sensors_i2c.h>
#include "st_gyro.h" #include "st_gyro.h"
#ifdef CONFIG_OF
static const struct of_device_id st_gyro_of_match[] = { static const struct of_device_id st_gyro_of_match[] = {
{ {
.compatible = "st,l3g4200d-gyro", .compatible = "st,l3g4200d-gyro",
...@@ -58,9 +57,6 @@ static const struct of_device_id st_gyro_of_match[] = { ...@@ -58,9 +57,6 @@ static const struct of_device_id st_gyro_of_match[] = {
{}, {},
}; };
MODULE_DEVICE_TABLE(of, st_gyro_of_match); MODULE_DEVICE_TABLE(of, st_gyro_of_match);
#else
#define st_gyro_of_match NULL
#endif
static int st_gyro_i2c_probe(struct i2c_client *client, static int st_gyro_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
...@@ -70,8 +66,7 @@ static int st_gyro_i2c_probe(struct i2c_client *client, ...@@ -70,8 +66,7 @@ static int st_gyro_i2c_probe(struct i2c_client *client,
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
int err; int err;
st_sensors_of_name_probe(&client->dev, st_gyro_of_match, st_sensors_dev_name_probe(&client->dev, client->name, sizeof(client->name));
client->name, sizeof(client->name));
settings = st_gyro_get_settings(client->name); settings = st_gyro_get_settings(client->name);
if (!settings) { if (!settings) {
...@@ -122,7 +117,7 @@ MODULE_DEVICE_TABLE(i2c, st_gyro_id_table); ...@@ -122,7 +117,7 @@ MODULE_DEVICE_TABLE(i2c, st_gyro_id_table);
static struct i2c_driver st_gyro_driver = { static struct i2c_driver st_gyro_driver = {
.driver = { .driver = {
.name = "st-gyro-i2c", .name = "st-gyro-i2c",
.of_match_table = of_match_ptr(st_gyro_of_match), .of_match_table = st_gyro_of_match,
}, },
.probe = st_gyro_i2c_probe, .probe = st_gyro_i2c_probe,
.remove = st_gyro_i2c_remove, .remove = st_gyro_i2c_remove,
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/iio/common/st_sensors_spi.h> #include <linux/iio/common/st_sensors_spi.h>
#include "st_gyro.h" #include "st_gyro.h"
#ifdef CONFIG_OF
/* /*
* For new single-chip sensors use <device_name> as compatible string. * For new single-chip sensors use <device_name> as compatible string.
* For old single-chip devices keep <device_name>-gyro to maintain * For old single-chip devices keep <device_name>-gyro to maintain
...@@ -63,9 +62,6 @@ static const struct of_device_id st_gyro_of_match[] = { ...@@ -63,9 +62,6 @@ static const struct of_device_id st_gyro_of_match[] = {
{}, {},
}; };
MODULE_DEVICE_TABLE(of, st_gyro_of_match); MODULE_DEVICE_TABLE(of, st_gyro_of_match);
#else
#define st_gyro_of_match NULL
#endif
static int st_gyro_spi_probe(struct spi_device *spi) static int st_gyro_spi_probe(struct spi_device *spi)
{ {
...@@ -74,8 +70,7 @@ static int st_gyro_spi_probe(struct spi_device *spi) ...@@ -74,8 +70,7 @@ static int st_gyro_spi_probe(struct spi_device *spi)
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
int err; int err;
st_sensors_of_name_probe(&spi->dev, st_gyro_of_match, st_sensors_dev_name_probe(&spi->dev, spi->modalias, sizeof(spi->modalias));
spi->modalias, sizeof(spi->modalias));
settings = st_gyro_get_settings(spi->modalias); settings = st_gyro_get_settings(spi->modalias);
if (!settings) { if (!settings) {
...@@ -126,7 +121,7 @@ MODULE_DEVICE_TABLE(spi, st_gyro_id_table); ...@@ -126,7 +121,7 @@ MODULE_DEVICE_TABLE(spi, st_gyro_id_table);
static struct spi_driver st_gyro_driver = { static struct spi_driver st_gyro_driver = {
.driver = { .driver = {
.name = "st-gyro-spi", .name = "st-gyro-spi",
.of_match_table = of_match_ptr(st_gyro_of_match), .of_match_table = st_gyro_of_match,
}, },
.probe = st_gyro_spi_probe, .probe = st_gyro_spi_probe,
.remove = st_gyro_spi_remove, .remove = st_gyro_spi_remove,
......
...@@ -174,7 +174,6 @@ static irqreturn_t dht11_handle_irq(int irq, void *data) ...@@ -174,7 +174,6 @@ static irqreturn_t dht11_handle_irq(int irq, void *data)
struct iio_dev *iio = data; struct iio_dev *iio = data;
struct dht11 *dht11 = iio_priv(iio); struct dht11 *dht11 = iio_priv(iio);
/* TODO: Consider making the handler safe for IRQ sharing */
if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >= 0) { if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >= 0) {
dht11->edges[dht11->num_edges].ts = ktime_get_boottime_ns(); dht11->edges[dht11->num_edges].ts = ktime_get_boottime_ns();
dht11->edges[dht11->num_edges++].value = dht11->edges[dht11->num_edges++].value =
......
...@@ -45,7 +45,8 @@ int __adis_write_reg(struct adis *adis, unsigned int reg, ...@@ -45,7 +45,8 @@ int __adis_write_reg(struct adis *adis, unsigned int reg,
.bits_per_word = 8, .bits_per_word = 8,
.len = 2, .len = 2,
.cs_change = 1, .cs_change = 1,
.delay_usecs = adis->data->write_delay, .delay.value = adis->data->write_delay,
.delay.unit = SPI_DELAY_UNIT_USECS,
.cs_change_delay.value = adis->data->cs_change_delay, .cs_change_delay.value = adis->data->cs_change_delay,
.cs_change_delay.unit = SPI_DELAY_UNIT_USECS, .cs_change_delay.unit = SPI_DELAY_UNIT_USECS,
}, { }, {
...@@ -53,7 +54,8 @@ int __adis_write_reg(struct adis *adis, unsigned int reg, ...@@ -53,7 +54,8 @@ int __adis_write_reg(struct adis *adis, unsigned int reg,
.bits_per_word = 8, .bits_per_word = 8,
.len = 2, .len = 2,
.cs_change = 1, .cs_change = 1,
.delay_usecs = adis->data->write_delay, .delay.value = adis->data->write_delay,
.delay.unit = SPI_DELAY_UNIT_USECS,
.cs_change_delay.value = adis->data->cs_change_delay, .cs_change_delay.value = adis->data->cs_change_delay,
.cs_change_delay.unit = SPI_DELAY_UNIT_USECS, .cs_change_delay.unit = SPI_DELAY_UNIT_USECS,
}, { }, {
...@@ -61,19 +63,22 @@ int __adis_write_reg(struct adis *adis, unsigned int reg, ...@@ -61,19 +63,22 @@ int __adis_write_reg(struct adis *adis, unsigned int reg,
.bits_per_word = 8, .bits_per_word = 8,
.len = 2, .len = 2,
.cs_change = 1, .cs_change = 1,
.delay_usecs = adis->data->write_delay, .delay.value = adis->data->write_delay,
.delay.unit = SPI_DELAY_UNIT_USECS,
.cs_change_delay.value = adis->data->cs_change_delay, .cs_change_delay.value = adis->data->cs_change_delay,
.cs_change_delay.unit = SPI_DELAY_UNIT_USECS, .cs_change_delay.unit = SPI_DELAY_UNIT_USECS,
}, { }, {
.tx_buf = adis->tx + 6, .tx_buf = adis->tx + 6,
.bits_per_word = 8, .bits_per_word = 8,
.len = 2, .len = 2,
.delay_usecs = adis->data->write_delay, .delay.value = adis->data->write_delay,
.delay.unit = SPI_DELAY_UNIT_USECS,
}, { }, {
.tx_buf = adis->tx + 8, .tx_buf = adis->tx + 8,
.bits_per_word = 8, .bits_per_word = 8,
.len = 2, .len = 2,
.delay_usecs = adis->data->write_delay, .delay.value = adis->data->write_delay,
.delay.unit = SPI_DELAY_UNIT_USECS,
}, },
}; };
...@@ -140,7 +145,8 @@ int __adis_read_reg(struct adis *adis, unsigned int reg, ...@@ -140,7 +145,8 @@ int __adis_read_reg(struct adis *adis, unsigned int reg,
.bits_per_word = 8, .bits_per_word = 8,
.len = 2, .len = 2,
.cs_change = 1, .cs_change = 1,
.delay_usecs = adis->data->write_delay, .delay.value = adis->data->write_delay,
.delay.unit = SPI_DELAY_UNIT_USECS,
.cs_change_delay.value = adis->data->cs_change_delay, .cs_change_delay.value = adis->data->cs_change_delay,
.cs_change_delay.unit = SPI_DELAY_UNIT_USECS, .cs_change_delay.unit = SPI_DELAY_UNIT_USECS,
}, { }, {
...@@ -148,7 +154,8 @@ int __adis_read_reg(struct adis *adis, unsigned int reg, ...@@ -148,7 +154,8 @@ int __adis_read_reg(struct adis *adis, unsigned int reg,
.bits_per_word = 8, .bits_per_word = 8,
.len = 2, .len = 2,
.cs_change = 1, .cs_change = 1,
.delay_usecs = adis->data->read_delay, .delay.value = adis->data->read_delay,
.delay.unit = SPI_DELAY_UNIT_USECS,
.cs_change_delay.value = adis->data->cs_change_delay, .cs_change_delay.value = adis->data->cs_change_delay,
.cs_change_delay.unit = SPI_DELAY_UNIT_USECS, .cs_change_delay.unit = SPI_DELAY_UNIT_USECS,
}, { }, {
...@@ -157,14 +164,16 @@ int __adis_read_reg(struct adis *adis, unsigned int reg, ...@@ -157,14 +164,16 @@ int __adis_read_reg(struct adis *adis, unsigned int reg,
.bits_per_word = 8, .bits_per_word = 8,
.len = 2, .len = 2,
.cs_change = 1, .cs_change = 1,
.delay_usecs = adis->data->read_delay, .delay.value = adis->data->read_delay,
.delay.unit = SPI_DELAY_UNIT_USECS,
.cs_change_delay.value = adis->data->cs_change_delay, .cs_change_delay.value = adis->data->cs_change_delay,
.cs_change_delay.unit = SPI_DELAY_UNIT_USECS, .cs_change_delay.unit = SPI_DELAY_UNIT_USECS,
}, { }, {
.rx_buf = adis->rx + 2, .rx_buf = adis->rx + 2,
.bits_per_word = 8, .bits_per_word = 8,
.len = 2, .len = 2,
.delay_usecs = adis->data->read_delay, .delay.value = adis->data->read_delay,
.delay.unit = SPI_DELAY_UNIT_USECS,
}, },
}; };
...@@ -317,19 +326,25 @@ EXPORT_SYMBOL_GPL(__adis_check_status); ...@@ -317,19 +326,25 @@ EXPORT_SYMBOL_GPL(__adis_check_status);
int __adis_reset(struct adis *adis) int __adis_reset(struct adis *adis)
{ {
int ret; int ret;
const struct adis_timeout *timeouts = adis->data->timeouts;
ret = __adis_write_reg_8(adis, adis->data->glob_cmd_reg, ret = __adis_write_reg_8(adis, adis->data->glob_cmd_reg,
ADIS_GLOB_CMD_SW_RESET); ADIS_GLOB_CMD_SW_RESET);
if (ret) if (ret) {
dev_err(&adis->spi->dev, "Failed to reset device: %d\n", ret); dev_err(&adis->spi->dev, "Failed to reset device: %d\n", ret);
return ret;
}
return ret; msleep(timeouts->sw_reset_ms);
return 0;
} }
EXPORT_SYMBOL_GPL(__adis_reset); EXPORT_SYMBOL_GPL(__adis_reset);
static int adis_self_test(struct adis *adis) static int adis_self_test(struct adis *adis)
{ {
int ret; int ret;
const struct adis_timeout *timeouts = adis->data->timeouts;
ret = __adis_write_reg_16(adis, adis->data->msc_ctrl_reg, ret = __adis_write_reg_16(adis, adis->data->msc_ctrl_reg,
adis->data->self_test_mask); adis->data->self_test_mask);
...@@ -339,7 +354,7 @@ static int adis_self_test(struct adis *adis) ...@@ -339,7 +354,7 @@ static int adis_self_test(struct adis *adis)
return ret; return ret;
} }
msleep(adis->data->startup_delay); msleep(timeouts->self_test_ms);
ret = __adis_check_status(adis); ret = __adis_check_status(adis);
...@@ -368,7 +383,6 @@ int adis_initial_startup(struct adis *adis) ...@@ -368,7 +383,6 @@ int adis_initial_startup(struct adis *adis)
if (ret) { if (ret) {
dev_err(&adis->spi->dev, "Self-test failed, trying reset.\n"); dev_err(&adis->spi->dev, "Self-test failed, trying reset.\n");
__adis_reset(adis); __adis_reset(adis);
msleep(adis->data->startup_delay);
ret = adis_self_test(adis); ret = adis_self_test(adis);
if (ret) { if (ret) {
dev_err(&adis->spi->dev, "Second self-test failed, giving up.\n"); dev_err(&adis->spi->dev, "Second self-test failed, giving up.\n");
...@@ -444,6 +458,11 @@ EXPORT_SYMBOL_GPL(adis_single_conversion); ...@@ -444,6 +458,11 @@ EXPORT_SYMBOL_GPL(adis_single_conversion);
int adis_init(struct adis *adis, struct iio_dev *indio_dev, int adis_init(struct adis *adis, struct iio_dev *indio_dev,
struct spi_device *spi, const struct adis_data *data) struct spi_device *spi, const struct adis_data *data)
{ {
if (!data || !data->timeouts) {
dev_err(&spi->dev, "No config data or timeouts not defined!\n");
return -EINVAL;
}
mutex_init(&adis->state_lock); mutex_init(&adis->state_lock);
adis->spi = spi; adis->spi = spi;
adis->data = data; adis->data = data;
......
...@@ -156,6 +156,7 @@ struct adis16400_state; ...@@ -156,6 +156,7 @@ struct adis16400_state;
struct adis16400_chip_info { struct adis16400_chip_info {
const struct iio_chan_spec *channels; const struct iio_chan_spec *channels;
const struct adis_timeout *timeouts;
const int num_channels; const int num_channels;
const long flags; const long flags;
unsigned int gyro_scale_micro; unsigned int gyro_scale_micro;
...@@ -929,6 +930,36 @@ static const struct iio_chan_spec adis16334_channels[] = { ...@@ -929,6 +930,36 @@ static const struct iio_chan_spec adis16334_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP), IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
}; };
static const struct adis_timeout adis16300_timeouts = {
.reset_ms = ADIS16400_STARTUP_DELAY,
.sw_reset_ms = ADIS16400_STARTUP_DELAY,
.self_test_ms = ADIS16400_STARTUP_DELAY,
};
static const struct adis_timeout adis16362_timeouts = {
.reset_ms = 130,
.sw_reset_ms = 130,
.self_test_ms = 12,
};
static const struct adis_timeout adis16400_timeouts = {
.reset_ms = 170,
.sw_reset_ms = 170,
.self_test_ms = 12,
};
static const struct adis_timeout adis16445_timeouts = {
.reset_ms = 55,
.sw_reset_ms = 55,
.self_test_ms = 16,
};
static const struct adis_timeout adis16448_timeouts = {
.reset_ms = 90,
.sw_reset_ms = 90,
.self_test_ms = 45,
};
static struct adis16400_chip_info adis16400_chips[] = { static struct adis16400_chip_info adis16400_chips[] = {
[ADIS16300] = { [ADIS16300] = {
.channels = adis16300_channels, .channels = adis16300_channels,
...@@ -941,6 +972,7 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -941,6 +972,7 @@ static struct adis16400_chip_info adis16400_chips[] = {
.temp_offset = 25000000 / 140000, /* 25 C = 0x00 */ .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
.set_freq = adis16400_set_freq, .set_freq = adis16400_set_freq,
.get_freq = adis16400_get_freq, .get_freq = adis16400_get_freq,
.timeouts = &adis16300_timeouts,
}, },
[ADIS16334] = { [ADIS16334] = {
.channels = adis16334_channels, .channels = adis16334_channels,
...@@ -964,6 +996,7 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -964,6 +996,7 @@ static struct adis16400_chip_info adis16400_chips[] = {
.flags = ADIS16400_NO_BURST | ADIS16400_HAS_SLOW_MODE, .flags = ADIS16400_NO_BURST | ADIS16400_HAS_SLOW_MODE,
.set_freq = adis16400_set_freq, .set_freq = adis16400_set_freq,
.get_freq = adis16400_get_freq, .get_freq = adis16400_get_freq,
.timeouts = &adis16300_timeouts,
}, },
[ADIS16360] = { [ADIS16360] = {
.channels = adis16350_channels, .channels = adis16350_channels,
...@@ -976,6 +1009,7 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -976,6 +1009,7 @@ static struct adis16400_chip_info adis16400_chips[] = {
.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
.set_freq = adis16400_set_freq, .set_freq = adis16400_set_freq,
.get_freq = adis16400_get_freq, .get_freq = adis16400_get_freq,
.timeouts = &adis16300_timeouts,
}, },
[ADIS16362] = { [ADIS16362] = {
.channels = adis16350_channels, .channels = adis16350_channels,
...@@ -988,6 +1022,7 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -988,6 +1022,7 @@ static struct adis16400_chip_info adis16400_chips[] = {
.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
.set_freq = adis16400_set_freq, .set_freq = adis16400_set_freq,
.get_freq = adis16400_get_freq, .get_freq = adis16400_get_freq,
.timeouts = &adis16362_timeouts,
}, },
[ADIS16364] = { [ADIS16364] = {
.channels = adis16350_channels, .channels = adis16350_channels,
...@@ -1000,6 +1035,7 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1000,6 +1035,7 @@ static struct adis16400_chip_info adis16400_chips[] = {
.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
.set_freq = adis16400_set_freq, .set_freq = adis16400_set_freq,
.get_freq = adis16400_get_freq, .get_freq = adis16400_get_freq,
.timeouts = &adis16362_timeouts,
}, },
[ADIS16367] = { [ADIS16367] = {
.channels = adis16350_channels, .channels = adis16350_channels,
...@@ -1012,6 +1048,7 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1012,6 +1048,7 @@ static struct adis16400_chip_info adis16400_chips[] = {
.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */ .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
.set_freq = adis16400_set_freq, .set_freq = adis16400_set_freq,
.get_freq = adis16400_get_freq, .get_freq = adis16400_get_freq,
.timeouts = &adis16300_timeouts,
}, },
[ADIS16400] = { [ADIS16400] = {
.channels = adis16400_channels, .channels = adis16400_channels,
...@@ -1023,6 +1060,7 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1023,6 +1060,7 @@ static struct adis16400_chip_info adis16400_chips[] = {
.temp_offset = 25000000 / 140000, /* 25 C = 0x00 */ .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
.set_freq = adis16400_set_freq, .set_freq = adis16400_set_freq,
.get_freq = adis16400_get_freq, .get_freq = adis16400_get_freq,
.timeouts = &adis16400_timeouts,
}, },
[ADIS16445] = { [ADIS16445] = {
.channels = adis16445_channels, .channels = adis16445_channels,
...@@ -1036,6 +1074,7 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1036,6 +1074,7 @@ static struct adis16400_chip_info adis16400_chips[] = {
.temp_offset = 31000000 / 73860, /* 31 C = 0x00 */ .temp_offset = 31000000 / 73860, /* 31 C = 0x00 */
.set_freq = adis16334_set_freq, .set_freq = adis16334_set_freq,
.get_freq = adis16334_get_freq, .get_freq = adis16334_get_freq,
.timeouts = &adis16445_timeouts,
}, },
[ADIS16448] = { [ADIS16448] = {
.channels = adis16448_channels, .channels = adis16448_channels,
...@@ -1049,6 +1088,7 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1049,6 +1088,7 @@ static struct adis16400_chip_info adis16400_chips[] = {
.temp_offset = 31000000 / 73860, /* 31 C = 0x00 */ .temp_offset = 31000000 / 73860, /* 31 C = 0x00 */
.set_freq = adis16334_set_freq, .set_freq = adis16334_set_freq,
.get_freq = adis16334_get_freq, .get_freq = adis16334_get_freq,
.timeouts = &adis16448_timeouts,
} }
}; };
...@@ -1086,7 +1126,6 @@ static const struct adis_data adis16400_data = { ...@@ -1086,7 +1126,6 @@ static const struct adis_data adis16400_data = {
.write_delay = 50, .write_delay = 50,
.self_test_mask = ADIS16400_MSC_CTRL_MEM_TEST, .self_test_mask = ADIS16400_MSC_CTRL_MEM_TEST,
.startup_delay = ADIS16400_STARTUP_DELAY,
.status_error_msgs = adis16400_status_error_msgs, .status_error_msgs = adis16400_status_error_msgs,
.status_error_mask = BIT(ADIS16400_DIAG_STAT_ZACCL_FAIL) | .status_error_mask = BIT(ADIS16400_DIAG_STAT_ZACCL_FAIL) |
...@@ -1120,11 +1159,28 @@ static void adis16400_setup_chan_mask(struct adis16400_state *st) ...@@ -1120,11 +1159,28 @@ static void adis16400_setup_chan_mask(struct adis16400_state *st)
} }
} }
static struct adis_data *adis16400_adis_data_alloc(struct adis16400_state *st,
struct device *dev)
{
struct adis_data *data;
data = devm_kmalloc(dev, sizeof(struct adis_data), GFP_KERNEL);
if (!data)
return ERR_PTR(-ENOMEM);
memcpy(data, &adis16400_data, sizeof(*data));
data->timeouts = st->variant->timeouts;
return data;
}
static int adis16400_probe(struct spi_device *spi) static int adis16400_probe(struct spi_device *spi)
{ {
struct adis16400_state *st; struct adis16400_state *st;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
int ret; int ret;
const struct adis_data *adis16400_data;
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
if (indio_dev == NULL) if (indio_dev == NULL)
...@@ -1151,7 +1207,11 @@ static int adis16400_probe(struct spi_device *spi) ...@@ -1151,7 +1207,11 @@ static int adis16400_probe(struct spi_device *spi)
st->adis.burst->extra_len = sizeof(u16); st->adis.burst->extra_len = sizeof(u16);
} }
ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data); adis16400_data = adis16400_adis_data_alloc(st, &spi->dev);
if (IS_ERR(adis16400_data))
return PTR_ERR(adis16400_data);
ret = adis_init(&st->adis, indio_dev, spi, adis16400_data);
if (ret) if (ret)
return ret; return ret;
......
...@@ -383,6 +383,12 @@ static const char * const adis16460_status_error_msgs[] = { ...@@ -383,6 +383,12 @@ static const char * const adis16460_status_error_msgs[] = {
[ADIS16460_DIAG_STAT_FLASH_UPT] = "Flash update failure", [ADIS16460_DIAG_STAT_FLASH_UPT] = "Flash update failure",
}; };
static const struct adis_timeout adis16460_timeouts = {
.reset_ms = 225,
.sw_reset_ms = 225,
.self_test_ms = 10,
};
static const struct adis_data adis16460_data = { static const struct adis_data adis16460_data = {
.diag_stat_reg = ADIS16460_REG_DIAG_STAT, .diag_stat_reg = ADIS16460_REG_DIAG_STAT,
.glob_cmd_reg = ADIS16460_REG_GLOB_CMD, .glob_cmd_reg = ADIS16460_REG_GLOB_CMD,
...@@ -398,6 +404,7 @@ static const struct adis_data adis16460_data = { ...@@ -398,6 +404,7 @@ static const struct adis_data adis16460_data = {
BIT(ADIS16460_DIAG_STAT_SPI_COMM) | BIT(ADIS16460_DIAG_STAT_SPI_COMM) |
BIT(ADIS16460_DIAG_STAT_FLASH_UPT), BIT(ADIS16460_DIAG_STAT_FLASH_UPT),
.enable_irq = adis16460_enable_irq, .enable_irq = adis16460_enable_irq,
.timeouts = &adis16460_timeouts,
}; };
static int adis16460_probe(struct spi_device *spi) static int adis16460_probe(struct spi_device *spi)
......
...@@ -138,6 +138,7 @@ struct adis16480_chip_info { ...@@ -138,6 +138,7 @@ struct adis16480_chip_info {
unsigned int max_dec_rate; unsigned int max_dec_rate;
const unsigned int *filter_freqs; const unsigned int *filter_freqs;
bool has_pps_clk_mode; bool has_pps_clk_mode;
const struct adis_timeout *timeouts;
}; };
enum adis16480_int_pin { enum adis16480_int_pin {
...@@ -786,6 +787,7 @@ enum adis16480_variant { ...@@ -786,6 +787,7 @@ enum adis16480_variant {
ADIS16480, ADIS16480,
ADIS16485, ADIS16485,
ADIS16488, ADIS16488,
ADIS16490,
ADIS16495_1, ADIS16495_1,
ADIS16495_2, ADIS16495_2,
ADIS16495_3, ADIS16495_3,
...@@ -794,6 +796,30 @@ enum adis16480_variant { ...@@ -794,6 +796,30 @@ enum adis16480_variant {
ADIS16497_3, ADIS16497_3,
}; };
static const struct adis_timeout adis16485_timeouts = {
.reset_ms = 560,
.sw_reset_ms = 120,
.self_test_ms = 12,
};
static const struct adis_timeout adis16480_timeouts = {
.reset_ms = 560,
.sw_reset_ms = 560,
.self_test_ms = 12,
};
static const struct adis_timeout adis16495_timeouts = {
.reset_ms = 170,
.sw_reset_ms = 130,
.self_test_ms = 40,
};
static const struct adis_timeout adis16495_1_timeouts = {
.reset_ms = 250,
.sw_reset_ms = 210,
.self_test_ms = 20,
};
static const struct adis16480_chip_info adis16480_chip_info[] = { static const struct adis16480_chip_info adis16480_chip_info[] = {
[ADIS16375] = { [ADIS16375] = {
.channels = adis16485_channels, .channels = adis16485_channels,
...@@ -812,6 +838,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -812,6 +838,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.int_clk = 2460000, .int_clk = 2460000,
.max_dec_rate = 2048, .max_dec_rate = 2048,
.filter_freqs = adis16480_def_filter_freqs, .filter_freqs = adis16480_def_filter_freqs,
.timeouts = &adis16485_timeouts,
}, },
[ADIS16480] = { [ADIS16480] = {
.channels = adis16480_channels, .channels = adis16480_channels,
...@@ -824,6 +851,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -824,6 +851,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.int_clk = 2460000, .int_clk = 2460000,
.max_dec_rate = 2048, .max_dec_rate = 2048,
.filter_freqs = adis16480_def_filter_freqs, .filter_freqs = adis16480_def_filter_freqs,
.timeouts = &adis16480_timeouts,
}, },
[ADIS16485] = { [ADIS16485] = {
.channels = adis16485_channels, .channels = adis16485_channels,
...@@ -836,6 +864,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -836,6 +864,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.int_clk = 2460000, .int_clk = 2460000,
.max_dec_rate = 2048, .max_dec_rate = 2048,
.filter_freqs = adis16480_def_filter_freqs, .filter_freqs = adis16480_def_filter_freqs,
.timeouts = &adis16485_timeouts,
}, },
[ADIS16488] = { [ADIS16488] = {
.channels = adis16480_channels, .channels = adis16480_channels,
...@@ -848,6 +877,21 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -848,6 +877,21 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.int_clk = 2460000, .int_clk = 2460000,
.max_dec_rate = 2048, .max_dec_rate = 2048,
.filter_freqs = adis16480_def_filter_freqs, .filter_freqs = adis16480_def_filter_freqs,
.timeouts = &adis16485_timeouts,
},
[ADIS16490] = {
.channels = adis16485_channels,
.num_channels = ARRAY_SIZE(adis16485_channels),
.gyro_max_val = 20000 << 16,
.gyro_max_scale = IIO_DEGREE_TO_RAD(100),
.accel_max_val = IIO_M_S_2_TO_G(16000 << 16),
.accel_max_scale = 8,
.temp_scale = 14285, /* 14.285 milli degree Celsius */
.int_clk = 4250000,
.max_dec_rate = 4250,
.filter_freqs = adis16495_def_filter_freqs,
.has_pps_clk_mode = true,
.timeouts = &adis16495_timeouts,
}, },
[ADIS16495_1] = { [ADIS16495_1] = {
.channels = adis16485_channels, .channels = adis16485_channels,
...@@ -861,6 +905,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -861,6 +905,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.max_dec_rate = 4250, .max_dec_rate = 4250,
.filter_freqs = adis16495_def_filter_freqs, .filter_freqs = adis16495_def_filter_freqs,
.has_pps_clk_mode = true, .has_pps_clk_mode = true,
.timeouts = &adis16495_1_timeouts,
}, },
[ADIS16495_2] = { [ADIS16495_2] = {
.channels = adis16485_channels, .channels = adis16485_channels,
...@@ -874,6 +919,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -874,6 +919,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.max_dec_rate = 4250, .max_dec_rate = 4250,
.filter_freqs = adis16495_def_filter_freqs, .filter_freqs = adis16495_def_filter_freqs,
.has_pps_clk_mode = true, .has_pps_clk_mode = true,
.timeouts = &adis16495_1_timeouts,
}, },
[ADIS16495_3] = { [ADIS16495_3] = {
.channels = adis16485_channels, .channels = adis16485_channels,
...@@ -887,6 +933,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -887,6 +933,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.max_dec_rate = 4250, .max_dec_rate = 4250,
.filter_freqs = adis16495_def_filter_freqs, .filter_freqs = adis16495_def_filter_freqs,
.has_pps_clk_mode = true, .has_pps_clk_mode = true,
.timeouts = &adis16495_1_timeouts,
}, },
[ADIS16497_1] = { [ADIS16497_1] = {
.channels = adis16485_channels, .channels = adis16485_channels,
...@@ -900,6 +947,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -900,6 +947,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.max_dec_rate = 4250, .max_dec_rate = 4250,
.filter_freqs = adis16495_def_filter_freqs, .filter_freqs = adis16495_def_filter_freqs,
.has_pps_clk_mode = true, .has_pps_clk_mode = true,
.timeouts = &adis16495_1_timeouts,
}, },
[ADIS16497_2] = { [ADIS16497_2] = {
.channels = adis16485_channels, .channels = adis16485_channels,
...@@ -913,6 +961,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -913,6 +961,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.max_dec_rate = 4250, .max_dec_rate = 4250,
.filter_freqs = adis16495_def_filter_freqs, .filter_freqs = adis16495_def_filter_freqs,
.has_pps_clk_mode = true, .has_pps_clk_mode = true,
.timeouts = &adis16495_1_timeouts,
}, },
[ADIS16497_3] = { [ADIS16497_3] = {
.channels = adis16485_channels, .channels = adis16485_channels,
...@@ -926,6 +975,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { ...@@ -926,6 +975,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = {
.max_dec_rate = 4250, .max_dec_rate = 4250,
.filter_freqs = adis16495_def_filter_freqs, .filter_freqs = adis16495_def_filter_freqs,
.has_pps_clk_mode = true, .has_pps_clk_mode = true,
.timeouts = &adis16495_1_timeouts,
}, },
}; };
...@@ -1195,9 +1245,26 @@ static int adis16480_get_ext_clocks(struct adis16480 *st) ...@@ -1195,9 +1245,26 @@ static int adis16480_get_ext_clocks(struct adis16480 *st)
return 0; return 0;
} }
static struct adis_data *adis16480_adis_data_alloc(struct adis16480 *st,
struct device *dev)
{
struct adis_data *data;
data = devm_kmalloc(dev, sizeof(struct adis_data), GFP_KERNEL);
if (!data)
return ERR_PTR(-ENOMEM);
memcpy(data, &adis16480_data, sizeof(*data));
data->timeouts = st->chip_info->timeouts;
return data;
}
static int adis16480_probe(struct spi_device *spi) static int adis16480_probe(struct spi_device *spi)
{ {
const struct spi_device_id *id = spi_get_device_id(spi); const struct spi_device_id *id = spi_get_device_id(spi);
const struct adis_data *adis16480_data;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct adis16480 *st; struct adis16480 *st;
int ret; int ret;
...@@ -1218,7 +1285,11 @@ static int adis16480_probe(struct spi_device *spi) ...@@ -1218,7 +1285,11 @@ static int adis16480_probe(struct spi_device *spi)
indio_dev->info = &adis16480_info; indio_dev->info = &adis16480_info;
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
ret = adis_init(&st->adis, indio_dev, spi, &adis16480_data); adis16480_data = adis16480_adis_data_alloc(st, &spi->dev);
if (IS_ERR(adis16480_data))
return PTR_ERR(adis16480_data);
ret = adis_init(&st->adis, indio_dev, spi, adis16480_data);
if (ret) if (ret)
return ret; return ret;
...@@ -1285,6 +1356,7 @@ static const struct spi_device_id adis16480_ids[] = { ...@@ -1285,6 +1356,7 @@ static const struct spi_device_id adis16480_ids[] = {
{ "adis16480", ADIS16480 }, { "adis16480", ADIS16480 },
{ "adis16485", ADIS16485 }, { "adis16485", ADIS16485 },
{ "adis16488", ADIS16488 }, { "adis16488", ADIS16488 },
{ "adis16490", ADIS16490 },
{ "adis16495-1", ADIS16495_1 }, { "adis16495-1", ADIS16495_1 },
{ "adis16495-2", ADIS16495_2 }, { "adis16495-2", ADIS16495_2 },
{ "adis16495-3", ADIS16495_3 }, { "adis16495-3", ADIS16495_3 },
...@@ -1300,6 +1372,7 @@ static const struct of_device_id adis16480_of_match[] = { ...@@ -1300,6 +1372,7 @@ static const struct of_device_id adis16480_of_match[] = {
{ .compatible = "adi,adis16480" }, { .compatible = "adi,adis16480" },
{ .compatible = "adi,adis16485" }, { .compatible = "adi,adis16485" },
{ .compatible = "adi,adis16488" }, { .compatible = "adi,adis16488" },
{ .compatible = "adi,adis16490" },
{ .compatible = "adi,adis16495-1" }, { .compatible = "adi,adis16495-1" },
{ .compatible = "adi,adis16495-2" }, { .compatible = "adi,adis16495-2" },
{ .compatible = "adi,adis16495-3" }, { .compatible = "adi,adis16495-3" },
......
...@@ -104,6 +104,7 @@ static const struct inv_mpu6050_chip_config chip_config_6050 = { ...@@ -104,6 +104,7 @@ static const struct inv_mpu6050_chip_config chip_config_6050 = {
.divider = INV_MPU6050_FIFO_RATE_TO_DIVIDER(INV_MPU6050_INIT_FIFO_RATE), .divider = INV_MPU6050_FIFO_RATE_TO_DIVIDER(INV_MPU6050_INIT_FIFO_RATE),
.gyro_fifo_enable = false, .gyro_fifo_enable = false,
.accl_fifo_enable = false, .accl_fifo_enable = false,
.temp_fifo_enable = false,
.magn_fifo_enable = false, .magn_fifo_enable = false,
.accl_fs = INV_MPU6050_FS_02G, .accl_fs = INV_MPU6050_FS_02G,
.user_ctrl = 0, .user_ctrl = 0,
...@@ -856,19 +857,27 @@ static const struct iio_chan_spec_ext_info inv_ext_info[] = { ...@@ -856,19 +857,27 @@ static const struct iio_chan_spec_ext_info inv_ext_info[] = {
.ext_info = inv_ext_info, \ .ext_info = inv_ext_info, \
} }
#define INV_MPU6050_TEMP_CHAN(_index) \
{ \
.type = IIO_TEMP, \
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) \
| BIT(IIO_CHAN_INFO_OFFSET) \
| BIT(IIO_CHAN_INFO_SCALE), \
.scan_index = _index, \
.scan_type = { \
.sign = 's', \
.realbits = 16, \
.storagebits = 16, \
.shift = 0, \
.endianness = IIO_BE, \
}, \
}
static const struct iio_chan_spec inv_mpu_channels[] = { static const struct iio_chan_spec inv_mpu_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(INV_MPU6050_SCAN_TIMESTAMP), IIO_CHAN_SOFT_TIMESTAMP(INV_MPU6050_SCAN_TIMESTAMP),
/*
* Note that temperature should only be via polled reading only, INV_MPU6050_TEMP_CHAN(INV_MPU6050_SCAN_TEMP),
* not the final scan elements output.
*/
{
.type = IIO_TEMP,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW)
| BIT(IIO_CHAN_INFO_OFFSET)
| BIT(IIO_CHAN_INFO_SCALE),
.scan_index = -1,
},
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X), INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X),
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y), INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y),
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z), INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z),
...@@ -878,22 +887,29 @@ static const struct iio_chan_spec inv_mpu_channels[] = { ...@@ -878,22 +887,29 @@ static const struct iio_chan_spec inv_mpu_channels[] = {
INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z), INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z),
}; };
#define INV_MPU6050_SCAN_MASK_3AXIS_ACCEL \
(BIT(INV_MPU6050_SCAN_ACCL_X) \
| BIT(INV_MPU6050_SCAN_ACCL_Y) \
| BIT(INV_MPU6050_SCAN_ACCL_Z))
#define INV_MPU6050_SCAN_MASK_3AXIS_GYRO \
(BIT(INV_MPU6050_SCAN_GYRO_X) \
| BIT(INV_MPU6050_SCAN_GYRO_Y) \
| BIT(INV_MPU6050_SCAN_GYRO_Z))
#define INV_MPU6050_SCAN_MASK_TEMP (BIT(INV_MPU6050_SCAN_TEMP))
static const unsigned long inv_mpu_scan_masks[] = { static const unsigned long inv_mpu_scan_masks[] = {
/* 3-axis accel */ /* 3-axis accel */
BIT(INV_MPU6050_SCAN_ACCL_X) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL,
| BIT(INV_MPU6050_SCAN_ACCL_Y) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU6050_SCAN_ACCL_Z),
/* 3-axis gyro */ /* 3-axis gyro */
BIT(INV_MPU6050_SCAN_GYRO_X) INV_MPU6050_SCAN_MASK_3AXIS_GYRO,
| BIT(INV_MPU6050_SCAN_GYRO_Y) INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU6050_SCAN_GYRO_Z),
/* 6-axis accel + gyro */ /* 6-axis accel + gyro */
BIT(INV_MPU6050_SCAN_ACCL_X) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO,
| BIT(INV_MPU6050_SCAN_ACCL_Y) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
| BIT(INV_MPU6050_SCAN_ACCL_Z) | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU6050_SCAN_GYRO_X)
| BIT(INV_MPU6050_SCAN_GYRO_Y)
| BIT(INV_MPU6050_SCAN_GYRO_Z),
0, 0,
}; };
...@@ -917,17 +933,9 @@ static const unsigned long inv_mpu_scan_masks[] = { ...@@ -917,17 +933,9 @@ static const unsigned long inv_mpu_scan_masks[] = {
static const struct iio_chan_spec inv_mpu9150_channels[] = { static const struct iio_chan_spec inv_mpu9150_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(INV_MPU9X50_SCAN_TIMESTAMP), IIO_CHAN_SOFT_TIMESTAMP(INV_MPU9X50_SCAN_TIMESTAMP),
/*
* Note that temperature should only be via polled reading only, INV_MPU6050_TEMP_CHAN(INV_MPU6050_SCAN_TEMP),
* not the final scan elements output.
*/
{
.type = IIO_TEMP,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW)
| BIT(IIO_CHAN_INFO_OFFSET)
| BIT(IIO_CHAN_INFO_SCALE),
.scan_index = -1,
},
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X), INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X),
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y), INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y),
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z), INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z),
...@@ -944,17 +952,9 @@ static const struct iio_chan_spec inv_mpu9150_channels[] = { ...@@ -944,17 +952,9 @@ static const struct iio_chan_spec inv_mpu9150_channels[] = {
static const struct iio_chan_spec inv_mpu9250_channels[] = { static const struct iio_chan_spec inv_mpu9250_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(INV_MPU9X50_SCAN_TIMESTAMP), IIO_CHAN_SOFT_TIMESTAMP(INV_MPU9X50_SCAN_TIMESTAMP),
/*
* Note that temperature should only be via polled reading only, INV_MPU6050_TEMP_CHAN(INV_MPU6050_SCAN_TEMP),
* not the final scan elements output.
*/
{
.type = IIO_TEMP,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW)
| BIT(IIO_CHAN_INFO_OFFSET)
| BIT(IIO_CHAN_INFO_SCALE),
.scan_index = -1,
},
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X), INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_MPU6050_SCAN_GYRO_X),
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y), INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_MPU6050_SCAN_GYRO_Y),
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z), INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_MPU6050_SCAN_GYRO_Z),
...@@ -969,98 +969,50 @@ static const struct iio_chan_spec inv_mpu9250_channels[] = { ...@@ -969,98 +969,50 @@ static const struct iio_chan_spec inv_mpu9250_channels[] = {
INV_MPU9X50_MAGN_CHAN(IIO_MOD_Z, 16, INV_MPU9X50_SCAN_MAGN_Z), INV_MPU9X50_MAGN_CHAN(IIO_MOD_Z, 16, INV_MPU9X50_SCAN_MAGN_Z),
}; };
#define INV_MPU9X50_SCAN_MASK_3AXIS_MAGN \
(BIT(INV_MPU9X50_SCAN_MAGN_X) \
| BIT(INV_MPU9X50_SCAN_MAGN_Y) \
| BIT(INV_MPU9X50_SCAN_MAGN_Z))
static const unsigned long inv_mpu9x50_scan_masks[] = { static const unsigned long inv_mpu9x50_scan_masks[] = {
/* 3-axis accel */ /* 3-axis accel */
BIT(INV_MPU6050_SCAN_ACCL_X) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL,
| BIT(INV_MPU6050_SCAN_ACCL_Y) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU6050_SCAN_ACCL_Z),
/* 3-axis gyro */ /* 3-axis gyro */
BIT(INV_MPU6050_SCAN_GYRO_X) INV_MPU6050_SCAN_MASK_3AXIS_GYRO,
| BIT(INV_MPU6050_SCAN_GYRO_Y) INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU6050_SCAN_GYRO_Z),
/* 3-axis magn */ /* 3-axis magn */
BIT(INV_MPU9X50_SCAN_MAGN_X) INV_MPU9X50_SCAN_MASK_3AXIS_MAGN,
| BIT(INV_MPU9X50_SCAN_MAGN_Y) INV_MPU9X50_SCAN_MASK_3AXIS_MAGN | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU9X50_SCAN_MAGN_Z),
/* 6-axis accel + gyro */ /* 6-axis accel + gyro */
BIT(INV_MPU6050_SCAN_ACCL_X) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO,
| BIT(INV_MPU6050_SCAN_ACCL_Y) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
| BIT(INV_MPU6050_SCAN_ACCL_Z) | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU6050_SCAN_GYRO_X)
| BIT(INV_MPU6050_SCAN_GYRO_Y)
| BIT(INV_MPU6050_SCAN_GYRO_Z),
/* 6-axis accel + magn */ /* 6-axis accel + magn */
BIT(INV_MPU6050_SCAN_ACCL_X) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN,
| BIT(INV_MPU6050_SCAN_ACCL_Y) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN
| BIT(INV_MPU6050_SCAN_ACCL_Z) | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU9X50_SCAN_MAGN_X)
| BIT(INV_MPU9X50_SCAN_MAGN_Y)
| BIT(INV_MPU9X50_SCAN_MAGN_Z),
/* 6-axis gyro + magn */ /* 6-axis gyro + magn */
BIT(INV_MPU6050_SCAN_GYRO_X) INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN,
| BIT(INV_MPU6050_SCAN_GYRO_Y) INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN
| BIT(INV_MPU6050_SCAN_GYRO_Z) | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU9X50_SCAN_MAGN_X)
| BIT(INV_MPU9X50_SCAN_MAGN_Y)
| BIT(INV_MPU9X50_SCAN_MAGN_Z),
/* 9-axis accel + gyro + magn */ /* 9-axis accel + gyro + magn */
BIT(INV_MPU6050_SCAN_ACCL_X) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
| BIT(INV_MPU6050_SCAN_ACCL_Y) | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN,
| BIT(INV_MPU6050_SCAN_ACCL_Z) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
| BIT(INV_MPU6050_SCAN_GYRO_X) | INV_MPU9X50_SCAN_MASK_3AXIS_MAGN
| BIT(INV_MPU6050_SCAN_GYRO_Y) | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_MPU6050_SCAN_GYRO_Z)
| BIT(INV_MPU9X50_SCAN_MAGN_X)
| BIT(INV_MPU9X50_SCAN_MAGN_Y)
| BIT(INV_MPU9X50_SCAN_MAGN_Z),
0, 0,
}; };
static const struct iio_chan_spec inv_icm20602_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(INV_ICM20602_SCAN_TIMESTAMP),
{
.type = IIO_TEMP,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW)
| BIT(IIO_CHAN_INFO_OFFSET)
| BIT(IIO_CHAN_INFO_SCALE),
.scan_index = INV_ICM20602_SCAN_TEMP,
.scan_type = {
.sign = 's',
.realbits = 16,
.storagebits = 16,
.shift = 0,
.endianness = IIO_BE,
},
},
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_ICM20602_SCAN_GYRO_X),
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_ICM20602_SCAN_GYRO_Y),
INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_ICM20602_SCAN_GYRO_Z),
INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Y, INV_ICM20602_SCAN_ACCL_Y),
INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_X, INV_ICM20602_SCAN_ACCL_X),
INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_ICM20602_SCAN_ACCL_Z),
};
static const unsigned long inv_icm20602_scan_masks[] = { static const unsigned long inv_icm20602_scan_masks[] = {
/* 3-axis accel + temp (mandatory) */ /* 3-axis accel + temp (mandatory) */
BIT(INV_ICM20602_SCAN_ACCL_X) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_ICM20602_SCAN_ACCL_Y)
| BIT(INV_ICM20602_SCAN_ACCL_Z)
| BIT(INV_ICM20602_SCAN_TEMP),
/* 3-axis gyro + temp (mandatory) */ /* 3-axis gyro + temp (mandatory) */
BIT(INV_ICM20602_SCAN_GYRO_X) INV_MPU6050_SCAN_MASK_3AXIS_GYRO | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_ICM20602_SCAN_GYRO_Y)
| BIT(INV_ICM20602_SCAN_GYRO_Z)
| BIT(INV_ICM20602_SCAN_TEMP),
/* 6-axis accel + gyro + temp (mandatory) */ /* 6-axis accel + gyro + temp (mandatory) */
BIT(INV_ICM20602_SCAN_ACCL_X) INV_MPU6050_SCAN_MASK_3AXIS_ACCEL | INV_MPU6050_SCAN_MASK_3AXIS_GYRO
| BIT(INV_ICM20602_SCAN_ACCL_Y) | INV_MPU6050_SCAN_MASK_TEMP,
| BIT(INV_ICM20602_SCAN_ACCL_Z)
| BIT(INV_ICM20602_SCAN_GYRO_X)
| BIT(INV_ICM20602_SCAN_GYRO_Y)
| BIT(INV_ICM20602_SCAN_GYRO_Z)
| BIT(INV_ICM20602_SCAN_TEMP),
0, 0,
}; };
...@@ -1268,7 +1220,7 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, ...@@ -1268,7 +1220,7 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
irq_type = irqd_get_trigger_type(desc); irq_type = irqd_get_trigger_type(desc);
if (!irq_type) if (!irq_type)
irq_type = IRQF_TRIGGER_RISING; irq_type = IRQF_TRIGGER_RISING;
if (irq_type == IRQF_TRIGGER_RISING) if (irq_type & IRQF_TRIGGER_RISING) // rising or both-edge
st->irq_mask = INV_MPU6050_ACTIVE_HIGH; st->irq_mask = INV_MPU6050_ACTIVE_HIGH;
else if (irq_type == IRQF_TRIGGER_FALLING) else if (irq_type == IRQF_TRIGGER_FALLING)
st->irq_mask = INV_MPU6050_ACTIVE_LOW; st->irq_mask = INV_MPU6050_ACTIVE_LOW;
...@@ -1363,8 +1315,8 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, ...@@ -1363,8 +1315,8 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
indio_dev->available_scan_masks = inv_mpu9x50_scan_masks; indio_dev->available_scan_masks = inv_mpu9x50_scan_masks;
break; break;
case INV_ICM20602: case INV_ICM20602:
indio_dev->channels = inv_icm20602_channels; indio_dev->channels = inv_mpu_channels;
indio_dev->num_channels = ARRAY_SIZE(inv_icm20602_channels); indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
indio_dev->available_scan_masks = inv_icm20602_scan_masks; indio_dev->available_scan_masks = inv_icm20602_scan_masks;
break; break;
default: default:
......
...@@ -86,6 +86,7 @@ enum inv_devices { ...@@ -86,6 +86,7 @@ enum inv_devices {
* @accl_fs: accel full scale range. * @accl_fs: accel full scale range.
* @accl_fifo_enable: enable accel data output * @accl_fifo_enable: enable accel data output
* @gyro_fifo_enable: enable gyro data output * @gyro_fifo_enable: enable gyro data output
* @temp_fifo_enable: enable temp data output
* @magn_fifo_enable: enable magn data output * @magn_fifo_enable: enable magn data output
* @divider: chip sample rate divider (sample rate divider - 1) * @divider: chip sample rate divider (sample rate divider - 1)
*/ */
...@@ -95,6 +96,7 @@ struct inv_mpu6050_chip_config { ...@@ -95,6 +96,7 @@ struct inv_mpu6050_chip_config {
unsigned int accl_fs:2; unsigned int accl_fs:2;
unsigned int accl_fifo_enable:1; unsigned int accl_fifo_enable:1;
unsigned int gyro_fifo_enable:1; unsigned int gyro_fifo_enable:1;
unsigned int temp_fifo_enable:1;
unsigned int magn_fifo_enable:1; unsigned int magn_fifo_enable:1;
u8 divider; u8 divider;
u8 user_ctrl; u8 user_ctrl;
...@@ -184,6 +186,7 @@ struct inv_mpu6050_state { ...@@ -184,6 +186,7 @@ struct inv_mpu6050_state {
#define INV_MPU6050_BIT_SLAVE_2 0x04 #define INV_MPU6050_BIT_SLAVE_2 0x04
#define INV_MPU6050_BIT_ACCEL_OUT 0x08 #define INV_MPU6050_BIT_ACCEL_OUT 0x08
#define INV_MPU6050_BITS_GYRO_OUT 0x70 #define INV_MPU6050_BITS_GYRO_OUT 0x70
#define INV_MPU6050_BIT_TEMP_OUT 0x80
#define INV_MPU6050_REG_I2C_MST_CTRL 0x24 #define INV_MPU6050_REG_I2C_MST_CTRL 0x24
#define INV_MPU6050_BITS_I2C_MST_CLK_400KHZ 0x0D #define INV_MPU6050_BITS_I2C_MST_CLK_400KHZ 0x0D
...@@ -268,8 +271,8 @@ struct inv_mpu6050_state { ...@@ -268,8 +271,8 @@ struct inv_mpu6050_state {
/* MPU9X50 9-axis magnetometer */ /* MPU9X50 9-axis magnetometer */
#define INV_MPU9X50_BYTES_MAGN 7 #define INV_MPU9X50_BYTES_MAGN 7
/* ICM20602 FIFO samples include temperature readings */ /* FIFO temperature sample size */
#define INV_ICM20602_BYTES_PER_TEMP_SENSOR 2 #define INV_MPU6050_BYTES_PER_TEMP_SENSOR 2
/* mpu6500 registers */ /* mpu6500 registers */
#define INV_MPU6500_REG_ACCEL_CONFIG_2 0x1D #define INV_MPU6500_REG_ACCEL_CONFIG_2 0x1D
...@@ -298,7 +301,7 @@ struct inv_mpu6050_state { ...@@ -298,7 +301,7 @@ struct inv_mpu6050_state {
#define INV_ICM20608_TEMP_OFFSET 8170 #define INV_ICM20608_TEMP_OFFSET 8170
#define INV_ICM20608_TEMP_SCALE 3059976 #define INV_ICM20608_TEMP_SCALE 3059976
/* 6 + 6 + 7 (for MPU9x50) = 19 round up to 24 and plus 8 */ /* 6 + 6 + 2 + 7 (for MPU9x50) = 21 round up to 24 and plus 8 */
#define INV_MPU6050_OUTPUT_DATA_SIZE 32 #define INV_MPU6050_OUTPUT_DATA_SIZE 32
#define INV_MPU6050_REG_INT_PIN_CFG 0x37 #define INV_MPU6050_REG_INT_PIN_CFG 0x37
...@@ -344,6 +347,7 @@ enum inv_mpu6050_scan { ...@@ -344,6 +347,7 @@ enum inv_mpu6050_scan {
INV_MPU6050_SCAN_ACCL_X, INV_MPU6050_SCAN_ACCL_X,
INV_MPU6050_SCAN_ACCL_Y, INV_MPU6050_SCAN_ACCL_Y,
INV_MPU6050_SCAN_ACCL_Z, INV_MPU6050_SCAN_ACCL_Z,
INV_MPU6050_SCAN_TEMP,
INV_MPU6050_SCAN_GYRO_X, INV_MPU6050_SCAN_GYRO_X,
INV_MPU6050_SCAN_GYRO_Y, INV_MPU6050_SCAN_GYRO_Y,
INV_MPU6050_SCAN_GYRO_Z, INV_MPU6050_SCAN_GYRO_Z,
...@@ -355,18 +359,6 @@ enum inv_mpu6050_scan { ...@@ -355,18 +359,6 @@ enum inv_mpu6050_scan {
INV_MPU9X50_SCAN_TIMESTAMP, INV_MPU9X50_SCAN_TIMESTAMP,
}; };
/* scan element definition for ICM20602, which includes temperature */
enum inv_icm20602_scan {
INV_ICM20602_SCAN_ACCL_X,
INV_ICM20602_SCAN_ACCL_Y,
INV_ICM20602_SCAN_ACCL_Z,
INV_ICM20602_SCAN_TEMP,
INV_ICM20602_SCAN_GYRO_X,
INV_ICM20602_SCAN_GYRO_Y,
INV_ICM20602_SCAN_GYRO_Z,
INV_ICM20602_SCAN_TIMESTAMP,
};
enum inv_mpu6050_filter_e { enum inv_mpu6050_filter_e {
INV_MPU6050_FILTER_256HZ_NOLPF2 = 0, INV_MPU6050_FILTER_256HZ_NOLPF2 = 0,
INV_MPU6050_FILTER_188HZ, INV_MPU6050_FILTER_188HZ,
......
...@@ -142,6 +142,8 @@ int inv_reset_fifo(struct iio_dev *indio_dev) ...@@ -142,6 +142,8 @@ int inv_reset_fifo(struct iio_dev *indio_dev)
d |= INV_MPU6050_BITS_GYRO_OUT; d |= INV_MPU6050_BITS_GYRO_OUT;
if (st->chip_config.accl_fifo_enable) if (st->chip_config.accl_fifo_enable)
d |= INV_MPU6050_BIT_ACCEL_OUT; d |= INV_MPU6050_BIT_ACCEL_OUT;
if (st->chip_config.temp_fifo_enable)
d |= INV_MPU6050_BIT_TEMP_OUT;
if (st->chip_config.magn_fifo_enable) if (st->chip_config.magn_fifo_enable)
d |= INV_MPU6050_BIT_SLAVE_0; d |= INV_MPU6050_BIT_SLAVE_0;
result = regmap_write(st->map, st->reg->fifo_en, d); result = regmap_write(st->map, st->reg->fifo_en, d);
...@@ -183,11 +185,8 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p) ...@@ -183,11 +185,8 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
"failed to ack interrupt\n"); "failed to ack interrupt\n");
goto flush_fifo; goto flush_fifo;
} }
if (!(int_status & INV_MPU6050_BIT_RAW_DATA_RDY_INT)) { if (!(int_status & INV_MPU6050_BIT_RAW_DATA_RDY_INT))
dev_warn(regmap_get_device(st->map),
"spurious interrupt with status 0x%x\n", int_status);
goto end_session; goto end_session;
}
if (!(st->chip_config.accl_fifo_enable | if (!(st->chip_config.accl_fifo_enable |
st->chip_config.gyro_fifo_enable | st->chip_config.gyro_fifo_enable |
...@@ -200,8 +199,8 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p) ...@@ -200,8 +199,8 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
if (st->chip_config.gyro_fifo_enable) if (st->chip_config.gyro_fifo_enable)
bytes_per_datum += INV_MPU6050_BYTES_PER_3AXIS_SENSOR; bytes_per_datum += INV_MPU6050_BYTES_PER_3AXIS_SENSOR;
if (st->chip_type == INV_ICM20602) if (st->chip_config.temp_fifo_enable)
bytes_per_datum += INV_ICM20602_BYTES_PER_TEMP_SENSOR; bytes_per_datum += INV_MPU6050_BYTES_PER_TEMP_SENSOR;
if (st->chip_config.magn_fifo_enable) if (st->chip_config.magn_fifo_enable)
bytes_per_datum += INV_MPU9X50_BYTES_MAGN; bytes_per_datum += INV_MPU9X50_BYTES_MAGN;
......
...@@ -24,6 +24,9 @@ static void inv_scan_query_mpu6050(struct iio_dev *indio_dev) ...@@ -24,6 +24,9 @@ static void inv_scan_query_mpu6050(struct iio_dev *indio_dev)
indio_dev->active_scan_mask) || indio_dev->active_scan_mask) ||
test_bit(INV_MPU6050_SCAN_ACCL_Z, test_bit(INV_MPU6050_SCAN_ACCL_Z,
indio_dev->active_scan_mask); indio_dev->active_scan_mask);
st->chip_config.temp_fifo_enable =
test_bit(INV_MPU6050_SCAN_TEMP, indio_dev->active_scan_mask);
} }
static void inv_scan_query_mpu9x50(struct iio_dev *indio_dev) static void inv_scan_query_mpu9x50(struct iio_dev *indio_dev)
......
...@@ -76,6 +76,7 @@ enum st_lsm6dsx_hw_id { ...@@ -76,6 +76,7 @@ enum st_lsm6dsx_hw_id {
.endianness = IIO_LE, \ .endianness = IIO_LE, \
}, \ }, \
.event_spec = &st_lsm6dsx_event, \ .event_spec = &st_lsm6dsx_event, \
.ext_info = st_lsm6dsx_accel_ext_info, \
.num_event_specs = 1, \ .num_event_specs = 1, \
} }
...@@ -378,6 +379,7 @@ struct st_lsm6dsx_sensor { ...@@ -378,6 +379,7 @@ struct st_lsm6dsx_sensor {
* @enable_event: enabled event bitmask. * @enable_event: enabled event bitmask.
* @iio_devs: Pointers to acc/gyro iio_dev instances. * @iio_devs: Pointers to acc/gyro iio_dev instances.
* @settings: Pointer to the specific sensor settings in use. * @settings: Pointer to the specific sensor settings in use.
* @orientation: sensor chip orientation relative to main hardware.
*/ */
struct st_lsm6dsx_hw { struct st_lsm6dsx_hw {
struct device *dev; struct device *dev;
...@@ -404,6 +406,8 @@ struct st_lsm6dsx_hw { ...@@ -404,6 +406,8 @@ struct st_lsm6dsx_hw {
struct iio_dev *iio_devs[ST_LSM6DSX_ID_MAX]; struct iio_dev *iio_devs[ST_LSM6DSX_ID_MAX];
const struct st_lsm6dsx_settings *settings; const struct st_lsm6dsx_settings *settings;
struct iio_mount_matrix orientation;
}; };
static __maybe_unused const struct iio_event_spec st_lsm6dsx_event = { static __maybe_unused const struct iio_event_spec st_lsm6dsx_event = {
...@@ -477,4 +481,19 @@ st_lsm6dsx_write_locked(struct st_lsm6dsx_hw *hw, unsigned int addr, ...@@ -477,4 +481,19 @@ st_lsm6dsx_write_locked(struct st_lsm6dsx_hw *hw, unsigned int addr,
return err; return err;
} }
static const inline struct iio_mount_matrix *
st_lsm6dsx_get_mount_matrix(const struct iio_dev *iio_dev,
const struct iio_chan_spec *chan)
{
struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev);
struct st_lsm6dsx_hw *hw = sensor->hw;
return &hw->orientation;
}
static const struct iio_chan_spec_ext_info st_lsm6dsx_accel_ext_info[] = {
IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL, st_lsm6dsx_get_mount_matrix),
{ }
};
#endif /* ST_LSM6DSX_H */ #endif /* ST_LSM6DSX_H */
...@@ -1555,8 +1555,11 @@ static int st_lsm6dsx_read_oneshot(struct st_lsm6dsx_sensor *sensor, ...@@ -1555,8 +1555,11 @@ static int st_lsm6dsx_read_oneshot(struct st_lsm6dsx_sensor *sensor,
if (err < 0) if (err < 0)
return err; return err;
if (!hw->enable_event) if (!hw->enable_event) {
st_lsm6dsx_sensor_set_enable(sensor, false); err = st_lsm6dsx_sensor_set_enable(sensor, false);
if (err < 0)
return err;
}
*val = (s16)le16_to_cpu(data); *val = (s16)le16_to_cpu(data);
...@@ -2334,6 +2337,10 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id, ...@@ -2334,6 +2337,10 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
return err; return err;
} }
err = iio_read_mount_matrix(hw->dev, "mount-matrix", &hw->orientation);
if (err)
return err;
for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) { for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) {
if (!hw->iio_devs[i]) if (!hw->iio_devs[i])
continue; continue;
......
...@@ -28,8 +28,6 @@ ...@@ -28,8 +28,6 @@
#include <linux/iio/trigger_consumer.h> #include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h> #include <linux/iio/triggered_buffer.h>
#include <linux/iio/magnetometer/ak8975.h>
/* /*
* Register definitions, as well as various shifts and masks to get at the * Register definitions, as well as various shifts and masks to get at the
* individual fields of the registers. * individual fields of the registers.
...@@ -205,11 +203,11 @@ static long ak09912_raw_to_gauss(u16 data) ...@@ -205,11 +203,11 @@ static long ak09912_raw_to_gauss(u16 data)
/* Compatible Asahi Kasei Compass parts */ /* Compatible Asahi Kasei Compass parts */
enum asahi_compass_chipset { enum asahi_compass_chipset {
AKXXXX = 0,
AK8975, AK8975,
AK8963, AK8963,
AK09911, AK09911,
AK09912, AK09912,
AK_MAX_TYPE
}; };
enum ak_ctrl_reg_addr { enum ak_ctrl_reg_addr {
...@@ -247,7 +245,7 @@ struct ak_def { ...@@ -247,7 +245,7 @@ struct ak_def {
u8 data_regs[3]; u8 data_regs[3];
}; };
static const struct ak_def ak_def_array[AK_MAX_TYPE] = { static const struct ak_def ak_def_array[] = {
{ {
.type = AK8975, .type = AK8975,
.raw_to_gauss = ak8975_raw_to_gauss, .raw_to_gauss = ak8975_raw_to_gauss,
...@@ -783,19 +781,6 @@ static const struct acpi_device_id ak_acpi_match[] = { ...@@ -783,19 +781,6 @@ static const struct acpi_device_id ak_acpi_match[] = {
MODULE_DEVICE_TABLE(acpi, ak_acpi_match); MODULE_DEVICE_TABLE(acpi, ak_acpi_match);
#endif #endif
static const char *ak8975_match_acpi_device(struct device *dev,
enum asahi_compass_chipset *chipset)
{
const struct acpi_device_id *id;
id = acpi_match_device(dev->driver->acpi_match_table, dev);
if (!id)
return NULL;
*chipset = (int)id->driver_data;
return dev_name(dev);
}
static void ak8975_fill_buffer(struct iio_dev *indio_dev) static void ak8975_fill_buffer(struct iio_dev *indio_dev)
{ {
struct ak8975_data *data = iio_priv(indio_dev); struct ak8975_data *data = iio_priv(indio_dev);
...@@ -854,11 +839,11 @@ static int ak8975_probe(struct i2c_client *client, ...@@ -854,11 +839,11 @@ static int ak8975_probe(struct i2c_client *client,
struct ak8975_data *data; struct ak8975_data *data;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct gpio_desc *eoc_gpiod; struct gpio_desc *eoc_gpiod;
const void *match;
unsigned int i;
int err; int err;
enum asahi_compass_chipset chipset;
const char *name = NULL; const char *name = NULL;
enum asahi_compass_chipset chipset = AK_MAX_TYPE;
const struct ak8975_platform_data *pdata =
dev_get_platdata(&client->dev);
/* /*
* Grab and set up the supplied GPIO. * Grab and set up the supplied GPIO.
...@@ -883,32 +868,32 @@ static int ak8975_probe(struct i2c_client *client, ...@@ -883,32 +868,32 @@ static int ak8975_probe(struct i2c_client *client,
data->eoc_gpiod = eoc_gpiod; data->eoc_gpiod = eoc_gpiod;
data->eoc_irq = 0; data->eoc_irq = 0;
if (!pdata) { err = iio_read_mount_matrix(&client->dev, "mount-matrix", &data->orientation);
err = iio_read_mount_matrix(&client->dev, "mount-matrix", if (err)
&data->orientation); return err;
if (err)
return err;
} else
data->orientation = pdata->orientation;
/* id will be NULL when enumerated via ACPI */ /* id will be NULL when enumerated via ACPI */
if (id) { match = device_get_match_data(&client->dev);
if (match) {
chipset = (enum asahi_compass_chipset)(match);
name = dev_name(&client->dev);
} else if (id) {
chipset = (enum asahi_compass_chipset)(id->driver_data); chipset = (enum asahi_compass_chipset)(id->driver_data);
name = id->name; name = id->name;
} else if (ACPI_HANDLE(&client->dev)) {
name = ak8975_match_acpi_device(&client->dev, &chipset);
if (!name)
return -ENODEV;
} else } else
return -ENOSYS; return -ENOSYS;
if (chipset >= AK_MAX_TYPE) { for (i = 0; i < ARRAY_SIZE(ak_def_array); i++)
if (ak_def_array[i].type == chipset)
break;
if (i == ARRAY_SIZE(ak_def_array)) {
dev_err(&client->dev, "AKM device type unsupported: %d\n", dev_err(&client->dev, "AKM device type unsupported: %d\n",
chipset); chipset);
return -ENODEV; return -ENODEV;
} }
data->def = &ak_def_array[chipset]; data->def = &ak_def_array[i];
/* Fetch the regulators */ /* Fetch the regulators */
data->vdd = devm_regulator_get(&client->dev, "vdd"); data->vdd = devm_regulator_get(&client->dev, "vdd");
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/iio/common/st_sensors_i2c.h> #include <linux/iio/common/st_sensors_i2c.h>
#include "st_magn.h" #include "st_magn.h"
#ifdef CONFIG_OF
static const struct of_device_id st_magn_of_match[] = { static const struct of_device_id st_magn_of_match[] = {
{ {
.compatible = "st,lsm303dlh-magn", .compatible = "st,lsm303dlh-magn",
...@@ -50,9 +49,6 @@ static const struct of_device_id st_magn_of_match[] = { ...@@ -50,9 +49,6 @@ static const struct of_device_id st_magn_of_match[] = {
{}, {},
}; };
MODULE_DEVICE_TABLE(of, st_magn_of_match); MODULE_DEVICE_TABLE(of, st_magn_of_match);
#else
#define st_magn_of_match NULL
#endif
static int st_magn_i2c_probe(struct i2c_client *client, static int st_magn_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
...@@ -62,8 +58,7 @@ static int st_magn_i2c_probe(struct i2c_client *client, ...@@ -62,8 +58,7 @@ static int st_magn_i2c_probe(struct i2c_client *client,
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
int err; int err;
st_sensors_of_name_probe(&client->dev, st_magn_of_match, st_sensors_dev_name_probe(&client->dev, client->name, sizeof(client->name));
client->name, sizeof(client->name));
settings = st_magn_get_settings(client->name); settings = st_magn_get_settings(client->name);
if (!settings) { if (!settings) {
...@@ -113,7 +108,7 @@ MODULE_DEVICE_TABLE(i2c, st_magn_id_table); ...@@ -113,7 +108,7 @@ MODULE_DEVICE_TABLE(i2c, st_magn_id_table);
static struct i2c_driver st_magn_driver = { static struct i2c_driver st_magn_driver = {
.driver = { .driver = {
.name = "st-magn-i2c", .name = "st-magn-i2c",
.of_match_table = of_match_ptr(st_magn_of_match), .of_match_table = st_magn_of_match,
}, },
.probe = st_magn_i2c_probe, .probe = st_magn_i2c_probe,
.remove = st_magn_i2c_remove, .remove = st_magn_i2c_remove,
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/iio/common/st_sensors_spi.h> #include <linux/iio/common/st_sensors_spi.h>
#include "st_magn.h" #include "st_magn.h"
#ifdef CONFIG_OF
/* /*
* For new single-chip sensors use <device_name> as compatible string. * For new single-chip sensors use <device_name> as compatible string.
* For old single-chip devices keep <device_name>-magn to maintain * For old single-chip devices keep <device_name>-magn to maintain
...@@ -45,9 +44,6 @@ static const struct of_device_id st_magn_of_match[] = { ...@@ -45,9 +44,6 @@ static const struct of_device_id st_magn_of_match[] = {
{} {}
}; };
MODULE_DEVICE_TABLE(of, st_magn_of_match); MODULE_DEVICE_TABLE(of, st_magn_of_match);
#else
#define st_magn_of_match NULL
#endif
static int st_magn_spi_probe(struct spi_device *spi) static int st_magn_spi_probe(struct spi_device *spi)
{ {
...@@ -56,8 +52,7 @@ static int st_magn_spi_probe(struct spi_device *spi) ...@@ -56,8 +52,7 @@ static int st_magn_spi_probe(struct spi_device *spi)
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
int err; int err;
st_sensors_of_name_probe(&spi->dev, st_magn_of_match, st_sensors_dev_name_probe(&spi->dev, spi->modalias, sizeof(spi->modalias));
spi->modalias, sizeof(spi->modalias));
settings = st_magn_get_settings(spi->modalias); settings = st_magn_get_settings(spi->modalias);
if (!settings) { if (!settings) {
...@@ -104,7 +99,7 @@ MODULE_DEVICE_TABLE(spi, st_magn_id_table); ...@@ -104,7 +99,7 @@ MODULE_DEVICE_TABLE(spi, st_magn_id_table);
static struct spi_driver st_magn_driver = { static struct spi_driver st_magn_driver = {
.driver = { .driver = {
.name = "st-magn-spi", .name = "st-magn-spi",
.of_match_table = of_match_ptr(st_magn_of_match), .of_match_table = st_magn_of_match,
}, },
.probe = st_magn_spi_probe, .probe = st_magn_spi_probe,
.remove = st_magn_spi_remove, .remove = st_magn_spi_remove,
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/acpi.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
...@@ -18,7 +17,6 @@ ...@@ -18,7 +17,6 @@
#include <linux/iio/common/st_sensors_i2c.h> #include <linux/iio/common/st_sensors_i2c.h>
#include "st_pressure.h" #include "st_pressure.h"
#ifdef CONFIG_OF
static const struct of_device_id st_press_of_match[] = { static const struct of_device_id st_press_of_match[] = {
{ {
.compatible = "st,lps001wp-press", .compatible = "st,lps001wp-press",
...@@ -51,9 +49,6 @@ static const struct of_device_id st_press_of_match[] = { ...@@ -51,9 +49,6 @@ static const struct of_device_id st_press_of_match[] = {
{}, {},
}; };
MODULE_DEVICE_TABLE(of, st_press_of_match); MODULE_DEVICE_TABLE(of, st_press_of_match);
#else
#define st_press_of_match NULL
#endif
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
static const struct acpi_device_id st_press_acpi_match[] = { static const struct acpi_device_id st_press_acpi_match[] = {
...@@ -83,18 +78,7 @@ static int st_press_i2c_probe(struct i2c_client *client, ...@@ -83,18 +78,7 @@ static int st_press_i2c_probe(struct i2c_client *client,
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
int ret; int ret;
if (client->dev.of_node) { st_sensors_dev_name_probe(&client->dev, client->name, sizeof(client->name));
st_sensors_of_name_probe(&client->dev, st_press_of_match,
client->name, sizeof(client->name));
} else if (ACPI_HANDLE(&client->dev)) {
ret = st_sensors_match_acpi_device(&client->dev);
if ((ret < 0) || (ret >= ST_PRESS_MAX))
return -ENODEV;
strlcpy(client->name, st_press_id_table[ret].name,
sizeof(client->name));
} else if (!id)
return -ENODEV;
settings = st_press_get_settings(client->name); settings = st_press_get_settings(client->name);
if (!settings) { if (!settings) {
...@@ -131,7 +115,7 @@ static int st_press_i2c_remove(struct i2c_client *client) ...@@ -131,7 +115,7 @@ static int st_press_i2c_remove(struct i2c_client *client)
static struct i2c_driver st_press_driver = { static struct i2c_driver st_press_driver = {
.driver = { .driver = {
.name = "st-press-i2c", .name = "st-press-i2c",
.of_match_table = of_match_ptr(st_press_of_match), .of_match_table = st_press_of_match,
.acpi_match_table = ACPI_PTR(st_press_acpi_match), .acpi_match_table = ACPI_PTR(st_press_acpi_match),
}, },
.probe = st_press_i2c_probe, .probe = st_press_i2c_probe,
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/iio/common/st_sensors_spi.h> #include <linux/iio/common/st_sensors_spi.h>
#include "st_pressure.h" #include "st_pressure.h"
#ifdef CONFIG_OF
/* /*
* For new single-chip sensors use <device_name> as compatible string. * For new single-chip sensors use <device_name> as compatible string.
* For old single-chip devices keep <device_name>-press to maintain * For old single-chip devices keep <device_name>-press to maintain
...@@ -55,9 +54,6 @@ static const struct of_device_id st_press_of_match[] = { ...@@ -55,9 +54,6 @@ static const struct of_device_id st_press_of_match[] = {
{}, {},
}; };
MODULE_DEVICE_TABLE(of, st_press_of_match); MODULE_DEVICE_TABLE(of, st_press_of_match);
#else
#define st_press_of_match NULL
#endif
static int st_press_spi_probe(struct spi_device *spi) static int st_press_spi_probe(struct spi_device *spi)
{ {
...@@ -66,8 +62,7 @@ static int st_press_spi_probe(struct spi_device *spi) ...@@ -66,8 +62,7 @@ static int st_press_spi_probe(struct spi_device *spi)
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
int err; int err;
st_sensors_of_name_probe(&spi->dev, st_press_of_match, st_sensors_dev_name_probe(&spi->dev, spi->modalias, sizeof(spi->modalias));
spi->modalias, sizeof(spi->modalias));
settings = st_press_get_settings(spi->modalias); settings = st_press_get_settings(spi->modalias);
if (!settings) { if (!settings) {
...@@ -116,7 +111,7 @@ MODULE_DEVICE_TABLE(spi, st_press_id_table); ...@@ -116,7 +111,7 @@ MODULE_DEVICE_TABLE(spi, st_press_id_table);
static struct spi_driver st_press_driver = { static struct spi_driver st_press_driver = {
.driver = { .driver = {
.name = "st-press-spi", .name = "st-press-spi",
.of_match_table = of_match_ptr(st_press_of_match), .of_match_table = st_press_of_match,
}, },
.probe = st_press_spi_probe, .probe = st_press_spi_probe,
.remove = st_press_spi_remove, .remove = st_press_spi_remove,
......
...@@ -237,6 +237,12 @@ static const char * const adis16203_status_error_msgs[] = { ...@@ -237,6 +237,12 @@ static const char * const adis16203_status_error_msgs[] = {
[ADIS16203_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.975V", [ADIS16203_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.975V",
}; };
static const struct adis_timeout adis16203_timeouts = {
.reset_ms = ADIS16203_STARTUP_DELAY,
.sw_reset_ms = ADIS16203_STARTUP_DELAY,
.self_test_ms = ADIS16203_STARTUP_DELAY
};
static const struct adis_data adis16203_data = { static const struct adis_data adis16203_data = {
.read_delay = 20, .read_delay = 20,
.msc_ctrl_reg = ADIS16203_MSC_CTRL, .msc_ctrl_reg = ADIS16203_MSC_CTRL,
...@@ -245,7 +251,7 @@ static const struct adis_data adis16203_data = { ...@@ -245,7 +251,7 @@ static const struct adis_data adis16203_data = {
.self_test_mask = ADIS16203_MSC_CTRL_SELF_TEST_EN, .self_test_mask = ADIS16203_MSC_CTRL_SELF_TEST_EN,
.self_test_no_autoclear = true, .self_test_no_autoclear = true,
.startup_delay = ADIS16203_STARTUP_DELAY, .timeouts = &adis16203_timeouts,
.status_error_msgs = adis16203_status_error_msgs, .status_error_msgs = adis16203_status_error_msgs,
.status_error_mask = BIT(ADIS16203_DIAG_STAT_SELFTEST_FAIL_BIT) | .status_error_mask = BIT(ADIS16203_DIAG_STAT_SELFTEST_FAIL_BIT) |
......
...@@ -359,6 +359,12 @@ static const char * const adis16240_status_error_msgs[] = { ...@@ -359,6 +359,12 @@ static const char * const adis16240_status_error_msgs[] = {
[ADIS16240_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.225V", [ADIS16240_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.225V",
}; };
static const struct adis_timeout adis16240_timeouts = {
.reset_ms = ADIS16240_STARTUP_DELAY,
.sw_reset_ms = ADIS16240_STARTUP_DELAY,
.self_test_ms = ADIS16240_STARTUP_DELAY,
};
static const struct adis_data adis16240_data = { static const struct adis_data adis16240_data = {
.write_delay = 35, .write_delay = 35,
.read_delay = 35, .read_delay = 35,
...@@ -368,7 +374,7 @@ static const struct adis_data adis16240_data = { ...@@ -368,7 +374,7 @@ static const struct adis_data adis16240_data = {
.self_test_mask = ADIS16240_MSC_CTRL_SELF_TEST_EN, .self_test_mask = ADIS16240_MSC_CTRL_SELF_TEST_EN,
.self_test_no_autoclear = true, .self_test_no_autoclear = true,
.startup_delay = ADIS16240_STARTUP_DELAY, .timeouts = &adis16240_timeouts,
.status_error_msgs = adis16240_status_error_msgs, .status_error_msgs = adis16240_status_error_msgs,
.status_error_mask = BIT(ADIS16240_DIAG_STAT_PWRON_FAIL_BIT) | .status_error_mask = BIT(ADIS16240_DIAG_STAT_PWRON_FAIL_BIT) |
......
...@@ -7,8 +7,11 @@ ...@@ -7,8 +7,11 @@
#ifndef __IIO_KXCJK_1013_H__ #ifndef __IIO_KXCJK_1013_H__
#define __IIO_KXCJK_1013_H__ #define __IIO_KXCJK_1013_H__
#include <linux/iio/iio.h>
struct kxcjk_1013_platform_data { struct kxcjk_1013_platform_data {
bool active_high_intr; bool active_high_intr;
struct iio_mount_matrix orientation;
}; };
#endif #endif
...@@ -40,6 +40,7 @@ struct iio_dev; ...@@ -40,6 +40,7 @@ struct iio_dev;
* @read_mask: Mask for the communications register having the read bit set. * @read_mask: Mask for the communications register having the read bit set.
* @data_reg: Address of the data register, if 0 the default address of 0x3 will * @data_reg: Address of the data register, if 0 the default address of 0x3 will
* be used. * be used.
* @irq_flags: flags for the interrupt used by the triggered buffer
*/ */
struct ad_sigma_delta_info { struct ad_sigma_delta_info {
int (*set_channel)(struct ad_sigma_delta *, unsigned int channel); int (*set_channel)(struct ad_sigma_delta *, unsigned int channel);
...@@ -49,6 +50,7 @@ struct ad_sigma_delta_info { ...@@ -49,6 +50,7 @@ struct ad_sigma_delta_info {
unsigned int addr_shift; unsigned int addr_shift;
unsigned int read_mask; unsigned int read_mask;
unsigned int data_reg; unsigned int data_reg;
unsigned long irq_flags;
}; };
/** /**
......
...@@ -315,16 +315,6 @@ ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev, ...@@ -315,16 +315,6 @@ ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,
ssize_t st_sensors_sysfs_scale_avail(struct device *dev, ssize_t st_sensors_sysfs_scale_avail(struct device *dev,
struct device_attribute *attr, char *buf); struct device_attribute *attr, char *buf);
#ifdef CONFIG_OF void st_sensors_dev_name_probe(struct device *dev, char *name, int len);
void st_sensors_of_name_probe(struct device *dev,
const struct of_device_id *match,
char *name, int len);
#else
static inline void st_sensors_of_name_probe(struct device *dev,
const struct of_device_id *match,
char *name, int len)
{
}
#endif
#endif /* ST_SENSORS_H */ #endif /* ST_SENSORS_H */
...@@ -12,18 +12,8 @@ ...@@ -12,18 +12,8 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/iio/common/st_sensors.h> #include <linux/iio/common/st_sensors.h>
#include <linux/of.h>
int st_sensors_i2c_configure(struct iio_dev *indio_dev, int st_sensors_i2c_configure(struct iio_dev *indio_dev,
struct i2c_client *client); struct i2c_client *client);
#ifdef CONFIG_ACPI
int st_sensors_match_acpi_device(struct device *dev);
#else
static inline int st_sensors_match_acpi_device(struct device *dev)
{
return -ENODEV;
}
#endif
#endif /* ST_SENSORS_I2C_H */ #endif /* ST_SENSORS_I2C_H */
...@@ -22,6 +22,17 @@ ...@@ -22,6 +22,17 @@
struct adis; struct adis;
struct adis_burst; struct adis_burst;
/**
* struct adis_timeouts - ADIS chip variant timeouts
* @reset_ms - Wait time after rst pin goes inactive
* @sw_reset_ms - Wait time after sw reset command
* @self_test_ms - Wait time after self test command
*/
struct adis_timeout {
u16 reset_ms;
u16 sw_reset_ms;
u16 self_test_ms;
};
/** /**
* struct adis_data - ADIS chip variant specific data * struct adis_data - ADIS chip variant specific data
* @read_delay: SPI delay for read operations in us * @read_delay: SPI delay for read operations in us
...@@ -32,6 +43,7 @@ struct adis_burst; ...@@ -32,6 +43,7 @@ struct adis_burst;
* @diag_stat_reg: Register address of the DIAG_STAT register * @diag_stat_reg: Register address of the DIAG_STAT register
* @status_error_msgs: Array of error messgaes * @status_error_msgs: Array of error messgaes
* @status_error_mask: * @status_error_mask:
* @timeouts: Chip specific delays
*/ */
struct adis_data { struct adis_data {
unsigned int read_delay; unsigned int read_delay;
...@@ -44,7 +56,7 @@ struct adis_data { ...@@ -44,7 +56,7 @@ struct adis_data {
unsigned int self_test_mask; unsigned int self_test_mask;
bool self_test_no_autoclear; bool self_test_no_autoclear;
unsigned int startup_delay; const struct adis_timeout *timeouts;
const char * const *status_error_msgs; const char * const *status_error_msgs;
unsigned int status_error_mask; unsigned int status_error_mask;
......
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __IIO_MAGNETOMETER_AK8975_H__
#define __IIO_MAGNETOMETER_AK8975_H__
#include <linux/iio/iio.h>
/**
* struct ak8975_platform_data - AK8975 magnetometer driver platform data
* @orientation: mounting matrix relative to main hardware
*/
struct ak8975_platform_data {
struct iio_mount_matrix orientation;
};
#endif
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