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



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
<mano@xxxxxxxxxxxxxxxxxxxxxxx> wrote:
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.


Signed-off-by: Manuel Lauss <mano@xxxxxxxxxxxxxxxxxxxxxxx>
---
 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);

So, we don't need check here, like this:

if (ts->pd->get_pendown_state)
ret = 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;

This change shows that you need to rebase based on two patches
submitted by Lee recently.

       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@xxxxxxxxxxxxxxx
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-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • Re: 2.6.26-rt1
    ... The merge was mostly done by Steven Rostedt, I just fixed it up, added ... so I dropped Peter's cpu-hotplug patches ... More majordomo info at http://vger.kernel.org/majordomo-info.html ... Please read the FAQ at http://www.tux.org/lkml/ ...
    (Linux-Kernel)
  • Re: asm-generic update candidates?
    ... patches with the microblaze architecture. ... More majordomo info at http://vger.kernel.org/majordomo-info.html ... Please read the FAQ at http://www.tux.org/lkml/ ...
    (Linux-Kernel)
  • Re: git trees which are not yet in linux-next
    ... Heh, no, but I did read somewhere that you're only supposed to put patches ... after enough exposure they graduate into or. ... More majordomo info at http://vger.kernel.org/majordomo-info.html ... Please read the FAQ at http://www.tux.org/lkml/ ...
    (Linux-Kernel)
  • Re: [PATCH] TSC2007: private data for platform callbacks.
    ... patches by Kwangwoo Lee ... This change shows that you need to rebase based on two patches ... More majordomo info at  http://vger.kernel.org/majordomo-info.html ... Please read the FAQ at http://www.tux.org/lkml/ ...
    (Linux-Kernel)
  • Re: Bio & Biovec-1 increasing cache size, never freed during disk IO
    ... Attached slabinfo dump and dmesg dump. ... mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext ... More majordomo info at http://vger.kernel.org/majordomo-info.html ... Please read the FAQ at http://www.tux.org/lkml/ ...
    (Linux-Kernel)