1c924eee3SKuninori Morimoto // SPDX-License-Identifier: GPL-2.0 2a8e7e88dSJacopo Mondi /* 3a8e7e88dSJacopo Mondi * iio/adc/max11100.c 4a8e7e88dSJacopo Mondi * Maxim max11100 ADC Driver with IIO interface 5a8e7e88dSJacopo Mondi * 6a8e7e88dSJacopo Mondi * Copyright (C) 2016-17 Renesas Electronics Corporation 7a8e7e88dSJacopo Mondi * Copyright (C) 2016-17 Jacopo Mondi 8a8e7e88dSJacopo Mondi */ 9a8e7e88dSJacopo Mondi #include <linux/delay.h> 10a8e7e88dSJacopo Mondi #include <linux/kernel.h> 11*7a3e190fSJonathan Cameron #include <linux/mod_devicetable.h> 12a8e7e88dSJacopo Mondi #include <linux/module.h> 13a8e7e88dSJacopo Mondi #include <linux/regulator/consumer.h> 14a8e7e88dSJacopo Mondi #include <linux/spi/spi.h> 15a8e7e88dSJacopo Mondi 16a8e7e88dSJacopo Mondi #include <linux/iio/iio.h> 17a8e7e88dSJacopo Mondi #include <linux/iio/driver.h> 18a8e7e88dSJacopo Mondi 19a8e7e88dSJacopo Mondi /* 20a8e7e88dSJacopo Mondi * LSB is the ADC single digital step 21a8e7e88dSJacopo Mondi * 1 LSB = (vref_mv / 2 ^ 16) 22a8e7e88dSJacopo Mondi * 23a8e7e88dSJacopo Mondi * LSB is used to calculate analog voltage value 24a8e7e88dSJacopo Mondi * from the number of ADC steps count 25a8e7e88dSJacopo Mondi * 26a8e7e88dSJacopo Mondi * Ain = (count * LSB) 27a8e7e88dSJacopo Mondi */ 28a8e7e88dSJacopo Mondi #define MAX11100_LSB_DIV (1 << 16) 29a8e7e88dSJacopo Mondi 30a8e7e88dSJacopo Mondi struct max11100_state { 31a8e7e88dSJacopo Mondi struct regulator *vref_reg; 32a8e7e88dSJacopo Mondi struct spi_device *spi; 33a8e7e88dSJacopo Mondi 34a8e7e88dSJacopo Mondi /* 35a8e7e88dSJacopo Mondi * DMA (thus cache coherency maintenance) requires the 36a8e7e88dSJacopo Mondi * transfer buffers to live in their own cache lines. 37a8e7e88dSJacopo Mondi */ 38a8e7e88dSJacopo Mondi u8 buffer[3] ____cacheline_aligned; 39a8e7e88dSJacopo Mondi }; 40a8e7e88dSJacopo Mondi 41ce6c3736SRikard Falkeborn static const struct iio_chan_spec max11100_channels[] = { 42a8e7e88dSJacopo Mondi { /* [0] */ 43a8e7e88dSJacopo Mondi .type = IIO_VOLTAGE, 44a8e7e88dSJacopo Mondi .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 45a8e7e88dSJacopo Mondi BIT(IIO_CHAN_INFO_SCALE), 46a8e7e88dSJacopo Mondi }, 47a8e7e88dSJacopo Mondi }; 48a8e7e88dSJacopo Mondi 49a8e7e88dSJacopo Mondi static int max11100_read_single(struct iio_dev *indio_dev, int *val) 50a8e7e88dSJacopo Mondi { 51a8e7e88dSJacopo Mondi int ret; 52a8e7e88dSJacopo Mondi struct max11100_state *state = iio_priv(indio_dev); 53a8e7e88dSJacopo Mondi 54a8e7e88dSJacopo Mondi ret = spi_read(state->spi, state->buffer, sizeof(state->buffer)); 55a8e7e88dSJacopo Mondi if (ret) { 56a8e7e88dSJacopo Mondi dev_err(&indio_dev->dev, "SPI transfer failed\n"); 57a8e7e88dSJacopo Mondi return ret; 58a8e7e88dSJacopo Mondi } 59a8e7e88dSJacopo Mondi 60a8e7e88dSJacopo Mondi /* the first 8 bits sent out from ADC must be 0s */ 61a8e7e88dSJacopo Mondi if (state->buffer[0]) { 62a8e7e88dSJacopo Mondi dev_err(&indio_dev->dev, "Invalid value: buffer[0] != 0\n"); 63a8e7e88dSJacopo Mondi return -EINVAL; 64a8e7e88dSJacopo Mondi } 65a8e7e88dSJacopo Mondi 66a8e7e88dSJacopo Mondi *val = (state->buffer[1] << 8) | state->buffer[2]; 67a8e7e88dSJacopo Mondi 68a8e7e88dSJacopo Mondi return 0; 69a8e7e88dSJacopo Mondi } 70a8e7e88dSJacopo Mondi 71a8e7e88dSJacopo Mondi static int max11100_read_raw(struct iio_dev *indio_dev, 72a8e7e88dSJacopo Mondi struct iio_chan_spec const *chan, 73a8e7e88dSJacopo Mondi int *val, int *val2, long info) 74a8e7e88dSJacopo Mondi { 75a8e7e88dSJacopo Mondi int ret, vref_uv; 76a8e7e88dSJacopo Mondi struct max11100_state *state = iio_priv(indio_dev); 77a8e7e88dSJacopo Mondi 78a8e7e88dSJacopo Mondi switch (info) { 79a8e7e88dSJacopo Mondi case IIO_CHAN_INFO_RAW: 80a8e7e88dSJacopo Mondi ret = max11100_read_single(indio_dev, val); 81a8e7e88dSJacopo Mondi if (ret) 82a8e7e88dSJacopo Mondi return ret; 83a8e7e88dSJacopo Mondi 84a8e7e88dSJacopo Mondi return IIO_VAL_INT; 85a8e7e88dSJacopo Mondi 86a8e7e88dSJacopo Mondi case IIO_CHAN_INFO_SCALE: 87a8e7e88dSJacopo Mondi vref_uv = regulator_get_voltage(state->vref_reg); 88a8e7e88dSJacopo Mondi if (vref_uv < 0) 89a8e7e88dSJacopo Mondi /* dummy regulator "get_voltage" returns -EINVAL */ 90a8e7e88dSJacopo Mondi return -EINVAL; 91a8e7e88dSJacopo Mondi 92a8e7e88dSJacopo Mondi *val = vref_uv / 1000; 93a8e7e88dSJacopo Mondi *val2 = MAX11100_LSB_DIV; 94a8e7e88dSJacopo Mondi return IIO_VAL_FRACTIONAL; 95a8e7e88dSJacopo Mondi } 96a8e7e88dSJacopo Mondi 97a8e7e88dSJacopo Mondi return -EINVAL; 98a8e7e88dSJacopo Mondi } 99a8e7e88dSJacopo Mondi 100a8e7e88dSJacopo Mondi static const struct iio_info max11100_info = { 101a8e7e88dSJacopo Mondi .read_raw = max11100_read_raw, 102a8e7e88dSJacopo Mondi }; 103a8e7e88dSJacopo Mondi 104a8e7e88dSJacopo Mondi static int max11100_probe(struct spi_device *spi) 105a8e7e88dSJacopo Mondi { 106a8e7e88dSJacopo Mondi int ret; 107a8e7e88dSJacopo Mondi struct iio_dev *indio_dev; 108a8e7e88dSJacopo Mondi struct max11100_state *state; 109a8e7e88dSJacopo Mondi 110a8e7e88dSJacopo Mondi indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*state)); 111a8e7e88dSJacopo Mondi if (!indio_dev) 112a8e7e88dSJacopo Mondi return -ENOMEM; 113a8e7e88dSJacopo Mondi 114a8e7e88dSJacopo Mondi spi_set_drvdata(spi, indio_dev); 115a8e7e88dSJacopo Mondi 116a8e7e88dSJacopo Mondi state = iio_priv(indio_dev); 117a8e7e88dSJacopo Mondi state->spi = spi; 118a8e7e88dSJacopo Mondi 119a8e7e88dSJacopo Mondi indio_dev->name = "max11100"; 120a8e7e88dSJacopo Mondi indio_dev->info = &max11100_info; 121a8e7e88dSJacopo Mondi indio_dev->modes = INDIO_DIRECT_MODE; 122bb4787f5SArushi Singhal indio_dev->channels = max11100_channels; 123bb4787f5SArushi Singhal indio_dev->num_channels = ARRAY_SIZE(max11100_channels); 124a8e7e88dSJacopo Mondi 125a8e7e88dSJacopo Mondi state->vref_reg = devm_regulator_get(&spi->dev, "vref"); 126a8e7e88dSJacopo Mondi if (IS_ERR(state->vref_reg)) 127a8e7e88dSJacopo Mondi return PTR_ERR(state->vref_reg); 128a8e7e88dSJacopo Mondi 129a8e7e88dSJacopo Mondi ret = regulator_enable(state->vref_reg); 130a8e7e88dSJacopo Mondi if (ret) 131a8e7e88dSJacopo Mondi return ret; 132a8e7e88dSJacopo Mondi 133a8e7e88dSJacopo Mondi ret = iio_device_register(indio_dev); 134a8e7e88dSJacopo Mondi if (ret) 135a8e7e88dSJacopo Mondi goto disable_regulator; 136a8e7e88dSJacopo Mondi 137a8e7e88dSJacopo Mondi return 0; 138a8e7e88dSJacopo Mondi 139a8e7e88dSJacopo Mondi disable_regulator: 140a8e7e88dSJacopo Mondi regulator_disable(state->vref_reg); 141a8e7e88dSJacopo Mondi 142a8e7e88dSJacopo Mondi return ret; 143a8e7e88dSJacopo Mondi } 144a8e7e88dSJacopo Mondi 145a8e7e88dSJacopo Mondi static int max11100_remove(struct spi_device *spi) 146a8e7e88dSJacopo Mondi { 147a8e7e88dSJacopo Mondi struct iio_dev *indio_dev = spi_get_drvdata(spi); 148a8e7e88dSJacopo Mondi struct max11100_state *state = iio_priv(indio_dev); 149a8e7e88dSJacopo Mondi 150a8e7e88dSJacopo Mondi iio_device_unregister(indio_dev); 151ac2bec9dSPhil Reid regulator_disable(state->vref_reg); 152a8e7e88dSJacopo Mondi 153a8e7e88dSJacopo Mondi return 0; 154a8e7e88dSJacopo Mondi } 155a8e7e88dSJacopo Mondi 156a8e7e88dSJacopo Mondi static const struct of_device_id max11100_ids[] = { 157a8e7e88dSJacopo Mondi {.compatible = "maxim,max11100"}, 158a8e7e88dSJacopo Mondi { }, 159a8e7e88dSJacopo Mondi }; 160a8e7e88dSJacopo Mondi MODULE_DEVICE_TABLE(of, max11100_ids); 161a8e7e88dSJacopo Mondi 162a8e7e88dSJacopo Mondi static struct spi_driver max11100_driver = { 163a8e7e88dSJacopo Mondi .driver = { 164a8e7e88dSJacopo Mondi .name = "max11100", 165*7a3e190fSJonathan Cameron .of_match_table = max11100_ids, 166a8e7e88dSJacopo Mondi }, 167a8e7e88dSJacopo Mondi .probe = max11100_probe, 168a8e7e88dSJacopo Mondi .remove = max11100_remove, 169a8e7e88dSJacopo Mondi }; 170a8e7e88dSJacopo Mondi 171a8e7e88dSJacopo Mondi module_spi_driver(max11100_driver); 172a8e7e88dSJacopo Mondi 173a8e7e88dSJacopo Mondi MODULE_AUTHOR("Jacopo Mondi <jacopo@jmondi.org>"); 174a8e7e88dSJacopo Mondi MODULE_DESCRIPTION("Maxim max11100 ADC Driver"); 175a8e7e88dSJacopo Mondi MODULE_LICENSE("GPL v2"); 176