linux/drivers/input/touchscreen/ucb1400_ts.c
<<
>>
Prefs
   1/*
   2 *  Philips UCB1400 touchscreen driver
   3 *
   4 *  Author:     Nicolas Pitre
   5 *  Created:    September 25, 2006
   6 *  Copyright:  MontaVista Software, Inc.
   7 *
   8 * Spliting done by: Marek Vasut <marek.vasut@gmail.com>
   9 * If something doesnt work and it worked before spliting, e-mail me,
  10 * dont bother Nicolas please ;-)
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of the GNU General Public License version 2 as
  14 * published by the Free Software Foundation.
  15 *
  16 * This code is heavily based on ucb1x00-*.c copyrighted by Russell King
  17 * covering the UCB1100, UCB1200 and UCB1300..  Support for the UCB1400 has
  18 * been made separate from ucb1x00-core/ucb1x00-ts on Russell's request.
  19 */
  20
  21#include <linux/module.h>
  22#include <linux/init.h>
  23#include <linux/completion.h>
  24#include <linux/delay.h>
  25#include <linux/input.h>
  26#include <linux/device.h>
  27#include <linux/interrupt.h>
  28#include <linux/suspend.h>
  29#include <linux/slab.h>
  30#include <linux/kthread.h>
  31#include <linux/freezer.h>
  32#include <linux/ucb1400.h>
  33
  34static int adcsync;
  35static int ts_delay = 55; /* us */
  36static int ts_delay_pressure;   /* us */
  37
  38/* Switch to interrupt mode. */
  39static inline void ucb1400_ts_mode_int(struct snd_ac97 *ac97)
  40{
  41        ucb1400_reg_write(ac97, UCB_TS_CR,
  42                        UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW |
  43                        UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND |
  44                        UCB_TS_CR_MODE_INT);
  45}
  46
  47/*
  48 * Switch to pressure mode, and read pressure.  We don't need to wait
  49 * here, since both plates are being driven.
  50 */
  51static inline unsigned int ucb1400_ts_read_pressure(struct ucb1400_ts *ucb)
  52{
  53        ucb1400_reg_write(ucb->ac97, UCB_TS_CR,
  54                        UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW |
  55                        UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND |
  56                        UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
  57        udelay(ts_delay_pressure);
  58        return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync);
  59}
  60
  61/*
  62 * Switch to X position mode and measure Y plate.  We switch the plate
  63 * configuration in pressure mode, then switch to position mode.  This
  64 * gives a faster response time.  Even so, we need to wait about 55us
  65 * for things to stabilise.
  66 */
  67static inline unsigned int ucb1400_ts_read_xpos(struct ucb1400_ts *ucb)
  68{
  69        ucb1400_reg_write(ucb->ac97, UCB_TS_CR,
  70                        UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW |
  71                        UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
  72        ucb1400_reg_write(ucb->ac97, UCB_TS_CR,
  73                        UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW |
  74                        UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
  75        ucb1400_reg_write(ucb->ac97, UCB_TS_CR,
  76                        UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW |
  77                        UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA);
  78
  79        udelay(ts_delay);
  80
  81        return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync);
  82}
  83
  84/*
  85 * Switch to Y position mode and measure X plate.  We switch the plate
  86 * configuration in pressure mode, then switch to position mode.  This
  87 * gives a faster response time.  Even so, we need to wait about 55us
  88 * for things to stabilise.
  89 */
  90static inline unsigned int ucb1400_ts_read_ypos(struct ucb1400_ts *ucb)
  91{
  92        ucb1400_reg_write(ucb->ac97, UCB_TS_CR,
  93                        UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW |
  94                        UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
  95        ucb1400_reg_write(ucb->ac97, UCB_TS_CR,
  96                        UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW |
  97                        UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
  98        ucb1400_reg_write(ucb->ac97, UCB_TS_CR,
  99                        UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW |
 100                        UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA);
 101
 102        udelay(ts_delay);
 103
 104        return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPX, adcsync);
 105}
 106
 107/*
 108 * Switch to X plate resistance mode.  Set MX to ground, PX to
 109 * supply.  Measure current.
 110 */
 111static inline unsigned int ucb1400_ts_read_xres(struct ucb1400_ts *ucb)
 112{
 113        ucb1400_reg_write(ucb->ac97, UCB_TS_CR,
 114                        UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW |
 115                        UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
 116        return ucb1400_adc_read(ucb->ac97, 0, adcsync);
 117}
 118
 119/*
 120 * Switch to Y plate resistance mode.  Set MY to ground, PY to
 121 * supply.  Measure current.
 122 */
 123static inline unsigned int ucb1400_ts_read_yres(struct ucb1400_ts *ucb)
 124{
 125        ucb1400_reg_write(ucb->ac97, UCB_TS_CR,
 126                        UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW |
 127                        UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
 128        return ucb1400_adc_read(ucb->ac97, 0, adcsync);
 129}
 130
 131static inline int ucb1400_ts_pen_down(struct snd_ac97 *ac97)
 132{
 133        unsigned short val = ucb1400_reg_read(ac97, UCB_TS_CR);
 134        return val & (UCB_TS_CR_TSPX_LOW | UCB_TS_CR_TSMX_LOW);
 135}
 136
 137static inline void ucb1400_ts_irq_enable(struct snd_ac97 *ac97)
 138{
 139        ucb1400_reg_write(ac97, UCB_IE_CLEAR, UCB_IE_TSPX);
 140        ucb1400_reg_write(ac97, UCB_IE_CLEAR, 0);
 141        ucb1400_reg_write(ac97, UCB_IE_FAL, UCB_IE_TSPX);
 142}
 143
 144static inline void ucb1400_ts_irq_disable(struct snd_ac97 *ac97)
 145{
 146        ucb1400_reg_write(ac97, UCB_IE_FAL, 0);
 147}
 148
 149static void ucb1400_ts_evt_add(struct input_dev *idev, u16 pressure, u16 x, u16 y)
 150{
 151        input_report_abs(idev, ABS_X, x);
 152        input_report_abs(idev, ABS_Y, y);
 153        input_report_abs(idev, ABS_PRESSURE, pressure);
 154        input_report_key(idev, BTN_TOUCH, 1);
 155        input_sync(idev);
 156}
 157
 158static void ucb1400_ts_event_release(struct input_dev *idev)
 159{
 160        input_report_abs(idev, ABS_PRESSURE, 0);
 161        input_report_key(idev, BTN_TOUCH, 0);
 162        input_sync(idev);
 163}
 164
 165static void ucb1400_handle_pending_irq(struct ucb1400_ts *ucb)
 166{
 167        unsigned int isr;
 168
 169        isr = ucb1400_reg_read(ucb->ac97, UCB_IE_STATUS);
 170        ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, isr);
 171        ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0);
 172
 173        if (isr & UCB_IE_TSPX) {
 174                ucb1400_ts_irq_disable(ucb->ac97);
 175                enable_irq(ucb->irq);
 176        } else
 177                printk(KERN_ERR "ucb1400: unexpected IE_STATUS = %#x\n", isr);
 178}
 179
 180static int ucb1400_ts_thread(void *_ucb)
 181{
 182        struct ucb1400_ts *ucb = _ucb;
 183        struct task_struct *tsk = current;
 184        int valid = 0;
 185        struct sched_param param = { .sched_priority = 1 };
 186
 187        sched_setscheduler(tsk, SCHED_FIFO, &param);
 188
 189        set_freezable();
 190        while (!kthread_should_stop()) {
 191                unsigned int x, y, p;
 192                long timeout;
 193
 194                ucb->ts_restart = 0;
 195
 196                if (ucb->irq_pending) {
 197                        ucb->irq_pending = 0;
 198                        ucb1400_handle_pending_irq(ucb);
 199                }
 200
 201                ucb1400_adc_enable(ucb->ac97);
 202                x = ucb1400_ts_read_xpos(ucb);
 203                y = ucb1400_ts_read_ypos(ucb);
 204                p = ucb1400_ts_read_pressure(ucb);
 205                ucb1400_adc_disable(ucb->ac97);
 206
 207                /* Switch back to interrupt mode. */
 208                ucb1400_ts_mode_int(ucb->ac97);
 209
 210                msleep(10);
 211
 212                if (ucb1400_ts_pen_down(ucb->ac97)) {
 213                        ucb1400_ts_irq_enable(ucb->ac97);
 214
 215                        /*
 216                         * If we spat out a valid sample set last time,
 217                         * spit out a "pen off" sample here.
 218                         */
 219                        if (valid) {
 220                                ucb1400_ts_event_release(ucb->ts_idev);
 221                                valid = 0;
 222                        }
 223
 224                        timeout = MAX_SCHEDULE_TIMEOUT;
 225                } else {
 226                        valid = 1;
 227                        ucb1400_ts_evt_add(ucb->ts_idev, p, x, y);
 228                        timeout = msecs_to_jiffies(10);
 229                }
 230
 231                wait_event_freezable_timeout(ucb->ts_wait,
 232                        ucb->irq_pending || ucb->ts_restart ||
 233                        kthread_should_stop(), timeout);
 234        }
 235
 236        /* Send the "pen off" if we are stopping with the pen still active */
 237        if (valid)
 238                ucb1400_ts_event_release(ucb->ts_idev);
 239
 240        ucb->ts_task = NULL;
 241        return 0;
 242}
 243
 244/*
 245 * A restriction with interrupts exists when using the ucb1400, as
 246 * the codec read/write routines may sleep while waiting for codec
 247 * access completion and uses semaphores for access control to the
 248 * AC97 bus.  A complete codec read cycle could take  anywhere from
 249 * 60 to 100uSec so we *definitely* don't want to spin inside the
 250 * interrupt handler waiting for codec access.  So, we handle the
 251 * interrupt by scheduling a RT kernel thread to run in process
 252 * context instead of interrupt context.
 253 */
 254static irqreturn_t ucb1400_hard_irq(int irqnr, void *devid)
 255{
 256        struct ucb1400_ts *ucb = devid;
 257
 258        if (irqnr == ucb->irq) {
 259                disable_irq_nosync(ucb->irq);
 260                ucb->irq_pending = 1;
 261                wake_up(&ucb->ts_wait);
 262                return IRQ_HANDLED;
 263        }
 264        return IRQ_NONE;
 265}
 266
 267static int ucb1400_ts_open(struct input_dev *idev)
 268{
 269        struct ucb1400_ts *ucb = input_get_drvdata(idev);
 270        int ret = 0;
 271
 272        BUG_ON(ucb->ts_task);
 273
 274        ucb->ts_task = kthread_run(ucb1400_ts_thread, ucb, "UCB1400_ts");
 275        if (IS_ERR(ucb->ts_task)) {
 276                ret = PTR_ERR(ucb->ts_task);
 277                ucb->ts_task = NULL;
 278        }
 279
 280        return ret;
 281}
 282
 283static void ucb1400_ts_close(struct input_dev *idev)
 284{
 285        struct ucb1400_ts *ucb = input_get_drvdata(idev);
 286
 287        if (ucb->ts_task)
 288                kthread_stop(ucb->ts_task);
 289
 290        ucb1400_ts_irq_disable(ucb->ac97);
 291        ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 0);
 292}
 293
 294#ifndef NO_IRQ
 295#define NO_IRQ  0
 296#endif
 297
 298/*
 299 * Try to probe our interrupt, rather than relying on lots of
 300 * hard-coded machine dependencies.
 301 */
 302static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb)
 303{
 304        unsigned long mask, timeout;
 305
 306        mask = probe_irq_on();
 307
 308        /* Enable the ADC interrupt. */
 309        ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, UCB_IE_ADC);
 310        ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_ADC);
 311        ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff);
 312        ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0);
 313
 314        /* Cause an ADC interrupt. */
 315        ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA);
 316        ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA | UCB_ADC_START);
 317
 318        /* Wait for the conversion to complete. */
 319        timeout = jiffies + HZ/2;
 320        while (!(ucb1400_reg_read(ucb->ac97, UCB_ADC_DATA) &
 321                                                UCB_ADC_DAT_VALID)) {
 322                cpu_relax();
 323                if (time_after(jiffies, timeout)) {
 324                        printk(KERN_ERR "ucb1400: timed out in IRQ probe\n");
 325                        probe_irq_off(mask);
 326                        return -ENODEV;
 327                }
 328        }
 329        ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, 0);
 330
 331        /* Disable and clear interrupt. */
 332        ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, 0);
 333        ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0);
 334        ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff);
 335        ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0);
 336
 337        /* Read triggered interrupt. */
 338        ucb->irq = probe_irq_off(mask);
 339        if (ucb->irq < 0 || ucb->irq == NO_IRQ)
 340                return -ENODEV;
 341
 342        return 0;
 343}
 344
 345static int ucb1400_ts_probe(struct platform_device *dev)
 346{
 347        int error, x_res, y_res;
 348        struct ucb1400_ts *ucb = dev->dev.platform_data;
 349
 350        ucb->ts_idev = input_allocate_device();
 351        if (!ucb->ts_idev) {
 352                error = -ENOMEM;
 353                goto err;
 354        }
 355
 356        error = ucb1400_ts_detect_irq(ucb);
 357        if (error) {
 358                printk(KERN_ERR "UCB1400: IRQ probe failed\n");
 359                goto err_free_devs;
 360        }
 361
 362        init_waitqueue_head(&ucb->ts_wait);
 363
 364        error = request_irq(ucb->irq, ucb1400_hard_irq, IRQF_TRIGGER_RISING,
 365                                "UCB1400", ucb);
 366        if (error) {
 367                printk(KERN_ERR "ucb1400: unable to grab irq%d: %d\n",
 368                                ucb->irq, error);
 369                goto err_free_devs;
 370        }
 371        printk(KERN_DEBUG "UCB1400: found IRQ %d\n", ucb->irq);
 372
 373        input_set_drvdata(ucb->ts_idev, ucb);
 374
 375        ucb->ts_idev->dev.parent        = &dev->dev;
 376        ucb->ts_idev->name              = "UCB1400 touchscreen interface";
 377        ucb->ts_idev->id.vendor         = ucb1400_reg_read(ucb->ac97,
 378                                                AC97_VENDOR_ID1);
 379        ucb->ts_idev->id.product        = ucb->id;
 380        ucb->ts_idev->open              = ucb1400_ts_open;
 381        ucb->ts_idev->close             = ucb1400_ts_close;
 382        ucb->ts_idev->evbit[0]          = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY);
 383        ucb->ts_idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
 384
 385        ucb1400_adc_enable(ucb->ac97);
 386        x_res = ucb1400_ts_read_xres(ucb);
 387        y_res = ucb1400_ts_read_yres(ucb);
 388        ucb1400_adc_disable(ucb->ac97);
 389        printk(KERN_DEBUG "UCB1400: x/y = %d/%d\n", x_res, y_res);
 390
 391        input_set_abs_params(ucb->ts_idev, ABS_X, 0, x_res, 0, 0);
 392        input_set_abs_params(ucb->ts_idev, ABS_Y, 0, y_res, 0, 0);
 393        input_set_abs_params(ucb->ts_idev, ABS_PRESSURE, 0, 0, 0, 0);
 394
 395        error = input_register_device(ucb->ts_idev);
 396        if (error)
 397                goto err_free_irq;
 398
 399        return 0;
 400
 401err_free_irq:
 402        free_irq(ucb->irq, ucb);
 403err_free_devs:
 404        input_free_device(ucb->ts_idev);
 405err:
 406        return error;
 407
 408}
 409
 410static int ucb1400_ts_remove(struct platform_device *dev)
 411{
 412        struct ucb1400_ts *ucb = dev->dev.platform_data;
 413
 414        free_irq(ucb->irq, ucb);
 415        input_unregister_device(ucb->ts_idev);
 416        return 0;
 417}
 418
 419#ifdef CONFIG_PM
 420static int ucb1400_ts_resume(struct platform_device *dev)
 421{
 422        struct ucb1400_ts *ucb = dev->dev.platform_data;
 423
 424        if (ucb->ts_task) {
 425                /*
 426                 * Restart the TS thread to ensure the
 427                 * TS interrupt mode is set up again
 428                 * after sleep.
 429                 */
 430                ucb->ts_restart = 1;
 431                wake_up(&ucb->ts_wait);
 432        }
 433        return 0;
 434}
 435#else
 436#define ucb1400_ts_resume NULL
 437#endif
 438
 439static struct platform_driver ucb1400_ts_driver = {
 440        .probe  = ucb1400_ts_probe,
 441        .remove = ucb1400_ts_remove,
 442        .resume = ucb1400_ts_resume,
 443        .driver = {
 444                .name   = "ucb1400_ts",
 445        },
 446};
 447
 448static int __init ucb1400_ts_init(void)
 449{
 450        return platform_driver_register(&ucb1400_ts_driver);
 451}
 452
 453static void __exit ucb1400_ts_exit(void)
 454{
 455        platform_driver_unregister(&ucb1400_ts_driver);
 456}
 457
 458module_param(adcsync, bool, 0444);
 459MODULE_PARM_DESC(adcsync, "Synchronize touch readings with ADCSYNC pin.");
 460
 461module_param(ts_delay, int, 0444);
 462MODULE_PARM_DESC(ts_delay, "Delay between panel setup and"
 463                            " position read. Default = 55us.");
 464
 465module_param(ts_delay_pressure, int, 0444);
 466MODULE_PARM_DESC(ts_delay_pressure,
 467                "delay between panel setup and pressure read."
 468                "  Default = 0us.");
 469
 470module_init(ucb1400_ts_init);
 471module_exit(ucb1400_ts_exit);
 472
 473MODULE_DESCRIPTION("Philips UCB1400 touchscreen driver");
 474MODULE_LICENSE("GPL");
 475