Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include "bcm47xx_private.h"
0003 
0004 #include <linux/input.h>
0005 #include <linux/gpio_keys.h>
0006 #include <linux/interrupt.h>
0007 #include <bcm47xx_board.h>
0008 #include <bcm47xx.h>
0009 
0010 /**************************************************
0011  * Database
0012  **************************************************/
0013 
0014 #define BCM47XX_GPIO_KEY(_gpio, _code)                  \
0015     {                               \
0016         .code       = _code,                \
0017         .gpio       = _gpio,                \
0018         .active_low = 1,                    \
0019     }
0020 
0021 #define BCM47XX_GPIO_KEY_H(_gpio, _code)                \
0022     {                               \
0023         .code       = _code,                \
0024         .gpio       = _gpio,                \
0025     }
0026 
0027 /* Asus */
0028 
0029 static const struct gpio_keys_button
0030 bcm47xx_buttons_asus_rtn10u[] __initconst = {
0031     BCM47XX_GPIO_KEY(20, KEY_WPS_BUTTON),
0032     BCM47XX_GPIO_KEY(21, KEY_RESTART),
0033 };
0034 
0035 static const struct gpio_keys_button
0036 bcm47xx_buttons_asus_rtn12[] __initconst = {
0037     BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
0038     BCM47XX_GPIO_KEY(1, KEY_RESTART),
0039     BCM47XX_GPIO_KEY(4, BTN_0), /* Router mode */
0040     BCM47XX_GPIO_KEY(5, BTN_1), /* Repeater mode */
0041     BCM47XX_GPIO_KEY(6, BTN_2), /* AP mode */
0042 };
0043 
0044 static const struct gpio_keys_button
0045 bcm47xx_buttons_asus_rtn16[] __initconst = {
0046     BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
0047     BCM47XX_GPIO_KEY(8, KEY_RESTART),
0048 };
0049 
0050 static const struct gpio_keys_button
0051 bcm47xx_buttons_asus_rtn66u[] __initconst = {
0052     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0053     BCM47XX_GPIO_KEY(9, KEY_RESTART),
0054 };
0055 
0056 static const struct gpio_keys_button
0057 bcm47xx_buttons_asus_wl300g[] __initconst = {
0058     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0059 };
0060 
0061 static const struct gpio_keys_button
0062 bcm47xx_buttons_asus_wl320ge[] __initconst = {
0063     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0064 };
0065 
0066 static const struct gpio_keys_button
0067 bcm47xx_buttons_asus_wl330ge[] __initconst = {
0068     BCM47XX_GPIO_KEY(2, KEY_RESTART),
0069 };
0070 
0071 static const struct gpio_keys_button
0072 bcm47xx_buttons_asus_wl500g[] __initconst = {
0073     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0074 };
0075 
0076 static const struct gpio_keys_button
0077 bcm47xx_buttons_asus_wl500gd[] __initconst = {
0078     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0079 };
0080 
0081 static const struct gpio_keys_button
0082 bcm47xx_buttons_asus_wl500gpv1[] __initconst = {
0083     BCM47XX_GPIO_KEY(0, KEY_RESTART),
0084     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0085 };
0086 
0087 static const struct gpio_keys_button
0088 bcm47xx_buttons_asus_wl500gpv2[] __initconst = {
0089     BCM47XX_GPIO_KEY(2, KEY_RESTART),
0090     BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON),
0091 };
0092 
0093 static const struct gpio_keys_button
0094 bcm47xx_buttons_asus_wl500w[] __initconst = {
0095     BCM47XX_GPIO_KEY_H(6, KEY_RESTART),
0096     BCM47XX_GPIO_KEY_H(7, KEY_WPS_BUTTON),
0097 };
0098 
0099 static const struct gpio_keys_button
0100 bcm47xx_buttons_asus_wl520gc[] __initconst = {
0101     BCM47XX_GPIO_KEY(2, KEY_RESTART),
0102     BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON),
0103 };
0104 
0105 static const struct gpio_keys_button
0106 bcm47xx_buttons_asus_wl520gu[] __initconst = {
0107     BCM47XX_GPIO_KEY(2, KEY_RESTART),
0108     BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON),
0109 };
0110 
0111 static const struct gpio_keys_button
0112 bcm47xx_buttons_asus_wl700ge[] __initconst = {
0113     BCM47XX_GPIO_KEY(0, KEY_POWER), /* Hard disk power switch */
0114     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), /* EZSetup */
0115     BCM47XX_GPIO_KEY(6, KEY_COPY), /* Copy data from USB to internal disk */
0116     BCM47XX_GPIO_KEY(7, KEY_RESTART), /* Hard reset */
0117 };
0118 
0119 static const struct gpio_keys_button
0120 bcm47xx_buttons_asus_wlhdd[] __initconst = {
0121     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0122 };
0123 
0124 /* Huawei */
0125 
0126 static const struct gpio_keys_button
0127 bcm47xx_buttons_huawei_e970[] __initconst = {
0128     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0129 };
0130 
0131 /* Belkin */
0132 
0133 static const struct gpio_keys_button
0134 bcm47xx_buttons_belkin_f7d4301[] __initconst = {
0135     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0136     BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON),
0137 };
0138 
0139 /* Buffalo */
0140 
0141 static const struct gpio_keys_button
0142 bcm47xx_buttons_buffalo_whr2_a54g54[] __initconst = {
0143     BCM47XX_GPIO_KEY(4, KEY_RESTART),
0144 };
0145 
0146 static const struct gpio_keys_button
0147 bcm47xx_buttons_buffalo_whr_g125[] __initconst = {
0148     BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
0149     BCM47XX_GPIO_KEY(4, KEY_RESTART),
0150     BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode swtich */
0151 };
0152 
0153 static const struct gpio_keys_button
0154 bcm47xx_buttons_buffalo_whr_g54s[] __initconst = {
0155     BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
0156     BCM47XX_GPIO_KEY_H(4, KEY_RESTART),
0157     BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode swtich */
0158 };
0159 
0160 static const struct gpio_keys_button
0161 bcm47xx_buttons_buffalo_whr_hp_g54[] __initconst = {
0162     BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
0163     BCM47XX_GPIO_KEY(4, KEY_RESTART),
0164     BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode swtich */
0165 };
0166 
0167 static const struct gpio_keys_button
0168 bcm47xx_buttons_buffalo_wzr_g300n[] __initconst = {
0169     BCM47XX_GPIO_KEY(4, KEY_RESTART),
0170 };
0171 
0172 static const struct gpio_keys_button
0173 bcm47xx_buttons_buffalo_wzr_rs_g54[] __initconst = {
0174     BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
0175     BCM47XX_GPIO_KEY(4, KEY_RESTART),
0176 };
0177 
0178 static const struct gpio_keys_button
0179 bcm47xx_buttons_buffalo_wzr_rs_g54hp[] __initconst = {
0180     BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
0181     BCM47XX_GPIO_KEY(4, KEY_RESTART),
0182 };
0183 
0184 /* Dell */
0185 
0186 static const struct gpio_keys_button
0187 bcm47xx_buttons_dell_tm2300[] __initconst = {
0188     BCM47XX_GPIO_KEY(0, KEY_RESTART),
0189 };
0190 
0191 /* D-Link */
0192 
0193 static const struct gpio_keys_button
0194 bcm47xx_buttons_dlink_dir130[] __initconst = {
0195     BCM47XX_GPIO_KEY(3, KEY_RESTART),
0196     BCM47XX_GPIO_KEY(7, KEY_UNKNOWN),
0197 };
0198 
0199 static const struct gpio_keys_button
0200 bcm47xx_buttons_dlink_dir330[] __initconst = {
0201     BCM47XX_GPIO_KEY(3, KEY_RESTART),
0202     BCM47XX_GPIO_KEY(7, KEY_UNKNOWN),
0203 };
0204 
0205 /* Linksys */
0206 
0207 static const struct gpio_keys_button
0208 bcm47xx_buttons_linksys_e1000v1[] __initconst = {
0209     BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON),
0210     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0211 };
0212 
0213 static const struct gpio_keys_button
0214 bcm47xx_buttons_linksys_e1000v21[] __initconst = {
0215     BCM47XX_GPIO_KEY(9, KEY_WPS_BUTTON),
0216     BCM47XX_GPIO_KEY(10, KEY_RESTART),
0217 };
0218 
0219 static const struct gpio_keys_button
0220 bcm47xx_buttons_linksys_e2000v1[] __initconst = {
0221     BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON),
0222     BCM47XX_GPIO_KEY(8, KEY_RESTART),
0223 };
0224 
0225 static const struct gpio_keys_button
0226 bcm47xx_buttons_linksys_e3000v1[] __initconst = {
0227     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0228     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0229 };
0230 
0231 static const struct gpio_keys_button
0232 bcm47xx_buttons_linksys_e3200v1[] __initconst = {
0233     BCM47XX_GPIO_KEY(5, KEY_RESTART),
0234     BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON),
0235 };
0236 
0237 static const struct gpio_keys_button
0238 bcm47xx_buttons_linksys_e4200v1[] __initconst = {
0239     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0240     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0241 };
0242 
0243 static const struct gpio_keys_button
0244 bcm47xx_buttons_linksys_wrt150nv1[] __initconst = {
0245     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0246     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0247 };
0248 
0249 static const struct gpio_keys_button
0250 bcm47xx_buttons_linksys_wrt150nv11[] __initconst = {
0251     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0252     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0253 };
0254 
0255 static const struct gpio_keys_button
0256 bcm47xx_buttons_linksys_wrt160nv1[] __initconst = {
0257     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0258     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0259 };
0260 
0261 static const struct gpio_keys_button
0262 bcm47xx_buttons_linksys_wrt160nv3[] __initconst = {
0263     BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON),
0264     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0265 };
0266 
0267 static const struct gpio_keys_button
0268 bcm47xx_buttons_linksys_wrt300n_v1[] __initconst = {
0269     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0270     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0271 };
0272 
0273 static const struct gpio_keys_button
0274 bcm47xx_buttons_linksys_wrt300nv11[] __initconst = {
0275     BCM47XX_GPIO_KEY(4, KEY_UNKNOWN),
0276     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0277 };
0278 
0279 static const struct gpio_keys_button
0280 bcm47xx_buttons_linksys_wrt310nv1[] __initconst = {
0281     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0282     BCM47XX_GPIO_KEY(8, KEY_UNKNOWN),
0283 };
0284 
0285 static const struct gpio_keys_button
0286 bcm47xx_buttons_linksys_wrt310n_v2[] __initconst = {
0287     BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON),
0288     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0289 };
0290 
0291 static const struct gpio_keys_button
0292 bcm47xx_buttons_linksys_wrt320n_v1[] __initconst = {
0293     BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON),
0294     BCM47XX_GPIO_KEY(8, KEY_RESTART),
0295 };
0296 
0297 static const struct gpio_keys_button
0298 bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = {
0299     BCM47XX_GPIO_KEY(5, KEY_WIMAX),
0300     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0301 };
0302 
0303 static const struct gpio_keys_button
0304 bcm47xx_buttons_linksys_wrt54g_generic[] __initconst = {
0305     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0306     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0307 };
0308 
0309 static const struct gpio_keys_button
0310 bcm47xx_buttons_linksys_wrt610nv1[] __initconst = {
0311     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0312     BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON),
0313 };
0314 
0315 static const struct gpio_keys_button
0316 bcm47xx_buttons_linksys_wrt610nv2[] __initconst = {
0317     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0318     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0319 };
0320 
0321 static const struct gpio_keys_button
0322 bcm47xx_buttons_linksys_wrtsl54gs[] __initconst = {
0323     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0324     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0325 };
0326 
0327 /* Luxul */
0328 
0329 static const struct gpio_keys_button
0330 bcm47xx_buttons_luxul_abr_4400_v1[] = {
0331     BCM47XX_GPIO_KEY(14, KEY_RESTART),
0332 };
0333 
0334 static const struct gpio_keys_button
0335 bcm47xx_buttons_luxul_xap_310_v1[] = {
0336     BCM47XX_GPIO_KEY(20, KEY_RESTART),
0337 };
0338 
0339 static const struct gpio_keys_button
0340 bcm47xx_buttons_luxul_xap_1210_v1[] = {
0341     BCM47XX_GPIO_KEY(8, KEY_RESTART),
0342 };
0343 
0344 static const struct gpio_keys_button
0345 bcm47xx_buttons_luxul_xap_1230_v1[] = {
0346     BCM47XX_GPIO_KEY(8, KEY_RESTART),
0347 };
0348 
0349 static const struct gpio_keys_button
0350 bcm47xx_buttons_luxul_xap_1240_v1[] = {
0351     BCM47XX_GPIO_KEY(8, KEY_RESTART),
0352 };
0353 
0354 static const struct gpio_keys_button
0355 bcm47xx_buttons_luxul_xap_1500_v1[] = {
0356     BCM47XX_GPIO_KEY(14, KEY_RESTART),
0357 };
0358 
0359 static const struct gpio_keys_button
0360 bcm47xx_buttons_luxul_xbr_4400_v1[] = {
0361     BCM47XX_GPIO_KEY(14, KEY_RESTART),
0362 };
0363 
0364 static const struct gpio_keys_button
0365 bcm47xx_buttons_luxul_xvw_p30_v1[] = {
0366     BCM47XX_GPIO_KEY(20, KEY_RESTART),
0367 };
0368 
0369 static const struct gpio_keys_button
0370 bcm47xx_buttons_luxul_xwr_600_v1[] = {
0371     BCM47XX_GPIO_KEY(8, KEY_RESTART),
0372 };
0373 
0374 static const struct gpio_keys_button
0375 bcm47xx_buttons_luxul_xwr_1750_v1[] = {
0376     BCM47XX_GPIO_KEY(14, KEY_RESTART),
0377 };
0378 
0379 /* Microsoft */
0380 
0381 static const struct gpio_keys_button
0382 bcm47xx_buttons_microsoft_nm700[] __initconst = {
0383     BCM47XX_GPIO_KEY(7, KEY_RESTART),
0384 };
0385 
0386 /* Motorola */
0387 
0388 static const struct gpio_keys_button
0389 bcm47xx_buttons_motorola_we800g[] __initconst = {
0390     BCM47XX_GPIO_KEY(0, KEY_RESTART),
0391 };
0392 
0393 static const struct gpio_keys_button
0394 bcm47xx_buttons_motorola_wr850gp[] __initconst = {
0395     BCM47XX_GPIO_KEY(5, KEY_RESTART),
0396 };
0397 
0398 static const struct gpio_keys_button
0399 bcm47xx_buttons_motorola_wr850gv2v3[] __initconst = {
0400     BCM47XX_GPIO_KEY(5, KEY_RESTART),
0401 };
0402 
0403 /* Netgear */
0404 
0405 static const struct gpio_keys_button
0406 bcm47xx_buttons_netgear_r6200_v1[] __initconst = {
0407     BCM47XX_GPIO_KEY(2, KEY_RFKILL),
0408     BCM47XX_GPIO_KEY(3, KEY_RESTART),
0409     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0410 };
0411 
0412 static const struct gpio_keys_button
0413 bcm47xx_buttons_netgear_r6300_v1[] __initconst = {
0414     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0415 };
0416 
0417 static const struct gpio_keys_button
0418 bcm47xx_buttons_netgear_wn2500rp_v1[] __initconst = {
0419     BCM47XX_GPIO_KEY(12, KEY_RESTART),
0420     BCM47XX_GPIO_KEY(31, KEY_WPS_BUTTON),
0421 };
0422 
0423 static const struct gpio_keys_button
0424 bcm47xx_buttons_netgear_wndr3400v1[] __initconst = {
0425     BCM47XX_GPIO_KEY(4, KEY_RESTART),
0426     BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
0427     BCM47XX_GPIO_KEY(8, KEY_RFKILL),
0428 };
0429 
0430 static const struct gpio_keys_button
0431 bcm47xx_buttons_netgear_wndr3400_v3[] __initconst = {
0432     BCM47XX_GPIO_KEY(12, KEY_RESTART),
0433     BCM47XX_GPIO_KEY(23, KEY_WPS_BUTTON),
0434 };
0435 
0436 static const struct gpio_keys_button
0437 bcm47xx_buttons_netgear_wndr3700v3[] __initconst = {
0438     BCM47XX_GPIO_KEY(2, KEY_RFKILL),
0439     BCM47XX_GPIO_KEY(3, KEY_RESTART),
0440     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0441 };
0442 
0443 static const struct gpio_keys_button
0444 bcm47xx_buttons_netgear_wndr4500v1[] __initconst = {
0445     BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
0446     BCM47XX_GPIO_KEY(5, KEY_RFKILL),
0447     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0448 };
0449 
0450 static const struct gpio_keys_button
0451 bcm47xx_buttons_netgear_wnr1000_v3[] __initconst = {
0452     BCM47XX_GPIO_KEY(2, KEY_WPS_BUTTON),
0453     BCM47XX_GPIO_KEY(3, KEY_RESTART),
0454 };
0455 
0456 static const struct gpio_keys_button
0457 bcm47xx_buttons_netgear_wnr3500lv1[] __initconst = {
0458     BCM47XX_GPIO_KEY(4, KEY_RESTART),
0459     BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
0460 };
0461 
0462 static const struct gpio_keys_button
0463 bcm47xx_buttons_netgear_wnr3500lv2[] __initconst = {
0464     BCM47XX_GPIO_KEY(4, KEY_RESTART),
0465     BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
0466     BCM47XX_GPIO_KEY(8, KEY_RFKILL),
0467 };
0468 
0469 static const struct gpio_keys_button
0470 bcm47xx_buttons_netgear_wnr834bv2[] __initconst = {
0471     BCM47XX_GPIO_KEY(6, KEY_RESTART),
0472 };
0473 
0474 /* SimpleTech */
0475 
0476 static const struct gpio_keys_button
0477 bcm47xx_buttons_simpletech_simpleshare[] __initconst = {
0478     BCM47XX_GPIO_KEY(0, KEY_RESTART),
0479 };
0480 
0481 /**************************************************
0482  * Init
0483  **************************************************/
0484 
0485 static struct gpio_keys_platform_data bcm47xx_button_pdata;
0486 
0487 static struct platform_device bcm47xx_buttons_gpio_keys = {
0488     .name = "gpio-keys",
0489     .dev = {
0490         .platform_data = &bcm47xx_button_pdata,
0491     }
0492 };
0493 
0494 /* Copy data from __initconst */
0495 static int __init bcm47xx_buttons_copy(const struct gpio_keys_button *buttons,
0496                        size_t nbuttons)
0497 {
0498     size_t size = nbuttons * sizeof(*buttons);
0499 
0500     bcm47xx_button_pdata.buttons = kmemdup(buttons, size, GFP_KERNEL);
0501     if (!bcm47xx_button_pdata.buttons)
0502         return -ENOMEM;
0503     bcm47xx_button_pdata.nbuttons = nbuttons;
0504 
0505     return 0;
0506 }
0507 
0508 #define bcm47xx_copy_bdata(dev_buttons)                 \
0509     bcm47xx_buttons_copy(dev_buttons, ARRAY_SIZE(dev_buttons));
0510 
0511 int __init bcm47xx_buttons_register(void)
0512 {
0513     enum bcm47xx_board board = bcm47xx_board_get();
0514     int err;
0515 
0516     switch (board) {
0517     case BCM47XX_BOARD_ASUS_RTN10U:
0518         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn10u);
0519         break;
0520     case BCM47XX_BOARD_ASUS_RTN12:
0521         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn12);
0522         break;
0523     case BCM47XX_BOARD_ASUS_RTN16:
0524         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn16);
0525         break;
0526     case BCM47XX_BOARD_ASUS_RTN66U:
0527         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn66u);
0528         break;
0529     case BCM47XX_BOARD_ASUS_WL300G:
0530         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl300g);
0531         break;
0532     case BCM47XX_BOARD_ASUS_WL320GE:
0533         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl320ge);
0534         break;
0535     case BCM47XX_BOARD_ASUS_WL330GE:
0536         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl330ge);
0537         break;
0538     case BCM47XX_BOARD_ASUS_WL500G:
0539         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500g);
0540         break;
0541     case BCM47XX_BOARD_ASUS_WL500GD:
0542         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gd);
0543         break;
0544     case BCM47XX_BOARD_ASUS_WL500GPV1:
0545         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gpv1);
0546         break;
0547     case BCM47XX_BOARD_ASUS_WL500GPV2:
0548         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gpv2);
0549         break;
0550     case BCM47XX_BOARD_ASUS_WL500W:
0551         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500w);
0552         break;
0553     case BCM47XX_BOARD_ASUS_WL520GC:
0554         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl520gc);
0555         break;
0556     case BCM47XX_BOARD_ASUS_WL520GU:
0557         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl520gu);
0558         break;
0559     case BCM47XX_BOARD_ASUS_WL700GE:
0560         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl700ge);
0561         break;
0562     case BCM47XX_BOARD_ASUS_WLHDD:
0563         err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wlhdd);
0564         break;
0565 
0566     case BCM47XX_BOARD_BELKIN_F7D3301:
0567     case BCM47XX_BOARD_BELKIN_F7D3302:
0568     case BCM47XX_BOARD_BELKIN_F7D4301:
0569     case BCM47XX_BOARD_BELKIN_F7D4302:
0570     case BCM47XX_BOARD_BELKIN_F7D4401:
0571         err = bcm47xx_copy_bdata(bcm47xx_buttons_belkin_f7d4301);
0572         break;
0573 
0574     case BCM47XX_BOARD_BUFFALO_WHR2_A54G54:
0575         err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr2_a54g54);
0576         break;
0577     case BCM47XX_BOARD_BUFFALO_WHR_G125:
0578         err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_g125);
0579         break;
0580     case BCM47XX_BOARD_BUFFALO_WHR_G54S:
0581         err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_g54s);
0582         break;
0583     case BCM47XX_BOARD_BUFFALO_WHR_HP_G54:
0584         err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_hp_g54);
0585         break;
0586     case BCM47XX_BOARD_BUFFALO_WZR_G300N:
0587         err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_g300n);
0588         break;
0589     case BCM47XX_BOARD_BUFFALO_WZR_RS_G54:
0590         err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54);
0591         break;
0592     case BCM47XX_BOARD_BUFFALO_WZR_RS_G54HP:
0593         err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54hp);
0594         break;
0595 
0596     case BCM47XX_BOARD_DELL_TM2300:
0597         err = bcm47xx_copy_bdata(bcm47xx_buttons_dell_tm2300);
0598         break;
0599 
0600     case BCM47XX_BOARD_DLINK_DIR130:
0601         err = bcm47xx_copy_bdata(bcm47xx_buttons_dlink_dir130);
0602         break;
0603     case BCM47XX_BOARD_DLINK_DIR330:
0604         err = bcm47xx_copy_bdata(bcm47xx_buttons_dlink_dir330);
0605         break;
0606 
0607     case BCM47XX_BOARD_HUAWEI_E970:
0608         err = bcm47xx_copy_bdata(bcm47xx_buttons_huawei_e970);
0609         break;
0610 
0611     case BCM47XX_BOARD_LINKSYS_E1000V1:
0612         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e1000v1);
0613         break;
0614     case BCM47XX_BOARD_LINKSYS_E1000V21:
0615         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e1000v21);
0616         break;
0617     case BCM47XX_BOARD_LINKSYS_E2000V1:
0618         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e2000v1);
0619         break;
0620     case BCM47XX_BOARD_LINKSYS_E3000V1:
0621         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3000v1);
0622         break;
0623     case BCM47XX_BOARD_LINKSYS_E3200V1:
0624         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3200v1);
0625         break;
0626     case BCM47XX_BOARD_LINKSYS_E4200V1:
0627         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e4200v1);
0628         break;
0629     case BCM47XX_BOARD_LINKSYS_WRT150NV1:
0630         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt150nv1);
0631         break;
0632     case BCM47XX_BOARD_LINKSYS_WRT150NV11:
0633         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt150nv11);
0634         break;
0635     case BCM47XX_BOARD_LINKSYS_WRT160NV1:
0636         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt160nv1);
0637         break;
0638     case BCM47XX_BOARD_LINKSYS_WRT160NV3:
0639         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt160nv3);
0640         break;
0641     case BCM47XX_BOARD_LINKSYS_WRT300N_V1:
0642         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300n_v1);
0643         break;
0644     case BCM47XX_BOARD_LINKSYS_WRT300NV11:
0645         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300nv11);
0646         break;
0647     case BCM47XX_BOARD_LINKSYS_WRT310NV1:
0648         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1);
0649         break;
0650     case BCM47XX_BOARD_LINKSYS_WRT310NV2:
0651         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310n_v2);
0652         break;
0653     case BCM47XX_BOARD_LINKSYS_WRT320N_V1:
0654         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt320n_v1);
0655         break;
0656     case BCM47XX_BOARD_LINKSYS_WRT54G3GV2:
0657         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g3gv2);
0658         break;
0659     case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0101:
0660     case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0467:
0661     case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0708:
0662         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g_generic);
0663         break;
0664     case BCM47XX_BOARD_LINKSYS_WRT610NV1:
0665         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt610nv1);
0666         break;
0667     case BCM47XX_BOARD_LINKSYS_WRT610NV2:
0668         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt610nv2);
0669         break;
0670     case BCM47XX_BOARD_LINKSYS_WRTSL54GS:
0671         err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrtsl54gs);
0672         break;
0673 
0674     case BCM47XX_BOARD_LUXUL_ABR_4400_V1:
0675         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_abr_4400_v1);
0676         break;
0677     case BCM47XX_BOARD_LUXUL_XAP_310_V1:
0678         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_310_v1);
0679         break;
0680     case BCM47XX_BOARD_LUXUL_XAP_1210_V1:
0681         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1210_v1);
0682         break;
0683     case BCM47XX_BOARD_LUXUL_XAP_1230_V1:
0684         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1230_v1);
0685         break;
0686     case BCM47XX_BOARD_LUXUL_XAP_1240_V1:
0687         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1240_v1);
0688         break;
0689     case BCM47XX_BOARD_LUXUL_XAP_1500_V1:
0690         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1500_v1);
0691         break;
0692     case BCM47XX_BOARD_LUXUL_XBR_4400_V1:
0693         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xbr_4400_v1);
0694         break;
0695     case BCM47XX_BOARD_LUXUL_XVW_P30_V1:
0696         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xvw_p30_v1);
0697         break;
0698     case BCM47XX_BOARD_LUXUL_XWR_600_V1:
0699         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xwr_600_v1);
0700         break;
0701     case BCM47XX_BOARD_LUXUL_XWR_1750_V1:
0702         err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xwr_1750_v1);
0703         break;
0704 
0705     case BCM47XX_BOARD_MICROSOFT_MN700:
0706         err = bcm47xx_copy_bdata(bcm47xx_buttons_microsoft_nm700);
0707         break;
0708 
0709     case BCM47XX_BOARD_MOTOROLA_WE800G:
0710         err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_we800g);
0711         break;
0712     case BCM47XX_BOARD_MOTOROLA_WR850GP:
0713         err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_wr850gp);
0714         break;
0715     case BCM47XX_BOARD_MOTOROLA_WR850GV2V3:
0716         err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_wr850gv2v3);
0717         break;
0718 
0719     case BCM47XX_BOARD_NETGEAR_R6200_V1:
0720         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6200_v1);
0721         break;
0722     case BCM47XX_BOARD_NETGEAR_R6300_V1:
0723         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6300_v1);
0724         break;
0725     case BCM47XX_BOARD_NETGEAR_WN2500RP_V1:
0726         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wn2500rp_v1);
0727         break;
0728     case BCM47XX_BOARD_NETGEAR_WNDR3400V1:
0729         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400v1);
0730         break;
0731     case BCM47XX_BOARD_NETGEAR_WNDR3400_V3:
0732         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400_v3);
0733         break;
0734     case BCM47XX_BOARD_NETGEAR_WNDR3700V3:
0735         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3700v3);
0736         break;
0737     case BCM47XX_BOARD_NETGEAR_WNDR4500V1:
0738         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr4500v1);
0739         break;
0740     case BCM47XX_BOARD_NETGEAR_WNR1000_V3:
0741         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr1000_v3);
0742         break;
0743     case BCM47XX_BOARD_NETGEAR_WNR3500L:
0744         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv1);
0745         break;
0746     case BCM47XX_BOARD_NETGEAR_WNR3500L_V2:
0747         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv2);
0748         break;
0749     case BCM47XX_BOARD_NETGEAR_WNR834BV2:
0750         err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr834bv2);
0751         break;
0752 
0753     case BCM47XX_BOARD_SIMPLETECH_SIMPLESHARE:
0754         err = bcm47xx_copy_bdata(bcm47xx_buttons_simpletech_simpleshare);
0755         break;
0756 
0757     default:
0758         pr_debug("No buttons configuration found for this device\n");
0759         return -ENOTSUPP;
0760     }
0761 
0762     if (err)
0763         return -ENOMEM;
0764 
0765     err = platform_device_register(&bcm47xx_buttons_gpio_keys);
0766     if (err) {
0767         pr_err("Failed to register platform device: %d\n", err);
0768         return err;
0769     }
0770 
0771     return 0;
0772 }