[PATCH 3/3] Fix ts_filter_linear sysfs path
Nelson Castillo
nelsoneci at gmail.com
Mon Dec 15 06:50:10 CET 2008
With this patch we can set the calibration data in:
/sys/class/i2c-adapter/i2c-0/0-0073/s3c2440-ts/calibration/[0-6]
We can do it in two ways:
1) send "struct platform_device *pdev" to the filters so that they
can register sysfs objects.
2) modify the TS driver to add calibration logic, not using the same
API the filters use but a different one for calibration.
I did prefer the first alternative. Is it OK to trust pdev to the
filters? We could also share pdev's kobject only.
Signed-off-by: Nelson Castillo <nelsoneci at gmail.com>
---
drivers/input/touchscreen/s3c2410_ts.c | 6 +++---
drivers/input/touchscreen/ts_filter.c | 12 +++++++-----
drivers/input/touchscreen/ts_filter_group.c | 6 ++++--
drivers/input/touchscreen/ts_filter_linear.c | 11 ++++++-----
drivers/input/touchscreen/ts_filter_mean.c | 6 ++++--
drivers/input/touchscreen/ts_filter_median.c | 6 ++++--
6 files changed, 28 insertions(+), 19 deletions(-)
diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c
index 4159ada..bc9b410 100644
--- a/drivers/input/touchscreen/s3c2410_ts.c
+++ b/drivers/input/touchscreen/s3c2410_ts.c
@@ -435,7 +435,7 @@ static int __init s3c2410ts_probe(struct platform_device *pdev)
/* create the filter chain set up for the 2 coordinates we produce */
ret = ts_filter_create_chain(
- (struct ts_filter_api **)&info->filter_sequence,
+ pdev, (struct ts_filter_api **)&info->filter_sequence,
(void *)&info->filter_config, ts.tsf, ARRAY_SIZE(ts.coords));
if (ret)
dev_info(&pdev->dev, "%d filter(s) initialized\n", ret);
@@ -484,7 +484,7 @@ bail5:
bail4:
disable_irq(IRQ_ADC);
bail3:
- ts_filter_destroy_chain(ts.tsf);
+ ts_filter_destroy_chain(pdev, ts.tsf);
kfifo_free(ts.event_fifo);
bail2:
input_unregister_device(ts.dev);
@@ -511,7 +511,7 @@ static int s3c2410ts_remove(struct platform_device *pdev)
input_unregister_device(ts.dev);
iounmap(base_addr);
- ts_filter_destroy_chain(ts.tsf);
+ ts_filter_destroy_chain(pdev, ts.tsf);
kfifo_free(ts.event_fifo);
diff --git a/drivers/input/touchscreen/ts_filter.c b/drivers/input/touchscreen/ts_filter.c
index e141bd8..1508388 100644
--- a/drivers/input/touchscreen/ts_filter.c
+++ b/drivers/input/touchscreen/ts_filter.c
@@ -20,8 +20,9 @@
#include <linux/device.h>
#include <linux/ts_filter.h>
-int ts_filter_create_chain(struct ts_filter_api **api, void **config,
- struct ts_filter **list, int count_coords)
+int ts_filter_create_chain(struct platform_device *pdev,
+ struct ts_filter_api **api, void **config,
+ struct ts_filter **list, int count_coords)
{
int count = 0;
struct ts_filter *last = NULL;
@@ -30,7 +31,7 @@ int ts_filter_create_chain(struct ts_filter_api **api, void **config,
return 0;
while (*api && count < MAX_TS_FILTER_CHAIN) {
- *list = ((*api)->create)(*config++, count_coords);
+ *list = ((*api)->create)(pdev, *config++, count_coords);
if (!*list) {
printk(KERN_ERR "Filter %d failed init\n", count);
return count;
@@ -47,14 +48,15 @@ int ts_filter_create_chain(struct ts_filter_api **api, void **config,
}
EXPORT_SYMBOL_GPL(ts_filter_create_chain);
-void ts_filter_destroy_chain(struct ts_filter **list)
+void ts_filter_destroy_chain(struct platform_device *pdev,
+ struct ts_filter **list)
{
struct ts_filter **first;
int count = 0;
first = list;
while (*list && count++ < MAX_TS_FILTER_CHAIN) {
- ((*list)->api->destroy)(*list);
+ ((*list)->api->destroy)(pdev, *list);
list++;
}
*first = NULL;
diff --git a/drivers/input/touchscreen/ts_filter_group.c b/drivers/input/touchscreen/ts_filter_group.c
index 250613f..80e6677 100644
--- a/drivers/input/touchscreen/ts_filter_group.c
+++ b/drivers/input/touchscreen/ts_filter_group.c
@@ -59,7 +59,8 @@ static void ts_filter_group_clear(struct ts_filter *tsf)
(tsf->next->api->clear)(tsf->next);
}
-static struct ts_filter *ts_filter_group_create(void *conf, int count_coords)
+static struct ts_filter *ts_filter_group_create(struct platform_device *pdev,
+ void *conf, int count_coords)
{
struct ts_filter_group *tsfg;
int i;
@@ -97,7 +98,8 @@ static struct ts_filter *ts_filter_group_create(void *conf, int count_coords)
return &tsfg->tsf;
}
-static void ts_filter_group_destroy(struct ts_filter *tsf)
+static void ts_filter_group_destroy(struct platform_device *pdev,
+ struct ts_filter *tsf)
{
struct ts_filter_group *tsfg = (struct ts_filter_group *)tsf;
diff --git a/drivers/input/touchscreen/ts_filter_linear.c b/drivers/input/touchscreen/ts_filter_linear.c
index 01b66a1..4803e17 100644
--- a/drivers/input/touchscreen/ts_filter_linear.c
+++ b/drivers/input/touchscreen/ts_filter_linear.c
@@ -86,7 +86,8 @@ static ssize_t const_store(struct const_obj *obj, struct const_attribute *attr,
* filter functions
*/
-static struct ts_filter *ts_filter_linear_create(void *conf, int count_coords)
+static struct ts_filter *ts_filter_linear_create(struct platform_device *pdev,
+ void *conf, int count_coords)
{
struct ts_filter_linear *tsfl;
int i;
@@ -118,8 +119,8 @@ static struct ts_filter *ts_filter_linear_create(void *conf, int count_coords)
tsfl->c_obj.tsfl = tsfl; /* kernel frees tsfl in const_release */
/* TODO: /sys/ts-calibration is not OK */
- ret = kobject_init_and_add(&tsfl->c_obj.kobj, &tsfl->const_ktype, NULL,
- "ts-calibration");
+ ret = kobject_init_and_add(&tsfl->c_obj.kobj, &tsfl->const_ktype,
+ &pdev->dev.kobj, "calibration");
if (ret) {
kobject_put(&tsfl->c_obj.kobj);
return NULL;
@@ -130,8 +131,8 @@ static struct ts_filter *ts_filter_linear_create(void *conf, int count_coords)
return &tsfl->tsf;
}
-
-static void ts_filter_linear_destroy(struct ts_filter *tsf)
+static void ts_filter_linear_destroy(struct platform_device *pdev,
+ struct ts_filter *tsf)
{
struct ts_filter_linear *tsfl = (struct ts_filter_linear *)tsf;
diff --git a/drivers/input/touchscreen/ts_filter_mean.c b/drivers/input/touchscreen/ts_filter_mean.c
index a2f1748..a7b4a5a 100644
--- a/drivers/input/touchscreen/ts_filter_mean.c
+++ b/drivers/input/touchscreen/ts_filter_mean.c
@@ -56,7 +56,8 @@ static void ts_filter_mean_clear(struct ts_filter *tsf)
(tsf->next->api->clear)(tsf->next);
}
-static struct ts_filter *ts_filter_mean_create(void *config, int count_coords)
+static struct ts_filter *ts_filter_mean_create(struct platform_device *pdev,
+ void *config, int count_coords)
{
int *p;
int n;
@@ -96,7 +97,8 @@ static struct ts_filter *ts_filter_mean_create(void *config, int count_coords)
return &tsfs->tsf;
}
-static void ts_filter_mean_destroy(struct ts_filter *tsf)
+static void ts_filter_mean_destroy(struct platform_device *pdev,
+ struct ts_filter *tsf)
{
struct ts_filter_mean *tsfs = (struct ts_filter_mean *)tsf;
diff --git a/drivers/input/touchscreen/ts_filter_median.c b/drivers/input/touchscreen/ts_filter_median.c
index 67dd3fe..883ab06 100644
--- a/drivers/input/touchscreen/ts_filter_median.c
+++ b/drivers/input/touchscreen/ts_filter_median.c
@@ -81,7 +81,8 @@ static void ts_filter_median_clear(struct ts_filter *tsf)
(tsf->next->api->clear)(tsf->next);
}
-static struct ts_filter *ts_filter_median_create(void * conf, int count_coords)
+static struct ts_filter *ts_filter_median_create(struct platform_device *pdev,
+ void *conf, int count_coords)
{
int *p;
int n;
@@ -120,7 +121,8 @@ static struct ts_filter *ts_filter_median_create(void * conf, int count_coords)
return &tsfm->tsf;
}
-static void ts_filter_median_destroy(struct ts_filter *tsf)
+static void ts_filter_median_destroy(struct platform_device *pdev,
+ struct ts_filter *tsf)
{
struct ts_filter_median *tsfm = (struct ts_filter_median *)tsf;
diff --git a/include/linux/ts_filter.h b/include/linux/ts_filter.h
index 715f1ba..1671044 100644
--- a/include/linux/ts_filter.h
+++ b/include/linux/ts_filter.h
@@ -7,6 +7,8 @@
* (c) 2008 Andy Green <andy at openmoko.com>
*/
+#include <linux/platform_device.h>
+
#define MAX_TS_FILTER_CHAIN 4 /* max filters you can chain up */
#define MAX_TS_FILTER_COORDS 3 /* X, Y and Z (pressure) */
@@ -15,8 +17,9 @@ struct ts_filter;
/* operations that a filter can perform
*/
struct ts_filter_api {
- struct ts_filter * (*create)(void *config, int count_coords);
- void (*destroy)(struct ts_filter *filter);
+ struct ts_filter * (*create)(struct platform_device *pdev, void *config,
+ int count_coords);
+ void (*destroy)(struct platform_device *pdev, struct ts_filter *filter);
void (*clear)(struct ts_filter *filter);
int (*process)(struct ts_filter *filter, int *coords);
void (*scale)(struct ts_filter *filter, int *coords);
@@ -41,10 +44,13 @@ struct ts_filter {
* array and fills in ->next pointers to create the chain
*/
-extern int ts_filter_create_chain(struct ts_filter_api **api, void **config,
- struct ts_filter **list, int count_coords);
+extern int ts_filter_create_chain(struct platform_device *pdev,
+ struct ts_filter_api **api, void **config,
+ struct ts_filter **list, int count_coords);
/* helper to destroy a whole chain from the list of filter pointers */
-extern void ts_filter_destroy_chain(struct ts_filter **list);
+extern void ts_filter_destroy_chain(struct platform_device *pdev,
+ struct ts_filter **list);
+
#endif
More information about the openmoko-kernel
mailing list