2012-11-07 07:07:44

by Patil, Rachna

[permalink] [raw]
Subject: [PATCH RESEND 0/7] MFD: ti_am335x_tscadc: DT support and TSC features addition

This patch set is a cumulative set of [1] and [2] sent earlier.

Note that there are no code changes in either of the patch set,
only rebased on top of MFD-next to make sure that all the patches
apply without any conflicts.

This patch set has been tested on AM335x EVM and is based on top of [3].

[1] http://www.spinics.net/lists/linux-input/msg23060.html
[2] http://www.spinics.net/lists/linux-input/msg23090.html
[3] https://lkml.org/lkml/2012/11/6/67

Patil, Rachna (7):
input: ti_am335x_tsc: Step enable bits made configurable
input: ti_am335x_tsc: Order of TSC wires, made configurable
input: ti_am335x_tsc: Add variance filter
MFD: ti_am335x_tscadc: add device tree binding information
MFD: ti_am335x_tscadc: Add DT support
input: ti_am335x_tsc: Add DT support
IIO: ti_am335x_adc: Add DT support

.../devicetree/bindings/mfd/ti_am335x_tscadc.txt | 35 +++
drivers/iio/adc/ti_am335x_adc.c | 24 ++-
drivers/input/touchscreen/ti_am335x_tsc.c | 239 +++++++++++++++++---
drivers/mfd/ti_am335x_tscadc.c | 28 ++-
include/linux/input/ti_am335x_tsc.h | 12 +
include/linux/mfd/ti_am335x_tscadc.h | 11 +-
6 files changed, 308 insertions(+), 41 deletions(-)
create mode 100644 Documentation/devicetree/bindings/mfd/ti_am335x_tscadc.txt


2012-11-07 07:07:49

by Patil, Rachna

[permalink] [raw]
Subject: [PATCH RESEND 6/7] input: ti_am335x_tsc: Add DT support

Add DT support for client touchscreen driver

Signed-off-by: Patil, Rachna <[email protected]>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 60 ++++++++++++++++++++++++-----
1 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 7a26810..c063cf6 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>

