1// SPDX-License-Identifier: GPL-2.0 2#include "bcm47xx_private.h" 3 4#include <linux/input.h> 5#include <linux/gpio_keys.h> 6#include <linux/interrupt.h> 7#include <bcm47xx_board.h> 8#include <bcm47xx.h> 9 10/************************************************** 11 * Database 12 **************************************************/ 13 14#define BCM47XX_GPIO_KEY(_gpio, _code) \ 15 { \ 16 .code = _code, \ 17 .gpio = _gpio, \ 18 .active_low = 1, \ 19 } 20 21#define BCM47XX_GPIO_KEY_H(_gpio, _code) \ 22 { \ 23 .code = _code, \ 24 .gpio = _gpio, \ 25 } 26 27/* Asus */ 28 29static const struct gpio_keys_button 30bcm47xx_buttons_asus_rtn12[] __initconst = { 31 BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 32 BCM47XX_GPIO_KEY(1, KEY_RESTART), 33 BCM47XX_GPIO_KEY(4, BTN_0), /* Router mode */ 34 BCM47XX_GPIO_KEY(5, BTN_1), /* Repeater mode */ 35 BCM47XX_GPIO_KEY(6, BTN_2), /* AP mode */ 36}; 37 38static const struct gpio_keys_button 39bcm47xx_buttons_asus_rtn16[] __initconst = { 40 BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), 41 BCM47XX_GPIO_KEY(8, KEY_RESTART), 42}; 43 44static const struct gpio_keys_button 45bcm47xx_buttons_asus_rtn66u[] __initconst = { 46 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 47 BCM47XX_GPIO_KEY(9, KEY_RESTART), 48}; 49 50static const struct gpio_keys_button 51bcm47xx_buttons_asus_wl300g[] __initconst = { 52 BCM47XX_GPIO_KEY(6, KEY_RESTART), 53}; 54 55static const struct gpio_keys_button 56bcm47xx_buttons_asus_wl320ge[] __initconst = { 57 BCM47XX_GPIO_KEY(6, KEY_RESTART), 58}; 59 60static const struct gpio_keys_button 61bcm47xx_buttons_asus_wl330ge[] __initconst = { 62 BCM47XX_GPIO_KEY(2, KEY_RESTART), 63}; 64 65static const struct gpio_keys_button 66bcm47xx_buttons_asus_wl500g[] __initconst = { 67 BCM47XX_GPIO_KEY(6, KEY_RESTART), 68}; 69 70static const struct gpio_keys_button 71bcm47xx_buttons_asus_wl500gd[] __initconst = { 72 BCM47XX_GPIO_KEY(6, KEY_RESTART), 73}; 74 75static const struct gpio_keys_button 76bcm47xx_buttons_asus_wl500gpv1[] __initconst = { 77 BCM47XX_GPIO_KEY(0, KEY_RESTART), 78 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 79}; 80 81static const struct gpio_keys_button 82bcm47xx_buttons_asus_wl500gpv2[] __initconst = { 83 BCM47XX_GPIO_KEY(2, KEY_RESTART), 84 BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON), 85}; 86 87static const struct gpio_keys_button 88bcm47xx_buttons_asus_wl500w[] __initconst = { 89 BCM47XX_GPIO_KEY_H(6, KEY_RESTART), 90 BCM47XX_GPIO_KEY_H(7, KEY_WPS_BUTTON), 91}; 92 93static const struct gpio_keys_button 94bcm47xx_buttons_asus_wl520gc[] __initconst = { 95 BCM47XX_GPIO_KEY(2, KEY_RESTART), 96 BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON), 97}; 98 99static const struct gpio_keys_button 100bcm47xx_buttons_asus_wl520gu[] __initconst = { 101 BCM47XX_GPIO_KEY(2, KEY_RESTART), 102 BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON), 103}; 104 105static const struct gpio_keys_button 106bcm47xx_buttons_asus_wl700ge[] __initconst = { 107 BCM47XX_GPIO_KEY(0, KEY_POWER), /* Hard disk power switch */ 108 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), /* EZSetup */ 109 BCM47XX_GPIO_KEY(6, KEY_COPY), /* Copy data from USB to internal disk */ 110 BCM47XX_GPIO_KEY(7, KEY_RESTART), /* Hard reset */ 111}; 112 113static const struct gpio_keys_button 114bcm47xx_buttons_asus_wlhdd[] __initconst = { 115 BCM47XX_GPIO_KEY(6, KEY_RESTART), 116}; 117 118/* Huawei */ 119 120static const struct gpio_keys_button 121bcm47xx_buttons_huawei_e970[] __initconst = { 122 BCM47XX_GPIO_KEY(6, KEY_RESTART), 123}; 124 125/* Belkin */ 126 127static const struct gpio_keys_button 128bcm47xx_buttons_belkin_f7d4301[] __initconst = { 129 BCM47XX_GPIO_KEY(6, KEY_RESTART), 130 BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON), 131}; 132 133/* Buffalo */ 134 135static const struct gpio_keys_button 136bcm47xx_buttons_buffalo_whr2_a54g54[] __initconst = { 137 BCM47XX_GPIO_KEY(4, KEY_RESTART), 138}; 139 140static const struct gpio_keys_button 141bcm47xx_buttons_buffalo_whr_g125[] __initconst = { 142 BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 143 BCM47XX_GPIO_KEY(4, KEY_RESTART), 144 BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode swtich */ 145}; 146 147static const struct gpio_keys_button 148bcm47xx_buttons_buffalo_whr_g54s[] __initconst = { 149 BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 150 BCM47XX_GPIO_KEY_H(4, KEY_RESTART), 151 BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode swtich */ 152}; 153 154static const struct gpio_keys_button 155bcm47xx_buttons_buffalo_whr_hp_g54[] __initconst = { 156 BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 157 BCM47XX_GPIO_KEY(4, KEY_RESTART), 158 BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode swtich */ 159}; 160 161static const struct gpio_keys_button 162bcm47xx_buttons_buffalo_wzr_g300n[] __initconst = { 163 BCM47XX_GPIO_KEY(4, KEY_RESTART), 164}; 165 166static const struct gpio_keys_button 167bcm47xx_buttons_buffalo_wzr_rs_g54[] __initconst = { 168 BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 169 BCM47XX_GPIO_KEY(4, KEY_RESTART), 170}; 171 172static const struct gpio_keys_button 173bcm47xx_buttons_buffalo_wzr_rs_g54hp[] __initconst = { 174 BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 175 BCM47XX_GPIO_KEY(4, KEY_RESTART), 176}; 177 178/* Dell */ 179 180static const struct gpio_keys_button 181bcm47xx_buttons_dell_tm2300[] __initconst = { 182 BCM47XX_GPIO_KEY(0, KEY_RESTART), 183}; 184 185/* D-Link */ 186 187static const struct gpio_keys_button 188bcm47xx_buttons_dlink_dir130[] __initconst = { 189 BCM47XX_GPIO_KEY(3, KEY_RESTART), 190 BCM47XX_GPIO_KEY(7, KEY_UNKNOWN), 191}; 192 193static const struct gpio_keys_button 194bcm47xx_buttons_dlink_dir330[] __initconst = { 195 BCM47XX_GPIO_KEY(3, KEY_RESTART), 196 BCM47XX_GPIO_KEY(7, KEY_UNKNOWN), 197}; 198 199/* Linksys */ 200 201static const struct gpio_keys_button 202bcm47xx_buttons_linksys_e1000v1[] __initconst = { 203 BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), 204 BCM47XX_GPIO_KEY(6, KEY_RESTART), 205}; 206 207static const struct gpio_keys_button 208bcm47xx_buttons_linksys_e1000v21[] __initconst = { 209 BCM47XX_GPIO_KEY(9, KEY_WPS_BUTTON), 210 BCM47XX_GPIO_KEY(10, KEY_RESTART), 211}; 212 213static const struct gpio_keys_button 214bcm47xx_buttons_linksys_e2000v1[] __initconst = { 215 BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), 216 BCM47XX_GPIO_KEY(8, KEY_RESTART), 217}; 218 219static const struct gpio_keys_button 220bcm47xx_buttons_linksys_e3000v1[] __initconst = { 221 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 222 BCM47XX_GPIO_KEY(6, KEY_RESTART), 223}; 224 225static const struct gpio_keys_button 226bcm47xx_buttons_linksys_e3200v1[] __initconst = { 227 BCM47XX_GPIO_KEY(5, KEY_RESTART), 228 BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON), 229}; 230 231static const struct gpio_keys_button 232bcm47xx_buttons_linksys_e4200v1[] __initconst = { 233 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 234 BCM47XX_GPIO_KEY(6, KEY_RESTART), 235}; 236 237static const struct gpio_keys_button 238bcm47xx_buttons_linksys_wrt150nv1[] __initconst = { 239 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 240 BCM47XX_GPIO_KEY(6, KEY_RESTART), 241}; 242 243static const struct gpio_keys_button 244bcm47xx_buttons_linksys_wrt150nv11[] __initconst = { 245 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 246 BCM47XX_GPIO_KEY(6, KEY_RESTART), 247}; 248 249static const struct gpio_keys_button 250bcm47xx_buttons_linksys_wrt160nv1[] __initconst = { 251 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 252 BCM47XX_GPIO_KEY(6, KEY_RESTART), 253}; 254 255static const struct gpio_keys_button 256bcm47xx_buttons_linksys_wrt160nv3[] __initconst = { 257 BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), 258 BCM47XX_GPIO_KEY(6, KEY_RESTART), 259}; 260 261static const struct gpio_keys_button 262bcm47xx_buttons_linksys_wrt300n_v1[] __initconst = { 263 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 264 BCM47XX_GPIO_KEY(6, KEY_RESTART), 265}; 266 267static const struct gpio_keys_button 268bcm47xx_buttons_linksys_wrt300nv11[] __initconst = { 269 BCM47XX_GPIO_KEY(4, KEY_UNKNOWN), 270 BCM47XX_GPIO_KEY(6, KEY_RESTART), 271}; 272 273static const struct gpio_keys_button 274bcm47xx_buttons_linksys_wrt310nv1[] __initconst = { 275 BCM47XX_GPIO_KEY(6, KEY_RESTART), 276 BCM47XX_GPIO_KEY(8, KEY_UNKNOWN), 277}; 278 279static const struct gpio_keys_button 280bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = { 281 BCM47XX_GPIO_KEY(5, KEY_WIMAX), 282 BCM47XX_GPIO_KEY(6, KEY_RESTART), 283}; 284 285static const struct gpio_keys_button 286bcm47xx_buttons_linksys_wrt54g_generic[] __initconst = { 287 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 288 BCM47XX_GPIO_KEY(6, KEY_RESTART), 289}; 290 291static const struct gpio_keys_button 292bcm47xx_buttons_linksys_wrt610nv1[] __initconst = { 293 BCM47XX_GPIO_KEY(6, KEY_RESTART), 294 BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON), 295}; 296 297static const struct gpio_keys_button 298bcm47xx_buttons_linksys_wrt610nv2[] __initconst = { 299 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 300 BCM47XX_GPIO_KEY(6, KEY_RESTART), 301}; 302 303static const struct gpio_keys_button 304bcm47xx_buttons_linksys_wrtsl54gs[] __initconst = { 305 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 306 BCM47XX_GPIO_KEY(6, KEY_RESTART), 307}; 308 309/* Luxul */ 310 311static const struct gpio_keys_button 312bcm47xx_buttons_luxul_abr_4400_v1[] = { 313 BCM47XX_GPIO_KEY(14, KEY_RESTART), 314}; 315 316static const struct gpio_keys_button 317bcm47xx_buttons_luxul_xap_310_v1[] = { 318 BCM47XX_GPIO_KEY(20, KEY_RESTART), 319}; 320 321static const struct gpio_keys_button 322bcm47xx_buttons_luxul_xap_1210_v1[] = { 323 BCM47XX_GPIO_KEY(8, KEY_RESTART), 324}; 325 326static const struct gpio_keys_button 327bcm47xx_buttons_luxul_xap_1230_v1[] = { 328 BCM47XX_GPIO_KEY(8, KEY_RESTART), 329}; 330 331static const struct gpio_keys_button 332bcm47xx_buttons_luxul_xap_1240_v1[] = { 333 BCM47XX_GPIO_KEY(8, KEY_RESTART), 334}; 335 336static const struct gpio_keys_button 337bcm47xx_buttons_luxul_xap_1500_v1[] = { 338 BCM47XX_GPIO_KEY(14, KEY_RESTART), 339}; 340 341static const struct gpio_keys_button 342bcm47xx_buttons_luxul_xbr_4400_v1[] = { 343 BCM47XX_GPIO_KEY(14, KEY_RESTART), 344}; 345 346static const struct gpio_keys_button 347bcm47xx_buttons_luxul_xvw_p30_v1[] = { 348 BCM47XX_GPIO_KEY(20, KEY_RESTART), 349}; 350 351static const struct gpio_keys_button 352bcm47xx_buttons_luxul_xwr_600_v1[] = { 353 BCM47XX_GPIO_KEY(8, KEY_RESTART), 354}; 355 356static const struct gpio_keys_button 357bcm47xx_buttons_luxul_xwr_1750_v1[] = { 358 BCM47XX_GPIO_KEY(14, KEY_RESTART), 359}; 360 361/* Microsoft */ 362 363static const struct gpio_keys_button 364bcm47xx_buttons_microsoft_nm700[] __initconst = { 365 BCM47XX_GPIO_KEY(7, KEY_RESTART), 366}; 367 368/* Motorola */ 369 370static const struct gpio_keys_button 371bcm47xx_buttons_motorola_we800g[] __initconst = { 372 BCM47XX_GPIO_KEY(0, KEY_RESTART), 373}; 374 375static const struct gpio_keys_button 376bcm47xx_buttons_motorola_wr850gp[] __initconst = { 377 BCM47XX_GPIO_KEY(5, KEY_RESTART), 378}; 379 380static const struct gpio_keys_button 381bcm47xx_buttons_motorola_wr850gv2v3[] __initconst = { 382 BCM47XX_GPIO_KEY(5, KEY_RESTART), 383}; 384 385/* Netgear */ 386 387static const struct gpio_keys_button 388bcm47xx_buttons_netgear_r6200_v1[] __initconst = { 389 BCM47XX_GPIO_KEY(2, KEY_RFKILL), 390 BCM47XX_GPIO_KEY(3, KEY_RESTART), 391 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 392}; 393 394static const struct gpio_keys_button 395bcm47xx_buttons_netgear_wndr3400v1[] __initconst = { 396 BCM47XX_GPIO_KEY(4, KEY_RESTART), 397 BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), 398 BCM47XX_GPIO_KEY(8, KEY_RFKILL), 399}; 400 401static const struct gpio_keys_button 402bcm47xx_buttons_netgear_wndr3400_v3[] __initconst = { 403 BCM47XX_GPIO_KEY(12, KEY_RESTART), 404 BCM47XX_GPIO_KEY(23, KEY_WPS_BUTTON), 405}; 406 407static const struct gpio_keys_button 408bcm47xx_buttons_netgear_wndr3700v3[] __initconst = { 409 BCM47XX_GPIO_KEY(2, KEY_RFKILL), 410 BCM47XX_GPIO_KEY(3, KEY_RESTART), 411 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 412}; 413 414static const struct gpio_keys_button 415bcm47xx_buttons_netgear_wndr4500v1[] __initconst = { 416 BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 417 BCM47XX_GPIO_KEY(5, KEY_RFKILL), 418 BCM47XX_GPIO_KEY(6, KEY_RESTART), 419}; 420 421static const struct gpio_keys_button 422bcm47xx_buttons_netgear_wnr1000_v3[] __initconst = { 423 BCM47XX_GPIO_KEY(2, KEY_WPS_BUTTON), 424 BCM47XX_GPIO_KEY(3, KEY_RESTART), 425}; 426 427static const struct gpio_keys_button 428bcm47xx_buttons_netgear_wnr3500lv1[] __initconst = { 429 BCM47XX_GPIO_KEY(4, KEY_RESTART), 430 BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), 431}; 432 433static const struct gpio_keys_button 434bcm47xx_buttons_netgear_wnr834bv2[] __initconst = { 435 BCM47XX_GPIO_KEY(6, KEY_RESTART), 436}; 437 438/* SimpleTech */ 439 440static const struct gpio_keys_button 441bcm47xx_buttons_simpletech_simpleshare[] __initconst = { 442 BCM47XX_GPIO_KEY(0, KEY_RESTART), 443}; 444 445/************************************************** 446 * Init 447 **************************************************/ 448 449static struct gpio_keys_platform_data bcm47xx_button_pdata; 450 451static struct platform_device bcm47xx_buttons_gpio_keys = { 452 .name = "gpio-keys", 453 .dev = { 454 .platform_data = &bcm47xx_button_pdata, 455 } 456}; 457 458/* Copy data from __initconst */ 459static int __init bcm47xx_buttons_copy(const struct gpio_keys_button *buttons, 460 size_t nbuttons) 461{ 462 size_t size = nbuttons * sizeof(*buttons); 463 464 bcm47xx_button_pdata.buttons = kmemdup(buttons, size, GFP_KERNEL); 465 if (!bcm47xx_button_pdata.buttons) 466 return -ENOMEM; 467 bcm47xx_button_pdata.nbuttons = nbuttons; 468 469 return 0; 470} 471 472#define bcm47xx_copy_bdata(dev_buttons) \ 473 bcm47xx_buttons_copy(dev_buttons, ARRAY_SIZE(dev_buttons)); 474 475int __init bcm47xx_buttons_register(void) 476{ 477 enum bcm47xx_board board = bcm47xx_board_get(); 478 int err; 479 480 switch (board) { 481 case BCM47XX_BOARD_ASUS_RTN12: 482 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn12); 483 break; 484 case BCM47XX_BOARD_ASUS_RTN16: 485 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn16); 486 break; 487 case BCM47XX_BOARD_ASUS_RTN66U: 488 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn66u); 489 break; 490 case BCM47XX_BOARD_ASUS_WL300G: 491 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl300g); 492 break; 493 case BCM47XX_BOARD_ASUS_WL320GE: 494 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl320ge); 495 break; 496 case BCM47XX_BOARD_ASUS_WL330GE: 497 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl330ge); 498 break; 499 case BCM47XX_BOARD_ASUS_WL500G: 500 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500g); 501 break; 502 case BCM47XX_BOARD_ASUS_WL500GD: 503 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gd); 504 break; 505 case BCM47XX_BOARD_ASUS_WL500GPV1: 506 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gpv1); 507 break; 508 case BCM47XX_BOARD_ASUS_WL500GPV2: 509 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gpv2); 510 break; 511 case BCM47XX_BOARD_ASUS_WL500W: 512 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500w); 513 break; 514 case BCM47XX_BOARD_ASUS_WL520GC: 515 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl520gc); 516 break; 517 case BCM47XX_BOARD_ASUS_WL520GU: 518 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl520gu); 519 break; 520 case BCM47XX_BOARD_ASUS_WL700GE: 521 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl700ge); 522 break; 523 case BCM47XX_BOARD_ASUS_WLHDD: 524 err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wlhdd); 525 break; 526 527 case BCM47XX_BOARD_BELKIN_F7D3301: 528 case BCM47XX_BOARD_BELKIN_F7D3302: 529 case BCM47XX_BOARD_BELKIN_F7D4301: 530 case BCM47XX_BOARD_BELKIN_F7D4302: 531 case BCM47XX_BOARD_BELKIN_F7D4401: 532 err = bcm47xx_copy_bdata(bcm47xx_buttons_belkin_f7d4301); 533 break; 534 535 case BCM47XX_BOARD_BUFFALO_WHR2_A54G54: 536 err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr2_a54g54); 537 break; 538 case BCM47XX_BOARD_BUFFALO_WHR_G125: 539 err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_g125); 540 break; 541 case BCM47XX_BOARD_BUFFALO_WHR_G54S: 542 err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_g54s); 543 break; 544 case BCM47XX_BOARD_BUFFALO_WHR_HP_G54: 545 err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_hp_g54); 546 break; 547 case BCM47XX_BOARD_BUFFALO_WZR_G300N: 548 err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_g300n); 549 break; 550 case BCM47XX_BOARD_BUFFALO_WZR_RS_G54: 551 err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54); 552 break; 553 case BCM47XX_BOARD_BUFFALO_WZR_RS_G54HP: 554 err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54hp); 555 break; 556 557 case BCM47XX_BOARD_DELL_TM2300: 558 err = bcm47xx_copy_bdata(bcm47xx_buttons_dell_tm2300); 559 break; 560 561 case BCM47XX_BOARD_DLINK_DIR130: 562 err = bcm47xx_copy_bdata(bcm47xx_buttons_dlink_dir130); 563 break; 564 case BCM47XX_BOARD_DLINK_DIR330: 565 err = bcm47xx_copy_bdata(bcm47xx_buttons_dlink_dir330); 566 break; 567 568 case BCM47XX_BOARD_HUAWEI_E970: 569 err = bcm47xx_copy_bdata(bcm47xx_buttons_huawei_e970); 570 break; 571 572 case BCM47XX_BOARD_LINKSYS_E1000V1: 573 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e1000v1); 574 break; 575 case BCM47XX_BOARD_LINKSYS_E1000V21: 576 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e1000v21); 577 break; 578 case BCM47XX_BOARD_LINKSYS_E2000V1: 579 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e2000v1); 580 break; 581 case BCM47XX_BOARD_LINKSYS_E3000V1: 582 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3000v1); 583 break; 584 case BCM47XX_BOARD_LINKSYS_E3200V1: 585 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3200v1); 586 break; 587 case BCM47XX_BOARD_LINKSYS_E4200V1: 588 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e4200v1); 589 break; 590 case BCM47XX_BOARD_LINKSYS_WRT150NV1: 591 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt150nv1); 592 break; 593 case BCM47XX_BOARD_LINKSYS_WRT150NV11: 594 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt150nv11); 595 break; 596 case BCM47XX_BOARD_LINKSYS_WRT160NV1: 597 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt160nv1); 598 break; 599 case BCM47XX_BOARD_LINKSYS_WRT160NV3: 600 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt160nv3); 601 break; 602 case BCM47XX_BOARD_LINKSYS_WRT300N_V1: 603 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300n_v1); 604 break; 605 case BCM47XX_BOARD_LINKSYS_WRT300NV11: 606 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300nv11); 607 break; 608 case BCM47XX_BOARD_LINKSYS_WRT310NV1: 609 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1); 610 break; 611 case BCM47XX_BOARD_LINKSYS_WRT54G3GV2: 612 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g3gv2); 613 break; 614 case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0101: 615 case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0467: 616 case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0708: 617 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g_generic); 618 break; 619 case BCM47XX_BOARD_LINKSYS_WRT610NV1: 620 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt610nv1); 621 break; 622 case BCM47XX_BOARD_LINKSYS_WRT610NV2: 623 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt610nv2); 624 break; 625 case BCM47XX_BOARD_LINKSYS_WRTSL54GS: 626 err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrtsl54gs); 627 break; 628 629 case BCM47XX_BOARD_LUXUL_ABR_4400_V1: 630 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_abr_4400_v1); 631 break; 632 case BCM47XX_BOARD_LUXUL_XAP_310_V1: 633 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_310_v1); 634 break; 635 case BCM47XX_BOARD_LUXUL_XAP_1210_V1: 636 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1210_v1); 637 break; 638 case BCM47XX_BOARD_LUXUL_XAP_1230_V1: 639 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1230_v1); 640 break; 641 case BCM47XX_BOARD_LUXUL_XAP_1240_V1: 642 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1240_v1); 643 break; 644 case BCM47XX_BOARD_LUXUL_XAP_1500_V1: 645 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1500_v1); 646 break; 647 case BCM47XX_BOARD_LUXUL_XBR_4400_V1: 648 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xbr_4400_v1); 649 break; 650 case BCM47XX_BOARD_LUXUL_XVW_P30_V1: 651 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xvw_p30_v1); 652 break; 653 case BCM47XX_BOARD_LUXUL_XWR_600_V1: 654 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xwr_600_v1); 655 break; 656 case BCM47XX_BOARD_LUXUL_XWR_1750_V1: 657 err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xwr_1750_v1); 658 break; 659 660 case BCM47XX_BOARD_MICROSOFT_MN700: 661 err = bcm47xx_copy_bdata(bcm47xx_buttons_microsoft_nm700); 662 break; 663 664 case BCM47XX_BOARD_MOTOROLA_WE800G: 665 err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_we800g); 666 break; 667 case BCM47XX_BOARD_MOTOROLA_WR850GP: 668 err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_wr850gp); 669 break; 670 case BCM47XX_BOARD_MOTOROLA_WR850GV2V3: 671 err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_wr850gv2v3); 672 break; 673 674 case BCM47XX_BOARD_NETGEAR_R6200_V1: 675 err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6200_v1); 676 break; 677 case BCM47XX_BOARD_NETGEAR_WNDR3400V1: 678 err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400v1); 679 break; 680 case BCM47XX_BOARD_NETGEAR_WNDR3400_V3: 681 err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400_v3); 682 break; 683 case BCM47XX_BOARD_NETGEAR_WNDR3700V3: 684 err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3700v3); 685 break; 686 case BCM47XX_BOARD_NETGEAR_WNDR4500V1: 687 err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr4500v1); 688 break; 689 case BCM47XX_BOARD_NETGEAR_WNR1000_V3: 690 err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr1000_v3); 691 break; 692 case BCM47XX_BOARD_NETGEAR_WNR3500L: 693 err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv1); 694 break; 695 case BCM47XX_BOARD_NETGEAR_WNR834BV2: 696 err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr834bv2); 697 break; 698 699 case BCM47XX_BOARD_SIMPLETECH_SIMPLESHARE: 700 err = bcm47xx_copy_bdata(bcm47xx_buttons_simpletech_simpleshare); 701 break; 702 703 default: 704 pr_debug("No buttons configuration found for this device\n"); 705 return -ENOTSUPP; 706 } 707 708 if (err) 709 return -ENOMEM; 710 711 err = platform_device_register(&bcm47xx_buttons_gpio_keys); 712 if (err) { 713 pr_err("Failed to register platform device: %d\n", err); 714 return err; 715 } 716 717 return 0; 718} 719