linux/arch/mips/bcm47xx/buttons.c
<<
>>
Prefs
   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