@@ -398,12 +400,18 @@ static int __devinit 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 mfd_tscadc_board *pdata;
- int err;
-
- pdata = tscadc_dev->dev->platform_data;
-
- if (!pdata) {
+ int err, i;
+ struct mfd_tscadc_board *pdata = NULL;
+ struct device_node *node = NULL;
+ u32 val32, wires_conf[4];
+
+ if (tscadc_dev->dev->of_node) {
+ node = tscadc_dev->dev->of_node;
+ node = of_find_node_by_name(node, "tsc");
+ } else
+ pdata = tscadc_dev->dev->platform_data;
+
+ if (!pdata && !node) {
dev_err(&pdev->dev, "Could not find platform data\n");
return -EINVAL;
}
@@ -421,11 +429,43 @@ static int __devinit 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,
+
+ if (node) {
+ err = of_property_read_u32(node, "wires", &val32);
+ if (err < 0)
+ goto err_free_mem;
+ else
+ ts_dev->wires = val32;
+
+ err = of_property_read_u32(node, "x-plate-resistance", &val32);
+ if (err < 0)
+ goto err_free_mem;
+ else
+ ts_dev->x_plate_resistance = val32;
+
+ err = of_property_read_u32(node, "steps-to-configure", &val32);
+ if (err < 0)
+ goto err_free_mem;
+ else
+ ts_dev->steps_to_configure = val32;
+
+ err = of_property_read_u32_array(node, "wire-config",
+ wires_conf, ARRAY_SIZE(wires_conf));
+ if (err < 0)
+ goto err_free_mem;
+ else {
+ for (i = 0; i < ARRAY_SIZE(wires_conf); i++)
+ ts_dev->config_inp[i] = wires_conf[i];
+ }
+ } else {
+ 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);
--
1.7.0.4

2012-11-07 07:07:52

by Patil, Rachna

[permalink] [raw]
Subject: [PATCH RESEND 5/7] MFD: ti_am335x_tscadc: Add DT support

Make changes to add DT support in the MFD core driver.

Signed-off-by: Patil, Rachna <[email protected]>
---
drivers/mfd/ti_am335x_tscadc.c | 28 +++++++++++++++++++++++-----
1 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 8ca3bf0..07b7788 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -22,6 +22,8 @@
#include <linux/regmap.h>
#include <linux/mfd/core.h>
#include <linux/pm_runtime.h>
+#include <linux/of.h>
+#include <linux/of_device.h>

#include <linux/mfd/ti_am335x_tscadc.h>
#include <linux/input/ti_am335x_tsc.h>
@@ -64,20 +66,31 @@ static int __devinit ti_tscadc_probe(struct platform_device *pdev)
struct resource *res;
struct clk *clk;
struct mfd_tscadc_board *pdata = pdev->dev.platform_data;
+ struct device_node *node = pdev->dev.of_node;
struct mfd_cell *cell;
int err, ctrl;
int clk_value, clock_rate;
- int tsc_wires, adc_channels = 0, total_channels;
+ int tsc_wires = 0, adc_channels = 0, total_channels;

- if (!pdata) {
+ if (!pdata && !pdev->dev.of_node) {
dev_err(&pdev->dev, "Could not find platform data\n");
return -EINVAL;
}

- if (pdata->adc_init)
- adc_channels = pdata->adc_init->adc_channels;
+ if (pdev->dev.of_node) {
+ node = of_find_node_by_name(pdev->dev.of_node, "tsc");
+ of_property_read_u32(node, "wires", &tsc_wires);
+
+ node = of_find_node_by_name(pdev->dev.of_node, "adc");
+ of_property_read_u32(node, "adc-channels", &adc_channels);
+ } else {
+ if (pdata->tsc_init)
+ tsc_wires = pdata->tsc_init->wires;
+
+ if (pdata->adc_init)
+ adc_channels = pdata->adc_init->adc_channels;
+ }

- tsc_wires = pdata->tsc_init->wires;
total_channels = tsc_wires + adc_channels;

if (total_channels > 8) {
@@ -256,11 +269,16 @@ static const struct dev_pm_ops tscadc_pm_ops = {
#define TSCADC_PM_OPS NULL
#endif

+static const struct of_device_id ti_tscadc_dt_ids[] = {
+ { .compatible = "ti,ti-tscadc", },
+};
+
static struct platform_driver ti_tscadc_driver = {
.driver = {
.name = "ti_tscadc",
.owner = THIS_MODULE,
.pm = TSCADC_PM_OPS,
+ .of_match_table = of_match_ptr(ti_tscadc_dt_ids),
},
.probe = ti_tscadc_probe,
.remove = __devexit_p(ti_tscadc_remove),
--
1.7.0.4

2012-11-07 07:07:51

by Patil, Rachna

[permalink] [raw]
Subject: [PATCH RESEND 7/7] IIO: ti_am335x_adc: Add DT support

Add DT support for client ADC driver.

Signed-off-by: Patil, Rachna <[email protected]>
---
drivers/iio/adc/ti_am335x_adc.c | 24 ++++++++++++++++++++----
1 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 02a43c8..1f1ec0c 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>
@@ -141,11 +143,18 @@ static int __devinit 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 mfd_tscadc_board *pdata;
+ struct mfd_tscadc_board *pdata = NULL;
+ struct device_node *node = NULL;
int err;
+ u32 val32;

- pdata = tscadc_dev->dev->platform_data;
- if (!pdata || !pdata->adc_init) {
+ if (tscadc_dev->dev->of_node) {
+ node = tscadc_dev->dev->of_node;
+ node = of_find_node_by_name(node, "adc");
+ } else
+ pdata = tscadc_dev->dev->platform_data;
+
+ if (!pdata && !node) {
dev_err(&pdev->dev, "Could not find platform data\n");
return -EINVAL;
}
@@ -159,7 +168,14 @@ static int __devinit 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 (node) {
+ err = of_property_read_u32(node, "adc-channels", &val32);
+ if (err < 0)
+ goto err_free_device;
+ else
+ adc_dev->channels = val32;
+ } else
+ adc_dev->channels = pdata->adc_init->adc_channels;

indio_dev->dev.parent = &pdev->dev;
indio_dev->name = dev_name(&pdev->dev);
--
1.7.0.4

2012-11-07 07:07:41

by Patil, Rachna

[permalink] [raw]
Subject: [PATCH RESEND 1/7] input: ti_am335x_tsc: Step enable bits made configurable

Current code has hard coded value written to
step enable bits. Now the bits are updated based
on how many steps are needed to be configured got
from platform data.

The user needs to take care not to exceed
the count more than 16. While using ADC and TSC
one should take care to set this parameter correctly.

Signed-off-by: Patil, Rachna <[email protected]>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 10 ++++++++--
include/linux/mfd/ti_am335x_tscadc.h | 1 -
2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 7a18a8a..4369224 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -39,6 +39,7 @@ struct titsc {
unsigned int irq;
unsigned int wires;
unsigned int x_plate_resistance;
+ unsigned int enable_bits;
bool pen_down;
int steps_to_configure;
};
@@ -57,6 +58,7 @@ static void titsc_writel(struct titsc *tsc, unsigned int reg,
static void titsc_step_config(struct titsc *ts_dev)
{
unsigned int config;
+ unsigned int stepenable = 0;
int i, total_steps;

/* Configure the Step registers */
@@ -128,7 +130,11 @@ static void titsc_step_config(struct titsc *ts_dev)
titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 2),
STEPCONFIG_OPENDLY);

- titsc_writel(ts_dev, REG_SE, STPENB_STEPENB_TC);
+ for (i = 0; i <= (total_steps + 2); i++)
+ stepenable |= 1 << i;
+ ts_dev->enable_bits = stepenable;
+
+ titsc_writel(ts_dev, REG_SE, ts_dev->enable_bits);
}

static void titsc_read_coordinates(struct titsc *ts_dev,
@@ -250,7 +256,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)

titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);

- titsc_writel(ts_dev, REG_SE, STPENB_STEPENB_TC);
+ titsc_writel(ts_dev, REG_SE, ts_dev->enable_bits);
return IRQ_HANDLED;
}

diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index c79ad5d..23e4f33 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -47,7 +47,6 @@
#define STEPENB_MASK (0x1FFFF << 0)
#define STEPENB(val) ((val) << 0)
#define STPENB_STEPENB STEPENB(0x1FFFF)
-#define STPENB_STEPENB_TC STEPENB(0x1FFF)

/* IRQ enable */
#define IRQENB_HW_PEN BIT(0)
--
1.7.0.4

2012-11-07 07:08:51

by Patil, Rachna

[permalink] [raw]
Subject: [PATCH RESEND 3/7] input: ti_am335x_tsc: Add variance filter

Only fine tuning variance parameter present in tslib
utility does not help in removing all the ADC noise.
This logic of filtering is necessary to get this
touchscreen to work finely.

Signed-off-by: Patil, Rachna <[email protected]>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 15 ++++++++++++++-
1 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 6a817a8..7a26810 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -32,6 +32,8 @@
#define ADCFSM_STEPID 0x10
#define SEQ_SETTLE 275
#define MAX_12BIT ((1 << 12) - 1)
+#define TSCADC_DELTA_X 15
+#define TSCADC_DELTA_Y 15

/*
* Refer to function regbit_map() to
@@ -51,6 +53,8 @@ struct titsc {
unsigned int wires;
unsigned int x_plate_resistance;
unsigned int enable_bits;
+ unsigned int bckup_x;
+ unsigned int bckup_y;
bool pen_down;
int steps_to_configure;
int config_inp[20];
@@ -309,12 +313,18 @@ static irqreturn_t titsc_irq(int irq, void *dev)
unsigned int z1, z2, z;
unsigned int fsm;
unsigned int fifo1count, fifo0count;
+ unsigned int diffx = 0, diffy = 0;
int i;

status = titsc_readl(ts_dev, REG_IRQSTATUS);
if (status & IRQENB_FIFO0THRES) {
titsc_read_coordinates(ts_dev, &x, &y);

+ diffx = abs(x - (ts_dev->bckup_x));
+ diffy = abs(y - (ts_dev->bckup_y));
+ ts_dev->bckup_x = x;
+ ts_dev->bckup_y = y;
+
z1 = titsc_readl(ts_dev, REG_FIFO0) & 0xfff;
z2 = titsc_readl(ts_dev, REG_FIFO1) & 0xfff;

@@ -338,7 +348,8 @@ static irqreturn_t titsc_irq(int irq, void *dev)
z /= z1;
z = (z + 2047) >> 12;

- if (z <= MAX_12BIT) {
+ if ((diffx < TSCADC_DELTA_X) &&
+ (diffy < TSCADC_DELTA_Y) && (z <= MAX_12BIT)) {
input_report_abs(input_dev, ABS_X, x);
input_report_abs(input_dev, ABS_Y, y);
input_report_abs(input_dev, ABS_PRESSURE, z);
@@ -361,6 +372,8 @@ static irqreturn_t titsc_irq(int irq, void *dev)
fsm = titsc_readl(ts_dev, REG_ADCFSM);
if (fsm == ADCFSM_STEPID) {
ts_dev->pen_down = false;
+ ts_dev->bckup_x = 0;
+ ts_dev->bckup_y = 0;
input_report_key(input_dev, BTN_TOUCH, 0);
input_report_abs(input_dev, ABS_PRESSURE, 0);
input_sync(input_dev);
--
1.7.0.4

2012-11-07 07:08:49

by Patil, Rachna

[permalink] [raw]
Subject: [PATCH RESEND 4/7] MFD: ti_am335x_tscadc: add device tree binding information

Signed-off-by: Patil, Rachna <[email protected]>
---
.../devicetree/bindings/mfd/ti_am335x_tscadc.txt | 35 ++++++++++++++++++++
1 files changed, 35 insertions(+), 0 deletions(-)
create mode 100644 Documentation/devicetree/bindings/mfd/ti_am335x_tscadc.txt

diff --git a/Documentation/devicetree/bindings/mfd/ti_am335x_tscadc.txt b/Documentation/devicetree/bindings/mfd/ti_am335x_tscadc.txt
new file mode 100644
index 0000000..c13c492
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/ti_am335x_tscadc.txt
@@ -0,0 +1,35 @@
+Texas Instruments - TSC / ADC multi-functional device
+
+ti_tscadc is a multi-function device with touchscreen and ADC on chip.
+This document describes the binding for mfd device.
+
+Required properties:
+- compatible: "ti,ti-tscadc"
+- reg: Specifies the address of MFD block
+- interrupts: IRQ line connected to the main SoC
+- interrupt-parent: The parent interrupt controller
+
+Optional properties:
+- ti,hwmods: Hardware information related to TSC/ADC MFD device
+
+Example:
+
+ tscadc: tscadc@44e0d000 {
+ compatible = "ti,ti-tscadc";
+ reg = <0x44e0d000 0x1000>;
+
+ interrupt-parent = <&intc>;
+ interrupts = <16>;
+ ti,hwmods = "adc_tsc";
+
+ tsc {
+ wires = <4>;
+ x-plate-resistance = <200>;
+ steps-to-configure = <5>;
+ wire-config = <0x00 0x11 0x22 0x33>;
+ };
+
+ adc {
+ adc-channels = <4>;
+ };
+ };
--
1.7.0.4

2012-11-07 07:09:28

by Patil, Rachna

[permalink] [raw]
Subject: [PATCH RESEND 2/7] input: ti_am335x_tsc: Order of TSC wires, made configurable

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 <[email protected]>
---
drivers/input/touchscreen/ti_am335x_tsc.c | 156 ++++++++++++++++++++++++++---
include/linux/input/ti_am335x_tsc.h | 12 ++
include/linux/mfd/ti_am335x_tscadc.h | 10 ++-
3 files changed, 159 insertions(+), 19 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index 4369224..6a817a8 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -33,6 +33,17 @@
#define SEQ_SETTLE 275
#define MAX_12BIT ((1 << 12) - 1)

+/*
+ * Refer to function regbit_map() to
+ * map the values in the matrix.
+ */
+static int config[4][4] = {
+ {1, 0, 1, 0},
+ {2, 3, 2, 3},
+ {4, 5, 4, 5},
+ {0, 6, 0, 6}
+};
+
struct titsc {
struct input_dev *input;
struct ti_tscadc_dev *mfd_tscadc;
@@ -42,6 +53,9 @@ struct titsc {
unsigned int enable_bits;
bool pen_down;
int steps_to_configure;
+ int config_inp[20];
+ int bit_xp, bit_xn, bit_yp, bit_yn;
+ int inp_xp, inp_xn, inp_yp, inp_yn;
};

static unsigned int titsc_readl(struct titsc *ts, unsigned int reg)
@@ -55,6 +69,107 @@ static void titsc_writel(struct titsc *tsc, unsigned int reg,
writel(val, tsc->mfd_tscadc->tscadc_base + reg);
}

+/*
+ * Each of the analog lines are mapped
+ * with one or two register bits,
+ * which can be either pulled high/low
+ * depending on the value to be read.
+ */
+static int regbit_map(int val)
+{
+ int map_bits = 0;
+
+ switch (val) {
+ case 1:
+ map_bits = XPP;
+ break;
+ case 2:
+ map_bits = XNP;
+ break;
+ case 3:
+ map_bits = XNN;
+ break;
+ case 4:
+ map_bits = YPP;
+ break;
+ case 5:
+ map_bits = YPN;
+ break;
+ case 6:
+ map_bits = YNN;
+ break;
+ }
+
+ return map_bits;
+}
+
+static int titsc_config_wires(struct titsc *ts_dev)
+{
+ int analog_line[10], wire_order[10];
+ int i, temp_bits, err;
+
+ 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;
+ analog_line[i] = analog_line[i] >> 4;
+
+ wire_order[i] = ts_dev->config_inp[i] & 0x0F;
+ }
+
+ for (i = 0; i < 4; i++) {
+ switch (wire_order[i]) {
+ case 0:
+ temp_bits = config[analog_line[i]][0];
+ if (temp_bits == 0) {
+ err = -EINVAL;
+ goto ret;
+ } else {
+ ts_dev->bit_xp = regbit_map(temp_bits);
+ ts_dev->inp_xp = analog_line[i];
+ break;
+ }
+ case 1:
+ temp_bits = config[analog_line[i]][1];
+ if (temp_bits == 0) {
+ err = -EINVAL;
+ goto ret;
+ } else {
+ ts_dev->bit_xn = regbit_map(temp_bits);
+ ts_dev->inp_xn = analog_line[i];
+ break;
+ }
+ case 2:
+ temp_bits = config[analog_line[i]][2];
+ if (temp_bits == 0) {
+ err = -EINVAL;
+ goto ret;
+ } else {
+ ts_dev->bit_yp = regbit_map(temp_bits);
+ ts_dev->inp_yp = analog_line[i];
+ break;
+ }
+ case 3:
+ temp_bits = config[analog_line[i]][3];
+ if (temp_bits == 0) {
+ err = -EINVAL;
+ goto ret;
+ } else {
+ ts_dev->bit_yn = regbit_map(temp_bits);
+ ts_dev->inp_yn = analog_line[i];
+ break;
+ }
+ }
+ }
+
+ return 0;
+
+ret:
+ return err;
+}
+
static void titsc_step_config(struct titsc *ts_dev)
{
unsigned int config;
@@ -65,18 +180,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;
}

@@ -87,18 +202,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;
}

@@ -109,9 +224,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);
@@ -119,13 +234,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);
@@ -295,6 +411,8 @@ static int __devinit 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);
@@ -304,6 +422,11 @@ static int __devinit 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);

