blob: b7faef69a58f2f96009d5d857460cc06a225066b [file] [log] [blame]
Stefan Popaca5b4632018-12-17 14:23:36 +02001// SPDX-License-Identifier: GPL-2.0
Michael Hennerichb9618c02011-02-22 21:46:18 +01002/*
3 * AD7606 SPI ADC driver
4 *
5 * Copyright 2011 Analog Devices Inc.
Michael Hennerichb9618c02011-02-22 21:46:18 +01006 */
7
8#include <linux/module.h>
9#include <linux/spi/spi.h>
10#include <linux/types.h>
11#include <linux/err.h>
Michael Henneriche61181d2011-05-18 14:42:01 +010012
Jonathan Cameron06458e22012-04-25 15:54:58 +010013#include <linux/iio/iio.h>
Michael Hennerichb9618c02011-02-22 21:46:18 +010014#include "ad7606.h"
15
16#define MAX_SPI_FREQ_HZ 23500000 /* VDRIVE above 4.75 V */
17
18static int ad7606_spi_read_block(struct device *dev,
19 int count, void *buf)
20{
21 struct spi_device *spi = to_spi_device(dev);
22 int i, ret;
Arnd Bergmann7e9825552016-05-30 15:50:24 +020023 unsigned short *data = buf;
Ksenija Stanojevic87787e52016-03-23 12:06:34 +010024 __be16 *bdata = buf;
Michael Hennerichb9618c02011-02-22 21:46:18 +010025
Tapasweni Pathak31f8f062014-10-30 17:02:25 +053026 ret = spi_read(spi, buf, count * 2);
Michael Hennerichb9618c02011-02-22 21:46:18 +010027 if (ret < 0) {
28 dev_err(&spi->dev, "SPI read error\n");
29 return ret;
30 }
31
32 for (i = 0; i < count; i++)
Ksenija Stanojevic87787e52016-03-23 12:06:34 +010033 data[i] = be16_to_cpu(bdata[i]);
Michael Hennerichb9618c02011-02-22 21:46:18 +010034
35 return 0;
36}
37
38static const struct ad7606_bus_ops ad7606_spi_bops = {
Stefan Popa54160ae2018-12-17 14:23:38 +020039 .read_block = ad7606_spi_read_block,
Michael Hennerichb9618c02011-02-22 21:46:18 +010040};
41
Bill Pemberton4ae1c612012-11-19 13:21:57 -050042static int ad7606_spi_probe(struct spi_device *spi)
Michael Hennerichb9618c02011-02-22 21:46:18 +010043{
Lars-Peter Clausen063a51c2016-10-19 19:06:57 +020044 const struct spi_device_id *id = spi_get_device_id(spi);
Michael Hennerichb9618c02011-02-22 21:46:18 +010045
Lars-Peter Clausen71faca72016-10-19 19:07:04 +020046 return ad7606_probe(&spi->dev, spi->irq, NULL,
47 id->name, id->driver_data,
48 &ad7606_spi_bops);
Michael Hennerichb9618c02011-02-22 21:46:18 +010049}
50
Stefan Popa54160ae2018-12-17 14:23:38 +020051static const struct spi_device_id ad7606_id_table[] = {
52 { "ad7605-4", ID_AD7605_4 },
53 { "ad7606-4", ID_AD7606_4 },
54 { "ad7606-6", ID_AD7606_6 },
55 { "ad7606-8", ID_AD7606_8 },
Beniamin Bia7989b4b2019-04-02 16:18:40 +030056 { "ad7616", ID_AD7616 },
Michael Hennerichb9618c02011-02-22 21:46:18 +010057 {}
58};
Stefan Popa54160ae2018-12-17 14:23:38 +020059MODULE_DEVICE_TABLE(spi, ad7606_id_table);
Michael Hennerichb9618c02011-02-22 21:46:18 +010060
Stefan Popa43f9b202018-12-13 14:46:20 +020061static const struct of_device_id ad7606_of_match[] = {
62 { .compatible = "adi,ad7605-4" },
63 { .compatible = "adi,ad7606-4" },
64 { .compatible = "adi,ad7606-6" },
65 { .compatible = "adi,ad7606-8" },
Beniamin Bia7989b4b2019-04-02 16:18:40 +030066 { .compatible = "adi,ad7616" },
Stefan Popa43f9b202018-12-13 14:46:20 +020067 { },
68};
69MODULE_DEVICE_TABLE(of, ad7606_of_match);
70
Michael Hennerichb9618c02011-02-22 21:46:18 +010071static struct spi_driver ad7606_driver = {
72 .driver = {
73 .name = "ad7606",
Stefan Popa43f9b202018-12-13 14:46:20 +020074 .of_match_table = ad7606_of_match,
Lars-Peter Clausen2c3a5232016-02-08 11:13:29 +010075 .pm = AD7606_PM_OPS,
Michael Hennerichb9618c02011-02-22 21:46:18 +010076 },
77 .probe = ad7606_spi_probe,
Stefan Popa54160ae2018-12-17 14:23:38 +020078 .id_table = ad7606_id_table,
Michael Hennerichb9618c02011-02-22 21:46:18 +010079};
Lars-Peter Clausenae6ae6f2011-11-16 10:13:39 +010080module_spi_driver(ad7606_driver);
Michael Hennerichb9618c02011-02-22 21:46:18 +010081
Michael Hennerich9920ed22018-08-14 13:23:17 +020082MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
Michael Hennerichb9618c02011-02-22 21:46:18 +010083MODULE_DESCRIPTION("Analog Devices AD7606 ADC");
84MODULE_LICENSE("GPL v2");