Inter-revision diff: patch 4

Comparing v5 (message) to v3 (message)

--- v5
+++ v3
@@ -5,7 +5,6 @@
 You can have upto 8 input lines.
 
 Signed-off-by: Patil, Rachna <rachna@ti.com>
-Acked-by: Jonathan Cameron <jic23@kernel.org>
 ---
 Changes in v2:
 	Addressed review comments from Matthias Kaehlcke
@@ -14,55 +13,47 @@
 	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.
-
-Changes in v5:
-	No changes
-
-drivers/iio/adc/Kconfig                     |    7 +
- drivers/iio/adc/Makefile                    |    1 +
- drivers/iio/adc/ti_am335x_adc.c             |  260 +++++++++++++++++++++++++++
- 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, 307 insertions(+), 2 deletions(-)
- create mode 100644 drivers/iio/adc/ti_am335x_adc.c
- create mode 100644 include/linux/platform_data/ti_am335x_adc.h
+ drivers/iio/adc/Kconfig              |    7 +
+ drivers/iio/adc/Makefile             |    1 +
+ drivers/iio/adc/ti_adc.c             |  223 ++++++++++++++++++++++++++++++++++
+ drivers/mfd/ti_tscadc.c              |   18 +++-
+ include/linux/mfd/ti_tscadc.h        |    9 ++-
+ include/linux/platform_data/ti_adc.h |   14 ++
+ 6 files changed, 270 insertions(+), 2 deletions(-)
+ create mode 100644 drivers/iio/adc/ti_adc.c
+ create mode 100644 include/linux/platform_data/ti_adc.h
 
 diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
-index 8a78b4f..1372f7e 100644
+index 8a78b4f..ad32df8 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
++config TI_ADC
 +	tristate "TI's ADC driver"
-+	depends on MFD_TI_AM335X_TSCADC
++	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
+index 52eec25..a930cee 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
++obj-$(CONFIG_TI_ADC) += ti_adc.o
+diff --git a/drivers/iio/adc/ti_adc.c b/drivers/iio/adc/ti_adc.c
 new file mode 100644
-index 0000000..02a43c8
+index 0000000..56f8af2
 --- /dev/null
-+++ b/drivers/iio/adc/ti_am335x_adc.c
-@@ -0,0 +1,260 @@
++++ b/drivers/iio/adc/ti_adc.c
+@@ -0,0 +1,223 @@
 +/*
 + * TI ADC MFD driver
 + *
@@ -88,28 +79,29 @@
 +#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 {
++#include <linux/mfd/ti_tscadc.h>
++#include <linux/platform_data/ti_adc.h>
++
++struct adc_device {
 +	struct ti_tscadc_dev *mfd_tscadc;
++	struct iio_dev *idev;
 +	int channels;
 +};
 +
-+static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
++static unsigned int adc_readl(struct adc_device *adc, unsigned int reg)
 +{
 +	return readl(adc->mfd_tscadc->tscadc_base + reg);
 +}
 +
-+static void tiadc_writel(struct tiadc_device *adc, unsigned int reg,
++static void adc_writel(struct adc_device *adc, unsigned int reg,
 +					unsigned int val)
 +{
 +	writel(val, adc->mfd_tscadc->tscadc_base + reg);
 +}
 +
-+static void tiadc_step_config(struct tiadc_device *adc_dev)
-+{
-+	unsigned int stepconfig;
++static void adc_step_config(struct adc_device *adc_dev)
++{
++	unsigned int    stepconfig;
 +	int i, channels = 0, steps;
 +
 +	/*
@@ -128,28 +120,28 @@
 +	stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
 +
 +	for (i = (steps + 1); i <= TOTAL_STEPS; i++) {
-+		tiadc_writel(adc_dev, REG_STEPCONFIG(i),
++		adc_writel(adc_dev, REG_STEPCONFIG(i),
 +				stepconfig | STEPCONFIG_INP(channels));
-+		tiadc_writel(adc_dev, REG_STEPDELAY(i),
++		adc_writel(adc_dev, REG_STEPDELAY(i),
 +				STEPCONFIG_OPENDLY);
 +		channels++;
 +	}
-+	tiadc_writel(adc_dev, REG_SE, STPENB_STEPENB);
-+}
-+
-+static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
++	adc_writel(adc_dev, REG_SE, STPENB_STEPENB);
++}
++
++static int tiadc_channel_init(struct iio_dev *idev, 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);
++	idev->num_channels = channels;
++	chan_array = kcalloc(idev->num_channels, sizeof(struct iio_chan_spec),
++					GFP_KERNEL);
 +
 +	if (chan_array == NULL)
 +		return -ENOMEM;
 +
-+	for (i = 0; i < (indio_dev->num_channels); i++) {
++	for (i = 0; i < (idev->num_channels); i++) {
 +		struct iio_chan_spec *chan = chan_array + i;
 +		chan->type = IIO_VOLTAGE;
 +		chan->indexed = 1;
@@ -157,21 +149,21 @@
 +		chan->info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT;
 +	}
 +
-+	indio_dev->channels = chan_array;
-+
-+	return indio_dev->num_channels;
-+}
-+
-+static void tiadc_channels_remove(struct iio_dev *indio_dev)
-+{
-+	kfree(indio_dev->channels);
-+}
-+
-+static int tiadc_read_raw(struct iio_dev *indio_dev,
++	idev->channels = chan_array;
++
++	return idev->num_channels;
++}
++
++static void tiadc_channels_remove(struct iio_dev *idev)
++{
++	kfree(idev->channels);
++}
++
++static int tiadc_read_raw(struct iio_dev *idev,
 +		struct iio_chan_spec const *chan,
 +		int *val, int *val2, long mask)
 +{
-+	struct tiadc_device *adc_dev = iio_priv(indio_dev);
++	struct adc_device *adc_dev = iio_priv(idev);
 +	int i;
 +	unsigned int fifo1count, readx1;
 +
@@ -186,13 +178,13 @@
 +	 * Hence we need to flush out this data.
 +	 */
 +
