hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/staging/iio/accel/adis16240.c
....@@ -1,14 +1,12 @@
1
+// SPDX-License-Identifier: GPL-2.0+
12 /*
23 * ADIS16240 Programmable Impact Sensor and Recorder driver
34 *
45 * Copyright 2010 Analog Devices Inc.
5
- *
6
- * Licensed under the GPL-2 or later.
76 */
87
98 #include <linux/interrupt.h>
109 #include <linux/irq.h>
11
-#include <linux/gpio.h>
1210 #include <linux/delay.h>
1311 #include <linux/device.h>
1412 #include <linux/kernel.h>
....@@ -176,7 +174,7 @@
176174 /* Power supply above 3.625 V */
177175 #define ADIS16240_DIAG_STAT_POWER_HIGH_BIT 1
178176
179
- /* Power supply below 3.15 V */
177
+ /* Power supply below 2.225 V */
180178 #define ADIS16240_DIAG_STAT_POWER_LOW_BIT 0
181179
182180 /* GLOB_CMD */
....@@ -310,15 +308,12 @@
310308 long mask)
311309 {
312310 struct adis *st = iio_priv(indio_dev);
313
- int bits = 10;
314
- s16 val16;
315311 u8 addr;
316312
317313 switch (mask) {
318314 case IIO_CHAN_INFO_CALIBBIAS:
319
- val16 = val & ((1 << bits) - 1);
320315 addr = adis16240_addresses[chan->scan_index][0];
321
- return adis_write_reg_16(st, addr, val16);
316
+ return adis_write_reg_16(st, addr, val & GENMASK(9, 0));
322317 }
323318 return -EINVAL;
324319 }
....@@ -364,6 +359,12 @@
364359 [ADIS16240_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.225V",
365360 };
366361
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
+
367368 static const struct adis_data adis16240_data = {
368369 .write_delay = 35,
369370 .read_delay = 35,
....@@ -372,8 +373,9 @@
372373 .diag_stat_reg = ADIS16240_DIAG_STAT,
373374
374375 .self_test_mask = ADIS16240_MSC_CTRL_SELF_TEST_EN,
376
+ .self_test_reg = ADIS16240_MSC_CTRL,
375377 .self_test_no_autoclear = true,
376
- .startup_delay = ADIS16240_STARTUP_DELAY,
378
+ .timeouts = &adis16240_timeouts,
377379
378380 .status_error_msgs = adis16240_status_error_msgs,
379381 .status_error_mask = BIT(ADIS16240_DIAG_STAT_PWRON_FAIL_BIT) |
....@@ -398,50 +400,44 @@
398400 spi_set_drvdata(spi, indio_dev);
399401
400402 indio_dev->name = spi->dev.driver->name;
401
- indio_dev->dev.parent = &spi->dev;
402403 indio_dev->info = &adis16240_info;
403404 indio_dev->channels = adis16240_channels;
404405 indio_dev->num_channels = ARRAY_SIZE(adis16240_channels);
405406 indio_dev->modes = INDIO_DIRECT_MODE;
406407
408
+ spi->mode = SPI_MODE_3;
409
+ ret = spi_setup(spi);
410
+ if (ret) {
411
+ dev_err(&spi->dev, "spi_setup failed!\n");
412
+ return ret;
413
+ }
414
+
407415 ret = adis_init(st, indio_dev, spi, &adis16240_data);
408416 if (ret)
409417 return ret;
410
- ret = adis_setup_buffer_and_trigger(st, indio_dev, NULL);
418
+ ret = devm_adis_setup_buffer_and_trigger(st, indio_dev, NULL);
411419 if (ret)
412420 return ret;
413421
414422 /* Get the device into a sane initial state */
415423 ret = adis_initial_startup(st);
416424 if (ret)
417
- goto error_cleanup_buffer_trigger;
418
- ret = iio_device_register(indio_dev);
419
- if (ret)
420
- goto error_cleanup_buffer_trigger;
421
- return 0;
425
+ return ret;
422426
423
-error_cleanup_buffer_trigger:
424
- adis_cleanup_buffer_and_trigger(st, indio_dev);
425
- return ret;
427
+ return devm_iio_device_register(&spi->dev, indio_dev);
426428 }
427
-
428
-static int adis16240_remove(struct spi_device *spi)
429
-{
430
- struct iio_dev *indio_dev = spi_get_drvdata(spi);
431
- struct adis *st = iio_priv(indio_dev);
432
-
433
- iio_device_unregister(indio_dev);
434
- adis_cleanup_buffer_and_trigger(st, indio_dev);
435
-
436
- return 0;
437
-}
429
+static const struct of_device_id adis16240_of_match[] = {
430
+ { .compatible = "adi,adis16240" },
431
+ { },
432
+};
433
+MODULE_DEVICE_TABLE(of, adis16240_of_match);
438434
439435 static struct spi_driver adis16240_driver = {
440436 .driver = {
441437 .name = "adis16240",
438
+ .of_match_table = adis16240_of_match,
442439 },
443440 .probe = adis16240_probe,
444
- .remove = adis16240_remove,
445441 };
446442 module_spi_driver(adis16240_driver);
447443
....@@ -449,3 +445,4 @@
449445 MODULE_DESCRIPTION("Analog Devices Programmable Impact Sensor and Recorder");
450446 MODULE_LICENSE("GPL v2");
451447 MODULE_ALIAS("spi:adis16240");
448
+MODULE_IMPORT_NS(IIO_ADISLIB);