linux/drivers/input/touchscreen/auo-pixcir-ts.c
<<
>>
Prefs
   1/*
   2 * Driver for AUO in-cell touchscreens
   3 *
   4 * Copyright (c) 2011 Heiko Stuebner <heiko@sntech.de>
   5 *
   6 * loosely based on auo_touch.c from Dell Streak vendor-kernel
   7 *
   8 * Copyright (c) 2008 QUALCOMM Incorporated.
   9 * Copyright (c) 2008 QUALCOMM USA, INC.
  10 *
  11 *
  12 * This software is licensed under the terms of the GNU General Public
  13 * License version 2, as published by the Free Software Foundation, and
  14 * may be copied, distributed, and modified under those terms.
  15 *
  16 * This program is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19 * GNU General Public License for more details.
  20 *
  21 */
  22
  23#include <linux/kernel.h>
  24#include <linux/module.h>
  25#include <linux/interrupt.h>
  26#include <linux/slab.h>
  27#include <linux/input.h>
  28#include <linux/jiffies.h>
  29#include <linux/i2c.h>
  30#include <linux/mutex.h>
  31#include <linux/delay.h>
  32#include <linux/gpio.h>
  33#include <linux/input/auo-pixcir-ts.h>
  34
  35/*
  36 * Coordinate calculation:
  37 * X1 = X1_LSB + X1_MSB*256
  38 * Y1 = Y1_LSB + Y1_MSB*256
  39 * X2 = X2_LSB + X2_MSB*256
  40 * Y2 = Y2_LSB + Y2_MSB*256
  41 */
  42#define AUO_PIXCIR_REG_X1_LSB           0x00
  43#define AUO_PIXCIR_REG_X1_MSB           0x01
  44#define AUO_PIXCIR_REG_Y1_LSB           0x02
  45#define AUO_PIXCIR_REG_Y1_MSB           0x03
  46#define AUO_PIXCIR_REG_X2_LSB           0x04
  47#define AUO_PIXCIR_REG_X2_MSB           0x05
  48#define AUO_PIXCIR_REG_Y2_LSB           0x06
  49#define AUO_PIXCIR_REG_Y2_MSB           0x07
  50
  51#define AUO_PIXCIR_REG_STRENGTH         0x0d
  52#define AUO_PIXCIR_REG_STRENGTH_X1_LSB  0x0e
  53#define AUO_PIXCIR_REG_STRENGTH_X1_MSB  0x0f
  54
  55#define AUO_PIXCIR_REG_RAW_DATA_X       0x2b
  56#define AUO_PIXCIR_REG_RAW_DATA_Y       0x4f
  57
  58#define AUO_PIXCIR_REG_X_SENSITIVITY    0x6f
  59#define AUO_PIXCIR_REG_Y_SENSITIVITY    0x70
  60#define AUO_PIXCIR_REG_INT_SETTING      0x71
  61#define AUO_PIXCIR_REG_INT_WIDTH        0x72
  62#define AUO_PIXCIR_REG_POWER_MODE       0x73
  63
  64#define AUO_PIXCIR_REG_VERSION          0x77
  65#define AUO_PIXCIR_REG_CALIBRATE        0x78
  66
  67#define AUO_PIXCIR_REG_TOUCHAREA_X1     0x1e
  68#define AUO_PIXCIR_REG_TOUCHAREA_Y1     0x1f
  69#define AUO_PIXCIR_REG_TOUCHAREA_X2     0x20
  70#define AUO_PIXCIR_REG_TOUCHAREA_Y2     0x21
  71
  72#define AUO_PIXCIR_REG_EEPROM_CALIB_X   0x42
  73#define AUO_PIXCIR_REG_EEPROM_CALIB_Y   0xad
  74
  75#define AUO_PIXCIR_INT_TPNUM_MASK       0xe0
  76#define AUO_PIXCIR_INT_TPNUM_SHIFT      5
  77#define AUO_PIXCIR_INT_RELEASE          (1 << 4)
  78#define AUO_PIXCIR_INT_ENABLE           (1 << 3)
  79#define AUO_PIXCIR_INT_POL_HIGH         (1 << 2)
  80#define AUO_PIXCIR_INT_MODE_MASK        0x03
  81
  82/*
  83 * Power modes:
  84 * active:      scan speed 60Hz
  85 * sleep:       scan speed 10Hz can be auto-activated, wakeup on 1st touch
  86 * deep sleep:  scan speed 1Hz can only be entered or left manually.
  87 */
  88#define AUO_PIXCIR_POWER_ACTIVE         0x00
  89#define AUO_PIXCIR_POWER_SLEEP          0x01
  90#define AUO_PIXCIR_POWER_DEEP_SLEEP     0x02
  91#define AUO_PIXCIR_POWER_MASK           0x03
  92
  93#define AUO_PIXCIR_POWER_ALLOW_SLEEP    (1 << 2)
  94#define AUO_PIXCIR_POWER_IDLE_TIME(ms)  ((ms & 0xf) << 4)
  95
  96#define AUO_PIXCIR_CALIBRATE            0x03
  97
  98#define AUO_PIXCIR_EEPROM_CALIB_X_LEN   62
  99#define AUO_PIXCIR_EEPROM_CALIB_Y_LEN   36
 100
 101#define AUO_PIXCIR_RAW_DATA_X_LEN       18
 102#define AUO_PIXCIR_RAW_DATA_Y_LEN       11
 103
 104#define AUO_PIXCIR_STRENGTH_ENABLE      (1 << 0)
 105
 106/* Touchscreen absolute values */
 107#define AUO_PIXCIR_REPORT_POINTS        2
 108#define AUO_PIXCIR_MAX_AREA             0xff
 109#define AUO_PIXCIR_PENUP_TIMEOUT_MS     10
 110
 111struct auo_pixcir_ts {
 112        struct i2c_client       *client;
 113        struct input_dev        *input;
 114        char                    phys[32];
 115
 116        /* special handling for touch_indicate interupt mode */
 117        bool                    touch_ind_mode;
 118
 119        wait_queue_head_t       wait;
 120        bool                    stopped;
 121};
 122
 123struct auo_point_t {
 124        int     coord_x;
 125        int     coord_y;
 126        int     area_major;
 127        int     area_minor;
 128        int     orientation;
 129};
 130
 131static int auo_pixcir_collect_data(struct auo_pixcir_ts *ts,
 132                                   struct auo_point_t *point)
 133{
 134        struct i2c_client *client = ts->client;
 135        const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data;
 136        uint8_t raw_coord[8];
 137        uint8_t raw_area[4];
 138        int i, ret;
 139
 140        /* touch coordinates */
 141        ret = i2c_smbus_read_i2c_block_data(client, AUO_PIXCIR_REG_X1_LSB,
 142                                            8, raw_coord);
 143        if (ret < 0) {
 144                dev_err(&client->dev, "failed to read coordinate, %d\n", ret);
 145                return ret;
 146        }
 147
 148        /* touch area */
 149        ret = i2c_smbus_read_i2c_block_data(client, AUO_PIXCIR_REG_TOUCHAREA_X1,
 150                                            4, raw_area);
 151        if (ret < 0) {
 152                dev_err(&client->dev, "could not read touch area, %d\n", ret);
 153                return ret;
 154        }
 155
 156        for (i = 0; i < AUO_PIXCIR_REPORT_POINTS; i++) {
 157                point[i].coord_x =
 158                        raw_coord[4 * i + 1] << 8 | raw_coord[4 * i];
 159                point[i].coord_y =
 160                        raw_coord[4 * i + 3] << 8 | raw_coord[4 * i + 2];
 161
 162                if (point[i].coord_x > pdata->x_max ||
 163                    point[i].coord_y > pdata->y_max) {
 164                        dev_warn(&client->dev, "coordinates (%d,%d) invalid\n",
 165                                point[i].coord_x, point[i].coord_y);
 166                        point[i].coord_x = point[i].coord_y = 0;
 167                }
 168
 169                /* determine touch major, minor and orientation */
 170                point[i].area_major = max(raw_area[2 * i], raw_area[2 * i + 1]);
 171                point[i].area_minor = min(raw_area[2 * i], raw_area[2 * i + 1]);
 172                point[i].orientation = raw_area[2 * i] > raw_area[2 * i + 1];
 173        }
 174
 175        return 0;
 176}
 177
 178static irqreturn_t auo_pixcir_interrupt(int irq, void *dev_id)
 179{
 180        struct auo_pixcir_ts *ts = dev_id;
 181        struct i2c_client *client = ts->client;
 182        const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data;
 183        struct auo_point_t point[AUO_PIXCIR_REPORT_POINTS];
 184        int i;
 185        int ret;
 186        int fingers = 0;
 187        int abs = -1;
 188
 189        while (!ts->stopped) {
 190
 191                /* check for up event in touch touch_ind_mode */
 192                if (ts->touch_ind_mode) {
 193                        if (gpio_get_value(pdata->gpio_int) == 0) {
 194                                input_mt_sync(ts->input);
 195                                input_report_key(ts->input, BTN_TOUCH, 0);
 196                                input_sync(ts->input);
 197                                break;
 198                        }
 199                }
 200
 201                ret = auo_pixcir_collect_data(ts, point);
 202                if (ret < 0) {
 203                        /* we want to loop only in touch_ind_mode */
 204                        if (!ts->touch_ind_mode)
 205                                break;
 206
 207                        wait_event_timeout(ts->wait, ts->stopped,
 208                                msecs_to_jiffies(AUO_PIXCIR_PENUP_TIMEOUT_MS));
 209                        continue;
 210                }
 211
 212                for (i = 0; i < AUO_PIXCIR_REPORT_POINTS; i++) {
 213                        if (point[i].coord_x > 0 || point[i].coord_y > 0) {
 214                                input_report_abs(ts->input, ABS_MT_POSITION_X,
 215                                                 point[i].coord_x);
 216                                input_report_abs(ts->input, ABS_MT_POSITION_Y,
 217                                                 point[i].coord_y);
 218                                input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR,
 219                                                 point[i].area_major);
 220                                input_report_abs(ts->input, ABS_MT_TOUCH_MINOR,
 221                                                 point[i].area_minor);
 222                                input_report_abs(ts->input, ABS_MT_ORIENTATION,
 223                                                 point[i].orientation);
 224                                input_mt_sync(ts->input);
 225
 226                                /* use first finger as source for singletouch */
 227                                if (fingers == 0)
 228                                        abs = i;
 229
 230                                /* number of touch points could also be queried
 231                                 * via i2c but would require an additional call
 232                                 */
 233                                fingers++;
 234                        }
 235                }
 236
 237                input_report_key(ts->input, BTN_TOUCH, fingers > 0);
 238
 239                if (abs > -1) {
 240                        input_report_abs(ts->input, ABS_X, point[abs].coord_x);
 241                        input_report_abs(ts->input, ABS_Y, point[abs].coord_y);
 242                }
 243
 244                input_sync(ts->input);
 245
 246                /* we want to loop only in touch_ind_mode */
 247                if (!ts->touch_ind_mode)
 248                        break;
 249
 250                wait_event_timeout(ts->wait, ts->stopped,
 251                                 msecs_to_jiffies(AUO_PIXCIR_PENUP_TIMEOUT_MS));
 252        }
 253
 254        return IRQ_HANDLED;
 255}
 256
 257/*
 258 * Set the power mode of the device.
 259 * Valid modes are
 260 * - AUO_PIXCIR_POWER_ACTIVE
 261 * - AUO_PIXCIR_POWER_SLEEP - automatically left on first touch
 262 * - AUO_PIXCIR_POWER_DEEP_SLEEP
 263 */
 264static int auo_pixcir_power_mode(struct auo_pixcir_ts *ts, int mode)
 265{
 266        struct i2c_client *client = ts->client;
 267        int ret;
 268
 269        ret = i2c_smbus_read_byte_data(client, AUO_PIXCIR_REG_POWER_MODE);
 270        if (ret < 0) {
 271                dev_err(&client->dev, "unable to read reg %Xh, %d\n",
 272                        AUO_PIXCIR_REG_POWER_MODE, ret);
 273                return ret;
 274        }
 275
 276        ret &= ~AUO_PIXCIR_POWER_MASK;
 277        ret |= mode;
 278
 279        ret = i2c_smbus_write_byte_data(client, AUO_PIXCIR_REG_POWER_MODE, ret);
 280        if (ret) {
 281                dev_err(&client->dev, "unable to write reg %Xh, %d\n",
 282                        AUO_PIXCIR_REG_POWER_MODE, ret);
 283                return ret;
 284        }
 285
 286        return 0;
 287}
 288
 289static int auo_pixcir_int_config(struct auo_pixcir_ts *ts,
 290                                           int int_setting)
 291{
 292        struct i2c_client *client = ts->client;
 293        struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data;
 294        int ret;
 295
 296        ret = i2c_smbus_read_byte_data(client, AUO_PIXCIR_REG_INT_SETTING);
 297        if (ret < 0) {
 298                dev_err(&client->dev, "unable to read reg %Xh, %d\n",
 299                        AUO_PIXCIR_REG_INT_SETTING, ret);
 300                return ret;
 301        }
 302
 303        ret &= ~AUO_PIXCIR_INT_MODE_MASK;
 304        ret |= int_setting;
 305        ret |= AUO_PIXCIR_INT_POL_HIGH; /* always use high for interrupts */
 306
 307        ret = i2c_smbus_write_byte_data(client, AUO_PIXCIR_REG_INT_SETTING,
 308                                        ret);
 309        if (ret < 0) {
 310                dev_err(&client->dev, "unable to write reg %Xh, %d\n",
 311                        AUO_PIXCIR_REG_INT_SETTING, ret);
 312                return ret;
 313        }
 314
 315        ts->touch_ind_mode = pdata->int_setting == AUO_PIXCIR_INT_TOUCH_IND;
 316
 317        return 0;
 318}
 319
 320/* control the generation of interrupts on the device side */
 321static int auo_pixcir_int_toggle(struct auo_pixcir_ts *ts, bool enable)
 322{
 323        struct i2c_client *client = ts->client;
 324        int ret;
 325
 326        ret = i2c_smbus_read_byte_data(client, AUO_PIXCIR_REG_INT_SETTING);
 327        if (ret < 0) {
 328                dev_err(&client->dev, "unable to read reg %Xh, %d\n",
 329                        AUO_PIXCIR_REG_INT_SETTING, ret);
 330                return ret;
 331        }
 332
 333        if (enable)
 334                ret |= AUO_PIXCIR_INT_ENABLE;
 335        else
 336                ret &= ~AUO_PIXCIR_INT_ENABLE;
 337
 338        ret = i2c_smbus_write_byte_data(client, AUO_PIXCIR_REG_INT_SETTING,
 339                                        ret);
 340        if (ret < 0) {
 341                dev_err(&client->dev, "unable to write reg %Xh, %d\n",
 342                        AUO_PIXCIR_REG_INT_SETTING, ret);
 343                return ret;
 344        }
 345
 346        return 0;
 347}
 348
 349static int auo_pixcir_start(struct auo_pixcir_ts *ts)
 350{
 351        struct i2c_client *client = ts->client;
 352        int ret;
 353
 354        ret = auo_pixcir_power_mode(ts, AUO_PIXCIR_POWER_ACTIVE);
 355        if (ret < 0) {
 356                dev_err(&client->dev, "could not set power mode, %d\n",
 357                        ret);
 358                return ret;
 359        }
 360
 361        ts->stopped = false;
 362        mb();
 363        enable_irq(client->irq);
 364
 365        ret = auo_pixcir_int_toggle(ts, 1);
 366        if (ret < 0) {
 367                dev_err(&client->dev, "could not enable interrupt, %d\n",
 368                        ret);
 369                disable_irq(client->irq);
 370                return ret;
 371        }
 372
 373        return 0;
 374}
 375
 376static int auo_pixcir_stop(struct auo_pixcir_ts *ts)
 377{
 378        struct i2c_client *client = ts->client;
 379        int ret;
 380
 381        ret = auo_pixcir_int_toggle(ts, 0);
 382        if (ret < 0) {
 383                dev_err(&client->dev, "could not disable interrupt, %d\n",
 384                        ret);
 385                return ret;
 386        }
 387
 388        /* disable receiving of interrupts */
 389        disable_irq(client->irq);
 390        ts->stopped = true;
 391        mb();
 392        wake_up(&ts->wait);
 393
 394        return auo_pixcir_power_mode(ts, AUO_PIXCIR_POWER_DEEP_SLEEP);
 395}
 396
 397static int auo_pixcir_input_open(struct input_dev *dev)
 398{
 399        struct auo_pixcir_ts *ts = input_get_drvdata(dev);
 400        int ret;
 401
 402        ret = auo_pixcir_start(ts);
 403        if (ret)
 404                return ret;
 405
 406        return 0;
 407}
 408
 409static void auo_pixcir_input_close(struct input_dev *dev)
 410{
 411        struct auo_pixcir_ts *ts = input_get_drvdata(dev);
 412
 413        auo_pixcir_stop(ts);
 414
 415        return;
 416}
 417
 418#ifdef CONFIG_PM_SLEEP
 419static int auo_pixcir_suspend(struct device *dev)
 420{
 421        struct i2c_client *client = to_i2c_client(dev);
 422        struct auo_pixcir_ts *ts = i2c_get_clientdata(client);
 423        struct input_dev *input = ts->input;
 424        int ret = 0;
 425
 426        mutex_lock(&input->mutex);
 427
 428        /* when configured as wakeup source, device should always wake system
 429         * therefore start device if necessary
 430         */
 431        if (device_may_wakeup(&client->dev)) {
 432                /* need to start device if not open, to be wakeup source */
 433                if (!input->users) {
 434                        ret = auo_pixcir_start(ts);
 435                        if (ret)
 436                                goto unlock;
 437                }
 438
 439                enable_irq_wake(client->irq);
 440                ret = auo_pixcir_power_mode(ts, AUO_PIXCIR_POWER_SLEEP);
 441        } else if (input->users) {
 442                ret = auo_pixcir_stop(ts);
 443        }
 444
 445unlock:
 446        mutex_unlock(&input->mutex);
 447
 448        return ret;
 449}
 450
 451static int auo_pixcir_resume(struct device *dev)
 452{
 453        struct i2c_client *client = to_i2c_client(dev);
 454        struct auo_pixcir_ts *ts = i2c_get_clientdata(client);
 455        struct input_dev *input = ts->input;
 456        int ret = 0;
 457
 458        mutex_lock(&input->mutex);
 459
 460        if (device_may_wakeup(&client->dev)) {
 461                disable_irq_wake(client->irq);
 462
 463                /* need to stop device if it was not open on suspend */
 464                if (!input->users) {
 465                        ret = auo_pixcir_stop(ts);
 466                        if (ret)
 467                                goto unlock;
 468                }
 469
 470                /* device wakes automatically from SLEEP */
 471        } else if (input->users) {
 472                ret = auo_pixcir_start(ts);
 473        }
 474
 475unlock:
 476        mutex_unlock(&input->mutex);
 477
 478        return ret;
 479}
 480#endif
 481
 482static SIMPLE_DEV_PM_OPS(auo_pixcir_pm_ops, auo_pixcir_suspend,
 483                         auo_pixcir_resume);
 484
 485static int auo_pixcir_probe(struct i2c_client *client,
 486                                      const struct i2c_device_id *id)
 487{
 488        const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data;
 489        struct auo_pixcir_ts *ts;
 490        struct input_dev *input_dev;
 491        int ret;
 492
 493        if (!pdata)
 494                return -EINVAL;
 495
 496        ts = kzalloc(sizeof(struct auo_pixcir_ts), GFP_KERNEL);
 497        if (!ts)
 498                return -ENOMEM;
 499
 500        ret = gpio_request(pdata->gpio_int, "auo_pixcir_ts_int");
 501        if (ret) {
 502                dev_err(&client->dev, "request of gpio %d failed, %d\n",
 503                        pdata->gpio_int, ret);
 504                goto err_gpio_int;
 505        }
 506
 507        if (pdata->init_hw)
 508                pdata->init_hw(client);
 509
 510        ts->client = client;
 511        ts->touch_ind_mode = 0;
 512        init_waitqueue_head(&ts->wait);
 513
 514        snprintf(ts->phys, sizeof(ts->phys),
 515                 "%s/input0", dev_name(&client->dev));
 516
 517        input_dev = input_allocate_device();
 518        if (!input_dev) {
 519                dev_err(&client->dev, "could not allocate input device\n");
 520                goto err_input_alloc;
 521        }
 522
 523        ts->input = input_dev;
 524
 525        input_dev->name = "AUO-Pixcir touchscreen";
 526        input_dev->phys = ts->phys;
 527        input_dev->id.bustype = BUS_I2C;
 528        input_dev->dev.parent = &client->dev;
 529
 530        input_dev->open = auo_pixcir_input_open;
 531        input_dev->close = auo_pixcir_input_close;
 532
 533        __set_bit(EV_ABS, input_dev->evbit);
 534        __set_bit(EV_KEY, input_dev->evbit);
 535
 536        __set_bit(BTN_TOUCH, input_dev->keybit);
 537
 538        /* For single touch */
 539        input_set_abs_params(input_dev, ABS_X, 0, pdata->x_max, 0, 0);
 540        input_set_abs_params(input_dev, ABS_Y, 0, pdata->y_max, 0, 0);
 541
 542        /* For multi touch */
 543        input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
 544                             pdata->x_max, 0, 0);
 545        input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
 546                             pdata->y_max, 0, 0);
 547        input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0,
 548                             AUO_PIXCIR_MAX_AREA, 0, 0);
 549        input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0,
 550                             AUO_PIXCIR_MAX_AREA, 0, 0);
 551        input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
 552
 553        ret = i2c_smbus_read_byte_data(client, AUO_PIXCIR_REG_VERSION);
 554        if (ret < 0)
 555                goto err_fw_vers;
 556        dev_info(&client->dev, "firmware version 0x%X\n", ret);
 557
 558        ret = auo_pixcir_int_config(ts, pdata->int_setting);
 559        if (ret)
 560                goto err_fw_vers;
 561
 562        input_set_drvdata(ts->input, ts);
 563        ts->stopped = true;
 564
 565        ret = request_threaded_irq(client->irq, NULL, auo_pixcir_interrupt,
 566                                   IRQF_TRIGGER_RISING | IRQF_ONESHOT,
 567                                   input_dev->name, ts);
 568        if (ret) {
 569                dev_err(&client->dev, "irq %d requested failed\n", client->irq);
 570                goto err_fw_vers;
 571        }
 572
 573        /* stop device and put it into deep sleep until it is opened */
 574        ret = auo_pixcir_stop(ts);
 575        if (ret < 0)
 576                goto err_input_register;
 577
 578        ret = input_register_device(input_dev);
 579        if (ret) {
 580                dev_err(&client->dev, "could not register input device\n");
 581                goto err_input_register;
 582        }
 583
 584        i2c_set_clientdata(client, ts);
 585
 586        return 0;
 587
 588err_input_register:
 589        free_irq(client->irq, ts);
 590err_fw_vers:
 591        input_free_device(input_dev);
 592err_input_alloc:
 593        if (pdata->exit_hw)
 594                pdata->exit_hw(client);
 595        gpio_free(pdata->gpio_int);
 596err_gpio_int:
 597        kfree(ts);
 598
 599        return ret;
 600}
 601
 602static int auo_pixcir_remove(struct i2c_client *client)
 603{
 604        struct auo_pixcir_ts *ts = i2c_get_clientdata(client);
 605        const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data;
 606
 607        free_irq(client->irq, ts);
 608
 609        input_unregister_device(ts->input);
 610
 611        if (pdata->exit_hw)
 612                pdata->exit_hw(client);
 613
 614        gpio_free(pdata->gpio_int);
 615
 616        kfree(ts);
 617
 618        return 0;
 619}
 620
 621static const struct i2c_device_id auo_pixcir_idtable[] = {
 622        { "auo_pixcir_ts", 0 },
 623        { }
 624};
 625MODULE_DEVICE_TABLE(i2c, auo_pixcir_idtable);
 626
 627static struct i2c_driver auo_pixcir_driver = {
 628        .driver = {
 629                .owner  = THIS_MODULE,
 630                .name   = "auo_pixcir_ts",
 631                .pm     = &auo_pixcir_pm_ops,
 632        },
 633        .probe          = auo_pixcir_probe,
 634        .remove         = auo_pixcir_remove,
 635        .id_table       = auo_pixcir_idtable,
 636};
 637
 638module_i2c_driver(auo_pixcir_driver);
 639
 640MODULE_DESCRIPTION("AUO-PIXCIR touchscreen driver");
 641MODULE_LICENSE("GPL v2");
 642MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>");
 643