| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0+ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * ADIS16203 Programmable 360 Degrees Inclinometer |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright 2010 Analog Devices Inc. |
|---|
| 5 | | - * |
|---|
| 6 | | - * Licensed under the GPL-2 or later. |
|---|
| 7 | 6 | */ |
|---|
| 8 | 7 | |
|---|
| 9 | 8 | #include <linux/delay.h> |
|---|
| .. | .. |
|---|
| 123 | 122 | /* Power supply above 3.625 V */ |
|---|
| 124 | 123 | #define ADIS16203_DIAG_STAT_POWER_HIGH_BIT 1 |
|---|
| 125 | 124 | |
|---|
| 126 | | -/* Power supply below 3.15 V */ |
|---|
| 125 | +/* Power supply below 2.975 V */ |
|---|
| 127 | 126 | #define ADIS16203_DIAG_STAT_POWER_LOW_BIT 0 |
|---|
| 128 | 127 | |
|---|
| 129 | 128 | /* GLOB_CMD */ |
|---|
| .. | .. |
|---|
| 235 | 234 | [ADIS16203_DIAG_STAT_SPI_FAIL_BIT] = "SPI failure", |
|---|
| 236 | 235 | [ADIS16203_DIAG_STAT_FLASH_UPT_BIT] = "Flash update failed", |
|---|
| 237 | 236 | [ADIS16203_DIAG_STAT_POWER_HIGH_BIT] = "Power supply above 3.625V", |
|---|
| 238 | | - [ADIS16203_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 3.15V", |
|---|
| 237 | + [ADIS16203_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 2.975V", |
|---|
| 238 | +}; |
|---|
| 239 | + |
|---|
| 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 |
|---|
| 239 | 244 | }; |
|---|
| 240 | 245 | |
|---|
| 241 | 246 | static const struct adis_data adis16203_data = { |
|---|
| .. | .. |
|---|
| 245 | 250 | .diag_stat_reg = ADIS16203_DIAG_STAT, |
|---|
| 246 | 251 | |
|---|
| 247 | 252 | .self_test_mask = ADIS16203_MSC_CTRL_SELF_TEST_EN, |
|---|
| 253 | + .self_test_reg = ADIS16203_MSC_CTRL, |
|---|
| 248 | 254 | .self_test_no_autoclear = true, |
|---|
| 249 | | - .startup_delay = ADIS16203_STARTUP_DELAY, |
|---|
| 255 | + .timeouts = &adis16203_timeouts, |
|---|
| 250 | 256 | |
|---|
| 251 | 257 | .status_error_msgs = adis16203_status_error_msgs, |
|---|
| 252 | 258 | .status_error_mask = BIT(ADIS16203_DIAG_STAT_SELFTEST_FAIL_BIT) | |
|---|
| .. | .. |
|---|
| 271 | 277 | spi_set_drvdata(spi, indio_dev); |
|---|
| 272 | 278 | |
|---|
| 273 | 279 | indio_dev->name = spi->dev.driver->name; |
|---|
| 274 | | - indio_dev->dev.parent = &spi->dev; |
|---|
| 275 | 280 | indio_dev->channels = adis16203_channels; |
|---|
| 276 | 281 | indio_dev->num_channels = ARRAY_SIZE(adis16203_channels); |
|---|
| 277 | 282 | indio_dev->info = &adis16203_info; |
|---|
| .. | .. |
|---|
| 281 | 286 | if (ret) |
|---|
| 282 | 287 | return ret; |
|---|
| 283 | 288 | |
|---|
| 284 | | - ret = adis_setup_buffer_and_trigger(st, indio_dev, NULL); |
|---|
| 289 | + ret = devm_adis_setup_buffer_and_trigger(st, indio_dev, NULL); |
|---|
| 285 | 290 | if (ret) |
|---|
| 286 | 291 | return ret; |
|---|
| 287 | 292 | |
|---|
| 288 | 293 | /* Get the device into a sane initial state */ |
|---|
| 289 | 294 | ret = adis_initial_startup(st); |
|---|
| 290 | 295 | if (ret) |
|---|
| 291 | | - goto error_cleanup_buffer_trigger; |
|---|
| 296 | + return ret; |
|---|
| 292 | 297 | |
|---|
| 293 | | - ret = iio_device_register(indio_dev); |
|---|
| 294 | | - if (ret) |
|---|
| 295 | | - goto error_cleanup_buffer_trigger; |
|---|
| 296 | | - |
|---|
| 297 | | - return 0; |
|---|
| 298 | | - |
|---|
| 299 | | -error_cleanup_buffer_trigger: |
|---|
| 300 | | - adis_cleanup_buffer_and_trigger(st, indio_dev); |
|---|
| 301 | | - return ret; |
|---|
| 298 | + return devm_iio_device_register(&spi->dev, indio_dev); |
|---|
| 302 | 299 | } |
|---|
| 303 | 300 | |
|---|
| 304 | | -static int adis16203_remove(struct spi_device *spi) |
|---|
| 305 | | -{ |
|---|
| 306 | | - struct iio_dev *indio_dev = spi_get_drvdata(spi); |
|---|
| 307 | | - struct adis *st = iio_priv(indio_dev); |
|---|
| 301 | +static const struct of_device_id adis16203_of_match[] = { |
|---|
| 302 | + { .compatible = "adi,adis16203" }, |
|---|
| 303 | + { }, |
|---|
| 304 | +}; |
|---|
| 308 | 305 | |
|---|
| 309 | | - iio_device_unregister(indio_dev); |
|---|
| 310 | | - adis_cleanup_buffer_and_trigger(st, indio_dev); |
|---|
| 311 | | - |
|---|
| 312 | | - return 0; |
|---|
| 313 | | -} |
|---|
| 306 | +MODULE_DEVICE_TABLE(of, adis16203_of_match); |
|---|
| 314 | 307 | |
|---|
| 315 | 308 | static struct spi_driver adis16203_driver = { |
|---|
| 316 | 309 | .driver = { |
|---|
| 317 | 310 | .name = "adis16203", |
|---|
| 311 | + .of_match_table = adis16203_of_match, |
|---|
| 318 | 312 | }, |
|---|
| 319 | 313 | .probe = adis16203_probe, |
|---|
| 320 | | - .remove = adis16203_remove, |
|---|
| 321 | 314 | }; |
|---|
| 322 | 315 | module_spi_driver(adis16203_driver); |
|---|
| 323 | 316 | |
|---|
| .. | .. |
|---|
| 325 | 318 | MODULE_DESCRIPTION("Analog Devices ADIS16203 Programmable 360 Degrees Inclinometer"); |
|---|
| 326 | 319 | MODULE_LICENSE("GPL v2"); |
|---|
| 327 | 320 | MODULE_ALIAS("spi:adis16203"); |
|---|
| 321 | +MODULE_IMPORT_NS(IIO_ADISLIB); |
|---|