@@ -373,6 +496,7 @@ static int titsc_resume(struct device *dev)
0x00);
titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
}
+ titsc_config_wires(ts_dev);
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 23e4f33..9624fea 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -72,8 +72,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)
@@ -95,7 +93,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)
@@ -117,6 +114,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.0.4

2012-11-16 10:33:30

by Patil, Rachna

[permalink] [raw]
Subject: RE: [PATCH RESEND 0/7] MFD: ti_am335x_tscadc: DT support and TSC features addition

Hi,

This is just a gentle reminder of the patch set I had posted earlier viz.
"[PATCH RESEND 0/7] MFD: ti_am335x_tscadc: DT support and TSC features addition"
Can this patch set be pulled in if there are no review comments.
This patch set does not break anything existing, it just adds new features and DT support for the MFD core and its clients.

Regards,
Rachna

On Wed, Nov 07, 2012 at 12:21:57, Patil, Rachna wrote:
> This patch set is a cumulative set of [1] and [2] sent earlier.
>
> Note that there are no code changes in either of the patch set, only rebased on top of MFD-next to make sure that all the patches apply without any conflicts.
>
> This patch set has been tested on AM335x EVM and is based on top of [3].
>
> [1] http://www.spinics.net/lists/linux-input/msg23060.html
> [2] http://www.spinics.net/lists/linux-input/msg23090.html
> [3] https://lkml.org/lkml/2012/11/6/67
>
> Patil, Rachna (7):
> input: ti_am335x_tsc: Step enable bits made configurable
> input: ti_am335x_tsc: Order of TSC wires, made configurable
> input: ti_am335x_tsc: Add variance filter
> MFD: ti_am335x_tscadc: add device tree binding information
> MFD: ti_am335x_tscadc: Add DT support
> input: ti_am335x_tsc: Add DT support
> IIO: ti_am335x_adc: Add DT support
>
> .../devicetree/bindings/mfd/ti_am335x_tscadc.txt | 35 +++
> drivers/iio/adc/ti_am335x_adc.c | 24 ++-
> drivers/input/touchscreen/ti_am335x_tsc.c | 239 +++++++++++++++++---
> drivers/mfd/ti_am335x_tscadc.c | 28 ++-
> include/linux/input/ti_am335x_tsc.h | 12 +
> include/linux/mfd/ti_am335x_tscadc.h | 11 +-
> 6 files changed, 308 insertions(+), 41 deletions(-) create mode 100644 Documentation/devicetree/bindings/mfd/ti_am335x_tscadc.txt
>
>

