linux/drivers/input/keyboard/gpio_keys.c
<<
>>
Prefs
   1/*
   2 * Driver for keys on GPIO lines capable of generating interrupts.
   3 *
   4 * Copyright 2005 Phil Blundell
   5 * Copyright 2010, 2011 David Jander <david@protonic.nl>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11
  12#include <linux/module.h>
  13
  14#include <linux/init.h>
  15#include <linux/fs.h>
  16#include <linux/interrupt.h>
  17#include <linux/irq.h>
  18#include <linux/sched.h>
  19#include <linux/pm.h>
  20#include <linux/slab.h>
  21#include <linux/sysctl.h>
  22#include <linux/proc_fs.h>
  23#include <linux/delay.h>
  24#include <linux/platform_device.h>
  25#include <linux/input.h>
  26#include <linux/gpio_keys.h>
  27#include <linux/workqueue.h>
  28#include <linux/gpio.h>
  29#include <linux/of_platform.h>
  30#include <linux/of_gpio.h>
  31
  32struct gpio_button_data {
  33        struct gpio_keys_button *button;
  34        struct input_dev *input;
  35        struct timer_list timer;
  36        struct work_struct work;
  37        int timer_debounce;     /* in msecs */
  38        bool disabled;
  39};
  40
  41struct gpio_keys_drvdata {
  42        struct input_dev *input;
  43        struct mutex disable_lock;
  44        unsigned int n_buttons;
  45        int (*enable)(struct device *dev);
  46        void (*disable)(struct device *dev);
  47        struct gpio_button_data data[0];
  48};
  49
  50/*
  51 * SYSFS interface for enabling/disabling keys and switches:
  52 *
  53 * There are 4 attributes under /sys/devices/platform/gpio-keys/
  54 *      keys [ro]              - bitmap of keys (EV_KEY) which can be
  55 *                               disabled
  56 *      switches [ro]          - bitmap of switches (EV_SW) which can be
  57 *                               disabled
  58 *      disabled_keys [rw]     - bitmap of keys currently disabled
  59 *      disabled_switches [rw] - bitmap of switches currently disabled
  60 *
  61 * Userland can change these values and hence disable event generation
  62 * for each key (or switch). Disabling a key means its interrupt line
  63 * is disabled.
  64 *
  65 * For example, if we have following switches set up as gpio-keys:
  66 *      SW_DOCK = 5
  67 *      SW_CAMERA_LENS_COVER = 9
  68 *      SW_KEYPAD_SLIDE = 10
  69 *      SW_FRONT_PROXIMITY = 11
  70 * This is read from switches:
  71 *      11-9,5
  72 * Next we want to disable proximity (11) and dock (5), we write:
  73 *      11,5
  74 * to file disabled_switches. Now proximity and dock IRQs are disabled.
  75 * This can be verified by reading the file disabled_switches:
  76 *      11,5
  77 * If we now want to enable proximity (11) switch we write:
  78 *      5
  79 * to disabled_switches.
  80 *
  81 * We can disable only those keys which don't allow sharing the irq.
  82 */
  83
  84/**
  85 * get_n_events_by_type() - returns maximum number of events per @type
  86 * @type: type of button (%EV_KEY, %EV_SW)
  87 *
  88 * Return value of this function can be used to allocate bitmap
  89 * large enough to hold all bits for given type.
  90 */
  91static inline int get_n_events_by_type(int type)
  92{
  93        BUG_ON(type != EV_SW && type != EV_KEY);
  94
  95        return (type == EV_KEY) ? KEY_CNT : SW_CNT;
  96}
  97
  98/**
  99 * gpio_keys_disable_button() - disables given GPIO button
 100 * @bdata: button data for button to be disabled
 101 *
 102 * Disables button pointed by @bdata. This is done by masking
 103 * IRQ line. After this function is called, button won't generate
 104 * input events anymore. Note that one can only disable buttons
 105 * that don't share IRQs.
 106 *
 107 * Make sure that @bdata->disable_lock is locked when entering
 108 * this function to avoid races when concurrent threads are
 109 * disabling buttons at the same time.
 110 */
 111static void gpio_keys_disable_button(struct gpio_button_data *bdata)
 112{
 113        if (!bdata->disabled) {
 114                /*
 115                 * Disable IRQ and possible debouncing timer.
 116                 */
 117                disable_irq(gpio_to_irq(bdata->button->gpio));
 118                if (bdata->timer_debounce)
 119                        del_timer_sync(&bdata->timer);
 120
 121                bdata->disabled = true;
 122        }
 123}
 124
 125/**
 126 * gpio_keys_enable_button() - enables given GPIO button
 127 * @bdata: button data for button to be disabled
 128 *
 129 * Enables given button pointed by @bdata.
 130 *
 131 * Make sure that @bdata->disable_lock is locked when entering
 132 * this function to avoid races with concurrent threads trying
 133 * to enable the same button at the same time.
 134 */
 135static void gpio_keys_enable_button(struct gpio_button_data *bdata)
 136{
 137        if (bdata->disabled) {
 138                enable_irq(gpio_to_irq(bdata->button->gpio));
 139                bdata->disabled = false;
 140        }
 141}
 142
 143/**
 144 * gpio_keys_attr_show_helper() - fill in stringified bitmap of buttons
 145 * @ddata: pointer to drvdata
 146 * @buf: buffer where stringified bitmap is written
 147 * @type: button type (%EV_KEY, %EV_SW)
 148 * @only_disabled: does caller want only those buttons that are
 149 *                 currently disabled or all buttons that can be
 150 *                 disabled
 151 *
 152 * This function writes buttons that can be disabled to @buf. If
 153 * @only_disabled is true, then @buf contains only those buttons
 154 * that are currently disabled. Returns 0 on success or negative
 155 * errno on failure.
 156 */
 157static ssize_t gpio_keys_attr_show_helper(struct gpio_keys_drvdata *ddata,
 158                                          char *buf, unsigned int type,
 159                                          bool only_disabled)
 160{
 161        int n_events = get_n_events_by_type(type);
 162        unsigned long *bits;
 163        ssize_t ret;
 164        int i;
 165
 166        bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL);
 167        if (!bits)
 168                return -ENOMEM;
 169
 170        for (i = 0; i < ddata->n_buttons; i++) {
 171                struct gpio_button_data *bdata = &ddata->data[i];
 172
 173                if (bdata->button->type != type)
 174                        continue;
 175
 176                if (only_disabled && !bdata->disabled)
 177                        continue;
 178
 179                __set_bit(bdata->button->code, bits);
 180        }
 181
 182        ret = bitmap_scnlistprintf(buf, PAGE_SIZE - 2, bits, n_events);
 183        buf[ret++] = '\n';
 184        buf[ret] = '\0';
 185
 186        kfree(bits);
 187
 188        return ret;
 189}
 190
 191/**
 192 * gpio_keys_attr_store_helper() - enable/disable buttons based on given bitmap
 193 * @ddata: pointer to drvdata
 194 * @buf: buffer from userspace that contains stringified bitmap
 195 * @type: button type (%EV_KEY, %EV_SW)
 196 *
 197 * This function parses stringified bitmap from @buf and disables/enables
 198 * GPIO buttons accordinly. Returns 0 on success and negative error
 199 * on failure.
 200 */
 201static ssize_t gpio_keys_attr_store_helper(struct gpio_keys_drvdata *ddata,
 202                                           const char *buf, unsigned int type)
 203{
 204        int n_events = get_n_events_by_type(type);
 205        unsigned long *bits;
 206        ssize_t error;
 207        int i;
 208
 209        bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL);
 210        if (!bits)
 211                return -ENOMEM;
 212
 213        error = bitmap_parselist(buf, bits, n_events);
 214        if (error)
 215                goto out;
 216
 217        /* First validate */
 218        for (i = 0; i < ddata->n_buttons; i++) {
 219                struct gpio_button_data *bdata = &ddata->data[i];
 220
 221                if (bdata->button->type != type)
 222                        continue;
 223
 224                if (test_bit(bdata->button->code, bits) &&
 225                    !bdata->button->can_disable) {
 226                        error = -EINVAL;
 227                        goto out;
 228                }
 229        }
 230
 231        mutex_lock(&ddata->disable_lock);
 232
 233        for (i = 0; i < ddata->n_buttons; i++) {
 234                struct gpio_button_data *bdata = &ddata->data[i];
 235
 236                if (bdata->button->type != type)
 237                        continue;
 238
 239                if (test_bit(bdata->button->code, bits))
 240                        gpio_keys_disable_button(bdata);
 241                else
 242                        gpio_keys_enable_button(bdata);
 243        }
 244
 245        mutex_unlock(&ddata->disable_lock);
 246
 247out:
 248        kfree(bits);
 249        return error;
 250}
 251
 252#define ATTR_SHOW_FN(name, type, only_disabled)                         \
 253static ssize_t gpio_keys_show_##name(struct device *dev,                \
 254                                     struct device_attribute *attr,     \
 255                                     char *buf)                         \
 256{                                                                       \
 257        struct platform_device *pdev = to_platform_device(dev);         \
 258        struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);   \
 259                                                                        \
 260        return gpio_keys_attr_show_helper(ddata, buf,                   \
 261                                          type, only_disabled);         \
 262}
 263
 264ATTR_SHOW_FN(keys, EV_KEY, false);
 265ATTR_SHOW_FN(switches, EV_SW, false);
 266ATTR_SHOW_FN(disabled_keys, EV_KEY, true);
 267ATTR_SHOW_FN(disabled_switches, EV_SW, true);
 268
 269/*
 270 * ATTRIBUTES:
 271 *
 272 * /sys/devices/platform/gpio-keys/keys [ro]
 273 * /sys/devices/platform/gpio-keys/switches [ro]
 274 */
 275static DEVICE_ATTR(keys, S_IRUGO, gpio_keys_show_keys, NULL);
 276static DEVICE_ATTR(switches, S_IRUGO, gpio_keys_show_switches, NULL);
 277
 278#define ATTR_STORE_FN(name, type)                                       \
 279static ssize_t gpio_keys_store_##name(struct device *dev,               \
 280                                      struct device_attribute *attr,    \
 281                                      const char *buf,                  \
 282                                      size_t count)                     \
 283{                                                                       \
 284        struct platform_device *pdev = to_platform_device(dev);         \
 285        struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);   \
 286        ssize_t error;                                                  \
 287                                                                        \
 288        error = gpio_keys_attr_store_helper(ddata, buf, type);          \
 289        if (error)                                                      \
 290                return error;                                           \
 291                                                                        \
 292        return count;                                                   \
 293}
 294
 295ATTR_STORE_FN(disabled_keys, EV_KEY);
 296ATTR_STORE_FN(disabled_switches, EV_SW);
 297
 298/*
 299 * ATTRIBUTES:
 300 *
 301 * /sys/devices/platform/gpio-keys/disabled_keys [rw]
 302 * /sys/devices/platform/gpio-keys/disables_switches [rw]
 303 */
 304static DEVICE_ATTR(disabled_keys, S_IWUSR | S_IRUGO,
 305                   gpio_keys_show_disabled_keys,
 306                   gpio_keys_store_disabled_keys);
 307static DEVICE_ATTR(disabled_switches, S_IWUSR | S_IRUGO,
 308                   gpio_keys_show_disabled_switches,
 309                   gpio_keys_store_disabled_switches);
 310
 311static struct attribute *gpio_keys_attrs[] = {
 312        &dev_attr_keys.attr,
 313        &dev_attr_switches.attr,
 314        &dev_attr_disabled_keys.attr,
 315        &dev_attr_disabled_switches.attr,
 316        NULL,
 317};
 318
 319static struct attribute_group gpio_keys_attr_group = {
 320        .attrs = gpio_keys_attrs,
 321};
 322
 323static void gpio_keys_report_event(struct gpio_button_data *bdata)
 324{
 325        struct gpio_keys_button *button = bdata->button;
 326        struct input_dev *input = bdata->input;
 327        unsigned int type = button->type ?: EV_KEY;
 328        int state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ button->active_low;
 329
 330        if (type == EV_ABS) {
 331                if (state)
 332                        input_event(input, type, button->code, button->value);
 333        } else {
 334                input_event(input, type, button->code, !!state);
 335        }
 336        input_sync(input);
 337}
 338
 339static void gpio_keys_work_func(struct work_struct *work)
 340{
 341        struct gpio_button_data *bdata =
 342                container_of(work, struct gpio_button_data, work);
 343
 344        gpio_keys_report_event(bdata);
 345}
 346
 347static void gpio_keys_timer(unsigned long _data)
 348{
 349        struct gpio_button_data *data = (struct gpio_button_data *)_data;
 350
 351        schedule_work(&data->work);
 352}
 353
 354static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
 355{
 356        struct gpio_button_data *bdata = dev_id;
 357        struct gpio_keys_button *button = bdata->button;
 358
 359        BUG_ON(irq != gpio_to_irq(button->gpio));
 360
 361        if (bdata->timer_debounce)
 362                mod_timer(&bdata->timer,
 363                        jiffies + msecs_to_jiffies(bdata->timer_debounce));
 364        else
 365                schedule_work(&bdata->work);
 366
 367        return IRQ_HANDLED;
 368}
 369
 370static int __devinit gpio_keys_setup_key(struct platform_device *pdev,
 371                                         struct gpio_button_data *bdata,
 372                                         struct gpio_keys_button *button)
 373{
 374        const char *desc = button->desc ? button->desc : "gpio_keys";
 375        struct device *dev = &pdev->dev;
 376        unsigned long irqflags;
 377        int irq, error;
 378
 379        setup_timer(&bdata->timer, gpio_keys_timer, (unsigned long)bdata);
 380        INIT_WORK(&bdata->work, gpio_keys_work_func);
 381
 382        error = gpio_request(button->gpio, desc);
 383        if (error < 0) {
 384                dev_err(dev, "failed to request GPIO %d, error %d\n",
 385                        button->gpio, error);
 386                goto fail2;
 387        }
 388
 389        error = gpio_direction_input(button->gpio);
 390        if (error < 0) {
 391                dev_err(dev, "failed to configure"
 392                        " direction for GPIO %d, error %d\n",
 393                        button->gpio, error);
 394                goto fail3;
 395        }
 396
 397        if (button->debounce_interval) {
 398                error = gpio_set_debounce(button->gpio,
 399                                          button->debounce_interval * 1000);
 400                /* use timer if gpiolib doesn't provide debounce */
 401                if (error < 0)
 402                        bdata->timer_debounce = button->debounce_interval;
 403        }
 404
 405        irq = gpio_to_irq(button->gpio);
 406        if (irq < 0) {
 407                error = irq;
 408                dev_err(dev, "Unable to get irq number for GPIO %d, error %d\n",
 409                        button->gpio, error);
 410                goto fail3;
 411        }
 412
 413        irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
 414        /*
 415         * If platform has specified that the button can be disabled,
 416         * we don't want it to share the interrupt line.
 417         */
 418        if (!button->can_disable)
 419                irqflags |= IRQF_SHARED;
 420
 421        error = request_threaded_irq(irq, NULL, gpio_keys_isr, irqflags, desc, bdata);
 422        if (error < 0) {
 423                dev_err(dev, "Unable to claim irq %d; error %d\n",
 424                        irq, error);
 425                goto fail3;
 426        }
 427
 428        return 0;
 429
 430fail3:
 431        gpio_free(button->gpio);
 432fail2:
 433        return error;
 434}
 435
 436static int gpio_keys_open(struct input_dev *input)
 437{
 438        struct gpio_keys_drvdata *ddata = input_get_drvdata(input);
 439
 440        return ddata->enable ? ddata->enable(input->dev.parent) : 0;
 441}
 442
 443static void gpio_keys_close(struct input_dev *input)
 444{
 445        struct gpio_keys_drvdata *ddata = input_get_drvdata(input);
 446
 447        if (ddata->disable)
 448                ddata->disable(input->dev.parent);
 449}
 450
 451/*
 452 * Handlers for alternative sources of platform_data
 453 */
 454#ifdef CONFIG_OF
 455/*
 456 * Translate OpenFirmware node properties into platform_data
 457 */
 458static int gpio_keys_get_devtree_pdata(struct device *dev,
 459                            struct gpio_keys_platform_data *pdata)
 460{
 461        struct device_node *node, *pp;
 462        int i;
 463        struct gpio_keys_button *buttons;
 464        u32 reg;
 465
 466        node = dev->of_node;
 467        if (node == NULL)
 468                return -ENODEV;
 469
 470        memset(pdata, 0, sizeof *pdata);
 471
 472        pdata->rep = !!of_get_property(node, "autorepeat", NULL);
 473
 474        /* First count the subnodes */
 475        pdata->nbuttons = 0;
 476        pp = NULL;
 477        while ((pp = of_get_next_child(node, pp)))
 478                pdata->nbuttons++;
 479
 480        if (pdata->nbuttons == 0)
 481                return -ENODEV;
 482
 483        buttons = kzalloc(pdata->nbuttons * (sizeof *buttons), GFP_KERNEL);
 484        if (!buttons)
 485                return -ENOMEM;
 486
 487        pp = NULL;
 488        i = 0;
 489        while ((pp = of_get_next_child(node, pp))) {
 490                enum of_gpio_flags flags;
 491
 492                if (!of_find_property(pp, "gpios", NULL)) {
 493                        pdata->nbuttons--;
 494                        dev_warn(dev, "Found button without gpios\n");
 495                        continue;
 496                }
 497                buttons[i].gpio = of_get_gpio_flags(pp, 0, &flags);
 498                buttons[i].active_low = flags & OF_GPIO_ACTIVE_LOW;
 499
 500                if (of_property_read_u32(pp, "linux,code", &reg)) {
 501                        dev_err(dev, "Button without keycode: 0x%x\n", buttons[i].gpio);
 502                        goto out_fail;
 503                }
 504                buttons[i].code = reg;
 505
 506                buttons[i].desc = of_get_property(pp, "label", NULL);
 507
 508                if (of_property_read_u32(pp, "linux,input-type", &reg) == 0)
 509                        buttons[i].type = reg;
 510                else
 511                        buttons[i].type = EV_KEY;
 512
 513                buttons[i].wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL);
 514
 515                if (of_property_read_u32(pp, "debounce-interval", &reg) == 0)
 516                        buttons[i].debounce_interval = reg;
 517                else
 518                        buttons[i].debounce_interval = 5;
 519
 520                i++;
 521        }
 522
 523        pdata->buttons = buttons;
 524
 525        return 0;
 526
 527out_fail:
 528        kfree(buttons);
 529        return -ENODEV;
 530}
 531
 532static struct of_device_id gpio_keys_of_match[] = {
 533        { .compatible = "gpio-keys", },
 534        { },
 535};
 536MODULE_DEVICE_TABLE(of, gpio_keys_of_match);
 537
 538#else
 539
 540static int gpio_keys_get_devtree_pdata(struct device *dev,
 541                            struct gpio_keys_platform_data *altp)
 542{
 543        return -ENODEV;
 544}
 545
 546#define gpio_keys_of_match NULL
 547
 548#endif
 549
 550static int __devinit gpio_keys_probe(struct platform_device *pdev)
 551{
 552        struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
 553        struct gpio_keys_drvdata *ddata;
 554        struct device *dev = &pdev->dev;
 555        struct gpio_keys_platform_data alt_pdata;
 556        struct input_dev *input;
 557        int i, error;
 558        int wakeup = 0;
 559
 560        if (!pdata) {
 561                error = gpio_keys_get_devtree_pdata(dev, &alt_pdata);
 562                if (error)
 563                        return error;
 564                pdata = &alt_pdata;
 565        }
 566
 567        ddata = kzalloc(sizeof(struct gpio_keys_drvdata) +
 568                        pdata->nbuttons * sizeof(struct gpio_button_data),
 569                        GFP_KERNEL);
 570        input = input_allocate_device();
 571        if (!ddata || !input) {
 572                dev_err(dev, "failed to allocate state\n");
 573                error = -ENOMEM;
 574                goto fail1;
 575        }
 576
 577        ddata->input = input;
 578        ddata->n_buttons = pdata->nbuttons;
 579        ddata->enable = pdata->enable;
 580        ddata->disable = pdata->disable;
 581        mutex_init(&ddata->disable_lock);
 582
 583        platform_set_drvdata(pdev, ddata);
 584        input_set_drvdata(input, ddata);
 585
 586        input->name = pdata->name ? : pdev->name;
 587        input->phys = "gpio-keys/input0";
 588        input->dev.parent = &pdev->dev;
 589        input->open = gpio_keys_open;
 590        input->close = gpio_keys_close;
 591
 592        input->id.bustype = BUS_HOST;
 593        input->id.vendor = 0x0001;
 594        input->id.product = 0x0001;
 595        input->id.version = 0x0100;
 596
 597        /* Enable auto repeat feature of Linux input subsystem */
 598        if (pdata->rep)
 599                __set_bit(EV_REP, input->evbit);
 600
 601        for (i = 0; i < pdata->nbuttons; i++) {
 602                struct gpio_keys_button *button = &pdata->buttons[i];
 603                struct gpio_button_data *bdata = &ddata->data[i];
 604                unsigned int type = button->type ?: EV_KEY;
 605
 606                bdata->input = input;
 607                bdata->button = button;
 608
 609                error = gpio_keys_setup_key(pdev, bdata, button);
 610                if (error)
 611                        goto fail2;
 612
 613                if (button->wakeup)
 614                        wakeup = 1;
 615
 616                input_set_capability(input, type, button->code);
 617        }
 618
 619        error = sysfs_create_group(&pdev->dev.kobj, &gpio_keys_attr_group);
 620        if (error) {
 621                dev_err(dev, "Unable to export keys/switches, error: %d\n",
 622                        error);
 623                goto fail2;
 624        }
 625
 626        error = input_register_device(input);
 627        if (error) {
 628                dev_err(dev, "Unable to register input device, error: %d\n",
 629                        error);
 630                goto fail3;
 631        }
 632
 633        /* get current state of buttons */
 634        for (i = 0; i < pdata->nbuttons; i++)
 635                gpio_keys_report_event(&ddata->data[i]);
 636        input_sync(input);
 637
 638        device_init_wakeup(&pdev->dev, wakeup);
 639
 640        return 0;
 641
 642 fail3:
 643        sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group);
 644 fail2:
 645        while (--i >= 0) {
 646                free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata->data[i]);
 647                if (ddata->data[i].timer_debounce)
 648                        del_timer_sync(&ddata->data[i].timer);
 649                cancel_work_sync(&ddata->data[i].work);
 650                gpio_free(pdata->buttons[i].gpio);
 651        }
 652
 653        platform_set_drvdata(pdev, NULL);
 654 fail1:
 655        input_free_device(input);
 656        kfree(ddata);
 657        /* If we have no platform_data, we allocated buttons dynamically. */
 658        if (!pdev->dev.platform_data)
 659                kfree(pdata->buttons);
 660
 661        return error;
 662}
 663
 664static int __devexit gpio_keys_remove(struct platform_device *pdev)
 665{
 666        struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
 667        struct input_dev *input = ddata->input;
 668        int i;
 669
 670        sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group);
 671
 672        device_init_wakeup(&pdev->dev, 0);
 673
 674        for (i = 0; i < ddata->n_buttons; i++) {
 675                int irq = gpio_to_irq(ddata->data[i].button->gpio);
 676                free_irq(irq, &ddata->data[i]);
 677                if (ddata->data[i].timer_debounce)
 678                        del_timer_sync(&ddata->data[i].timer);
 679                cancel_work_sync(&ddata->data[i].work);
 680                gpio_free(ddata->data[i].button->gpio);
 681        }
 682
 683        input_unregister_device(input);
 684
 685        /*
 686         * If we had no platform_data, we allocated buttons dynamically, and
 687         * must free them here. ddata->data[0].button is the pointer to the
 688         * beginning of the allocated array.
 689         */
 690        if (!pdev->dev.platform_data)
 691                kfree(ddata->data[0].button);
 692
 693        kfree(ddata);
 694
 695        return 0;
 696}
 697
 698#ifdef CONFIG_PM_SLEEP
 699static int gpio_keys_suspend(struct device *dev)
 700{
 701        struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
 702        int i;
 703
 704        if (device_may_wakeup(dev)) {
 705                for (i = 0; i < ddata->n_buttons; i++) {
 706                        struct gpio_keys_button *button = ddata->data[i].button;
 707                        if (button->wakeup) {
 708                                int irq = gpio_to_irq(button->gpio);
 709                                enable_irq_wake(irq);
 710                        }
 711                }
 712        }
 713
 714        return 0;
 715}
 716
 717static int gpio_keys_resume(struct device *dev)
 718{
 719        struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
 720        int i;
 721
 722        for (i = 0; i < ddata->n_buttons; i++) {
 723
 724                struct gpio_keys_button *button = ddata->data[i].button;
 725                if (button->wakeup && device_may_wakeup(dev)) {
 726                        int irq = gpio_to_irq(button->gpio);
 727                        disable_irq_wake(irq);
 728                }
 729
 730                gpio_keys_report_event(&ddata->data[i]);
 731        }
 732        input_sync(ddata->input);
 733
 734        return 0;
 735}
 736#endif
 737
 738static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume);
 739
 740static struct platform_driver gpio_keys_device_driver = {
 741        .probe          = gpio_keys_probe,
 742        .remove         = __devexit_p(gpio_keys_remove),
 743        .driver         = {
 744                .name   = "gpio-keys",
 745                .owner  = THIS_MODULE,
 746                .pm     = &gpio_keys_pm_ops,
 747                .of_match_table = gpio_keys_of_match,
 748        }
 749};
 750
 751static int __init gpio_keys_init(void)
 752{
 753        return platform_driver_register(&gpio_keys_device_driver);
 754}
 755
 756static void __exit gpio_keys_exit(void)
 757{
 758        platform_driver_unregister(&gpio_keys_device_driver);
 759}
 760
 761late_initcall(gpio_keys_init);
 762module_exit(gpio_keys_exit);
 763
 764MODULE_LICENSE("GPL");
 765MODULE_AUTHOR("Phil Blundell <pb@handhelds.org>");
 766MODULE_DESCRIPTION("Keyboard driver for GPIOs");
 767MODULE_ALIAS("platform:gpio-keys");
 768
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.