lkml.org 
[lkml]   [2006]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] ucb1x00-ts: handle errors from input_register_device()
    Date
    I have not tested this (no hardware)

    --
    Dmitry

    Subject: ucb1x00-ts - handle errors from input_register_device()

    ucb1x00-ts: handle errors from input_register_device()

    Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
    ---

    drivers/mfd/ucb1x00-ts.c | 49 ++++++++++++++++++++++++++++-------------------
    1 files changed, 30 insertions(+), 19 deletions(-)

    Index: work/drivers/mfd/ucb1x00-ts.c
    ===================================================================
    --- work.orig/drivers/mfd/ucb1x00-ts.c
    +++ work/drivers/mfd/ucb1x00-ts.c
    @@ -58,6 +58,7 @@ static int adcsync;
    static inline void ucb1x00_ts_evt_add(struct ucb1x00_ts *ts, u16 pressure, u16 x, u16 y)
    {
    struct input_dev *idev = ts->idev;
    +
    input_report_abs(idev, ABS_X, x);
    input_report_abs(idev, ABS_Y, y);
    input_report_abs(idev, ABS_PRESSURE, pressure);
    @@ -67,6 +68,7 @@ static inline void ucb1x00_ts_evt_add(st
    static inline void ucb1x00_ts_event_release(struct ucb1x00_ts *ts)
    {
    struct input_dev *idev = ts->idev;
    +
    input_report_abs(idev, ABS_PRESSURE, 0);
    input_sync(idev);
    }
    @@ -189,6 +191,7 @@ static inline unsigned int ucb1x00_ts_re
    static inline int ucb1x00_ts_pen_down(struct ucb1x00_ts *ts)
    {
    unsigned int val = ucb1x00_reg_read(ts->ucb, UCB_TS_CR);
    +
    if (machine_is_collie())
    return (!(val & (UCB_TS_CR_TSPX_LOW)));
    else
    @@ -291,6 +294,7 @@ static int ucb1x00_thread(void *_ts)
    static void ucb1x00_ts_irq(int idx, void *id)
    {
    struct ucb1x00_ts *ts = id;
    +
    ucb1x00_disable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_FALLING);
    wake_up(&ts->irq_wait);
    }
    @@ -372,36 +376,43 @@ static int ucb1x00_ts_resume(struct ucb1
    static int ucb1x00_ts_add(struct ucb1x00_dev *dev)
    {
    struct ucb1x00_ts *ts;
    + struct input_dev *idev;
    + int err;

    ts = kzalloc(sizeof(struct ucb1x00_ts), GFP_KERNEL);
    - if (!ts)
    - return -ENOMEM;
    -
    - ts->idev = input_allocate_device();
    - if (!ts->idev) {
    - kfree(ts);
    - return -ENOMEM;
    + idev = input_allocate_device();
    + if (!ts || !idev) {
    + err = -ENOMEM;
    + goto fail;
    }

    ts->ucb = dev->ucb;
    + ts->idev = idev;
    ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC;

    - ts->idev->private = ts;
    - ts->idev->name = "Touchscreen panel";
    - ts->idev->id.product = ts->ucb->id;
    - ts->idev->open = ucb1x00_ts_open;
    - ts->idev->close = ucb1x00_ts_close;
    -
    - __set_bit(EV_ABS, ts->idev->evbit);
    - __set_bit(ABS_X, ts->idev->absbit);
    - __set_bit(ABS_Y, ts->idev->absbit);
    - __set_bit(ABS_PRESSURE, ts->idev->absbit);
    -
    - input_register_device(ts->idev);
    + idev->private = ts;
    + idev->name = "Touchscreen panel";
    + idev->id.product = ts->ucb->id;
    + idev->open = ucb1x00_ts_open;
    + idev->close = ucb1x00_ts_close;
    +
    + __set_bit(EV_ABS, idev->evbit);
    + __set_bit(ABS_X, idev->absbit);
    + __set_bit(ABS_Y, idev->absbit);
    + __set_bit(ABS_PRESSURE, idev->absbit);
    +
    + err = input_register_device(idev);
    + if (err)
    + goto fail;

    dev->priv = ts;

    return 0;
    +
    + fail:
    + input_free_device(idev);
    + kfree(ts);
    + return err;
    }

    static void ucb1x00_ts_remove(struct ucb1x00_dev *dev)
    -
    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/

    \
     
     \ /
      Last update: 2006-08-02 05:05    [W:4.338 / U:0.508 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site