summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Ryabukhin <vryabukhin@nvidia.com>2010-10-27 17:39:47 +0900
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:46:08 -0800
commite4d6fa318600cb929a1c8dc9f29d0b920ed815d7 (patch)
tree555581084a2726231f1b1801061d5766c4ef3cc1
parentf06ba73dec4757a6716fd2db42b501033a2854b9 (diff)
Added code to use tegra kbc driver on Ventana board.
This code is off by default. By default Ventana's buttons are GPIO pins. But it is possible to connect it to kbc controller (simple hardware rework needed). This code might be used as a reference code for using kbc driver. Original-Change-Id: Iaad4b8ca4b1bf6da1674e282f3bfb86349927fbd Reviewed-on: http://git-master/r/9801 Tested-by: Victor Ryabukhin <vryabukhin@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Rebase-Id: Rec5eaab861c97d7b363b796db96b8eb181d38782
-rw-r--r--arch/arm/mach-tegra/Makefile1
-rw-r--r--arch/arm/mach-tegra/board-ventana-kbc.c188
-rw-r--r--arch/arm/mach-tegra/board-ventana-pinmux.c6
-rw-r--r--arch/arm/mach-tegra/board-ventana.c28
-rw-r--r--arch/arm/mach-tegra/board-ventana.h1
5 files changed, 214 insertions, 10 deletions
diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile
index 3f475c87673e..5cd61d3f2be1 100644
--- a/arch/arm/mach-tegra/Makefile
+++ b/arch/arm/mach-tegra/Makefile
@@ -98,6 +98,7 @@ obj-${CONFIG_MACH_VENTANA} += board-ventana-sdhci.o
obj-${CONFIG_MACH_VENTANA} += board-ventana-power.o
obj-${CONFIG_MACH_VENTANA} += board-ventana-panel.o
obj-${CONFIG_MACH_VENTANA} += board-ventana-sensors.o
+obj-${CONFIG_MACH_VENTANA} += board-ventana-kbc.o
# Aruba
diff --git a/arch/arm/mach-tegra/board-ventana-kbc.c b/arch/arm/mach-tegra/board-ventana-kbc.c
new file mode 100644
index 000000000000..869af114fa90
--- /dev/null
+++ b/arch/arm/mach-tegra/board-ventana-kbc.c
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2010 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 <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/input.h>
+#include <linux/device.h>
+
+#include <mach/clk.h>
+#include <mach/iomap.h>
+#include <mach/irqs.h>
+#include <mach/pinmux.h>
+#include <mach/iomap.h>
+#include <mach/io.h>
+#include <mach/kbc.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+
+
+static int plain_kbd_keycode[] = {
+ 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_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, KEY_RESERVED,
+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED
+};
+
+static int fn_kbd_keycode[] = {
+ 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_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, KEY_RESERVED,
+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED
+};
+
+
+
+
+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],
+ .filter_keys = true,
+};
+
+
+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, j;
+
+ pr_info("KBC: ventana_kbc_init\n");
+
+ /*
+ * Setup the pin configuration information.
+ */
+ for (i = 0; i < KBC_MAX_ROW; i++) {
+ data->pin_cfg[i].num = i;
+ data->pin_cfg[i].is_row = true;
+ data->pin_cfg[i].is_col = false;
+ }
+
+ for (j = 0; j < 7/*KBC_MAX_COL*/; j++) {
+ data->pin_cfg[i + j].num = j;
+ data->pin_cfg[i + j].is_row = false;
+ data->pin_cfg[i + j].is_col = true;
+ }
+
+ /* tegra-kbc will use default keycodes. */
+ data->plain_keycode = plain_kbd_keycode;
+ data->fn_keycode = fn_kbd_keycode;
+ data->filter_keys = true;
+ platform_device_register(&ventana_kbc_device);
+ return 0;
+}
+
+
+
diff --git a/arch/arm/mach-tegra/board-ventana-pinmux.c b/arch/arm/mach-tegra/board-ventana-pinmux.c
index 997873ac043e..a0f99448ca4b 100644
--- a/arch/arm/mach-tegra/board-ventana-pinmux.c
+++ b/arch/arm/mach-tegra/board-ventana-pinmux.c
@@ -72,10 +72,10 @@ static __initdata struct tegra_pingroup_config ventana_pinmux[] = {
{TEGRA_PINGROUP_I2CP, TEGRA_MUX_I2C, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL},
{TEGRA_PINGROUP_IRRX, TEGRA_MUX_UARTB, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL},
{TEGRA_PINGROUP_IRTX, TEGRA_MUX_UARTB, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL},
- {TEGRA_PINGROUP_KBCA, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE},
- {TEGRA_PINGROUP_KBCB, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE},
+ {TEGRA_PINGROUP_KBCA, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL},
+ {TEGRA_PINGROUP_KBCB, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL},
{TEGRA_PINGROUP_KBCC, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL},
- {TEGRA_PINGROUP_KBCD, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
+ {TEGRA_PINGROUP_KBCD, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL},
{TEGRA_PINGROUP_KBCE, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL},
{TEGRA_PINGROUP_KBCF, TEGRA_MUX_KBC, TEGRA_PUPD_PULL_UP, TEGRA_TRI_NORMAL},
{TEGRA_PINGROUP_LCSN, TEGRA_MUX_RSVD4, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE},
diff --git a/arch/arm/mach-tegra/board-ventana.c b/arch/arm/mach-tegra/board-ventana.c
index 33eacbd1ba63..05a5eeb5734b 100644
--- a/arch/arm/mach-tegra/board-ventana.c
+++ b/arch/arm/mach-tegra/board-ventana.c
@@ -145,6 +145,7 @@ static __initdata struct tegra_clk_init_table ventana_clk_init_table[] = {
{ "blink", "clk_32k", 32768, false},
{ "pll_p_out4", "pll_p", 24000000, true },
{ "pwm", "clk_32k", 32768, false},
+ { "kbc", "clk_32k", 32768, true},
{ NULL, NULL, 0, 0},
};
@@ -209,6 +210,8 @@ static void ventana_i2c_init(void)
platform_device_register(&tegra_i2c_device4);
}
+
+#ifdef CONFIG_KEYBOARD_GPIO
#define GPIO_KEY(_id, _gpio, _iswake) \
{ \
.code = _id, \
@@ -242,6 +245,15 @@ static struct platform_device ventana_keys_device = {
},
};
+static void ventana_keys_init(void)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(ventana_keys); i++)
+ tegra_gpio_enable(ventana_keys[i].gpio);
+}
+#endif
+
static struct platform_device tegra_camera = {
.name = "tegra_camera",
.id = -1,
@@ -257,19 +269,14 @@ static struct platform_device *ventana_devices[] __initdata = {
&tegra_ehci2_device,
&tegra_gart_device,
&tegra_aes_device,
+#ifdef CONFIG_KEYBOARD_GPIO
&ventana_keys_device,
+#endif
&tegra_wdt_device,
&tegra_avp_device,
&tegra_camera,
};
-static void ventana_keys_init(void)
-{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(ventana_keys); i++)
- tegra_gpio_enable(ventana_keys[i].gpio);
-}
static struct panjit_i2c_ts_platform_data panjit_data = {
.gpio_reset = TEGRA_GPIO_PQ7,
@@ -390,7 +397,14 @@ static void __init tegra_ventana_init(void)
ventana_charge_init();
ventana_regulator_init();
ventana_touch_init();
+
+#ifdef CONFIG_KEYBOARD_GPIO
ventana_keys_init();
+#endif
+#ifdef CONFIG_KEYBOARD_TEGRA
+ ventana_kbc_init();
+#endif
+
ventana_usb_init();
ventana_gps_init();
ventana_panel_init();
diff --git a/arch/arm/mach-tegra/board-ventana.h b/arch/arm/mach-tegra/board-ventana.h
index 26799c8bb156..7762b641bff4 100644
--- a/arch/arm/mach-tegra/board-ventana.h
+++ b/arch/arm/mach-tegra/board-ventana.h
@@ -23,5 +23,6 @@ int ventana_sdhci_init(void);
int ventana_pinmux_init(void);
int ventana_panel_init(void);
int ventana_sensors_init(void);
+int ventana_kbc_init(void);
#endif