diff options
-rw-r--r-- | drivers/input/keyboard/Kconfig | 37 | ||||
-rw-r--r-- | drivers/input/keyboard/Makefile | 6 | ||||
-rw-r--r-- | drivers/input/keyboard/mpr121.c | 308 | ||||
-rw-r--r-- | include/linux/i2c/mpr.h | 79 |
4 files changed, 0 insertions, 430 deletions
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index b9474aa7f043..b4dee9d5a055 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -563,41 +563,4 @@ config KEYBOARD_W90P910 To compile this driver as a module, choose M here: the module will be called w90p910_keypad. -config KEYBOARD_MXC - tristate "MXC Keypad Driver" - depends on ARCH_MXC - help - This is the Keypad driver for the Freescale MXC application - processors. - -config KEYBOARD_MXS - tristate "MXS keyboard" - depends on ARCH_MXS - help - This is the Keypad driver for the Freescale mxs soc - - -config KEYBOARD_MC9S08DZ60 - tristate "mc9s08dz60 keyboard" - depends on MXC_PMIC_MC9S08DZ60 - help - -to be written- - -config KEYBOARD_MPR084 - tristate "Freescale MPR084 Touch Keypad Driver" - depends on ARCH_MX37 - help - This is the Keypad driver for the Freescale Proximity Capacitive - Touch Sensor controller chip. - -config KEYBOARD_MPR121 - tristate "Freescale MPR121 Touch Keypad Driver" - depends on I2C - help - Say Y here if you have the touchkey Freescale Proximity Capacitive - Touch Sensor controller chip in your system. - - If unsure, say N. - - To compile this driver as a module, choose M here endif diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile index 6791e8b45289..ddde0fd476f7 100644 --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile @@ -51,9 +51,3 @@ obj-$(CONFIG_KEYBOARD_TNETV107X) += tnetv107x-keypad.o obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o obj-$(CONFIG_KEYBOARD_W90P910) += w90p910_keypad.o -obj-$(CONFIG_KEYBOARD_MXC) += mxc_keyb.o -obj-$(CONFIG_KEYBOARD_MXC) += mxc_pwrkey.o -obj-$(CONFIG_KEYBOARD_MPR084) += mpr084.o -obj-$(CONFIG_KEYBOARD_MXS) += mxs-kbd.o -obj-$(CONFIG_KEYBOARD_MC9S08DZ60) += mc9s08dz60_keyb.o -obj-$(CONFIG_KEYBOARD_MPR121) += mpr121.o diff --git a/drivers/input/keyboard/mpr121.c b/drivers/input/keyboard/mpr121.c deleted file mode 100644 index 7aae302758c5..000000000000 --- a/drivers/input/keyboard/mpr121.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. 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 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. - */ - -/* - * mpr121.c - Touchkey driver for Freescale MPR121 Capacitive Touch - * Sensor Controllor - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/i2c.h> -#include <linux/i2c/mpr.h> -#include <linux/interrupt.h> -#include <linux/input.h> -#include <linux/irq.h> -#include <linux/slab.h> -#include <linux/delay.h> -#include <linux/bitops.h> - - -struct mpr121_touchkey_data { - struct i2c_client *client; - struct input_dev *input_dev; - unsigned int key_val; - int statusbits; - int keycount; - u16 keycodes[MPR121_MAX_KEY_COUNT]; -}; - -struct mpr121_init_register { - int addr; - u8 val; -}; - -static struct mpr121_init_register init_reg_table[] = { - {MHD_RISING_ADDR, 0x1}, - {NHD_RISING_ADDR, 0x1}, - {NCL_RISING_ADDR, 0x0}, - {FDL_RISING_ADDR, 0x0}, - {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_data *data = dev_id; - struct i2c_client *client = data->client; - struct input_dev *input = data->input_dev; - unsigned int key_num, 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 ^ data->statusbits) - 1; - /* use the bit check the press status */ - pressed = (reg & (1 << (key_num))) >> key_num; - data->statusbits = reg; - data->key_val = data->keycodes[key_num]; - - input_event(input, EV_MSC, MSC_SCAN, data->key_val); - input_report_key(input, data->key_val, pressed); - input_sync(input); - - dev_dbg(&client->dev, "key %d %d %s\n", key_num, data->key_val, - pressed ? "pressed" : "released"); - -out: - return IRQ_HANDLED; -} - -static int mpr121_phys_init(struct mpr121_platform_data *pdata, - struct mpr121_touchkey_data *data, - struct i2c_client *client) -{ - struct mpr121_init_register *reg; - unsigned char usl, lsl, tl; - int i, t, vdd, ret; - - /* setup 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; - } - /* setup 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; - } - /* setup auto-register by vdd,the formula please ref:AN3889 */ - 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); - if (ret < 0) - goto err_i2c_write; - ret = i2c_smbus_write_byte_data(client, AUTO_CONFIG_LSL_ADDR, lsl); - if (ret < 0) - goto err_i2c_write; - ret = i2c_smbus_write_byte_data(client, AUTO_CONFIG_TL_ADDR, tl); - if (ret < 0) - goto err_i2c_write; - ret = i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR, - data->keycount); - if (ret < 0) - goto err_i2c_write; - - dev_info(&client->dev, "mpr121: config as enable %x of electrode.\n", - data->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) -{ - struct mpr121_platform_data *pdata; - struct mpr121_touchkey_data *data; - struct input_dev *input_dev; - 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 mpr121_touchkey_data), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!data || !input_dev) { - dev_err(&client->dev, "Falied to allocate memory\n"); - error = -ENOMEM; - goto err_free_mem; - } - - data->client = client; - data->input_dev = input_dev; - data->keycount = pdata->keycount; - - if (data->keycount > MPR121_MAX_KEY_COUNT) { - dev_err(&client->dev, "Too many key defined\n"); - error = -EINVAL; - goto err_free_mem; - } - - error = mpr121_phys_init(pdata, data, client); - if (error < 0) { - dev_err(&client->dev, "Failed to init register\n"); - goto err_free_mem; - } - - i2c_set_clientdata(client, data); - - input_dev->name = "FSL MPR121 Touchkey"; - input_dev->id.bustype = BUS_I2C; - input_dev->dev.parent = &client->dev; - input_dev->keycode = pdata->matrix; - input_dev->keycodesize = sizeof(pdata->matrix[0]); - input_dev->keycodemax = data->keycount; - - for (i = 0; i < input_dev->keycodemax; i++) { - __set_bit(pdata->matrix[i], input_dev->keybit); - data->keycodes[i] = pdata->matrix[i]; - } - - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - input_set_drvdata(input_dev, data); - - error = request_threaded_irq(client->irq, NULL, - mpr_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); - device_init_wakeup(&client->dev, pdata->wakeup); - dev_info(&client->dev, "Mpr121 touch keyboard init success.\n"); - 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 mpr_touchkey_remove(struct i2c_client *client) -{ - struct mpr121_touchkey_data *data = i2c_get_clientdata(client); - - free_irq(client->irq, data); - input_unregister_device(data->input_dev); - kfree(data); - - return 0; -} - -#ifdef CONFIG_PM -static int mpr_suspend(struct i2c_client *client, pm_message_t mesg) -{ - 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 i2c_client *client) -{ - struct mpr121_touchkey_data *data = i2c_get_clientdata(client); - - if (device_may_wakeup(&client->dev)) - disable_irq_wake(client->irq); - - i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR, data->keycount); - - return 0; -} -#else -static int mpr_suspend(struct i2c_client *client, pm_message_t mesg) {} -static int mpr_resume(struct i2c_client *client) {} -#endif - -static const struct i2c_device_id mpr121_id[] = { - {"mpr121_touchkey", 0}, - { } -}; - -static struct i2c_driver mpr_touchkey_driver = { - .driver = { - .name = "mpr121", - .owner = THIS_MODULE, - }, - .id_table = mpr121_id, - .probe = mpr_touchkey_probe, - .remove = __devexit_p(mpr_touchkey_remove), - .suspend = mpr_suspend, - .resume = mpr_resume, -}; - -static int __init mpr_touchkey_init(void) -{ - return i2c_add_driver(&mpr_touchkey_driver); -} - -static void __exit mpr_touchkey_exit(void) -{ - i2c_del_driver(&mpr_touchkey_driver); -} - -module_init(mpr_touchkey_init); -module_exit(mpr_touchkey_exit); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Freescale Semiconductor, Inc."); -MODULE_DESCRIPTION("Touch Key driver for FSL MPR121 Chip"); diff --git a/include/linux/i2c/mpr.h b/include/linux/i2c/mpr.h deleted file mode 100644 index ded00db775f3..000000000000 --- a/include/linux/i2c/mpr.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. 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 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. - */ - -/* mpr.h - Header file for Freescale MPR121 Capacitive Touch Sensor Controllor */ - -#ifndef MPR_H -#define MPR_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 -/* ELE0...ELE11's threshold will set in a loop */ -#define AFE_CONF_ADDR 0x5c -#define FILTER_CONF_ADDR 0x5d - -/* ELECTRODE_CONF: this register is most important register, it - * control how many of electrode is enabled. If you set this register - * to 0x0, it make the sensor going to suspend mode. Other value(low - * bit is non-zero) will make the sensor into Run mode. This register - * should be write at last. - */ -#define ELECTRODE_CONF_ADDR 0x5e -#define AUTO_CONFIG_CTRL_ADDR 0x7b -/* AUTO_CONFIG_USL: Upper Limit for auto baseline search, this - * register is related to VDD supplied on your board, the value of - * this register is calc by EQ: `((VDD-0.7)/VDD) * 256`. - * AUTO_CONFIG_LSL: Low Limit of auto baseline search. This is 65% of - * USL AUTO_CONFIG_TL: The Traget Level of auto baseline search, This - * is 90% of USL */ -#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 0x0f -#define RELEASE_THRESHOLD 0x0a -/* Mask Button bits of STATUS_0 & STATUS_1 register */ -#define TOUCH_STATUS_MASK 0xfff -/* MPR121 have 12 electrodes */ -#define MPR121_MAX_KEY_COUNT 12 - - -/** - * @keycount: how many key maped - * @vdd_uv: voltage of vdd supply the chip in uV - * @matrix: maxtrix of keys - * @wakeup: can key wake up system. - */ -struct mpr121_platform_data { - u16 keycount; - u16 *matrix; - int wakeup; - int vdd_uv; -}; - -#endif |