Thread (5 messages) 5 messages, 3 authors, 2009-05-15

Re: [PATCH] TSC2007: private data for platform callbacks.

From: Kwangwoo Lee <hidden>
Date: 2009-05-15 04:25:52
Also in: lkml

Hi Manual,

On Thu, May 14, 2009 at 7:28 PM, Trilok Soni [off-list ref] wrote:
Hi Manuel,

CCing linux-input mailing list, so not deleting any code from this
e-mail while replying.

On Thu, May 14, 2009 at 3:39 PM, Manuel Lauss
[off-list ref] wrote:
quoted
Add a private data field to the tsc2007 platform data and pass this
to the callbacks.
I hope that you have created this patch on top of two recently posted
patches by Kwangwoo Lee
to merge changes from Thierry.
quoted
Signed-off-by: Manuel Lauss <redacted>
---
 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;
Why is this pd is contained in struct tsc2007?
quoted
 };

+/* ask platform for pendown state */
+static inline int ts_get_pendown_state(struct tsc2007 *ts)
+{
+       return ts->pd->get_pendown_state(ts->pd->priv);
Is it required in get_pendown_state() function in your platform?
The function just return true/false indicating the pendown state.
So, we don't need check here, like this:

if (ts->pd->get_pendown_state)
         ret =  ts->pd->get_pendown_state(ts->pd->priv);
quoted
+}
+
+/* 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;
This change shows that you need to rebase based on two patches
submitted by Lee recently.
quoted
       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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


--
---Trilok Soni
http://triloksoni.wordpress.com
http://www.linkedin.com/in/triloksoni
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Regards,

-- 
Kwangwoo Lee [off-list ref]
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help