diff options
author | Srikant Patnaik | 2015-01-11 12:28:04 +0530 |
---|---|---|
committer | Srikant Patnaik | 2015-01-11 12:28:04 +0530 |
commit | 871480933a1c28f8a9fed4c4d34d06c439a7a422 (patch) | |
tree | 8718f573808810c2a1e8cb8fb6ac469093ca2784 /ANDROID_3.4.5/drivers/input/keyboard | |
parent | 9d40ac5867b9aefe0722bc1f110b965ff294d30d (diff) | |
download | FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.gz FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.bz2 FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.zip |
Moved, renamed, and deleted files
The original directory structure was scattered and unorganized.
Changes are basically to make it look like kernel structure.
Diffstat (limited to 'ANDROID_3.4.5/drivers/input/keyboard')
53 files changed, 0 insertions, 23863 deletions
diff --git a/ANDROID_3.4.5/drivers/input/keyboard/Kconfig b/ANDROID_3.4.5/drivers/input/keyboard/Kconfig deleted file mode 100644 index 906d86aa..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/Kconfig +++ /dev/null @@ -1,601 +0,0 @@ -# -# Input core configuration -# -menuconfig INPUT_KEYBOARD - bool "Keyboards" if EXPERT || !X86 - default y - help - Say Y here, and a list of supported keyboards will be displayed. - This option doesn't affect the kernel. - - If unsure, say Y. - -if INPUT_KEYBOARD - -config KEYBOARD_ADP5520 - tristate "Keypad Support for ADP5520 PMIC" - depends on PMIC_ADP5520 - help - This option enables support for the keypad scan matrix - on Analog Devices ADP5520 PMICs. - - To compile this driver as a module, choose M here: the module will - be called adp5520-keys. - -config KEYBOARD_ADP5588 - tristate "ADP5588/87 I2C QWERTY Keypad and IO Expander" - depends on I2C - help - Say Y here if you want to use a ADP5588/87 attached to your - system I2C bus. - - To compile this driver as a module, choose M here: the - module will be called adp5588-keys. - -config KEYBOARD_ADP5589 - tristate "ADP5585/ADP5589 I2C QWERTY Keypad and IO Expander" - depends on I2C - help - Say Y here if you want to use a ADP5585/ADP5589 attached to your - system I2C bus. - - To compile this driver as a module, choose M here: the - module will be called adp5589-keys. - -config KEYBOARD_AMIGA - tristate "Amiga keyboard" - depends on AMIGA - help - Say Y here if you are running Linux on any AMIGA and have a keyboard - attached. - - To compile this driver as a module, choose M here: the - module will be called amikbd. - -config ATARI_KBD_CORE - bool - -config KEYBOARD_ATARI - tristate "Atari keyboard" - depends on ATARI - select ATARI_KBD_CORE - help - Say Y here if you are running Linux on any Atari and have a keyboard - attached. - - To compile this driver as a module, choose M here: the - module will be called atakbd. - -config KEYBOARD_ATKBD - tristate "AT keyboard" if EXPERT || !X86 - default y - select SERIO - select SERIO_LIBPS2 - select SERIO_I8042 if X86 - select SERIO_GSCPS2 if GSC - help - Say Y here if you want to use a standard AT or PS/2 keyboard. Usually - you'll need this, unless you have a different type keyboard (USB, ADB - or other). This also works for AT and PS/2 keyboards connected over a - PS/2 to serial converter. - - If unsure, say Y. - - To compile this driver as a module, choose M here: the - module will be called atkbd. - -config KEYBOARD_ATKBD_HP_KEYCODES - bool "Use HP keyboard scancodes" - depends on PARISC && KEYBOARD_ATKBD - default y - help - Say Y here if you have a PA-RISC machine and want to use an AT or - PS/2 keyboard, and your keyboard uses keycodes that are specific to - PA-RISC keyboards. - - Say N if you use a standard keyboard. - -config KEYBOARD_ATKBD_RDI_KEYCODES - bool "Use PrecisionBook keyboard scancodes" - depends on KEYBOARD_ATKBD_HP_KEYCODES - default n - help - If you have an RDI PrecisionBook, say Y here if you want to use its - built-in keyboard (as opposed to an external keyboard). - - The PrecisionBook has five keys that conflict with those used by most - AT and PS/2 keyboards. These are as follows: - - PrecisionBook Standard AT or PS/2 - - F1 F12 - Left Ctrl Left Alt - Caps Lock Left Ctrl - Right Ctrl Caps Lock - Left 102nd key (the key to the right of Left Shift) - - If you say N here, and use the PrecisionBook keyboard, then each key - in the left-hand column will be interpreted as the corresponding key - in the right-hand column. - - If you say Y here, and use an external keyboard, then each key in the - right-hand column will be interpreted as the key shown in the - left-hand column. - -config KEYBOARD_QT1070 - tristate "Atmel AT42QT1070 Touch Sensor Chip" - depends on I2C - help - Say Y here if you want to use Atmel AT42QT1070 QTouch - Sensor chip as input device. - - To compile this driver as a module, choose M here: - the module will be called qt1070 - -config KEYBOARD_QT2160 - tristate "Atmel AT42QT2160 Touch Sensor Chip" - depends on I2C && EXPERIMENTAL - help - If you say yes here you get support for Atmel AT42QT2160 Touch - Sensor chip as a keyboard input. - - This driver can also be built as a module. If so, the module - will be called qt2160. - -config KEYBOARD_BFIN - tristate "Blackfin BF54x keypad support" - depends on (BF54x && !BF544) - help - Say Y here if you want to use the BF54x keypad. - - To compile this driver as a module, choose M here: the - module will be called bf54x-keys. - -config KEYBOARD_LKKBD - tristate "DECstation/VAXstation LK201/LK401 keyboard" - select SERIO - help - Say Y here if you want to use a LK201 or LK401 style serial - keyboard. This keyboard is also useable on PCs if you attach - it with the inputattach program. The connector pinout is - described within lkkbd.c. - - To compile this driver as a module, choose M here: the - module will be called lkkbd. - -config KEYBOARD_EP93XX - tristate "EP93xx Matrix Keypad support" - depends on ARCH_EP93XX - help - Say Y here to enable the matrix keypad on the Cirrus EP93XX. - - To compile this driver as a module, choose M here: the - module will be called ep93xx_keypad. - -config KEYBOARD_GPIO - tristate "GPIO Buttons" - depends on GENERIC_GPIO - help - This driver implements support for buttons connected - to GPIO pins of various CPUs (and some other chips). - - Say Y here if your device has buttons connected - directly to such GPIO pins. Your board-specific - setup logic must also provide a platform device, - with configuration data saying which GPIOs are used. - - To compile this driver as a module, choose M here: the - module will be called gpio_keys. - -config KEYBOARD_GPIO_POLLED - tristate "Polled GPIO buttons" - depends on GENERIC_GPIO - select INPUT_POLLDEV - help - This driver implements support for buttons connected - to GPIO pins that are not capable of generating interrupts. - - Say Y here if your device has buttons connected - directly to such GPIO pins. Your board-specific - setup logic must also provide a platform device, - with configuration data saying which GPIOs are used. - - To compile this driver as a module, choose M here: the - module will be called gpio_keys_polled. - -config KEYBOARD_TCA6416 - tristate "TCA6416/TCA6408A Keypad Support" - depends on I2C - help - This driver implements basic keypad functionality - for keys connected through TCA6416/TCA6408A IO expanders. - - Say Y here if your device has keys connected to - TCA6416/TCA6408A IO expander. Your board-specific setup logic - must also provide pin-mask details(of which TCA6416 pins - are used for keypad). - - If enabled the entire TCA6416 device will be managed through - this driver. - - To compile this driver as a module, choose M here: the - module will be called tca6416_keypad. - -config KEYBOARD_TCA8418 - tristate "TCA8418 Keypad Support" - depends on I2C - help - This driver implements basic keypad functionality - for keys connected through TCA8418 keypad decoder. - - Say Y here if your device has keys connected to - TCA8418 keypad decoder. - - If enabled the complete TCA8418 device will be managed through - this driver. - - To compile this driver as a module, choose M here: the - module will be called tca8418_keypad. - -config KEYBOARD_MATRIX - tristate "GPIO driven matrix keypad support" - depends on GENERIC_GPIO - help - Enable support for GPIO driven matrix keypad. - - To compile this driver as a module, choose M here: the - module will be called matrix_keypad. - -config KEYBOARD_HIL_OLD - tristate "HP HIL keyboard support (simple driver)" - depends on GSC || HP300 - default y - help - The "Human Interface Loop" is a older, 8-channel USB-like - controller used in several Hewlett Packard models. This driver - was adapted from the one written for m68k/hp300, and implements - support for a keyboard attached to the HIL port, but not for - any other types of HIL input devices like mice or tablets. - However, it has been thoroughly tested and is stable. - - If you want full HIL support including support for multiple - keyboards, mice, and tablets, you have to enable the - "HP System Device Controller i8042 Support" in the input/serio - submenu. - -config KEYBOARD_HIL - tristate "HP HIL keyboard/pointer support" - depends on GSC || HP300 - default y - select HP_SDC - select HIL_MLC - select SERIO - help - The "Human Interface Loop" is a older, 8-channel USB-like - controller used in several Hewlett Packard models. - This driver implements support for HIL-keyboards and pointing - devices (mice, tablets, touchscreens) attached - to your machine, so normally you should say Y here. - -config KEYBOARD_HP6XX - tristate "HP Jornada 6xx keyboard" - depends on SH_HP6XX - select INPUT_POLLDEV - help - Say Y here if you have a HP Jornada 620/660/680/690 and want to - support the built-in keyboard. - - To compile this driver as a module, choose M here: the - module will be called jornada680_kbd. - -config KEYBOARD_HP7XX - tristate "HP Jornada 7xx keyboard" - depends on SA1100_JORNADA720_SSP && SA1100_SSP - help - Say Y here if you have a HP Jornada 710/720/728 and want to - support the built-in keyboard. - - To compile this driver as a module, choose M here: the - module will be called jornada720_kbd. - -config KEYBOARD_LM8323 - tristate "LM8323 keypad chip" - depends on I2C - depends on LEDS_CLASS - help - If you say yes here you get support for the National Semiconductor - LM8323 keypad controller. - - To compile this driver as a module, choose M here: the - module will be called lm8323. - -config KEYBOARD_LOCOMO - tristate "LoCoMo Keyboard Support" - depends on SHARP_LOCOMO - help - Say Y here if you are running Linux on a Sharp Zaurus Collie or Poodle based PDA - - To compile this driver as a module, choose M here: the - module will be called locomokbd. - -config KEYBOARD_MAPLE - tristate "Maple bus keyboard" - depends on SH_DREAMCAST && MAPLE - help - Say Y here if you have a Dreamcast console running Linux and have - a keyboard attached to its Maple bus. - - To compile this driver as a module, choose M here: the - module will be called maple_keyb. - -config KEYBOARD_MAX7359 - tristate "Maxim MAX7359 Key Switch Controller" - depends on I2C - help - If you say yes here you get support for the Maxim MAX7359 Key - Switch Controller chip. This providers microprocessors with - management of up to 64 key switches - - To compile this driver as a module, choose M here: the - module will be called max7359_keypad. - -config KEYBOARD_MCS - tristate "MELFAS MCS Touchkey" - depends on I2C - help - Say Y here if you have the MELFAS MCS5000/5080 touchkey controller - chip in your system. - - If unsure, say N. - - To compile this driver as a module, choose M here: the - module will be called mcs_touchkey. - -config KEYBOARD_MPR121 - tristate "Freescale MPR121 Touchkey" - depends on I2C - help - Say Y here if you have Freescale MPR121 touchkey controller - chip in your system. - - If unsure, say N. - - To compile this driver as a module, choose M here: the - module will be called mpr121_touchkey. - -config KEYBOARD_IMX - tristate "IMX keypad support" - depends on ARCH_MXC - help - Enable support for IMX keypad port. - - To compile this driver as a module, choose M here: the - module will be called imx_keypad. - -config KEYBOARD_NEWTON - tristate "Newton keyboard" - select SERIO - help - Say Y here if you have a Newton keyboard on a serial port. - - To compile this driver as a module, choose M here: the - module will be called newtonkbd. - -config KEYBOARD_NOMADIK - tristate "ST-Ericsson Nomadik SKE keyboard" - depends on PLAT_NOMADIK - help - Say Y here if you want to use a keypad provided on the SKE controller - used on the Ux500 and Nomadik platforms - - To compile this driver as a module, choose M here: the - module will be called nmk-ske-keypad. - -config KEYBOARD_TEGRA - tristate "NVIDIA Tegra internal matrix keyboard controller support" - depends on ARCH_TEGRA - select INPUT_OF_MATRIX_KEYMAP if USE_OF - help - Say Y here if you want to use a matrix keyboard connected directly - to the internal keyboard controller on Tegra SoCs. - - To compile this driver as a module, choose M here: the - module will be called tegra-kbc. - -config KEYBOARD_OPENCORES - tristate "OpenCores Keyboard Controller" - help - Say Y here if you want to use the OpenCores Keyboard Controller - http://www.opencores.org/project,keyboardcontroller - - To compile this driver as a module, choose M here; the - module will be called opencores-kbd. - -config KEYBOARD_PXA27x - tristate "PXA27x/PXA3xx keypad support" - depends on PXA27x || PXA3xx || ARCH_MMP - help - Enable support for PXA27x/PXA3xx keypad controller. - - To compile this driver as a module, choose M here: the - module will be called pxa27x_keypad. - -config KEYBOARD_PXA930_ROTARY - tristate "PXA930/PXA935 Enhanced Rotary Controller Support" - depends on CPU_PXA930 || CPU_PXA935 - help - Enable support for PXA930/PXA935 Enhanced Rotary Controller. - - To compile this driver as a module, choose M here: the - module will be called pxa930_rotary. - -config KEYBOARD_PMIC8XXX - tristate "Qualcomm PMIC8XXX keypad support" - depends on MFD_PM8XXX - help - Say Y here if you want to enable the driver for the PMIC8XXX - keypad provided as a reference design from Qualcomm. This is intended - to support upto 18x8 matrix based keypad design. - - To compile this driver as a module, choose M here: the module will - be called pmic8xxx-keypad. - -config KEYBOARD_SAMSUNG - tristate "Samsung keypad support" - depends on HAVE_CLK - help - Say Y here if you want to use the keypad on your Samsung mobile - device. - - To compile this driver as a module, choose M here: the - module will be called samsung-keypad. - -config KEYBOARD_STOWAWAY - tristate "Stowaway keyboard" - select SERIO - help - Say Y here if you have a Stowaway keyboard on a serial port. - Stowaway compatible keyboards like Dicota Input-PDA keyboard - are also supported by this driver. - - To compile this driver as a module, choose M here: the - module will be called stowaway. - -config KEYBOARD_SUNKBD - tristate "Sun Type 4 and Type 5 keyboard" - select SERIO - help - Say Y here if you want to use a Sun Type 4 or Type 5 keyboard, - connected either to the Sun keyboard connector or to an serial - (RS-232) port via a simple adapter. - - To compile this driver as a module, choose M here: the - module will be called sunkbd. - -config KEYBOARD_SH_KEYSC - tristate "SuperH KEYSC keypad support" - depends on SUPERH || ARCH_SHMOBILE - help - Say Y here if you want to use a keypad attached to the KEYSC block - on SuperH processors such as sh7722 and sh7343. - - To compile this driver as a module, choose M here: the - module will be called sh_keysc. - -config KEYBOARD_STMPE - tristate "STMPE keypad support" - depends on MFD_STMPE - help - Say Y here if you want to use the keypad controller on STMPE I/O - expanders. - - To compile this driver as a module, choose M here: the module will be - called stmpe-keypad. - -config KEYBOARD_DAVINCI - tristate "TI DaVinci Key Scan" - depends on ARCH_DAVINCI_DM365 - help - Say Y to enable keypad module support for the TI DaVinci - platforms (DM365). - - To compile this driver as a module, choose M here: the - module will be called davinci_keyscan. - -config KEYBOARD_WMT - tristate "WMT keypad support" - depends on INPUT && INPUT_KEYBOARD - ---help--- - Say Y here if you want to use keypad on WMT based EVB. - - To compile this driver as a module, choose M here: the - module will be called wmt_keypad. - -config SARADC_WMT - tristate "WMT saradc support" - depends on INPUT && INPUT_KEYBOARD - ---help--- - Say Y here if you want to use keypad on WMT based EVB. - - To compile this driver as a module, choose M here: the - module will be called wmt_saradc. - -config KEYBOARD_OMAP - tristate "TI OMAP keypad support" - depends on (ARCH_OMAP1 || ARCH_OMAP2) - help - Say Y here if you want to use the OMAP keypad. - - To compile this driver as a module, choose M here: the - module will be called omap-keypad. - -config KEYBOARD_OMAP4 - tristate "TI OMAP4 keypad support" - help - Say Y here if you want to use the OMAP4 keypad. - - To compile this driver as a module, choose M here: the - module will be called omap4-keypad. - -config KEYBOARD_SPEAR - tristate "ST SPEAR keyboard support" - depends on PLAT_SPEAR - help - Say Y here if you want to use the SPEAR keyboard. - - To compile this driver as a module, choose M here: the - module will be called spear-keboard. - -config KEYBOARD_TC3589X - tristate "TC3589X Keypad support" - depends on MFD_TC3589X - help - Say Y here if you want to use the keypad controller on - TC35892/3 I/O expander. - - To compile this driver as a module, choose M here: the - module will be called tc3589x-keypad. - -config KEYBOARD_TNETV107X - tristate "TI TNETV107X keypad support" - depends on ARCH_DAVINCI_TNETV107X - help - Say Y here if you want to use the TNETV107X keypad. - - To compile this driver as a module, choose M here: the - module will be called tnetv107x-keypad. - -config KEYBOARD_TWL4030 - tristate "TI TWL4030/TWL5030/TPS659x0 keypad support" - depends on TWL4030_CORE - help - Say Y here if your board use the keypad controller on - TWL4030 family chips. It's safe to say enable this - even on boards that don't use the keypad controller. - - To compile this driver as a module, choose M here: the - module will be called twl4030_keypad. - -config KEYBOARD_XTKBD - tristate "XT keyboard" - select SERIO - help - Say Y here if you want to use the old IBM PC/XT keyboard (or - compatible) on your system. This is only possible with a - parallel port keyboard adapter, you cannot connect it to the - keyboard port on a PC that runs Linux. - - To compile this driver as a module, choose M here: the - module will be called xtkbd. - -config KEYBOARD_W90P910 - tristate "W90P910 Matrix Keypad support" - depends on ARCH_W90X900 - help - Say Y here to enable the matrix keypad on evaluation board - based on W90P910. - - To compile this driver as a module, choose M here: the - module will be called w90p910_keypad. - -endif diff --git a/ANDROID_3.4.5/drivers/input/keyboard/Makefile b/ANDROID_3.4.5/drivers/input/keyboard/Makefile deleted file mode 100644 index 587a9f25..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# -# Makefile for the input core drivers. -# - -# Each configuration option enables a list of files. - -obj-$(CONFIG_KEYBOARD_ADP5520) += adp5520-keys.o -obj-$(CONFIG_KEYBOARD_ADP5588) += adp5588-keys.o -obj-$(CONFIG_KEYBOARD_ADP5589) += adp5589-keys.o -obj-$(CONFIG_KEYBOARD_AMIGA) += amikbd.o -obj-$(CONFIG_KEYBOARD_ATARI) += atakbd.o -obj-$(CONFIG_KEYBOARD_ATKBD) += atkbd.o -obj-$(CONFIG_KEYBOARD_BFIN) += bf54x-keys.o -obj-$(CONFIG_KEYBOARD_DAVINCI) += davinci_keyscan.o -obj-$(CONFIG_KEYBOARD_EP93XX) += ep93xx_keypad.o -obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o -obj-$(CONFIG_KEYBOARD_GPIO_POLLED) += gpio_keys_polled.o -obj-$(CONFIG_KEYBOARD_TCA6416) += tca6416-keypad.o -obj-$(CONFIG_KEYBOARD_TCA8418) += tca8418_keypad.o -obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o -obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o -obj-$(CONFIG_KEYBOARD_IMX) += imx_keypad.o -obj-$(CONFIG_KEYBOARD_HP6XX) += jornada680_kbd.o -obj-$(CONFIG_KEYBOARD_HP7XX) += jornada720_kbd.o -obj-$(CONFIG_KEYBOARD_LKKBD) += lkkbd.o -obj-$(CONFIG_KEYBOARD_LM8323) += lm8323.o -obj-$(CONFIG_KEYBOARD_LOCOMO) += locomokbd.o -obj-$(CONFIG_KEYBOARD_MAPLE) += maple_keyb.o -obj-$(CONFIG_KEYBOARD_MATRIX) += matrix_keypad.o -obj-$(CONFIG_KEYBOARD_MAX7359) += max7359_keypad.o -obj-$(CONFIG_KEYBOARD_MCS) += mcs_touchkey.o -obj-$(CONFIG_KEYBOARD_MPR121) += mpr121_touchkey.o -obj-$(CONFIG_KEYBOARD_NEWTON) += newtonkbd.o -obj-$(CONFIG_KEYBOARD_NOMADIK) += nomadik-ske-keypad.o -obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o -obj-$(CONFIG_KEYBOARD_OMAP4) += omap4-keypad.o -obj-$(CONFIG_KEYBOARD_OPENCORES) += opencores-kbd.o -obj-$(CONFIG_KEYBOARD_PMIC8XXX) += pmic8xxx-keypad.o -obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keypad.o -obj-$(CONFIG_KEYBOARD_PXA930_ROTARY) += pxa930_rotary.o -obj-$(CONFIG_KEYBOARD_QT1070) += qt1070.o -obj-$(CONFIG_KEYBOARD_QT2160) += qt2160.o -obj-$(CONFIG_KEYBOARD_SAMSUNG) += samsung-keypad.o -obj-$(CONFIG_KEYBOARD_SH_KEYSC) += sh_keysc.o -obj-$(CONFIG_KEYBOARD_SPEAR) += spear-keyboard.o -obj-$(CONFIG_KEYBOARD_STMPE) += stmpe-keypad.o -obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o -obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o -obj-$(CONFIG_KEYBOARD_TC3589X) += tc3589x-keypad.o -obj-$(CONFIG_KEYBOARD_TEGRA) += tegra-kbc.o -obj-$(CONFIG_KEYBOARD_TNETV107X) += tnetv107x-keypad.o -obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o -obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o -obj-$(CONFIG_KEYBOARD_WMT) += wmt_kpad.o -obj-$(CONFIG_KEYBOARD_W90P910) += w90p910_keypad.o -obj-$(CONFIG_SARADC_WMT) += wmt_saradc.o diff --git a/ANDROID_3.4.5/drivers/input/keyboard/adp5520-keys.c b/ANDROID_3.4.5/drivers/input/keyboard/adp5520-keys.c deleted file mode 100644 index e9e8674d..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/adp5520-keys.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Keypad driver for Analog Devices ADP5520 MFD PMICs - * - * Copyright 2009 Analog Devices Inc. - * - * Licensed under the GPL-2 or later. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/input.h> -#include <linux/mfd/adp5520.h> -#include <linux/slab.h> - -struct adp5520_keys { - struct input_dev *input; - struct notifier_block notifier; - struct device *master; - unsigned short keycode[ADP5520_KEYMAPSIZE]; -}; - -static void adp5520_keys_report_event(struct adp5520_keys *dev, - unsigned short keymask, int value) -{ - int i; - - for (i = 0; i < ADP5520_MAXKEYS; i++) - if (keymask & (1 << i)) - input_report_key(dev->input, dev->keycode[i], value); - - input_sync(dev->input); -} - -static int adp5520_keys_notifier(struct notifier_block *nb, - unsigned long event, void *data) -{ - struct adp5520_keys *dev; - uint8_t reg_val_lo, reg_val_hi; - unsigned short keymask; - - dev = container_of(nb, struct adp5520_keys, notifier); - - if (event & ADP5520_KP_INT) { - adp5520_read(dev->master, ADP5520_KP_INT_STAT_1, ®_val_lo); - adp5520_read(dev->master, ADP5520_KP_INT_STAT_2, ®_val_hi); - - keymask = (reg_val_hi << 8) | reg_val_lo; - /* Read twice to clear */ - adp5520_read(dev->master, ADP5520_KP_INT_STAT_1, ®_val_lo); - adp5520_read(dev->master, ADP5520_KP_INT_STAT_2, ®_val_hi); - keymask |= (reg_val_hi << 8) | reg_val_lo; - adp5520_keys_report_event(dev, keymask, 1); - } - - if (event & ADP5520_KR_INT) { - adp5520_read(dev->master, ADP5520_KR_INT_STAT_1, ®_val_lo); - adp5520_read(dev->master, ADP5520_KR_INT_STAT_2, ®_val_hi); - - keymask = (reg_val_hi << 8) | reg_val_lo; - /* Read twice to clear */ - adp5520_read(dev->master, ADP5520_KR_INT_STAT_1, ®_val_lo); - adp5520_read(dev->master, ADP5520_KR_INT_STAT_2, ®_val_hi); - keymask |= (reg_val_hi << 8) | reg_val_lo; - adp5520_keys_report_event(dev, keymask, 0); - } - - return 0; -} - -static int __devinit adp5520_keys_probe(struct platform_device *pdev) -{ - struct adp5520_keys_platform_data *pdata = pdev->dev.platform_data; - struct input_dev *input; - struct adp5520_keys *dev; - int ret, i; - unsigned char en_mask, ctl_mask = 0; - - if (pdev->id != ID_ADP5520) { - dev_err(&pdev->dev, "only ADP5520 supports Keypad\n"); - return -EINVAL; - } - - if (pdata == NULL) { - dev_err(&pdev->dev, "missing platform data\n"); - return -EINVAL; - } - - if (!(pdata->rows_en_mask && pdata->cols_en_mask)) - return -EINVAL; - - dev = kzalloc(sizeof(*dev), GFP_KERNEL); - if (dev == NULL) { - dev_err(&pdev->dev, "failed to alloc memory\n"); - return -ENOMEM; - } - - input = input_allocate_device(); - if (!input) { - ret = -ENOMEM; - goto err; - } - - dev->master = pdev->dev.parent; - dev->input = input; - - input->name = pdev->name; - input->phys = "adp5520-keys/input0"; - input->dev.parent = &pdev->dev; - - input_set_drvdata(input, dev); - - input->id.bustype = BUS_I2C; - input->id.vendor = 0x0001; - input->id.product = 0x5520; - input->id.version = 0x0001; - - input->keycodesize = sizeof(dev->keycode[0]); - input->keycodemax = pdata->keymapsize; - input->keycode = dev->keycode; - - memcpy(dev->keycode, pdata->keymap, - pdata->keymapsize * input->keycodesize); - - /* setup input device */ - __set_bit(EV_KEY, input->evbit); - - if (pdata->repeat) - __set_bit(EV_REP, input->evbit); - - for (i = 0; i < input->keycodemax; i++) - __set_bit(dev->keycode[i], input->keybit); - __clear_bit(KEY_RESERVED, input->keybit); - - ret = input_register_device(input); - if (ret) { - dev_err(&pdev->dev, "unable to register input device\n"); - goto err; - } - - en_mask = pdata->rows_en_mask | pdata->cols_en_mask; - - ret = adp5520_set_bits(dev->master, ADP5520_GPIO_CFG_1, en_mask); - - if (en_mask & ADP5520_COL_C3) - ctl_mask |= ADP5520_C3_MODE; - - if (en_mask & ADP5520_ROW_R3) - ctl_mask |= ADP5520_R3_MODE; - - if (ctl_mask) - ret |= adp5520_set_bits(dev->master, ADP5520_LED_CONTROL, - ctl_mask); - - ret |= adp5520_set_bits(dev->master, ADP5520_GPIO_PULLUP, - pdata->rows_en_mask); - - if (ret) { - dev_err(&pdev->dev, "failed to write\n"); - ret = -EIO; - goto err1; - } - - dev->notifier.notifier_call = adp5520_keys_notifier; - ret = adp5520_register_notifier(dev->master, &dev->notifier, - ADP5520_KP_IEN | ADP5520_KR_IEN); - if (ret) { - dev_err(&pdev->dev, "failed to register notifier\n"); - goto err1; - } - - platform_set_drvdata(pdev, dev); - return 0; - -err1: - input_unregister_device(input); - input = NULL; -err: - input_free_device(input); - kfree(dev); - return ret; -} - -static int __devexit adp5520_keys_remove(struct platform_device *pdev) -{ - struct adp5520_keys *dev = platform_get_drvdata(pdev); - - adp5520_unregister_notifier(dev->master, &dev->notifier, - ADP5520_KP_IEN | ADP5520_KR_IEN); - - input_unregister_device(dev->input); - kfree(dev); - return 0; -} - -static struct platform_driver adp5520_keys_driver = { - .driver = { - .name = "adp5520-keys", - .owner = THIS_MODULE, - }, - .probe = adp5520_keys_probe, - .remove = __devexit_p(adp5520_keys_remove), -}; -module_platform_driver(adp5520_keys_driver); - -MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); -MODULE_DESCRIPTION("Keys ADP5520 Driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:adp5520-keys"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/adp5588-keys.c b/ANDROID_3.4.5/drivers/input/keyboard/adp5588-keys.c deleted file mode 100644 index 39ebffac..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/adp5588-keys.c +++ /dev/null @@ -1,660 +0,0 @@ -/* - * File: drivers/input/keyboard/adp5588_keys.c - * Description: keypad driver for ADP5588 and ADP5587 - * I2C QWERTY Keypad and IO Expander - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * Copyright (C) 2008-2010 Analog Devices Inc. - * Licensed under the GPL-2 or later. - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/workqueue.h> -#include <linux/errno.h> -#include <linux/pm.h> -#include <linux/platform_device.h> -#include <linux/input.h> -#include <linux/i2c.h> -#include <linux/gpio.h> -#include <linux/slab.h> - -#include <linux/i2c/adp5588.h> - -/* Key Event Register xy */ -#define KEY_EV_PRESSED (1 << 7) -#define KEY_EV_MASK (0x7F) - -#define KP_SEL(x) (0xFFFF >> (16 - x)) /* 2^x-1 */ - -#define KEYP_MAX_EVENT 10 - -/* - * Early pre 4.0 Silicon required to delay readout by at least 25ms, - * since the Event Counter Register updated 25ms after the interrupt - * asserted. - */ -#define WA_DELAYED_READOUT_REVID(rev) ((rev) < 4) - -struct adp5588_kpad { - struct i2c_client *client; - struct input_dev *input; - struct delayed_work work; - unsigned long delay; - unsigned short keycode[ADP5588_KEYMAPSIZE]; - const struct adp5588_gpi_map *gpimap; - unsigned short gpimapsize; -#ifdef CONFIG_GPIOLIB - unsigned char gpiomap[ADP5588_MAXGPIO]; - bool export_gpio; - struct gpio_chip gc; - struct mutex gpio_lock; /* Protect cached dir, dat_out */ - u8 dat_out[3]; - u8 dir[3]; -#endif -}; - -static int adp5588_read(struct i2c_client *client, u8 reg) -{ - int ret = i2c_smbus_read_byte_data(client, reg); - - if (ret < 0) - dev_err(&client->dev, "Read Error\n"); - - return ret; -} - -static int adp5588_write(struct i2c_client *client, u8 reg, u8 val) -{ - return i2c_smbus_write_byte_data(client, reg, val); -} - -#ifdef CONFIG_GPIOLIB -static int adp5588_gpio_get_value(struct gpio_chip *chip, unsigned off) -{ - struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); - unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); - unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); - - return !!(adp5588_read(kpad->client, GPIO_DAT_STAT1 + bank) & bit); -} - -static void adp5588_gpio_set_value(struct gpio_chip *chip, - unsigned off, int val) -{ - struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); - unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); - unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); - - mutex_lock(&kpad->gpio_lock); - - if (val) - kpad->dat_out[bank] |= bit; - else - kpad->dat_out[bank] &= ~bit; - - adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank, - kpad->dat_out[bank]); - - mutex_unlock(&kpad->gpio_lock); -} - -static int adp5588_gpio_direction_input(struct gpio_chip *chip, unsigned off) -{ - struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); - unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); - unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); - int ret; - - mutex_lock(&kpad->gpio_lock); - - kpad->dir[bank] &= ~bit; - ret = adp5588_write(kpad->client, GPIO_DIR1 + bank, kpad->dir[bank]); - - mutex_unlock(&kpad->gpio_lock); - - return ret; -} - -static int adp5588_gpio_direction_output(struct gpio_chip *chip, - unsigned off, int val) -{ - struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); - unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); - unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); - int ret; - - mutex_lock(&kpad->gpio_lock); - - kpad->dir[bank] |= bit; - - if (val) - kpad->dat_out[bank] |= bit; - else - kpad->dat_out[bank] &= ~bit; - - ret = adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank, - kpad->dat_out[bank]); - ret |= adp5588_write(kpad->client, GPIO_DIR1 + bank, - kpad->dir[bank]); - - mutex_unlock(&kpad->gpio_lock); - - return ret; -} - -static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad, - const struct adp5588_kpad_platform_data *pdata) -{ - bool pin_used[ADP5588_MAXGPIO]; - int n_unused = 0; - int i; - - memset(pin_used, 0, sizeof(pin_used)); - - for (i = 0; i < pdata->rows; i++) - pin_used[i] = true; - - for (i = 0; i < pdata->cols; i++) - pin_used[i + GPI_PIN_COL_BASE - GPI_PIN_BASE] = true; - - for (i = 0; i < kpad->gpimapsize; i++) - pin_used[kpad->gpimap[i].pin - GPI_PIN_BASE] = true; - - for (i = 0; i < ADP5588_MAXGPIO; i++) - if (!pin_used[i]) - kpad->gpiomap[n_unused++] = i; - - return n_unused; -} - -static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad) -{ - struct device *dev = &kpad->client->dev; - const struct adp5588_kpad_platform_data *pdata = dev->platform_data; - const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data; - int i, error; - - if (!gpio_data) - return 0; - - kpad->gc.ngpio = adp5588_build_gpiomap(kpad, pdata); - if (kpad->gc.ngpio == 0) { - dev_info(dev, "No unused gpios left to export\n"); - return 0; - } - - kpad->export_gpio = true; - - kpad->gc.direction_input = adp5588_gpio_direction_input; - kpad->gc.direction_output = adp5588_gpio_direction_output; - kpad->gc.get = adp5588_gpio_get_value; - kpad->gc.set = adp5588_gpio_set_value; - kpad->gc.can_sleep = 1; - - kpad->gc.base = gpio_data->gpio_start; - kpad->gc.label = kpad->client->name; - kpad->gc.owner = THIS_MODULE; - - mutex_init(&kpad->gpio_lock); - - error = gpiochip_add(&kpad->gc); - if (error) { - dev_err(dev, "gpiochip_add failed, err: %d\n", error); - return error; - } - - for (i = 0; i <= ADP5588_BANK(ADP5588_MAXGPIO); i++) { - kpad->dat_out[i] = adp5588_read(kpad->client, - GPIO_DAT_OUT1 + i); - kpad->dir[i] = adp5588_read(kpad->client, GPIO_DIR1 + i); - } - - if (gpio_data->setup) { - error = gpio_data->setup(kpad->client, - kpad->gc.base, kpad->gc.ngpio, - gpio_data->context); - if (error) - dev_warn(dev, "setup failed, %d\n", error); - } - - return 0; -} - -static void __devexit adp5588_gpio_remove(struct adp5588_kpad *kpad) -{ - struct device *dev = &kpad->client->dev; - const struct adp5588_kpad_platform_data *pdata = dev->platform_data; - const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data; - int error; - - if (!kpad->export_gpio) - return; - - if (gpio_data->teardown) { - error = gpio_data->teardown(kpad->client, - kpad->gc.base, kpad->gc.ngpio, - gpio_data->context); - if (error) - dev_warn(dev, "teardown failed %d\n", error); - } - - error = gpiochip_remove(&kpad->gc); - if (error) - dev_warn(dev, "gpiochip_remove failed %d\n", error); -} -#else -static inline int adp5588_gpio_add(struct adp5588_kpad *kpad) -{ - return 0; -} - -static inline void adp5588_gpio_remove(struct adp5588_kpad *kpad) -{ -} -#endif - -static void adp5588_report_events(struct adp5588_kpad *kpad, int ev_cnt) -{ - int i, j; - - for (i = 0; i < ev_cnt; i++) { - int key = adp5588_read(kpad->client, Key_EVENTA + i); - int key_val = key & KEY_EV_MASK; - - if (key_val >= GPI_PIN_BASE && key_val <= GPI_PIN_END) { - for (j = 0; j < kpad->gpimapsize; j++) { - if (key_val == kpad->gpimap[j].pin) { - input_report_switch(kpad->input, - kpad->gpimap[j].sw_evt, - key & KEY_EV_PRESSED); - break; - } - } - } else { - input_report_key(kpad->input, - kpad->keycode[key_val - 1], - key & KEY_EV_PRESSED); - } - } -} - -static void adp5588_work(struct work_struct *work) -{ - struct adp5588_kpad *kpad = container_of(work, - struct adp5588_kpad, work.work); - struct i2c_client *client = kpad->client; - int status, ev_cnt; - - status = adp5588_read(client, INT_STAT); - - if (status & ADP5588_OVR_FLOW_INT) /* Unlikely and should never happen */ - dev_err(&client->dev, "Event Overflow Error\n"); - - if (status & ADP5588_KE_INT) { - ev_cnt = adp5588_read(client, KEY_LCK_EC_STAT) & ADP5588_KEC; - if (ev_cnt) { - adp5588_report_events(kpad, ev_cnt); - input_sync(kpad->input); - } - } - adp5588_write(client, INT_STAT, status); /* Status is W1C */ -} - -static irqreturn_t adp5588_irq(int irq, void *handle) -{ - struct adp5588_kpad *kpad = handle; - - /* - * use keventd context to read the event fifo registers - * Schedule readout at least 25ms after notification for - * REVID < 4 - */ - - schedule_delayed_work(&kpad->work, kpad->delay); - - return IRQ_HANDLED; -} - -static int __devinit adp5588_setup(struct i2c_client *client) -{ - const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data; - const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data; - int i, ret; - unsigned char evt_mode1 = 0, evt_mode2 = 0, evt_mode3 = 0; - - ret = adp5588_write(client, KP_GPIO1, KP_SEL(pdata->rows)); - ret |= adp5588_write(client, KP_GPIO2, KP_SEL(pdata->cols) & 0xFF); - ret |= adp5588_write(client, KP_GPIO3, KP_SEL(pdata->cols) >> 8); - - if (pdata->en_keylock) { - ret |= adp5588_write(client, UNLOCK1, pdata->unlock_key1); - ret |= adp5588_write(client, UNLOCK2, pdata->unlock_key2); - ret |= adp5588_write(client, KEY_LCK_EC_STAT, ADP5588_K_LCK_EN); - } - - for (i = 0; i < KEYP_MAX_EVENT; i++) - ret |= adp5588_read(client, Key_EVENTA); - - for (i = 0; i < pdata->gpimapsize; i++) { - unsigned short pin = pdata->gpimap[i].pin; - - if (pin <= GPI_PIN_ROW_END) { - evt_mode1 |= (1 << (pin - GPI_PIN_ROW_BASE)); - } else { - evt_mode2 |= ((1 << (pin - GPI_PIN_COL_BASE)) & 0xFF); - evt_mode3 |= ((1 << (pin - GPI_PIN_COL_BASE)) >> 8); - } - } - - if (pdata->gpimapsize) { - ret |= adp5588_write(client, GPI_EM1, evt_mode1); - ret |= adp5588_write(client, GPI_EM2, evt_mode2); - ret |= adp5588_write(client, GPI_EM3, evt_mode3); - } - - if (gpio_data) { - for (i = 0; i <= ADP5588_BANK(ADP5588_MAXGPIO); i++) { - int pull_mask = gpio_data->pullup_dis_mask; - - ret |= adp5588_write(client, GPIO_PULL1 + i, - (pull_mask >> (8 * i)) & 0xFF); - } - } - - ret |= adp5588_write(client, INT_STAT, - ADP5588_CMP2_INT | ADP5588_CMP1_INT | - ADP5588_OVR_FLOW_INT | ADP5588_K_LCK_INT | - ADP5588_GPI_INT | ADP5588_KE_INT); /* Status is W1C */ - - ret |= adp5588_write(client, CFG, ADP5588_INT_CFG | - ADP5588_OVR_FLOW_IEN | - ADP5588_KE_IEN); - - if (ret < 0) { - dev_err(&client->dev, "Write Error\n"); - return ret; - } - - return 0; -} - -static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad) -{ - int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1); - int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2); - int gpi_stat3 = adp5588_read(kpad->client, GPIO_DAT_STAT3); - int gpi_stat_tmp, pin_loc; - int i; - - for (i = 0; i < kpad->gpimapsize; i++) { - unsigned short pin = kpad->gpimap[i].pin; - - if (pin <= GPI_PIN_ROW_END) { - gpi_stat_tmp = gpi_stat1; - pin_loc = pin - GPI_PIN_ROW_BASE; - } else if ((pin - GPI_PIN_COL_BASE) < 8) { - gpi_stat_tmp = gpi_stat2; - pin_loc = pin - GPI_PIN_COL_BASE; - } else { - gpi_stat_tmp = gpi_stat3; - pin_loc = pin - GPI_PIN_COL_BASE - 8; - } - - if (gpi_stat_tmp < 0) { - dev_err(&kpad->client->dev, - "Can't read GPIO_DAT_STAT switch %d default to OFF\n", - pin); - gpi_stat_tmp = 0; - } - - input_report_switch(kpad->input, - kpad->gpimap[i].sw_evt, - !(gpi_stat_tmp & (1 << pin_loc))); - } - - input_sync(kpad->input); -} - - -static int __devinit adp5588_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct adp5588_kpad *kpad; - const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data; - struct input_dev *input; - unsigned int revid; - int ret, i; - int error; - - if (!i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_BYTE_DATA)) { - dev_err(&client->dev, "SMBUS Byte Data not Supported\n"); - return -EIO; - } - - if (!pdata) { - dev_err(&client->dev, "no platform data?\n"); - return -EINVAL; - } - - if (!pdata->rows || !pdata->cols || !pdata->keymap) { - dev_err(&client->dev, "no rows, cols or keymap from pdata\n"); - return -EINVAL; - } - - if (pdata->keymapsize != ADP5588_KEYMAPSIZE) { - dev_err(&client->dev, "invalid keymapsize\n"); - return -EINVAL; - } - - if (!pdata->gpimap && pdata->gpimapsize) { - dev_err(&client->dev, "invalid gpimap from pdata\n"); - return -EINVAL; - } - - if (pdata->gpimapsize > ADP5588_GPIMAPSIZE_MAX) { - dev_err(&client->dev, "invalid gpimapsize\n"); - return -EINVAL; - } - - for (i = 0; i < pdata->gpimapsize; i++) { - unsigned short pin = pdata->gpimap[i].pin; - - if (pin < GPI_PIN_BASE || pin > GPI_PIN_END) { - dev_err(&client->dev, "invalid gpi pin data\n"); - return -EINVAL; - } - - if (pin <= GPI_PIN_ROW_END) { - if (pin - GPI_PIN_ROW_BASE + 1 <= pdata->rows) { - dev_err(&client->dev, "invalid gpi row data\n"); - return -EINVAL; - } - } else { - if (pin - GPI_PIN_COL_BASE + 1 <= pdata->cols) { - dev_err(&client->dev, "invalid gpi col data\n"); - return -EINVAL; - } - } - } - - if (!client->irq) { - dev_err(&client->dev, "no IRQ?\n"); - return -EINVAL; - } - - kpad = kzalloc(sizeof(*kpad), GFP_KERNEL); - input = input_allocate_device(); - if (!kpad || !input) { - error = -ENOMEM; - goto err_free_mem; - } - - kpad->client = client; - kpad->input = input; - INIT_DELAYED_WORK(&kpad->work, adp5588_work); - - ret = adp5588_read(client, DEV_ID); - if (ret < 0) { - error = ret; - goto err_free_mem; - } - - revid = (u8) ret & ADP5588_DEVICE_ID_MASK; - if (WA_DELAYED_READOUT_REVID(revid)) - kpad->delay = msecs_to_jiffies(30); - - input->name = client->name; - input->phys = "adp5588-keys/input0"; - input->dev.parent = &client->dev; - - input_set_drvdata(input, kpad); - - input->id.bustype = BUS_I2C; - input->id.vendor = 0x0001; - input->id.product = 0x0001; - input->id.version = revid; - - input->keycodesize = sizeof(kpad->keycode[0]); - input->keycodemax = pdata->keymapsize; - input->keycode = kpad->keycode; - - memcpy(kpad->keycode, pdata->keymap, - pdata->keymapsize * input->keycodesize); - - kpad->gpimap = pdata->gpimap; - kpad->gpimapsize = pdata->gpimapsize; - - /* setup input device */ - __set_bit(EV_KEY, input->evbit); - - if (pdata->repeat) - __set_bit(EV_REP, input->evbit); - - for (i = 0; i < input->keycodemax; i++) - __set_bit(kpad->keycode[i] & KEY_MAX, input->keybit); - __clear_bit(KEY_RESERVED, input->keybit); - - if (kpad->gpimapsize) - __set_bit(EV_SW, input->evbit); - for (i = 0; i < kpad->gpimapsize; i++) - __set_bit(kpad->gpimap[i].sw_evt, input->swbit); - - error = input_register_device(input); - if (error) { - dev_err(&client->dev, "unable to register input device\n"); - goto err_free_mem; - } - - error = request_irq(client->irq, adp5588_irq, - IRQF_TRIGGER_FALLING, - client->dev.driver->name, kpad); - if (error) { - dev_err(&client->dev, "irq %d busy?\n", client->irq); - goto err_unreg_dev; - } - - error = adp5588_setup(client); - if (error) - goto err_free_irq; - - if (kpad->gpimapsize) - adp5588_report_switch_state(kpad); - - error = adp5588_gpio_add(kpad); - if (error) - goto err_free_irq; - - device_init_wakeup(&client->dev, 1); - i2c_set_clientdata(client, kpad); - - dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq); - return 0; - - err_free_irq: - free_irq(client->irq, kpad); - err_unreg_dev: - input_unregister_device(input); - input = NULL; - err_free_mem: - input_free_device(input); - kfree(kpad); - - return error; -} - -static int __devexit adp5588_remove(struct i2c_client *client) -{ - struct adp5588_kpad *kpad = i2c_get_clientdata(client); - - adp5588_write(client, CFG, 0); - free_irq(client->irq, kpad); - cancel_delayed_work_sync(&kpad->work); - input_unregister_device(kpad->input); - adp5588_gpio_remove(kpad); - kfree(kpad); - - return 0; -} - -#ifdef CONFIG_PM -static int adp5588_suspend(struct device *dev) -{ - struct adp5588_kpad *kpad = dev_get_drvdata(dev); - struct i2c_client *client = kpad->client; - - disable_irq(client->irq); - cancel_delayed_work_sync(&kpad->work); - - if (device_may_wakeup(&client->dev)) - enable_irq_wake(client->irq); - - return 0; -} - -static int adp5588_resume(struct device *dev) -{ - struct adp5588_kpad *kpad = dev_get_drvdata(dev); - struct i2c_client *client = kpad->client; - - if (device_may_wakeup(&client->dev)) - disable_irq_wake(client->irq); - - enable_irq(client->irq); - - return 0; -} - -static const struct dev_pm_ops adp5588_dev_pm_ops = { - .suspend = adp5588_suspend, - .resume = adp5588_resume, -}; -#endif - -static const struct i2c_device_id adp5588_id[] = { - { "adp5588-keys", 0 }, - { "adp5587-keys", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, adp5588_id); - -static struct i2c_driver adp5588_driver = { - .driver = { - .name = KBUILD_MODNAME, -#ifdef CONFIG_PM - .pm = &adp5588_dev_pm_ops, -#endif - }, - .probe = adp5588_probe, - .remove = __devexit_p(adp5588_remove), - .id_table = adp5588_id, -}; - -module_i2c_driver(adp5588_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); -MODULE_DESCRIPTION("ADP5588/87 Keypad driver"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/adp5589-keys.c b/ANDROID_3.4.5/drivers/input/keyboard/adp5589-keys.c deleted file mode 100644 index 74e60321..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/adp5589-keys.c +++ /dev/null @@ -1,1115 +0,0 @@ -/* - * Description: keypad driver for ADP5589, ADP5585 - * I2C QWERTY Keypad and IO Expander - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * Copyright (C) 2010-2011 Analog Devices Inc. - * Licensed under the GPL-2. - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/workqueue.h> -#include <linux/errno.h> -#include <linux/pm.h> -#include <linux/platform_device.h> -#include <linux/input.h> -#include <linux/i2c.h> -#include <linux/gpio.h> -#include <linux/slab.h> - -#include <linux/input/adp5589.h> - -/* ADP5589/ADP5585 Common Registers */ -#define ADP5589_5_ID 0x00 -#define ADP5589_5_INT_STATUS 0x01 -#define ADP5589_5_STATUS 0x02 -#define ADP5589_5_FIFO_1 0x03 -#define ADP5589_5_FIFO_2 0x04 -#define ADP5589_5_FIFO_3 0x05 -#define ADP5589_5_FIFO_4 0x06 -#define ADP5589_5_FIFO_5 0x07 -#define ADP5589_5_FIFO_6 0x08 -#define ADP5589_5_FIFO_7 0x09 -#define ADP5589_5_FIFO_8 0x0A -#define ADP5589_5_FIFO_9 0x0B -#define ADP5589_5_FIFO_10 0x0C -#define ADP5589_5_FIFO_11 0x0D -#define ADP5589_5_FIFO_12 0x0E -#define ADP5589_5_FIFO_13 0x0F -#define ADP5589_5_FIFO_14 0x10 -#define ADP5589_5_FIFO_15 0x11 -#define ADP5589_5_FIFO_16 0x12 -#define ADP5589_5_GPI_INT_STAT_A 0x13 -#define ADP5589_5_GPI_INT_STAT_B 0x14 - -/* ADP5589 Registers */ -#define ADP5589_GPI_INT_STAT_C 0x15 -#define ADP5589_GPI_STATUS_A 0x16 -#define ADP5589_GPI_STATUS_B 0x17 -#define ADP5589_GPI_STATUS_C 0x18 -#define ADP5589_RPULL_CONFIG_A 0x19 -#define ADP5589_RPULL_CONFIG_B 0x1A -#define ADP5589_RPULL_CONFIG_C 0x1B -#define ADP5589_RPULL_CONFIG_D 0x1C -#define ADP5589_RPULL_CONFIG_E 0x1D -#define ADP5589_GPI_INT_LEVEL_A 0x1E -#define ADP5589_GPI_INT_LEVEL_B 0x1F -#define ADP5589_GPI_INT_LEVEL_C 0x20 -#define ADP5589_GPI_EVENT_EN_A 0x21 -#define ADP5589_GPI_EVENT_EN_B 0x22 -#define ADP5589_GPI_EVENT_EN_C 0x23 -#define ADP5589_GPI_INTERRUPT_EN_A 0x24 -#define ADP5589_GPI_INTERRUPT_EN_B 0x25 -#define ADP5589_GPI_INTERRUPT_EN_C 0x26 -#define ADP5589_DEBOUNCE_DIS_A 0x27 -#define ADP5589_DEBOUNCE_DIS_B 0x28 -#define ADP5589_DEBOUNCE_DIS_C 0x29 -#define ADP5589_GPO_DATA_OUT_A 0x2A -#define ADP5589_GPO_DATA_OUT_B 0x2B -#define ADP5589_GPO_DATA_OUT_C 0x2C -#define ADP5589_GPO_OUT_MODE_A 0x2D -#define ADP5589_GPO_OUT_MODE_B 0x2E -#define ADP5589_GPO_OUT_MODE_C 0x2F -#define ADP5589_GPIO_DIRECTION_A 0x30 -#define ADP5589_GPIO_DIRECTION_B 0x31 -#define ADP5589_GPIO_DIRECTION_C 0x32 -#define ADP5589_UNLOCK1 0x33 -#define ADP5589_UNLOCK2 0x34 -#define ADP5589_EXT_LOCK_EVENT 0x35 -#define ADP5589_UNLOCK_TIMERS 0x36 -#define ADP5589_LOCK_CFG 0x37 -#define ADP5589_RESET1_EVENT_A 0x38 -#define ADP5589_RESET1_EVENT_B 0x39 -#define ADP5589_RESET1_EVENT_C 0x3A -#define ADP5589_RESET2_EVENT_A 0x3B -#define ADP5589_RESET2_EVENT_B 0x3C -#define ADP5589_RESET_CFG 0x3D -#define ADP5589_PWM_OFFT_LOW 0x3E -#define ADP5589_PWM_OFFT_HIGH 0x3F -#define ADP5589_PWM_ONT_LOW 0x40 -#define ADP5589_PWM_ONT_HIGH 0x41 -#define ADP5589_PWM_CFG 0x42 -#define ADP5589_CLOCK_DIV_CFG 0x43 -#define ADP5589_LOGIC_1_CFG 0x44 -#define ADP5589_LOGIC_2_CFG 0x45 -#define ADP5589_LOGIC_FF_CFG 0x46 -#define ADP5589_LOGIC_INT_EVENT_EN 0x47 -#define ADP5589_POLL_PTIME_CFG 0x48 -#define ADP5589_PIN_CONFIG_A 0x49 -#define ADP5589_PIN_CONFIG_B 0x4A -#define ADP5589_PIN_CONFIG_C 0x4B -#define ADP5589_PIN_CONFIG_D 0x4C -#define ADP5589_GENERAL_CFG 0x4D -#define ADP5589_INT_EN 0x4E - -/* ADP5585 Registers */ -#define ADP5585_GPI_STATUS_A 0x15 -#define ADP5585_GPI_STATUS_B 0x16 -#define ADP5585_RPULL_CONFIG_A 0x17 -#define ADP5585_RPULL_CONFIG_B 0x18 -#define ADP5585_RPULL_CONFIG_C 0x19 -#define ADP5585_RPULL_CONFIG_D 0x1A -#define ADP5585_GPI_INT_LEVEL_A 0x1B -#define ADP5585_GPI_INT_LEVEL_B 0x1C -#define ADP5585_GPI_EVENT_EN_A 0x1D -#define ADP5585_GPI_EVENT_EN_B 0x1E -#define ADP5585_GPI_INTERRUPT_EN_A 0x1F -#define ADP5585_GPI_INTERRUPT_EN_B 0x20 -#define ADP5585_DEBOUNCE_DIS_A 0x21 -#define ADP5585_DEBOUNCE_DIS_B 0x22 -#define ADP5585_GPO_DATA_OUT_A 0x23 -#define ADP5585_GPO_DATA_OUT_B 0x24 -#define ADP5585_GPO_OUT_MODE_A 0x25 -#define ADP5585_GPO_OUT_MODE_B 0x26 -#define ADP5585_GPIO_DIRECTION_A 0x27 -#define ADP5585_GPIO_DIRECTION_B 0x28 -#define ADP5585_RESET1_EVENT_A 0x29 -#define ADP5585_RESET1_EVENT_B 0x2A -#define ADP5585_RESET1_EVENT_C 0x2B -#define ADP5585_RESET2_EVENT_A 0x2C -#define ADP5585_RESET2_EVENT_B 0x2D -#define ADP5585_RESET_CFG 0x2E -#define ADP5585_PWM_OFFT_LOW 0x2F -#define ADP5585_PWM_OFFT_HIGH 0x30 -#define ADP5585_PWM_ONT_LOW 0x31 -#define ADP5585_PWM_ONT_HIGH 0x32 -#define ADP5585_PWM_CFG 0x33 -#define ADP5585_LOGIC_CFG 0x34 -#define ADP5585_LOGIC_FF_CFG 0x35 -#define ADP5585_LOGIC_INT_EVENT_EN 0x36 -#define ADP5585_POLL_PTIME_CFG 0x37 -#define ADP5585_PIN_CONFIG_A 0x38 -#define ADP5585_PIN_CONFIG_B 0x39 -#define ADP5585_PIN_CONFIG_D 0x3A -#define ADP5585_GENERAL_CFG 0x3B -#define ADP5585_INT_EN 0x3C - -/* ID Register */ -#define ADP5589_5_DEVICE_ID_MASK 0xF -#define ADP5589_5_MAN_ID_MASK 0xF -#define ADP5589_5_MAN_ID_SHIFT 4 -#define ADP5589_5_MAN_ID 0x02 - -/* GENERAL_CFG Register */ -#define OSC_EN (1 << 7) -#define CORE_CLK(x) (((x) & 0x3) << 5) -#define LCK_TRK_LOGIC (1 << 4) /* ADP5589 only */ -#define LCK_TRK_GPI (1 << 3) /* ADP5589 only */ -#define INT_CFG (1 << 1) -#define RST_CFG (1 << 0) - -/* INT_EN Register */ -#define LOGIC2_IEN (1 << 5) /* ADP5589 only */ -#define LOGIC1_IEN (1 << 4) -#define LOCK_IEN (1 << 3) /* ADP5589 only */ -#define OVRFLOW_IEN (1 << 2) -#define GPI_IEN (1 << 1) -#define EVENT_IEN (1 << 0) - -/* Interrupt Status Register */ -#define LOGIC2_INT (1 << 5) /* ADP5589 only */ -#define LOGIC1_INT (1 << 4) -#define LOCK_INT (1 << 3) /* ADP5589 only */ -#define OVRFLOW_INT (1 << 2) -#define GPI_INT (1 << 1) -#define EVENT_INT (1 << 0) - -/* STATUS Register */ -#define LOGIC2_STAT (1 << 7) /* ADP5589 only */ -#define LOGIC1_STAT (1 << 6) -#define LOCK_STAT (1 << 5) /* ADP5589 only */ -#define KEC 0xF - -/* PIN_CONFIG_D Register */ -#define C4_EXTEND_CFG (1 << 6) /* RESET2 */ -#define R4_EXTEND_CFG (1 << 5) /* RESET1 */ - -/* LOCK_CFG */ -#define LOCK_EN (1 << 0) - -#define PTIME_MASK 0x3 -#define LTIME_MASK 0x3 /* ADP5589 only */ - -/* Key Event Register xy */ -#define KEY_EV_PRESSED (1 << 7) -#define KEY_EV_MASK (0x7F) - -#define KEYP_MAX_EVENT 16 -#define ADP5589_MAXGPIO 19 -#define ADP5585_MAXGPIO 11 /* 10 on the ADP5585-01, 11 on ADP5585-02 */ - -enum { - ADP5589, - ADP5585_01, - ADP5585_02 -}; - -struct adp_constants { - u8 maxgpio; - u8 keymapsize; - u8 gpi_pin_row_base; - u8 gpi_pin_row_end; - u8 gpi_pin_col_base; - u8 gpi_pin_base; - u8 gpi_pin_end; - u8 gpimapsize_max; - u8 max_row_num; - u8 max_col_num; - u8 row_mask; - u8 col_mask; - u8 col_shift; - u8 c4_extend_cfg; - u8 (*bank) (u8 offset); - u8 (*bit) (u8 offset); - u8 (*reg) (u8 reg); -}; - -struct adp5589_kpad { - struct i2c_client *client; - struct input_dev *input; - const struct adp_constants *var; - unsigned short keycode[ADP5589_KEYMAPSIZE]; - const struct adp5589_gpi_map *gpimap; - unsigned short gpimapsize; - unsigned extend_cfg; - bool is_adp5585; - bool adp5585_support_row5; -#ifdef CONFIG_GPIOLIB - unsigned char gpiomap[ADP5589_MAXGPIO]; - bool export_gpio; - struct gpio_chip gc; - struct mutex gpio_lock; /* Protect cached dir, dat_out */ - u8 dat_out[3]; - u8 dir[3]; -#endif -}; - -/* - * ADP5589 / ADP5585 derivative / variant handling - */ - - -/* ADP5589 */ - -static unsigned char adp5589_bank(unsigned char offset) -{ - return offset >> 3; -} - -static unsigned char adp5589_bit(unsigned char offset) -{ - return 1u << (offset & 0x7); -} - -static unsigned char adp5589_reg(unsigned char reg) -{ - return reg; -} - -static const struct adp_constants const_adp5589 = { - .maxgpio = ADP5589_MAXGPIO, - .keymapsize = ADP5589_KEYMAPSIZE, - .gpi_pin_row_base = ADP5589_GPI_PIN_ROW_BASE, - .gpi_pin_row_end = ADP5589_GPI_PIN_ROW_END, - .gpi_pin_col_base = ADP5589_GPI_PIN_COL_BASE, - .gpi_pin_base = ADP5589_GPI_PIN_BASE, - .gpi_pin_end = ADP5589_GPI_PIN_END, - .gpimapsize_max = ADP5589_GPIMAPSIZE_MAX, - .c4_extend_cfg = 12, - .max_row_num = ADP5589_MAX_ROW_NUM, - .max_col_num = ADP5589_MAX_COL_NUM, - .row_mask = ADP5589_ROW_MASK, - .col_mask = ADP5589_COL_MASK, - .col_shift = ADP5589_COL_SHIFT, - .bank = adp5589_bank, - .bit = adp5589_bit, - .reg = adp5589_reg, -}; - -/* ADP5585 */ - -static unsigned char adp5585_bank(unsigned char offset) -{ - return offset > ADP5585_MAX_ROW_NUM; -} - -static unsigned char adp5585_bit(unsigned char offset) -{ - return (offset > ADP5585_MAX_ROW_NUM) ? - 1u << (offset - ADP5585_COL_SHIFT) : 1u << offset; -} - -static const unsigned char adp5585_reg_lut[] = { - [ADP5589_GPI_STATUS_A] = ADP5585_GPI_STATUS_A, - [ADP5589_GPI_STATUS_B] = ADP5585_GPI_STATUS_B, - [ADP5589_RPULL_CONFIG_A] = ADP5585_RPULL_CONFIG_A, - [ADP5589_RPULL_CONFIG_B] = ADP5585_RPULL_CONFIG_B, - [ADP5589_RPULL_CONFIG_C] = ADP5585_RPULL_CONFIG_C, - [ADP5589_RPULL_CONFIG_D] = ADP5585_RPULL_CONFIG_D, - [ADP5589_GPI_INT_LEVEL_A] = ADP5585_GPI_INT_LEVEL_A, - [ADP5589_GPI_INT_LEVEL_B] = ADP5585_GPI_INT_LEVEL_B, - [ADP5589_GPI_EVENT_EN_A] = ADP5585_GPI_EVENT_EN_A, - [ADP5589_GPI_EVENT_EN_B] = ADP5585_GPI_EVENT_EN_B, - [ADP5589_GPI_INTERRUPT_EN_A] = ADP5585_GPI_INTERRUPT_EN_A, - [ADP5589_GPI_INTERRUPT_EN_B] = ADP5585_GPI_INTERRUPT_EN_B, - [ADP5589_DEBOUNCE_DIS_A] = ADP5585_DEBOUNCE_DIS_A, - [ADP5589_DEBOUNCE_DIS_B] = ADP5585_DEBOUNCE_DIS_B, - [ADP5589_GPO_DATA_OUT_A] = ADP5585_GPO_DATA_OUT_A, - [ADP5589_GPO_DATA_OUT_B] = ADP5585_GPO_DATA_OUT_B, - [ADP5589_GPO_OUT_MODE_A] = ADP5585_GPO_OUT_MODE_A, - [ADP5589_GPO_OUT_MODE_B] = ADP5585_GPO_OUT_MODE_B, - [ADP5589_GPIO_DIRECTION_A] = ADP5585_GPIO_DIRECTION_A, - [ADP5589_GPIO_DIRECTION_B] = ADP5585_GPIO_DIRECTION_B, - [ADP5589_RESET1_EVENT_A] = ADP5585_RESET1_EVENT_A, - [ADP5589_RESET1_EVENT_B] = ADP5585_RESET1_EVENT_B, - [ADP5589_RESET1_EVENT_C] = ADP5585_RESET1_EVENT_C, - [ADP5589_RESET2_EVENT_A] = ADP5585_RESET2_EVENT_A, - [ADP5589_RESET2_EVENT_B] = ADP5585_RESET2_EVENT_B, - [ADP5589_RESET_CFG] = ADP5585_RESET_CFG, - [ADP5589_PWM_OFFT_LOW] = ADP5585_PWM_OFFT_LOW, - [ADP5589_PWM_OFFT_HIGH] = ADP5585_PWM_OFFT_HIGH, - [ADP5589_PWM_ONT_LOW] = ADP5585_PWM_ONT_LOW, - [ADP5589_PWM_ONT_HIGH] = ADP5585_PWM_ONT_HIGH, - [ADP5589_PWM_CFG] = ADP5585_PWM_CFG, - [ADP5589_LOGIC_1_CFG] = ADP5585_LOGIC_CFG, - [ADP5589_LOGIC_FF_CFG] = ADP5585_LOGIC_FF_CFG, - [ADP5589_LOGIC_INT_EVENT_EN] = ADP5585_LOGIC_INT_EVENT_EN, - [ADP5589_POLL_PTIME_CFG] = ADP5585_POLL_PTIME_CFG, - [ADP5589_PIN_CONFIG_A] = ADP5585_PIN_CONFIG_A, - [ADP5589_PIN_CONFIG_B] = ADP5585_PIN_CONFIG_B, - [ADP5589_PIN_CONFIG_D] = ADP5585_PIN_CONFIG_D, - [ADP5589_GENERAL_CFG] = ADP5585_GENERAL_CFG, - [ADP5589_INT_EN] = ADP5585_INT_EN, -}; - -static unsigned char adp5585_reg(unsigned char reg) -{ - return adp5585_reg_lut[reg]; -} - -static const struct adp_constants const_adp5585 = { - .maxgpio = ADP5585_MAXGPIO, - .keymapsize = ADP5585_KEYMAPSIZE, - .gpi_pin_row_base = ADP5585_GPI_PIN_ROW_BASE, - .gpi_pin_row_end = ADP5585_GPI_PIN_ROW_END, - .gpi_pin_col_base = ADP5585_GPI_PIN_COL_BASE, - .gpi_pin_base = ADP5585_GPI_PIN_BASE, - .gpi_pin_end = ADP5585_GPI_PIN_END, - .gpimapsize_max = ADP5585_GPIMAPSIZE_MAX, - .c4_extend_cfg = 10, - .max_row_num = ADP5585_MAX_ROW_NUM, - .max_col_num = ADP5585_MAX_COL_NUM, - .row_mask = ADP5585_ROW_MASK, - .col_mask = ADP5585_COL_MASK, - .col_shift = ADP5585_COL_SHIFT, - .bank = adp5585_bank, - .bit = adp5585_bit, - .reg = adp5585_reg, -}; - -static int adp5589_read(struct i2c_client *client, u8 reg) -{ - int ret = i2c_smbus_read_byte_data(client, reg); - - if (ret < 0) - dev_err(&client->dev, "Read Error\n"); - - return ret; -} - -static int adp5589_write(struct i2c_client *client, u8 reg, u8 val) -{ - return i2c_smbus_write_byte_data(client, reg, val); -} - -#ifdef CONFIG_GPIOLIB -static int adp5589_gpio_get_value(struct gpio_chip *chip, unsigned off) -{ - struct adp5589_kpad *kpad = container_of(chip, struct adp5589_kpad, gc); - unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); - unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); - - return !!(adp5589_read(kpad->client, - kpad->var->reg(ADP5589_GPI_STATUS_A) + bank) & - bit); -} - -static void adp5589_gpio_set_value(struct gpio_chip *chip, - unsigned off, int val) -{ - struct adp5589_kpad *kpad = container_of(chip, struct adp5589_kpad, gc); - unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); - unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); - - mutex_lock(&kpad->gpio_lock); - - if (val) - kpad->dat_out[bank] |= bit; - else - kpad->dat_out[bank] &= ~bit; - - adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A) + - bank, kpad->dat_out[bank]); - - mutex_unlock(&kpad->gpio_lock); -} - -static int adp5589_gpio_direction_input(struct gpio_chip *chip, unsigned off) -{ - struct adp5589_kpad *kpad = container_of(chip, struct adp5589_kpad, gc); - unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); - unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); - int ret; - - mutex_lock(&kpad->gpio_lock); - - kpad->dir[bank] &= ~bit; - ret = adp5589_write(kpad->client, - kpad->var->reg(ADP5589_GPIO_DIRECTION_A) + bank, - kpad->dir[bank]); - - mutex_unlock(&kpad->gpio_lock); - - return ret; -} - -static int adp5589_gpio_direction_output(struct gpio_chip *chip, - unsigned off, int val) -{ - struct adp5589_kpad *kpad = container_of(chip, struct adp5589_kpad, gc); - unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); - unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); - int ret; - - mutex_lock(&kpad->gpio_lock); - - kpad->dir[bank] |= bit; - - if (val) - kpad->dat_out[bank] |= bit; - else - kpad->dat_out[bank] &= ~bit; - - ret = adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A) - + bank, kpad->dat_out[bank]); - ret |= adp5589_write(kpad->client, - kpad->var->reg(ADP5589_GPIO_DIRECTION_A) + bank, - kpad->dir[bank]); - - mutex_unlock(&kpad->gpio_lock); - - return ret; -} - -static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad, - const struct adp5589_kpad_platform_data *pdata) -{ - bool pin_used[ADP5589_MAXGPIO]; - int n_unused = 0; - int i; - - memset(pin_used, false, sizeof(pin_used)); - - for (i = 0; i < kpad->var->maxgpio; i++) - if (pdata->keypad_en_mask & (1 << i)) - pin_used[i] = true; - - for (i = 0; i < kpad->gpimapsize; i++) - pin_used[kpad->gpimap[i].pin - kpad->var->gpi_pin_base] = true; - - if (kpad->extend_cfg & R4_EXTEND_CFG) - pin_used[4] = true; - - if (kpad->extend_cfg & C4_EXTEND_CFG) - pin_used[kpad->var->c4_extend_cfg] = true; - - if (!kpad->adp5585_support_row5) - pin_used[5] = true; - - for (i = 0; i < kpad->var->maxgpio; i++) - if (!pin_used[i]) - kpad->gpiomap[n_unused++] = i; - - return n_unused; -} - -static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad) -{ - struct device *dev = &kpad->client->dev; - const struct adp5589_kpad_platform_data *pdata = dev->platform_data; - const struct adp5589_gpio_platform_data *gpio_data = pdata->gpio_data; - int i, error; - - if (!gpio_data) - return 0; - - kpad->gc.ngpio = adp5589_build_gpiomap(kpad, pdata); - if (kpad->gc.ngpio == 0) { - dev_info(dev, "No unused gpios left to export\n"); - return 0; - } - - kpad->export_gpio = true; - - kpad->gc.direction_input = adp5589_gpio_direction_input; - kpad->gc.direction_output = adp5589_gpio_direction_output; - kpad->gc.get = adp5589_gpio_get_value; - kpad->gc.set = adp5589_gpio_set_value; - kpad->gc.can_sleep = 1; - - kpad->gc.base = gpio_data->gpio_start; - kpad->gc.label = kpad->client->name; - kpad->gc.owner = THIS_MODULE; - - mutex_init(&kpad->gpio_lock); - - error = gpiochip_add(&kpad->gc); - if (error) { - dev_err(dev, "gpiochip_add failed, err: %d\n", error); - return error; - } - - for (i = 0; i <= kpad->var->bank(kpad->var->maxgpio); i++) { - kpad->dat_out[i] = adp5589_read(kpad->client, kpad->var->reg( - ADP5589_GPO_DATA_OUT_A) + i); - kpad->dir[i] = adp5589_read(kpad->client, kpad->var->reg( - ADP5589_GPIO_DIRECTION_A) + i); - } - - if (gpio_data->setup) { - error = gpio_data->setup(kpad->client, - kpad->gc.base, kpad->gc.ngpio, - gpio_data->context); - if (error) - dev_warn(dev, "setup failed, %d\n", error); - } - - return 0; -} - -static void __devexit adp5589_gpio_remove(struct adp5589_kpad *kpad) -{ - struct device *dev = &kpad->client->dev; - const struct adp5589_kpad_platform_data *pdata = dev->platform_data; - const struct adp5589_gpio_platform_data *gpio_data = pdata->gpio_data; - int error; - - if (!kpad->export_gpio) - return; - - if (gpio_data->teardown) { - error = gpio_data->teardown(kpad->client, - kpad->gc.base, kpad->gc.ngpio, - gpio_data->context); - if (error) - dev_warn(dev, "teardown failed %d\n", error); - } - - error = gpiochip_remove(&kpad->gc); - if (error) - dev_warn(dev, "gpiochip_remove failed %d\n", error); -} -#else -static inline int adp5589_gpio_add(struct adp5589_kpad *kpad) -{ - return 0; -} - -static inline void adp5589_gpio_remove(struct adp5589_kpad *kpad) -{ -} -#endif - -static void adp5589_report_switches(struct adp5589_kpad *kpad, - int key, int key_val) -{ - int i; - - for (i = 0; i < kpad->gpimapsize; i++) { - if (key_val == kpad->gpimap[i].pin) { - input_report_switch(kpad->input, - kpad->gpimap[i].sw_evt, - key & KEY_EV_PRESSED); - break; - } - } -} - -static void adp5589_report_events(struct adp5589_kpad *kpad, int ev_cnt) -{ - int i; - - for (i = 0; i < ev_cnt; i++) { - int key = adp5589_read(kpad->client, ADP5589_5_FIFO_1 + i); - int key_val = key & KEY_EV_MASK; - - if (key_val >= kpad->var->gpi_pin_base && - key_val <= kpad->var->gpi_pin_end) { - adp5589_report_switches(kpad, key, key_val); - } else { - input_report_key(kpad->input, - kpad->keycode[key_val - 1], - key & KEY_EV_PRESSED); - } - } -} - -static irqreturn_t adp5589_irq(int irq, void *handle) -{ - struct adp5589_kpad *kpad = handle; - struct i2c_client *client = kpad->client; - int status, ev_cnt; - - status = adp5589_read(client, ADP5589_5_INT_STATUS); - - if (status & OVRFLOW_INT) /* Unlikely and should never happen */ - dev_err(&client->dev, "Event Overflow Error\n"); - - if (status & EVENT_INT) { - ev_cnt = adp5589_read(client, ADP5589_5_STATUS) & KEC; - if (ev_cnt) { - adp5589_report_events(kpad, ev_cnt); - input_sync(kpad->input); - } - } - - adp5589_write(client, ADP5589_5_INT_STATUS, status); /* Status is W1C */ - - return IRQ_HANDLED; -} - -static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad, - unsigned short key) -{ - int i; - - for (i = 0; i < kpad->var->keymapsize; i++) - if (key == kpad->keycode[i]) - return (i + 1) | KEY_EV_PRESSED; - - dev_err(&kpad->client->dev, "RESET/UNLOCK key not in keycode map\n"); - - return -EINVAL; -} - -static int __devinit adp5589_setup(struct adp5589_kpad *kpad) -{ - struct i2c_client *client = kpad->client; - const struct adp5589_kpad_platform_data *pdata = - client->dev.platform_data; - u8 (*reg) (u8) = kpad->var->reg; - unsigned char evt_mode1 = 0, evt_mode2 = 0, evt_mode3 = 0; - unsigned char pull_mask = 0; - int i, ret; - - ret = adp5589_write(client, reg(ADP5589_PIN_CONFIG_A), - pdata->keypad_en_mask & kpad->var->row_mask); - ret |= adp5589_write(client, reg(ADP5589_PIN_CONFIG_B), - (pdata->keypad_en_mask >> kpad->var->col_shift) & - kpad->var->col_mask); - - if (!kpad->is_adp5585) - ret |= adp5589_write(client, ADP5589_PIN_CONFIG_C, - (pdata->keypad_en_mask >> 16) & 0xFF); - - if (!kpad->is_adp5585 && pdata->en_keylock) { - ret |= adp5589_write(client, ADP5589_UNLOCK1, - pdata->unlock_key1); - ret |= adp5589_write(client, ADP5589_UNLOCK2, - pdata->unlock_key2); - ret |= adp5589_write(client, ADP5589_UNLOCK_TIMERS, - pdata->unlock_timer & LTIME_MASK); - ret |= adp5589_write(client, ADP5589_LOCK_CFG, LOCK_EN); - } - - for (i = 0; i < KEYP_MAX_EVENT; i++) - ret |= adp5589_read(client, ADP5589_5_FIFO_1 + i); - - for (i = 0; i < pdata->gpimapsize; i++) { - unsigned short pin = pdata->gpimap[i].pin; - - if (pin <= kpad->var->gpi_pin_row_end) { - evt_mode1 |= (1 << (pin - kpad->var->gpi_pin_row_base)); - } else { - evt_mode2 |= - ((1 << (pin - kpad->var->gpi_pin_col_base)) & 0xFF); - if (!kpad->is_adp5585) - evt_mode3 |= ((1 << (pin - - kpad->var->gpi_pin_col_base)) >> 8); - } - } - - if (pdata->gpimapsize) { - ret |= adp5589_write(client, reg(ADP5589_GPI_EVENT_EN_A), - evt_mode1); - ret |= adp5589_write(client, reg(ADP5589_GPI_EVENT_EN_B), - evt_mode2); - if (!kpad->is_adp5585) - ret |= adp5589_write(client, - reg(ADP5589_GPI_EVENT_EN_C), - evt_mode3); - } - - if (pdata->pull_dis_mask & pdata->pullup_en_100k & - pdata->pullup_en_300k & pdata->pulldown_en_300k) - dev_warn(&client->dev, "Conflicting pull resistor config\n"); - - for (i = 0; i <= kpad->var->max_row_num; i++) { - unsigned val = 0, bit = (1 << i); - if (pdata->pullup_en_300k & bit) - val = 0; - else if (pdata->pulldown_en_300k & bit) - val = 1; - else if (pdata->pullup_en_100k & bit) - val = 2; - else if (pdata->pull_dis_mask & bit) - val = 3; - - pull_mask |= val << (2 * (i & 0x3)); - - if (i == 3 || i == kpad->var->max_row_num) { - ret |= adp5589_write(client, reg(ADP5585_RPULL_CONFIG_A) - + (i >> 2), pull_mask); - pull_mask = 0; - } - } - - for (i = 0; i <= kpad->var->max_col_num; i++) { - unsigned val = 0, bit = 1 << (i + kpad->var->col_shift); - if (pdata->pullup_en_300k & bit) - val = 0; - else if (pdata->pulldown_en_300k & bit) - val = 1; - else if (pdata->pullup_en_100k & bit) - val = 2; - else if (pdata->pull_dis_mask & bit) - val = 3; - - pull_mask |= val << (2 * (i & 0x3)); - - if (i == 3 || i == kpad->var->max_col_num) { - ret |= adp5589_write(client, - reg(ADP5585_RPULL_CONFIG_C) + - (i >> 2), pull_mask); - pull_mask = 0; - } - } - - if (pdata->reset1_key_1 && pdata->reset1_key_2 && pdata->reset1_key_3) { - ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_A), - adp5589_get_evcode(kpad, - pdata->reset1_key_1)); - ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_B), - adp5589_get_evcode(kpad, - pdata->reset1_key_2)); - ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_C), - adp5589_get_evcode(kpad, - pdata->reset1_key_3)); - kpad->extend_cfg |= R4_EXTEND_CFG; - } - - if (pdata->reset2_key_1 && pdata->reset2_key_2) { - ret |= adp5589_write(client, reg(ADP5589_RESET2_EVENT_A), - adp5589_get_evcode(kpad, - pdata->reset2_key_1)); - ret |= adp5589_write(client, reg(ADP5589_RESET2_EVENT_B), - adp5589_get_evcode(kpad, - pdata->reset2_key_2)); - kpad->extend_cfg |= C4_EXTEND_CFG; - } - - if (kpad->extend_cfg) { - ret |= adp5589_write(client, reg(ADP5589_RESET_CFG), - pdata->reset_cfg); - ret |= adp5589_write(client, reg(ADP5589_PIN_CONFIG_D), - kpad->extend_cfg); - } - - ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_A), - pdata->debounce_dis_mask & kpad->var->row_mask); - - ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_B), - (pdata->debounce_dis_mask >> kpad->var->col_shift) - & kpad->var->col_mask); - - if (!kpad->is_adp5585) - ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_C), - (pdata->debounce_dis_mask >> 16) & 0xFF); - - ret |= adp5589_write(client, reg(ADP5589_POLL_PTIME_CFG), - pdata->scan_cycle_time & PTIME_MASK); - ret |= adp5589_write(client, ADP5589_5_INT_STATUS, - (kpad->is_adp5585 ? 0 : LOGIC2_INT) | - LOGIC1_INT | OVRFLOW_INT | - (kpad->is_adp5585 ? 0 : LOCK_INT) | - GPI_INT | EVENT_INT); /* Status is W1C */ - - ret |= adp5589_write(client, reg(ADP5589_GENERAL_CFG), - INT_CFG | OSC_EN | CORE_CLK(3)); - ret |= adp5589_write(client, reg(ADP5589_INT_EN), - OVRFLOW_IEN | GPI_IEN | EVENT_IEN); - - if (ret < 0) { - dev_err(&client->dev, "Write Error\n"); - return ret; - } - - return 0; -} - -static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad) -{ - int gpi_stat_tmp, pin_loc; - int i; - int gpi_stat1 = adp5589_read(kpad->client, - kpad->var->reg(ADP5589_GPI_STATUS_A)); - int gpi_stat2 = adp5589_read(kpad->client, - kpad->var->reg(ADP5589_GPI_STATUS_B)); - int gpi_stat3 = !kpad->is_adp5585 ? - adp5589_read(kpad->client, ADP5589_GPI_STATUS_C) : 0; - - for (i = 0; i < kpad->gpimapsize; i++) { - unsigned short pin = kpad->gpimap[i].pin; - - if (pin <= kpad->var->gpi_pin_row_end) { - gpi_stat_tmp = gpi_stat1; - pin_loc = pin - kpad->var->gpi_pin_row_base; - } else if ((pin - kpad->var->gpi_pin_col_base) < 8) { - gpi_stat_tmp = gpi_stat2; - pin_loc = pin - kpad->var->gpi_pin_col_base; - } else { - gpi_stat_tmp = gpi_stat3; - pin_loc = pin - kpad->var->gpi_pin_col_base - 8; - } - - if (gpi_stat_tmp < 0) { - dev_err(&kpad->client->dev, - "Can't read GPIO_DAT_STAT switch %d, default to OFF\n", - pin); - gpi_stat_tmp = 0; - } - - input_report_switch(kpad->input, - kpad->gpimap[i].sw_evt, - !(gpi_stat_tmp & (1 << pin_loc))); - } - - input_sync(kpad->input); -} - -static int __devinit adp5589_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct adp5589_kpad *kpad; - const struct adp5589_kpad_platform_data *pdata = - client->dev.platform_data; - struct input_dev *input; - unsigned int revid; - int ret, i; - int error; - - if (!i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_BYTE_DATA)) { - dev_err(&client->dev, "SMBUS Byte Data not Supported\n"); - return -EIO; - } - - if (!pdata) { - dev_err(&client->dev, "no platform data?\n"); - return -EINVAL; - } - - kpad = kzalloc(sizeof(*kpad), GFP_KERNEL); - if (!kpad) - return -ENOMEM; - - switch (id->driver_data) { - case ADP5585_02: - kpad->adp5585_support_row5 = true; - case ADP5585_01: - kpad->is_adp5585 = true; - kpad->var = &const_adp5585; - break; - case ADP5589: - kpad->var = &const_adp5589; - break; - } - - if (!((pdata->keypad_en_mask & kpad->var->row_mask) && - (pdata->keypad_en_mask >> kpad->var->col_shift)) || - !pdata->keymap) { - dev_err(&client->dev, "no rows, cols or keymap from pdata\n"); - error = -EINVAL; - goto err_free_mem; - } - - if (pdata->keymapsize != kpad->var->keymapsize) { - dev_err(&client->dev, "invalid keymapsize\n"); - error = -EINVAL; - goto err_free_mem; - } - - if (!pdata->gpimap && pdata->gpimapsize) { - dev_err(&client->dev, "invalid gpimap from pdata\n"); - error = -EINVAL; - goto err_free_mem; - } - - if (pdata->gpimapsize > kpad->var->gpimapsize_max) { - dev_err(&client->dev, "invalid gpimapsize\n"); - error = -EINVAL; - goto err_free_mem; - } - - for (i = 0; i < pdata->gpimapsize; i++) { - unsigned short pin = pdata->gpimap[i].pin; - - if (pin < kpad->var->gpi_pin_base || - pin > kpad->var->gpi_pin_end) { - dev_err(&client->dev, "invalid gpi pin data\n"); - error = -EINVAL; - goto err_free_mem; - } - - if ((1 << (pin - kpad->var->gpi_pin_row_base)) & - pdata->keypad_en_mask) { - dev_err(&client->dev, "invalid gpi row/col data\n"); - error = -EINVAL; - goto err_free_mem; - } - } - - if (!client->irq) { - dev_err(&client->dev, "no IRQ?\n"); - error = -EINVAL; - goto err_free_mem; - } - - input = input_allocate_device(); - if (!input) { - error = -ENOMEM; - goto err_free_mem; - } - - kpad->client = client; - kpad->input = input; - - ret = adp5589_read(client, ADP5589_5_ID); - if (ret < 0) { - error = ret; - goto err_free_input; - } - - revid = (u8) ret & ADP5589_5_DEVICE_ID_MASK; - - input->name = client->name; - input->phys = "adp5589-keys/input0"; - input->dev.parent = &client->dev; - - input_set_drvdata(input, kpad); - - input->id.bustype = BUS_I2C; - input->id.vendor = 0x0001; - input->id.product = 0x0001; - input->id.version = revid; - - input->keycodesize = sizeof(kpad->keycode[0]); - input->keycodemax = pdata->keymapsize; - input->keycode = kpad->keycode; - - memcpy(kpad->keycode, pdata->keymap, - pdata->keymapsize * input->keycodesize); - - kpad->gpimap = pdata->gpimap; - kpad->gpimapsize = pdata->gpimapsize; - - /* setup input device */ - __set_bit(EV_KEY, input->evbit); - - if (pdata->repeat) - __set_bit(EV_REP, input->evbit); - - for (i = 0; i < input->keycodemax; i++) - __set_bit(kpad->keycode[i] & KEY_MAX, input->keybit); - __clear_bit(KEY_RESERVED, input->keybit); - - if (kpad->gpimapsize) - __set_bit(EV_SW, input->evbit); - for (i = 0; i < kpad->gpimapsize; i++) - __set_bit(kpad->gpimap[i].sw_evt, input->swbit); - - error = input_register_device(input); - if (error) { - dev_err(&client->dev, "unable to register input device\n"); - goto err_free_input; - } - - error = request_threaded_irq(client->irq, NULL, adp5589_irq, - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, - client->dev.driver->name, kpad); - if (error) { - dev_err(&client->dev, "irq %d busy?\n", client->irq); - goto err_unreg_dev; - } - - error = adp5589_setup(kpad); - if (error) - goto err_free_irq; - - if (kpad->gpimapsize) - adp5589_report_switch_state(kpad); - - error = adp5589_gpio_add(kpad); - if (error) - goto err_free_irq; - - device_init_wakeup(&client->dev, 1); - i2c_set_clientdata(client, kpad); - - dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq); - return 0; - -err_free_irq: - free_irq(client->irq, kpad); -err_unreg_dev: - input_unregister_device(input); - input = NULL; -err_free_input: - input_free_device(input); -err_free_mem: - kfree(kpad); - - return error; -} - -static int __devexit adp5589_remove(struct i2c_client *client) -{ - struct adp5589_kpad *kpad = i2c_get_clientdata(client); - - adp5589_write(client, kpad->var->reg(ADP5589_GENERAL_CFG), 0); - free_irq(client->irq, kpad); - input_unregister_device(kpad->input); - adp5589_gpio_remove(kpad); - kfree(kpad); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int adp5589_suspend(struct device *dev) -{ - struct adp5589_kpad *kpad = dev_get_drvdata(dev); - struct i2c_client *client = kpad->client; - - disable_irq(client->irq); - - if (device_may_wakeup(&client->dev)) - enable_irq_wake(client->irq); - - return 0; -} - -static int adp5589_resume(struct device *dev) -{ - struct adp5589_kpad *kpad = dev_get_drvdata(dev); - struct i2c_client *client = kpad->client; - - if (device_may_wakeup(&client->dev)) - disable_irq_wake(client->irq); - - enable_irq(client->irq); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(adp5589_dev_pm_ops, adp5589_suspend, adp5589_resume); - -static const struct i2c_device_id adp5589_id[] = { - {"adp5589-keys", ADP5589}, - {"adp5585-keys", ADP5585_01}, - {"adp5585-02-keys", ADP5585_02}, /* Adds ROW5 to ADP5585 */ - {} -}; - -MODULE_DEVICE_TABLE(i2c, adp5589_id); - -static struct i2c_driver adp5589_driver = { - .driver = { - .name = KBUILD_MODNAME, - .owner = THIS_MODULE, - .pm = &adp5589_dev_pm_ops, - }, - .probe = adp5589_probe, - .remove = __devexit_p(adp5589_remove), - .id_table = adp5589_id, -}; - -module_i2c_driver(adp5589_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); -MODULE_DESCRIPTION("ADP5589/ADP5585 Keypad driver"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/amikbd.c b/ANDROID_3.4.5/drivers/input/keyboard/amikbd.c deleted file mode 100644 index 79172af1..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/amikbd.c +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright (c) 2000-2001 Vojtech Pavlik - * - * Based on the work of: - * Hamish Macdonald - */ - -/* - * Amiga keyboard driver for Linux/m68k - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * - * Should you need to contact me, the author, you can do so either by - * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail: - * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/delay.h> -#include <linux/interrupt.h> -#include <linux/keyboard.h> -#include <linux/platform_device.h> - -#include <asm/amigaints.h> -#include <asm/amigahw.h> -#include <asm/irq.h> - -MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); -MODULE_DESCRIPTION("Amiga keyboard driver"); -MODULE_LICENSE("GPL"); - -static unsigned char amikbd_keycode[0x78] __initdata = { - [0] = KEY_GRAVE, - [1] = KEY_1, - [2] = KEY_2, - [3] = KEY_3, - [4] = KEY_4, - [5] = KEY_5, - [6] = KEY_6, - [7] = KEY_7, - [8] = KEY_8, - [9] = KEY_9, - [10] = KEY_0, - [11] = KEY_MINUS, - [12] = KEY_EQUAL, - [13] = KEY_BACKSLASH, - [15] = KEY_KP0, - [16] = KEY_Q, - [17] = KEY_W, - [18] = KEY_E, - [19] = KEY_R, - [20] = KEY_T, - [21] = KEY_Y, - [22] = KEY_U, - [23] = KEY_I, - [24] = KEY_O, - [25] = KEY_P, - [26] = KEY_LEFTBRACE, - [27] = KEY_RIGHTBRACE, - [29] = KEY_KP1, - [30] = KEY_KP2, - [31] = KEY_KP3, - [32] = KEY_A, - [33] = KEY_S, - [34] = KEY_D, - [35] = KEY_F, - [36] = KEY_G, - [37] = KEY_H, - [38] = KEY_J, - [39] = KEY_K, - [40] = KEY_L, - [41] = KEY_SEMICOLON, - [42] = KEY_APOSTROPHE, - [43] = KEY_BACKSLASH, - [45] = KEY_KP4, - [46] = KEY_KP5, - [47] = KEY_KP6, - [48] = KEY_102ND, - [49] = KEY_Z, - [50] = KEY_X, - [51] = KEY_C, - [52] = KEY_V, - [53] = KEY_B, - [54] = KEY_N, - [55] = KEY_M, - [56] = KEY_COMMA, - [57] = KEY_DOT, - [58] = KEY_SLASH, - [60] = KEY_KPDOT, - [61] = KEY_KP7, - [62] = KEY_KP8, - [63] = KEY_KP9, - [64] = KEY_SPACE, - [65] = KEY_BACKSPACE, - [66] = KEY_TAB, - [67] = KEY_KPENTER, - [68] = KEY_ENTER, - [69] = KEY_ESC, - [70] = KEY_DELETE, - [74] = KEY_KPMINUS, - [76] = KEY_UP, - [77] = KEY_DOWN, - [78] = KEY_RIGHT, - [79] = KEY_LEFT, - [80] = KEY_F1, - [81] = KEY_F2, - [82] = KEY_F3, - [83] = KEY_F4, - [84] = KEY_F5, - [85] = KEY_F6, - [86] = KEY_F7, - [87] = KEY_F8, - [88] = KEY_F9, - [89] = KEY_F10, - [90] = KEY_KPLEFTPAREN, - [91] = KEY_KPRIGHTPAREN, - [92] = KEY_KPSLASH, - [93] = KEY_KPASTERISK, - [94] = KEY_KPPLUS, - [95] = KEY_HELP, - [96] = KEY_LEFTSHIFT, - [97] = KEY_RIGHTSHIFT, - [98] = KEY_CAPSLOCK, - [99] = KEY_LEFTCTRL, - [100] = KEY_LEFTALT, - [101] = KEY_RIGHTALT, - [102] = KEY_LEFTMETA, - [103] = KEY_RIGHTMETA -}; - -static const char *amikbd_messages[8] = { - [0] = KERN_ALERT "amikbd: Ctrl-Amiga-Amiga reset warning!!\n", - [1] = KERN_WARNING "amikbd: keyboard lost sync\n", - [2] = KERN_WARNING "amikbd: keyboard buffer overflow\n", - [3] = KERN_WARNING "amikbd: keyboard controller failure\n", - [4] = KERN_ERR "amikbd: keyboard selftest failure\n", - [5] = KERN_INFO "amikbd: initiate power-up key stream\n", - [6] = KERN_INFO "amikbd: terminate power-up key stream\n", - [7] = KERN_WARNING "amikbd: keyboard interrupt\n" -}; - -static irqreturn_t amikbd_interrupt(int irq, void *data) -{ - struct input_dev *dev = data; - unsigned char scancode, down; - - scancode = ~ciaa.sdr; /* get and invert scancode (keyboard is active low) */ - ciaa.cra |= 0x40; /* switch SP pin to output for handshake */ - udelay(85); /* wait until 85 us have expired */ - ciaa.cra &= ~0x40; /* switch CIA serial port to input mode */ - - down = !(scancode & 1); /* lowest bit is release bit */ - scancode >>= 1; - - if (scancode < 0x78) { /* scancodes < 0x78 are keys */ - if (scancode == 98) { /* CapsLock is a toggle switch key on Amiga */ - input_report_key(dev, scancode, 1); - input_report_key(dev, scancode, 0); - } else { - input_report_key(dev, scancode, down); - } - - input_sync(dev); - } else /* scancodes >= 0x78 are error codes */ - printk(amikbd_messages[scancode - 0x78]); - - return IRQ_HANDLED; -} - -static int __init amikbd_probe(struct platform_device *pdev) -{ - struct input_dev *dev; - int i, j, err; - - dev = input_allocate_device(); - if (!dev) { - dev_err(&pdev->dev, "Not enough memory for input device\n"); - return -ENOMEM; - } - - dev->name = pdev->name; - dev->phys = "amikbd/input0"; - dev->id.bustype = BUS_AMIGA; - dev->id.vendor = 0x0001; - dev->id.product = 0x0001; - dev->id.version = 0x0100; - dev->dev.parent = &pdev->dev; - - dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - - for (i = 0; i < 0x78; i++) - set_bit(i, dev->keybit); - - for (i = 0; i < MAX_NR_KEYMAPS; i++) { - static u_short temp_map[NR_KEYS] __initdata; - if (!key_maps[i]) - continue; - memset(temp_map, 0, sizeof(temp_map)); - for (j = 0; j < 0x78; j++) { - if (!amikbd_keycode[j]) - continue; - temp_map[j] = key_maps[i][amikbd_keycode[j]]; - } - for (j = 0; j < NR_KEYS; j++) { - if (!temp_map[j]) - temp_map[j] = 0xf200; - } - memcpy(key_maps[i], temp_map, sizeof(temp_map)); - } - ciaa.cra &= ~0x41; /* serial data in, turn off TA */ - err = request_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt, 0, "amikbd", - dev); - if (err) - goto fail2; - - err = input_register_device(dev); - if (err) - goto fail3; - - platform_set_drvdata(pdev, dev); - - return 0; - - fail3: free_irq(IRQ_AMIGA_CIAA_SP, dev); - fail2: input_free_device(dev); - return err; -} - -static int __exit amikbd_remove(struct platform_device *pdev) -{ - struct input_dev *dev = platform_get_drvdata(pdev); - - platform_set_drvdata(pdev, NULL); - free_irq(IRQ_AMIGA_CIAA_SP, dev); - input_unregister_device(dev); - return 0; -} - -static struct platform_driver amikbd_driver = { - .remove = __exit_p(amikbd_remove), - .driver = { - .name = "amiga-keyboard", - .owner = THIS_MODULE, - }, -}; - -static int __init amikbd_init(void) -{ - return platform_driver_probe(&amikbd_driver, amikbd_probe); -} - -module_init(amikbd_init); - -static void __exit amikbd_exit(void) -{ - platform_driver_unregister(&amikbd_driver); -} - -module_exit(amikbd_exit); - -MODULE_ALIAS("platform:amiga-keyboard"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/atakbd.c b/ANDROID_3.4.5/drivers/input/keyboard/atakbd.c deleted file mode 100644 index 10bcd4ae..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/atakbd.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * atakbd.c - * - * Copyright (c) 2005 Michael Schmitz - * - * Based on amikbd.c, which is - * - * Copyright (c) 2000-2001 Vojtech Pavlik - * - * Based on the work of: - * Hamish Macdonald - */ - -/* - * Atari keyboard driver for Linux/m68k - * - * The low level init and interrupt stuff is handled in arch/mm68k/atari/atakeyb.c - * (the keyboard ACIA also handles the mouse and joystick data, and the keyboard - * interrupt is shared with the MIDI ACIA so MIDI data also get handled there). - * This driver only deals with handing key events off to the input layer. - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * - * Should you need to contact me, the author, you can do so either by - * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail: - * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/delay.h> -#include <linux/interrupt.h> - -#include <asm/atariints.h> -#include <asm/atarihw.h> -#include <asm/atarikb.h> -#include <asm/irq.h> - -MODULE_AUTHOR("Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>"); -MODULE_DESCRIPTION("Atari keyboard driver"); -MODULE_LICENSE("GPL"); - -/* - 0x47: KP_7 71 - 0x48: KP_8 72 - 0x49: KP_9 73 - 0x62: KP_/ 98 - 0x4b: KP_4 75 - 0x4c: KP_5 76 - 0x4d: KP_6 77 - 0x37: KP_* 55 - 0x4f: KP_1 79 - 0x50: KP_2 80 - 0x51: KP_3 81 - 0x4a: KP_- 74 - 0x52: KP_0 82 - 0x53: KP_. 83 - 0x4e: KP_+ 78 - - 0x67: Up 103 - 0x6c: Down 108 - 0x69: Left 105 - 0x6a: Right 106 - */ - - -static unsigned char atakbd_keycode[0x72] = { /* American layout */ - [0] = KEY_GRAVE, - [1] = KEY_ESC, - [2] = KEY_1, - [3] = KEY_2, - [4] = KEY_3, - [5] = KEY_4, - [6] = KEY_5, - [7] = KEY_6, - [8] = KEY_7, - [9] = KEY_8, - [10] = KEY_9, - [11] = KEY_0, - [12] = KEY_MINUS, - [13] = KEY_EQUAL, - [14] = KEY_BACKSPACE, - [15] = KEY_TAB, - [16] = KEY_Q, - [17] = KEY_W, - [18] = KEY_E, - [19] = KEY_R, - [20] = KEY_T, - [21] = KEY_Y, - [22] = KEY_U, - [23] = KEY_I, - [24] = KEY_O, - [25] = KEY_P, - [26] = KEY_LEFTBRACE, - [27] = KEY_RIGHTBRACE, - [28] = KEY_ENTER, - [29] = KEY_LEFTCTRL, - [30] = KEY_A, - [31] = KEY_S, - [32] = KEY_D, - [33] = KEY_F, - [34] = KEY_G, - [35] = KEY_H, - [36] = KEY_J, - [37] = KEY_K, - [38] = KEY_L, - [39] = KEY_SEMICOLON, - [40] = KEY_APOSTROPHE, - [41] = KEY_BACKSLASH, /* FIXME, '#' */ - [42] = KEY_LEFTSHIFT, - [43] = KEY_GRAVE, /* FIXME: '~' */ - [44] = KEY_Z, - [45] = KEY_X, - [46] = KEY_C, - [47] = KEY_V, - [48] = KEY_B, - [49] = KEY_N, - [50] = KEY_M, - [51] = KEY_COMMA, - [52] = KEY_DOT, - [53] = KEY_SLASH, - [54] = KEY_RIGHTSHIFT, - [55] = KEY_KPASTERISK, - [56] = KEY_LEFTALT, - [57] = KEY_SPACE, - [58] = KEY_CAPSLOCK, - [59] = KEY_F1, - [60] = KEY_F2, - [61] = KEY_F3, - [62] = KEY_F4, - [63] = KEY_F5, - [64] = KEY_F6, - [65] = KEY_F7, - [66] = KEY_F8, - [67] = KEY_F9, - [68] = KEY_F10, - [69] = KEY_ESC, - [70] = KEY_DELETE, - [71] = KEY_KP7, - [72] = KEY_KP8, - [73] = KEY_KP9, - [74] = KEY_KPMINUS, - [75] = KEY_KP4, - [76] = KEY_KP5, - [77] = KEY_KP6, - [78] = KEY_KPPLUS, - [79] = KEY_KP1, - [80] = KEY_KP2, - [81] = KEY_KP3, - [82] = KEY_KP0, - [83] = KEY_KPDOT, - [90] = KEY_KPLEFTPAREN, - [91] = KEY_KPRIGHTPAREN, - [92] = KEY_KPASTERISK, /* FIXME */ - [93] = KEY_KPASTERISK, - [94] = KEY_KPPLUS, - [95] = KEY_HELP, - [96] = KEY_BACKSLASH, /* FIXME: '<' */ - [97] = KEY_KPASTERISK, /* FIXME */ - [98] = KEY_KPSLASH, - [99] = KEY_KPLEFTPAREN, - [100] = KEY_KPRIGHTPAREN, - [101] = KEY_KPSLASH, - [102] = KEY_KPASTERISK, - [103] = KEY_UP, - [104] = KEY_KPASTERISK, /* FIXME */ - [105] = KEY_LEFT, - [106] = KEY_RIGHT, - [107] = KEY_KPASTERISK, /* FIXME */ - [108] = KEY_DOWN, - [109] = KEY_KPASTERISK, /* FIXME */ - [110] = KEY_KPASTERISK, /* FIXME */ - [111] = KEY_KPASTERISK, /* FIXME */ - [112] = KEY_KPASTERISK, /* FIXME */ - [113] = KEY_KPASTERISK /* FIXME */ -}; - -static struct input_dev *atakbd_dev; - -static void atakbd_interrupt(unsigned char scancode, char down) -{ - - if (scancode < 0x72) { /* scancodes < 0xf2 are keys */ - - // report raw events here? - - scancode = atakbd_keycode[scancode]; - - if (scancode == KEY_CAPSLOCK) { /* CapsLock is a toggle switch key on Amiga */ - input_report_key(atakbd_dev, scancode, 1); - input_report_key(atakbd_dev, scancode, 0); - input_sync(atakbd_dev); - } else { - input_report_key(atakbd_dev, scancode, down); - input_sync(atakbd_dev); - } - } else /* scancodes >= 0xf2 are mouse data, most likely */ - printk(KERN_INFO "atakbd: unhandled scancode %x\n", scancode); - - return; -} - -static int __init atakbd_init(void) -{ - int i, error; - - if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP)) - return -ENODEV; - - // need to init core driver if not already done so - error = atari_keyb_init(); - if (error) - return error; - - atakbd_dev = input_allocate_device(); - if (!atakbd_dev) - return -ENOMEM; - - atakbd_dev->name = "Atari Keyboard"; - atakbd_dev->phys = "atakbd/input0"; - atakbd_dev->id.bustype = BUS_HOST; - atakbd_dev->id.vendor = 0x0001; - atakbd_dev->id.product = 0x0001; - atakbd_dev->id.version = 0x0100; - - atakbd_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - atakbd_dev->keycode = atakbd_keycode; - atakbd_dev->keycodesize = sizeof(unsigned char); - atakbd_dev->keycodemax = ARRAY_SIZE(atakbd_keycode); - - for (i = 1; i < 0x72; i++) { - set_bit(atakbd_keycode[i], atakbd_dev->keybit); - } - - /* error check */ - error = input_register_device(atakbd_dev); - if (error) { - input_free_device(atakbd_dev); - return error; - } - - atari_input_keyboard_interrupt_hook = atakbd_interrupt; - - return 0; -} - -static void __exit atakbd_exit(void) -{ - atari_input_keyboard_interrupt_hook = NULL; - input_unregister_device(atakbd_dev); -} - -module_init(atakbd_init); -module_exit(atakbd_exit); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/atkbd.c b/ANDROID_3.4.5/drivers/input/keyboard/atkbd.c deleted file mode 100644 index e05a2e70..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/atkbd.c +++ /dev/null @@ -1,1764 +0,0 @@ -/* - * AT and PS/2 keyboard driver - * - * Copyright (c) 1999-2002 Vojtech Pavlik - */ - -/* - * 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 driver can handle standard AT keyboards and PS/2 keyboards in - * Translated and Raw Set 2 and Set 3, as well as AT keyboards on dumb - * input-only controllers and AT keyboards connected over a one way RS232 - * converter. - */ - -#include <linux/delay.h> -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/interrupt.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/serio.h> -#include <linux/workqueue.h> -#include <linux/libps2.h> -#include <linux/mutex.h> -#include <linux/dmi.h> - -#define DRIVER_DESC "AT and PS/2 keyboard driver" - -MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>"); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_LICENSE("GPL"); - -static int atkbd_set = 2; -module_param_named(set, atkbd_set, int, 0); -MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)"); - -#if defined(__i386__) || defined(__x86_64__) || defined(__hppa__) -static bool atkbd_reset; -#else -static bool atkbd_reset = true; -#endif -module_param_named(reset, atkbd_reset, bool, 0); -MODULE_PARM_DESC(reset, "Reset keyboard during initialization"); - -static bool atkbd_softrepeat; -module_param_named(softrepeat, atkbd_softrepeat, bool, 0); -MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat"); - -static bool atkbd_softraw = true; -module_param_named(softraw, atkbd_softraw, bool, 0); -MODULE_PARM_DESC(softraw, "Use software generated rawmode"); - -static bool atkbd_scroll; -module_param_named(scroll, atkbd_scroll, bool, 0); -MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards"); - -static bool atkbd_extra; -module_param_named(extra, atkbd_extra, bool, 0); -MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards"); - -static bool atkbd_terminal; -module_param_named(terminal, atkbd_terminal, bool, 0); -MODULE_PARM_DESC(terminal, "Enable break codes on an IBM Terminal keyboard connected via AT/PS2"); - -/* - * Scancode to keycode tables. These are just the default setting, and - * are loadable via a userland utility. - */ - -#define ATKBD_KEYMAP_SIZE 512 - -static const unsigned short atkbd_set2_keycode[ATKBD_KEYMAP_SIZE] = { - -#ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES - -/* XXX: need a more general approach */ - -#include "hpps2atkbd.h" /* include the keyboard scancodes */ - -#else - 0, 67, 65, 63, 61, 59, 60, 88, 0, 68, 66, 64, 62, 15, 41,117, - 0, 56, 42, 93, 29, 16, 2, 0, 0, 0, 44, 31, 30, 17, 3, 0, - 0, 46, 45, 32, 18, 5, 4, 95, 0, 57, 47, 33, 20, 19, 6,183, - 0, 49, 48, 35, 34, 21, 7,184, 0, 0, 50, 36, 22, 8, 9,185, - 0, 51, 37, 23, 24, 11, 10, 0, 0, 52, 53, 38, 39, 25, 12, 0, - 0, 89, 40, 0, 26, 13, 0, 0, 58, 54, 28, 27, 0, 43, 0, 85, - 0, 86, 91, 90, 92, 0, 14, 94, 0, 79,124, 75, 71,121, 0, 0, - 82, 83, 80, 76, 77, 72, 1, 69, 87, 78, 81, 74, 55, 73, 70, 99, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 217,100,255, 0, 97,165, 0, 0,156, 0, 0, 0, 0, 0, 0,125, - 173,114, 0,113, 0, 0, 0,126,128, 0, 0,140, 0, 0, 0,127, - 159, 0,115, 0,164, 0, 0,116,158, 0,172,166, 0, 0, 0,142, - 157, 0, 0, 0, 0, 0, 0, 0,155, 0, 98, 0, 0,163, 0, 0, - 226, 0, 0, 0, 0, 0, 0, 0, 0,255, 96, 0, 0, 0,143, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 0,105,102, 0, 0,112, - 110,111,108,112,106,103, 0,119, 0,118,109, 0, 99,104,119, 0, - - 0, 0, 0, 65, 99, -#endif -}; - -static const unsigned short atkbd_set3_keycode[ATKBD_KEYMAP_SIZE] = { - - 0, 0, 0, 0, 0, 0, 0, 59, 1,138,128,129,130, 15, 41, 60, - 131, 29, 42, 86, 58, 16, 2, 61,133, 56, 44, 31, 30, 17, 3, 62, - 134, 46, 45, 32, 18, 5, 4, 63,135, 57, 47, 33, 20, 19, 6, 64, - 136, 49, 48, 35, 34, 21, 7, 65,137,100, 50, 36, 22, 8, 9, 66, - 125, 51, 37, 23, 24, 11, 10, 67,126, 52, 53, 38, 39, 25, 12, 68, - 113,114, 40, 43, 26, 13, 87, 99, 97, 54, 28, 27, 43, 43, 88, 70, - 108,105,119,103,111,107, 14,110, 0, 79,106, 75, 71,109,102,104, - 82, 83, 80, 76, 77, 72, 69, 98, 0, 96, 81, 0, 78, 73, 55,183, - - 184,185,186,187, 74, 94, 92, 93, 0, 0, 0,125,126,127,112, 0, - 0,139,172,163,165,115,152,172,166,140,160,154,113,114,167,168, - 148,149,147,140 -}; - -static const unsigned short atkbd_unxlate_table[128] = { - 0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13, - 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27, - 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42, - 50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88, 5, 6, 4, 12, 3, - 11, 2, 10, 1, 9,119,126,108,117,125,123,107,115,116,121,105, - 114,122,112,113,127, 96, 97,120, 7, 15, 23, 31, 39, 47, 55, 63, - 71, 79, 86, 94, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111, - 19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110 -}; - -#define ATKBD_CMD_SETLEDS 0x10ed -#define ATKBD_CMD_GSCANSET 0x11f0 -#define ATKBD_CMD_SSCANSET 0x10f0 -#define ATKBD_CMD_GETID 0x02f2 -#define ATKBD_CMD_SETREP 0x10f3 -#define ATKBD_CMD_ENABLE 0x00f4 -#define ATKBD_CMD_RESET_DIS 0x00f5 /* Reset to defaults and disable */ -#define ATKBD_CMD_RESET_DEF 0x00f6 /* Reset to defaults */ -#define ATKBD_CMD_SETALL_MB 0x00f8 /* Set all keys to give break codes */ -#define ATKBD_CMD_SETALL_MBR 0x00fa /* ... and repeat */ -#define ATKBD_CMD_RESET_BAT 0x02ff -#define ATKBD_CMD_RESEND 0x00fe -#define ATKBD_CMD_EX_ENABLE 0x10ea -#define ATKBD_CMD_EX_SETLEDS 0x20eb -#define ATKBD_CMD_OK_GETID 0x02e8 - -#define ATKBD_RET_ACK 0xfa -#define ATKBD_RET_NAK 0xfe -#define ATKBD_RET_BAT 0xaa -#define ATKBD_RET_EMUL0 0xe0 -#define ATKBD_RET_EMUL1 0xe1 -#define ATKBD_RET_RELEASE 0xf0 -#define ATKBD_RET_HANJA 0xf1 -#define ATKBD_RET_HANGEUL 0xf2 -#define ATKBD_RET_ERR 0xff - -#define ATKBD_KEY_UNKNOWN 0 -#define ATKBD_KEY_NULL 255 - -#define ATKBD_SCR_1 0xfffe -#define ATKBD_SCR_2 0xfffd -#define ATKBD_SCR_4 0xfffc -#define ATKBD_SCR_8 0xfffb -#define ATKBD_SCR_CLICK 0xfffa -#define ATKBD_SCR_LEFT 0xfff9 -#define ATKBD_SCR_RIGHT 0xfff8 - -#define ATKBD_SPECIAL ATKBD_SCR_RIGHT - -#define ATKBD_LED_EVENT_BIT 0 -#define ATKBD_REP_EVENT_BIT 1 - -#define ATKBD_XL_ERR 0x01 -#define ATKBD_XL_BAT 0x02 -#define ATKBD_XL_ACK 0x04 -#define ATKBD_XL_NAK 0x08 -#define ATKBD_XL_HANGEUL 0x10 -#define ATKBD_XL_HANJA 0x20 - -static const struct { - unsigned short keycode; - unsigned char set2; -} atkbd_scroll_keys[] = { - { ATKBD_SCR_1, 0xc5 }, - { ATKBD_SCR_2, 0x9d }, - { ATKBD_SCR_4, 0xa4 }, - { ATKBD_SCR_8, 0x9b }, - { ATKBD_SCR_CLICK, 0xe0 }, - { ATKBD_SCR_LEFT, 0xcb }, - { ATKBD_SCR_RIGHT, 0xd2 }, -}; - -/* - * The atkbd control structure - */ - -struct atkbd { - - struct ps2dev ps2dev; - struct input_dev *dev; - - /* Written only during init */ - char name[64]; - char phys[32]; - - unsigned short id; - unsigned short keycode[ATKBD_KEYMAP_SIZE]; - DECLARE_BITMAP(force_release_mask, ATKBD_KEYMAP_SIZE); - unsigned char set; - bool translated; - bool extra; - bool write; - bool softrepeat; - bool softraw; - bool scroll; - bool enabled; - - /* Accessed only from interrupt */ - unsigned char emul; - bool resend; - bool release; - unsigned long xl_bit; - unsigned int last; - unsigned long time; - unsigned long err_count; - - struct delayed_work event_work; - unsigned long event_jiffies; - unsigned long event_mask; - - /* Serializes reconnect(), attr->set() and event work */ - struct mutex mutex; -}; - -/* - * System-specific keymap fixup routine - */ -static void (*atkbd_platform_fixup)(struct atkbd *, const void *data); -static void *atkbd_platform_fixup_data; -static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int); - -static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, - ssize_t (*handler)(struct atkbd *, char *)); -static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, - ssize_t (*handler)(struct atkbd *, const char *, size_t)); -#define ATKBD_DEFINE_ATTR(_name) \ -static ssize_t atkbd_show_##_name(struct atkbd *, char *); \ -static ssize_t atkbd_set_##_name(struct atkbd *, const char *, size_t); \ -static ssize_t atkbd_do_show_##_name(struct device *d, \ - struct device_attribute *attr, char *b) \ -{ \ - return atkbd_attr_show_helper(d, b, atkbd_show_##_name); \ -} \ -static ssize_t atkbd_do_set_##_name(struct device *d, \ - struct device_attribute *attr, const char *b, size_t s) \ -{ \ - return atkbd_attr_set_helper(d, b, s, atkbd_set_##_name); \ -} \ -static struct device_attribute atkbd_attr_##_name = \ - __ATTR(_name, S_IWUSR | S_IRUGO, atkbd_do_show_##_name, atkbd_do_set_##_name); - -ATKBD_DEFINE_ATTR(extra); -ATKBD_DEFINE_ATTR(force_release); -ATKBD_DEFINE_ATTR(scroll); -ATKBD_DEFINE_ATTR(set); -ATKBD_DEFINE_ATTR(softrepeat); -ATKBD_DEFINE_ATTR(softraw); - -#define ATKBD_DEFINE_RO_ATTR(_name) \ -static ssize_t atkbd_show_##_name(struct atkbd *, char *); \ -static ssize_t atkbd_do_show_##_name(struct device *d, \ - struct device_attribute *attr, char *b) \ -{ \ - return atkbd_attr_show_helper(d, b, atkbd_show_##_name); \ -} \ -static struct device_attribute atkbd_attr_##_name = \ - __ATTR(_name, S_IRUGO, atkbd_do_show_##_name, NULL); - -ATKBD_DEFINE_RO_ATTR(err_count); - -static struct attribute *atkbd_attributes[] = { - &atkbd_attr_extra.attr, - &atkbd_attr_force_release.attr, - &atkbd_attr_scroll.attr, - &atkbd_attr_set.attr, - &atkbd_attr_softrepeat.attr, - &atkbd_attr_softraw.attr, - &atkbd_attr_err_count.attr, - NULL -}; - -static struct attribute_group atkbd_attribute_group = { - .attrs = atkbd_attributes, -}; - -static const unsigned int xl_table[] = { - ATKBD_RET_BAT, ATKBD_RET_ERR, ATKBD_RET_ACK, - ATKBD_RET_NAK, ATKBD_RET_HANJA, ATKBD_RET_HANGEUL, -}; - -/* - * Checks if we should mangle the scancode to extract 'release' bit - * in translated mode. - */ -static bool atkbd_need_xlate(unsigned long xl_bit, unsigned char code) -{ - int i; - - if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1) - return false; - - for (i = 0; i < ARRAY_SIZE(xl_table); i++) - if (code == xl_table[i]) - return test_bit(i, &xl_bit); - - return true; -} - -/* - * Calculates new value of xl_bit so the driver can distinguish - * between make/break pair of scancodes for select keys and PS/2 - * protocol responses. - */ -static void atkbd_calculate_xl_bit(struct atkbd *atkbd, unsigned char code) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(xl_table); i++) { - if (!((code ^ xl_table[i]) & 0x7f)) { - if (code & 0x80) - __clear_bit(i, &atkbd->xl_bit); - else - __set_bit(i, &atkbd->xl_bit); - break; - } - } -} - -/* - * Encode the scancode, 0xe0 prefix, and high bit into a single integer, - * keeping kernel 2.4 compatibility for set 2 - */ -static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code) -{ - if (atkbd->set == 3) { - if (atkbd->emul == 1) - code |= 0x100; - } else { - code = (code & 0x7f) | ((code & 0x80) << 1); - if (atkbd->emul == 1) - code |= 0x80; - } - - return code; -} - -/* - * atkbd_interrupt(). Here takes place processing of data received from - * the keyboard into events. - */ - -static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, - unsigned int flags) -{ - struct atkbd *atkbd = serio_get_drvdata(serio); - struct input_dev *dev = atkbd->dev; - unsigned int code = data; - int scroll = 0, hscroll = 0, click = -1; - int value; - unsigned short keycode; - - dev_dbg(&serio->dev, "Received %02x flags %02x\n", data, flags); - -#if !defined(__i386__) && !defined (__x86_64__) - if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) { - dev_warn(&serio->dev, "Frame/parity error: %02x\n", flags); - serio_write(serio, ATKBD_CMD_RESEND); - atkbd->resend = true; - goto out; - } - - if (!flags && data == ATKBD_RET_ACK) - atkbd->resend = false; -#endif - - if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK)) - if (ps2_handle_ack(&atkbd->ps2dev, data)) - goto out; - - if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_CMD)) - if (ps2_handle_response(&atkbd->ps2dev, data)) - goto out; - - if (!atkbd->enabled) - goto out; - - input_event(dev, EV_MSC, MSC_RAW, code); - - if (atkbd_platform_scancode_fixup) - code = atkbd_platform_scancode_fixup(atkbd, code); - - if (atkbd->translated) { - - if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) { - atkbd->release = code >> 7; - code &= 0x7f; - } - - if (!atkbd->emul) - atkbd_calculate_xl_bit(atkbd, data); - } - - switch (code) { - case ATKBD_RET_BAT: - atkbd->enabled = false; - serio_reconnect(atkbd->ps2dev.serio); - goto out; - case ATKBD_RET_EMUL0: - atkbd->emul = 1; - goto out; - case ATKBD_RET_EMUL1: - atkbd->emul = 2; - goto out; - case ATKBD_RET_RELEASE: - atkbd->release = true; - goto out; - case ATKBD_RET_ACK: - case ATKBD_RET_NAK: - if (printk_ratelimit()) - dev_warn(&serio->dev, - "Spurious %s on %s. " - "Some program might be trying access hardware directly.\n", - data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys); - goto out; - case ATKBD_RET_ERR: - atkbd->err_count++; - dev_dbg(&serio->dev, "Keyboard on %s reports too many keys pressed.\n", - serio->phys); - goto out; - } - - code = atkbd_compat_scancode(atkbd, code); - - if (atkbd->emul && --atkbd->emul) - goto out; - - keycode = atkbd->keycode[code]; - - if (keycode != ATKBD_KEY_NULL) - input_event(dev, EV_MSC, MSC_SCAN, code); - - switch (keycode) { - case ATKBD_KEY_NULL: - break; - case ATKBD_KEY_UNKNOWN: - dev_warn(&serio->dev, - "Unknown key %s (%s set %d, code %#x on %s).\n", - atkbd->release ? "released" : "pressed", - atkbd->translated ? "translated" : "raw", - atkbd->set, code, serio->phys); - dev_warn(&serio->dev, - "Use 'setkeycodes %s%02x <keycode>' to make it known.\n", - code & 0x80 ? "e0" : "", code & 0x7f); - input_sync(dev); - break; - case ATKBD_SCR_1: - scroll = 1; - break; - case ATKBD_SCR_2: - scroll = 2; - break; - case ATKBD_SCR_4: - scroll = 4; - break; - case ATKBD_SCR_8: - scroll = 8; - break; - case ATKBD_SCR_CLICK: - click = !atkbd->release; - break; - case ATKBD_SCR_LEFT: - hscroll = -1; - break; - case ATKBD_SCR_RIGHT: - hscroll = 1; - break; - default: - if (atkbd->release) { - value = 0; - atkbd->last = 0; - } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) { - /* Workaround Toshiba laptop multiple keypress */ - value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2; - } else { - value = 1; - atkbd->last = code; - atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2; - } - - input_event(dev, EV_KEY, keycode, value); - input_sync(dev); - - if (value && test_bit(code, atkbd->force_release_mask)) { - input_report_key(dev, keycode, 0); - input_sync(dev); - } - } - - if (atkbd->scroll) { - if (click != -1) - input_report_key(dev, BTN_MIDDLE, click); - input_report_rel(dev, REL_WHEEL, - atkbd->release ? -scroll : scroll); - input_report_rel(dev, REL_HWHEEL, hscroll); - input_sync(dev); - } - - atkbd->release = false; -out: - return IRQ_HANDLED; -} - -static int atkbd_set_repeat_rate(struct atkbd *atkbd) -{ - const short period[32] = - { 33, 37, 42, 46, 50, 54, 58, 63, 67, 75, 83, 92, 100, 109, 116, 125, - 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 }; - const short delay[4] = - { 250, 500, 750, 1000 }; - - struct input_dev *dev = atkbd->dev; - unsigned char param; - int i = 0, j = 0; - - while (i < ARRAY_SIZE(period) - 1 && period[i] < dev->rep[REP_PERIOD]) - i++; - dev->rep[REP_PERIOD] = period[i]; - - while (j < ARRAY_SIZE(delay) - 1 && delay[j] < dev->rep[REP_DELAY]) - j++; - dev->rep[REP_DELAY] = delay[j]; - - param = i | (j << 5); - return ps2_command(&atkbd->ps2dev, ¶m, ATKBD_CMD_SETREP); -} - -static int atkbd_set_leds(struct atkbd *atkbd) -{ - struct input_dev *dev = atkbd->dev; - unsigned char param[2]; - - param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0) - | (test_bit(LED_NUML, dev->led) ? 2 : 0) - | (test_bit(LED_CAPSL, dev->led) ? 4 : 0); - if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS)) - return -1; - - if (atkbd->extra) { - param[0] = 0; - param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0) - | (test_bit(LED_SLEEP, dev->led) ? 0x02 : 0) - | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0) - | (test_bit(LED_MISC, dev->led) ? 0x10 : 0) - | (test_bit(LED_MUTE, dev->led) ? 0x20 : 0); - if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS)) - return -1; - } - - return 0; -} - -/* - * atkbd_event_work() is used to complete processing of events that - * can not be processed by input_event() which is often called from - * interrupt context. - */ - -static void atkbd_event_work(struct work_struct *work) -{ - struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work); - - mutex_lock(&atkbd->mutex); - - if (!atkbd->enabled) { - /* - * Serio ports are resumed asynchronously so while driver core - * thinks that device is already fully operational in reality - * it may not be ready yet. In this case we need to keep - * rescheduling till reconnect completes. - */ - schedule_delayed_work(&atkbd->event_work, - msecs_to_jiffies(100)); - } else { - if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) - atkbd_set_leds(atkbd); - - if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) - atkbd_set_repeat_rate(atkbd); - } - - mutex_unlock(&atkbd->mutex); -} - -/* - * Schedule switch for execution. We need to throttle requests, - * otherwise keyboard may become unresponsive. - */ -static void atkbd_schedule_event_work(struct atkbd *atkbd, int event_bit) -{ - unsigned long delay = msecs_to_jiffies(50); - - if (time_after(jiffies, atkbd->event_jiffies + delay)) - delay = 0; - - atkbd->event_jiffies = jiffies; - set_bit(event_bit, &atkbd->event_mask); - mb(); - schedule_delayed_work(&atkbd->event_work, delay); -} - -/* - * Event callback from the input module. Events that change the state of - * the hardware are processed here. If action can not be performed in - * interrupt context it is offloaded to atkbd_event_work. - */ - -static int atkbd_event(struct input_dev *dev, - unsigned int type, unsigned int code, int value) -{ - struct atkbd *atkbd = input_get_drvdata(dev); - - if (!atkbd->write) - return -1; - - switch (type) { - - case EV_LED: - atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT); - return 0; - - case EV_REP: - if (!atkbd->softrepeat) - atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT); - return 0; - - default: - return -1; - } -} - -/* - * atkbd_enable() signals that interrupt handler is allowed to - * generate input events. - */ - -static inline void atkbd_enable(struct atkbd *atkbd) -{ - serio_pause_rx(atkbd->ps2dev.serio); - atkbd->enabled = true; - serio_continue_rx(atkbd->ps2dev.serio); -} - -/* - * atkbd_disable() tells input handler that all incoming data except - * for ACKs and command response should be dropped. - */ - -static inline void atkbd_disable(struct atkbd *atkbd) -{ - serio_pause_rx(atkbd->ps2dev.serio); - atkbd->enabled = false; - serio_continue_rx(atkbd->ps2dev.serio); -} - -/* - * atkbd_probe() probes for an AT keyboard on a serio port. - */ - -static int atkbd_probe(struct atkbd *atkbd) -{ - struct ps2dev *ps2dev = &atkbd->ps2dev; - unsigned char param[2]; - -/* - * Some systems, where the bit-twiddling when testing the io-lines of the - * controller may confuse the keyboard need a full reset of the keyboard. On - * these systems the BIOS also usually doesn't do it for us. - */ - - if (atkbd_reset) - if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT)) - dev_warn(&ps2dev->serio->dev, - "keyboard reset failed on %s\n", - ps2dev->serio->phys); - -/* - * Then we check the keyboard ID. We should get 0xab83 under normal conditions. - * Some keyboards report different values, but the first byte is always 0xab or - * 0xac. Some old AT keyboards don't report anything. If a mouse is connected, this - * should make sure we don't try to set the LEDs on it. - */ - - param[0] = param[1] = 0xa5; /* initialize with invalid values */ - if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) { - -/* - * If the get ID command failed, we check if we can at least set the LEDs on - * the keyboard. This should work on every keyboard out there. It also turns - * the LEDs off, which we want anyway. - */ - param[0] = 0; - if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS)) - return -1; - atkbd->id = 0xabba; - return 0; - } - - if (!ps2_is_keyboard_id(param[0])) - return -1; - - atkbd->id = (param[0] << 8) | param[1]; - - if (atkbd->id == 0xaca1 && atkbd->translated) { - dev_err(&ps2dev->serio->dev, - "NCD terminal keyboards are only supported on non-translating controlelrs. " - "Use i8042.direct=1 to disable translation.\n"); - return -1; - } - - return 0; -} - -/* - * atkbd_select_set checks if a keyboard has a working Set 3 support, and - * sets it into that. Unfortunately there are keyboards that can be switched - * to Set 3, but don't work well in that (BTC Multimedia ...) - */ - -static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra) -{ - struct ps2dev *ps2dev = &atkbd->ps2dev; - unsigned char param[2]; - - atkbd->extra = false; -/* - * For known special keyboards we can go ahead and set the correct set. - * We check for NCD PS/2 Sun, NorthGate OmniKey 101 and - * IBM RapidAccess / IBM EzButton / Chicony KBP-8993 keyboards. - */ - - if (atkbd->translated) - return 2; - - if (atkbd->id == 0xaca1) { - param[0] = 3; - ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET); - return 3; - } - - if (allow_extra) { - param[0] = 0x71; - if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) { - atkbd->extra = true; - return 2; - } - } - - if (atkbd_terminal) { - ps2_command(ps2dev, param, ATKBD_CMD_SETALL_MB); - return 3; - } - - if (target_set != 3) - return 2; - - if (!ps2_command(ps2dev, param, ATKBD_CMD_OK_GETID)) { - atkbd->id = param[0] << 8 | param[1]; - return 2; - } - - param[0] = 3; - if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET)) - return 2; - - param[0] = 0; - if (ps2_command(ps2dev, param, ATKBD_CMD_GSCANSET)) - return 2; - - if (param[0] != 3) { - param[0] = 2; - if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET)) - return 2; - } - - ps2_command(ps2dev, param, ATKBD_CMD_SETALL_MBR); - - return 3; -} - -static int atkbd_reset_state(struct atkbd *atkbd) -{ - struct ps2dev *ps2dev = &atkbd->ps2dev; - unsigned char param[1]; - -/* - * Set the LEDs to a predefined state (all off). - */ - - param[0] = 0; - if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS)) - return -1; - -/* - * Set autorepeat to fastest possible. - */ - - param[0] = 0; - if (ps2_command(ps2dev, param, ATKBD_CMD_SETREP)) - return -1; - - return 0; -} - -static int atkbd_activate(struct atkbd *atkbd) -{ - struct ps2dev *ps2dev = &atkbd->ps2dev; - -/* - * Enable the keyboard to receive keystrokes. - */ - - if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) { - dev_err(&ps2dev->serio->dev, - "Failed to enable keyboard on %s\n", - ps2dev->serio->phys); - return -1; - } - - return 0; -} - -/* - * atkbd_cleanup() restores the keyboard state so that BIOS is happy after a - * reboot. - */ - -static void atkbd_cleanup(struct serio *serio) -{ - struct atkbd *atkbd = serio_get_drvdata(serio); - - atkbd_disable(atkbd); - ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_DEF); -} - - -/* - * atkbd_disconnect() closes and frees. - */ - -static void atkbd_disconnect(struct serio *serio) -{ - struct atkbd *atkbd = serio_get_drvdata(serio); - - sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); - - atkbd_disable(atkbd); - - input_unregister_device(atkbd->dev); - - /* - * Make sure we don't have a command in flight. - * Note that since atkbd->enabled is false event work will keep - * rescheduling itself until it gets canceled and will not try - * accessing freed input device or serio port. - */ - cancel_delayed_work_sync(&atkbd->event_work); - - serio_close(serio); - serio_set_drvdata(serio, NULL); - kfree(atkbd); -} - -/* - * generate release events for the keycodes given in data - */ -static void atkbd_apply_forced_release_keylist(struct atkbd* atkbd, - const void *data) -{ - const unsigned int *keys = data; - unsigned int i; - - if (atkbd->set == 2) - for (i = 0; keys[i] != -1U; i++) - __set_bit(keys[i], atkbd->force_release_mask); -} - -/* - * Most special keys (Fn+F?) on Dell laptops do not generate release - * events so we have to do it ourselves. - */ -static unsigned int atkbd_dell_laptop_forced_release_keys[] = { - 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8f, 0x93, -1U -}; - -/* - * Perform fixup for HP system that doesn't generate release - * for its video switch - */ -static unsigned int atkbd_hp_forced_release_keys[] = { - 0x94, -1U -}; - -/* - * Samsung NC10,NC20 with Fn+F? key release not working - */ -static unsigned int atkbd_samsung_forced_release_keys[] = { - 0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0xb3, 0xf7, 0xf9, -1U -}; - -/* - * Amilo Pi 3525 key release for Fn+Volume keys not working - */ -static unsigned int atkbd_amilo_pi3525_forced_release_keys[] = { - 0x20, 0xa0, 0x2e, 0xae, 0x30, 0xb0, -1U -}; - -/* - * Amilo Xi 3650 key release for light touch bar not working - */ -static unsigned int atkbd_amilo_xi3650_forced_release_keys[] = { - 0x67, 0xed, 0x90, 0xa2, 0x99, 0xa4, 0xae, 0xb0, -1U -}; - -/* - * Soltech TA12 system with broken key release on volume keys and mute key - */ -static unsigned int atkdb_soltech_ta12_forced_release_keys[] = { - 0xa0, 0xae, 0xb0, -1U -}; - -/* - * Many notebooks don't send key release event for volume up/down - * keys, with key list below common among them - */ -static unsigned int atkbd_volume_forced_release_keys[] = { - 0xae, 0xb0, -1U -}; - -/* - * OQO 01+ multimedia keys (64--66) generate e0 6x upon release whereas - * they should be generating e4-e6 (0x80 | code). - */ -static unsigned int atkbd_oqo_01plus_scancode_fixup(struct atkbd *atkbd, - unsigned int code) -{ - if (atkbd->translated && atkbd->emul == 1 && - (code == 0x64 || code == 0x65 || code == 0x66)) { - atkbd->emul = 0; - code |= 0x80; - } - - return code; -} - -/* - * atkbd_set_keycode_table() initializes keyboard's keycode table - * according to the selected scancode set - */ - -static void atkbd_set_keycode_table(struct atkbd *atkbd) -{ - unsigned int scancode; - int i, j; - - memset(atkbd->keycode, 0, sizeof(atkbd->keycode)); - bitmap_zero(atkbd->force_release_mask, ATKBD_KEYMAP_SIZE); - - if (atkbd->translated) { - for (i = 0; i < 128; i++) { - scancode = atkbd_unxlate_table[i]; - atkbd->keycode[i] = atkbd_set2_keycode[scancode]; - atkbd->keycode[i | 0x80] = atkbd_set2_keycode[scancode | 0x80]; - if (atkbd->scroll) - for (j = 0; j < ARRAY_SIZE(atkbd_scroll_keys); j++) - if ((scancode | 0x80) == atkbd_scroll_keys[j].set2) - atkbd->keycode[i | 0x80] = atkbd_scroll_keys[j].keycode; - } - } else if (atkbd->set == 3) { - memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode)); - } else { - memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode)); - - if (atkbd->scroll) - for (i = 0; i < ARRAY_SIZE(atkbd_scroll_keys); i++) { - scancode = atkbd_scroll_keys[i].set2; - atkbd->keycode[scancode] = atkbd_scroll_keys[i].keycode; - } - } - -/* - * HANGEUL and HANJA keys do not send release events so we need to - * generate such events ourselves - */ - scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANGEUL); - atkbd->keycode[scancode] = KEY_HANGEUL; - __set_bit(scancode, atkbd->force_release_mask); - - scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANJA); - atkbd->keycode[scancode] = KEY_HANJA; - __set_bit(scancode, atkbd->force_release_mask); - -/* - * Perform additional fixups - */ - if (atkbd_platform_fixup) - atkbd_platform_fixup(atkbd, atkbd_platform_fixup_data); -} - -/* - * atkbd_set_device_attrs() sets up keyboard's input device structure - */ - -static void atkbd_set_device_attrs(struct atkbd *atkbd) -{ - struct input_dev *input_dev = atkbd->dev; - int i; - - if (atkbd->extra) - snprintf(atkbd->name, sizeof(atkbd->name), - "AT Set 2 Extra keyboard"); - else - snprintf(atkbd->name, sizeof(atkbd->name), - "AT %s Set %d keyboard", - atkbd->translated ? "Translated" : "Raw", atkbd->set); - - snprintf(atkbd->phys, sizeof(atkbd->phys), - "%s/input0", atkbd->ps2dev.serio->phys); - - input_dev->name = atkbd->name; - input_dev->phys = atkbd->phys; - input_dev->id.bustype = BUS_I8042; - input_dev->id.vendor = 0x0001; - input_dev->id.product = atkbd->translated ? 1 : atkbd->set; - input_dev->id.version = atkbd->id; - input_dev->event = atkbd_event; - input_dev->dev.parent = &atkbd->ps2dev.serio->dev; - - input_set_drvdata(input_dev, atkbd); - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | - BIT_MASK(EV_MSC); - - if (atkbd->write) { - input_dev->evbit[0] |= BIT_MASK(EV_LED); - input_dev->ledbit[0] = BIT_MASK(LED_NUML) | - BIT_MASK(LED_CAPSL) | BIT_MASK(LED_SCROLLL); - } - - if (atkbd->extra) - input_dev->ledbit[0] |= BIT_MASK(LED_COMPOSE) | - BIT_MASK(LED_SUSPEND) | BIT_MASK(LED_SLEEP) | - BIT_MASK(LED_MUTE) | BIT_MASK(LED_MISC); - - if (!atkbd->softrepeat) { - input_dev->rep[REP_DELAY] = 250; - input_dev->rep[REP_PERIOD] = 33; - } - - input_dev->mscbit[0] = atkbd->softraw ? BIT_MASK(MSC_SCAN) : - BIT_MASK(MSC_RAW) | BIT_MASK(MSC_SCAN); - - if (atkbd->scroll) { - input_dev->evbit[0] |= BIT_MASK(EV_REL); - input_dev->relbit[0] = BIT_MASK(REL_WHEEL) | - BIT_MASK(REL_HWHEEL); - __set_bit(BTN_MIDDLE, input_dev->keybit); - } - - input_dev->keycode = atkbd->keycode; - input_dev->keycodesize = sizeof(unsigned short); - input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode); - - for (i = 0; i < ATKBD_KEYMAP_SIZE; i++) { - if (atkbd->keycode[i] != KEY_RESERVED && - atkbd->keycode[i] != ATKBD_KEY_NULL && - atkbd->keycode[i] < ATKBD_SPECIAL) { - __set_bit(atkbd->keycode[i], input_dev->keybit); - } - } -} - -/* - * atkbd_connect() is called when the serio module finds an interface - * that isn't handled yet by an appropriate device driver. We check if - * there is an AT keyboard out there and if yes, we register ourselves - * to the input module. - */ - -static int atkbd_connect(struct serio *serio, struct serio_driver *drv) -{ - struct atkbd *atkbd; - struct input_dev *dev; - int err = -ENOMEM; - - atkbd = kzalloc(sizeof(struct atkbd), GFP_KERNEL); - dev = input_allocate_device(); - if (!atkbd || !dev) - goto fail1; - - atkbd->dev = dev; - ps2_init(&atkbd->ps2dev, serio); - INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work); - mutex_init(&atkbd->mutex); - - switch (serio->id.type) { - - case SERIO_8042_XL: - atkbd->translated = true; - /* Fall through */ - - case SERIO_8042: - if (serio->write) - atkbd->write = true; - break; - } - - atkbd->softraw = atkbd_softraw; - atkbd->softrepeat = atkbd_softrepeat; - atkbd->scroll = atkbd_scroll; - - if (atkbd->softrepeat) - atkbd->softraw = true; - - serio_set_drvdata(serio, atkbd); - - err = serio_open(serio, drv); - if (err) - goto fail2; - - if (atkbd->write) { - - if (atkbd_probe(atkbd)) { - err = -ENODEV; - goto fail3; - } - - atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra); - atkbd_reset_state(atkbd); - atkbd_activate(atkbd); - - } else { - atkbd->set = 2; - atkbd->id = 0xab00; - } - - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - - err = sysfs_create_group(&serio->dev.kobj, &atkbd_attribute_group); - if (err) - goto fail3; - - atkbd_enable(atkbd); - - err = input_register_device(atkbd->dev); - if (err) - goto fail4; - - return 0; - - fail4: sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); - fail3: serio_close(serio); - fail2: serio_set_drvdata(serio, NULL); - fail1: input_free_device(dev); - kfree(atkbd); - return err; -} - -/* - * atkbd_reconnect() tries to restore keyboard into a sane state and is - * most likely called on resume. - */ - -static int atkbd_reconnect(struct serio *serio) -{ - struct atkbd *atkbd = serio_get_drvdata(serio); - struct serio_driver *drv = serio->drv; - int retval = -1; - - if (!atkbd || !drv) { - dev_dbg(&serio->dev, - "reconnect request, but serio is disconnected, ignoring...\n"); - return -1; - } - - mutex_lock(&atkbd->mutex); - - atkbd_disable(atkbd); - - if (atkbd->write) { - if (atkbd_probe(atkbd)) - goto out; - - if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) - goto out; - - atkbd_activate(atkbd); - - /* - * Restore LED state and repeat rate. While input core - * will do this for us at resume time reconnect may happen - * because user requested it via sysfs or simply because - * keyboard was unplugged and plugged in again so we need - * to do it ourselves here. - */ - atkbd_set_leds(atkbd); - if (!atkbd->softrepeat) - atkbd_set_repeat_rate(atkbd); - - } - - atkbd_enable(atkbd); - retval = 0; - - out: - mutex_unlock(&atkbd->mutex); - return retval; -} - -static struct serio_device_id atkbd_serio_ids[] = { - { - .type = SERIO_8042, - .proto = SERIO_ANY, - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { - .type = SERIO_8042_XL, - .proto = SERIO_ANY, - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { - .type = SERIO_RS232, - .proto = SERIO_PS2SER, - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { 0 } -}; - -MODULE_DEVICE_TABLE(serio, atkbd_serio_ids); - -static struct serio_driver atkbd_drv = { - .driver = { - .name = "atkbd", - }, - .description = DRIVER_DESC, - .id_table = atkbd_serio_ids, - .interrupt = atkbd_interrupt, - .connect = atkbd_connect, - .reconnect = atkbd_reconnect, - .disconnect = atkbd_disconnect, - .cleanup = atkbd_cleanup, -}; - -static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, - ssize_t (*handler)(struct atkbd *, char *)) -{ - struct serio *serio = to_serio_port(dev); - struct atkbd *atkbd = serio_get_drvdata(serio); - - return handler(atkbd, buf); -} - -static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, - ssize_t (*handler)(struct atkbd *, const char *, size_t)) -{ - struct serio *serio = to_serio_port(dev); - struct atkbd *atkbd = serio_get_drvdata(serio); - int retval; - - retval = mutex_lock_interruptible(&atkbd->mutex); - if (retval) - return retval; - - atkbd_disable(atkbd); - retval = handler(atkbd, buf, count); - atkbd_enable(atkbd); - - mutex_unlock(&atkbd->mutex); - - return retval; -} - -static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf) -{ - return sprintf(buf, "%d\n", atkbd->extra ? 1 : 0); -} - -static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count) -{ - struct input_dev *old_dev, *new_dev; - unsigned int value; - int err; - bool old_extra; - unsigned char old_set; - - if (!atkbd->write) - return -EIO; - - err = kstrtouint(buf, 10, &value); - if (err) - return err; - - if (value > 1) - return -EINVAL; - - if (atkbd->extra != value) { - /* - * Since device's properties will change we need to - * unregister old device. But allocate and register - * new one first to make sure we have it. - */ - old_dev = atkbd->dev; - old_extra = atkbd->extra; - old_set = atkbd->set; - - new_dev = input_allocate_device(); - if (!new_dev) - return -ENOMEM; - - atkbd->dev = new_dev; - atkbd->set = atkbd_select_set(atkbd, atkbd->set, value); - atkbd_reset_state(atkbd); - atkbd_activate(atkbd); - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - - err = input_register_device(atkbd->dev); - if (err) { - input_free_device(new_dev); - - atkbd->dev = old_dev; - atkbd->set = atkbd_select_set(atkbd, old_set, old_extra); - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - - return err; - } - input_unregister_device(old_dev); - - } - return count; -} - -static ssize_t atkbd_show_force_release(struct atkbd *atkbd, char *buf) -{ - size_t len = bitmap_scnlistprintf(buf, PAGE_SIZE - 2, - atkbd->force_release_mask, ATKBD_KEYMAP_SIZE); - - buf[len++] = '\n'; - buf[len] = '\0'; - - return len; -} - -static ssize_t atkbd_set_force_release(struct atkbd *atkbd, - const char *buf, size_t count) -{ - /* 64 bytes on stack should be acceptable */ - DECLARE_BITMAP(new_mask, ATKBD_KEYMAP_SIZE); - int err; - - err = bitmap_parselist(buf, new_mask, ATKBD_KEYMAP_SIZE); - if (err) - return err; - - memcpy(atkbd->force_release_mask, new_mask, sizeof(atkbd->force_release_mask)); - return count; -} - - -static ssize_t atkbd_show_scroll(struct atkbd *atkbd, char *buf) -{ - return sprintf(buf, "%d\n", atkbd->scroll ? 1 : 0); -} - -static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t count) -{ - struct input_dev *old_dev, *new_dev; - unsigned int value; - int err; - bool old_scroll; - - err = kstrtouint(buf, 10, &value); - if (err) - return err; - - if (value > 1) - return -EINVAL; - - if (atkbd->scroll != value) { - old_dev = atkbd->dev; - old_scroll = atkbd->scroll; - - new_dev = input_allocate_device(); - if (!new_dev) - return -ENOMEM; - - atkbd->dev = new_dev; - atkbd->scroll = value; - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - - err = input_register_device(atkbd->dev); - if (err) { - input_free_device(new_dev); - - atkbd->scroll = old_scroll; - atkbd->dev = old_dev; - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - - return err; - } - input_unregister_device(old_dev); - } - return count; -} - -static ssize_t atkbd_show_set(struct atkbd *atkbd, char *buf) -{ - return sprintf(buf, "%d\n", atkbd->set); -} - -static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count) -{ - struct input_dev *old_dev, *new_dev; - unsigned int value; - int err; - unsigned char old_set; - bool old_extra; - - if (!atkbd->write) - return -EIO; - - err = kstrtouint(buf, 10, &value); - if (err) - return err; - - if (value != 2 && value != 3) - return -EINVAL; - - if (atkbd->set != value) { - old_dev = atkbd->dev; - old_extra = atkbd->extra; - old_set = atkbd->set; - - new_dev = input_allocate_device(); - if (!new_dev) - return -ENOMEM; - - atkbd->dev = new_dev; - atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra); - atkbd_reset_state(atkbd); - atkbd_activate(atkbd); - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - - err = input_register_device(atkbd->dev); - if (err) { - input_free_device(new_dev); - - atkbd->dev = old_dev; - atkbd->set = atkbd_select_set(atkbd, old_set, old_extra); - atkbd_set_keycode_table(atkbd); - atkbd_set_device_attrs(atkbd); - - return err; - } - input_unregister_device(old_dev); - } - return count; -} - -static ssize_t atkbd_show_softrepeat(struct atkbd *atkbd, char *buf) -{ - return sprintf(buf, "%d\n", atkbd->softrepeat ? 1 : 0); -} - -static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t count) -{ - struct input_dev *old_dev, *new_dev; - unsigned int value; - int err; - bool old_softrepeat, old_softraw; - - if (!atkbd->write) - return -EIO; - - err = kstrtouint(buf, 10, &value); - if (err) - return err; - - if (value > 1) - return -EINVAL; - - if (atkbd->softrepeat != value) { - old_dev = atkbd->dev; - old_softrepeat = atkbd->softrepeat; - old_softraw = atkbd->softraw; - - new_dev = input_allocate_device(); - if (!new_dev) - return -ENOMEM; - - atkbd->dev = new_dev; - atkbd->softrepeat = value; - if (atkbd->softrepeat) - atkbd->softraw = true; - atkbd_set_device_attrs(atkbd); - - err = input_register_device(atkbd->dev); - if (err) { - input_free_device(new_dev); - - atkbd->dev = old_dev; - atkbd->softrepeat = old_softrepeat; - atkbd->softraw = old_softraw; - atkbd_set_device_attrs(atkbd); - - return err; - } - input_unregister_device(old_dev); - } - return count; -} - - -static ssize_t atkbd_show_softraw(struct atkbd *atkbd, char *buf) -{ - return sprintf(buf, "%d\n", atkbd->softraw ? 1 : 0); -} - -static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t count) -{ - struct input_dev *old_dev, *new_dev; - unsigned int value; - int err; - bool old_softraw; - - err = kstrtouint(buf, 10, &value); - if (err) - return err; - - if (value > 1) - return -EINVAL; - - if (atkbd->softraw != value) { - old_dev = atkbd->dev; - old_softraw = atkbd->softraw; - - new_dev = input_allocate_device(); - if (!new_dev) - return -ENOMEM; - - atkbd->dev = new_dev; - atkbd->softraw = value; - atkbd_set_device_attrs(atkbd); - - err = input_register_device(atkbd->dev); - if (err) { - input_free_device(new_dev); - - atkbd->dev = old_dev; - atkbd->softraw = old_softraw; - atkbd_set_device_attrs(atkbd); - - return err; - } - input_unregister_device(old_dev); - } - return count; -} - -static ssize_t atkbd_show_err_count(struct atkbd *atkbd, char *buf) -{ - return sprintf(buf, "%lu\n", atkbd->err_count); -} - -static int __init atkbd_setup_forced_release(const struct dmi_system_id *id) -{ - atkbd_platform_fixup = atkbd_apply_forced_release_keylist; - atkbd_platform_fixup_data = id->driver_data; - - return 1; -} - -static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id) -{ - atkbd_platform_scancode_fixup = id->driver_data; - - return 1; -} - -static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_dell_laptop_forced_release_keys, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), - DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_dell_laptop_forced_release_keys, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), - DMI_MATCH(DMI_PRODUCT_NAME, "HP 2133"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_hp_forced_release_keys, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), - DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_volume_forced_release_keys, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), - DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_volume_forced_release_keys, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), - DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_volume_forced_release_keys, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), - DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_volume_forced_release_keys, - }, - { - /* Inventec Symphony */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"), - DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_volume_forced_release_keys, - }, - { - /* Samsung NC10 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), - DMI_MATCH(DMI_PRODUCT_NAME, "NC10"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_samsung_forced_release_keys, - }, - { - /* Samsung NC20 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), - DMI_MATCH(DMI_PRODUCT_NAME, "NC20"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_samsung_forced_release_keys, - }, - { - /* Samsung SQ45S70S */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), - DMI_MATCH(DMI_PRODUCT_NAME, "SQ45S70S"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_samsung_forced_release_keys, - }, - { - /* Fujitsu Amilo PA 1510 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), - DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_volume_forced_release_keys, - }, - { - /* Fujitsu Amilo Pi 3525 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), - DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 3525"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_amilo_pi3525_forced_release_keys, - }, - { - /* Fujitsu Amilo Xi 3650 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), - DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 3650"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkbd_amilo_xi3650_forced_release_keys, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Soltech Corporation"), - DMI_MATCH(DMI_PRODUCT_NAME, "TA12"), - }, - .callback = atkbd_setup_forced_release, - .driver_data = atkdb_soltech_ta12_forced_release_keys, - }, - { - /* OQO Model 01+ */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "OQO"), - DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"), - }, - .callback = atkbd_setup_scancode_fixup, - .driver_data = atkbd_oqo_01plus_scancode_fixup, - }, - { } -}; - -static int __init atkbd_init(void) -{ - dmi_check_system(atkbd_dmi_quirk_table); - - return serio_register_driver(&atkbd_drv); -} - -static void __exit atkbd_exit(void) -{ - serio_unregister_driver(&atkbd_drv); -} - -module_init(atkbd_init); -module_exit(atkbd_exit); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/bf54x-keys.c b/ANDROID_3.4.5/drivers/input/keyboard/bf54x-keys.c deleted file mode 100644 index 8eb9116e..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/bf54x-keys.c +++ /dev/null @@ -1,402 +0,0 @@ -/* - * File: drivers/input/keyboard/bf54x-keys.c - * Based on: - * Author: Michael Hennerich <hennerich@blackfin.uclinux.org> - * - * Created: - * Description: keypad driver for Analog Devices Blackfin BF54x Processors - * - * - * Modified: - * Copyright 2007-2008 Analog Devices Inc. - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> - -#include <linux/init.h> -#include <linux/fs.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/slab.h> -#include <linux/sched.h> -#include <linux/pm.h> -#include <linux/sysctl.h> -#include <linux/proc_fs.h> -#include <linux/delay.h> -#include <linux/platform_device.h> -#include <linux/input.h> - -#include <asm/portmux.h> -#include <mach/bf54x_keys.h> - -#define DRV_NAME "bf54x-keys" -#define TIME_SCALE 100 /* 100 ns */ -#define MAX_MULT (0xFF * TIME_SCALE) -#define MAX_RC 8 /* Max Row/Col */ - -static const u16 per_rows[] = { - P_KEY_ROW7, - P_KEY_ROW6, - P_KEY_ROW5, - P_KEY_ROW4, - P_KEY_ROW3, - P_KEY_ROW2, - P_KEY_ROW1, - P_KEY_ROW0, - 0 -}; - -static const u16 per_cols[] = { - P_KEY_COL7, - P_KEY_COL6, - P_KEY_COL5, - P_KEY_COL4, - P_KEY_COL3, - P_KEY_COL2, - P_KEY_COL1, - P_KEY_COL0, - 0 -}; - -struct bf54x_kpad { - struct input_dev *input; - int irq; - unsigned short lastkey; - unsigned short *keycode; - struct timer_list timer; - unsigned int keyup_test_jiffies; - unsigned short kpad_msel; - unsigned short kpad_prescale; - unsigned short kpad_ctl; -}; - -static inline int bfin_kpad_find_key(struct bf54x_kpad *bf54x_kpad, - struct input_dev *input, u16 keyident) -{ - u16 i; - - for (i = 0; i < input->keycodemax; i++) - if (bf54x_kpad->keycode[i + input->keycodemax] == keyident) - return bf54x_kpad->keycode[i]; - return -1; -} - -static inline void bfin_keycodecpy(unsigned short *keycode, - const unsigned int *pdata_kc, - unsigned short keymapsize) -{ - unsigned int i; - - for (i = 0; i < keymapsize; i++) { - keycode[i] = pdata_kc[i] & 0xffff; - keycode[i + keymapsize] = pdata_kc[i] >> 16; - } -} - -static inline u16 bfin_kpad_get_prescale(u32 timescale) -{ - u32 sclk = get_sclk(); - - return ((((sclk / 1000) * timescale) / 1024) - 1); -} - -static inline u16 bfin_kpad_get_keypressed(struct bf54x_kpad *bf54x_kpad) -{ - return (bfin_read_KPAD_STAT() & KPAD_PRESSED); -} - -static inline void bfin_kpad_clear_irq(void) -{ - bfin_write_KPAD_STAT(0xFFFF); - bfin_write_KPAD_ROWCOL(0xFFFF); -} - -static void bfin_kpad_timer(unsigned long data) -{ - struct platform_device *pdev = (struct platform_device *) data; - struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); - - if (bfin_kpad_get_keypressed(bf54x_kpad)) { - /* Try again later */ - mod_timer(&bf54x_kpad->timer, - jiffies + bf54x_kpad->keyup_test_jiffies); - return; - } - - input_report_key(bf54x_kpad->input, bf54x_kpad->lastkey, 0); - input_sync(bf54x_kpad->input); - - /* Clear IRQ Status */ - - bfin_kpad_clear_irq(); - enable_irq(bf54x_kpad->irq); -} - -static irqreturn_t bfin_kpad_isr(int irq, void *dev_id) -{ - struct platform_device *pdev = dev_id; - struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); - struct input_dev *input = bf54x_kpad->input; - int key; - u16 rowcol = bfin_read_KPAD_ROWCOL(); - - key = bfin_kpad_find_key(bf54x_kpad, input, rowcol); - - input_report_key(input, key, 1); - input_sync(input); - - if (bfin_kpad_get_keypressed(bf54x_kpad)) { - disable_irq_nosync(bf54x_kpad->irq); - bf54x_kpad->lastkey = key; - mod_timer(&bf54x_kpad->timer, - jiffies + bf54x_kpad->keyup_test_jiffies); - } else { - input_report_key(input, key, 0); - input_sync(input); - - bfin_kpad_clear_irq(); - } - - return IRQ_HANDLED; -} - -static int __devinit bfin_kpad_probe(struct platform_device *pdev) -{ - struct bf54x_kpad *bf54x_kpad; - struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data; - struct input_dev *input; - int i, error; - - if (!pdata->rows || !pdata->cols || !pdata->keymap) { - dev_err(&pdev->dev, "no rows, cols or keymap from pdata\n"); - return -EINVAL; - } - - if (!pdata->keymapsize || - pdata->keymapsize > (pdata->rows * pdata->cols)) { - dev_err(&pdev->dev, "invalid keymapsize\n"); - return -EINVAL; - } - - bf54x_kpad = kzalloc(sizeof(struct bf54x_kpad), GFP_KERNEL); - if (!bf54x_kpad) - return -ENOMEM; - - platform_set_drvdata(pdev, bf54x_kpad); - - /* Allocate memory for keymap followed by private LUT */ - bf54x_kpad->keycode = kmalloc(pdata->keymapsize * - sizeof(unsigned short) * 2, GFP_KERNEL); - if (!bf54x_kpad->keycode) { - error = -ENOMEM; - goto out; - } - - if (!pdata->debounce_time || pdata->debounce_time > MAX_MULT || - !pdata->coldrive_time || pdata->coldrive_time > MAX_MULT) { - dev_warn(&pdev->dev, - "invalid platform debounce/columndrive time\n"); - bfin_write_KPAD_MSEL(0xFF0); /* Default MSEL */ - } else { - bfin_write_KPAD_MSEL( - ((pdata->debounce_time / TIME_SCALE) - & DBON_SCALE) | - (((pdata->coldrive_time / TIME_SCALE) << 8) - & COLDRV_SCALE)); - - } - - if (!pdata->keyup_test_interval) - bf54x_kpad->keyup_test_jiffies = msecs_to_jiffies(50); - else - bf54x_kpad->keyup_test_jiffies = - msecs_to_jiffies(pdata->keyup_test_interval); - - if (peripheral_request_list((u16 *)&per_rows[MAX_RC - pdata->rows], - DRV_NAME)) { - dev_err(&pdev->dev, "requesting peripherals failed\n"); - error = -EFAULT; - goto out0; - } - - if (peripheral_request_list((u16 *)&per_cols[MAX_RC - pdata->cols], - DRV_NAME)) { - dev_err(&pdev->dev, "requesting peripherals failed\n"); - error = -EFAULT; - goto out1; - } - - bf54x_kpad->irq = platform_get_irq(pdev, 0); - if (bf54x_kpad->irq < 0) { - error = -ENODEV; - goto out2; - } - - error = request_irq(bf54x_kpad->irq, bfin_kpad_isr, - 0, DRV_NAME, pdev); - if (error) { - dev_err(&pdev->dev, "unable to claim irq %d\n", - bf54x_kpad->irq); - goto out2; - } - - input = input_allocate_device(); - if (!input) { - error = -ENOMEM; - goto out3; - } - - bf54x_kpad->input = input; - - input->name = pdev->name; - input->phys = "bf54x-keys/input0"; - input->dev.parent = &pdev->dev; - - input_set_drvdata(input, bf54x_kpad); - - input->id.bustype = BUS_HOST; - input->id.vendor = 0x0001; - input->id.product = 0x0001; - input->id.version = 0x0100; - - input->keycodesize = sizeof(unsigned short); - input->keycodemax = pdata->keymapsize; - input->keycode = bf54x_kpad->keycode; - - bfin_keycodecpy(bf54x_kpad->keycode, pdata->keymap, pdata->keymapsize); - - /* setup input device */ - __set_bit(EV_KEY, input->evbit); - - if (pdata->repeat) - __set_bit(EV_REP, input->evbit); - - for (i = 0; i < input->keycodemax; i++) - __set_bit(bf54x_kpad->keycode[i] & KEY_MAX, input->keybit); - __clear_bit(KEY_RESERVED, input->keybit); - - error = input_register_device(input); - if (error) { - dev_err(&pdev->dev, "unable to register input device\n"); - goto out4; - } - - /* Init Keypad Key Up/Release test timer */ - - setup_timer(&bf54x_kpad->timer, bfin_kpad_timer, (unsigned long) pdev); - - bfin_write_KPAD_PRESCALE(bfin_kpad_get_prescale(TIME_SCALE)); - - bfin_write_KPAD_CTL((((pdata->cols - 1) << 13) & KPAD_COLEN) | - (((pdata->rows - 1) << 10) & KPAD_ROWEN) | - (2 & KPAD_IRQMODE)); - - bfin_write_KPAD_CTL(bfin_read_KPAD_CTL() | KPAD_EN); - - device_init_wakeup(&pdev->dev, 1); - - return 0; - -out4: - input_free_device(input); -out3: - free_irq(bf54x_kpad->irq, pdev); -out2: - peripheral_free_list((u16 *)&per_cols[MAX_RC - pdata->cols]); -out1: - peripheral_free_list((u16 *)&per_rows[MAX_RC - pdata->rows]); -out0: - kfree(bf54x_kpad->keycode); -out: - kfree(bf54x_kpad); - platform_set_drvdata(pdev, NULL); - - return error; -} - -static int __devexit bfin_kpad_remove(struct platform_device *pdev) -{ - struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data; - struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); - - del_timer_sync(&bf54x_kpad->timer); - free_irq(bf54x_kpad->irq, pdev); - - input_unregister_device(bf54x_kpad->input); - - peripheral_free_list((u16 *)&per_rows[MAX_RC - pdata->rows]); - peripheral_free_list((u16 *)&per_cols[MAX_RC - pdata->cols]); - - kfree(bf54x_kpad->keycode); - kfree(bf54x_kpad); - platform_set_drvdata(pdev, NULL); - - return 0; -} - -#ifdef CONFIG_PM -static int bfin_kpad_suspend(struct platform_device *pdev, pm_message_t state) -{ - struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); - - bf54x_kpad->kpad_msel = bfin_read_KPAD_MSEL(); - bf54x_kpad->kpad_prescale = bfin_read_KPAD_PRESCALE(); - bf54x_kpad->kpad_ctl = bfin_read_KPAD_CTL(); - - if (device_may_wakeup(&pdev->dev)) - enable_irq_wake(bf54x_kpad->irq); - - return 0; -} - -static int bfin_kpad_resume(struct platform_device *pdev) -{ - struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); - - bfin_write_KPAD_MSEL(bf54x_kpad->kpad_msel); - bfin_write_KPAD_PRESCALE(bf54x_kpad->kpad_prescale); - bfin_write_KPAD_CTL(bf54x_kpad->kpad_ctl); - - if (device_may_wakeup(&pdev->dev)) - disable_irq_wake(bf54x_kpad->irq); - - return 0; -} -#else -# define bfin_kpad_suspend NULL -# define bfin_kpad_resume NULL -#endif - -static struct platform_driver bfin_kpad_device_driver = { - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - }, - .probe = bfin_kpad_probe, - .remove = __devexit_p(bfin_kpad_remove), - .suspend = bfin_kpad_suspend, - .resume = bfin_kpad_resume, -}; -module_platform_driver(bfin_kpad_device_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); -MODULE_DESCRIPTION("Keypad driver for BF54x Processors"); -MODULE_ALIAS("platform:bf54x-keys"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/davinci_keyscan.c b/ANDROID_3.4.5/drivers/input/keyboard/davinci_keyscan.c deleted file mode 100644 index 9d82b3ae..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/davinci_keyscan.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * DaVinci Key Scan Driver for TI platforms - * - * Copyright (C) 2009 Texas Instruments, Inc - * - * Author: Miguel Aguilar <miguel.aguilar@ridgerun.com> - * - * Initial Code: Sandeep Paulraj <s-paulraj@ti.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - */ -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/types.h> -#include <linux/input.h> -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/platform_device.h> -#include <linux/errno.h> -#include <linux/slab.h> - -#include <asm/irq.h> - -#include <mach/hardware.h> -#include <mach/irqs.h> -#include <mach/keyscan.h> - -/* Key scan registers */ -#define DAVINCI_KEYSCAN_KEYCTRL 0x0000 -#define DAVINCI_KEYSCAN_INTENA 0x0004 -#define DAVINCI_KEYSCAN_INTFLAG 0x0008 -#define DAVINCI_KEYSCAN_INTCLR 0x000c -#define DAVINCI_KEYSCAN_STRBWIDTH 0x0010 -#define DAVINCI_KEYSCAN_INTERVAL 0x0014 -#define DAVINCI_KEYSCAN_CONTTIME 0x0018 -#define DAVINCI_KEYSCAN_CURRENTST 0x001c -#define DAVINCI_KEYSCAN_PREVSTATE 0x0020 -#define DAVINCI_KEYSCAN_EMUCTRL 0x0024 -#define DAVINCI_KEYSCAN_IODFTCTRL 0x002c - -/* Key Control Register (KEYCTRL) */ -#define DAVINCI_KEYSCAN_KEYEN 0x00000001 -#define DAVINCI_KEYSCAN_PREVMODE 0x00000002 -#define DAVINCI_KEYSCAN_CHATOFF 0x00000004 -#define DAVINCI_KEYSCAN_AUTODET 0x00000008 -#define DAVINCI_KEYSCAN_SCANMODE 0x00000010 -#define DAVINCI_KEYSCAN_OUTTYPE 0x00000020 - -/* Masks for the interrupts */ -#define DAVINCI_KEYSCAN_INT_CONT 0x00000008 -#define DAVINCI_KEYSCAN_INT_OFF 0x00000004 -#define DAVINCI_KEYSCAN_INT_ON 0x00000002 -#define DAVINCI_KEYSCAN_INT_CHANGE 0x00000001 -#define DAVINCI_KEYSCAN_INT_ALL 0x0000000f - -struct davinci_ks { - struct input_dev *input; - struct davinci_ks_platform_data *pdata; - int irq; - void __iomem *base; - resource_size_t pbase; - size_t base_size; - unsigned short keymap[]; -}; - -/* Initializing the kp Module */ -static int __init davinci_ks_initialize(struct davinci_ks *davinci_ks) -{ - struct device *dev = &davinci_ks->input->dev; - struct davinci_ks_platform_data *pdata = davinci_ks->pdata; - u32 matrix_ctrl; - - /* Enable all interrupts */ - __raw_writel(DAVINCI_KEYSCAN_INT_ALL, - davinci_ks->base + DAVINCI_KEYSCAN_INTENA); - - /* Clear interrupts if any */ - __raw_writel(DAVINCI_KEYSCAN_INT_ALL, - davinci_ks->base + DAVINCI_KEYSCAN_INTCLR); - - /* Setup the scan period = strobe + interval */ - __raw_writel(pdata->strobe, - davinci_ks->base + DAVINCI_KEYSCAN_STRBWIDTH); - __raw_writel(pdata->interval, - davinci_ks->base + DAVINCI_KEYSCAN_INTERVAL); - __raw_writel(0x01, - davinci_ks->base + DAVINCI_KEYSCAN_CONTTIME); - - /* Define matrix type */ - switch (pdata->matrix_type) { - case DAVINCI_KEYSCAN_MATRIX_4X4: - matrix_ctrl = 0; - break; - case DAVINCI_KEYSCAN_MATRIX_5X3: - matrix_ctrl = (1 << 6); - break; - default: - dev_err(dev->parent, "wrong matrix type\n"); - return -EINVAL; - } - - /* Enable key scan module and set matrix type */ - __raw_writel(DAVINCI_KEYSCAN_AUTODET | DAVINCI_KEYSCAN_KEYEN | - matrix_ctrl, davinci_ks->base + DAVINCI_KEYSCAN_KEYCTRL); - - return 0; -} - -static irqreturn_t davinci_ks_interrupt(int irq, void *dev_id) -{ - struct davinci_ks *davinci_ks = dev_id; - struct device *dev = &davinci_ks->input->dev; - unsigned short *keymap = davinci_ks->keymap; - int keymapsize = davinci_ks->pdata->keymapsize; - u32 prev_status, new_status, changed; - bool release; - int keycode = KEY_UNKNOWN; - int i; - - /* Disable interrupt */ - __raw_writel(0x0, davinci_ks->base + DAVINCI_KEYSCAN_INTENA); - - /* Reading previous and new status of the key scan */ - prev_status = __raw_readl(davinci_ks->base + DAVINCI_KEYSCAN_PREVSTATE); - new_status = __raw_readl(davinci_ks->base + DAVINCI_KEYSCAN_CURRENTST); - - changed = prev_status ^ new_status; - - if (changed) { - /* - * It goes through all bits in 'changed' to ensure - * that no key changes are being missed - */ - for (i = 0 ; i < keymapsize; i++) { - if ((changed>>i) & 0x1) { - keycode = keymap[i]; - release = (new_status >> i) & 0x1; - dev_dbg(dev->parent, "key %d %s\n", keycode, - release ? "released" : "pressed"); - input_report_key(davinci_ks->input, keycode, - !release); - input_sync(davinci_ks->input); - } - } - /* Clearing interrupt */ - __raw_writel(DAVINCI_KEYSCAN_INT_ALL, - davinci_ks->base + DAVINCI_KEYSCAN_INTCLR); - } - - /* Enable interrupts */ - __raw_writel(0x1, davinci_ks->base + DAVINCI_KEYSCAN_INTENA); - - return IRQ_HANDLED; -} - -static int __init davinci_ks_probe(struct platform_device *pdev) -{ - struct davinci_ks *davinci_ks; - struct input_dev *key_dev; - struct resource *res, *mem; - struct device *dev = &pdev->dev; - struct davinci_ks_platform_data *pdata = pdev->dev.platform_data; - int error, i; - - if (pdata->device_enable) { - error = pdata->device_enable(dev); - if (error < 0) { - dev_dbg(dev, "device enable function failed\n"); - return error; - } - } - - if (!pdata->keymap) { - dev_dbg(dev, "no keymap from pdata\n"); - return -EINVAL; - } - - davinci_ks = kzalloc(sizeof(struct davinci_ks) + - sizeof(unsigned short) * pdata->keymapsize, GFP_KERNEL); - if (!davinci_ks) { - dev_dbg(dev, "could not allocate memory for private data\n"); - return -ENOMEM; - } - - memcpy(davinci_ks->keymap, pdata->keymap, - sizeof(unsigned short) * pdata->keymapsize); - - key_dev = input_allocate_device(); - if (!key_dev) { - dev_dbg(dev, "could not allocate input device\n"); - error = -ENOMEM; - goto fail1; - } - - davinci_ks->input = key_dev; - - davinci_ks->irq = platform_get_irq(pdev, 0); - if (davinci_ks->irq < 0) { - dev_err(dev, "no key scan irq\n"); - error = davinci_ks->irq; - goto fail2; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(dev, "no mem resource\n"); - error = -EINVAL; - goto fail2; - } - - davinci_ks->pbase = res->start; - davinci_ks->base_size = resource_size(res); - - mem = request_mem_region(davinci_ks->pbase, davinci_ks->base_size, - pdev->name); - if (!mem) { - dev_err(dev, "key scan registers at %08x are not free\n", - davinci_ks->pbase); - error = -EBUSY; - goto fail2; - } - - davinci_ks->base = ioremap(davinci_ks->pbase, davinci_ks->base_size); - if (!davinci_ks->base) { - dev_err(dev, "can't ioremap MEM resource.\n"); - error = -ENOMEM; - goto fail3; - } - - /* Enable auto repeat feature of Linux input subsystem */ - if (pdata->rep) - __set_bit(EV_REP, key_dev->evbit); - - /* Setup input device */ - __set_bit(EV_KEY, key_dev->evbit); - - /* Setup the platform data */ - davinci_ks->pdata = pdata; - - for (i = 0; i < davinci_ks->pdata->keymapsize; i++) - __set_bit(davinci_ks->pdata->keymap[i], key_dev->keybit); - - key_dev->name = "davinci_keyscan"; - key_dev->phys = "davinci_keyscan/input0"; - key_dev->dev.parent = &pdev->dev; - key_dev->id.bustype = BUS_HOST; - key_dev->id.vendor = 0x0001; - key_dev->id.product = 0x0001; - key_dev->id.version = 0x0001; - key_dev->keycode = davinci_ks->keymap; - key_dev->keycodesize = sizeof(davinci_ks->keymap[0]); - key_dev->keycodemax = davinci_ks->pdata->keymapsize; - - error = input_register_device(davinci_ks->input); - if (error < 0) { - dev_err(dev, "unable to register davinci key scan device\n"); - goto fail4; - } - - error = request_irq(davinci_ks->irq, davinci_ks_interrupt, - 0, pdev->name, davinci_ks); - if (error < 0) { - dev_err(dev, "unable to register davinci key scan interrupt\n"); - goto fail5; - } - - error = davinci_ks_initialize(davinci_ks); - if (error < 0) { - dev_err(dev, "unable to initialize davinci key scan device\n"); - goto fail6; - } - - platform_set_drvdata(pdev, davinci_ks); - return 0; - -fail6: - free_irq(davinci_ks->irq, davinci_ks); -fail5: - input_unregister_device(davinci_ks->input); - key_dev = NULL; -fail4: - iounmap(davinci_ks->base); -fail3: - release_mem_region(davinci_ks->pbase, davinci_ks->base_size); -fail2: - input_free_device(key_dev); -fail1: - kfree(davinci_ks); - - return error; -} - -static int __devexit davinci_ks_remove(struct platform_device *pdev) -{ - struct davinci_ks *davinci_ks = platform_get_drvdata(pdev); - - free_irq(davinci_ks->irq, davinci_ks); - - input_unregister_device(davinci_ks->input); - - iounmap(davinci_ks->base); - release_mem_region(davinci_ks->pbase, davinci_ks->base_size); - - platform_set_drvdata(pdev, NULL); - - kfree(davinci_ks); - - return 0; -} - -static struct platform_driver davinci_ks_driver = { - .driver = { - .name = "davinci_keyscan", - .owner = THIS_MODULE, - }, - .remove = __devexit_p(davinci_ks_remove), -}; - -static int __init davinci_ks_init(void) -{ - return platform_driver_probe(&davinci_ks_driver, davinci_ks_probe); -} -module_init(davinci_ks_init); - -static void __exit davinci_ks_exit(void) -{ - platform_driver_unregister(&davinci_ks_driver); -} -module_exit(davinci_ks_exit); - -MODULE_AUTHOR("Miguel Aguilar"); -MODULE_DESCRIPTION("Texas Instruments DaVinci Key Scan Driver"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/ep93xx_keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/ep93xx_keypad.c deleted file mode 100644 index 0ba69f3f..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/ep93xx_keypad.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * Driver for the Cirrus EP93xx matrix keypad controller. - * - * Copyright (c) 2008 H Hartley Sweeten <hsweeten@visionengravers.com> - * - * Based on the pxa27x matrix keypad controller by Rodolfo Giometti. - * - * 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. - * - * NOTE: - * - * The 3-key reset is triggered by pressing the 3 keys in - * Row 0, Columns 2, 4, and 7 at the same time. This action can - * be disabled by setting the EP93XX_KEYPAD_DISABLE_3_KEY flag. - * - * Normal operation for the matrix does not autorepeat the key press. - * This action can be enabled by setting the EP93XX_KEYPAD_AUTOREPEAT - * flag. - */ - -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/interrupt.h> -#include <linux/clk.h> -#include <linux/io.h> -#include <linux/input/matrix_keypad.h> -#include <linux/slab.h> - -#include <mach/hardware.h> -#include <mach/ep93xx_keypad.h> - -/* - * Keypad Interface Register offsets - */ -#define KEY_INIT 0x00 /* Key Scan Initialization register */ -#define KEY_DIAG 0x04 /* Key Scan Diagnostic register */ -#define KEY_REG 0x08 /* Key Value Capture register */ - -/* Key Scan Initialization Register bit defines */ -#define KEY_INIT_DBNC_MASK (0x00ff0000) -#define KEY_INIT_DBNC_SHIFT (16) -#define KEY_INIT_DIS3KY (1<<15) -#define KEY_INIT_DIAG (1<<14) -#define KEY_INIT_BACK (1<<13) -#define KEY_INIT_T2 (1<<12) -#define KEY_INIT_PRSCL_MASK (0x000003ff) -#define KEY_INIT_PRSCL_SHIFT (0) - -/* Key Scan Diagnostic Register bit defines */ -#define KEY_DIAG_MASK (0x0000003f) -#define KEY_DIAG_SHIFT (0) - -/* Key Value Capture Register bit defines */ -#define KEY_REG_K (1<<15) -#define KEY_REG_INT (1<<14) -#define KEY_REG_2KEYS (1<<13) -#define KEY_REG_1KEY (1<<12) -#define KEY_REG_KEY2_MASK (0x00000fc0) -#define KEY_REG_KEY2_SHIFT (6) -#define KEY_REG_KEY1_MASK (0x0000003f) -#define KEY_REG_KEY1_SHIFT (0) - -#define EP93XX_MATRIX_SIZE (EP93XX_MATRIX_ROWS * EP93XX_MATRIX_COLS) - -struct ep93xx_keypad { - struct ep93xx_keypad_platform_data *pdata; - struct input_dev *input_dev; - struct clk *clk; - - void __iomem *mmio_base; - - unsigned short keycodes[EP93XX_MATRIX_SIZE]; - - int key1; - int key2; - - int irq; - - bool enabled; -}; - -static irqreturn_t ep93xx_keypad_irq_handler(int irq, void *dev_id) -{ - struct ep93xx_keypad *keypad = dev_id; - struct input_dev *input_dev = keypad->input_dev; - unsigned int status; - int keycode, key1, key2; - - status = __raw_readl(keypad->mmio_base + KEY_REG); - - keycode = (status & KEY_REG_KEY1_MASK) >> KEY_REG_KEY1_SHIFT; - key1 = keypad->keycodes[keycode]; - - keycode = (status & KEY_REG_KEY2_MASK) >> KEY_REG_KEY2_SHIFT; - key2 = keypad->keycodes[keycode]; - - if (status & KEY_REG_2KEYS) { - if (keypad->key1 && key1 != keypad->key1 && key2 != keypad->key1) - input_report_key(input_dev, keypad->key1, 0); - - if (keypad->key2 && key1 != keypad->key2 && key2 != keypad->key2) - input_report_key(input_dev, keypad->key2, 0); - - input_report_key(input_dev, key1, 1); - input_report_key(input_dev, key2, 1); - - keypad->key1 = key1; - keypad->key2 = key2; - - } else if (status & KEY_REG_1KEY) { - if (keypad->key1 && key1 != keypad->key1) - input_report_key(input_dev, keypad->key1, 0); - - if (keypad->key2 && key1 != keypad->key2) - input_report_key(input_dev, keypad->key2, 0); - - input_report_key(input_dev, key1, 1); - - keypad->key1 = key1; - keypad->key2 = 0; - - } else { - input_report_key(input_dev, keypad->key1, 0); - input_report_key(input_dev, keypad->key2, 0); - - keypad->key1 = keypad->key2 = 0; - } - input_sync(input_dev); - - return IRQ_HANDLED; -} - -static void ep93xx_keypad_config(struct ep93xx_keypad *keypad) -{ - struct ep93xx_keypad_platform_data *pdata = keypad->pdata; - unsigned int val = 0; - - if (pdata->flags & EP93XX_KEYPAD_KDIV) - clk_set_rate(keypad->clk, EP93XX_KEYTCHCLK_DIV4); - else - clk_set_rate(keypad->clk, EP93XX_KEYTCHCLK_DIV16); - - if (pdata->flags & EP93XX_KEYPAD_DISABLE_3_KEY) - val |= KEY_INIT_DIS3KY; - if (pdata->flags & EP93XX_KEYPAD_DIAG_MODE) - val |= KEY_INIT_DIAG; - if (pdata->flags & EP93XX_KEYPAD_BACK_DRIVE) - val |= KEY_INIT_BACK; - if (pdata->flags & EP93XX_KEYPAD_TEST_MODE) - val |= KEY_INIT_T2; - - val |= ((pdata->debounce << KEY_INIT_DBNC_SHIFT) & KEY_INIT_DBNC_MASK); - - val |= ((pdata->prescale << KEY_INIT_PRSCL_SHIFT) & KEY_INIT_PRSCL_MASK); - - __raw_writel(val, keypad->mmio_base + KEY_INIT); -} - -static int ep93xx_keypad_open(struct input_dev *pdev) -{ - struct ep93xx_keypad *keypad = input_get_drvdata(pdev); - - if (!keypad->enabled) { - ep93xx_keypad_config(keypad); - clk_enable(keypad->clk); - keypad->enabled = true; - } - - return 0; -} - -static void ep93xx_keypad_close(struct input_dev *pdev) -{ - struct ep93xx_keypad *keypad = input_get_drvdata(pdev); - - if (keypad->enabled) { - clk_disable(keypad->clk); - keypad->enabled = false; - } -} - - -#ifdef CONFIG_PM -/* - * NOTE: I don't know if this is correct, or will work on the ep93xx. - * - * None of the existing ep93xx drivers have power management support. - * But, this is basically what the pxa27x_keypad driver does. - */ -static int ep93xx_keypad_suspend(struct platform_device *pdev, - pm_message_t state) -{ - struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); - struct input_dev *input_dev = keypad->input_dev; - - mutex_lock(&input_dev->mutex); - - if (keypad->enabled) { - clk_disable(keypad->clk); - keypad->enabled = false; - } - - mutex_unlock(&input_dev->mutex); - - if (device_may_wakeup(&pdev->dev)) - enable_irq_wake(keypad->irq); - - return 0; -} - -static int ep93xx_keypad_resume(struct platform_device *pdev) -{ - struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); - struct input_dev *input_dev = keypad->input_dev; - - if (device_may_wakeup(&pdev->dev)) - disable_irq_wake(keypad->irq); - - mutex_lock(&input_dev->mutex); - - if (input_dev->users) { - if (!keypad->enabled) { - ep93xx_keypad_config(keypad); - clk_enable(keypad->clk); - keypad->enabled = true; - } - } - - mutex_unlock(&input_dev->mutex); - - return 0; -} -#else /* !CONFIG_PM */ -#define ep93xx_keypad_suspend NULL -#define ep93xx_keypad_resume NULL -#endif /* !CONFIG_PM */ - -static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) -{ - struct ep93xx_keypad *keypad; - const struct matrix_keymap_data *keymap_data; - struct input_dev *input_dev; - struct resource *res; - int err; - - keypad = kzalloc(sizeof(struct ep93xx_keypad), GFP_KERNEL); - if (!keypad) - return -ENOMEM; - - keypad->pdata = pdev->dev.platform_data; - if (!keypad->pdata) { - err = -EINVAL; - goto failed_free; - } - - keymap_data = keypad->pdata->keymap_data; - if (!keymap_data) { - err = -EINVAL; - goto failed_free; - } - - keypad->irq = platform_get_irq(pdev, 0); - if (!keypad->irq) { - err = -ENXIO; - goto failed_free; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - err = -ENXIO; - goto failed_free; - } - - res = request_mem_region(res->start, resource_size(res), pdev->name); - if (!res) { - err = -EBUSY; - goto failed_free; - } - - keypad->mmio_base = ioremap(res->start, resource_size(res)); - if (keypad->mmio_base == NULL) { - err = -ENXIO; - goto failed_free_mem; - } - - err = ep93xx_keypad_acquire_gpio(pdev); - if (err) - goto failed_free_io; - - keypad->clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(keypad->clk)) { - err = PTR_ERR(keypad->clk); - goto failed_free_gpio; - } - - input_dev = input_allocate_device(); - if (!input_dev) { - err = -ENOMEM; - goto failed_put_clk; - } - - keypad->input_dev = input_dev; - - input_dev->name = pdev->name; - input_dev->id.bustype = BUS_HOST; - input_dev->open = ep93xx_keypad_open; - input_dev->close = ep93xx_keypad_close; - input_dev->dev.parent = &pdev->dev; - input_dev->keycode = keypad->keycodes; - input_dev->keycodesize = sizeof(keypad->keycodes[0]); - input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); - - input_set_drvdata(input_dev, keypad); - - input_dev->evbit[0] = BIT_MASK(EV_KEY); - if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) - input_dev->evbit[0] |= BIT_MASK(EV_REP); - - matrix_keypad_build_keymap(keymap_data, 3, - input_dev->keycode, input_dev->keybit); - platform_set_drvdata(pdev, keypad); - - err = request_irq(keypad->irq, ep93xx_keypad_irq_handler, - 0, pdev->name, keypad); - if (err) - goto failed_free_dev; - - err = input_register_device(input_dev); - if (err) - goto failed_free_irq; - - device_init_wakeup(&pdev->dev, 1); - - return 0; - -failed_free_irq: - free_irq(keypad->irq, pdev); - platform_set_drvdata(pdev, NULL); -failed_free_dev: - input_free_device(input_dev); -failed_put_clk: - clk_put(keypad->clk); -failed_free_gpio: - ep93xx_keypad_release_gpio(pdev); -failed_free_io: - iounmap(keypad->mmio_base); -failed_free_mem: - release_mem_region(res->start, resource_size(res)); -failed_free: - kfree(keypad); - return err; -} - -static int __devexit ep93xx_keypad_remove(struct platform_device *pdev) -{ - struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); - struct resource *res; - - free_irq(keypad->irq, pdev); - - platform_set_drvdata(pdev, NULL); - - if (keypad->enabled) - clk_disable(keypad->clk); - clk_put(keypad->clk); - - input_unregister_device(keypad->input_dev); - - ep93xx_keypad_release_gpio(pdev); - - iounmap(keypad->mmio_base); - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(res->start, resource_size(res)); - - kfree(keypad); - - return 0; -} - -static struct platform_driver ep93xx_keypad_driver = { - .driver = { - .name = "ep93xx-keypad", - .owner = THIS_MODULE, - }, - .probe = ep93xx_keypad_probe, - .remove = __devexit_p(ep93xx_keypad_remove), - .suspend = ep93xx_keypad_suspend, - .resume = ep93xx_keypad_resume, -}; -module_platform_driver(ep93xx_keypad_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("H Hartley Sweeten <hsweeten@visionengravers.com>"); -MODULE_DESCRIPTION("EP93xx Matrix Keypad Controller"); -MODULE_ALIAS("platform:ep93xx-keypad"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/gpio_keys.c b/ANDROID_3.4.5/drivers/input/keyboard/gpio_keys.c deleted file mode 100644 index 62bfce46..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/gpio_keys.c +++ /dev/null @@ -1,846 +0,0 @@ -/* - * Driver for keys on GPIO lines capable of generating interrupts. - * - * Copyright 2005 Phil Blundell - * Copyright 2010, 2011 David Jander <david@protonic.nl> - * - * 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. - */ - -#include <linux/module.h> - -#include <linux/init.h> -#include <linux/fs.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/sched.h> -#include <linux/pm.h> -#include <linux/slab.h> -#include <linux/sysctl.h> -#include <linux/proc_fs.h> -#include <linux/delay.h> -#include <linux/platform_device.h> -#include <linux/input.h> -#include <linux/gpio_keys.h> -#include <linux/workqueue.h> -#include <linux/gpio.h> -#include <linux/of_platform.h> -#include <linux/of_gpio.h> -#include <linux/spinlock.h> - -struct gpio_button_data { - const struct gpio_keys_button *button; - struct input_dev *input; - struct timer_list timer; - struct work_struct work; - unsigned int timer_debounce; /* in msecs */ - unsigned int irq; - spinlock_t lock; - bool disabled; - bool key_pressed; -}; - -struct gpio_keys_drvdata { - struct input_dev *input; - struct mutex disable_lock; - unsigned int n_buttons; - int (*enable)(struct device *dev); - void (*disable)(struct device *dev); - struct gpio_button_data data[0]; -}; - -/* - * SYSFS interface for enabling/disabling keys and switches: - * - * There are 4 attributes under /sys/devices/platform/gpio-keys/ - * keys [ro] - bitmap of keys (EV_KEY) which can be - * disabled - * switches [ro] - bitmap of switches (EV_SW) which can be - * disabled - * disabled_keys [rw] - bitmap of keys currently disabled - * disabled_switches [rw] - bitmap of switches currently disabled - * - * Userland can change these values and hence disable event generation - * for each key (or switch). Disabling a key means its interrupt line - * is disabled. - * - * For example, if we have following switches set up as gpio-keys: - * SW_DOCK = 5 - * SW_CAMERA_LENS_COVER = 9 - * SW_KEYPAD_SLIDE = 10 - * SW_FRONT_PROXIMITY = 11 - * This is read from switches: - * 11-9,5 - * Next we want to disable proximity (11) and dock (5), we write: - * 11,5 - * to file disabled_switches. Now proximity and dock IRQs are disabled. - * This can be verified by reading the file disabled_switches: - * 11,5 - * If we now want to enable proximity (11) switch we write: - * 5 - * to disabled_switches. - * - * We can disable only those keys which don't allow sharing the irq. - */ - -/** - * get_n_events_by_type() - returns maximum number of events per @type - * @type: type of button (%EV_KEY, %EV_SW) - * - * Return value of this function can be used to allocate bitmap - * large enough to hold all bits for given type. - */ -static inline int get_n_events_by_type(int type) -{ - BUG_ON(type != EV_SW && type != EV_KEY); - - return (type == EV_KEY) ? KEY_CNT : SW_CNT; -} - -/** - * gpio_keys_disable_button() - disables given GPIO button - * @bdata: button data for button to be disabled - * - * Disables button pointed by @bdata. This is done by masking - * IRQ line. After this function is called, button won't generate - * input events anymore. Note that one can only disable buttons - * that don't share IRQs. - * - * Make sure that @bdata->disable_lock is locked when entering - * this function to avoid races when concurrent threads are - * disabling buttons at the same time. - */ -static void gpio_keys_disable_button(struct gpio_button_data *bdata) -{ - if (!bdata->disabled) { - /* - * Disable IRQ and possible debouncing timer. - */ - disable_irq(bdata->irq); - if (bdata->timer_debounce) - del_timer_sync(&bdata->timer); - - bdata->disabled = true; - } -} - -/** - * gpio_keys_enable_button() - enables given GPIO button - * @bdata: button data for button to be disabled - * - * Enables given button pointed by @bdata. - * - * Make sure that @bdata->disable_lock is locked when entering - * this function to avoid races with concurrent threads trying - * to enable the same button at the same time. - */ -static void gpio_keys_enable_button(struct gpio_button_data *bdata) -{ - if (bdata->disabled) { - enable_irq(bdata->irq); - bdata->disabled = false; - } -} - -/** - * gpio_keys_attr_show_helper() - fill in stringified bitmap of buttons - * @ddata: pointer to drvdata - * @buf: buffer where stringified bitmap is written - * @type: button type (%EV_KEY, %EV_SW) - * @only_disabled: does caller want only those buttons that are - * currently disabled or all buttons that can be - * disabled - * - * This function writes buttons that can be disabled to @buf. If - * @only_disabled is true, then @buf contains only those buttons - * that are currently disabled. Returns 0 on success or negative - * errno on failure. - */ -static ssize_t gpio_keys_attr_show_helper(struct gpio_keys_drvdata *ddata, - char *buf, unsigned int type, - bool only_disabled) -{ - int n_events = get_n_events_by_type(type); - unsigned long *bits; - ssize_t ret; - int i; - - bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL); - if (!bits) - return -ENOMEM; - - for (i = 0; i < ddata->n_buttons; i++) { - struct gpio_button_data *bdata = &ddata->data[i]; - - if (bdata->button->type != type) - continue; - - if (only_disabled && !bdata->disabled) - continue; - - __set_bit(bdata->button->code, bits); - } - - ret = bitmap_scnlistprintf(buf, PAGE_SIZE - 2, bits, n_events); - buf[ret++] = '\n'; - buf[ret] = '\0'; - - kfree(bits); - - return ret; -} - -/** - * gpio_keys_attr_store_helper() - enable/disable buttons based on given bitmap - * @ddata: pointer to drvdata - * @buf: buffer from userspace that contains stringified bitmap - * @type: button type (%EV_KEY, %EV_SW) - * - * This function parses stringified bitmap from @buf and disables/enables - * GPIO buttons accordingly. Returns 0 on success and negative error - * on failure. - */ -static ssize_t gpio_keys_attr_store_helper(struct gpio_keys_drvdata *ddata, - const char *buf, unsigned int type) -{ - int n_events = get_n_events_by_type(type); - unsigned long *bits; - ssize_t error; - int i; - - bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL); - if (!bits) - return -ENOMEM; - - error = bitmap_parselist(buf, bits, n_events); - if (error) - goto out; - - /* First validate */ - for (i = 0; i < ddata->n_buttons; i++) { - struct gpio_button_data *bdata = &ddata->data[i]; - - if (bdata->button->type != type) - continue; - - if (test_bit(bdata->button->code, bits) && - !bdata->button->can_disable) { - error = -EINVAL; - goto out; - } - } - - mutex_lock(&ddata->disable_lock); - - for (i = 0; i < ddata->n_buttons; i++) { - struct gpio_button_data *bdata = &ddata->data[i]; - - if (bdata->button->type != type) - continue; - - if (test_bit(bdata->button->code, bits)) - gpio_keys_disable_button(bdata); - else - gpio_keys_enable_button(bdata); - } - - mutex_unlock(&ddata->disable_lock); - -out: - kfree(bits); - return error; -} - -#define ATTR_SHOW_FN(name, type, only_disabled) \ -static ssize_t gpio_keys_show_##name(struct device *dev, \ - struct device_attribute *attr, \ - char *buf) \ -{ \ - struct platform_device *pdev = to_platform_device(dev); \ - struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); \ - \ - return gpio_keys_attr_show_helper(ddata, buf, \ - type, only_disabled); \ -} - -ATTR_SHOW_FN(keys, EV_KEY, false); -ATTR_SHOW_FN(switches, EV_SW, false); -ATTR_SHOW_FN(disabled_keys, EV_KEY, true); -ATTR_SHOW_FN(disabled_switches, EV_SW, true); - -/* - * ATTRIBUTES: - * - * /sys/devices/platform/gpio-keys/keys [ro] - * /sys/devices/platform/gpio-keys/switches [ro] - */ -static DEVICE_ATTR(keys, S_IRUGO, gpio_keys_show_keys, NULL); -static DEVICE_ATTR(switches, S_IRUGO, gpio_keys_show_switches, NULL); - -#define ATTR_STORE_FN(name, type) \ -static ssize_t gpio_keys_store_##name(struct device *dev, \ - struct device_attribute *attr, \ - const char *buf, \ - size_t count) \ -{ \ - struct platform_device *pdev = to_platform_device(dev); \ - struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); \ - ssize_t error; \ - \ - error = gpio_keys_attr_store_helper(ddata, buf, type); \ - if (error) \ - return error; \ - \ - return count; \ -} - -ATTR_STORE_FN(disabled_keys, EV_KEY); -ATTR_STORE_FN(disabled_switches, EV_SW); - -/* - * ATTRIBUTES: - * - * /sys/devices/platform/gpio-keys/disabled_keys [rw] - * /sys/devices/platform/gpio-keys/disables_switches [rw] - */ -static DEVICE_ATTR(disabled_keys, S_IWUSR | S_IRUGO, - gpio_keys_show_disabled_keys, - gpio_keys_store_disabled_keys); -static DEVICE_ATTR(disabled_switches, S_IWUSR | S_IRUGO, - gpio_keys_show_disabled_switches, - gpio_keys_store_disabled_switches); - -static struct attribute *gpio_keys_attrs[] = { - &dev_attr_keys.attr, - &dev_attr_switches.attr, - &dev_attr_disabled_keys.attr, - &dev_attr_disabled_switches.attr, - NULL, -}; - -static struct attribute_group gpio_keys_attr_group = { - .attrs = gpio_keys_attrs, -}; - -static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) -{ - const struct gpio_keys_button *button = bdata->button; - struct input_dev *input = bdata->input; - unsigned int type = button->type ?: EV_KEY; - int state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ button->active_low; - - if (type == EV_ABS) { - if (state) - input_event(input, type, button->code, button->value); - } else { - input_event(input, type, button->code, !!state); - } - input_sync(input); -} - -static void gpio_keys_gpio_work_func(struct work_struct *work) -{ - struct gpio_button_data *bdata = - container_of(work, struct gpio_button_data, work); - - gpio_keys_gpio_report_event(bdata); -} - -static void gpio_keys_gpio_timer(unsigned long _data) -{ - struct gpio_button_data *bdata = (struct gpio_button_data *)_data; - - schedule_work(&bdata->work); -} - -static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) -{ - struct gpio_button_data *bdata = dev_id; - - BUG_ON(irq != bdata->irq); - - if (bdata->timer_debounce) - mod_timer(&bdata->timer, - jiffies + msecs_to_jiffies(bdata->timer_debounce)); - else - schedule_work(&bdata->work); - - return IRQ_HANDLED; -} - -static void gpio_keys_irq_timer(unsigned long _data) -{ - struct gpio_button_data *bdata = (struct gpio_button_data *)_data; - struct input_dev *input = bdata->input; - unsigned long flags; - - spin_lock_irqsave(&bdata->lock, flags); - if (bdata->key_pressed) { - input_event(input, EV_KEY, bdata->button->code, 0); - input_sync(input); - bdata->key_pressed = false; - } - spin_unlock_irqrestore(&bdata->lock, flags); -} - -static irqreturn_t gpio_keys_irq_isr(int irq, void *dev_id) -{ - struct gpio_button_data *bdata = dev_id; - const struct gpio_keys_button *button = bdata->button; - struct input_dev *input = bdata->input; - unsigned long flags; - - BUG_ON(irq != bdata->irq); - - spin_lock_irqsave(&bdata->lock, flags); - - if (!bdata->key_pressed) { - input_event(input, EV_KEY, button->code, 1); - input_sync(input); - - if (!bdata->timer_debounce) { - input_event(input, EV_KEY, button->code, 0); - input_sync(input); - goto out; - } - - bdata->key_pressed = true; - } - - if (bdata->timer_debounce) - mod_timer(&bdata->timer, - jiffies + msecs_to_jiffies(bdata->timer_debounce)); -out: - spin_unlock_irqrestore(&bdata->lock, flags); - return IRQ_HANDLED; -} - -static int __devinit gpio_keys_setup_key(struct platform_device *pdev, - struct input_dev *input, - struct gpio_button_data *bdata, - const struct gpio_keys_button *button) -{ - const char *desc = button->desc ? button->desc : "gpio_keys"; - struct device *dev = &pdev->dev; - irq_handler_t isr; - unsigned long irqflags; - int irq, error; - - bdata->input = input; - bdata->button = button; - spin_lock_init(&bdata->lock); - - if (gpio_is_valid(button->gpio)) { - - error = gpio_request(button->gpio, desc); - if (error < 0) { - dev_err(dev, "Failed to request GPIO %d, error %d\n", - button->gpio, error); - return error; - } - - error = gpio_direction_input(button->gpio); - if (error < 0) { - dev_err(dev, - "Failed to configure direction for GPIO %d, error %d\n", - button->gpio, error); - goto fail; - } - - if (button->debounce_interval) { - error = gpio_set_debounce(button->gpio, - button->debounce_interval * 1000); - /* use timer if gpiolib doesn't provide debounce */ - if (error < 0) - bdata->timer_debounce = - button->debounce_interval; - } - - irq = gpio_to_irq(button->gpio); - if (irq < 0) { - error = irq; - dev_err(dev, - "Unable to get irq number for GPIO %d, error %d\n", - button->gpio, error); - goto fail; - } - bdata->irq = irq; - - INIT_WORK(&bdata->work, gpio_keys_gpio_work_func); - setup_timer(&bdata->timer, - gpio_keys_gpio_timer, (unsigned long)bdata); - - isr = gpio_keys_gpio_isr; - irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; - - } else { - if (!button->irq) { - dev_err(dev, "No IRQ specified\n"); - return -EINVAL; - } - bdata->irq = button->irq; - - if (button->type && button->type != EV_KEY) { - dev_err(dev, "Only EV_KEY allowed for IRQ buttons.\n"); - return -EINVAL; - } - - bdata->timer_debounce = button->debounce_interval; - setup_timer(&bdata->timer, - gpio_keys_irq_timer, (unsigned long)bdata); - - isr = gpio_keys_irq_isr; - irqflags = 0; - } - - input_set_capability(input, button->type ?: EV_KEY, button->code); - - /* - * If platform has specified that the button can be disabled, - * we don't want it to share the interrupt line. - */ - if (!button->can_disable) - irqflags |= IRQF_SHARED; - - error = request_any_context_irq(bdata->irq, isr, irqflags, desc, bdata); - if (error < 0) { - dev_err(dev, "Unable to claim irq %d; error %d\n", - bdata->irq, error); - goto fail; - } - - return 0; - -fail: - if (gpio_is_valid(button->gpio)) - gpio_free(button->gpio); - - return error; -} - -static int gpio_keys_open(struct input_dev *input) -{ - struct gpio_keys_drvdata *ddata = input_get_drvdata(input); - - return ddata->enable ? ddata->enable(input->dev.parent) : 0; -} - -static void gpio_keys_close(struct input_dev *input) -{ - struct gpio_keys_drvdata *ddata = input_get_drvdata(input); - - if (ddata->disable) - ddata->disable(input->dev.parent); -} - -/* - * Handlers for alternative sources of platform_data - */ -#ifdef CONFIG_OF -/* - * Translate OpenFirmware node properties into platform_data - */ -static int gpio_keys_get_devtree_pdata(struct device *dev, - struct gpio_keys_platform_data *pdata) -{ - struct device_node *node, *pp; - int i; - struct gpio_keys_button *buttons; - u32 reg; - - node = dev->of_node; - if (node == NULL) - return -ENODEV; - - memset(pdata, 0, sizeof *pdata); - - pdata->rep = !!of_get_property(node, "autorepeat", NULL); - - /* First count the subnodes */ - pdata->nbuttons = 0; - pp = NULL; - while ((pp = of_get_next_child(node, pp))) - pdata->nbuttons++; - - if (pdata->nbuttons == 0) - return -ENODEV; - - buttons = kzalloc(pdata->nbuttons * (sizeof *buttons), GFP_KERNEL); - if (!buttons) - return -ENOMEM; - - pp = NULL; - i = 0; - while ((pp = of_get_next_child(node, pp))) { - enum of_gpio_flags flags; - - if (!of_find_property(pp, "gpios", NULL)) { - pdata->nbuttons--; - dev_warn(dev, "Found button without gpios\n"); - continue; - } - buttons[i].gpio = of_get_gpio_flags(pp, 0, &flags); - buttons[i].active_low = flags & OF_GPIO_ACTIVE_LOW; - - if (of_property_read_u32(pp, "linux,code", ®)) { - dev_err(dev, "Button without keycode: 0x%x\n", buttons[i].gpio); - goto out_fail; - } - buttons[i].code = reg; - - buttons[i].desc = of_get_property(pp, "label", NULL); - - if (of_property_read_u32(pp, "linux,input-type", ®) == 0) - buttons[i].type = reg; - else - buttons[i].type = EV_KEY; - - buttons[i].wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL); - - if (of_property_read_u32(pp, "debounce-interval", ®) == 0) - buttons[i].debounce_interval = reg; - else - buttons[i].debounce_interval = 5; - - i++; - } - - pdata->buttons = buttons; - - return 0; - -out_fail: - kfree(buttons); - return -ENODEV; -} - -static struct of_device_id gpio_keys_of_match[] = { - { .compatible = "gpio-keys", }, - { }, -}; -MODULE_DEVICE_TABLE(of, gpio_keys_of_match); - -#else - -static int gpio_keys_get_devtree_pdata(struct device *dev, - struct gpio_keys_platform_data *altp) -{ - return -ENODEV; -} - -#define gpio_keys_of_match NULL - -#endif - -static void gpio_remove_key(struct gpio_button_data *bdata) -{ - free_irq(bdata->irq, bdata); - if (bdata->timer_debounce) - del_timer_sync(&bdata->timer); - cancel_work_sync(&bdata->work); - if (gpio_is_valid(bdata->button->gpio)) - gpio_free(bdata->button->gpio); -} - -static int __devinit gpio_keys_probe(struct platform_device *pdev) -{ - const struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; - struct gpio_keys_drvdata *ddata; - struct device *dev = &pdev->dev; - struct gpio_keys_platform_data alt_pdata; - struct input_dev *input; - int i, error; - int wakeup = 0; - - if (!pdata) { - error = gpio_keys_get_devtree_pdata(dev, &alt_pdata); - if (error) - return error; - pdata = &alt_pdata; - } - - ddata = kzalloc(sizeof(struct gpio_keys_drvdata) + - pdata->nbuttons * sizeof(struct gpio_button_data), - GFP_KERNEL); - input = input_allocate_device(); - if (!ddata || !input) { - dev_err(dev, "failed to allocate state\n"); - error = -ENOMEM; - goto fail1; - } - - ddata->input = input; - ddata->n_buttons = pdata->nbuttons; - ddata->enable = pdata->enable; - ddata->disable = pdata->disable; - mutex_init(&ddata->disable_lock); - - platform_set_drvdata(pdev, ddata); - input_set_drvdata(input, ddata); - - input->name = pdata->name ? : pdev->name; - input->phys = "gpio-keys/input0"; - input->dev.parent = &pdev->dev; - input->open = gpio_keys_open; - input->close = gpio_keys_close; - - input->id.bustype = BUS_HOST; - input->id.vendor = 0x0001; - input->id.product = 0x0001; - input->id.version = 0x0100; - - /* Enable auto repeat feature of Linux input subsystem */ - if (pdata->rep) - __set_bit(EV_REP, input->evbit); - - for (i = 0; i < pdata->nbuttons; i++) { - const struct gpio_keys_button *button = &pdata->buttons[i]; - struct gpio_button_data *bdata = &ddata->data[i]; - - error = gpio_keys_setup_key(pdev, input, bdata, button); - if (error) - goto fail2; - - if (button->wakeup) - wakeup = 1; - } - - error = sysfs_create_group(&pdev->dev.kobj, &gpio_keys_attr_group); - if (error) { - dev_err(dev, "Unable to export keys/switches, error: %d\n", - error); - goto fail2; - } - - error = input_register_device(input); - if (error) { - dev_err(dev, "Unable to register input device, error: %d\n", - error); - goto fail3; - } - - /* get current state of buttons that are connected to GPIOs */ - for (i = 0; i < pdata->nbuttons; i++) { - struct gpio_button_data *bdata = &ddata->data[i]; - if (gpio_is_valid(bdata->button->gpio)) - gpio_keys_gpio_report_event(bdata); - } - input_sync(input); - - device_init_wakeup(&pdev->dev, wakeup); - - return 0; - - fail3: - sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group); - fail2: - while (--i >= 0) - gpio_remove_key(&ddata->data[i]); - - platform_set_drvdata(pdev, NULL); - fail1: - input_free_device(input); - kfree(ddata); - /* If we have no platform_data, we allocated buttons dynamically. */ - if (!pdev->dev.platform_data) - kfree(pdata->buttons); - - return error; -} - -static int __devexit gpio_keys_remove(struct platform_device *pdev) -{ - struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); - struct input_dev *input = ddata->input; - int i; - - sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group); - - device_init_wakeup(&pdev->dev, 0); - - for (i = 0; i < ddata->n_buttons; i++) - gpio_remove_key(&ddata->data[i]); - - input_unregister_device(input); - - /* - * If we had no platform_data, we allocated buttons dynamically, and - * must free them here. ddata->data[0].button is the pointer to the - * beginning of the allocated array. - */ - if (!pdev->dev.platform_data) - kfree(ddata->data[0].button); - - kfree(ddata); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int gpio_keys_suspend(struct device *dev) -{ - struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); - int i; - - if (device_may_wakeup(dev)) { - for (i = 0; i < ddata->n_buttons; i++) { - struct gpio_button_data *bdata = &ddata->data[i]; - if (bdata->button->wakeup) - enable_irq_wake(bdata->irq); - } - } - - return 0; -} - -static int gpio_keys_resume(struct device *dev) -{ - struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); - int i; - - for (i = 0; i < ddata->n_buttons; i++) { - struct gpio_button_data *bdata = &ddata->data[i]; - if (bdata->button->wakeup && device_may_wakeup(dev)) - disable_irq_wake(bdata->irq); - - if (gpio_is_valid(bdata->button->gpio)) - gpio_keys_gpio_report_event(bdata); - } - input_sync(ddata->input); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume); - -static struct platform_driver gpio_keys_device_driver = { - .probe = gpio_keys_probe, - .remove = __devexit_p(gpio_keys_remove), - .driver = { - .name = "gpio-keys", - .owner = THIS_MODULE, - .pm = &gpio_keys_pm_ops, - .of_match_table = gpio_keys_of_match, - } -}; - -static int __init gpio_keys_init(void) -{ - return platform_driver_register(&gpio_keys_device_driver); -} - -static void __exit gpio_keys_exit(void) -{ - platform_driver_unregister(&gpio_keys_device_driver); -} - -late_initcall(gpio_keys_init); -module_exit(gpio_keys_exit); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Phil Blundell <pb@handhelds.org>"); -MODULE_DESCRIPTION("Keyboard driver for GPIOs"); -MODULE_ALIAS("platform:gpio-keys"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/gpio_keys_polled.c b/ANDROID_3.4.5/drivers/input/keyboard/gpio_keys_polled.c deleted file mode 100644 index 20c8ab17..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/gpio_keys_polled.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Driver for buttons on GPIO lines not capable of generating interrupts - * - * Copyright (C) 2007-2010 Gabor Juhos <juhosg@openwrt.org> - * Copyright (C) 2010 Nuno Goncalves <nunojpg@gmail.com> - * - * This file was based on: /drivers/input/misc/cobalt_btns.c - * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> - * - * also was based on: /drivers/input/keyboard/gpio_keys.c - * Copyright 2005 Phil Blundell - * - * 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. - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/slab.h> -#include <linux/input.h> -#include <linux/input-polldev.h> -#include <linux/ioport.h> -#include <linux/platform_device.h> -#include <linux/gpio.h> -#include <linux/gpio_keys.h> - -#define DRV_NAME "gpio-keys-polled" - -struct gpio_keys_button_data { - int last_state; - int count; - int threshold; - int can_sleep; -}; - -struct gpio_keys_polled_dev { - struct input_polled_dev *poll_dev; - struct device *dev; - struct gpio_keys_platform_data *pdata; - struct gpio_keys_button_data data[0]; -}; - -static void gpio_keys_polled_check_state(struct input_dev *input, - struct gpio_keys_button *button, - struct gpio_keys_button_data *bdata) -{ - int state; - - if (bdata->can_sleep) - state = !!gpio_get_value_cansleep(button->gpio); - else - state = !!gpio_get_value(button->gpio); - - if (state != bdata->last_state) { - unsigned int type = button->type ?: EV_KEY; - - input_event(input, type, button->code, - !!(state ^ button->active_low)); - input_sync(input); - bdata->count = 0; - bdata->last_state = state; - } -} - -static void gpio_keys_polled_poll(struct input_polled_dev *dev) -{ - struct gpio_keys_polled_dev *bdev = dev->private; - struct gpio_keys_platform_data *pdata = bdev->pdata; - struct input_dev *input = dev->input; - int i; - - for (i = 0; i < bdev->pdata->nbuttons; i++) { - struct gpio_keys_button_data *bdata = &bdev->data[i]; - - if (bdata->count < bdata->threshold) - bdata->count++; - else - gpio_keys_polled_check_state(input, &pdata->buttons[i], - bdata); - } -} - -static void gpio_keys_polled_open(struct input_polled_dev *dev) -{ - struct gpio_keys_polled_dev *bdev = dev->private; - struct gpio_keys_platform_data *pdata = bdev->pdata; - - if (pdata->enable) - pdata->enable(bdev->dev); -} - -static void gpio_keys_polled_close(struct input_polled_dev *dev) -{ - struct gpio_keys_polled_dev *bdev = dev->private; - struct gpio_keys_platform_data *pdata = bdev->pdata; - - if (pdata->disable) - pdata->disable(bdev->dev); -} - -static int __devinit gpio_keys_polled_probe(struct platform_device *pdev) -{ - struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; - struct device *dev = &pdev->dev; - struct gpio_keys_polled_dev *bdev; - struct input_polled_dev *poll_dev; - struct input_dev *input; - int error; - int i; - - if (!pdata || !pdata->poll_interval) - return -EINVAL; - - bdev = kzalloc(sizeof(struct gpio_keys_polled_dev) + - pdata->nbuttons * sizeof(struct gpio_keys_button_data), - GFP_KERNEL); - if (!bdev) { - dev_err(dev, "no memory for private data\n"); - return -ENOMEM; - } - - poll_dev = input_allocate_polled_device(); - if (!poll_dev) { - dev_err(dev, "no memory for polled device\n"); - error = -ENOMEM; - goto err_free_bdev; - } - - poll_dev->private = bdev; - poll_dev->poll = gpio_keys_polled_poll; - poll_dev->poll_interval = pdata->poll_interval; - poll_dev->open = gpio_keys_polled_open; - poll_dev->close = gpio_keys_polled_close; - - input = poll_dev->input; - - input->evbit[0] = BIT(EV_KEY); - input->name = pdev->name; - input->phys = DRV_NAME"/input0"; - input->dev.parent = &pdev->dev; - - input->id.bustype = BUS_HOST; - input->id.vendor = 0x0001; - input->id.product = 0x0001; - input->id.version = 0x0100; - - for (i = 0; i < pdata->nbuttons; i++) { - struct gpio_keys_button *button = &pdata->buttons[i]; - struct gpio_keys_button_data *bdata = &bdev->data[i]; - unsigned int gpio = button->gpio; - unsigned int type = button->type ?: EV_KEY; - - if (button->wakeup) { - dev_err(dev, DRV_NAME " does not support wakeup\n"); - error = -EINVAL; - goto err_free_gpio; - } - - error = gpio_request(gpio, - button->desc ? button->desc : DRV_NAME); - if (error) { - dev_err(dev, "unable to claim gpio %u, err=%d\n", - gpio, error); - goto err_free_gpio; - } - - error = gpio_direction_input(gpio); - if (error) { - dev_err(dev, - "unable to set direction on gpio %u, err=%d\n", - gpio, error); - goto err_free_gpio; - } - - bdata->can_sleep = gpio_cansleep(gpio); - bdata->last_state = -1; - bdata->threshold = DIV_ROUND_UP(button->debounce_interval, - pdata->poll_interval); - - input_set_capability(input, type, button->code); - } - - bdev->poll_dev = poll_dev; - bdev->dev = dev; - bdev->pdata = pdata; - platform_set_drvdata(pdev, bdev); - - error = input_register_polled_device(poll_dev); - if (error) { - dev_err(dev, "unable to register polled device, err=%d\n", - error); - goto err_free_gpio; - } - - /* report initial state of the buttons */ - for (i = 0; i < pdata->nbuttons; i++) - gpio_keys_polled_check_state(input, &pdata->buttons[i], - &bdev->data[i]); - - return 0; - -err_free_gpio: - while (--i >= 0) - gpio_free(pdata->buttons[i].gpio); - - input_free_polled_device(poll_dev); - -err_free_bdev: - kfree(bdev); - - platform_set_drvdata(pdev, NULL); - return error; -} - -static int __devexit gpio_keys_polled_remove(struct platform_device *pdev) -{ - struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev); - struct gpio_keys_platform_data *pdata = bdev->pdata; - int i; - - input_unregister_polled_device(bdev->poll_dev); - - for (i = 0; i < pdata->nbuttons; i++) - gpio_free(pdata->buttons[i].gpio); - - input_free_polled_device(bdev->poll_dev); - - kfree(bdev); - platform_set_drvdata(pdev, NULL); - - return 0; -} - -static struct platform_driver gpio_keys_polled_driver = { - .probe = gpio_keys_polled_probe, - .remove = __devexit_p(gpio_keys_polled_remove), - .driver = { - .name = DRV_NAME, - .owner = THIS_MODULE, - }, -}; -module_platform_driver(gpio_keys_polled_driver); - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>"); -MODULE_DESCRIPTION("Polled GPIO Buttons driver"); -MODULE_ALIAS("platform:" DRV_NAME); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/hil_kbd.c b/ANDROID_3.4.5/drivers/input/keyboard/hil_kbd.c deleted file mode 100644 index fed31e09..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/hil_kbd.c +++ /dev/null @@ -1,597 +0,0 @@ -/* - * Generic linux-input device driver for keyboard devices - * - * Copyright (c) 2001 Brian S. Julin - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * Alternatively, this software may be distributed under the terms of the - * GNU General Public License ("GPL"). - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * - * References: - * HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A - * - */ - -#include <linux/hil.h> -#include <linux/input.h> -#include <linux/serio.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/completion.h> -#include <linux/slab.h> -#include <linux/pci_ids.h> - -#define PREFIX "HIL: " - -MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>"); -MODULE_DESCRIPTION("HIL keyboard/mouse driver"); -MODULE_LICENSE("Dual BSD/GPL"); -MODULE_ALIAS("serio:ty03pr25id00ex*"); /* HIL keyboard */ -MODULE_ALIAS("serio:ty03pr25id0Fex*"); /* HIL mouse */ - -#define HIL_PACKET_MAX_LENGTH 16 - -#define HIL_KBD_SET1_UPBIT 0x01 -#define HIL_KBD_SET1_SHIFT 1 -static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] __read_mostly = - { HIL_KEYCODES_SET1 }; - -#define HIL_KBD_SET2_UPBIT 0x01 -#define HIL_KBD_SET2_SHIFT 1 -/* Set2 is user defined */ - -#define HIL_KBD_SET3_UPBIT 0x80 -#define HIL_KBD_SET3_SHIFT 0 -static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE] __read_mostly = - { HIL_KEYCODES_SET3 }; - -static const char hil_language[][16] = { HIL_LOCALE_MAP }; - -struct hil_dev { - struct input_dev *dev; - struct serio *serio; - - /* Input buffer and index for packets from HIL bus. */ - hil_packet data[HIL_PACKET_MAX_LENGTH]; - int idx4; /* four counts per packet */ - - /* Raw device info records from HIL bus, see hil.h for fields. */ - char idd[HIL_PACKET_MAX_LENGTH]; /* DID byte and IDD record */ - char rsc[HIL_PACKET_MAX_LENGTH]; /* RSC record */ - char exd[HIL_PACKET_MAX_LENGTH]; /* EXD record */ - char rnm[HIL_PACKET_MAX_LENGTH + 1]; /* RNM record + NULL term. */ - - struct completion cmd_done; - - bool is_pointer; - /* Extra device details needed for pointing devices. */ - unsigned int nbtn, naxes; - unsigned int btnmap[7]; -}; - -static bool hil_dev_is_command_response(hil_packet p) -{ - if ((p & ~HIL_CMDCT_POL) == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL)) - return false; - - if ((p & ~HIL_CMDCT_RPL) == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_RPL)) - return false; - - return true; -} - -static void hil_dev_handle_command_response(struct hil_dev *dev) -{ - hil_packet p; - char *buf; - int i, idx; - - idx = dev->idx4 / 4; - p = dev->data[idx - 1]; - - switch (p & HIL_PKT_DATA_MASK) { - case HIL_CMD_IDD: - buf = dev->idd; - break; - - case HIL_CMD_RSC: - buf = dev->rsc; - break; - - case HIL_CMD_EXD: - buf = dev->exd; - break; - - case HIL_CMD_RNM: - dev->rnm[HIL_PACKET_MAX_LENGTH] = 0; - buf = dev->rnm; - break; - - default: - /* These occur when device isn't present */ - if (p != (HIL_ERR_INT | HIL_PKT_CMD)) { - /* Anything else we'd like to know about. */ - printk(KERN_WARNING PREFIX "Device sent unknown record %x\n", p); - } - goto out; - } - - for (i = 0; i < idx; i++) - buf[i] = dev->data[i] & HIL_PKT_DATA_MASK; - for (; i < HIL_PACKET_MAX_LENGTH; i++) - buf[i] = 0; - out: - complete(&dev->cmd_done); -} - -static void hil_dev_handle_kbd_events(struct hil_dev *kbd) -{ - struct input_dev *dev = kbd->dev; - int idx = kbd->idx4 / 4; - int i; - - switch (kbd->data[0] & HIL_POL_CHARTYPE_MASK) { - case HIL_POL_CHARTYPE_NONE: - return; - - case HIL_POL_CHARTYPE_ASCII: - for (i = 1; i < idx - 1; i++) - input_report_key(dev, kbd->data[i] & 0x7f, 1); - break; - - case HIL_POL_CHARTYPE_RSVD1: - case HIL_POL_CHARTYPE_RSVD2: - case HIL_POL_CHARTYPE_BINARY: - for (i = 1; i < idx - 1; i++) - input_report_key(dev, kbd->data[i], 1); - break; - - case HIL_POL_CHARTYPE_SET1: - for (i = 1; i < idx - 1; i++) { - unsigned int key = kbd->data[i]; - int up = key & HIL_KBD_SET1_UPBIT; - - key &= (~HIL_KBD_SET1_UPBIT & 0xff); - key = hil_kbd_set1[key >> HIL_KBD_SET1_SHIFT]; - input_report_key(dev, key, !up); - } - break; - - case HIL_POL_CHARTYPE_SET2: - for (i = 1; i < idx - 1; i++) { - unsigned int key = kbd->data[i]; - int up = key & HIL_KBD_SET2_UPBIT; - - key &= (~HIL_KBD_SET1_UPBIT & 0xff); - key = key >> HIL_KBD_SET2_SHIFT; - input_report_key(dev, key, !up); - } - break; - - case HIL_POL_CHARTYPE_SET3: - for (i = 1; i < idx - 1; i++) { - unsigned int key = kbd->data[i]; - int up = key & HIL_KBD_SET3_UPBIT; - - key &= (~HIL_KBD_SET1_UPBIT & 0xff); - key = hil_kbd_set3[key >> HIL_KBD_SET3_SHIFT]; - input_report_key(dev, key, !up); - } - break; - } - - input_sync(dev); -} - -static void hil_dev_handle_ptr_events(struct hil_dev *ptr) -{ - struct input_dev *dev = ptr->dev; - int idx = ptr->idx4 / 4; - hil_packet p = ptr->data[idx - 1]; - int i, cnt, laxis; - bool absdev, ax16; - - if ((p & HIL_CMDCT_POL) != idx - 1) { - printk(KERN_WARNING PREFIX - "Malformed poll packet %x (idx = %i)\n", p, idx); - return; - } - - i = (p & HIL_POL_AXIS_ALT) ? 3 : 0; - laxis = (p & HIL_POL_NUM_AXES_MASK) + i; - - ax16 = ptr->idd[1] & HIL_IDD_HEADER_16BIT; /* 8 or 16bit resolution */ - absdev = ptr->idd[1] & HIL_IDD_HEADER_ABS; - - for (cnt = 1; i < laxis; i++) { - unsigned int lo, hi, val; - - lo = ptr->data[cnt++] & HIL_PKT_DATA_MASK; - hi = ax16 ? (ptr->data[cnt++] & HIL_PKT_DATA_MASK) : 0; - - if (absdev) { - val = lo + (hi << 8); -#ifdef TABLET_AUTOADJUST - if (val < input_abs_get_min(dev, ABS_X + i)) - input_abs_set_min(dev, ABS_X + i, val); - if (val > input_abs_get_max(dev, ABS_X + i)) - input_abs_set_max(dev, ABS_X + i, val); -#endif - if (i % 3) - val = input_abs_get_max(dev, ABS_X + i) - val; - input_report_abs(dev, ABS_X + i, val); - } else { - val = (int) (((int8_t) lo) | ((int8_t) hi << 8)); - if (i % 3) - val *= -1; - input_report_rel(dev, REL_X + i, val); - } - } - - while (cnt < idx - 1) { - unsigned int btn = ptr->data[cnt++]; - int up = btn & 1; - - btn &= 0xfe; - if (btn == 0x8e) - continue; /* TODO: proximity == touch? */ - if (btn > 0x8c || btn < 0x80) - continue; - btn = (btn - 0x80) >> 1; - btn = ptr->btnmap[btn]; - input_report_key(dev, btn, !up); - } - - input_sync(dev); -} - -static void hil_dev_process_err(struct hil_dev *dev) -{ - printk(KERN_WARNING PREFIX "errored HIL packet\n"); - dev->idx4 = 0; - complete(&dev->cmd_done); /* just in case somebody is waiting */ -} - -static irqreturn_t hil_dev_interrupt(struct serio *serio, - unsigned char data, unsigned int flags) -{ - struct hil_dev *dev; - hil_packet packet; - int idx; - - dev = serio_get_drvdata(serio); - BUG_ON(dev == NULL); - - if (dev->idx4 >= HIL_PACKET_MAX_LENGTH * sizeof(hil_packet)) { - hil_dev_process_err(dev); - goto out; - } - - idx = dev->idx4 / 4; - if (!(dev->idx4 % 4)) - dev->data[idx] = 0; - packet = dev->data[idx]; - packet |= ((hil_packet)data) << ((3 - (dev->idx4 % 4)) * 8); - dev->data[idx] = packet; - - /* Records of N 4-byte hil_packets must terminate with a command. */ - if ((++dev->idx4 % 4) == 0) { - if ((packet & 0xffff0000) != HIL_ERR_INT) { - hil_dev_process_err(dev); - } else if (packet & HIL_PKT_CMD) { - if (hil_dev_is_command_response(packet)) - hil_dev_handle_command_response(dev); - else if (dev->is_pointer) - hil_dev_handle_ptr_events(dev); - else - hil_dev_handle_kbd_events(dev); - dev->idx4 = 0; - } - } - out: - return IRQ_HANDLED; -} - -static void hil_dev_disconnect(struct serio *serio) -{ - struct hil_dev *dev = serio_get_drvdata(serio); - - BUG_ON(dev == NULL); - - serio_close(serio); - input_unregister_device(dev->dev); - serio_set_drvdata(serio, NULL); - kfree(dev); -} - -static void hil_dev_keyboard_setup(struct hil_dev *kbd) -{ - struct input_dev *input_dev = kbd->dev; - uint8_t did = kbd->idd[0]; - int i; - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - input_dev->ledbit[0] = BIT_MASK(LED_NUML) | BIT_MASK(LED_CAPSL) | - BIT_MASK(LED_SCROLLL); - - for (i = 0; i < 128; i++) { - __set_bit(hil_kbd_set1[i], input_dev->keybit); - __set_bit(hil_kbd_set3[i], input_dev->keybit); - } - __clear_bit(KEY_RESERVED, input_dev->keybit); - - input_dev->keycodemax = HIL_KEYCODES_SET1_TBLSIZE; - input_dev->keycodesize = sizeof(hil_kbd_set1[0]); - input_dev->keycode = hil_kbd_set1; - - input_dev->name = strlen(kbd->rnm) ? kbd->rnm : "HIL keyboard"; - input_dev->phys = "hpkbd/input0"; - - printk(KERN_INFO PREFIX "HIL keyboard found (did = 0x%02x, lang = %s)\n", - did, hil_language[did & HIL_IDD_DID_TYPE_KB_LANG_MASK]); -} - -static void hil_dev_pointer_setup(struct hil_dev *ptr) -{ - struct input_dev *input_dev = ptr->dev; - uint8_t did = ptr->idd[0]; - uint8_t *idd = ptr->idd + 1; - unsigned int naxsets = HIL_IDD_NUM_AXSETS(*idd); - unsigned int i, btntype; - const char *txt; - - ptr->naxes = HIL_IDD_NUM_AXES_PER_SET(*idd); - - switch (did & HIL_IDD_DID_TYPE_MASK) { - case HIL_IDD_DID_TYPE_REL: - input_dev->evbit[0] = BIT_MASK(EV_REL); - - for (i = 0; i < ptr->naxes; i++) - __set_bit(REL_X + i, input_dev->relbit); - - for (i = 3; naxsets > 1 && i < ptr->naxes + 3; i++) - __set_bit(REL_X + i, input_dev->relbit); - - txt = "relative"; - break; - - case HIL_IDD_DID_TYPE_ABS: - input_dev->evbit[0] = BIT_MASK(EV_ABS); - - for (i = 0; i < ptr->naxes; i++) - input_set_abs_params(input_dev, ABS_X + i, - 0, HIL_IDD_AXIS_MAX(idd, i), 0, 0); - - for (i = 3; naxsets > 1 && i < ptr->naxes + 3; i++) - input_set_abs_params(input_dev, ABS_X + i, - 0, HIL_IDD_AXIS_MAX(idd, i - 3), 0, 0); - -#ifdef TABLET_AUTOADJUST - for (i = 0; i < ABS_MAX; i++) { - int diff = input_abs_get_max(input_dev, ABS_X + i) / 10; - input_abs_set_min(input_dev, ABS_X + i, - input_abs_get_min(input_dev, ABS_X + i) + diff); - input_abs_set_max(input_dev, ABS_X + i, - input_abs_get_max(input_dev, ABS_X + i) - diff); - } -#endif - - txt = "absolute"; - break; - - default: - BUG(); - } - - ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd); - if (ptr->nbtn) - input_dev->evbit[0] |= BIT_MASK(EV_KEY); - - btntype = BTN_MISC; - if ((did & HIL_IDD_DID_ABS_TABLET_MASK) == HIL_IDD_DID_ABS_TABLET) -#ifdef TABLET_SIMULATES_MOUSE - btntype = BTN_TOUCH; -#else - btntype = BTN_DIGI; -#endif - if ((did & HIL_IDD_DID_ABS_TSCREEN_MASK) == HIL_IDD_DID_ABS_TSCREEN) - btntype = BTN_TOUCH; - - if ((did & HIL_IDD_DID_REL_MOUSE_MASK) == HIL_IDD_DID_REL_MOUSE) - btntype = BTN_MOUSE; - - for (i = 0; i < ptr->nbtn; i++) { - __set_bit(btntype | i, input_dev->keybit); - ptr->btnmap[i] = btntype | i; - } - - if (btntype == BTN_MOUSE) { - /* Swap buttons 2 and 3 */ - ptr->btnmap[1] = BTN_MIDDLE; - ptr->btnmap[2] = BTN_RIGHT; - } - - input_dev->name = strlen(ptr->rnm) ? ptr->rnm : "HIL pointer device"; - - printk(KERN_INFO PREFIX - "HIL pointer device found (did: 0x%02x, axis: %s)\n", - did, txt); - printk(KERN_INFO PREFIX - "HIL pointer has %i buttons and %i sets of %i axes\n", - ptr->nbtn, naxsets, ptr->naxes); -} - -static int hil_dev_connect(struct serio *serio, struct serio_driver *drv) -{ - struct hil_dev *dev; - struct input_dev *input_dev; - uint8_t did, *idd; - int error; - - dev = kzalloc(sizeof(*dev), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!dev || !input_dev) { - error = -ENOMEM; - goto bail0; - } - - dev->serio = serio; - dev->dev = input_dev; - - error = serio_open(serio, drv); - if (error) - goto bail0; - - serio_set_drvdata(serio, dev); - - /* Get device info. MLC driver supplies devid/status/etc. */ - init_completion(&dev->cmd_done); - serio_write(serio, 0); - serio_write(serio, 0); - serio_write(serio, HIL_PKT_CMD >> 8); - serio_write(serio, HIL_CMD_IDD); - error = wait_for_completion_killable(&dev->cmd_done); - if (error) - goto bail1; - - init_completion(&dev->cmd_done); - serio_write(serio, 0); - serio_write(serio, 0); - serio_write(serio, HIL_PKT_CMD >> 8); - serio_write(serio, HIL_CMD_RSC); - error = wait_for_completion_killable(&dev->cmd_done); - if (error) - goto bail1; - - init_completion(&dev->cmd_done); - serio_write(serio, 0); - serio_write(serio, 0); - serio_write(serio, HIL_PKT_CMD >> 8); - serio_write(serio, HIL_CMD_RNM); - error = wait_for_completion_killable(&dev->cmd_done); - if (error) - goto bail1; - - init_completion(&dev->cmd_done); - serio_write(serio, 0); - serio_write(serio, 0); - serio_write(serio, HIL_PKT_CMD >> 8); - serio_write(serio, HIL_CMD_EXD); - error = wait_for_completion_killable(&dev->cmd_done); - if (error) - goto bail1; - - did = dev->idd[0]; - idd = dev->idd + 1; - - switch (did & HIL_IDD_DID_TYPE_MASK) { - case HIL_IDD_DID_TYPE_KB_INTEGRAL: - case HIL_IDD_DID_TYPE_KB_ITF: - case HIL_IDD_DID_TYPE_KB_RSVD: - case HIL_IDD_DID_TYPE_CHAR: - if (HIL_IDD_NUM_BUTTONS(idd) || - HIL_IDD_NUM_AXES_PER_SET(*idd)) { - printk(KERN_INFO PREFIX - "combo devices are not supported.\n"); - goto bail1; - } - - dev->is_pointer = false; - hil_dev_keyboard_setup(dev); - break; - - case HIL_IDD_DID_TYPE_REL: - case HIL_IDD_DID_TYPE_ABS: - dev->is_pointer = true; - hil_dev_pointer_setup(dev); - break; - - default: - goto bail1; - } - - input_dev->id.bustype = BUS_HIL; - input_dev->id.vendor = PCI_VENDOR_ID_HP; - input_dev->id.product = 0x0001; /* TODO: get from kbd->rsc */ - input_dev->id.version = 0x0100; /* TODO: get from kbd->rsc */ - input_dev->dev.parent = &serio->dev; - - if (!dev->is_pointer) { - serio_write(serio, 0); - serio_write(serio, 0); - serio_write(serio, HIL_PKT_CMD >> 8); - /* Enable Keyswitch Autorepeat 1 */ - serio_write(serio, HIL_CMD_EK1); - /* No need to wait for completion */ - } - - error = input_register_device(input_dev); - if (error) - goto bail1; - - return 0; - - bail1: - serio_close(serio); - serio_set_drvdata(serio, NULL); - bail0: - input_free_device(input_dev); - kfree(dev); - return error; -} - -static struct serio_device_id hil_dev_ids[] = { - { - .type = SERIO_HIL_MLC, - .proto = SERIO_HIL, - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { 0 } -}; - -MODULE_DEVICE_TABLE(serio, hil_dev_ids); - -static struct serio_driver hil_serio_drv = { - .driver = { - .name = "hil_dev", - }, - .description = "HP HIL keyboard/mouse/tablet driver", - .id_table = hil_dev_ids, - .connect = hil_dev_connect, - .disconnect = hil_dev_disconnect, - .interrupt = hil_dev_interrupt -}; - -static int __init hil_dev_init(void) -{ - return serio_register_driver(&hil_serio_drv); -} - -static void __exit hil_dev_exit(void) -{ - serio_unregister_driver(&hil_serio_drv); -} - -module_init(hil_dev_init); -module_exit(hil_dev_exit); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/hilkbd.c b/ANDROID_3.4.5/drivers/input/keyboard/hilkbd.c deleted file mode 100644 index 5f72440b..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/hilkbd.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * linux/drivers/hil/hilkbd.c - * - * Copyright (C) 1998 Philip Blundell <philb@gnu.org> - * Copyright (C) 1999 Matthew Wilcox <willy@bofh.ai> - * Copyright (C) 1999-2007 Helge Deller <deller@gmx.de> - * - * Very basic HP Human Interface Loop (HIL) driver. - * This driver handles the keyboard on HP300 (m68k) and on some - * HP700 (parisc) series machines. - * - * - * This file is subject to the terms and conditions of the GNU General Public - * License version 2. See the file COPYING in the main directory of this - * archive for more details. - */ - -#include <linux/pci_ids.h> -#include <linux/ioport.h> -#include <linux/module.h> -#include <linux/errno.h> -#include <linux/input.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/hil.h> -#include <linux/io.h> -#include <linux/sched.h> -#include <linux/spinlock.h> -#include <asm/irq.h> -#ifdef CONFIG_HP300 -#include <asm/hwtest.h> -#endif - - -MODULE_AUTHOR("Philip Blundell, Matthew Wilcox, Helge Deller"); -MODULE_DESCRIPTION("HIL keyboard driver (basic functionality)"); -MODULE_LICENSE("GPL v2"); - - -#if defined(CONFIG_PARISC) - - #include <asm/io.h> - #include <asm/hardware.h> - #include <asm/parisc-device.h> - static unsigned long hil_base; /* HPA for the HIL device */ - static unsigned int hil_irq; - #define HILBASE hil_base /* HPPA (parisc) port address */ - #define HIL_DATA 0x800 - #define HIL_CMD 0x801 - #define HIL_IRQ hil_irq - #define hil_readb(p) gsc_readb(p) - #define hil_writeb(v,p) gsc_writeb((v),(p)) - -#elif defined(CONFIG_HP300) - - #define HILBASE 0xf0428000UL /* HP300 (m68k) port address */ - #define HIL_DATA 0x1 - #define HIL_CMD 0x3 - #define HIL_IRQ 2 - #define hil_readb(p) readb(p) - #define hil_writeb(v,p) writeb((v),(p)) - -#else -#error "HIL is not supported on this platform" -#endif - - - -/* HIL helper functions */ - -#define hil_busy() (hil_readb(HILBASE + HIL_CMD) & HIL_BUSY) -#define hil_data_available() (hil_readb(HILBASE + HIL_CMD) & HIL_DATA_RDY) -#define hil_status() (hil_readb(HILBASE + HIL_CMD)) -#define hil_command(x) do { hil_writeb((x), HILBASE + HIL_CMD); } while (0) -#define hil_read_data() (hil_readb(HILBASE + HIL_DATA)) -#define hil_write_data(x) do { hil_writeb((x), HILBASE + HIL_DATA); } while (0) - -/* HIL constants */ - -#define HIL_BUSY 0x02 -#define HIL_DATA_RDY 0x01 - -#define HIL_SETARD 0xA0 /* set auto-repeat delay */ -#define HIL_SETARR 0xA2 /* set auto-repeat rate */ -#define HIL_SETTONE 0xA3 /* set tone generator */ -#define HIL_CNMT 0xB2 /* clear nmi */ -#define HIL_INTON 0x5C /* Turn on interrupts. */ -#define HIL_INTOFF 0x5D /* Turn off interrupts. */ - -#define HIL_READKBDSADR 0xF9 -#define HIL_WRITEKBDSADR 0xE9 - -static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE] __read_mostly = - { HIL_KEYCODES_SET1 }; - -/* HIL structure */ -static struct { - struct input_dev *dev; - - unsigned int curdev; - - unsigned char s; - unsigned char c; - int valid; - - unsigned char data[16]; - unsigned int ptr; - spinlock_t lock; - - void *dev_id; /* native bus device */ -} hil_dev; - - -static void poll_finished(void) -{ - int down; - int key; - unsigned char scode; - - switch (hil_dev.data[0]) { - case 0x40: - down = (hil_dev.data[1] & 1) == 0; - scode = hil_dev.data[1] >> 1; - key = hphilkeyb_keycode[scode]; - input_report_key(hil_dev.dev, key, down); - break; - } - hil_dev.curdev = 0; -} - - -static inline void handle_status(unsigned char s, unsigned char c) -{ - if (c & 0x8) { - /* End of block */ - if (c & 0x10) - poll_finished(); - } else { - if (c & 0x10) { - if (hil_dev.curdev) - poll_finished(); /* just in case */ - hil_dev.curdev = c & 7; - hil_dev.ptr = 0; - } - } -} - - -static inline void handle_data(unsigned char s, unsigned char c) -{ - if (hil_dev.curdev) { - hil_dev.data[hil_dev.ptr++] = c; - hil_dev.ptr &= 15; - } -} - - -/* handle HIL interrupts */ -static irqreturn_t hil_interrupt(int irq, void *handle) -{ - unsigned char s, c; - - s = hil_status(); - c = hil_read_data(); - - switch (s >> 4) { - case 0x5: - handle_status(s, c); - break; - case 0x6: - handle_data(s, c); - break; - case 0x4: - hil_dev.s = s; - hil_dev.c = c; - mb(); - hil_dev.valid = 1; - break; - } - return IRQ_HANDLED; -} - - -/* send a command to the HIL */ -static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len) -{ - unsigned long flags; - - spin_lock_irqsave(&hil_dev.lock, flags); - while (hil_busy()) - /* wait */; - hil_command(cmd); - while (len--) { - while (hil_busy()) - /* wait */; - hil_write_data(*(data++)); - } - spin_unlock_irqrestore(&hil_dev.lock, flags); -} - - -/* initialize HIL */ -static int __devinit hil_keyb_init(void) -{ - unsigned char c; - unsigned int i, kbid; - wait_queue_head_t hil_wait; - int err; - - if (hil_dev.dev) - return -ENODEV; /* already initialized */ - - init_waitqueue_head(&hil_wait); - spin_lock_init(&hil_dev.lock); - - hil_dev.dev = input_allocate_device(); - if (!hil_dev.dev) - return -ENOMEM; - - err = request_irq(HIL_IRQ, hil_interrupt, 0, "hil", hil_dev.dev_id); - if (err) { - printk(KERN_ERR "HIL: Can't get IRQ\n"); - goto err1; - } - - /* Turn on interrupts */ - hil_do(HIL_INTON, NULL, 0); - - /* Look for keyboards */ - hil_dev.valid = 0; /* clear any pending data */ - hil_do(HIL_READKBDSADR, NULL, 0); - - wait_event_interruptible_timeout(hil_wait, hil_dev.valid, 3 * HZ); - if (!hil_dev.valid) - printk(KERN_WARNING "HIL: timed out, assuming no keyboard present\n"); - - c = hil_dev.c; - hil_dev.valid = 0; - if (c == 0) { - kbid = -1; - printk(KERN_WARNING "HIL: no keyboard present\n"); - } else { - kbid = ffz(~c); - printk(KERN_INFO "HIL: keyboard found at id %d\n", kbid); - } - - /* set it to raw mode */ - c = 0; - hil_do(HIL_WRITEKBDSADR, &c, 1); - - for (i = 0; i < HIL_KEYCODES_SET1_TBLSIZE; i++) - if (hphilkeyb_keycode[i] != KEY_RESERVED) - __set_bit(hphilkeyb_keycode[i], hil_dev.dev->keybit); - - hil_dev.dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - hil_dev.dev->ledbit[0] = BIT_MASK(LED_NUML) | BIT_MASK(LED_CAPSL) | - BIT_MASK(LED_SCROLLL); - hil_dev.dev->keycodemax = HIL_KEYCODES_SET1_TBLSIZE; - hil_dev.dev->keycodesize= sizeof(hphilkeyb_keycode[0]); - hil_dev.dev->keycode = hphilkeyb_keycode; - hil_dev.dev->name = "HIL keyboard"; - hil_dev.dev->phys = "hpkbd/input0"; - - hil_dev.dev->id.bustype = BUS_HIL; - hil_dev.dev->id.vendor = PCI_VENDOR_ID_HP; - hil_dev.dev->id.product = 0x0001; - hil_dev.dev->id.version = 0x0010; - - err = input_register_device(hil_dev.dev); - if (err) { - printk(KERN_ERR "HIL: Can't register device\n"); - goto err2; - } - - printk(KERN_INFO "input: %s, ID %d at 0x%08lx (irq %d) found and attached\n", - hil_dev.dev->name, kbid, HILBASE, HIL_IRQ); - - return 0; - -err2: - hil_do(HIL_INTOFF, NULL, 0); - free_irq(HIL_IRQ, hil_dev.dev_id); -err1: - input_free_device(hil_dev.dev); - hil_dev.dev = NULL; - return err; -} - -static void __devexit hil_keyb_exit(void) -{ - if (HIL_IRQ) - free_irq(HIL_IRQ, hil_dev.dev_id); - - /* Turn off interrupts */ - hil_do(HIL_INTOFF, NULL, 0); - - input_unregister_device(hil_dev.dev); - hil_dev.dev = NULL; -} - -#if defined(CONFIG_PARISC) -static int __devinit hil_probe_chip(struct parisc_device *dev) -{ - /* Only allow one HIL keyboard */ - if (hil_dev.dev) - return -ENODEV; - - if (!dev->irq) { - printk(KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%p\n", - (void *)dev->hpa.start); - return -ENODEV; - } - - hil_base = dev->hpa.start; - hil_irq = dev->irq; - hil_dev.dev_id = dev; - - printk(KERN_INFO "Found HIL bus at 0x%08lx, IRQ %d\n", hil_base, hil_irq); - - return hil_keyb_init(); -} - -static int __devexit hil_remove_chip(struct parisc_device *dev) -{ - hil_keyb_exit(); - - return 0; -} - -static struct parisc_device_id hil_tbl[] = { - { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00073 }, - { 0, } -}; - -#if 0 -/* Disabled to avoid conflicts with the HP SDC HIL drivers */ -MODULE_DEVICE_TABLE(parisc, hil_tbl); -#endif - -static struct parisc_driver hil_driver = { - .name = "hil", - .id_table = hil_tbl, - .probe = hil_probe_chip, - .remove = __devexit_p(hil_remove_chip), -}; - -static int __init hil_init(void) -{ - return register_parisc_driver(&hil_driver); -} - -static void __exit hil_exit(void) -{ - unregister_parisc_driver(&hil_driver); -} - -#else /* !CONFIG_PARISC */ - -static int __init hil_init(void) -{ - int error; - - /* Only allow one HIL keyboard */ - if (hil_dev.dev) - return -EBUSY; - - if (!MACH_IS_HP300) - return -ENODEV; - - if (!hwreg_present((void *)(HILBASE + HIL_DATA))) { - printk(KERN_ERR "HIL: hardware register was not found\n"); - return -ENODEV; - } - - if (!request_region(HILBASE + HIL_DATA, 2, "hil")) { - printk(KERN_ERR "HIL: IOPORT region already used\n"); - return -EIO; - } - - error = hil_keyb_init(); - if (error) { - release_region(HILBASE + HIL_DATA, 2); - return error; - } - - return 0; -} - -static void __exit hil_exit(void) -{ - hil_keyb_exit(); - release_region(HILBASE + HIL_DATA, 2); -} - -#endif /* CONFIG_PARISC */ - -module_init(hil_init); -module_exit(hil_exit); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/hpps2atkbd.h b/ANDROID_3.4.5/drivers/input/keyboard/hpps2atkbd.h deleted file mode 100644 index dc33f694..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/hpps2atkbd.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * drivers/input/keyboard/hpps2atkbd.h - * - * Copyright (c) 2004 Helge Deller <deller@gmx.de> - * Copyright (c) 2002 Laurent Canet <canetl@esiee.fr> - * Copyright (c) 2002 Thibaut Varene <varenet@parisc-linux.org> - * Copyright (c) 2000 Xavier Debacker <debackex@esiee.fr> - * - * HP PS/2 AT-compatible Keyboard, found in PA/RISC Workstations & Laptops - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - - -/* Is the keyboard an RDI PrecisionBook? */ -#ifndef CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES -# define CONFLICT(x,y) x -#else -# define CONFLICT(x,y) y -#endif - -/* sadly RDI (Tadpole) decided to ship a different keyboard layout - than HP for their PS/2 laptop keyboard which leads to conflicting - keycodes between a normal HP PS/2 keyboard and a RDI Precisionbook. - HP: RDI: */ -#define C_07 CONFLICT( KEY_F12, KEY_F1 ) -#define C_11 CONFLICT( KEY_LEFTALT, KEY_LEFTCTRL ) -#define C_14 CONFLICT( KEY_LEFTCTRL, KEY_CAPSLOCK ) -#define C_58 CONFLICT( KEY_CAPSLOCK, KEY_RIGHTCTRL ) -#define C_61 CONFLICT( KEY_102ND, KEY_LEFT ) - -/* Raw SET 2 scancode table */ - -/* 00 */ KEY_RESERVED, KEY_F9, KEY_RESERVED, KEY_F5, KEY_F3, KEY_F1, KEY_F2, C_07, -/* 08 */ KEY_ESC, KEY_F10, KEY_F8, KEY_F6, KEY_F4, KEY_TAB, KEY_GRAVE, KEY_F2, -/* 10 */ KEY_RESERVED, C_11, KEY_LEFTSHIFT, KEY_RESERVED, C_14, KEY_Q, KEY_1, KEY_F3, -/* 18 */ KEY_RESERVED, KEY_LEFTALT, KEY_Z, KEY_S, KEY_A, KEY_W, KEY_2, KEY_F4, -/* 20 */ KEY_RESERVED, KEY_C, KEY_X, KEY_D, KEY_E, KEY_4, KEY_3, KEY_F5, -/* 28 */ KEY_RESERVED, KEY_SPACE, KEY_V, KEY_F, KEY_T, KEY_R, KEY_5, KEY_F6, -/* 30 */ KEY_RESERVED, KEY_N, KEY_B, KEY_H, KEY_G, KEY_Y, KEY_6, KEY_F7, -/* 38 */ KEY_RESERVED, KEY_RIGHTALT, KEY_M, KEY_J, KEY_U, KEY_7, KEY_8, KEY_F8, -/* 40 */ KEY_RESERVED, KEY_COMMA, KEY_K, KEY_I, KEY_O, KEY_0, KEY_9, KEY_F9, -/* 48 */ KEY_RESERVED, KEY_DOT, KEY_SLASH, KEY_L, KEY_SEMICOLON, KEY_P, KEY_MINUS, KEY_F10, -/* 50 */ KEY_RESERVED, KEY_RESERVED, KEY_APOSTROPHE,KEY_RESERVED, KEY_LEFTBRACE, KEY_EQUAL, KEY_F11, KEY_SYSRQ, -/* 58 */ C_58, KEY_RIGHTSHIFT,KEY_ENTER, KEY_RIGHTBRACE,KEY_BACKSLASH, KEY_BACKSLASH,KEY_F12, KEY_SCROLLLOCK, -/* 60 */ KEY_DOWN, C_61, KEY_PAUSE, KEY_UP, KEY_DELETE, KEY_END, KEY_BACKSPACE, KEY_INSERT, -/* 68 */ KEY_RESERVED, KEY_KP1, KEY_RIGHT, KEY_KP4, KEY_KP7, KEY_PAGEDOWN, KEY_HOME, KEY_PAGEUP, -/* 70 */ KEY_KP0, KEY_KPDOT, KEY_KP2, KEY_KP5, KEY_KP6, KEY_KP8, KEY_ESC, KEY_NUMLOCK, -/* 78 */ KEY_F11, KEY_KPPLUS, KEY_KP3, KEY_KPMINUS, KEY_KPASTERISK,KEY_KP9, KEY_SCROLLLOCK,KEY_102ND, -/* 80 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 88 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 90 */ KEY_RESERVED, KEY_RIGHTALT, 255, KEY_RESERVED, KEY_RIGHTCTRL, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 98 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_CAPSLOCK, KEY_RESERVED, KEY_LEFTMETA, -/* a0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RIGHTMETA, -/* a8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_COMPOSE, -/* b0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* b8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* c0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* c8 */ KEY_RESERVED, KEY_RESERVED, KEY_KPSLASH, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* d0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* d8 */ KEY_RESERVED, KEY_RESERVED, KEY_KPENTER, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* e0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* e8 */ KEY_RESERVED, KEY_END, KEY_RESERVED, KEY_LEFT, KEY_HOME, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* f0 */ KEY_INSERT, KEY_DELETE, KEY_DOWN, KEY_RESERVED, KEY_RIGHT, KEY_UP, KEY_RESERVED, KEY_PAUSE, -/* f8 */ KEY_RESERVED, KEY_RESERVED, KEY_PAGEDOWN, KEY_RESERVED, KEY_SYSRQ, KEY_PAGEUP, KEY_RESERVED, KEY_RESERVED, - -/* These are offset for escaped keycodes: */ - -/* 00 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_F7, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 08 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_LEFTMETA, KEY_RIGHTMETA, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 10 */ KEY_RESERVED, KEY_RIGHTALT, KEY_RESERVED, KEY_RESERVED, KEY_RIGHTCTRL, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 18 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 20 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 28 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 30 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 38 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 40 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 48 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 50 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 58 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 60 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 68 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 70 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 78 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 80 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 88 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 90 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* 98 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* a0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* a8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* b0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* b8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* c0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* c8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* d0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* d8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* e0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* e8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* f0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, -/* f8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED - -#undef CONFLICT -#undef C_07 -#undef C_11 -#undef C_14 -#undef C_58 -#undef C_61 - diff --git a/ANDROID_3.4.5/drivers/input/keyboard/imx_keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/imx_keypad.c deleted file mode 100644 index fb87b3bc..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/imx_keypad.c +++ /dev/null @@ -1,627 +0,0 @@ -/* - * Driver for the IMX keypad port. - * Copyright (C) 2009 Alberto Panizzo <maramaopercheseimorto@gmail.com> - * - * 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. - * - * <<Power management needs to be implemented>>. - */ - -#include <linux/clk.h> -#include <linux/delay.h> -#include <linux/device.h> -#include <linux/err.h> -#include <linux/init.h> -#include <linux/input/matrix_keypad.h> -#include <linux/interrupt.h> -#include <linux/io.h> -#include <linux/jiffies.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/timer.h> - -/* - * Keypad Controller registers (halfword) - */ -#define KPCR 0x00 /* Keypad Control Register */ - -#define KPSR 0x02 /* Keypad Status Register */ -#define KBD_STAT_KPKD (0x1 << 0) /* Key Press Interrupt Status bit (w1c) */ -#define KBD_STAT_KPKR (0x1 << 1) /* Key Release Interrupt Status bit (w1c) */ -#define KBD_STAT_KDSC (0x1 << 2) /* Key Depress Synch Chain Status bit (w1c)*/ -#define KBD_STAT_KRSS (0x1 << 3) /* Key Release Synch Status bit (w1c)*/ -#define KBD_STAT_KDIE (0x1 << 8) /* Key Depress Interrupt Enable Status bit */ -#define KBD_STAT_KRIE (0x1 << 9) /* Key Release Interrupt Enable */ -#define KBD_STAT_KPPEN (0x1 << 10) /* Keypad Clock Enable */ - -#define KDDR 0x04 /* Keypad Data Direction Register */ -#define KPDR 0x06 /* Keypad Data Register */ - -#define MAX_MATRIX_KEY_ROWS 8 -#define MAX_MATRIX_KEY_COLS 8 -#define MATRIX_ROW_SHIFT 3 - -#define MAX_MATRIX_KEY_NUM (MAX_MATRIX_KEY_ROWS * MAX_MATRIX_KEY_COLS) - -struct imx_keypad { - - struct clk *clk; - struct input_dev *input_dev; - void __iomem *mmio_base; - - int irq; - struct timer_list check_matrix_timer; - - /* - * The matrix is stable only if no changes are detected after - * IMX_KEYPAD_SCANS_FOR_STABILITY scans - */ -#define IMX_KEYPAD_SCANS_FOR_STABILITY 3 - int stable_count; - - bool enabled; - - /* Masks for enabled rows/cols */ - unsigned short rows_en_mask; - unsigned short cols_en_mask; - - unsigned short keycodes[MAX_MATRIX_KEY_NUM]; - - /* - * Matrix states: - * -stable: achieved after a complete debounce process. - * -unstable: used in the debouncing process. - */ - unsigned short matrix_stable_state[MAX_MATRIX_KEY_COLS]; - unsigned short matrix_unstable_state[MAX_MATRIX_KEY_COLS]; -}; - -/* Scan the matrix and return the new state in *matrix_volatile_state. */ -static void imx_keypad_scan_matrix(struct imx_keypad *keypad, - unsigned short *matrix_volatile_state) -{ - int col; - unsigned short reg_val; - - for (col = 0; col < MAX_MATRIX_KEY_COLS; col++) { - if ((keypad->cols_en_mask & (1 << col)) == 0) - continue; - /* - * Discharge keypad capacitance: - * 2. write 1s on column data. - * 3. configure columns as totem-pole to discharge capacitance. - * 4. configure columns as open-drain. - */ - reg_val = readw(keypad->mmio_base + KPDR); - reg_val |= 0xff00; - writew(reg_val, keypad->mmio_base + KPDR); - - reg_val = readw(keypad->mmio_base + KPCR); - reg_val &= ~((keypad->cols_en_mask & 0xff) << 8); - writew(reg_val, keypad->mmio_base + KPCR); - - udelay(2); - - reg_val = readw(keypad->mmio_base + KPCR); - reg_val |= (keypad->cols_en_mask & 0xff) << 8; - writew(reg_val, keypad->mmio_base + KPCR); - - /* - * 5. Write a single column to 0, others to 1. - * 6. Sample row inputs and save data. - * 7. Repeat steps 2 - 6 for remaining columns. - */ - reg_val = readw(keypad->mmio_base + KPDR); - reg_val &= ~(1 << (8 + col)); - writew(reg_val, keypad->mmio_base + KPDR); - - /* - * Delay added to avoid propagating the 0 from column to row - * when scanning. - */ - udelay(5); - - /* - * 1s in matrix_volatile_state[col] means key pressures - * throw data from non enabled rows. - */ - reg_val = readw(keypad->mmio_base + KPDR); - matrix_volatile_state[col] = (~reg_val) & keypad->rows_en_mask; - } - - /* - * Return in standby mode: - * 9. write 0s to columns - */ - reg_val = readw(keypad->mmio_base + KPDR); - reg_val &= 0x00ff; - writew(reg_val, keypad->mmio_base + KPDR); -} - -/* - * Compare the new matrix state (volatile) with the stable one stored in - * keypad->matrix_stable_state and fire events if changes are detected. - */ -static void imx_keypad_fire_events(struct imx_keypad *keypad, - unsigned short *matrix_volatile_state) -{ - struct input_dev *input_dev = keypad->input_dev; - int row, col; - - for (col = 0; col < MAX_MATRIX_KEY_COLS; col++) { - unsigned short bits_changed; - int code; - - if ((keypad->cols_en_mask & (1 << col)) == 0) - continue; /* Column is not enabled */ - - bits_changed = keypad->matrix_stable_state[col] ^ - matrix_volatile_state[col]; - - if (bits_changed == 0) - continue; /* Column does not contain changes */ - - for (row = 0; row < MAX_MATRIX_KEY_ROWS; row++) { - if ((keypad->rows_en_mask & (1 << row)) == 0) - continue; /* Row is not enabled */ - if ((bits_changed & (1 << row)) == 0) - continue; /* Row does not contain changes */ - - code = MATRIX_SCAN_CODE(row, col, MATRIX_ROW_SHIFT); - input_event(input_dev, EV_MSC, MSC_SCAN, code); - input_report_key(input_dev, keypad->keycodes[code], - matrix_volatile_state[col] & (1 << row)); - dev_dbg(&input_dev->dev, "Event code: %d, val: %d", - keypad->keycodes[code], - matrix_volatile_state[col] & (1 << row)); - } - } - input_sync(input_dev); -} - -/* - * imx_keypad_check_for_events is the timer handler. - */ -static void imx_keypad_check_for_events(unsigned long data) -{ - struct imx_keypad *keypad = (struct imx_keypad *) data; - unsigned short matrix_volatile_state[MAX_MATRIX_KEY_COLS]; - unsigned short reg_val; - bool state_changed, is_zero_matrix; - int i; - - memset(matrix_volatile_state, 0, sizeof(matrix_volatile_state)); - - imx_keypad_scan_matrix(keypad, matrix_volatile_state); - - state_changed = false; - for (i = 0; i < MAX_MATRIX_KEY_COLS; i++) { - if ((keypad->cols_en_mask & (1 << i)) == 0) - continue; - - if (keypad->matrix_unstable_state[i] ^ matrix_volatile_state[i]) { - state_changed = true; - break; - } - } - - /* - * If the matrix state is changed from the previous scan - * (Re)Begin the debouncing process, saving the new state in - * keypad->matrix_unstable_state. - * else - * Increase the count of number of scans with a stable state. - */ - if (state_changed) { - memcpy(keypad->matrix_unstable_state, matrix_volatile_state, - sizeof(matrix_volatile_state)); - keypad->stable_count = 0; - } else - keypad->stable_count++; - - /* - * If the matrix is not as stable as we want reschedule scan - * in the near future. - */ - if (keypad->stable_count < IMX_KEYPAD_SCANS_FOR_STABILITY) { - mod_timer(&keypad->check_matrix_timer, - jiffies + msecs_to_jiffies(10)); - return; - } - - /* - * If the matrix state is stable, fire the events and save the new - * stable state. Note, if the matrix is kept stable for longer - * (keypad->stable_count > IMX_KEYPAD_SCANS_FOR_STABILITY) all - * events have already been generated. - */ - if (keypad->stable_count == IMX_KEYPAD_SCANS_FOR_STABILITY) { - imx_keypad_fire_events(keypad, matrix_volatile_state); - - memcpy(keypad->matrix_stable_state, matrix_volatile_state, - sizeof(matrix_volatile_state)); - } - - is_zero_matrix = true; - for (i = 0; i < MAX_MATRIX_KEY_COLS; i++) { - if (matrix_volatile_state[i] != 0) { - is_zero_matrix = false; - break; - } - } - - - if (is_zero_matrix) { - /* - * All keys have been released. Enable only the KDI - * interrupt for future key presses (clear the KDI - * status bit and its sync chain before that). - */ - reg_val = readw(keypad->mmio_base + KPSR); - reg_val |= KBD_STAT_KPKD | KBD_STAT_KDSC; - writew(reg_val, keypad->mmio_base + KPSR); - - reg_val = readw(keypad->mmio_base + KPSR); - reg_val |= KBD_STAT_KDIE; - reg_val &= ~KBD_STAT_KRIE; - writew(reg_val, keypad->mmio_base + KPSR); - } else { - /* - * Some keys are still pressed. Schedule a rescan in - * attempt to detect multiple key presses and enable - * the KRI interrupt to react quickly to key release - * event. - */ - mod_timer(&keypad->check_matrix_timer, - jiffies + msecs_to_jiffies(60)); - - reg_val = readw(keypad->mmio_base + KPSR); - reg_val |= KBD_STAT_KPKR | KBD_STAT_KRSS; - writew(reg_val, keypad->mmio_base + KPSR); - - reg_val = readw(keypad->mmio_base + KPSR); - reg_val |= KBD_STAT_KRIE; - reg_val &= ~KBD_STAT_KDIE; - writew(reg_val, keypad->mmio_base + KPSR); - } -} - -static irqreturn_t imx_keypad_irq_handler(int irq, void *dev_id) -{ - struct imx_keypad *keypad = dev_id; - unsigned short reg_val; - - reg_val = readw(keypad->mmio_base + KPSR); - - /* Disable both interrupt types */ - reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE); - /* Clear interrupts status bits */ - reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD; - writew(reg_val, keypad->mmio_base + KPSR); - - if (keypad->enabled) { - /* The matrix is supposed to be changed */ - keypad->stable_count = 0; - - /* Schedule the scanning procedure near in the future */ - mod_timer(&keypad->check_matrix_timer, - jiffies + msecs_to_jiffies(2)); - } - - return IRQ_HANDLED; -} - -static void imx_keypad_config(struct imx_keypad *keypad) -{ - unsigned short reg_val; - - /* - * Include enabled rows in interrupt generation (KPCR[7:0]) - * Configure keypad columns as open-drain (KPCR[15:8]) - */ - reg_val = readw(keypad->mmio_base + KPCR); - reg_val |= keypad->rows_en_mask & 0xff; /* rows */ - reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */ - writew(reg_val, keypad->mmio_base + KPCR); - - /* Write 0's to KPDR[15:8] (Colums) */ - reg_val = readw(keypad->mmio_base + KPDR); - reg_val &= 0x00ff; - writew(reg_val, keypad->mmio_base + KPDR); - - /* Configure columns as output, rows as input (KDDR[15:0]) */ - writew(0xff00, keypad->mmio_base + KDDR); - - /* - * Clear Key Depress and Key Release status bit. - * Clear both synchronizer chain. - */ - reg_val = readw(keypad->mmio_base + KPSR); - reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD | - KBD_STAT_KDSC | KBD_STAT_KRSS; - writew(reg_val, keypad->mmio_base + KPSR); - - /* Enable KDI and disable KRI (avoid false release events). */ - reg_val |= KBD_STAT_KDIE; - reg_val &= ~KBD_STAT_KRIE; - writew(reg_val, keypad->mmio_base + KPSR); -} - -static void imx_keypad_inhibit(struct imx_keypad *keypad) -{ - unsigned short reg_val; - - /* Inhibit KDI and KRI interrupts. */ - reg_val = readw(keypad->mmio_base + KPSR); - reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE); - writew(reg_val, keypad->mmio_base + KPSR); - - /* Colums as open drain and disable all rows */ - writew(0xff00, keypad->mmio_base + KPCR); -} - -static void imx_keypad_close(struct input_dev *dev) -{ - struct imx_keypad *keypad = input_get_drvdata(dev); - - dev_dbg(&dev->dev, ">%s\n", __func__); - - /* Mark keypad as being inactive */ - keypad->enabled = false; - synchronize_irq(keypad->irq); - del_timer_sync(&keypad->check_matrix_timer); - - imx_keypad_inhibit(keypad); - - /* Disable clock unit */ - clk_disable(keypad->clk); -} - -static int imx_keypad_open(struct input_dev *dev) -{ - struct imx_keypad *keypad = input_get_drvdata(dev); - - dev_dbg(&dev->dev, ">%s\n", __func__); - - /* We became active from now */ - keypad->enabled = true; - - /* Enable the kpp clock */ - clk_enable(keypad->clk); - imx_keypad_config(keypad); - - /* Sanity control, not all the rows must be actived now. */ - if ((readw(keypad->mmio_base + KPDR) & keypad->rows_en_mask) == 0) { - dev_err(&dev->dev, - "too many keys pressed, control pins initialisation\n"); - goto open_err; - } - - return 0; - -open_err: - imx_keypad_close(dev); - return -EIO; -} - -static int __devinit imx_keypad_probe(struct platform_device *pdev) -{ - const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data; - struct imx_keypad *keypad; - struct input_dev *input_dev; - struct resource *res; - int irq, error, i; - - if (keymap_data == NULL) { - dev_err(&pdev->dev, "no keymap defined\n"); - return -EINVAL; - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "no irq defined in platform data\n"); - return -EINVAL; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (res == NULL) { - dev_err(&pdev->dev, "no I/O memory defined in platform data\n"); - return -EINVAL; - } - - res = request_mem_region(res->start, resource_size(res), pdev->name); - if (res == NULL) { - dev_err(&pdev->dev, "failed to request I/O memory\n"); - return -EBUSY; - } - - input_dev = input_allocate_device(); - if (!input_dev) { - dev_err(&pdev->dev, "failed to allocate the input device\n"); - error = -ENOMEM; - goto failed_rel_mem; - } - - keypad = kzalloc(sizeof(struct imx_keypad), GFP_KERNEL); - if (!keypad) { - dev_err(&pdev->dev, "not enough memory for driver data\n"); - error = -ENOMEM; - goto failed_free_input; - } - - keypad->input_dev = input_dev; - keypad->irq = irq; - keypad->stable_count = 0; - - setup_timer(&keypad->check_matrix_timer, - imx_keypad_check_for_events, (unsigned long) keypad); - - keypad->mmio_base = ioremap(res->start, resource_size(res)); - if (keypad->mmio_base == NULL) { - dev_err(&pdev->dev, "failed to remap I/O memory\n"); - error = -ENOMEM; - goto failed_free_priv; - } - - keypad->clk = clk_get(&pdev->dev, "kpp"); - if (IS_ERR(keypad->clk)) { - dev_err(&pdev->dev, "failed to get keypad clock\n"); - error = PTR_ERR(keypad->clk); - goto failed_unmap; - } - - /* Search for rows and cols enabled */ - for (i = 0; i < keymap_data->keymap_size; i++) { - keypad->rows_en_mask |= 1 << KEY_ROW(keymap_data->keymap[i]); - keypad->cols_en_mask |= 1 << KEY_COL(keymap_data->keymap[i]); - } - - if (keypad->rows_en_mask > ((1 << MAX_MATRIX_KEY_ROWS) - 1) || - keypad->cols_en_mask > ((1 << MAX_MATRIX_KEY_COLS) - 1)) { - dev_err(&pdev->dev, - "invalid key data (too many rows or colums)\n"); - error = -EINVAL; - goto failed_clock_put; - } - dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask); - dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask); - - /* Init the Input device */ - input_dev->name = pdev->name; - input_dev->id.bustype = BUS_HOST; - input_dev->dev.parent = &pdev->dev; - input_dev->open = imx_keypad_open; - input_dev->close = imx_keypad_close; - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - input_dev->keycode = keypad->keycodes; - input_dev->keycodesize = sizeof(keypad->keycodes[0]); - input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); - - matrix_keypad_build_keymap(keymap_data, MATRIX_ROW_SHIFT, - keypad->keycodes, input_dev->keybit); - - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - input_set_drvdata(input_dev, keypad); - - /* Ensure that the keypad will stay dormant until opened */ - imx_keypad_inhibit(keypad); - - error = request_irq(irq, imx_keypad_irq_handler, 0, - pdev->name, keypad); - if (error) { - dev_err(&pdev->dev, "failed to request IRQ\n"); - goto failed_clock_put; - } - - /* Register the input device */ - error = input_register_device(input_dev); - if (error) { - dev_err(&pdev->dev, "failed to register input device\n"); - goto failed_free_irq; - } - - platform_set_drvdata(pdev, keypad); - device_init_wakeup(&pdev->dev, 1); - - return 0; - -failed_free_irq: - free_irq(irq, pdev); -failed_clock_put: - clk_put(keypad->clk); -failed_unmap: - iounmap(keypad->mmio_base); -failed_free_priv: - kfree(keypad); -failed_free_input: - input_free_device(input_dev); -failed_rel_mem: - release_mem_region(res->start, resource_size(res)); - return error; -} - -static int __devexit imx_keypad_remove(struct platform_device *pdev) -{ - struct imx_keypad *keypad = platform_get_drvdata(pdev); - struct resource *res; - - dev_dbg(&pdev->dev, ">%s\n", __func__); - - platform_set_drvdata(pdev, NULL); - - input_unregister_device(keypad->input_dev); - - free_irq(keypad->irq, keypad); - clk_put(keypad->clk); - - iounmap(keypad->mmio_base); - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(res->start, resource_size(res)); - - kfree(keypad); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int imx_kbd_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct imx_keypad *kbd = platform_get_drvdata(pdev); - struct input_dev *input_dev = kbd->input_dev; - - /* imx kbd can wake up system even clock is disabled */ - mutex_lock(&input_dev->mutex); - - if (input_dev->users) - clk_disable(kbd->clk); - - mutex_unlock(&input_dev->mutex); - - if (device_may_wakeup(&pdev->dev)) - enable_irq_wake(kbd->irq); - - return 0; -} - -static int imx_kbd_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct imx_keypad *kbd = platform_get_drvdata(pdev); - struct input_dev *input_dev = kbd->input_dev; - - if (device_may_wakeup(&pdev->dev)) - disable_irq_wake(kbd->irq); - - mutex_lock(&input_dev->mutex); - - if (input_dev->users) - clk_enable(kbd->clk); - - mutex_unlock(&input_dev->mutex); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(imx_kbd_pm_ops, imx_kbd_suspend, imx_kbd_resume); - -static struct platform_driver imx_keypad_driver = { - .driver = { - .name = "imx-keypad", - .owner = THIS_MODULE, - .pm = &imx_kbd_pm_ops, - }, - .probe = imx_keypad_probe, - .remove = __devexit_p(imx_keypad_remove), -}; -module_platform_driver(imx_keypad_driver); - -MODULE_AUTHOR("Alberto Panizzo <maramaopercheseimorto@gmail.com>"); -MODULE_DESCRIPTION("IMX Keypad Port Driver"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:imx-keypad"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/jornada680_kbd.c b/ANDROID_3.4.5/drivers/input/keyboard/jornada680_kbd.c deleted file mode 100644 index 24f3ea01..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/jornada680_kbd.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * drivers/input/keyboard/jornada680_kbd.c - * - * HP Jornada 620/660/680/690 scan keyboard platform driver - * Copyright (C) 2007 Kristoffer Ericson <Kristoffer.Ericson@gmail.com> - * - * Based on hp680_keyb.c - * Copyright (C) 2006 Paul Mundt - * Copyright (C) 2005 Andriy Skulysh - * Split from drivers/input/keyboard/hp600_keyb.c - * Copyright (C) 2000 Yaegashi Takeshi (hp6xx kbd scan routine and translation table) - * Copyright (C) 2000 Niibe Yutaka (HP620 Keyb translation table) - * - * 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. - */ - -#include <linux/init.h> -#include <linux/input.h> -#include <linux/input-polldev.h> -#include <linux/interrupt.h> -#include <linux/jiffies.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/slab.h> - -#include <asm/delay.h> -#include <asm/io.h> - -#define PCCR 0xa4000104 -#define PDCR 0xa4000106 -#define PECR 0xa4000108 -#define PFCR 0xa400010a -#define PCDR 0xa4000124 -#define PDDR 0xa4000126 -#define PEDR 0xa4000128 -#define PFDR 0xa400012a -#define PGDR 0xa400012c -#define PHDR 0xa400012e -#define PJDR 0xa4000130 -#define PKDR 0xa4000132 -#define PLDR 0xa4000134 - -static const unsigned short jornada_scancodes[] = { -/* PTD1 */ KEY_CAPSLOCK, KEY_MACRO, KEY_LEFTCTRL, 0, KEY_ESC, KEY_KP5, 0, 0, /* 1 -> 8 */ - KEY_F1, KEY_F2, KEY_F3, KEY_F8, KEY_F7, KEY_F6, KEY_F4, KEY_F5, /* 9 -> 16 */ -/* PTD5 */ KEY_SLASH, KEY_APOSTROPHE, KEY_ENTER, 0, KEY_Z, 0, 0, 0, /* 17 -> 24 */ - KEY_X, KEY_C, KEY_V, KEY_DOT, KEY_COMMA, KEY_M, KEY_B, KEY_N, /* 25 -> 32 */ -/* PTD7 */ KEY_KP2, KEY_KP6, KEY_KP3, 0, 0, 0, 0, 0, /* 33 -> 40 */ - KEY_F10, KEY_RO, KEY_F9, KEY_KP4, KEY_NUMLOCK, KEY_SCROLLLOCK, KEY_LEFTALT, KEY_HANJA, /* 41 -> 48 */ -/* PTE0 */ KEY_KATAKANA, KEY_KP0, KEY_GRAVE, 0, KEY_FINANCE, 0, 0, 0, /* 49 -> 56 */ - KEY_KPMINUS, KEY_HIRAGANA, KEY_SPACE, KEY_KPDOT, KEY_VOLUMEUP, 249, 0, 0, /* 57 -> 64 */ -/* PTE1 */ KEY_SEMICOLON, KEY_RIGHTBRACE, KEY_BACKSLASH, 0, KEY_A, 0, 0, 0, /* 65 -> 72 */ - KEY_S, KEY_D, KEY_F, KEY_L, KEY_K, KEY_J, KEY_G, KEY_H, /* 73 -> 80 */ -/* PTE3 */ KEY_KP8, KEY_LEFTMETA, KEY_RIGHTSHIFT, 0, KEY_TAB, 0, 0, 0, /* 81 -> 88 */ - 0, KEY_LEFTSHIFT, KEY_KP7, KEY_KP9, KEY_KP1, KEY_F11, KEY_KPPLUS, KEY_KPASTERISK, /* 89 -> 96 */ -/* PTE6 */ KEY_P, KEY_LEFTBRACE, KEY_BACKSPACE, 0, KEY_Q, 0, 0, 0, /* 97 -> 104 */ - KEY_W, KEY_E, KEY_R, KEY_O, KEY_I, KEY_U, KEY_T, KEY_Y, /* 105 -> 112 */ -/* PTE7 */ KEY_0, KEY_MINUS, KEY_EQUAL, 0, KEY_1, 0, 0, 0, /* 113 -> 120 */ - KEY_2, KEY_3, KEY_4, KEY_9, KEY_8, KEY_7, KEY_5, KEY_6, /* 121 -> 128 */ -/* **** */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -#define JORNADA_SCAN_SIZE 18 - -struct jornadakbd { - struct input_polled_dev *poll_dev; - unsigned short keymap[ARRAY_SIZE(jornada_scancodes)]; - unsigned char length; - unsigned char old_scan[JORNADA_SCAN_SIZE]; - unsigned char new_scan[JORNADA_SCAN_SIZE]; -}; - -static void jornada_parse_kbd(struct jornadakbd *jornadakbd) -{ - struct input_dev *input_dev = jornadakbd->poll_dev->input; - unsigned short *keymap = jornadakbd->keymap; - unsigned int sync_me = 0; - unsigned int i, j; - - for (i = 0; i < JORNADA_SCAN_SIZE; i++) { - unsigned char new = jornadakbd->new_scan[i]; - unsigned char old = jornadakbd->old_scan[i]; - unsigned int xor = new ^ old; - - if (xor == 0) - continue; - - for (j = 0; j < 8; j++) { - unsigned int bit = 1 << j; - if (xor & bit) { - unsigned int scancode = (i << 3) + j; - input_event(input_dev, - EV_MSC, MSC_SCAN, scancode); - input_report_key(input_dev, - keymap[scancode], - !(new & bit)); - sync_me = 1; - } - } - } - - if (sync_me) - input_sync(input_dev); -} - -static void jornada_scan_keyb(unsigned char *s) -{ - int i; - unsigned short ec_static, dc_static; /* = UINT16_t */ - unsigned char matrix_switch[] = { - 0xfd, 0xff, /* PTD1 PD(1) */ - 0xdf, 0xff, /* PTD5 PD(5) */ - 0x7f, 0xff, /* PTD7 PD(7) */ - 0xff, 0xfe, /* PTE0 PE(0) */ - 0xff, 0xfd, /* PTE1 PE(1) */ - 0xff, 0xf7, /* PTE3 PE(3) */ - 0xff, 0xbf, /* PTE6 PE(6) */ - 0xff, 0x7f, /* PTE7 PE(7) */ - }, *t = matrix_switch; - /* PD(x) : - 1. 0xcc0c & (1~(1 << (2*(x)+1))))) - 2. (0xf0cf & 0xfffff) */ - /* PE(x) : - 1. 0xcc0c & 0xffff - 2. 0xf0cf & (1~(1 << (2*(x)+1))))) */ - unsigned short matrix_PDE[] = { - 0xcc04, 0xf0cf, /* PD(1) */ - 0xc40c, 0xf0cf, /* PD(5) */ - 0x4c0c, 0xf0cf, /* PD(7) */ - 0xcc0c, 0xf0cd, /* PE(0) */ - 0xcc0c, 0xf0c7, /* PE(1) */ - 0xcc0c, 0xf04f, /* PE(3) */ - 0xcc0c, 0xd0cf, /* PE(6) */ - 0xcc0c, 0x70cf, /* PE(7) */ - }, *y = matrix_PDE; - - /* Save these control reg bits */ - dc_static = (__raw_readw(PDCR) & (~0xcc0c)); - ec_static = (__raw_readw(PECR) & (~0xf0cf)); - - for (i = 0; i < 8; i++) { - /* disable output for all but the one we want to scan */ - __raw_writew((dc_static | *y++), PDCR); - __raw_writew((ec_static | *y++), PECR); - udelay(5); - - /* Get scanline row */ - __raw_writeb(*t++, PDDR); - __raw_writeb(*t++, PEDR); - udelay(50); - - /* Read data */ - *s++ = __raw_readb(PCDR); - *s++ = __raw_readb(PFDR); - } - /* Scan no lines */ - __raw_writeb(0xff, PDDR); - __raw_writeb(0xff, PEDR); - - /* Enable all scanlines */ - __raw_writew((dc_static | (0x5555 & 0xcc0c)),PDCR); - __raw_writew((ec_static | (0x5555 & 0xf0cf)),PECR); - - /* Ignore extra keys and events */ - *s++ = __raw_readb(PGDR); - *s++ = __raw_readb(PHDR); -} - -static void jornadakbd680_poll(struct input_polled_dev *dev) -{ - struct jornadakbd *jornadakbd = dev->private; - - jornada_scan_keyb(jornadakbd->new_scan); - jornada_parse_kbd(jornadakbd); - memcpy(jornadakbd->old_scan, jornadakbd->new_scan, JORNADA_SCAN_SIZE); -} - -static int __devinit jornada680kbd_probe(struct platform_device *pdev) -{ - struct jornadakbd *jornadakbd; - struct input_polled_dev *poll_dev; - struct input_dev *input_dev; - int i, error; - - jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL); - if (!jornadakbd) - return -ENOMEM; - - poll_dev = input_allocate_polled_device(); - if (!poll_dev) { - error = -ENOMEM; - goto failed; - } - - platform_set_drvdata(pdev, jornadakbd); - - jornadakbd->poll_dev = poll_dev; - - memcpy(jornadakbd->keymap, jornada_scancodes, - sizeof(jornadakbd->keymap)); - - poll_dev->private = jornadakbd; - poll_dev->poll = jornadakbd680_poll; - poll_dev->poll_interval = 50; /* msec */ - - input_dev = poll_dev->input; - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); - input_dev->name = "HP Jornada 680 keyboard"; - input_dev->phys = "jornadakbd/input0"; - input_dev->keycode = jornadakbd->keymap; - input_dev->keycodesize = sizeof(unsigned short); - input_dev->keycodemax = ARRAY_SIZE(jornada_scancodes); - input_dev->dev.parent = &pdev->dev; - input_dev->id.bustype = BUS_HOST; - - for (i = 0; i < 128; i++) - if (jornadakbd->keymap[i]) - __set_bit(jornadakbd->keymap[i], input_dev->keybit); - __clear_bit(KEY_RESERVED, input_dev->keybit); - - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - - error = input_register_polled_device(jornadakbd->poll_dev); - if (error) - goto failed; - - return 0; - - failed: - printk(KERN_ERR "Jornadakbd: failed to register driver, error: %d\n", - error); - platform_set_drvdata(pdev, NULL); - input_free_polled_device(poll_dev); - kfree(jornadakbd); - return error; - -} - -static int __devexit jornada680kbd_remove(struct platform_device *pdev) -{ - struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); - - platform_set_drvdata(pdev, NULL); - input_unregister_polled_device(jornadakbd->poll_dev); - input_free_polled_device(jornadakbd->poll_dev); - kfree(jornadakbd); - - return 0; -} - -static struct platform_driver jornada680kbd_driver = { - .driver = { - .name = "jornada680_kbd", - .owner = THIS_MODULE, - }, - .probe = jornada680kbd_probe, - .remove = __devexit_p(jornada680kbd_remove), -}; -module_platform_driver(jornada680kbd_driver); - -MODULE_AUTHOR("Kristoffer Ericson <kristoffer.ericson@gmail.com>"); -MODULE_DESCRIPTION("HP Jornada 620/660/680/690 Keyboard Driver"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:jornada680_kbd"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/jornada720_kbd.c b/ANDROID_3.4.5/drivers/input/keyboard/jornada720_kbd.c deleted file mode 100644 index 9d639fa1..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/jornada720_kbd.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * drivers/input/keyboard/jornada720_kbd.c - * - * HP Jornada 720 keyboard platform driver - * - * Copyright (C) 2006/2007 Kristoffer Ericson <Kristoffer.Ericson@Gmail.com> - * - * Copyright (C) 2006 jornada 720 kbd driver by - Filip Zyzniewsk <Filip.Zyzniewski@tefnet.plX - * based on (C) 2004 jornada 720 kbd driver by - Alex Lange <chicken@handhelds.org> - * - * 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. - * - */ -#include <linux/device.h> -#include <linux/errno.h> -#include <linux/interrupt.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/slab.h> - -#include <mach/jornada720.h> -#include <mach/hardware.h> -#include <mach/irqs.h> - -MODULE_AUTHOR("Kristoffer Ericson <Kristoffer.Ericson@gmail.com>"); -MODULE_DESCRIPTION("HP Jornada 710/720/728 keyboard driver"); -MODULE_LICENSE("GPL v2"); - -static unsigned short jornada_std_keymap[128] = { /* ROW */ - 0, KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, /* #1 */ - KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE, /* -> */ - 0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, /* #2 */ - KEY_0, KEY_MINUS, KEY_EQUAL,0, 0, 0, /* -> */ - 0, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, /* #3 */ - KEY_P, KEY_BACKSLASH, KEY_BACKSPACE, 0, 0, 0, /* -> */ - 0, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, /* #4 */ - KEY_SEMICOLON, KEY_LEFTBRACE, KEY_RIGHTBRACE, 0, 0, 0, /* -> */ - 0, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, /* #5 */ - KEY_DOT, KEY_KPMINUS, KEY_APOSTROPHE, KEY_ENTER, 0, 0,0, /* -> */ - 0, KEY_TAB, 0, KEY_LEFTSHIFT, 0, KEY_APOSTROPHE, 0, 0, 0, 0, /* #6 */ - KEY_UP, 0, KEY_RIGHTSHIFT, 0, 0, 0,0, 0, 0, 0, 0, KEY_LEFTALT, KEY_GRAVE, /* -> */ - 0, 0, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0,0, KEY_KPASTERISK, /* -> */ - KEY_LEFTCTRL, 0, KEY_SPACE, 0, 0, 0, KEY_SLASH, KEY_DELETE, 0, 0, /* -> */ - 0, 0, 0, KEY_POWER, /* -> */ -}; - -struct jornadakbd { - unsigned short keymap[ARRAY_SIZE(jornada_std_keymap)]; - struct input_dev *input; -}; - -static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id) -{ - struct platform_device *pdev = dev_id; - struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); - struct input_dev *input = jornadakbd->input; - u8 count, kbd_data, scan_code; - - /* startup ssp with spinlock */ - jornada_ssp_start(); - - if (jornada_ssp_inout(GETSCANKEYCODE) != TXDUMMY) { - printk(KERN_DEBUG - "jornada720_kbd: " - "GetKeycode command failed with ETIMEDOUT, " - "flushed bus\n"); - } else { - /* How many keycodes are waiting for us? */ - count = jornada_ssp_byte(TXDUMMY); - - /* Lets drag them out one at a time */ - while (count--) { - /* Exchange TxDummy for location (keymap[kbddata]) */ - kbd_data = jornada_ssp_byte(TXDUMMY); - scan_code = kbd_data & 0x7f; - - input_event(input, EV_MSC, MSC_SCAN, scan_code); - input_report_key(input, jornadakbd->keymap[scan_code], - !(kbd_data & 0x80)); - input_sync(input); - } - } - - /* release spinlock and turn off ssp */ - jornada_ssp_end(); - - return IRQ_HANDLED; -}; - -static int __devinit jornada720_kbd_probe(struct platform_device *pdev) -{ - struct jornadakbd *jornadakbd; - struct input_dev *input_dev; - int i, err; - - jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!jornadakbd || !input_dev) { - err = -ENOMEM; - goto fail1; - } - - platform_set_drvdata(pdev, jornadakbd); - - memcpy(jornadakbd->keymap, jornada_std_keymap, - sizeof(jornada_std_keymap)); - jornadakbd->input = input_dev; - - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); - input_dev->name = "HP Jornada 720 keyboard"; - input_dev->phys = "jornadakbd/input0"; - input_dev->keycode = jornadakbd->keymap; - input_dev->keycodesize = sizeof(unsigned short); - input_dev->keycodemax = ARRAY_SIZE(jornada_std_keymap); - input_dev->id.bustype = BUS_HOST; - input_dev->dev.parent = &pdev->dev; - - for (i = 0; i < ARRAY_SIZE(jornadakbd->keymap); i++) - __set_bit(jornadakbd->keymap[i], input_dev->keybit); - __clear_bit(KEY_RESERVED, input_dev->keybit); - - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - - err = request_irq(IRQ_GPIO0, - jornada720_kbd_interrupt, - IRQF_TRIGGER_FALLING, - "jornadakbd", pdev); - if (err) { - printk(KERN_INFO "jornadakbd720_kbd: Unable to grab IRQ\n"); - goto fail1; - } - - err = input_register_device(jornadakbd->input); - if (err) - goto fail2; - - return 0; - - fail2: /* IRQ, DEVICE, MEMORY */ - free_irq(IRQ_GPIO0, pdev); - fail1: /* DEVICE, MEMORY */ - platform_set_drvdata(pdev, NULL); - input_free_device(input_dev); - kfree(jornadakbd); - return err; -}; - -static int __devexit jornada720_kbd_remove(struct platform_device *pdev) -{ - struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); - - free_irq(IRQ_GPIO0, pdev); - platform_set_drvdata(pdev, NULL); - input_unregister_device(jornadakbd->input); - kfree(jornadakbd); - - return 0; -} - -/* work with hotplug and coldplug */ -MODULE_ALIAS("platform:jornada720_kbd"); - -static struct platform_driver jornada720_kbd_driver = { - .driver = { - .name = "jornada720_kbd", - .owner = THIS_MODULE, - }, - .probe = jornada720_kbd_probe, - .remove = __devexit_p(jornada720_kbd_remove), -}; -module_platform_driver(jornada720_kbd_driver); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/lkkbd.c b/ANDROID_3.4.5/drivers/input/keyboard/lkkbd.c deleted file mode 100644 index fa9bb6d2..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/lkkbd.c +++ /dev/null @@ -1,749 +0,0 @@ -/* - * Copyright (C) 2004 by Jan-Benedict Glaw <jbglaw@lug-owl.de> - */ - -/* - * LK keyboard driver for Linux, based on sunkbd.c (C) by Vojtech Pavlik - */ - -/* - * DEC LK201 and LK401 keyboard driver for Linux (primary for DECstations - * and VAXstations, but can also be used on any standard RS232 with an - * adaptor). - * - * DISCLAIMER: This works for _me_. If you break anything by using the - * information given below, I will _not_ be liable! - * - * RJ10 pinout: To DE9: Or DB25: - * 1 - RxD <----> Pin 3 (TxD) <-> Pin 2 (TxD) - * 2 - GND <----> Pin 5 (GND) <-> Pin 7 (GND) - * 4 - TxD <----> Pin 2 (RxD) <-> Pin 3 (RxD) - * 3 - +12V (from HDD drive connector), DON'T connect to DE9 or DB25!!! - * - * Pin numbers for DE9 and DB25 are noted on the plug (quite small:). For - * RJ10, it's like this: - * - * __=__ Hold the plug in front of you, cable downwards, - * /___/| nose is hidden behind the plug. Now, pin 1 is at - * |1234|| the left side, pin 4 at the right and 2 and 3 are - * |IIII|| in between, of course:) - * | || - * |____|/ - * || So the adaptor consists of three connected cables - * || for data transmission (RxD and TxD) and signal ground. - * Additionally, you have to get +12V from somewhere. - * Most easily, you'll get that from a floppy or HDD power connector. - * It's the yellow cable there (black is ground and red is +5V). - * - * The keyboard and all the commands it understands are documented in - * "VCB02 Video Subsystem - Technical Manual", EK-104AA-TM-001. This - * document is LK201 specific, but LK401 is mostly compatible. It comes - * up in LK201 mode and doesn't report any of the additional keys it - * has. These need to be switched on with the LK_CMD_ENABLE_LK401 - * command. You'll find this document (scanned .pdf file) on MANX, - * a search engine specific to DEC documentation. Try - * http://www.vt100.net/manx/details?pn=EK-104AA-TM-001;id=21;cp=1 - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - */ - -#include <linux/delay.h> -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/interrupt.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/serio.h> -#include <linux/workqueue.h> - -#define DRIVER_DESC "LK keyboard driver" - -MODULE_AUTHOR("Jan-Benedict Glaw <jbglaw@lug-owl.de>"); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_LICENSE("GPL"); - -/* - * Known parameters: - * bell_volume - * keyclick_volume - * ctrlclick_volume - * - * Please notice that there's not yet an API to set these at runtime. - */ -static int bell_volume = 100; /* % */ -module_param(bell_volume, int, 0); -MODULE_PARM_DESC(bell_volume, "Bell volume (in %). default is 100%"); - -static int keyclick_volume = 100; /* % */ -module_param(keyclick_volume, int, 0); -MODULE_PARM_DESC(keyclick_volume, "Keyclick volume (in %), default is 100%"); - -static int ctrlclick_volume = 100; /* % */ -module_param(ctrlclick_volume, int, 0); -MODULE_PARM_DESC(ctrlclick_volume, "Ctrlclick volume (in %), default is 100%"); - -static int lk201_compose_is_alt; -module_param(lk201_compose_is_alt, int, 0); -MODULE_PARM_DESC(lk201_compose_is_alt, - "If set non-zero, LK201' Compose key will act as an Alt key"); - - - -#undef LKKBD_DEBUG -#ifdef LKKBD_DEBUG -#define DBG(x...) printk(x) -#else -#define DBG(x...) do {} while (0) -#endif - -/* LED control */ -#define LK_LED_WAIT 0x81 -#define LK_LED_COMPOSE 0x82 -#define LK_LED_SHIFTLOCK 0x84 -#define LK_LED_SCROLLLOCK 0x88 -#define LK_CMD_LED_ON 0x13 -#define LK_CMD_LED_OFF 0x11 - -/* Mode control */ -#define LK_MODE_DOWN 0x80 -#define LK_MODE_AUTODOWN 0x82 -#define LK_MODE_UPDOWN 0x86 -#define LK_CMD_SET_MODE(mode, div) ((mode) | ((div) << 3)) - -/* Misc commands */ -#define LK_CMD_ENABLE_KEYCLICK 0x1b -#define LK_CMD_DISABLE_KEYCLICK 0x99 -#define LK_CMD_DISABLE_BELL 0xa1 -#define LK_CMD_SOUND_BELL 0xa7 -#define LK_CMD_ENABLE_BELL 0x23 -#define LK_CMD_DISABLE_CTRCLICK 0xb9 -#define LK_CMD_ENABLE_CTRCLICK 0xbb -#define LK_CMD_SET_DEFAULTS 0xd3 -#define LK_CMD_POWERCYCLE_RESET 0xfd -#define LK_CMD_ENABLE_LK401 0xe9 -#define LK_CMD_REQUEST_ID 0xab - -/* Misc responses from keyboard */ -#define LK_STUCK_KEY 0x3d -#define LK_SELFTEST_FAILED 0x3e -#define LK_ALL_KEYS_UP 0xb3 -#define LK_METRONOME 0xb4 -#define LK_OUTPUT_ERROR 0xb5 -#define LK_INPUT_ERROR 0xb6 -#define LK_KBD_LOCKED 0xb7 -#define LK_KBD_TEST_MODE_ACK 0xb8 -#define LK_PREFIX_KEY_DOWN 0xb9 -#define LK_MODE_CHANGE_ACK 0xba -#define LK_RESPONSE_RESERVED 0xbb - -#define LK_NUM_KEYCODES 256 -#define LK_NUM_IGNORE_BYTES 6 - -static unsigned short lkkbd_keycode[LK_NUM_KEYCODES] = { - [0x56] = KEY_F1, - [0x57] = KEY_F2, - [0x58] = KEY_F3, - [0x59] = KEY_F4, - [0x5a] = KEY_F5, - [0x64] = KEY_F6, - [0x65] = KEY_F7, - [0x66] = KEY_F8, - [0x67] = KEY_F9, - [0x68] = KEY_F10, - [0x71] = KEY_F11, - [0x72] = KEY_F12, - [0x73] = KEY_F13, - [0x74] = KEY_F14, - [0x7c] = KEY_F15, - [0x7d] = KEY_F16, - [0x80] = KEY_F17, - [0x81] = KEY_F18, - [0x82] = KEY_F19, - [0x83] = KEY_F20, - [0x8a] = KEY_FIND, - [0x8b] = KEY_INSERT, - [0x8c] = KEY_DELETE, - [0x8d] = KEY_SELECT, - [0x8e] = KEY_PAGEUP, - [0x8f] = KEY_PAGEDOWN, - [0x92] = KEY_KP0, - [0x94] = KEY_KPDOT, - [0x95] = KEY_KPENTER, - [0x96] = KEY_KP1, - [0x97] = KEY_KP2, - [0x98] = KEY_KP3, - [0x99] = KEY_KP4, - [0x9a] = KEY_KP5, - [0x9b] = KEY_KP6, - [0x9c] = KEY_KPCOMMA, - [0x9d] = KEY_KP7, - [0x9e] = KEY_KP8, - [0x9f] = KEY_KP9, - [0xa0] = KEY_KPMINUS, - [0xa1] = KEY_PROG1, - [0xa2] = KEY_PROG2, - [0xa3] = KEY_PROG3, - [0xa4] = KEY_PROG4, - [0xa7] = KEY_LEFT, - [0xa8] = KEY_RIGHT, - [0xa9] = KEY_DOWN, - [0xaa] = KEY_UP, - [0xab] = KEY_RIGHTSHIFT, - [0xac] = KEY_LEFTALT, - [0xad] = KEY_COMPOSE, /* Right Compose, that is. */ - [0xae] = KEY_LEFTSHIFT, /* Same as KEY_RIGHTSHIFT on LK201 */ - [0xaf] = KEY_LEFTCTRL, - [0xb0] = KEY_CAPSLOCK, - [0xb1] = KEY_COMPOSE, /* Left Compose, that is. */ - [0xb2] = KEY_RIGHTALT, - [0xbc] = KEY_BACKSPACE, - [0xbd] = KEY_ENTER, - [0xbe] = KEY_TAB, - [0xbf] = KEY_ESC, - [0xc0] = KEY_1, - [0xc1] = KEY_Q, - [0xc2] = KEY_A, - [0xc3] = KEY_Z, - [0xc5] = KEY_2, - [0xc6] = KEY_W, - [0xc7] = KEY_S, - [0xc8] = KEY_X, - [0xc9] = KEY_102ND, - [0xcb] = KEY_3, - [0xcc] = KEY_E, - [0xcd] = KEY_D, - [0xce] = KEY_C, - [0xd0] = KEY_4, - [0xd1] = KEY_R, - [0xd2] = KEY_F, - [0xd3] = KEY_V, - [0xd4] = KEY_SPACE, - [0xd6] = KEY_5, - [0xd7] = KEY_T, - [0xd8] = KEY_G, - [0xd9] = KEY_B, - [0xdb] = KEY_6, - [0xdc] = KEY_Y, - [0xdd] = KEY_H, - [0xde] = KEY_N, - [0xe0] = KEY_7, - [0xe1] = KEY_U, - [0xe2] = KEY_J, - [0xe3] = KEY_M, - [0xe5] = KEY_8, - [0xe6] = KEY_I, - [0xe7] = KEY_K, - [0xe8] = KEY_COMMA, - [0xea] = KEY_9, - [0xeb] = KEY_O, - [0xec] = KEY_L, - [0xed] = KEY_DOT, - [0xef] = KEY_0, - [0xf0] = KEY_P, - [0xf2] = KEY_SEMICOLON, - [0xf3] = KEY_SLASH, - [0xf5] = KEY_EQUAL, - [0xf6] = KEY_RIGHTBRACE, - [0xf7] = KEY_BACKSLASH, - [0xf9] = KEY_MINUS, - [0xfa] = KEY_LEFTBRACE, - [0xfb] = KEY_APOSTROPHE, -}; - -#define CHECK_LED(LK, VAR_ON, VAR_OFF, LED, BITS) do { \ - if (test_bit(LED, (LK)->dev->led)) \ - VAR_ON |= BITS; \ - else \ - VAR_OFF |= BITS; \ - } while (0) - -/* - * Per-keyboard data - */ -struct lkkbd { - unsigned short keycode[LK_NUM_KEYCODES]; - int ignore_bytes; - unsigned char id[LK_NUM_IGNORE_BYTES]; - struct input_dev *dev; - struct serio *serio; - struct work_struct tq; - char name[64]; - char phys[32]; - char type; - int bell_volume; - int keyclick_volume; - int ctrlclick_volume; -}; - -#ifdef LKKBD_DEBUG -/* - * Responses from the keyboard and mapping back to their names. - */ -static struct { - unsigned char value; - unsigned char *name; -} lk_response[] = { -#define RESPONSE(x) { .value = (x), .name = #x, } - RESPONSE(LK_STUCK_KEY), - RESPONSE(LK_SELFTEST_FAILED), - RESPONSE(LK_ALL_KEYS_UP), - RESPONSE(LK_METRONOME), - RESPONSE(LK_OUTPUT_ERROR), - RESPONSE(LK_INPUT_ERROR), - RESPONSE(LK_KBD_LOCKED), - RESPONSE(LK_KBD_TEST_MODE_ACK), - RESPONSE(LK_PREFIX_KEY_DOWN), - RESPONSE(LK_MODE_CHANGE_ACK), - RESPONSE(LK_RESPONSE_RESERVED), -#undef RESPONSE -}; - -static unsigned char *response_name(unsigned char value) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(lk_response); i++) - if (lk_response[i].value == value) - return lk_response[i].name; - - return "<unknown>"; -} -#endif /* LKKBD_DEBUG */ - -/* - * Calculate volume parameter byte for a given volume. - */ -static unsigned char volume_to_hw(int volume_percent) -{ - unsigned char ret = 0; - - if (volume_percent < 0) - volume_percent = 0; - if (volume_percent > 100) - volume_percent = 100; - - if (volume_percent >= 0) - ret = 7; - if (volume_percent >= 13) /* 12.5 */ - ret = 6; - if (volume_percent >= 25) - ret = 5; - if (volume_percent >= 38) /* 37.5 */ - ret = 4; - if (volume_percent >= 50) - ret = 3; - if (volume_percent >= 63) /* 62.5 */ - ret = 2; /* This is the default volume */ - if (volume_percent >= 75) - ret = 1; - if (volume_percent >= 88) /* 87.5 */ - ret = 0; - - ret |= 0x80; - - return ret; -} - -static void lkkbd_detection_done(struct lkkbd *lk) -{ - int i; - - /* - * Reset setting for Compose key. Let Compose be KEY_COMPOSE. - */ - lk->keycode[0xb1] = KEY_COMPOSE; - - /* - * Print keyboard name and modify Compose=Alt on user's request. - */ - switch (lk->id[4]) { - case 1: - strlcpy(lk->name, "DEC LK201 keyboard", sizeof(lk->name)); - - if (lk201_compose_is_alt) - lk->keycode[0xb1] = KEY_LEFTALT; - break; - - case 2: - strlcpy(lk->name, "DEC LK401 keyboard", sizeof(lk->name)); - break; - - default: - strlcpy(lk->name, "Unknown DEC keyboard", sizeof(lk->name)); - printk(KERN_ERR - "lkkbd: keyboard on %s is unknown, please report to " - "Jan-Benedict Glaw <jbglaw@lug-owl.de>\n", lk->phys); - printk(KERN_ERR "lkkbd: keyboard ID'ed as:"); - for (i = 0; i < LK_NUM_IGNORE_BYTES; i++) - printk(" 0x%02x", lk->id[i]); - printk("\n"); - break; - } - - printk(KERN_INFO "lkkbd: keyboard on %s identified as: %s\n", - lk->phys, lk->name); - - /* - * Report errors during keyboard boot-up. - */ - switch (lk->id[2]) { - case 0x00: - /* All okay */ - break; - - case LK_STUCK_KEY: - printk(KERN_ERR "lkkbd: Stuck key on keyboard at %s\n", - lk->phys); - break; - - case LK_SELFTEST_FAILED: - printk(KERN_ERR - "lkkbd: Selftest failed on keyboard at %s, " - "keyboard may not work properly\n", lk->phys); - break; - - default: - printk(KERN_ERR - "lkkbd: Unknown error %02x on keyboard at %s\n", - lk->id[2], lk->phys); - break; - } - - /* - * Try to hint user if there's a stuck key. - */ - if (lk->id[2] == LK_STUCK_KEY && lk->id[3] != 0) - printk(KERN_ERR - "Scancode of stuck key is 0x%02x, keycode is 0x%04x\n", - lk->id[3], lk->keycode[lk->id[3]]); -} - -/* - * lkkbd_interrupt() is called by the low level driver when a character - * is received. - */ -static irqreturn_t lkkbd_interrupt(struct serio *serio, - unsigned char data, unsigned int flags) -{ - struct lkkbd *lk = serio_get_drvdata(serio); - struct input_dev *input_dev = lk->dev; - unsigned int keycode; - int i; - - DBG(KERN_INFO "Got byte 0x%02x\n", data); - - if (lk->ignore_bytes > 0) { - DBG(KERN_INFO "Ignoring a byte on %s\n", lk->name); - lk->id[LK_NUM_IGNORE_BYTES - lk->ignore_bytes--] = data; - - if (lk->ignore_bytes == 0) - lkkbd_detection_done(lk); - - return IRQ_HANDLED; - } - - switch (data) { - case LK_ALL_KEYS_UP: - for (i = 0; i < ARRAY_SIZE(lkkbd_keycode); i++) - input_report_key(input_dev, lk->keycode[i], 0); - input_sync(input_dev); - break; - - case 0x01: - DBG(KERN_INFO "Got 0x01, scheduling re-initialization\n"); - lk->ignore_bytes = LK_NUM_IGNORE_BYTES; - lk->id[LK_NUM_IGNORE_BYTES - lk->ignore_bytes--] = data; - schedule_work(&lk->tq); - break; - - case LK_METRONOME: - case LK_OUTPUT_ERROR: - case LK_INPUT_ERROR: - case LK_KBD_LOCKED: - case LK_KBD_TEST_MODE_ACK: - case LK_PREFIX_KEY_DOWN: - case LK_MODE_CHANGE_ACK: - case LK_RESPONSE_RESERVED: - DBG(KERN_INFO "Got %s and don't know how to handle...\n", - response_name(data)); - break; - - default: - keycode = lk->keycode[data]; - if (keycode != KEY_RESERVED) { - input_report_key(input_dev, keycode, - !test_bit(keycode, input_dev->key)); - input_sync(input_dev); - } else { - printk(KERN_WARNING - "%s: Unknown key with scancode 0x%02x on %s.\n", - __FILE__, data, lk->name); - } - } - - return IRQ_HANDLED; -} - -static void lkkbd_toggle_leds(struct lkkbd *lk) -{ - struct serio *serio = lk->serio; - unsigned char leds_on = 0; - unsigned char leds_off = 0; - - CHECK_LED(lk, leds_on, leds_off, LED_CAPSL, LK_LED_SHIFTLOCK); - CHECK_LED(lk, leds_on, leds_off, LED_COMPOSE, LK_LED_COMPOSE); - CHECK_LED(lk, leds_on, leds_off, LED_SCROLLL, LK_LED_SCROLLLOCK); - CHECK_LED(lk, leds_on, leds_off, LED_SLEEP, LK_LED_WAIT); - if (leds_on != 0) { - serio_write(serio, LK_CMD_LED_ON); - serio_write(serio, leds_on); - } - if (leds_off != 0) { - serio_write(serio, LK_CMD_LED_OFF); - serio_write(serio, leds_off); - } -} - -static void lkkbd_toggle_keyclick(struct lkkbd *lk, bool on) -{ - struct serio *serio = lk->serio; - - if (on) { - DBG("%s: Activating key clicks\n", __func__); - serio_write(serio, LK_CMD_ENABLE_KEYCLICK); - serio_write(serio, volume_to_hw(lk->keyclick_volume)); - serio_write(serio, LK_CMD_ENABLE_CTRCLICK); - serio_write(serio, volume_to_hw(lk->ctrlclick_volume)); - } else { - DBG("%s: Deactivating key clicks\n", __func__); - serio_write(serio, LK_CMD_DISABLE_KEYCLICK); - serio_write(serio, LK_CMD_DISABLE_CTRCLICK); - } - -} - -/* - * lkkbd_event() handles events from the input module. - */ -static int lkkbd_event(struct input_dev *dev, - unsigned int type, unsigned int code, int value) -{ - struct lkkbd *lk = input_get_drvdata(dev); - - switch (type) { - case EV_LED: - lkkbd_toggle_leds(lk); - return 0; - - case EV_SND: - switch (code) { - case SND_CLICK: - lkkbd_toggle_keyclick(lk, value); - return 0; - - case SND_BELL: - if (value != 0) - serio_write(lk->serio, LK_CMD_SOUND_BELL); - - return 0; - } - - break; - - default: - printk(KERN_ERR "%s(): Got unknown type %d, code %d, value %d\n", - __func__, type, code, value); - } - - return -1; -} - -/* - * lkkbd_reinit() sets leds and beeps to a state the computer remembers they - * were in. - */ -static void lkkbd_reinit(struct work_struct *work) -{ - struct lkkbd *lk = container_of(work, struct lkkbd, tq); - int division; - - /* Ask for ID */ - serio_write(lk->serio, LK_CMD_REQUEST_ID); - - /* Reset parameters */ - serio_write(lk->serio, LK_CMD_SET_DEFAULTS); - - /* Set LEDs */ - lkkbd_toggle_leds(lk); - - /* - * Try to activate extended LK401 mode. This command will - * only work with a LK401 keyboard and grants access to - * LAlt, RAlt, RCompose and RShift. - */ - serio_write(lk->serio, LK_CMD_ENABLE_LK401); - - /* Set all keys to UPDOWN mode */ - for (division = 1; division <= 14; division++) - serio_write(lk->serio, - LK_CMD_SET_MODE(LK_MODE_UPDOWN, division)); - - /* Enable bell and set volume */ - serio_write(lk->serio, LK_CMD_ENABLE_BELL); - serio_write(lk->serio, volume_to_hw(lk->bell_volume)); - - /* Enable/disable keyclick (and possibly set volume) */ - lkkbd_toggle_keyclick(lk, test_bit(SND_CLICK, lk->dev->snd)); - - /* Sound the bell if needed */ - if (test_bit(SND_BELL, lk->dev->snd)) - serio_write(lk->serio, LK_CMD_SOUND_BELL); -} - -/* - * lkkbd_connect() probes for a LK keyboard and fills the necessary structures. - */ -static int lkkbd_connect(struct serio *serio, struct serio_driver *drv) -{ - struct lkkbd *lk; - struct input_dev *input_dev; - int i; - int err; - - lk = kzalloc(sizeof(struct lkkbd), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!lk || !input_dev) { - err = -ENOMEM; - goto fail1; - } - - lk->serio = serio; - lk->dev = input_dev; - INIT_WORK(&lk->tq, lkkbd_reinit); - lk->bell_volume = bell_volume; - lk->keyclick_volume = keyclick_volume; - lk->ctrlclick_volume = ctrlclick_volume; - memcpy(lk->keycode, lkkbd_keycode, sizeof(lk->keycode)); - - strlcpy(lk->name, "DEC LK keyboard", sizeof(lk->name)); - snprintf(lk->phys, sizeof(lk->phys), "%s/input0", serio->phys); - - input_dev->name = lk->name; - input_dev->phys = lk->phys; - input_dev->id.bustype = BUS_RS232; - input_dev->id.vendor = SERIO_LKKBD; - input_dev->id.product = 0; - input_dev->id.version = 0x0100; - input_dev->dev.parent = &serio->dev; - input_dev->event = lkkbd_event; - - input_set_drvdata(input_dev, lk); - - __set_bit(EV_KEY, input_dev->evbit); - __set_bit(EV_LED, input_dev->evbit); - __set_bit(EV_SND, input_dev->evbit); - __set_bit(EV_REP, input_dev->evbit); - __set_bit(LED_CAPSL, input_dev->ledbit); - __set_bit(LED_SLEEP, input_dev->ledbit); - __set_bit(LED_COMPOSE, input_dev->ledbit); - __set_bit(LED_SCROLLL, input_dev->ledbit); - __set_bit(SND_BELL, input_dev->sndbit); - __set_bit(SND_CLICK, input_dev->sndbit); - - input_dev->keycode = lk->keycode; - input_dev->keycodesize = sizeof(lk->keycode[0]); - input_dev->keycodemax = ARRAY_SIZE(lk->keycode); - - for (i = 0; i < LK_NUM_KEYCODES; i++) - __set_bit(lk->keycode[i], input_dev->keybit); - __clear_bit(KEY_RESERVED, input_dev->keybit); - - serio_set_drvdata(serio, lk); - - err = serio_open(serio, drv); - if (err) - goto fail2; - - err = input_register_device(lk->dev); - if (err) - goto fail3; - - serio_write(lk->serio, LK_CMD_POWERCYCLE_RESET); - - return 0; - - fail3: serio_close(serio); - fail2: serio_set_drvdata(serio, NULL); - fail1: input_free_device(input_dev); - kfree(lk); - return err; -} - -/* - * lkkbd_disconnect() unregisters and closes behind us. - */ -static void lkkbd_disconnect(struct serio *serio) -{ - struct lkkbd *lk = serio_get_drvdata(serio); - - input_get_device(lk->dev); - input_unregister_device(lk->dev); - serio_close(serio); - serio_set_drvdata(serio, NULL); - input_put_device(lk->dev); - kfree(lk); -} - -static struct serio_device_id lkkbd_serio_ids[] = { - { - .type = SERIO_RS232, - .proto = SERIO_LKKBD, - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { 0 } -}; - -MODULE_DEVICE_TABLE(serio, lkkbd_serio_ids); - -static struct serio_driver lkkbd_drv = { - .driver = { - .name = "lkkbd", - }, - .description = DRIVER_DESC, - .id_table = lkkbd_serio_ids, - .connect = lkkbd_connect, - .disconnect = lkkbd_disconnect, - .interrupt = lkkbd_interrupt, -}; - -/* - * The functions for insering/removing us as a module. - */ -static int __init lkkbd_init(void) -{ - return serio_register_driver(&lkkbd_drv); -} - -static void __exit lkkbd_exit(void) -{ - serio_unregister_driver(&lkkbd_drv); -} - -module_init(lkkbd_init); -module_exit(lkkbd_exit); - diff --git a/ANDROID_3.4.5/drivers/input/keyboard/lm8323.c b/ANDROID_3.4.5/drivers/input/keyboard/lm8323.c deleted file mode 100644 index 39ac2787..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/lm8323.c +++ /dev/null @@ -1,861 +0,0 @@ -/* - * drivers/i2c/chips/lm8323.c - * - * Copyright (C) 2007-2009 Nokia Corporation - * - * Written by Daniel Stone <daniel.stone@nokia.com> - * Timo O. Karjalainen <timo.o.karjalainen@nokia.com> - * - * Updated by Felipe Balbi <felipe.balbi@nokia.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation (version 2 of the License only). - * - * 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 - */ - -#include <linux/module.h> -#include <linux/i2c.h> -#include <linux/interrupt.h> -#include <linux/sched.h> -#include <linux/mutex.h> -#include <linux/delay.h> -#include <linux/input.h> -#include <linux/leds.h> -#include <linux/pm.h> -#include <linux/i2c/lm8323.h> -#include <linux/slab.h> - -/* Commands to send to the chip. */ -#define LM8323_CMD_READ_ID 0x80 /* Read chip ID. */ -#define LM8323_CMD_WRITE_CFG 0x81 /* Set configuration item. */ -#define LM8323_CMD_READ_INT 0x82 /* Get interrupt status. */ -#define LM8323_CMD_RESET 0x83 /* Reset, same as external one */ -#define LM8323_CMD_WRITE_PORT_SEL 0x85 /* Set GPIO in/out. */ -#define LM8323_CMD_WRITE_PORT_STATE 0x86 /* Set GPIO pullup. */ -#define LM8323_CMD_READ_PORT_SEL 0x87 /* Get GPIO in/out. */ -#define LM8323_CMD_READ_PORT_STATE 0x88 /* Get GPIO pullup. */ -#define LM8323_CMD_READ_FIFO 0x89 /* Read byte from FIFO. */ -#define LM8323_CMD_RPT_READ_FIFO 0x8a /* Read FIFO (no increment). */ -#define LM8323_CMD_SET_ACTIVE 0x8b /* Set active time. */ -#define LM8323_CMD_READ_ERR 0x8c /* Get error status. */ -#define LM8323_CMD_READ_ROTATOR 0x8e /* Read rotator status. */ -#define LM8323_CMD_SET_DEBOUNCE 0x8f /* Set debouncing time. */ -#define LM8323_CMD_SET_KEY_SIZE 0x90 /* Set keypad size. */ -#define LM8323_CMD_READ_KEY_SIZE 0x91 /* Get keypad size. */ -#define LM8323_CMD_READ_CFG 0x92 /* Get configuration item. */ -#define LM8323_CMD_WRITE_CLOCK 0x93 /* Set clock config. */ -#define LM8323_CMD_READ_CLOCK 0x94 /* Get clock config. */ -#define LM8323_CMD_PWM_WRITE 0x95 /* Write PWM script. */ -#define LM8323_CMD_START_PWM 0x96 /* Start PWM engine. */ -#define LM8323_CMD_STOP_PWM 0x97 /* Stop PWM engine. */ - -/* Interrupt status. */ -#define INT_KEYPAD 0x01 /* Key event. */ -#define INT_ROTATOR 0x02 /* Rotator event. */ -#define INT_ERROR 0x08 /* Error: use CMD_READ_ERR. */ -#define INT_NOINIT 0x10 /* Lost configuration. */ -#define INT_PWM1 0x20 /* PWM1 stopped. */ -#define INT_PWM2 0x40 /* PWM2 stopped. */ -#define INT_PWM3 0x80 /* PWM3 stopped. */ - -/* Errors (signalled by INT_ERROR, read with CMD_READ_ERR). */ -#define ERR_BADPAR 0x01 /* Bad parameter. */ -#define ERR_CMDUNK 0x02 /* Unknown command. */ -#define ERR_KEYOVR 0x04 /* Too many keys pressed. */ -#define ERR_FIFOOVER 0x40 /* FIFO overflow. */ - -/* Configuration keys (CMD_{WRITE,READ}_CFG). */ -#define CFG_MUX1SEL 0x01 /* Select MUX1_OUT input. */ -#define CFG_MUX1EN 0x02 /* Enable MUX1_OUT. */ -#define CFG_MUX2SEL 0x04 /* Select MUX2_OUT input. */ -#define CFG_MUX2EN 0x08 /* Enable MUX2_OUT. */ -#define CFG_PSIZE 0x20 /* Package size (must be 0). */ -#define CFG_ROTEN 0x40 /* Enable rotator. */ - -/* Clock settings (CMD_{WRITE,READ}_CLOCK). */ -#define CLK_RCPWM_INTERNAL 0x00 -#define CLK_RCPWM_EXTERNAL 0x03 -#define CLK_SLOWCLKEN 0x08 /* Enable 32.768kHz clock. */ -#define CLK_SLOWCLKOUT 0x40 /* Enable slow pulse output. */ - -/* The possible addresses corresponding to CONFIG1 and CONFIG2 pin wirings. */ -#define LM8323_I2C_ADDR00 (0x84 >> 1) /* 1000 010x */ -#define LM8323_I2C_ADDR01 (0x86 >> 1) /* 1000 011x */ -#define LM8323_I2C_ADDR10 (0x88 >> 1) /* 1000 100x */ -#define LM8323_I2C_ADDR11 (0x8A >> 1) /* 1000 101x */ - -/* Key event fifo length */ -#define LM8323_FIFO_LEN 15 - -/* Commands for PWM engine; feed in with PWM_WRITE. */ -/* Load ramp counter from duty cycle field (range 0 - 0xff). */ -#define PWM_SET(v) (0x4000 | ((v) & 0xff)) -/* Go to start of script. */ -#define PWM_GOTOSTART 0x0000 -/* - * Stop engine (generates interrupt). If reset is 1, clear the program - * counter, else leave it. - */ -#define PWM_END(reset) (0xc000 | (!!(reset) << 11)) -/* - * Ramp. If s is 1, divide clock by 512, else divide clock by 16. - * Take t clock scales (up to 63) per step, for n steps (up to 126). - * If u is set, ramp up, else ramp down. - */ -#define PWM_RAMP(s, t, n, u) ((!!(s) << 14) | ((t) & 0x3f) << 8 | \ - ((n) & 0x7f) | ((u) ? 0 : 0x80)) -/* - * Loop (i.e. jump back to pos) for a given number of iterations (up to 63). - * If cnt is zero, execute until PWM_END is encountered. - */ -#define PWM_LOOP(cnt, pos) (0xa000 | (((cnt) & 0x3f) << 7) | \ - ((pos) & 0x3f)) -/* - * Wait for trigger. Argument is a mask of channels, shifted by the channel - * number, e.g. 0xa for channels 3 and 1. Note that channels are numbered - * from 1, not 0. - */ -#define PWM_WAIT_TRIG(chans) (0xe000 | (((chans) & 0x7) << 6)) -/* Send trigger. Argument is same as PWM_WAIT_TRIG. */ -#define PWM_SEND_TRIG(chans) (0xe000 | ((chans) & 0x7)) - -struct lm8323_pwm { - int id; - int fade_time; - int brightness; - int desired_brightness; - bool enabled; - bool running; - /* pwm lock */ - struct mutex lock; - struct work_struct work; - struct led_classdev cdev; - struct lm8323_chip *chip; -}; - -struct lm8323_chip { - /* device lock */ - struct mutex lock; - struct i2c_client *client; - struct input_dev *idev; - bool kp_enabled; - bool pm_suspend; - unsigned keys_down; - char phys[32]; - unsigned short keymap[LM8323_KEYMAP_SIZE]; - int size_x; - int size_y; - int debounce_time; - int active_time; - struct lm8323_pwm pwm[LM8323_NUM_PWMS]; -}; - -#define client_to_lm8323(c) container_of(c, struct lm8323_chip, client) -#define dev_to_lm8323(d) container_of(d, struct lm8323_chip, client->dev) -#define cdev_to_pwm(c) container_of(c, struct lm8323_pwm, cdev) -#define work_to_pwm(w) container_of(w, struct lm8323_pwm, work) - -#define LM8323_MAX_DATA 8 - -/* - * To write, we just access the chip's address in write mode, and dump the - * command and data out on the bus. The command byte and data are taken as - * sequential u8s out of varargs, to a maximum of LM8323_MAX_DATA. - */ -static int lm8323_write(struct lm8323_chip *lm, int len, ...) -{ - int ret, i; - va_list ap; - u8 data[LM8323_MAX_DATA]; - - va_start(ap, len); - - if (unlikely(len > LM8323_MAX_DATA)) { - dev_err(&lm->client->dev, "tried to send %d bytes\n", len); - va_end(ap); - return 0; - } - - for (i = 0; i < len; i++) - data[i] = va_arg(ap, int); - - va_end(ap); - - /* - * If the host is asleep while we send the data, we can get a NACK - * back while it wakes up, so try again, once. - */ - ret = i2c_master_send(lm->client, data, len); - if (unlikely(ret == -EREMOTEIO)) - ret = i2c_master_send(lm->client, data, len); - if (unlikely(ret != len)) - dev_err(&lm->client->dev, "sent %d bytes of %d total\n", - len, ret); - - return ret; -} - -/* - * To read, we first send the command byte to the chip and end the transaction, - * then access the chip in read mode, at which point it will send the data. - */ -static int lm8323_read(struct lm8323_chip *lm, u8 cmd, u8 *buf, int len) -{ - int ret; - - /* - * If the host is asleep while we send the byte, we can get a NACK - * back while it wakes up, so try again, once. - */ - ret = i2c_master_send(lm->client, &cmd, 1); - if (unlikely(ret == -EREMOTEIO)) - ret = i2c_master_send(lm->client, &cmd, 1); - if (unlikely(ret != 1)) { - dev_err(&lm->client->dev, "sending read cmd 0x%02x failed\n", - cmd); - return 0; - } - - ret = i2c_master_recv(lm->client, buf, len); - if (unlikely(ret != len)) - dev_err(&lm->client->dev, "wanted %d bytes, got %d\n", - len, ret); - - return ret; -} - -/* - * Set the chip active time (idle time before it enters halt). - */ -static void lm8323_set_active_time(struct lm8323_chip *lm, int time) -{ - lm8323_write(lm, 2, LM8323_CMD_SET_ACTIVE, time >> 2); -} - -/* - * The signals are AT-style: the low 7 bits are the keycode, and the top - * bit indicates the state (1 for down, 0 for up). - */ -static inline u8 lm8323_whichkey(u8 event) -{ - return event & 0x7f; -} - -static inline int lm8323_ispress(u8 event) -{ - return (event & 0x80) ? 1 : 0; -} - -static void process_keys(struct lm8323_chip *lm) -{ - u8 event; - u8 key_fifo[LM8323_FIFO_LEN + 1]; - int old_keys_down = lm->keys_down; - int ret; - int i = 0; - - /* - * Read all key events from the FIFO at once. Next READ_FIFO clears the - * FIFO even if we didn't read all events previously. - */ - ret = lm8323_read(lm, LM8323_CMD_READ_FIFO, key_fifo, LM8323_FIFO_LEN); - - if (ret < 0) { - dev_err(&lm->client->dev, "Failed reading fifo \n"); - return; - } - key_fifo[ret] = 0; - - while ((event = key_fifo[i++])) { - u8 key = lm8323_whichkey(event); - int isdown = lm8323_ispress(event); - unsigned short keycode = lm->keymap[key]; - - dev_vdbg(&lm->client->dev, "key 0x%02x %s\n", - key, isdown ? "down" : "up"); - - if (lm->kp_enabled) { - input_event(lm->idev, EV_MSC, MSC_SCAN, key); - input_report_key(lm->idev, keycode, isdown); - input_sync(lm->idev); - } - - if (isdown) - lm->keys_down++; - else - lm->keys_down--; - } - - /* - * Errata: We need to ensure that the chip never enters halt mode - * during a keypress, so set active time to 0. When it's released, - * we can enter halt again, so set the active time back to normal. - */ - if (!old_keys_down && lm->keys_down) - lm8323_set_active_time(lm, 0); - if (old_keys_down && !lm->keys_down) - lm8323_set_active_time(lm, lm->active_time); -} - -static void lm8323_process_error(struct lm8323_chip *lm) -{ - u8 error; - - if (lm8323_read(lm, LM8323_CMD_READ_ERR, &error, 1) == 1) { - if (error & ERR_FIFOOVER) - dev_vdbg(&lm->client->dev, "fifo overflow!\n"); - if (error & ERR_KEYOVR) - dev_vdbg(&lm->client->dev, - "more than two keys pressed\n"); - if (error & ERR_CMDUNK) - dev_vdbg(&lm->client->dev, - "unknown command submitted\n"); - if (error & ERR_BADPAR) - dev_vdbg(&lm->client->dev, "bad command parameter\n"); - } -} - -static void lm8323_reset(struct lm8323_chip *lm) -{ - /* The docs say we must pass 0xAA as the data byte. */ - lm8323_write(lm, 2, LM8323_CMD_RESET, 0xAA); -} - -static int lm8323_configure(struct lm8323_chip *lm) -{ - int keysize = (lm->size_x << 4) | lm->size_y; - int clock = (CLK_SLOWCLKEN | CLK_RCPWM_EXTERNAL); - int debounce = lm->debounce_time >> 2; - int active = lm->active_time >> 2; - - /* - * Active time must be greater than the debounce time: if it's - * a close-run thing, give ourselves a 12ms buffer. - */ - if (debounce >= active) - active = debounce + 3; - - lm8323_write(lm, 2, LM8323_CMD_WRITE_CFG, 0); - lm8323_write(lm, 2, LM8323_CMD_WRITE_CLOCK, clock); - lm8323_write(lm, 2, LM8323_CMD_SET_KEY_SIZE, keysize); - lm8323_set_active_time(lm, lm->active_time); - lm8323_write(lm, 2, LM8323_CMD_SET_DEBOUNCE, debounce); - lm8323_write(lm, 3, LM8323_CMD_WRITE_PORT_STATE, 0xff, 0xff); - lm8323_write(lm, 3, LM8323_CMD_WRITE_PORT_SEL, 0, 0); - - /* - * Not much we can do about errors at this point, so just hope - * for the best. - */ - - return 0; -} - -static void pwm_done(struct lm8323_pwm *pwm) -{ - mutex_lock(&pwm->lock); - pwm->running = false; - if (pwm->desired_brightness != pwm->brightness) - schedule_work(&pwm->work); - mutex_unlock(&pwm->lock); -} - -/* - * Bottom half: handle the interrupt by posting key events, or dealing with - * errors appropriately. - */ -static irqreturn_t lm8323_irq(int irq, void *_lm) -{ - struct lm8323_chip *lm = _lm; - u8 ints; - int i; - - mutex_lock(&lm->lock); - - while ((lm8323_read(lm, LM8323_CMD_READ_INT, &ints, 1) == 1) && ints) { - if (likely(ints & INT_KEYPAD)) - process_keys(lm); - if (ints & INT_ROTATOR) { - /* We don't currently support the rotator. */ - dev_vdbg(&lm->client->dev, "rotator fired\n"); - } - if (ints & INT_ERROR) { - dev_vdbg(&lm->client->dev, "error!\n"); - lm8323_process_error(lm); - } - if (ints & INT_NOINIT) { - dev_err(&lm->client->dev, "chip lost config; " - "reinitialising\n"); - lm8323_configure(lm); - } - for (i = 0; i < LM8323_NUM_PWMS; i++) { - if (ints & (1 << (INT_PWM1 + i))) { - dev_vdbg(&lm->client->dev, - "pwm%d engine completed\n", i); - pwm_done(&lm->pwm[i]); - } - } - } - - mutex_unlock(&lm->lock); - - return IRQ_HANDLED; -} - -/* - * Read the chip ID. - */ -static int lm8323_read_id(struct lm8323_chip *lm, u8 *buf) -{ - int bytes; - - bytes = lm8323_read(lm, LM8323_CMD_READ_ID, buf, 2); - if (unlikely(bytes != 2)) - return -EIO; - - return 0; -} - -static void lm8323_write_pwm_one(struct lm8323_pwm *pwm, int pos, u16 cmd) -{ - lm8323_write(pwm->chip, 4, LM8323_CMD_PWM_WRITE, (pos << 2) | pwm->id, - (cmd & 0xff00) >> 8, cmd & 0x00ff); -} - -/* - * Write a script into a given PWM engine, concluding with PWM_END. - * If 'kill' is nonzero, the engine will be shut down at the end - * of the script, producing a zero output. Otherwise the engine - * will be kept running at the final PWM level indefinitely. - */ -static void lm8323_write_pwm(struct lm8323_pwm *pwm, int kill, - int len, const u16 *cmds) -{ - int i; - - for (i = 0; i < len; i++) - lm8323_write_pwm_one(pwm, i, cmds[i]); - - lm8323_write_pwm_one(pwm, i++, PWM_END(kill)); - lm8323_write(pwm->chip, 2, LM8323_CMD_START_PWM, pwm->id); - pwm->running = true; -} - -static void lm8323_pwm_work(struct work_struct *work) -{ - struct lm8323_pwm *pwm = work_to_pwm(work); - int div512, perstep, steps, hz, up, kill; - u16 pwm_cmds[3]; - int num_cmds = 0; - - mutex_lock(&pwm->lock); - - /* - * Do nothing if we're already at the requested level, - * or previous setting is not yet complete. In the latter - * case we will be called again when the previous PWM script - * finishes. - */ - if (pwm->running || pwm->desired_brightness == pwm->brightness) - goto out; - - kill = (pwm->desired_brightness == 0); - up = (pwm->desired_brightness > pwm->brightness); - steps = abs(pwm->desired_brightness - pwm->brightness); - - /* - * Convert time (in ms) into a divisor (512 or 16 on a refclk of - * 32768Hz), and number of ticks per step. - */ - if ((pwm->fade_time / steps) > (32768 / 512)) { - div512 = 1; - hz = 32768 / 512; - } else { - div512 = 0; - hz = 32768 / 16; - } - - perstep = (hz * pwm->fade_time) / (steps * 1000); - - if (perstep == 0) - perstep = 1; - else if (perstep > 63) - perstep = 63; - - while (steps) { - int s; - - s = min(126, steps); - pwm_cmds[num_cmds++] = PWM_RAMP(div512, perstep, s, up); - steps -= s; - } - - lm8323_write_pwm(pwm, kill, num_cmds, pwm_cmds); - pwm->brightness = pwm->desired_brightness; - - out: - mutex_unlock(&pwm->lock); -} - -static void lm8323_pwm_set_brightness(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); - struct lm8323_chip *lm = pwm->chip; - - mutex_lock(&pwm->lock); - pwm->desired_brightness = brightness; - mutex_unlock(&pwm->lock); - - if (in_interrupt()) { - schedule_work(&pwm->work); - } else { - /* - * Schedule PWM work as usual unless we are going into suspend - */ - mutex_lock(&lm->lock); - if (likely(!lm->pm_suspend)) - schedule_work(&pwm->work); - else - lm8323_pwm_work(&pwm->work); - mutex_unlock(&lm->lock); - } -} - -static ssize_t lm8323_pwm_show_time(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); - - return sprintf(buf, "%d\n", pwm->fade_time); -} - -static ssize_t lm8323_pwm_store_time(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); - int ret, time; - - ret = kstrtoint(buf, 10, &time); - /* Numbers only, please. */ - if (ret) - return ret; - - pwm->fade_time = time; - - return strlen(buf); -} -static DEVICE_ATTR(time, 0644, lm8323_pwm_show_time, lm8323_pwm_store_time); - -static int init_pwm(struct lm8323_chip *lm, int id, struct device *dev, - const char *name) -{ - struct lm8323_pwm *pwm; - - BUG_ON(id > 3); - - pwm = &lm->pwm[id - 1]; - - pwm->id = id; - pwm->fade_time = 0; - pwm->brightness = 0; - pwm->desired_brightness = 0; - pwm->running = false; - pwm->enabled = false; - INIT_WORK(&pwm->work, lm8323_pwm_work); - mutex_init(&pwm->lock); - pwm->chip = lm; - - if (name) { - pwm->cdev.name = name; - pwm->cdev.brightness_set = lm8323_pwm_set_brightness; - if (led_classdev_register(dev, &pwm->cdev) < 0) { - dev_err(dev, "couldn't register PWM %d\n", id); - return -1; - } - if (device_create_file(pwm->cdev.dev, - &dev_attr_time) < 0) { - dev_err(dev, "couldn't register time attribute\n"); - led_classdev_unregister(&pwm->cdev); - return -1; - } - pwm->enabled = true; - } - - return 0; -} - -static struct i2c_driver lm8323_i2c_driver; - -static ssize_t lm8323_show_disable(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct lm8323_chip *lm = dev_get_drvdata(dev); - - return sprintf(buf, "%u\n", !lm->kp_enabled); -} - -static ssize_t lm8323_set_disable(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct lm8323_chip *lm = dev_get_drvdata(dev); - int ret; - unsigned int i; - - ret = kstrtouint(buf, 10, &i); - - mutex_lock(&lm->lock); - lm->kp_enabled = !i; - mutex_unlock(&lm->lock); - - return count; -} -static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable); - -static int __devinit lm8323_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct lm8323_platform_data *pdata = client->dev.platform_data; - struct input_dev *idev; - struct lm8323_chip *lm; - int pwm; - int i, err; - unsigned long tmo; - u8 data[2]; - - if (!pdata || !pdata->size_x || !pdata->size_y) { - dev_err(&client->dev, "missing platform_data\n"); - return -EINVAL; - } - - if (pdata->size_x > 8) { - dev_err(&client->dev, "invalid x size %d specified\n", - pdata->size_x); - return -EINVAL; - } - - if (pdata->size_y > 12) { - dev_err(&client->dev, "invalid y size %d specified\n", - pdata->size_y); - return -EINVAL; - } - - lm = kzalloc(sizeof *lm, GFP_KERNEL); - idev = input_allocate_device(); - if (!lm || !idev) { - err = -ENOMEM; - goto fail1; - } - - lm->client = client; - lm->idev = idev; - mutex_init(&lm->lock); - - lm->size_x = pdata->size_x; - lm->size_y = pdata->size_y; - dev_vdbg(&client->dev, "Keypad size: %d x %d\n", - lm->size_x, lm->size_y); - - lm->debounce_time = pdata->debounce_time; - lm->active_time = pdata->active_time; - - lm8323_reset(lm); - - /* Nothing's set up to service the IRQ yet, so just spin for max. - * 100ms until we can configure. */ - tmo = jiffies + msecs_to_jiffies(100); - while (lm8323_read(lm, LM8323_CMD_READ_INT, data, 1) == 1) { - if (data[0] & INT_NOINIT) - break; - - if (time_after(jiffies, tmo)) { - dev_err(&client->dev, - "timeout waiting for initialisation\n"); - break; - } - - msleep(1); - } - - lm8323_configure(lm); - - /* If a true probe check the device */ - if (lm8323_read_id(lm, data) != 0) { - dev_err(&client->dev, "device not found\n"); - err = -ENODEV; - goto fail1; - } - - for (pwm = 0; pwm < LM8323_NUM_PWMS; pwm++) { - err = init_pwm(lm, pwm + 1, &client->dev, - pdata->pwm_names[pwm]); - if (err < 0) - goto fail2; - } - - lm->kp_enabled = true; - err = device_create_file(&client->dev, &dev_attr_disable_kp); - if (err < 0) - goto fail2; - - idev->name = pdata->name ? : "LM8323 keypad"; - snprintf(lm->phys, sizeof(lm->phys), - "%s/input-kp", dev_name(&client->dev)); - idev->phys = lm->phys; - - idev->evbit[0] = BIT(EV_KEY) | BIT(EV_MSC); - __set_bit(MSC_SCAN, idev->mscbit); - for (i = 0; i < LM8323_KEYMAP_SIZE; i++) { - __set_bit(pdata->keymap[i], idev->keybit); - lm->keymap[i] = pdata->keymap[i]; - } - __clear_bit(KEY_RESERVED, idev->keybit); - - if (pdata->repeat) - __set_bit(EV_REP, idev->evbit); - - err = input_register_device(idev); - if (err) { - dev_dbg(&client->dev, "error registering input device\n"); - goto fail3; - } - - err = request_threaded_irq(client->irq, NULL, lm8323_irq, - IRQF_TRIGGER_LOW|IRQF_ONESHOT, "lm8323", lm); - if (err) { - dev_err(&client->dev, "could not get IRQ %d\n", client->irq); - goto fail4; - } - - i2c_set_clientdata(client, lm); - - device_init_wakeup(&client->dev, 1); - enable_irq_wake(client->irq); - - return 0; - -fail4: - input_unregister_device(idev); - idev = NULL; -fail3: - device_remove_file(&client->dev, &dev_attr_disable_kp); -fail2: - while (--pwm >= 0) - if (lm->pwm[pwm].enabled) { - device_remove_file(lm->pwm[pwm].cdev.dev, - &dev_attr_time); - led_classdev_unregister(&lm->pwm[pwm].cdev); - } -fail1: - input_free_device(idev); - kfree(lm); - return err; -} - -static int __devexit lm8323_remove(struct i2c_client *client) -{ - struct lm8323_chip *lm = i2c_get_clientdata(client); - int i; - - disable_irq_wake(client->irq); - free_irq(client->irq, lm); - - input_unregister_device(lm->idev); - - device_remove_file(&lm->client->dev, &dev_attr_disable_kp); - - for (i = 0; i < 3; i++) - if (lm->pwm[i].enabled) { - device_remove_file(lm->pwm[i].cdev.dev, &dev_attr_time); - led_classdev_unregister(&lm->pwm[i].cdev); - } - - kfree(lm); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -/* - * We don't need to explicitly suspend the chip, as it already switches off - * when there's no activity. - */ -static int lm8323_suspend(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lm8323_chip *lm = i2c_get_clientdata(client); - int i; - - irq_set_irq_wake(client->irq, 0); - disable_irq(client->irq); - - mutex_lock(&lm->lock); - lm->pm_suspend = true; - mutex_unlock(&lm->lock); - - for (i = 0; i < 3; i++) - if (lm->pwm[i].enabled) - led_classdev_suspend(&lm->pwm[i].cdev); - - return 0; -} - -static int lm8323_resume(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lm8323_chip *lm = i2c_get_clientdata(client); - int i; - - mutex_lock(&lm->lock); - lm->pm_suspend = false; - mutex_unlock(&lm->lock); - - for (i = 0; i < 3; i++) - if (lm->pwm[i].enabled) - led_classdev_resume(&lm->pwm[i].cdev); - - enable_irq(client->irq); - irq_set_irq_wake(client->irq, 1); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(lm8323_pm_ops, lm8323_suspend, lm8323_resume); - -static const struct i2c_device_id lm8323_id[] = { - { "lm8323", 0 }, - { } -}; - -static struct i2c_driver lm8323_i2c_driver = { - .driver = { - .name = "lm8323", - .pm = &lm8323_pm_ops, - }, - .probe = lm8323_probe, - .remove = __devexit_p(lm8323_remove), - .id_table = lm8323_id, -}; -MODULE_DEVICE_TABLE(i2c, lm8323_id); - -module_i2c_driver(lm8323_i2c_driver); - -MODULE_AUTHOR("Timo O. Karjalainen <timo.o.karjalainen@nokia.com>"); -MODULE_AUTHOR("Daniel Stone"); -MODULE_AUTHOR("Felipe Balbi <felipe.balbi@nokia.com>"); -MODULE_DESCRIPTION("LM8323 keypad driver"); -MODULE_LICENSE("GPL"); - diff --git a/ANDROID_3.4.5/drivers/input/keyboard/locomokbd.c b/ANDROID_3.4.5/drivers/input/keyboard/locomokbd.c deleted file mode 100644 index b1ab2986..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/locomokbd.c +++ /dev/null @@ -1,362 +0,0 @@ -/* - * LoCoMo keyboard driver for Linux-based ARM PDAs: - * - SHARP Zaurus Collie (SL-5500) - * - SHARP Zaurus Poodle (SL-5600) - * - * Copyright (c) 2005 John Lenz - * Based on from xtkbd.c - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * - */ - -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/delay.h> -#include <linux/device.h> -#include <linux/interrupt.h> -#include <linux/ioport.h> - -#include <asm/hardware/locomo.h> -#include <asm/irq.h> - -MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>"); -MODULE_DESCRIPTION("LoCoMo keyboard driver"); -MODULE_LICENSE("GPL"); - -#define LOCOMOKBD_NUMKEYS 128 - -#define KEY_ACTIVITY KEY_F16 -#define KEY_CONTACT KEY_F18 -#define KEY_CENTER KEY_F15 - -static const unsigned char -locomokbd_keycode[LOCOMOKBD_NUMKEYS] __devinitconst = { - 0, KEY_ESC, KEY_ACTIVITY, 0, 0, 0, 0, 0, 0, 0, /* 0 - 9 */ - 0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_HOME, KEY_CONTACT, /* 10 - 19 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 - 29 */ - 0, 0, 0, KEY_CENTER, 0, KEY_MAIL, 0, 0, 0, 0, /* 30 - 39 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_RIGHT, /* 40 - 49 */ - KEY_UP, KEY_LEFT, 0, 0, KEY_P, 0, KEY_O, KEY_I, KEY_Y, KEY_T, /* 50 - 59 */ - KEY_E, KEY_W, 0, 0, 0, 0, KEY_DOWN, KEY_ENTER, 0, 0, /* 60 - 69 */ - KEY_BACKSPACE, 0, KEY_L, KEY_U, KEY_H, KEY_R, KEY_D, KEY_Q, 0, 0, /* 70 - 79 */ - 0, 0, 0, 0, 0, 0, KEY_ENTER, KEY_RIGHTSHIFT, KEY_K, KEY_J, /* 80 - 89 */ - KEY_G, KEY_F, KEY_X, KEY_S, 0, 0, 0, 0, 0, 0, /* 90 - 99 */ - 0, 0, KEY_DOT, 0, KEY_COMMA, KEY_N, KEY_B, KEY_C, KEY_Z, KEY_A, /* 100 - 109 */ - KEY_LEFTSHIFT, KEY_TAB, KEY_LEFTCTRL, 0, 0, 0, 0, 0, 0, 0, /* 110 - 119 */ - KEY_M, KEY_SPACE, KEY_V, KEY_APOSTROPHE, KEY_SLASH, 0, 0, 0 /* 120 - 128 */ -}; - -#define KB_ROWS 16 -#define KB_COLS 8 -#define KB_ROWMASK(r) (1 << (r)) -#define SCANCODE(c,r) ( ((c)<<4) + (r) + 1 ) - -#define KB_DELAY 8 -#define SCAN_INTERVAL (HZ/10) - -struct locomokbd { - unsigned char keycode[LOCOMOKBD_NUMKEYS]; - struct input_dev *input; - char phys[32]; - - unsigned long base; - spinlock_t lock; - - struct timer_list timer; - unsigned long suspend_jiffies; - unsigned int count_cancel; -}; - -/* helper functions for reading the keyboard matrix */ -static inline void locomokbd_charge_all(unsigned long membase) -{ - locomo_writel(0x00FF, membase + LOCOMO_KSC); -} - -static inline void locomokbd_activate_all(unsigned long membase) -{ - unsigned long r; - - locomo_writel(0, membase + LOCOMO_KSC); - r = locomo_readl(membase + LOCOMO_KIC); - r &= 0xFEFF; - locomo_writel(r, membase + LOCOMO_KIC); -} - -static inline void locomokbd_activate_col(unsigned long membase, int col) -{ - unsigned short nset; - unsigned short nbset; - - nset = 0xFF & ~(1 << col); - nbset = (nset << 8) + nset; - locomo_writel(nbset, membase + LOCOMO_KSC); -} - -static inline void locomokbd_reset_col(unsigned long membase, int col) -{ - unsigned short nbset; - - nbset = ((0xFF & ~(1 << col)) << 8) + 0xFF; - locomo_writel(nbset, membase + LOCOMO_KSC); -} - -/* - * The LoCoMo keyboard only generates interrupts when a key is pressed. - * So when a key is pressed, we enable a timer. This timer scans the - * keyboard, and this is how we detect when the key is released. - */ - -/* Scan the hardware keyboard and push any changes up through the input layer */ -static void locomokbd_scankeyboard(struct locomokbd *locomokbd) -{ - unsigned int row, col, rowd; - unsigned long flags; - unsigned int num_pressed; - unsigned long membase = locomokbd->base; - - spin_lock_irqsave(&locomokbd->lock, flags); - - locomokbd_charge_all(membase); - - num_pressed = 0; - for (col = 0; col < KB_COLS; col++) { - - locomokbd_activate_col(membase, col); - udelay(KB_DELAY); - - rowd = ~locomo_readl(membase + LOCOMO_KIB); - for (row = 0; row < KB_ROWS; row++) { - unsigned int scancode, pressed, key; - - scancode = SCANCODE(col, row); - pressed = rowd & KB_ROWMASK(row); - key = locomokbd->keycode[scancode]; - - input_report_key(locomokbd->input, key, pressed); - if (likely(!pressed)) - continue; - - num_pressed++; - - /* The "Cancel/ESC" key is labeled "On/Off" on - * Collie and Poodle and should suspend the device - * if it was pressed for more than a second. */ - if (unlikely(key == KEY_ESC)) { - if (!time_after(jiffies, - locomokbd->suspend_jiffies + HZ)) - continue; - if (locomokbd->count_cancel++ - != (HZ/SCAN_INTERVAL + 1)) - continue; - input_event(locomokbd->input, EV_PWR, - KEY_SUSPEND, 1); - locomokbd->suspend_jiffies = jiffies; - } else - locomokbd->count_cancel = 0; - } - locomokbd_reset_col(membase, col); - } - locomokbd_activate_all(membase); - - input_sync(locomokbd->input); - - /* if any keys are pressed, enable the timer */ - if (num_pressed) - mod_timer(&locomokbd->timer, jiffies + SCAN_INTERVAL); - else - locomokbd->count_cancel = 0; - - spin_unlock_irqrestore(&locomokbd->lock, flags); -} - -/* - * LoCoMo keyboard interrupt handler. - */ -static irqreturn_t locomokbd_interrupt(int irq, void *dev_id) -{ - struct locomokbd *locomokbd = dev_id; - u16 r; - - r = locomo_readl(locomokbd->base + LOCOMO_KIC); - if ((r & 0x0001) == 0) - return IRQ_HANDLED; - - locomo_writel(r & ~0x0100, locomokbd->base + LOCOMO_KIC); /* Ack */ - - /** wait chattering delay **/ - udelay(100); - - locomokbd_scankeyboard(locomokbd); - return IRQ_HANDLED; -} - -/* - * LoCoMo timer checking for released keys - */ -static void locomokbd_timer_callback(unsigned long data) -{ - struct locomokbd *locomokbd = (struct locomokbd *) data; - - locomokbd_scankeyboard(locomokbd); -} - -static int locomokbd_open(struct input_dev *dev) -{ - struct locomokbd *locomokbd = input_get_drvdata(dev); - u16 r; - - r = locomo_readl(locomokbd->base + LOCOMO_KIC) | 0x0010; - locomo_writel(r, locomokbd->base + LOCOMO_KIC); - return 0; -} - -static void locomokbd_close(struct input_dev *dev) -{ - struct locomokbd *locomokbd = input_get_drvdata(dev); - u16 r; - - r = locomo_readl(locomokbd->base + LOCOMO_KIC) & ~0x0010; - locomo_writel(r, locomokbd->base + LOCOMO_KIC); -} - -static int __devinit locomokbd_probe(struct locomo_dev *dev) -{ - struct locomokbd *locomokbd; - struct input_dev *input_dev; - int i, err; - - locomokbd = kzalloc(sizeof(struct locomokbd), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!locomokbd || !input_dev) { - err = -ENOMEM; - goto err_free_mem; - } - - /* try and claim memory region */ - if (!request_mem_region((unsigned long) dev->mapbase, - dev->length, - LOCOMO_DRIVER_NAME(dev))) { - err = -EBUSY; - printk(KERN_ERR "locomokbd: Can't acquire access to io memory for keyboard\n"); - goto err_free_mem; - } - - locomo_set_drvdata(dev, locomokbd); - - locomokbd->base = (unsigned long) dev->mapbase; - - spin_lock_init(&locomokbd->lock); - - init_timer(&locomokbd->timer); - locomokbd->timer.function = locomokbd_timer_callback; - locomokbd->timer.data = (unsigned long) locomokbd; - - locomokbd->suspend_jiffies = jiffies; - - locomokbd->input = input_dev; - strcpy(locomokbd->phys, "locomokbd/input0"); - - input_dev->name = "LoCoMo keyboard"; - input_dev->phys = locomokbd->phys; - input_dev->id.bustype = BUS_HOST; - input_dev->id.vendor = 0x0001; - input_dev->id.product = 0x0001; - input_dev->id.version = 0x0100; - input_dev->open = locomokbd_open; - input_dev->close = locomokbd_close; - input_dev->dev.parent = &dev->dev; - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | - BIT_MASK(EV_PWR); - input_dev->keycode = locomokbd->keycode; - input_dev->keycodesize = sizeof(locomokbd_keycode[0]); - input_dev->keycodemax = ARRAY_SIZE(locomokbd_keycode); - - input_set_drvdata(input_dev, locomokbd); - - memcpy(locomokbd->keycode, locomokbd_keycode, sizeof(locomokbd->keycode)); - for (i = 0; i < LOCOMOKBD_NUMKEYS; i++) - set_bit(locomokbd->keycode[i], input_dev->keybit); - clear_bit(0, input_dev->keybit); - - /* attempt to get the interrupt */ - err = request_irq(dev->irq[0], locomokbd_interrupt, 0, "locomokbd", locomokbd); - if (err) { - printk(KERN_ERR "locomokbd: Can't get irq for keyboard\n"); - goto err_release_region; - } - - err = input_register_device(locomokbd->input); - if (err) - goto err_free_irq; - - return 0; - - err_free_irq: - free_irq(dev->irq[0], locomokbd); - err_release_region: - release_mem_region((unsigned long) dev->mapbase, dev->length); - locomo_set_drvdata(dev, NULL); - err_free_mem: - input_free_device(input_dev); - kfree(locomokbd); - - return err; -} - -static int __devexit locomokbd_remove(struct locomo_dev *dev) -{ - struct locomokbd *locomokbd = locomo_get_drvdata(dev); - - free_irq(dev->irq[0], locomokbd); - - del_timer_sync(&locomokbd->timer); - - input_unregister_device(locomokbd->input); - locomo_set_drvdata(dev, NULL); - - release_mem_region((unsigned long) dev->mapbase, dev->length); - - kfree(locomokbd); - - return 0; -} - -static struct locomo_driver keyboard_driver = { - .drv = { - .name = "locomokbd" - }, - .devid = LOCOMO_DEVID_KEYBOARD, - .probe = locomokbd_probe, - .remove = __devexit_p(locomokbd_remove), -}; - -static int __init locomokbd_init(void) -{ - return locomo_driver_register(&keyboard_driver); -} - -static void __exit locomokbd_exit(void) -{ - locomo_driver_unregister(&keyboard_driver); -} - -module_init(locomokbd_init); -module_exit(locomokbd_exit); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/maple_keyb.c b/ANDROID_3.4.5/drivers/input/keyboard/maple_keyb.c deleted file mode 100644 index 5aa2361a..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/maple_keyb.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - * SEGA Dreamcast keyboard driver - * Based on drivers/usb/usbkbd.c - * Copyright (c) YAEGASHI Takeshi, 2001 - * Porting to 2.6 Copyright (c) Adrian McMenamin, 2007 - 2009 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/kernel.h> -#include <linux/slab.h> -#include <linux/input.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/timer.h> -#include <linux/maple.h> - -/* Very simple mutex to ensure proper cleanup */ -static DEFINE_MUTEX(maple_keyb_mutex); - -#define NR_SCANCODES 256 - -MODULE_AUTHOR("Adrian McMenamin <adrian@mcmen.demon.co.uk"); -MODULE_DESCRIPTION("SEGA Dreamcast keyboard driver"); -MODULE_LICENSE("GPL"); - -struct dc_kbd { - struct input_dev *dev; - unsigned short keycode[NR_SCANCODES]; - unsigned char new[8]; - unsigned char old[8]; -}; - -static const unsigned short dc_kbd_keycode[NR_SCANCODES] = { - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_A, KEY_B, - KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, - KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, - KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, - KEY_7, KEY_8, KEY_9, KEY_0, KEY_ENTER, KEY_ESC, KEY_BACKSPACE, - KEY_TAB, KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_LEFTBRACE, - KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_BACKSLASH, KEY_SEMICOLON, - KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, KEY_DOT, KEY_SLASH, - KEY_CAPSLOCK, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, - KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_SYSRQ, - KEY_SCROLLLOCK, KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP, - KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_RIGHT, KEY_LEFT, KEY_DOWN, - KEY_UP, KEY_NUMLOCK, KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS, - KEY_KPPLUS, KEY_KPENTER, KEY_KP1, KEY_KP2, KEY_KP3, KEY_KP4, KEY_KP5, - KEY_KP6, KEY_KP7, KEY_KP8, KEY_KP9, KEY_KP0, KEY_KPDOT, KEY_102ND, - KEY_COMPOSE, KEY_POWER, KEY_KPEQUAL, KEY_F13, KEY_F14, KEY_F15, - KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20, KEY_F21, KEY_F22, - KEY_F23, KEY_F24, KEY_OPEN, KEY_HELP, KEY_PROPS, KEY_FRONT, KEY_STOP, - KEY_AGAIN, KEY_UNDO, KEY_CUT, KEY_COPY, KEY_PASTE, KEY_FIND, KEY_MUTE, - KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_KPCOMMA, KEY_RESERVED, KEY_RO, KEY_KATAKANAHIRAGANA , KEY_YEN, - KEY_HENKAN, KEY_MUHENKAN, KEY_KPJPCOMMA, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_HANGEUL, KEY_HANJA, KEY_KATAKANA, KEY_HIRAGANA, - KEY_ZENKAKUHANKAKU, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - KEY_RESERVED, KEY_RESERVED, KEY_LEFTCTRL, KEY_LEFTSHIFT, KEY_LEFTALT, - KEY_LEFTMETA, KEY_RIGHTCTRL, KEY_RIGHTSHIFT, KEY_RIGHTALT, - KEY_RIGHTMETA, KEY_PLAYPAUSE, KEY_STOPCD, KEY_PREVIOUSSONG, - KEY_NEXTSONG, KEY_EJECTCD, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE, - KEY_WWW, KEY_BACK, KEY_FORWARD, KEY_STOP, KEY_FIND, KEY_SCROLLUP, - KEY_SCROLLDOWN, KEY_EDIT, KEY_SLEEP, KEY_SCREENLOCK, KEY_REFRESH, - KEY_CALC, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED -}; - -static void dc_scan_kbd(struct dc_kbd *kbd) -{ - struct input_dev *dev = kbd->dev; - void *ptr; - int code, keycode; - int i; - - for (i = 0; i < 8; i++) { - code = i + 224; - keycode = kbd->keycode[code]; - input_event(dev, EV_MSC, MSC_SCAN, code); - input_report_key(dev, keycode, (kbd->new[0] >> i) & 1); - } - - for (i = 2; i < 8; i++) { - ptr = memchr(kbd->new + 2, kbd->old[i], 6); - code = kbd->old[i]; - if (code > 3 && ptr == NULL) { - keycode = kbd->keycode[code]; - if (keycode) { - input_event(dev, EV_MSC, MSC_SCAN, code); - input_report_key(dev, keycode, 0); - } else - dev_dbg(&dev->dev, - "Unknown key (scancode %#x) released.", - code); - } - ptr = memchr(kbd->old + 2, kbd->new[i], 6); - code = kbd->new[i]; - if (code > 3 && ptr) { - keycode = kbd->keycode[code]; - if (keycode) { - input_event(dev, EV_MSC, MSC_SCAN, code); - input_report_key(dev, keycode, 1); - } else - dev_dbg(&dev->dev, - "Unknown key (scancode %#x) pressed.", - code); - } - } - input_sync(dev); - memcpy(kbd->old, kbd->new, 8); -} - -static void dc_kbd_callback(struct mapleq *mq) -{ - struct maple_device *mapledev = mq->dev; - struct dc_kbd *kbd = maple_get_drvdata(mapledev); - unsigned long *buf = (unsigned long *)(mq->recvbuf->buf); - - /* - * We should always get the lock because the only - * time it may be locked is if the driver is in the cleanup phase. - */ - if (likely(mutex_trylock(&maple_keyb_mutex))) { - - if (buf[1] == mapledev->function) { - memcpy(kbd->new, buf + 2, 8); - dc_scan_kbd(kbd); - } - - mutex_unlock(&maple_keyb_mutex); - } -} - -static int probe_maple_kbd(struct device *dev) -{ - struct maple_device *mdev; - struct maple_driver *mdrv; - int i, error; - struct dc_kbd *kbd; - struct input_dev *idev; - - mdev = to_maple_dev(dev); - mdrv = to_maple_driver(dev->driver); - - kbd = kzalloc(sizeof(struct dc_kbd), GFP_KERNEL); - if (!kbd) { - error = -ENOMEM; - goto fail; - } - - idev = input_allocate_device(); - if (!idev) { - error = -ENOMEM; - goto fail_idev_alloc; - } - - kbd->dev = idev; - memcpy(kbd->keycode, dc_kbd_keycode, sizeof(kbd->keycode)); - - idev->name = mdev->product_name; - idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); - idev->keycode = kbd->keycode; - idev->keycodesize = sizeof(unsigned short); - idev->keycodemax = ARRAY_SIZE(kbd->keycode); - idev->id.bustype = BUS_HOST; - idev->dev.parent = &mdev->dev; - - for (i = 0; i < NR_SCANCODES; i++) - __set_bit(dc_kbd_keycode[i], idev->keybit); - __clear_bit(KEY_RESERVED, idev->keybit); - - input_set_capability(idev, EV_MSC, MSC_SCAN); - input_set_drvdata(idev, kbd); - - error = input_register_device(idev); - if (error) - goto fail_register; - - /* Maple polling is locked to VBLANK - which may be just 50/s */ - maple_getcond_callback(mdev, dc_kbd_callback, HZ/50, - MAPLE_FUNC_KEYBOARD); - - mdev->driver = mdrv; - - maple_set_drvdata(mdev, kbd); - - return error; - -fail_register: - maple_set_drvdata(mdev, NULL); - input_free_device(idev); -fail_idev_alloc: - kfree(kbd); -fail: - return error; -} - -static int remove_maple_kbd(struct device *dev) -{ - struct maple_device *mdev = to_maple_dev(dev); - struct dc_kbd *kbd = maple_get_drvdata(mdev); - - mutex_lock(&maple_keyb_mutex); - - input_unregister_device(kbd->dev); - kfree(kbd); - - maple_set_drvdata(mdev, NULL); - - mutex_unlock(&maple_keyb_mutex); - return 0; -} - -static struct maple_driver dc_kbd_driver = { - .function = MAPLE_FUNC_KEYBOARD, - .drv = { - .name = "Dreamcast_keyboard", - .probe = probe_maple_kbd, - .remove = remove_maple_kbd, - }, -}; - -static int __init dc_kbd_init(void) -{ - return maple_driver_register(&dc_kbd_driver); -} - -static void __exit dc_kbd_exit(void) -{ - maple_driver_unregister(&dc_kbd_driver); -} - -module_init(dc_kbd_init); -module_exit(dc_kbd_exit); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/matrix_keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/matrix_keypad.c deleted file mode 100644 index 9b223d73..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/matrix_keypad.c +++ /dev/null @@ -1,504 +0,0 @@ -/* - * GPIO driven matrix keyboard driver - * - * Copyright (c) 2008 Marek Vasut <marek.vasut@gmail.com> - * - * Based on corgikbd.c - * - * 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. - * - */ - -#include <linux/types.h> -#include <linux/delay.h> -#include <linux/platform_device.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/jiffies.h> -#include <linux/module.h> -#include <linux/gpio.h> -#include <linux/input/matrix_keypad.h> -#include <linux/slab.h> - -struct matrix_keypad { - const struct matrix_keypad_platform_data *pdata; - struct input_dev *input_dev; - unsigned short *keycodes; - unsigned int row_shift; - - DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS); - - uint32_t last_key_state[MATRIX_MAX_COLS]; - struct delayed_work work; - spinlock_t lock; - bool scan_pending; - bool stopped; - bool gpio_all_disabled; -}; - -/* - * NOTE: normally the GPIO has to be put into HiZ when de-activated to cause - * minmal side effect when scanning other columns, here it is configured to - * be input, and it should work on most platforms. - */ -static void __activate_col(const struct matrix_keypad_platform_data *pdata, - int col, bool on) -{ - bool level_on = !pdata->active_low; - - if (on) { - gpio_direction_output(pdata->col_gpios[col], level_on); - } else { - gpio_set_value_cansleep(pdata->col_gpios[col], !level_on); - gpio_direction_input(pdata->col_gpios[col]); - } -} - -static void activate_col(const struct matrix_keypad_platform_data *pdata, - int col, bool on) -{ - __activate_col(pdata, col, on); - - if (on && pdata->col_scan_delay_us) - udelay(pdata->col_scan_delay_us); -} - -static void activate_all_cols(const struct matrix_keypad_platform_data *pdata, - bool on) -{ - int col; - - for (col = 0; col < pdata->num_col_gpios; col++) - __activate_col(pdata, col, on); -} - -static bool row_asserted(const struct matrix_keypad_platform_data *pdata, - int row) -{ - return gpio_get_value_cansleep(pdata->row_gpios[row]) ? - !pdata->active_low : pdata->active_low; -} - -static void enable_row_irqs(struct matrix_keypad *keypad) -{ - const struct matrix_keypad_platform_data *pdata = keypad->pdata; - int i; - - if (pdata->clustered_irq > 0) - enable_irq(pdata->clustered_irq); - else { - for (i = 0; i < pdata->num_row_gpios; i++) - enable_irq(gpio_to_irq(pdata->row_gpios[i])); - } -} - -static void disable_row_irqs(struct matrix_keypad *keypad) -{ - const struct matrix_keypad_platform_data *pdata = keypad->pdata; - int i; - - if (pdata->clustered_irq > 0) - disable_irq_nosync(pdata->clustered_irq); - else { - for (i = 0; i < pdata->num_row_gpios; i++) - disable_irq_nosync(gpio_to_irq(pdata->row_gpios[i])); - } -} - -/* - * This gets the keys from keyboard and reports it to input subsystem - */ -static void matrix_keypad_scan(struct work_struct *work) -{ - struct matrix_keypad *keypad = - container_of(work, struct matrix_keypad, work.work); - struct input_dev *input_dev = keypad->input_dev; - const struct matrix_keypad_platform_data *pdata = keypad->pdata; - uint32_t new_state[MATRIX_MAX_COLS]; - int row, col, code; - - /* de-activate all columns for scanning */ - activate_all_cols(pdata, false); - - memset(new_state, 0, sizeof(new_state)); - - /* assert each column and read the row status out */ - for (col = 0; col < pdata->num_col_gpios; col++) { - - activate_col(pdata, col, true); - - for (row = 0; row < pdata->num_row_gpios; row++) - new_state[col] |= - row_asserted(pdata, row) ? (1 << row) : 0; - - activate_col(pdata, col, false); - } - - for (col = 0; col < pdata->num_col_gpios; col++) { - uint32_t bits_changed; - - bits_changed = keypad->last_key_state[col] ^ new_state[col]; - if (bits_changed == 0) - continue; - - for (row = 0; row < pdata->num_row_gpios; row++) { - if ((bits_changed & (1 << row)) == 0) - continue; - - code = MATRIX_SCAN_CODE(row, col, keypad->row_shift); - input_event(input_dev, EV_MSC, MSC_SCAN, code); - input_report_key(input_dev, - keypad->keycodes[code], - new_state[col] & (1 << row)); - } - } - input_sync(input_dev); - - memcpy(keypad->last_key_state, new_state, sizeof(new_state)); - - activate_all_cols(pdata, true); - - /* Enable IRQs again */ - spin_lock_irq(&keypad->lock); - keypad->scan_pending = false; - enable_row_irqs(keypad); - spin_unlock_irq(&keypad->lock); -} - -static irqreturn_t matrix_keypad_interrupt(int irq, void *id) -{ - struct matrix_keypad *keypad = id; - unsigned long flags; - - spin_lock_irqsave(&keypad->lock, flags); - - /* - * See if another IRQ beaten us to it and scheduled the - * scan already. In that case we should not try to - * disable IRQs again. - */ - if (unlikely(keypad->scan_pending || keypad->stopped)) - goto out; - - disable_row_irqs(keypad); - keypad->scan_pending = true; - schedule_delayed_work(&keypad->work, - msecs_to_jiffies(keypad->pdata->debounce_ms)); - -out: - spin_unlock_irqrestore(&keypad->lock, flags); - return IRQ_HANDLED; -} - -static int matrix_keypad_start(struct input_dev *dev) -{ - struct matrix_keypad *keypad = input_get_drvdata(dev); - - keypad->stopped = false; - mb(); - - /* - * Schedule an immediate key scan to capture current key state; - * columns will be activated and IRQs be enabled after the scan. - */ - schedule_delayed_work(&keypad->work, 0); - - return 0; -} - -static void matrix_keypad_stop(struct input_dev *dev) -{ - struct matrix_keypad *keypad = input_get_drvdata(dev); - - keypad->stopped = true; - mb(); - flush_work(&keypad->work.work); - /* - * matrix_keypad_scan() will leave IRQs enabled; - * we should disable them now. - */ - disable_row_irqs(keypad); -} - -#ifdef CONFIG_PM -static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad) -{ - const struct matrix_keypad_platform_data *pdata = keypad->pdata; - unsigned int gpio; - int i; - - if (pdata->clustered_irq > 0) { - if (enable_irq_wake(pdata->clustered_irq) == 0) - keypad->gpio_all_disabled = true; - } else { - - for (i = 0; i < pdata->num_row_gpios; i++) { - if (!test_bit(i, keypad->disabled_gpios)) { - gpio = pdata->row_gpios[i]; - - if (enable_irq_wake(gpio_to_irq(gpio)) == 0) - __set_bit(i, keypad->disabled_gpios); - } - } - } -} - -static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad) -{ - const struct matrix_keypad_platform_data *pdata = keypad->pdata; - unsigned int gpio; - int i; - - if (pdata->clustered_irq > 0) { - if (keypad->gpio_all_disabled) { - disable_irq_wake(pdata->clustered_irq); - keypad->gpio_all_disabled = false; - } - } else { - for (i = 0; i < pdata->num_row_gpios; i++) { - if (test_and_clear_bit(i, keypad->disabled_gpios)) { - gpio = pdata->row_gpios[i]; - disable_irq_wake(gpio_to_irq(gpio)); - } - } - } -} - -static int matrix_keypad_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct matrix_keypad *keypad = platform_get_drvdata(pdev); - - matrix_keypad_stop(keypad->input_dev); - - if (device_may_wakeup(&pdev->dev)) - matrix_keypad_enable_wakeup(keypad); - - return 0; -} - -static int matrix_keypad_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct matrix_keypad *keypad = platform_get_drvdata(pdev); - - if (device_may_wakeup(&pdev->dev)) - matrix_keypad_disable_wakeup(keypad); - - matrix_keypad_start(keypad->input_dev); - - return 0; -} - -static const SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops, - matrix_keypad_suspend, matrix_keypad_resume); -#endif - -static int __devinit init_matrix_gpio(struct platform_device *pdev, - struct matrix_keypad *keypad) -{ - const struct matrix_keypad_platform_data *pdata = keypad->pdata; - int i, err = -EINVAL; - - /* initialized strobe lines as outputs, activated */ - for (i = 0; i < pdata->num_col_gpios; i++) { - err = gpio_request(pdata->col_gpios[i], "matrix_kbd_col"); - if (err) { - dev_err(&pdev->dev, - "failed to request GPIO%d for COL%d\n", - pdata->col_gpios[i], i); - goto err_free_cols; - } - - gpio_direction_output(pdata->col_gpios[i], !pdata->active_low); - } - - for (i = 0; i < pdata->num_row_gpios; i++) { - err = gpio_request(pdata->row_gpios[i], "matrix_kbd_row"); - if (err) { - dev_err(&pdev->dev, - "failed to request GPIO%d for ROW%d\n", - pdata->row_gpios[i], i); - goto err_free_rows; - } - - gpio_direction_input(pdata->row_gpios[i]); - } - - if (pdata->clustered_irq > 0) { - err = request_irq(pdata->clustered_irq, - matrix_keypad_interrupt, - pdata->clustered_irq_flags, - "matrix-keypad", keypad); - if (err) { - dev_err(&pdev->dev, - "Unable to acquire clustered interrupt\n"); - goto err_free_rows; - } - } else { - for (i = 0; i < pdata->num_row_gpios; i++) { - err = request_irq(gpio_to_irq(pdata->row_gpios[i]), - matrix_keypad_interrupt, - IRQF_TRIGGER_RISING | - IRQF_TRIGGER_FALLING, - "matrix-keypad", keypad); - if (err) { - dev_err(&pdev->dev, - "Unable to acquire interrupt " - "for GPIO line %i\n", - pdata->row_gpios[i]); - goto err_free_irqs; - } - } - } - - /* initialized as disabled - enabled by input->open */ - disable_row_irqs(keypad); - return 0; - -err_free_irqs: - while (--i >= 0) - free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); - i = pdata->num_row_gpios; -err_free_rows: - while (--i >= 0) - gpio_free(pdata->row_gpios[i]); - i = pdata->num_col_gpios; -err_free_cols: - while (--i >= 0) - gpio_free(pdata->col_gpios[i]); - - return err; -} - -static int __devinit matrix_keypad_probe(struct platform_device *pdev) -{ - const struct matrix_keypad_platform_data *pdata; - const struct matrix_keymap_data *keymap_data; - struct matrix_keypad *keypad; - struct input_dev *input_dev; - unsigned short *keycodes; - unsigned int row_shift; - int err; - - pdata = pdev->dev.platform_data; - if (!pdata) { - dev_err(&pdev->dev, "no platform data defined\n"); - return -EINVAL; - } - - keymap_data = pdata->keymap_data; - if (!keymap_data) { - dev_err(&pdev->dev, "no keymap data defined\n"); - return -EINVAL; - } - - row_shift = get_count_order(pdata->num_col_gpios); - - keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); - keycodes = kzalloc((pdata->num_row_gpios << row_shift) * - sizeof(*keycodes), - GFP_KERNEL); - input_dev = input_allocate_device(); - if (!keypad || !keycodes || !input_dev) { - err = -ENOMEM; - goto err_free_mem; - } - - keypad->input_dev = input_dev; - keypad->pdata = pdata; - keypad->keycodes = keycodes; - keypad->row_shift = row_shift; - keypad->stopped = true; - INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan); - spin_lock_init(&keypad->lock); - - input_dev->name = pdev->name; - input_dev->id.bustype = BUS_HOST; - input_dev->dev.parent = &pdev->dev; - input_dev->evbit[0] = BIT_MASK(EV_KEY); - if (!pdata->no_autorepeat) - input_dev->evbit[0] |= BIT_MASK(EV_REP); - input_dev->open = matrix_keypad_start; - input_dev->close = matrix_keypad_stop; - - input_dev->keycode = keycodes; - input_dev->keycodesize = sizeof(*keycodes); - input_dev->keycodemax = pdata->num_row_gpios << row_shift; - - matrix_keypad_build_keymap(keymap_data, row_shift, - input_dev->keycode, input_dev->keybit); - - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - input_set_drvdata(input_dev, keypad); - - err = init_matrix_gpio(pdev, keypad); - if (err) - goto err_free_mem; - - err = input_register_device(keypad->input_dev); - if (err) - goto err_free_mem; - - device_init_wakeup(&pdev->dev, pdata->wakeup); - platform_set_drvdata(pdev, keypad); - - return 0; - -err_free_mem: - input_free_device(input_dev); - kfree(keycodes); - kfree(keypad); - return err; -} - -static int __devexit matrix_keypad_remove(struct platform_device *pdev) -{ - struct matrix_keypad *keypad = platform_get_drvdata(pdev); - const struct matrix_keypad_platform_data *pdata = keypad->pdata; - int i; - - device_init_wakeup(&pdev->dev, 0); - - if (pdata->clustered_irq > 0) { - free_irq(pdata->clustered_irq, keypad); - } else { - for (i = 0; i < pdata->num_row_gpios; i++) - free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); - } - - for (i = 0; i < pdata->num_row_gpios; i++) - gpio_free(pdata->row_gpios[i]); - - for (i = 0; i < pdata->num_col_gpios; i++) - gpio_free(pdata->col_gpios[i]); - - input_unregister_device(keypad->input_dev); - platform_set_drvdata(pdev, NULL); - kfree(keypad->keycodes); - kfree(keypad); - - return 0; -} - -static struct platform_driver matrix_keypad_driver = { - .probe = matrix_keypad_probe, - .remove = __devexit_p(matrix_keypad_remove), - .driver = { - .name = "matrix-keypad", - .owner = THIS_MODULE, -#ifdef CONFIG_PM - .pm = &matrix_keypad_pm_ops, -#endif - }, -}; -module_platform_driver(matrix_keypad_driver); - -MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); -MODULE_DESCRIPTION("GPIO Driven Matrix Keypad Driver"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:matrix-keypad"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/max7359_keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/max7359_keypad.c deleted file mode 100644 index 8edada8a..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/max7359_keypad.c +++ /dev/null @@ -1,323 +0,0 @@ -/* - * max7359_keypad.c - MAX7359 Key Switch Controller Driver - * - * Copyright (C) 2009 Samsung Electronics - * Kim Kyuwon <q1.kim@samsung.com> - * - * Based on pxa27x_keypad.c - * - * 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. - * - * Datasheet: http://www.maxim-ic.com/quick_view2.cfm/qv_pk/5456 - */ - -#include <linux/module.h> -#include <linux/i2c.h> -#include <linux/slab.h> -#include <linux/interrupt.h> -#include <linux/pm.h> -#include <linux/input.h> -#include <linux/input/matrix_keypad.h> - -#define MAX7359_MAX_KEY_ROWS 8 -#define MAX7359_MAX_KEY_COLS 8 -#define MAX7359_MAX_KEY_NUM (MAX7359_MAX_KEY_ROWS * MAX7359_MAX_KEY_COLS) -#define MAX7359_ROW_SHIFT 3 - -/* - * MAX7359 registers - */ -#define MAX7359_REG_KEYFIFO 0x00 -#define MAX7359_REG_CONFIG 0x01 -#define MAX7359_REG_DEBOUNCE 0x02 -#define MAX7359_REG_INTERRUPT 0x03 -#define MAX7359_REG_PORTS 0x04 -#define MAX7359_REG_KEYREP 0x05 -#define MAX7359_REG_SLEEP 0x06 - -/* - * Configuration register bits - */ -#define MAX7359_CFG_SLEEP (1 << 7) -#define MAX7359_CFG_INTERRUPT (1 << 5) -#define MAX7359_CFG_KEY_RELEASE (1 << 3) -#define MAX7359_CFG_WAKEUP (1 << 1) -#define MAX7359_CFG_TIMEOUT (1 << 0) - -/* - * Autosleep register values (ms) - */ -#define MAX7359_AUTOSLEEP_8192 0x01 -#define MAX7359_AUTOSLEEP_4096 0x02 -#define MAX7359_AUTOSLEEP_2048 0x03 -#define MAX7359_AUTOSLEEP_1024 0x04 -#define MAX7359_AUTOSLEEP_512 0x05 -#define MAX7359_AUTOSLEEP_256 0x06 - -struct max7359_keypad { - /* matrix key code map */ - unsigned short keycodes[MAX7359_MAX_KEY_NUM]; - - struct input_dev *input_dev; - struct i2c_client *client; -}; - -static int max7359_write_reg(struct i2c_client *client, u8 reg, u8 val) -{ - int ret = i2c_smbus_write_byte_data(client, reg, val); - - if (ret < 0) - dev_err(&client->dev, "%s: reg 0x%x, val 0x%x, err %d\n", - __func__, reg, val, ret); - return ret; -} - -static int max7359_read_reg(struct i2c_client *client, int reg) -{ - int ret = i2c_smbus_read_byte_data(client, reg); - - if (ret < 0) - dev_err(&client->dev, "%s: reg 0x%x, err %d\n", - __func__, reg, ret); - return ret; -} - -static void max7359_build_keycode(struct max7359_keypad *keypad, - const struct matrix_keymap_data *keymap_data) -{ - struct input_dev *input_dev = keypad->input_dev; - int i; - - for (i = 0; i < keymap_data->keymap_size; i++) { - unsigned int key = keymap_data->keymap[i]; - unsigned int row = KEY_ROW(key); - unsigned int col = KEY_COL(key); - unsigned int scancode = MATRIX_SCAN_CODE(row, col, - MAX7359_ROW_SHIFT); - unsigned short keycode = KEY_VAL(key); - - keypad->keycodes[scancode] = keycode; - __set_bit(keycode, input_dev->keybit); - } - __clear_bit(KEY_RESERVED, input_dev->keybit); -} - -/* runs in an IRQ thread -- can (and will!) sleep */ -static irqreturn_t max7359_interrupt(int irq, void *dev_id) -{ - struct max7359_keypad *keypad = dev_id; - struct input_dev *input_dev = keypad->input_dev; - int val, row, col, release, code; - - val = max7359_read_reg(keypad->client, MAX7359_REG_KEYFIFO); - row = val & 0x7; - col = (val >> 3) & 0x7; - release = val & 0x40; - - code = MATRIX_SCAN_CODE(row, col, MAX7359_ROW_SHIFT); - - dev_dbg(&keypad->client->dev, - "key[%d:%d] %s\n", row, col, release ? "release" : "press"); - - input_event(input_dev, EV_MSC, MSC_SCAN, code); - input_report_key(input_dev, keypad->keycodes[code], !release); - input_sync(input_dev); - - return IRQ_HANDLED; -} - -/* - * Let MAX7359 fall into a deep sleep: - * If no keys are pressed, enter sleep mode for 8192 ms. And if any - * key is pressed, the MAX7359 returns to normal operating mode. - */ -static inline void max7359_fall_deepsleep(struct i2c_client *client) -{ - max7359_write_reg(client, MAX7359_REG_SLEEP, MAX7359_AUTOSLEEP_8192); -} - -/* - * Let MAX7359 take a catnap: - * Autosleep just for 256 ms. - */ -static inline void max7359_take_catnap(struct i2c_client *client) -{ - max7359_write_reg(client, MAX7359_REG_SLEEP, MAX7359_AUTOSLEEP_256); -} - -static int max7359_open(struct input_dev *dev) -{ - struct max7359_keypad *keypad = input_get_drvdata(dev); - - max7359_take_catnap(keypad->client); - - return 0; -} - -static void max7359_close(struct input_dev *dev) -{ - struct max7359_keypad *keypad = input_get_drvdata(dev); - - max7359_fall_deepsleep(keypad->client); -} - -static void max7359_initialize(struct i2c_client *client) -{ - max7359_write_reg(client, MAX7359_REG_CONFIG, - MAX7359_CFG_INTERRUPT | /* Irq clears after host read */ - MAX7359_CFG_KEY_RELEASE | /* Key release enable */ - MAX7359_CFG_WAKEUP); /* Key press wakeup enable */ - - /* Full key-scan functionality */ - max7359_write_reg(client, MAX7359_REG_DEBOUNCE, 0x1F); - - /* nINT asserts every debounce cycles */ - max7359_write_reg(client, MAX7359_REG_INTERRUPT, 0x01); - - max7359_fall_deepsleep(client); -} - -static int __devinit max7359_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - const struct matrix_keymap_data *keymap_data = client->dev.platform_data; - struct max7359_keypad *keypad; - struct input_dev *input_dev; - int ret; - int error; - - if (!client->irq) { - dev_err(&client->dev, "The irq number should not be zero\n"); - return -EINVAL; - } - - /* Detect MAX7359: The initial Keys FIFO value is '0x3F' */ - ret = max7359_read_reg(client, MAX7359_REG_KEYFIFO); - if (ret < 0) { - dev_err(&client->dev, "failed to detect device\n"); - return -ENODEV; - } - - dev_dbg(&client->dev, "keys FIFO is 0x%02x\n", ret); - - keypad = kzalloc(sizeof(struct max7359_keypad), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!keypad || !input_dev) { - dev_err(&client->dev, "failed to allocate memory\n"); - error = -ENOMEM; - goto failed_free_mem; - } - - keypad->client = client; - keypad->input_dev = input_dev; - - input_dev->name = client->name; - input_dev->id.bustype = BUS_I2C; - input_dev->open = max7359_open; - input_dev->close = max7359_close; - input_dev->dev.parent = &client->dev; - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - input_dev->keycodesize = sizeof(keypad->keycodes[0]); - input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); - input_dev->keycode = keypad->keycodes; - - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - input_set_drvdata(input_dev, keypad); - - max7359_build_keycode(keypad, keymap_data); - - error = request_threaded_irq(client->irq, NULL, max7359_interrupt, - IRQF_TRIGGER_LOW | IRQF_ONESHOT, - client->name, keypad); - if (error) { - dev_err(&client->dev, "failed to register interrupt\n"); - goto failed_free_mem; - } - - /* Register the input device */ - error = input_register_device(input_dev); - if (error) { - dev_err(&client->dev, "failed to register input device\n"); - goto failed_free_irq; - } - - /* Initialize MAX7359 */ - max7359_initialize(client); - - i2c_set_clientdata(client, keypad); - device_init_wakeup(&client->dev, 1); - - return 0; - -failed_free_irq: - free_irq(client->irq, keypad); -failed_free_mem: - input_free_device(input_dev); - kfree(keypad); - return error; -} - -static int __devexit max7359_remove(struct i2c_client *client) -{ - struct max7359_keypad *keypad = i2c_get_clientdata(client); - - free_irq(client->irq, keypad); - input_unregister_device(keypad->input_dev); - kfree(keypad); - - return 0; -} - -#ifdef CONFIG_PM -static int max7359_suspend(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - - max7359_fall_deepsleep(client); - - if (device_may_wakeup(&client->dev)) - enable_irq_wake(client->irq); - - return 0; -} - -static int max7359_resume(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - - if (device_may_wakeup(&client->dev)) - disable_irq_wake(client->irq); - - /* Restore the default setting */ - max7359_take_catnap(client); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(max7359_pm, max7359_suspend, max7359_resume); - -static const struct i2c_device_id max7359_ids[] = { - { "max7359", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, max7359_ids); - -static struct i2c_driver max7359_i2c_driver = { - .driver = { - .name = "max7359", - .pm = &max7359_pm, - }, - .probe = max7359_probe, - .remove = __devexit_p(max7359_remove), - .id_table = max7359_ids, -}; - -module_i2c_driver(max7359_i2c_driver); - -MODULE_AUTHOR("Kim Kyuwon <q1.kim@samsung.com>"); -MODULE_DESCRIPTION("MAX7359 Key Switch Controller Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/mcs_touchkey.c b/ANDROID_3.4.5/drivers/input/keyboard/mcs_touchkey.c deleted file mode 100644 index 64a0ca4c..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/mcs_touchkey.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Touchkey driver for MELFAS MCS5000/5080 controller - * - * Copyright (C) 2010 Samsung Electronics Co.Ltd - * Author: HeungJun Kim <riverful.kim@samsung.com> - * Author: Joonyoung Shim <jy0922.shim@samsung.com> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/i2c.h> -#include <linux/i2c/mcs.h> -#include <linux/interrupt.h> -#include <linux/input.h> -#include <linux/irq.h> -#include <linux/slab.h> -#include <linux/pm.h> - -/* MCS5000 Touchkey */ -#define MCS5000_TOUCHKEY_STATUS 0x04 -#define MCS5000_TOUCHKEY_STATUS_PRESS 7 -#define MCS5000_TOUCHKEY_FW 0x0a -#define MCS5000_TOUCHKEY_BASE_VAL 0x61 - -/* MCS5080 Touchkey */ -#define MCS5080_TOUCHKEY_STATUS 0x00 -#define MCS5080_TOUCHKEY_STATUS_PRESS 3 -#define MCS5080_TOUCHKEY_FW 0x01 -#define MCS5080_TOUCHKEY_BASE_VAL 0x1 - -enum mcs_touchkey_type { - MCS5000_TOUCHKEY, - MCS5080_TOUCHKEY, -}; - -struct mcs_touchkey_chip { - unsigned int status_reg; - unsigned int pressbit; - unsigned int press_invert; - unsigned int baseval; -}; - -struct mcs_touchkey_data { - void (*poweron)(bool); - - struct i2c_client *client; - struct input_dev *input_dev; - struct mcs_touchkey_chip chip; - unsigned int key_code; - unsigned int key_val; - unsigned short keycodes[]; -}; - -static irqreturn_t mcs_touchkey_interrupt(int irq, void *dev_id) -{ - struct mcs_touchkey_data *data = dev_id; - struct mcs_touchkey_chip *chip = &data->chip; - struct i2c_client *client = data->client; - struct input_dev *input = data->input_dev; - unsigned int key_val; - unsigned int pressed; - int val; - - val = i2c_smbus_read_byte_data(client, chip->status_reg); - if (val < 0) { - dev_err(&client->dev, "i2c read error [%d]\n", val); - goto out; - } - - pressed = (val & (1 << chip->pressbit)) >> chip->pressbit; - if (chip->press_invert) - pressed ^= chip->press_invert; - - /* key_val is 0 when released, so we should use key_val of press. */ - if (pressed) { - key_val = val & (0xff >> (8 - chip->pressbit)); - if (!key_val) - goto out; - key_val -= chip->baseval; - data->key_code = data->keycodes[key_val]; - data->key_val = key_val; - } - - input_event(input, EV_MSC, MSC_SCAN, data->key_val); - input_report_key(input, data->key_code, pressed); - input_sync(input); - - dev_dbg(&client->dev, "key %d %d %s\n", data->key_val, data->key_code, - pressed ? "pressed" : "released"); - - out: - return IRQ_HANDLED; -} - -static int __devinit mcs_touchkey_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - const struct mcs_platform_data *pdata; - struct mcs_touchkey_data *data; - struct input_dev *input_dev; - unsigned int fw_reg; - int fw_ver; - int error; - int i; - - pdata = client->dev.platform_data; - if (!pdata) { - dev_err(&client->dev, "no platform data defined\n"); - return -EINVAL; - } - - data = kzalloc(sizeof(struct mcs_touchkey_data) + - sizeof(data->keycodes[0]) * (pdata->key_maxval + 1), - GFP_KERNEL); - input_dev = input_allocate_device(); - if (!data || !input_dev) { - dev_err(&client->dev, "Failed to allocate memory\n"); - error = -ENOMEM; - goto err_free_mem; - } - - data->client = client; - data->input_dev = input_dev; - - if (id->driver_data == MCS5000_TOUCHKEY) { - data->chip.status_reg = MCS5000_TOUCHKEY_STATUS; - data->chip.pressbit = MCS5000_TOUCHKEY_STATUS_PRESS; - data->chip.baseval = MCS5000_TOUCHKEY_BASE_VAL; - fw_reg = MCS5000_TOUCHKEY_FW; - } else { - data->chip.status_reg = MCS5080_TOUCHKEY_STATUS; - data->chip.pressbit = MCS5080_TOUCHKEY_STATUS_PRESS; - data->chip.press_invert = 1; - data->chip.baseval = MCS5080_TOUCHKEY_BASE_VAL; - fw_reg = MCS5080_TOUCHKEY_FW; - } - - fw_ver = i2c_smbus_read_byte_data(client, fw_reg); - if (fw_ver < 0) { - error = fw_ver; - dev_err(&client->dev, "i2c read error[%d]\n", error); - goto err_free_mem; - } - dev_info(&client->dev, "Firmware version: %d\n", fw_ver); - - input_dev->name = "MELPAS MCS Touchkey"; - input_dev->id.bustype = BUS_I2C; - input_dev->dev.parent = &client->dev; - input_dev->evbit[0] = BIT_MASK(EV_KEY); - if (!pdata->no_autorepeat) - input_dev->evbit[0] |= BIT_MASK(EV_REP); - input_dev->keycode = data->keycodes; - input_dev->keycodesize = sizeof(data->keycodes[0]); - input_dev->keycodemax = pdata->key_maxval + 1; - - for (i = 0; i < pdata->keymap_size; i++) { - unsigned int val = MCS_KEY_VAL(pdata->keymap[i]); - unsigned int code = MCS_KEY_CODE(pdata->keymap[i]); - - data->keycodes[val] = code; - __set_bit(code, input_dev->keybit); - } - - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - input_set_drvdata(input_dev, data); - - if (pdata->cfg_pin) - pdata->cfg_pin(); - - if (pdata->poweron) { - data->poweron = pdata->poweron; - data->poweron(true); - } - - error = request_threaded_irq(client->irq, NULL, mcs_touchkey_interrupt, - IRQF_TRIGGER_FALLING, client->dev.driver->name, data); - if (error) { - dev_err(&client->dev, "Failed to register interrupt\n"); - goto err_free_mem; - } - - error = input_register_device(input_dev); - if (error) - goto err_free_irq; - - i2c_set_clientdata(client, data); - return 0; - -err_free_irq: - free_irq(client->irq, data); -err_free_mem: - input_free_device(input_dev); - kfree(data); - return error; -} - -static int __devexit mcs_touchkey_remove(struct i2c_client *client) -{ - struct mcs_touchkey_data *data = i2c_get_clientdata(client); - - free_irq(client->irq, data); - if (data->poweron) - data->poweron(false); - input_unregister_device(data->input_dev); - kfree(data); - - return 0; -} - -static void mcs_touchkey_shutdown(struct i2c_client *client) -{ - struct mcs_touchkey_data *data = i2c_get_clientdata(client); - - if (data->poweron) - data->poweron(false); -} - -#ifdef CONFIG_PM_SLEEP -static int mcs_touchkey_suspend(struct device *dev) -{ - struct mcs_touchkey_data *data = dev_get_drvdata(dev); - struct i2c_client *client = data->client; - - /* Disable the work */ - disable_irq(client->irq); - - /* Finally turn off the power */ - if (data->poweron) - data->poweron(false); - - return 0; -} - -static int mcs_touchkey_resume(struct device *dev) -{ - struct mcs_touchkey_data *data = dev_get_drvdata(dev); - struct i2c_client *client = data->client; - - /* Enable the device first */ - if (data->poweron) - data->poweron(true); - - /* Enable irq again */ - enable_irq(client->irq); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(mcs_touchkey_pm_ops, - mcs_touchkey_suspend, mcs_touchkey_resume); - -static const struct i2c_device_id mcs_touchkey_id[] = { - { "mcs5000_touchkey", MCS5000_TOUCHKEY }, - { "mcs5080_touchkey", MCS5080_TOUCHKEY }, - { } -}; -MODULE_DEVICE_TABLE(i2c, mcs_touchkey_id); - -static struct i2c_driver mcs_touchkey_driver = { - .driver = { - .name = "mcs_touchkey", - .owner = THIS_MODULE, - .pm = &mcs_touchkey_pm_ops, - }, - .probe = mcs_touchkey_probe, - .remove = __devexit_p(mcs_touchkey_remove), - .shutdown = mcs_touchkey_shutdown, - .id_table = mcs_touchkey_id, -}; - -module_i2c_driver(mcs_touchkey_driver); - -/* Module information */ -MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>"); -MODULE_AUTHOR("HeungJun Kim <riverful.kim@samsung.com>"); -MODULE_DESCRIPTION("Touchkey driver for MELFAS MCS5000/5080 controller"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/mpr121_touchkey.c b/ANDROID_3.4.5/drivers/input/keyboard/mpr121_touchkey.c deleted file mode 100644 index caa218a5..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/mpr121_touchkey.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Touchkey driver for Freescale MPR121 Controllor - * - * Copyright (C) 2011 Freescale Semiconductor, Inc. - * Author: Zhang Jiejing <jiejing.zhang@freescale.com> - * - * Based on mcs_touchkey.c - * - * 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. - * - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/i2c.h> -#include <linux/slab.h> -#include <linux/delay.h> -#include <linux/bitops.h> -#include <linux/interrupt.h> -#include <linux/i2c/mpr121_touchkey.h> - -/* Register definitions */ -#define ELE_TOUCH_STATUS_0_ADDR 0x0 -#define ELE_TOUCH_STATUS_1_ADDR 0X1 -#define MHD_RISING_ADDR 0x2b -#define NHD_RISING_ADDR 0x2c -#define NCL_RISING_ADDR 0x2d -#define FDL_RISING_ADDR 0x2e -#define MHD_FALLING_ADDR 0x2f -#define NHD_FALLING_ADDR 0x30 -#define NCL_FALLING_ADDR 0x31 -#define FDL_FALLING_ADDR 0x32 -#define ELE0_TOUCH_THRESHOLD_ADDR 0x41 -#define ELE0_RELEASE_THRESHOLD_ADDR 0x42 -#define AFE_CONF_ADDR 0x5c -#define FILTER_CONF_ADDR 0x5d - -/* - * ELECTRODE_CONF_ADDR: This register configures the number of - * enabled capacitance sensing inputs and its run/suspend mode. - */ -#define ELECTRODE_CONF_ADDR 0x5e -#define ELECTRODE_CONF_QUICK_CHARGE 0x80 -#define AUTO_CONFIG_CTRL_ADDR 0x7b -#define AUTO_CONFIG_USL_ADDR 0x7d -#define AUTO_CONFIG_LSL_ADDR 0x7e -#define AUTO_CONFIG_TL_ADDR 0x7f - -/* Threshold of touch/release trigger */ -#define TOUCH_THRESHOLD 0x08 -#define RELEASE_THRESHOLD 0x05 -/* Masks for touch and release triggers */ -#define TOUCH_STATUS_MASK 0xfff -/* MPR121 has 12 keys */ -#define MPR121_MAX_KEY_COUNT 12 - -struct mpr121_touchkey { - struct i2c_client *client; - struct input_dev *input_dev; - unsigned int key_val; - unsigned int statusbits; - unsigned int keycount; - u16 keycodes[MPR121_MAX_KEY_COUNT]; -}; - -struct mpr121_init_register { - int addr; - u8 val; -}; - -static const struct mpr121_init_register init_reg_table[] __devinitconst = { - { MHD_RISING_ADDR, 0x1 }, - { NHD_RISING_ADDR, 0x1 }, - { MHD_FALLING_ADDR, 0x1 }, - { NHD_FALLING_ADDR, 0x1 }, - { NCL_FALLING_ADDR, 0xff }, - { FDL_FALLING_ADDR, 0x02 }, - { FILTER_CONF_ADDR, 0x04 }, - { AFE_CONF_ADDR, 0x0b }, - { AUTO_CONFIG_CTRL_ADDR, 0x0b }, -}; - -static irqreturn_t mpr_touchkey_interrupt(int irq, void *dev_id) -{ - struct mpr121_touchkey *mpr121 = dev_id; - struct i2c_client *client = mpr121->client; - struct input_dev *input = mpr121->input_dev; - unsigned int key_num, key_val, pressed; - int reg; - - reg = i2c_smbus_read_byte_data(client, ELE_TOUCH_STATUS_1_ADDR); - if (reg < 0) { - dev_err(&client->dev, "i2c read error [%d]\n", reg); - goto out; - } - - reg <<= 8; - reg |= i2c_smbus_read_byte_data(client, ELE_TOUCH_STATUS_0_ADDR); - if (reg < 0) { - dev_err(&client->dev, "i2c read error [%d]\n", reg); - goto out; - } - - reg &= TOUCH_STATUS_MASK; - /* use old press bit to figure out which bit changed */ - key_num = ffs(reg ^ mpr121->statusbits) - 1; - pressed = reg & (1 << key_num); - mpr121->statusbits = reg; - - key_val = mpr121->keycodes[key_num]; - - input_event(input, EV_MSC, MSC_SCAN, key_num); - input_report_key(input, key_val, pressed); - input_sync(input); - - dev_dbg(&client->dev, "key %d %d %s\n", key_num, key_val, - pressed ? "pressed" : "released"); - -out: - return IRQ_HANDLED; -} - -static int __devinit mpr121_phys_init(const struct mpr121_platform_data *pdata, - struct mpr121_touchkey *mpr121, - struct i2c_client *client) -{ - const struct mpr121_init_register *reg; - unsigned char usl, lsl, tl, eleconf; - int i, t, vdd, ret; - - /* Set up touch/release threshold for ele0-ele11 */ - for (i = 0; i <= MPR121_MAX_KEY_COUNT; i++) { - t = ELE0_TOUCH_THRESHOLD_ADDR + (i * 2); - ret = i2c_smbus_write_byte_data(client, t, TOUCH_THRESHOLD); - if (ret < 0) - goto err_i2c_write; - ret = i2c_smbus_write_byte_data(client, t + 1, - RELEASE_THRESHOLD); - if (ret < 0) - goto err_i2c_write; - } - - /* Set up init register */ - for (i = 0; i < ARRAY_SIZE(init_reg_table); i++) { - reg = &init_reg_table[i]; - ret = i2c_smbus_write_byte_data(client, reg->addr, reg->val); - if (ret < 0) - goto err_i2c_write; - } - - - /* - * Capacitance on sensing input varies and needs to be compensated. - * The internal MPR121-auto-configuration can do this if it's - * registers are set properly (based on pdata->vdd_uv). - */ - vdd = pdata->vdd_uv / 1000; - usl = ((vdd - 700) * 256) / vdd; - lsl = (usl * 65) / 100; - tl = (usl * 90) / 100; - ret = i2c_smbus_write_byte_data(client, AUTO_CONFIG_USL_ADDR, usl); - ret |= i2c_smbus_write_byte_data(client, AUTO_CONFIG_LSL_ADDR, lsl); - ret |= i2c_smbus_write_byte_data(client, AUTO_CONFIG_TL_ADDR, tl); - - /* - * Quick charge bit will let the capacitive charge to ready - * state quickly, or the buttons may not function after system - * boot. - */ - eleconf = mpr121->keycount | ELECTRODE_CONF_QUICK_CHARGE; - ret |= i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR, - eleconf); - if (ret != 0) - goto err_i2c_write; - - dev_dbg(&client->dev, "set up with %x keys.\n", mpr121->keycount); - - return 0; - -err_i2c_write: - dev_err(&client->dev, "i2c write error: %d\n", ret); - return ret; -} - -static int __devinit mpr_touchkey_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - const struct mpr121_platform_data *pdata = client->dev.platform_data; - struct mpr121_touchkey *mpr121; - struct input_dev *input_dev; - int error; - int i; - - if (!pdata) { - dev_err(&client->dev, "no platform data defined\n"); - return -EINVAL; - } - - if (!pdata->keymap || !pdata->keymap_size) { - dev_err(&client->dev, "missing keymap data\n"); - return -EINVAL; - } - - if (pdata->keymap_size > MPR121_MAX_KEY_COUNT) { - dev_err(&client->dev, "too many keys defined\n"); - return -EINVAL; - } - - if (!client->irq) { - dev_err(&client->dev, "irq number should not be zero\n"); - return -EINVAL; - } - - mpr121 = kzalloc(sizeof(struct mpr121_touchkey), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!mpr121 || !input_dev) { - dev_err(&client->dev, "Failed to allocate memory\n"); - error = -ENOMEM; - goto err_free_mem; - } - - mpr121->client = client; - mpr121->input_dev = input_dev; - mpr121->keycount = pdata->keymap_size; - - input_dev->name = "Freescale MPR121 Touchkey"; - input_dev->id.bustype = BUS_I2C; - input_dev->dev.parent = &client->dev; - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - - input_dev->keycode = mpr121->keycodes; - input_dev->keycodesize = sizeof(mpr121->keycodes[0]); - input_dev->keycodemax = mpr121->keycount; - - for (i = 0; i < pdata->keymap_size; i++) { - input_set_capability(input_dev, EV_KEY, pdata->keymap[i]); - mpr121->keycodes[i] = pdata->keymap[i]; - } - - error = mpr121_phys_init(pdata, mpr121, client); - if (error) { - dev_err(&client->dev, "Failed to init register\n"); - goto err_free_mem; - } - - error = request_threaded_irq(client->irq, NULL, - mpr_touchkey_interrupt, - IRQF_TRIGGER_FALLING, - client->dev.driver->name, mpr121); - if (error) { - dev_err(&client->dev, "Failed to register interrupt\n"); - goto err_free_mem; - } - - error = input_register_device(input_dev); - if (error) - goto err_free_irq; - - i2c_set_clientdata(client, mpr121); - device_init_wakeup(&client->dev, pdata->wakeup); - - return 0; - -err_free_irq: - free_irq(client->irq, mpr121); -err_free_mem: - input_free_device(input_dev); - kfree(mpr121); - return error; -} - -static int __devexit mpr_touchkey_remove(struct i2c_client *client) -{ - struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client); - - free_irq(client->irq, mpr121); - input_unregister_device(mpr121->input_dev); - kfree(mpr121); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int mpr_suspend(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - - if (device_may_wakeup(&client->dev)) - enable_irq_wake(client->irq); - - i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR, 0x00); - - return 0; -} - -static int mpr_resume(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client); - - if (device_may_wakeup(&client->dev)) - disable_irq_wake(client->irq); - - i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR, - mpr121->keycount); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(mpr121_touchkey_pm_ops, mpr_suspend, mpr_resume); - -static const struct i2c_device_id mpr121_id[] = { - { "mpr121_touchkey", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, mpr121_id); - -static struct i2c_driver mpr_touchkey_driver = { - .driver = { - .name = "mpr121", - .owner = THIS_MODULE, - .pm = &mpr121_touchkey_pm_ops, - }, - .id_table = mpr121_id, - .probe = mpr_touchkey_probe, - .remove = __devexit_p(mpr_touchkey_remove), -}; - -module_i2c_driver(mpr_touchkey_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Zhang Jiejing <jiejing.zhang@freescale.com>"); -MODULE_DESCRIPTION("Touch Key driver for Freescale MPR121 Chip"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/newtonkbd.c b/ANDROID_3.4.5/drivers/input/keyboard/newtonkbd.c deleted file mode 100644 index 48d1cab0..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/newtonkbd.c +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2000 Justin Cormack - */ - -/* - * Newton keyboard driver for Linux - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * - * Should you need to contact me, the author, you can do so either by - * e-mail - mail your message to <j.cormack@doc.ic.ac.uk>, or by paper mail: - * Justin Cormack, 68 Dartmouth Park Road, London NW5 1SN, UK. - */ - -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/input.h> -#include <linux/init.h> -#include <linux/serio.h> - -#define DRIVER_DESC "Newton keyboard driver" - -MODULE_AUTHOR("Justin Cormack <j.cormack@doc.ic.ac.uk>"); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_LICENSE("GPL"); - -#define NKBD_KEY 0x7f -#define NKBD_PRESS 0x80 - -static unsigned char nkbd_keycode[128] = { - KEY_A, KEY_S, KEY_D, KEY_F, KEY_H, KEY_G, KEY_Z, KEY_X, - KEY_C, KEY_V, 0, KEY_B, KEY_Q, KEY_W, KEY_E, KEY_R, - KEY_Y, KEY_T, KEY_1, KEY_2, KEY_3, KEY_4, KEY_6, KEY_5, - KEY_EQUAL, KEY_9, KEY_7, KEY_MINUS, KEY_8, KEY_0, KEY_RIGHTBRACE, KEY_O, - KEY_U, KEY_LEFTBRACE, KEY_I, KEY_P, KEY_ENTER, KEY_L, KEY_J, KEY_APOSTROPHE, - KEY_K, KEY_SEMICOLON, KEY_BACKSLASH, KEY_COMMA, KEY_SLASH, KEY_N, KEY_M, KEY_DOT, - KEY_TAB, KEY_SPACE, KEY_GRAVE, KEY_DELETE, 0, 0, 0, KEY_LEFTMETA, - KEY_LEFTSHIFT, KEY_CAPSLOCK, KEY_LEFTALT, KEY_LEFTCTRL, KEY_RIGHTSHIFT, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_UP, 0 -}; - -struct nkbd { - unsigned char keycode[128]; - struct input_dev *dev; - struct serio *serio; - char phys[32]; -}; - -static irqreturn_t nkbd_interrupt(struct serio *serio, - unsigned char data, unsigned int flags) -{ - struct nkbd *nkbd = serio_get_drvdata(serio); - - /* invalid scan codes are probably the init sequence, so we ignore them */ - if (nkbd->keycode[data & NKBD_KEY]) { - input_report_key(nkbd->dev, nkbd->keycode[data & NKBD_KEY], data & NKBD_PRESS); - input_sync(nkbd->dev); - } - - else if (data == 0xe7) /* end of init sequence */ - printk(KERN_INFO "input: %s on %s\n", nkbd->dev->name, serio->phys); - return IRQ_HANDLED; - -} - -static int nkbd_connect(struct serio *serio, struct serio_driver *drv) -{ - struct nkbd *nkbd; - struct input_dev *input_dev; - int err = -ENOMEM; - int i; - - nkbd = kzalloc(sizeof(struct nkbd), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!nkbd || !input_dev) - goto fail1; - - nkbd->serio = serio; - nkbd->dev = input_dev; - snprintf(nkbd->phys, sizeof(nkbd->phys), "%s/input0", serio->phys); - memcpy(nkbd->keycode, nkbd_keycode, sizeof(nkbd->keycode)); - - input_dev->name = "Newton Keyboard"; - input_dev->phys = nkbd->phys; - input_dev->id.bustype = BUS_RS232; - input_dev->id.vendor = SERIO_NEWTON; - input_dev->id.product = 0x0001; - input_dev->id.version = 0x0100; - input_dev->dev.parent = &serio->dev; - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - input_dev->keycode = nkbd->keycode; - input_dev->keycodesize = sizeof(unsigned char); - input_dev->keycodemax = ARRAY_SIZE(nkbd_keycode); - for (i = 0; i < 128; i++) - set_bit(nkbd->keycode[i], input_dev->keybit); - clear_bit(0, input_dev->keybit); - - serio_set_drvdata(serio, nkbd); - - err = serio_open(serio, drv); - if (err) - goto fail2; - - err = input_register_device(nkbd->dev); - if (err) - goto fail3; - - return 0; - - fail3: serio_close(serio); - fail2: serio_set_drvdata(serio, NULL); - fail1: input_free_device(input_dev); - kfree(nkbd); - return err; -} - -static void nkbd_disconnect(struct serio *serio) -{ - struct nkbd *nkbd = serio_get_drvdata(serio); - - serio_close(serio); - serio_set_drvdata(serio, NULL); - input_unregister_device(nkbd->dev); - kfree(nkbd); -} - -static struct serio_device_id nkbd_serio_ids[] = { - { - .type = SERIO_RS232, - .proto = SERIO_NEWTON, - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { 0 } -}; - -MODULE_DEVICE_TABLE(serio, nkbd_serio_ids); - -static struct serio_driver nkbd_drv = { - .driver = { - .name = "newtonkbd", - }, - .description = DRIVER_DESC, - .id_table = nkbd_serio_ids, - .interrupt = nkbd_interrupt, - .connect = nkbd_connect, - .disconnect = nkbd_disconnect, -}; - -static int __init nkbd_init(void) -{ - return serio_register_driver(&nkbd_drv); -} - -static void __exit nkbd_exit(void) -{ - serio_unregister_driver(&nkbd_drv); -} - -module_init(nkbd_init); -module_exit(nkbd_exit); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/nomadik-ske-keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/nomadik-ske-keypad.c deleted file mode 100644 index 101e2459..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/nomadik-ske-keypad.c +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Naveen Kumar G <naveen.gaddipati@stericsson.com> for ST-Ericsson - * Author: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson - * - * License terms:GNU General Public License (GPL) version 2 - * - * Keypad controller driver for the SKE (Scroll Key Encoder) module used in - * the Nomadik 8815 and Ux500 platforms. - */ - -#include <linux/platform_device.h> -#include <linux/interrupt.h> -#include <linux/spinlock.h> -#include <linux/io.h> -#include <linux/delay.h> -#include <linux/input.h> -#include <linux/slab.h> -#include <linux/clk.h> -#include <linux/module.h> - -#include <plat/ske.h> - -/* SKE_CR bits */ -#define SKE_KPMLT (0x1 << 6) -#define SKE_KPCN (0x7 << 3) -#define SKE_KPASEN (0x1 << 2) -#define SKE_KPASON (0x1 << 7) - -/* SKE_IMSC bits */ -#define SKE_KPIMA (0x1 << 2) - -/* SKE_ICR bits */ -#define SKE_KPICS (0x1 << 3) -#define SKE_KPICA (0x1 << 2) - -/* SKE_RIS bits */ -#define SKE_KPRISA (0x1 << 2) - -#define SKE_KEYPAD_ROW_SHIFT 3 -#define SKE_KPD_KEYMAP_SIZE (8 * 8) - -/* keypad auto scan registers */ -#define SKE_ASR0 0x20 -#define SKE_ASR1 0x24 -#define SKE_ASR2 0x28 -#define SKE_ASR3 0x2C - -#define SKE_NUM_ASRX_REGISTERS (4) - -/** - * struct ske_keypad - data structure used by keypad driver - * @irq: irq no - * @reg_base: ske regsiters base address - * @input: pointer to input device object - * @board: keypad platform device - * @keymap: matrix scan code table for keycodes - * @clk: clock structure pointer - */ -struct ske_keypad { - int irq; - void __iomem *reg_base; - struct input_dev *input; - const struct ske_keypad_platform_data *board; - unsigned short keymap[SKE_KPD_KEYMAP_SIZE]; - struct clk *clk; - spinlock_t ske_keypad_lock; -}; - -static void ske_keypad_set_bits(struct ske_keypad *keypad, u16 addr, - u8 mask, u8 data) -{ - u32 ret; - - spin_lock(&keypad->ske_keypad_lock); - - ret = readl(keypad->reg_base + addr); - ret &= ~mask; - ret |= data; - writel(ret, keypad->reg_base + addr); - - spin_unlock(&keypad->ske_keypad_lock); -} - -/* - * ske_keypad_chip_init: init keypad controller configuration - * - * Enable Multi key press detection, auto scan mode - */ -static int __init ske_keypad_chip_init(struct ske_keypad *keypad) -{ - u32 value; - int timeout = 50; - - /* check SKE_RIS to be 0 */ - while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) - cpu_relax(); - - if (!timeout) - return -EINVAL; - - /* - * set debounce value - * keypad dbounce is configured in DBCR[15:8] - * dbounce value in steps of 32/32.768 ms - */ - spin_lock(&keypad->ske_keypad_lock); - value = readl(keypad->reg_base + SKE_DBCR); - value = value & 0xff; - value |= ((keypad->board->debounce_ms * 32000)/32768) << 8; - writel(value, keypad->reg_base + SKE_DBCR); - spin_unlock(&keypad->ske_keypad_lock); - - /* enable multi key detection */ - ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPMLT); - - /* - * set up the number of columns - * KPCN[5:3] defines no. of keypad columns to be auto scanned - */ - value = (keypad->board->kcol - 1) << 3; - ske_keypad_set_bits(keypad, SKE_CR, SKE_KPCN, value); - - /* clear keypad interrupt for auto(and pending SW) scans */ - ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA | SKE_KPICS); - - /* un-mask keypad interrupts */ - ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); - - /* enable automatic scan */ - ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPASEN); - - return 0; -} - -static void ske_keypad_read_data(struct ske_keypad *keypad) -{ - struct input_dev *input = keypad->input; - u16 status; - int col = 0, row = 0, code; - int ske_asr, ske_ris, key_pressed, i; - - /* - * Read the auto scan registers - * - * Each SKE_ASRx (x=0 to x=3) contains two row values. - * lower byte contains row value for column 2*x, - * upper byte contains row value for column 2*x + 1 - */ - for (i = 0; i < SKE_NUM_ASRX_REGISTERS; i++) { - ske_asr = readl(keypad->reg_base + SKE_ASR0 + (4 * i)); - if (!ske_asr) - continue; - - /* now that ASRx is zero, find out the column x and row y*/ - if (ske_asr & 0xff) { - col = i * 2; - status = ske_asr & 0xff; - } else { - col = (i * 2) + 1; - status = (ske_asr & 0xff00) >> 8; - } - - /* find out the row */ - row = __ffs(status); - - code = MATRIX_SCAN_CODE(row, col, SKE_KEYPAD_ROW_SHIFT); - ske_ris = readl(keypad->reg_base + SKE_RIS); - key_pressed = ske_ris & SKE_KPRISA; - - input_event(input, EV_MSC, MSC_SCAN, code); - input_report_key(input, keypad->keymap[code], key_pressed); - input_sync(input); - } -} - -static irqreturn_t ske_keypad_irq(int irq, void *dev_id) -{ - struct ske_keypad *keypad = dev_id; - int retries = 20; - - /* disable auto scan interrupt; mask the interrupt generated */ - ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0); - ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA); - - while ((readl(keypad->reg_base + SKE_CR) & SKE_KPASON) && --retries) - msleep(5); - - if (retries) { - /* SKEx registers are stable and can be read */ - ske_keypad_read_data(keypad); - } - - /* enable auto scan interrupts */ - ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); - - return IRQ_HANDLED; -} - -static int __init ske_keypad_probe(struct platform_device *pdev) -{ - const struct ske_keypad_platform_data *plat = pdev->dev.platform_data; - struct ske_keypad *keypad; - struct input_dev *input; - struct resource *res; - int irq; - int error; - - if (!plat) { - dev_err(&pdev->dev, "invalid keypad platform data\n"); - return -EINVAL; - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "failed to get keypad irq\n"); - return -EINVAL; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "missing platform resources\n"); - return -EINVAL; - } - - keypad = kzalloc(sizeof(struct ske_keypad), GFP_KERNEL); - input = input_allocate_device(); - if (!keypad || !input) { - dev_err(&pdev->dev, "failed to allocate keypad memory\n"); - error = -ENOMEM; - goto err_free_mem; - } - - keypad->irq = irq; - keypad->board = plat; - keypad->input = input; - spin_lock_init(&keypad->ske_keypad_lock); - - if (!request_mem_region(res->start, resource_size(res), pdev->name)) { - dev_err(&pdev->dev, "failed to request I/O memory\n"); - error = -EBUSY; - goto err_free_mem; - } - - keypad->reg_base = ioremap(res->start, resource_size(res)); - if (!keypad->reg_base) { - dev_err(&pdev->dev, "failed to remap I/O memory\n"); - error = -ENXIO; - goto err_free_mem_region; - } - - keypad->clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(keypad->clk)) { - dev_err(&pdev->dev, "failed to get clk\n"); - error = PTR_ERR(keypad->clk); - goto err_iounmap; - } - - input->id.bustype = BUS_HOST; - input->name = "ux500-ske-keypad"; - input->dev.parent = &pdev->dev; - - input->keycode = keypad->keymap; - input->keycodesize = sizeof(keypad->keymap[0]); - input->keycodemax = ARRAY_SIZE(keypad->keymap); - - input_set_capability(input, EV_MSC, MSC_SCAN); - - __set_bit(EV_KEY, input->evbit); - if (!plat->no_autorepeat) - __set_bit(EV_REP, input->evbit); - - matrix_keypad_build_keymap(plat->keymap_data, SKE_KEYPAD_ROW_SHIFT, - input->keycode, input->keybit); - - clk_enable(keypad->clk); - - /* go through board initialization helpers */ - if (keypad->board->init) - keypad->board->init(); - - error = ske_keypad_chip_init(keypad); - if (error) { - dev_err(&pdev->dev, "unable to init keypad hardware\n"); - goto err_clk_disable; - } - - error = request_threaded_irq(keypad->irq, NULL, ske_keypad_irq, - IRQF_ONESHOT, "ske-keypad", keypad); - if (error) { - dev_err(&pdev->dev, "allocate irq %d failed\n", keypad->irq); - goto err_clk_disable; - } - - error = input_register_device(input); - if (error) { - dev_err(&pdev->dev, - "unable to register input device: %d\n", error); - goto err_free_irq; - } - - if (plat->wakeup_enable) - device_init_wakeup(&pdev->dev, true); - - platform_set_drvdata(pdev, keypad); - - return 0; - -err_free_irq: - free_irq(keypad->irq, keypad); -err_clk_disable: - clk_disable(keypad->clk); - clk_put(keypad->clk); -err_iounmap: - iounmap(keypad->reg_base); -err_free_mem_region: - release_mem_region(res->start, resource_size(res)); -err_free_mem: - input_free_device(input); - kfree(keypad); - return error; -} - -static int __devexit ske_keypad_remove(struct platform_device *pdev) -{ - struct ske_keypad *keypad = platform_get_drvdata(pdev); - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - - free_irq(keypad->irq, keypad); - - input_unregister_device(keypad->input); - - clk_disable(keypad->clk); - clk_put(keypad->clk); - - if (keypad->board->exit) - keypad->board->exit(); - - iounmap(keypad->reg_base); - release_mem_region(res->start, resource_size(res)); - kfree(keypad); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int ske_keypad_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct ske_keypad *keypad = platform_get_drvdata(pdev); - int irq = platform_get_irq(pdev, 0); - - if (device_may_wakeup(dev)) - enable_irq_wake(irq); - else - ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0); - - return 0; -} - -static int ske_keypad_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct ske_keypad *keypad = platform_get_drvdata(pdev); - int irq = platform_get_irq(pdev, 0); - - if (device_may_wakeup(dev)) - disable_irq_wake(irq); - else - ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(ske_keypad_dev_pm_ops, - ske_keypad_suspend, ske_keypad_resume); - -static struct platform_driver ske_keypad_driver = { - .driver = { - .name = "nmk-ske-keypad", - .owner = THIS_MODULE, - .pm = &ske_keypad_dev_pm_ops, - }, - .remove = __devexit_p(ske_keypad_remove), -}; - -static int __init ske_keypad_init(void) -{ - return platform_driver_probe(&ske_keypad_driver, ske_keypad_probe); -} -module_init(ske_keypad_init); - -static void __exit ske_keypad_exit(void) -{ - platform_driver_unregister(&ske_keypad_driver); -} -module_exit(ske_keypad_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Naveen Kumar <naveen.gaddipati@stericsson.com> / Sundar Iyer <sundar.iyer@stericsson.com>"); -MODULE_DESCRIPTION("Nomadik Scroll-Key-Encoder Keypad Driver"); -MODULE_ALIAS("platform:nomadik-ske-keypad"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/omap-keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/omap-keypad.c deleted file mode 100644 index 6b630d9d..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/omap-keypad.c +++ /dev/null @@ -1,481 +0,0 @@ -/* - * linux/drivers/input/keyboard/omap-keypad.c - * - * OMAP Keypad Driver - * - * Copyright (C) 2003 Nokia Corporation - * Written by Timo Teräs <ext-timo.teras@nokia.com> - * - * Added support for H2 & H3 Keypad - * Copyright (C) 2004 Texas Instruments - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/types.h> -#include <linux/input.h> -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/platform_device.h> -#include <linux/mutex.h> -#include <linux/errno.h> -#include <linux/slab.h> -#include <asm/gpio.h> -#include <plat/keypad.h> -#include <plat/menelaus.h> -#include <asm/irq.h> -#include <mach/hardware.h> -#include <asm/io.h> -#include <plat/mux.h> - -#undef NEW_BOARD_LEARNING_MODE - -static void omap_kp_tasklet(unsigned long); -static void omap_kp_timer(unsigned long); - -static unsigned char keypad_state[8]; -static DEFINE_MUTEX(kp_enable_mutex); -static int kp_enable = 1; -static int kp_cur_group = -1; - -struct omap_kp { - struct input_dev *input; - struct timer_list timer; - int irq; - unsigned int rows; - unsigned int cols; - unsigned long delay; - unsigned int debounce; -}; - -static DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0); - -static unsigned int *row_gpios; -static unsigned int *col_gpios; - -#ifdef CONFIG_ARCH_OMAP2 -static void set_col_gpio_val(struct omap_kp *omap_kp, u8 value) -{ - int col; - - for (col = 0; col < omap_kp->cols; col++) - gpio_set_value(col_gpios[col], value & (1 << col)); -} - -static u8 get_row_gpio_val(struct omap_kp *omap_kp) -{ - int row; - u8 value = 0; - - for (row = 0; row < omap_kp->rows; row++) { - if (gpio_get_value(row_gpios[row])) - value |= (1 << row); - } - return value; -} -#else -#define set_col_gpio_val(x, y) do {} while (0) -#define get_row_gpio_val(x) 0 -#endif - -static irqreturn_t omap_kp_interrupt(int irq, void *dev_id) -{ - struct omap_kp *omap_kp = dev_id; - - /* disable keyboard interrupt and schedule for handling */ - if (cpu_is_omap24xx()) { - int i; - - for (i = 0; i < omap_kp->rows; i++) { - int gpio_irq = gpio_to_irq(row_gpios[i]); - /* - * The interrupt which we're currently handling should - * be disabled _nosync() to avoid deadlocks waiting - * for this handler to complete. All others should - * be disabled the regular way for SMP safety. - */ - if (gpio_irq == irq) - disable_irq_nosync(gpio_irq); - else - disable_irq(gpio_irq); - } - } else - /* disable keyboard interrupt and schedule for handling */ - omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); - - tasklet_schedule(&kp_tasklet); - - return IRQ_HANDLED; -} - -static void omap_kp_timer(unsigned long data) -{ - tasklet_schedule(&kp_tasklet); -} - -static void omap_kp_scan_keypad(struct omap_kp *omap_kp, unsigned char *state) -{ - int col = 0; - - /* read the keypad status */ - if (cpu_is_omap24xx()) { - /* read the keypad status */ - for (col = 0; col < omap_kp->cols; col++) { - set_col_gpio_val(omap_kp, ~(1 << col)); - state[col] = ~(get_row_gpio_val(omap_kp)) & 0xff; - } - set_col_gpio_val(omap_kp, 0); - - } else { - /* disable keyboard interrupt and schedule for handling */ - omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); - - /* read the keypad status */ - omap_writew(0xff, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC); - for (col = 0; col < omap_kp->cols; col++) { - omap_writew(~(1 << col) & 0xff, - OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC); - - udelay(omap_kp->delay); - - state[col] = ~omap_readw(OMAP1_MPUIO_BASE + - OMAP_MPUIO_KBR_LATCH) & 0xff; - } - omap_writew(0x00, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC); - udelay(2); - } -} - -static void omap_kp_tasklet(unsigned long data) -{ - struct omap_kp *omap_kp_data = (struct omap_kp *) data; - unsigned short *keycodes = omap_kp_data->input->keycode; - unsigned int row_shift = get_count_order(omap_kp_data->cols); - unsigned char new_state[8], changed, key_down = 0; - int col, row; - int spurious = 0; - - /* check for any changes */ - omap_kp_scan_keypad(omap_kp_data, new_state); - - /* check for changes and print those */ - for (col = 0; col < omap_kp_data->cols; col++) { - changed = new_state[col] ^ keypad_state[col]; - key_down |= new_state[col]; - if (changed == 0) - continue; - - for (row = 0; row < omap_kp_data->rows; row++) { - int key; - if (!(changed & (1 << row))) - continue; -#ifdef NEW_BOARD_LEARNING_MODE - printk(KERN_INFO "omap-keypad: key %d-%d %s\n", col, - row, (new_state[col] & (1 << row)) ? - "pressed" : "released"); -#else - key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; - if (key < 0) { - printk(KERN_WARNING - "omap-keypad: Spurious key event %d-%d\n", - col, row); - /* We scan again after a couple of seconds */ - spurious = 1; - continue; - } - - if (!(kp_cur_group == (key & GROUP_MASK) || - kp_cur_group == -1)) - continue; - - kp_cur_group = key & GROUP_MASK; - input_report_key(omap_kp_data->input, key & ~GROUP_MASK, - new_state[col] & (1 << row)); -#endif - } - } - input_sync(omap_kp_data->input); - memcpy(keypad_state, new_state, sizeof(keypad_state)); - - if (key_down) { - int delay = HZ / 20; - /* some key is pressed - keep irq disabled and use timer - * to poll the keypad */ - if (spurious) - delay = 2 * HZ; - mod_timer(&omap_kp_data->timer, jiffies + delay); - } else { - /* enable interrupts */ - if (cpu_is_omap24xx()) { - int i; - for (i = 0; i < omap_kp_data->rows; i++) - enable_irq(gpio_to_irq(row_gpios[i])); - } else { - omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); - kp_cur_group = -1; - } - } -} - -static ssize_t omap_kp_enable_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%u\n", kp_enable); -} - -static ssize_t omap_kp_enable_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - int state; - - if (sscanf(buf, "%u", &state) != 1) - return -EINVAL; - - if ((state != 1) && (state != 0)) - return -EINVAL; - - mutex_lock(&kp_enable_mutex); - if (state != kp_enable) { - if (state) - enable_irq(INT_KEYBOARD); - else - disable_irq(INT_KEYBOARD); - kp_enable = state; - } - mutex_unlock(&kp_enable_mutex); - - return strnlen(buf, count); -} - -static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, omap_kp_enable_show, omap_kp_enable_store); - -#ifdef CONFIG_PM -static int omap_kp_suspend(struct platform_device *dev, pm_message_t state) -{ - /* Nothing yet */ - - return 0; -} - -static int omap_kp_resume(struct platform_device *dev) -{ - /* Nothing yet */ - - return 0; -} -#else -#define omap_kp_suspend NULL -#define omap_kp_resume NULL -#endif - -static int __devinit omap_kp_probe(struct platform_device *pdev) -{ - struct omap_kp *omap_kp; - struct input_dev *input_dev; - struct omap_kp_platform_data *pdata = pdev->dev.platform_data; - int i, col_idx, row_idx, irq_idx, ret; - unsigned int row_shift, keycodemax; - - if (!pdata->rows || !pdata->cols || !pdata->keymap_data) { - printk(KERN_ERR "No rows, cols or keymap_data from pdata\n"); - return -EINVAL; - } - - row_shift = get_count_order(pdata->cols); - keycodemax = pdata->rows << row_shift; - - omap_kp = kzalloc(sizeof(struct omap_kp) + - keycodemax * sizeof(unsigned short), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!omap_kp || !input_dev) { - kfree(omap_kp); - input_free_device(input_dev); - return -ENOMEM; - } - - platform_set_drvdata(pdev, omap_kp); - - omap_kp->input = input_dev; - - /* Disable the interrupt for the MPUIO keyboard */ - if (!cpu_is_omap24xx()) - omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); - - input_dev->keycode = &omap_kp[1]; - input_dev->keycodesize = sizeof(unsigned short); - input_dev->keycodemax = keycodemax; - - if (pdata->rep) - __set_bit(EV_REP, input_dev->evbit); - - if (pdata->delay) - omap_kp->delay = pdata->delay; - - if (pdata->row_gpios && pdata->col_gpios) { - row_gpios = pdata->row_gpios; - col_gpios = pdata->col_gpios; - } - - omap_kp->rows = pdata->rows; - omap_kp->cols = pdata->cols; - - if (cpu_is_omap24xx()) { - /* Cols: outputs */ - for (col_idx = 0; col_idx < omap_kp->cols; col_idx++) { - if (gpio_request(col_gpios[col_idx], "omap_kp_col") < 0) { - printk(KERN_ERR "Failed to request" - "GPIO%d for keypad\n", - col_gpios[col_idx]); - goto err1; - } - gpio_direction_output(col_gpios[col_idx], 0); - } - /* Rows: inputs */ - for (row_idx = 0; row_idx < omap_kp->rows; row_idx++) { - if (gpio_request(row_gpios[row_idx], "omap_kp_row") < 0) { - printk(KERN_ERR "Failed to request" - "GPIO%d for keypad\n", - row_gpios[row_idx]); - goto err2; - } - gpio_direction_input(row_gpios[row_idx]); - } - } else { - col_idx = 0; - row_idx = 0; - } - - setup_timer(&omap_kp->timer, omap_kp_timer, (unsigned long)omap_kp); - - /* get the irq and init timer*/ - tasklet_enable(&kp_tasklet); - kp_tasklet.data = (unsigned long) omap_kp; - - ret = device_create_file(&pdev->dev, &dev_attr_enable); - if (ret < 0) - goto err2; - - /* setup input device */ - __set_bit(EV_KEY, input_dev->evbit); - matrix_keypad_build_keymap(pdata->keymap_data, row_shift, - input_dev->keycode, input_dev->keybit); - input_dev->name = "omap-keypad"; - input_dev->phys = "omap-keypad/input0"; - input_dev->dev.parent = &pdev->dev; - - input_dev->id.bustype = BUS_HOST; - input_dev->id.vendor = 0x0001; - input_dev->id.product = 0x0001; - input_dev->id.version = 0x0100; - - ret = input_register_device(omap_kp->input); - if (ret < 0) { - printk(KERN_ERR "Unable to register omap-keypad input device\n"); - goto err3; - } - - if (pdata->dbounce) - omap_writew(0xff, OMAP1_MPUIO_BASE + OMAP_MPUIO_GPIO_DEBOUNCING); - - /* scan current status and enable interrupt */ - omap_kp_scan_keypad(omap_kp, keypad_state); - if (!cpu_is_omap24xx()) { - omap_kp->irq = platform_get_irq(pdev, 0); - if (omap_kp->irq >= 0) { - if (request_irq(omap_kp->irq, omap_kp_interrupt, 0, - "omap-keypad", omap_kp) < 0) - goto err4; - } - omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); - } else { - for (irq_idx = 0; irq_idx < omap_kp->rows; irq_idx++) { - if (request_irq(gpio_to_irq(row_gpios[irq_idx]), - omap_kp_interrupt, - IRQF_TRIGGER_FALLING, - "omap-keypad", omap_kp) < 0) - goto err5; - } - } - return 0; -err5: - for (i = irq_idx - 1; i >=0; i--) - free_irq(row_gpios[i], omap_kp); -err4: - input_unregister_device(omap_kp->input); - input_dev = NULL; -err3: - device_remove_file(&pdev->dev, &dev_attr_enable); -err2: - for (i = row_idx - 1; i >=0; i--) - gpio_free(row_gpios[i]); -err1: - for (i = col_idx - 1; i >=0; i--) - gpio_free(col_gpios[i]); - - kfree(omap_kp); - input_free_device(input_dev); - - return -EINVAL; -} - -static int __devexit omap_kp_remove(struct platform_device *pdev) -{ - struct omap_kp *omap_kp = platform_get_drvdata(pdev); - - /* disable keypad interrupt handling */ - tasklet_disable(&kp_tasklet); - if (cpu_is_omap24xx()) { - int i; - for (i = 0; i < omap_kp->cols; i++) - gpio_free(col_gpios[i]); - for (i = 0; i < omap_kp->rows; i++) { - gpio_free(row_gpios[i]); - free_irq(gpio_to_irq(row_gpios[i]), omap_kp); - } - } else { - omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); - free_irq(omap_kp->irq, omap_kp); - } - - del_timer_sync(&omap_kp->timer); - tasklet_kill(&kp_tasklet); - - /* unregister everything */ - input_unregister_device(omap_kp->input); - - kfree(omap_kp); - - return 0; -} - -static struct platform_driver omap_kp_driver = { - .probe = omap_kp_probe, - .remove = __devexit_p(omap_kp_remove), - .suspend = omap_kp_suspend, - .resume = omap_kp_resume, - .driver = { - .name = "omap-keypad", - .owner = THIS_MODULE, - }, -}; -module_platform_driver(omap_kp_driver); - -MODULE_AUTHOR("Timo Teräs"); -MODULE_DESCRIPTION("OMAP Keypad Driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:omap-keypad"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/omap4-keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/omap4-keypad.c deleted file mode 100644 index e809ac09..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/omap4-keypad.c +++ /dev/null @@ -1,343 +0,0 @@ -/* - * OMAP4 Keypad Driver - * - * Copyright (C) 2010 Texas Instruments - * - * Author: Abraham Arce <x0066660@ti.com> - * Initial Code: Syed Rafiuddin <rafiuddin.syed@ti.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/platform_device.h> -#include <linux/errno.h> -#include <linux/io.h> -#include <linux/input.h> -#include <linux/slab.h> -#include <linux/pm_runtime.h> - -#include <linux/platform_data/omap4-keypad.h> - -/* OMAP4 registers */ -#define OMAP4_KBD_REVISION 0x00 -#define OMAP4_KBD_SYSCONFIG 0x10 -#define OMAP4_KBD_SYSSTATUS 0x14 -#define OMAP4_KBD_IRQSTATUS 0x18 -#define OMAP4_KBD_IRQENABLE 0x1C -#define OMAP4_KBD_WAKEUPENABLE 0x20 -#define OMAP4_KBD_PENDING 0x24 -#define OMAP4_KBD_CTRL 0x28 -#define OMAP4_KBD_DEBOUNCINGTIME 0x2C -#define OMAP4_KBD_LONGKEYTIME 0x30 -#define OMAP4_KBD_TIMEOUT 0x34 -#define OMAP4_KBD_STATEMACHINE 0x38 -#define OMAP4_KBD_ROWINPUTS 0x3C -#define OMAP4_KBD_COLUMNOUTPUTS 0x40 -#define OMAP4_KBD_FULLCODE31_0 0x44 -#define OMAP4_KBD_FULLCODE63_32 0x48 - -/* OMAP4 bit definitions */ -#define OMAP4_DEF_IRQENABLE_EVENTEN (1 << 0) -#define OMAP4_DEF_IRQENABLE_LONGKEY (1 << 1) -#define OMAP4_DEF_IRQENABLE_TIMEOUTEN (1 << 2) -#define OMAP4_DEF_WUP_EVENT_ENA (1 << 0) -#define OMAP4_DEF_WUP_LONG_KEY_ENA (1 << 1) -#define OMAP4_DEF_CTRL_NOSOFTMODE (1 << 1) -#define OMAP4_DEF_CTRLPTVVALUE (1 << 2) -#define OMAP4_DEF_CTRLPTV (1 << 1) - -/* OMAP4 values */ -#define OMAP4_VAL_IRQDISABLE 0x00 -#define OMAP4_VAL_DEBOUNCINGTIME 0x07 -#define OMAP4_VAL_FUNCTIONALCFG 0x1E - -#define OMAP4_MASK_IRQSTATUSDISABLE 0xFFFF - -struct omap4_keypad { - struct input_dev *input; - - void __iomem *base; - int irq; - - unsigned int rows; - unsigned int cols; - unsigned int row_shift; - unsigned char key_state[8]; - unsigned short keymap[]; -}; - -/* Interrupt handler */ -static irqreturn_t omap4_keypad_interrupt(int irq, void *dev_id) -{ - struct omap4_keypad *keypad_data = dev_id; - struct input_dev *input_dev = keypad_data->input; - unsigned char key_state[ARRAY_SIZE(keypad_data->key_state)]; - unsigned int col, row, code, changed; - u32 *new_state = (u32 *) key_state; - - /* Disable interrupts */ - __raw_writel(OMAP4_VAL_IRQDISABLE, - keypad_data->base + OMAP4_KBD_IRQENABLE); - - *new_state = __raw_readl(keypad_data->base + OMAP4_KBD_FULLCODE31_0); - *(new_state + 1) = __raw_readl(keypad_data->base - + OMAP4_KBD_FULLCODE63_32); - - for (row = 0; row < keypad_data->rows; row++) { - changed = key_state[row] ^ keypad_data->key_state[row]; - if (!changed) - continue; - - for (col = 0; col < keypad_data->cols; col++) { - if (changed & (1 << col)) { - code = MATRIX_SCAN_CODE(row, col, - keypad_data->row_shift); - input_event(input_dev, EV_MSC, MSC_SCAN, code); - input_report_key(input_dev, - keypad_data->keymap[code], - key_state[row] & (1 << col)); - } - } - } - - input_sync(input_dev); - - memcpy(keypad_data->key_state, key_state, - sizeof(keypad_data->key_state)); - - /* clear pending interrupts */ - __raw_writel(__raw_readl(keypad_data->base + OMAP4_KBD_IRQSTATUS), - keypad_data->base + OMAP4_KBD_IRQSTATUS); - - /* enable interrupts */ - __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY, - keypad_data->base + OMAP4_KBD_IRQENABLE); - - return IRQ_HANDLED; -} - -static int omap4_keypad_open(struct input_dev *input) -{ - struct omap4_keypad *keypad_data = input_get_drvdata(input); - - pm_runtime_get_sync(input->dev.parent); - - disable_irq(keypad_data->irq); - - __raw_writel(OMAP4_VAL_FUNCTIONALCFG, - keypad_data->base + OMAP4_KBD_CTRL); - __raw_writel(OMAP4_VAL_DEBOUNCINGTIME, - keypad_data->base + OMAP4_KBD_DEBOUNCINGTIME); - __raw_writel(OMAP4_VAL_IRQDISABLE, - keypad_data->base + OMAP4_KBD_IRQSTATUS); - __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY, - keypad_data->base + OMAP4_KBD_IRQENABLE); - __raw_writel(OMAP4_DEF_WUP_EVENT_ENA | OMAP4_DEF_WUP_LONG_KEY_ENA, - keypad_data->base + OMAP4_KBD_WAKEUPENABLE); - - enable_irq(keypad_data->irq); - - return 0; -} - -static void omap4_keypad_close(struct input_dev *input) -{ - struct omap4_keypad *keypad_data = input_get_drvdata(input); - - disable_irq(keypad_data->irq); - - /* Disable interrupts */ - __raw_writel(OMAP4_VAL_IRQDISABLE, - keypad_data->base + OMAP4_KBD_IRQENABLE); - - /* clear pending interrupts */ - __raw_writel(__raw_readl(keypad_data->base + OMAP4_KBD_IRQSTATUS), - keypad_data->base + OMAP4_KBD_IRQSTATUS); - - enable_irq(keypad_data->irq); - - pm_runtime_put_sync(input->dev.parent); -} - -static int __devinit omap4_keypad_probe(struct platform_device *pdev) -{ - const struct omap4_keypad_platform_data *pdata; - struct omap4_keypad *keypad_data; - struct input_dev *input_dev; - struct resource *res; - resource_size_t size; - unsigned int row_shift, max_keys; - int irq; - int error; - - /* platform data */ - pdata = pdev->dev.platform_data; - if (!pdata) { - dev_err(&pdev->dev, "no platform data defined\n"); - return -EINVAL; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "no base address specified\n"); - return -EINVAL; - } - - irq = platform_get_irq(pdev, 0); - if (!irq) { - dev_err(&pdev->dev, "no keyboard irq assigned\n"); - return -EINVAL; - } - - if (!pdata->keymap_data) { - dev_err(&pdev->dev, "no keymap data defined\n"); - return -EINVAL; - } - - row_shift = get_count_order(pdata->cols); - max_keys = pdata->rows << row_shift; - - keypad_data = kzalloc(sizeof(struct omap4_keypad) + - max_keys * sizeof(keypad_data->keymap[0]), - GFP_KERNEL); - if (!keypad_data) { - dev_err(&pdev->dev, "keypad_data memory allocation failed\n"); - return -ENOMEM; - } - - size = resource_size(res); - - res = request_mem_region(res->start, size, pdev->name); - if (!res) { - dev_err(&pdev->dev, "can't request mem region\n"); - error = -EBUSY; - goto err_free_keypad; - } - - keypad_data->base = ioremap(res->start, resource_size(res)); - if (!keypad_data->base) { - dev_err(&pdev->dev, "can't ioremap mem resource\n"); - error = -ENOMEM; - goto err_release_mem; - } - - keypad_data->irq = irq; - keypad_data->row_shift = row_shift; - keypad_data->rows = pdata->rows; - keypad_data->cols = pdata->cols; - - /* input device allocation */ - keypad_data->input = input_dev = input_allocate_device(); - if (!input_dev) { - error = -ENOMEM; - goto err_unmap; - } - - input_dev->name = pdev->name; - input_dev->dev.parent = &pdev->dev; - input_dev->id.bustype = BUS_HOST; - input_dev->id.vendor = 0x0001; - input_dev->id.product = 0x0001; - input_dev->id.version = 0x0001; - - input_dev->open = omap4_keypad_open; - input_dev->close = omap4_keypad_close; - - input_dev->keycode = keypad_data->keymap; - input_dev->keycodesize = sizeof(keypad_data->keymap[0]); - input_dev->keycodemax = max_keys; - - __set_bit(EV_KEY, input_dev->evbit); - __set_bit(EV_REP, input_dev->evbit); - - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - - input_set_drvdata(input_dev, keypad_data); - - matrix_keypad_build_keymap(pdata->keymap_data, row_shift, - input_dev->keycode, input_dev->keybit); - - error = request_irq(keypad_data->irq, omap4_keypad_interrupt, - IRQF_TRIGGER_RISING, - "omap4-keypad", keypad_data); - if (error) { - dev_err(&pdev->dev, "failed to register interrupt\n"); - goto err_free_input; - } - - pm_runtime_enable(&pdev->dev); - - error = input_register_device(keypad_data->input); - if (error < 0) { - dev_err(&pdev->dev, "failed to register input device\n"); - goto err_pm_disable; - } - - platform_set_drvdata(pdev, keypad_data); - return 0; - -err_pm_disable: - pm_runtime_disable(&pdev->dev); - free_irq(keypad_data->irq, keypad_data); -err_free_input: - input_free_device(input_dev); -err_unmap: - iounmap(keypad_data->base); -err_release_mem: - release_mem_region(res->start, size); -err_free_keypad: - kfree(keypad_data); - return error; -} - -static int __devexit omap4_keypad_remove(struct platform_device *pdev) -{ - struct omap4_keypad *keypad_data = platform_get_drvdata(pdev); - struct resource *res; - - free_irq(keypad_data->irq, keypad_data); - - pm_runtime_disable(&pdev->dev); - - input_unregister_device(keypad_data->input); - - iounmap(keypad_data->base); - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(res->start, resource_size(res)); - - kfree(keypad_data); - platform_set_drvdata(pdev, NULL); - - return 0; -} - -static struct platform_driver omap4_keypad_driver = { - .probe = omap4_keypad_probe, - .remove = __devexit_p(omap4_keypad_remove), - .driver = { - .name = "omap4-keypad", - .owner = THIS_MODULE, - }, -}; -module_platform_driver(omap4_keypad_driver); - -MODULE_AUTHOR("Texas Instruments"); -MODULE_DESCRIPTION("OMAP4 Keypad Driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:omap4-keypad"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/opencores-kbd.c b/ANDROID_3.4.5/drivers/input/keyboard/opencores-kbd.c deleted file mode 100644 index abe728c7..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/opencores-kbd.c +++ /dev/null @@ -1,170 +0,0 @@ -/* - * OpenCores Keyboard Controller Driver - * http://www.opencores.org/project,keyboardcontroller - * - * Copyright 2007-2009 HV Sistemas S.L. - * - * Licensed under the GPL-2 or later. - */ - -#include <linux/input.h> -#include <linux/interrupt.h> -#include <linux/io.h> -#include <linux/ioport.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/slab.h> - -struct opencores_kbd { - struct input_dev *input; - struct resource *addr_res; - void __iomem *addr; - int irq; - unsigned short keycodes[128]; -}; - -static irqreturn_t opencores_kbd_isr(int irq, void *dev_id) -{ - struct opencores_kbd *opencores_kbd = dev_id; - struct input_dev *input = opencores_kbd->input; - unsigned char c; - - c = readb(opencores_kbd->addr); - input_report_key(input, c & 0x7f, c & 0x80 ? 0 : 1); - input_sync(input); - - return IRQ_HANDLED; -} - -static int __devinit opencores_kbd_probe(struct platform_device *pdev) -{ - struct input_dev *input; - struct opencores_kbd *opencores_kbd; - struct resource *res; - int irq, i, error; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "missing board memory resource\n"); - return -EINVAL; - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "missing board IRQ resource\n"); - return -EINVAL; - } - - opencores_kbd = kzalloc(sizeof(*opencores_kbd), GFP_KERNEL); - input = input_allocate_device(); - if (!opencores_kbd || !input) { - dev_err(&pdev->dev, "failed to allocate device structures\n"); - error = -ENOMEM; - goto err_free_mem; - } - - opencores_kbd->addr_res = res; - res = request_mem_region(res->start, resource_size(res), pdev->name); - if (!res) { - dev_err(&pdev->dev, "failed to request I/O memory\n"); - error = -EBUSY; - goto err_free_mem; - } - - opencores_kbd->addr = ioremap(res->start, resource_size(res)); - if (!opencores_kbd->addr) { - dev_err(&pdev->dev, "failed to remap I/O memory\n"); - error = -ENXIO; - goto err_rel_mem; - } - - opencores_kbd->input = input; - opencores_kbd->irq = irq; - - input->name = pdev->name; - input->phys = "opencores-kbd/input0"; - input->dev.parent = &pdev->dev; - - input_set_drvdata(input, opencores_kbd); - - input->id.bustype = BUS_HOST; - input->id.vendor = 0x0001; - input->id.product = 0x0001; - input->id.version = 0x0100; - - input->keycode = opencores_kbd->keycodes; - input->keycodesize = sizeof(opencores_kbd->keycodes[0]); - input->keycodemax = ARRAY_SIZE(opencores_kbd->keycodes); - - __set_bit(EV_KEY, input->evbit); - - for (i = 0; i < ARRAY_SIZE(opencores_kbd->keycodes); i++) { - /* - * OpenCores controller happens to have scancodes match - * our KEY_* definitions. - */ - opencores_kbd->keycodes[i] = i; - __set_bit(opencores_kbd->keycodes[i], input->keybit); - } - __clear_bit(KEY_RESERVED, input->keybit); - - error = request_irq(irq, &opencores_kbd_isr, - IRQF_TRIGGER_RISING, pdev->name, opencores_kbd); - if (error) { - dev_err(&pdev->dev, "unable to claim irq %d\n", irq); - goto err_unmap_mem; - } - - error = input_register_device(input); - if (error) { - dev_err(&pdev->dev, "unable to register input device\n"); - goto err_free_irq; - } - - platform_set_drvdata(pdev, opencores_kbd); - - return 0; - - err_free_irq: - free_irq(irq, opencores_kbd); - err_unmap_mem: - iounmap(opencores_kbd->addr); - err_rel_mem: - release_mem_region(res->start, resource_size(res)); - err_free_mem: - input_free_device(input); - kfree(opencores_kbd); - - return error; -} - -static int __devexit opencores_kbd_remove(struct platform_device *pdev) -{ - struct opencores_kbd *opencores_kbd = platform_get_drvdata(pdev); - - free_irq(opencores_kbd->irq, opencores_kbd); - - iounmap(opencores_kbd->addr); - release_mem_region(opencores_kbd->addr_res->start, - resource_size(opencores_kbd->addr_res)); - input_unregister_device(opencores_kbd->input); - kfree(opencores_kbd); - - platform_set_drvdata(pdev, NULL); - - return 0; -} - -static struct platform_driver opencores_kbd_device_driver = { - .probe = opencores_kbd_probe, - .remove = __devexit_p(opencores_kbd_remove), - .driver = { - .name = "opencores-kbd", - }, -}; -module_platform_driver(opencores_kbd_device_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Javier Herrero <jherrero@hvsistemas.es>"); -MODULE_DESCRIPTION("Keyboard driver for OpenCores Keyboard Controller"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/pmic8xxx-keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/pmic8xxx-keypad.c deleted file mode 100644 index 01a1c9f8..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/pmic8xxx-keypad.c +++ /dev/null @@ -1,789 +0,0 @@ -/* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only 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. - */ - -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/kernel.h> -#include <linux/interrupt.h> -#include <linux/slab.h> -#include <linux/input.h> -#include <linux/bitops.h> -#include <linux/delay.h> -#include <linux/mutex.h> - -#include <linux/mfd/pm8xxx/core.h> -#include <linux/mfd/pm8xxx/gpio.h> -#include <linux/input/pmic8xxx-keypad.h> - -#define PM8XXX_MAX_ROWS 18 -#define PM8XXX_MAX_COLS 8 -#define PM8XXX_ROW_SHIFT 3 -#define PM8XXX_MATRIX_MAX_SIZE (PM8XXX_MAX_ROWS * PM8XXX_MAX_COLS) - -#define PM8XXX_MIN_ROWS 5 -#define PM8XXX_MIN_COLS 5 - -#define MAX_SCAN_DELAY 128 -#define MIN_SCAN_DELAY 1 - -/* in nanoseconds */ -#define MAX_ROW_HOLD_DELAY 122000 -#define MIN_ROW_HOLD_DELAY 30500 - -#define MAX_DEBOUNCE_TIME 20 -#define MIN_DEBOUNCE_TIME 5 - -#define KEYP_CTRL 0x148 - -#define KEYP_CTRL_EVNTS BIT(0) -#define KEYP_CTRL_EVNTS_MASK 0x3 - -#define KEYP_CTRL_SCAN_COLS_SHIFT 5 -#define KEYP_CTRL_SCAN_COLS_MIN 5 -#define KEYP_CTRL_SCAN_COLS_BITS 0x3 - -#define KEYP_CTRL_SCAN_ROWS_SHIFT 2 -#define KEYP_CTRL_SCAN_ROWS_MIN 5 -#define KEYP_CTRL_SCAN_ROWS_BITS 0x7 - -#define KEYP_CTRL_KEYP_EN BIT(7) - -#define KEYP_SCAN 0x149 - -#define KEYP_SCAN_READ_STATE BIT(0) -#define KEYP_SCAN_DBOUNCE_SHIFT 1 -#define KEYP_SCAN_PAUSE_SHIFT 3 -#define KEYP_SCAN_ROW_HOLD_SHIFT 6 - -#define KEYP_TEST 0x14A - -#define KEYP_TEST_CLEAR_RECENT_SCAN BIT(6) -#define KEYP_TEST_CLEAR_OLD_SCAN BIT(5) -#define KEYP_TEST_READ_RESET BIT(4) -#define KEYP_TEST_DTEST_EN BIT(3) -#define KEYP_TEST_ABORT_READ BIT(0) - -#define KEYP_TEST_DBG_SELECT_SHIFT 1 - -/* bits of these registers represent - * '0' for key press - * '1' for key release - */ -#define KEYP_RECENT_DATA 0x14B -#define KEYP_OLD_DATA 0x14C - -#define KEYP_CLOCK_FREQ 32768 - -/** - * struct pmic8xxx_kp - internal keypad data structure - * @pdata - keypad platform data pointer - * @input - input device pointer for keypad - * @key_sense_irq - key press/release irq number - * @key_stuck_irq - key stuck notification irq number - * @keycodes - array to hold the key codes - * @dev - parent device pointer - * @keystate - present key press/release state - * @stuckstate - present state when key stuck irq - * @ctrl_reg - control register value - */ -struct pmic8xxx_kp { - const struct pm8xxx_keypad_platform_data *pdata; - struct input_dev *input; - int key_sense_irq; - int key_stuck_irq; - - unsigned short keycodes[PM8XXX_MATRIX_MAX_SIZE]; - - struct device *dev; - u16 keystate[PM8XXX_MAX_ROWS]; - u16 stuckstate[PM8XXX_MAX_ROWS]; - - u8 ctrl_reg; -}; - -static int pmic8xxx_kp_write_u8(struct pmic8xxx_kp *kp, - u8 data, u16 reg) -{ - int rc; - - rc = pm8xxx_writeb(kp->dev->parent, reg, data); - return rc; -} - -static int pmic8xxx_kp_read(struct pmic8xxx_kp *kp, - u8 *data, u16 reg, unsigned num_bytes) -{ - int rc; - - rc = pm8xxx_read_buf(kp->dev->parent, reg, data, num_bytes); - return rc; -} - -static int pmic8xxx_kp_read_u8(struct pmic8xxx_kp *kp, - u8 *data, u16 reg) -{ - int rc; - - rc = pmic8xxx_kp_read(kp, data, reg, 1); - return rc; -} - -static u8 pmic8xxx_col_state(struct pmic8xxx_kp *kp, u8 col) -{ - /* all keys pressed on that particular row? */ - if (col == 0x00) - return 1 << kp->pdata->num_cols; - else - return col & ((1 << kp->pdata->num_cols) - 1); -} - -/* - * Synchronous read protocol for RevB0 onwards: - * - * 1. Write '1' to ReadState bit in KEYP_SCAN register - * 2. Wait 2*32KHz clocks, so that HW can successfully enter read mode - * synchronously - * 3. Read rows in old array first if events are more than one - * 4. Read rows in recent array - * 5. Wait 4*32KHz clocks - * 6. Write '0' to ReadState bit of KEYP_SCAN register so that hw can - * synchronously exit read mode. - */ -static int pmic8xxx_chk_sync_read(struct pmic8xxx_kp *kp) -{ - int rc; - u8 scan_val; - - rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN); - if (rc < 0) { - dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc); - return rc; - } - - scan_val |= 0x1; - - rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); - if (rc < 0) { - dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); - return rc; - } - - /* 2 * 32KHz clocks */ - udelay((2 * DIV_ROUND_UP(USEC_PER_SEC, KEYP_CLOCK_FREQ)) + 1); - - return rc; -} - -static int pmic8xxx_kp_read_data(struct pmic8xxx_kp *kp, u16 *state, - u16 data_reg, int read_rows) -{ - int rc, row; - u8 new_data[PM8XXX_MAX_ROWS]; - - rc = pmic8xxx_kp_read(kp, new_data, data_reg, read_rows); - if (rc) - return rc; - - for (row = 0; row < kp->pdata->num_rows; row++) { - dev_dbg(kp->dev, "new_data[%d] = %d\n", row, - new_data[row]); - state[row] = pmic8xxx_col_state(kp, new_data[row]); - } - - return rc; -} - -static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state, - u16 *old_state) -{ - int rc, read_rows; - u8 scan_val; - - if (kp->pdata->num_rows < PM8XXX_MIN_ROWS) - read_rows = PM8XXX_MIN_ROWS; - else - read_rows = kp->pdata->num_rows; - - pmic8xxx_chk_sync_read(kp); - - if (old_state) { - rc = pmic8xxx_kp_read_data(kp, old_state, KEYP_OLD_DATA, - read_rows); - if (rc < 0) { - dev_err(kp->dev, - "Error reading KEYP_OLD_DATA, rc=%d\n", rc); - return rc; - } - } - - rc = pmic8xxx_kp_read_data(kp, new_state, KEYP_RECENT_DATA, - read_rows); - if (rc < 0) { - dev_err(kp->dev, - "Error reading KEYP_RECENT_DATA, rc=%d\n", rc); - return rc; - } - - /* 4 * 32KHz clocks */ - udelay((4 * DIV_ROUND_UP(USEC_PER_SEC, KEYP_CLOCK_FREQ)) + 1); - - rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN); - if (rc < 0) { - dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc); - return rc; - } - - scan_val &= 0xFE; - rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); - if (rc < 0) - dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); - - return rc; -} - -static void __pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp *kp, u16 *new_state, - u16 *old_state) -{ - int row, col, code; - - for (row = 0; row < kp->pdata->num_rows; row++) { - int bits_changed = new_state[row] ^ old_state[row]; - - if (!bits_changed) - continue; - - for (col = 0; col < kp->pdata->num_cols; col++) { - if (!(bits_changed & (1 << col))) - continue; - - dev_dbg(kp->dev, "key [%d:%d] %s\n", row, col, - !(new_state[row] & (1 << col)) ? - "pressed" : "released"); - - code = MATRIX_SCAN_CODE(row, col, PM8XXX_ROW_SHIFT); - - input_event(kp->input, EV_MSC, MSC_SCAN, code); - input_report_key(kp->input, - kp->keycodes[code], - !(new_state[row] & (1 << col))); - - input_sync(kp->input); - } - } -} - -static bool pmic8xxx_detect_ghost_keys(struct pmic8xxx_kp *kp, u16 *new_state) -{ - int row, found_first = -1; - u16 check, row_state; - - check = 0; - for (row = 0; row < kp->pdata->num_rows; row++) { - row_state = (~new_state[row]) & - ((1 << kp->pdata->num_cols) - 1); - - if (hweight16(row_state) > 1) { - if (found_first == -1) - found_first = row; - if (check & row_state) { - dev_dbg(kp->dev, "detected ghost key on row[%d]" - " and row[%d]\n", found_first, row); - return true; - } - } - check |= row_state; - } - return false; -} - -static int pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp *kp, unsigned int events) -{ - u16 new_state[PM8XXX_MAX_ROWS]; - u16 old_state[PM8XXX_MAX_ROWS]; - int rc; - - switch (events) { - case 0x1: - rc = pmic8xxx_kp_read_matrix(kp, new_state, NULL); - if (rc < 0) - return rc; - - /* detecting ghost key is not an error */ - if (pmic8xxx_detect_ghost_keys(kp, new_state)) - return 0; - __pmic8xxx_kp_scan_matrix(kp, new_state, kp->keystate); - memcpy(kp->keystate, new_state, sizeof(new_state)); - break; - case 0x3: /* two events - eventcounter is gray-coded */ - rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); - if (rc < 0) - return rc; - - __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); - __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); - memcpy(kp->keystate, new_state, sizeof(new_state)); - break; - case 0x2: - dev_dbg(kp->dev, "Some key events were lost\n"); - rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); - if (rc < 0) - return rc; - __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); - __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); - memcpy(kp->keystate, new_state, sizeof(new_state)); - break; - default: - rc = -EINVAL; - } - return rc; -} - -/* - * NOTE: We are reading recent and old data registers blindly - * whenever key-stuck interrupt happens, because events counter doesn't - * get updated when this interrupt happens due to key stuck doesn't get - * considered as key state change. - * - * We are not using old data register contents after they are being read - * because it might report the key which was pressed before the key being stuck - * as stuck key because it's pressed status is stored in the old data - * register. - */ -static irqreturn_t pmic8xxx_kp_stuck_irq(int irq, void *data) -{ - u16 new_state[PM8XXX_MAX_ROWS]; - u16 old_state[PM8XXX_MAX_ROWS]; - int rc; - struct pmic8xxx_kp *kp = data; - - rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); - if (rc < 0) { - dev_err(kp->dev, "failed to read keypad matrix\n"); - return IRQ_HANDLED; - } - - __pmic8xxx_kp_scan_matrix(kp, new_state, kp->stuckstate); - - return IRQ_HANDLED; -} - -static irqreturn_t pmic8xxx_kp_irq(int irq, void *data) -{ - struct pmic8xxx_kp *kp = data; - u8 ctrl_val, events; - int rc; - - rc = pmic8xxx_kp_read(kp, &ctrl_val, KEYP_CTRL, 1); - if (rc < 0) { - dev_err(kp->dev, "failed to read keyp_ctrl register\n"); - return IRQ_HANDLED; - } - - events = ctrl_val & KEYP_CTRL_EVNTS_MASK; - - rc = pmic8xxx_kp_scan_matrix(kp, events); - if (rc < 0) - dev_err(kp->dev, "failed to scan matrix\n"); - - return IRQ_HANDLED; -} - -static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp) -{ - int bits, rc, cycles; - u8 scan_val = 0, ctrl_val = 0; - static const u8 row_bits[] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, - }; - - /* Find column bits */ - if (kp->pdata->num_cols < KEYP_CTRL_SCAN_COLS_MIN) - bits = 0; - else - bits = kp->pdata->num_cols - KEYP_CTRL_SCAN_COLS_MIN; - ctrl_val = (bits & KEYP_CTRL_SCAN_COLS_BITS) << - KEYP_CTRL_SCAN_COLS_SHIFT; - - /* Find row bits */ - if (kp->pdata->num_rows < KEYP_CTRL_SCAN_ROWS_MIN) - bits = 0; - else - bits = row_bits[kp->pdata->num_rows - KEYP_CTRL_SCAN_ROWS_MIN]; - - ctrl_val |= (bits << KEYP_CTRL_SCAN_ROWS_SHIFT); - - rc = pmic8xxx_kp_write_u8(kp, ctrl_val, KEYP_CTRL); - if (rc < 0) { - dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc); - return rc; - } - - bits = (kp->pdata->debounce_ms / 5) - 1; - - scan_val |= (bits << KEYP_SCAN_DBOUNCE_SHIFT); - - bits = fls(kp->pdata->scan_delay_ms) - 1; - scan_val |= (bits << KEYP_SCAN_PAUSE_SHIFT); - - /* Row hold time is a multiple of 32KHz cycles. */ - cycles = (kp->pdata->row_hold_ns * KEYP_CLOCK_FREQ) / NSEC_PER_SEC; - - scan_val |= (cycles << KEYP_SCAN_ROW_HOLD_SHIFT); - - rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); - if (rc) - dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); - - return rc; - -} - -static int __devinit pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios, - struct pmic8xxx_kp *kp, struct pm_gpio *gpio_config) -{ - int rc, i; - - if (gpio_start < 0 || num_gpios < 0) - return -EINVAL; - - for (i = 0; i < num_gpios; i++) { - rc = pm8xxx_gpio_config(gpio_start + i, gpio_config); - if (rc) { - dev_err(kp->dev, "%s: FAIL pm8xxx_gpio_config():" - "for PM GPIO [%d] rc=%d.\n", - __func__, gpio_start + i, rc); - return rc; - } - } - - return 0; -} - -static int pmic8xxx_kp_enable(struct pmic8xxx_kp *kp) -{ - int rc; - - kp->ctrl_reg |= KEYP_CTRL_KEYP_EN; - - rc = pmic8xxx_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL); - if (rc < 0) - dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc); - - return rc; -} - -static int pmic8xxx_kp_disable(struct pmic8xxx_kp *kp) -{ - int rc; - - kp->ctrl_reg &= ~KEYP_CTRL_KEYP_EN; - - rc = pmic8xxx_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL); - if (rc < 0) - return rc; - - return rc; -} - -static int pmic8xxx_kp_open(struct input_dev *dev) -{ - struct pmic8xxx_kp *kp = input_get_drvdata(dev); - - return pmic8xxx_kp_enable(kp); -} - -static void pmic8xxx_kp_close(struct input_dev *dev) -{ - struct pmic8xxx_kp *kp = input_get_drvdata(dev); - - pmic8xxx_kp_disable(kp); -} - -/* - * keypad controller should be initialized in the following sequence - * only, otherwise it might get into FSM stuck state. - * - * - Initialize keypad control parameters, like no. of rows, columns, - * timing values etc., - * - configure rows and column gpios pull up/down. - * - set irq edge type. - * - enable the keypad controller. - */ -static int __devinit pmic8xxx_kp_probe(struct platform_device *pdev) -{ - const struct pm8xxx_keypad_platform_data *pdata = - dev_get_platdata(&pdev->dev); - const struct matrix_keymap_data *keymap_data; - struct pmic8xxx_kp *kp; - int rc; - u8 ctrl_val; - - struct pm_gpio kypd_drv = { - .direction = PM_GPIO_DIR_OUT, - .output_buffer = PM_GPIO_OUT_BUF_OPEN_DRAIN, - .output_value = 0, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM_GPIO_VIN_S3, - .out_strength = PM_GPIO_STRENGTH_LOW, - .function = PM_GPIO_FUNC_1, - .inv_int_pol = 1, - }; - - struct pm_gpio kypd_sns = { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_UP_31P5, - .vin_sel = PM_GPIO_VIN_S3, - .out_strength = PM_GPIO_STRENGTH_NO, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 1, - }; - - - if (!pdata || !pdata->num_cols || !pdata->num_rows || - pdata->num_cols > PM8XXX_MAX_COLS || - pdata->num_rows > PM8XXX_MAX_ROWS || - pdata->num_cols < PM8XXX_MIN_COLS) { - dev_err(&pdev->dev, "invalid platform data\n"); - return -EINVAL; - } - - if (!pdata->scan_delay_ms || - pdata->scan_delay_ms > MAX_SCAN_DELAY || - pdata->scan_delay_ms < MIN_SCAN_DELAY || - !is_power_of_2(pdata->scan_delay_ms)) { - dev_err(&pdev->dev, "invalid keypad scan time supplied\n"); - return -EINVAL; - } - - if (!pdata->row_hold_ns || - pdata->row_hold_ns > MAX_ROW_HOLD_DELAY || - pdata->row_hold_ns < MIN_ROW_HOLD_DELAY || - ((pdata->row_hold_ns % MIN_ROW_HOLD_DELAY) != 0)) { - dev_err(&pdev->dev, "invalid keypad row hold time supplied\n"); - return -EINVAL; - } - - if (!pdata->debounce_ms || - ((pdata->debounce_ms % 5) != 0) || - pdata->debounce_ms > MAX_DEBOUNCE_TIME || - pdata->debounce_ms < MIN_DEBOUNCE_TIME) { - dev_err(&pdev->dev, "invalid debounce time supplied\n"); - return -EINVAL; - } - - keymap_data = pdata->keymap_data; - if (!keymap_data) { - dev_err(&pdev->dev, "no keymap data supplied\n"); - return -EINVAL; - } - - kp = kzalloc(sizeof(*kp), GFP_KERNEL); - if (!kp) - return -ENOMEM; - - platform_set_drvdata(pdev, kp); - - kp->pdata = pdata; - kp->dev = &pdev->dev; - - kp->input = input_allocate_device(); - if (!kp->input) { - dev_err(&pdev->dev, "unable to allocate input device\n"); - rc = -ENOMEM; - goto err_alloc_device; - } - - kp->key_sense_irq = platform_get_irq(pdev, 0); - if (kp->key_sense_irq < 0) { - dev_err(&pdev->dev, "unable to get keypad sense irq\n"); - rc = -ENXIO; - goto err_get_irq; - } - - kp->key_stuck_irq = platform_get_irq(pdev, 1); - if (kp->key_stuck_irq < 0) { - dev_err(&pdev->dev, "unable to get keypad stuck irq\n"); - rc = -ENXIO; - goto err_get_irq; - } - - kp->input->name = pdata->input_name ? : "PMIC8XXX keypad"; - kp->input->phys = pdata->input_phys_device ? : "pmic8xxx_keypad/input0"; - - kp->input->dev.parent = &pdev->dev; - - kp->input->id.bustype = BUS_I2C; - kp->input->id.version = 0x0001; - kp->input->id.product = 0x0001; - kp->input->id.vendor = 0x0001; - - kp->input->evbit[0] = BIT_MASK(EV_KEY); - - if (pdata->rep) - __set_bit(EV_REP, kp->input->evbit); - - kp->input->keycode = kp->keycodes; - kp->input->keycodemax = PM8XXX_MATRIX_MAX_SIZE; - kp->input->keycodesize = sizeof(kp->keycodes); - kp->input->open = pmic8xxx_kp_open; - kp->input->close = pmic8xxx_kp_close; - - matrix_keypad_build_keymap(keymap_data, PM8XXX_ROW_SHIFT, - kp->input->keycode, kp->input->keybit); - - input_set_capability(kp->input, EV_MSC, MSC_SCAN); - input_set_drvdata(kp->input, kp); - - /* initialize keypad state */ - memset(kp->keystate, 0xff, sizeof(kp->keystate)); - memset(kp->stuckstate, 0xff, sizeof(kp->stuckstate)); - - rc = pmic8xxx_kpd_init(kp); - if (rc < 0) { - dev_err(&pdev->dev, "unable to initialize keypad controller\n"); - goto err_get_irq; - } - - rc = pmic8xxx_kp_config_gpio(pdata->cols_gpio_start, - pdata->num_cols, kp, &kypd_sns); - if (rc < 0) { - dev_err(&pdev->dev, "unable to configure keypad sense lines\n"); - goto err_gpio_config; - } - - rc = pmic8xxx_kp_config_gpio(pdata->rows_gpio_start, - pdata->num_rows, kp, &kypd_drv); - if (rc < 0) { - dev_err(&pdev->dev, "unable to configure keypad drive lines\n"); - goto err_gpio_config; - } - - rc = request_any_context_irq(kp->key_sense_irq, pmic8xxx_kp_irq, - IRQF_TRIGGER_RISING, "pmic-keypad", kp); - if (rc < 0) { - dev_err(&pdev->dev, "failed to request keypad sense irq\n"); - goto err_get_irq; - } - - rc = request_any_context_irq(kp->key_stuck_irq, pmic8xxx_kp_stuck_irq, - IRQF_TRIGGER_RISING, "pmic-keypad-stuck", kp); - if (rc < 0) { - dev_err(&pdev->dev, "failed to request keypad stuck irq\n"); - goto err_req_stuck_irq; - } - - rc = pmic8xxx_kp_read_u8(kp, &ctrl_val, KEYP_CTRL); - if (rc < 0) { - dev_err(&pdev->dev, "failed to read KEYP_CTRL register\n"); - goto err_pmic_reg_read; - } - - kp->ctrl_reg = ctrl_val; - - rc = input_register_device(kp->input); - if (rc < 0) { - dev_err(&pdev->dev, "unable to register keypad input device\n"); - goto err_pmic_reg_read; - } - - device_init_wakeup(&pdev->dev, pdata->wakeup); - - return 0; - -err_pmic_reg_read: - free_irq(kp->key_stuck_irq, kp); -err_req_stuck_irq: - free_irq(kp->key_sense_irq, kp); -err_gpio_config: -err_get_irq: - input_free_device(kp->input); -err_alloc_device: - platform_set_drvdata(pdev, NULL); - kfree(kp); - return rc; -} - -static int __devexit pmic8xxx_kp_remove(struct platform_device *pdev) -{ - struct pmic8xxx_kp *kp = platform_get_drvdata(pdev); - - device_init_wakeup(&pdev->dev, 0); - free_irq(kp->key_stuck_irq, kp); - free_irq(kp->key_sense_irq, kp); - input_unregister_device(kp->input); - kfree(kp); - - platform_set_drvdata(pdev, NULL); - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int pmic8xxx_kp_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct pmic8xxx_kp *kp = platform_get_drvdata(pdev); - struct input_dev *input_dev = kp->input; - - if (device_may_wakeup(dev)) { - enable_irq_wake(kp->key_sense_irq); - } else { - mutex_lock(&input_dev->mutex); - - if (input_dev->users) - pmic8xxx_kp_disable(kp); - - mutex_unlock(&input_dev->mutex); - } - - return 0; -} - -static int pmic8xxx_kp_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct pmic8xxx_kp *kp = platform_get_drvdata(pdev); - struct input_dev *input_dev = kp->input; - - if (device_may_wakeup(dev)) { - disable_irq_wake(kp->key_sense_irq); - } else { - mutex_lock(&input_dev->mutex); - - if (input_dev->users) - pmic8xxx_kp_enable(kp); - - mutex_unlock(&input_dev->mutex); - } - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops, - pmic8xxx_kp_suspend, pmic8xxx_kp_resume); - -static struct platform_driver pmic8xxx_kp_driver = { - .probe = pmic8xxx_kp_probe, - .remove = __devexit_p(pmic8xxx_kp_remove), - .driver = { - .name = PM8XXX_KEYPAD_DEV_NAME, - .owner = THIS_MODULE, - .pm = &pm8xxx_kp_pm_ops, - }, -}; -module_platform_driver(pmic8xxx_kp_driver); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("PMIC8XXX keypad driver"); -MODULE_VERSION("1.0"); -MODULE_ALIAS("platform:pmic8xxx_keypad"); -MODULE_AUTHOR("Trilok Soni <tsoni@codeaurora.org>"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/pxa27x_keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/pxa27x_keypad.c deleted file mode 100644 index 29fe1b2b..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/pxa27x_keypad.c +++ /dev/null @@ -1,608 +0,0 @@ -/* - * linux/drivers/input/keyboard/pxa27x_keypad.c - * - * Driver for the pxa27x matrix keyboard controller. - * - * Created: Feb 22, 2007 - * Author: Rodolfo Giometti <giometti@linux.it> - * - * Based on a previous implementations by Kevin O'Connor - * <kevin_at_koconnor.net> and Alex Osborne <bobofdoom@gmail.com> and - * on some suggestions by Nicolas Pitre <nico@fluxnic.net>. - * - * 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. - */ - - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/input.h> -#include <linux/device.h> -#include <linux/platform_device.h> -#include <linux/clk.h> -#include <linux/err.h> -#include <linux/input/matrix_keypad.h> -#include <linux/slab.h> - -#include <asm/mach/arch.h> -#include <asm/mach/map.h> - -#include <mach/hardware.h> -#include <plat/pxa27x_keypad.h> -/* - * Keypad Controller registers - */ -#define KPC 0x0000 /* Keypad Control register */ -#define KPDK 0x0008 /* Keypad Direct Key register */ -#define KPREC 0x0010 /* Keypad Rotary Encoder register */ -#define KPMK 0x0018 /* Keypad Matrix Key register */ -#define KPAS 0x0020 /* Keypad Automatic Scan register */ - -/* Keypad Automatic Scan Multiple Key Presser register 0-3 */ -#define KPASMKP0 0x0028 -#define KPASMKP1 0x0030 -#define KPASMKP2 0x0038 -#define KPASMKP3 0x0040 -#define KPKDI 0x0048 - -/* bit definitions */ -#define KPC_MKRN(n) ((((n) - 1) & 0x7) << 26) /* matrix key row number */ -#define KPC_MKCN(n) ((((n) - 1) & 0x7) << 23) /* matrix key column number */ -#define KPC_DKN(n) ((((n) - 1) & 0x7) << 6) /* direct key number */ - -#define KPC_AS (0x1 << 30) /* Automatic Scan bit */ -#define KPC_ASACT (0x1 << 29) /* Automatic Scan on Activity */ -#define KPC_MI (0x1 << 22) /* Matrix interrupt bit */ -#define KPC_IMKP (0x1 << 21) /* Ignore Multiple Key Press */ - -#define KPC_MS(n) (0x1 << (13 + (n))) /* Matrix scan line 'n' */ -#define KPC_MS_ALL (0xff << 13) - -#define KPC_ME (0x1 << 12) /* Matrix Keypad Enable */ -#define KPC_MIE (0x1 << 11) /* Matrix Interrupt Enable */ -#define KPC_DK_DEB_SEL (0x1 << 9) /* Direct Keypad Debounce Select */ -#define KPC_DI (0x1 << 5) /* Direct key interrupt bit */ -#define KPC_RE_ZERO_DEB (0x1 << 4) /* Rotary Encoder Zero Debounce */ -#define KPC_REE1 (0x1 << 3) /* Rotary Encoder1 Enable */ -#define KPC_REE0 (0x1 << 2) /* Rotary Encoder0 Enable */ -#define KPC_DE (0x1 << 1) /* Direct Keypad Enable */ -#define KPC_DIE (0x1 << 0) /* Direct Keypad interrupt Enable */ - -#define KPDK_DKP (0x1 << 31) -#define KPDK_DK(n) ((n) & 0xff) - -#define KPREC_OF1 (0x1 << 31) -#define kPREC_UF1 (0x1 << 30) -#define KPREC_OF0 (0x1 << 15) -#define KPREC_UF0 (0x1 << 14) - -#define KPREC_RECOUNT0(n) ((n) & 0xff) -#define KPREC_RECOUNT1(n) (((n) >> 16) & 0xff) - -#define KPMK_MKP (0x1 << 31) -#define KPAS_SO (0x1 << 31) -#define KPASMKPx_SO (0x1 << 31) - -#define KPAS_MUKP(n) (((n) >> 26) & 0x1f) -#define KPAS_RP(n) (((n) >> 4) & 0xf) -#define KPAS_CP(n) ((n) & 0xf) - -#define KPASMKP_MKC_MASK (0xff) - -#define keypad_readl(off) __raw_readl(keypad->mmio_base + (off)) -#define keypad_writel(off, v) __raw_writel((v), keypad->mmio_base + (off)) - -#define MAX_MATRIX_KEY_NUM (MAX_MATRIX_KEY_ROWS * MAX_MATRIX_KEY_COLS) -#define MAX_KEYPAD_KEYS (MAX_MATRIX_KEY_NUM + MAX_DIRECT_KEY_NUM) - -struct pxa27x_keypad { - struct pxa27x_keypad_platform_data *pdata; - - struct clk *clk; - struct input_dev *input_dev; - void __iomem *mmio_base; - - int irq; - - unsigned short keycodes[MAX_KEYPAD_KEYS]; - int rotary_rel_code[2]; - - /* state row bits of each column scan */ - uint32_t matrix_key_state[MAX_MATRIX_KEY_COLS]; - uint32_t direct_key_state; - - unsigned int direct_key_mask; -}; - -static void pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad) -{ - struct pxa27x_keypad_platform_data *pdata = keypad->pdata; - struct input_dev *input_dev = keypad->input_dev; - unsigned short keycode; - int i; - - for (i = 0; i < pdata->matrix_key_map_size; i++) { - unsigned int key = pdata->matrix_key_map[i]; - unsigned int row = KEY_ROW(key); - unsigned int col = KEY_COL(key); - unsigned int scancode = MATRIX_SCAN_CODE(row, col, - MATRIX_ROW_SHIFT); - - keycode = KEY_VAL(key); - keypad->keycodes[scancode] = keycode; - __set_bit(keycode, input_dev->keybit); - } - - for (i = 0; i < pdata->direct_key_num; i++) { - keycode = pdata->direct_key_map[i]; - keypad->keycodes[MAX_MATRIX_KEY_NUM + i] = keycode; - __set_bit(keycode, input_dev->keybit); - } - - if (pdata->enable_rotary0) { - if (pdata->rotary0_up_key && pdata->rotary0_down_key) { - keycode = pdata->rotary0_up_key; - keypad->keycodes[MAX_MATRIX_KEY_NUM + 0] = keycode; - __set_bit(keycode, input_dev->keybit); - - keycode = pdata->rotary0_down_key; - keypad->keycodes[MAX_MATRIX_KEY_NUM + 1] = keycode; - __set_bit(keycode, input_dev->keybit); - - keypad->rotary_rel_code[0] = -1; - } else { - keypad->rotary_rel_code[0] = pdata->rotary0_rel_code; - __set_bit(pdata->rotary0_rel_code, input_dev->relbit); - } - } - - if (pdata->enable_rotary1) { - if (pdata->rotary1_up_key && pdata->rotary1_down_key) { - keycode = pdata->rotary1_up_key; - keypad->keycodes[MAX_MATRIX_KEY_NUM + 2] = keycode; - __set_bit(keycode, input_dev->keybit); - - keycode = pdata->rotary1_down_key; - keypad->keycodes[MAX_MATRIX_KEY_NUM + 3] = keycode; - __set_bit(keycode, input_dev->keybit); - - keypad->rotary_rel_code[1] = -1; - } else { - keypad->rotary_rel_code[1] = pdata->rotary1_rel_code; - __set_bit(pdata->rotary1_rel_code, input_dev->relbit); - } - } - - __clear_bit(KEY_RESERVED, input_dev->keybit); -} - -static void pxa27x_keypad_scan_matrix(struct pxa27x_keypad *keypad) -{ - struct pxa27x_keypad_platform_data *pdata = keypad->pdata; - struct input_dev *input_dev = keypad->input_dev; - int row, col, num_keys_pressed = 0; - uint32_t new_state[MAX_MATRIX_KEY_COLS]; - uint32_t kpas = keypad_readl(KPAS); - - num_keys_pressed = KPAS_MUKP(kpas); - - memset(new_state, 0, sizeof(new_state)); - - if (num_keys_pressed == 0) - goto scan; - - if (num_keys_pressed == 1) { - col = KPAS_CP(kpas); - row = KPAS_RP(kpas); - - /* if invalid row/col, treat as no key pressed */ - if (col >= pdata->matrix_key_cols || - row >= pdata->matrix_key_rows) - goto scan; - - new_state[col] = (1 << row); - goto scan; - } - - if (num_keys_pressed > 1) { - uint32_t kpasmkp0 = keypad_readl(KPASMKP0); - uint32_t kpasmkp1 = keypad_readl(KPASMKP1); - uint32_t kpasmkp2 = keypad_readl(KPASMKP2); - uint32_t kpasmkp3 = keypad_readl(KPASMKP3); - - new_state[0] = kpasmkp0 & KPASMKP_MKC_MASK; - new_state[1] = (kpasmkp0 >> 16) & KPASMKP_MKC_MASK; - new_state[2] = kpasmkp1 & KPASMKP_MKC_MASK; - new_state[3] = (kpasmkp1 >> 16) & KPASMKP_MKC_MASK; - new_state[4] = kpasmkp2 & KPASMKP_MKC_MASK; - new_state[5] = (kpasmkp2 >> 16) & KPASMKP_MKC_MASK; - new_state[6] = kpasmkp3 & KPASMKP_MKC_MASK; - new_state[7] = (kpasmkp3 >> 16) & KPASMKP_MKC_MASK; - } -scan: - for (col = 0; col < pdata->matrix_key_cols; col++) { - uint32_t bits_changed; - int code; - - bits_changed = keypad->matrix_key_state[col] ^ new_state[col]; - if (bits_changed == 0) - continue; - - for (row = 0; row < pdata->matrix_key_rows; row++) { - if ((bits_changed & (1 << row)) == 0) - continue; - - code = MATRIX_SCAN_CODE(row, col, MATRIX_ROW_SHIFT); - input_event(input_dev, EV_MSC, MSC_SCAN, code); - input_report_key(input_dev, keypad->keycodes[code], - new_state[col] & (1 << row)); - } - } - input_sync(input_dev); - memcpy(keypad->matrix_key_state, new_state, sizeof(new_state)); -} - -#define DEFAULT_KPREC (0x007f007f) - -static inline int rotary_delta(uint32_t kprec) -{ - if (kprec & KPREC_OF0) - return (kprec & 0xff) + 0x7f; - else if (kprec & KPREC_UF0) - return (kprec & 0xff) - 0x7f - 0xff; - else - return (kprec & 0xff) - 0x7f; -} - -static void report_rotary_event(struct pxa27x_keypad *keypad, int r, int delta) -{ - struct input_dev *dev = keypad->input_dev; - - if (delta == 0) - return; - - if (keypad->rotary_rel_code[r] == -1) { - int code = MAX_MATRIX_KEY_NUM + 2 * r + (delta > 0 ? 0 : 1); - unsigned char keycode = keypad->keycodes[code]; - - /* simulate a press-n-release */ - input_event(dev, EV_MSC, MSC_SCAN, code); - input_report_key(dev, keycode, 1); - input_sync(dev); - input_event(dev, EV_MSC, MSC_SCAN, code); - input_report_key(dev, keycode, 0); - input_sync(dev); - } else { - input_report_rel(dev, keypad->rotary_rel_code[r], delta); - input_sync(dev); - } -} - -static void pxa27x_keypad_scan_rotary(struct pxa27x_keypad *keypad) -{ - struct pxa27x_keypad_platform_data *pdata = keypad->pdata; - uint32_t kprec; - - /* read and reset to default count value */ - kprec = keypad_readl(KPREC); - keypad_writel(KPREC, DEFAULT_KPREC); - - if (pdata->enable_rotary0) - report_rotary_event(keypad, 0, rotary_delta(kprec)); - - if (pdata->enable_rotary1) - report_rotary_event(keypad, 1, rotary_delta(kprec >> 16)); -} - -static void pxa27x_keypad_scan_direct(struct pxa27x_keypad *keypad) -{ - struct pxa27x_keypad_platform_data *pdata = keypad->pdata; - struct input_dev *input_dev = keypad->input_dev; - unsigned int new_state; - uint32_t kpdk, bits_changed; - int i; - - kpdk = keypad_readl(KPDK); - - if (pdata->enable_rotary0 || pdata->enable_rotary1) - pxa27x_keypad_scan_rotary(keypad); - - new_state = KPDK_DK(kpdk) & keypad->direct_key_mask; - bits_changed = keypad->direct_key_state ^ new_state; - - if (bits_changed == 0) - return; - - for (i = 0; i < pdata->direct_key_num; i++) { - if (bits_changed & (1 << i)) { - int code = MAX_MATRIX_KEY_NUM + i; - - input_event(input_dev, EV_MSC, MSC_SCAN, code); - input_report_key(input_dev, keypad->keycodes[code], - new_state & (1 << i)); - } - } - input_sync(input_dev); - keypad->direct_key_state = new_state; -} - -static void clear_wakeup_event(struct pxa27x_keypad *keypad) -{ - struct pxa27x_keypad_platform_data *pdata = keypad->pdata; - - if (pdata->clear_wakeup_event) - (pdata->clear_wakeup_event)(); -} - -static irqreturn_t pxa27x_keypad_irq_handler(int irq, void *dev_id) -{ - struct pxa27x_keypad *keypad = dev_id; - unsigned long kpc = keypad_readl(KPC); - - clear_wakeup_event(keypad); - - if (kpc & KPC_DI) - pxa27x_keypad_scan_direct(keypad); - - if (kpc & KPC_MI) - pxa27x_keypad_scan_matrix(keypad); - - return IRQ_HANDLED; -} - -static void pxa27x_keypad_config(struct pxa27x_keypad *keypad) -{ - struct pxa27x_keypad_platform_data *pdata = keypad->pdata; - unsigned int mask = 0, direct_key_num = 0; - unsigned long kpc = 0; - - /* enable matrix keys with automatic scan */ - if (pdata->matrix_key_rows && pdata->matrix_key_cols) { - kpc |= KPC_ASACT | KPC_MIE | KPC_ME | KPC_MS_ALL; - kpc |= KPC_MKRN(pdata->matrix_key_rows) | - KPC_MKCN(pdata->matrix_key_cols); - } - - /* enable rotary key, debounce interval same as direct keys */ - if (pdata->enable_rotary0) { - mask |= 0x03; - direct_key_num = 2; - kpc |= KPC_REE0; - } - - if (pdata->enable_rotary1) { - mask |= 0x0c; - direct_key_num = 4; - kpc |= KPC_REE1; - } - - if (pdata->direct_key_num > direct_key_num) - direct_key_num = pdata->direct_key_num; - - keypad->direct_key_mask = ((2 << direct_key_num) - 1) & ~mask; - - /* enable direct key */ - if (direct_key_num) - kpc |= KPC_DE | KPC_DIE | KPC_DKN(direct_key_num); - - keypad_writel(KPC, kpc | KPC_RE_ZERO_DEB); - keypad_writel(KPREC, DEFAULT_KPREC); - keypad_writel(KPKDI, pdata->debounce_interval); -} - -static int pxa27x_keypad_open(struct input_dev *dev) -{ - struct pxa27x_keypad *keypad = input_get_drvdata(dev); - - /* Enable unit clock */ - clk_enable(keypad->clk); - pxa27x_keypad_config(keypad); - - return 0; -} - -static void pxa27x_keypad_close(struct input_dev *dev) -{ - struct pxa27x_keypad *keypad = input_get_drvdata(dev); - - /* Disable clock unit */ - clk_disable(keypad->clk); -} - -#ifdef CONFIG_PM -static int pxa27x_keypad_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); - - clk_disable(keypad->clk); - - if (device_may_wakeup(&pdev->dev)) - enable_irq_wake(keypad->irq); - - return 0; -} - -static int pxa27x_keypad_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); - struct input_dev *input_dev = keypad->input_dev; - - if (device_may_wakeup(&pdev->dev)) - disable_irq_wake(keypad->irq); - - mutex_lock(&input_dev->mutex); - - if (input_dev->users) { - /* Enable unit clock */ - clk_enable(keypad->clk); - pxa27x_keypad_config(keypad); - } - - mutex_unlock(&input_dev->mutex); - - return 0; -} - -static const struct dev_pm_ops pxa27x_keypad_pm_ops = { - .suspend = pxa27x_keypad_suspend, - .resume = pxa27x_keypad_resume, -}; -#endif - -static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) -{ - struct pxa27x_keypad_platform_data *pdata = pdev->dev.platform_data; - struct pxa27x_keypad *keypad; - struct input_dev *input_dev; - struct resource *res; - int irq, error; - - if (pdata == NULL) { - dev_err(&pdev->dev, "no platform data defined\n"); - return -EINVAL; - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "failed to get keypad irq\n"); - return -ENXIO; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (res == NULL) { - dev_err(&pdev->dev, "failed to get I/O memory\n"); - return -ENXIO; - } - - keypad = kzalloc(sizeof(struct pxa27x_keypad), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!keypad || !input_dev) { - dev_err(&pdev->dev, "failed to allocate memory\n"); - error = -ENOMEM; - goto failed_free; - } - - keypad->pdata = pdata; - keypad->input_dev = input_dev; - keypad->irq = irq; - - res = request_mem_region(res->start, resource_size(res), pdev->name); - if (res == NULL) { - dev_err(&pdev->dev, "failed to request I/O memory\n"); - error = -EBUSY; - goto failed_free; - } - - keypad->mmio_base = ioremap(res->start, resource_size(res)); - if (keypad->mmio_base == NULL) { - dev_err(&pdev->dev, "failed to remap I/O memory\n"); - error = -ENXIO; - goto failed_free_mem; - } - - keypad->clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(keypad->clk)) { - dev_err(&pdev->dev, "failed to get keypad clock\n"); - error = PTR_ERR(keypad->clk); - goto failed_free_io; - } - - input_dev->name = pdev->name; - input_dev->id.bustype = BUS_HOST; - input_dev->open = pxa27x_keypad_open; - input_dev->close = pxa27x_keypad_close; - input_dev->dev.parent = &pdev->dev; - - input_dev->keycode = keypad->keycodes; - input_dev->keycodesize = sizeof(keypad->keycodes[0]); - input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); - - input_set_drvdata(input_dev, keypad); - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - - pxa27x_keypad_build_keycode(keypad); - - if ((pdata->enable_rotary0 && keypad->rotary_rel_code[0] != -1) || - (pdata->enable_rotary1 && keypad->rotary_rel_code[1] != -1)) { - input_dev->evbit[0] |= BIT_MASK(EV_REL); - } - - error = request_irq(irq, pxa27x_keypad_irq_handler, 0, - pdev->name, keypad); - if (error) { - dev_err(&pdev->dev, "failed to request IRQ\n"); - goto failed_put_clk; - } - - /* Register the input device */ - error = input_register_device(input_dev); - if (error) { - dev_err(&pdev->dev, "failed to register input device\n"); - goto failed_free_irq; - } - - platform_set_drvdata(pdev, keypad); - device_init_wakeup(&pdev->dev, 1); - - return 0; - -failed_free_irq: - free_irq(irq, pdev); -failed_put_clk: - clk_put(keypad->clk); -failed_free_io: - iounmap(keypad->mmio_base); -failed_free_mem: - release_mem_region(res->start, resource_size(res)); -failed_free: - input_free_device(input_dev); - kfree(keypad); - return error; -} - -static int __devexit pxa27x_keypad_remove(struct platform_device *pdev) -{ - struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); - struct resource *res; - - free_irq(keypad->irq, pdev); - clk_put(keypad->clk); - - input_unregister_device(keypad->input_dev); - iounmap(keypad->mmio_base); - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(res->start, resource_size(res)); - - platform_set_drvdata(pdev, NULL); - kfree(keypad); - - return 0; -} - -/* work with hotplug and coldplug */ -MODULE_ALIAS("platform:pxa27x-keypad"); - -static struct platform_driver pxa27x_keypad_driver = { - .probe = pxa27x_keypad_probe, - .remove = __devexit_p(pxa27x_keypad_remove), - .driver = { - .name = "pxa27x-keypad", - .owner = THIS_MODULE, -#ifdef CONFIG_PM - .pm = &pxa27x_keypad_pm_ops, -#endif - }, -}; -module_platform_driver(pxa27x_keypad_driver); - -MODULE_DESCRIPTION("PXA27x Keypad Controller Driver"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/pxa930_rotary.c b/ANDROID_3.4.5/drivers/input/keyboard/pxa930_rotary.c deleted file mode 100644 index d7f1134b..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/pxa930_rotary.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Driver for the enhanced rotary controller on pxa930 and pxa935 - * - * 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. - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/input.h> -#include <linux/platform_device.h> -#include <linux/io.h> -#include <linux/slab.h> - -#include <mach/pxa930_rotary.h> - -#define SBCR (0x04) -#define ERCR (0x0c) - -#define SBCR_ERSB (1 << 5) - -struct pxa930_rotary { - struct input_dev *input_dev; - void __iomem *mmio_base; - int last_ercr; - - struct pxa930_rotary_platform_data *pdata; -}; - -static void clear_sbcr(struct pxa930_rotary *r) -{ - uint32_t sbcr = __raw_readl(r->mmio_base + SBCR); - - __raw_writel(sbcr | SBCR_ERSB, r->mmio_base + SBCR); - __raw_writel(sbcr & ~SBCR_ERSB, r->mmio_base + SBCR); -} - -static irqreturn_t rotary_irq(int irq, void *dev_id) -{ - struct pxa930_rotary *r = dev_id; - struct pxa930_rotary_platform_data *pdata = r->pdata; - int ercr, delta, key; - - ercr = __raw_readl(r->mmio_base + ERCR) & 0xf; - clear_sbcr(r); - - delta = ercr - r->last_ercr; - if (delta == 0) - return IRQ_HANDLED; - - r->last_ercr = ercr; - - if (pdata->up_key && pdata->down_key) { - key = (delta > 0) ? pdata->up_key : pdata->down_key; - input_report_key(r->input_dev, key, 1); - input_sync(r->input_dev); - input_report_key(r->input_dev, key, 0); - } else - input_report_rel(r->input_dev, pdata->rel_code, delta); - - input_sync(r->input_dev); - - return IRQ_HANDLED; -} - -static int pxa930_rotary_open(struct input_dev *dev) -{ - struct pxa930_rotary *r = input_get_drvdata(dev); - - clear_sbcr(r); - - return 0; -} - -static void pxa930_rotary_close(struct input_dev *dev) -{ - struct pxa930_rotary *r = input_get_drvdata(dev); - - clear_sbcr(r); -} - -static int __devinit pxa930_rotary_probe(struct platform_device *pdev) -{ - struct pxa930_rotary_platform_data *pdata = pdev->dev.platform_data; - struct pxa930_rotary *r; - struct input_dev *input_dev; - struct resource *res; - int irq; - int err; - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "no irq for rotary controller\n"); - return -ENXIO; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "no I/O memory defined\n"); - return -ENXIO; - } - - if (!pdata) { - dev_err(&pdev->dev, "no platform data defined\n"); - return -EINVAL; - } - - r = kzalloc(sizeof(struct pxa930_rotary), GFP_KERNEL); - if (!r) - return -ENOMEM; - - r->mmio_base = ioremap_nocache(res->start, resource_size(res)); - if (r->mmio_base == NULL) { - dev_err(&pdev->dev, "failed to remap IO memory\n"); - err = -ENXIO; - goto failed_free; - } - - r->pdata = pdata; - platform_set_drvdata(pdev, r); - - /* allocate and register the input device */ - input_dev = input_allocate_device(); - if (!input_dev) { - dev_err(&pdev->dev, "failed to allocate input device\n"); - err = -ENOMEM; - goto failed_free_io; - } - - input_dev->name = pdev->name; - input_dev->id.bustype = BUS_HOST; - input_dev->open = pxa930_rotary_open; - input_dev->close = pxa930_rotary_close; - input_dev->dev.parent = &pdev->dev; - - if (pdata->up_key && pdata->down_key) { - __set_bit(pdata->up_key, input_dev->keybit); - __set_bit(pdata->down_key, input_dev->keybit); - __set_bit(EV_KEY, input_dev->evbit); - } else { - __set_bit(pdata->rel_code, input_dev->relbit); - __set_bit(EV_REL, input_dev->evbit); - } - - r->input_dev = input_dev; - input_set_drvdata(input_dev, r); - - err = request_irq(irq, rotary_irq, 0, - "enhanced rotary", r); - if (err) { - dev_err(&pdev->dev, "failed to request IRQ\n"); - goto failed_free_input; - } - - err = input_register_device(input_dev); - if (err) { - dev_err(&pdev->dev, "failed to register input device\n"); - goto failed_free_irq; - } - - return 0; - -failed_free_irq: - free_irq(irq, r); -failed_free_input: - input_free_device(input_dev); -failed_free_io: - iounmap(r->mmio_base); -failed_free: - kfree(r); - return err; -} - -static int __devexit pxa930_rotary_remove(struct platform_device *pdev) -{ - struct pxa930_rotary *r = platform_get_drvdata(pdev); - - free_irq(platform_get_irq(pdev, 0), r); - input_unregister_device(r->input_dev); - iounmap(r->mmio_base); - platform_set_drvdata(pdev, NULL); - kfree(r); - - return 0; -} - -static struct platform_driver pxa930_rotary_driver = { - .driver = { - .name = "pxa930-rotary", - .owner = THIS_MODULE, - }, - .probe = pxa930_rotary_probe, - .remove = __devexit_p(pxa930_rotary_remove), -}; -module_platform_driver(pxa930_rotary_driver); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Driver for PXA93x Enhanced Rotary Controller"); -MODULE_AUTHOR("Yao Yong <yaoyong@marvell.com>"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/qt1070.c b/ANDROID_3.4.5/drivers/input/keyboard/qt1070.c deleted file mode 100644 index 0b7b2f89..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/qt1070.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Atmel AT42QT1070 QTouch Sensor Controller - * - * Copyright (C) 2011 Atmel - * - * Authors: Bo Shen <voice.shen@atmel.com> - * - * Base on AT42QT2160 driver by: - * Raphael Derosso Pereira <raphaelpereira@gmail.com> - * Copyright (C) 2009 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/i2c.h> -#include <linux/input.h> -#include <linux/slab.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/jiffies.h> -#include <linux/delay.h> - -/* Address for each register */ -#define CHIP_ID 0x00 -#define QT1070_CHIP_ID 0x2E - -#define FW_VERSION 0x01 -#define QT1070_FW_VERSION 0x15 - -#define DET_STATUS 0x02 - -#define KEY_STATUS 0x03 - -/* Calibrate */ -#define CALIBRATE_CMD 0x38 -#define QT1070_CAL_TIME 200 - -/* Reset */ -#define RESET 0x39 -#define QT1070_RESET_TIME 255 - -/* AT42QT1070 support up to 7 keys */ -static const unsigned short qt1070_key2code[] = { - KEY_0, KEY_1, KEY_2, KEY_3, - KEY_4, KEY_5, KEY_6, -}; - -struct qt1070_data { - struct i2c_client *client; - struct input_dev *input; - unsigned int irq; - unsigned short keycodes[ARRAY_SIZE(qt1070_key2code)]; - u8 last_keys; -}; - -static int qt1070_read(struct i2c_client *client, u8 reg) -{ - int ret; - - ret = i2c_smbus_read_byte_data(client, reg); - if (ret < 0) - dev_err(&client->dev, - "can not read register, returned %d\n", ret); - - return ret; -} - -static int qt1070_write(struct i2c_client *client, u8 reg, u8 data) -{ - int ret; - - ret = i2c_smbus_write_byte_data(client, reg, data); - if (ret < 0) - dev_err(&client->dev, - "can not write register, returned %d\n", ret); - - return ret; -} - -static bool __devinit qt1070_identify(struct i2c_client *client) -{ - int id, ver; - - /* Read Chip ID */ - id = qt1070_read(client, CHIP_ID); - if (id != QT1070_CHIP_ID) { - dev_err(&client->dev, "ID %d not supported\n", id); - return false; - } - - /* Read firmware version */ - ver = qt1070_read(client, FW_VERSION); - if (ver < 0) { - dev_err(&client->dev, "could not read the firmware version\n"); - return false; - } - - dev_info(&client->dev, "AT42QT1070 firmware version %x\n", ver); - - return true; -} - -static irqreturn_t qt1070_interrupt(int irq, void *dev_id) -{ - struct qt1070_data *data = dev_id; - struct i2c_client *client = data->client; - struct input_dev *input = data->input; - int i; - u8 new_keys, keyval, mask = 0x01; - - /* Read the detected status register, thus clearing interrupt */ - qt1070_read(client, DET_STATUS); - - /* Read which key changed */ - new_keys = qt1070_read(client, KEY_STATUS); - - for (i = 0; i < ARRAY_SIZE(qt1070_key2code); i++) { - keyval = new_keys & mask; - if ((data->last_keys & mask) != keyval) - input_report_key(input, data->keycodes[i], keyval); - mask <<= 1; - } - input_sync(input); - - data->last_keys = new_keys; - return IRQ_HANDLED; -} - -static int __devinit qt1070_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct qt1070_data *data; - struct input_dev *input; - int i; - int err; - - err = i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE); - if (!err) { - dev_err(&client->dev, "%s adapter not supported\n", - dev_driver_string(&client->adapter->dev)); - return -ENODEV; - } - - if (!client->irq) { - dev_err(&client->dev, "please assign the irq to this device\n"); - return -EINVAL; - } - - /* Identify the qt1070 chip */ - if (!qt1070_identify(client)) - return -ENODEV; - - data = kzalloc(sizeof(struct qt1070_data), GFP_KERNEL); - input = input_allocate_device(); - if (!data || !input) { - dev_err(&client->dev, "insufficient memory\n"); - err = -ENOMEM; - goto err_free_mem; - } - - data->client = client; - data->input = input; - data->irq = client->irq; - - input->name = "AT42QT1070 QTouch Sensor"; - input->dev.parent = &client->dev; - input->id.bustype = BUS_I2C; - - /* Add the keycode */ - input->keycode = data->keycodes; - input->keycodesize = sizeof(data->keycodes[0]); - input->keycodemax = ARRAY_SIZE(qt1070_key2code); - - __set_bit(EV_KEY, input->evbit); - - for (i = 0; i < ARRAY_SIZE(qt1070_key2code); i++) { - data->keycodes[i] = qt1070_key2code[i]; - __set_bit(qt1070_key2code[i], input->keybit); - } - - /* Calibrate device */ - qt1070_write(client, CALIBRATE_CMD, 1); - msleep(QT1070_CAL_TIME); - - /* Soft reset */ - qt1070_write(client, RESET, 1); - msleep(QT1070_RESET_TIME); - - err = request_threaded_irq(client->irq, NULL, qt1070_interrupt, - IRQF_TRIGGER_NONE, client->dev.driver->name, data); - if (err) { - dev_err(&client->dev, "fail to request irq\n"); - goto err_free_mem; - } - - /* Register the input device */ - err = input_register_device(data->input); - if (err) { - dev_err(&client->dev, "Failed to register input device\n"); - goto err_free_irq; - } - - i2c_set_clientdata(client, data); - - /* Read to clear the chang line */ - qt1070_read(client, DET_STATUS); - - return 0; - -err_free_irq: - free_irq(client->irq, data); -err_free_mem: - input_free_device(input); - kfree(data); - return err; -} - -static int __devexit qt1070_remove(struct i2c_client *client) -{ - struct qt1070_data *data = i2c_get_clientdata(client); - - /* Release IRQ */ - free_irq(client->irq, data); - - input_unregister_device(data->input); - kfree(data); - - return 0; -} - -static const struct i2c_device_id qt1070_id[] = { - { "qt1070", 0 }, - { }, -}; -MODULE_DEVICE_TABLE(i2c, qt1070_id); - -static struct i2c_driver qt1070_driver = { - .driver = { - .name = "qt1070", - .owner = THIS_MODULE, - }, - .id_table = qt1070_id, - .probe = qt1070_probe, - .remove = __devexit_p(qt1070_remove), -}; - -module_i2c_driver(qt1070_driver); - -MODULE_AUTHOR("Bo Shen <voice.shen@atmel.com>"); -MODULE_DESCRIPTION("Driver for AT42QT1070 QTouch sensor"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/qt2160.c b/ANDROID_3.4.5/drivers/input/keyboard/qt2160.c deleted file mode 100644 index e7a5e36e..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/qt2160.c +++ /dev/null @@ -1,386 +0,0 @@ -/* - * qt2160.c - Atmel AT42QT2160 Touch Sense Controller - * - * Copyright (C) 2009 Raphael Derosso Pereira <raphaelpereira@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/jiffies.h> -#include <linux/i2c.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/input.h> - -#define QT2160_VALID_CHIPID 0x11 - -#define QT2160_CMD_CHIPID 0 -#define QT2160_CMD_CODEVER 1 -#define QT2160_CMD_GSTAT 2 -#define QT2160_CMD_KEYS3 3 -#define QT2160_CMD_KEYS4 4 -#define QT2160_CMD_SLIDE 5 -#define QT2160_CMD_GPIOS 6 -#define QT2160_CMD_SUBVER 7 -#define QT2160_CMD_CALIBRATE 10 - -#define QT2160_CYCLE_INTERVAL (2*HZ) - -static unsigned char qt2160_key2code[] = { - KEY_0, KEY_1, KEY_2, KEY_3, - KEY_4, KEY_5, KEY_6, KEY_7, - KEY_8, KEY_9, KEY_A, KEY_B, - KEY_C, KEY_D, KEY_E, KEY_F, -}; - -struct qt2160_data { - struct i2c_client *client; - struct input_dev *input; - struct delayed_work dwork; - spinlock_t lock; /* Protects canceling/rescheduling of dwork */ - unsigned short keycodes[ARRAY_SIZE(qt2160_key2code)]; - u16 key_matrix; -}; - -static int qt2160_read_block(struct i2c_client *client, - u8 inireg, u8 *buffer, unsigned int count) -{ - int error, idx = 0; - - /* - * Can't use SMBus block data read. Check for I2C functionality to speed - * things up whenever possible. Otherwise we will be forced to read - * sequentially. - */ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - - error = i2c_smbus_write_byte(client, inireg + idx); - if (error) { - dev_err(&client->dev, - "couldn't send request. Returned %d\n", error); - return error; - } - - error = i2c_master_recv(client, buffer, count); - if (error != count) { - dev_err(&client->dev, - "couldn't read registers. Returned %d bytes\n", error); - return error; - } - } else { - - while (count--) { - int data; - - error = i2c_smbus_write_byte(client, inireg + idx); - if (error) { - dev_err(&client->dev, - "couldn't send request. Returned %d\n", error); - return error; - } - - data = i2c_smbus_read_byte(client); - if (data < 0) { - dev_err(&client->dev, - "couldn't read register. Returned %d\n", data); - return data; - } - - buffer[idx++] = data; - } - } - - return 0; -} - -static int qt2160_get_key_matrix(struct qt2160_data *qt2160) -{ - struct i2c_client *client = qt2160->client; - struct input_dev *input = qt2160->input; - u8 regs[6]; - u16 old_matrix, new_matrix; - int ret, i, mask; - - dev_dbg(&client->dev, "requesting keys...\n"); - - /* - * Read all registers from General Status Register - * to GPIOs register - */ - ret = qt2160_read_block(client, QT2160_CMD_GSTAT, regs, 6); - if (ret) { - dev_err(&client->dev, - "could not perform chip read.\n"); - return ret; - } - - old_matrix = qt2160->key_matrix; - qt2160->key_matrix = new_matrix = (regs[2] << 8) | regs[1]; - - mask = 0x01; - for (i = 0; i < 16; ++i, mask <<= 1) { - int keyval = new_matrix & mask; - - if ((old_matrix & mask) != keyval) { - input_report_key(input, qt2160->keycodes[i], keyval); - dev_dbg(&client->dev, "key %d %s\n", - i, keyval ? "pressed" : "released"); - } - } - - input_sync(input); - - return 0; -} - -static irqreturn_t qt2160_irq(int irq, void *_qt2160) -{ - struct qt2160_data *qt2160 = _qt2160; - unsigned long flags; - - spin_lock_irqsave(&qt2160->lock, flags); - - __cancel_delayed_work(&qt2160->dwork); - schedule_delayed_work(&qt2160->dwork, 0); - - spin_unlock_irqrestore(&qt2160->lock, flags); - - return IRQ_HANDLED; -} - -static void qt2160_schedule_read(struct qt2160_data *qt2160) -{ - spin_lock_irq(&qt2160->lock); - schedule_delayed_work(&qt2160->dwork, QT2160_CYCLE_INTERVAL); - spin_unlock_irq(&qt2160->lock); -} - -static void qt2160_worker(struct work_struct *work) -{ - struct qt2160_data *qt2160 = - container_of(work, struct qt2160_data, dwork.work); - - dev_dbg(&qt2160->client->dev, "worker\n"); - - qt2160_get_key_matrix(qt2160); - - /* Avoid device lock up by checking every so often */ - qt2160_schedule_read(qt2160); -} - -static int __devinit qt2160_read(struct i2c_client *client, u8 reg) -{ - int ret; - - ret = i2c_smbus_write_byte(client, reg); - if (ret) { - dev_err(&client->dev, - "couldn't send request. Returned %d\n", ret); - return ret; - } - - ret = i2c_smbus_read_byte(client); - if (ret < 0) { - dev_err(&client->dev, - "couldn't read register. Returned %d\n", ret); - return ret; - } - - return ret; -} - -static int __devinit qt2160_write(struct i2c_client *client, u8 reg, u8 data) -{ - int error; - - error = i2c_smbus_write_byte(client, reg); - if (error) { - dev_err(&client->dev, - "couldn't send request. Returned %d\n", error); - return error; - } - - error = i2c_smbus_write_byte(client, data); - if (error) { - dev_err(&client->dev, - "couldn't write data. Returned %d\n", error); - return error; - } - - return error; -} - - -static bool __devinit qt2160_identify(struct i2c_client *client) -{ - int id, ver, rev; - - /* Read Chid ID to check if chip is valid */ - id = qt2160_read(client, QT2160_CMD_CHIPID); - if (id != QT2160_VALID_CHIPID) { - dev_err(&client->dev, "ID %d not supported\n", id); - return false; - } - - /* Read chip firmware version */ - ver = qt2160_read(client, QT2160_CMD_CODEVER); - if (ver < 0) { - dev_err(&client->dev, "could not get firmware version\n"); - return false; - } - - /* Read chip firmware revision */ - rev = qt2160_read(client, QT2160_CMD_SUBVER); - if (rev < 0) { - dev_err(&client->dev, "could not get firmware revision\n"); - return false; - } - - dev_info(&client->dev, "AT42QT2160 firmware version %d.%d.%d\n", - ver >> 4, ver & 0xf, rev); - - return true; -} - -static int __devinit qt2160_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct qt2160_data *qt2160; - struct input_dev *input; - int i; - int error; - - /* Check functionality */ - error = i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_BYTE); - if (!error) { - dev_err(&client->dev, "%s adapter not supported\n", - dev_driver_string(&client->adapter->dev)); - return -ENODEV; - } - - if (!qt2160_identify(client)) - return -ENODEV; - - /* Chip is valid and active. Allocate structure */ - qt2160 = kzalloc(sizeof(struct qt2160_data), GFP_KERNEL); - input = input_allocate_device(); - if (!qt2160 || !input) { - dev_err(&client->dev, "insufficient memory\n"); - error = -ENOMEM; - goto err_free_mem; - } - - qt2160->client = client; - qt2160->input = input; - INIT_DELAYED_WORK(&qt2160->dwork, qt2160_worker); - spin_lock_init(&qt2160->lock); - - input->name = "AT42QT2160 Touch Sense Keyboard"; - input->id.bustype = BUS_I2C; - - input->keycode = qt2160->keycodes; - input->keycodesize = sizeof(qt2160->keycodes[0]); - input->keycodemax = ARRAY_SIZE(qt2160_key2code); - - __set_bit(EV_KEY, input->evbit); - __clear_bit(EV_REP, input->evbit); - for (i = 0; i < ARRAY_SIZE(qt2160_key2code); i++) { - qt2160->keycodes[i] = qt2160_key2code[i]; - __set_bit(qt2160_key2code[i], input->keybit); - } - __clear_bit(KEY_RESERVED, input->keybit); - - /* Calibrate device */ - error = qt2160_write(client, QT2160_CMD_CALIBRATE, 1); - if (error) { - dev_err(&client->dev, "failed to calibrate device\n"); - goto err_free_mem; - } - - if (client->irq) { - error = request_irq(client->irq, qt2160_irq, - IRQF_TRIGGER_FALLING, "qt2160", qt2160); - if (error) { - dev_err(&client->dev, - "failed to allocate irq %d\n", client->irq); - goto err_free_mem; - } - } - - error = input_register_device(qt2160->input); - if (error) { - dev_err(&client->dev, - "Failed to register input device\n"); - goto err_free_irq; - } - - i2c_set_clientdata(client, qt2160); - qt2160_schedule_read(qt2160); - - return 0; - -err_free_irq: - if (client->irq) - free_irq(client->irq, qt2160); -err_free_mem: - input_free_device(input); - kfree(qt2160); - return error; -} - -static int __devexit qt2160_remove(struct i2c_client *client) -{ - struct qt2160_data *qt2160 = i2c_get_clientdata(client); - - /* Release IRQ so no queue will be scheduled */ - if (client->irq) - free_irq(client->irq, qt2160); - - cancel_delayed_work_sync(&qt2160->dwork); - - input_unregister_device(qt2160->input); - kfree(qt2160); - - return 0; -} - -static const struct i2c_device_id qt2160_idtable[] = { - { "qt2160", 0, }, - { } -}; - -MODULE_DEVICE_TABLE(i2c, qt2160_idtable); - -static struct i2c_driver qt2160_driver = { - .driver = { - .name = "qt2160", - .owner = THIS_MODULE, - }, - - .id_table = qt2160_idtable, - .probe = qt2160_probe, - .remove = __devexit_p(qt2160_remove), -}; - -module_i2c_driver(qt2160_driver); - -MODULE_AUTHOR("Raphael Derosso Pereira <raphaelpereira@gmail.com>"); -MODULE_DESCRIPTION("Driver for AT42QT2160 Touch Sensor"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/samsung-keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/samsung-keypad.c deleted file mode 100644 index 2391ae88..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/samsung-keypad.c +++ /dev/null @@ -1,697 +0,0 @@ -/* - * Samsung keypad driver - * - * Copyright (C) 2010 Samsung Electronics Co.Ltd - * Author: Joonyoung Shim <jy0922.shim@samsung.com> - * Author: Donghwa Lee <dh09.lee@samsung.com> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ - -#include <linux/clk.h> -#include <linux/delay.h> -#include <linux/err.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/interrupt.h> -#include <linux/io.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/pm.h> -#include <linux/pm_runtime.h> -#include <linux/slab.h> -#include <linux/of.h> -#include <linux/of_gpio.h> -#include <linux/sched.h> -#include <linux/input/samsung-keypad.h> - -#define SAMSUNG_KEYIFCON 0x00 -#define SAMSUNG_KEYIFSTSCLR 0x04 -#define SAMSUNG_KEYIFCOL 0x08 -#define SAMSUNG_KEYIFROW 0x0c -#define SAMSUNG_KEYIFFC 0x10 - -/* SAMSUNG_KEYIFCON */ -#define SAMSUNG_KEYIFCON_INT_F_EN (1 << 0) -#define SAMSUNG_KEYIFCON_INT_R_EN (1 << 1) -#define SAMSUNG_KEYIFCON_DF_EN (1 << 2) -#define SAMSUNG_KEYIFCON_FC_EN (1 << 3) -#define SAMSUNG_KEYIFCON_WAKEUPEN (1 << 4) - -/* SAMSUNG_KEYIFSTSCLR */ -#define SAMSUNG_KEYIFSTSCLR_P_INT_MASK (0xff << 0) -#define SAMSUNG_KEYIFSTSCLR_R_INT_MASK (0xff << 8) -#define SAMSUNG_KEYIFSTSCLR_R_INT_OFFSET 8 -#define S5PV210_KEYIFSTSCLR_P_INT_MASK (0x3fff << 0) -#define S5PV210_KEYIFSTSCLR_R_INT_MASK (0x3fff << 16) -#define S5PV210_KEYIFSTSCLR_R_INT_OFFSET 16 - -/* SAMSUNG_KEYIFCOL */ -#define SAMSUNG_KEYIFCOL_MASK (0xff << 0) -#define S5PV210_KEYIFCOLEN_MASK (0xff << 8) - -/* SAMSUNG_KEYIFROW */ -#define SAMSUNG_KEYIFROW_MASK (0xff << 0) -#define S5PV210_KEYIFROW_MASK (0x3fff << 0) - -/* SAMSUNG_KEYIFFC */ -#define SAMSUNG_KEYIFFC_MASK (0x3ff << 0) - -enum samsung_keypad_type { - KEYPAD_TYPE_SAMSUNG, - KEYPAD_TYPE_S5PV210, -}; - -struct samsung_keypad { - struct input_dev *input_dev; - struct platform_device *pdev; - struct clk *clk; - void __iomem *base; - wait_queue_head_t wait; - bool stopped; - bool wake_enabled; - int irq; - enum samsung_keypad_type type; - unsigned int row_shift; - unsigned int rows; - unsigned int cols; - unsigned int row_state[SAMSUNG_MAX_COLS]; -#ifdef CONFIG_OF - int row_gpios[SAMSUNG_MAX_ROWS]; - int col_gpios[SAMSUNG_MAX_COLS]; -#endif - unsigned short keycodes[]; -}; - -static void samsung_keypad_scan(struct samsung_keypad *keypad, - unsigned int *row_state) -{ - unsigned int col; - unsigned int val; - - for (col = 0; col < keypad->cols; col++) { - if (keypad->type == KEYPAD_TYPE_S5PV210) { - val = S5PV210_KEYIFCOLEN_MASK; - val &= ~(1 << col) << 8; - } else { - val = SAMSUNG_KEYIFCOL_MASK; - val &= ~(1 << col); - } - - writel(val, keypad->base + SAMSUNG_KEYIFCOL); - mdelay(1); - - val = readl(keypad->base + SAMSUNG_KEYIFROW); - row_state[col] = ~val & ((1 << keypad->rows) - 1); - } - - /* KEYIFCOL reg clear */ - writel(0, keypad->base + SAMSUNG_KEYIFCOL); -} - -static bool samsung_keypad_report(struct samsung_keypad *keypad, - unsigned int *row_state) -{ - struct input_dev *input_dev = keypad->input_dev; - unsigned int changed; - unsigned int pressed; - unsigned int key_down = 0; - unsigned int val; - unsigned int col, row; - - for (col = 0; col < keypad->cols; col++) { - changed = row_state[col] ^ keypad->row_state[col]; - key_down |= row_state[col]; - if (!changed) - continue; - - for (row = 0; row < keypad->rows; row++) { - if (!(changed & (1 << row))) - continue; - - pressed = row_state[col] & (1 << row); - - dev_dbg(&keypad->input_dev->dev, - "key %s, row: %d, col: %d\n", - pressed ? "pressed" : "released", row, col); - - val = MATRIX_SCAN_CODE(row, col, keypad->row_shift); - - input_event(input_dev, EV_MSC, MSC_SCAN, val); - input_report_key(input_dev, - keypad->keycodes[val], pressed); - } - input_sync(keypad->input_dev); - } - - memcpy(keypad->row_state, row_state, sizeof(keypad->row_state)); - - return key_down; -} - -static irqreturn_t samsung_keypad_irq(int irq, void *dev_id) -{ - struct samsung_keypad *keypad = dev_id; - unsigned int row_state[SAMSUNG_MAX_COLS]; - unsigned int val; - bool key_down; - - pm_runtime_get_sync(&keypad->pdev->dev); - - do { - val = readl(keypad->base + SAMSUNG_KEYIFSTSCLR); - /* Clear interrupt. */ - writel(~0x0, keypad->base + SAMSUNG_KEYIFSTSCLR); - - samsung_keypad_scan(keypad, row_state); - - key_down = samsung_keypad_report(keypad, row_state); - if (key_down) - wait_event_timeout(keypad->wait, keypad->stopped, - msecs_to_jiffies(50)); - - } while (key_down && !keypad->stopped); - - pm_runtime_put(&keypad->pdev->dev); - - return IRQ_HANDLED; -} - -static void samsung_keypad_start(struct samsung_keypad *keypad) -{ - unsigned int val; - - pm_runtime_get_sync(&keypad->pdev->dev); - - /* Tell IRQ thread that it may poll the device. */ - keypad->stopped = false; - - clk_enable(keypad->clk); - - /* Enable interrupt bits. */ - val = readl(keypad->base + SAMSUNG_KEYIFCON); - val |= SAMSUNG_KEYIFCON_INT_F_EN | SAMSUNG_KEYIFCON_INT_R_EN; - writel(val, keypad->base + SAMSUNG_KEYIFCON); - - /* KEYIFCOL reg clear. */ - writel(0, keypad->base + SAMSUNG_KEYIFCOL); - - pm_runtime_put(&keypad->pdev->dev); -} - -static void samsung_keypad_stop(struct samsung_keypad *keypad) -{ - unsigned int val; - - pm_runtime_get_sync(&keypad->pdev->dev); - - /* Signal IRQ thread to stop polling and disable the handler. */ - keypad->stopped = true; - wake_up(&keypad->wait); - disable_irq(keypad->irq); - - /* Clear interrupt. */ - writel(~0x0, keypad->base + SAMSUNG_KEYIFSTSCLR); - - /* Disable interrupt bits. */ - val = readl(keypad->base + SAMSUNG_KEYIFCON); - val &= ~(SAMSUNG_KEYIFCON_INT_F_EN | SAMSUNG_KEYIFCON_INT_R_EN); - writel(val, keypad->base + SAMSUNG_KEYIFCON); - - clk_disable(keypad->clk); - - /* - * Now that chip should not generate interrupts we can safely - * re-enable the handler. - */ - enable_irq(keypad->irq); - - pm_runtime_put(&keypad->pdev->dev); -} - -static int samsung_keypad_open(struct input_dev *input_dev) -{ - struct samsung_keypad *keypad = input_get_drvdata(input_dev); - - samsung_keypad_start(keypad); - - return 0; -} - -static void samsung_keypad_close(struct input_dev *input_dev) -{ - struct samsung_keypad *keypad = input_get_drvdata(input_dev); - - samsung_keypad_stop(keypad); -} - -#ifdef CONFIG_OF -static struct samsung_keypad_platdata *samsung_keypad_parse_dt( - struct device *dev) -{ - struct samsung_keypad_platdata *pdata; - struct matrix_keymap_data *keymap_data; - uint32_t *keymap, num_rows = 0, num_cols = 0; - struct device_node *np = dev->of_node, *key_np; - unsigned int key_count = 0; - - pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); - if (!pdata) { - dev_err(dev, "could not allocate memory for platform data\n"); - return NULL; - } - - of_property_read_u32(np, "samsung,keypad-num-rows", &num_rows); - of_property_read_u32(np, "samsung,keypad-num-columns", &num_cols); - if (!num_rows || !num_cols) { - dev_err(dev, "number of keypad rows/columns not specified\n"); - return NULL; - } - pdata->rows = num_rows; - pdata->cols = num_cols; - - keymap_data = devm_kzalloc(dev, sizeof(*keymap_data), GFP_KERNEL); - if (!keymap_data) { - dev_err(dev, "could not allocate memory for keymap data\n"); - return NULL; - } - pdata->keymap_data = keymap_data; - - for_each_child_of_node(np, key_np) - key_count++; - - keymap_data->keymap_size = key_count; - keymap = devm_kzalloc(dev, sizeof(uint32_t) * key_count, GFP_KERNEL); - if (!keymap) { - dev_err(dev, "could not allocate memory for keymap\n"); - return NULL; - } - keymap_data->keymap = keymap; - - for_each_child_of_node(np, key_np) { - u32 row, col, key_code; - of_property_read_u32(key_np, "keypad,row", &row); - of_property_read_u32(key_np, "keypad,column", &col); - of_property_read_u32(key_np, "linux,code", &key_code); - *keymap++ = KEY(row, col, key_code); - } - - if (of_get_property(np, "linux,input-no-autorepeat", NULL)) - pdata->no_autorepeat = true; - if (of_get_property(np, "linux,input-wakeup", NULL)) - pdata->wakeup = true; - - return pdata; -} - -static void samsung_keypad_parse_dt_gpio(struct device *dev, - struct samsung_keypad *keypad) -{ - struct device_node *np = dev->of_node; - int gpio, ret, row, col; - - for (row = 0; row < keypad->rows; row++) { - gpio = of_get_named_gpio(np, "row-gpios", row); - keypad->row_gpios[row] = gpio; - if (!gpio_is_valid(gpio)) { - dev_err(dev, "keypad row[%d]: invalid gpio %d\n", - row, gpio); - continue; - } - - ret = gpio_request(gpio, "keypad-row"); - if (ret) - dev_err(dev, "keypad row[%d] gpio request failed\n", - row); - } - - for (col = 0; col < keypad->cols; col++) { - gpio = of_get_named_gpio(np, "col-gpios", col); - keypad->col_gpios[col] = gpio; - if (!gpio_is_valid(gpio)) { - dev_err(dev, "keypad column[%d]: invalid gpio %d\n", - col, gpio); - continue; - } - - ret = gpio_request(gpio, "keypad-col"); - if (ret) - dev_err(dev, "keypad column[%d] gpio request failed\n", - col); - } -} - -static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad) -{ - int cnt; - - for (cnt = 0; cnt < keypad->rows; cnt++) - if (gpio_is_valid(keypad->row_gpios[cnt])) - gpio_free(keypad->row_gpios[cnt]); - - for (cnt = 0; cnt < keypad->cols; cnt++) - if (gpio_is_valid(keypad->col_gpios[cnt])) - gpio_free(keypad->col_gpios[cnt]); -} -#else -static -struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev) -{ - return NULL; -} - -static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad) -{ -} -#endif - -static int __devinit samsung_keypad_probe(struct platform_device *pdev) -{ - const struct samsung_keypad_platdata *pdata; - const struct matrix_keymap_data *keymap_data; - struct samsung_keypad *keypad; - struct resource *res; - struct input_dev *input_dev; - unsigned int row_shift; - unsigned int keymap_size; - int error; - - if (pdev->dev.of_node) - pdata = samsung_keypad_parse_dt(&pdev->dev); - else - pdata = pdev->dev.platform_data; - if (!pdata) { - dev_err(&pdev->dev, "no platform data defined\n"); - return -EINVAL; - } - - keymap_data = pdata->keymap_data; - if (!keymap_data) { - dev_err(&pdev->dev, "no keymap data defined\n"); - return -EINVAL; - } - - if (!pdata->rows || pdata->rows > SAMSUNG_MAX_ROWS) - return -EINVAL; - - if (!pdata->cols || pdata->cols > SAMSUNG_MAX_COLS) - return -EINVAL; - - /* initialize the gpio */ - if (pdata->cfg_gpio) - pdata->cfg_gpio(pdata->rows, pdata->cols); - - row_shift = get_count_order(pdata->cols); - keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]); - - keypad = kzalloc(sizeof(*keypad) + keymap_size, GFP_KERNEL); - input_dev = input_allocate_device(); - if (!keypad || !input_dev) { - error = -ENOMEM; - goto err_free_mem; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - error = -ENODEV; - goto err_free_mem; - } - - keypad->base = ioremap(res->start, resource_size(res)); - if (!keypad->base) { - error = -EBUSY; - goto err_free_mem; - } - - keypad->clk = clk_get(&pdev->dev, "keypad"); - if (IS_ERR(keypad->clk)) { - dev_err(&pdev->dev, "failed to get keypad clk\n"); - error = PTR_ERR(keypad->clk); - goto err_unmap_base; - } - - keypad->input_dev = input_dev; - keypad->pdev = pdev; - keypad->row_shift = row_shift; - keypad->rows = pdata->rows; - keypad->cols = pdata->cols; - keypad->stopped = true; - init_waitqueue_head(&keypad->wait); - - if (pdev->dev.of_node) { -#ifdef CONFIG_OF - samsung_keypad_parse_dt_gpio(&pdev->dev, keypad); - keypad->type = of_device_is_compatible(pdev->dev.of_node, - "samsung,s5pv210-keypad"); -#endif - } else { - keypad->type = platform_get_device_id(pdev)->driver_data; - } - - input_dev->name = pdev->name; - input_dev->id.bustype = BUS_HOST; - input_dev->dev.parent = &pdev->dev; - input_set_drvdata(input_dev, keypad); - - input_dev->open = samsung_keypad_open; - input_dev->close = samsung_keypad_close; - - input_dev->evbit[0] = BIT_MASK(EV_KEY); - if (!pdata->no_autorepeat) - input_dev->evbit[0] |= BIT_MASK(EV_REP); - - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - - input_dev->keycode = keypad->keycodes; - input_dev->keycodesize = sizeof(keypad->keycodes[0]); - input_dev->keycodemax = pdata->rows << row_shift; - - matrix_keypad_build_keymap(keymap_data, row_shift, - input_dev->keycode, input_dev->keybit); - - keypad->irq = platform_get_irq(pdev, 0); - if (keypad->irq < 0) { - error = keypad->irq; - goto err_put_clk; - } - - error = request_threaded_irq(keypad->irq, NULL, samsung_keypad_irq, - IRQF_ONESHOT, dev_name(&pdev->dev), keypad); - if (error) { - dev_err(&pdev->dev, "failed to register keypad interrupt\n"); - goto err_put_clk; - } - - device_init_wakeup(&pdev->dev, pdata->wakeup); - platform_set_drvdata(pdev, keypad); - pm_runtime_enable(&pdev->dev); - - error = input_register_device(keypad->input_dev); - if (error) - goto err_free_irq; - - if (pdev->dev.of_node) { - devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap); - devm_kfree(&pdev->dev, (void *)pdata->keymap_data); - devm_kfree(&pdev->dev, (void *)pdata); - } - return 0; - -err_free_irq: - free_irq(keypad->irq, keypad); - pm_runtime_disable(&pdev->dev); - device_init_wakeup(&pdev->dev, 0); - platform_set_drvdata(pdev, NULL); -err_put_clk: - clk_put(keypad->clk); - samsung_keypad_dt_gpio_free(keypad); -err_unmap_base: - iounmap(keypad->base); -err_free_mem: - input_free_device(input_dev); - kfree(keypad); - - return error; -} - -static int __devexit samsung_keypad_remove(struct platform_device *pdev) -{ - struct samsung_keypad *keypad = platform_get_drvdata(pdev); - - pm_runtime_disable(&pdev->dev); - device_init_wakeup(&pdev->dev, 0); - platform_set_drvdata(pdev, NULL); - - input_unregister_device(keypad->input_dev); - - /* - * It is safe to free IRQ after unregistering device because - * samsung_keypad_close will shut off interrupts. - */ - free_irq(keypad->irq, keypad); - - clk_put(keypad->clk); - samsung_keypad_dt_gpio_free(keypad); - - iounmap(keypad->base); - kfree(keypad); - - return 0; -} - -#ifdef CONFIG_PM_RUNTIME -static int samsung_keypad_runtime_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct samsung_keypad *keypad = platform_get_drvdata(pdev); - unsigned int val; - int error; - - if (keypad->stopped) - return 0; - - /* This may fail on some SoCs due to lack of controller support */ - error = enable_irq_wake(keypad->irq); - if (!error) - keypad->wake_enabled = true; - - val = readl(keypad->base + SAMSUNG_KEYIFCON); - val |= SAMSUNG_KEYIFCON_WAKEUPEN; - writel(val, keypad->base + SAMSUNG_KEYIFCON); - - clk_disable(keypad->clk); - - return 0; -} - -static int samsung_keypad_runtime_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct samsung_keypad *keypad = platform_get_drvdata(pdev); - unsigned int val; - - if (keypad->stopped) - return 0; - - clk_enable(keypad->clk); - - val = readl(keypad->base + SAMSUNG_KEYIFCON); - val &= ~SAMSUNG_KEYIFCON_WAKEUPEN; - writel(val, keypad->base + SAMSUNG_KEYIFCON); - - if (keypad->wake_enabled) - disable_irq_wake(keypad->irq); - - return 0; -} -#endif - -#ifdef CONFIG_PM_SLEEP -static void samsung_keypad_toggle_wakeup(struct samsung_keypad *keypad, - bool enable) -{ - unsigned int val; - - clk_enable(keypad->clk); - - val = readl(keypad->base + SAMSUNG_KEYIFCON); - if (enable) { - val |= SAMSUNG_KEYIFCON_WAKEUPEN; - if (device_may_wakeup(&keypad->pdev->dev)) - enable_irq_wake(keypad->irq); - } else { - val &= ~SAMSUNG_KEYIFCON_WAKEUPEN; - if (device_may_wakeup(&keypad->pdev->dev)) - disable_irq_wake(keypad->irq); - } - writel(val, keypad->base + SAMSUNG_KEYIFCON); - - clk_disable(keypad->clk); -} - -static int samsung_keypad_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct samsung_keypad *keypad = platform_get_drvdata(pdev); - struct input_dev *input_dev = keypad->input_dev; - - mutex_lock(&input_dev->mutex); - - if (input_dev->users) - samsung_keypad_stop(keypad); - - samsung_keypad_toggle_wakeup(keypad, true); - - mutex_unlock(&input_dev->mutex); - - return 0; -} - -static int samsung_keypad_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct samsung_keypad *keypad = platform_get_drvdata(pdev); - struct input_dev *input_dev = keypad->input_dev; - - mutex_lock(&input_dev->mutex); - - samsung_keypad_toggle_wakeup(keypad, false); - - if (input_dev->users) - samsung_keypad_start(keypad); - - mutex_unlock(&input_dev->mutex); - - return 0; -} -#endif - -static const struct dev_pm_ops samsung_keypad_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(samsung_keypad_suspend, samsung_keypad_resume) - SET_RUNTIME_PM_OPS(samsung_keypad_runtime_suspend, - samsung_keypad_runtime_resume, NULL) -}; - -#ifdef CONFIG_OF -static const struct of_device_id samsung_keypad_dt_match[] = { - { .compatible = "samsung,s3c6410-keypad" }, - { .compatible = "samsung,s5pv210-keypad" }, - {}, -}; -MODULE_DEVICE_TABLE(of, samsung_keypad_dt_match); -#else -#define samsung_keypad_dt_match NULL -#endif - -static struct platform_device_id samsung_keypad_driver_ids[] = { - { - .name = "samsung-keypad", - .driver_data = KEYPAD_TYPE_SAMSUNG, - }, { - .name = "s5pv210-keypad", - .driver_data = KEYPAD_TYPE_S5PV210, - }, - { }, -}; -MODULE_DEVICE_TABLE(platform, samsung_keypad_driver_ids); - -static struct platform_driver samsung_keypad_driver = { - .probe = samsung_keypad_probe, - .remove = __devexit_p(samsung_keypad_remove), - .driver = { - .name = "samsung-keypad", - .owner = THIS_MODULE, - .of_match_table = samsung_keypad_dt_match, - .pm = &samsung_keypad_pm_ops, - }, - .id_table = samsung_keypad_driver_ids, -}; -module_platform_driver(samsung_keypad_driver); - -MODULE_DESCRIPTION("Samsung keypad driver"); -MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>"); -MODULE_AUTHOR("Donghwa Lee <dh09.lee@samsung.com>"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/sh_keysc.c b/ANDROID_3.4.5/drivers/input/keyboard/sh_keysc.c deleted file mode 100644 index da54ad5d..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/sh_keysc.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - * SuperH KEYSC Keypad Driver - * - * Copyright (C) 2008 Magnus Damm - * - * Based on gpio_keys.c, Copyright 2005 Phil Blundell - * - * 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. - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/delay.h> -#include <linux/platform_device.h> -#include <linux/input.h> -#include <linux/input/sh_keysc.h> -#include <linux/bitmap.h> -#include <linux/pm_runtime.h> -#include <linux/io.h> -#include <linux/slab.h> - -static const struct { - unsigned char kymd, keyout, keyin; -} sh_keysc_mode[] = { - [SH_KEYSC_MODE_1] = { 0, 6, 5 }, - [SH_KEYSC_MODE_2] = { 1, 5, 6 }, - [SH_KEYSC_MODE_3] = { 2, 4, 7 }, - [SH_KEYSC_MODE_4] = { 3, 6, 6 }, - [SH_KEYSC_MODE_5] = { 4, 6, 7 }, - [SH_KEYSC_MODE_6] = { 5, 8, 8 }, -}; - -struct sh_keysc_priv { - void __iomem *iomem_base; - DECLARE_BITMAP(last_keys, SH_KEYSC_MAXKEYS); - struct input_dev *input; - struct sh_keysc_info pdata; -}; - -#define KYCR1 0 -#define KYCR2 1 -#define KYINDR 2 -#define KYOUTDR 3 - -#define KYCR2_IRQ_LEVEL 0x10 -#define KYCR2_IRQ_DISABLED 0x00 - -static unsigned long sh_keysc_read(struct sh_keysc_priv *p, int reg_nr) -{ - return ioread16(p->iomem_base + (reg_nr << 2)); -} - -static void sh_keysc_write(struct sh_keysc_priv *p, int reg_nr, - unsigned long value) -{ - iowrite16(value, p->iomem_base + (reg_nr << 2)); -} - -static void sh_keysc_level_mode(struct sh_keysc_priv *p, - unsigned long keys_set) -{ - struct sh_keysc_info *pdata = &p->pdata; - - sh_keysc_write(p, KYOUTDR, 0); - sh_keysc_write(p, KYCR2, KYCR2_IRQ_LEVEL | (keys_set << 8)); - - if (pdata->kycr2_delay) - udelay(pdata->kycr2_delay); -} - -static void sh_keysc_map_dbg(struct device *dev, unsigned long *map, - const char *str) -{ - int k; - - for (k = 0; k < BITS_TO_LONGS(SH_KEYSC_MAXKEYS); k++) - dev_dbg(dev, "%s[%d] 0x%lx\n", str, k, map[k]); -} - -static irqreturn_t sh_keysc_isr(int irq, void *dev_id) -{ - struct platform_device *pdev = dev_id; - struct sh_keysc_priv *priv = platform_get_drvdata(pdev); - struct sh_keysc_info *pdata = &priv->pdata; - int keyout_nr = sh_keysc_mode[pdata->mode].keyout; - int keyin_nr = sh_keysc_mode[pdata->mode].keyin; - DECLARE_BITMAP(keys, SH_KEYSC_MAXKEYS); - DECLARE_BITMAP(keys0, SH_KEYSC_MAXKEYS); - DECLARE_BITMAP(keys1, SH_KEYSC_MAXKEYS); - unsigned char keyin_set, tmp; - int i, k, n; - - dev_dbg(&pdev->dev, "isr!\n"); - - bitmap_fill(keys1, SH_KEYSC_MAXKEYS); - bitmap_zero(keys0, SH_KEYSC_MAXKEYS); - - do { - bitmap_zero(keys, SH_KEYSC_MAXKEYS); - keyin_set = 0; - - sh_keysc_write(priv, KYCR2, KYCR2_IRQ_DISABLED); - - for (i = 0; i < keyout_nr; i++) { - n = keyin_nr * i; - - /* drive one KEYOUT pin low, read KEYIN pins */ - sh_keysc_write(priv, KYOUTDR, 0xffff ^ (3 << (i * 2))); - udelay(pdata->delay); - tmp = sh_keysc_read(priv, KYINDR); - - /* set bit if key press has been detected */ - for (k = 0; k < keyin_nr; k++) { - if (tmp & (1 << k)) - __set_bit(n + k, keys); - } - - /* keep track of which KEYIN bits that have been set */ - keyin_set |= tmp ^ ((1 << keyin_nr) - 1); - } - - sh_keysc_level_mode(priv, keyin_set); - - bitmap_complement(keys, keys, SH_KEYSC_MAXKEYS); - bitmap_and(keys1, keys1, keys, SH_KEYSC_MAXKEYS); - bitmap_or(keys0, keys0, keys, SH_KEYSC_MAXKEYS); - - sh_keysc_map_dbg(&pdev->dev, keys, "keys"); - - } while (sh_keysc_read(priv, KYCR2) & 0x01); - - sh_keysc_map_dbg(&pdev->dev, priv->last_keys, "last_keys"); - sh_keysc_map_dbg(&pdev->dev, keys0, "keys0"); - sh_keysc_map_dbg(&pdev->dev, keys1, "keys1"); - - for (i = 0; i < SH_KEYSC_MAXKEYS; i++) { - k = pdata->keycodes[i]; - if (!k) - continue; - - if (test_bit(i, keys0) == test_bit(i, priv->last_keys)) - continue; - - if (test_bit(i, keys1) || test_bit(i, keys0)) { - input_event(priv->input, EV_KEY, k, 1); - __set_bit(i, priv->last_keys); - } - - if (!test_bit(i, keys1)) { - input_event(priv->input, EV_KEY, k, 0); - __clear_bit(i, priv->last_keys); - } - - } - input_sync(priv->input); - - return IRQ_HANDLED; -} - -static int __devinit sh_keysc_probe(struct platform_device *pdev) -{ - struct sh_keysc_priv *priv; - struct sh_keysc_info *pdata; - struct resource *res; - struct input_dev *input; - int i; - int irq, error; - - if (!pdev->dev.platform_data) { - dev_err(&pdev->dev, "no platform data defined\n"); - error = -EINVAL; - goto err0; - } - - error = -ENXIO; - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (res == NULL) { - dev_err(&pdev->dev, "failed to get I/O memory\n"); - goto err0; - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "failed to get irq\n"); - goto err0; - } - - priv = kzalloc(sizeof(*priv), GFP_KERNEL); - if (priv == NULL) { - dev_err(&pdev->dev, "failed to allocate driver data\n"); - error = -ENOMEM; - goto err0; - } - - platform_set_drvdata(pdev, priv); - memcpy(&priv->pdata, pdev->dev.platform_data, sizeof(priv->pdata)); - pdata = &priv->pdata; - - priv->iomem_base = ioremap_nocache(res->start, resource_size(res)); - if (priv->iomem_base == NULL) { - dev_err(&pdev->dev, "failed to remap I/O memory\n"); - error = -ENXIO; - goto err1; - } - - priv->input = input_allocate_device(); - if (!priv->input) { - dev_err(&pdev->dev, "failed to allocate input device\n"); - error = -ENOMEM; - goto err2; - } - - input = priv->input; - input->evbit[0] = BIT_MASK(EV_KEY); - - input->name = pdev->name; - input->phys = "sh-keysc-keys/input0"; - input->dev.parent = &pdev->dev; - - input->id.bustype = BUS_HOST; - input->id.vendor = 0x0001; - input->id.product = 0x0001; - input->id.version = 0x0100; - - input->keycode = pdata->keycodes; - input->keycodesize = sizeof(pdata->keycodes[0]); - input->keycodemax = ARRAY_SIZE(pdata->keycodes); - - error = request_threaded_irq(irq, NULL, sh_keysc_isr, IRQF_ONESHOT, - dev_name(&pdev->dev), pdev); - if (error) { - dev_err(&pdev->dev, "failed to request IRQ\n"); - goto err3; - } - - for (i = 0; i < SH_KEYSC_MAXKEYS; i++) - __set_bit(pdata->keycodes[i], input->keybit); - __clear_bit(KEY_RESERVED, input->keybit); - - error = input_register_device(input); - if (error) { - dev_err(&pdev->dev, "failed to register input device\n"); - goto err4; - } - - pm_runtime_enable(&pdev->dev); - pm_runtime_get_sync(&pdev->dev); - - sh_keysc_write(priv, KYCR1, (sh_keysc_mode[pdata->mode].kymd << 8) | - pdata->scan_timing); - sh_keysc_level_mode(priv, 0); - - device_init_wakeup(&pdev->dev, 1); - - return 0; - - err4: - free_irq(irq, pdev); - err3: - input_free_device(input); - err2: - iounmap(priv->iomem_base); - err1: - platform_set_drvdata(pdev, NULL); - kfree(priv); - err0: - return error; -} - -static int __devexit sh_keysc_remove(struct platform_device *pdev) -{ - struct sh_keysc_priv *priv = platform_get_drvdata(pdev); - - sh_keysc_write(priv, KYCR2, KYCR2_IRQ_DISABLED); - - input_unregister_device(priv->input); - free_irq(platform_get_irq(pdev, 0), pdev); - iounmap(priv->iomem_base); - - pm_runtime_put_sync(&pdev->dev); - pm_runtime_disable(&pdev->dev); - - platform_set_drvdata(pdev, NULL); - kfree(priv); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int sh_keysc_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct sh_keysc_priv *priv = platform_get_drvdata(pdev); - int irq = platform_get_irq(pdev, 0); - unsigned short value; - - value = sh_keysc_read(priv, KYCR1); - - if (device_may_wakeup(dev)) { - sh_keysc_write(priv, KYCR1, value | 0x80); - enable_irq_wake(irq); - } else { - sh_keysc_write(priv, KYCR1, value & ~0x80); - pm_runtime_put_sync(dev); - } - - return 0; -} - -static int sh_keysc_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - int irq = platform_get_irq(pdev, 0); - - if (device_may_wakeup(dev)) - disable_irq_wake(irq); - else - pm_runtime_get_sync(dev); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(sh_keysc_dev_pm_ops, - sh_keysc_suspend, sh_keysc_resume); - -static struct platform_driver sh_keysc_device_driver = { - .probe = sh_keysc_probe, - .remove = __devexit_p(sh_keysc_remove), - .driver = { - .name = "sh_keysc", - .pm = &sh_keysc_dev_pm_ops, - } -}; -module_platform_driver(sh_keysc_device_driver); - -MODULE_AUTHOR("Magnus Damm"); -MODULE_DESCRIPTION("SuperH KEYSC Keypad Driver"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/spear-keyboard.c b/ANDROID_3.4.5/drivers/input/keyboard/spear-keyboard.c deleted file mode 100644 index 3b6b528f..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/spear-keyboard.c +++ /dev/null @@ -1,333 +0,0 @@ -/* - * SPEAr Keyboard Driver - * Based on omap-keypad driver - * - * Copyright (C) 2010 ST Microelectronics - * Rajeev Kumar<rajeev-dlh.kumar@st.com> - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#include <linux/clk.h> -#include <linux/errno.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/input.h> -#include <linux/io.h> -#include <linux/irq.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/pm_wakeup.h> -#include <linux/slab.h> -#include <linux/types.h> -#include <plat/keyboard.h> - -/* Keyboard Registers */ -#define MODE_REG 0x00 /* 16 bit reg */ -#define STATUS_REG 0x0C /* 2 bit reg */ -#define DATA_REG 0x10 /* 8 bit reg */ -#define INTR_MASK 0x54 - -/* Register Values */ -/* - * pclk freq mask = (APB FEQ -1)= 82 MHZ.Programme bit 15-9 in mode - * control register as 1010010(82MHZ) - */ -#define PCLK_FREQ_MSK 0xA400 /* 82 MHz */ -#define START_SCAN 0x0100 -#define SCAN_RATE_10 0x0000 -#define SCAN_RATE_20 0x0004 -#define SCAN_RATE_40 0x0008 -#define SCAN_RATE_80 0x000C -#define MODE_KEYBOARD 0x0002 -#define DATA_AVAIL 0x2 - -#define KEY_MASK 0xFF000000 -#define KEY_VALUE 0x00FFFFFF -#define ROW_MASK 0xF0 -#define COLUMN_MASK 0x0F -#define ROW_SHIFT 4 -#define KEY_MATRIX_SHIFT 6 - -struct spear_kbd { - struct input_dev *input; - struct resource *res; - void __iomem *io_base; - struct clk *clk; - unsigned int irq; - unsigned int mode; - unsigned short last_key; - unsigned short keycodes[256]; -}; - -static irqreturn_t spear_kbd_interrupt(int irq, void *dev_id) -{ - struct spear_kbd *kbd = dev_id; - struct input_dev *input = kbd->input; - unsigned int key; - u8 sts, val; - - sts = readb(kbd->io_base + STATUS_REG); - if (!(sts & DATA_AVAIL)) - return IRQ_NONE; - - if (kbd->last_key != KEY_RESERVED) { - input_report_key(input, kbd->last_key, 0); - kbd->last_key = KEY_RESERVED; - } - - /* following reads active (row, col) pair */ - val = readb(kbd->io_base + DATA_REG); - key = kbd->keycodes[val]; - - input_event(input, EV_MSC, MSC_SCAN, val); - input_report_key(input, key, 1); - input_sync(input); - - kbd->last_key = key; - - /* clear interrupt */ - writeb(0, kbd->io_base + STATUS_REG); - - return IRQ_HANDLED; -} - -static int spear_kbd_open(struct input_dev *dev) -{ - struct spear_kbd *kbd = input_get_drvdata(dev); - int error; - u16 val; - - kbd->last_key = KEY_RESERVED; - - error = clk_enable(kbd->clk); - if (error) - return error; - - /* program keyboard */ - val = SCAN_RATE_80 | MODE_KEYBOARD | PCLK_FREQ_MSK | - (kbd->mode << KEY_MATRIX_SHIFT); - writew(val, kbd->io_base + MODE_REG); - writeb(1, kbd->io_base + STATUS_REG); - - /* start key scan */ - val = readw(kbd->io_base + MODE_REG); - val |= START_SCAN; - writew(val, kbd->io_base + MODE_REG); - - return 0; -} - -static void spear_kbd_close(struct input_dev *dev) -{ - struct spear_kbd *kbd = input_get_drvdata(dev); - u16 val; - - /* stop key scan */ - val = readw(kbd->io_base + MODE_REG); - val &= ~START_SCAN; - writew(val, kbd->io_base + MODE_REG); - - clk_disable(kbd->clk); - - kbd->last_key = KEY_RESERVED; -} - -static int __devinit spear_kbd_probe(struct platform_device *pdev) -{ - const struct kbd_platform_data *pdata = pdev->dev.platform_data; - const struct matrix_keymap_data *keymap; - struct spear_kbd *kbd; - struct input_dev *input_dev; - struct resource *res; - int irq; - int error; - - if (!pdata) { - dev_err(&pdev->dev, "Invalid platform data\n"); - return -EINVAL; - } - - keymap = pdata->keymap; - if (!keymap) { - dev_err(&pdev->dev, "no keymap defined\n"); - return -EINVAL; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "no keyboard resource defined\n"); - return -EBUSY; - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "not able to get irq for the device\n"); - return irq; - } - - kbd = kzalloc(sizeof(*kbd), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!kbd || !input_dev) { - dev_err(&pdev->dev, "out of memory\n"); - error = -ENOMEM; - goto err_free_mem; - } - - kbd->input = input_dev; - kbd->irq = irq; - kbd->mode = pdata->mode; - - kbd->res = request_mem_region(res->start, resource_size(res), - pdev->name); - if (!kbd->res) { - dev_err(&pdev->dev, "keyboard region already claimed\n"); - error = -EBUSY; - goto err_free_mem; - } - - kbd->io_base = ioremap(res->start, resource_size(res)); - if (!kbd->io_base) { - dev_err(&pdev->dev, "ioremap failed for kbd_region\n"); - error = -ENOMEM; - goto err_release_mem_region; - } - - kbd->clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(kbd->clk)) { - error = PTR_ERR(kbd->clk); - goto err_iounmap; - } - - input_dev->name = "Spear Keyboard"; - input_dev->phys = "keyboard/input0"; - input_dev->dev.parent = &pdev->dev; - input_dev->id.bustype = BUS_HOST; - input_dev->id.vendor = 0x0001; - input_dev->id.product = 0x0001; - input_dev->id.version = 0x0100; - input_dev->open = spear_kbd_open; - input_dev->close = spear_kbd_close; - - __set_bit(EV_KEY, input_dev->evbit); - if (pdata->rep) - __set_bit(EV_REP, input_dev->evbit); - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - - input_dev->keycode = kbd->keycodes; - input_dev->keycodesize = sizeof(kbd->keycodes[0]); - input_dev->keycodemax = ARRAY_SIZE(kbd->keycodes); - - matrix_keypad_build_keymap(keymap, ROW_SHIFT, - input_dev->keycode, input_dev->keybit); - - input_set_drvdata(input_dev, kbd); - - error = request_irq(irq, spear_kbd_interrupt, 0, "keyboard", kbd); - if (error) { - dev_err(&pdev->dev, "request_irq fail\n"); - goto err_put_clk; - } - - error = input_register_device(input_dev); - if (error) { - dev_err(&pdev->dev, "Unable to register keyboard device\n"); - goto err_free_irq; - } - - device_init_wakeup(&pdev->dev, 1); - platform_set_drvdata(pdev, kbd); - - return 0; - -err_free_irq: - free_irq(kbd->irq, kbd); -err_put_clk: - clk_put(kbd->clk); -err_iounmap: - iounmap(kbd->io_base); -err_release_mem_region: - release_mem_region(res->start, resource_size(res)); -err_free_mem: - input_free_device(input_dev); - kfree(kbd); - - return error; -} - -static int __devexit spear_kbd_remove(struct platform_device *pdev) -{ - struct spear_kbd *kbd = platform_get_drvdata(pdev); - - free_irq(kbd->irq, kbd); - input_unregister_device(kbd->input); - clk_put(kbd->clk); - iounmap(kbd->io_base); - release_mem_region(kbd->res->start, resource_size(kbd->res)); - kfree(kbd); - - device_init_wakeup(&pdev->dev, 1); - platform_set_drvdata(pdev, NULL); - - return 0; -} - -#ifdef CONFIG_PM -static int spear_kbd_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct spear_kbd *kbd = platform_get_drvdata(pdev); - struct input_dev *input_dev = kbd->input; - - mutex_lock(&input_dev->mutex); - - if (input_dev->users) - clk_enable(kbd->clk); - - if (device_may_wakeup(&pdev->dev)) - enable_irq_wake(kbd->irq); - - mutex_unlock(&input_dev->mutex); - - return 0; -} - -static int spear_kbd_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct spear_kbd *kbd = platform_get_drvdata(pdev); - struct input_dev *input_dev = kbd->input; - - mutex_lock(&input_dev->mutex); - - if (device_may_wakeup(&pdev->dev)) - disable_irq_wake(kbd->irq); - - if (input_dev->users) - clk_enable(kbd->clk); - - mutex_unlock(&input_dev->mutex); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(spear_kbd_pm_ops, spear_kbd_suspend, spear_kbd_resume); - -static struct platform_driver spear_kbd_driver = { - .probe = spear_kbd_probe, - .remove = __devexit_p(spear_kbd_remove), - .driver = { - .name = "keyboard", - .owner = THIS_MODULE, - .pm = &spear_kbd_pm_ops, - }, -}; -module_platform_driver(spear_kbd_driver); - -MODULE_AUTHOR("Rajeev Kumar"); -MODULE_DESCRIPTION("SPEAr Keyboard Driver"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/stmpe-keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/stmpe-keypad.c deleted file mode 100644 index 9397cf9c..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/stmpe-keypad.c +++ /dev/null @@ -1,375 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * License Terms: GNU General Public License, version 2 - * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/slab.h> -#include <linux/input.h> -#include <linux/interrupt.h> -#include <linux/platform_device.h> -#include <linux/input/matrix_keypad.h> -#include <linux/mfd/stmpe.h> - -/* These are at the same addresses in all STMPE variants */ -#define STMPE_KPC_COL 0x60 -#define STMPE_KPC_ROW_MSB 0x61 -#define STMPE_KPC_ROW_LSB 0x62 -#define STMPE_KPC_CTRL_MSB 0x63 -#define STMPE_KPC_CTRL_LSB 0x64 -#define STMPE_KPC_COMBI_KEY_0 0x65 -#define STMPE_KPC_COMBI_KEY_1 0x66 -#define STMPE_KPC_COMBI_KEY_2 0x67 -#define STMPE_KPC_DATA_BYTE0 0x68 -#define STMPE_KPC_DATA_BYTE1 0x69 -#define STMPE_KPC_DATA_BYTE2 0x6a -#define STMPE_KPC_DATA_BYTE3 0x6b -#define STMPE_KPC_DATA_BYTE4 0x6c - -#define STMPE_KPC_CTRL_LSB_SCAN (0x1 << 0) -#define STMPE_KPC_CTRL_LSB_DEBOUNCE (0x7f << 1) -#define STMPE_KPC_CTRL_MSB_SCAN_COUNT (0xf << 4) - -#define STMPE_KPC_ROW_MSB_ROWS 0xff - -#define STMPE_KPC_DATA_UP (0x1 << 7) -#define STMPE_KPC_DATA_ROW (0xf << 3) -#define STMPE_KPC_DATA_COL (0x7 << 0) -#define STMPE_KPC_DATA_NOKEY_MASK 0x78 - -#define STMPE_KEYPAD_MAX_DEBOUNCE 127 -#define STMPE_KEYPAD_MAX_SCAN_COUNT 15 - -#define STMPE_KEYPAD_MAX_ROWS 8 -#define STMPE_KEYPAD_MAX_COLS 8 -#define STMPE_KEYPAD_ROW_SHIFT 3 -#define STMPE_KEYPAD_KEYMAP_SIZE \ - (STMPE_KEYPAD_MAX_ROWS * STMPE_KEYPAD_MAX_COLS) - -/** - * struct stmpe_keypad_variant - model-specific attributes - * @auto_increment: whether the KPC_DATA_BYTE register address - * auto-increments on multiple read - * @num_data: number of data bytes - * @num_normal_data: number of normal keys' data bytes - * @max_cols: maximum number of columns supported - * @max_rows: maximum number of rows supported - * @col_gpios: bitmask of gpios which can be used for columns - * @row_gpios: bitmask of gpios which can be used for rows - */ -struct stmpe_keypad_variant { - bool auto_increment; - int num_data; - int num_normal_data; - int max_cols; - int max_rows; - unsigned int col_gpios; - unsigned int row_gpios; -}; - -static const struct stmpe_keypad_variant stmpe_keypad_variants[] = { - [STMPE1601] = { - .auto_increment = true, - .num_data = 5, - .num_normal_data = 3, - .max_cols = 8, - .max_rows = 8, - .col_gpios = 0x000ff, /* GPIO 0 - 7 */ - .row_gpios = 0x0ff00, /* GPIO 8 - 15 */ - }, - [STMPE2401] = { - .auto_increment = false, - .num_data = 3, - .num_normal_data = 2, - .max_cols = 8, - .max_rows = 12, - .col_gpios = 0x0000ff, /* GPIO 0 - 7*/ - .row_gpios = 0x1fef00, /* GPIO 8-14, 16-20 */ - }, - [STMPE2403] = { - .auto_increment = true, - .num_data = 5, - .num_normal_data = 3, - .max_cols = 8, - .max_rows = 12, - .col_gpios = 0x0000ff, /* GPIO 0 - 7*/ - .row_gpios = 0x1fef00, /* GPIO 8-14, 16-20 */ - }, -}; - -struct stmpe_keypad { - struct stmpe *stmpe; - struct input_dev *input; - const struct stmpe_keypad_variant *variant; - const struct stmpe_keypad_platform_data *plat; - - unsigned int rows; - unsigned int cols; - - unsigned short keymap[STMPE_KEYPAD_KEYMAP_SIZE]; -}; - -static int stmpe_keypad_read_data(struct stmpe_keypad *keypad, u8 *data) -{ - const struct stmpe_keypad_variant *variant = keypad->variant; - struct stmpe *stmpe = keypad->stmpe; - int ret; - int i; - - if (variant->auto_increment) - return stmpe_block_read(stmpe, STMPE_KPC_DATA_BYTE0, - variant->num_data, data); - - for (i = 0; i < variant->num_data; i++) { - ret = stmpe_reg_read(stmpe, STMPE_KPC_DATA_BYTE0 + i); - if (ret < 0) - return ret; - - data[i] = ret; - } - - return 0; -} - -static irqreturn_t stmpe_keypad_irq(int irq, void *dev) -{ - struct stmpe_keypad *keypad = dev; - struct input_dev *input = keypad->input; - const struct stmpe_keypad_variant *variant = keypad->variant; - u8 fifo[variant->num_data]; - int ret; - int i; - - ret = stmpe_keypad_read_data(keypad, fifo); - if (ret < 0) - return IRQ_NONE; - - for (i = 0; i < variant->num_normal_data; i++) { - u8 data = fifo[i]; - int row = (data & STMPE_KPC_DATA_ROW) >> 3; - int col = data & STMPE_KPC_DATA_COL; - int code = MATRIX_SCAN_CODE(row, col, STMPE_KEYPAD_ROW_SHIFT); - bool up = data & STMPE_KPC_DATA_UP; - - if ((data & STMPE_KPC_DATA_NOKEY_MASK) - == STMPE_KPC_DATA_NOKEY_MASK) - continue; - - input_event(input, EV_MSC, MSC_SCAN, code); - input_report_key(input, keypad->keymap[code], !up); - input_sync(input); - } - - return IRQ_HANDLED; -} - -static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad) -{ - const struct stmpe_keypad_variant *variant = keypad->variant; - unsigned int col_gpios = variant->col_gpios; - unsigned int row_gpios = variant->row_gpios; - struct stmpe *stmpe = keypad->stmpe; - unsigned int pins = 0; - int i; - - /* - * Figure out which pins need to be set to the keypad alternate - * function. - * - * {cols,rows}_gpios are bitmasks of which pins on the chip can be used - * for the keypad. - * - * keypad->{cols,rows} are a bitmask of which pins (of the ones useable - * for the keypad) are used on the board. - */ - - for (i = 0; i < variant->max_cols; i++) { - int num = __ffs(col_gpios); - - if (keypad->cols & (1 << i)) - pins |= 1 << num; - - col_gpios &= ~(1 << num); - } - - for (i = 0; i < variant->max_rows; i++) { - int num = __ffs(row_gpios); - - if (keypad->rows & (1 << i)) - pins |= 1 << num; - - row_gpios &= ~(1 << num); - } - - return stmpe_set_altfunc(stmpe, pins, STMPE_BLOCK_KEYPAD); -} - -static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad) -{ - const struct stmpe_keypad_platform_data *plat = keypad->plat; - const struct stmpe_keypad_variant *variant = keypad->variant; - struct stmpe *stmpe = keypad->stmpe; - int ret; - - if (plat->debounce_ms > STMPE_KEYPAD_MAX_DEBOUNCE) - return -EINVAL; - - if (plat->scan_count > STMPE_KEYPAD_MAX_SCAN_COUNT) - return -EINVAL; - - ret = stmpe_enable(stmpe, STMPE_BLOCK_KEYPAD); - if (ret < 0) - return ret; - - ret = stmpe_keypad_altfunc_init(keypad); - if (ret < 0) - return ret; - - ret = stmpe_reg_write(stmpe, STMPE_KPC_COL, keypad->cols); - if (ret < 0) - return ret; - - ret = stmpe_reg_write(stmpe, STMPE_KPC_ROW_LSB, keypad->rows); - if (ret < 0) - return ret; - - if (variant->max_rows > 8) { - ret = stmpe_set_bits(stmpe, STMPE_KPC_ROW_MSB, - STMPE_KPC_ROW_MSB_ROWS, - keypad->rows >> 8); - if (ret < 0) - return ret; - } - - ret = stmpe_set_bits(stmpe, STMPE_KPC_CTRL_MSB, - STMPE_KPC_CTRL_MSB_SCAN_COUNT, - plat->scan_count << 4); - if (ret < 0) - return ret; - - return stmpe_set_bits(stmpe, STMPE_KPC_CTRL_LSB, - STMPE_KPC_CTRL_LSB_SCAN | - STMPE_KPC_CTRL_LSB_DEBOUNCE, - STMPE_KPC_CTRL_LSB_SCAN | - (plat->debounce_ms << 1)); -} - -static int __devinit stmpe_keypad_probe(struct platform_device *pdev) -{ - struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); - struct stmpe_keypad_platform_data *plat; - struct stmpe_keypad *keypad; - struct input_dev *input; - int ret; - int irq; - int i; - - plat = stmpe->pdata->keypad; - if (!plat) - return -ENODEV; - - irq = platform_get_irq(pdev, 0); - if (irq < 0) - return irq; - - keypad = kzalloc(sizeof(struct stmpe_keypad), GFP_KERNEL); - if (!keypad) - return -ENOMEM; - - input = input_allocate_device(); - if (!input) { - ret = -ENOMEM; - goto out_freekeypad; - } - - input->name = "STMPE keypad"; - input->id.bustype = BUS_I2C; - input->dev.parent = &pdev->dev; - - input_set_capability(input, EV_MSC, MSC_SCAN); - - __set_bit(EV_KEY, input->evbit); - if (!plat->no_autorepeat) - __set_bit(EV_REP, input->evbit); - - input->keycode = keypad->keymap; - input->keycodesize = sizeof(keypad->keymap[0]); - input->keycodemax = ARRAY_SIZE(keypad->keymap); - - matrix_keypad_build_keymap(plat->keymap_data, STMPE_KEYPAD_ROW_SHIFT, - input->keycode, input->keybit); - - for (i = 0; i < plat->keymap_data->keymap_size; i++) { - unsigned int key = plat->keymap_data->keymap[i]; - - keypad->cols |= 1 << KEY_COL(key); - keypad->rows |= 1 << KEY_ROW(key); - } - - keypad->stmpe = stmpe; - keypad->plat = plat; - keypad->input = input; - keypad->variant = &stmpe_keypad_variants[stmpe->partnum]; - - ret = stmpe_keypad_chip_init(keypad); - if (ret < 0) - goto out_freeinput; - - ret = input_register_device(input); - if (ret) { - dev_err(&pdev->dev, - "unable to register input device: %d\n", ret); - goto out_freeinput; - } - - ret = request_threaded_irq(irq, NULL, stmpe_keypad_irq, IRQF_ONESHOT, - "stmpe-keypad", keypad); - if (ret) { - dev_err(&pdev->dev, "unable to get irq: %d\n", ret); - goto out_unregisterinput; - } - - platform_set_drvdata(pdev, keypad); - - return 0; - -out_unregisterinput: - input_unregister_device(input); - input = NULL; -out_freeinput: - input_free_device(input); -out_freekeypad: - kfree(keypad); - return ret; -} - -static int __devexit stmpe_keypad_remove(struct platform_device *pdev) -{ - struct stmpe_keypad *keypad = platform_get_drvdata(pdev); - struct stmpe *stmpe = keypad->stmpe; - int irq = platform_get_irq(pdev, 0); - - stmpe_disable(stmpe, STMPE_BLOCK_KEYPAD); - - free_irq(irq, keypad); - input_unregister_device(keypad->input); - platform_set_drvdata(pdev, NULL); - kfree(keypad); - - return 0; -} - -static struct platform_driver stmpe_keypad_driver = { - .driver.name = "stmpe-keypad", - .driver.owner = THIS_MODULE, - .probe = stmpe_keypad_probe, - .remove = __devexit_p(stmpe_keypad_remove), -}; -module_platform_driver(stmpe_keypad_driver); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("STMPExxxx keypad driver"); -MODULE_AUTHOR("Rabin Vincent <rabin.vincent@stericsson.com>"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/stowaway.c b/ANDROID_3.4.5/drivers/input/keyboard/stowaway.c deleted file mode 100644 index 74372193..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/stowaway.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Stowaway keyboard driver for Linux - */ - -/* - * Copyright (c) 2006 Marek Vasut - * - * Based on Newton keyboard driver for Linux - * by Justin Cormack - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * - * Should you need to contact me, the author, you can do so either by - * e-mail - mail your message to <marek.vasut@gmail.com>, or by paper mail: - * Marek Vasut, Liskovecka 559, Frydek-Mistek, 738 01 Czech Republic - */ - -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/input.h> -#include <linux/init.h> -#include <linux/serio.h> - -#define DRIVER_DESC "Stowaway keyboard driver" - -MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_LICENSE("GPL"); - -#define SKBD_KEY_MASK 0x7f -#define SKBD_RELEASE 0x80 - -static unsigned char skbd_keycode[128] = { - KEY_1, KEY_2, KEY_3, KEY_Z, KEY_4, KEY_5, KEY_6, KEY_7, - 0, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_GRAVE, - KEY_X, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_SPACE, - KEY_CAPSLOCK, KEY_TAB, KEY_LEFTCTRL, 0, 0, 0, 0, 0, - 0, 0, 0, KEY_LEFTALT, 0, 0, 0, 0, - 0, 0, 0, 0, KEY_C, KEY_V, KEY_B, KEY_N, - KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_HOME, KEY_8, KEY_9, KEY_0, KEY_ESC, - KEY_LEFTBRACE, KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_END, KEY_U, KEY_I, KEY_O, KEY_P, - KEY_APOSTROPHE, KEY_ENTER, KEY_PAGEUP,0, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, - KEY_SLASH, KEY_UP, KEY_PAGEDOWN, 0,KEY_M, KEY_COMMA, KEY_DOT, KEY_INSERT, - KEY_DELETE, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, - KEY_LEFTSHIFT, KEY_RIGHTSHIFT, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, - KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, 0, 0, 0 -}; - -struct skbd { - unsigned char keycode[128]; - struct input_dev *dev; - struct serio *serio; - char phys[32]; -}; - -static irqreturn_t skbd_interrupt(struct serio *serio, unsigned char data, - unsigned int flags) -{ - struct skbd *skbd = serio_get_drvdata(serio); - struct input_dev *dev = skbd->dev; - - if (skbd->keycode[data & SKBD_KEY_MASK]) { - input_report_key(dev, skbd->keycode[data & SKBD_KEY_MASK], - !(data & SKBD_RELEASE)); - input_sync(dev); - } - - return IRQ_HANDLED; -} - -static int skbd_connect(struct serio *serio, struct serio_driver *drv) -{ - struct skbd *skbd; - struct input_dev *input_dev; - int err = -ENOMEM; - int i; - - skbd = kzalloc(sizeof(struct skbd), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!skbd || !input_dev) - goto fail1; - - skbd->serio = serio; - skbd->dev = input_dev; - snprintf(skbd->phys, sizeof(skbd->phys), "%s/input0", serio->phys); - memcpy(skbd->keycode, skbd_keycode, sizeof(skbd->keycode)); - - input_dev->name = "Stowaway Keyboard"; - input_dev->phys = skbd->phys; - input_dev->id.bustype = BUS_RS232; - input_dev->id.vendor = SERIO_STOWAWAY; - input_dev->id.product = 0x0001; - input_dev->id.version = 0x0100; - input_dev->dev.parent = &serio->dev; - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - input_dev->keycode = skbd->keycode; - input_dev->keycodesize = sizeof(unsigned char); - input_dev->keycodemax = ARRAY_SIZE(skbd_keycode); - for (i = 0; i < ARRAY_SIZE(skbd_keycode); i++) - set_bit(skbd_keycode[i], input_dev->keybit); - clear_bit(0, input_dev->keybit); - - serio_set_drvdata(serio, skbd); - - err = serio_open(serio, drv); - if (err) - goto fail2; - - err = input_register_device(skbd->dev); - if (err) - goto fail3; - - return 0; - - fail3: serio_close(serio); - fail2: serio_set_drvdata(serio, NULL); - fail1: input_free_device(input_dev); - kfree(skbd); - return err; -} - -static void skbd_disconnect(struct serio *serio) -{ - struct skbd *skbd = serio_get_drvdata(serio); - - serio_close(serio); - serio_set_drvdata(serio, NULL); - input_unregister_device(skbd->dev); - kfree(skbd); -} - -static struct serio_device_id skbd_serio_ids[] = { - { - .type = SERIO_RS232, - .proto = SERIO_STOWAWAY, - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { 0 } -}; - -MODULE_DEVICE_TABLE(serio, skbd_serio_ids); - -static struct serio_driver skbd_drv = { - .driver = { - .name = "stowaway", - }, - .description = DRIVER_DESC, - .id_table = skbd_serio_ids, - .interrupt = skbd_interrupt, - .connect = skbd_connect, - .disconnect = skbd_disconnect, -}; - -static int __init skbd_init(void) -{ - return serio_register_driver(&skbd_drv); -} - -static void __exit skbd_exit(void) -{ - serio_unregister_driver(&skbd_drv); -} - -module_init(skbd_init); -module_exit(skbd_exit); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/sunkbd.c b/ANDROID_3.4.5/drivers/input/keyboard/sunkbd.c deleted file mode 100644 index a99a04b0..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/sunkbd.c +++ /dev/null @@ -1,387 +0,0 @@ -/* - * Copyright (c) 1999-2001 Vojtech Pavlik - */ - -/* - * Sun keyboard driver for Linux - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * - * Should you need to contact me, the author, you can do so either by - * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail: - * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic - */ - -#include <linux/delay.h> -#include <linux/sched.h> -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/interrupt.h> -#include <linux/init.h> -#include <linux/input.h> -#include <linux/serio.h> -#include <linux/workqueue.h> - -#define DRIVER_DESC "Sun keyboard driver" - -MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_LICENSE("GPL"); - -static unsigned char sunkbd_keycode[128] = { - 0,128,114,129,115, 59, 60, 68, 61, 87, 62, 88, 63,100, 64,112, - 65, 66, 67, 56,103,119, 99, 70,105,130,131,108,106, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 41, 14,110,113, 98, 55, - 116,132, 83,133,102, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27,111,127, 71, 72, 73, 74,134,135,107, 0, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 43, 28, 96, 75, 76, 77, 82,136, - 104,137, 69, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,101, - 79, 80, 81, 0, 0, 0,138, 58,125, 57,126,109, 86, 78 -}; - -#define SUNKBD_CMD_RESET 0x1 -#define SUNKBD_CMD_BELLON 0x2 -#define SUNKBD_CMD_BELLOFF 0x3 -#define SUNKBD_CMD_CLICK 0xa -#define SUNKBD_CMD_NOCLICK 0xb -#define SUNKBD_CMD_SETLED 0xe -#define SUNKBD_CMD_LAYOUT 0xf - -#define SUNKBD_RET_RESET 0xff -#define SUNKBD_RET_ALLUP 0x7f -#define SUNKBD_RET_LAYOUT 0xfe - -#define SUNKBD_LAYOUT_5_MASK 0x20 -#define SUNKBD_RELEASE 0x80 -#define SUNKBD_KEY 0x7f - -/* - * Per-keyboard data. - */ - -struct sunkbd { - unsigned char keycode[ARRAY_SIZE(sunkbd_keycode)]; - struct input_dev *dev; - struct serio *serio; - struct work_struct tq; - wait_queue_head_t wait; - char name[64]; - char phys[32]; - char type; - bool enabled; - volatile s8 reset; - volatile s8 layout; -}; - -/* - * sunkbd_interrupt() is called by the low level driver when a character - * is received. - */ - -static irqreturn_t sunkbd_interrupt(struct serio *serio, - unsigned char data, unsigned int flags) -{ - struct sunkbd *sunkbd = serio_get_drvdata(serio); - - if (sunkbd->reset <= -1) { - /* - * If cp[i] is 0xff, sunkbd->reset will stay -1. - * The keyboard sends 0xff 0xff 0xID on powerup. - */ - sunkbd->reset = data; - wake_up_interruptible(&sunkbd->wait); - goto out; - } - - if (sunkbd->layout == -1) { - sunkbd->layout = data; - wake_up_interruptible(&sunkbd->wait); - goto out; - } - - switch (data) { - - case SUNKBD_RET_RESET: - schedule_work(&sunkbd->tq); - sunkbd->reset = -1; - break; - - case SUNKBD_RET_LAYOUT: - sunkbd->layout = -1; - break; - - case SUNKBD_RET_ALLUP: /* All keys released */ - break; - - default: - if (!sunkbd->enabled) - break; - - if (sunkbd->keycode[data & SUNKBD_KEY]) { - input_report_key(sunkbd->dev, - sunkbd->keycode[data & SUNKBD_KEY], - !(data & SUNKBD_RELEASE)); - input_sync(sunkbd->dev); - } else { - printk(KERN_WARNING - "sunkbd.c: Unknown key (scancode %#x) %s.\n", - data & SUNKBD_KEY, - data & SUNKBD_RELEASE ? "released" : "pressed"); - } - } -out: - return IRQ_HANDLED; -} - -/* - * sunkbd_event() handles events from the input module. - */ - -static int sunkbd_event(struct input_dev *dev, - unsigned int type, unsigned int code, int value) -{ - struct sunkbd *sunkbd = input_get_drvdata(dev); - - switch (type) { - - case EV_LED: - - serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); - serio_write(sunkbd->serio, - (!!test_bit(LED_CAPSL, dev->led) << 3) | - (!!test_bit(LED_SCROLLL, dev->led) << 2) | - (!!test_bit(LED_COMPOSE, dev->led) << 1) | - !!test_bit(LED_NUML, dev->led)); - return 0; - - case EV_SND: - - switch (code) { - - case SND_CLICK: - serio_write(sunkbd->serio, SUNKBD_CMD_NOCLICK - value); - return 0; - - case SND_BELL: - serio_write(sunkbd->serio, SUNKBD_CMD_BELLOFF - value); - return 0; - } - - break; - } - - return -1; -} - -/* - * sunkbd_initialize() checks for a Sun keyboard attached, and determines - * its type. - */ - -static int sunkbd_initialize(struct sunkbd *sunkbd) -{ - sunkbd->reset = -2; - serio_write(sunkbd->serio, SUNKBD_CMD_RESET); - wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); - if (sunkbd->reset < 0) - return -1; - - sunkbd->type = sunkbd->reset; - - if (sunkbd->type == 4) { /* Type 4 keyboard */ - sunkbd->layout = -2; - serio_write(sunkbd->serio, SUNKBD_CMD_LAYOUT); - wait_event_interruptible_timeout(sunkbd->wait, - sunkbd->layout >= 0, HZ / 4); - if (sunkbd->layout < 0) - return -1; - if (sunkbd->layout & SUNKBD_LAYOUT_5_MASK) - sunkbd->type = 5; - } - - return 0; -} - -/* - * sunkbd_reinit() sets leds and beeps to a state the computer remembers they - * were in. - */ - -static void sunkbd_reinit(struct work_struct *work) -{ - struct sunkbd *sunkbd = container_of(work, struct sunkbd, tq); - - wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); - - serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); - serio_write(sunkbd->serio, - (!!test_bit(LED_CAPSL, sunkbd->dev->led) << 3) | - (!!test_bit(LED_SCROLLL, sunkbd->dev->led) << 2) | - (!!test_bit(LED_COMPOSE, sunkbd->dev->led) << 1) | - !!test_bit(LED_NUML, sunkbd->dev->led)); - serio_write(sunkbd->serio, - SUNKBD_CMD_NOCLICK - !!test_bit(SND_CLICK, sunkbd->dev->snd)); - serio_write(sunkbd->serio, - SUNKBD_CMD_BELLOFF - !!test_bit(SND_BELL, sunkbd->dev->snd)); -} - -static void sunkbd_enable(struct sunkbd *sunkbd, bool enable) -{ - serio_pause_rx(sunkbd->serio); - sunkbd->enabled = enable; - serio_continue_rx(sunkbd->serio); -} - -/* - * sunkbd_connect() probes for a Sun keyboard and fills the necessary - * structures. - */ - -static int sunkbd_connect(struct serio *serio, struct serio_driver *drv) -{ - struct sunkbd *sunkbd; - struct input_dev *input_dev; - int err = -ENOMEM; - int i; - - sunkbd = kzalloc(sizeof(struct sunkbd), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!sunkbd || !input_dev) - goto fail1; - - sunkbd->serio = serio; - sunkbd->dev = input_dev; - init_waitqueue_head(&sunkbd->wait); - INIT_WORK(&sunkbd->tq, sunkbd_reinit); - snprintf(sunkbd->phys, sizeof(sunkbd->phys), "%s/input0", serio->phys); - - serio_set_drvdata(serio, sunkbd); - - err = serio_open(serio, drv); - if (err) - goto fail2; - - if (sunkbd_initialize(sunkbd) < 0) { - err = -ENODEV; - goto fail3; - } - - snprintf(sunkbd->name, sizeof(sunkbd->name), - "Sun Type %d keyboard", sunkbd->type); - memcpy(sunkbd->keycode, sunkbd_keycode, sizeof(sunkbd->keycode)); - - input_dev->name = sunkbd->name; - input_dev->phys = sunkbd->phys; - input_dev->id.bustype = BUS_RS232; - input_dev->id.vendor = SERIO_SUNKBD; - input_dev->id.product = sunkbd->type; - input_dev->id.version = 0x0100; - input_dev->dev.parent = &serio->dev; - - input_set_drvdata(input_dev, sunkbd); - - input_dev->event = sunkbd_event; - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_LED) | - BIT_MASK(EV_SND) | BIT_MASK(EV_REP); - input_dev->ledbit[0] = BIT_MASK(LED_CAPSL) | BIT_MASK(LED_COMPOSE) | - BIT_MASK(LED_SCROLLL) | BIT_MASK(LED_NUML); - input_dev->sndbit[0] = BIT_MASK(SND_CLICK) | BIT_MASK(SND_BELL); - - input_dev->keycode = sunkbd->keycode; - input_dev->keycodesize = sizeof(unsigned char); - input_dev->keycodemax = ARRAY_SIZE(sunkbd_keycode); - for (i = 0; i < ARRAY_SIZE(sunkbd_keycode); i++) - __set_bit(sunkbd->keycode[i], input_dev->keybit); - __clear_bit(KEY_RESERVED, input_dev->keybit); - - sunkbd_enable(sunkbd, true); - - err = input_register_device(sunkbd->dev); - if (err) - goto fail4; - - return 0; - - fail4: sunkbd_enable(sunkbd, false); - fail3: serio_close(serio); - fail2: serio_set_drvdata(serio, NULL); - fail1: input_free_device(input_dev); - kfree(sunkbd); - return err; -} - -/* - * sunkbd_disconnect() unregisters and closes behind us. - */ - -static void sunkbd_disconnect(struct serio *serio) -{ - struct sunkbd *sunkbd = serio_get_drvdata(serio); - - sunkbd_enable(sunkbd, false); - input_unregister_device(sunkbd->dev); - serio_close(serio); - serio_set_drvdata(serio, NULL); - kfree(sunkbd); -} - -static struct serio_device_id sunkbd_serio_ids[] = { - { - .type = SERIO_RS232, - .proto = SERIO_SUNKBD, - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { - .type = SERIO_RS232, - .proto = SERIO_UNKNOWN, /* sunkbd does probe */ - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { 0 } -}; - -MODULE_DEVICE_TABLE(serio, sunkbd_serio_ids); - -static struct serio_driver sunkbd_drv = { - .driver = { - .name = "sunkbd", - }, - .description = DRIVER_DESC, - .id_table = sunkbd_serio_ids, - .interrupt = sunkbd_interrupt, - .connect = sunkbd_connect, - .disconnect = sunkbd_disconnect, -}; - -/* - * The functions for insering/removing us as a module. - */ - -static int __init sunkbd_init(void) -{ - return serio_register_driver(&sunkbd_drv); -} - -static void __exit sunkbd_exit(void) -{ - serio_unregister_driver(&sunkbd_drv); -} - -module_init(sunkbd_init); -module_exit(sunkbd_exit); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/tc3589x-keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/tc3589x-keypad.c deleted file mode 100644 index 2dee3e4e..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/tc3589x-keypad.c +++ /dev/null @@ -1,463 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2010 - * - * Author: Jayeeta Banerjee <jayeeta.banerjee@stericsson.com> - * Author: Sundar Iyer <sundar.iyer@stericsson.com> - * - * License Terms: GNU General Public License, version 2 - * - * TC35893 MFD Keypad Controller driver - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/input.h> -#include <linux/platform_device.h> -#include <linux/input/matrix_keypad.h> -#include <linux/i2c.h> -#include <linux/slab.h> -#include <linux/mfd/tc3589x.h> - -/* Maximum supported keypad matrix row/columns size */ -#define TC3589x_MAX_KPROW 8 -#define TC3589x_MAX_KPCOL 12 - -/* keypad related Constants */ -#define TC3589x_MAX_DEBOUNCE_SETTLE 0xFF -#define DEDICATED_KEY_VAL 0xFF - -/* Pull up/down masks */ -#define TC3589x_NO_PULL_MASK 0x0 -#define TC3589x_PULL_DOWN_MASK 0x1 -#define TC3589x_PULL_UP_MASK 0x2 -#define TC3589x_PULLUP_ALL_MASK 0xAA -#define TC3589x_IO_PULL_VAL(index, mask) ((mask)<<((index)%4)*2)) - -/* Bit masks for IOCFG register */ -#define IOCFG_BALLCFG 0x01 -#define IOCFG_IG 0x08 - -#define KP_EVCODE_COL_MASK 0x0F -#define KP_EVCODE_ROW_MASK 0x70 -#define KP_RELEASE_EVT_MASK 0x80 - -#define KP_ROW_SHIFT 4 - -#define KP_NO_VALID_KEY_MASK 0x7F - -/* bit masks for RESTCTRL register */ -#define TC3589x_KBDRST 0x2 -#define TC3589x_IRQRST 0x10 -#define TC3589x_RESET_ALL 0x1B - -/* KBDMFS register bit mask */ -#define TC3589x_KBDMFS_EN 0x1 - -/* CLKEN register bitmask */ -#define KPD_CLK_EN 0x1 - -/* RSTINTCLR register bit mask */ -#define IRQ_CLEAR 0x1 - -/* bit masks for keyboard interrupts*/ -#define TC3589x_EVT_LOSS_INT 0x8 -#define TC3589x_EVT_INT 0x4 -#define TC3589x_KBD_LOSS_INT 0x2 -#define TC3589x_KBD_INT 0x1 - -/* bit masks for keyboard interrupt clear*/ -#define TC3589x_EVT_INT_CLR 0x2 -#define TC3589x_KBD_INT_CLR 0x1 - -#define TC3589x_KBD_KEYMAP_SIZE 64 - -/** - * struct tc_keypad - data structure used by keypad driver - * @tc3589x: pointer to tc35893 - * @input: pointer to input device object - * @board: keypad platform device - * @krow: number of rows - * @kcol: number of coloumns - * @keymap: matrix scan code table for keycodes - * @keypad_stopped: holds keypad status - */ -struct tc_keypad { - struct tc3589x *tc3589x; - struct input_dev *input; - const struct tc3589x_keypad_platform_data *board; - unsigned int krow; - unsigned int kcol; - unsigned short keymap[TC3589x_KBD_KEYMAP_SIZE]; - bool keypad_stopped; -}; - -static int tc3589x_keypad_init_key_hardware(struct tc_keypad *keypad) -{ - int ret; - struct tc3589x *tc3589x = keypad->tc3589x; - u8 settle_time = keypad->board->settle_time; - u8 dbounce_period = keypad->board->debounce_period; - u8 rows = keypad->board->krow & 0xf; /* mask out the nibble */ - u8 column = keypad->board->kcol & 0xf; /* mask out the nibble */ - - /* validate platform configurations */ - if (keypad->board->kcol > TC3589x_MAX_KPCOL || - keypad->board->krow > TC3589x_MAX_KPROW || - keypad->board->debounce_period > TC3589x_MAX_DEBOUNCE_SETTLE || - keypad->board->settle_time > TC3589x_MAX_DEBOUNCE_SETTLE) - return -EINVAL; - - /* configure KBDSIZE 4 LSbits for cols and 4 MSbits for rows */ - ret = tc3589x_reg_write(tc3589x, TC3589x_KBDSIZE, - (rows << KP_ROW_SHIFT) | column); - if (ret < 0) - return ret; - - /* configure dedicated key config, no dedicated key selected */ - ret = tc3589x_reg_write(tc3589x, TC3589x_KBCFG_LSB, DEDICATED_KEY_VAL); - if (ret < 0) - return ret; - - ret = tc3589x_reg_write(tc3589x, TC3589x_KBCFG_MSB, DEDICATED_KEY_VAL); - if (ret < 0) - return ret; - - /* Configure settle time */ - ret = tc3589x_reg_write(tc3589x, TC3589x_KBDSETTLE_REG, settle_time); - if (ret < 0) - return ret; - - /* Configure debounce time */ - ret = tc3589x_reg_write(tc3589x, TC3589x_KBDBOUNCE, dbounce_period); - if (ret < 0) - return ret; - - /* Start of initialise keypad GPIOs */ - ret = tc3589x_set_bits(tc3589x, TC3589x_IOCFG, 0x0, IOCFG_IG); - if (ret < 0) - return ret; - - /* Configure pull-up resistors for all row GPIOs */ - ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG0_LSB, - TC3589x_PULLUP_ALL_MASK); - if (ret < 0) - return ret; - - ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG0_MSB, - TC3589x_PULLUP_ALL_MASK); - if (ret < 0) - return ret; - - /* Configure pull-up resistors for all column GPIOs */ - ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG1_LSB, - TC3589x_PULLUP_ALL_MASK); - if (ret < 0) - return ret; - - ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG1_MSB, - TC3589x_PULLUP_ALL_MASK); - if (ret < 0) - return ret; - - ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG2_LSB, - TC3589x_PULLUP_ALL_MASK); - - return ret; -} - -#define TC35893_DATA_REGS 4 -#define TC35893_KEYCODE_FIFO_EMPTY 0x7f -#define TC35893_KEYCODE_FIFO_CLEAR 0xff -#define TC35893_KEYPAD_ROW_SHIFT 0x3 - -static irqreturn_t tc3589x_keypad_irq(int irq, void *dev) -{ - struct tc_keypad *keypad = dev; - struct tc3589x *tc3589x = keypad->tc3589x; - u8 i, row_index, col_index, kbd_code, up; - u8 code; - - for (i = 0; i < TC35893_DATA_REGS * 2; i++) { - kbd_code = tc3589x_reg_read(tc3589x, TC3589x_EVTCODE_FIFO); - - /* loop till fifo is empty and no more keys are pressed */ - if (kbd_code == TC35893_KEYCODE_FIFO_EMPTY || - kbd_code == TC35893_KEYCODE_FIFO_CLEAR) - continue; - - /* valid key is found */ - col_index = kbd_code & KP_EVCODE_COL_MASK; - row_index = (kbd_code & KP_EVCODE_ROW_MASK) >> KP_ROW_SHIFT; - code = MATRIX_SCAN_CODE(row_index, col_index, - TC35893_KEYPAD_ROW_SHIFT); - up = kbd_code & KP_RELEASE_EVT_MASK; - - input_event(keypad->input, EV_MSC, MSC_SCAN, code); - input_report_key(keypad->input, keypad->keymap[code], !up); - input_sync(keypad->input); - } - - /* clear IRQ */ - tc3589x_set_bits(tc3589x, TC3589x_KBDIC, - 0x0, TC3589x_EVT_INT_CLR | TC3589x_KBD_INT_CLR); - /* enable IRQ */ - tc3589x_set_bits(tc3589x, TC3589x_KBDMSK, - 0x0, TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT); - - return IRQ_HANDLED; -} - -static int tc3589x_keypad_enable(struct tc_keypad *keypad) -{ - struct tc3589x *tc3589x = keypad->tc3589x; - int ret; - - /* pull the keypad module out of reset */ - ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL, TC3589x_KBDRST, 0x0); - if (ret < 0) - return ret; - - /* configure KBDMFS */ - ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMFS, 0x0, TC3589x_KBDMFS_EN); - if (ret < 0) - return ret; - - /* enable the keypad clock */ - ret = tc3589x_set_bits(tc3589x, TC3589x_CLKEN, 0x0, KPD_CLK_EN); - if (ret < 0) - return ret; - - /* clear pending IRQs */ - ret = tc3589x_set_bits(tc3589x, TC3589x_RSTINTCLR, 0x0, 0x1); - if (ret < 0) - return ret; - - /* enable the IRQs */ - ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMSK, 0x0, - TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT); - if (ret < 0) - return ret; - - keypad->keypad_stopped = false; - - return ret; -} - -static int tc3589x_keypad_disable(struct tc_keypad *keypad) -{ - struct tc3589x *tc3589x = keypad->tc3589x; - int ret; - - /* clear IRQ */ - ret = tc3589x_set_bits(tc3589x, TC3589x_KBDIC, - 0x0, TC3589x_EVT_INT_CLR | TC3589x_KBD_INT_CLR); - if (ret < 0) - return ret; - - /* disable all interrupts */ - ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMSK, - ~(TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT), 0x0); - if (ret < 0) - return ret; - - /* disable the keypad module */ - ret = tc3589x_set_bits(tc3589x, TC3589x_CLKEN, 0x1, 0x0); - if (ret < 0) - return ret; - - /* put the keypad module into reset */ - ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL, TC3589x_KBDRST, 0x1); - - keypad->keypad_stopped = true; - - return ret; -} - -static int tc3589x_keypad_open(struct input_dev *input) -{ - int error; - struct tc_keypad *keypad = input_get_drvdata(input); - - /* enable the keypad module */ - error = tc3589x_keypad_enable(keypad); - if (error < 0) { - dev_err(&input->dev, "failed to enable keypad module\n"); - return error; - } - - error = tc3589x_keypad_init_key_hardware(keypad); - if (error < 0) { - dev_err(&input->dev, "failed to configure keypad module\n"); - return error; - } - - return 0; -} - -static void tc3589x_keypad_close(struct input_dev *input) -{ - struct tc_keypad *keypad = input_get_drvdata(input); - - /* disable the keypad module */ - tc3589x_keypad_disable(keypad); -} - -static int __devinit tc3589x_keypad_probe(struct platform_device *pdev) -{ - struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent); - struct tc_keypad *keypad; - struct input_dev *input; - const struct tc3589x_keypad_platform_data *plat; - int error, irq; - - plat = tc3589x->pdata->keypad; - if (!plat) { - dev_err(&pdev->dev, "invalid keypad platform data\n"); - return -EINVAL; - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) - return irq; - - keypad = kzalloc(sizeof(struct tc_keypad), GFP_KERNEL); - input = input_allocate_device(); - if (!keypad || !input) { - dev_err(&pdev->dev, "failed to allocate keypad memory\n"); - error = -ENOMEM; - goto err_free_mem; - } - - keypad->board = plat; - keypad->input = input; - keypad->tc3589x = tc3589x; - - input->id.bustype = BUS_I2C; - input->name = pdev->name; - input->dev.parent = &pdev->dev; - - input->keycode = keypad->keymap; - input->keycodesize = sizeof(keypad->keymap[0]); - input->keycodemax = ARRAY_SIZE(keypad->keymap); - - input->open = tc3589x_keypad_open; - input->close = tc3589x_keypad_close; - - input_set_drvdata(input, keypad); - - input_set_capability(input, EV_MSC, MSC_SCAN); - - __set_bit(EV_KEY, input->evbit); - if (!plat->no_autorepeat) - __set_bit(EV_REP, input->evbit); - - matrix_keypad_build_keymap(plat->keymap_data, 0x3, - input->keycode, input->keybit); - - error = request_threaded_irq(irq, NULL, - tc3589x_keypad_irq, plat->irqtype, - "tc3589x-keypad", keypad); - if (error < 0) { - dev_err(&pdev->dev, - "Could not allocate irq %d,error %d\n", - irq, error); - goto err_free_mem; - } - - error = input_register_device(input); - if (error) { - dev_err(&pdev->dev, "Could not register input device\n"); - goto err_free_irq; - } - - /* let platform decide if keypad is a wakeup source or not */ - device_init_wakeup(&pdev->dev, plat->enable_wakeup); - device_set_wakeup_capable(&pdev->dev, plat->enable_wakeup); - - platform_set_drvdata(pdev, keypad); - - return 0; - -err_free_irq: - free_irq(irq, keypad); -err_free_mem: - input_free_device(input); - kfree(keypad); - return error; -} - -static int __devexit tc3589x_keypad_remove(struct platform_device *pdev) -{ - struct tc_keypad *keypad = platform_get_drvdata(pdev); - int irq = platform_get_irq(pdev, 0); - - if (!keypad->keypad_stopped) - tc3589x_keypad_disable(keypad); - - free_irq(irq, keypad); - - input_unregister_device(keypad->input); - - kfree(keypad); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int tc3589x_keypad_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tc_keypad *keypad = platform_get_drvdata(pdev); - int irq = platform_get_irq(pdev, 0); - - /* keypad is already off; we do nothing */ - if (keypad->keypad_stopped) - return 0; - - /* if device is not a wakeup source, disable it for powersave */ - if (!device_may_wakeup(&pdev->dev)) - tc3589x_keypad_disable(keypad); - else - enable_irq_wake(irq); - - return 0; -} - -static int tc3589x_keypad_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tc_keypad *keypad = platform_get_drvdata(pdev); - int irq = platform_get_irq(pdev, 0); - - if (!keypad->keypad_stopped) - return 0; - - /* enable the device to resume normal operations */ - if (!device_may_wakeup(&pdev->dev)) - tc3589x_keypad_enable(keypad); - else - disable_irq_wake(irq); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(tc3589x_keypad_dev_pm_ops, - tc3589x_keypad_suspend, tc3589x_keypad_resume); - -static struct platform_driver tc3589x_keypad_driver = { - .driver = { - .name = "tc3589x-keypad", - .owner = THIS_MODULE, - .pm = &tc3589x_keypad_dev_pm_ops, - }, - .probe = tc3589x_keypad_probe, - .remove = __devexit_p(tc3589x_keypad_remove), -}; -module_platform_driver(tc3589x_keypad_driver); - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Jayeeta Banerjee/Sundar Iyer"); -MODULE_DESCRIPTION("TC35893 Keypad Driver"); -MODULE_ALIAS("platform:tc3589x-keypad"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/tca6416-keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/tca6416-keypad.c deleted file mode 100644 index 3afea3f8..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/tca6416-keypad.c +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Driver for keys on TCA6416 I2C IO expander - * - * Copyright (C) 2010 Texas Instruments - * - * Author : Sriramakrishnan.A.G. <srk@ti.com> - * - * 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. - */ - -#include <linux/types.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/delay.h> -#include <linux/slab.h> -#include <linux/interrupt.h> -#include <linux/workqueue.h> -#include <linux/gpio.h> -#include <linux/i2c.h> -#include <linux/input.h> -#include <linux/tca6416_keypad.h> - -#define TCA6416_INPUT 0 -#define TCA6416_OUTPUT 1 -#define TCA6416_INVERT 2 -#define TCA6416_DIRECTION 3 - -static const struct i2c_device_id tca6416_id[] = { - { "tca6416-keys", 16, }, - { "tca6408-keys", 8, }, - { } -}; -MODULE_DEVICE_TABLE(i2c, tca6416_id); - -struct tca6416_drv_data { - struct input_dev *input; - struct tca6416_button data[0]; -}; - -struct tca6416_keypad_chip { - uint16_t reg_output; - uint16_t reg_direction; - uint16_t reg_input; - - struct i2c_client *client; - struct input_dev *input; - struct delayed_work dwork; - int io_size; - int irqnum; - u16 pinmask; - bool use_polling; - struct tca6416_button buttons[0]; -}; - -static int tca6416_write_reg(struct tca6416_keypad_chip *chip, int reg, u16 val) -{ - int error; - - error = chip->io_size > 8 ? - i2c_smbus_write_word_data(chip->client, reg << 1, val) : - i2c_smbus_write_byte_data(chip->client, reg, val); - if (error < 0) { - dev_err(&chip->client->dev, - "%s failed, reg: %d, val: %d, error: %d\n", - __func__, reg, val, error); - return error; - } - - return 0; -} - -static int tca6416_read_reg(struct tca6416_keypad_chip *chip, int reg, u16 *val) -{ - int retval; - - retval = chip->io_size > 8 ? - i2c_smbus_read_word_data(chip->client, reg << 1) : - i2c_smbus_read_byte_data(chip->client, reg); - if (retval < 0) { - dev_err(&chip->client->dev, "%s failed, reg: %d, error: %d\n", - __func__, reg, retval); - return retval; - } - - *val = (u16)retval; - return 0; -} - -static void tca6416_keys_scan(struct tca6416_keypad_chip *chip) -{ - struct input_dev *input = chip->input; - u16 reg_val, val; - int error, i, pin_index; - - error = tca6416_read_reg(chip, TCA6416_INPUT, ®_val); - if (error) - return; - - reg_val &= chip->pinmask; - - /* Figure out which lines have changed */ - val = reg_val ^ chip->reg_input; - chip->reg_input = reg_val; - - for (i = 0, pin_index = 0; i < 16; i++) { - if (val & (1 << i)) { - struct tca6416_button *button = &chip->buttons[pin_index]; - unsigned int type = button->type ?: EV_KEY; - int state = ((reg_val & (1 << i)) ? 1 : 0) - ^ button->active_low; - - input_event(input, type, button->code, !!state); - input_sync(input); - } - - if (chip->pinmask & (1 << i)) - pin_index++; - } -} - -/* - * This is threaded IRQ handler and this can (and will) sleep. - */ -static irqreturn_t tca6416_keys_isr(int irq, void *dev_id) -{ - struct tca6416_keypad_chip *chip = dev_id; - - tca6416_keys_scan(chip); - - return IRQ_HANDLED; -} - -static void tca6416_keys_work_func(struct work_struct *work) -{ - struct tca6416_keypad_chip *chip = - container_of(work, struct tca6416_keypad_chip, dwork.work); - - tca6416_keys_scan(chip); - schedule_delayed_work(&chip->dwork, msecs_to_jiffies(100)); -} - -static int tca6416_keys_open(struct input_dev *dev) -{ - struct tca6416_keypad_chip *chip = input_get_drvdata(dev); - - /* Get initial device state in case it has switches */ - tca6416_keys_scan(chip); - - if (chip->use_polling) - schedule_delayed_work(&chip->dwork, msecs_to_jiffies(100)); - else - enable_irq(chip->irqnum); - - return 0; -} - -static void tca6416_keys_close(struct input_dev *dev) -{ - struct tca6416_keypad_chip *chip = input_get_drvdata(dev); - - if (chip->use_polling) - cancel_delayed_work_sync(&chip->dwork); - else - disable_irq(chip->irqnum); -} - -static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip) -{ - int error; - - error = tca6416_read_reg(chip, TCA6416_OUTPUT, &chip->reg_output); - if (error) - return error; - - error = tca6416_read_reg(chip, TCA6416_DIRECTION, &chip->reg_direction); - if (error) - return error; - - /* ensure that keypad pins are set to input */ - error = tca6416_write_reg(chip, TCA6416_DIRECTION, - chip->reg_direction | chip->pinmask); - if (error) - return error; - - error = tca6416_read_reg(chip, TCA6416_DIRECTION, &chip->reg_direction); - if (error) - return error; - - error = tca6416_read_reg(chip, TCA6416_INPUT, &chip->reg_input); - if (error) - return error; - - chip->reg_input &= chip->pinmask; - - return 0; -} - -static int __devinit tca6416_keypad_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct tca6416_keys_platform_data *pdata; - struct tca6416_keypad_chip *chip; - struct input_dev *input; - int error; - int i; - - /* Check functionality */ - if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) { - dev_err(&client->dev, "%s adapter not supported\n", - dev_driver_string(&client->adapter->dev)); - return -ENODEV; - } - - pdata = client->dev.platform_data; - if (!pdata) { - dev_dbg(&client->dev, "no platform data\n"); - return -EINVAL; - } - - chip = kzalloc(sizeof(struct tca6416_keypad_chip) + - pdata->nbuttons * sizeof(struct tca6416_button), - GFP_KERNEL); - input = input_allocate_device(); - if (!chip || !input) { - error = -ENOMEM; - goto fail1; - } - - chip->client = client; - chip->input = input; - chip->io_size = id->driver_data; - chip->pinmask = pdata->pinmask; - chip->use_polling = pdata->use_polling; - - INIT_DELAYED_WORK(&chip->dwork, tca6416_keys_work_func); - - input->phys = "tca6416-keys/input0"; - input->name = client->name; - input->dev.parent = &client->dev; - - input->open = tca6416_keys_open; - input->close = tca6416_keys_close; - - input->id.bustype = BUS_HOST; - input->id.vendor = 0x0001; - input->id.product = 0x0001; - input->id.version = 0x0100; - - /* Enable auto repeat feature of Linux input subsystem */ - if (pdata->rep) - __set_bit(EV_REP, input->evbit); - - for (i = 0; i < pdata->nbuttons; i++) { - unsigned int type; - - chip->buttons[i] = pdata->buttons[i]; - type = (pdata->buttons[i].type) ?: EV_KEY; - input_set_capability(input, type, pdata->buttons[i].code); - } - - input_set_drvdata(input, chip); - - /* - * Initialize cached registers from their original values. - * we can't share this chip with another i2c master. - */ - error = tca6416_setup_registers(chip); - if (error) - goto fail1; - - if (!chip->use_polling) { - if (pdata->irq_is_gpio) - chip->irqnum = gpio_to_irq(client->irq); - else - chip->irqnum = client->irq; - - error = request_threaded_irq(chip->irqnum, NULL, - tca6416_keys_isr, - IRQF_TRIGGER_FALLING, - "tca6416-keypad", chip); - if (error) { - dev_dbg(&client->dev, - "Unable to claim irq %d; error %d\n", - chip->irqnum, error); - goto fail1; - } - disable_irq(chip->irqnum); - } - - error = input_register_device(input); - if (error) { - dev_dbg(&client->dev, - "Unable to register input device, error: %d\n", error); - goto fail2; - } - - i2c_set_clientdata(client, chip); - device_init_wakeup(&client->dev, 1); - - return 0; - -fail2: - if (!chip->use_polling) { - free_irq(chip->irqnum, chip); - enable_irq(chip->irqnum); - } -fail1: - input_free_device(input); - kfree(chip); - return error; -} - -static int __devexit tca6416_keypad_remove(struct i2c_client *client) -{ - struct tca6416_keypad_chip *chip = i2c_get_clientdata(client); - - if (!chip->use_polling) { - free_irq(chip->irqnum, chip); - enable_irq(chip->irqnum); - } - - input_unregister_device(chip->input); - kfree(chip); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int tca6416_keypad_suspend(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct tca6416_keypad_chip *chip = i2c_get_clientdata(client); - - if (device_may_wakeup(dev)) - enable_irq_wake(chip->irqnum); - - return 0; -} - -static int tca6416_keypad_resume(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct tca6416_keypad_chip *chip = i2c_get_clientdata(client); - - if (device_may_wakeup(dev)) - disable_irq_wake(chip->irqnum); - - return 0; -} -#endif - -static SIMPLE_DEV_PM_OPS(tca6416_keypad_dev_pm_ops, - tca6416_keypad_suspend, tca6416_keypad_resume); - -static struct i2c_driver tca6416_keypad_driver = { - .driver = { - .name = "tca6416-keypad", - .pm = &tca6416_keypad_dev_pm_ops, - }, - .probe = tca6416_keypad_probe, - .remove = __devexit_p(tca6416_keypad_remove), - .id_table = tca6416_id, -}; - -static int __init tca6416_keypad_init(void) -{ - return i2c_add_driver(&tca6416_keypad_driver); -} - -subsys_initcall(tca6416_keypad_init); - -static void __exit tca6416_keypad_exit(void) -{ - i2c_del_driver(&tca6416_keypad_driver); -} -module_exit(tca6416_keypad_exit); - -MODULE_AUTHOR("Sriramakrishnan <srk@ti.com>"); -MODULE_DESCRIPTION("Keypad driver over tca6146 IO expander"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/tca8418_keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/tca8418_keypad.c deleted file mode 100644 index 958ec107..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/tca8418_keypad.c +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Driver for TCA8418 I2C keyboard - * - * Copyright (C) 2011 Fuel7, Inc. All rights reserved. - * - * Author: Kyle Manna <kyle.manna@fuel7.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License v2 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 021110-1307, USA. - * - * If you can't comply with GPLv2, alternative licensing terms may be - * arranged. Please contact Fuel7, Inc. (http://fuel7.com/) for proprietary - * alternative licensing inquiries. - */ - -#include <linux/types.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/delay.h> -#include <linux/slab.h> -#include <linux/interrupt.h> -#include <linux/workqueue.h> -#include <linux/gpio.h> -#include <linux/i2c.h> -#include <linux/input.h> -#include <linux/input/tca8418_keypad.h> - -/* TCA8418 hardware limits */ -#define TCA8418_MAX_ROWS 8 -#define TCA8418_MAX_COLS 10 - -/* TCA8418 register offsets */ -#define REG_CFG 0x01 -#define REG_INT_STAT 0x02 -#define REG_KEY_LCK_EC 0x03 -#define REG_KEY_EVENT_A 0x04 -#define REG_KEY_EVENT_B 0x05 -#define REG_KEY_EVENT_C 0x06 -#define REG_KEY_EVENT_D 0x07 -#define REG_KEY_EVENT_E 0x08 -#define REG_KEY_EVENT_F 0x09 -#define REG_KEY_EVENT_G 0x0A -#define REG_KEY_EVENT_H 0x0B -#define REG_KEY_EVENT_I 0x0C -#define REG_KEY_EVENT_J 0x0D -#define REG_KP_LCK_TIMER 0x0E -#define REG_UNLOCK1 0x0F -#define REG_UNLOCK2 0x10 -#define REG_GPIO_INT_STAT1 0x11 -#define REG_GPIO_INT_STAT2 0x12 -#define REG_GPIO_INT_STAT3 0x13 -#define REG_GPIO_DAT_STAT1 0x14 -#define REG_GPIO_DAT_STAT2 0x15 -#define REG_GPIO_DAT_STAT3 0x16 -#define REG_GPIO_DAT_OUT1 0x17 -#define REG_GPIO_DAT_OUT2 0x18 -#define REG_GPIO_DAT_OUT3 0x19 -#define REG_GPIO_INT_EN1 0x1A -#define REG_GPIO_INT_EN2 0x1B -#define REG_GPIO_INT_EN3 0x1C -#define REG_KP_GPIO1 0x1D -#define REG_KP_GPIO2 0x1E -#define REG_KP_GPIO3 0x1F -#define REG_GPI_EM1 0x20 -#define REG_GPI_EM2 0x21 -#define REG_GPI_EM3 0x22 -#define REG_GPIO_DIR1 0x23 -#define REG_GPIO_DIR2 0x24 -#define REG_GPIO_DIR3 0x25 -#define REG_GPIO_INT_LVL1 0x26 -#define REG_GPIO_INT_LVL2 0x27 -#define REG_GPIO_INT_LVL3 0x28 -#define REG_DEBOUNCE_DIS1 0x29 -#define REG_DEBOUNCE_DIS2 0x2A -#define REG_DEBOUNCE_DIS3 0x2B -#define REG_GPIO_PULL1 0x2C -#define REG_GPIO_PULL2 0x2D -#define REG_GPIO_PULL3 0x2E - -/* TCA8418 bit definitions */ -#define CFG_AI BIT(7) -#define CFG_GPI_E_CFG BIT(6) -#define CFG_OVR_FLOW_M BIT(5) -#define CFG_INT_CFG BIT(4) -#define CFG_OVR_FLOW_IEN BIT(3) -#define CFG_K_LCK_IEN BIT(2) -#define CFG_GPI_IEN BIT(1) -#define CFG_KE_IEN BIT(0) - -#define INT_STAT_CAD_INT BIT(4) -#define INT_STAT_OVR_FLOW_INT BIT(3) -#define INT_STAT_K_LCK_INT BIT(2) -#define INT_STAT_GPI_INT BIT(1) -#define INT_STAT_K_INT BIT(0) - -/* TCA8418 register masks */ -#define KEY_LCK_EC_KEC 0x7 -#define KEY_EVENT_CODE 0x7f -#define KEY_EVENT_VALUE 0x80 - - -static const struct i2c_device_id tca8418_id[] = { - { TCA8418_NAME, 8418, }, - { } -}; -MODULE_DEVICE_TABLE(i2c, tca8418_id); - -struct tca8418_keypad { - unsigned int rows; - unsigned int cols; - unsigned int keypad_mask; /* Mask for keypad col/rol regs */ - unsigned int irq; - unsigned int row_shift; - - struct i2c_client *client; - struct input_dev *input; - - /* Flexible array member, must be at end of struct */ - unsigned short keymap[]; -}; - -/* - * Write a byte to the TCA8418 - */ -static int tca8418_write_byte(struct tca8418_keypad *keypad_data, - int reg, u8 val) -{ - int error; - - error = i2c_smbus_write_byte_data(keypad_data->client, reg, val); - if (error < 0) { - dev_err(&keypad_data->client->dev, - "%s failed, reg: %d, val: %d, error: %d\n", - __func__, reg, val, error); - return error; - } - - return 0; -} - -/* - * Read a byte from the TCA8418 - */ -static int tca8418_read_byte(struct tca8418_keypad *keypad_data, - int reg, u8 *val) -{ - int error; - - error = i2c_smbus_read_byte_data(keypad_data->client, reg); - if (error < 0) { - dev_err(&keypad_data->client->dev, - "%s failed, reg: %d, error: %d\n", - __func__, reg, error); - return error; - } - - *val = (u8)error; - - return 0; -} - -static void tca8418_read_keypad(struct tca8418_keypad *keypad_data) -{ - int error, col, row; - u8 reg, state, code; - - /* Initial read of the key event FIFO */ - error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®); - - /* Assume that key code 0 signifies empty FIFO */ - while (error >= 0 && reg > 0) { - state = reg & KEY_EVENT_VALUE; - code = reg & KEY_EVENT_CODE; - - row = code / TCA8418_MAX_COLS; - col = code % TCA8418_MAX_COLS; - - row = (col) ? row : row - 1; - col = (col) ? col - 1 : TCA8418_MAX_COLS - 1; - - code = MATRIX_SCAN_CODE(row, col, keypad_data->row_shift); - input_event(keypad_data->input, EV_MSC, MSC_SCAN, code); - input_report_key(keypad_data->input, - keypad_data->keymap[code], state); - - /* Read for next loop */ - error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®); - } - - if (error < 0) - dev_err(&keypad_data->client->dev, - "unable to read REG_KEY_EVENT_A\n"); - - input_sync(keypad_data->input); -} - -/* - * Threaded IRQ handler and this can (and will) sleep. - */ -static irqreturn_t tca8418_irq_handler(int irq, void *dev_id) -{ - struct tca8418_keypad *keypad_data = dev_id; - u8 reg; - int error; - - error = tca8418_read_byte(keypad_data, REG_INT_STAT, ®); - if (error) { - dev_err(&keypad_data->client->dev, - "unable to read REG_INT_STAT\n"); - goto exit; - } - - if (reg & INT_STAT_OVR_FLOW_INT) - dev_warn(&keypad_data->client->dev, "overflow occurred\n"); - - if (reg & INT_STAT_K_INT) - tca8418_read_keypad(keypad_data); - -exit: - /* Clear all interrupts, even IRQs we didn't check (GPI, CAD, LCK) */ - reg = 0xff; - error = tca8418_write_byte(keypad_data, REG_INT_STAT, reg); - if (error) - dev_err(&keypad_data->client->dev, - "unable to clear REG_INT_STAT\n"); - - return IRQ_HANDLED; -} - -/* - * Configure the TCA8418 for keypad operation - */ -static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data) -{ - int reg, error; - - /* Write config register, if this fails assume device not present */ - error = tca8418_write_byte(keypad_data, REG_CFG, - CFG_INT_CFG | CFG_OVR_FLOW_IEN | CFG_KE_IEN); - if (error < 0) - return -ENODEV; - - - /* Assemble a mask for row and column registers */ - reg = ~(~0 << keypad_data->rows); - reg += (~(~0 << keypad_data->cols)) << 8; - keypad_data->keypad_mask = reg; - - /* Set registers to keypad mode */ - error |= tca8418_write_byte(keypad_data, REG_KP_GPIO1, reg); - error |= tca8418_write_byte(keypad_data, REG_KP_GPIO2, reg >> 8); - error |= tca8418_write_byte(keypad_data, REG_KP_GPIO3, reg >> 16); - - /* Enable column debouncing */ - error |= tca8418_write_byte(keypad_data, REG_DEBOUNCE_DIS1, reg); - error |= tca8418_write_byte(keypad_data, REG_DEBOUNCE_DIS2, reg >> 8); - error |= tca8418_write_byte(keypad_data, REG_DEBOUNCE_DIS3, reg >> 16); - - return error; -} - -static int __devinit tca8418_keypad_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - const struct tca8418_keypad_platform_data *pdata = - client->dev.platform_data; - struct tca8418_keypad *keypad_data; - struct input_dev *input; - int error, row_shift, max_keys; - - /* Copy the platform data */ - if (!pdata) { - dev_dbg(&client->dev, "no platform data\n"); - return -EINVAL; - } - - if (!pdata->keymap_data) { - dev_err(&client->dev, "no keymap data defined\n"); - return -EINVAL; - } - - if (!pdata->rows || pdata->rows > TCA8418_MAX_ROWS) { - dev_err(&client->dev, "invalid rows\n"); - return -EINVAL; - } - - if (!pdata->cols || pdata->cols > TCA8418_MAX_COLS) { - dev_err(&client->dev, "invalid columns\n"); - return -EINVAL; - } - - /* Check i2c driver capabilities */ - if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) { - dev_err(&client->dev, "%s adapter not supported\n", - dev_driver_string(&client->adapter->dev)); - return -ENODEV; - } - - row_shift = get_count_order(pdata->cols); - max_keys = pdata->rows << row_shift; - - /* Allocate memory for keypad_data, keymap and input device */ - keypad_data = kzalloc(sizeof(*keypad_data) + - max_keys * sizeof(keypad_data->keymap[0]), GFP_KERNEL); - if (!keypad_data) - return -ENOMEM; - - keypad_data->rows = pdata->rows; - keypad_data->cols = pdata->cols; - keypad_data->client = client; - keypad_data->row_shift = row_shift; - - /* Initialize the chip or fail if chip isn't present */ - error = tca8418_configure(keypad_data); - if (error < 0) - goto fail1; - - /* Configure input device */ - input = input_allocate_device(); - if (!input) { - error = -ENOMEM; - goto fail1; - } - keypad_data->input = input; - - input->name = client->name; - input->dev.parent = &client->dev; - - input->id.bustype = BUS_I2C; - input->id.vendor = 0x0001; - input->id.product = 0x001; - input->id.version = 0x0001; - - input->keycode = keypad_data->keymap; - input->keycodesize = sizeof(keypad_data->keymap[0]); - input->keycodemax = max_keys; - - __set_bit(EV_KEY, input->evbit); - if (pdata->rep) - __set_bit(EV_REP, input->evbit); - - input_set_capability(input, EV_MSC, MSC_SCAN); - - input_set_drvdata(input, keypad_data); - - matrix_keypad_build_keymap(pdata->keymap_data, row_shift, - input->keycode, input->keybit); - - if (pdata->irq_is_gpio) - client->irq = gpio_to_irq(client->irq); - - error = request_threaded_irq(client->irq, NULL, tca8418_irq_handler, - IRQF_TRIGGER_FALLING, - client->name, keypad_data); - if (error) { - dev_dbg(&client->dev, - "Unable to claim irq %d; error %d\n", - client->irq, error); - goto fail2; - } - - error = input_register_device(input); - if (error) { - dev_dbg(&client->dev, - "Unable to register input device, error: %d\n", error); - goto fail3; - } - - i2c_set_clientdata(client, keypad_data); - return 0; - -fail3: - free_irq(client->irq, keypad_data); -fail2: - input_free_device(input); -fail1: - kfree(keypad_data); - return error; -} - -static int __devexit tca8418_keypad_remove(struct i2c_client *client) -{ - struct tca8418_keypad *keypad_data = i2c_get_clientdata(client); - - free_irq(keypad_data->client->irq, keypad_data); - - input_unregister_device(keypad_data->input); - - kfree(keypad_data); - - return 0; -} - - -static struct i2c_driver tca8418_keypad_driver = { - .driver = { - .name = TCA8418_NAME, - .owner = THIS_MODULE, - }, - .probe = tca8418_keypad_probe, - .remove = __devexit_p(tca8418_keypad_remove), - .id_table = tca8418_id, -}; - -static int __init tca8418_keypad_init(void) -{ - return i2c_add_driver(&tca8418_keypad_driver); -} -subsys_initcall(tca8418_keypad_init); - -static void __exit tca8418_keypad_exit(void) -{ - i2c_del_driver(&tca8418_keypad_driver); -} -module_exit(tca8418_keypad_exit); - -MODULE_AUTHOR("Kyle Manna <kyle.manna@fuel7.com>"); -MODULE_DESCRIPTION("Keypad driver for TCA8418"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/tegra-kbc.c b/ANDROID_3.4.5/drivers/input/keyboard/tegra-kbc.c deleted file mode 100644 index fe4ac95c..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/tegra-kbc.c +++ /dev/null @@ -1,956 +0,0 @@ -/* - * Keyboard class input driver for the NVIDIA Tegra SoC internal matrix - * keyboard controller - * - * Copyright (c) 2009-2011, NVIDIA Corporation. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/input.h> -#include <linux/platform_device.h> -#include <linux/delay.h> -#include <linux/io.h> -#include <linux/interrupt.h> -#include <linux/of.h> -#include <linux/clk.h> -#include <linux/slab.h> -#include <mach/clk.h> -#include <mach/kbc.h> - -#define KBC_MAX_DEBOUNCE_CNT 0x3ffu - -/* KBC row scan time and delay for beginning the row scan. */ -#define KBC_ROW_SCAN_TIME 16 -#define KBC_ROW_SCAN_DLY 5 - -/* KBC uses a 32KHz clock so a cycle = 1/32Khz */ -#define KBC_CYCLE_MS 32 - -/* KBC Registers */ - -/* KBC Control Register */ -#define KBC_CONTROL_0 0x0 -#define KBC_FIFO_TH_CNT_SHIFT(cnt) (cnt << 14) -#define KBC_DEBOUNCE_CNT_SHIFT(cnt) (cnt << 4) -#define KBC_CONTROL_FIFO_CNT_INT_EN (1 << 3) -#define KBC_CONTROL_KEYPRESS_INT_EN (1 << 1) -#define KBC_CONTROL_KBC_EN (1 << 0) - -/* KBC Interrupt Register */ -#define KBC_INT_0 0x4 -#define KBC_INT_FIFO_CNT_INT_STATUS (1 << 2) -#define KBC_INT_KEYPRESS_INT_STATUS (1 << 0) - -#define KBC_ROW_CFG0_0 0x8 -#define KBC_COL_CFG0_0 0x18 -#define KBC_TO_CNT_0 0x24 -#define KBC_INIT_DLY_0 0x28 -#define KBC_RPT_DLY_0 0x2c -#define KBC_KP_ENT0_0 0x30 -#define KBC_KP_ENT1_0 0x34 -#define KBC_ROW0_MASK_0 0x38 - -#define KBC_ROW_SHIFT 3 - -struct tegra_kbc { - void __iomem *mmio; - struct input_dev *idev; - unsigned int irq; - spinlock_t lock; - unsigned int repoll_dly; - unsigned long cp_dly_jiffies; - unsigned int cp_to_wkup_dly; - bool use_fn_map; - bool use_ghost_filter; - bool keypress_caused_wake; - const struct tegra_kbc_platform_data *pdata; - unsigned short keycode[KBC_MAX_KEY * 2]; - unsigned short current_keys[KBC_MAX_KPENT]; - unsigned int num_pressed_keys; - u32 wakeup_key; - struct timer_list timer; - struct clk *clk; -}; - -static const u32 tegra_kbc_default_keymap[] __devinitdata = { - KEY(0, 2, KEY_W), - KEY(0, 3, KEY_S), - KEY(0, 4, KEY_A), - KEY(0, 5, KEY_Z), - KEY(0, 7, KEY_FN), - - KEY(1, 7, KEY_LEFTMETA), - - KEY(2, 6, KEY_RIGHTALT), - KEY(2, 7, KEY_LEFTALT), - - KEY(3, 0, KEY_5), - KEY(3, 1, KEY_4), - KEY(3, 2, KEY_R), - KEY(3, 3, KEY_E), - KEY(3, 4, KEY_F), - KEY(3, 5, KEY_D), - KEY(3, 6, KEY_X), - - KEY(4, 0, KEY_7), - KEY(4, 1, KEY_6), - KEY(4, 2, KEY_T), - KEY(4, 3, KEY_H), - KEY(4, 4, KEY_G), - KEY(4, 5, KEY_V), - KEY(4, 6, KEY_C), - KEY(4, 7, KEY_SPACE), - - KEY(5, 0, KEY_9), - KEY(5, 1, KEY_8), - KEY(5, 2, KEY_U), - KEY(5, 3, KEY_Y), - KEY(5, 4, KEY_J), - KEY(5, 5, KEY_N), - KEY(5, 6, KEY_B), - KEY(5, 7, KEY_BACKSLASH), - - KEY(6, 0, KEY_MINUS), - KEY(6, 1, KEY_0), - KEY(6, 2, KEY_O), - KEY(6, 3, KEY_I), - KEY(6, 4, KEY_L), - KEY(6, 5, KEY_K), - KEY(6, 6, KEY_COMMA), - KEY(6, 7, KEY_M), - - KEY(7, 1, KEY_EQUAL), - KEY(7, 2, KEY_RIGHTBRACE), - KEY(7, 3, KEY_ENTER), - KEY(7, 7, KEY_MENU), - - KEY(8, 4, KEY_RIGHTSHIFT), - KEY(8, 5, KEY_LEFTSHIFT), - - KEY(9, 5, KEY_RIGHTCTRL), - KEY(9, 7, KEY_LEFTCTRL), - - KEY(11, 0, KEY_LEFTBRACE), - KEY(11, 1, KEY_P), - KEY(11, 2, KEY_APOSTROPHE), - KEY(11, 3, KEY_SEMICOLON), - KEY(11, 4, KEY_SLASH), - KEY(11, 5, KEY_DOT), - - KEY(12, 0, KEY_F10), - KEY(12, 1, KEY_F9), - KEY(12, 2, KEY_BACKSPACE), - KEY(12, 3, KEY_3), - KEY(12, 4, KEY_2), - KEY(12, 5, KEY_UP), - KEY(12, 6, KEY_PRINT), - KEY(12, 7, KEY_PAUSE), - - KEY(13, 0, KEY_INSERT), - KEY(13, 1, KEY_DELETE), - KEY(13, 3, KEY_PAGEUP), - KEY(13, 4, KEY_PAGEDOWN), - KEY(13, 5, KEY_RIGHT), - KEY(13, 6, KEY_DOWN), - KEY(13, 7, KEY_LEFT), - - KEY(14, 0, KEY_F11), - KEY(14, 1, KEY_F12), - KEY(14, 2, KEY_F8), - KEY(14, 3, KEY_Q), - KEY(14, 4, KEY_F4), - KEY(14, 5, KEY_F3), - KEY(14, 6, KEY_1), - KEY(14, 7, KEY_F7), - - KEY(15, 0, KEY_ESC), - KEY(15, 1, KEY_GRAVE), - KEY(15, 2, KEY_F5), - KEY(15, 3, KEY_TAB), - KEY(15, 4, KEY_F1), - KEY(15, 5, KEY_F2), - KEY(15, 6, KEY_CAPSLOCK), - KEY(15, 7, KEY_F6), - - /* Software Handled Function Keys */ - KEY(20, 0, KEY_KP7), - - KEY(21, 0, KEY_KP9), - KEY(21, 1, KEY_KP8), - KEY(21, 2, KEY_KP4), - KEY(21, 4, KEY_KP1), - - KEY(22, 1, KEY_KPSLASH), - KEY(22, 2, KEY_KP6), - KEY(22, 3, KEY_KP5), - KEY(22, 4, KEY_KP3), - KEY(22, 5, KEY_KP2), - KEY(22, 7, KEY_KP0), - - KEY(27, 1, KEY_KPASTERISK), - KEY(27, 3, KEY_KPMINUS), - KEY(27, 4, KEY_KPPLUS), - KEY(27, 5, KEY_KPDOT), - - KEY(28, 5, KEY_VOLUMEUP), - - KEY(29, 3, KEY_HOME), - KEY(29, 4, KEY_END), - KEY(29, 5, KEY_BRIGHTNESSDOWN), - KEY(29, 6, KEY_VOLUMEDOWN), - KEY(29, 7, KEY_BRIGHTNESSUP), - - KEY(30, 0, KEY_NUMLOCK), - KEY(30, 1, KEY_SCROLLLOCK), - KEY(30, 2, KEY_MUTE), - - KEY(31, 4, KEY_HELP), -}; - -static const -struct matrix_keymap_data tegra_kbc_default_keymap_data __devinitdata = { - .keymap = tegra_kbc_default_keymap, - .keymap_size = ARRAY_SIZE(tegra_kbc_default_keymap), -}; - -static void tegra_kbc_report_released_keys(struct input_dev *input, - unsigned short old_keycodes[], - unsigned int old_num_keys, - unsigned short new_keycodes[], - unsigned int new_num_keys) -{ - unsigned int i, j; - - for (i = 0; i < old_num_keys; i++) { - for (j = 0; j < new_num_keys; j++) - if (old_keycodes[i] == new_keycodes[j]) - break; - - if (j == new_num_keys) - input_report_key(input, old_keycodes[i], 0); - } -} - -static void tegra_kbc_report_pressed_keys(struct input_dev *input, - unsigned char scancodes[], - unsigned short keycodes[], - unsigned int num_pressed_keys) -{ - unsigned int i; - - for (i = 0; i < num_pressed_keys; i++) { - input_event(input, EV_MSC, MSC_SCAN, scancodes[i]); - input_report_key(input, keycodes[i], 1); - } -} - -static void tegra_kbc_report_keys(struct tegra_kbc *kbc) -{ - unsigned char scancodes[KBC_MAX_KPENT]; - unsigned short keycodes[KBC_MAX_KPENT]; - u32 val = 0; - unsigned int i; - unsigned int num_down = 0; - bool fn_keypress = false; - bool key_in_same_row = false; - bool key_in_same_col = false; - - for (i = 0; i < KBC_MAX_KPENT; i++) { - if ((i % 4) == 0) - val = readl(kbc->mmio + KBC_KP_ENT0_0 + i); - - if (val & 0x80) { - unsigned int col = val & 0x07; - unsigned int row = (val >> 3) & 0x0f; - unsigned char scancode = - MATRIX_SCAN_CODE(row, col, KBC_ROW_SHIFT); - - scancodes[num_down] = scancode; - keycodes[num_down] = kbc->keycode[scancode]; - /* If driver uses Fn map, do not report the Fn key. */ - if ((keycodes[num_down] == KEY_FN) && kbc->use_fn_map) - fn_keypress = true; - else - num_down++; - } - - val >>= 8; - } - - /* - * Matrix keyboard designs are prone to keyboard ghosting. - * Ghosting occurs if there are 3 keys such that - - * any 2 of the 3 keys share a row, and any 2 of them share a column. - * If so ignore the key presses for this iteration. - */ - if (kbc->use_ghost_filter && num_down >= 3) { - for (i = 0; i < num_down; i++) { - unsigned int j; - u8 curr_col = scancodes[i] & 0x07; - u8 curr_row = scancodes[i] >> KBC_ROW_SHIFT; - - /* - * Find 2 keys such that one key is in the same row - * and the other is in the same column as the i-th key. - */ - for (j = i + 1; j < num_down; j++) { - u8 col = scancodes[j] & 0x07; - u8 row = scancodes[j] >> KBC_ROW_SHIFT; - - if (col == curr_col) - key_in_same_col = true; - if (row == curr_row) - key_in_same_row = true; - } - } - } - - /* - * If the platform uses Fn keymaps, translate keys on a Fn keypress. - * Function keycodes are KBC_MAX_KEY apart from the plain keycodes. - */ - if (fn_keypress) { - for (i = 0; i < num_down; i++) { - scancodes[i] += KBC_MAX_KEY; - keycodes[i] = kbc->keycode[scancodes[i]]; - } - } - - /* Ignore the key presses for this iteration? */ - if (key_in_same_col && key_in_same_row) - return; - - tegra_kbc_report_released_keys(kbc->idev, - kbc->current_keys, kbc->num_pressed_keys, - keycodes, num_down); - tegra_kbc_report_pressed_keys(kbc->idev, scancodes, keycodes, num_down); - input_sync(kbc->idev); - - memcpy(kbc->current_keys, keycodes, sizeof(kbc->current_keys)); - kbc->num_pressed_keys = num_down; -} - -static void tegra_kbc_set_fifo_interrupt(struct tegra_kbc *kbc, bool enable) -{ - u32 val; - - val = readl(kbc->mmio + KBC_CONTROL_0); - if (enable) - val |= KBC_CONTROL_FIFO_CNT_INT_EN; - else - val &= ~KBC_CONTROL_FIFO_CNT_INT_EN; - writel(val, kbc->mmio + KBC_CONTROL_0); -} - -static void tegra_kbc_set_keypress_interrupt(struct tegra_kbc *kbc, bool enable) -{ - u32 val; - - val = readl(kbc->mmio + KBC_CONTROL_0); - if (enable) - val |= KBC_CONTROL_KEYPRESS_INT_EN; - else - val &= ~KBC_CONTROL_KEYPRESS_INT_EN; - writel(val, kbc->mmio + KBC_CONTROL_0); -} - -static void tegra_kbc_keypress_timer(unsigned long data) -{ - struct tegra_kbc *kbc = (struct tegra_kbc *)data; - unsigned long flags; - u32 val; - unsigned int i; - - spin_lock_irqsave(&kbc->lock, flags); - - val = (readl(kbc->mmio + KBC_INT_0) >> 4) & 0xf; - if (val) { - unsigned long dly; - - tegra_kbc_report_keys(kbc); - - /* - * If more than one keys are pressed we need not wait - * for the repoll delay. - */ - dly = (val == 1) ? kbc->repoll_dly : 1; - mod_timer(&kbc->timer, jiffies + msecs_to_jiffies(dly)); - } else { - /* Release any pressed keys and exit the polling loop */ - for (i = 0; i < kbc->num_pressed_keys; i++) - input_report_key(kbc->idev, kbc->current_keys[i], 0); - input_sync(kbc->idev); - - kbc->num_pressed_keys = 0; - - /* All keys are released so enable the keypress interrupt */ - tegra_kbc_set_fifo_interrupt(kbc, true); - } - - spin_unlock_irqrestore(&kbc->lock, flags); -} - -static irqreturn_t tegra_kbc_isr(int irq, void *args) -{ - struct tegra_kbc *kbc = args; - unsigned long flags; - u32 val; - - spin_lock_irqsave(&kbc->lock, flags); - - /* - * Quickly bail out & reenable interrupts if the fifo threshold - * count interrupt wasn't the interrupt source - */ - val = readl(kbc->mmio + KBC_INT_0); - writel(val, kbc->mmio + KBC_INT_0); - - if (val & KBC_INT_FIFO_CNT_INT_STATUS) { - /* - * Until all keys are released, defer further processing to - * the polling loop in tegra_kbc_keypress_timer. - */ - tegra_kbc_set_fifo_interrupt(kbc, false); - mod_timer(&kbc->timer, jiffies + kbc->cp_dly_jiffies); - } else if (val & KBC_INT_KEYPRESS_INT_STATUS) { - /* We can be here only through system resume path */ - kbc->keypress_caused_wake = true; - } - - spin_unlock_irqrestore(&kbc->lock, flags); - - return IRQ_HANDLED; -} - -static void tegra_kbc_setup_wakekeys(struct tegra_kbc *kbc, bool filter) -{ - const struct tegra_kbc_platform_data *pdata = kbc->pdata; - int i; - unsigned int rst_val; - - /* Either mask all keys or none. */ - rst_val = (filter && !pdata->wakeup) ? ~0 : 0; - - for (i = 0; i < KBC_MAX_ROW; i++) - writel(rst_val, kbc->mmio + KBC_ROW0_MASK_0 + i * 4); -} - -static void tegra_kbc_config_pins(struct tegra_kbc *kbc) -{ - const struct tegra_kbc_platform_data *pdata = kbc->pdata; - int i; - - for (i = 0; i < KBC_MAX_GPIO; i++) { - u32 r_shft = 5 * (i % 6); - u32 c_shft = 4 * (i % 8); - u32 r_mask = 0x1f << r_shft; - u32 c_mask = 0x0f << c_shft; - u32 r_offs = (i / 6) * 4 + KBC_ROW_CFG0_0; - u32 c_offs = (i / 8) * 4 + KBC_COL_CFG0_0; - u32 row_cfg = readl(kbc->mmio + r_offs); - u32 col_cfg = readl(kbc->mmio + c_offs); - - row_cfg &= ~r_mask; - col_cfg &= ~c_mask; - - switch (pdata->pin_cfg[i].type) { - case PIN_CFG_ROW: - row_cfg |= ((pdata->pin_cfg[i].num << 1) | 1) << r_shft; - break; - - case PIN_CFG_COL: - col_cfg |= ((pdata->pin_cfg[i].num << 1) | 1) << c_shft; - break; - - case PIN_CFG_IGNORE: - break; - } - - writel(row_cfg, kbc->mmio + r_offs); - writel(col_cfg, kbc->mmio + c_offs); - } -} - -static int tegra_kbc_start(struct tegra_kbc *kbc) -{ - const struct tegra_kbc_platform_data *pdata = kbc->pdata; - unsigned int debounce_cnt; - u32 val = 0; - - clk_enable(kbc->clk); - - /* Reset the KBC controller to clear all previous status.*/ - tegra_periph_reset_assert(kbc->clk); - udelay(100); - tegra_periph_reset_deassert(kbc->clk); - udelay(100); - - tegra_kbc_config_pins(kbc); - tegra_kbc_setup_wakekeys(kbc, false); - - writel(pdata->repeat_cnt, kbc->mmio + KBC_RPT_DLY_0); - - /* Keyboard debounce count is maximum of 12 bits. */ - debounce_cnt = min(pdata->debounce_cnt, KBC_MAX_DEBOUNCE_CNT); - val = KBC_DEBOUNCE_CNT_SHIFT(debounce_cnt); - val |= KBC_FIFO_TH_CNT_SHIFT(1); /* set fifo interrupt threshold to 1 */ - val |= KBC_CONTROL_FIFO_CNT_INT_EN; /* interrupt on FIFO threshold */ - val |= KBC_CONTROL_KBC_EN; /* enable */ - writel(val, kbc->mmio + KBC_CONTROL_0); - - /* - * Compute the delay(ns) from interrupt mode to continuous polling - * mode so the timer routine is scheduled appropriately. - */ - val = readl(kbc->mmio + KBC_INIT_DLY_0); - kbc->cp_dly_jiffies = usecs_to_jiffies((val & 0xfffff) * 32); - - kbc->num_pressed_keys = 0; - - /* - * Atomically clear out any remaining entries in the key FIFO - * and enable keyboard interrupts. - */ - while (1) { - val = readl(kbc->mmio + KBC_INT_0); - val >>= 4; - if (!val) - break; - - val = readl(kbc->mmio + KBC_KP_ENT0_0); - val = readl(kbc->mmio + KBC_KP_ENT1_0); - } - writel(0x7, kbc->mmio + KBC_INT_0); - - enable_irq(kbc->irq); - - return 0; -} - -static void tegra_kbc_stop(struct tegra_kbc *kbc) -{ - unsigned long flags; - u32 val; - - spin_lock_irqsave(&kbc->lock, flags); - val = readl(kbc->mmio + KBC_CONTROL_0); - val &= ~1; - writel(val, kbc->mmio + KBC_CONTROL_0); - spin_unlock_irqrestore(&kbc->lock, flags); - - disable_irq(kbc->irq); - del_timer_sync(&kbc->timer); - - clk_disable(kbc->clk); -} - -static int tegra_kbc_open(struct input_dev *dev) -{ - struct tegra_kbc *kbc = input_get_drvdata(dev); - - return tegra_kbc_start(kbc); -} - -static void tegra_kbc_close(struct input_dev *dev) -{ - struct tegra_kbc *kbc = input_get_drvdata(dev); - - return tegra_kbc_stop(kbc); -} - -static bool __devinit -tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata, - struct device *dev, unsigned int *num_rows) -{ - int i; - - *num_rows = 0; - - for (i = 0; i < KBC_MAX_GPIO; i++) { - const struct tegra_kbc_pin_cfg *pin_cfg = &pdata->pin_cfg[i]; - - switch (pin_cfg->type) { - case PIN_CFG_ROW: - if (pin_cfg->num >= KBC_MAX_ROW) { - dev_err(dev, - "pin_cfg[%d]: invalid row number %d\n", - i, pin_cfg->num); - return false; - } - (*num_rows)++; - break; - - case PIN_CFG_COL: - if (pin_cfg->num >= KBC_MAX_COL) { - dev_err(dev, - "pin_cfg[%d]: invalid column number %d\n", - i, pin_cfg->num); - return false; - } - break; - - case PIN_CFG_IGNORE: - break; - - default: - dev_err(dev, - "pin_cfg[%d]: invalid entry type %d\n", - pin_cfg->type, pin_cfg->num); - return false; - } - } - - return true; -} - -#ifdef CONFIG_OF -static struct tegra_kbc_platform_data * __devinit -tegra_kbc_dt_parse_pdata(struct platform_device *pdev) -{ - struct tegra_kbc_platform_data *pdata; - struct device_node *np = pdev->dev.of_node; - u32 prop; - int i; - - if (!np) - return NULL; - - pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); - if (!pdata) - return NULL; - - if (!of_property_read_u32(np, "nvidia,debounce-delay-ms", &prop)) - pdata->debounce_cnt = prop; - - if (!of_property_read_u32(np, "nvidia,repeat-delay-ms", &prop)) - pdata->repeat_cnt = prop; - - if (of_find_property(np, "nvidia,needs-ghost-filter", NULL)) - pdata->use_ghost_filter = true; - - if (of_find_property(np, "nvidia,wakeup-source", NULL)) - pdata->wakeup = true; - - /* - * All currently known keymaps with device tree support use the same - * pin_cfg, so set it up here. - */ - for (i = 0; i < KBC_MAX_ROW; i++) { - pdata->pin_cfg[i].num = i; - pdata->pin_cfg[i].type = PIN_CFG_ROW; - } - - for (i = 0; i < KBC_MAX_COL; i++) { - pdata->pin_cfg[KBC_MAX_ROW + i].num = i; - pdata->pin_cfg[KBC_MAX_ROW + i].type = PIN_CFG_COL; - } - - pdata->keymap_data = matrix_keyboard_of_fill_keymap(np, "linux,keymap"); - - /* FIXME: Add handling of linux,fn-keymap here */ - - return pdata; -} -#else -static inline struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata( - struct platform_device *pdev) -{ - return NULL; -} -#endif - -static int __devinit tegra_kbc_probe(struct platform_device *pdev) -{ - const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data; - const struct matrix_keymap_data *keymap_data; - struct tegra_kbc *kbc; - struct input_dev *input_dev; - struct resource *res; - int irq; - int err; - int num_rows = 0; - unsigned int debounce_cnt; - unsigned int scan_time_rows; - - if (!pdata) - pdata = tegra_kbc_dt_parse_pdata(pdev); - - if (!pdata) - return -EINVAL; - - if (!tegra_kbc_check_pin_cfg(pdata, &pdev->dev, &num_rows)) { - err = -EINVAL; - goto err_free_pdata; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "failed to get I/O memory\n"); - err = -ENXIO; - goto err_free_pdata; - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "failed to get keyboard IRQ\n"); - err = -ENXIO; - goto err_free_pdata; - } - - kbc = kzalloc(sizeof(*kbc), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!kbc || !input_dev) { - err = -ENOMEM; - goto err_free_mem; - } - - kbc->pdata = pdata; - kbc->idev = input_dev; - kbc->irq = irq; - spin_lock_init(&kbc->lock); - setup_timer(&kbc->timer, tegra_kbc_keypress_timer, (unsigned long)kbc); - - res = request_mem_region(res->start, resource_size(res), pdev->name); - if (!res) { - dev_err(&pdev->dev, "failed to request I/O memory\n"); - err = -EBUSY; - goto err_free_mem; - } - - kbc->mmio = ioremap(res->start, resource_size(res)); - if (!kbc->mmio) { - dev_err(&pdev->dev, "failed to remap I/O memory\n"); - err = -ENXIO; - goto err_free_mem_region; - } - - kbc->clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(kbc->clk)) { - dev_err(&pdev->dev, "failed to get keyboard clock\n"); - err = PTR_ERR(kbc->clk); - goto err_iounmap; - } - - /* - * The time delay between two consecutive reads of the FIFO is - * the sum of the repeat time and the time taken for scanning - * the rows. There is an additional delay before the row scanning - * starts. The repoll delay is computed in milliseconds. - */ - debounce_cnt = min(pdata->debounce_cnt, KBC_MAX_DEBOUNCE_CNT); - scan_time_rows = (KBC_ROW_SCAN_TIME + debounce_cnt) * num_rows; - kbc->repoll_dly = KBC_ROW_SCAN_DLY + scan_time_rows + pdata->repeat_cnt; - kbc->repoll_dly = DIV_ROUND_UP(kbc->repoll_dly, KBC_CYCLE_MS); - - input_dev->name = pdev->name; - input_dev->id.bustype = BUS_HOST; - input_dev->dev.parent = &pdev->dev; - input_dev->open = tegra_kbc_open; - input_dev->close = tegra_kbc_close; - - input_set_drvdata(input_dev, kbc); - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - - input_dev->keycode = kbc->keycode; - input_dev->keycodesize = sizeof(kbc->keycode[0]); - input_dev->keycodemax = KBC_MAX_KEY; - if (pdata->use_fn_map) - input_dev->keycodemax *= 2; - - kbc->use_fn_map = pdata->use_fn_map; - kbc->use_ghost_filter = pdata->use_ghost_filter; - keymap_data = pdata->keymap_data ?: &tegra_kbc_default_keymap_data; - matrix_keypad_build_keymap(keymap_data, KBC_ROW_SHIFT, - input_dev->keycode, input_dev->keybit); - kbc->wakeup_key = pdata->wakeup_key; - - err = request_irq(kbc->irq, tegra_kbc_isr, - IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH, pdev->name, kbc); - if (err) { - dev_err(&pdev->dev, "failed to request keyboard IRQ\n"); - goto err_put_clk; - } - - disable_irq(kbc->irq); - - err = input_register_device(kbc->idev); - if (err) { - dev_err(&pdev->dev, "failed to register input device\n"); - goto err_free_irq; - } - - platform_set_drvdata(pdev, kbc); - device_init_wakeup(&pdev->dev, pdata->wakeup); - - if (!pdev->dev.platform_data) - matrix_keyboard_of_free_keymap(pdata->keymap_data); - - return 0; - -err_free_irq: - free_irq(kbc->irq, pdev); -err_put_clk: - clk_put(kbc->clk); -err_iounmap: - iounmap(kbc->mmio); -err_free_mem_region: - release_mem_region(res->start, resource_size(res)); -err_free_mem: - input_free_device(input_dev); - kfree(kbc); -err_free_pdata: - if (!pdev->dev.platform_data) { - matrix_keyboard_of_free_keymap(pdata->keymap_data); - kfree(pdata); - } - - return err; -} - -static int __devexit tegra_kbc_remove(struct platform_device *pdev) -{ - struct tegra_kbc *kbc = platform_get_drvdata(pdev); - struct resource *res; - - platform_set_drvdata(pdev, NULL); - - free_irq(kbc->irq, pdev); - clk_put(kbc->clk); - - input_unregister_device(kbc->idev); - iounmap(kbc->mmio); - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(res->start, resource_size(res)); - - /* - * If we do not have platform data attached to the device we - * allocated it ourselves and thus need to free it. - */ - if (!pdev->dev.platform_data) - kfree(kbc->pdata); - - kfree(kbc); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int tegra_kbc_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tegra_kbc *kbc = platform_get_drvdata(pdev); - - mutex_lock(&kbc->idev->mutex); - if (device_may_wakeup(&pdev->dev)) { - disable_irq(kbc->irq); - del_timer_sync(&kbc->timer); - tegra_kbc_set_fifo_interrupt(kbc, false); - - /* Forcefully clear the interrupt status */ - writel(0x7, kbc->mmio + KBC_INT_0); - /* - * Store the previous resident time of continuous polling mode. - * Force the keyboard into interrupt mode. - */ - kbc->cp_to_wkup_dly = readl(kbc->mmio + KBC_TO_CNT_0); - writel(0, kbc->mmio + KBC_TO_CNT_0); - - tegra_kbc_setup_wakekeys(kbc, true); - msleep(30); - - kbc->keypress_caused_wake = false; - /* Enable keypress interrupt before going into suspend. */ - tegra_kbc_set_keypress_interrupt(kbc, true); - enable_irq(kbc->irq); - enable_irq_wake(kbc->irq); - } else { - if (kbc->idev->users) - tegra_kbc_stop(kbc); - } - mutex_unlock(&kbc->idev->mutex); - - return 0; -} - -static int tegra_kbc_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tegra_kbc *kbc = platform_get_drvdata(pdev); - int err = 0; - - mutex_lock(&kbc->idev->mutex); - if (device_may_wakeup(&pdev->dev)) { - disable_irq_wake(kbc->irq); - tegra_kbc_setup_wakekeys(kbc, false); - /* We will use fifo interrupts for key detection. */ - tegra_kbc_set_keypress_interrupt(kbc, false); - - /* Restore the resident time of continuous polling mode. */ - writel(kbc->cp_to_wkup_dly, kbc->mmio + KBC_TO_CNT_0); - - tegra_kbc_set_fifo_interrupt(kbc, true); - - if (kbc->keypress_caused_wake && kbc->wakeup_key) { - /* - * We can't report events directly from the ISR - * because timekeeping is stopped when processing - * wakeup request and we get a nasty warning when - * we try to call do_gettimeofday() in evdev - * handler. - */ - input_report_key(kbc->idev, kbc->wakeup_key, 1); - input_sync(kbc->idev); - input_report_key(kbc->idev, kbc->wakeup_key, 0); - input_sync(kbc->idev); - } - } else { - if (kbc->idev->users) - err = tegra_kbc_start(kbc); - } - mutex_unlock(&kbc->idev->mutex); - - return err; -} -#endif - -static SIMPLE_DEV_PM_OPS(tegra_kbc_pm_ops, tegra_kbc_suspend, tegra_kbc_resume); - -static const struct of_device_id tegra_kbc_of_match[] = { - { .compatible = "nvidia,tegra20-kbc", }, - { }, -}; -MODULE_DEVICE_TABLE(of, tegra_kbc_of_match); - -static struct platform_driver tegra_kbc_driver = { - .probe = tegra_kbc_probe, - .remove = __devexit_p(tegra_kbc_remove), - .driver = { - .name = "tegra-kbc", - .owner = THIS_MODULE, - .pm = &tegra_kbc_pm_ops, - .of_match_table = tegra_kbc_of_match, - }, -}; -module_platform_driver(tegra_kbc_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Rakesh Iyer <riyer@nvidia.com>"); -MODULE_DESCRIPTION("Tegra matrix keyboard controller driver"); -MODULE_ALIAS("platform:tegra-kbc"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/tnetv107x-keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/tnetv107x-keypad.c deleted file mode 100644 index fb39c94b..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/tnetv107x-keypad.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Texas Instruments TNETV107X Keypad Driver - * - * Copyright (C) 2010 Texas Instruments - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation version 2. - * - * This program is distributed "as is" WITHOUT ANY WARRANTY of any - * kind, whether express or implied; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <linux/kernel.h> -#include <linux/err.h> -#include <linux/errno.h> -#include <linux/input.h> -#include <linux/platform_device.h> -#include <linux/interrupt.h> -#include <linux/slab.h> -#include <linux/delay.h> -#include <linux/io.h> -#include <linux/clk.h> -#include <linux/input/matrix_keypad.h> -#include <linux/module.h> - -#define BITS(x) (BIT(x) - 1) - -#define KEYPAD_ROWS 9 -#define KEYPAD_COLS 9 - -#define DEBOUNCE_MIN 0x400ul -#define DEBOUNCE_MAX 0x3ffffffful - -struct keypad_regs { - u32 rev; - u32 mode; - u32 mask; - u32 pol; - u32 dclock; - u32 rclock; - u32 stable_cnt; - u32 in_en; - u32 out; - u32 out_en; - u32 in; - u32 lock; - u32 pres[3]; -}; - -#define keypad_read(kp, reg) __raw_readl(&(kp)->regs->reg) -#define keypad_write(kp, reg, val) __raw_writel(val, &(kp)->regs->reg) - -struct keypad_data { - struct input_dev *input_dev; - struct resource *res; - struct keypad_regs __iomem *regs; - struct clk *clk; - struct device *dev; - spinlock_t lock; - u32 irq_press; - u32 irq_release; - int rows, cols, row_shift; - int debounce_ms, active_low; - u32 prev_keys[3]; - unsigned short keycodes[]; -}; - -static irqreturn_t keypad_irq(int irq, void *data) -{ - struct keypad_data *kp = data; - int i, bit, val, row, col, code; - unsigned long flags; - u32 curr_keys[3]; - u32 change; - - spin_lock_irqsave(&kp->lock, flags); - - memset(curr_keys, 0, sizeof(curr_keys)); - if (irq == kp->irq_press) - for (i = 0; i < 3; i++) - curr_keys[i] = keypad_read(kp, pres[i]); - - for (i = 0; i < 3; i++) { - change = curr_keys[i] ^ kp->prev_keys[i]; - - while (change) { - bit = fls(change) - 1; - change ^= BIT(bit); - val = curr_keys[i] & BIT(bit); - bit += i * 32; - row = bit / KEYPAD_COLS; - col = bit % KEYPAD_COLS; - - code = MATRIX_SCAN_CODE(row, col, kp->row_shift); - input_event(kp->input_dev, EV_MSC, MSC_SCAN, code); - input_report_key(kp->input_dev, kp->keycodes[code], - val); - } - } - input_sync(kp->input_dev); - memcpy(kp->prev_keys, curr_keys, sizeof(curr_keys)); - - if (irq == kp->irq_press) - keypad_write(kp, lock, 0); /* Allow hardware updates */ - - spin_unlock_irqrestore(&kp->lock, flags); - - return IRQ_HANDLED; -} - -static int keypad_start(struct input_dev *dev) -{ - struct keypad_data *kp = input_get_drvdata(dev); - unsigned long mask, debounce, clk_rate_khz; - unsigned long flags; - - clk_enable(kp->clk); - clk_rate_khz = clk_get_rate(kp->clk) / 1000; - - spin_lock_irqsave(&kp->lock, flags); - - /* Initialize device registers */ - keypad_write(kp, mode, 0); - - mask = BITS(kp->rows) << KEYPAD_COLS; - mask |= BITS(kp->cols); - keypad_write(kp, mask, ~mask); - - keypad_write(kp, pol, kp->active_low ? 0 : 0x3ffff); - keypad_write(kp, stable_cnt, 3); - - debounce = kp->debounce_ms * clk_rate_khz; - debounce = clamp(debounce, DEBOUNCE_MIN, DEBOUNCE_MAX); - keypad_write(kp, dclock, debounce); - keypad_write(kp, rclock, 4 * debounce); - - keypad_write(kp, in_en, 1); - - spin_unlock_irqrestore(&kp->lock, flags); - - return 0; -} - -static void keypad_stop(struct input_dev *dev) -{ - struct keypad_data *kp = input_get_drvdata(dev); - - synchronize_irq(kp->irq_press); - synchronize_irq(kp->irq_release); - clk_disable(kp->clk); -} - -static int __devinit keypad_probe(struct platform_device *pdev) -{ - const struct matrix_keypad_platform_data *pdata; - const struct matrix_keymap_data *keymap_data; - struct device *dev = &pdev->dev; - struct keypad_data *kp; - int error = 0, sz, row_shift; - u32 rev = 0; - - pdata = pdev->dev.platform_data; - if (!pdata) { - dev_err(dev, "cannot find device data\n"); - return -EINVAL; - } - - keymap_data = pdata->keymap_data; - if (!keymap_data) { - dev_err(dev, "cannot find keymap data\n"); - return -EINVAL; - } - - row_shift = get_count_order(pdata->num_col_gpios); - sz = offsetof(struct keypad_data, keycodes); - sz += (pdata->num_row_gpios << row_shift) * sizeof(kp->keycodes[0]); - kp = kzalloc(sz, GFP_KERNEL); - if (!kp) { - dev_err(dev, "cannot allocate device info\n"); - return -ENOMEM; - } - - kp->dev = dev; - kp->rows = pdata->num_row_gpios; - kp->cols = pdata->num_col_gpios; - kp->row_shift = row_shift; - platform_set_drvdata(pdev, kp); - spin_lock_init(&kp->lock); - - kp->irq_press = platform_get_irq_byname(pdev, "press"); - kp->irq_release = platform_get_irq_byname(pdev, "release"); - if (kp->irq_press < 0 || kp->irq_release < 0) { - dev_err(dev, "cannot determine device interrupts\n"); - error = -ENODEV; - goto error_res; - } - - kp->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!kp->res) { - dev_err(dev, "cannot determine register area\n"); - error = -ENODEV; - goto error_res; - } - - if (!request_mem_region(kp->res->start, resource_size(kp->res), - pdev->name)) { - dev_err(dev, "cannot claim register memory\n"); - kp->res = NULL; - error = -EINVAL; - goto error_res; - } - - kp->regs = ioremap(kp->res->start, resource_size(kp->res)); - if (!kp->regs) { - dev_err(dev, "cannot map register memory\n"); - error = -ENOMEM; - goto error_map; - } - - kp->clk = clk_get(dev, NULL); - if (IS_ERR(kp->clk)) { - dev_err(dev, "cannot claim device clock\n"); - error = PTR_ERR(kp->clk); - goto error_clk; - } - - error = request_threaded_irq(kp->irq_press, NULL, keypad_irq, 0, - dev_name(dev), kp); - if (error < 0) { - dev_err(kp->dev, "Could not allocate keypad press key irq\n"); - goto error_irq_press; - } - - error = request_threaded_irq(kp->irq_release, NULL, keypad_irq, 0, - dev_name(dev), kp); - if (error < 0) { - dev_err(kp->dev, "Could not allocate keypad release key irq\n"); - goto error_irq_release; - } - - kp->input_dev = input_allocate_device(); - if (!kp->input_dev) { - dev_err(dev, "cannot allocate input device\n"); - error = -ENOMEM; - goto error_input; - } - input_set_drvdata(kp->input_dev, kp); - - kp->input_dev->name = pdev->name; - kp->input_dev->dev.parent = &pdev->dev; - kp->input_dev->open = keypad_start; - kp->input_dev->close = keypad_stop; - kp->input_dev->evbit[0] = BIT_MASK(EV_KEY); - if (!pdata->no_autorepeat) - kp->input_dev->evbit[0] |= BIT_MASK(EV_REP); - - clk_enable(kp->clk); - rev = keypad_read(kp, rev); - kp->input_dev->id.bustype = BUS_HOST; - kp->input_dev->id.product = ((rev >> 8) & 0x07); - kp->input_dev->id.version = ((rev >> 16) & 0xfff); - clk_disable(kp->clk); - - kp->input_dev->keycode = kp->keycodes; - kp->input_dev->keycodesize = sizeof(kp->keycodes[0]); - kp->input_dev->keycodemax = kp->rows << kp->row_shift; - - matrix_keypad_build_keymap(keymap_data, kp->row_shift, kp->keycodes, - kp->input_dev->keybit); - - input_set_capability(kp->input_dev, EV_MSC, MSC_SCAN); - - error = input_register_device(kp->input_dev); - if (error < 0) { - dev_err(dev, "Could not register input device\n"); - goto error_reg; - } - - return 0; - - -error_reg: - input_free_device(kp->input_dev); -error_input: - free_irq(kp->irq_release, kp); -error_irq_release: - free_irq(kp->irq_press, kp); -error_irq_press: - clk_put(kp->clk); -error_clk: - iounmap(kp->regs); -error_map: - release_mem_region(kp->res->start, resource_size(kp->res)); -error_res: - platform_set_drvdata(pdev, NULL); - kfree(kp); - return error; -} - -static int __devexit keypad_remove(struct platform_device *pdev) -{ - struct keypad_data *kp = platform_get_drvdata(pdev); - - free_irq(kp->irq_press, kp); - free_irq(kp->irq_release, kp); - input_unregister_device(kp->input_dev); - clk_put(kp->clk); - iounmap(kp->regs); - release_mem_region(kp->res->start, resource_size(kp->res)); - platform_set_drvdata(pdev, NULL); - kfree(kp); - - return 0; -} - -static struct platform_driver keypad_driver = { - .probe = keypad_probe, - .remove = __devexit_p(keypad_remove), - .driver.name = "tnetv107x-keypad", - .driver.owner = THIS_MODULE, -}; -module_platform_driver(keypad_driver); - -MODULE_AUTHOR("Cyril Chemparathy"); -MODULE_DESCRIPTION("TNETV107X Keypad Driver"); -MODULE_ALIAS("platform:tnetv107x-keypad"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/twl4030_keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/twl4030_keypad.c deleted file mode 100644 index 67bec14e..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/twl4030_keypad.c +++ /dev/null @@ -1,467 +0,0 @@ -/* - * twl4030_keypad.c - driver for 8x8 keypad controller in twl4030 chips - * - * Copyright (C) 2007 Texas Instruments, Inc. - * Copyright (C) 2008 Nokia Corporation - * - * Code re-written for 2430SDP by: - * Syed Mohammed Khasim <x0khasim@ti.com> - * - * Initial Code: - * Manjunatha G K <manjugk@ti.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/input.h> -#include <linux/platform_device.h> -#include <linux/i2c/twl.h> -#include <linux/slab.h> - -/* - * The TWL4030 family chips include a keypad controller that supports - * up to an 8x8 switch matrix. The controller can issue system wakeup - * events, since it uses only the always-on 32KiHz oscillator, and has - * an internal state machine that decodes pressed keys, including - * multi-key combinations. - * - * This driver lets boards define what keycodes they wish to report for - * which scancodes, as part of the "struct twl4030_keypad_data" used in - * the probe() routine. - * - * See the TPS65950 documentation; that's the general availability - * version of the TWL5030 second generation part. - */ -#define TWL4030_MAX_ROWS 8 /* TWL4030 hard limit */ -#define TWL4030_MAX_COLS 8 -/* - * Note that we add space for an extra column so that we can handle - * row lines connected to the gnd (see twl4030_col_xlate()). - */ -#define TWL4030_ROW_SHIFT 4 -#define TWL4030_KEYMAP_SIZE (TWL4030_MAX_ROWS << TWL4030_ROW_SHIFT) - -struct twl4030_keypad { - unsigned short keymap[TWL4030_KEYMAP_SIZE]; - u16 kp_state[TWL4030_MAX_ROWS]; - unsigned n_rows; - unsigned n_cols; - unsigned irq; - - struct device *dbg_dev; - struct input_dev *input; -}; - -/*----------------------------------------------------------------------*/ - -/* arbitrary prescaler value 0..7 */ -#define PTV_PRESCALER 4 - -/* Register Offsets */ -#define KEYP_CTRL 0x00 -#define KEYP_DEB 0x01 -#define KEYP_LONG_KEY 0x02 -#define KEYP_LK_PTV 0x03 -#define KEYP_TIMEOUT_L 0x04 -#define KEYP_TIMEOUT_H 0x05 -#define KEYP_KBC 0x06 -#define KEYP_KBR 0x07 -#define KEYP_SMS 0x08 -#define KEYP_FULL_CODE_7_0 0x09 /* row 0 column status */ -#define KEYP_FULL_CODE_15_8 0x0a /* ... row 1 ... */ -#define KEYP_FULL_CODE_23_16 0x0b -#define KEYP_FULL_CODE_31_24 0x0c -#define KEYP_FULL_CODE_39_32 0x0d -#define KEYP_FULL_CODE_47_40 0x0e -#define KEYP_FULL_CODE_55_48 0x0f -#define KEYP_FULL_CODE_63_56 0x10 -#define KEYP_ISR1 0x11 -#define KEYP_IMR1 0x12 -#define KEYP_ISR2 0x13 -#define KEYP_IMR2 0x14 -#define KEYP_SIR 0x15 -#define KEYP_EDR 0x16 /* edge triggers */ -#define KEYP_SIH_CTRL 0x17 - -/* KEYP_CTRL_REG Fields */ -#define KEYP_CTRL_SOFT_NRST BIT(0) -#define KEYP_CTRL_SOFTMODEN BIT(1) -#define KEYP_CTRL_LK_EN BIT(2) -#define KEYP_CTRL_TOE_EN BIT(3) -#define KEYP_CTRL_TOLE_EN BIT(4) -#define KEYP_CTRL_RP_EN BIT(5) -#define KEYP_CTRL_KBD_ON BIT(6) - -/* KEYP_DEB, KEYP_LONG_KEY, KEYP_TIMEOUT_x*/ -#define KEYP_PERIOD_US(t, prescale) ((t) / (31 << (prescale + 1)) - 1) - -/* KEYP_LK_PTV_REG Fields */ -#define KEYP_LK_PTV_PTV_SHIFT 5 - -/* KEYP_{IMR,ISR,SIR} Fields */ -#define KEYP_IMR1_MIS BIT(3) -#define KEYP_IMR1_TO BIT(2) -#define KEYP_IMR1_LK BIT(1) -#define KEYP_IMR1_KP BIT(0) - -/* KEYP_EDR Fields */ -#define KEYP_EDR_KP_FALLING 0x01 -#define KEYP_EDR_KP_RISING 0x02 -#define KEYP_EDR_KP_BOTH 0x03 -#define KEYP_EDR_LK_FALLING 0x04 -#define KEYP_EDR_LK_RISING 0x08 -#define KEYP_EDR_TO_FALLING 0x10 -#define KEYP_EDR_TO_RISING 0x20 -#define KEYP_EDR_MIS_FALLING 0x40 -#define KEYP_EDR_MIS_RISING 0x80 - - -/*----------------------------------------------------------------------*/ - -static int twl4030_kpread(struct twl4030_keypad *kp, - u8 *data, u32 reg, u8 num_bytes) -{ - int ret = twl_i2c_read(TWL4030_MODULE_KEYPAD, data, reg, num_bytes); - - if (ret < 0) - dev_warn(kp->dbg_dev, - "Couldn't read TWL4030: %X - ret %d[%x]\n", - reg, ret, ret); - - return ret; -} - -static int twl4030_kpwrite_u8(struct twl4030_keypad *kp, u8 data, u32 reg) -{ - int ret = twl_i2c_write_u8(TWL4030_MODULE_KEYPAD, data, reg); - - if (ret < 0) - dev_warn(kp->dbg_dev, - "Could not write TWL4030: %X - ret %d[%x]\n", - reg, ret, ret); - - return ret; -} - -static inline u16 twl4030_col_xlate(struct twl4030_keypad *kp, u8 col) -{ - /* If all bits in a row are active for all coloumns then - * we have that row line connected to gnd. Mark this - * key on as if it was on matrix position n_cols (ie - * one higher than the size of the matrix). - */ - if (col == 0xFF) - return 1 << kp->n_cols; - else - return col & ((1 << kp->n_cols) - 1); -} - -static int twl4030_read_kp_matrix_state(struct twl4030_keypad *kp, u16 *state) -{ - u8 new_state[TWL4030_MAX_ROWS]; - int row; - int ret = twl4030_kpread(kp, new_state, - KEYP_FULL_CODE_7_0, kp->n_rows); - if (ret >= 0) - for (row = 0; row < kp->n_rows; row++) - state[row] = twl4030_col_xlate(kp, new_state[row]); - - return ret; -} - -static bool twl4030_is_in_ghost_state(struct twl4030_keypad *kp, u16 *key_state) -{ - int i; - u16 check = 0; - - for (i = 0; i < kp->n_rows; i++) { - u16 col = key_state[i]; - - if ((col & check) && hweight16(col) > 1) - return true; - - check |= col; - } - - return false; -} - -static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) -{ - struct input_dev *input = kp->input; - u16 new_state[TWL4030_MAX_ROWS]; - int col, row; - - if (release_all) - memset(new_state, 0, sizeof(new_state)); - else { - /* check for any changes */ - int ret = twl4030_read_kp_matrix_state(kp, new_state); - - if (ret < 0) /* panic ... */ - return; - - if (twl4030_is_in_ghost_state(kp, new_state)) - return; - } - - /* check for changes and print those */ - for (row = 0; row < kp->n_rows; row++) { - int changed = new_state[row] ^ kp->kp_state[row]; - - if (!changed) - continue; - - /* Extra column handles "all gnd" rows */ - for (col = 0; col < kp->n_cols + 1; col++) { - int code; - - if (!(changed & (1 << col))) - continue; - - dev_dbg(kp->dbg_dev, "key [%d:%d] %s\n", row, col, - (new_state[row] & (1 << col)) ? - "press" : "release"); - - code = MATRIX_SCAN_CODE(row, col, TWL4030_ROW_SHIFT); - input_event(input, EV_MSC, MSC_SCAN, code); - input_report_key(input, kp->keymap[code], - new_state[row] & (1 << col)); - } - kp->kp_state[row] = new_state[row]; - } - input_sync(input); -} - -/* - * Keypad interrupt handler - */ -static irqreturn_t do_kp_irq(int irq, void *_kp) -{ - struct twl4030_keypad *kp = _kp; - u8 reg; - int ret; - - /* Read & Clear TWL4030 pending interrupt */ - ret = twl4030_kpread(kp, ®, KEYP_ISR1, 1); - - /* Release all keys if I2C has gone bad or - * the KEYP has gone to idle state */ - if (ret >= 0 && (reg & KEYP_IMR1_KP)) - twl4030_kp_scan(kp, false); - else - twl4030_kp_scan(kp, true); - - return IRQ_HANDLED; -} - -static int __devinit twl4030_kp_program(struct twl4030_keypad *kp) -{ - u8 reg; - int i; - - /* Enable controller, with hardware decoding but not autorepeat */ - reg = KEYP_CTRL_SOFT_NRST | KEYP_CTRL_SOFTMODEN - | KEYP_CTRL_TOE_EN | KEYP_CTRL_KBD_ON; - if (twl4030_kpwrite_u8(kp, reg, KEYP_CTRL) < 0) - return -EIO; - - /* NOTE: we could use sih_setup() here to package keypad - * event sources as four different IRQs ... but we don't. - */ - - /* Enable TO rising and KP rising and falling edge detection */ - reg = KEYP_EDR_KP_BOTH | KEYP_EDR_TO_RISING; - if (twl4030_kpwrite_u8(kp, reg, KEYP_EDR) < 0) - return -EIO; - - /* Set PTV prescaler Field */ - reg = (PTV_PRESCALER << KEYP_LK_PTV_PTV_SHIFT); - if (twl4030_kpwrite_u8(kp, reg, KEYP_LK_PTV) < 0) - return -EIO; - - /* Set key debounce time to 20 ms */ - i = KEYP_PERIOD_US(20000, PTV_PRESCALER); - if (twl4030_kpwrite_u8(kp, i, KEYP_DEB) < 0) - return -EIO; - - /* Set timeout period to 200 ms */ - i = KEYP_PERIOD_US(200000, PTV_PRESCALER); - if (twl4030_kpwrite_u8(kp, (i & 0xFF), KEYP_TIMEOUT_L) < 0) - return -EIO; - - if (twl4030_kpwrite_u8(kp, (i >> 8), KEYP_TIMEOUT_H) < 0) - return -EIO; - - /* - * Enable Clear-on-Read; disable remembering events that fire - * after the IRQ but before our handler acks (reads) them, - */ - reg = TWL4030_SIH_CTRL_COR_MASK | TWL4030_SIH_CTRL_PENDDIS_MASK; - if (twl4030_kpwrite_u8(kp, reg, KEYP_SIH_CTRL) < 0) - return -EIO; - - /* initialize key state; irqs update it from here on */ - if (twl4030_read_kp_matrix_state(kp, kp->kp_state) < 0) - return -EIO; - - return 0; -} - -/* - * Registers keypad device with input subsystem - * and configures TWL4030 keypad registers - */ -static int __devinit twl4030_kp_probe(struct platform_device *pdev) -{ - struct twl4030_keypad_data *pdata = pdev->dev.platform_data; - const struct matrix_keymap_data *keymap_data; - struct twl4030_keypad *kp; - struct input_dev *input; - u8 reg; - int error; - - if (!pdata || !pdata->rows || !pdata->cols || !pdata->keymap_data || - pdata->rows > TWL4030_MAX_ROWS || pdata->cols > TWL4030_MAX_COLS) { - dev_err(&pdev->dev, "Invalid platform_data\n"); - return -EINVAL; - } - - keymap_data = pdata->keymap_data; - - kp = kzalloc(sizeof(*kp), GFP_KERNEL); - input = input_allocate_device(); - if (!kp || !input) { - error = -ENOMEM; - goto err1; - } - - /* Get the debug Device */ - kp->dbg_dev = &pdev->dev; - kp->input = input; - - kp->n_rows = pdata->rows; - kp->n_cols = pdata->cols; - kp->irq = platform_get_irq(pdev, 0); - - /* setup input device */ - __set_bit(EV_KEY, input->evbit); - - /* Enable auto repeat feature of Linux input subsystem */ - if (pdata->rep) - __set_bit(EV_REP, input->evbit); - - input_set_capability(input, EV_MSC, MSC_SCAN); - - input->name = "TWL4030 Keypad"; - input->phys = "twl4030_keypad/input0"; - input->dev.parent = &pdev->dev; - - input->id.bustype = BUS_HOST; - input->id.vendor = 0x0001; - input->id.product = 0x0001; - input->id.version = 0x0003; - - input->keycode = kp->keymap; - input->keycodesize = sizeof(kp->keymap[0]); - input->keycodemax = ARRAY_SIZE(kp->keymap); - - matrix_keypad_build_keymap(keymap_data, TWL4030_ROW_SHIFT, - input->keycode, input->keybit); - - error = input_register_device(input); - if (error) { - dev_err(kp->dbg_dev, - "Unable to register twl4030 keypad device\n"); - goto err1; - } - - error = twl4030_kp_program(kp); - if (error) - goto err2; - - /* - * This ISR will always execute in kernel thread context because of - * the need to access the TWL4030 over the I2C bus. - * - * NOTE: we assume this host is wired to TWL4040 INT1, not INT2 ... - */ - error = request_threaded_irq(kp->irq, NULL, do_kp_irq, - 0, pdev->name, kp); - if (error) { - dev_info(kp->dbg_dev, "request_irq failed for irq no=%d\n", - kp->irq); - goto err2; - } - - /* Enable KP and TO interrupts now. */ - reg = (u8) ~(KEYP_IMR1_KP | KEYP_IMR1_TO); - if (twl4030_kpwrite_u8(kp, reg, KEYP_IMR1)) { - error = -EIO; - goto err3; - } - - platform_set_drvdata(pdev, kp); - return 0; - -err3: - /* mask all events - we don't care about the result */ - (void) twl4030_kpwrite_u8(kp, 0xff, KEYP_IMR1); - free_irq(kp->irq, NULL); -err2: - input_unregister_device(input); - input = NULL; -err1: - input_free_device(input); - kfree(kp); - return error; -} - -static int __devexit twl4030_kp_remove(struct platform_device *pdev) -{ - struct twl4030_keypad *kp = platform_get_drvdata(pdev); - - free_irq(kp->irq, kp); - input_unregister_device(kp->input); - platform_set_drvdata(pdev, NULL); - kfree(kp); - - return 0; -} - -/* - * NOTE: twl4030 are multi-function devices connected via I2C. - * So this device is a child of an I2C parent, thus it needs to - * support unplug/replug (which most platform devices don't). - */ - -static struct platform_driver twl4030_kp_driver = { - .probe = twl4030_kp_probe, - .remove = __devexit_p(twl4030_kp_remove), - .driver = { - .name = "twl4030_keypad", - .owner = THIS_MODULE, - }, -}; -module_platform_driver(twl4030_kp_driver); - -MODULE_AUTHOR("Texas Instruments"); -MODULE_DESCRIPTION("TWL4030 Keypad Driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:twl4030_keypad"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/w90p910_keypad.c b/ANDROID_3.4.5/drivers/input/keyboard/w90p910_keypad.c deleted file mode 100644 index 99bbb7e7..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/w90p910_keypad.c +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (c) 2008-2009 Nuvoton technology corporation. - * - * Wan ZongShun <mcuos.com@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation;version 2 of the License. - * - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/input.h> -#include <linux/device.h> -#include <linux/platform_device.h> -#include <linux/clk.h> -#include <linux/err.h> -#include <linux/io.h> -#include <linux/slab.h> - -#include <mach/w90p910_keypad.h> - -/* Keypad Interface Control Registers */ -#define KPI_CONF 0x00 -#define KPI_3KCONF 0x04 -#define KPI_LPCONF 0x08 -#define KPI_STATUS 0x0C - -#define IS1KEY (0x01 << 16) -#define INTTR (0x01 << 21) -#define KEY0R (0x0f << 3) -#define KEY0C 0x07 -#define DEBOUNCE_BIT 0x08 -#define KSIZE0 (0x01 << 16) -#define KSIZE1 (0x01 << 17) -#define KPSEL (0x01 << 19) -#define ENKP (0x01 << 18) - -#define KGET_RAW(n) (((n) & KEY0R) >> 3) -#define KGET_COLUMN(n) ((n) & KEY0C) - -#define W90P910_MAX_KEY_NUM (8 * 8) -#define W90P910_ROW_SHIFT 3 - -struct w90p910_keypad { - const struct w90p910_keypad_platform_data *pdata; - struct clk *clk; - struct input_dev *input_dev; - void __iomem *mmio_base; - int irq; - unsigned short keymap[W90P910_MAX_KEY_NUM]; -}; - -static void w90p910_keypad_scan_matrix(struct w90p910_keypad *keypad, - unsigned int status) -{ - struct input_dev *input_dev = keypad->input_dev; - unsigned int row = KGET_RAW(status); - unsigned int col = KGET_COLUMN(status); - unsigned int code = MATRIX_SCAN_CODE(row, col, W90P910_ROW_SHIFT); - unsigned int key = keypad->keymap[code]; - - input_event(input_dev, EV_MSC, MSC_SCAN, code); - input_report_key(input_dev, key, 1); - input_sync(input_dev); - - input_event(input_dev, EV_MSC, MSC_SCAN, code); - input_report_key(input_dev, key, 0); - input_sync(input_dev); -} - -static irqreturn_t w90p910_keypad_irq_handler(int irq, void *dev_id) -{ - struct w90p910_keypad *keypad = dev_id; - unsigned int kstatus, val; - - kstatus = __raw_readl(keypad->mmio_base + KPI_STATUS); - - val = INTTR | IS1KEY; - - if (kstatus & val) - w90p910_keypad_scan_matrix(keypad, kstatus); - - return IRQ_HANDLED; -} - -static int w90p910_keypad_open(struct input_dev *dev) -{ - struct w90p910_keypad *keypad = input_get_drvdata(dev); - const struct w90p910_keypad_platform_data *pdata = keypad->pdata; - unsigned int val, config; - - /* Enable unit clock */ - clk_enable(keypad->clk); - - val = __raw_readl(keypad->mmio_base + KPI_CONF); - val |= (KPSEL | ENKP); - val &= ~(KSIZE0 | KSIZE1); - - config = pdata->prescale | (pdata->debounce << DEBOUNCE_BIT); - - val |= config; - - __raw_writel(val, keypad->mmio_base + KPI_CONF); - - return 0; -} - -static void w90p910_keypad_close(struct input_dev *dev) -{ - struct w90p910_keypad *keypad = input_get_drvdata(dev); - - /* Disable clock unit */ - clk_disable(keypad->clk); -} - -static int __devinit w90p910_keypad_probe(struct platform_device *pdev) -{ - const struct w90p910_keypad_platform_data *pdata = - pdev->dev.platform_data; - const struct matrix_keymap_data *keymap_data; - struct w90p910_keypad *keypad; - struct input_dev *input_dev; - struct resource *res; - int irq; - int error; - - if (!pdata) { - dev_err(&pdev->dev, "no platform data defined\n"); - return -EINVAL; - } - - keymap_data = pdata->keymap_data; - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "failed to get keypad irq\n"); - return -ENXIO; - } - - keypad = kzalloc(sizeof(struct w90p910_keypad), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!keypad || !input_dev) { - dev_err(&pdev->dev, "failed to allocate driver data\n"); - error = -ENOMEM; - goto failed_free; - } - - keypad->pdata = pdata; - keypad->input_dev = input_dev; - keypad->irq = irq; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (res == NULL) { - dev_err(&pdev->dev, "failed to get I/O memory\n"); - error = -ENXIO; - goto failed_free; - } - - res = request_mem_region(res->start, resource_size(res), pdev->name); - if (res == NULL) { - dev_err(&pdev->dev, "failed to request I/O memory\n"); - error = -EBUSY; - goto failed_free; - } - - keypad->mmio_base = ioremap(res->start, resource_size(res)); - if (keypad->mmio_base == NULL) { - dev_err(&pdev->dev, "failed to remap I/O memory\n"); - error = -ENXIO; - goto failed_free_res; - } - - keypad->clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(keypad->clk)) { - dev_err(&pdev->dev, "failed to get keypad clock\n"); - error = PTR_ERR(keypad->clk); - goto failed_free_io; - } - - /* set multi-function pin for w90p910 kpi. */ - mfp_set_groupi(&pdev->dev); - - input_dev->name = pdev->name; - input_dev->id.bustype = BUS_HOST; - input_dev->open = w90p910_keypad_open; - input_dev->close = w90p910_keypad_close; - input_dev->dev.parent = &pdev->dev; - - input_dev->keycode = keypad->keymap; - input_dev->keycodesize = sizeof(keypad->keymap[0]); - input_dev->keycodemax = ARRAY_SIZE(keypad->keymap); - - input_set_drvdata(input_dev, keypad); - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - - matrix_keypad_build_keymap(keymap_data, W90P910_ROW_SHIFT, - input_dev->keycode, input_dev->keybit); - - error = request_irq(keypad->irq, w90p910_keypad_irq_handler, - 0, pdev->name, keypad); - if (error) { - dev_err(&pdev->dev, "failed to request IRQ\n"); - goto failed_put_clk; - } - - /* Register the input device */ - error = input_register_device(input_dev); - if (error) { - dev_err(&pdev->dev, "failed to register input device\n"); - goto failed_free_irq; - } - - platform_set_drvdata(pdev, keypad); - return 0; - -failed_free_irq: - free_irq(irq, pdev); -failed_put_clk: - clk_put(keypad->clk); -failed_free_io: - iounmap(keypad->mmio_base); -failed_free_res: - release_mem_region(res->start, resource_size(res)); -failed_free: - input_free_device(input_dev); - kfree(keypad); - return error; -} - -static int __devexit w90p910_keypad_remove(struct platform_device *pdev) -{ - struct w90p910_keypad *keypad = platform_get_drvdata(pdev); - struct resource *res; - - free_irq(keypad->irq, pdev); - - clk_put(keypad->clk); - - input_unregister_device(keypad->input_dev); - - iounmap(keypad->mmio_base); - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(res->start, resource_size(res)); - - platform_set_drvdata(pdev, NULL); - kfree(keypad); - - return 0; -} - -static struct platform_driver w90p910_keypad_driver = { - .probe = w90p910_keypad_probe, - .remove = __devexit_p(w90p910_keypad_remove), - .driver = { - .name = "nuc900-kpi", - .owner = THIS_MODULE, - }, -}; -module_platform_driver(w90p910_keypad_driver); - -MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>"); -MODULE_DESCRIPTION("w90p910 keypad driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:nuc900-keypad"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/wmt_kpad.c b/ANDROID_3.4.5/drivers/input/keyboard/wmt_kpad.c deleted file mode 100755 index cf50cf1c..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/wmt_kpad.c +++ /dev/null @@ -1,466 +0,0 @@ -/*++ -linux/drivers/input/keyboard/wmt_kpad.c - -Some descriptions of such software. Copyright (c) 2008 WonderMedia Technologies, Inc. - -This program is free software: you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the Free Software Foundation, -either version 2 of the License, or (at your option) any later version. - -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, see <http://www.gnu.org/licenses/>. - -WonderMedia Technologies, Inc. -10F, 529, Chung-Cheng Road, Hsin-Tien, Taipei 231, R.O.C. ---*/ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/types.h> -#include <linux/input.h> -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/device.h> -#include <linux/platform_device.h> -#include <linux/cpufreq.h> -#include <linux/delay.h> -#include <asm/io.h> -#include <asm/irq.h> -#include <asm/errno.h> -#include <asm/mach-types.h> -#include <mach/hardware.h> -#include <linux/suspend.h> -#include <linux/gpio.h> -#include <mach/wmt_iomux.h> - - -/* Debug macros */ -#if 0 -#define DPRINTK(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __func__ , ## args) -#else -#define DPRINTK(fmt, args...) -#endif - -//#define USE_HOME -#define wmt_kpad_timeout (HZ/50) - -#define WMT_KPAD_FUNCTION_NUM 7 - - -static unsigned int wmt_kpad_codes[WMT_KPAD_FUNCTION_NUM] = { - [0] = KEY_VOLUMEUP, - [1] = KEY_VOLUMEDOWN, - [2] = KEY_BACK, - [3] = KEY_HOME, - [4] = KEY_MENU, - [5] = KEY_CAMERA, - [6] = KEY_PLAYPAUSE, -}; - - -enum { - KEY_ST_up, - KEY_ST_down, - KEY_ST_debounce, -}; - -static struct input_dev *kpad_dev; - -int key_num = 0; - -struct wmt_key{ - int gpio; - int keycode; - - int status; - int debounce; - struct timer_list timer; -} ; -struct wmt_key gpio_key[5]; - -#ifdef CONFIG_CPU_FREQ -/* - * Well, the debounce time is not very critical while zac2_clk - * rescaling, but we still do it. - */ - -/* kpad_clock_notifier() - * - * When changing the processor core clock frequency, it is necessary - * to adjust the KPMIR register. - * - * Returns: 0 on success, -1 on error - */ -static int kpad_clock_notifier(struct notifier_block *nb, unsigned long event, - void *data) -{ - return 0; -} - -/* - * Notify callback while issusing zac2_clk rescale. - */ -static struct notifier_block kpad_clock_nblock = { - .notifier_call = kpad_clock_notifier, - .priority = 1 -}; -#endif - -static int wmt_kpad_gpio_requst(void) -{ - int i,j,ret; - DPRINTK("Start\n"); - for(i=0; i< key_num; i++){ - ret = gpio_request(gpio_key[i].gpio,"kpad"); - if(ret) - goto exit; - } - - DPRINTK("End\n"); - return ret; -exit: - for(j=0; j < i; j++) - gpio_free(gpio_key[j].gpio); - return ret; -} - -static int wmt_kpad_gpio_init(void) -{ - int i; - for(i=0; i<key_num; i++){ - gpio_direction_input(gpio_key[i].gpio); - wmt_gpio_setpull(gpio_key[i].gpio,WMT_GPIO_PULL_UP); - } - - return 0; -} - - -static int wmt_kpad_gpio_free(void) -{ - int i; - for(i=0; i<key_num; i++){ - gpio_free(gpio_key[i].gpio); - } - - return 0; -} - -static void wmt_kpad_poll(unsigned long fcontext) -{ - struct wmt_key *gpk = (struct wmt_key *)fcontext; - - //DPRINTK("Start\n"); - if (__gpio_get_value(gpk->gpio) == 0) { /*Active Low*/ - if(gpk->status == KEY_ST_up){ - gpk->debounce = 5; - gpk->status = KEY_ST_debounce; - DPRINTK("vd down to debounce\n"); - } - - if(gpk->status == KEY_ST_debounce){ - if(--gpk->debounce == 0){ - gpk->status = KEY_ST_down; - /* report volume down key down */ - input_report_key(kpad_dev, gpk->keycode, 1); - input_sync(kpad_dev); - DPRINTK("WMT Volume up keep press\n"); - } - } - //DPRINTK("vd level is low,status=%d\n",vu_status); - - } - else {/* Level High */ - if(gpk->status == KEY_ST_down){ - gpk->status = KEY_ST_up; - /*Volume down release*/ - input_report_key(kpad_dev, gpk->keycode, 0); /*row4 key is release*/ - input_sync(kpad_dev); - DPRINTK("WMT_Volume down release key = %d \n", gpk->keycode); - } - - if(gpk->status == KEY_ST_debounce){ - if(--gpk->debounce == 0){ - gpk->status = KEY_ST_up; - } - } - - //DPRINTK("vd level is high,status=%d\n",vu_status); - - } - - mod_timer(&gpk->timer, jiffies + wmt_kpad_timeout); - //DPRINTK("End\n"); - - return; -} - -static int init_key_timer(void) -{ - int i; - for(i=0; i<key_num;i++){ - init_timer(&gpio_key[i].timer); - gpio_key[i].timer.function = wmt_kpad_poll; - gpio_key[i].timer.data = (unsigned long)&gpio_key[i]; - } - - return 0; -} - -static int start_key_timer(void) -{ int i; - for(i=0;i<key_num;i++){ - gpio_key[i].status = KEY_ST_up; - mod_timer(&gpio_key[i].timer, jiffies + HZ/10); - } - - return 0; -} - -static int del_key_timer(void) -{ int i; - for(i=0;i<key_num;i++){ - gpio_key[i].status = KEY_ST_up; - del_timer_sync(&gpio_key[i].timer); - } - - return 0; -} -static int kpad_open(struct input_dev *dev) -{ - int ret = 0; - DPRINTK("Start\n"); - - /*init timer*/ - init_key_timer(); - start_key_timer(); - wmt_kpad_gpio_init(); - DPRINTK("End2\n"); - - return ret; -} - -static void kpad_close(struct input_dev *dev) -{ - DPRINTK("Start\n"); - - del_key_timer(); - /* - * Unregister input device driver - */ - input_unregister_device(dev); - - DPRINTK("End2\n"); -} - -static int wmt_kpad_probe(struct platform_device *pdev) -{ - int ret = 0; - unsigned int i; - DPRINTK("Start\n"); - kpad_dev = input_allocate_device(); - if (kpad_dev == NULL) { - DPRINTK("End 1\n"); - return -1; - } - /* - * Simply check resources parameters. - */ - DPRINTK("pdev->num_resources = 0x%x\n",pdev->num_resources); - if (pdev->num_resources < 0 || pdev->num_resources > 2) { - ret = -ENODEV; - goto kpad_probe_out; - } - - /* Register an input event device. */ - kpad_dev->name = "keypad", - kpad_dev->phys = "keypad", - - /* - * Let kpad to implement key repeat. - */ - - set_bit(EV_KEY, kpad_dev->evbit); - - for (i = 0; i < WMT_KPAD_FUNCTION_NUM; i++) - set_bit(wmt_kpad_codes[i], kpad_dev->keybit); - - kpad_dev->keycode = wmt_kpad_codes; - kpad_dev->keycodesize = sizeof(unsigned int); - kpad_dev->keycodemax = WMT_KPAD_FUNCTION_NUM; - - /* - * For better view of /proc/bus/input/devices - */ - kpad_dev->id.bustype = 0; - kpad_dev->id.vendor = 0; - kpad_dev->id.product = 0; - kpad_dev->id.version = 0; - - input_register_device(kpad_dev); - kpad_open(kpad_dev); - DPRINTK("End2\n"); -kpad_probe_out: - -#ifndef CONFIG_SKIP_DRIVER_MSG - printk(KERN_INFO "WMT keypad driver initialized: %s\n", - (ret == 0) ? "ok" : "failed"); -#endif - DPRINTK("End3\n"); - return ret; -} - -static int wmt_kpad_remove(struct platform_device *pdev) -{ - int ret; - DPRINTK("Start\n"); - kpad_close(kpad_dev); - wmt_kpad_gpio_free(); - DPRINTK("End\n"); -#ifdef CONFIG_CPU_FREQ - ret = cpufreq_unregister_notifier(&kpad_clock_nblock, \ - CPUFREQ_TRANSITION_NOTIFIER); - - if (ret) { - printk(KERN_ERR "Unable to unregister CPU frequency " \ - "change notifier (%d)\n", ret); - } -#endif - return 0; -} - -static int wmt_kpad_suspend(struct platform_device *pdev, pm_message_t state) -{ - DPRINTK("Start\n"); - - switch (state.event) { - case PM_EVENT_SUSPEND: - del_key_timer(); - break; - case PM_EVENT_FREEZE: - case PM_EVENT_PRETHAW: - - default: - break; - } - - DPRINTK("End2\n"); - return 0; -} - -static int wmt_kpad_resume(struct platform_device *pdev) -{ - DPRINTK("Start\n"); - wmt_kpad_gpio_init(); - start_key_timer(); - DPRINTK("End\n"); - return 0; -} - -static void wmt_kpad_release(struct device *dev) -{ - return ; -} - -static struct platform_driver wmt_kpad_driver = { - .driver.name = "wmt-kpad", - .probe = &wmt_kpad_probe, - .remove = &wmt_kpad_remove, - .suspend = &wmt_kpad_suspend, - .resume = &wmt_kpad_resume -}; - -static struct resource wmt_kpad_resources[] = { - [0] = { - .start = IRQ_GPIO, - .end = IRQ_GPIO, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device wmt_kpad_device = { - .name = "wmt-kpad", - .id = 0, - .num_resources = ARRAY_SIZE(wmt_kpad_resources), - .resource = wmt_kpad_resources, - .dev = { - .release = wmt_kpad_release, - } -}; - -extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen); - -static int __init kpad_init(void) -{ - int i,ret; - int retval; - unsigned char buf[80]; - int varlen = 80; - char *varname = "wmt.io.kpad"; - char *p=NULL; - int gpio,code; - - DPRINTK(KERN_ALERT "Start\n"); - retval = wmt_getsyspara(varname, buf, &varlen); - if (retval == 0) { - sscanf(buf,"%d:", &key_num); - if (key_num <= 0) - return -ENODEV; - p = buf; - for(i=0; i<key_num && p!=NULL; i++){ - p = strchr(p,':'); - p++; - sscanf(p,"[%d,%d]",&gpio,&code); - gpio_key[i].gpio = gpio; - gpio_key[i].keycode = code; - printk("gpio=%d,code=%d\n",gpio,gpio_key[i].keycode); - } - - } else { - printk("##Warning: \"wmt.io.kpad\" not find\n"); - return -EIO; - } - ret = wmt_kpad_gpio_requst(); - if(ret){ - printk("##Warning:Request gpio failed.\n"); - return ret; - } - -#ifdef CONFIG_CPU_FREQ - ret = cpufreq_register_notifier(&kpad_clock_nblock, \ - CPUFREQ_TRANSITION_NOTIFIER); - - if (ret) { - printk(KERN_ERR "Unable to register CPU frequency " \ - "change notifier (%d)\n", ret); - } -#endif - ret = platform_device_register(&wmt_kpad_device); - if (ret != 0) { - DPRINTK("End1 ret = %x\n",ret); - return -ENODEV; - } - - ret = platform_driver_register(&wmt_kpad_driver); - DPRINTK("End2 ret = %x\n",ret); - return ret; -} - -static void __exit kpad_exit(void) -{ - DPRINTK("Start\n"); - platform_driver_unregister(&wmt_kpad_driver); - platform_device_unregister(&wmt_kpad_device); - DPRINTK("End\n"); -} - -module_init(kpad_init); -module_exit(kpad_exit); - -MODULE_AUTHOR("WonderMedia Technologies, Inc."); -MODULE_DESCRIPTION("WMT [generic keypad] driver"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/wmt_saradc.c b/ANDROID_3.4.5/drivers/input/keyboard/wmt_saradc.c deleted file mode 100755 index 132f0ae0..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/wmt_saradc.c +++ /dev/null @@ -1,718 +0,0 @@ -/*++ -linux/drivers/input/keyboard/wmt_kpad.c - -Some descriptions of such software. Copyright (c) 2008 WonderMedia Technologies, Inc. - -This program is free software: you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the Free Software Foundation, -either version 2 of the License, or (at your option) any later version. - -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, see <http://www.gnu.org/licenses/>. - -WonderMedia Technologies, Inc. -10F, 529, Chung-Cheng Road, Hsin-Tien, Taipei 231, R.O.C. ---*/ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/types.h> -#include <linux/input.h> -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/device.h> -#include <linux/platform_device.h> -#include <linux/cpufreq.h> -#include <linux/delay.h> -#include <asm/io.h> -#include <asm/irq.h> -#include <asm/errno.h> -#include <asm/mach-types.h> -#include <mach/hardware.h> -#include <mach/wmt_saradc.h> -#include <linux/suspend.h> - - -/* #define COUNTTIMER */ -#ifdef COUNTTIMER -unsigned int start_time; -#endif - -/* Debug macros */ -#if 0 -#define DPRINTK(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __func__ , ## args) -#else -#define DPRINTK(fmt, args...) -#endif - -/* the shortest response time is 20 ms, original timeout (HZ/100)*100 */ -#define wmt_saradc_timeout ((HZ/100)*2) -#define WMT_SARADC_FUNCTION_NUM 6 -#define SAMETIMES 2 -unsigned int HW_Hz; -unsigned int SW_timeout; -unsigned int INT_timeout; - -enum adc_func { - FUNC_KPAD, - FUNC_BAT, - FUNC_NONE, -}; -unsigned int func = FUNC_NONE; - -/* SARADC battery */ -unsigned int BatteryCODE; -static unsigned int bat_interval = 3; -static struct delayed_work bat_work; - -static unsigned int wmt_saradc_codes[WMT_SARADC_FUNCTION_NUM] = { - [0] = KEY_VOLUMEUP, - [1] = KEY_VOLUMEDOWN, - [2] = KEY_BACK, - [3] = KEY_MENU, - [4] = KEY_HOME, - [5] = KEY_RESERVED, -}; - -/*high resolution timer */ -static struct hrtimer wmt_saradc_hrtimer; -static struct input_dev *saradc_dev; - -static struct wmt_saradc_s saradc = { - .ref = 0, - .res = NULL, - .regs = NULL, - .irq = 0, -}; - -int count_sample_rate(unsigned APB_clock, int Hz) -{ - int temp_slot; - /* the Hz that we want */ - temp_slot = APB_clock/(4096 * Hz); /* (APB clock/32)/ (128 * HZ)*/ - return temp_slot; -} - -static int saradc_sample_rate(unsigned ADC_clock, int Hz) -{ - int temp_slot; - /* the Hz that we want */ - temp_slot = ADC_clock/(128 * Hz); /* ADC clock/ (128 * HZ)*/ - return temp_slot; -} - -int saradc_event_table(unsigned int eventcode) -{ - DPRINTK("eventcode = %d\n", eventcode); - if (eventcode >= 39 && eventcode <= 42) - return 0; - else if (eventcode >= 63 && eventcode <= 64) - return 1; - else if (eventcode >= 84 && eventcode <= 85) - return 2; - else if (eventcode >= 18 && eventcode <= 20) - return 3; - else if (eventcode == 0) - return 4; - else if (eventcode >= 29 && eventcode <= 31) - return 5; - else if (eventcode == 127) - return 5; - else - return 5; -} - -static void wmt_saradc_hw_init(void) -{ - unsigned int auto_temp_slot; - //unsigned int APB_clk; - unsigned int ADC_clk; - DPRINTK("Start\n"); - - /* - * Turn on saradc clocks. - */ - auto_pll_divisor(DEV_ADC, CLK_ENABLE, 0, 0); - - /* Set the ADC clock to 4.8 MHz */ - auto_pll_divisor(DEV_ADC, SET_DIV, 1, 4800); - - /* Turn on SARADC controll power */ - saradc.regs->Ctr0 &= ~PD; - - /* Enable SARADC digital clock */ - saradc.regs->Ctr0 |= DigClkEn; - - /* Simply clean all previous saradc status. */ - saradc.regs->Ctr0 |= (ClrIntADC | ClrIntTOut); - saradc.regs->Ctr1 |= ClrIntValDet; - - if (((saradc.regs->Ctr2 & EndcIntStatus) == EndcIntStatus) || - ((saradc.regs->Ctr2 & TOutStatus) == TOutStatus) || - ((saradc.regs->Ctr2 & ValDetIntStatus) == ValDetIntStatus)) - printk(KERN_ERR "[saradc] clear status failed! status = %x\n", saradc.regs->Ctr2); - - /*Set Timeout Value*/ - saradc.regs->Ctr0 &= 0xffff0000; - saradc.regs->Ctr0 |= TOutDly(0xffff); - - /* get APB clock & count sample rate*/ - ADC_clk = auto_pll_divisor(DEV_ADC, GET_FREQ, 0, 0); - DPRINTK("[%s] ADC_clk = %d\n", __func__, ADC_clk); - /* sample rate: 500 Hz , 1 ms/sample */ - auto_temp_slot = saradc_sample_rate(ADC_clk, 500); -#if 0 - /* get APB clock & count sample rate*/ - APB_clk = auto_pll_divisor(DEV_APB, GET_FREQ, 0, 0); - /* sample rate: 1000 Hz , 1 ms/sample */ - auto_temp_slot = count_sample_rate(APB_clk, HW_Hz); - DPRINTK("[%s] APB_clk = %d\n", __func__, APB_clk); -#endif - /*Set Sample Rate*/ - saradc.regs->Ctr1 &= 0x0000ffff; - saradc.regs->Ctr1 |= (auto_temp_slot << 16); - DPRINTK("[%s] auto_temp_slot = %x ctr1: %x\n", __func__, auto_temp_slot, saradc.regs->Ctr1); - /* Set saradc as auto mode */ - saradc.regs->Ctr0 |= AutoMode; - - msleep(200); - - /* Enable value changing interrupt and Buffer data valid */ - saradc.regs->Ctr1 |= (ValDetIntEn | BufRd); - /* saradc.regs->Ctr0 |= TOutEn; */ - - DPRINTK("End\n"); -} - -enum hrtimer_restart wmt_saradc_timeout_hrtimer(struct hrtimer *timer) -{ - unsigned int SARCODE = 0xffff; - static unsigned int OLDCODE = 0xffff; - static int time, same; - static bool saradc_flag = 1; /* 0: report event state, 1: get SARCODE value state */ - int new_event = -1; - static int pre_event = -1, button_press; - ktime_t ktime; - /* count timeout value */ -#ifdef COUNTTIMER - unsigned int end_time; - end_time = wmt_read_oscr(); - printk(KERN_ERR "time = %d\n", (end_time - start_time)/3); -#endif - ktime = ktime_set(0, SW_timeout * 1000); - - DPRINTK("[%s] Start\n", __func__); - while ((saradc.regs->Ctr2 & EndcIntStatus) == 0) - ; - SARCODE = SARCode(saradc.regs->Ctr1); - - if (saradc_flag && time < 10) { - if ((SARCODE/4 - OLDCODE/4) <= 1 || (SARCODE/4 - OLDCODE/4) >= -1) { - same++; - DPRINTK("time:%d SARCODE=%u SARCODE/4=%u, OLDCODE=%u, OLDCODE/4=%u, same=%d\n", - time, SARCODE, SARCODE/4, OLDCODE, OLDCODE/4, same); - if (same == SAMETIMES) - saradc_flag = 0; /* get the new event */ - } else - same = 0; - - DPRINTK("time:%d SARCODE=%u SARCODE/4=%u, OLDCODE=%u, OLDCODE/4=%u, same=%d\n", - time, SARCODE, SARCODE/4, OLDCODE, OLDCODE/4, same); - OLDCODE = SARCODE; - time++; - - /* don't call timer when 10th get SARCODE or enough same time */ - if (time < 10 && same != SAMETIMES) { - hrtimer_start(&wmt_saradc_hrtimer, ktime, HRTIMER_MODE_REL); - /* count timer from callback function to callback function */ -#ifdef COUNTTIMER - start_time = wmt_read_oscr(); -#endif - } - /* if not get stable SARCODE value in 10 times, report SARACODE is NONE event */ - if (time == 10 && same != SAMETIMES) { - SARCODE = 508; - DPRINTK("time %d SARCODE %u", time, SARCODE); - } - } - if (time == 10 || saradc_flag == 0) - time = 0; - - /* disable BufRd */ - saradc.regs->Ctr1 &= ~BufRd; - - new_event = saradc_event_table(SARCODE/4); - - if (SARCODE == 0xffff) { - printk(KERN_ERR "Auto mode witn INT test fail\n"); - /*Disable interrupt*/ - saradc.regs->Ctr1 &= ~ValDetIntEn; - /* Clean all previous saradc status. */ - saradc.regs->Ctr0 |= (ClrIntTOut | ClrIntADC); - saradc.regs->Ctr1 |= ClrIntValDet; - } else { - /*DPRINTK("Buf_rdata = %u Buf_rdata/4 = %u\n", data, data/4);*/ - DPRINTK("SARCODE = %u SARCODE/4 = %u\n", SARCODE, SARCODE/4); - /*Disable interrupt*/ - saradc.regs->Ctr1 &= ~ValDetIntEn; - /* Clean all previous saradc status. */ - saradc.regs->Ctr0 |= (ClrIntTOut | ClrIntADC); - saradc.regs->Ctr1 |= ClrIntValDet; - } - - if (saradc_flag == 0) { - /* switch other button means release button*/ - if ((pre_event != new_event) && (SARCODE/4 != 127)) { - button_press = 0; - DPRINTK("Different event, pre_event = %d, new_event = %d\n", pre_event, new_event); - DPRINTK("WMT_ROW1_KEY_NUM release key = %d, event=%d\n", SARCODE/4, pre_event); - input_report_key(saradc_dev, wmt_saradc_codes[pre_event], 0); /* key is release*/ - input_sync(saradc_dev); - } - - if (SARCODE/4 == 127 || SARCODE/4 == 126) { /*Active Low*/ - DPRINTK("WMT_ROW1_KEY_NUM release key = %d, event=%d\n", SARCODE/4, pre_event); - input_report_key(saradc_dev, wmt_saradc_codes[pre_event], 0); /* key is release*/ - input_sync(saradc_dev); - button_press = 0; - } else { - if (button_press == 0) { - DPRINTK("new event = %d\n", new_event); - input_report_key(saradc_dev, wmt_saradc_codes[new_event], 1);/* key is press*/ - input_sync(saradc_dev); - DPRINTK("saradc code = %d\n", wmt_saradc_codes[new_event]); - button_press = 1; - } - DPRINTK("WMT_ROW1_KEY_NUM keep press key = %d, event=%d\n", SARCODE/4, new_event); - } - pre_event = new_event; - saradc_flag = 1; /* report new event to Android, get new SARCODE */ - same = 0; - } - saradc.regs->Ctr1 |= ValDetIntEn; - DPRINTK("[%s] End\n", __func__); - return HRTIMER_NORESTART; /* avoid to timer restart */ -} - -static irqreturn_t -saradc_interrupt(int irq, void *dev_id) -{ - ktime_t ktime; - ktime = ktime_set(0, INT_timeout * 1000); /* ms */ - DPRINTK("[%s] Start\n", __func__); - DPRINTK("status = %x\n", saradc.regs->Ctr2); - /* Disable interrupt */ - /* disable_irq_nosync(saradc.irq);*/ - saradc.regs->Ctr1 &= ~ValDetIntEn; - - saradc.regs->Ctr1 |= BufRd; - /* - * Get saradc interrupt status and clean interrput source. - */ - - /* if (((saradc.regs->Ctr1 & ValDetIntEn) == ValDetIntEn) && */ - if ((saradc.regs->Ctr2 & ValDetIntStatus) == ValDetIntStatus) { - /* clear value chaning interrupt */ - saradc.regs->Ctr1 |= ClrIntValDet; - /* start hrtimer */ - hrtimer_start(&wmt_saradc_hrtimer, ktime, HRTIMER_MODE_REL); - - /* count timer from interrupt to callback function */ -#ifdef COUNTTIMER - start_time = wmt_read_oscr(); -#endif - } - - if ((saradc.regs->Ctr2 & ValDetIntStatus) == ValDetIntStatus) - printk(KERN_ERR "[saradc] status clear failed!\n"); - - - /* Enable interrupt */ - /* saradc.regs->Ctr1 |= ValDetIntEn; // enable INT in wmt_saradc_timeout_timer*/ - DPRINTK("[%s] End\n", __func__); - return IRQ_HANDLED; -} - - -static unsigned int saradc_read(void) -{ - int i; - int min=0xfff,max=0; - int total=0,val; - - for(i=0; i < 7; i++){ - while ((saradc.regs->Ctr2 & EndcIntStatus) == 0); - - val = SARCode(saradc.regs->Ctr1); - //printk("%d--",val); - - if(max < val) max = val; - if(min > val) min = val; - total +=val; - } - //printk("value %d\n",(total-max-min)/5); - return (total-max-min)/5; - -} - -/* Read SARADC BATTRTY CODE */ -unsigned int ReadBattery(void) -{ - return BatteryCODE; -} -EXPORT_SYMBOL_GPL(ReadBattery); - -/* Update SARCODE BATTERY CODE */ -static void WriteBattery(unsigned int value) -{ - BatteryCODE = value; -} -static void saradc_bat_handler(struct work_struct *work) -{ - unsigned int sarcode = 0xffff; - - DPRINTK("Start\n"); - /* disable value change interrupt */ - saradc.regs->Ctr1 &= ~ValDetIntEn; - /* Switch to BATTERY channel and clear INT status */ - saradc.regs->Ctr0 |= (AdcChSel | ClrIntADC | ClrIntTOut); - saradc.regs->Ctr1 |= (ClrIntValDet); - msleep(20); - //printk("bat:\n"); - sarcode = saradc_read(); - WriteBattery(sarcode/4); - DPRINTK("sarcode = %d\n", sarcode); - /* Switch to ADC channel */ - saradc.regs->Ctr0 &= ~AdcChSel; - /* too early to clear status will cause interrupts */ - msleep(5); - /* Switch to BATTERY channel and clear INT status */ - saradc.regs->Ctr0 |= (ClrIntADC | ClrIntTOut); - saradc.regs->Ctr1 |= (ClrIntValDet); - - /* enable value change interrupt */ - saradc.regs->Ctr1 |= ValDetIntEn; - - schedule_delayed_work(&bat_work, bat_interval*HZ); - DPRINTK("End\n\n\n"); - return ; -} - -static int saradc_open(struct input_dev *dev) -{ - int ret = 0; - unsigned int i; - DPRINTK("Start saradc.ref = %d\n", saradc.ref); - - if (saradc.ref++) { - /* Return success, but not initialize again. */ - DPRINTK("End 1 saradc.ref=%d\n", saradc.ref); - return 0; - } - - if (func != FUNC_KPAD) - goto bat_init; - - ret = request_irq(saradc.irq, saradc_interrupt, IRQF_DISABLED, "saradc", dev); - - if (ret) { - printk(KERN_ERR "%s: Can't allocate irq %d\n", __func__, IRQ_TSC); - saradc.ref--; - free_irq(saradc.irq, dev); - goto saradc_open_out; - } - - /* Init hr timer */ - hrtimer_init(&wmt_saradc_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - wmt_saradc_hrtimer.function = &wmt_saradc_timeout_hrtimer; - - /* Register an input event device. */ - dev->name = "saradc", - dev->phys = "saradc", - - /* - * Let kpad to implement key repeat. - */ - - set_bit(EV_KEY, dev->evbit); - - for (i = 0; i < WMT_SARADC_FUNCTION_NUM; i++) - set_bit(wmt_saradc_codes[i], dev->keybit); - - - dev->keycode = wmt_saradc_codes; - dev->keycodesize = sizeof(unsigned int); - dev->keycodemax = WMT_SARADC_FUNCTION_NUM; - - /* - * For better view of /proc/bus/input/devices - */ - dev->id.bustype = 0; - dev->id.vendor = 0; - dev->id.product = 0; - dev->id.version = 0; - - input_register_device(dev); - -bat_init: - if (func == FUNC_BAT) { - INIT_DELAYED_WORK(&bat_work,saradc_bat_handler); - schedule_delayed_work(&bat_work, HZ); - } - - wmt_saradc_hw_init(); - - DPRINTK("End2\n"); -saradc_open_out: - DPRINTK("End3\n"); - return ret; -} - -static void saradc_close(struct input_dev *dev) -{ - DPRINTK("Start\n"); - if (--saradc.ref) { - DPRINTK("End1\n"); - return; - } - - /* Free interrupt resource */ - free_irq(saradc.irq, dev); - - /*Disable clock*/ - auto_pll_divisor(DEV_ADC, CLK_DISABLE, 0, 0); - - /* Unregister input device driver */ - input_unregister_device(dev); - DPRINTK("End2\n"); -} - -static int wmt_saradc_probe(struct platform_device *pdev) -{ - unsigned long base; - int ret = 0; - DPRINTK("Start\n"); - saradc_dev = input_allocate_device(); - if (saradc_dev == NULL) { - DPRINTK("End 1\n"); - return -1; - } - /* - * Simply check resources parameters. - */ - if (pdev->num_resources < 2 || pdev->num_resources > 3) { - ret = -ENODEV; - goto saradc_probe_out; - } - - base = pdev->resource[0].start; - - saradc.irq = pdev->resource[1].start; - - saradc.regs = (struct saradc_regs_s *)ADC_BASE_ADDR; - - if (!saradc.regs) { - ret = -ENOMEM; - goto saradc_probe_out; - } - - saradc_dev->open = saradc_open, - saradc_dev->close = saradc_close, - - saradc_open(saradc_dev); - DPRINTK("End2\n"); -saradc_probe_out: - -#ifndef CONFIG_SKIP_DRIVER_MSG - printk(KERN_INFO "WMT saradc driver initialized: %s\n", - (ret == 0) ? "ok" : "failed"); -#endif - DPRINTK("End3\n"); - return ret; -} - -static int wmt_saradc_remove(struct platform_device *pdev) -{ - DPRINTK("Start\n"); - saradc_close(saradc_dev); - - /* - * Free allocated resource - */ - /*kfree(kpad.res); - kpad.res = NULL; - - if (kpad.regs) { - iounmap(kpad.regs); - kpad.regs = NULL; - }*/ - - saradc.ref = 0; - saradc.irq = 0; - - DPRINTK("End\n"); - return 0; -} - -static int wmt_saradc_suspend(struct platform_device *pdev, pm_message_t state) -{ - DPRINTK("Start\n"); - - switch (state.event) { - case PM_EVENT_SUSPEND: - /*Disable clock*/ - auto_pll_divisor(DEV_ADC, CLK_DISABLE, 0, 0); - break; - case PM_EVENT_FREEZE: - case PM_EVENT_PRETHAW: - - default: - break; - } - - DPRINTK("End2\n"); - return 0; -} - -static int wmt_saradc_resume(struct platform_device *pdev) -{ - DPRINTK("Start\n"); - wmt_saradc_hw_init(); - DPRINTK("End\n"); - return 0; -} - -static struct platform_driver wmt_saradc_driver = { - .driver.name = "wmt-saradc", - .probe = &wmt_saradc_probe, - .remove = &wmt_saradc_remove, - .suspend = &wmt_saradc_suspend, - .resume = &wmt_saradc_resume -}; - -static struct resource wmt_saradc_resources[] = { - [0] = { - .start = ADC_BASE_ADDR, - .end = (ADC_BASE_ADDR + 0xFFFF), - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = IRQ_TSC, - .end = IRQ_TSC, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device wmt_saradc_device = { - .name = "wmt-saradc", - .id = 0, - .num_resources = ARRAY_SIZE(wmt_saradc_resources), - .resource = wmt_saradc_resources, -}; - -static int __init saradc_init(void) -{ - int ret; - int retval; - unsigned char buf[80]; - int varlen = 80; - char *varname1 = "wmt.keypad.param"; - char *varname2 = "wmt.battery.param"; - char *p; - int temp = 0, enable_saradc = 0, function_sel = 0; - - DPRINTK(KERN_ALERT "Start\n"); - /*read keypad enable*/ - retval = wmt_getsyspara(varname1, buf, &varlen); - if (retval == 0) { - sscanf(buf, "%X:%d:%d:%d", &temp, &HW_Hz, &INT_timeout, &SW_timeout); - enable_saradc = temp & 0xf; - function_sel = (temp >> 4) & 0xf; - printk(KERN_ALERT "wmt.keypad.param = %x:%d:%d:%d, enable = %x, function = %x\n", - temp, HW_Hz, INT_timeout, SW_timeout, enable_saradc, function_sel); - - if (enable_saradc != 1 || function_sel != 1) { - printk(KERN_ALERT "Disable SARADC as keypad function!!\n"); - goto bat; - } else if (enable_saradc == 1 && function_sel == 1) - printk(KERN_ALERT "HW_HZ = %d, INT_time = %d, SW_timeout = %d\n", - HW_Hz, INT_timeout, SW_timeout); - if ((HW_Hz == 0) || (INT_timeout == 0) || (SW_timeout == 0)) { - HW_Hz = 1000; /* 1000 Hz */ - INT_timeout = 20000; /* 20 ms */ - SW_timeout = 1000; /* 1 ms */ - printk(KERN_ALERT "wmt.keypad.param isn't correct. Set the default value\n"); - printk(KERN_ALERT "Default HW_HZ = %d, INT_time = %d, SW_timeout = %d\n", - HW_Hz, INT_timeout, SW_timeout); - } - func = FUNC_KPAD; - } else { - printk(KERN_ALERT "##Warning: \"wmt.keypad.param\" not find\n"); - printk(KERN_ALERT "Default wmt.keypad.param = %x\n", temp); - //return -ENODEV; - } - -bat: - if (func != FUNC_KPAD) { - memset(buf, 0x00,sizeof(buf)); - /* read battery enable, dev name and */ - retval = wmt_getsyspara(varname2, buf, &varlen); - if (retval == 0) { - p = buf; - if(!strncmp(p,"saradc", 6)){ - p = strchr(p,':'); - if(p){ - p++; - sscanf(p,"%d",&bat_interval); - } - printk("Bat ADC sample period = %ds\n", bat_interval); - func = FUNC_BAT; - } - } - } - - if (func == FUNC_NONE) { - printk("SARADC not enable\n"); - return -ENODEV; - } - -/* check saradc can switch freq. -#ifdef CONFIG_CPU_FREQ - ret = cpufreq_register_notifier(&kpad_clock_nblock, \ - CPUFREQ_TRANSITION_NOTIFIER); - - if (ret) { - printk(KERN_ERR "Unable to register CPU frequency " \ - "change notifier (%d)\n", ret); - } -#endif -*/ - ret = platform_device_register(&wmt_saradc_device); - if (ret != 0) { - DPRINTK("End1 ret = %x\n", ret); - return -ENODEV; - } - - ret = platform_driver_register(&wmt_saradc_driver); - DPRINTK("End2 ret = %x\n", ret); - return ret; -} - -static void __exit saradc_exit(void) -{ - DPRINTK("Start\n"); - platform_driver_unregister(&wmt_saradc_driver); - platform_device_unregister(&wmt_saradc_device); - DPRINTK("End\n"); -} - -module_init(saradc_init); -module_exit(saradc_exit); - -MODULE_AUTHOR("WonderMedia Technologies, Inc."); -MODULE_DESCRIPTION("WMT [generic saradc] driver"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/input/keyboard/xtkbd.c b/ANDROID_3.4.5/drivers/input/keyboard/xtkbd.c deleted file mode 100644 index 37b01d77..00000000 --- a/ANDROID_3.4.5/drivers/input/keyboard/xtkbd.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 1999-2001 Vojtech Pavlik - */ - -/* - * XT keyboard driver for Linux - */ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * - * Should you need to contact me, the author, you can do so either by - * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail: - * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic - */ - -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/input.h> -#include <linux/init.h> -#include <linux/serio.h> - -#define DRIVER_DESC "XT keyboard driver" - -MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_LICENSE("GPL"); - -#define XTKBD_EMUL0 0xe0 -#define XTKBD_EMUL1 0xe1 -#define XTKBD_KEY 0x7f -#define XTKBD_RELEASE 0x80 - -static unsigned char xtkbd_keycode[256] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 0, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 88, 0, 0, 0, 0,110,111,103,108,105, - 106 -}; - -struct xtkbd { - unsigned char keycode[256]; - struct input_dev *dev; - struct serio *serio; - char phys[32]; -}; - -static irqreturn_t xtkbd_interrupt(struct serio *serio, - unsigned char data, unsigned int flags) -{ - struct xtkbd *xtkbd = serio_get_drvdata(serio); - - switch (data) { - case XTKBD_EMUL0: - case XTKBD_EMUL1: - break; - default: - - if (xtkbd->keycode[data & XTKBD_KEY]) { - input_report_key(xtkbd->dev, xtkbd->keycode[data & XTKBD_KEY], !(data & XTKBD_RELEASE)); - input_sync(xtkbd->dev); - } else { - printk(KERN_WARNING "xtkbd.c: Unknown key (scancode %#x) %s.\n", - data & XTKBD_KEY, data & XTKBD_RELEASE ? "released" : "pressed"); - } - } - return IRQ_HANDLED; -} - -static int xtkbd_connect(struct serio *serio, struct serio_driver *drv) -{ - struct xtkbd *xtkbd; - struct input_dev *input_dev; - int err = -ENOMEM; - int i; - - xtkbd = kmalloc(sizeof(struct xtkbd), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!xtkbd || !input_dev) - goto fail1; - - xtkbd->serio = serio; - xtkbd->dev = input_dev; - snprintf(xtkbd->phys, sizeof(xtkbd->phys), "%s/input0", serio->phys); - memcpy(xtkbd->keycode, xtkbd_keycode, sizeof(xtkbd->keycode)); - - input_dev->name = "XT Keyboard"; - input_dev->phys = xtkbd->phys; - input_dev->id.bustype = BUS_XTKBD; - input_dev->id.vendor = 0x0001; - input_dev->id.product = 0x0001; - input_dev->id.version = 0x0100; - input_dev->dev.parent = &serio->dev; - - input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); - input_dev->keycode = xtkbd->keycode; - input_dev->keycodesize = sizeof(unsigned char); - input_dev->keycodemax = ARRAY_SIZE(xtkbd_keycode); - - for (i = 0; i < 255; i++) - set_bit(xtkbd->keycode[i], input_dev->keybit); - clear_bit(0, input_dev->keybit); - - serio_set_drvdata(serio, xtkbd); - - err = serio_open(serio, drv); - if (err) - goto fail2; - - err = input_register_device(xtkbd->dev); - if (err) - goto fail3; - - return 0; - - fail3: serio_close(serio); - fail2: serio_set_drvdata(serio, NULL); - fail1: input_free_device(input_dev); - kfree(xtkbd); - return err; -} - -static void xtkbd_disconnect(struct serio *serio) -{ - struct xtkbd *xtkbd = serio_get_drvdata(serio); - - serio_close(serio); - serio_set_drvdata(serio, NULL); - input_unregister_device(xtkbd->dev); - kfree(xtkbd); -} - -static struct serio_device_id xtkbd_serio_ids[] = { - { - .type = SERIO_XT, - .proto = SERIO_ANY, - .id = SERIO_ANY, - .extra = SERIO_ANY, - }, - { 0 } -}; - -MODULE_DEVICE_TABLE(serio, xtkbd_serio_ids); - -static struct serio_driver xtkbd_drv = { - .driver = { - .name = "xtkbd", - }, - .description = DRIVER_DESC, - .id_table = xtkbd_serio_ids, - .interrupt = xtkbd_interrupt, - .connect = xtkbd_connect, - .disconnect = xtkbd_disconnect, -}; - -static int __init xtkbd_init(void) -{ - return serio_register_driver(&xtkbd_drv); -} - -static void __exit xtkbd_exit(void) -{ - serio_unregister_driver(&xtkbd_drv); -} - -module_init(xtkbd_init); -module_exit(xtkbd_exit); |