Linux Audio

Check our new training course

Loading...
v5.14.15
  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}
v5.4
  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}