2012-11-21 17:00:39

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH RESEND 0/7] MFD: ti_am335x_tscadc: DT support and TSC features addition

Hi Rachna,

On Fri, Nov 16, 2012 at 10:33:00AM +0000, Patil, Rachna wrote:
> Hi,
>
> This is just a gentle reminder of the patch set I had posted earlier viz.
> "[PATCH RESEND 0/7] MFD: ti_am335x_tscadc: DT support and TSC features addition"
> Can this patch set be pulled in if there are no review comments.
> This patch set does not break anything existing, it just adds new features and DT support for the MFD core and its clients.
I'm fine with the MFD part, but did you get Dmitry's ACK on the input ones ?

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/

2012-11-21 18:32:30

by Dmitry Torokhov

[permalink] [raw]
Subject: Re: [PATCH RESEND 6/7] input: ti_am335x_tsc: Add DT support

Hi Rachna,

On Wed, Nov 07, 2012 at 12:22:03PM +0530, Patil, Rachna wrote:
> Add DT support for client touchscreen driver
>
> Signed-off-by: Patil, Rachna <[email protected]>
> ---
> drivers/input/touchscreen/ti_am335x_tsc.c | 60 ++++++++++++++++++++++++-----
> 1 files changed, 50 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
> index 7a26810..c063cf6 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>
>
> @@ -398,12 +400,18 @@ static int __devinit 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 mfd_tscadc_board *pdata;
> - int err;
> -
> - pdata = tscadc_dev->dev->platform_data;
> -
> - if (!pdata) {
> + int err, i;
> + struct mfd_tscadc_board *pdata = NULL;
> + struct device_node *node = NULL;
> + u32 val32, wires_conf[4];
> +
> + if (tscadc_dev->dev->of_node) {
> + node = tscadc_dev->dev->of_node;
> + node = of_find_node_by_name(node, "tsc");
> + } else
> + pdata = tscadc_dev->dev->platform_data;
> +
> + if (!pdata && !node) {
> dev_err(&pdev->dev, "Could not find platform data\n");
> return -EINVAL;
> }
> @@ -421,11 +429,43 @@ static int __devinit 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,
> +
> + if (node) {
> + err = of_property_read_u32(node, "wires", &val32);
> + if (err < 0)
> + goto err_free_mem;
> + else
> + ts_dev->wires = val32;
> +
> + err = of_property_read_u32(node, "x-plate-resistance", &val32);
> + if (err < 0)
> + goto err_free_mem;
> + else
> + ts_dev->x_plate_resistance = val32;
> +
> + err = of_property_read_u32(node, "steps-to-configure", &val32);
> + if (err < 0)
> + goto err_free_mem;
> + else
> + ts_dev->steps_to_configure = val32;
> +
> + err = of_property_read_u32_array(node, "wire-config",
> + wires_conf, ARRAY_SIZE(wires_conf));
> + if (err < 0)
> + goto err_free_mem;
> + else {
> + for (i = 0; i < ARRAY_SIZE(wires_conf); i++)
> + ts_dev->config_inp[i] = wires_conf[i];
> + }
> + } else {
> + 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));

