^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * AD5672R, AD5674R, AD5676, AD5676R, AD5679R,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * AD5681R, AD5682R, AD5683, AD5683R, AD5684,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * AD5684R, AD5685R, AD5686, AD5686R
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Digital to analog converters driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright 2018 Analog Devices Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "ad5686.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/spi/spi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static int ad5686_spi_write(struct ad5686_state *st,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) u8 cmd, u8 addr, u16 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct spi_device *spi = to_spi_device(st->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) u8 tx_len, *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) switch (st->chip_info->regmap_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) case AD5310_REGMAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) st->data[0].d16 = cpu_to_be16(AD5310_CMD(cmd) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) buf = &st->data[0].d8[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) tx_len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) case AD5683_REGMAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) st->data[0].d32 = cpu_to_be32(AD5686_CMD(cmd) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) AD5683_DATA(val));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) buf = &st->data[0].d8[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) tx_len = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) case AD5686_REGMAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) st->data[0].d32 = cpu_to_be32(AD5686_CMD(cmd) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) AD5686_ADDR(addr) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) buf = &st->data[0].d8[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) tx_len = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) return spi_write(spi, buf, tx_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static int ad5686_spi_read(struct ad5686_state *st, u8 addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct spi_transfer t[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .tx_buf = &st->data[0].d8[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .len = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .cs_change = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .tx_buf = &st->data[1].d8[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .rx_buf = &st->data[2].d8[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .len = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct spi_device *spi = to_spi_device(st->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) u8 cmd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) switch (st->chip_info->regmap_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) case AD5310_REGMAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) return -ENOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) case AD5683_REGMAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) cmd = AD5686_CMD_READBACK_ENABLE_V2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) case AD5686_REGMAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) cmd = AD5686_CMD_READBACK_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) st->data[0].d32 = cpu_to_be32(AD5686_CMD(cmd) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) AD5686_ADDR(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) st->data[1].d32 = cpu_to_be32(AD5686_CMD(AD5686_CMD_NOOP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ret = spi_sync_transfer(spi, t, ARRAY_SIZE(t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) return be32_to_cpu(st->data[2].d32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static int ad5686_spi_probe(struct spi_device *spi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) const struct spi_device_id *id = spi_get_device_id(spi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) return ad5686_probe(&spi->dev, id->driver_data, id->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) ad5686_spi_write, ad5686_spi_read);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static int ad5686_spi_remove(struct spi_device *spi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) return ad5686_remove(&spi->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) static const struct spi_device_id ad5686_spi_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) {"ad5310r", ID_AD5310R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) {"ad5672r", ID_AD5672R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {"ad5674r", ID_AD5674R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {"ad5676", ID_AD5676},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) {"ad5676r", ID_AD5676R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {"ad5679r", ID_AD5679R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {"ad5681r", ID_AD5681R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) {"ad5682r", ID_AD5682R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {"ad5683", ID_AD5683},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {"ad5683r", ID_AD5683R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) {"ad5684", ID_AD5684},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {"ad5684r", ID_AD5684R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) {"ad5685", ID_AD5685R}, /* Does not exist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) {"ad5685r", ID_AD5685R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {"ad5686", ID_AD5686},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) {"ad5686r", ID_AD5686R},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) MODULE_DEVICE_TABLE(spi, ad5686_spi_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static struct spi_driver ad5686_spi_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .name = "ad5686",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) .probe = ad5686_spi_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .remove = ad5686_spi_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .id_table = ad5686_spi_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) module_spi_driver(ad5686_spi_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) MODULE_DESCRIPTION("Analog Devices AD5686 and similar multi-channel DACs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) MODULE_LICENSE("GPL v2");