History

iio: adis: Introduce timeouts structure

The adis library only allows to define a `startup_delay` which for some devices is enough. However, other devices define different timeouts with significantly different timings which could lead to devices to not wait enough time or to wait a lot more than necessary (which is not efficient). This patch introduces a new timeout struct that must be passed into `adis_init()`. There are mainly, for now, three timeouts used. This is also an introductory patch with the goal of refactoring `adis_initial_startup()`. New driver's (eg: adis16480, adis16460) are replicating code for the device initial setup. With some changes (being this the first one) we can pass this to `adis_initial_startup()`.

Nuno Sá committed 6 years ago

Commit 380b1071 parent 687d39d11 files · +227 −7Browse files

Unified · Split

11 files
  1. drivers/iio/accel/adis16201.c +7 −0
  2. drivers/iio/accel/adis16209.c +7 −0
  3. drivers/iio/gyro/adis16136.c +39 −1
  4. drivers/iio/gyro/adis16260.c +7 −0
  5. drivers/iio/imu/adis.c +14 −4
  6. drivers/iio/imu/adis16400.c +62 −1
  7. drivers/iio/imu/adis16460.c +7 −0
  8. drivers/iio/imu/adis16480.c +57 −1
  9. drivers/staging/iio/accel/adis16203.c +7 −0
  10. drivers/staging/iio/accel/adis16240.c +7 −0
  11. include/linux/iio/imu/adis.h +13 −0
