lkml.org 
[lkml]   [2009]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] TSC2007: private data for platform callbacks.
Add a private data field to the tsc2007 platform data and pass this
to the callbacks.

Signed-off-by: Manuel Lauss <mano@roarinelk.homelinux.net>
---
drivers/input/touchscreen/tsc2007.c | 52 +++++++++++++++++++++++-----------
include/linux/i2c/tsc2007.h | 10 ++++---
2 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/drivers/input/touchscreen/tsc2007.c b/drivers/input/touchscreen/tsc2007.c
index 948e167..5c4242d 100644
--- a/drivers/input/touchscreen/tsc2007.c
+++ b/drivers/input/touchscreen/tsc2007.c
@@ -83,10 +83,35 @@ struct tsc2007 {
unsigned pendown;
int irq;

- int (*get_pendown_state)(void);
- void (*clear_penirq)(void);
+ struct tsc2007_platform_data *pd;
};

+/* ask platform for pendown state */
+static inline int ts_get_pendown_state(struct tsc2007 *ts)
+{
+ return ts->pd->get_pendown_state(ts->pd->priv);
+}
+
+/* ask platform to clear pendown irq if available */
+static inline void ts_clear_penirq(struct tsc2007 *ts)
+{
+ if (ts->pd->clear_penirq)
+ ts->pd->clear_penirq(ts->pd->priv);
+}
+
+static inline void ts_init_platform_hw(struct tsc2007 *ts)
+{
+ if (ts->pd->init_platform_hw)
+ ts->pd->init_platform_hw(ts->pd->priv);
+}
+
+static inline void ts_exit_platform_hw(struct tsc2007 *ts)
+{
+ if (ts->pd->exit_platform_hw)
+ ts->pd->exit_platform_hw(ts->pd->priv);
+}
+
+
static inline int tsc2007_xfer(struct tsc2007 *tsc, u8 cmd)
{
s32 data;
@@ -129,7 +154,7 @@ static void tsc2007_send_event(void *tsc)
rt = z2;
rt -= z1;
rt *= x;
- rt *= ts->x_plate_ohms;
+ rt *= ts->pd->x_plate_ohms;
rt /= z1;
rt = (rt + 2047) >> 12;
} else
@@ -204,7 +229,7 @@ static enum hrtimer_restart tsc2007_timer(struct hrtimer *handle)

spin_lock_irqsave(&ts->lock, flags);

- if (unlikely(!ts->get_pendown_state() && ts->pendown)) {
+ if (unlikely(!ts_get_pendown_state(ts) && ts->pendown)) {
struct input_dev *input = ts->input;

dev_dbg(&ts->client->dev, "UP\n");
@@ -235,14 +260,13 @@ static irqreturn_t tsc2007_irq(int irq, void *handle)

spin_lock_irqsave(&ts->lock, flags);

- if (likely(ts->get_pendown_state())) {
+ if (likely(ts_get_pendown_state(ts))) {
disable_irq_nosync(ts->irq);
hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_DELAY),
HRTIMER_MODE_REL);
}

- if (ts->clear_penirq)
- ts->clear_penirq();
+ ts_clear_penirq(ts);

spin_unlock_irqrestore(&ts->lock, flags);

@@ -253,7 +277,7 @@ static int tsc2007_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct tsc2007 *ts;
- struct tsc2007_platform_data *pdata = pdata = client->dev.platform_data;
+ struct tsc2007_platform_data *pdata = client->dev.platform_data;
struct input_dev *input_dev;
int err;

@@ -283,12 +307,8 @@ static int tsc2007_probe(struct i2c_client *client,

spin_lock_init(&ts->lock);

- ts->model = pdata->model;
- ts->x_plate_ohms = pdata->x_plate_ohms;
- ts->get_pendown_state = pdata->get_pendown_state;
- ts->clear_penirq = pdata->clear_penirq;
-
- pdata->init_platform_hw();
+ ts->pd = pdata;
+ ts_init_platform_hw(ts);

snprintf(ts->phys, sizeof(ts->phys),
"%s/input0", dev_name(&client->dev));
@@ -335,10 +355,8 @@ static int tsc2007_probe(struct i2c_client *client,
static int tsc2007_remove(struct i2c_client *client)
{
struct tsc2007 *ts = i2c_get_clientdata(client);
- struct tsc2007_platform_data *pdata;

- pdata = client->dev.platform_data;
- pdata->exit_platform_hw();
+ ts_exit_platform_hw(ts);

free_irq(ts->irq, ts);
hrtimer_cancel(&ts->timer);
diff --git a/include/linux/i2c/tsc2007.h b/include/linux/i2c/tsc2007.h
index c6361fb..45582b3 100644
--- a/include/linux/i2c/tsc2007.h
+++ b/include/linux/i2c/tsc2007.h
@@ -7,11 +7,13 @@ struct tsc2007_platform_data {
u16 model; /* 2007. */
u16 x_plate_ohms;

- int (*get_pendown_state)(void);
- void (*clear_penirq)(void); /* If needed, clear 2nd level
+ int (*get_pendown_state)(void *priv);
+ void (*clear_penirq)(void *priv); /* If needed, clear 2nd level
interrupt source */
- int (*init_platform_hw)(void);
- void (*exit_platform_hw)(void);
+ int (*init_platform_hw)(void *priv);
+ void (*exit_platform_hw)(void *priv);
+
+ void *priv; /* passed to callbacks */
};

#endif
--
1.6.3


\
 
 \ /
  Last update: 2009-05-14 12:11    [W:1.234 / U:0.052 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site