linux/drivers/input/touchscreen/wm97xx-core.c
<<
>>
Prefs
   1/*
   2 * wm97xx-core.c  --  Touch screen driver core for Wolfson WM9705, WM9712
   3 *                    and WM9713 AC97 Codecs.
   4 *
   5 * Copyright 2003, 2004, 2005, 2006, 2007, 2008 Wolfson Microelectronics PLC.
   6 * Author: Liam Girdwood <lrg@slimlogic.co.uk>
   7 * Parts Copyright : Ian Molton <spyro@f2s.com>
   8 *                   Andrew Zabolotny <zap@homelink.ru>
   9 *                   Russell King <rmk@arm.linux.org.uk>
  10 *
  11 *  This program is free software; you can redistribute  it and/or modify it
  12 *  under  the terms of  the GNU General  Public License as published by the
  13 *  Free Software Foundation;  either version 2 of the  License, or (at your
  14 *  option) any later version.
  15 *
  16 * Notes:
  17 *
  18 *  Features:
  19 *       - supports WM9705, WM9712, WM9713
  20 *       - polling mode
  21 *       - continuous mode (arch-dependent)
  22 *       - adjustable rpu/dpp settings
  23 *       - adjustable pressure current
  24 *       - adjustable sample settle delay
  25 *       - 4 and 5 wire touchscreens (5 wire is WM9712 only)
  26 *       - pen down detection
  27 *       - battery monitor
  28 *       - sample AUX adcs
  29 *       - power management
  30 *       - codec GPIO
  31 *       - codec event notification
  32 * Todo
  33 *       - Support for async sampling control for noisy LCDs.
  34 *
  35 */
  36
  37#include <linux/module.h>
  38#include <linux/moduleparam.h>
  39#include <linux/kernel.h>
  40#include <linux/init.h>
  41#include <linux/delay.h>
  42#include <linux/string.h>
  43#include <linux/proc_fs.h>
  44#include <linux/pm.h>
  45#include <linux/interrupt.h>
  46#include <linux/bitops.h>
  47#include <linux/workqueue.h>
  48#include <linux/wm97xx.h>
  49#include <linux/uaccess.h>
  50#include <linux/io.h>
  51
  52#define TS_NAME                 "wm97xx"
  53#define WM_CORE_VERSION         "1.00"
  54#define DEFAULT_PRESSURE        0xb0c0
  55
  56
  57/*
  58 * Touchscreen absolute values
  59 *
  60 * These parameters are used to help the input layer discard out of
  61 * range readings and reduce jitter etc.
  62 *
  63 *   o min, max:- indicate the min and max values your touch screen returns
  64 *   o fuzz:- use a higher number to reduce jitter
  65 *
  66 * The default values correspond to Mainstone II in QVGA mode
  67 *
  68 * Please read
  69 * Documentation/input/input-programming.txt for more details.
  70 */
  71
  72static int abs_x[3] = {350, 3900, 5};
  73module_param_array(abs_x, int, NULL, 0);
  74MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz");
  75
  76static int abs_y[3] = {320, 3750, 40};
  77module_param_array(abs_y, int, NULL, 0);
  78MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz");
  79
  80static int abs_p[3] = {0, 150, 4};
  81module_param_array(abs_p, int, NULL, 0);
  82MODULE_PARM_DESC(abs_p, "Touchscreen absolute Pressure min, max, fuzz");
  83
  84/*
  85 * wm97xx IO access, all IO locking done by AC97 layer
  86 */
  87int wm97xx_reg_read(struct wm97xx *wm, u16 reg)
  88{
  89        if (wm->ac97)
  90                return wm->ac97->bus->ops->read(wm->ac97, reg);
  91        else
  92                return -1;
  93}
  94EXPORT_SYMBOL_GPL(wm97xx_reg_read);
  95
  96void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val)
  97{
  98        /* cache digitiser registers */
  99        if (reg >= AC97_WM9713_DIG1 && reg <= AC97_WM9713_DIG3)
 100                wm->dig[(reg - AC97_WM9713_DIG1) >> 1] = val;
 101
 102        /* cache gpio regs */
 103        if (reg >= AC97_GPIO_CFG && reg <= AC97_MISC_AFE)
 104                wm->gpio[(reg - AC97_GPIO_CFG) >> 1] = val;
 105
 106        /* wm9713 irq reg */
 107        if (reg == 0x5a)
 108                wm->misc = val;
 109
 110        if (wm->ac97)
 111                wm->ac97->bus->ops->write(wm->ac97, reg, val);
 112}
 113EXPORT_SYMBOL_GPL(wm97xx_reg_write);
 114
 115/**
 116 * wm97xx_read_aux_adc - Read the aux adc.
 117 * @wm: wm97xx device.
 118 * @adcsel: codec ADC to be read
 119 *
 120 * Reads the selected AUX ADC.
 121 */
 122
 123int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel)
 124{
 125        int power_adc = 0, auxval;
 126        u16 power = 0;
 127
 128        /* get codec */
 129        mutex_lock(&wm->codec_mutex);
 130
 131        /* When the touchscreen is not in use, we may have to power up
 132         * the AUX ADC before we can use sample the AUX inputs->
 133         */
 134        if (wm->id == WM9713_ID2 &&
 135            (power = wm97xx_reg_read(wm, AC97_EXTENDED_MID)) & 0x8000) {
 136                power_adc = 1;
 137                wm97xx_reg_write(wm, AC97_EXTENDED_MID, power & 0x7fff);
 138        }
 139
 140        /* Prepare the codec for AUX reading */
 141        wm->codec->aux_prepare(wm);
 142
 143        /* Turn polling mode on to read AUX ADC */
 144        wm->pen_probably_down = 1;
 145        wm->codec->poll_sample(wm, adcsel, &auxval);
 146
 147        if (power_adc)
 148                wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000);
 149
 150        wm->codec->dig_restore(wm);
 151
 152        wm->pen_probably_down = 0;
 153
 154        mutex_unlock(&wm->codec_mutex);
 155        return auxval & 0xfff;
 156}
 157EXPORT_SYMBOL_GPL(wm97xx_read_aux_adc);
 158
 159/**
 160 * wm97xx_get_gpio - Get the status of a codec GPIO.
 161 * @wm: wm97xx device.
 162 * @gpio: gpio
 163 *
 164 * Get the status of a codec GPIO pin
 165 */
 166
 167enum wm97xx_gpio_status wm97xx_get_gpio(struct wm97xx *wm, u32 gpio)
 168{
 169        u16 status;
 170        enum wm97xx_gpio_status ret;
 171
 172        mutex_lock(&wm->codec_mutex);
 173        status = wm97xx_reg_read(wm, AC97_GPIO_STATUS);
 174
 175        if (status & gpio)
 176                ret = WM97XX_GPIO_HIGH;
 177        else
 178                ret = WM97XX_GPIO_LOW;
 179
 180        mutex_unlock(&wm->codec_mutex);
 181        return ret;
 182}
 183EXPORT_SYMBOL_GPL(wm97xx_get_gpio);
 184
 185/**
 186 * wm97xx_set_gpio - Set the status of a codec GPIO.
 187 * @wm: wm97xx device.
 188 * @gpio: gpio
 189 *
 190 *
 191 * Set the status of a codec GPIO pin
 192 */
 193
 194void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio,
 195                                enum wm97xx_gpio_status status)
 196{
 197        u16 reg;
 198
 199        mutex_lock(&wm->codec_mutex);
 200        reg = wm97xx_reg_read(wm, AC97_GPIO_STATUS);
 201
 202        if (status & WM97XX_GPIO_HIGH)
 203                reg |= gpio;
 204        else
 205                reg &= ~gpio;
 206
 207        if (wm->id == WM9712_ID2)
 208                wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg << 1);
 209        else
 210                wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg);
 211        mutex_unlock(&wm->codec_mutex);
 212}
 213EXPORT_SYMBOL_GPL(wm97xx_set_gpio);
 214
 215/*
 216 * Codec GPIO pin configuration, this sets pin direction, polarity,
 217 * stickyness and wake up.
 218 */
 219void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, enum wm97xx_gpio_dir dir,
 220                   enum wm97xx_gpio_pol pol, enum wm97xx_gpio_sticky sticky,
 221                   enum wm97xx_gpio_wake wake)
 222{
 223        u16 reg;
 224
 225        mutex_lock(&wm->codec_mutex);
 226        reg = wm97xx_reg_read(wm, AC97_GPIO_POLARITY);
 227
 228        if (pol == WM97XX_GPIO_POL_HIGH)
 229                reg |= gpio;
 230        else
 231                reg &= ~gpio;
 232
 233        wm97xx_reg_write(wm, AC97_GPIO_POLARITY, reg);
 234        reg = wm97xx_reg_read(wm, AC97_GPIO_STICKY);
 235
 236        if (sticky == WM97XX_GPIO_STICKY)
 237                reg |= gpio;
 238        else
 239                reg &= ~gpio;
 240
 241        wm97xx_reg_write(wm, AC97_GPIO_STICKY, reg);
 242        reg = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP);
 243
 244        if (wake == WM97XX_GPIO_WAKE)
 245                reg |= gpio;
 246        else
 247                reg &= ~gpio;
 248
 249        wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, reg);
 250        reg = wm97xx_reg_read(wm, AC97_GPIO_CFG);
 251
 252        if (dir == WM97XX_GPIO_IN)
 253                reg |= gpio;
 254        else
 255                reg &= ~gpio;
 256
 257        wm97xx_reg_write(wm, AC97_GPIO_CFG, reg);
 258        mutex_unlock(&wm->codec_mutex);
 259}
 260EXPORT_SYMBOL_GPL(wm97xx_config_gpio);
 261
 262/*
 263 * Configure the WM97XX_PRP value to use while system is suspended.
 264 * If a value other than 0 is set then WM97xx pen detection will be
 265 * left enabled in the configured mode while the system is in suspend,
 266 * the device has users and suspend has not been disabled via the
 267 * wakeup sysfs entries.
 268 *
 269 * @wm:   WM97xx device to configure
 270 * @mode: WM97XX_PRP value to configure while suspended
 271 */
 272void wm97xx_set_suspend_mode(struct wm97xx *wm, u16 mode)
 273{
 274        wm->suspend_mode = mode;
 275        device_init_wakeup(&wm->input_dev->dev, mode != 0);
 276}
 277EXPORT_SYMBOL_GPL(wm97xx_set_suspend_mode);
 278
 279/*
 280 * Handle a pen down interrupt.
 281 */
 282static void wm97xx_pen_irq_worker(struct work_struct *work)
 283{
 284        struct wm97xx *wm = container_of(work, struct wm97xx, pen_event_work);
 285        int pen_was_down = wm->pen_is_down;
 286
 287        /* do we need to enable the touch panel reader */
 288        if (wm->id == WM9705_ID2) {
 289                if (wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD) &
 290                                        WM97XX_PEN_DOWN)
 291                        wm->pen_is_down = 1;
 292                else
 293                        wm->pen_is_down = 0;
 294        } else {
 295                u16 status, pol;
 296                mutex_lock(&wm->codec_mutex);
 297                status = wm97xx_reg_read(wm, AC97_GPIO_STATUS);
 298                pol = wm97xx_reg_read(wm, AC97_GPIO_POLARITY);
 299
 300                if (WM97XX_GPIO_13 & pol & status) {
 301                        wm->pen_is_down = 1;
 302                        wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol &
 303                                                ~WM97XX_GPIO_13);
 304                } else {
 305                        wm->pen_is_down = 0;
 306                        wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol |
 307                                         WM97XX_GPIO_13);
 308                }
 309
 310                if (wm->id == WM9712_ID2)
 311                        wm97xx_reg_write(wm, AC97_GPIO_STATUS, (status &
 312                                                ~WM97XX_GPIO_13) << 1);
 313                else
 314                        wm97xx_reg_write(wm, AC97_GPIO_STATUS, status &
 315                                                ~WM97XX_GPIO_13);
 316                mutex_unlock(&wm->codec_mutex);
 317        }
 318
 319        /* If the system is not using continuous mode or it provides a
 320         * pen down operation then we need to schedule polls while the
 321         * pen is down.  Otherwise the machine driver is responsible
 322         * for scheduling reads.
 323         */
 324        if (!wm->mach_ops->acc_enabled || wm->mach_ops->acc_pen_down) {
 325                if (wm->pen_is_down && !pen_was_down) {
 326                        /* Data is not availiable immediately on pen down */
 327                        queue_delayed_work(wm->ts_workq, &wm->ts_reader, 1);
 328                }
 329
 330                /* Let ts_reader report the pen up for debounce. */
 331                if (!wm->pen_is_down && pen_was_down)
 332                        wm->pen_is_down = 1;
 333        }
 334
 335        if (!wm->pen_is_down && wm->mach_ops->acc_enabled)
 336                wm->mach_ops->acc_pen_up(wm);
 337
 338        wm->mach_ops->irq_enable(wm, 1);
 339}
 340
 341/*
 342 * Codec PENDOWN irq handler
 343 *
 344 * We have to disable the codec interrupt in the handler because it
 345 * can take upto 1ms to clear the interrupt source. We schedule a task
 346 * in a work queue to do the actual interaction with the chip.  The
 347 * interrupt is then enabled again in the slow handler when the source
 348 * has been cleared.
 349 */
 350static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id)
 351{
 352        struct wm97xx *wm = dev_id;
 353
 354        if (!work_pending(&wm->pen_event_work)) {
 355                wm->mach_ops->irq_enable(wm, 0);
 356                queue_work(wm->ts_workq, &wm->pen_event_work);
 357        }
 358
 359        return IRQ_HANDLED;
 360}
 361
 362/*
 363 * initialise pen IRQ handler and workqueue
 364 */
 365static int wm97xx_init_pen_irq(struct wm97xx *wm)
 366{
 367        u16 reg;
 368
 369        /* If an interrupt is supplied an IRQ enable operation must also be
 370         * provided. */
 371        BUG_ON(!wm->mach_ops->irq_enable);
 372
 373        if (request_irq(wm->pen_irq, wm97xx_pen_interrupt, IRQF_SHARED,
 374                        "wm97xx-pen", wm)) {
 375                dev_err(wm->dev,
 376                        "Failed to register pen down interrupt, polling");
 377                wm->pen_irq = 0;
 378                return -EINVAL;
 379        }
 380
 381        /* Configure GPIO as interrupt source on WM971x */
 382        if (wm->id != WM9705_ID2) {
 383                BUG_ON(!wm->mach_ops->irq_gpio);
 384                reg = wm97xx_reg_read(wm, AC97_MISC_AFE);
 385                wm97xx_reg_write(wm, AC97_MISC_AFE,
 386                                reg & ~(wm->mach_ops->irq_gpio));
 387                reg = wm97xx_reg_read(wm, 0x5a);
 388                wm97xx_reg_write(wm, 0x5a, reg & ~0x0001);
 389        }
 390
 391        return 0;
 392}
 393
 394static int wm97xx_read_samples(struct wm97xx *wm)
 395{
 396        struct wm97xx_data data;
 397        int rc;
 398
 399        mutex_lock(&wm->codec_mutex);
 400
 401        if (wm->mach_ops && wm->mach_ops->acc_enabled)
 402                rc = wm->mach_ops->acc_pen_down(wm);
 403        else
 404                rc = wm->codec->poll_touch(wm, &data);
 405
 406        if (rc & RC_PENUP) {
 407                if (wm->pen_is_down) {
 408                        wm->pen_is_down = 0;
 409                        dev_dbg(wm->dev, "pen up\n");
 410                        input_report_abs(wm->input_dev, ABS_PRESSURE, 0);
 411                        input_report_key(wm->input_dev, BTN_TOUCH, 0);
 412                        input_sync(wm->input_dev);
 413                } else if (!(rc & RC_AGAIN)) {
 414                        /* We need high frequency updates only while
 415                        * pen is down, the user never will be able to
 416                        * touch screen faster than a few times per
 417                        * second... On the other hand, when the user
 418                        * is actively working with the touchscreen we
 419                        * don't want to lose the quick response. So we
 420                        * will slowly increase sleep time after the
 421                        * pen is up and quicky restore it to ~one task
 422                        * switch when pen is down again.
 423                        */
 424                        if (wm->ts_reader_interval < HZ / 10)
 425                                wm->ts_reader_interval++;
 426                }
 427
 428        } else if (rc & RC_VALID) {
 429                dev_dbg(wm->dev,
 430                        "pen down: x=%x:%d, y=%x:%d, pressure=%x:%d\n",
 431                        data.x >> 12, data.x & 0xfff, data.y >> 12,
 432                        data.y & 0xfff, data.p >> 12, data.p & 0xfff);
 433                input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff);
 434                input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff);
 435                input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff);
 436                input_report_key(wm->input_dev, BTN_TOUCH, 1);
 437                input_sync(wm->input_dev);
 438                wm->pen_is_down = 1;
 439                wm->ts_reader_interval = wm->ts_reader_min_interval;
 440        } else if (rc & RC_PENDOWN) {
 441                dev_dbg(wm->dev, "pen down\n");
 442                wm->pen_is_down = 1;
 443                wm->ts_reader_interval = wm->ts_reader_min_interval;
 444        }
 445
 446        mutex_unlock(&wm->codec_mutex);
 447        return rc;
 448}
 449
 450/*
 451* The touchscreen sample reader.
 452*/
 453static void wm97xx_ts_reader(struct work_struct *work)
 454{
 455        int rc;
 456        struct wm97xx *wm = container_of(work, struct wm97xx, ts_reader.work);
 457
 458        BUG_ON(!wm->codec);
 459
 460        do {
 461                rc = wm97xx_read_samples(wm);
 462        } while (rc & RC_AGAIN);
 463
 464        if (wm->pen_is_down || !wm->pen_irq)
 465                queue_delayed_work(wm->ts_workq, &wm->ts_reader,
 466                                   wm->ts_reader_interval);
 467}
 468
 469/**
 470 * wm97xx_ts_input_open - Open the touch screen input device.
 471 * @idev:       Input device to be opened.
 472 *
 473 * Called by the input sub system to open a wm97xx touchscreen device.
 474 * Starts the touchscreen thread and touch digitiser.
 475 */
 476static int wm97xx_ts_input_open(struct input_dev *idev)
 477{
 478        struct wm97xx *wm = input_get_drvdata(idev);
 479
 480        wm->ts_workq = create_singlethread_workqueue("kwm97xx");
 481        if (wm->ts_workq == NULL) {
 482                dev_err(wm->dev,
 483                        "Failed to create workqueue\n");
 484                return -EINVAL;
 485        }
 486
 487        /* start digitiser */
 488        if (wm->mach_ops && wm->mach_ops->acc_enabled)
 489                wm->codec->acc_enable(wm, 1);
 490        wm->codec->dig_enable(wm, 1);
 491
 492        INIT_DELAYED_WORK(&wm->ts_reader, wm97xx_ts_reader);
 493        INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker);
 494
 495        wm->ts_reader_min_interval = HZ >= 100 ? HZ / 100 : 1;
 496        if (wm->ts_reader_min_interval < 1)
 497                wm->ts_reader_min_interval = 1;
 498        wm->ts_reader_interval = wm->ts_reader_min_interval;
 499
 500        wm->pen_is_down = 0;
 501        if (wm->pen_irq)
 502                wm97xx_init_pen_irq(wm);
 503        else
 504                dev_err(wm->dev, "No IRQ specified\n");
 505
 506        /* If we either don't have an interrupt for pen down events or
 507         * failed to acquire it then we need to poll.
 508         */
 509        if (wm->pen_irq == 0)
 510                queue_delayed_work(wm->ts_workq, &wm->ts_reader,
 511                                   wm->ts_reader_interval);
 512
 513        return 0;
 514}
 515
 516/**
 517 * wm97xx_ts_input_close - Close the touch screen input device.
 518 * @idev:       Input device to be closed.
 519 *
 520 * Called by the input sub system to close a wm97xx touchscreen
 521 * device.  Kills the touchscreen thread and stops the touch
 522 * digitiser.
 523 */
 524
 525static void wm97xx_ts_input_close(struct input_dev *idev)
 526{
 527        struct wm97xx *wm = input_get_drvdata(idev);
 528        u16 reg;
 529
 530        if (wm->pen_irq) {
 531                /* Return the interrupt to GPIO usage (disabling it) */
 532                if (wm->id != WM9705_ID2) {
 533                        BUG_ON(!wm->mach_ops->irq_gpio);
 534                        reg = wm97xx_reg_read(wm, AC97_MISC_AFE);
 535                        wm97xx_reg_write(wm, AC97_MISC_AFE,
 536                                         reg | wm->mach_ops->irq_gpio);
 537                }
 538
 539                free_irq(wm->pen_irq, wm);
 540        }
 541
 542        wm->pen_is_down = 0;
 543
 544        /* Balance out interrupt disables/enables */
 545        if (cancel_work_sync(&wm->pen_event_work))
 546                wm->mach_ops->irq_enable(wm, 1);
 547
 548        /* ts_reader rearms itself so we need to explicitly stop it
 549         * before we destroy the workqueue.
 550         */
 551        cancel_delayed_work_sync(&wm->ts_reader);
 552
 553        destroy_workqueue(wm->ts_workq);
 554
 555        /* stop digitiser */
 556        wm->codec->dig_enable(wm, 0);
 557        if (wm->mach_ops && wm->mach_ops->acc_enabled)
 558                wm->codec->acc_enable(wm, 0);
 559}
 560
 561static int wm97xx_probe(struct device *dev)
 562{
 563        struct wm97xx *wm;
 564        int ret = 0, id = 0;
 565
 566        wm = kzalloc(sizeof(struct wm97xx), GFP_KERNEL);
 567        if (!wm)
 568                return -ENOMEM;
 569        mutex_init(&wm->codec_mutex);
 570
 571        wm->dev = dev;
 572        dev->driver_data = wm;
 573        wm->ac97 = to_ac97_t(dev);
 574
 575        /* check that we have a supported codec */
 576        id = wm97xx_reg_read(wm, AC97_VENDOR_ID1);
 577        if (id != WM97XX_ID1) {
 578                dev_err(dev, "Device with vendor %04x is not a wm97xx\n", id);
 579                ret = -ENODEV;
 580                goto alloc_err;
 581        }
 582
 583        wm->id = wm97xx_reg_read(wm, AC97_VENDOR_ID2);
 584
 585        dev_info(wm->dev, "detected a wm97%02x codec\n", wm->id & 0xff);
 586
 587        switch (wm->id & 0xff) {
 588#ifdef CONFIG_TOUCHSCREEN_WM9705
 589        case 0x05:
 590                wm->codec = &wm9705_codec;
 591                break;
 592#endif
 593#ifdef CONFIG_TOUCHSCREEN_WM9712
 594        case 0x12:
 595                wm->codec = &wm9712_codec;
 596                break;
 597#endif
 598#ifdef CONFIG_TOUCHSCREEN_WM9713
 599        case 0x13:
 600                wm->codec = &wm9713_codec;
 601                break;
 602#endif
 603        default:
 604                dev_err(wm->dev, "Support for wm97%02x not compiled in.\n",
 605                        wm->id & 0xff);
 606                ret = -ENODEV;
 607                goto alloc_err;
 608        }
 609
 610        /* set up physical characteristics */
 611        wm->codec->phy_init(wm);
 612
 613        /* load gpio cache */
 614        wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG);
 615        wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY);
 616        wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY);
 617        wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP);
 618        wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS);
 619        wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE);
 620
 621        wm->input_dev = input_allocate_device();
 622        if (wm->input_dev == NULL) {
 623                ret = -ENOMEM;
 624                goto alloc_err;
 625        }
 626
 627        /* set up touch configuration */
 628        wm->input_dev->name = "wm97xx touchscreen";
 629        wm->input_dev->phys = "wm97xx";
 630        wm->input_dev->open = wm97xx_ts_input_open;
 631        wm->input_dev->close = wm97xx_ts_input_close;
 632
 633        __set_bit(EV_ABS, wm->input_dev->evbit);
 634        __set_bit(EV_KEY, wm->input_dev->evbit);
 635        __set_bit(BTN_TOUCH, wm->input_dev->keybit);
 636
 637        input_set_abs_params(wm->input_dev, ABS_X, abs_x[0], abs_x[1],
 638                             abs_x[2], 0);
 639        input_set_abs_params(wm->input_dev, ABS_Y, abs_y[0], abs_y[1],
 640                             abs_y[2], 0);
 641        input_set_abs_params(wm->input_dev, ABS_PRESSURE, abs_p[0], abs_p[1],
 642                             abs_p[2], 0);
 643
 644        input_set_drvdata(wm->input_dev, wm);
 645        wm->input_dev->dev.parent = dev;
 646
 647        ret = input_register_device(wm->input_dev);
 648        if (ret < 0)
 649                goto dev_alloc_err;
 650
 651        /* register our battery device */
 652        wm->battery_dev = platform_device_alloc("wm97xx-battery", -1);
 653        if (!wm->battery_dev) {
 654                ret = -ENOMEM;
 655                goto batt_err;
 656        }
 657        platform_set_drvdata(wm->battery_dev, wm);
 658        wm->battery_dev->dev.parent = dev;
 659        ret = platform_device_add(wm->battery_dev);
 660        if (ret < 0)
 661                goto batt_reg_err;
 662
 663        /* register our extended touch device (for machine specific
 664         * extensions) */
 665        wm->touch_dev = platform_device_alloc("wm97xx-touch", -1);
 666        if (!wm->touch_dev) {
 667                ret = -ENOMEM;
 668                goto touch_err;
 669        }
 670        platform_set_drvdata(wm->touch_dev, wm);
 671        wm->touch_dev->dev.parent = dev;
 672        ret = platform_device_add(wm->touch_dev);
 673        if (ret < 0)
 674                goto touch_reg_err;
 675
 676        return ret;
 677
 678 touch_reg_err:
 679        platform_device_put(wm->touch_dev);
 680 touch_err:
 681        platform_device_unregister(wm->battery_dev);
 682        wm->battery_dev = NULL;
 683 batt_reg_err:
 684        platform_device_put(wm->battery_dev);
 685 batt_err:
 686        input_unregister_device(wm->input_dev);
 687        wm->input_dev = NULL;
 688 dev_alloc_err:
 689        input_free_device(wm->input_dev);
 690 alloc_err:
 691        kfree(wm);
 692
 693        return ret;
 694}
 695
 696static int wm97xx_remove(struct device *dev)
 697{
 698        struct wm97xx *wm = dev_get_drvdata(dev);
 699
 700        platform_device_unregister(wm->battery_dev);
 701        platform_device_unregister(wm->touch_dev);
 702        input_unregister_device(wm->input_dev);
 703        kfree(wm);
 704
 705        return 0;
 706}
 707
 708#ifdef CONFIG_PM
 709static int wm97xx_suspend(struct device *dev, pm_message_t state)
 710{
 711        struct wm97xx *wm = dev_get_drvdata(dev);
 712        u16 reg;
 713        int suspend_mode;
 714
 715        if (device_may_wakeup(&wm->input_dev->dev))
 716                suspend_mode = wm->suspend_mode;
 717        else
 718                suspend_mode = 0;
 719
 720        if (wm->input_dev->users)
 721                cancel_delayed_work_sync(&wm->ts_reader);
 722
 723        /* Power down the digitiser (bypassing the cache for resume) */
 724        reg = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER2);
 725        reg &= ~WM97XX_PRP_DET_DIG;
 726        if (wm->input_dev->users)
 727                reg |= suspend_mode;
 728        wm->ac97->bus->ops->write(wm->ac97, AC97_WM97XX_DIGITISER2, reg);
 729
 730        /* WM9713 has an additional power bit - turn it off if there
 731         * are no users or if suspend mode is zero. */
 732        if (wm->id == WM9713_ID2 &&
 733            (!wm->input_dev->users || !suspend_mode)) {
 734                reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) | 0x8000;
 735                wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg);
 736        }
 737
 738        return 0;
 739}
 740
 741static int wm97xx_resume(struct device *dev)
 742{
 743        struct wm97xx *wm = dev_get_drvdata(dev);
 744
 745        /* restore digitiser and gpios */
 746        if (wm->id == WM9713_ID2) {
 747                wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig[0]);
 748                wm97xx_reg_write(wm, 0x5a, wm->misc);
 749                if (wm->input_dev->users) {
 750                        u16 reg;
 751                        reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) & 0x7fff;
 752                        wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg);
 753                }
 754        }
 755
 756        wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig[1]);
 757        wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2]);
 758
 759        wm97xx_reg_write(wm, AC97_GPIO_CFG, wm->gpio[0]);
 760        wm97xx_reg_write(wm, AC97_GPIO_POLARITY, wm->gpio[1]);
 761        wm97xx_reg_write(wm, AC97_GPIO_STICKY, wm->gpio[2]);
 762        wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, wm->gpio[3]);
 763        wm97xx_reg_write(wm, AC97_GPIO_STATUS, wm->gpio[4]);
 764        wm97xx_reg_write(wm, AC97_MISC_AFE, wm->gpio[5]);
 765
 766        if (wm->input_dev->users && !wm->pen_irq) {
 767                wm->ts_reader_interval = wm->ts_reader_min_interval;
 768                queue_delayed_work(wm->ts_workq, &wm->ts_reader,
 769                                   wm->ts_reader_interval);
 770        }
 771
 772        return 0;
 773}
 774
 775#else
 776#define wm97xx_suspend          NULL
 777#define wm97xx_resume           NULL
 778#endif
 779
 780/*
 781 * Machine specific operations
 782 */
 783int wm97xx_register_mach_ops(struct wm97xx *wm,
 784                             struct wm97xx_mach_ops *mach_ops)
 785{
 786        mutex_lock(&wm->codec_mutex);
 787        if (wm->mach_ops) {
 788                mutex_unlock(&wm->codec_mutex);
 789                return -EINVAL;
 790        }
 791        wm->mach_ops = mach_ops;
 792        mutex_unlock(&wm->codec_mutex);
 793
 794        return 0;
 795}
 796EXPORT_SYMBOL_GPL(wm97xx_register_mach_ops);
 797
 798void wm97xx_unregister_mach_ops(struct wm97xx *wm)
 799{
 800        mutex_lock(&wm->codec_mutex);
 801        wm->mach_ops = NULL;
 802        mutex_unlock(&wm->codec_mutex);
 803}
 804EXPORT_SYMBOL_GPL(wm97xx_unregister_mach_ops);
 805
 806static struct device_driver wm97xx_driver = {
 807        .name =         "wm97xx-ts",
 808        .bus =          &ac97_bus_type,
 809        .owner =        THIS_MODULE,
 810        .probe =        wm97xx_probe,
 811        .remove =       wm97xx_remove,
 812        .suspend =      wm97xx_suspend,
 813        .resume =       wm97xx_resume,
 814};
 815
 816static int __init wm97xx_init(void)
 817{
 818        return driver_register(&wm97xx_driver);
 819}
 820
 821static void __exit wm97xx_exit(void)
 822{
 823        driver_unregister(&wm97xx_driver);
 824}
 825
 826module_init(wm97xx_init);
 827module_exit(wm97xx_exit);
 828
 829/* Module information */
 830MODULE_AUTHOR("Liam Girdwood <lrg@slimlogic.co.uk>");
 831MODULE_DESCRIPTION("WM97xx Core - Touch Screen / AUX ADC / GPIO Driver");
 832MODULE_LICENSE("GPL");
 833