iio: adis: add burst_max_speed_hz variable
authorNuno Sa <nuno.sa@analog.com>
Tue, 27 Apr 2021 08:54:52 +0000 (10:54 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 17 May 2021 12:49:09 +0000 (13:49 +0100)
Typically, in burst mode, the device cannot operate at it's full spi
speed. Hence, the spi transfers for burst mode have to take this into
account. With this change we avoid a potential race with the spi core as
drivers were 'hacking' the device 'max_speed_hz' directly in the
trigger handler.

Reviewed-by: Alexandru Ardelean <ardeleanalex@gmail.com>
Signed-off-by: Nuno Sa <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20210427085454.30616-5-nuno.sa@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/adis_buffer.c
include/linux/iio/imu/adis.h

index f6dbfbd17d41b125662d4cf6b96fd93e47ce0986..351c303c8a8c05749957cbb8a05782e4ae3d2e68 100644 (file)
@@ -51,9 +51,13 @@ static int adis_update_scan_mode_burst(struct iio_dev *indio_dev,
        adis->xfer[0].tx_buf = tx;
        adis->xfer[0].bits_per_word = 8;
        adis->xfer[0].len = 2;
+       if (adis->data->burst_max_speed_hz)
+               adis->xfer[0].speed_hz = adis->data->burst_max_speed_hz;
        adis->xfer[1].rx_buf = adis->buffer;
        adis->xfer[1].bits_per_word = 8;
        adis->xfer[1].len = burst_length;
+       if (adis->data->burst_max_speed_hz)
+               adis->xfer[1].speed_hz = adis->data->burst_max_speed_hz;
 
        spi_message_init(&adis->msg);
        spi_message_add_tail(&adis->xfer[0], &adis->msg);
index f9b728d490b1f97225533a505ae12f7fbd22a922..cf49997d5903e9fc77cc5075f2eb2eda943dae8a 100644 (file)
@@ -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;
 };
 
 /**