| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Industrial I/O driver for Microchip digital potentiometers |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (c) 2016 Slawomir Stepien |
|---|
| 5 | 6 | * Based on: Peter Rosin's code from mcp4531.c |
|---|
| 6 | 7 | * |
|---|
| 7 | | - * Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/22060b.pdf |
|---|
| 8 | + * Datasheet: https://ww1.microchip.com/downloads/en/DeviceDoc/22060b.pdf |
|---|
| 8 | 9 | * |
|---|
| 9 | 10 | * DEVID #Wipers #Positions Resistor Opts (kOhm) |
|---|
| 10 | 11 | * mcp4131 1 129 5, 10, 50, 100 |
|---|
| .. | .. |
|---|
| 23 | 24 | * mcp4252 2 257 5, 10, 50, 100 |
|---|
| 24 | 25 | * mcp4261 2 257 5, 10, 50, 100 |
|---|
| 25 | 26 | * mcp4262 2 257 5, 10, 50, 100 |
|---|
| 26 | | - * |
|---|
| 27 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 28 | | - * under the terms of the GNU General Public License version 2 as published by |
|---|
| 29 | | - * the Free Software Foundation. |
|---|
| 30 | 27 | */ |
|---|
| 31 | 28 | |
|---|
| 32 | 29 | /* |
|---|
| .. | .. |
|---|
| 40 | 37 | #include <linux/iio/iio.h> |
|---|
| 41 | 38 | #include <linux/iio/types.h> |
|---|
| 42 | 39 | #include <linux/module.h> |
|---|
| 40 | +#include <linux/mod_devicetable.h> |
|---|
| 43 | 41 | #include <linux/mutex.h> |
|---|
| 44 | | -#include <linux/of.h> |
|---|
| 42 | +#include <linux/property.h> |
|---|
| 45 | 43 | #include <linux/spi/spi.h> |
|---|
| 46 | 44 | |
|---|
| 47 | 45 | #define MCP4131_WRITE (0x00 << 2) |
|---|
| .. | .. |
|---|
| 243 | 241 | { |
|---|
| 244 | 242 | int err; |
|---|
| 245 | 243 | struct device *dev = &spi->dev; |
|---|
| 246 | | - unsigned long devid = spi_get_device_id(spi)->driver_data; |
|---|
| 244 | + unsigned long devid; |
|---|
| 247 | 245 | struct mcp4131_data *data; |
|---|
| 248 | 246 | struct iio_dev *indio_dev; |
|---|
| 249 | 247 | |
|---|
| .. | .. |
|---|
| 254 | 252 | data = iio_priv(indio_dev); |
|---|
| 255 | 253 | spi_set_drvdata(spi, indio_dev); |
|---|
| 256 | 254 | data->spi = spi; |
|---|
| 257 | | - data->cfg = &mcp4131_cfg[devid]; |
|---|
| 255 | + data->cfg = device_get_match_data(&spi->dev); |
|---|
| 256 | + if (!data->cfg) { |
|---|
| 257 | + devid = spi_get_device_id(spi)->driver_data; |
|---|
| 258 | + data->cfg = &mcp4131_cfg[devid]; |
|---|
| 259 | + } |
|---|
| 258 | 260 | |
|---|
| 259 | 261 | mutex_init(&data->lock); |
|---|
| 260 | 262 | |
|---|
| 261 | | - indio_dev->dev.parent = dev; |
|---|
| 262 | 263 | indio_dev->info = &mcp4131_info; |
|---|
| 263 | 264 | indio_dev->channels = mcp4131_channels; |
|---|
| 264 | 265 | indio_dev->num_channels = data->cfg->wipers; |
|---|
| .. | .. |
|---|
| 273 | 274 | return 0; |
|---|
| 274 | 275 | } |
|---|
| 275 | 276 | |
|---|
| 276 | | -#if defined(CONFIG_OF) |
|---|
| 277 | 277 | static const struct of_device_id mcp4131_dt_ids[] = { |
|---|
| 278 | 278 | { .compatible = "microchip,mcp4131-502", |
|---|
| 279 | 279 | .data = &mcp4131_cfg[MCP413x_502] }, |
|---|
| .. | .. |
|---|
| 406 | 406 | {} |
|---|
| 407 | 407 | }; |
|---|
| 408 | 408 | MODULE_DEVICE_TABLE(of, mcp4131_dt_ids); |
|---|
| 409 | | -#endif /* CONFIG_OF */ |
|---|
| 410 | 409 | |
|---|
| 411 | 410 | static const struct spi_device_id mcp4131_id[] = { |
|---|
| 412 | 411 | { "mcp4131-502", MCP413x_502 }, |
|---|
| .. | .. |
|---|
| 480 | 479 | static struct spi_driver mcp4131_driver = { |
|---|
| 481 | 480 | .driver = { |
|---|
| 482 | 481 | .name = "mcp4131", |
|---|
| 483 | | - .of_match_table = of_match_ptr(mcp4131_dt_ids), |
|---|
| 482 | + .of_match_table = mcp4131_dt_ids, |
|---|
| 484 | 483 | }, |
|---|
| 485 | 484 | .probe = mcp4131_probe, |
|---|
| 486 | 485 | .id_table = mcp4131_id, |
|---|