Re: [PATCH v4 4/5] IIO : ADC: tiadc: Add support of TI's ADC driver
On 09/26/2012 06:20 AM, Patil, Rachna wrote: > This patch adds support for TI's ADC driver. > This is a multifunctional device. > Analog input lines are provided on which > voltage measurements can be carried out. > You can have upto 8 input lines. > > Signed-off-by: Patil, Rachna Acked-by: Jonathan Cameron Note I cannot build test and it won't apply to staging-next without some merge fixes. I wonder if this driver is a case for a small tree that gets pulled into input/iio/mfd in the next cycle. It's a fiddly merge at best right now as there have been changes that effect it in all 3 subsystems earlier in this cycle (iio ones may just be fuzz, I haven't gotten to a state to check it hasn't hit anything else!) > --- > Changes in v2: > Addressed review comments from Matthias Kaehlcke > > Changes in v3: > Addressed review comments from Jonathan Cameron. > Added comments, new line appropriately. > > Changes in v4: > Removed extra comments and variables. > rename idev to indio_dev throughout the driver. > Renamed structs for better readability. > > drivers/iio/adc/Kconfig |7 + > drivers/iio/adc/Makefile|1 + > drivers/iio/adc/ti_am335x_adc.c | 216 > +++ > drivers/mfd/ti_am335x_tscadc.c | 18 ++- > include/linux/mfd/ti_am335x_tscadc.h|9 +- > include/linux/platform_data/ti_am335x_adc.h | 14 ++ > 6 files changed, 263 insertions(+), 2 deletions(-) > create mode 100644 drivers/iio/adc/ti_am335x_adc.c > create mode 100644 include/linux/platform_data/ti_am335x_adc.h > > diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig > index 8a78b4f..59db45f 100644 > --- a/drivers/iio/adc/Kconfig > +++ b/drivers/iio/adc/Kconfig > @@ -22,4 +22,11 @@ config AT91_ADC > help > Say yes here to build support for Atmel AT91 ADC. > > +config TI_AM335X_ADC > + tristate "TI's ADC driver" > + depends on ARCH_OMAP2PLUS > + help > + Say yes here to build support for Texas Instruments ADC > + driver which is also a MFD client. > + > endmenu > diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile > index 52eec25..e716588 100644 > --- a/drivers/iio/adc/Makefile > +++ b/drivers/iio/adc/Makefile > @@ -4,3 +4,4 @@ > > obj-$(CONFIG_AD7266) += ad7266.o > obj-$(CONFIG_AT91_ADC) += at91_adc.o > +obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o > diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c > new file mode 100644 > index 000..9e1b3ac > --- /dev/null > +++ b/drivers/iio/adc/ti_am335x_adc.c > @@ -0,0 +1,216 @@ > +/* > + * TI ADC MFD driver > + * > + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation version 2. > + * > + * This program is distributed "as is" WITHOUT ANY WARRANTY of any > + * kind, whether express or implied; without even the implied warranty > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +struct tiadc_device { > + struct ti_tscadc_dev *mfd_tscadc; > + int channels; > +}; > + > +static unsigned int adc_readl(struct tiadc_device *adc, unsigned int reg) > +{ > + return readl(adc->mfd_tscadc->tscadc_base + reg); > +} > + > +static void adc_writel(struct tiadc_device *adc, unsigned int reg, > + unsigned int val) > +{ > + writel(val, adc->mfd_tscadc->tscadc_base + reg); > +} > + > +static void adc_step_config(struct tiadc_device *adc_dev) > +{ > + unsigned int stepconfig; > + int i, channels = 0, steps; > + > + /* > + * There are 16 configurable steps and 8 analog input > + * lines available which are shared between Touchscreen and ADC. > + * > + * Steps backwards i.e. from 16 towards 0 are used by ADC > + * depending on number of input lines needed. > + * Channel would represent which analog input > + * needs to be given to ADC to digitalize data. > + */ > + > + steps = TOTAL_STEPS - adc_dev->channels; > + channels = TOTAL_CHANNELS - adc_dev->channels; > + > + stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1; > + > + for (i = (steps + 1); i <= TOTAL_STEPS; i++) { > + adc_writel(adc_dev, REG_STEPCONFIG(i), > + stepconfig | STEPCONFIG_INP(channels)); > + adc_writel(adc_dev, REG_STEPDELAY(i), > + STEPCONFIG_OPENDLY); > + channels++; > + } > + adc_writel(adc_dev, REG_SE, STPENB_STEPENB); > +} > + > +static int
Re: [PATCH v4 4/5] IIO : ADC: tiadc: Add support of TI's ADC driver
On 09/26/2012 06:20 AM, Patil, Rachna wrote: This patch adds support for TI's ADC driver. This is a multifunctional device. Analog input lines are provided on which voltage measurements can be carried out. You can have upto 8 input lines. Signed-off-by: Patil, Rachna rac...@ti.com Acked-by: Jonathan Cameron ji...@kernel.org Note I cannot build test and it won't apply to staging-next without some merge fixes. I wonder if this driver is a case for a small tree that gets pulled into input/iio/mfd in the next cycle. It's a fiddly merge at best right now as there have been changes that effect it in all 3 subsystems earlier in this cycle (iio ones may just be fuzz, I haven't gotten to a state to check it hasn't hit anything else!) --- Changes in v2: Addressed review comments from Matthias Kaehlcke Changes in v3: Addressed review comments from Jonathan Cameron. Added comments, new line appropriately. Changes in v4: Removed extra comments and variables. rename idev to indio_dev throughout the driver. Renamed structs for better readability. drivers/iio/adc/Kconfig |7 + drivers/iio/adc/Makefile|1 + drivers/iio/adc/ti_am335x_adc.c | 216 +++ drivers/mfd/ti_am335x_tscadc.c | 18 ++- include/linux/mfd/ti_am335x_tscadc.h|9 +- include/linux/platform_data/ti_am335x_adc.h | 14 ++ 6 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 drivers/iio/adc/ti_am335x_adc.c create mode 100644 include/linux/platform_data/ti_am335x_adc.h diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 8a78b4f..59db45f 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -22,4 +22,11 @@ config AT91_ADC help Say yes here to build support for Atmel AT91 ADC. +config TI_AM335X_ADC + tristate TI's ADC driver + depends on ARCH_OMAP2PLUS + help + Say yes here to build support for Texas Instruments ADC + driver which is also a MFD client. + endmenu diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index 52eec25..e716588 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile @@ -4,3 +4,4 @@ obj-$(CONFIG_AD7266) += ad7266.o obj-$(CONFIG_AT91_ADC) += at91_adc.o +obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c new file mode 100644 index 000..9e1b3ac --- /dev/null +++ b/drivers/iio/adc/ti_am335x_adc.c @@ -0,0 +1,216 @@ +/* + * TI ADC MFD driver + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed as is WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include linux/init.h +#include linux/kernel.h +#include linux/err.h +#include linux/module.h +#include linux/slab.h +#include linux/interrupt.h +#include linux/platform_device.h +#include linux/io.h +#include linux/iio/iio.h + +#include linux/mfd/ti_am335x_tscadc.h +#include linux/platform_data/ti_am335x_adc.h + +struct tiadc_device { + struct ti_tscadc_dev *mfd_tscadc; + int channels; +}; + +static unsigned int adc_readl(struct tiadc_device *adc, unsigned int reg) +{ + return readl(adc-mfd_tscadc-tscadc_base + reg); +} + +static void adc_writel(struct tiadc_device *adc, unsigned int reg, + unsigned int val) +{ + writel(val, adc-mfd_tscadc-tscadc_base + reg); +} + +static void adc_step_config(struct tiadc_device *adc_dev) +{ + unsigned int stepconfig; + int i, channels = 0, steps; + + /* + * There are 16 configurable steps and 8 analog input + * lines available which are shared between Touchscreen and ADC. + * + * Steps backwards i.e. from 16 towards 0 are used by ADC + * depending on number of input lines needed. + * Channel would represent which analog input + * needs to be given to ADC to digitalize data. + */ + + steps = TOTAL_STEPS - adc_dev-channels; + channels = TOTAL_CHANNELS - adc_dev-channels; + + stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1; + + for (i = (steps + 1); i = TOTAL_STEPS; i++) { + adc_writel(adc_dev, REG_STEPCONFIG(i), + stepconfig | STEPCONFIG_INP(channels)); + adc_writel(adc_dev, REG_STEPDELAY(i), + STEPCONFIG_OPENDLY); + channels++; + } +
[PATCH v4 4/5] IIO : ADC: tiadc: Add support of TI's ADC driver
This patch adds support for TI's ADC driver. This is a multifunctional device. Analog input lines are provided on which voltage measurements can be carried out. You can have upto 8 input lines. Signed-off-by: Patil, Rachna --- Changes in v2: Addressed review comments from Matthias Kaehlcke Changes in v3: Addressed review comments from Jonathan Cameron. Added comments, new line appropriately. Changes in v4: Removed extra comments and variables. rename idev to indio_dev throughout the driver. Renamed structs for better readability. drivers/iio/adc/Kconfig |7 + drivers/iio/adc/Makefile|1 + drivers/iio/adc/ti_am335x_adc.c | 216 +++ drivers/mfd/ti_am335x_tscadc.c | 18 ++- include/linux/mfd/ti_am335x_tscadc.h|9 +- include/linux/platform_data/ti_am335x_adc.h | 14 ++ 6 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 drivers/iio/adc/ti_am335x_adc.c create mode 100644 include/linux/platform_data/ti_am335x_adc.h diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 8a78b4f..59db45f 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -22,4 +22,11 @@ config AT91_ADC help Say yes here to build support for Atmel AT91 ADC. +config TI_AM335X_ADC + tristate "TI's ADC driver" + depends on ARCH_OMAP2PLUS + help + Say yes here to build support for Texas Instruments ADC + driver which is also a MFD client. + endmenu diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index 52eec25..e716588 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile @@ -4,3 +4,4 @@ obj-$(CONFIG_AD7266) += ad7266.o obj-$(CONFIG_AT91_ADC) += at91_adc.o +obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c new file mode 100644 index 000..9e1b3ac --- /dev/null +++ b/drivers/iio/adc/ti_am335x_adc.c @@ -0,0 +1,216 @@ +/* + * TI ADC MFD driver + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +struct tiadc_device { + struct ti_tscadc_dev *mfd_tscadc; + int channels; +}; + +static unsigned int adc_readl(struct tiadc_device *adc, unsigned int reg) +{ + return readl(adc->mfd_tscadc->tscadc_base + reg); +} + +static void adc_writel(struct tiadc_device *adc, unsigned int reg, + unsigned int val) +{ + writel(val, adc->mfd_tscadc->tscadc_base + reg); +} + +static void adc_step_config(struct tiadc_device *adc_dev) +{ + unsigned int stepconfig; + int i, channels = 0, steps; + + /* +* There are 16 configurable steps and 8 analog input +* lines available which are shared between Touchscreen and ADC. +* +* Steps backwards i.e. from 16 towards 0 are used by ADC +* depending on number of input lines needed. +* Channel would represent which analog input +* needs to be given to ADC to digitalize data. +*/ + + steps = TOTAL_STEPS - adc_dev->channels; + channels = TOTAL_CHANNELS - adc_dev->channels; + + stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1; + + for (i = (steps + 1); i <= TOTAL_STEPS; i++) { + adc_writel(adc_dev, REG_STEPCONFIG(i), + stepconfig | STEPCONFIG_INP(channels)); + adc_writel(adc_dev, REG_STEPDELAY(i), + STEPCONFIG_OPENDLY); + channels++; + } + adc_writel(adc_dev, REG_SE, STPENB_STEPENB); +} + +static int tiadc_channel_init(struct iio_dev *indio_dev, int channels) +{ + struct iio_chan_spec *chan_array; + int i; + + indio_dev->num_channels = channels; + chan_array = kcalloc(indio_dev->num_channels, + sizeof(struct iio_chan_spec), GFP_KERNEL); + + if (chan_array == NULL) + return -ENOMEM; + + for (i = 0; i < (indio_dev->num_channels); i++) { + struct iio_chan_spec *chan = chan_array + i; + chan->type = IIO_VOLTAGE; + chan->indexed = 1; + chan->channel = i; + chan->info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT; + } + + indio_dev->channels =
[PATCH v4 4/5] IIO : ADC: tiadc: Add support of TI's ADC driver
This patch adds support for TI's ADC driver. This is a multifunctional device. Analog input lines are provided on which voltage measurements can be carried out. You can have upto 8 input lines. Signed-off-by: Patil, Rachna rac...@ti.com --- Changes in v2: Addressed review comments from Matthias Kaehlcke Changes in v3: Addressed review comments from Jonathan Cameron. Added comments, new line appropriately. Changes in v4: Removed extra comments and variables. rename idev to indio_dev throughout the driver. Renamed structs for better readability. drivers/iio/adc/Kconfig |7 + drivers/iio/adc/Makefile|1 + drivers/iio/adc/ti_am335x_adc.c | 216 +++ drivers/mfd/ti_am335x_tscadc.c | 18 ++- include/linux/mfd/ti_am335x_tscadc.h|9 +- include/linux/platform_data/ti_am335x_adc.h | 14 ++ 6 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 drivers/iio/adc/ti_am335x_adc.c create mode 100644 include/linux/platform_data/ti_am335x_adc.h diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 8a78b4f..59db45f 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -22,4 +22,11 @@ config AT91_ADC help Say yes here to build support for Atmel AT91 ADC. +config TI_AM335X_ADC + tristate TI's ADC driver + depends on ARCH_OMAP2PLUS + help + Say yes here to build support for Texas Instruments ADC + driver which is also a MFD client. + endmenu diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index 52eec25..e716588 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile @@ -4,3 +4,4 @@ obj-$(CONFIG_AD7266) += ad7266.o obj-$(CONFIG_AT91_ADC) += at91_adc.o +obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c new file mode 100644 index 000..9e1b3ac --- /dev/null +++ b/drivers/iio/adc/ti_am335x_adc.c @@ -0,0 +1,216 @@ +/* + * TI ADC MFD driver + * + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed as is WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include linux/init.h +#include linux/kernel.h +#include linux/err.h +#include linux/module.h +#include linux/slab.h +#include linux/interrupt.h +#include linux/platform_device.h +#include linux/io.h +#include linux/iio/iio.h + +#include linux/mfd/ti_am335x_tscadc.h +#include linux/platform_data/ti_am335x_adc.h + +struct tiadc_device { + struct ti_tscadc_dev *mfd_tscadc; + int channels; +}; + +static unsigned int adc_readl(struct tiadc_device *adc, unsigned int reg) +{ + return readl(adc-mfd_tscadc-tscadc_base + reg); +} + +static void adc_writel(struct tiadc_device *adc, unsigned int reg, + unsigned int val) +{ + writel(val, adc-mfd_tscadc-tscadc_base + reg); +} + +static void adc_step_config(struct tiadc_device *adc_dev) +{ + unsigned int stepconfig; + int i, channels = 0, steps; + + /* +* There are 16 configurable steps and 8 analog input +* lines available which are shared between Touchscreen and ADC. +* +* Steps backwards i.e. from 16 towards 0 are used by ADC +* depending on number of input lines needed. +* Channel would represent which analog input +* needs to be given to ADC to digitalize data. +*/ + + steps = TOTAL_STEPS - adc_dev-channels; + channels = TOTAL_CHANNELS - adc_dev-channels; + + stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1; + + for (i = (steps + 1); i = TOTAL_STEPS; i++) { + adc_writel(adc_dev, REG_STEPCONFIG(i), + stepconfig | STEPCONFIG_INP(channels)); + adc_writel(adc_dev, REG_STEPDELAY(i), + STEPCONFIG_OPENDLY); + channels++; + } + adc_writel(adc_dev, REG_SE, STPENB_STEPENB); +} + +static int tiadc_channel_init(struct iio_dev *indio_dev, int channels) +{ + struct iio_chan_spec *chan_array; + int i; + + indio_dev-num_channels = channels; + chan_array = kcalloc(indio_dev-num_channels, + sizeof(struct iio_chan_spec), GFP_KERNEL); + + if (chan_array == NULL) + return -ENOMEM; + + for (i = 0; i (indio_dev-num_channels); i++) { + struct iio_chan_spec *chan = chan_array + i; + chan-type =