1 /*
2  * platform_gpio_keys.c: gpio_keys platform data initialization file
3  *
4  * (C) Copyright 2013 Intel Corporation
5  * Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com>
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; version 2
10  * of the License.
11  */
12 
13 #include <linux/input.h>
14 #include <linux/init.h>
15 #include <linux/kernel.h>
16 #include <linux/gpio.h>
17 #include <linux/gpio_keys.h>
18 #include <linux/platform_device.h>
19 #include <asm/intel-mid.h>
20 
21 #define DEVICE_NAME "gpio-keys"
22 
23 /*
24  * we will search these buttons in SFI GPIO table (by name)
25  * and register them dynamically. Please add all possible
26  * buttons here, we will shrink them if no GPIO found.
27  */
28 static struct gpio_keys_button gpio_button[] = {
29 	{KEY_POWER,		-1, 1, "power_btn",	EV_KEY, 0, 3000},
30 	{KEY_PROG1,		-1, 1, "prog_btn1",	EV_KEY, 0, 20},
31 	{KEY_PROG2,		-1, 1, "prog_btn2",	EV_KEY, 0, 20},
32 	{SW_LID,		-1, 1, "lid_switch",	EV_SW,  0, 20},
33 	{KEY_VOLUMEUP,		-1, 1, "vol_up",	EV_KEY, 0, 20},
34 	{KEY_VOLUMEDOWN,	-1, 1, "vol_down",	EV_KEY, 0, 20},
35 	{KEY_MUTE,		-1, 1, "mute_enable",	EV_KEY, 0, 20},
36 	{KEY_VOLUMEUP,		-1, 1, "volume_up",	EV_KEY, 0, 20},
37 	{KEY_VOLUMEDOWN,	-1, 1, "volume_down",	EV_KEY, 0, 20},
38 	{KEY_CAMERA,		-1, 1, "camera_full",	EV_KEY, 0, 20},
39 	{KEY_CAMERA_FOCUS,	-1, 1, "camera_half",	EV_KEY, 0, 20},
40 	{SW_KEYPAD_SLIDE,	-1, 1, "MagSw1",	EV_SW,  0, 20},
41 	{SW_KEYPAD_SLIDE,	-1, 1, "MagSw2",	EV_SW,  0, 20},
42 };
43 
44 static struct gpio_keys_platform_data gpio_keys = {
45 	.buttons	= gpio_button,
46 	.rep		= 1,
47 	.nbuttons	= -1, /* will fill it after search */
48 };
49 
50 static struct platform_device pb_device = {
51 	.name		= DEVICE_NAME,
52 	.id		= -1,
53 	.dev		= {
54 		.platform_data	= &gpio_keys,
55 	},
56 };
57 
58 /*
59  * Shrink the non-existent buttons, register the gpio button
60  * device if there is some
61  */
pb_keys_init(void)62 static int __init pb_keys_init(void)
63 {
64 	struct gpio_keys_button *gb = gpio_button;
65 	int i, good = 0;
66 
67 	for (i = 0; i < ARRAY_SIZE(gpio_button); i++) {
68 		gb[i].gpio = get_gpio_by_name(gb[i].desc);
69 		pr_debug("info[%2d]: name = %s, gpio = %d\n", i, gb[i].desc,
70 					gb[i].gpio);
71 		if (gb[i].gpio < 0)
72 			continue;
73 
74 		if (i != good)
75 			gb[good] = gb[i];
76 		good++;
77 	}
78 
79 	if (good) {
80 		gpio_keys.nbuttons = good;
81 		return platform_device_register(&pb_device);
82 	}
83 	return 0;
84 }
85 late_initcall(pb_keys_init);
86