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