drivers/iio/accel/adis16201.c+7−0
@@ -233,6 +233,12 @@ static const char * const adis16201_status_error_msgs[] = { · 232 unmodified lines
233233 [ADIS16201_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.975V",
234234 };
235235
236+static const struct adis_timeout adis16201_timeouts = {
237+ .reset_ms = ADIS16201_STARTUP_DELAY_MS,
238+ .sw_reset_ms = ADIS16201_STARTUP_DELAY_MS,
239+ .self_test_ms = ADIS16201_STARTUP_DELAY_MS,
240+};
241+
236242 static const struct adis_data adis16201_data = {
237243 .read_delay = 20,
238244 .msc_ctrl_reg = ADIS16201_MSC_CTRL_REG,
@@ -242,6 +248,7 @@ static const struct adis_data adis16201_data = { · 3 unmodified lines
242248 .self_test_mask = ADIS16201_MSC_CTRL_SELF_TEST_EN,
243249 .self_test_no_autoclear = true,
244250 .startup_delay = ADIS16201_STARTUP_DELAY_MS,
251+ .timeouts = &adis16201_timeouts,
245252
246253 .status_error_msgs = adis16201_status_error_msgs,
247254 .status_error_mask = BIT(ADIS16201_DIAG_STAT_SPI_FAIL_BIT) |
drivers/iio/accel/adis16209.c+7−0
@@ -243,6 +243,12 @@ static const char * const adis16209_status_error_msgs[] = { · 242 unmodified lines
243243 [ADIS16209_STAT_POWER_LOW_BIT] = "Power supply below 2.975V",
244244 };
245245
246+static const struct adis_timeout adis16209_timeouts = {
247+ .reset_ms = ADIS16209_STARTUP_DELAY_MS,
248+ .self_test_ms = ADIS16209_STARTUP_DELAY_MS,
249+ .sw_reset_ms = ADIS16209_STARTUP_DELAY_MS,
250+};
251+
246252 static const struct adis_data adis16209_data = {
247253 .read_delay = 30,
248254 .msc_ctrl_reg = ADIS16209_MSC_CTRL_REG,
@@ -252,6 +258,7 @@ static const struct adis_data adis16209_data = { · 3 unmodified lines
252258 .self_test_mask = ADIS16209_MSC_CTRL_SELF_TEST_EN,
253259 .self_test_no_autoclear = true,
254260 .startup_delay = ADIS16209_STARTUP_DELAY_MS,
261+ .timeouts = &adis16209_timeouts,
255262
256263 .status_error_msgs = adis16209_status_error_msgs,
257264 .status_error_mask = BIT(ADIS16209_STAT_SELFTEST_FAIL_BIT) |
drivers/iio/gyro/adis16136.c+39−1
@@ -59,6 +59,7 @@ · 58 unmodified lines
5959 struct adis16136_chip_info {
6060 unsigned int precision;
6161 unsigned int fullscale;
62+ const struct adis_timeout *timeouts;
6263 };
6364
6465 struct adis16136 {
@@ -490,30 +491,63 @@ enum adis16136_id { · 425 unmodified lines
490491 ID_ADIS16137,
491492 };
492493
494+static const struct adis_timeout adis16133_timeouts = {
495+ .reset_ms = 75,
496+ .sw_reset_ms = 75,
497+ .self_test_ms = 50,
498+};
499+
500+static const struct adis_timeout adis16136_timeouts = {
501+ .reset_ms = 128,
502+ .sw_reset_ms = 75,
503+ .self_test_ms = 245,
504+};
505+
493506 static const struct adis16136_chip_info adis16136_chip_info[] = {
494507 [ID_ADIS16133] = {
495508 .precision = IIO_DEGREE_TO_RAD(1200),
496509 .fullscale = 24000,
510+ .timeouts = &adis16133_timeouts,
497511 },
498512 [ID_ADIS16135] = {
499513 .precision = IIO_DEGREE_TO_RAD(300),
500514 .fullscale = 24000,
515+ .timeouts = &adis16133_timeouts,
501516 },
502517 [ID_ADIS16136] = {
503518 .precision = IIO_DEGREE_TO_RAD(450),
504519 .fullscale = 24623,
520+ .timeouts = &adis16136_timeouts,
505521 },
506522 [ID_ADIS16137] = {
507523 .precision = IIO_DEGREE_TO_RAD(1000),
508524 .fullscale = 24609,
525+ .timeouts = &adis16136_timeouts,
509526 },
510527 };
511528
529+static struct adis_data *adis16136_adis_data_alloc(struct adis16136 *st,
530+ struct device *dev)
531+{
532+ struct adis_data *data;
533+
534+ data = devm_kmalloc(dev, sizeof(struct adis_data), GFP_KERNEL);
535+ if (!data)
536+ return ERR_PTR(-ENOMEM);
537+
538+ memcpy(data, &adis16136_data, sizeof(*data));
539+
540+ data->timeouts = st->chip_info->timeouts;
541+
542+ return data;
543+}
544+
512545 static int adis16136_probe(struct spi_device *spi)
513546 {
514547 const struct spi_device_id *id = spi_get_device_id(spi);
515548 struct adis16136 *adis16136;
516549 struct iio_dev *indio_dev;
550+ const struct adis_data *adis16136_data;
517551 int ret;
518552
519553 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adis16136));
@@ -532,7 +566,11 @@ static int adis16136_probe(struct spi_device *spi) · 12 unmodified lines
532566 indio_dev->info = &adis16136_info;
533567 indio_dev->modes = INDIO_DIRECT_MODE;
534568
535− ret = adis_init(&adis16136->adis, indio_dev, spi, &adis16136_data);
569+ adis16136_data = adis16136_adis_data_alloc(adis16136, &spi->dev);
570+ if (IS_ERR(adis16136_data))
571+ return PTR_ERR(adis16136_data);
572+
573+ ret = adis_init(&adis16136->adis, indio_dev, spi, adis16136_data);
536574 if (ret)
537575 return ret;
538576
drivers/iio/gyro/adis16260.c+7−0
@@ -332,6 +332,12 @@ static const char * const adis1620_status_error_msgs[] = { · 331 unmodified lines
332332 [ADIS16260_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 4.75",
333333 };
334334
335+static const struct adis_timeout adis16260_timeouts = {
336+ .reset_ms = ADIS16260_STARTUP_DELAY,
337+ .sw_reset_ms = ADIS16260_STARTUP_DELAY,
338+ .self_test_ms = ADIS16260_STARTUP_DELAY,
339+};
340+
335341 static const struct adis_data adis16260_data = {
336342 .write_delay = 30,
337343 .read_delay = 30,
@@ -341,6 +347,7 @@ static const struct adis_data adis16260_data = { · 3 unmodified lines
341347
342348 .self_test_mask = ADIS16260_MSC_CTRL_MEM_TEST,
343349 .startup_delay = ADIS16260_STARTUP_DELAY,
350+ .timeouts = &adis16260_timeouts,
344351
345352 .status_error_msgs = adis1620_status_error_msgs,
346353 .status_error_mask = BIT(ADIS16260_DIAG_STAT_FLASH_CHK_BIT) |
drivers/iio/imu/adis.c+14−4
@@ -317,19 +317,25 @@ EXPORT_SYMBOL_GPL(__adis_check_status); · 316 unmodified lines
317317 int __adis_reset(struct adis *adis)
318318 {
319319 int ret;
320+ const struct adis_timeout *timeouts = adis->data->timeouts;
320321
321322 ret = __adis_write_reg_8(adis, adis->data->glob_cmd_reg,
322323 ADIS_GLOB_CMD_SW_RESET);
323− if (ret)
324+ if (ret) {
324325 dev_err(&adis->spi->dev, "Failed to reset device: %d\n", ret);
326+ return ret;
327+ }
325328
326− return ret;
329+ msleep(timeouts->sw_reset_ms);
330+
331+ return 0;
327332 }
328333 EXPORT_SYMBOL_GPL(__adis_reset);
329334
330335 static int adis_self_test(struct adis *adis)
331336 {
332337 int ret;
338+ const struct adis_timeout *timeouts = adis->data->timeouts;
333339
334340 ret = __adis_write_reg_16(adis, adis->data->msc_ctrl_reg,
335341 adis->data->self_test_mask);
@@ -339,7 +345,7 @@ static int adis_self_test(struct adis *adis) · 3 unmodified lines
339345 return ret;
340346 }
341347
342− msleep(adis->data->startup_delay);
348+ msleep(timeouts->self_test_ms);
343349
344350 ret = __adis_check_status(adis);
345351
@@ -368,7 +374,6 @@ int adis_initial_startup(struct adis *adis) · 22 unmodified lines
368374 if (ret) {
369375 dev_err(&adis->spi->dev, "Self-test failed, trying reset.\n");
370376 __adis_reset(adis);
371− msleep(adis->data->startup_delay);
372377 ret = adis_self_test(adis);
373378 if (ret) {
374379 dev_err(&adis->spi->dev, "Second self-test failed, giving up.\n");
@@ -444,6 +449,11 @@ EXPORT_SYMBOL_GPL(adis_single_conversion); · 69 unmodified lines
444449 int adis_init(struct adis *adis, struct iio_dev *indio_dev,
445450 struct spi_device *spi, const struct adis_data *data)
446451 {
452+ if (!data || !data->timeouts) {
453+ dev_err(&spi->dev, "No config data or timeouts not defined!\n");
454+ return -EINVAL;
455+ }
456+
447457 mutex_init(&adis->state_lock);
448458 adis->spi = spi;
449459 adis->data = data;
drivers/iio/imu/adis16400.c+62−1
@@ -156,6 +156,7 @@ struct adis16400_state; · 155 unmodified lines
156156
157157 struct adis16400_chip_info {
158158 const struct iio_chan_spec *channels;
159+ const struct adis_timeout *timeouts;
159160 const int num_channels;
160161 const long flags;
161162 unsigned int gyro_scale_micro;
@@ -929,6 +930,36 @@ static const struct iio_chan_spec adis16334_channels[] = { · 767 unmodified lines
929930 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
930931 };
931932
933+static const struct adis_timeout adis16300_timeouts = {
934+ .reset_ms = ADIS16400_STARTUP_DELAY,
935+ .sw_reset_ms = ADIS16400_STARTUP_DELAY,
936+ .self_test_ms = ADIS16400_STARTUP_DELAY,
937+};
938+
939+static const struct adis_timeout adis16362_timeouts = {
940+ .reset_ms = 130,
941+ .sw_reset_ms = 130,
942+ .self_test_ms = 12,
943+};
944+
945+static const struct adis_timeout adis16400_timeouts = {
946+ .reset_ms = 170,
947+ .sw_reset_ms = 170,
948+ .self_test_ms = 12,
949+};
950+
951+static const struct adis_timeout adis16445_timeouts = {
952+ .reset_ms = 55,
953+ .sw_reset_ms = 55,
954+ .self_test_ms = 16,
955+};
956+
957+static const struct adis_timeout adis16448_timeouts = {
958+ .reset_ms = 90,
959+ .sw_reset_ms = 90,
960+ .self_test_ms = 45,
961+};
962+
932963 static struct adis16400_chip_info adis16400_chips[] = {
933964 [ADIS16300] = {
934965 .channels = adis16300_channels,
@@ -941,6 +972,7 @@ static struct adis16400_chip_info adis16400_chips[] = { · 6 unmodified lines
941972 .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
942973 .set_freq = adis16400_set_freq,
943974 .get_freq = adis16400_get_freq,
975+ .timeouts = &adis16300_timeouts,
944976 },
945977 [ADIS16334] = {
946978 .channels = adis16334_channels,
@@ -964,6 +996,7 @@ static struct adis16400_chip_info adis16400_chips[] = { · 17 unmodified lines
964996 .flags = ADIS16400_NO_BURST | ADIS16400_HAS_SLOW_MODE,
965997 .set_freq = adis16400_set_freq,
966998 .get_freq = adis16400_get_freq,
999+ .timeouts = &adis16300_timeouts,
9671000 },
9681001 [ADIS16360] = {
9691002 .channels = adis16350_channels,
@@ -976,6 +1009,7 @@ static struct adis16400_chip_info adis16400_chips[] = { · 6 unmodified lines
9761009 .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
9771010 .set_freq = adis16400_set_freq,
9781011 .get_freq = adis16400_get_freq,
1012+ .timeouts = &adis16300_timeouts,
9791013 },
9801014 [ADIS16362] = {
9811015 .channels = adis16350_channels,
@@ -988,6 +1022,7 @@ static struct adis16400_chip_info adis16400_chips[] = { · 6 unmodified lines
9881022 .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
9891023 .set_freq = adis16400_set_freq,
9901024 .get_freq = adis16400_get_freq,
1025+ .timeouts = &adis16362_timeouts,
9911026 },
9921027 [ADIS16364] = {
9931028 .channels = adis16350_channels,
@@ -1000,6 +1035,7 @@ static struct adis16400_chip_info adis16400_chips[] = { · 6 unmodified lines
10001035 .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
10011036 .set_freq = adis16400_set_freq,
10021037 .get_freq = adis16400_get_freq,
1038+ .timeouts = &adis16362_timeouts,
10031039 },
10041040 [ADIS16367] = {
10051041 .channels = adis16350_channels,
@@ -1012,6 +1048,7 @@ static struct adis16400_chip_info adis16400_chips[] = { · 6 unmodified lines
10121048 .temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
10131049 .set_freq = adis16400_set_freq,
10141050 .get_freq = adis16400_get_freq,
1051+ .timeouts = &adis16300_timeouts,
10151052 },
10161053 [ADIS16400] = {
10171054 .channels = adis16400_channels,
@@ -1023,6 +1060,7 @@ static struct adis16400_chip_info adis16400_chips[] = { · 5 unmodified lines
10231060 .temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
10241061 .set_freq = adis16400_set_freq,
10251062 .get_freq = adis16400_get_freq,
1063+ .timeouts = &adis16400_timeouts,
10261064 },
10271065 [ADIS16445] = {
10281066 .channels = adis16445_channels,
@@ -1036,6 +1074,7 @@ static struct adis16400_chip_info adis16400_chips[] = { · 7 unmodified lines
10361074 .temp_offset = 31000000 / 73860, /* 31 C = 0x00 */
10371075 .set_freq = adis16334_set_freq,
10381076 .get_freq = adis16334_get_freq,
1077+ .timeouts = &adis16445_timeouts,
10391078 },
10401079 [ADIS16448] = {
10411080 .channels = adis16448_channels,
@@ -1049,6 +1088,7 @@ static struct adis16400_chip_info adis16400_chips[] = { · 7 unmodified lines
10491088 .temp_offset = 31000000 / 73860, /* 31 C = 0x00 */
10501089 .set_freq = adis16334_set_freq,
10511090 .get_freq = adis16334_get_freq,
1091+ .timeouts = &adis16448_timeouts,
10521092 }
10531093 };
10541094
@@ -1120,11 +1160,28 @@ static void adis16400_setup_chan_mask(struct adis16400_state *st) · 65 unmodified lines
11201160 }
11211161 }
11221162
1163+static struct adis_data *adis16400_adis_data_alloc(struct adis16400_state *st,
1164+ struct device *dev)
1165+{
1166+ struct adis_data *data;
1167+
1168+ data = devm_kmalloc(dev, sizeof(struct adis_data), GFP_KERNEL);
1169+ if (!data)
1170+ return ERR_PTR(-ENOMEM);
1171+
1172+ memcpy(data, &adis16400_data, sizeof(*data));
1173+
1174+ data->timeouts = st->variant->timeouts;
1175+
1176+ return data;
1177+}
1178+
11231179 static int adis16400_probe(struct spi_device *spi)
11241180 {
11251181 struct adis16400_state *st;
11261182 struct iio_dev *indio_dev;
11271183 int ret;
1184+ const struct adis_data *adis16400_data;
11281185
11291186 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
11301187 if (indio_dev == NULL)
@@ -1151,7 +1208,11 @@ static int adis16400_probe(struct spi_device *spi) · 20 unmodified lines
11511208 st->adis.burst->extra_len = sizeof(u16);
11521209 }
11531210
1154− ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data);
1211+ adis16400_data = adis16400_adis_data_alloc(st, &spi->dev);
1212+ if (IS_ERR(adis16400_data))
1213+ return PTR_ERR(adis16400_data);
1214+
1215+ ret = adis_init(&st->adis, indio_dev, spi, adis16400_data);
11551216 if (ret)
11561217 return ret;
11571218
drivers/iio/imu/adis16460.c+7−0
@@ -383,6 +383,12 @@ static const char * const adis16460_status_error_msgs[] = { · 382 unmodified lines
383383 [ADIS16460_DIAG_STAT_FLASH_UPT] = "Flash update failure",
384384 };
385385
386+static const struct adis_timeout adis16460_timeouts = {
387+ .reset_ms = 225,
388+ .sw_reset_ms = 225,
389+ .self_test_ms = 10,
390+};
391+
386392 static const struct adis_data adis16460_data = {
387393 .diag_stat_reg = ADIS16460_REG_DIAG_STAT,
388394 .glob_cmd_reg = ADIS16460_REG_GLOB_CMD,
@@ -398,6 +404,7 @@ static const struct adis_data adis16460_data = { · 9 unmodified lines
398404 BIT(ADIS16460_DIAG_STAT_SPI_COMM) |
399405 BIT(ADIS16460_DIAG_STAT_FLASH_UPT),
400406 .enable_irq = adis16460_enable_irq,
407+ .timeouts = &adis16460_timeouts,
401408 };
402409
403410 static int adis16460_probe(struct spi_device *spi)
drivers/iio/imu/adis16480.c+57−1
@@ -138,6 +138,7 @@ struct adis16480_chip_info { · 137 unmodified lines
138138 unsigned int max_dec_rate;
139139 const unsigned int *filter_freqs;
140140 bool has_pps_clk_mode;
141+ const struct adis_timeout *timeouts;
141142 };
142143
143144 enum adis16480_int_pin {
@@ -794,6 +795,30 @@ enum adis16480_variant { · 650 unmodified lines
794795 ADIS16497_3,
795796 };
796797
798+static const struct adis_timeout adis16485_timeouts = {
799+ .reset_ms = 560,
800+ .sw_reset_ms = 120,
801+ .self_test_ms = 12,
802+};
803+
804+static const struct adis_timeout adis16480_timeouts = {
805+ .reset_ms = 560,
806+ .sw_reset_ms = 560,
807+ .self_test_ms = 12,
808+};
809+
810+static const struct adis_timeout adis16495_timeouts = {
811+ .reset_ms = 170,
812+ .sw_reset_ms = 130,
813+ .self_test_ms = 40,
814+};
815+
816+static const struct adis_timeout adis16495_1_timeouts = {
817+ .reset_ms = 250,
818+ .sw_reset_ms = 210,
819+ .self_test_ms = 20,
820+};
821+
797822 static const struct adis16480_chip_info adis16480_chip_info[] = {
798823 [ADIS16375] = {
799824 .channels = adis16485_channels,
@@ -812,6 +837,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 12 unmodified lines
812837 .int_clk = 2460000,
813838 .max_dec_rate = 2048,
814839 .filter_freqs = adis16480_def_filter_freqs,
840+ .timeouts = &adis16485_timeouts,
815841 },
816842 [ADIS16480] = {
817843 .channels = adis16480_channels,
@@ -824,6 +850,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 6 unmodified lines
824850 .int_clk = 2460000,
825851 .max_dec_rate = 2048,
826852 .filter_freqs = adis16480_def_filter_freqs,
853+ .timeouts = &adis16480_timeouts,
827854 },
828855 [ADIS16485] = {
829856 .channels = adis16485_channels,
@@ -836,6 +863,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 6 unmodified lines
836863 .int_clk = 2460000,
837864 .max_dec_rate = 2048,
838865 .filter_freqs = adis16480_def_filter_freqs,
866+ .timeouts = &adis16485_timeouts,
839867 },
840868 [ADIS16488] = {
841869 .channels = adis16480_channels,
@@ -848,6 +876,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 6 unmodified lines
848876 .int_clk = 2460000,
849877 .max_dec_rate = 2048,
850878 .filter_freqs = adis16480_def_filter_freqs,
879+ .timeouts = &adis16485_timeouts,
851880 },
852881 [ADIS16495_1] = {
853882 .channels = adis16485_channels,
@@ -861,6 +890,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 7 unmodified lines
861890 .max_dec_rate = 4250,
862891 .filter_freqs = adis16495_def_filter_freqs,
863892 .has_pps_clk_mode = true,
893+ .timeouts = &adis16495_1_timeouts,
864894 },
865895 [ADIS16495_2] = {
866896 .channels = adis16485_channels,
@@ -874,6 +904,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 7 unmodified lines
874904 .max_dec_rate = 4250,
875905 .filter_freqs = adis16495_def_filter_freqs,
876906 .has_pps_clk_mode = true,
907+ .timeouts = &adis16495_1_timeouts,
877908 },
878909 [ADIS16495_3] = {
879910 .channels = adis16485_channels,
@@ -887,6 +918,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 7 unmodified lines
887918 .max_dec_rate = 4250,
888919 .filter_freqs = adis16495_def_filter_freqs,
889920 .has_pps_clk_mode = true,
921+ .timeouts = &adis16495_1_timeouts,
890922 },
891923 [ADIS16497_1] = {
892924 .channels = adis16485_channels,
@@ -900,6 +932,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 7 unmodified lines
900932 .max_dec_rate = 4250,
901933 .filter_freqs = adis16495_def_filter_freqs,
902934 .has_pps_clk_mode = true,
935+ .timeouts = &adis16495_1_timeouts,
903936 },
904937 [ADIS16497_2] = {
905938 .channels = adis16485_channels,
@@ -913,6 +946,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 7 unmodified lines
913946 .max_dec_rate = 4250,
914947 .filter_freqs = adis16495_def_filter_freqs,
915948 .has_pps_clk_mode = true,
949+ .timeouts = &adis16495_1_timeouts,
916950 },
917951 [ADIS16497_3] = {
918952 .channels = adis16485_channels,
@@ -926,6 +960,7 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { · 7 unmodified lines
926960 .max_dec_rate = 4250,
927961 .filter_freqs = adis16495_def_filter_freqs,
928962 .has_pps_clk_mode = true,
963+ .timeouts = &adis16495_1_timeouts,
929964 },
930965 };
931966
@@ -1195,9 +1230,26 @@ static int adis16480_get_ext_clocks(struct adis16480 *st) · 263 unmodified lines
11951230 return 0;
11961231 }
11971232
1233+static struct adis_data *adis16480_adis_data_alloc(struct adis16480 *st,
1234+ struct device *dev)
1235+{
1236+ struct adis_data *data;
1237+
1238+ data = devm_kmalloc(dev, sizeof(struct adis_data), GFP_KERNEL);
1239+ if (!data)
1240+ return ERR_PTR(-ENOMEM);
1241+
1242+ memcpy(data, &adis16480_data, sizeof(*data));
1243+
1244+ data->timeouts = st->chip_info->timeouts;
1245+
1246+ return data;
1247+}
1248+
11981249 static int adis16480_probe(struct spi_device *spi)
11991250 {
12001251 const struct spi_device_id *id = spi_get_device_id(spi);
1252+ const struct adis_data *adis16480_data;
12011253 struct iio_dev *indio_dev;
12021254 struct adis16480 *st;
12031255 int ret;
@@ -1218,7 +1270,11 @@ static int adis16480_probe(struct spi_device *spi) · 14 unmodified lines
12181270 indio_dev->info = &adis16480_info;
12191271 indio_dev->modes = INDIO_DIRECT_MODE;
12201272
1221− ret = adis_init(&st->adis, indio_dev, spi, &adis16480_data);
1273+ adis16480_data = adis16480_adis_data_alloc(st, &spi->dev);
1274+ if (IS_ERR(adis16480_data))
1275+ return PTR_ERR(adis16480_data);
1276+
1277+ ret = adis_init(&st->adis, indio_dev, spi, adis16480_data);
12221278 if (ret)
12231279 return ret;
12241280
drivers/staging/iio/accel/adis16203.c+7−0
@@ -237,6 +237,12 @@ static const char * const adis16203_status_error_msgs[] = { · 236 unmodified lines
237237 [ADIS16203_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.975V",
238238 };
239239
240+static const struct adis_timeout adis16203_timeouts = {
241+ .reset_ms = ADIS16203_STARTUP_DELAY,
242+ .sw_reset_ms = ADIS16203_STARTUP_DELAY,
243+ .self_test_ms = ADIS16203_STARTUP_DELAY
244+};
245+
240246 static const struct adis_data adis16203_data = {
241247 .read_delay = 20,
242248 .msc_ctrl_reg = ADIS16203_MSC_CTRL,
@@ -246,6 +252,7 @@ static const struct adis_data adis16203_data = { · 3 unmodified lines
246252 .self_test_mask = ADIS16203_MSC_CTRL_SELF_TEST_EN,
247253 .self_test_no_autoclear = true,
248254 .startup_delay = ADIS16203_STARTUP_DELAY,
255+ .timeouts = &adis16203_timeouts,
249256
250257 .status_error_msgs = adis16203_status_error_msgs,
251258 .status_error_mask = BIT(ADIS16203_DIAG_STAT_SELFTEST_FAIL_BIT) |
drivers/staging/iio/accel/adis16240.c+7−0
@@ -359,6 +359,12 @@ static const char * const adis16240_status_error_msgs[] = { · 358 unmodified lines
359359 [ADIS16240_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.225V",
360360 };
361361
362+static const struct adis_timeout adis16240_timeouts = {
363+ .reset_ms = ADIS16240_STARTUP_DELAY,
364+ .sw_reset_ms = ADIS16240_STARTUP_DELAY,
365+ .self_test_ms = ADIS16240_STARTUP_DELAY,
366+};
367+
362368 static const struct adis_data adis16240_data = {
363369 .write_delay = 35,
364370 .read_delay = 35,
@@ -369,6 +375,7 @@ static const struct adis_data adis16240_data = { · 4 unmodified lines
369375 .self_test_mask = ADIS16240_MSC_CTRL_SELF_TEST_EN,
370376 .self_test_no_autoclear = true,
371377 .startup_delay = ADIS16240_STARTUP_DELAY,
378+ .timeouts = &adis16240_timeouts,
372379
373380 .status_error_msgs = adis16240_status_error_msgs,
374381 .status_error_mask = BIT(ADIS16240_DIAG_STAT_PWRON_FAIL_BIT) |
include/linux/iio/imu/adis.h+13−0
@@ -22,6 +22,17 @@ · 21 unmodified lines
2222 struct adis;
2323 struct adis_burst;
2424
25+/**
26+ * struct adis_timeouts - ADIS chip variant timeouts
27+ * @reset_ms - Wait time after rst pin goes inactive
28+ * @sw_reset_ms - Wait time after sw reset command
29+ * @self_test_ms - Wait time after self test command
30+ */
31+struct adis_timeout {
32+ u16 reset_ms;
33+ u16 sw_reset_ms;
34+ u16 self_test_ms;
35+};
2536 /**
2637 * struct adis_data - ADIS chip variant specific data
2738 * @read_delay: SPI delay for read operations in us
@@ -32,6 +43,7 @@ struct adis_burst; · 4 unmodified lines
3243 * @diag_stat_reg: Register address of the DIAG_STAT register
3344 * @status_error_msgs: Array of error messgaes
3445 * @status_error_mask:
46+ * @timeouts: Chip specific delays
3547 */
3648 struct adis_data {
3749 unsigned int read_delay;
@@ -45,6 +57,7 @@ struct adis_data { · 7 unmodified lines
4557 unsigned int self_test_mask;
4658 bool self_test_no_autoclear;
4759 unsigned int startup_delay;
60+ const struct adis_timeout *timeouts;
4861
4962 const char * const *status_error_msgs;
5063 unsigned int status_error_mask;