/* * Copyright (C) 2010-2011 NVIDIA, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA */ /* * Warning: Ventana might need some hardware rework to be able to work with * kbc-driver. Default Ventana h/w configuration should use GPIO keyboard * driver instead */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define VENTANA_ROW_COUNT 15 #define VENTANA_COL_COUNT 7 static const u32 ventana_keymap[] = { KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_HOME, KEY_BACK, KEY_MENU, KEY_VOLUMEDOWN, KEY_VOLUMEUP, KEY_RESERVED, }; static const struct matrix_keymap_data ventana_keymap_data = { .keymap = ventana_keymap, .keymap_size = ARRAY_SIZE(ventana_keymap), }; static struct tegra_kbc_wake_key ventana_wake_cfg[] = { [0] = { .row = 14, .col = 1, }, }; static struct tegra_kbc_platform_data ventana_kbc_platform_data = { .debounce_cnt = 20, .repeat_cnt = 50 * 32, .wake_cnt = 1, .wake_cfg = &ventana_wake_cfg[0], .keymap_data = &ventana_keymap_data, }; static struct resource ventana_kbc_resources[] = { [0] = { .start = TEGRA_KBC_BASE, .end = TEGRA_KBC_BASE + TEGRA_KBC_SIZE - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = INT_KBC, .end = INT_KBC, .flags = IORESOURCE_IRQ, }, }; struct platform_device ventana_kbc_device = { .name = "tegra-kbc", .id = -1, .dev = { .platform_data = &ventana_kbc_platform_data, }, .resource = ventana_kbc_resources, .num_resources = ARRAY_SIZE(ventana_kbc_resources), }; int __init ventana_kbc_init(void) { struct tegra_kbc_platform_data *data = &ventana_kbc_platform_data; int i; pr_info("KBC: ventana_kbc_init\n"); /* Setup the pin configuration information. */ for (i = 0; i < KBC_MAX_GPIO; i++) { data->pin_cfg[i].num = 0; data->pin_cfg[i].is_row = false; } for (i = 0; i < VENTANA_ROW_COUNT; i++) { data->pin_cfg[i].num = i; data->pin_cfg[i].is_row = true; } for (i = 0; i < VENTANA_COL_COUNT; i++) { data->pin_cfg[i + VENTANA_ROW_COUNT].num = i; data->pin_cfg[i + VENTANA_ROW_COUNT].is_row = false; } platform_device_register(&ventana_kbc_device); return 0; }