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