-+	fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
++	fifo1count = adc_readl(adc_dev, REG_FIFO1CNT);
 +	for (i = 0; i < fifo1count; i++) {
-+		readx1 = tiadc_readl(adc_dev, REG_FIFO1);
++		readx1 = adc_readl(adc_dev, REG_FIFO1);
 +		if (i == chan->channel)
 +			*val = readx1 & 0xfff;
 +	}
-+	tiadc_writel(adc_dev, REG_SE, STPENB_STEPENB);
++	adc_writel(adc_dev, REG_SE, STPENB_STEPENB);
 +
 +	return IIO_VAL_INT;
 +}
@@ -203,116 +195,78 @@
 +
 +static int __devinit tiadc_probe(struct platform_device *pdev)
 +{
-+	struct iio_dev		*indio_dev;
-+	struct tiadc_device	*adc_dev;
++	struct iio_dev		*idev;
++	int			err;
++	struct adc_device	*adc_dev;
 +	struct ti_tscadc_dev	*tscadc_dev = pdev->dev.platform_data;
 +	struct mfd_tscadc_board	*pdata;
-+	int			err;
-+
-+	pdata = tscadc_dev->dev->platform_data;
++
++	pdata = (struct mfd_tscadc_board *)tscadc_dev->dev->platform_data;
 +	if (!pdata || !pdata->adc_init) {
-+		dev_err(&pdev->dev, "Could not find platform data\n");
++		dev_err(tscadc_dev->dev, "Could not find platform data\n");
 +		return -EINVAL;
 +	}
 +
-+	indio_dev = iio_device_alloc(sizeof(struct tiadc_device));
-+	if (indio_dev == NULL) {
-+		dev_err(&pdev->dev, "failed to allocate iio device\n");
++	idev = iio_device_alloc(sizeof(struct adc_device));
++	if (idev == NULL) {
++		dev_err(&pdev->dev, "failed to allocate iio device.\n");
 +		err = -ENOMEM;
 +		goto err_ret;
 +	}
-+	adc_dev = iio_priv(indio_dev);
-+
++	adc_dev = iio_priv(idev);
++
++	tscadc_dev->adc = adc_dev;
 +	adc_dev->mfd_tscadc = tscadc_dev;
++	adc_dev->idev = idev;
 +	adc_dev->channels = pdata->adc_init->adc_channels;
 +
-+	indio_dev->dev.parent = &pdev->dev;
-+	indio_dev->name = dev_name(&pdev->dev);
-+	indio_dev->modes = INDIO_DIRECT_MODE;
-+	indio_dev->info = &tiadc_info;
-+
-+	tiadc_step_config(adc_dev);
-+
-+	err = tiadc_channel_init(indio_dev, adc_dev->channels);
++	idev->dev.parent = &pdev->dev;
++	idev->name = dev_name(&pdev->dev);
++	idev->modes = INDIO_DIRECT_MODE;
++	idev->info = &tiadc_info;
++
++	adc_step_config(adc_dev);
++
++	err = tiadc_channel_init(idev, adc_dev->channels);
 +	if (err < 0)
 +		goto err_free_device;
 +
-+	err = iio_device_register(indio_dev);
++	err = iio_device_register(idev);
 +	if (err)
 +		goto err_free_channels;
 +
-+	platform_set_drvdata(pdev, indio_dev);
++	dev_info(&pdev->dev, "attached adc driver\n");
++	platform_set_drvdata(pdev, idev);
 +
 +	return 0;
 +
 +err_free_channels:
-+	tiadc_channels_remove(indio_dev);
++	tiadc_channels_remove(idev);
 +err_free_device:
-+	iio_device_free(indio_dev);
++	iio_device_free(idev);
 +err_ret:
 +	return err;
 +}
 +
 +static int __devexit tiadc_remove(struct platform_device *pdev)
 +{
-+	struct iio_dev *indio_dev = platform_get_drvdata(pdev);
-+
-+	iio_device_unregister(indio_dev);
-+	tiadc_channels_remove(indio_dev);
-+
-+	iio_device_free(indio_dev);
++	struct ti_tscadc_dev   *tscadc_dev = pdev->dev.platform_data;
++	struct adc_device	*adc_dev = tscadc_dev->adc;
++	struct iio_dev		*idev = adc_dev->idev;
++
++	iio_device_unregister(idev);
++	tiadc_channels_remove(idev);
++
++	tscadc_dev->adc = NULL;
++	iio_device_free(idev);
 +
 +	return 0;
 +}
-+
-+#ifdef CONFIG_PM
-+static int tiadc_suspend(struct device *dev)
-+{
-+	struct iio_dev *indio_dev = dev_get_drvdata(dev);
-+	struct tiadc_device *adc_dev = iio_priv(indio_dev);
-+	struct ti_tscadc_dev *tscadc_dev = dev->platform_data;
-+	unsigned int idle;
-+
-+	if (!device_may_wakeup(tscadc_dev->dev)) {
-+		idle = tiadc_readl(adc_dev, REG_CTRL);
-+		idle &= ~(CNTRLREG_TSCSSENB);
-+		tiadc_writel(adc_dev, REG_CTRL, (idle |
-+				CNTRLREG_POWERDOWN));
-+	}
-+
-+	return 0;
-+}
-+
-+static int tiadc_resume(struct device *dev)
-+{
-+	struct iio_dev *indio_dev = dev_get_drvdata(dev);
-+	struct tiadc_device *adc_dev = iio_priv(indio_dev);
-+	unsigned int restore;
-+
-+	/* Make sure ADC is powered up */
-+	restore = tiadc_readl(adc_dev, REG_CTRL);
-+	restore &= ~(CNTRLREG_POWERDOWN);
-+	tiadc_writel(adc_dev, REG_CTRL, restore);
-+
-+	tiadc_step_config(adc_dev);
-+
-+	return 0;
-+}
-+
-+static const struct dev_pm_ops tiadc_pm_ops = {
-+	.suspend = tiadc_suspend,
-+	.resume = tiadc_resume,
-+};
-+#define TIADC_PM_OPS (&tiadc_pm_ops)
-+#else
-+#define TIADC_PM_OPS NULL
-+#endif
 +
 +static struct platform_driver tiadc_driver = {
 +	.driver = {
 +		.name   = "tiadc",
-+		.owner	= THIS_MODULE,
-+		.pm	= TIADC_PM_OPS,
++		.owner = THIS_MODULE,
 +	},
 +	.probe	= tiadc_probe,
 +	.remove	= __devexit_p(tiadc_remove),
@@ -323,19 +277,19 @@
 +MODULE_DESCRIPTION("TI ADC controller driver");
 +MODULE_AUTHOR("Rachna Patil <rachna@ti.com>");
 +MODULE_LICENSE("GPL");
-diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
-index d812be4..e947dd8 100644
---- a/drivers/mfd/ti_am335x_tscadc.c
-+++ b/drivers/mfd/ti_am335x_tscadc.c
-@@ -25,6 +25,7 @@
- 
- #include <linux/mfd/ti_am335x_tscadc.h>
- #include <linux/input/ti_am335x_tsc.h>
-+#include <linux/platform_data/ti_am335x_adc.h>
+diff --git a/drivers/mfd/ti_tscadc.c b/drivers/mfd/ti_tscadc.c
+index f26e53b..9dbd6d0 100644
+--- a/drivers/mfd/ti_tscadc.c
++++ b/drivers/mfd/ti_tscadc.c
+@@ -23,6 +23,7 @@
+ #include <linux/pm_runtime.h>
+ #include <linux/mfd/ti_tscadc.h>
+ #include <linux/input/ti_tsc.h>
++#include <linux/platform_data/ti_adc.h>
  
  static unsigned int tscadc_readl(struct ti_tscadc_dev *tsadc, unsigned int reg)
  {
-@@ -67,14 +68,23 @@ static	int __devinit ti_tscadc_probe(struct platform_device *pdev)
+@@ -55,14 +56,23 @@ static	int __devinit ti_tscadc_probe(struct platform_device *pdev)
  	int			irq;
  	int			err, ctrl;
  	int			clk_value, clock_rate;
@@ -360,7 +314,7 @@
  
  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  	if (!res) {
-@@ -172,6 +182,12 @@ static	int __devinit ti_tscadc_probe(struct platform_device *pdev)
+@@ -149,6 +159,12 @@ static	int __devinit ti_tscadc_probe(struct platform_device *pdev)
  	cell->platform_data = tscadc;
  	cell->pdata_size = sizeof(*tscadc);
  
@@ -371,13 +325,13 @@
 +	cell->pdata_size = sizeof(*tscadc);
 +
  	err = mfd_add_devices(&pdev->dev, pdev->id, tscadc->cells,
- 			TSCADC_CELLS, NULL, 0, NULL);
+ 			TSCADC_CELLS, NULL, 0);
  	if (err < 0)
-diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
-index fc18b2e..c79ad5d 100644
---- a/include/linux/mfd/ti_am335x_tscadc.h
-+++ b/include/linux/mfd/ti_am335x_tscadc.h
-@@ -120,15 +120,19 @@
+diff --git a/include/linux/mfd/ti_tscadc.h b/include/linux/mfd/ti_tscadc.h
+index d28a35c..67b7d5e 100644
+--- a/include/linux/mfd/ti_tscadc.h
++++ b/include/linux/mfd/ti_tscadc.h
+@@ -117,15 +117,19 @@
  
  #define ADC_CLK			3000000
  #define	MAX_CLK_DIV		7
@@ -398,24 +352,24 @@
  };
  
  struct ti_tscadc_dev {
-@@ -140,6 +144,9 @@ struct ti_tscadc_dev {
+@@ -136,6 +140,9 @@ struct ti_tscadc_dev {
  
  	/* tsc device */
- 	struct titsc *tsc;
+ 	struct tscadc *tsc;
 +
 +	/* adc device */
 +	struct adc_device *adc;
  };
  
  #endif
-diff --git a/include/linux/platform_data/ti_am335x_adc.h b/include/linux/platform_data/ti_am335x_adc.h
+diff --git a/include/linux/platform_data/ti_adc.h b/include/linux/platform_data/ti_adc.h
 new file mode 100644
-index 0000000..e41d583
+index 0000000..5a89f1d
 --- /dev/null
-+++ b/include/linux/platform_data/ti_am335x_adc.h
++++ b/include/linux/platform_data/ti_adc.h
 @@ -0,0 +1,14 @@
-+#ifndef __LINUX_TI_AM335X_ADC_H
-+#define __LINUX_TI_AM335X_ADC_H
++#ifndef __LINUX_TI_ADC_H
++#define __LINUX_TI_ADC_H
 +
 +/**
 + * struct adc_data	ADC Input information
@@ -424,7 +378,7 @@
 + */
 +
 +struct adc_data {
-+	unsigned int adc_channels;
++	int adc_channels;
 +};
 +
 +#endif
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help