Re: [PATCH v4 4/5] IIO : ADC: tiadc: Add support of TI's ADC driver

2012-09-29 Thread Jonathan Cameron
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

2012-09-29 Thread Jonathan Cameron
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

2012-09-25 Thread Patil, Rachna
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

2012-09-25 Thread Patil, Rachna
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 =