forked from Minki/linux
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: ad714x - read the interrupt status registers in a row Input: ad714x - use DMA-safe buffers for spi_write() Input: ad714x - fix endianness issues Input: ad714xx-spi - force SPI bus into the default 8-bit mode Input: ep93xx_keypad - add missing include of linux/module.h Input: tnetv107x-ts - add missing include of linux/module.h Input: max11801_ts - correct license statement Input: atmel_mxt_ts - report pressure information from the driver Input: bcm5974 - Add support for newer MacBookPro8,2 Input: wacom - report id 3 returns 4 bytes of data Input: wacom - add WAC_MSG_RETRIES define Input: wacom - add support for the Wacom Bamboo Pen (CTL-660/K) Input: tegra-kbc - correct call to input_free_device Input: mpu3050 - correct call to input_free_device Input: bcm5974 - add support for touchpads found in MacBookAir4,2 Input: mma8450 - fix module device table type Input: remove CLOCK_TICK_RATE from analog joystick driver
This commit is contained in:
commit
8554cc18db
@ -139,7 +139,7 @@ struct analog_port {
|
||||
#include <linux/i8253.h>
|
||||
|
||||
#define GET_TIME(x) do { if (cpu_has_tsc) rdtscl(x); else x = get_time_pit(); } while (0)
|
||||
#define DELTA(x,y) (cpu_has_tsc ? ((y) - (x)) : ((x) - (y) + ((x) < (y) ? CLOCK_TICK_RATE / HZ : 0)))
|
||||
#define DELTA(x,y) (cpu_has_tsc ? ((y) - (x)) : ((x) - (y) + ((x) < (y) ? PIT_TICK_RATE / HZ : 0)))
|
||||
#define TIME_NAME (cpu_has_tsc?"TSC":"PIT")
|
||||
static unsigned int get_time_pit(void)
|
||||
{
|
||||
|
@ -20,6 +20,7 @@
|
||||
* flag.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/clk.h>
|
||||
|
@ -702,7 +702,7 @@ err_iounmap:
|
||||
err_free_mem_region:
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
err_free_mem:
|
||||
input_free_device(kbc->idev);
|
||||
input_free_device(input_dev);
|
||||
kfree(kbc);
|
||||
|
||||
return err;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* AD714X CapTouch Programmable Controller driver (I2C bus)
|
||||
*
|
||||
* Copyright 2009 Analog Devices Inc.
|
||||
* Copyright 2009-2011 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
@ -27,54 +27,49 @@ static int ad714x_i2c_resume(struct device *dev)
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume);
|
||||
|
||||
static int ad714x_i2c_write(struct device *dev, unsigned short reg,
|
||||
unsigned short data)
|
||||
static int ad714x_i2c_write(struct ad714x_chip *chip,
|
||||
unsigned short reg, unsigned short data)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
int ret = 0;
|
||||
u8 *_reg = (u8 *)®
|
||||
u8 *_data = (u8 *)&data;
|
||||
struct i2c_client *client = to_i2c_client(chip->dev);
|
||||
int error;
|
||||
|
||||
u8 tx[4] = {
|
||||
_reg[1],
|
||||
_reg[0],
|
||||
_data[1],
|
||||
_data[0]
|
||||
};
|
||||
chip->xfer_buf[0] = cpu_to_be16(reg);
|
||||
chip->xfer_buf[1] = cpu_to_be16(data);
|
||||
|
||||
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];
|
||||
error = i2c_master_send(client, (u8 *)chip->xfer_buf,
|
||||
2 * sizeof(*chip->xfer_buf));
|
||||
if (unlikely(error < 0)) {
|
||||
dev_err(&client->dev, "I2C write error: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ad714x_i2c_read(struct ad714x_chip *chip,
|
||||
unsigned short reg, unsigned short *data, size_t len)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(chip->dev);
|
||||
int i;
|
||||
int error;
|
||||
|
||||
chip->xfer_buf[0] = cpu_to_be16(reg);
|
||||
|
||||
error = i2c_master_send(client, (u8 *)chip->xfer_buf,
|
||||
sizeof(*chip->xfer_buf));
|
||||
if (error >= 0)
|
||||
error = i2c_master_recv(client, (u8 *)chip->xfer_buf,
|
||||
len * sizeof(*chip->xfer_buf));
|
||||
|
||||
if (unlikely(error < 0)) {
|
||||
dev_err(&client->dev, "I2C read error: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
data[i] = be16_to_cpu(chip->xfer_buf[i]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit ad714x_i2c_probe(struct i2c_client *client,
|
||||
|
@ -1,12 +1,12 @@
|
||||
/*
|
||||
* AD714X CapTouch Programmable Controller driver (SPI bus)
|
||||
*
|
||||
* Copyright 2009 Analog Devices Inc.
|
||||
* Copyright 2009-2011 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#include <linux/input.h> /* BUS_I2C */
|
||||
#include <linux/input.h> /* BUS_SPI */
|
||||
#include <linux/module.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/pm.h>
|
||||
@ -30,30 +30,68 @@ static int ad714x_spi_resume(struct device *dev)
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(ad714x_spi_pm, ad714x_spi_suspend, ad714x_spi_resume);
|
||||
|
||||
static int ad714x_spi_read(struct device *dev, unsigned short reg,
|
||||
unsigned short *data)
|
||||
static int ad714x_spi_read(struct ad714x_chip *chip,
|
||||
unsigned short reg, unsigned short *data, size_t len)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
unsigned short tx = AD714x_SPI_CMD_PREFIX | AD714x_SPI_READ | reg;
|
||||
struct spi_device *spi = to_spi_device(chip->dev);
|
||||
struct spi_message message;
|
||||
struct spi_transfer xfer[2];
|
||||
int i;
|
||||
int error;
|
||||
|
||||
return spi_write_then_read(spi, (u8 *)&tx, 2, (u8 *)data, 2);
|
||||
spi_message_init(&message);
|
||||
memset(xfer, 0, sizeof(xfer));
|
||||
|
||||
chip->xfer_buf[0] = cpu_to_be16(AD714x_SPI_CMD_PREFIX |
|
||||
AD714x_SPI_READ | reg);
|
||||
xfer[0].tx_buf = &chip->xfer_buf[0];
|
||||
xfer[0].len = sizeof(chip->xfer_buf[0]);
|
||||
spi_message_add_tail(&xfer[0], &message);
|
||||
|
||||
xfer[1].rx_buf = &chip->xfer_buf[1];
|
||||
xfer[1].len = sizeof(chip->xfer_buf[1]) * len;
|
||||
spi_message_add_tail(&xfer[1], &message);
|
||||
|
||||
error = spi_sync(spi, &message);
|
||||
if (unlikely(error)) {
|
||||
dev_err(chip->dev, "SPI read error: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
data[i] = be16_to_cpu(chip->xfer_buf[i + 1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ad714x_spi_write(struct device *dev, unsigned short reg,
|
||||
unsigned short data)
|
||||
static int ad714x_spi_write(struct ad714x_chip *chip,
|
||||
unsigned short reg, unsigned short data)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
unsigned short tx[2] = {
|
||||
AD714x_SPI_CMD_PREFIX | reg,
|
||||
data
|
||||
};
|
||||
struct spi_device *spi = to_spi_device(chip->dev);
|
||||
int error;
|
||||
|
||||
return spi_write(spi, (u8 *)tx, 4);
|
||||
chip->xfer_buf[0] = cpu_to_be16(AD714x_SPI_CMD_PREFIX | reg);
|
||||
chip->xfer_buf[1] = cpu_to_be16(data);
|
||||
|
||||
error = spi_write(spi, (u8 *)chip->xfer_buf,
|
||||
2 * sizeof(*chip->xfer_buf));
|
||||
if (unlikely(error)) {
|
||||
dev_err(chip->dev, "SPI write error: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit ad714x_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
struct ad714x_chip *chip;
|
||||
int err;
|
||||
|
||||
spi->bits_per_word = 8;
|
||||
err = spi_setup(spi);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
chip = ad714x_probe(&spi->dev, BUS_SPI, spi->irq,
|
||||
ad714x_spi_read, ad714x_spi_write);
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* AD714X CapTouch Programmable Controller driver supporting AD7142/3/7/8/7A
|
||||
*
|
||||
* Copyright 2009 Analog Devices Inc.
|
||||
* Copyright 2009-2011 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
@ -59,7 +59,6 @@
|
||||
#define STAGE11_AMBIENT 0x27D
|
||||
|
||||
#define PER_STAGE_REG_NUM 36
|
||||
#define STAGE_NUM 12
|
||||
#define STAGE_CFGREG_NUM 8
|
||||
#define SYS_CFGREG_NUM 8
|
||||
|
||||
@ -124,27 +123,6 @@ struct ad714x_driver_data {
|
||||
* information to integrate all things which will be private data
|
||||
* of spi/i2c device
|
||||
*/
|
||||
struct ad714x_chip {
|
||||
unsigned short h_state;
|
||||
unsigned short l_state;
|
||||
unsigned short c_state;
|
||||
unsigned short adc_reg[STAGE_NUM];
|
||||
unsigned short amb_reg[STAGE_NUM];
|
||||
unsigned short sensor_val[STAGE_NUM];
|
||||
|
||||
struct ad714x_platform_data *hw;
|
||||
struct ad714x_driver_data *sw;
|
||||
|
||||
int irq;
|
||||
struct device *dev;
|
||||
ad714x_read_t read;
|
||||
ad714x_write_t write;
|
||||
|
||||
struct mutex mutex;
|
||||
|
||||
unsigned product;
|
||||
unsigned version;
|
||||
};
|
||||
|
||||
static void ad714x_use_com_int(struct ad714x_chip *ad714x,
|
||||
int start_stage, int end_stage)
|
||||
@ -154,13 +132,13 @@ static void ad714x_use_com_int(struct ad714x_chip *ad714x,
|
||||
|
||||
mask = ((1 << (end_stage + 1)) - 1) - ((1 << start_stage) - 1);
|
||||
|
||||
ad714x->read(ad714x->dev, STG_COM_INT_EN_REG, &data);
|
||||
ad714x->read(ad714x, STG_COM_INT_EN_REG, &data, 1);
|
||||
data |= 1 << end_stage;
|
||||
ad714x->write(ad714x->dev, STG_COM_INT_EN_REG, data);
|
||||
ad714x->write(ad714x, STG_COM_INT_EN_REG, data);
|
||||
|
||||
ad714x->read(ad714x->dev, STG_HIGH_INT_EN_REG, &data);
|
||||
ad714x->read(ad714x, STG_HIGH_INT_EN_REG, &data, 1);
|
||||
data &= ~mask;
|
||||
ad714x->write(ad714x->dev, STG_HIGH_INT_EN_REG, data);
|
||||
ad714x->write(ad714x, STG_HIGH_INT_EN_REG, data);
|
||||
}
|
||||
|
||||
static void ad714x_use_thr_int(struct ad714x_chip *ad714x,
|
||||
@ -171,13 +149,13 @@ static void ad714x_use_thr_int(struct ad714x_chip *ad714x,
|
||||
|
||||
mask = ((1 << (end_stage + 1)) - 1) - ((1 << start_stage) - 1);
|
||||
|
||||
ad714x->read(ad714x->dev, STG_COM_INT_EN_REG, &data);
|
||||
ad714x->read(ad714x, STG_COM_INT_EN_REG, &data, 1);
|
||||
data &= ~(1 << end_stage);
|
||||
ad714x->write(ad714x->dev, STG_COM_INT_EN_REG, data);
|
||||
ad714x->write(ad714x, STG_COM_INT_EN_REG, data);
|
||||
|
||||
ad714x->read(ad714x->dev, STG_HIGH_INT_EN_REG, &data);
|
||||
ad714x->read(ad714x, STG_HIGH_INT_EN_REG, &data, 1);
|
||||
data |= mask;
|
||||
ad714x->write(ad714x->dev, STG_HIGH_INT_EN_REG, data);
|
||||
ad714x->write(ad714x, STG_HIGH_INT_EN_REG, data);
|
||||
}
|
||||
|
||||
static int ad714x_cal_highest_stage(struct ad714x_chip *ad714x,
|
||||
@ -273,15 +251,16 @@ static void ad714x_slider_cal_sensor_val(struct ad714x_chip *ad714x, int idx)
|
||||
struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx];
|
||||
int i;
|
||||
|
||||
for (i = hw->start_stage; i <= hw->end_stage; i++) {
|
||||
ad714x->read(ad714x->dev, CDC_RESULT_S0 + i,
|
||||
&ad714x->adc_reg[i]);
|
||||
ad714x->read(ad714x->dev,
|
||||
STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
|
||||
&ad714x->amb_reg[i]);
|
||||
ad714x->read(ad714x, CDC_RESULT_S0 + hw->start_stage,
|
||||
&ad714x->adc_reg[hw->start_stage],
|
||||
hw->end_stage - hw->start_stage + 1);
|
||||
|
||||
ad714x->sensor_val[i] = abs(ad714x->adc_reg[i] -
|
||||
ad714x->amb_reg[i]);
|
||||
for (i = hw->start_stage; i <= hw->end_stage; i++) {
|
||||
ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
|
||||
&ad714x->amb_reg[i], 1);
|
||||
|
||||
ad714x->sensor_val[i] =
|
||||
abs(ad714x->adc_reg[i] - ad714x->amb_reg[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -444,15 +423,16 @@ static void ad714x_wheel_cal_sensor_val(struct ad714x_chip *ad714x, int idx)
|
||||
struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx];
|
||||
int i;
|
||||
|
||||
ad714x->read(ad714x, CDC_RESULT_S0 + hw->start_stage,
|
||||
&ad714x->adc_reg[hw->start_stage],
|
||||
hw->end_stage - hw->start_stage + 1);
|
||||
|
||||
for (i = hw->start_stage; i <= hw->end_stage; i++) {
|
||||
ad714x->read(ad714x->dev, CDC_RESULT_S0 + i,
|
||||
&ad714x->adc_reg[i]);
|
||||
ad714x->read(ad714x->dev,
|
||||
STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
|
||||
&ad714x->amb_reg[i]);
|
||||
ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
|
||||
&ad714x->amb_reg[i], 1);
|
||||
if (ad714x->adc_reg[i] > ad714x->amb_reg[i])
|
||||
ad714x->sensor_val[i] = ad714x->adc_reg[i] -
|
||||
ad714x->amb_reg[i];
|
||||
ad714x->sensor_val[i] =
|
||||
ad714x->adc_reg[i] - ad714x->amb_reg[i];
|
||||
else
|
||||
ad714x->sensor_val[i] = 0;
|
||||
}
|
||||
@ -597,15 +577,16 @@ static void touchpad_cal_sensor_val(struct ad714x_chip *ad714x, int idx)
|
||||
struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
|
||||
int i;
|
||||
|
||||
ad714x->read(ad714x, CDC_RESULT_S0 + hw->x_start_stage,
|
||||
&ad714x->adc_reg[hw->x_start_stage],
|
||||
hw->x_end_stage - hw->x_start_stage + 1);
|
||||
|
||||
for (i = hw->x_start_stage; i <= hw->x_end_stage; i++) {
|
||||
ad714x->read(ad714x->dev, CDC_RESULT_S0 + i,
|
||||
&ad714x->adc_reg[i]);
|
||||
ad714x->read(ad714x->dev,
|
||||
STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
|
||||
&ad714x->amb_reg[i]);
|
||||
ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
|
||||
&ad714x->amb_reg[i], 1);
|
||||
if (ad714x->adc_reg[i] > ad714x->amb_reg[i])
|
||||
ad714x->sensor_val[i] = ad714x->adc_reg[i] -
|
||||
ad714x->amb_reg[i];
|
||||
ad714x->sensor_val[i] =
|
||||
ad714x->adc_reg[i] - ad714x->amb_reg[i];
|
||||
else
|
||||
ad714x->sensor_val[i] = 0;
|
||||
}
|
||||
@ -891,7 +872,7 @@ static int ad714x_hw_detect(struct ad714x_chip *ad714x)
|
||||
{
|
||||
unsigned short data;
|
||||
|
||||
ad714x->read(ad714x->dev, AD714X_PARTID_REG, &data);
|
||||
ad714x->read(ad714x, AD714X_PARTID_REG, &data, 1);
|
||||
switch (data & 0xFFF0) {
|
||||
case AD7142_PARTID:
|
||||
ad714x->product = 0x7142;
|
||||
@ -940,23 +921,20 @@ static void ad714x_hw_init(struct ad714x_chip *ad714x)
|
||||
for (i = 0; i < STAGE_NUM; i++) {
|
||||
reg_base = AD714X_STAGECFG_REG + i * STAGE_CFGREG_NUM;
|
||||
for (j = 0; j < STAGE_CFGREG_NUM; j++)
|
||||
ad714x->write(ad714x->dev, reg_base + j,
|
||||
ad714x->write(ad714x, reg_base + j,
|
||||
ad714x->hw->stage_cfg_reg[i][j]);
|
||||
}
|
||||
|
||||
for (i = 0; i < SYS_CFGREG_NUM; i++)
|
||||
ad714x->write(ad714x->dev, AD714X_SYSCFG_REG + i,
|
||||
ad714x->write(ad714x, AD714X_SYSCFG_REG + i,
|
||||
ad714x->hw->sys_cfg_reg[i]);
|
||||
for (i = 0; i < SYS_CFGREG_NUM; i++)
|
||||
ad714x->read(ad714x->dev, AD714X_SYSCFG_REG + i,
|
||||
&data);
|
||||
ad714x->read(ad714x, AD714X_SYSCFG_REG + i, &data, 1);
|
||||
|
||||
ad714x->write(ad714x->dev, AD714X_STG_CAL_EN_REG, 0xFFF);
|
||||
ad714x->write(ad714x, AD714X_STG_CAL_EN_REG, 0xFFF);
|
||||
|
||||
/* clear all interrupts */
|
||||
ad714x->read(ad714x->dev, STG_LOW_INT_STA_REG, &data);
|
||||
ad714x->read(ad714x->dev, STG_HIGH_INT_STA_REG, &data);
|
||||
ad714x->read(ad714x->dev, STG_COM_INT_STA_REG, &data);
|
||||
ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3);
|
||||
}
|
||||
|
||||
static irqreturn_t ad714x_interrupt_thread(int irq, void *data)
|
||||
@ -966,9 +944,7 @@ static irqreturn_t ad714x_interrupt_thread(int irq, void *data)
|
||||
|
||||
mutex_lock(&ad714x->mutex);
|
||||
|
||||
ad714x->read(ad714x->dev, STG_LOW_INT_STA_REG, &ad714x->l_state);
|
||||
ad714x->read(ad714x->dev, STG_HIGH_INT_STA_REG, &ad714x->h_state);
|
||||
ad714x->read(ad714x->dev, STG_COM_INT_STA_REG, &ad714x->c_state);
|
||||
ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3);
|
||||
|
||||
for (i = 0; i < ad714x->hw->button_num; i++)
|
||||
ad714x_button_state_machine(ad714x, i);
|
||||
@ -1245,7 +1221,7 @@ int ad714x_disable(struct ad714x_chip *ad714x)
|
||||
mutex_lock(&ad714x->mutex);
|
||||
|
||||
data = ad714x->hw->sys_cfg_reg[AD714X_PWR_CTRL] | 0x3;
|
||||
ad714x->write(ad714x->dev, AD714X_PWR_CTRL, data);
|
||||
ad714x->write(ad714x, AD714X_PWR_CTRL, data);
|
||||
|
||||
mutex_unlock(&ad714x->mutex);
|
||||
|
||||
@ -1255,24 +1231,20 @@ EXPORT_SYMBOL(ad714x_disable);
|
||||
|
||||
int ad714x_enable(struct ad714x_chip *ad714x)
|
||||
{
|
||||
unsigned short data;
|
||||
|
||||
dev_dbg(ad714x->dev, "%s enter\n", __func__);
|
||||
|
||||
mutex_lock(&ad714x->mutex);
|
||||
|
||||
/* resume to non-shutdown mode */
|
||||
|
||||
ad714x->write(ad714x->dev, AD714X_PWR_CTRL,
|
||||
ad714x->write(ad714x, AD714X_PWR_CTRL,
|
||||
ad714x->hw->sys_cfg_reg[AD714X_PWR_CTRL]);
|
||||
|
||||
/* make sure the interrupt output line is not low level after resume,
|
||||
* otherwise we will get no chance to enter falling-edge irq again
|
||||
*/
|
||||
|
||||
ad714x->read(ad714x->dev, STG_LOW_INT_STA_REG, &data);
|
||||
ad714x->read(ad714x->dev, STG_HIGH_INT_STA_REG, &data);
|
||||
ad714x->read(ad714x->dev, STG_COM_INT_STA_REG, &data);
|
||||
ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3);
|
||||
|
||||
mutex_unlock(&ad714x->mutex);
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* AD714X CapTouch Programmable Controller driver (bus interfaces)
|
||||
*
|
||||
* Copyright 2009 Analog Devices Inc.
|
||||
* Copyright 2009-2011 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
@ -11,11 +11,40 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define STAGE_NUM 12
|
||||
|
||||
struct device;
|
||||
struct ad714x_platform_data;
|
||||
struct ad714x_driver_data;
|
||||
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);
|
||||
typedef int (*ad714x_read_t)(struct ad714x_chip *, unsigned short, unsigned short *, size_t);
|
||||
typedef int (*ad714x_write_t)(struct ad714x_chip *, unsigned short, unsigned short);
|
||||
|
||||
struct ad714x_chip {
|
||||
unsigned short l_state;
|
||||
unsigned short h_state;
|
||||
unsigned short c_state;
|
||||
unsigned short adc_reg[STAGE_NUM];
|
||||
unsigned short amb_reg[STAGE_NUM];
|
||||
unsigned short sensor_val[STAGE_NUM];
|
||||
|
||||
struct ad714x_platform_data *hw;
|
||||
struct ad714x_driver_data *sw;
|
||||
|
||||
int irq;
|
||||
struct device *dev;
|
||||
ad714x_read_t read;
|
||||
ad714x_write_t write;
|
||||
|
||||
struct mutex mutex;
|
||||
|
||||
unsigned product;
|
||||
unsigned version;
|
||||
|
||||
__be16 xfer_buf[16] ____cacheline_aligned;
|
||||
|
||||
};
|
||||
|
||||
int ad714x_disable(struct ad714x_chip *ad714x);
|
||||
int ad714x_enable(struct ad714x_chip *ad714x);
|
||||
|
@ -234,7 +234,7 @@ static const struct of_device_id mma8450_dt_ids[] = {
|
||||
{ .compatible = "fsl,mma8450", },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, mma8450_dt_ids);
|
||||
MODULE_DEVICE_TABLE(of, mma8450_dt_ids);
|
||||
|
||||
static struct i2c_driver mma8450_driver = {
|
||||
.driver = {
|
||||
|
@ -282,7 +282,7 @@ err_free_irq:
|
||||
err_pm_set_suspended:
|
||||
pm_runtime_set_suspended(&client->dev);
|
||||
err_free_mem:
|
||||
input_unregister_device(idev);
|
||||
input_free_device(idev);
|
||||
kfree(sensor);
|
||||
return error;
|
||||
}
|
||||
|
@ -67,6 +67,14 @@
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI 0x0245
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING5_ISO 0x0246
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING5_JIS 0x0247
|
||||
/* MacbookAir4,2 (unibody, July 2011) */
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e
|
||||
/* Macbook8,2 (unibody) */
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254
|
||||
|
||||
#define BCM5974_DEVICE(prod) { \
|
||||
.match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \
|
||||
@ -104,6 +112,14 @@ static const struct usb_device_id bcm5974_table[] = {
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_ISO),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_JIS),
|
||||
/* MacbookAir4,2 */
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6_ISO),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6_JIS),
|
||||
/* MacbookPro8,2 */
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS),
|
||||
/* Terminating entry */
|
||||
{}
|
||||
};
|
||||
@ -294,6 +310,30 @@ static const struct bcm5974_config bcm5974_config_table[] = {
|
||||
{ DIM_X, DIM_X / SN_COORD, -4415, 5050 },
|
||||
{ DIM_Y, DIM_Y / SN_COORD, -55, 6680 }
|
||||
},
|
||||
{
|
||||
USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI,
|
||||
USB_DEVICE_ID_APPLE_WELLSPRING6_ISO,
|
||||
USB_DEVICE_ID_APPLE_WELLSPRING6_JIS,
|
||||
HAS_INTEGRATED_BUTTON,
|
||||
0x84, sizeof(struct bt_data),
|
||||
0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
|
||||
{ DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
|
||||
{ DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
|
||||
{ DIM_X, DIM_X / SN_COORD, -4620, 5140 },
|
||||
{ DIM_Y, DIM_Y / SN_COORD, -150, 6600 }
|
||||
},
|
||||
{
|
||||
USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI,
|
||||
USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO,
|
||||
USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS,
|
||||
HAS_INTEGRATED_BUTTON,
|
||||
0x84, sizeof(struct bt_data),
|
||||
0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
|
||||
{ DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
|
||||
{ DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
|
||||
{ DIM_X, DIM_X / SN_COORD, -4750, 5280 },
|
||||
{ DIM_Y, DIM_Y / SN_COORD, -150, 6730 }
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -49,6 +49,7 @@ struct hid_descriptor {
|
||||
#define USB_REQ_GET_REPORT 0x01
|
||||
#define USB_REQ_SET_REPORT 0x09
|
||||
#define WAC_HID_FEATURE_REPORT 0x03
|
||||
#define WAC_MSG_RETRIES 5
|
||||
|
||||
static int usb_get_report(struct usb_interface *intf, unsigned char type,
|
||||
unsigned char id, void *buf, int size)
|
||||
@ -165,7 +166,7 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
|
||||
report,
|
||||
hid_desc->wDescriptorLength,
|
||||
5000); /* 5 secs */
|
||||
} while (result < 0 && limit++ < 5);
|
||||
} while (result < 0 && limit++ < WAC_MSG_RETRIES);
|
||||
|
||||
/* No need to parse the Descriptor. It isn't an error though */
|
||||
if (result < 0)
|
||||
@ -319,24 +320,26 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat
|
||||
int limit = 0, report_id = 2;
|
||||
int error = -ENOMEM;
|
||||
|
||||
rep_data = kmalloc(2, GFP_KERNEL);
|
||||
rep_data = kmalloc(4, GFP_KERNEL);
|
||||
if (!rep_data)
|
||||
return error;
|
||||
|
||||
/* ask to report tablet data if it is 2FGT Tablet PC or
|
||||
/* ask to report tablet data if it is MT Tablet PC or
|
||||
* not a Tablet PC */
|
||||
if (features->type == TABLETPC2FG) {
|
||||
do {
|
||||
rep_data[0] = 3;
|
||||
rep_data[1] = 4;
|
||||
rep_data[2] = 0;
|
||||
rep_data[3] = 0;
|
||||
report_id = 3;
|
||||
error = usb_set_report(intf, WAC_HID_FEATURE_REPORT,
|
||||
report_id, rep_data, 2);
|
||||
report_id, rep_data, 4);
|
||||
if (error >= 0)
|
||||
error = usb_get_report(intf,
|
||||
WAC_HID_FEATURE_REPORT, report_id,
|
||||
rep_data, 3);
|
||||
} while ((error < 0 || rep_data[1] != 4) && limit++ < 5);
|
||||
rep_data, 4);
|
||||
} while ((error < 0 || rep_data[1] != 4) && limit++ < WAC_MSG_RETRIES);
|
||||
} else if (features->type != TABLETPC) {
|
||||
do {
|
||||
rep_data[0] = 2;
|
||||
@ -347,7 +350,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat
|
||||
error = usb_get_report(intf,
|
||||
WAC_HID_FEATURE_REPORT, report_id,
|
||||
rep_data, 2);
|
||||
} while ((error < 0 || rep_data[1] != 2) && limit++ < 5);
|
||||
} while ((error < 0 || rep_data[1] != 2) && limit++ < WAC_MSG_RETRIES);
|
||||
}
|
||||
|
||||
kfree(rep_data);
|
||||
|
@ -1460,6 +1460,9 @@ static const struct wacom_features wacom_features_0xD3 =
|
||||
static const struct wacom_features wacom_features_0xD4 =
|
||||
{ "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
|
||||
63, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
static const struct wacom_features wacom_features_0xD5 =
|
||||
{ "Wacom Bamboo Pen 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023,
|
||||
63, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
static const struct wacom_features wacom_features_0xD6 =
|
||||
{ "Wacom BambooPT 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
|
||||
63, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
@ -1564,6 +1567,7 @@ const struct usb_device_id wacom_ids[] = {
|
||||
{ USB_DEVICE_WACOM(0xD2) },
|
||||
{ USB_DEVICE_WACOM(0xD3) },
|
||||
{ USB_DEVICE_WACOM(0xD4) },
|
||||
{ USB_DEVICE_WACOM(0xD5) },
|
||||
{ USB_DEVICE_WACOM(0xD6) },
|
||||
{ USB_DEVICE_WACOM(0xD7) },
|
||||
{ USB_DEVICE_WACOM(0xD8) },
|
||||
|
@ -244,6 +244,7 @@ struct mxt_finger {
|
||||
int x;
|
||||
int y;
|
||||
int area;
|
||||
int pressure;
|
||||
};
|
||||
|
||||
/* Each client has this additional data */
|
||||
@ -536,6 +537,8 @@ static void mxt_input_report(struct mxt_data *data, int single_id)
|
||||
finger[id].x);
|
||||
input_report_abs(input_dev, ABS_MT_POSITION_Y,
|
||||
finger[id].y);
|
||||
input_report_abs(input_dev, ABS_MT_PRESSURE,
|
||||
finger[id].pressure);
|
||||
} else {
|
||||
finger[id].status = 0;
|
||||
}
|
||||
@ -546,6 +549,8 @@ static void mxt_input_report(struct mxt_data *data, int single_id)
|
||||
if (status != MXT_RELEASE) {
|
||||
input_report_abs(input_dev, ABS_X, finger[single_id].x);
|
||||
input_report_abs(input_dev, ABS_Y, finger[single_id].y);
|
||||
input_report_abs(input_dev,
|
||||
ABS_PRESSURE, finger[single_id].pressure);
|
||||
}
|
||||
|
||||
input_sync(input_dev);
|
||||
@ -560,6 +565,7 @@ static void mxt_input_touchevent(struct mxt_data *data,
|
||||
int x;
|
||||
int y;
|
||||
int area;
|
||||
int pressure;
|
||||
|
||||
/* Check the touch is present on the screen */
|
||||
if (!(status & MXT_DETECT)) {
|
||||
@ -584,6 +590,7 @@ static void mxt_input_touchevent(struct mxt_data *data,
|
||||
y = y >> 2;
|
||||
|
||||
area = message->message[4];
|
||||
pressure = message->message[5];
|
||||
|
||||
dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id,
|
||||
status & MXT_MOVE ? "moved" : "pressed",
|
||||
@ -594,6 +601,7 @@ static void mxt_input_touchevent(struct mxt_data *data,
|
||||
finger[id].x = x;
|
||||
finger[id].y = y;
|
||||
finger[id].area = area;
|
||||
finger[id].pressure = pressure;
|
||||
|
||||
mxt_input_report(data, id);
|
||||
}
|
||||
@ -1116,6 +1124,8 @@ static int __devinit mxt_probe(struct i2c_client *client,
|
||||
0, data->max_x, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_Y,
|
||||
0, data->max_y, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_PRESSURE,
|
||||
0, 255, 0, 0);
|
||||
|
||||
/* For multi touch */
|
||||
input_mt_init_slots(input_dev, MXT_MAX_FINGER);
|
||||
@ -1125,6 +1135,8 @@ static int __devinit mxt_probe(struct i2c_client *client,
|
||||
0, data->max_x, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
|
||||
0, data->max_y, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_MT_PRESSURE,
|
||||
0, 255, 0, 0);
|
||||
|
||||
input_set_drvdata(input_dev, data);
|
||||
i2c_set_clientdata(client, data);
|
||||
|
@ -9,7 +9,8 @@
|
||||
*
|
||||
* 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.
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -13,6 +13,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
|
Loading…
Reference in New Issue
Block a user