82 lines
2.2 KiB
C
82 lines
2.2 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* platform_gpio_keys.c: gpio_keys platform data initialization file
|
|
*
|
|
* (C) Copyright 2013 Intel Corporation
|
|
* Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com>
|
|
*/
|
|
|
|
#include <linux/input.h>
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/gpio.h>
|
|
#include <linux/gpio_keys.h>
|
|
#include <linux/platform_device.h>
|
|
#include <asm/intel-mid.h>
|
|
|
|
#define DEVICE_NAME "gpio-keys"
|
|
|
|
/*
|
|
* we will search these buttons in SFI GPIO table (by name)
|
|
* and register them dynamically. Please add all possible
|
|
* buttons here, we will shrink them if no GPIO found.
|
|
*/
|
|
static struct gpio_keys_button gpio_button[] = {
|
|
{KEY_POWER, -1, 1, "power_btn", EV_KEY, 0, 3000},
|
|
{KEY_PROG1, -1, 1, "prog_btn1", EV_KEY, 0, 20},
|
|
{KEY_PROG2, -1, 1, "prog_btn2", EV_KEY, 0, 20},
|
|
{SW_LID, -1, 1, "lid_switch", EV_SW, 0, 20},
|
|
{KEY_VOLUMEUP, -1, 1, "vol_up", EV_KEY, 0, 20},
|
|
{KEY_VOLUMEDOWN, -1, 1, "vol_down", EV_KEY, 0, 20},
|
|
{KEY_MUTE, -1, 1, "mute_enable", EV_KEY, 0, 20},
|
|
{KEY_VOLUMEUP, -1, 1, "volume_up", EV_KEY, 0, 20},
|
|
{KEY_VOLUMEDOWN, -1, 1, "volume_down", EV_KEY, 0, 20},
|
|
{KEY_CAMERA, -1, 1, "camera_full", EV_KEY, 0, 20},
|
|
{KEY_CAMERA_FOCUS, -1, 1, "camera_half", EV_KEY, 0, 20},
|
|
{SW_KEYPAD_SLIDE, -1, 1, "MagSw1", EV_SW, 0, 20},
|
|
{SW_KEYPAD_SLIDE, -1, 1, "MagSw2", EV_SW, 0, 20},
|
|
};
|
|
|
|
static struct gpio_keys_platform_data gpio_keys = {
|
|
.buttons = gpio_button,
|
|
.rep = 1,
|
|
.nbuttons = -1, /* will fill it after search */
|
|
};
|
|
|
|
static struct platform_device pb_device = {
|
|
.name = DEVICE_NAME,
|
|
.id = -1,
|
|
.dev = {
|
|
.platform_data = &gpio_keys,
|
|
},
|
|
};
|
|
|
|
/*
|
|
* Shrink the non-existent buttons, register the gpio button
|
|
* device if there is some
|
|
*/
|
|
static int __init pb_keys_init(void)
|
|
{
|
|
struct gpio_keys_button *gb = gpio_button;
|
|
int i, good = 0;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(gpio_button); i++) {
|
|
gb[i].gpio = get_gpio_by_name(gb[i].desc);
|
|
pr_debug("info[%2d]: name = %s, gpio = %d\n", i, gb[i].desc,
|
|
gb[i].gpio);
|
|
if (gb[i].gpio < 0)
|
|
continue;
|
|
|
|
if (i != good)
|
|
gb[good] = gb[i];
|
|
good++;
|
|
}
|
|
|
|
if (good) {
|
|
gpio_keys.nbuttons = good;
|
|
return platform_device_register(&pb_device);
|
|
}
|
|
return 0;
|
|
}
|
|
late_initcall(pb_keys_init);
|