diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2021-06-09 12:11:49 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2021-06-09 12:11:49 +0200 |
commit | 6771fb0b940eb74f1a68fe3f180a7668103397d3 (patch) | |
tree | 0d17a52002350df09f684277831dd939f63883d3 /include | |
parent | 54fd727f83a4d2f9c6e85cb1fad88325a56b555f (diff) | |
parent | 41340965b4f8055f975f73e1e3d23eff8038f013 (diff) | |
download | linux-stable-6771fb0b940eb74f1a68fe3f180a7668103397d3.tar.gz linux-stable-6771fb0b940eb74f1a68fe3f180a7668103397d3.tar.bz2 linux-stable-6771fb0b940eb74f1a68fe3f180a7668103397d3.zip |
Merge tag 'iio-for-5.14a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-next
Jonathan writes:
1st set of new IIO/counter device support, features and cleanup for 5.14
There are a couple of large cleanup sets in here alongside a number of new
drivers.
Note an immutable branch merged to add a stub for i2c_verify_client()
as needed to avoid a build issue in the fxls8962af driver as a result of a
workaround for a device errata that only applies when i2c interface is used.
Counters
========
New device support
* intel,quadrature encoder peripheral found on Elkhart Lake platforms.
- New driver.
IIO
===
New device support
* amstaos,tsl2591 ambient light sensor.
- New driver + bindings
- Follow up fix to ensure some local variables are suitable for error
handling.
* fsl,fxls8962af + fsl,fxls8964af accelerometers
- New driver + bindings
- Includes an errata work around that cause a build bot failure fixed
by adding a stub to i2c.
* kionix,kxcjk-1013
- Add support for KX023-1025 device. Mostly a different register map
that needed to be supported.
* murata,sca3300 accelerometer
- New driver + bindings
* st,lsm9ds0 IMU
- Rework of st,sensors driver to cleanly support this new glue driver
that enables the two parts of the LSM9DS0.
* ti,tsc2046 touchscreen controller ADC.
- New driver. Intent here is to use this with existing IIO consumer
drivers such as resistive-adc-touch.
- Follow up fix to avoid an issue with unsigned subtraction in error
check.
* ti,tmp117 digital temperature sensor
- New driver + bindings
Features
* adi,ad5755
- Add missing dt-binding doc
* adi,ad7298
- Add ACPI ID used on Intel Galileo Gen 1 boards.
- Add missing dt-binding doc
* adi,ad7476
- Add missing dt-binding doc
* adi,ad7746
- Add missing dt-binding doc for this driver that will hopefully move out
of staging shortly. Update staging driver to use the binding instead of
platform data.
* adi,adis16201 + adis16209
- Add missing dt-binding doc
* adi,adis16480
- Support burst mode for adis16495 and adis16497 parts.
* bosch,bma220
- Add missing dt-binding doc
* fsl,mma7455
- Add missing dt-binding doc
* iio-rescale
- Support handling of processed channels from provider. Some ADCs
require (typically non linear) calibration functions to be applied,
and so provide only IIO_CHAN_INFO_PROCESSED read back. They can be
used as providers to the iio-rescale driver which needs to handle them
somewhat differently from IIO_CHAN_INFO_RAW
* sensiron,sps30
- Support the serial interface. Note this required significant
refactoring of existing driver.
* st,st-sensors
- Add mount matrix support for normal dt-binding whilst continuing to
support the odd ACPI approach for accelerometers.
* ti,dac082s085 + similar
- Add missing dt-binding doc
* trivial-devices - add entries for
- memsic,mx4005, memsic,mx6255 and memsic,mxc6655
- sensortek,stk8312 and sensortek,stk8ba50
Cleanup / minor fixes
* core
- Use devm_add_action_or_reset() to replace boilerplate in several
driver and core IIO devm_* functions.
- Fix an error path issue introduced by above, that could return an
error pointer rather than the expected null from dev_iio_device_alloc()
- Move more IIO internals related fields from struct iio_dev to
struct iio_dev_opaque.
- Drop unused final update of in_loc in demux setup.
* Docs
- Move some docs from driver specific to core dos to avoid replication
of names which the documentation builder does not allow.
Note this means adding a few device specific notes to the general docs
to cover the more unusual uses of the ABI.
- ABI: Move old buffer/* and scan_elements/* docs to obsolete as now we
have the bufferX/* variant. Not we are not getting rid of these
interfaces, just encouraging new code to use the new interface.
* IIO wide:
- Tidy up new cases of dev.parent etc being set in drivers as the core
now does it.
- Fix more cases of possible miss-aligned buffers when passed to
iio_push_to_buffers_with_timestamp(). Note we only have one known
instance of anyone seeing this bug actually happening, so this has been
a low priority cleanup effort for several cycles.
- sysfs_emit() used in more drivers.
- Runtime pm tidy up and use of pm_runtime_resume_and_get()
- Buffer alignment fixes as iio_push_to_buffers_with_timestamp requires
that the timestamp when inserted by naturally aligned + consumers can
assume that all fields are naturally aligned. Part of a long running
effort, with at least 2 more series to come tackling additional
variants.
- Stop specifying "mount-matrix" property name in every lookup of the
mount matrix from firmware by hard coding it in the core.
* adi,ad7476
- Handle the variety of different regulators used by the parts supported
by this driver (came up in dt-binding review)
* adi,ad7746
- Trivial drop of if (ret) return ret; return 0; pattern
- Tidy up comments
- Pull capdac setup out to own function.
* adi,ad7766
- Trivial drop of if (ret) return ret; return 0; pattern
* adi,adis
- Avoid returning error codes in interrupt handlers.
- Handle a failure in spi_write in the trigger handler.
- Rework to add updating of device page after changing it.
- Don't push data to IIO buffers when read failed.
- Add configuration of burst max speed to core avoid handling this in
each driver.
- Use the adis_dev_lock() helper in adis16260 and adis16136 drivers.
- Excessive includes cleanup via include-what-you-use static checker
after zero day highlighted that these needed updating.
* afe
- Amend binding to add #io-channel-cells, thus allowing this IIO
consumer to also be an IIO provider.
* aosong,am2315
- Drop ACPI id. Unlikely this one is in the wild and it isn't valid
ACPI naming.
* bosch,bma180
- Adding missing bandwidth settings (500, 1000 Hz)
* bosch,bme680
- Drop ACPI id. Unlikely this one is in the wild and it isn't valid
ACPI naming.
* ep93xx_adc,
- Drop a redundant error print.
* maxim,max118
- Convert remainder of probe() to devm_ managed functions.
- Avoid some repeated jumping back and forth between iio_dev and
spi structures.
* maxim,max11100
- Use get_unaligned_be16() instead of open coding.
- Convert remainder of probe() to devm_ managed functions.
* samsung,exynos_adc
- Unused error value dropped.
* sensiron,sgp30
- Drop use of %hx in favor of %x and letting the normal type conversion
work.
* sensortek,stk8312
- Add lowercase device id and note uppercase version deprecated.
- Drop ACPI id. Unlikely this one is in the wild and it isn't valid
ACPI naming.
* sprx,sc72xx_adc
- add MODULE_DEVICE_TABLE
* st,lsm6dsx
- Fix docs of valid ODRs
* st,sensors
- dt-binding rework. Two efforts on this crossed in a previous cycle
so this update cherry picks the best of the two yaml conversions.
- Don't copy the channel spec array as now ext_info is no longer modified.
* st,stm32-adc
- tidy up some docs that were marked as kernel-doc but aren't.
* ti,adc081c, ti,adc0832, ti,adc108s102 and ti,adc161s626
- Convert remainder of probe() functions to devm_ managed functions
to simplify error handing and remove paths.
* tag 'iio-for-5.14a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio: (171 commits)
i2c: core: Add stub for i2c_verify_client() if !CONFIG_I2C
iio: adis: Cleanout unused headers
iio: accel: bma180: Add missing 500 Hz / 1000 Hz bandwidth
counter: Add support for Intel Quadrature Encoder Peripheral
staging: iio: cdc: ad7746: extract capac setup to own function
staging: iio: cdc: ad7746: clean up probe return
staging: iio: cdc: ad7746: remove ordinary comments
iio: adc: ti-adc161s626: Use devm managed functions for all of probe.
iio: adc: ti-adc108s102: Use devm managed functions for all of probe()
iio: adc: ti-adc0832: Use devm managed functions for all of probe()
iio: adc: ti-adc081c: Use devm managed functions for all of probe()
iio: adc: max1118: Avoid jumping back and forth between spi and iio structures
iio: adc: max1118: Use devm_ managed functions for all of probe
iio: adc: max11100: Use devm_ functions for rest of probe()
iio: adc: max11100: Use get_unaligned_be16() rather than opencoding.
iio: chemical: sgp30: Drop use of %hx in format string.
iio: gyro: st_gyro: Support mount matrix
iio: magnetometer: st_magn: Support mount matrix
iio: accel: st_sensors: Stop copying channels
iio: accel: st_sensors: Support generic mounting matrix
...
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/i2c.h | 8 | ||||
-rw-r--r-- | include/linux/iio/common/cros_ec_sensors_core.h | 2 | ||||
-rw-r--r-- | include/linux/iio/common/st_sensors.h | 36 | ||||
-rw-r--r-- | include/linux/iio/iio-opaque.h | 22 | ||||
-rw-r--r-- | include/linux/iio/iio.h | 32 | ||||
-rw-r--r-- | include/linux/iio/imu/adis.h | 2 | ||||
-rw-r--r-- | include/linux/platform_data/st_sensors_pdata.h | 3 |
7 files changed, 69 insertions, 36 deletions
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index e8f2ac8c9c3d..7d71131c394e 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -343,7 +343,6 @@ struct i2c_client { }; #define to_i2c_client(d) container_of(d, struct i2c_client, dev) -struct i2c_client *i2c_verify_client(struct device *dev); struct i2c_adapter *i2c_verify_adapter(struct device *dev); const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id, const struct i2c_client *client); @@ -477,6 +476,13 @@ i2c_new_ancillary_device(struct i2c_client *client, u16 default_addr); void i2c_unregister_device(struct i2c_client *client); + +struct i2c_client *i2c_verify_client(struct device *dev); +#else +static inline struct i2c_client *i2c_verify_client(struct device *dev) +{ + return NULL; +} #endif /* I2C */ /* Mainboard arch_initcall() code should register all its I2C devices. diff --git a/include/linux/iio/common/cros_ec_sensors_core.h b/include/linux/iio/common/cros_ec_sensors_core.h index 7ce8a8adad58..c582e1a14232 100644 --- a/include/linux/iio/common/cros_ec_sensors_core.h +++ b/include/linux/iio/common/cros_ec_sensors_core.h @@ -77,7 +77,7 @@ struct cros_ec_sensors_core_state { u16 scale; } calib[CROS_EC_SENSOR_MAX_AXIS]; s8 sign[CROS_EC_SENSOR_MAX_AXIS]; - u8 samples[CROS_EC_SAMPLE_SIZE]; + u8 samples[CROS_EC_SAMPLE_SIZE] __aligned(8); int (*read_ec_sensors_data)(struct iio_dev *indio_dev, unsigned long scan_mask, s16 *data); diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h index 33e939977444..8bdbaf3f3796 100644 --- a/include/linux/iio/common/st_sensors.h +++ b/include/linux/iio/common/st_sensors.h @@ -13,6 +13,7 @@ #include <linux/i2c.h> #include <linux/spi/spi.h> #include <linux/irqreturn.h> +#include <linux/iio/iio.h> #include <linux/iio/trigger.h> #include <linux/bitops.h> #include <linux/regulator/consumer.h> @@ -20,6 +21,8 @@ #include <linux/platform_data/st_sensors_pdata.h> +#define LSM9DS0_IMU_DEV_NAME "lsm9ds0" + /* * Buffer size max case: 2bytes per channel, 3 channels in total + * 8bytes timestamp channel (s64) @@ -46,8 +49,8 @@ #define ST_SENSORS_MAX_NAME 17 #define ST_SENSORS_MAX_4WAI 8 -#define ST_SENSORS_LSM_CHANNELS(device_type, mask, index, mod, \ - ch2, s, endian, rbits, sbits, addr) \ +#define ST_SENSORS_LSM_CHANNELS_EXT(device_type, mask, index, mod, \ + ch2, s, endian, rbits, sbits, addr, ext) \ { \ .type = device_type, \ .modified = mod, \ @@ -63,8 +66,14 @@ .storagebits = sbits, \ .endianness = endian, \ }, \ + .ext_info = ext, \ } +#define ST_SENSORS_LSM_CHANNELS(device_type, mask, index, mod, \ + ch2, s, endian, rbits, sbits, addr) \ + ST_SENSORS_LSM_CHANNELS_EXT(device_type, mask, index, mod, \ + ch2, s, endian, rbits, sbits, addr, NULL) + #define ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL() \ IIO_DEV_ATTR_SAMP_FREQ_AVAIL( \ st_sensors_sysfs_sampling_frequency_avail) @@ -213,6 +222,7 @@ struct st_sensor_settings { * struct st_sensor_data - ST sensor device status * @dev: Pointer to instance of struct device (I2C or SPI). * @trig: The trigger in use by the core driver. + * @mount_matrix: The mounting matrix of the sensor. * @sensor_settings: Pointer to the specific sensor settings in use. * @current_fullscale: Maximum range of measure by the sensor. * @vdd: Pointer to sensor's Vdd power supply @@ -232,7 +242,7 @@ struct st_sensor_settings { struct st_sensor_data { struct device *dev; struct iio_trigger *trig; - struct iio_mount_matrix *mount_matrix; + struct iio_mount_matrix mount_matrix; struct st_sensor_settings *sensor_settings; struct st_sensor_fullscale_avl *current_fullscale; struct regulator *vdd; @@ -317,4 +327,24 @@ ssize_t st_sensors_sysfs_scale_avail(struct device *dev, void st_sensors_dev_name_probe(struct device *dev, char *name, int len); +/* Accelerometer */ +const struct st_sensor_settings *st_accel_get_settings(const char *name); +int st_accel_common_probe(struct iio_dev *indio_dev); +void st_accel_common_remove(struct iio_dev *indio_dev); + +/* Gyroscope */ +const struct st_sensor_settings *st_gyro_get_settings(const char *name); +int st_gyro_common_probe(struct iio_dev *indio_dev); +void st_gyro_common_remove(struct iio_dev *indio_dev); + +/* Magnetometer */ +const struct st_sensor_settings *st_magn_get_settings(const char *name); +int st_magn_common_probe(struct iio_dev *indio_dev); +void st_magn_common_remove(struct iio_dev *indio_dev); + +/* Pressure */ +const struct st_sensor_settings *st_press_get_settings(const char *name); +int st_press_common_probe(struct iio_dev *indio_dev); +void st_press_common_remove(struct iio_dev *indio_dev); + #endif /* ST_SENSORS_H */ diff --git a/include/linux/iio/iio-opaque.h b/include/linux/iio/iio-opaque.h index 32addd5e790e..c9504e9da571 100644 --- a/include/linux/iio/iio-opaque.h +++ b/include/linux/iio/iio-opaque.h @@ -6,6 +6,10 @@ /** * struct iio_dev_opaque - industrial I/O device opaque information * @indio_dev: public industrial I/O device information + * @id: used to identify device internally + * @driver_module: used to make it harder to undercut users + * @info_exist_lock: lock to prevent use during removal + * @trig_readonly: mark the current trigger immutable * @event_interface: event chrdevs associated with interrupt lines * @attached_buffers: array of buffers statically attached by the driver * @attached_buffers_cnt: number of buffers in the array of statically attached buffers @@ -19,6 +23,10 @@ * @groupcounter: index of next attribute group * @legacy_scan_el_group: attribute group for legacy scan elements attribute group * @legacy_buffer_group: attribute group for legacy buffer attributes group + * @scan_index_timestamp: cache of the index to the timestamp + * @clock_id: timestamping clock posix identifier + * @chrdev: associated character device + * @flags: file ops related flags including busy flag. * @debugfs_dentry: device specific debugfs dentry * @cached_reg_addr: cached register address for debugfs reads * @read_buf: read buffer to be used for the initial reg read @@ -26,6 +34,10 @@ */ struct iio_dev_opaque { struct iio_dev indio_dev; + int id; + struct module *driver_module; + struct mutex info_exist_lock; + bool trig_readonly; struct iio_event_interface *event_interface; struct iio_buffer **attached_buffers; unsigned int attached_buffers_cnt; @@ -38,6 +50,12 @@ struct iio_dev_opaque { int groupcounter; struct attribute_group legacy_scan_el_group; struct attribute_group legacy_buffer_group; + + unsigned int scan_index_timestamp; + clockid_t clock_id; + struct cdev chrdev; + unsigned long flags; + #if defined(CONFIG_DEBUG_FS) struct dentry *debugfs_dentry; unsigned cached_reg_addr; @@ -46,7 +64,7 @@ struct iio_dev_opaque { #endif }; -#define to_iio_dev_opaque(indio_dev) \ - container_of(indio_dev, struct iio_dev_opaque, indio_dev) +#define to_iio_dev_opaque(_indio_dev) \ + container_of((_indio_dev), struct iio_dev_opaque, indio_dev) #endif diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index f2d65e2e88b6..324561b7a5e8 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -127,8 +127,7 @@ struct iio_mount_matrix { ssize_t iio_show_mount_matrix(struct iio_dev *indio_dev, uintptr_t priv, const struct iio_chan_spec *chan, char *buf); -int iio_read_mount_matrix(struct device *dev, const char *propname, - struct iio_mount_matrix *matrix); +int iio_read_mount_matrix(struct device *dev, struct iio_mount_matrix *matrix); typedef const struct iio_mount_matrix * (iio_get_mount_matrix_t)(const struct iio_dev *indio_dev, @@ -488,8 +487,6 @@ struct iio_buffer_setup_ops { /** * struct iio_dev - industrial I/O device - * @id: [INTERN] used to identify device internally - * @driver_module: [INTERN] used to make it harder to undercut users * @modes: [DRIVER] operating modes supported by device * @currentmode: [DRIVER] current operating mode * @dev: [DRIVER] device structure, should be assigned a parent @@ -503,9 +500,7 @@ struct iio_buffer_setup_ops { * channels * @active_scan_mask: [INTERN] union of all scan masks requested by buffers * @scan_timestamp: [INTERN] set if any buffers have requested timestamp - * @scan_index_timestamp:[INTERN] cache of the index to the timestamp * @trig: [INTERN] current device trigger (buffer modes) - * @trig_readonly: [INTERN] mark the current trigger immutable * @pollfunc: [DRIVER] function run on trigger being received * @pollfunc_event: [DRIVER] function run on events trigger being received * @channels: [DRIVER] channel specification structure table @@ -513,19 +508,12 @@ struct iio_buffer_setup_ops { * @name: [DRIVER] name of the device. * @label: [DRIVER] unique name to identify which device this is * @info: [DRIVER] callbacks and constant info from driver - * @clock_id: [INTERN] timestamping clock posix identifier - * @info_exist_lock: [INTERN] lock to prevent use during removal * @setup_ops: [DRIVER] callbacks to call before and after buffer * enable/disable - * @chrdev: [INTERN] associated character device - * @flags: [INTERN] file ops related flags including busy flag. * @priv: [DRIVER] reference to driver's private information * **MUST** be accessed **ONLY** via iio_priv() helper */ struct iio_dev { - int id; - struct module *driver_module; - int modes; int currentmode; struct device dev; @@ -538,9 +526,7 @@ struct iio_dev { unsigned masklength; const unsigned long *active_scan_mask; bool scan_timestamp; - unsigned scan_index_timestamp; struct iio_trigger *trig; - bool trig_readonly; struct iio_poll_func *pollfunc; struct iio_poll_func *pollfunc_event; @@ -550,15 +536,13 @@ struct iio_dev { const char *name; const char *label; const struct iio_info *info; - clockid_t clock_id; - struct mutex info_exist_lock; const struct iio_buffer_setup_ops *setup_ops; - struct cdev chrdev; - unsigned long flags; void *priv; }; +int iio_device_id(struct iio_dev *indio_dev); + const struct iio_chan_spec *iio_find_channel_from_si(struct iio_dev *indio_dev, int si); /** @@ -602,15 +586,7 @@ static inline void iio_device_put(struct iio_dev *indio_dev) put_device(&indio_dev->dev); } -/** - * iio_device_get_clock() - Retrieve current timestamping clock for the device - * @indio_dev: IIO device structure containing the device - */ -static inline clockid_t iio_device_get_clock(const struct iio_dev *indio_dev) -{ - return indio_dev->clock_id; -} - +clockid_t iio_device_get_clock(const struct iio_dev *indio_dev); int iio_device_set_clock(struct iio_dev *indio_dev, clockid_t clock_id); /** diff --git a/include/linux/iio/imu/adis.h b/include/linux/iio/imu/adis.h index f9b728d490b1..cf49997d5903 100644 --- a/include/linux/iio/imu/adis.h +++ b/include/linux/iio/imu/adis.h @@ -55,6 +55,7 @@ struct adis_timeout { * this should be the minimum size supported by the device. * @burst_max_len: Holds the maximum burst size when the device supports * more than one burst mode with different sizes + * @burst_max_speed_hz: Maximum spi speed that can be used in burst mode */ struct adis_data { unsigned int read_delay; @@ -83,6 +84,7 @@ struct adis_data { unsigned int burst_reg_cmd; unsigned int burst_len; unsigned int burst_max_len; + unsigned int burst_max_speed_hz; }; /** diff --git a/include/linux/platform_data/st_sensors_pdata.h b/include/linux/platform_data/st_sensors_pdata.h index e40b28ca892e..897051e51b78 100644 --- a/include/linux/platform_data/st_sensors_pdata.h +++ b/include/linux/platform_data/st_sensors_pdata.h @@ -13,8 +13,9 @@ /** * struct st_sensors_platform_data - Platform data for the ST sensors * @drdy_int_pin: Redirect DRDY on pin 1 (1) or pin 2 (2). - * Available only for accelerometer and pressure sensors. + * Available only for accelerometer, magnetometer and pressure sensors. * Accelerometer DRDY on LSM330 available only on pin 1 (see datasheet). + * Magnetometer DRDY is supported only on LSM9DS0. * @open_drain: set the interrupt line to be open drain if possible. * @spi_3wire: enable spi-3wire mode. * @pullups: enable/disable i2c controller pullup resistors. |