I believe if platform data is supplied it should take precedence over DT
data so that parameters can be adjusted if really needed.

> + }
>
> err = request_irq(ts_dev->irq, titsc_irq,
> 0, pdev->dev.driver->name, ts_dev);
> --
> 1.7.0.4
>
>

Thanks.

--
Dmitry

2012-11-21 18:33:56

by Dmitry Torokhov

[permalink] [raw]
Subject: Re: [PATCH RESEND 3/7] input: ti_am335x_tsc: Add variance filter

Hi Rachna,

On Wed, Nov 07, 2012 at 12:22:00PM +0530, Patil, Rachna wrote:
> Only fine tuning variance parameter present in tslib
> utility does not help in removing all the ADC noise.
> This logic of filtering is necessary to get this
> touchscreen to work finely.

No, if filtering in tslib is not adequate please fix tslib so that your
work is usable for other devices as well.

Thanks.

--
Dmitry

2012-11-27 07:07:33

by Patil, Rachna

[permalink] [raw]
Subject: RE: [PATCH RESEND 3/7] input: ti_am335x_tsc: Add variance filter

On Thu, Nov 22, 2012 at 00:03:50, Dmitry Torokhov wrote:
> Hi Rachna,

Hi Dmitry,

>
> On Wed, Nov 07, 2012 at 12:22:00PM +0530, Patil, Rachna wrote:
> > Only fine tuning variance parameter present in tslib utility does not
> > help in removing all the ADC noise.
> > This logic of filtering is necessary to get this touchscreen to work
> > finely.
>
> No, if filtering in tslib is not adequate please fix tslib so that your work is usable for other devices as well.

