On Fri, 23 Nov 2018 22:23:12 -0200 Matheus Tavares <matheus.bernardino@xxxxxx> wrote: > Move ad2s90 resolver driver out of staging to the main tree. > > Signed-off-by: Matheus Tavares <matheus.bernardino@xxxxxx> > Signed-off-by: Victor Colombo <victorcolombo@xxxxxxxxx> Hi. One totally trivial comment inline, but if you want to clean that up, do it after we have moved this out of staging (unless respinning for some other reason). However, I would like to let this sit on the mailing list for a little longer to let others comment and perhaps to pick up a review of the DT binding doc (which looks fine to me, but I am forever missing issues in those!) Good work and I'll probably pick this up later in the week. Thanks, Jonathan > --- > Changes in v3: > - none > > Changes in v2: > - Disabled git move detection, to see the whole code, as Jonathan > suggested > > drivers/iio/resolver/Kconfig | 10 ++ > drivers/iio/resolver/Makefile | 1 + > drivers/iio/resolver/ad2s90.c | 131 ++++++++++++++++++++++++++ > drivers/staging/iio/resolver/Kconfig | 10 -- > drivers/staging/iio/resolver/Makefile | 1 - > drivers/staging/iio/resolver/ad2s90.c | 131 -------------------------- > 6 files changed, 142 insertions(+), 142 deletions(-) > create mode 100644 drivers/iio/resolver/ad2s90.c > delete mode 100644 drivers/staging/iio/resolver/ad2s90.c > > diff --git a/drivers/iio/resolver/Kconfig b/drivers/iio/resolver/Kconfig > index 2ced9f22aa70..786801be54f6 100644 > --- a/drivers/iio/resolver/Kconfig > +++ b/drivers/iio/resolver/Kconfig > @@ -3,6 +3,16 @@ > # > menu "Resolver to digital converters" > > +config AD2S90 > + tristate "Analog Devices ad2s90 driver" > + depends on SPI > + help > + Say yes here to build support for Analog Devices spi resolver > + to digital converters, ad2s90, provides direct access via sysfs. > + > + To compile this driver as a module, choose M here: the > + module will be called ad2s90. > + > config AD2S1200 > tristate "Analog Devices ad2s1200/ad2s1205 driver" > depends on SPI > diff --git a/drivers/iio/resolver/Makefile b/drivers/iio/resolver/Makefile > index 4e1dccae07e7..398d82d50028 100644 > --- a/drivers/iio/resolver/Makefile > +++ b/drivers/iio/resolver/Makefile > @@ -2,4 +2,5 @@ > # Makefile for Resolver/Synchro drivers > # > > +obj-$(CONFIG_AD2S90) += ad2s90.o > obj-$(CONFIG_AD2S1200) += ad2s1200.o > diff --git a/drivers/iio/resolver/ad2s90.c b/drivers/iio/resolver/ad2s90.c > new file mode 100644 > index 000000000000..a41f5cb10da5 > --- /dev/null > +++ b/drivers/iio/resolver/ad2s90.c > @@ -0,0 +1,131 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * ad2s90.c simple support for the ADI Resolver to Digital Converters: AD2S90 > + * > + * Copyright (c) 2010-2010 Analog Devices Inc. > + */ > +#include <linux/types.h> > +#include <linux/mutex.h> > +#include <linux/device.h> > +#include <linux/spi/spi.h> > +#include <linux/slab.h> > +#include <linux/sysfs.h> > +#include <linux/module.h> We are into the truely trivial realms now - alphabetical order preferred for includes. > + > +#include <linux/iio/iio.h> > +#include <linux/iio/sysfs.h> > + > +/* > + * Although chip's max frequency is 2Mhz, it needs 600ns between CS and the > + * first falling edge of SCLK, so frequency should be at most 1 / (2 * 6e-7) > + */ > +#define AD2S90_MAX_SPI_FREQ_HZ 830000 > + > +struct ad2s90_state { > + struct mutex lock; /* lock to protect rx buffer */ > + struct spi_device *sdev; > + u8 rx[2] ____cacheline_aligned; > +}; > + > +static int ad2s90_read_raw(struct iio_dev *indio_dev, > + struct iio_chan_spec const *chan, > + int *val, > + int *val2, > + long m) > +{ > + int ret; > + struct ad2s90_state *st = iio_priv(indio_dev); > + > + if (chan->type != IIO_ANGL) > + return -EINVAL; > + > + switch (m) { > + case IIO_CHAN_INFO_SCALE: > + /* 2 * Pi / 2^12 */ > + *val = 6283; /* mV */ > + *val2 = 12; > + return IIO_VAL_FRACTIONAL_LOG2; > + case IIO_CHAN_INFO_RAW: > + mutex_lock(&st->lock); > + ret = spi_read(st->sdev, st->rx, 2); > + if (ret < 0) { > + mutex_unlock(&st->lock); > + return ret; > + } > + *val = (((u16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); > + > + mutex_unlock(&st->lock); > + > + return IIO_VAL_INT; > + default: > + break; > + } > + > + return -EINVAL; > +} > + > +static const struct iio_info ad2s90_info = { > + .read_raw = ad2s90_read_raw, > +}; > + > +static const struct iio_chan_spec ad2s90_chan = { > + .type = IIO_ANGL, > + .indexed = 1, > + .channel = 0, > + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), > +}; > + > +static int ad2s90_probe(struct spi_device *spi) > +{ > + struct iio_dev *indio_dev; > + struct ad2s90_state *st; > + > + if (spi->max_speed_hz > AD2S90_MAX_SPI_FREQ_HZ) { > + dev_err(&spi->dev, "SPI CLK, %d Hz exceeds %d Hz\n", > + spi->max_speed_hz, AD2S90_MAX_SPI_FREQ_HZ); > + return -EINVAL; > + } > + > + indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); > + if (!indio_dev) > + return -ENOMEM; > + st = iio_priv(indio_dev); > + spi_set_drvdata(spi, indio_dev); > + > + mutex_init(&st->lock); > + st->sdev = spi; > + indio_dev->dev.parent = &spi->dev; > + indio_dev->info = &ad2s90_info; > + indio_dev->modes = INDIO_DIRECT_MODE; > + indio_dev->channels = &ad2s90_chan; > + indio_dev->num_channels = 1; > + indio_dev->name = spi_get_device_id(spi)->name; > + > + return devm_iio_device_register(indio_dev->dev.parent, indio_dev); > +} > + > +static const struct of_device_id ad2s90_of_match[] = { > + { .compatible = "adi,ad2s90", }, > + {} > +}; > +MODULE_DEVICE_TABLE(of, ad2s90_of_match); > + > +static const struct spi_device_id ad2s90_id[] = { > + { "ad2s90" }, > + {} > +}; > +MODULE_DEVICE_TABLE(spi, ad2s90_id); > + > +static struct spi_driver ad2s90_driver = { > + .driver = { > + .name = "ad2s90", > + .of_match_table = ad2s90_of_match, > + }, > + .probe = ad2s90_probe, > + .id_table = ad2s90_id, > +}; > +module_spi_driver(ad2s90_driver); > + > +MODULE_AUTHOR("Graff Yang <graff.yang@xxxxxxxxx>"); > +MODULE_DESCRIPTION("Analog Devices AD2S90 Resolver to Digital SPI driver"); > +MODULE_LICENSE("GPL v2"); ...