1ef1e3e7aSRafał Miłecki #include "bcm47xx_private.h" 2ef1e3e7aSRafał Miłecki 3ef1e3e7aSRafał Miłecki #include <linux/input.h> 4ef1e3e7aSRafał Miłecki #include <linux/gpio_keys.h> 5ef1e3e7aSRafał Miłecki #include <linux/interrupt.h> 6ef1e3e7aSRafał Miłecki #include <bcm47xx_board.h> 7ef1e3e7aSRafał Miłecki #include <bcm47xx.h> 8ef1e3e7aSRafał Miłecki 9ef1e3e7aSRafał Miłecki /************************************************** 10ef1e3e7aSRafał Miłecki * Database 11ef1e3e7aSRafał Miłecki **************************************************/ 12ef1e3e7aSRafał Miłecki 133be97255SRafał Miłecki #define BCM47XX_GPIO_KEY(_gpio, _code) \ 143be97255SRafał Miłecki { \ 153be97255SRafał Miłecki .code = _code, \ 163be97255SRafał Miłecki .gpio = _gpio, \ 173be97255SRafał Miłecki .active_low = 1, \ 183be97255SRafał Miłecki } 193be97255SRafał Miłecki 203be97255SRafał Miłecki /* Asus */ 213be97255SRafał Miłecki 223be97255SRafał Miłecki static const struct gpio_keys_button 233be97255SRafał Miłecki bcm47xx_buttons_asus_rtn12[] __initconst = { 243be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 253be97255SRafał Miłecki BCM47XX_GPIO_KEY(1, KEY_RESTART), 263be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, BTN_0), /* Router mode */ 273be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, BTN_1), /* Repeater mode */ 283be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, BTN_2), /* AP mode */ 293be97255SRafał Miłecki }; 303be97255SRafał Miłecki 313be97255SRafał Miłecki static const struct gpio_keys_button 323be97255SRafał Miłecki bcm47xx_buttons_asus_rtn16[] __initconst = { 333be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), 343be97255SRafał Miłecki BCM47XX_GPIO_KEY(8, KEY_RESTART), 353be97255SRafał Miłecki }; 363be97255SRafał Miłecki 373be97255SRafał Miłecki static const struct gpio_keys_button 383be97255SRafał Miłecki bcm47xx_buttons_asus_rtn66u[] __initconst = { 393be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 403be97255SRafał Miłecki BCM47XX_GPIO_KEY(9, KEY_RESTART), 413be97255SRafał Miłecki }; 423be97255SRafał Miłecki 433be97255SRafał Miłecki static const struct gpio_keys_button 443be97255SRafał Miłecki bcm47xx_buttons_asus_wl300g[] __initconst = { 453be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 463be97255SRafał Miłecki }; 473be97255SRafał Miłecki 483be97255SRafał Miłecki static const struct gpio_keys_button 493be97255SRafał Miłecki bcm47xx_buttons_asus_wl320ge[] __initconst = { 503be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 513be97255SRafał Miłecki }; 523be97255SRafał Miłecki 533be97255SRafał Miłecki static const struct gpio_keys_button 543be97255SRafał Miłecki bcm47xx_buttons_asus_wl330ge[] __initconst = { 553be97255SRafał Miłecki BCM47XX_GPIO_KEY(2, KEY_RESTART), 563be97255SRafał Miłecki }; 573be97255SRafał Miłecki 583be97255SRafał Miłecki static const struct gpio_keys_button 59250dc037SHauke Mehrtens bcm47xx_buttons_asus_wl500g[] __initconst = { 60250dc037SHauke Mehrtens BCM47XX_GPIO_KEY(6, KEY_RESTART), 61250dc037SHauke Mehrtens }; 62250dc037SHauke Mehrtens 63250dc037SHauke Mehrtens static const struct gpio_keys_button 643be97255SRafał Miłecki bcm47xx_buttons_asus_wl500gd[] __initconst = { 653be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 663be97255SRafał Miłecki }; 673be97255SRafał Miłecki 683be97255SRafał Miłecki static const struct gpio_keys_button 693be97255SRafał Miłecki bcm47xx_buttons_asus_wl500gpv1[] __initconst = { 703be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_RESTART), 713be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 723be97255SRafał Miłecki }; 733be97255SRafał Miłecki 743be97255SRafał Miłecki static const struct gpio_keys_button 753be97255SRafał Miłecki bcm47xx_buttons_asus_wl500gpv2[] __initconst = { 763be97255SRafał Miłecki BCM47XX_GPIO_KEY(2, KEY_RESTART), 773be97255SRafał Miłecki BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON), 783be97255SRafał Miłecki }; 793be97255SRafał Miłecki 803be97255SRafał Miłecki static const struct gpio_keys_button 813be97255SRafał Miłecki bcm47xx_buttons_asus_wl500w[] __initconst = { 823be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 833be97255SRafał Miłecki BCM47XX_GPIO_KEY(7, KEY_WPS_BUTTON), 843be97255SRafał Miłecki }; 853be97255SRafał Miłecki 863be97255SRafał Miłecki static const struct gpio_keys_button 873be97255SRafał Miłecki bcm47xx_buttons_asus_wl520gc[] __initconst = { 883be97255SRafał Miłecki BCM47XX_GPIO_KEY(2, KEY_RESTART), 893be97255SRafał Miłecki BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON), 903be97255SRafał Miłecki }; 913be97255SRafał Miłecki 923be97255SRafał Miłecki static const struct gpio_keys_button 933be97255SRafał Miłecki bcm47xx_buttons_asus_wl520gu[] __initconst = { 943be97255SRafał Miłecki BCM47XX_GPIO_KEY(2, KEY_RESTART), 953be97255SRafał Miłecki BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON), 963be97255SRafał Miłecki }; 973be97255SRafał Miłecki 983be97255SRafał Miłecki static const struct gpio_keys_button 993be97255SRafał Miłecki bcm47xx_buttons_asus_wl700ge[] __initconst = { 1003be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_POWER), /* Hard disk power switch */ 1013be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), /* EZSetup */ 1023be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_COPY), /* Copy data from USB to internal disk */ 1033be97255SRafał Miłecki BCM47XX_GPIO_KEY(7, KEY_RESTART), /* Hard reset */ 1043be97255SRafał Miłecki }; 1053be97255SRafał Miłecki 1063be97255SRafał Miłecki static const struct gpio_keys_button 1073be97255SRafał Miłecki bcm47xx_buttons_asus_wlhdd[] __initconst = { 1083be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 1093be97255SRafał Miłecki }; 1103be97255SRafał Miłecki 1113be97255SRafał Miłecki /* Huawei */ 1123be97255SRafał Miłecki 1133be97255SRafał Miłecki static const struct gpio_keys_button 1143be97255SRafał Miłecki bcm47xx_buttons_huawei_e970[] __initconst = { 1153be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 1163be97255SRafał Miłecki }; 1173be97255SRafał Miłecki 1183be97255SRafał Miłecki /* Belkin */ 1193be97255SRafał Miłecki 1203be97255SRafał Miłecki static const struct gpio_keys_button 1213be97255SRafał Miłecki bcm47xx_buttons_belkin_f7d4301[] __initconst = { 1223be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 1233be97255SRafał Miłecki BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON), 1243be97255SRafał Miłecki }; 1253be97255SRafał Miłecki 1263be97255SRafał Miłecki /* Buffalo */ 1273be97255SRafał Miłecki 1283be97255SRafał Miłecki static const struct gpio_keys_button 1293be97255SRafał Miłecki bcm47xx_buttons_buffalo_whr2_a54g54[] __initconst = { 1303be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_RESTART), 1313be97255SRafał Miłecki }; 1323be97255SRafał Miłecki 1333be97255SRafał Miłecki static const struct gpio_keys_button 1343be97255SRafał Miłecki bcm47xx_buttons_buffalo_whr_g125[] __initconst = { 1353be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 1363be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_RESTART), 1373be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode swtich */ 1383be97255SRafał Miłecki }; 1393be97255SRafał Miłecki 1403be97255SRafał Miłecki static const struct gpio_keys_button 1413be97255SRafał Miłecki bcm47xx_buttons_buffalo_whr_g54s[] __initconst = { 1423be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 1433be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_RESTART), 1443be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode swtich */ 1453be97255SRafał Miłecki }; 1463be97255SRafał Miłecki 1473be97255SRafał Miłecki static const struct gpio_keys_button 1483be97255SRafał Miłecki bcm47xx_buttons_buffalo_whr_hp_g54[] __initconst = { 1493be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 1503be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_RESTART), 1513be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode swtich */ 1523be97255SRafał Miłecki }; 1533be97255SRafał Miłecki 1543be97255SRafał Miłecki static const struct gpio_keys_button 1553be97255SRafał Miłecki bcm47xx_buttons_buffalo_wzr_g300n[] __initconst = { 1563be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_RESTART), 1573be97255SRafał Miłecki }; 1583be97255SRafał Miłecki 1593be97255SRafał Miłecki static const struct gpio_keys_button 1603be97255SRafał Miłecki bcm47xx_buttons_buffalo_wzr_rs_g54[] __initconst = { 1613be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 1623be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_RESTART), 1633be97255SRafał Miłecki }; 1643be97255SRafał Miłecki 1653be97255SRafał Miłecki static const struct gpio_keys_button 1663be97255SRafał Miłecki bcm47xx_buttons_buffalo_wzr_rs_g54hp[] __initconst = { 1673be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), 1683be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_RESTART), 1693be97255SRafał Miłecki }; 1703be97255SRafał Miłecki 1713be97255SRafał Miłecki /* Dell */ 1723be97255SRafał Miłecki 1733be97255SRafał Miłecki static const struct gpio_keys_button 1743be97255SRafał Miłecki bcm47xx_buttons_dell_tm2300[] __initconst = { 1753be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_RESTART), 1763be97255SRafał Miłecki }; 1773be97255SRafał Miłecki 1783be97255SRafał Miłecki /* D-Link */ 1793be97255SRafał Miłecki 1803be97255SRafał Miłecki static const struct gpio_keys_button 1813be97255SRafał Miłecki bcm47xx_buttons_dlink_dir130[] __initconst = { 1823be97255SRafał Miłecki BCM47XX_GPIO_KEY(3, KEY_RESTART), 1833be97255SRafał Miłecki BCM47XX_GPIO_KEY(7, KEY_UNKNOWN), 1843be97255SRafał Miłecki }; 1853be97255SRafał Miłecki 1863be97255SRafał Miłecki static const struct gpio_keys_button 1873be97255SRafał Miłecki bcm47xx_buttons_dlink_dir330[] __initconst = { 1883be97255SRafał Miłecki BCM47XX_GPIO_KEY(3, KEY_RESTART), 1893be97255SRafał Miłecki BCM47XX_GPIO_KEY(7, KEY_UNKNOWN), 1903be97255SRafał Miłecki }; 1913be97255SRafał Miłecki 1923be97255SRafał Miłecki /* Linksys */ 1933be97255SRafał Miłecki 1943be97255SRafał Miłecki static const struct gpio_keys_button 1953be97255SRafał Miłecki bcm47xx_buttons_linksys_e1000v1[] __initconst = { 1963be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), 1973be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 1983be97255SRafał Miłecki }; 1993be97255SRafał Miłecki 2003be97255SRafał Miłecki static const struct gpio_keys_button 2013be97255SRafał Miłecki bcm47xx_buttons_linksys_e1000v21[] __initconst = { 2023be97255SRafał Miłecki BCM47XX_GPIO_KEY(9, KEY_WPS_BUTTON), 2033be97255SRafał Miłecki BCM47XX_GPIO_KEY(10, KEY_RESTART), 2043be97255SRafał Miłecki }; 2053be97255SRafał Miłecki 2063be97255SRafał Miłecki static const struct gpio_keys_button 2073be97255SRafał Miłecki bcm47xx_buttons_linksys_e2000v1[] __initconst = { 2083be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), 2093be97255SRafał Miłecki BCM47XX_GPIO_KEY(8, KEY_RESTART), 2103be97255SRafał Miłecki }; 2113be97255SRafał Miłecki 2123be97255SRafał Miłecki static const struct gpio_keys_button 2133be97255SRafał Miłecki bcm47xx_buttons_linksys_e3000v1[] __initconst = { 2143be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 2153be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2163be97255SRafał Miłecki }; 2173be97255SRafał Miłecki 2183be97255SRafał Miłecki static const struct gpio_keys_button 2193be97255SRafał Miłecki bcm47xx_buttons_linksys_e3200v1[] __initconst = { 2203be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, KEY_RESTART), 2213be97255SRafał Miłecki BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON), 2223be97255SRafał Miłecki }; 2233be97255SRafał Miłecki 2243be97255SRafał Miłecki static const struct gpio_keys_button 2253be97255SRafał Miłecki bcm47xx_buttons_linksys_e4200v1[] __initconst = { 2263be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 2273be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2283be97255SRafał Miłecki }; 2293be97255SRafał Miłecki 2303be97255SRafał Miłecki static const struct gpio_keys_button 2313be97255SRafał Miłecki bcm47xx_buttons_linksys_wrt150nv1[] __initconst = { 2323be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 2333be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2343be97255SRafał Miłecki }; 2353be97255SRafał Miłecki 2363be97255SRafał Miłecki static const struct gpio_keys_button 2373be97255SRafał Miłecki bcm47xx_buttons_linksys_wrt150nv11[] __initconst = { 2383be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 2393be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2403be97255SRafał Miłecki }; 2413be97255SRafał Miłecki 2423be97255SRafał Miłecki static const struct gpio_keys_button 2433be97255SRafał Miłecki bcm47xx_buttons_linksys_wrt160nv1[] __initconst = { 2443be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 2453be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2463be97255SRafał Miłecki }; 2473be97255SRafał Miłecki 2483be97255SRafał Miłecki static const struct gpio_keys_button 2493be97255SRafał Miłecki bcm47xx_buttons_linksys_wrt160nv3[] __initconst = { 2503be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), 2513be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2523be97255SRafał Miłecki }; 2533be97255SRafał Miłecki 2543be97255SRafał Miłecki static const struct gpio_keys_button 255160f1431SRafał Miłecki bcm47xx_buttons_linksys_wrt300n_v1[] __initconst = { 256160f1431SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 257160f1431SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 258160f1431SRafał Miłecki }; 259160f1431SRafał Miłecki 260160f1431SRafał Miłecki static const struct gpio_keys_button 2613be97255SRafał Miłecki bcm47xx_buttons_linksys_wrt300nv11[] __initconst = { 2623be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_UNKNOWN), 2633be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2643be97255SRafał Miłecki }; 2653be97255SRafał Miłecki 2663be97255SRafał Miłecki static const struct gpio_keys_button 2673be97255SRafał Miłecki bcm47xx_buttons_linksys_wrt310nv1[] __initconst = { 2683be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2693be97255SRafał Miłecki BCM47XX_GPIO_KEY(8, KEY_UNKNOWN), 2703be97255SRafał Miłecki }; 2713be97255SRafał Miłecki 2723be97255SRafał Miłecki static const struct gpio_keys_button 27396c10de3SHauke Mehrtens bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = { 27496c10de3SHauke Mehrtens BCM47XX_GPIO_KEY(5, KEY_WIMAX), 27596c10de3SHauke Mehrtens BCM47XX_GPIO_KEY(6, KEY_RESTART), 27696c10de3SHauke Mehrtens }; 27796c10de3SHauke Mehrtens 27896c10de3SHauke Mehrtens static const struct gpio_keys_button 27941a867cbSRafał Miłecki bcm47xx_buttons_linksys_wrt54g_generic[] __initconst = { 28096c10de3SHauke Mehrtens BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 28196c10de3SHauke Mehrtens BCM47XX_GPIO_KEY(6, KEY_RESTART), 28296c10de3SHauke Mehrtens }; 28396c10de3SHauke Mehrtens 28496c10de3SHauke Mehrtens static const struct gpio_keys_button 2853be97255SRafał Miłecki bcm47xx_buttons_linksys_wrt610nv1[] __initconst = { 2863be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2873be97255SRafał Miłecki BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON), 2883be97255SRafał Miłecki }; 2893be97255SRafał Miłecki 2903be97255SRafał Miłecki static const struct gpio_keys_button 2913be97255SRafał Miłecki bcm47xx_buttons_linksys_wrt610nv2[] __initconst = { 2923be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 2933be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 2943be97255SRafał Miłecki }; 2953be97255SRafał Miłecki 29696c10de3SHauke Mehrtens static const struct gpio_keys_button 29796c10de3SHauke Mehrtens bcm47xx_buttons_linksys_wrtsl54gs[] __initconst = { 29896c10de3SHauke Mehrtens BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 29996c10de3SHauke Mehrtens BCM47XX_GPIO_KEY(6, KEY_RESTART), 30096c10de3SHauke Mehrtens }; 30196c10de3SHauke Mehrtens 30224f2970fSDan Haab /* Luxul */ 30324f2970fSDan Haab 30424f2970fSDan Haab static const struct gpio_keys_button 30524f2970fSDan Haab bcm47xx_buttons_luxul_xwr_1750_v1[] = { 30624f2970fSDan Haab BCM47XX_GPIO_KEY(14, BTN_TASK), 30724f2970fSDan Haab }; 30824f2970fSDan Haab 309250dc037SHauke Mehrtens /* Microsoft */ 310250dc037SHauke Mehrtens 311250dc037SHauke Mehrtens static const struct gpio_keys_button 312250dc037SHauke Mehrtens bcm47xx_buttons_microsoft_nm700[] __initconst = { 313250dc037SHauke Mehrtens BCM47XX_GPIO_KEY(7, KEY_RESTART), 314250dc037SHauke Mehrtens }; 315250dc037SHauke Mehrtens 3163be97255SRafał Miłecki /* Motorola */ 3173be97255SRafał Miłecki 3183be97255SRafał Miłecki static const struct gpio_keys_button 3193be97255SRafał Miłecki bcm47xx_buttons_motorola_we800g[] __initconst = { 3203be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_RESTART), 3213be97255SRafał Miłecki }; 3223be97255SRafał Miłecki 3233be97255SRafał Miłecki static const struct gpio_keys_button 3243be97255SRafał Miłecki bcm47xx_buttons_motorola_wr850gp[] __initconst = { 3253be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, KEY_RESTART), 3263be97255SRafał Miłecki }; 3273be97255SRafał Miłecki 3283be97255SRafał Miłecki static const struct gpio_keys_button 3293be97255SRafał Miłecki bcm47xx_buttons_motorola_wr850gv2v3[] __initconst = { 3303be97255SRafał Miłecki BCM47XX_GPIO_KEY(5, KEY_RESTART), 3313be97255SRafał Miłecki }; 3323be97255SRafał Miłecki 3333be97255SRafał Miłecki /* Netgear */ 3343be97255SRafał Miłecki 3353be97255SRafał Miłecki static const struct gpio_keys_button 3363be97255SRafał Miłecki bcm47xx_buttons_netgear_wndr3400v1[] __initconst = { 3373be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_RESTART), 3383be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), 3393be97255SRafał Miłecki BCM47XX_GPIO_KEY(8, KEY_RFKILL), 3403be97255SRafał Miłecki }; 3413be97255SRafał Miłecki 3423be97255SRafał Miłecki static const struct gpio_keys_button 343160f1431SRafał Miłecki bcm47xx_buttons_netgear_wndr3400_v3[] __initconst = { 344160f1431SRafał Miłecki BCM47XX_GPIO_KEY(12, KEY_RESTART), 345160f1431SRafał Miłecki BCM47XX_GPIO_KEY(23, KEY_WPS_BUTTON), 346160f1431SRafał Miłecki }; 347160f1431SRafał Miłecki 348160f1431SRafał Miłecki static const struct gpio_keys_button 3493be97255SRafał Miłecki bcm47xx_buttons_netgear_wndr3700v3[] __initconst = { 3503be97255SRafał Miłecki BCM47XX_GPIO_KEY(2, KEY_RFKILL), 3513be97255SRafał Miłecki BCM47XX_GPIO_KEY(3, KEY_RESTART), 3523be97255SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 3533be97255SRafał Miłecki }; 3543be97255SRafał Miłecki 355ef1e3e7aSRafał Miłecki static const struct gpio_keys_button 356e7277e1dSRafał Miłecki bcm47xx_buttons_netgear_wndr4500v1[] __initconst = { 357e7277e1dSRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), 358e7277e1dSRafał Miłecki BCM47XX_GPIO_KEY(5, KEY_RFKILL), 359e7277e1dSRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 360ef1e3e7aSRafał Miłecki }; 361ef1e3e7aSRafał Miłecki 3623be97255SRafał Miłecki static const struct gpio_keys_button 3639194b343SRafał Miłecki bcm47xx_buttons_netgear_wnr3500lv1[] __initconst = { 3649194b343SRafał Miłecki BCM47XX_GPIO_KEY(4, KEY_RESTART), 3659194b343SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), 3669194b343SRafał Miłecki }; 3679194b343SRafał Miłecki 3689194b343SRafał Miłecki static const struct gpio_keys_button 3693be97255SRafał Miłecki bcm47xx_buttons_netgear_wnr834bv2[] __initconst = { 3703be97255SRafał Miłecki BCM47XX_GPIO_KEY(6, KEY_RESTART), 3713be97255SRafał Miłecki }; 3723be97255SRafał Miłecki 3733be97255SRafał Miłecki /* SimpleTech */ 3743be97255SRafał Miłecki 3753be97255SRafał Miłecki static const struct gpio_keys_button 3763be97255SRafał Miłecki bcm47xx_buttons_simpletech_simpleshare[] __initconst = { 3773be97255SRafał Miłecki BCM47XX_GPIO_KEY(0, KEY_RESTART), 3783be97255SRafał Miłecki }; 3793be97255SRafał Miłecki 380ef1e3e7aSRafał Miłecki /************************************************** 381ef1e3e7aSRafał Miłecki * Init 382ef1e3e7aSRafał Miłecki **************************************************/ 383ef1e3e7aSRafał Miłecki 384ef1e3e7aSRafał Miłecki static struct gpio_keys_platform_data bcm47xx_button_pdata; 385ef1e3e7aSRafał Miłecki 386ef1e3e7aSRafał Miłecki static struct platform_device bcm47xx_buttons_gpio_keys = { 387ef1e3e7aSRafał Miłecki .name = "gpio-keys", 388ef1e3e7aSRafał Miłecki .dev = { 389ef1e3e7aSRafał Miłecki .platform_data = &bcm47xx_button_pdata, 390ef1e3e7aSRafał Miłecki } 391ef1e3e7aSRafał Miłecki }; 392ef1e3e7aSRafał Miłecki 393ef1e3e7aSRafał Miłecki /* Copy data from __initconst */ 394ef1e3e7aSRafał Miłecki static int __init bcm47xx_buttons_copy(const struct gpio_keys_button *buttons, 395ef1e3e7aSRafał Miłecki size_t nbuttons) 396ef1e3e7aSRafał Miłecki { 397ef1e3e7aSRafał Miłecki size_t size = nbuttons * sizeof(*buttons); 398ef1e3e7aSRafał Miłecki 399e5dd8f2cSAndrzej Hajda bcm47xx_button_pdata.buttons = kmemdup(buttons, size, GFP_KERNEL); 400ef1e3e7aSRafał Miłecki if (!bcm47xx_button_pdata.buttons) 401ef1e3e7aSRafał Miłecki return -ENOMEM; 402ef1e3e7aSRafał Miłecki bcm47xx_button_pdata.nbuttons = nbuttons; 403ef1e3e7aSRafał Miłecki 404ef1e3e7aSRafał Miłecki return 0; 405ef1e3e7aSRafał Miłecki } 406ef1e3e7aSRafał Miłecki 407ef1e3e7aSRafał Miłecki #define bcm47xx_copy_bdata(dev_buttons) \ 408ef1e3e7aSRafał Miłecki bcm47xx_buttons_copy(dev_buttons, ARRAY_SIZE(dev_buttons)); 409ef1e3e7aSRafał Miłecki 410ef1e3e7aSRafał Miłecki int __init bcm47xx_buttons_register(void) 411ef1e3e7aSRafał Miłecki { 412ef1e3e7aSRafał Miłecki enum bcm47xx_board board = bcm47xx_board_get(); 413ef1e3e7aSRafał Miłecki int err; 414ef1e3e7aSRafał Miłecki 415ef1e3e7aSRafał Miłecki switch (board) { 4163be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_RTN12: 4173be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn12); 4183be97255SRafał Miłecki break; 4193be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_RTN16: 4203be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn16); 4213be97255SRafał Miłecki break; 4223be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_RTN66U: 4233be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn66u); 4243be97255SRafał Miłecki break; 4253be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL300G: 4263be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl300g); 4273be97255SRafał Miłecki break; 4283be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL320GE: 4293be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl320ge); 4303be97255SRafał Miłecki break; 4313be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL330GE: 4323be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl330ge); 4333be97255SRafał Miłecki break; 434250dc037SHauke Mehrtens case BCM47XX_BOARD_ASUS_WL500G: 435250dc037SHauke Mehrtens err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500g); 436250dc037SHauke Mehrtens break; 4373be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL500GD: 4383be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gd); 4393be97255SRafał Miłecki break; 4403be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL500GPV1: 4413be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gpv1); 4423be97255SRafał Miłecki break; 4433be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL500GPV2: 4443be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gpv2); 4453be97255SRafał Miłecki break; 4463be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL500W: 4473be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500w); 4483be97255SRafał Miłecki break; 4493be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL520GC: 4503be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl520gc); 4513be97255SRafał Miłecki break; 4523be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL520GU: 4533be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl520gu); 4543be97255SRafał Miłecki break; 4553be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WL700GE: 4563be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl700ge); 4573be97255SRafał Miłecki break; 4583be97255SRafał Miłecki case BCM47XX_BOARD_ASUS_WLHDD: 4593be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_wlhdd); 4603be97255SRafał Miłecki break; 4613be97255SRafał Miłecki 4620dae62edSCody P Schafer case BCM47XX_BOARD_BELKIN_F7D3301: 4630dae62edSCody P Schafer case BCM47XX_BOARD_BELKIN_F7D3302: 4643be97255SRafał Miłecki case BCM47XX_BOARD_BELKIN_F7D4301: 4650dae62edSCody P Schafer case BCM47XX_BOARD_BELKIN_F7D4302: 4660dae62edSCody P Schafer case BCM47XX_BOARD_BELKIN_F7D4401: 4673be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_belkin_f7d4301); 4683be97255SRafał Miłecki break; 4693be97255SRafał Miłecki 4703be97255SRafał Miłecki case BCM47XX_BOARD_BUFFALO_WHR2_A54G54: 4713be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr2_a54g54); 4723be97255SRafał Miłecki break; 4733be97255SRafał Miłecki case BCM47XX_BOARD_BUFFALO_WHR_G125: 4743be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_g125); 4753be97255SRafał Miłecki break; 4763be97255SRafał Miłecki case BCM47XX_BOARD_BUFFALO_WHR_G54S: 4773be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_g54s); 4783be97255SRafał Miłecki break; 4793be97255SRafał Miłecki case BCM47XX_BOARD_BUFFALO_WHR_HP_G54: 4803be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_hp_g54); 4813be97255SRafał Miłecki break; 4823be97255SRafał Miłecki case BCM47XX_BOARD_BUFFALO_WZR_G300N: 4833be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_g300n); 4843be97255SRafał Miłecki break; 4853be97255SRafał Miłecki case BCM47XX_BOARD_BUFFALO_WZR_RS_G54: 4863be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54); 4873be97255SRafał Miłecki break; 4883be97255SRafał Miłecki case BCM47XX_BOARD_BUFFALO_WZR_RS_G54HP: 4893be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54hp); 4903be97255SRafał Miłecki break; 4913be97255SRafał Miłecki 4923be97255SRafał Miłecki case BCM47XX_BOARD_DELL_TM2300: 4933be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_dell_tm2300); 4943be97255SRafał Miłecki break; 4953be97255SRafał Miłecki 4963be97255SRafał Miłecki case BCM47XX_BOARD_DLINK_DIR130: 4973be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_dlink_dir130); 4983be97255SRafał Miłecki break; 4993be97255SRafał Miłecki case BCM47XX_BOARD_DLINK_DIR330: 5003be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_dlink_dir330); 5013be97255SRafał Miłecki break; 5023be97255SRafał Miłecki 5033be97255SRafał Miłecki case BCM47XX_BOARD_HUAWEI_E970: 5043be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_huawei_e970); 5053be97255SRafał Miłecki break; 5063be97255SRafał Miłecki 5073be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_E1000V1: 5083be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e1000v1); 5093be97255SRafał Miłecki break; 5103be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_E1000V21: 5113be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e1000v21); 5123be97255SRafał Miłecki break; 5133be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_E2000V1: 5143be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e2000v1); 5153be97255SRafał Miłecki break; 5163be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_E3000V1: 5173be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3000v1); 5183be97255SRafał Miłecki break; 5193be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_E3200V1: 5203be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3200v1); 5213be97255SRafał Miłecki break; 5223be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_E4200V1: 5233be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e4200v1); 5243be97255SRafał Miłecki break; 5253be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT150NV1: 5263be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt150nv1); 5273be97255SRafał Miłecki break; 5283be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT150NV11: 5293be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt150nv11); 5303be97255SRafał Miłecki break; 5313be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT160NV1: 5323be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt160nv1); 5333be97255SRafał Miłecki break; 5343be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT160NV3: 5353be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt160nv3); 5363be97255SRafał Miłecki break; 537160f1431SRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT300N_V1: 538160f1431SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300n_v1); 539160f1431SRafał Miłecki break; 5403be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT300NV11: 5413be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300nv11); 5423be97255SRafał Miłecki break; 5433be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT310NV1: 5443be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1); 5453be97255SRafał Miłecki break; 54696c10de3SHauke Mehrtens case BCM47XX_BOARD_LINKSYS_WRT54G3GV2: 54796c10de3SHauke Mehrtens err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g3gv2); 54896c10de3SHauke Mehrtens break; 54941a867cbSRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0101: 55041a867cbSRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0467: 55141a867cbSRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0708: 55241a867cbSRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g_generic); 55341a867cbSRafał Miłecki break; 5543be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT610NV1: 5553be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt610nv1); 5563be97255SRafał Miłecki break; 5573be97255SRafał Miłecki case BCM47XX_BOARD_LINKSYS_WRT610NV2: 5583be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt610nv2); 5593be97255SRafał Miłecki break; 56096c10de3SHauke Mehrtens case BCM47XX_BOARD_LINKSYS_WRTSL54GS: 56196c10de3SHauke Mehrtens err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrtsl54gs); 56296c10de3SHauke Mehrtens break; 5633be97255SRafał Miłecki 56424f2970fSDan Haab case BCM47XX_BOARD_LUXUL_XWR_1750_V1: 56524f2970fSDan Haab err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xwr_1750_v1); 56624f2970fSDan Haab break; 56724f2970fSDan Haab 568250dc037SHauke Mehrtens case BCM47XX_BOARD_MICROSOFT_MN700: 569250dc037SHauke Mehrtens err = bcm47xx_copy_bdata(bcm47xx_buttons_microsoft_nm700); 570250dc037SHauke Mehrtens break; 571250dc037SHauke Mehrtens 5723be97255SRafał Miłecki case BCM47XX_BOARD_MOTOROLA_WE800G: 5733be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_we800g); 5743be97255SRafał Miłecki break; 5753be97255SRafał Miłecki case BCM47XX_BOARD_MOTOROLA_WR850GP: 5763be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_wr850gp); 5773be97255SRafał Miłecki break; 5783be97255SRafał Miłecki case BCM47XX_BOARD_MOTOROLA_WR850GV2V3: 5793be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_wr850gv2v3); 5803be97255SRafał Miłecki break; 5813be97255SRafał Miłecki 5823be97255SRafał Miłecki case BCM47XX_BOARD_NETGEAR_WNDR3400V1: 5833be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400v1); 5843be97255SRafał Miłecki break; 585160f1431SRafał Miłecki case BCM47XX_BOARD_NETGEAR_WNDR3400_V3: 586160f1431SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400_v3); 587160f1431SRafał Miłecki break; 5883be97255SRafał Miłecki case BCM47XX_BOARD_NETGEAR_WNDR3700V3: 5893be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3700v3); 5903be97255SRafał Miłecki break; 591ef1e3e7aSRafał Miłecki case BCM47XX_BOARD_NETGEAR_WNDR4500V1: 592e7277e1dSRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr4500v1); 593ef1e3e7aSRafał Miłecki break; 5949194b343SRafał Miłecki case BCM47XX_BOARD_NETGEAR_WNR3500L: 5959194b343SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv1); 5969194b343SRafał Miłecki break; 5973be97255SRafał Miłecki case BCM47XX_BOARD_NETGEAR_WNR834BV2: 5983be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr834bv2); 5993be97255SRafał Miłecki break; 6003be97255SRafał Miłecki 6013be97255SRafał Miłecki case BCM47XX_BOARD_SIMPLETECH_SIMPLESHARE: 6023be97255SRafał Miłecki err = bcm47xx_copy_bdata(bcm47xx_buttons_simpletech_simpleshare); 6033be97255SRafał Miłecki break; 6043be97255SRafał Miłecki 605ef1e3e7aSRafał Miłecki default: 606ef1e3e7aSRafał Miłecki pr_debug("No buttons configuration found for this device\n"); 607ef1e3e7aSRafał Miłecki return -ENOTSUPP; 608ef1e3e7aSRafał Miłecki } 609ef1e3e7aSRafał Miłecki 610ef1e3e7aSRafał Miłecki if (err) 611ef1e3e7aSRafał Miłecki return -ENOMEM; 612ef1e3e7aSRafał Miłecki 613ef1e3e7aSRafał Miłecki err = platform_device_register(&bcm47xx_buttons_gpio_keys); 614ef1e3e7aSRafał Miłecki if (err) { 615ef1e3e7aSRafał Miłecki pr_err("Failed to register platform device: %d\n", err); 616ef1e3e7aSRafał Miłecki return err; 617ef1e3e7aSRafał Miłecki } 618ef1e3e7aSRafał Miłecki 619ef1e3e7aSRafał Miłecki return 0; 620ef1e3e7aSRafał Miłecki } 621