* [PATCH 01/22] mfd/ti_am335x_tscadc: remove regmap
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The MFD part uses regmap without caching and is the only user of the
regmap. The child drivers, that is input(touch) and iio(adc), use direct
reg access.
There is a patch which converts them to use regmap as well but I see no
benefit at all doing this. There is a direct MMIO bus access with no
need to cache values like for I2C or SPI devices. Furthermore, most (if
not all) of the access done by the touch & ADC driver read volatile
register.
Therefore this patch removes regmap part of the driver.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/mfd/ti_am335x_tscadc.c | 23 ++---------------------
include/linux/mfd/ti_am335x_tscadc.h | 1 -
2 files changed, 2 insertions(+), 22 deletions(-)
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index e9f3fb5..804e61e 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -19,7 +19,6 @@
#include <linux/err.h>
#include <linux/io.h>
#include <linux/clk.h>
-#include <linux/regmap.h>
#include <linux/mfd/core.h>
#include <linux/pm_runtime.h>
@@ -29,25 +28,15 @@
static unsigned int tscadc_readl(struct ti_tscadc_dev *tsadc, unsigned int reg)
{
- unsigned int val;
-
- regmap_read(tsadc->regmap_tscadc, reg, &val);
- return val;
+ return readl(tsadc->tscadc_base + reg);
}
static void tscadc_writel(struct ti_tscadc_dev *tsadc, unsigned int reg,
unsigned int val)
{
- regmap_write(tsadc->regmap_tscadc, reg, val);
+ writel(val, tsadc->tscadc_base + reg);
}
-static const struct regmap_config tscadc_regmap_config = {
- .name = "ti_tscadc",
- .reg_bits = 32,
- .reg_stride = 4,
- .val_bits = 32,
-};
-
static void tscadc_idle_config(struct ti_tscadc_dev *config)
{
unsigned int idleconfig;
@@ -121,14 +110,6 @@ static int ti_tscadc_probe(struct platform_device *pdev)
return -ENOMEM;
}
- tscadc->regmap_tscadc = devm_regmap_init_mmio(&pdev->dev,
- tscadc->tscadc_base, &tscadc_regmap_config);
- if (IS_ERR(tscadc->regmap_tscadc)) {
- dev_err(&pdev->dev, "regmap init failed\n");
- err = PTR_ERR(tscadc->regmap_tscadc);
- goto ret;
- }
-
pm_runtime_enable(&pdev->dev);
pm_runtime_get_sync(&pdev->dev);
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index c79ad5d..dc75c34 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -137,7 +137,6 @@ struct mfd_tscadc_board {
struct ti_tscadc_dev {
struct device *dev;
- struct regmap *regmap_tscadc;
void __iomem *tscadc_base;
int irq;
struct mfd_cell cells[TSCADC_CELLS];
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 01/22] mfd/ti_am335x_tscadc: remove regmap
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The MFD part uses regmap without caching and is the only user of the
regmap. The child drivers, that is input(touch) and iio(adc), use direct
reg access.
There is a patch which converts them to use regmap as well but I see no
benefit at all doing this. There is a direct MMIO bus access with no
need to cache values like for I2C or SPI devices. Furthermore, most (if
not all) of the access done by the touch & ADC driver read volatile
register.
Therefore this patch removes regmap part of the driver.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/mfd/ti_am335x_tscadc.c | 23 ++---------------------
include/linux/mfd/ti_am335x_tscadc.h | 1 -
2 files changed, 2 insertions(+), 22 deletions(-)
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index e9f3fb5..804e61e 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -19,7 +19,6 @@
#include <linux/err.h>
#include <linux/io.h>
#include <linux/clk.h>
-#include <linux/regmap.h>
#include <linux/mfd/core.h>
#include <linux/pm_runtime.h>
@@ -29,25 +28,15 @@
static unsigned int tscadc_readl(struct ti_tscadc_dev *tsadc, unsigned int reg)
{
- unsigned int val;
-
- regmap_read(tsadc->regmap_tscadc, reg, &val);
- return val;
+ return readl(tsadc->tscadc_base + reg);
}
static void tscadc_writel(struct ti_tscadc_dev *tsadc, unsigned int reg,
unsigned int val)
{
- regmap_write(tsadc->regmap_tscadc, reg, val);
+ writel(val, tsadc->tscadc_base + reg);
}
-static const struct regmap_config tscadc_regmap_config = {
- .name = "ti_tscadc",
- .reg_bits = 32,
- .reg_stride = 4,
- .val_bits = 32,
-};
-
static void tscadc_idle_config(struct ti_tscadc_dev *config)
{
unsigned int idleconfig;
@@ -121,14 +110,6 @@ static int ti_tscadc_probe(struct platform_device *pdev)
return -ENOMEM;
}
- tscadc->regmap_tscadc = devm_regmap_init_mmio(&pdev->dev,
- tscadc->tscadc_base, &tscadc_regmap_config);
- if (IS_ERR(tscadc->regmap_tscadc)) {
- dev_err(&pdev->dev, "regmap init failed\n");
- err = PTR_ERR(tscadc->regmap_tscadc);
- goto ret;
- }
-
pm_runtime_enable(&pdev->dev);
pm_runtime_get_sync(&pdev->dev);
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index c79ad5d..dc75c34 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -137,7 +137,6 @@ struct mfd_tscadc_board {
struct ti_tscadc_dev {
struct device *dev;
- struct regmap *regmap_tscadc;
void __iomem *tscadc_base;
int irq;
struct mfd_cell cells[TSCADC_CELLS];
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 02/22] mfd & input & iio/ti_am335x_adc: use one structure for ti_tscadc_dev
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The mfd driver creates platform data for the child devices and it is the
ti_tscadc_dev struct. This struct is copied for the two devices.
The copy of the structure makes a common lock in this structure a little
less usefull. Therefore the platform data is not a pointer to the
structure and the same structure is used.
While doing the change I noticed that the suspend/resume code assumes
the wrong pointer for ti_tscadc_dev and this has been fixed as well.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/iio/adc/ti_am335x_adc.c | 5 +++--
drivers/input/touchscreen/ti_am335x_tsc.c | 16 +++++++++-------
drivers/mfd/ti_am335x_tscadc.c | 8 ++++----
include/linux/mfd/ti_am335x_tscadc.h | 7 +++++++
4 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 5f9a7e7..9db352e 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -140,7 +140,7 @@ static int tiadc_probe(struct platform_device *pdev)
{
struct iio_dev *indio_dev;
struct tiadc_device *adc_dev;
- struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data;
+ struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
struct mfd_tscadc_board *pdata;
int err;
@@ -205,9 +205,10 @@ 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;
+ struct ti_tscadc_dev *tscadc_dev;
unsigned int idle;
+ tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (!device_may_wakeup(tscadc_dev->dev)) {
idle = tiadc_readl(adc_dev, REG_CTRL);
idle &= ~(CNTRLREG_TSCSSENB);
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 51e7b87..16077d3 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -262,7 +262,7 @@ static int titsc_probe(struct platform_device *pdev)
{
struct titsc *ts_dev;
struct input_dev *input_dev;
- struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data;
+ struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
struct mfd_tscadc_board *pdata;
int err;
@@ -329,8 +329,8 @@ static int titsc_probe(struct platform_device *pdev)
static int titsc_remove(struct platform_device *pdev)
{
- struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data;
- struct titsc *ts_dev = tscadc_dev->tsc;
+ struct titsc *ts_dev = platform_get_drvdata(pdev);
+ u32 steps;
free_irq(ts_dev->irq, ts_dev);
@@ -344,10 +344,11 @@ static int titsc_remove(struct platform_device *pdev)
#ifdef CONFIG_PM
static int titsc_suspend(struct device *dev)
{
- struct ti_tscadc_dev *tscadc_dev = dev->platform_data;
- struct titsc *ts_dev = tscadc_dev->tsc;
+ struct titsc *ts_dev = dev_get_drvdata(dev);
+ struct ti_tscadc_dev *tscadc_dev;
unsigned int idle;
+ tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev->dev)) {
idle = titsc_readl(ts_dev, REG_IRQENABLE);
titsc_writel(ts_dev, REG_IRQENABLE,
@@ -359,9 +360,10 @@ static int titsc_suspend(struct device *dev)
static int titsc_resume(struct device *dev)
{
- struct ti_tscadc_dev *tscadc_dev = dev->platform_data;
- struct titsc *ts_dev = tscadc_dev->tsc;
+ struct titsc *ts_dev = dev_get_drvdata(dev);
+ struct ti_tscadc_dev *tscadc_dev;
+ tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev->dev)) {
titsc_writel(ts_dev, REG_IRQWAKEUP,
0x00);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 804e61e..490b2bd 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -157,14 +157,14 @@ static int ti_tscadc_probe(struct platform_device *pdev)
/* TSC Cell */
cell = &tscadc->cells[TSC_CELL];
cell->name = "tsc";
- cell->platform_data = tscadc;
- cell->pdata_size = sizeof(*tscadc);
+ cell->platform_data = &tscadc;
+ cell->pdata_size = sizeof(tscadc);
/* ADC Cell */
cell = &tscadc->cells[ADC_CELL];
cell->name = "tiadc";
- cell->platform_data = tscadc;
- cell->pdata_size = sizeof(*tscadc);
+ cell->platform_data = &tscadc;
+ cell->pdata_size = sizeof(tscadc);
err = mfd_add_devices(&pdev->dev, pdev->id, tscadc->cells,
TSCADC_CELLS, NULL, 0, NULL);
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index dc75c34..5e430fe 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -148,4 +148,11 @@ struct ti_tscadc_dev {
struct adc_device *adc;
};
+static inline struct ti_tscadc_dev *ti_tscadc_dev_get(struct platform_device *p)
+{
+ struct ti_tscadc_dev **tscadc_dev = p->dev.platform_data;
+
+ return *tscadc_dev;
+}
+
#endif
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 02/22] mfd & input & iio/ti_am335x_adc: use one structure for ti_tscadc_dev
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The mfd driver creates platform data for the child devices and it is the
ti_tscadc_dev struct. This struct is copied for the two devices.
The copy of the structure makes a common lock in this structure a little
less usefull. Therefore the platform data is not a pointer to the
structure and the same structure is used.
While doing the change I noticed that the suspend/resume code assumes
the wrong pointer for ti_tscadc_dev and this has been fixed as well.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/iio/adc/ti_am335x_adc.c | 5 +++--
drivers/input/touchscreen/ti_am335x_tsc.c | 16 +++++++++-------
drivers/mfd/ti_am335x_tscadc.c | 8 ++++----
include/linux/mfd/ti_am335x_tscadc.h | 7 +++++++
4 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 5f9a7e7..9db352e 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -140,7 +140,7 @@ static int tiadc_probe(struct platform_device *pdev)
{
struct iio_dev *indio_dev;
struct tiadc_device *adc_dev;
- struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data;
+ struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
struct mfd_tscadc_board *pdata;
int err;
@@ -205,9 +205,10 @@ 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;
+ struct ti_tscadc_dev *tscadc_dev;
unsigned int idle;
+ tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (!device_may_wakeup(tscadc_dev->dev)) {
idle = tiadc_readl(adc_dev, REG_CTRL);
idle &= ~(CNTRLREG_TSCSSENB);
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 51e7b87..16077d3 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -262,7 +262,7 @@ static int titsc_probe(struct platform_device *pdev)
{
struct titsc *ts_dev;
struct input_dev *input_dev;
- struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data;
+ struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
struct mfd_tscadc_board *pdata;
int err;
@@ -329,8 +329,8 @@ static int titsc_probe(struct platform_device *pdev)
static int titsc_remove(struct platform_device *pdev)
{
- struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data;
- struct titsc *ts_dev = tscadc_dev->tsc;
+ struct titsc *ts_dev = platform_get_drvdata(pdev);
+ u32 steps;
free_irq(ts_dev->irq, ts_dev);
@@ -344,10 +344,11 @@ static int titsc_remove(struct platform_device *pdev)
#ifdef CONFIG_PM
static int titsc_suspend(struct device *dev)
{
- struct ti_tscadc_dev *tscadc_dev = dev->platform_data;
- struct titsc *ts_dev = tscadc_dev->tsc;
+ struct titsc *ts_dev = dev_get_drvdata(dev);
+ struct ti_tscadc_dev *tscadc_dev;
unsigned int idle;
+ tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev->dev)) {
idle = titsc_readl(ts_dev, REG_IRQENABLE);
titsc_writel(ts_dev, REG_IRQENABLE,
@@ -359,9 +360,10 @@ static int titsc_suspend(struct device *dev)
static int titsc_resume(struct device *dev)
{
- struct ti_tscadc_dev *tscadc_dev = dev->platform_data;
- struct titsc *ts_dev = tscadc_dev->tsc;
+ struct titsc *ts_dev = dev_get_drvdata(dev);
+ struct ti_tscadc_dev *tscadc_dev;
+ tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev->dev)) {
titsc_writel(ts_dev, REG_IRQWAKEUP,
0x00);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 804e61e..490b2bd 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -157,14 +157,14 @@ static int ti_tscadc_probe(struct platform_device *pdev)
/* TSC Cell */
cell = &tscadc->cells[TSC_CELL];
cell->name = "tsc";
- cell->platform_data = tscadc;
- cell->pdata_size = sizeof(*tscadc);
+ cell->platform_data = &tscadc;
+ cell->pdata_size = sizeof(tscadc);
/* ADC Cell */
cell = &tscadc->cells[ADC_CELL];
cell->name = "tiadc";
- cell->platform_data = tscadc;
- cell->pdata_size = sizeof(*tscadc);
+ cell->platform_data = &tscadc;
+ cell->pdata_size = sizeof(tscadc);
err = mfd_add_devices(&pdev->dev, pdev->id, tscadc->cells,
TSCADC_CELLS, NULL, 0, NULL);
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index dc75c34..5e430fe 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -148,4 +148,11 @@ struct ti_tscadc_dev {
struct adc_device *adc;
};
+static inline struct ti_tscadc_dev *ti_tscadc_dev_get(struct platform_device *p)
+{
+ struct ti_tscadc_dev **tscadc_dev = p->dev.platform_data;
+
+ return *tscadc_dev;
+}
+
#endif
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 04/22] input/ti_am33x_tsc: Order of TSC wires, made configurable
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Patil, Rachna, Sebastian Andrzej Siewior
From: "Patil, Rachna" <rachna-l0cyMroinI0@public.gmane.org>
The current driver expected touchscreen input
wires(XP,XN,YP,YN) to be connected in a particular order.
Making changes to accept this as platform data.
Signed-off-by: Patil, Rachna <rachna-l0cyMroinI0@public.gmane.org>
Signed-off-by: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>
[bigeasy: larger rework of the patch, no config[4][4] array, smaller
sized config_inp, no regbit_map(), shrinked
titsc_config_wires(), no config redo on resume, config_inp and
friends are now u32]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 102 ++++++++++++++++++++++++-----
include/linux/input/ti_am335x_tsc.h | 12 ++++
include/linux/mfd/ti_am335x_tscadc.h | 10 ++-
3 files changed, 105 insertions(+), 19 deletions(-)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 23d6a4d..56c6220 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -33,6 +33,13 @@
#define SEQ_SETTLE 275
#define MAX_12BIT ((1 << 12) - 1)
+static const int config_pins[] = {
+ XPP,
+ XNN,
+ YPP,
+ YNN,
+};
+
struct titsc {
struct input_dev *input;
struct ti_tscadc_dev *mfd_tscadc;
@@ -41,6 +48,9 @@ struct titsc {
unsigned int x_plate_resistance;
bool pen_down;
int steps_to_configure;
+ u32 config_inp[4];
+ u32 bit_xp, bit_xn, bit_yp, bit_yn;
+ u32 inp_xp, inp_xn, inp_yp, inp_yn;
};
static unsigned int titsc_readl(struct titsc *ts, unsigned int reg)
@@ -54,6 +64,58 @@ static void titsc_writel(struct titsc *tsc, unsigned int reg,
writel(val, tsc->mfd_tscadc->tscadc_base + reg);
}
+static int titsc_config_wires(struct titsc *ts_dev)
+{
+ u32 analog_line[4];
+ u32 wire_order[4];
+ int i, bit_cfg;
+
+ for (i = 0; i < 4; i++) {
+ /*
+ * Get the order in which TSC wires are attached
+ * w.r.t. each of the analog input lines on the EVM.
+ */
+ analog_line[i] = (ts_dev->config_inp[i] & 0xF0) >> 4;
+ wire_order[i] = ts_dev->config_inp[i] & 0x0F;
+ if (WARN_ON(analog_line[i] > 7))
+ return -EINVAL;
+ if (WARN_ON(wire_order[i] > ARRAY_SIZE(config_pins)))
+ return -EINVAL;
+ }
+
+ for (i = 0; i < 4; i++) {
+ int an_line;
+ int wi_order;
+
+ an_line = analog_line[i];
+ wi_order = wire_order[i];
+ bit_cfg = config_pins[wi_order];
+ if (bit_cfg == 0)
+ return -EINVAL;
+ switch (wi_order) {
+ case 0:
+ ts_dev->bit_xp = bit_cfg;
+ ts_dev->inp_xp = an_line;
+ break;
+
+ case 1:
+ ts_dev->bit_xn = bit_cfg;
+ ts_dev->inp_xn = an_line;
+ break;
+
+ case 2:
+ ts_dev->bit_yp = bit_cfg;
+ ts_dev->inp_yp = an_line;
+ break;
+ case 3:
+ ts_dev->bit_yn = bit_cfg;
+ ts_dev->inp_yn = an_line;
+ break;
+ }
+ }
+ return 0;
+}
+
static void titsc_step_config(struct titsc *ts_dev)
{
unsigned int config;
@@ -64,18 +126,18 @@ static void titsc_step_config(struct titsc *ts_dev)
total_steps = 2 * ts_dev->steps_to_configure;
config = STEPCONFIG_MODE_HWSYNC |
- STEPCONFIG_AVG_16 | STEPCONFIG_XPP;
+ STEPCONFIG_AVG_16 | ts_dev->bit_xp;
switch (ts_dev->wires) {
case 4:
- config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN;
+ config |= STEPCONFIG_INP(ts_dev->inp_yp) | ts_dev->bit_xn;
break;
case 5:
- config |= STEPCONFIG_YNN |
- STEPCONFIG_INP_AN4 | STEPCONFIG_XNN |
- STEPCONFIG_YPP;
+ config |= ts_dev->bit_yn |
+ STEPCONFIG_INP_AN4 | ts_dev->bit_xn |
+ ts_dev->bit_yp;
break;
case 8:
- config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN;
+ config |= STEPCONFIG_INP(ts_dev->inp_yp) | ts_dev->bit_xn;
break;
}
@@ -86,18 +148,18 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
config = STEPCONFIG_MODE_HWSYNC |
- STEPCONFIG_AVG_16 | STEPCONFIG_YNN |
+ STEPCONFIG_AVG_16 | ts_dev->bit_yn |
STEPCONFIG_INM_ADCREFM | STEPCONFIG_FIFO1;
switch (ts_dev->wires) {
case 4:
- config |= STEPCONFIG_YPP;
+ config |= ts_dev->bit_yp | STEPCONFIG_INP(ts_dev->inp_xp);
break;
case 5:
- config |= STEPCONFIG_XPP | STEPCONFIG_INP_AN4 |
- STEPCONFIG_XNP | STEPCONFIG_YPN;
+ config |= ts_dev->bit_xp | STEPCONFIG_INP_AN4 |
+ ts_dev->bit_xn | ts_dev->bit_yp;
break;
case 8:
- config |= STEPCONFIG_YPP;
+ config |= ts_dev->bit_yp | STEPCONFIG_INP(ts_dev->inp_xp);
break;
}
@@ -108,9 +170,9 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
/* Charge step configuration */
- config = STEPCONFIG_XPP | STEPCONFIG_YNN |
+ config = ts_dev->bit_xp | ts_dev->bit_yn |
STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR |
- STEPCHARGE_INM_AN1 | STEPCHARGE_INP_AN1;
+ STEPCHARGE_INM_AN1 | STEPCHARGE_INP(ts_dev->inp_yp);
titsc_writel(ts_dev, REG_CHARGECONFIG, config);
titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY);
@@ -118,13 +180,14 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
/* Configure to calculate pressure */
config = STEPCONFIG_MODE_HWSYNC |
- STEPCONFIG_AVG_16 | STEPCONFIG_YPP |
- STEPCONFIG_XNN | STEPCONFIG_INM_ADCREFM;
+ STEPCONFIG_AVG_16 | ts_dev->bit_yp |
+ ts_dev->bit_xn | STEPCONFIG_INM_ADCREFM |
+ STEPCONFIG_INP(ts_dev->inp_xp);
titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 1), config);
titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 1),
STEPCONFIG_OPENDLY);
- config |= STEPCONFIG_INP_AN3 | STEPCONFIG_FIFO1;
+ config |= STEPCONFIG_INP(ts_dev->inp_yn) | STEPCONFIG_FIFO1;
titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 2), config);
titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 2),
STEPCONFIG_OPENDLY);
@@ -292,6 +355,8 @@ static int titsc_probe(struct platform_device *pdev)
ts_dev->wires = pdata->tsc_init->wires;
ts_dev->x_plate_resistance = pdata->tsc_init->x_plate_resistance;
ts_dev->steps_to_configure = pdata->tsc_init->steps_to_configure;
+ memcpy(ts_dev->config_inp, pdata->tsc_init->wire_config,
+ sizeof(pdata->tsc_init->wire_config));
err = request_irq(ts_dev->irq, titsc_irq,
0, pdev->dev.driver->name, ts_dev);
@@ -301,6 +366,11 @@ static int titsc_probe(struct platform_device *pdev)
}
titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES);
+ err = titsc_config_wires(ts_dev);
+ if (err) {
+ dev_err(&pdev->dev, "wrong i/p wire configuration\n");
+ goto err_free_irq;
+ }
titsc_step_config(ts_dev);
titsc_writel(ts_dev, REG_FIFO0THR, ts_dev->steps_to_configure);
diff --git a/include/linux/input/ti_am335x_tsc.h b/include/linux/input/ti_am335x_tsc.h
index 49269a2..6a66b4d 100644
--- a/include/linux/input/ti_am335x_tsc.h
+++ b/include/linux/input/ti_am335x_tsc.h
@@ -12,12 +12,24 @@
* A step configured to read a single
* co-ordinate value, can be applied
* more number of times for better results.
+ * @wire_config: Different EVM's could have a different order
+ * for connecting wires on touchscreen.
+ * We need to provide an 8 bit number where in
+ * the 1st four bits represent the analog lines
+ * and the next 4 bits represent positive/
+ * negative terminal on that input line.
+ * Notations to represent the input lines and
+ * terminals resoectively is as follows:
+ * AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+ * XP = 0, XN = 1, YP = 2, YN = 3.
+ *
*/
struct tsc_data {
int wires;
int x_plate_resistance;
int steps_to_configure;
+ int wire_config[10];
};
#endif
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index eeead15..2d78af8 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -71,8 +71,6 @@
#define STEPCONFIG_INM_ADCREFM STEPCONFIG_INM(8)
#define STEPCONFIG_INP_MASK (0xF << 19)
#define STEPCONFIG_INP(val) ((val) << 19)
-#define STEPCONFIG_INP_AN2 STEPCONFIG_INP(2)
-#define STEPCONFIG_INP_AN3 STEPCONFIG_INP(3)
#define STEPCONFIG_INP_AN4 STEPCONFIG_INP(4)
#define STEPCONFIG_INP_ADCREFM STEPCONFIG_INP(8)
#define STEPCONFIG_FIFO1 BIT(26)
@@ -94,7 +92,6 @@
#define STEPCHARGE_INM_AN1 STEPCHARGE_INM(1)
#define STEPCHARGE_INP_MASK (0xF << 19)
#define STEPCHARGE_INP(val) ((val) << 19)
-#define STEPCHARGE_INP_AN1 STEPCHARGE_INP(1)
#define STEPCHARGE_RFM_MASK (3 << 23)
#define STEPCHARGE_RFM(val) ((val) << 23)
#define STEPCHARGE_RFM_XNUR STEPCHARGE_RFM(1)
@@ -116,6 +113,13 @@
#define CNTRLREG_8WIRE CNTRLREG_AFE_CTRL(3)
#define CNTRLREG_TSCENB BIT(7)
+#define XPP STEPCONFIG_XPP
+#define XNP STEPCONFIG_XNP
+#define XNN STEPCONFIG_XNN
+#define YPP STEPCONFIG_YPP
+#define YPN STEPCONFIG_YPN
+#define YNN STEPCONFIG_YNN
+
#define ADC_CLK 3000000
#define MAX_CLK_DIV 7
#define TOTAL_STEPS 16
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 04/22] input/ti_am33x_tsc: Order of TSC wires, made configurable
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Patil, Rachna, Sebastian Andrzej Siewior
From: "Patil, Rachna" <rachna@ti.com>
The current driver expected touchscreen input
wires(XP,XN,YP,YN) to be connected in a particular order.
Making changes to accept this as platform data.
Signed-off-by: Patil, Rachna <rachna@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
[bigeasy: larger rework of the patch, no config[4][4] array, smaller
sized config_inp, no regbit_map(), shrinked
titsc_config_wires(), no config redo on resume, config_inp and
friends are now u32]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 102 ++++++++++++++++++++++++-----
include/linux/input/ti_am335x_tsc.h | 12 ++++
include/linux/mfd/ti_am335x_tscadc.h | 10 ++-
3 files changed, 105 insertions(+), 19 deletions(-)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 23d6a4d..56c6220 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -33,6 +33,13 @@
#define SEQ_SETTLE 275
#define MAX_12BIT ((1 << 12) - 1)
+static const int config_pins[] = {
+ XPP,
+ XNN,
+ YPP,
+ YNN,
+};
+
struct titsc {
struct input_dev *input;
struct ti_tscadc_dev *mfd_tscadc;
@@ -41,6 +48,9 @@ struct titsc {
unsigned int x_plate_resistance;
bool pen_down;
int steps_to_configure;
+ u32 config_inp[4];
+ u32 bit_xp, bit_xn, bit_yp, bit_yn;
+ u32 inp_xp, inp_xn, inp_yp, inp_yn;
};
static unsigned int titsc_readl(struct titsc *ts, unsigned int reg)
@@ -54,6 +64,58 @@ static void titsc_writel(struct titsc *tsc, unsigned int reg,
writel(val, tsc->mfd_tscadc->tscadc_base + reg);
}
+static int titsc_config_wires(struct titsc *ts_dev)
+{
+ u32 analog_line[4];
+ u32 wire_order[4];
+ int i, bit_cfg;
+
+ for (i = 0; i < 4; i++) {
+ /*
+ * Get the order in which TSC wires are attached
+ * w.r.t. each of the analog input lines on the EVM.
+ */
+ analog_line[i] = (ts_dev->config_inp[i] & 0xF0) >> 4;
+ wire_order[i] = ts_dev->config_inp[i] & 0x0F;
+ if (WARN_ON(analog_line[i] > 7))
+ return -EINVAL;
+ if (WARN_ON(wire_order[i] > ARRAY_SIZE(config_pins)))
+ return -EINVAL;
+ }
+
+ for (i = 0; i < 4; i++) {
+ int an_line;
+ int wi_order;
+
+ an_line = analog_line[i];
+ wi_order = wire_order[i];
+ bit_cfg = config_pins[wi_order];
+ if (bit_cfg == 0)
+ return -EINVAL;
+ switch (wi_order) {
+ case 0:
+ ts_dev->bit_xp = bit_cfg;
+ ts_dev->inp_xp = an_line;
+ break;
+
+ case 1:
+ ts_dev->bit_xn = bit_cfg;
+ ts_dev->inp_xn = an_line;
+ break;
+
+ case 2:
+ ts_dev->bit_yp = bit_cfg;
+ ts_dev->inp_yp = an_line;
+ break;
+ case 3:
+ ts_dev->bit_yn = bit_cfg;
+ ts_dev->inp_yn = an_line;
+ break;
+ }
+ }
+ return 0;
+}
+
static void titsc_step_config(struct titsc *ts_dev)
{
unsigned int config;
@@ -64,18 +126,18 @@ static void titsc_step_config(struct titsc *ts_dev)
total_steps = 2 * ts_dev->steps_to_configure;
config = STEPCONFIG_MODE_HWSYNC |
- STEPCONFIG_AVG_16 | STEPCONFIG_XPP;
+ STEPCONFIG_AVG_16 | ts_dev->bit_xp;
switch (ts_dev->wires) {
case 4:
- config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN;
+ config |= STEPCONFIG_INP(ts_dev->inp_yp) | ts_dev->bit_xn;
break;
case 5:
- config |= STEPCONFIG_YNN |
- STEPCONFIG_INP_AN4 | STEPCONFIG_XNN |
- STEPCONFIG_YPP;
+ config |= ts_dev->bit_yn |
+ STEPCONFIG_INP_AN4 | ts_dev->bit_xn |
+ ts_dev->bit_yp;
break;
case 8:
- config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN;
+ config |= STEPCONFIG_INP(ts_dev->inp_yp) | ts_dev->bit_xn;
break;
}
@@ -86,18 +148,18 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
config = STEPCONFIG_MODE_HWSYNC |
- STEPCONFIG_AVG_16 | STEPCONFIG_YNN |
+ STEPCONFIG_AVG_16 | ts_dev->bit_yn |
STEPCONFIG_INM_ADCREFM | STEPCONFIG_FIFO1;
switch (ts_dev->wires) {
case 4:
- config |= STEPCONFIG_YPP;
+ config |= ts_dev->bit_yp | STEPCONFIG_INP(ts_dev->inp_xp);
break;
case 5:
- config |= STEPCONFIG_XPP | STEPCONFIG_INP_AN4 |
- STEPCONFIG_XNP | STEPCONFIG_YPN;
+ config |= ts_dev->bit_xp | STEPCONFIG_INP_AN4 |
+ ts_dev->bit_xn | ts_dev->bit_yp;
break;
case 8:
- config |= STEPCONFIG_YPP;
+ config |= ts_dev->bit_yp | STEPCONFIG_INP(ts_dev->inp_xp);
break;
}
@@ -108,9 +170,9 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
/* Charge step configuration */
- config = STEPCONFIG_XPP | STEPCONFIG_YNN |
+ config = ts_dev->bit_xp | ts_dev->bit_yn |
STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR |
- STEPCHARGE_INM_AN1 | STEPCHARGE_INP_AN1;
+ STEPCHARGE_INM_AN1 | STEPCHARGE_INP(ts_dev->inp_yp);
titsc_writel(ts_dev, REG_CHARGECONFIG, config);
titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY);
@@ -118,13 +180,14 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
/* Configure to calculate pressure */
config = STEPCONFIG_MODE_HWSYNC |
- STEPCONFIG_AVG_16 | STEPCONFIG_YPP |
- STEPCONFIG_XNN | STEPCONFIG_INM_ADCREFM;
+ STEPCONFIG_AVG_16 | ts_dev->bit_yp |
+ ts_dev->bit_xn | STEPCONFIG_INM_ADCREFM |
+ STEPCONFIG_INP(ts_dev->inp_xp);
titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 1), config);
titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 1),
STEPCONFIG_OPENDLY);
- config |= STEPCONFIG_INP_AN3 | STEPCONFIG_FIFO1;
+ config |= STEPCONFIG_INP(ts_dev->inp_yn) | STEPCONFIG_FIFO1;
titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 2), config);
titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 2),
STEPCONFIG_OPENDLY);
@@ -292,6 +355,8 @@ static int titsc_probe(struct platform_device *pdev)
ts_dev->wires = pdata->tsc_init->wires;
ts_dev->x_plate_resistance = pdata->tsc_init->x_plate_resistance;
ts_dev->steps_to_configure = pdata->tsc_init->steps_to_configure;
+ memcpy(ts_dev->config_inp, pdata->tsc_init->wire_config,
+ sizeof(pdata->tsc_init->wire_config));
err = request_irq(ts_dev->irq, titsc_irq,
0, pdev->dev.driver->name, ts_dev);
@@ -301,6 +366,11 @@ static int titsc_probe(struct platform_device *pdev)
}
titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES);
+ err = titsc_config_wires(ts_dev);
+ if (err) {
+ dev_err(&pdev->dev, "wrong i/p wire configuration\n");
+ goto err_free_irq;
+ }
titsc_step_config(ts_dev);
titsc_writel(ts_dev, REG_FIFO0THR, ts_dev->steps_to_configure);
diff --git a/include/linux/input/ti_am335x_tsc.h b/include/linux/input/ti_am335x_tsc.h
index 49269a2..6a66b4d 100644
--- a/include/linux/input/ti_am335x_tsc.h
+++ b/include/linux/input/ti_am335x_tsc.h
@@ -12,12 +12,24 @@
* A step configured to read a single
* co-ordinate value, can be applied
* more number of times for better results.
+ * @wire_config: Different EVM's could have a different order
+ * for connecting wires on touchscreen.
+ * We need to provide an 8 bit number where in
+ * the 1st four bits represent the analog lines
+ * and the next 4 bits represent positive/
+ * negative terminal on that input line.
+ * Notations to represent the input lines and
+ * terminals resoectively is as follows:
+ * AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+ * XP = 0, XN = 1, YP = 2, YN = 3.
+ *
*/
struct tsc_data {
int wires;
int x_plate_resistance;
int steps_to_configure;
+ int wire_config[10];
};
#endif
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index eeead15..2d78af8 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -71,8 +71,6 @@
#define STEPCONFIG_INM_ADCREFM STEPCONFIG_INM(8)
#define STEPCONFIG_INP_MASK (0xF << 19)
#define STEPCONFIG_INP(val) ((val) << 19)
-#define STEPCONFIG_INP_AN2 STEPCONFIG_INP(2)
-#define STEPCONFIG_INP_AN3 STEPCONFIG_INP(3)
#define STEPCONFIG_INP_AN4 STEPCONFIG_INP(4)
#define STEPCONFIG_INP_ADCREFM STEPCONFIG_INP(8)
#define STEPCONFIG_FIFO1 BIT(26)
@@ -94,7 +92,6 @@
#define STEPCHARGE_INM_AN1 STEPCHARGE_INM(1)
#define STEPCHARGE_INP_MASK (0xF << 19)
#define STEPCHARGE_INP(val) ((val) << 19)
-#define STEPCHARGE_INP_AN1 STEPCHARGE_INP(1)
#define STEPCHARGE_RFM_MASK (3 << 23)
#define STEPCHARGE_RFM(val) ((val) << 23)
#define STEPCHARGE_RFM_XNUR STEPCHARGE_RFM(1)
@@ -116,6 +113,13 @@
#define CNTRLREG_8WIRE CNTRLREG_AFE_CTRL(3)
#define CNTRLREG_TSCENB BIT(7)
+#define XPP STEPCONFIG_XPP
+#define XNP STEPCONFIG_XNP
+#define XNN STEPCONFIG_XNN
+#define YPP STEPCONFIG_YPP
+#define YPN STEPCONFIG_YPN
+#define YNN STEPCONFIG_YNN
+
#define ADC_CLK 3000000
#define MAX_CLK_DIV 7
#define TOTAL_STEPS 16
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 06/22] input/ti_am33x_tsc: Add DT support
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Patil, Rachna, Pantelis Antoniou,
Sebastian Andrzej Siewior
From: "Patil, Rachna" <rachna-l0cyMroinI0@public.gmane.org>
Add DT support for client touchscreen driver
[ panto-wVdstyuyKrO8r51toPun2/C9HSW9iNxf@public.gmane.org : use of_get_child_by_name
instead of of_find_node_by_name ]
Signed-off-by: Pantelis Antoniou <panto-wVdstyuyKrO8r51toPun2/C9HSW9iNxf@public.gmane.org>
Signed-off-by: Patil, Rachna <rachna-l0cyMroinI0@public.gmane.org>
Signed-off-by: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>
[ bigeasy: shift the code to the left, shirnk titsc_parse_dt() by not
using temp value, change a binding and document them in
ti-tsc-adc.txt which also contains ADC binding which will be
used later]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
.../bindings/input/touchscreen/ti-tsc-adc.txt | 44 +++++++++
drivers/input/touchscreen/ti_am335x_tsc.c | 102 +++++++++++++++-----
2 files changed, 123 insertions(+), 23 deletions(-)
create mode 100644 Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
new file mode 100644
index 0000000..491c97b
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
@@ -0,0 +1,44 @@
+* TI - TSC ADC (Touschscreen and analog digital converter)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Required properties:
+- child "tsc"
+ ti,wires: Wires refer to application modes i.e. 4/5/8 wire touchscreen
+ support on the platform.
+ ti,x-plate-resistance: X plate resistance
+ ti,coordiante-readouts: The sequencer supports a total of 16
+ programmable steps each step is used to
+ read a single coordinate. A single
+ readout is enough but multiple reads can
+ increase the quality.
+ A value of 5 means, 5 reads for X, 5 for
+ Y and 2 for Z (always). This utilises 12
+ of the 16 software steps available. The
+ remaining 4 can be used by the ADC.
+ ti,wire-config: Different boards could have a different order for
+ connecting wires on touchscreen. We need to provide an
+ 8 bit number where in the 1st four bits represent the
+ analog lines and the next 4 bits represent positive/
+ negative terminal on that input line. Notations to
+ represent the input lines and terminals resoectively
+ is as follows:
+ AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+ XP = 0, XN = 1, YP = 2, YN = 3.
+- child "adc"
+ ti,adc-channels: List of analog inputs available for ADC.
+ AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+
+Example:
+ tscadc: tscadc@44e0d000 {
+ compatible = "ti,am3359-tscadc";
+ tsc {
+ ti,wires = <4>;
+ ti,x-plate-resistance = <200>;
+ ti,coordiante-readouts = <5>;
+ ti,wire-config = <0x00 0x11 0x22 0x33>;
+ };
+
+ adc {
+ ti,adc-channels = <4 5 6 7>;
+ };
+ }
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index b2f8a46..c876385 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -26,6 +26,8 @@
#include <linux/io.h>
#include <linux/input/ti_am335x_tsc.h>
#include <linux/delay.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
#include <linux/mfd/ti_am335x_tscadc.h>
@@ -47,7 +49,7 @@ struct titsc {
unsigned int wires;
unsigned int x_plate_resistance;
bool pen_down;
- int steps_to_configure;
+ int coordiante_readouts;
u32 config_inp[4];
u32 bit_xp, bit_xn, bit_yp, bit_yn;
u32 inp_xp, inp_xn, inp_yp, inp_yn;
@@ -123,7 +125,7 @@ static void titsc_step_config(struct titsc *ts_dev)
int i, total_steps;
/* Configure the Step registers */
- total_steps = 2 * ts_dev->steps_to_configure;
+ total_steps = 2 * ts_dev->coordiante_readouts;
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev->bit_xp;
@@ -141,7 +143,7 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
- for (i = 1; i <= ts_dev->steps_to_configure; i++) {
+ for (i = 1; i <= ts_dev->coordiante_readouts; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
@@ -163,7 +165,7 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
- for (i = (ts_dev->steps_to_configure + 1); i <= total_steps; i++) {
+ for (i = (ts_dev->coordiante_readouts + 1); i <= total_steps; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
@@ -218,7 +220,7 @@ static void titsc_read_coordinates(struct titsc *ts_dev,
read = titsc_readl(ts_dev, REG_FIFO0);
channel = read & 0xf0000;
channel = channel >> 0x10;
- if ((channel >= 0) && (channel < ts_dev->steps_to_configure)) {
+ if ((channel >= 0) && (channel < ts_dev->coordiante_readouts)) {
read &= 0xfff;
diff = abs(read - prev_val_x);
if (diff < prev_diff_x) {
@@ -231,8 +233,8 @@ static void titsc_read_coordinates(struct titsc *ts_dev,
read = titsc_readl(ts_dev, REG_FIFO1);
channel = read & 0xf0000;
channel = channel >> 0x10;
- if ((channel >= ts_dev->steps_to_configure) &&
- (channel < (2 * ts_dev->steps_to_configure - 1))) {
+ if ((channel >= ts_dev->coordiante_readouts) &&
+ (channel < (2 * ts_dev->coordiante_readouts - 1))) {
read &= 0xfff;
diff = abs(read - prev_val_y);
if (diff < prev_diff_y) {
@@ -310,6 +312,62 @@ static irqreturn_t titsc_irq(int irq, void *dev)
return IRQ_HANDLED;
}
+static int titsc_parse_dt(struct ti_tscadc_dev *tscadc_dev,
+ struct titsc *ts_dev)
+{
+ struct device_node *node = tscadc_dev->dev->of_node;
+ int err;
+
+ if (!node)
+ return -EINVAL;
+
+ node = of_get_child_by_name(node, "tsc");
+ if (!node)
+ return -EINVAL;
+ err = of_property_read_u32(node, "ti,wires", &ts_dev->wires);
+ if (err < 0)
+ return err;
+ switch (ts_dev->wires) {
+ case 4:
+ case 5:
+ case 8:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ err = of_property_read_u32(node, "ti,x-plate-resistance",
+ &ts_dev->x_plate_resistance);
+ if (err < 0)
+ return err;
+
+ err = of_property_read_u32(node, "ti,coordiante-readouts",
+ &ts_dev->coordiante_readouts);
+ if (err < 0)
+ return err;
+
+ return of_property_read_u32_array(node, "ti,wire-config",
+ ts_dev->config_inp, ARRAY_SIZE(ts_dev->config_inp));
+}
+
+static int titsc_parse_pdata(struct ti_tscadc_dev *tscadc_dev,
+ struct titsc *ts_dev)
+{
+ struct mfd_tscadc_board *pdata = tscadc_dev->dev->platform_data;
+
+ if (!pdata)
+ return -EINVAL;
+
+ ts_dev->wires = pdata->tsc_init->wires;
+ ts_dev->x_plate_resistance =
+ pdata->tsc_init->x_plate_resistance;
+ ts_dev->steps_to_configure =
+ pdata->tsc_init->steps_to_configure;
+ memcpy(ts_dev->config_inp, pdata->tsc_init->wire_config,
+ sizeof(pdata->tsc_init->wire_config));
+ return 0;
+}
+
/*
* The functions for inserting/removing driver as a module.
*/
@@ -319,16 +377,8 @@ static int titsc_probe(struct platform_device *pdev)
struct titsc *ts_dev;
struct input_dev *input_dev;
struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
- struct mfd_tscadc_board *pdata;
int err;
- pdata = tscadc_dev->dev->platform_data;
-
- if (!pdata) {
- dev_err(&pdev->dev, "Could not find platform data\n");
- return -EINVAL;
- }
-
/* Allocate memory for device */
ts_dev = kzalloc(sizeof(struct titsc), GFP_KERNEL);
input_dev = input_allocate_device();
@@ -342,11 +392,17 @@ static int titsc_probe(struct platform_device *pdev)
ts_dev->mfd_tscadc = tscadc_dev;
ts_dev->input = input_dev;
ts_dev->irq = tscadc_dev->irq;
- ts_dev->wires = pdata->tsc_init->wires;
- ts_dev->x_plate_resistance = pdata->tsc_init->x_plate_resistance;
- ts_dev->steps_to_configure = pdata->tsc_init->steps_to_configure;
- memcpy(ts_dev->config_inp, pdata->tsc_init->wire_config,
- sizeof(pdata->tsc_init->wire_config));
+
+ if (tscadc_dev->dev->platform_data)
+ err = titsc_parse_pdata(tscadc_dev, ts_dev);
+ else
+ err = titsc_parse_dt(tscadc_dev, ts_dev);
+
+ if (err) {
+ dev_err(&pdev->dev, "Could not find platform data\n");
+ err = -EINVAL;
+ goto err_free_mem;
+ }
err = request_irq(ts_dev->irq, titsc_irq,
0, pdev->dev.driver->name, ts_dev);
@@ -362,7 +418,7 @@ static int titsc_probe(struct platform_device *pdev)
goto err_free_irq;
}
titsc_step_config(ts_dev);
- titsc_writel(ts_dev, REG_FIFO0THR, ts_dev->steps_to_configure);
+ titsc_writel(ts_dev, REG_FIFO0THR, ts_dev->coordiante_readouts);
input_dev->name = "ti-tsc";
input_dev->dev.parent = &pdev->dev;
@@ -398,7 +454,7 @@ static int titsc_remove(struct platform_device *pdev)
free_irq(ts_dev->irq, ts_dev);
/* total steps followed by the enable mask */
- steps = 2 * ts_dev->steps_to_configure + 2;
+ steps = 2 * ts_dev->coordiante_readouts + 2;
steps = (1 << steps) - 1;
am335x_tsc_se_clr(ts_dev->mfd_tscadc, steps);
@@ -439,7 +495,7 @@ static int titsc_resume(struct device *dev)
}
titsc_step_config(ts_dev);
titsc_writel(ts_dev, REG_FIFO0THR,
- ts_dev->steps_to_configure);
+ ts_dev->coordiante_readouts);
return 0;
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 06/22] input/ti_am33x_tsc: Add DT support
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Patil, Rachna, Pantelis Antoniou,
Sebastian Andrzej Siewior
From: "Patil, Rachna" <rachna@ti.com>
Add DT support for client touchscreen driver
[ panto@antoniou-consulting.com : use of_get_child_by_name
instead of of_find_node_by_name ]
Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Patil, Rachna <rachna@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
[ bigeasy: shift the code to the left, shirnk titsc_parse_dt() by not
using temp value, change a binding and document them in
ti-tsc-adc.txt which also contains ADC binding which will be
used later]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
.../bindings/input/touchscreen/ti-tsc-adc.txt | 44 +++++++++
drivers/input/touchscreen/ti_am335x_tsc.c | 102 +++++++++++++++-----
2 files changed, 123 insertions(+), 23 deletions(-)
create mode 100644 Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
new file mode 100644
index 0000000..491c97b
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
@@ -0,0 +1,44 @@
+* TI - TSC ADC (Touschscreen and analog digital converter)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Required properties:
+- child "tsc"
+ ti,wires: Wires refer to application modes i.e. 4/5/8 wire touchscreen
+ support on the platform.
+ ti,x-plate-resistance: X plate resistance
+ ti,coordiante-readouts: The sequencer supports a total of 16
+ programmable steps each step is used to
+ read a single coordinate. A single
+ readout is enough but multiple reads can
+ increase the quality.
+ A value of 5 means, 5 reads for X, 5 for
+ Y and 2 for Z (always). This utilises 12
+ of the 16 software steps available. The
+ remaining 4 can be used by the ADC.
+ ti,wire-config: Different boards could have a different order for
+ connecting wires on touchscreen. We need to provide an
+ 8 bit number where in the 1st four bits represent the
+ analog lines and the next 4 bits represent positive/
+ negative terminal on that input line. Notations to
+ represent the input lines and terminals resoectively
+ is as follows:
+ AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+ XP = 0, XN = 1, YP = 2, YN = 3.
+- child "adc"
+ ti,adc-channels: List of analog inputs available for ADC.
+ AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+
+Example:
+ tscadc: tscadc@44e0d000 {
+ compatible = "ti,am3359-tscadc";
+ tsc {
+ ti,wires = <4>;
+ ti,x-plate-resistance = <200>;
+ ti,coordiante-readouts = <5>;
+ ti,wire-config = <0x00 0x11 0x22 0x33>;
+ };
+
+ adc {
+ ti,adc-channels = <4 5 6 7>;
+ };
+ }
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index b2f8a46..c876385 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -26,6 +26,8 @@
#include <linux/io.h>
#include <linux/input/ti_am335x_tsc.h>
#include <linux/delay.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
#include <linux/mfd/ti_am335x_tscadc.h>
@@ -47,7 +49,7 @@ struct titsc {
unsigned int wires;
unsigned int x_plate_resistance;
bool pen_down;
- int steps_to_configure;
+ int coordiante_readouts;
u32 config_inp[4];
u32 bit_xp, bit_xn, bit_yp, bit_yn;
u32 inp_xp, inp_xn, inp_yp, inp_yn;
@@ -123,7 +125,7 @@ static void titsc_step_config(struct titsc *ts_dev)
int i, total_steps;
/* Configure the Step registers */
- total_steps = 2 * ts_dev->steps_to_configure;
+ total_steps = 2 * ts_dev->coordiante_readouts;
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev->bit_xp;
@@ -141,7 +143,7 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
- for (i = 1; i <= ts_dev->steps_to_configure; i++) {
+ for (i = 1; i <= ts_dev->coordiante_readouts; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
@@ -163,7 +165,7 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
- for (i = (ts_dev->steps_to_configure + 1); i <= total_steps; i++) {
+ for (i = (ts_dev->coordiante_readouts + 1); i <= total_steps; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
@@ -218,7 +220,7 @@ static void titsc_read_coordinates(struct titsc *ts_dev,
read = titsc_readl(ts_dev, REG_FIFO0);
channel = read & 0xf0000;
channel = channel >> 0x10;
- if ((channel >= 0) && (channel < ts_dev->steps_to_configure)) {
+ if ((channel >= 0) && (channel < ts_dev->coordiante_readouts)) {
read &= 0xfff;
diff = abs(read - prev_val_x);
if (diff < prev_diff_x) {
@@ -231,8 +233,8 @@ static void titsc_read_coordinates(struct titsc *ts_dev,
read = titsc_readl(ts_dev, REG_FIFO1);
channel = read & 0xf0000;
channel = channel >> 0x10;
- if ((channel >= ts_dev->steps_to_configure) &&
- (channel < (2 * ts_dev->steps_to_configure - 1))) {
+ if ((channel >= ts_dev->coordiante_readouts) &&
+ (channel < (2 * ts_dev->coordiante_readouts - 1))) {
read &= 0xfff;
diff = abs(read - prev_val_y);
if (diff < prev_diff_y) {
@@ -310,6 +312,62 @@ static irqreturn_t titsc_irq(int irq, void *dev)
return IRQ_HANDLED;
}
+static int titsc_parse_dt(struct ti_tscadc_dev *tscadc_dev,
+ struct titsc *ts_dev)
+{
+ struct device_node *node = tscadc_dev->dev->of_node;
+ int err;
+
+ if (!node)
+ return -EINVAL;
+
+ node = of_get_child_by_name(node, "tsc");
+ if (!node)
+ return -EINVAL;
+ err = of_property_read_u32(node, "ti,wires", &ts_dev->wires);
+ if (err < 0)
+ return err;
+ switch (ts_dev->wires) {
+ case 4:
+ case 5:
+ case 8:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ err = of_property_read_u32(node, "ti,x-plate-resistance",
+ &ts_dev->x_plate_resistance);
+ if (err < 0)
+ return err;
+
+ err = of_property_read_u32(node, "ti,coordiante-readouts",
+ &ts_dev->coordiante_readouts);
+ if (err < 0)
+ return err;
+
+ return of_property_read_u32_array(node, "ti,wire-config",
+ ts_dev->config_inp, ARRAY_SIZE(ts_dev->config_inp));
+}
+
+static int titsc_parse_pdata(struct ti_tscadc_dev *tscadc_dev,
+ struct titsc *ts_dev)
+{
+ struct mfd_tscadc_board *pdata = tscadc_dev->dev->platform_data;
+
+ if (!pdata)
+ return -EINVAL;
+
+ ts_dev->wires = pdata->tsc_init->wires;
+ ts_dev->x_plate_resistance =
+ pdata->tsc_init->x_plate_resistance;
+ ts_dev->steps_to_configure =
+ pdata->tsc_init->steps_to_configure;
+ memcpy(ts_dev->config_inp, pdata->tsc_init->wire_config,
+ sizeof(pdata->tsc_init->wire_config));
+ return 0;
+}
+
/*
* The functions for inserting/removing driver as a module.
*/
@@ -319,16 +377,8 @@ static int titsc_probe(struct platform_device *pdev)
struct titsc *ts_dev;
struct input_dev *input_dev;
struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
- struct mfd_tscadc_board *pdata;
int err;
- pdata = tscadc_dev->dev->platform_data;
-
- if (!pdata) {
- dev_err(&pdev->dev, "Could not find platform data\n");
- return -EINVAL;
- }
-
/* Allocate memory for device */
ts_dev = kzalloc(sizeof(struct titsc), GFP_KERNEL);
input_dev = input_allocate_device();
@@ -342,11 +392,17 @@ static int titsc_probe(struct platform_device *pdev)
ts_dev->mfd_tscadc = tscadc_dev;
ts_dev->input = input_dev;
ts_dev->irq = tscadc_dev->irq;
- ts_dev->wires = pdata->tsc_init->wires;
- ts_dev->x_plate_resistance = pdata->tsc_init->x_plate_resistance;
- ts_dev->steps_to_configure = pdata->tsc_init->steps_to_configure;
- memcpy(ts_dev->config_inp, pdata->tsc_init->wire_config,
- sizeof(pdata->tsc_init->wire_config));
+
+ if (tscadc_dev->dev->platform_data)
+ err = titsc_parse_pdata(tscadc_dev, ts_dev);
+ else
+ err = titsc_parse_dt(tscadc_dev, ts_dev);
+
+ if (err) {
+ dev_err(&pdev->dev, "Could not find platform data\n");
+ err = -EINVAL;
+ goto err_free_mem;
+ }
err = request_irq(ts_dev->irq, titsc_irq,
0, pdev->dev.driver->name, ts_dev);
@@ -362,7 +418,7 @@ static int titsc_probe(struct platform_device *pdev)
goto err_free_irq;
}
titsc_step_config(ts_dev);
- titsc_writel(ts_dev, REG_FIFO0THR, ts_dev->steps_to_configure);
+ titsc_writel(ts_dev, REG_FIFO0THR, ts_dev->coordiante_readouts);
input_dev->name = "ti-tsc";
input_dev->dev.parent = &pdev->dev;
@@ -398,7 +454,7 @@ static int titsc_remove(struct platform_device *pdev)
free_irq(ts_dev->irq, ts_dev);
/* total steps followed by the enable mask */
- steps = 2 * ts_dev->steps_to_configure + 2;
+ steps = 2 * ts_dev->coordiante_readouts + 2;
steps = (1 << steps) - 1;
am335x_tsc_se_clr(ts_dev->mfd_tscadc, steps);
@@ -439,7 +495,7 @@ static int titsc_resume(struct device *dev)
}
titsc_step_config(ts_dev);
titsc_writel(ts_dev, REG_FIFO0THR,
- ts_dev->steps_to_configure);
+ ts_dev->coordiante_readouts);
return 0;
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 07/22] input/ti_am33x_tsc: remove platform_data support
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
This patch removes access to platform data mfd_tscadc_board because the
platform is DT only.
Acked-by: Dmitry Torokhov <dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 27 ++-------------------------
1 file changed, 2 insertions(+), 25 deletions(-)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index c876385..d247842 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -24,7 +24,6 @@
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/io.h>
-#include <linux/input/ti_am335x_tsc.h>
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/of_device.h>
@@ -350,24 +349,6 @@ static int titsc_parse_dt(struct ti_tscadc_dev *tscadc_dev,
ts_dev->config_inp, ARRAY_SIZE(ts_dev->config_inp));
}
-static int titsc_parse_pdata(struct ti_tscadc_dev *tscadc_dev,
- struct titsc *ts_dev)
-{
- struct mfd_tscadc_board *pdata = tscadc_dev->dev->platform_data;
-
- if (!pdata)
- return -EINVAL;
-
- ts_dev->wires = pdata->tsc_init->wires;
- ts_dev->x_plate_resistance =
- pdata->tsc_init->x_plate_resistance;
- ts_dev->steps_to_configure =
- pdata->tsc_init->steps_to_configure;
- memcpy(ts_dev->config_inp, pdata->tsc_init->wire_config,
- sizeof(pdata->tsc_init->wire_config));
- return 0;
-}
-
/*
* The functions for inserting/removing driver as a module.
*/
@@ -393,13 +374,9 @@ static int titsc_probe(struct platform_device *pdev)
ts_dev->input = input_dev;
ts_dev->irq = tscadc_dev->irq;
- if (tscadc_dev->dev->platform_data)
- err = titsc_parse_pdata(tscadc_dev, ts_dev);
- else
- err = titsc_parse_dt(tscadc_dev, ts_dev);
-
+ err = titsc_parse_dt(tscadc_dev, ts_dev);
if (err) {
- dev_err(&pdev->dev, "Could not find platform data\n");
+ dev_err(&pdev->dev, "Could not find valid DT data.\n");
err = -EINVAL;
goto err_free_mem;
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 07/22] input/ti_am33x_tsc: remove platform_data support
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
This patch removes access to platform data mfd_tscadc_board because the
platform is DT only.
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 27 ++-------------------------
1 file changed, 2 insertions(+), 25 deletions(-)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index c876385..d247842 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -24,7 +24,6 @@
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/io.h>
-#include <linux/input/ti_am335x_tsc.h>
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/of_device.h>
@@ -350,24 +349,6 @@ static int titsc_parse_dt(struct ti_tscadc_dev *tscadc_dev,
ts_dev->config_inp, ARRAY_SIZE(ts_dev->config_inp));
}
-static int titsc_parse_pdata(struct ti_tscadc_dev *tscadc_dev,
- struct titsc *ts_dev)
-{
- struct mfd_tscadc_board *pdata = tscadc_dev->dev->platform_data;
-
- if (!pdata)
- return -EINVAL;
-
- ts_dev->wires = pdata->tsc_init->wires;
- ts_dev->x_plate_resistance =
- pdata->tsc_init->x_plate_resistance;
- ts_dev->steps_to_configure =
- pdata->tsc_init->steps_to_configure;
- memcpy(ts_dev->config_inp, pdata->tsc_init->wire_config,
- sizeof(pdata->tsc_init->wire_config));
- return 0;
-}
-
/*
* The functions for inserting/removing driver as a module.
*/
@@ -393,13 +374,9 @@ static int titsc_probe(struct platform_device *pdev)
ts_dev->input = input_dev;
ts_dev->irq = tscadc_dev->irq;
- if (tscadc_dev->dev->platform_data)
- err = titsc_parse_pdata(tscadc_dev, ts_dev);
- else
- err = titsc_parse_dt(tscadc_dev, ts_dev);
-
+ err = titsc_parse_dt(tscadc_dev, ts_dev);
if (err) {
- dev_err(&pdev->dev, "Could not find platform data\n");
+ dev_err(&pdev->dev, "Could not find valid DT data.\n");
err = -EINVAL;
goto err_free_mem;
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 08/22] iio/ti_am335x_adc: Add DT support
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Patil, Rachna, Pantelis Antoniou,
Sebastian Andrzej Siewior
From: "Patil, Rachna" <rachna-l0cyMroinI0@public.gmane.org>
Add DT support for client ADC driver.
[ panto-wVdstyuyKrO8r51toPun2/C9HSW9iNxf@public.gmane.org : use of_get_child_by_name
instead of of_find_node_by_name ]
Acked-by: Jonathan Cameron <jic23-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Signed-off-by: Pantelis Antoniou <panto-wVdstyuyKrO8r51toPun2/C9HSW9iNxf@public.gmane.org>
Signed-off-by: Patil, Rachna <rachna-l0cyMroinI0@public.gmane.org>
Signed-off-by: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>
[bigeasy: shift the code to the left, fix clean up on
of_get_child_by_name() failer]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/iio/adc/ti_am335x_adc.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 543b9c4..95bcd56 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -22,6 +22,8 @@
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/iio/iio.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
#include <linux/mfd/ti_am335x_tscadc.h>
#include <linux/platform_data/ti_am335x_adc.h>
@@ -152,11 +154,12 @@ static int tiadc_probe(struct platform_device *pdev)
struct iio_dev *indio_dev;
struct tiadc_device *adc_dev;
struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
- struct mfd_tscadc_board *pdata;
+ struct mfd_tscadc_board *pdata = tscadc_dev->dev->platform_data;
+ struct device_node *node = tscadc_dev->dev->of_node;
int err;
+ u32 val32;
- pdata = tscadc_dev->dev->platform_data;
- if (!pdata || !pdata->adc_init) {
+ if (!pdata && !node) {
dev_err(&pdev->dev, "Could not find platform data\n");
return -EINVAL;
}
@@ -170,7 +173,21 @@ static int tiadc_probe(struct platform_device *pdev)
adc_dev = iio_priv(indio_dev);
adc_dev->mfd_tscadc = tscadc_dev;
- adc_dev->channels = pdata->adc_init->adc_channels;
+
+ if (pdata)
+ adc_dev->channels = pdata->adc_init->adc_channels;
+ else {
+ node = of_get_child_by_name(node, "adc");
+ if (!node) {
+ err = -EINVAL;
+ goto err_free_device;
+ }
+ err = of_property_read_u32(node,
+ "ti,adc-channels", &val32);
+ if (err < 0)
+ goto err_free_device;
+ adc_dev->channels = val32;
+ }
indio_dev->dev.parent = &pdev->dev;
indio_dev->name = dev_name(&pdev->dev);
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 08/22] iio/ti_am335x_adc: Add DT support
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Patil, Rachna, Pantelis Antoniou,
Sebastian Andrzej Siewior
From: "Patil, Rachna" <rachna@ti.com>
Add DT support for client ADC driver.
[ panto@antoniou-consulting.com : use of_get_child_by_name
instead of of_find_node_by_name ]
Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Patil, Rachna <rachna@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
[bigeasy: shift the code to the left, fix clean up on
of_get_child_by_name() failer]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/iio/adc/ti_am335x_adc.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 543b9c4..95bcd56 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -22,6 +22,8 @@
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/iio/iio.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
#include <linux/mfd/ti_am335x_tscadc.h>
#include <linux/platform_data/ti_am335x_adc.h>
@@ -152,11 +154,12 @@ static int tiadc_probe(struct platform_device *pdev)
struct iio_dev *indio_dev;
struct tiadc_device *adc_dev;
struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
- struct mfd_tscadc_board *pdata;
+ struct mfd_tscadc_board *pdata = tscadc_dev->dev->platform_data;
+ struct device_node *node = tscadc_dev->dev->of_node;
int err;
+ u32 val32;
- pdata = tscadc_dev->dev->platform_data;
- if (!pdata || !pdata->adc_init) {
+ if (!pdata && !node) {
dev_err(&pdev->dev, "Could not find platform data\n");
return -EINVAL;
}
@@ -170,7 +173,21 @@ static int tiadc_probe(struct platform_device *pdev)
adc_dev = iio_priv(indio_dev);
adc_dev->mfd_tscadc = tscadc_dev;
- adc_dev->channels = pdata->adc_init->adc_channels;
+
+ if (pdata)
+ adc_dev->channels = pdata->adc_init->adc_channels;
+ else {
+ node = of_get_child_by_name(node, "adc");
+ if (!node) {
+ err = -EINVAL;
+ goto err_free_device;
+ }
+ err = of_property_read_u32(node,
+ "ti,adc-channels", &val32);
+ if (err < 0)
+ goto err_free_device;
+ adc_dev->channels = val32;
+ }
indio_dev->dev.parent = &pdev->dev;
indio_dev->name = dev_name(&pdev->dev);
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 14/22] arm/am33xx: add TSC/ADC mfd device support
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Patil, Rachna, Pantelis Antoniou,
Sebastian Andrzej Siewior
From: "Patil, Rachna" <rachna-l0cyMroinI0@public.gmane.org>
Add support for core multifunctional device along
with its clients touchscreen and ADC.
[ panto-wVdstyuyKrO8r51toPun2/C9HSW9iNxf@public.gmane.org : make sure status is
set to 'disabled' in dtsi file. ]
Signed-off-by: Pantelis Antoniou <panto-wVdstyuyKrO8r51toPun2/C9HSW9iNxf@public.gmane.org>
Signed-off-by: Patil, Rachna <rachna-l0cyMroinI0@public.gmane.org>
Signed-off-by: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>
[bigeasy: add 'status = "okay"']
Signed-off-by: Sebastian Andrzej Siewior <sebastian-E0PNVn5OA6ohrxcnuTQ+TQ@public.gmane.org>
---
arch/arm/boot/dts/am335x-evm.dts | 14 ++++++++++++++
arch/arm/boot/dts/am33xx.dtsi | 9 +++++++++
2 files changed, 23 insertions(+)
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 0423298..26fea97 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -244,3 +244,17 @@
&cpsw_emac1 {
phy_id = <&davinci_mdio>, <1>;
};
+
+&tscadc {
+ status = "okay";
+ tsc {
+ ti,wires = <4>;
+ ti,x-plate-resistance = <200>;
+ ti,coordiante-readouts = <5>;
+ ti,wire-config = <0x00 0x11 0x22 0x33>;
+ };
+
+ adc {
+ ti,adc-channels = <4>;
+ };
+};
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 1460d9b..cc0656a 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -404,6 +404,15 @@
ti,hwmods = "wkup_m3";
};
+ tscadc: tscadc@44e0d000 {
+ compatible = "ti,am3359-tscadc";
+ reg = <0x44e0d000 0x1000>;
+ interrupt-parent = <&intc>;
+ interrupts = <16>;
+ ti,hwmods = "adc_tsc";
+ status = "disabled";
+ };
+
gpmc: gpmc@50000000 {
compatible = "ti,am3352-gpmc";
ti,hwmods = "gpmc";
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 14/22] arm/am33xx: add TSC/ADC mfd device support
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Patil, Rachna, Pantelis Antoniou,
Sebastian Andrzej Siewior
From: "Patil, Rachna" <rachna@ti.com>
Add support for core multifunctional device along
with its clients touchscreen and ADC.
[ panto@antoniou-consulting.com : make sure status is
set to 'disabled' in dtsi file. ]
Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Patil, Rachna <rachna@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
[bigeasy: add 'status = "okay"']
Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
---
arch/arm/boot/dts/am335x-evm.dts | 14 ++++++++++++++
arch/arm/boot/dts/am33xx.dtsi | 9 +++++++++
2 files changed, 23 insertions(+)
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 0423298..26fea97 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -244,3 +244,17 @@
&cpsw_emac1 {
phy_id = <&davinci_mdio>, <1>;
};
+
+&tscadc {
+ status = "okay";
+ tsc {
+ ti,wires = <4>;
+ ti,x-plate-resistance = <200>;
+ ti,coordiante-readouts = <5>;
+ ti,wire-config = <0x00 0x11 0x22 0x33>;
+ };
+
+ adc {
+ ti,adc-channels = <4>;
+ };
+};
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 1460d9b..cc0656a 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -404,6 +404,15 @@
ti,hwmods = "wkup_m3";
};
+ tscadc: tscadc@44e0d000 {
+ compatible = "ti,am3359-tscadc";
+ reg = <0x44e0d000 0x1000>;
+ interrupt-parent = <&intc>;
+ interrupts = <16>;
+ ti,hwmods = "adc_tsc";
+ status = "disabled";
+ };
+
gpmc: gpmc@50000000 {
compatible = "ti,am3352-gpmc";
ti,hwmods = "gpmc";
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 16/22] mfd & input/ti_am335x_tsc: rename device from tsc to TI-am335x-tsc
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
tsc is a very generic name. This patch adds a TI and HW prefix to it
less generic.
While here add an alias so the driver is loaded on demand.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 3 ++-
drivers/mfd/ti_am335x_tscadc.c | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index d247842..7a76b14 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -489,11 +489,12 @@ static struct platform_driver ti_tsc_driver = {
.probe = titsc_probe,
.remove = titsc_remove,
.driver = {
- .name = "tsc",
+ .name = "TI-am335x-tsc",
.owner = THIS_MODULE,
.pm = TITSC_PM_OPS,
},
};
+MODULE_ALIAS("platform:TI-am335x-tsc");
module_platform_driver(ti_tsc_driver);
MODULE_DESCRIPTION("TI touchscreen controller driver");
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 857b6e8..ba9235a 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -194,7 +194,7 @@ static int ti_tscadc_probe(struct platform_device *pdev)
if (tsc_wires > 0) {
tscadc->tsc_cell = tscadc->used_cells;
cell = &tscadc->cells[tscadc->used_cells++];
- cell->name = "tsc";
+ cell->name = "TI-am335x-tsc";
cell->platform_data = &tscadc;
cell->pdata_size = sizeof(tscadc);
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 16/22] mfd & input/ti_am335x_tsc: rename device from tsc to TI-am335x-tsc
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
tsc is a very generic name. This patch adds a TI and HW prefix to it
less generic.
While here add an alias so the driver is loaded on demand.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 3 ++-
drivers/mfd/ti_am335x_tscadc.c | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index d247842..7a76b14 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -489,11 +489,12 @@ static struct platform_driver ti_tsc_driver = {
.probe = titsc_probe,
.remove = titsc_remove,
.driver = {
- .name = "tsc",
+ .name = "TI-am335x-tsc",
.owner = THIS_MODULE,
.pm = TITSC_PM_OPS,
},
};
+MODULE_ALIAS("platform:TI-am335x-tsc");
module_platform_driver(ti_tsc_driver);
MODULE_DESCRIPTION("TI touchscreen controller driver");
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 857b6e8..ba9235a 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -194,7 +194,7 @@ static int ti_tscadc_probe(struct platform_device *pdev)
if (tsc_wires > 0) {
tscadc->tsc_cell = tscadc->used_cells;
cell = &tscadc->cells[tscadc->used_cells++];
- cell->name = "tsc";
+ cell->name = "TI-am335x-tsc";
cell->platform_data = &tscadc;
cell->pdata_size = sizeof(tscadc);
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 17/22] mfd & iio/ti_am335x_adc: rename device from tiadc to TI-am335x-adc
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
TI-adc reads a little better compared to tiadc. And if we add am335x to
it then we have the same naming scheme as the tsc side.
While here add an alias so the driver is loaded on demand.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/iio/adc/ti_am335x_adc.c | 4 ++--
drivers/mfd/ti_am335x_tscadc.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index c6695a8..38f2415 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -318,14 +318,14 @@ static const struct dev_pm_ops tiadc_pm_ops = {
static struct platform_driver tiadc_driver = {
.driver = {
- .name = "tiadc",
+ .name = "TI-am335x-adc",
.owner = THIS_MODULE,
.pm = TIADC_PM_OPS,
},
.probe = tiadc_probe,
.remove = tiadc_remove,
};
-
+MODULE_ALIAS("platform:TI-am335x-adc");
module_platform_driver(tiadc_driver);
MODULE_DESCRIPTION("TI ADC controller driver");
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index ba9235a..8bdab8d 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -203,7 +203,7 @@ static int ti_tscadc_probe(struct platform_device *pdev)
if (adc_channels > 0) {
tscadc->adc_cell = tscadc->used_cells;
cell = &tscadc->cells[tscadc->used_cells++];
- cell->name = "tiadc";
+ cell->name = "TI-am335x-adc";
cell->platform_data = &tscadc;
cell->pdata_size = sizeof(tscadc);
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 17/22] mfd & iio/ti_am335x_adc: rename device from tiadc to TI-am335x-adc
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
TI-adc reads a little better compared to tiadc. And if we add am335x to
it then we have the same naming scheme as the tsc side.
While here add an alias so the driver is loaded on demand.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/iio/adc/ti_am335x_adc.c | 4 ++--
drivers/mfd/ti_am335x_tscadc.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index c6695a8..38f2415 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -318,14 +318,14 @@ static const struct dev_pm_ops tiadc_pm_ops = {
static struct platform_driver tiadc_driver = {
.driver = {
- .name = "tiadc",
+ .name = "TI-am335x-adc",
.owner = THIS_MODULE,
.pm = TIADC_PM_OPS,
},
.probe = tiadc_probe,
.remove = tiadc_remove,
};
-
+MODULE_ALIAS("platform:TI-am335x-adc");
module_platform_driver(tiadc_driver);
MODULE_DESCRIPTION("TI ADC controller driver");
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index ba9235a..8bdab8d 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -203,7 +203,7 @@ static int ti_tscadc_probe(struct platform_device *pdev)
if (adc_channels > 0) {
tscadc->adc_cell = tscadc->used_cells;
cell = &tscadc->cells[tscadc->used_cells++];
- cell->name = "tiadc";
+ cell->name = "TI-am335x-adc";
cell->platform_data = &tscadc;
cell->pdata_size = sizeof(tscadc);
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
[parent not found: <1370449495-29981-18-git-send-email-bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>]
* Re: [PATCH 17/22] mfd & iio/ti_am335x_adc: rename device from tiadc to TI-am335x-adc
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-08 9:19 ` Jonathan Cameron
-1 siblings, 0 replies; 64+ messages in thread
From: Jonathan Cameron @ 2013-06-08 9:19 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: Samuel Ortiz, Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron
On 06/05/2013 05:24 PM, Sebastian Andrzej Siewior wrote:
> TI-adc reads a little better compared to tiadc. And if we add am335x to
> it then we have the same naming scheme as the tsc side.
> While here add an alias so the driver is loaded on demand.
Good, I also prefer this naming.
>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
Acked-by: Jonathan Cameron <jic23-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> ---
> drivers/iio/adc/ti_am335x_adc.c | 4 ++--
> drivers/mfd/ti_am335x_tscadc.c | 2 +-
> 2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
> index c6695a8..38f2415 100644
> --- a/drivers/iio/adc/ti_am335x_adc.c
> +++ b/drivers/iio/adc/ti_am335x_adc.c
> @@ -318,14 +318,14 @@ static const struct dev_pm_ops tiadc_pm_ops = {
>
> static struct platform_driver tiadc_driver = {
> .driver = {
> - .name = "tiadc",
> + .name = "TI-am335x-adc",
> .owner = THIS_MODULE,
> .pm = TIADC_PM_OPS,
> },
> .probe = tiadc_probe,
> .remove = tiadc_remove,
> };
> -
> +MODULE_ALIAS("platform:TI-am335x-adc");
> module_platform_driver(tiadc_driver);
>
> MODULE_DESCRIPTION("TI ADC controller driver");
> diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
> index ba9235a..8bdab8d 100644
> --- a/drivers/mfd/ti_am335x_tscadc.c
> +++ b/drivers/mfd/ti_am335x_tscadc.c
> @@ -203,7 +203,7 @@ static int ti_tscadc_probe(struct platform_device *pdev)
> if (adc_channels > 0) {
> tscadc->adc_cell = tscadc->used_cells;
> cell = &tscadc->cells[tscadc->used_cells++];
> - cell->name = "tiadc";
> + cell->name = "TI-am335x-adc";
> cell->platform_data = &tscadc;
> cell->pdata_size = sizeof(tscadc);
> }
>
^ permalink raw reply [flat|nested] 64+ messages in thread
* Re: [PATCH 17/22] mfd & iio/ti_am335x_adc: rename device from tiadc to TI-am335x-adc
@ 2013-06-08 9:19 ` Jonathan Cameron
0 siblings, 0 replies; 64+ messages in thread
From: Jonathan Cameron @ 2013-06-08 9:19 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: Samuel Ortiz, Felipe Balbi, linux-iio, linux-input,
Dmitry Torokhov, Jonathan Cameron
On 06/05/2013 05:24 PM, Sebastian Andrzej Siewior wrote:
> TI-adc reads a little better compared to tiadc. And if we add am335x to
> it then we have the same naming scheme as the tsc side.
> While here add an alias so the driver is loaded on demand.
Good, I also prefer this naming.
>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: Jonathan Cameron <jic23@kernel.org>
> ---
> drivers/iio/adc/ti_am335x_adc.c | 4 ++--
> drivers/mfd/ti_am335x_tscadc.c | 2 +-
> 2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
> index c6695a8..38f2415 100644
> --- a/drivers/iio/adc/ti_am335x_adc.c
> +++ b/drivers/iio/adc/ti_am335x_adc.c
> @@ -318,14 +318,14 @@ static const struct dev_pm_ops tiadc_pm_ops = {
>
> static struct platform_driver tiadc_driver = {
> .driver = {
> - .name = "tiadc",
> + .name = "TI-am335x-adc",
> .owner = THIS_MODULE,
> .pm = TIADC_PM_OPS,
> },
> .probe = tiadc_probe,
> .remove = tiadc_remove,
> };
> -
> +MODULE_ALIAS("platform:TI-am335x-adc");
> module_platform_driver(tiadc_driver);
>
> MODULE_DESCRIPTION("TI ADC controller driver");
> diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
> index ba9235a..8bdab8d 100644
> --- a/drivers/mfd/ti_am335x_tscadc.c
> +++ b/drivers/mfd/ti_am335x_tscadc.c
> @@ -203,7 +203,7 @@ static int ti_tscadc_probe(struct platform_device *pdev)
> if (adc_channels > 0) {
> tscadc->adc_cell = tscadc->used_cells;
> cell = &tscadc->cells[tscadc->used_cells++];
> - cell->name = "tiadc";
> + cell->name = "TI-am335x-adc";
> cell->platform_data = &tscadc;
> cell->pdata_size = sizeof(tscadc);
> }
>
^ permalink raw reply [flat|nested] 64+ messages in thread
* [PATCH 18/22] input/ti_am335x_adc: use only FIFO0 and clean up a little
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The driver programs a threshold of "coordiante_readouts" say 5. The
REG_FIFO0THR registers says it should it be programmed to "threshold
minus one". The driver does not expect just 5 coordinates but 5 * 2 + 2.
Multiplied by two because 5 for X and 5 for Y and plus 2 because we have
two Z.
The whole thing kind of works because It reads the 5 coordinates for X
and Y from FIFO0 and FIFO1 and the last element in each FIFO is ignored
within the loop and read later.
Nothing guaranties that FIFO1 is ready by the time it is read. In fact I
could see that that FIFO1 reaturns for Y channels 8,9, 10, 12, 6 and for
Y channel 7 for Z. The problem is that channel 7 and channel 12 got
somehow mixed up.
The other Problem is that FIFO1 is also used by the IIO part leading to
wrong results if both (tsc & adc) are used.
The patch tries to clean up the whole thing a little:
- Remove the +1 and -1 in REG_STEPCONFIG, REG_STEPDELAY and its counter
part in the for loop. This is just confusing.
- Use only FIFO0 in TSC. The fifo has space for 64 entries so should be
fine.
- Read the whole FIFO in one function and check the channel.
- in case we dawdle around, make sure we only read a multiple of our
coordinate set. On the second interrupt we will cleanup the remaining
enties.
Acked-by: Dmitry Torokhov <dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/iio/adc/ti_am335x_adc.c | 2 +-
drivers/input/touchscreen/ti_am335x_tsc.c | 78 +++++++++++++++--------------
include/linux/mfd/ti_am335x_tscadc.h | 4 +-
3 files changed, 44 insertions(+), 40 deletions(-)
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 38f2415..031f8e5 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -76,7 +76,7 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
- for (i = (steps + 1); i <= TOTAL_STEPS; i++) {
+ for (i = steps; i < TOTAL_STEPS; i++) {
tiadc_writel(adc_dev, REG_STEPCONFIG(i),
stepconfig | STEPCONFIG_INP(channels));
tiadc_writel(adc_dev, REG_STEPDELAY(i),
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 7a76b14..fa9692c 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -120,11 +120,9 @@ static int titsc_config_wires(struct titsc *ts_dev)
static void titsc_step_config(struct titsc *ts_dev)
{
unsigned int config;
- unsigned int stepenable = 0;
- int i, total_steps;
-
- /* Configure the Step registers */
- total_steps = 2 * ts_dev->coordiante_readouts;
+ int i;
+ int end_step;
+ u32 stepenable;
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev->bit_xp;
@@ -142,7 +140,9 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
- for (i = 1; i <= ts_dev->coordiante_readouts; i++) {
+ /* 1 … coordiante_readouts is for X */
+ end_step = ts_dev->coordiante_readouts;
+ for (i = 0; i < end_step; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
@@ -150,7 +150,7 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev->bit_yn |
- STEPCONFIG_INM_ADCREFM | STEPCONFIG_FIFO1;
+ STEPCONFIG_INM_ADCREFM;
switch (ts_dev->wires) {
case 4:
config |= ts_dev->bit_yp | STEPCONFIG_INP(ts_dev->inp_xp);
@@ -164,12 +164,13 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
- for (i = (ts_dev->coordiante_readouts + 1); i <= total_steps; i++) {
+ /* coordiante_readouts … coordiante_readouts * 2 is for Y */
+ end_step = ts_dev->coordiante_readouts * 2;
+ for (i = ts_dev->coordiante_readouts; i < end_step; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
- config = 0;
/* Charge step configuration */
config = ts_dev->bit_xp | ts_dev->bit_yn |
STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR |
@@ -178,35 +179,39 @@ static void titsc_step_config(struct titsc *ts_dev)
titsc_writel(ts_dev, REG_CHARGECONFIG, config);
titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY);
- config = 0;
- /* Configure to calculate pressure */
+ /* coordiante_readouts * 2 … coordiante_readouts * 2 + 2 is for Z */
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev->bit_yp |
ts_dev->bit_xn | STEPCONFIG_INM_ADCREFM |
STEPCONFIG_INP(ts_dev->inp_xp);
- titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 1), config);
- titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 1),
+ titsc_writel(ts_dev, REG_STEPCONFIG(end_step), config);
+ titsc_writel(ts_dev, REG_STEPDELAY(end_step),
STEPCONFIG_OPENDLY);
- config |= STEPCONFIG_INP(ts_dev->inp_yn) | STEPCONFIG_FIFO1;
- titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 2), config);
- titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 2),
+ end_step++;
+ config |= STEPCONFIG_INP(ts_dev->inp_yn);
+ titsc_writel(ts_dev, REG_STEPCONFIG(end_step), config);
+ titsc_writel(ts_dev, REG_STEPDELAY(end_step),
STEPCONFIG_OPENDLY);
/* The steps1 … end and bit 0 for TS_Charge */
- stepenable = (1 << (total_steps + 2)) - 1;
+ stepenable = (1 << (end_step + 2)) - 1;
am335x_tsc_se_set(ts_dev->mfd_tscadc, stepenable);
}
static void titsc_read_coordinates(struct titsc *ts_dev,
- unsigned int *x, unsigned int *y)
+ u32 *x, u32 *y, u32 *z1, u32 *z2)
{
unsigned int fifocount = titsc_readl(ts_dev, REG_FIFO0CNT);
unsigned int prev_val_x = ~0, prev_val_y = ~0;
unsigned int prev_diff_x = ~0, prev_diff_y = ~0;
unsigned int read, diff;
unsigned int i, channel;
+ unsigned int creads = ts_dev->coordiante_readouts;
+ *z1 = *z2 = 0;
+ if (fifocount % (creads * 2 + 2))
+ fifocount -= fifocount % (creads * 2 + 2);
/*
* Delta filter is used to remove large variations in sampled
* values from ADC. The filter tries to predict where the next
@@ -215,32 +220,32 @@ static void titsc_read_coordinates(struct titsc *ts_dev,
* algorithm compares the difference with that of a present value,
* if true the value is reported to the sub system.
*/
- for (i = 0; i < fifocount - 1; i++) {
+ for (i = 0; i < fifocount; i++) {
read = titsc_readl(ts_dev, REG_FIFO0);
- channel = read & 0xf0000;
- channel = channel >> 0x10;
- if ((channel >= 0) && (channel < ts_dev->coordiante_readouts)) {
- read &= 0xfff;
+
+ channel = (read & 0xf0000) >> 16;
+ read &= 0xfff;
+ if (channel < creads) {
diff = abs(read - prev_val_x);
if (diff < prev_diff_x) {
prev_diff_x = diff;
*x = read;
}
prev_val_x = read;
- }
- read = titsc_readl(ts_dev, REG_FIFO1);
- channel = read & 0xf0000;
- channel = channel >> 0x10;
- if ((channel >= ts_dev->coordiante_readouts) &&
- (channel < (2 * ts_dev->coordiante_readouts - 1))) {
- read &= 0xfff;
+ } else if (channel < creads * 2) {
diff = abs(read - prev_val_y);
if (diff < prev_diff_y) {
prev_diff_y = diff;
*y = read;
}
prev_val_y = read;
+
+ } else if (channel < creads * 2 + 1) {
+ *z1 = read;
+
+ } else if (channel < creads * 2 + 2) {
+ *z2 = read;
}
}
}
@@ -256,10 +261,8 @@ static irqreturn_t titsc_irq(int irq, void *dev)
status = titsc_readl(ts_dev, REG_IRQSTATUS);
if (status & IRQENB_FIFO0THRES) {
- titsc_read_coordinates(ts_dev, &x, &y);
- z1 = titsc_readl(ts_dev, REG_FIFO0) & 0xfff;
- z2 = titsc_readl(ts_dev, REG_FIFO1) & 0xfff;
+ titsc_read_coordinates(ts_dev, &x, &y, &z1, &z2);
if (ts_dev->pen_down && z1 != 0 && z2 != 0) {
/*
@@ -267,10 +270,10 @@ static irqreturn_t titsc_irq(int irq, void *dev)
* Resistance(touch) = x plate resistance *
* x postion/4096 * ((z2 / z1) - 1)
*/
- z = z2 - z1;
+ z = z1 - z2;
z *= x;
z *= ts_dev->x_plate_resistance;
- z /= z1;
+ z /= z2;
z = (z + 2047) >> 12;
if (z <= MAX_12BIT) {
@@ -395,7 +398,8 @@ static int titsc_probe(struct platform_device *pdev)
goto err_free_irq;
}
titsc_step_config(ts_dev);
- titsc_writel(ts_dev, REG_FIFO0THR, ts_dev->coordiante_readouts);
+ titsc_writel(ts_dev, REG_FIFO0THR,
+ ts_dev->coordiante_readouts * 2 + 2 - 1);
input_dev->name = "ti-tsc";
input_dev->dev.parent = &pdev->dev;
@@ -472,7 +476,7 @@ static int titsc_resume(struct device *dev)
}
titsc_step_config(ts_dev);
titsc_writel(ts_dev, REG_FIFO0THR,
- ts_dev->coordiante_readouts);
+ ts_dev->coordiante_readouts * 2 + 2 - 1);
return 0;
}
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index cd8686b..fe6223c 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -30,8 +30,8 @@
#define REG_IDLECONFIG 0x058
#define REG_CHARGECONFIG 0x05C
#define REG_CHARGEDELAY 0x060
-#define REG_STEPCONFIG(n) (0x64 + ((n - 1) * 8))
-#define REG_STEPDELAY(n) (0x68 + ((n - 1) * 8))
+#define REG_STEPCONFIG(n) (0x64 + ((n) * 8))
+#define REG_STEPDELAY(n) (0x68 + ((n) * 8))
#define REG_FIFO0CNT 0xE4
#define REG_FIFO0THR 0xE8
#define REG_FIFO1CNT 0xF0
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 18/22] input/ti_am335x_adc: use only FIFO0 and clean up a little
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The driver programs a threshold of "coordiante_readouts" say 5. The
REG_FIFO0THR registers says it should it be programmed to "threshold
minus one". The driver does not expect just 5 coordinates but 5 * 2 + 2.
Multiplied by two because 5 for X and 5 for Y and plus 2 because we have
two Z.
The whole thing kind of works because It reads the 5 coordinates for X
and Y from FIFO0 and FIFO1 and the last element in each FIFO is ignored
within the loop and read later.
Nothing guaranties that FIFO1 is ready by the time it is read. In fact I
could see that that FIFO1 reaturns for Y channels 8,9, 10, 12, 6 and for
Y channel 7 for Z. The problem is that channel 7 and channel 12 got
somehow mixed up.
The other Problem is that FIFO1 is also used by the IIO part leading to
wrong results if both (tsc & adc) are used.
The patch tries to clean up the whole thing a little:
- Remove the +1 and -1 in REG_STEPCONFIG, REG_STEPDELAY and its counter
part in the for loop. This is just confusing.
- Use only FIFO0 in TSC. The fifo has space for 64 entries so should be
fine.
- Read the whole FIFO in one function and check the channel.
- in case we dawdle around, make sure we only read a multiple of our
coordinate set. On the second interrupt we will cleanup the remaining
enties.
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/iio/adc/ti_am335x_adc.c | 2 +-
drivers/input/touchscreen/ti_am335x_tsc.c | 78 +++++++++++++++--------------
include/linux/mfd/ti_am335x_tscadc.h | 4 +-
3 files changed, 44 insertions(+), 40 deletions(-)
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 38f2415..031f8e5 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -76,7 +76,7 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
- for (i = (steps + 1); i <= TOTAL_STEPS; i++) {
+ for (i = steps; i < TOTAL_STEPS; i++) {
tiadc_writel(adc_dev, REG_STEPCONFIG(i),
stepconfig | STEPCONFIG_INP(channels));
tiadc_writel(adc_dev, REG_STEPDELAY(i),
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 7a76b14..fa9692c 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -120,11 +120,9 @@ static int titsc_config_wires(struct titsc *ts_dev)
static void titsc_step_config(struct titsc *ts_dev)
{
unsigned int config;
- unsigned int stepenable = 0;
- int i, total_steps;
-
- /* Configure the Step registers */
- total_steps = 2 * ts_dev->coordiante_readouts;
+ int i;
+ int end_step;
+ u32 stepenable;
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev->bit_xp;
@@ -142,7 +140,9 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
- for (i = 1; i <= ts_dev->coordiante_readouts; i++) {
+ /* 1 … coordiante_readouts is for X */
+ end_step = ts_dev->coordiante_readouts;
+ for (i = 0; i < end_step; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
@@ -150,7 +150,7 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev->bit_yn |
- STEPCONFIG_INM_ADCREFM | STEPCONFIG_FIFO1;
+ STEPCONFIG_INM_ADCREFM;
switch (ts_dev->wires) {
case 4:
config |= ts_dev->bit_yp | STEPCONFIG_INP(ts_dev->inp_xp);
@@ -164,12 +164,13 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
- for (i = (ts_dev->coordiante_readouts + 1); i <= total_steps; i++) {
+ /* coordiante_readouts … coordiante_readouts * 2 is for Y */
+ end_step = ts_dev->coordiante_readouts * 2;
+ for (i = ts_dev->coordiante_readouts; i < end_step; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
- config = 0;
/* Charge step configuration */
config = ts_dev->bit_xp | ts_dev->bit_yn |
STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR |
@@ -178,35 +179,39 @@ static void titsc_step_config(struct titsc *ts_dev)
titsc_writel(ts_dev, REG_CHARGECONFIG, config);
titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY);
- config = 0;
- /* Configure to calculate pressure */
+ /* coordiante_readouts * 2 … coordiante_readouts * 2 + 2 is for Z */
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev->bit_yp |
ts_dev->bit_xn | STEPCONFIG_INM_ADCREFM |
STEPCONFIG_INP(ts_dev->inp_xp);
- titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 1), config);
- titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 1),
+ titsc_writel(ts_dev, REG_STEPCONFIG(end_step), config);
+ titsc_writel(ts_dev, REG_STEPDELAY(end_step),
STEPCONFIG_OPENDLY);
- config |= STEPCONFIG_INP(ts_dev->inp_yn) | STEPCONFIG_FIFO1;
- titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 2), config);
- titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 2),
+ end_step++;
+ config |= STEPCONFIG_INP(ts_dev->inp_yn);
+ titsc_writel(ts_dev, REG_STEPCONFIG(end_step), config);
+ titsc_writel(ts_dev, REG_STEPDELAY(end_step),
STEPCONFIG_OPENDLY);
/* The steps1 … end and bit 0 for TS_Charge */
- stepenable = (1 << (total_steps + 2)) - 1;
+ stepenable = (1 << (end_step + 2)) - 1;
am335x_tsc_se_set(ts_dev->mfd_tscadc, stepenable);
}
static void titsc_read_coordinates(struct titsc *ts_dev,
- unsigned int *x, unsigned int *y)
+ u32 *x, u32 *y, u32 *z1, u32 *z2)
{
unsigned int fifocount = titsc_readl(ts_dev, REG_FIFO0CNT);
unsigned int prev_val_x = ~0, prev_val_y = ~0;
unsigned int prev_diff_x = ~0, prev_diff_y = ~0;
unsigned int read, diff;
unsigned int i, channel;
+ unsigned int creads = ts_dev->coordiante_readouts;
+ *z1 = *z2 = 0;
+ if (fifocount % (creads * 2 + 2))
+ fifocount -= fifocount % (creads * 2 + 2);
/*
* Delta filter is used to remove large variations in sampled
* values from ADC. The filter tries to predict where the next
@@ -215,32 +220,32 @@ static void titsc_read_coordinates(struct titsc *ts_dev,
* algorithm compares the difference with that of a present value,
* if true the value is reported to the sub system.
*/
- for (i = 0; i < fifocount - 1; i++) {
+ for (i = 0; i < fifocount; i++) {
read = titsc_readl(ts_dev, REG_FIFO0);
- channel = read & 0xf0000;
- channel = channel >> 0x10;
- if ((channel >= 0) && (channel < ts_dev->coordiante_readouts)) {
- read &= 0xfff;
+
+ channel = (read & 0xf0000) >> 16;
+ read &= 0xfff;
+ if (channel < creads) {
diff = abs(read - prev_val_x);
if (diff < prev_diff_x) {
prev_diff_x = diff;
*x = read;
}
prev_val_x = read;
- }
- read = titsc_readl(ts_dev, REG_FIFO1);
- channel = read & 0xf0000;
- channel = channel >> 0x10;
- if ((channel >= ts_dev->coordiante_readouts) &&
- (channel < (2 * ts_dev->coordiante_readouts - 1))) {
- read &= 0xfff;
+ } else if (channel < creads * 2) {
diff = abs(read - prev_val_y);
if (diff < prev_diff_y) {
prev_diff_y = diff;
*y = read;
}
prev_val_y = read;
+
+ } else if (channel < creads * 2 + 1) {
+ *z1 = read;
+
+ } else if (channel < creads * 2 + 2) {
+ *z2 = read;
}
}
}
@@ -256,10 +261,8 @@ static irqreturn_t titsc_irq(int irq, void *dev)
status = titsc_readl(ts_dev, REG_IRQSTATUS);
if (status & IRQENB_FIFO0THRES) {
- titsc_read_coordinates(ts_dev, &x, &y);
- z1 = titsc_readl(ts_dev, REG_FIFO0) & 0xfff;
- z2 = titsc_readl(ts_dev, REG_FIFO1) & 0xfff;
+ titsc_read_coordinates(ts_dev, &x, &y, &z1, &z2);
if (ts_dev->pen_down && z1 != 0 && z2 != 0) {
/*
@@ -267,10 +270,10 @@ static irqreturn_t titsc_irq(int irq, void *dev)
* Resistance(touch) = x plate resistance *
* x postion/4096 * ((z2 / z1) - 1)
*/
- z = z2 - z1;
+ z = z1 - z2;
z *= x;
z *= ts_dev->x_plate_resistance;
- z /= z1;
+ z /= z2;
z = (z + 2047) >> 12;
if (z <= MAX_12BIT) {
@@ -395,7 +398,8 @@ static int titsc_probe(struct platform_device *pdev)
goto err_free_irq;
}
titsc_step_config(ts_dev);
- titsc_writel(ts_dev, REG_FIFO0THR, ts_dev->coordiante_readouts);
+ titsc_writel(ts_dev, REG_FIFO0THR,
+ ts_dev->coordiante_readouts * 2 + 2 - 1);
input_dev->name = "ti-tsc";
input_dev->dev.parent = &pdev->dev;
@@ -472,7 +476,7 @@ static int titsc_resume(struct device *dev)
}
titsc_step_config(ts_dev);
titsc_writel(ts_dev, REG_FIFO0THR,
- ts_dev->coordiante_readouts);
+ ts_dev->coordiante_readouts * 2 + 2 - 1);
return 0;
}
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index cd8686b..fe6223c 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -30,8 +30,8 @@
#define REG_IDLECONFIG 0x058
#define REG_CHARGECONFIG 0x05C
#define REG_CHARGEDELAY 0x060
-#define REG_STEPCONFIG(n) (0x64 + ((n - 1) * 8))
-#define REG_STEPDELAY(n) (0x68 + ((n - 1) * 8))
+#define REG_STEPCONFIG(n) (0x64 + ((n) * 8))
+#define REG_STEPDELAY(n) (0x68 + ((n) * 8))
#define REG_FIFO0CNT 0xE4
#define REG_FIFO0THR 0xE8
#define REG_FIFO1CNT 0xF0
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 19/22] input/ti_am335x_tsc: ACK the HW_PEN irq in ISR
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The interrupt source IRQENB_HW_PEN is enabled in suspend and suposed to
be used as a wake up source. Once this interrupt source is unmaksed, the
devices ends up in ISR and never continues.
This change ACKs the interrupt and disables it so the system does not
freeze.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index fa9692c..82d4a39 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -308,6 +308,12 @@ static irqreturn_t titsc_irq(int irq, void *dev)
irqclr |= IRQENB_PENUP;
}
+ if (status & IRQENB_HW_PEN) {
+
+ titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00);
+ titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
+ }
+
titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
am335x_tsc_se_update(ts_dev->mfd_tscadc);
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 19/22] input/ti_am335x_tsc: ACK the HW_PEN irq in ISR
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The interrupt source IRQENB_HW_PEN is enabled in suspend and suposed to
be used as a wake up source. Once this interrupt source is unmaksed, the
devices ends up in ISR and never continues.
This change ACKs the interrupt and disables it so the system does not
freeze.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index fa9692c..82d4a39 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -308,6 +308,12 @@ static irqreturn_t titsc_irq(int irq, void *dev)
irqclr |= IRQENB_PENUP;
}
+ if (status & IRQENB_HW_PEN) {
+
+ titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00);
+ titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
+ }
+
titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
am335x_tsc_se_update(ts_dev->mfd_tscadc);
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 20/22] input/ti_am335x_tsc: return IRQ_NONE if there was no IRQ for us
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The previous patch ("input/ti_am335x_tsc: ACK the HW_PEN irq in ISR")
acked the interrupt so we don't freeze if we don't handle an enabled
interrupt source. The interrupt core has a mechanism for this and to get
it work one should only say that it handled an interrupt if it is
actually the case.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 82d4a39..a06447f 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -314,10 +314,12 @@ static irqreturn_t titsc_irq(int irq, void *dev)
titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
}
- titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
-
- am335x_tsc_se_update(ts_dev->mfd_tscadc);
- return IRQ_HANDLED;
+ if (irqclr) {
+ titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
+ am335x_tsc_se_update(ts_dev->mfd_tscadc);
+ return IRQ_HANDLED;
+ }
+ return IRQ_NONE;
}
static int titsc_parse_dt(struct ti_tscadc_dev *tscadc_dev,
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 20/22] input/ti_am335x_tsc: return IRQ_NONE if there was no IRQ for us
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The previous patch ("input/ti_am335x_tsc: ACK the HW_PEN irq in ISR")
acked the interrupt so we don't freeze if we don't handle an enabled
interrupt source. The interrupt core has a mechanism for this and to get
it work one should only say that it handled an interrupt if it is
actually the case.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 82d4a39..a06447f 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -314,10 +314,12 @@ static irqreturn_t titsc_irq(int irq, void *dev)
titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
}
- titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
-
- am335x_tsc_se_update(ts_dev->mfd_tscadc);
- return IRQ_HANDLED;
+ if (irqclr) {
+ titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
+ am335x_tsc_se_update(ts_dev->mfd_tscadc);
+ return IRQ_HANDLED;
+ }
+ return IRQ_NONE;
}
static int titsc_parse_dt(struct ti_tscadc_dev *tscadc_dev,
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The TSC part allows to specify the input lines. The IIO part assumes
that it usues always the last few, that means if IIO has adc-channels
set to 2 it will use channel 6 and 7. However it might make sense to use
only 6.
This patch changes the device property (which was introduced recently
and was never in an official release) in a way that the user can specify
which of the AIN lines should be used. In Addition to this, the name is
now AINx where x is the channel number i.e. for AIN6 we would have 6.
Prior this, it always started counting at 0 which is confusing. In
addition to this, it also checks for correct step number during reading
and does not rely on proper FIFO depth.
Acked-by: Jonathan Cameron <jic23-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
---
arch/arm/boot/dts/am335x-evm.dts | 2 +-
drivers/iio/adc/ti_am335x_adc.c | 59 +++++++++++++++++++++++++-------------
drivers/mfd/ti_am335x_tscadc.c | 20 +++++++++++--
3 files changed, 58 insertions(+), 23 deletions(-)
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 26fea97..0fa4c7f 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -255,6 +255,6 @@
};
adc {
- ti,adc-channels = <4>;
+ ti,adc-channels = <4 5 6 7>;
};
};
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 031f8e5..4bf34f2 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -32,6 +32,8 @@
struct tiadc_device {
struct ti_tscadc_dev *mfd_tscadc;
int channels;
+ u8 channel_line[8];
+ u8 channel_step[8];
struct iio_map *map;
};
@@ -58,7 +60,7 @@ static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
static void tiadc_step_config(struct tiadc_device *adc_dev)
{
unsigned int stepconfig;
- int i, channels = 0, steps;
+ int i, steps;
u32 step_en;
/*
@@ -72,16 +74,18 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
*/
steps = TOTAL_STEPS - adc_dev->channels;
- channels = TOTAL_CHANNELS - adc_dev->channels;
-
stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
- for (i = steps; i < TOTAL_STEPS; i++) {
- tiadc_writel(adc_dev, REG_STEPCONFIG(i),
- stepconfig | STEPCONFIG_INP(channels));
- tiadc_writel(adc_dev, REG_STEPDELAY(i),
+ for (i = 0; i < adc_dev->channels; i++) {
+ int chan;
+
+ chan = adc_dev->channel_line[i];
+ tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
+ stepconfig | STEPCONFIG_INP(chan));
+ tiadc_writel(adc_dev, REG_STEPDELAY(steps),
STEPCONFIG_OPENDLY);
- channels++;
+ adc_dev->channel_step[i] = steps;
+ steps++;
}
step_en = get_adc_step_mask(adc_dev);
am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
@@ -116,9 +120,9 @@ static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
chan->type = IIO_VOLTAGE;
chan->indexed = 1;
- chan->channel = i;
+ chan->channel = adc_dev->channel_line[i];
chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
- chan->datasheet_name = chan_name_ain[i];
+ chan->datasheet_name = chan_name_ain[chan->channel];
chan->scan_type.sign = 'u';
chan->scan_type.realbits = 12;
chan->scan_type.storagebits = 32;
@@ -165,7 +169,8 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
{
struct tiadc_device *adc_dev = iio_priv(indio_dev);
int i;
- unsigned int fifo1count, readx1;
+ unsigned int fifo1count, read;
+ u32 step = UINT_MAX;
/*
* When the sub-system is first enabled,
@@ -178,11 +183,20 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
* Hence we need to flush out this data.
*/
+ for (i = 0; i < ARRAY_SIZE(adc_dev->channel_step); i++) {
+ if (chan->channel == adc_dev->channel_line[i]) {
+ step = adc_dev->channel_step[i];
+ break;
+ }
+ }
+ if (WARN_ON_ONCE(step == UINT_MAX))
+ return -EINVAL;
+
fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
for (i = 0; i < fifo1count; i++) {
- readx1 = tiadc_readl(adc_dev, REG_FIFO1);
- if (i == chan->channel)
- *val = readx1 & 0xfff;
+ read = tiadc_readl(adc_dev, REG_FIFO1);
+ if (read >> 16 == step)
+ *val = read & 0xfff;
}
am335x_tsc_se_update(adc_dev->mfd_tscadc);
@@ -199,8 +213,11 @@ static int tiadc_probe(struct platform_device *pdev)
struct tiadc_device *adc_dev;
struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
struct device_node *node = tscadc_dev->dev->of_node;
+ struct property *prop;
+ const __be32 *cur;
int err;
- u32 val32;
+ u32 val;
+ int channels = 0;
if (!node) {
dev_err(&pdev->dev, "Could not find valid DT data.\n");
@@ -222,11 +239,13 @@ static int tiadc_probe(struct platform_device *pdev)
err = -EINVAL;
goto err_free_device;
}
- err = of_property_read_u32(node,
- "ti,adc-channels", &val32);
- if (err < 0)
- goto err_free_device;
- adc_dev->channels = val32;
+
+ of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
+
+ adc_dev->channel_line[channels] = val;
+ channels++;
+ }
+ adc_dev->channels = channels;
indio_dev->dev.parent = &pdev->dev;
indio_dev->name = dev_name(&pdev->dev);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 8bdab8d..acdb7b9 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -80,9 +80,13 @@ static int ti_tscadc_probe(struct platform_device *pdev)
struct clk *clk;
struct device_node *node = pdev->dev.of_node;
struct mfd_cell *cell;
+ struct property *prop;
+ const __be32 *cur;
+ u32 val;
int err, ctrl;
int clk_value, clock_rate;
int tsc_wires = 0, adc_channels = 0, total_channels;
+ int readouts = 0;
if (!pdev->dev.of_node) {
dev_err(&pdev->dev, "Could not find valid DT data.\n");
@@ -91,10 +95,17 @@ static int ti_tscadc_probe(struct platform_device *pdev)
node = of_get_child_by_name(pdev->dev.of_node, "tsc");
of_property_read_u32(node, "ti,wires", &tsc_wires);
+ of_property_read_u32(node, "ti,coordiante-readouts", &readouts);
node = of_get_child_by_name(pdev->dev.of_node, "adc");
- of_property_read_u32(node, "ti,adc-channels", &adc_channels);
-
+ of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
+ adc_channels++;
+ if (val > 7) {
+ dev_err(&pdev->dev, " PIN numbers are 0..7 (not %d)\n",
+ val);
+ return -EINVAL;
+ }
+ }
total_channels = tsc_wires + adc_channels;
if (total_channels > 8) {
dev_err(&pdev->dev, "Number of i/p channels more than 8\n");
@@ -105,6 +116,11 @@ static int ti_tscadc_probe(struct platform_device *pdev)
return -EINVAL;
}
+ if (readouts * 2 + 2 + adc_channels > 16) {
+ dev_err(&pdev->dev, "Too many step configurations requested\n");
+ return -EINVAL;
+ }
+
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "no memory resource defined.\n");
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
* [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
@ 2013-06-05 16:24 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-05 16:24 UTC (permalink / raw)
To: Samuel Ortiz
Cc: Felipe Balbi, linux-iio, linux-input, Dmitry Torokhov,
Jonathan Cameron, Sebastian Andrzej Siewior
The TSC part allows to specify the input lines. The IIO part assumes
that it usues always the last few, that means if IIO has adc-channels
set to 2 it will use channel 6 and 7. However it might make sense to use
only 6.
This patch changes the device property (which was introduced recently
and was never in an official release) in a way that the user can specify
which of the AIN lines should be used. In Addition to this, the name is
now AINx where x is the channel number i.e. for AIN6 we would have 6.
Prior this, it always started counting at 0 which is confusing. In
addition to this, it also checks for correct step number during reading
and does not rely on proper FIFO depth.
Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
arch/arm/boot/dts/am335x-evm.dts | 2 +-
drivers/iio/adc/ti_am335x_adc.c | 59 +++++++++++++++++++++++++-------------
drivers/mfd/ti_am335x_tscadc.c | 20 +++++++++++--
3 files changed, 58 insertions(+), 23 deletions(-)
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 26fea97..0fa4c7f 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -255,6 +255,6 @@
};
adc {
- ti,adc-channels = <4>;
+ ti,adc-channels = <4 5 6 7>;
};
};
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 031f8e5..4bf34f2 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -32,6 +32,8 @@
struct tiadc_device {
struct ti_tscadc_dev *mfd_tscadc;
int channels;
+ u8 channel_line[8];
+ u8 channel_step[8];
struct iio_map *map;
};
@@ -58,7 +60,7 @@ static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
static void tiadc_step_config(struct tiadc_device *adc_dev)
{
unsigned int stepconfig;
- int i, channels = 0, steps;
+ int i, steps;
u32 step_en;
/*
@@ -72,16 +74,18 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
*/
steps = TOTAL_STEPS - adc_dev->channels;
- channels = TOTAL_CHANNELS - adc_dev->channels;
-
stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
- for (i = steps; i < TOTAL_STEPS; i++) {
- tiadc_writel(adc_dev, REG_STEPCONFIG(i),
- stepconfig | STEPCONFIG_INP(channels));
- tiadc_writel(adc_dev, REG_STEPDELAY(i),
+ for (i = 0; i < adc_dev->channels; i++) {
+ int chan;
+
+ chan = adc_dev->channel_line[i];
+ tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
+ stepconfig | STEPCONFIG_INP(chan));
+ tiadc_writel(adc_dev, REG_STEPDELAY(steps),
STEPCONFIG_OPENDLY);
- channels++;
+ adc_dev->channel_step[i] = steps;
+ steps++;
}
step_en = get_adc_step_mask(adc_dev);
am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
@@ -116,9 +120,9 @@ static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
chan->type = IIO_VOLTAGE;
chan->indexed = 1;
- chan->channel = i;
+ chan->channel = adc_dev->channel_line[i];
chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
- chan->datasheet_name = chan_name_ain[i];
+ chan->datasheet_name = chan_name_ain[chan->channel];
chan->scan_type.sign = 'u';
chan->scan_type.realbits = 12;
chan->scan_type.storagebits = 32;
@@ -165,7 +169,8 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
{
struct tiadc_device *adc_dev = iio_priv(indio_dev);
int i;
- unsigned int fifo1count, readx1;
+ unsigned int fifo1count, read;
+ u32 step = UINT_MAX;
/*
* When the sub-system is first enabled,
@@ -178,11 +183,20 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
* Hence we need to flush out this data.
*/
+ for (i = 0; i < ARRAY_SIZE(adc_dev->channel_step); i++) {
+ if (chan->channel == adc_dev->channel_line[i]) {
+ step = adc_dev->channel_step[i];
+ break;
+ }
+ }
+ if (WARN_ON_ONCE(step == UINT_MAX))
+ return -EINVAL;
+
fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
for (i = 0; i < fifo1count; i++) {
- readx1 = tiadc_readl(adc_dev, REG_FIFO1);
- if (i == chan->channel)
- *val = readx1 & 0xfff;
+ read = tiadc_readl(adc_dev, REG_FIFO1);
+ if (read >> 16 == step)
+ *val = read & 0xfff;
}
am335x_tsc_se_update(adc_dev->mfd_tscadc);
@@ -199,8 +213,11 @@ static int tiadc_probe(struct platform_device *pdev)
struct tiadc_device *adc_dev;
struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
struct device_node *node = tscadc_dev->dev->of_node;
+ struct property *prop;
+ const __be32 *cur;
int err;
- u32 val32;
+ u32 val;
+ int channels = 0;
if (!node) {
dev_err(&pdev->dev, "Could not find valid DT data.\n");
@@ -222,11 +239,13 @@ static int tiadc_probe(struct platform_device *pdev)
err = -EINVAL;
goto err_free_device;
}
- err = of_property_read_u32(node,
- "ti,adc-channels", &val32);
- if (err < 0)
- goto err_free_device;
- adc_dev->channels = val32;
+
+ of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
+
+ adc_dev->channel_line[channels] = val;
+ channels++;
+ }
+ adc_dev->channels = channels;
indio_dev->dev.parent = &pdev->dev;
indio_dev->name = dev_name(&pdev->dev);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 8bdab8d..acdb7b9 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -80,9 +80,13 @@ static int ti_tscadc_probe(struct platform_device *pdev)
struct clk *clk;
struct device_node *node = pdev->dev.of_node;
struct mfd_cell *cell;
+ struct property *prop;
+ const __be32 *cur;
+ u32 val;
int err, ctrl;
int clk_value, clock_rate;
int tsc_wires = 0, adc_channels = 0, total_channels;
+ int readouts = 0;
if (!pdev->dev.of_node) {
dev_err(&pdev->dev, "Could not find valid DT data.\n");
@@ -91,10 +95,17 @@ static int ti_tscadc_probe(struct platform_device *pdev)
node = of_get_child_by_name(pdev->dev.of_node, "tsc");
of_property_read_u32(node, "ti,wires", &tsc_wires);
+ of_property_read_u32(node, "ti,coordiante-readouts", &readouts);
node = of_get_child_by_name(pdev->dev.of_node, "adc");
- of_property_read_u32(node, "ti,adc-channels", &adc_channels);
-
+ of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
+ adc_channels++;
+ if (val > 7) {
+ dev_err(&pdev->dev, " PIN numbers are 0..7 (not %d)\n",
+ val);
+ return -EINVAL;
+ }
+ }
total_channels = tsc_wires + adc_channels;
if (total_channels > 8) {
dev_err(&pdev->dev, "Number of i/p channels more than 8\n");
@@ -105,6 +116,11 @@ static int ti_tscadc_probe(struct platform_device *pdev)
return -EINVAL;
}
+ if (readouts * 2 + 2 + adc_channels > 16) {
+ dev_err(&pdev->dev, "Too many step configurations requested\n");
+ return -EINVAL;
+ }
+
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "no memory resource defined.\n");
--
1.7.10.4
^ permalink raw reply related [flat|nested] 64+ messages in thread
[parent not found: <1370449495-29981-22-git-send-email-bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>]
* Re: [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-08 9:24 ` Jonathan Cameron
-1 siblings, 0 replies; 64+ messages in thread
From: Jonathan Cameron @ 2013-06-08 9:24 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: Samuel Ortiz, Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron
On 06/05/2013 05:24 PM, Sebastian Andrzej Siewior wrote:
> The TSC part allows to specify the input lines. The IIO part assumes
> that it usues always the last few, that means if IIO has adc-channels
> set to 2 it will use channel 6 and 7. However it might make sense to use
> only 6.
> This patch changes the device property (which was introduced recently
> and was never in an official release) in a way that the user can specify
> which of the AIN lines should be used. In Addition to this, the name is
> now AINx where x is the channel number i.e. for AIN6 we would have 6.
> Prior this, it always started counting at 0 which is confusing. In
> addition to this, it also checks for correct step number during reading
> and does not rely on proper FIFO depth.
>
Looks like a typo below... Also the change that is in doesn't directly seem
to be described in this description.
> Acked-by: Jonathan Cameron <jic23-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
> ---
> arch/arm/boot/dts/am335x-evm.dts | 2 +-
> drivers/iio/adc/ti_am335x_adc.c | 59 +++++++++++++++++++++++++-------------
> drivers/mfd/ti_am335x_tscadc.c | 20 +++++++++++--
> 3 files changed, 58 insertions(+), 23 deletions(-)
>
> diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
> index 26fea97..0fa4c7f 100644
> --- a/arch/arm/boot/dts/am335x-evm.dts
> +++ b/arch/arm/boot/dts/am335x-evm.dts
> @@ -255,6 +255,6 @@
> };
>
> adc {
> - ti,adc-channels = <4>;
> + ti,adc-channels = <4 5 6 7>;
> };
> };
> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
> index 031f8e5..4bf34f2 100644
> --- a/drivers/iio/adc/ti_am335x_adc.c
> +++ b/drivers/iio/adc/ti_am335x_adc.c
> @@ -32,6 +32,8 @@
> struct tiadc_device {
> struct ti_tscadc_dev *mfd_tscadc;
> int channels;
> + u8 channel_line[8];
> + u8 channel_step[8];
> struct iio_map *map;
> };
>
> @@ -58,7 +60,7 @@ static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
> static void tiadc_step_config(struct tiadc_device *adc_dev)
> {
> unsigned int stepconfig;
> - int i, channels = 0, steps;
> + int i, steps;
> u32 step_en;
>
> /*
> @@ -72,16 +74,18 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
> */
>
> steps = TOTAL_STEPS - adc_dev->channels;
> - channels = TOTAL_CHANNELS - adc_dev->channels;
> -
> stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
>
> - for (i = steps; i < TOTAL_STEPS; i++) {
> - tiadc_writel(adc_dev, REG_STEPCONFIG(i),
> - stepconfig | STEPCONFIG_INP(channels));
> - tiadc_writel(adc_dev, REG_STEPDELAY(i),
> + for (i = 0; i < adc_dev->channels; i++) {
> + int chan;
> +
> + chan = adc_dev->channel_line[i];
> + tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
> + stepconfig | STEPCONFIG_INP(chan));
> + tiadc_writel(adc_dev, REG_STEPDELAY(steps),
> STEPCONFIG_OPENDLY);
> - channels++;
> + adc_dev->channel_step[i] = steps;
> + steps++;
> }
> step_en = get_adc_step_mask(adc_dev);
> am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
> @@ -116,9 +120,9 @@ static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
>
> chan->type = IIO_VOLTAGE;
> chan->indexed = 1;
> - chan->channel = i;
> + chan->channel = adc_dev->channel_line[i];
> chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
> - chan->datasheet_name = chan_name_ain[i];
> + chan->datasheet_name = chan_name_ain[chan->channel];
> chan->scan_type.sign = 'u';
> chan->scan_type.realbits = 12;
> chan->scan_type.storagebits = 32;
> @@ -165,7 +169,8 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
> {
> struct tiadc_device *adc_dev = iio_priv(indio_dev);
> int i;
> - unsigned int fifo1count, readx1;
> + unsigned int fifo1count, read;
> + u32 step = UINT_MAX;
>
> /*
> * When the sub-system is first enabled,
> @@ -178,11 +183,20 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
> * Hence we need to flush out this data.
> */
>
> + for (i = 0; i < ARRAY_SIZE(adc_dev->channel_step); i++) {
> + if (chan->channel == adc_dev->channel_line[i]) {
> + step = adc_dev->channel_step[i];
> + break;
> + }
> + }
> + if (WARN_ON_ONCE(step == UINT_MAX))
> + return -EINVAL;
> +
> fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
> for (i = 0; i < fifo1count; i++) {
> - readx1 = tiadc_readl(adc_dev, REG_FIFO1);
> - if (i == chan->channel)
> - *val = readx1 & 0xfff;
> + read = tiadc_readl(adc_dev, REG_FIFO1);
> + if (read >> 16 == step)
> + *val = read & 0xfff;
> }
> am335x_tsc_se_update(adc_dev->mfd_tscadc);
>
> @@ -199,8 +213,11 @@ static int tiadc_probe(struct platform_device *pdev)
> struct tiadc_device *adc_dev;
> struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
> struct device_node *node = tscadc_dev->dev->of_node;
> + struct property *prop;
> + const __be32 *cur;
> int err;
> - u32 val32;
> + u32 val;
> + int channels = 0;
>
> if (!node) {
> dev_err(&pdev->dev, "Could not find valid DT data.\n");
> @@ -222,11 +239,13 @@ static int tiadc_probe(struct platform_device *pdev)
> err = -EINVAL;
> goto err_free_device;
> }
> - err = of_property_read_u32(node,
> - "ti,adc-channels", &val32);
> - if (err < 0)
> - goto err_free_device;
> - adc_dev->channels = val32;
> +
> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> +
> + adc_dev->channel_line[channels] = val;
> + channels++;
> + }
> + adc_dev->channels = channels;
>
> indio_dev->dev.parent = &pdev->dev;
> indio_dev->name = dev_name(&pdev->dev);
> diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
> index 8bdab8d..acdb7b9 100644
> --- a/drivers/mfd/ti_am335x_tscadc.c
> +++ b/drivers/mfd/ti_am335x_tscadc.c
> @@ -80,9 +80,13 @@ static int ti_tscadc_probe(struct platform_device *pdev)
> struct clk *clk;
> struct device_node *node = pdev->dev.of_node;
> struct mfd_cell *cell;
> + struct property *prop;
> + const __be32 *cur;
> + u32 val;
> int err, ctrl;
> int clk_value, clock_rate;
> int tsc_wires = 0, adc_channels = 0, total_channels;
> + int readouts = 0;
>
> if (!pdev->dev.of_node) {
> dev_err(&pdev->dev, "Could not find valid DT data.\n");
> @@ -91,10 +95,17 @@ static int ti_tscadc_probe(struct platform_device *pdev)
>
> node = of_get_child_by_name(pdev->dev.of_node, "tsc");
> of_property_read_u32(node, "ti,wires", &tsc_wires);
> + of_property_read_u32(node, "ti,coordiante-readouts", &readouts);
Coordiante? I'm guessing coordinate
>
> node = of_get_child_by_name(pdev->dev.of_node, "adc");
> - of_property_read_u32(node, "ti,adc-channels", &adc_channels);
> -
> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> + adc_channels++;
> + if (val > 7) {
> + dev_err(&pdev->dev, " PIN numbers are 0..7 (not %d)\n",
> + val);
> + return -EINVAL;
> + }
> + }
> total_channels = tsc_wires + adc_channels;
> if (total_channels > 8) {
> dev_err(&pdev->dev, "Number of i/p channels more than 8\n");
> @@ -105,6 +116,11 @@ static int ti_tscadc_probe(struct platform_device *pdev)
> return -EINVAL;
> }
>
> + if (readouts * 2 + 2 + adc_channels > 16) {
> + dev_err(&pdev->dev, "Too many step configurations requested\n");
> + return -EINVAL;
> + }
> +
> res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> if (!res) {
> dev_err(&pdev->dev, "no memory resource defined.\n");
>
^ permalink raw reply [flat|nested] 64+ messages in thread
* Re: [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
@ 2013-06-08 9:24 ` Jonathan Cameron
0 siblings, 0 replies; 64+ messages in thread
From: Jonathan Cameron @ 2013-06-08 9:24 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: Samuel Ortiz, Felipe Balbi, linux-iio, linux-input,
Dmitry Torokhov, Jonathan Cameron
On 06/05/2013 05:24 PM, Sebastian Andrzej Siewior wrote:
> The TSC part allows to specify the input lines. The IIO part assumes
> that it usues always the last few, that means if IIO has adc-channels
> set to 2 it will use channel 6 and 7. However it might make sense to use
> only 6.
> This patch changes the device property (which was introduced recently
> and was never in an official release) in a way that the user can specify
> which of the AIN lines should be used. In Addition to this, the name is
> now AINx where x is the channel number i.e. for AIN6 we would have 6.
> Prior this, it always started counting at 0 which is confusing. In
> addition to this, it also checks for correct step number during reading
> and does not rely on proper FIFO depth.
>
Looks like a typo below... Also the change that is in doesn't directly seem
to be described in this description.
> Acked-by: Jonathan Cameron <jic23@kernel.org>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> ---
> arch/arm/boot/dts/am335x-evm.dts | 2 +-
> drivers/iio/adc/ti_am335x_adc.c | 59 +++++++++++++++++++++++++-------------
> drivers/mfd/ti_am335x_tscadc.c | 20 +++++++++++--
> 3 files changed, 58 insertions(+), 23 deletions(-)
>
> diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
> index 26fea97..0fa4c7f 100644
> --- a/arch/arm/boot/dts/am335x-evm.dts
> +++ b/arch/arm/boot/dts/am335x-evm.dts
> @@ -255,6 +255,6 @@
> };
>
> adc {
> - ti,adc-channels = <4>;
> + ti,adc-channels = <4 5 6 7>;
> };
> };
> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
> index 031f8e5..4bf34f2 100644
> --- a/drivers/iio/adc/ti_am335x_adc.c
> +++ b/drivers/iio/adc/ti_am335x_adc.c
> @@ -32,6 +32,8 @@
> struct tiadc_device {
> struct ti_tscadc_dev *mfd_tscadc;
> int channels;
> + u8 channel_line[8];
> + u8 channel_step[8];
> struct iio_map *map;
> };
>
> @@ -58,7 +60,7 @@ static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
> static void tiadc_step_config(struct tiadc_device *adc_dev)
> {
> unsigned int stepconfig;
> - int i, channels = 0, steps;
> + int i, steps;
> u32 step_en;
>
> /*
> @@ -72,16 +74,18 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
> */
>
> steps = TOTAL_STEPS - adc_dev->channels;
> - channels = TOTAL_CHANNELS - adc_dev->channels;
> -
> stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
>
> - for (i = steps; i < TOTAL_STEPS; i++) {
> - tiadc_writel(adc_dev, REG_STEPCONFIG(i),
> - stepconfig | STEPCONFIG_INP(channels));
> - tiadc_writel(adc_dev, REG_STEPDELAY(i),
> + for (i = 0; i < adc_dev->channels; i++) {
> + int chan;
> +
> + chan = adc_dev->channel_line[i];
> + tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
> + stepconfig | STEPCONFIG_INP(chan));
> + tiadc_writel(adc_dev, REG_STEPDELAY(steps),
> STEPCONFIG_OPENDLY);
> - channels++;
> + adc_dev->channel_step[i] = steps;
> + steps++;
> }
> step_en = get_adc_step_mask(adc_dev);
> am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
> @@ -116,9 +120,9 @@ static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
>
> chan->type = IIO_VOLTAGE;
> chan->indexed = 1;
> - chan->channel = i;
> + chan->channel = adc_dev->channel_line[i];
> chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
> - chan->datasheet_name = chan_name_ain[i];
> + chan->datasheet_name = chan_name_ain[chan->channel];
> chan->scan_type.sign = 'u';
> chan->scan_type.realbits = 12;
> chan->scan_type.storagebits = 32;
> @@ -165,7 +169,8 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
> {
> struct tiadc_device *adc_dev = iio_priv(indio_dev);
> int i;
> - unsigned int fifo1count, readx1;
> + unsigned int fifo1count, read;
> + u32 step = UINT_MAX;
>
> /*
> * When the sub-system is first enabled,
> @@ -178,11 +183,20 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
> * Hence we need to flush out this data.
> */
>
> + for (i = 0; i < ARRAY_SIZE(adc_dev->channel_step); i++) {
> + if (chan->channel == adc_dev->channel_line[i]) {
> + step = adc_dev->channel_step[i];
> + break;
> + }
> + }
> + if (WARN_ON_ONCE(step == UINT_MAX))
> + return -EINVAL;
> +
> fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
> for (i = 0; i < fifo1count; i++) {
> - readx1 = tiadc_readl(adc_dev, REG_FIFO1);
> - if (i == chan->channel)
> - *val = readx1 & 0xfff;
> + read = tiadc_readl(adc_dev, REG_FIFO1);
> + if (read >> 16 == step)
> + *val = read & 0xfff;
> }
> am335x_tsc_se_update(adc_dev->mfd_tscadc);
>
> @@ -199,8 +213,11 @@ static int tiadc_probe(struct platform_device *pdev)
> struct tiadc_device *adc_dev;
> struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
> struct device_node *node = tscadc_dev->dev->of_node;
> + struct property *prop;
> + const __be32 *cur;
> int err;
> - u32 val32;
> + u32 val;
> + int channels = 0;
>
> if (!node) {
> dev_err(&pdev->dev, "Could not find valid DT data.\n");
> @@ -222,11 +239,13 @@ static int tiadc_probe(struct platform_device *pdev)
> err = -EINVAL;
> goto err_free_device;
> }
> - err = of_property_read_u32(node,
> - "ti,adc-channels", &val32);
> - if (err < 0)
> - goto err_free_device;
> - adc_dev->channels = val32;
> +
> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> +
> + adc_dev->channel_line[channels] = val;
> + channels++;
> + }
> + adc_dev->channels = channels;
>
> indio_dev->dev.parent = &pdev->dev;
> indio_dev->name = dev_name(&pdev->dev);
> diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
> index 8bdab8d..acdb7b9 100644
> --- a/drivers/mfd/ti_am335x_tscadc.c
> +++ b/drivers/mfd/ti_am335x_tscadc.c
> @@ -80,9 +80,13 @@ static int ti_tscadc_probe(struct platform_device *pdev)
> struct clk *clk;
> struct device_node *node = pdev->dev.of_node;
> struct mfd_cell *cell;
> + struct property *prop;
> + const __be32 *cur;
> + u32 val;
> int err, ctrl;
> int clk_value, clock_rate;
> int tsc_wires = 0, adc_channels = 0, total_channels;
> + int readouts = 0;
>
> if (!pdev->dev.of_node) {
> dev_err(&pdev->dev, "Could not find valid DT data.\n");
> @@ -91,10 +95,17 @@ static int ti_tscadc_probe(struct platform_device *pdev)
>
> node = of_get_child_by_name(pdev->dev.of_node, "tsc");
> of_property_read_u32(node, "ti,wires", &tsc_wires);
> + of_property_read_u32(node, "ti,coordiante-readouts", &readouts);
Coordiante? I'm guessing coordinate
>
> node = of_get_child_by_name(pdev->dev.of_node, "adc");
> - of_property_read_u32(node, "ti,adc-channels", &adc_channels);
> -
> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> + adc_channels++;
> + if (val > 7) {
> + dev_err(&pdev->dev, " PIN numbers are 0..7 (not %d)\n",
> + val);
> + return -EINVAL;
> + }
> + }
> total_channels = tsc_wires + adc_channels;
> if (total_channels > 8) {
> dev_err(&pdev->dev, "Number of i/p channels more than 8\n");
> @@ -105,6 +116,11 @@ static int ti_tscadc_probe(struct platform_device *pdev)
> return -EINVAL;
> }
>
> + if (readouts * 2 + 2 + adc_channels > 16) {
> + dev_err(&pdev->dev, "Too many step configurations requested\n");
> + return -EINVAL;
> + }
> +
> res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> if (!res) {
> dev_err(&pdev->dev, "no memory resource defined.\n");
>
^ permalink raw reply [flat|nested] 64+ messages in thread
[parent not found: <51B2F85E.2080805-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>]
* Re: [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
2013-06-08 9:24 ` Jonathan Cameron
@ 2013-06-10 7:32 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-10 7:32 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Samuel Ortiz, Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron
On 06/08/2013 11:24 AM, Jonathan Cameron wrote:
> On 06/05/2013 05:24 PM, Sebastian Andrzej Siewior wrote:
>> The TSC part allows to specify the input lines. The IIO part assumes
>> that it usues always the last few, that means if IIO has adc-channels
>> set to 2 it will use channel 6 and 7. However it might make sense to use
>> only 6.
>> This patch changes the device property (which was introduced recently
>> and was never in an official release) in a way that the user can specify
>> which of the AIN lines should be used. In Addition to this, the name is
>> now AINx where x is the channel number i.e. for AIN6 we would have 6.
>> Prior this, it always started counting at 0 which is confusing. In
>> addition to this, it also checks for correct step number during reading
>> and does not rely on proper FIFO depth.
>>
> Looks like a typo below... Also the change that is in doesn't directly seem
> to be described in this description.
You can use up to 8 channels and it was checked that the user does not
specify more. However, in case of the touch you can read a channel
multiple times. Each read process is programmed in the FSM and referred
as a step in the manual. You can have up to 15 steps. The additional
check ensures that the user does not try to more "steps" then available.
>> diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
>> index 8bdab8d..acdb7b9 100644
>> --- a/drivers/mfd/ti_am335x_tscadc.c
>> +++ b/drivers/mfd/ti_am335x_tscadc.c
>> @@ -91,10 +95,17 @@ static int ti_tscadc_probe(struct platform_device *pdev)
>>
>> node = of_get_child_by_name(pdev->dev.of_node, "tsc");
>> of_property_read_u32(node, "ti,wires", &tsc_wires);
>> + of_property_read_u32(node, "ti,coordiante-readouts", &readouts);
> Coordiante? I'm guessing coordinate
You guess correctly. It is a typo in multiple files, I fix it up…
>>
>> node = of_get_child_by_name(pdev->dev.of_node, "adc");
>> - of_property_read_u32(node, "ti,adc-channels", &adc_channels);
>> -
>> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
>> + adc_channels++;
>> + if (val > 7) {
>> + dev_err(&pdev->dev, " PIN numbers are 0..7 (not %d)\n",
>> + val);
>> + return -EINVAL;
>> + }
>> + }
>> total_channels = tsc_wires + adc_channels;
>> if (total_channels > 8) {
>> dev_err(&pdev->dev, "Number of i/p channels more than 8\n");
Sebastian
^ permalink raw reply [flat|nested] 64+ messages in thread
* Re: [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
@ 2013-06-10 7:32 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-10 7:32 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Samuel Ortiz, Felipe Balbi, linux-iio, linux-input,
Dmitry Torokhov, Jonathan Cameron
On 06/08/2013 11:24 AM, Jonathan Cameron wrote:
> On 06/05/2013 05:24 PM, Sebastian Andrzej Siewior wrote:
>> The TSC part allows to specify the input lines. The IIO part assumes
>> that it usues always the last few, that means if IIO has adc-channels
>> set to 2 it will use channel 6 and 7. However it might make sense to use
>> only 6.
>> This patch changes the device property (which was introduced recently
>> and was never in an official release) in a way that the user can specify
>> which of the AIN lines should be used. In Addition to this, the name is
>> now AINx where x is the channel number i.e. for AIN6 we would have 6.
>> Prior this, it always started counting at 0 which is confusing. In
>> addition to this, it also checks for correct step number during reading
>> and does not rely on proper FIFO depth.
>>
> Looks like a typo below... Also the change that is in doesn't directly seem
> to be described in this description.
You can use up to 8 channels and it was checked that the user does not
specify more. However, in case of the touch you can read a channel
multiple times. Each read process is programmed in the FSM and referred
as a step in the manual. You can have up to 15 steps. The additional
check ensures that the user does not try to more "steps" then available.
>> diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
>> index 8bdab8d..acdb7b9 100644
>> --- a/drivers/mfd/ti_am335x_tscadc.c
>> +++ b/drivers/mfd/ti_am335x_tscadc.c
>> @@ -91,10 +95,17 @@ static int ti_tscadc_probe(struct platform_device *pdev)
>>
>> node = of_get_child_by_name(pdev->dev.of_node, "tsc");
>> of_property_read_u32(node, "ti,wires", &tsc_wires);
>> + of_property_read_u32(node, "ti,coordiante-readouts", &readouts);
> Coordiante? I'm guessing coordinate
You guess correctly. It is a typo in multiple files, I fix it up…
>>
>> node = of_get_child_by_name(pdev->dev.of_node, "adc");
>> - of_property_read_u32(node, "ti,adc-channels", &adc_channels);
>> -
>> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
>> + adc_channels++;
>> + if (val > 7) {
>> + dev_err(&pdev->dev, " PIN numbers are 0..7 (not %d)\n",
>> + val);
>> + return -EINVAL;
>> + }
>> + }
>> total_channels = tsc_wires + adc_channels;
>> if (total_channels > 8) {
>> dev_err(&pdev->dev, "Number of i/p channels more than 8\n");
Sebastian
^ permalink raw reply [flat|nested] 64+ messages in thread
* Re: [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
2013-06-05 16:24 ` Sebastian Andrzej Siewior
@ 2013-06-09 16:52 ` Lars-Peter Clausen
-1 siblings, 0 replies; 64+ messages in thread
From: Lars-Peter Clausen @ 2013-06-09 16:52 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: Samuel Ortiz, Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron
> @@ -199,8 +213,11 @@ static int tiadc_probe(struct platform_device *pdev)
> struct tiadc_device *adc_dev;
> struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
> struct device_node *node = tscadc_dev->dev->of_node;
> + struct property *prop;
> + const __be32 *cur;
> int err;
> - u32 val32;
> + u32 val;
> + int channels = 0;
The indention here looks a bit strange.
>
> if (!node) {
> dev_err(&pdev->dev, "Could not find valid DT data.\n");
> @@ -222,11 +239,13 @@ static int tiadc_probe(struct platform_device *pdev)
> err = -EINVAL;
> goto err_free_device;
> }
> - err = of_property_read_u32(node,
> - "ti,adc-channels", &val32);
> - if (err < 0)
> - goto err_free_device;
> - adc_dev->channels = val32;
> +
> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> +
No need for the extra new line
> + adc_dev->channel_line[channels] = val;
> + channels++;
You should make sure that channels is never >= 8
> + }
> + adc_dev->channels = channels;
>
> indio_dev->dev.parent = &pdev->dev;
> indio_dev->name = dev_name(&pdev->dev);
^ permalink raw reply [flat|nested] 64+ messages in thread
* Re: [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
@ 2013-06-09 16:52 ` Lars-Peter Clausen
0 siblings, 0 replies; 64+ messages in thread
From: Lars-Peter Clausen @ 2013-06-09 16:52 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: Samuel Ortiz, Felipe Balbi, linux-iio, linux-input,
Dmitry Torokhov, Jonathan Cameron
> @@ -199,8 +213,11 @@ static int tiadc_probe(struct platform_device *pdev)
> struct tiadc_device *adc_dev;
> struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
> struct device_node *node = tscadc_dev->dev->of_node;
> + struct property *prop;
> + const __be32 *cur;
> int err;
> - u32 val32;
> + u32 val;
> + int channels = 0;
The indention here looks a bit strange.
>
> if (!node) {
> dev_err(&pdev->dev, "Could not find valid DT data.\n");
> @@ -222,11 +239,13 @@ static int tiadc_probe(struct platform_device *pdev)
> err = -EINVAL;
> goto err_free_device;
> }
> - err = of_property_read_u32(node,
> - "ti,adc-channels", &val32);
> - if (err < 0)
> - goto err_free_device;
> - adc_dev->channels = val32;
> +
> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
> +
No need for the extra new line
> + adc_dev->channel_line[channels] = val;
> + channels++;
You should make sure that channels is never >= 8
> + }
> + adc_dev->channels = channels;
>
> indio_dev->dev.parent = &pdev->dev;
> indio_dev->name = dev_name(&pdev->dev);
^ permalink raw reply [flat|nested] 64+ messages in thread
[parent not found: <51B4B2CE.3020300-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>]
* Re: [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
2013-06-09 16:52 ` Lars-Peter Clausen
@ 2013-06-11 7:55 ` Sebastian Andrzej Siewior
-1 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-11 7:55 UTC (permalink / raw)
To: Lars-Peter Clausen
Cc: Samuel Ortiz, Felipe Balbi, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-input-u79uwXL29TY76Z2rM5mHXA, Dmitry Torokhov,
Jonathan Cameron
On 06/09/2013 06:52 PM, Lars-Peter Clausen wrote:
>> @@ -199,8 +213,11 @@ static int tiadc_probe(struct platform_device *pdev)
>> struct tiadc_device *adc_dev;
>> struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
>> struct device_node *node = tscadc_dev->dev->of_node;
>> + struct property *prop;
>> + const __be32 *cur;
>> int err;
>> - u32 val32;
>> + u32 val;
>> + int channels = 0;
>
> The indention here looks a bit strange.
fixed
>>
>> if (!node) {
>> dev_err(&pdev->dev, "Could not find valid DT data.\n");
>> @@ -222,11 +239,13 @@ static int tiadc_probe(struct platform_device *pdev)
>> err = -EINVAL;
>> goto err_free_device;
>> }
>> - err = of_property_read_u32(node,
>> - "ti,adc-channels", &val32);
>> - if (err < 0)
>> - goto err_free_device;
>> - adc_dev->channels = val32;
>> +
>> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
>> +
>
> No need for the extra new line
fixed
>> + adc_dev->channel_line[channels] = val;
>> + channels++;
>
> You should make sure that channels is never >= 8
This is done in the mfd part where it is also checked for adc channels
+ touch channles not > 8.
Sebastian
^ permalink raw reply [flat|nested] 64+ messages in thread
* Re: [PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line
@ 2013-06-11 7:55 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 64+ messages in thread
From: Sebastian Andrzej Siewior @ 2013-06-11 7:55 UTC (permalink / raw)
To: Lars-Peter Clausen
Cc: Samuel Ortiz, Felipe Balbi, linux-iio, linux-input,
Dmitry Torokhov, Jonathan Cameron
On 06/09/2013 06:52 PM, Lars-Peter Clausen wrote:
>> @@ -199,8 +213,11 @@ static int tiadc_probe(struct platform_device *pdev)
>> struct tiadc_device *adc_dev;
>> struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
>> struct device_node *node = tscadc_dev->dev->of_node;
>> + struct property *prop;
>> + const __be32 *cur;
>> int err;
>> - u32 val32;
>> + u32 val;
>> + int channels = 0;
>
> The indention here looks a bit strange.
fixed
>>
>> if (!node) {
>> dev_err(&pdev->dev, "Could not find valid DT data.\n");
>> @@ -222,11 +239,13 @@ static int tiadc_probe(struct platform_device *pdev)
>> err = -EINVAL;
>> goto err_free_device;
>> }
>> - err = of_property_read_u32(node,
>> - "ti,adc-channels", &val32);
>> - if (err < 0)
>> - goto err_free_device;
>> - adc_dev->channels = val32;
>> +
>> + of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
>> +
>
> No need for the extra new line
fixed
>> + adc_dev->channel_line[channels] = val;
>> + channels++;
>
> You should make sure that channels is never >= 8
This is done in the mfd part where it is also checked for adc channels
+ touch channles not > 8.
Sebastian
^ permalink raw reply [flat|nested] 64+ messages in thread