Input: add Analog Devices AD714x captouch input driver
AD7142 and AD7147 are integrated capacitance-to-digital converters (CDCs) with on-chip environmental calibration for use in systems requiring a novel user input method. The AD7142 and AD7147 can interface to external capacitance sensors implementing functions such as buttons, scrollwheels, sliders, touchpads and so on. The chips don't restrict the specific usage. Depending on the hardware connection, one special target board can include one or several these components. The platform_data for the device's "struct device" holds these information. The data-struct defined in head file descript the hardware feature of button/scrollwheel/slider/touchpad components on target boards, which need be filled in the arch/mach-/. As the result, the driver is independent of boards. It gets the components layout from the platform_data, registers related devices, fullfills the algorithms and state machines for these components and report related input events to up level. Signed-off-by: Bryan Wu <cooloney@kernel.org> Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> Signed-off-by: Barry Song <21cnbao@gmail.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
a5b33e6a20
commit
31a6296333
@ -22,6 +22,36 @@ config INPUT_88PM860X_ONKEY
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called 88pm860x_onkey.
|
||||
|
||||
config INPUT_AD714X
|
||||
tristate "Analog Devices AD714x Capacitance Touch Sensor"
|
||||
help
|
||||
Say Y here if you want to support an AD7142/AD7147 touch sensor.
|
||||
|
||||
You should select a bus connection too.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ad714x.
|
||||
|
||||
config INPUT_AD714X_I2C
|
||||
tristate "support I2C bus connection"
|
||||
depends on INPUT_AD714X && I2C
|
||||
default y
|
||||
help
|
||||
Say Y here if you have AD7142/AD7147 hooked to an I2C bus.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ad714x-i2c.
|
||||
|
||||
config INPUT_AD714X_SPI
|
||||
tristate "support SPI bus connection"
|
||||
depends on INPUT_AD714X && SPI
|
||||
default y
|
||||
help
|
||||
Say Y here if you have AD7142/AD7147 hooked to a SPI bus.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ad714x-spi.
|
||||
|
||||
config INPUT_PCSPKR
|
||||
tristate "PC Speaker support"
|
||||
depends on PCSPKR_PLATFORM
|
||||
|
@ -5,6 +5,9 @@
|
||||
# Each configuration option enables a list of files.
|
||||
|
||||
obj-$(CONFIG_INPUT_88PM860X_ONKEY) += 88pm860x_onkey.o
|
||||
obj-$(CONFIG_INPUT_AD714X) += ad714x.o
|
||||
obj-$(CONFIG_INPUT_AD714X_I2C) += ad714x-i2c.o
|
||||
obj-$(CONFIG_INPUT_AD714X_SPI) += ad714x-spi.o
|
||||
obj-$(CONFIG_INPUT_APANEL) += apanel.o
|
||||
obj-$(CONFIG_INPUT_ATI_REMOTE) += ati_remote.o
|
||||
obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o
|
||||
|
137
drivers/input/misc/ad714x-i2c.c
Normal file
137
drivers/input/misc/ad714x-i2c.c
Normal file
@ -0,0 +1,137 @@
|
||||
/*
|
||||
* AD714X CapTouch Programmable Controller driver (I2C bus)
|
||||
*
|
||||
* Copyright 2009 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#include <linux/input.h> /* BUS_I2C */
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include "ad714x.h"
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int ad714x_i2c_suspend(struct i2c_client *client, pm_message_t message)
|
||||
{
|
||||
return ad714x_disable(i2c_get_clientdata(client));
|
||||
}
|
||||
|
||||
static int ad714x_i2c_resume(struct i2c_client *client)
|
||||
{
|
||||
return ad714x_enable(i2c_get_clientdata(client));
|
||||
}
|
||||
#else
|
||||
# define ad714x_i2c_suspend NULL
|
||||
# define ad714x_i2c_resume NULL
|
||||
#endif
|
||||
|
||||
static int ad714x_i2c_write(struct device *dev, unsigned short reg,
|
||||
unsigned short data)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
int ret = 0;
|
||||
u8 *_reg = (u8 *)®
|
||||
u8 *_data = (u8 *)&data;
|
||||
|
||||
u8 tx[4] = {
|
||||
_reg[1],
|
||||
_reg[0],
|
||||
_data[1],
|
||||
_data[0]
|
||||
};
|
||||
|
||||
ret = i2c_master_send(client, tx, 4);
|
||||
if (ret < 0)
|
||||
dev_err(&client->dev, "I2C write error\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ad714x_i2c_read(struct device *dev, unsigned short reg,
|
||||
unsigned short *data)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
int ret = 0;
|
||||
u8 *_reg = (u8 *)®
|
||||
u8 *_data = (u8 *)data;
|
||||
|
||||
u8 tx[2] = {
|
||||
_reg[1],
|
||||
_reg[0]
|
||||
};
|
||||
u8 rx[2];
|
||||
|
||||
ret = i2c_master_send(client, tx, 2);
|
||||
if (ret >= 0)
|
||||
ret = i2c_master_recv(client, rx, 2);
|
||||
|
||||
if (unlikely(ret < 0)) {
|
||||
dev_err(&client->dev, "I2C read error\n");
|
||||
} else {
|
||||
_data[0] = rx[1];
|
||||
_data[1] = rx[0];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devinit ad714x_i2c_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct ad714x_chip *chip;
|
||||
|
||||
chip = ad714x_probe(&client->dev, BUS_I2C, client->irq,
|
||||
ad714x_i2c_read, ad714x_i2c_write);
|
||||
if (IS_ERR(chip))
|
||||
return PTR_ERR(chip);
|
||||
|
||||
i2c_set_clientdata(client, chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit ad714x_i2c_remove(struct i2c_client *client)
|
||||
{
|
||||
struct ad714x_chip *chip = i2c_get_clientdata(client);
|
||||
|
||||
ad714x_remove(chip);
|
||||
i2c_set_clientdata(client, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id ad714x_id[] = {
|
||||
{ "ad7142_captouch", 0 },
|
||||
{ "ad7147_captouch", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, ad714x_id);
|
||||
|
||||
static struct i2c_driver ad714x_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "ad714x_captouch",
|
||||
},
|
||||
.probe = ad714x_i2c_probe,
|
||||
.remove = __devexit_p(ad714x_i2c_remove),
|
||||
.suspend = ad714x_i2c_suspend,
|
||||
.resume = ad714x_i2c_resume,
|
||||
.id_table = ad714x_id,
|
||||
};
|
||||
|
||||
static __init int ad714x_i2c_init(void)
|
||||
{
|
||||
return i2c_add_driver(&ad714x_i2c_driver);
|
||||
}
|
||||
module_init(ad714x_i2c_init);
|
||||
|
||||
static __exit void ad714x_i2c_exit(void)
|
||||
{
|
||||
i2c_del_driver(&ad714x_i2c_driver);
|
||||
}
|
||||
module_exit(ad714x_i2c_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor I2C Bus Driver");
|
||||
MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
|
||||
MODULE_LICENSE("GPL");
|
103
drivers/input/misc/ad714x-spi.c
Normal file
103
drivers/input/misc/ad714x-spi.c
Normal file
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* AD714X CapTouch Programmable Controller driver (SPI bus)
|
||||
*
|
||||
* Copyright 2009 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#include <linux/input.h> /* BUS_I2C */
|
||||
#include <linux/module.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/types.h>
|
||||
#include "ad714x.h"
|
||||
|
||||
#define AD714x_SPI_CMD_PREFIX 0xE000 /* bits 15:11 */
|
||||
#define AD714x_SPI_READ BIT(10)
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int ad714x_spi_suspend(struct spi_device *spi, pm_message_t message)
|
||||
{
|
||||
return ad714x_disable(spi_get_drvdata(spi));
|
||||
}
|
||||
|
||||
static int ad714x_spi_resume(struct spi_device *spi)
|
||||
{
|
||||
return ad714x_enable(spi_get_drvdata(spi));
|
||||
}
|
||||
#else
|
||||
# define ad714x_spi_suspend NULL
|
||||
# define ad714x_spi_resume NULL
|
||||
#endif
|
||||
|
||||
static int ad714x_spi_read(struct device *dev, unsigned short reg,
|
||||
unsigned short *data)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
unsigned short tx = AD714x_SPI_CMD_PREFIX | AD714x_SPI_READ | reg;
|
||||
|
||||
return spi_write_then_read(spi, (u8 *)&tx, 2, (u8 *)data, 2);
|
||||
}
|
||||
|
||||
static int ad714x_spi_write(struct device *dev, unsigned short reg,
|
||||
unsigned short data)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
unsigned short tx[2] = {
|
||||
AD714x_SPI_CMD_PREFIX | reg,
|
||||
data
|
||||
};
|
||||
|
||||
return spi_write(spi, (u8 *)tx, 4);
|
||||
}
|
||||
|
||||
static int __devinit ad714x_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
struct ad714x_chip *chip;
|
||||
|
||||
chip = ad714x_probe(&spi->dev, BUS_SPI, spi->irq,
|
||||
ad714x_spi_read, ad714x_spi_write);
|
||||
if (IS_ERR(chip))
|
||||
return PTR_ERR(chip);
|
||||
|
||||
spi_set_drvdata(spi, chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit ad714x_spi_remove(struct spi_device *spi)
|
||||
{
|
||||
struct ad714x_chip *chip = spi_get_drvdata(spi);
|
||||
|
||||
ad714x_remove(chip);
|
||||
spi_set_drvdata(spi, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct spi_driver ad714x_spi_driver = {
|
||||
.driver = {
|
||||
.name = "ad714x_captouch",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = ad714x_spi_probe,
|
||||
.remove = __devexit_p(ad714x_spi_remove),
|
||||
.suspend = ad714x_spi_suspend,
|
||||
.resume = ad714x_spi_resume,
|
||||
};
|
||||
|
||||
static __init int ad714x_spi_init(void)
|
||||
{
|
||||
return spi_register_driver(&ad714x_spi_driver);
|
||||
}
|
||||
module_init(ad714x_spi_init);
|
||||
|
||||
static __exit void ad714x_spi_exit(void)
|
||||
{
|
||||
spi_unregister_driver(&ad714x_spi_driver);
|
||||
}
|
||||
module_exit(ad714x_spi_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor SPI Bus Driver");
|
||||
MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
|
||||
MODULE_LICENSE("GPL");
|
1331
drivers/input/misc/ad714x.c
Normal file
1331
drivers/input/misc/ad714x.c
Normal file
File diff suppressed because it is too large
Load Diff
26
drivers/input/misc/ad714x.h
Normal file
26
drivers/input/misc/ad714x.h
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* AD714X CapTouch Programmable Controller driver (bus interfaces)
|
||||
*
|
||||
* Copyright 2009 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#ifndef _AD714X_H_
|
||||
#define _AD714X_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct device;
|
||||
struct ad714x_chip;
|
||||
|
||||
typedef int (*ad714x_read_t)(struct device *, unsigned short, unsigned short *);
|
||||
typedef int (*ad714x_write_t)(struct device *, unsigned short, unsigned short);
|
||||
|
||||
int ad714x_disable(struct ad714x_chip *ad714x);
|
||||
int ad714x_enable(struct ad714x_chip *ad714x);
|
||||
struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
|
||||
ad714x_read_t read, ad714x_write_t write);
|
||||
void ad714x_remove(struct ad714x_chip *ad714x);
|
||||
|
||||
#endif
|
@ -806,6 +806,7 @@ struct input_absinfo {
|
||||
#define BUS_HOST 0x19
|
||||
#define BUS_GSC 0x1A
|
||||
#define BUS_ATARI 0x1B
|
||||
#define BUS_SPI 0x1C
|
||||
|
||||
/*
|
||||
* MT_TOOL types
|
||||
|
63
include/linux/input/ad714x.h
Normal file
63
include/linux/input/ad714x.h
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* include/linux/input/ad714x.h
|
||||
*
|
||||
* AD714x is very flexible, it can be used as buttons, scrollwheel,
|
||||
* slider, touchpad at the same time. That depends on the boards.
|
||||
* The platform_data for the device's "struct device" holds this
|
||||
* information.
|
||||
*
|
||||
* Copyright 2009 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_INPUT_AD714X_H__
|
||||
#define __LINUX_INPUT_AD714X_H__
|
||||
|
||||
#define STAGE_NUM 12
|
||||
#define STAGE_CFGREG_NUM 8
|
||||
#define SYS_CFGREG_NUM 8
|
||||
|
||||
/* board information which need be initialized in arch/mach... */
|
||||
struct ad714x_slider_plat {
|
||||
int start_stage;
|
||||
int end_stage;
|
||||
int max_coord;
|
||||
};
|
||||
|
||||
struct ad714x_wheel_plat {
|
||||
int start_stage;
|
||||
int end_stage;
|
||||
int max_coord;
|
||||
};
|
||||
|
||||
struct ad714x_touchpad_plat {
|
||||
int x_start_stage;
|
||||
int x_end_stage;
|
||||
int x_max_coord;
|
||||
|
||||
int y_start_stage;
|
||||
int y_end_stage;
|
||||
int y_max_coord;
|
||||
};
|
||||
|
||||
struct ad714x_button_plat {
|
||||
int keycode;
|
||||
unsigned short l_mask;
|
||||
unsigned short h_mask;
|
||||
};
|
||||
|
||||
struct ad714x_platform_data {
|
||||
int slider_num;
|
||||
int wheel_num;
|
||||
int touchpad_num;
|
||||
int button_num;
|
||||
struct ad714x_slider_plat *slider;
|
||||
struct ad714x_wheel_plat *wheel;
|
||||
struct ad714x_touchpad_plat *touchpad;
|
||||
struct ad714x_button_plat *button;
|
||||
unsigned short stage_cfg_reg[STAGE_NUM][STAGE_CFGREG_NUM];
|
||||
unsigned short sys_cfg_reg[SYS_CFGREG_NUM];
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user