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 32 struct 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 41 struct 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 */ 91 static 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 */ 111 static 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 */ 135 static 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 */ 157 static 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 */ 201 static 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 247 out: 248 kfree(bits); 249 return error; 250 } 251 252 #define ATTR_SHOW_FN(name, type, only_disabled) \ 253 static 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 264 ATTR_SHOW_FN(keys, EV_KEY, false); 265 ATTR_SHOW_FN(switches, EV_SW, false); 266 ATTR_SHOW_FN(disabled_keys, EV_KEY, true); 267 ATTR_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 */ 275 static DEVICE_ATTR(keys, S_IRUGO, gpio_keys_show_keys, NULL); 276 static DEVICE_ATTR(switches, S_IRUGO, gpio_keys_show_switches, NULL); 277 278 #define ATTR_STORE_FN(name, type) \ 279 static 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 295 ATTR_STORE_FN(disabled_keys, EV_KEY); 296 ATTR_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 */ 304 static DEVICE_ATTR(disabled_keys, S_IWUSR | S_IRUGO, 305 gpio_keys_show_disabled_keys, 306 gpio_keys_store_disabled_keys); 307 static DEVICE_ATTR(disabled_switches, S_IWUSR | S_IRUGO, 308 gpio_keys_show_disabled_switches, 309 gpio_keys_store_disabled_switches); 310 311 static 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 319 static struct attribute_group gpio_keys_attr_group = { 320 .attrs = gpio_keys_attrs, 321 }; 322 323 static 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 339 static 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 347 static 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 354 static 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 370 static 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 430 fail3: 431 gpio_free(button->gpio); 432 fail2: 433 return error; 434 } 435 436 static 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 443 static 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 */ 458 static 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", ®)) { 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", ®) == 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", ®) == 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 527 out_fail: 528 kfree(buttons); 529 return -ENODEV; 530 } 531 532 static struct of_device_id gpio_keys_of_match[] = { 533 { .compatible = "gpio-keys", }, 534 { }, 535 }; 536 MODULE_DEVICE_TABLE(of, gpio_keys_of_match); 537 538 #else 539 540 static 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 550 static 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 664 static 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 699 static 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 717 static 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 738 static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume); 739 740 static 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 751 static int __init gpio_keys_init(void) 752 { 753 return platform_driver_register(&gpio_keys_device_driver); 754 } 755 756 static void __exit gpio_keys_exit(void) 757 { 758 platform_driver_unregister(&gpio_keys_device_driver); 759 } 760 761 late_initcall(gpio_keys_init); 762 module_exit(gpio_keys_exit); 763 764 MODULE_LICENSE("GPL"); 765 MODULE_AUTHOR("Phil Blundell <pb@handhelds.org>"); 766 MODULE_DESCRIPTION("Keyboard driver for GPIOs"); 767 MODULE_ALIAS("platform:gpio-keys"); 768