For now I will drop this patch from the patch set and send across the next version of the set with review comments on remaining patches addressed.
I will take up tslib separately.

Regards,
Rachna

>
> Thanks.
>
> --
> Dmitry
>

2012-11-27 07:11:44

by Patil, Rachna

[permalink] [raw]
Subject: RE: [PATCH RESEND 6/7] input: ti_am335x_tsc: Add DT support

Hi Dmitry,

On Thu, Nov 22, 2012 at 00:02:23, Dmitry Torokhov wrote:
> Hi Rachna,
>
> On Wed, Nov 07, 2012 at 12:22:03PM +0530, Patil, Rachna wrote:
> > Add DT support for client touchscreen driver
> >
> > Signed-off-by: Patil, Rachna <[email protected]>
> > ---
> > drivers/input/touchscreen/ti_am335x_tsc.c | 60 ++++++++++++++++++++++++-----
> > 1 files changed, 50 insertions(+), 10 deletions(-)
> >
> > diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c
> > b/drivers/input/touchscreen/ti_am335x_tsc.c
> > index 7a26810..c063cf6 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>
> >
> > @@ -398,12 +400,18 @@ static int __devinit 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 mfd_tscadc_board *pdata;
> > - int err;
> > -
> > - pdata = tscadc_dev->dev->platform_data;
> > -
> > - if (!pdata) {
> > + int err, i;
> > + struct mfd_tscadc_board *pdata = NULL;
> > + struct device_node *node = NULL;
> > + u32 val32, wires_conf[4];
> > +
> > + if (tscadc_dev->dev->of_node) {
> > + node = tscadc_dev->dev->of_node;
> > + node = of_find_node_by_name(node, "tsc");
> > + } else
> > + pdata = tscadc_dev->dev->platform_data;
> > +
> > + if (!pdata && !node) {
> > dev_err(&pdev->dev, "Could not find platform data\n");
> > return -EINVAL;
> > }
> > @@ -421,11 +429,43 @@ static int __devinit 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,
> > +
> > + if (node) {
> > + err = of_property_read_u32(node, "wires", &val32);
> > + if (err < 0)
> > + goto err_free_mem;
> > + else
> > + ts_dev->wires = val32;
> > +
> > + err = of_property_read_u32(node, "x-plate-resistance", &val32);
> > + if (err < 0)
> > + goto err_free_mem;
> > + else
> > + ts_dev->x_plate_resistance = val32;
> > +
> > + err = of_property_read_u32(node, "steps-to-configure", &val32);
> > + if (err < 0)
> > + goto err_free_mem;
> > + else
> > + ts_dev->steps_to_configure = val32;
> > +
> > + err = of_property_read_u32_array(node, "wire-config",
> > + wires_conf, ARRAY_SIZE(wires_conf));
> > + if (err < 0)
> > + goto err_free_mem;
> > + else {
> > + for (i = 0; i < ARRAY_SIZE(wires_conf); i++)
> > + ts_dev->config_inp[i] = wires_conf[i];
> > + }
> > + } else {
> > + 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));
>
> I believe if platform data is supplied it should take precedence over DT data so that parameters can be adjusted if really needed.

Ok. I will fix this is in v2.

Regards,
Rachna

2012-11-27 07:14:59

by Patil, Rachna

[permalink] [raw]
Subject: RE: [PATCH RESEND 0/7] MFD: ti_am335x_tscadc: DT support and TSC features addition

Hi Samuel,

On Wed, Nov 21, 2012 at 22:30:21, Samuel Ortiz wrote:
> Hi Rachna,
>
> On Fri, Nov 16, 2012 at 10:33:00AM +0000, Patil, Rachna wrote:
> > Hi,
> >
> > This is just a gentle reminder of the patch set I had posted earlier viz.
> > "[PATCH RESEND 0/7] MFD: ti_am335x_tscadc: DT support and TSC features addition"
> > Can this patch set be pulled in if there are no review comments.
> > This patch set does not break anything existing, it just adds new features and DT support for the MFD core and its clients.
> I'm fine with the MFD part, but did you get Dmitry's ACK on the input ones ?

I received few comments from Dmitry, I will be sending out v2 soon.

Regards,
Rachna

>
> Cheers,
> Samuel.
>
> --
> Intel Open Source Technology Centre
> http://oss.intel.com/
>