Commit 8554cc18 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 051732bc 9eff794b
...@@ -139,7 +139,7 @@ struct analog_port { ...@@ -139,7 +139,7 @@ struct analog_port {
#include <linux/i8253.h> #include <linux/i8253.h>
#define GET_TIME(x) do { if (cpu_has_tsc) rdtscl(x); else x = get_time_pit(); } while (0) #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") #define TIME_NAME (cpu_has_tsc?"TSC":"PIT")
static unsigned int get_time_pit(void) static unsigned int get_time_pit(void)
{ {
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
* flag. * flag.
*/ */
#include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/clk.h> #include <linux/clk.h>
......
...@@ -702,7 +702,7 @@ static int __devinit tegra_kbc_probe(struct platform_device *pdev) ...@@ -702,7 +702,7 @@ static int __devinit tegra_kbc_probe(struct platform_device *pdev)
err_free_mem_region: err_free_mem_region:
release_mem_region(res->start, resource_size(res)); release_mem_region(res->start, resource_size(res));
err_free_mem: err_free_mem:
input_free_device(kbc->idev); input_free_device(input_dev);
kfree(kbc); kfree(kbc);
return err; return err;
......
/* /*
* AD714X CapTouch Programmable Controller driver (I2C bus) * 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. * Licensed under the GPL-2 or later.
*/ */
...@@ -27,54 +27,49 @@ static int ad714x_i2c_resume(struct device *dev) ...@@ -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 SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume);
static int ad714x_i2c_write(struct device *dev, unsigned short reg, static int ad714x_i2c_write(struct ad714x_chip *chip,
unsigned short data) unsigned short reg, unsigned short data)
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(chip->dev);
int ret = 0; int error;
u8 *_reg = (u8 *)&reg;
u8 *_data = (u8 *)&data; chip->xfer_buf[0] = cpu_to_be16(reg);
chip->xfer_buf[1] = cpu_to_be16(data);
u8 tx[4] = {
_reg[1], error = i2c_master_send(client, (u8 *)chip->xfer_buf,
_reg[0], 2 * sizeof(*chip->xfer_buf));
_data[1], if (unlikely(error < 0)) {
_data[0] dev_err(&client->dev, "I2C write error: %d\n", error);
}; return error;
}
ret = i2c_master_send(client, tx, 4);
if (ret < 0) return 0;
dev_err(&client->dev, "I2C write error\n");
return ret;
} }
static int ad714x_i2c_read(struct device *dev, unsigned short reg, static int ad714x_i2c_read(struct ad714x_chip *chip,
unsigned short *data) unsigned short reg, unsigned short *data, size_t len)
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(chip->dev);
int ret = 0; int i;
u8 *_reg = (u8 *)&reg; int error;
u8 *_data = (u8 *)data;
chip->xfer_buf[0] = cpu_to_be16(reg);
u8 tx[2] = {
_reg[1], error = i2c_master_send(client, (u8 *)chip->xfer_buf,
_reg[0] sizeof(*chip->xfer_buf));
}; if (error >= 0)
u8 rx[2]; error = i2c_master_recv(client, (u8 *)chip->xfer_buf,
len * sizeof(*chip->xfer_buf));
ret = i2c_master_send(client, tx, 2);
if (ret >= 0) if (unlikely(error < 0)) {
ret = i2c_master_recv(client, rx, 2); dev_err(&client->dev, "I2C read error: %d\n", error);
return error;
if (unlikely(ret < 0)) {
dev_err(&client->dev, "I2C read error\n");
} else {
_data[0] = rx[1];
_data[1] = rx[0];
} }
return ret; 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, static int __devinit ad714x_i2c_probe(struct i2c_client *client,
......
/* /*
* AD714X CapTouch Programmable Controller driver (SPI bus) * 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. * 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/module.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/pm.h> #include <linux/pm.h>
...@@ -30,30 +30,68 @@ static int ad714x_spi_resume(struct device *dev) ...@@ -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 SIMPLE_DEV_PM_OPS(ad714x_spi_pm, ad714x_spi_suspend, ad714x_spi_resume);
static int ad714x_spi_read(struct device *dev, unsigned short reg, static int ad714x_spi_read(struct ad714x_chip *chip,
unsigned short *data) unsigned short reg, unsigned short *data, size_t len)
{ {
struct spi_device *spi = to_spi_device(dev); struct spi_device *spi = to_spi_device(chip->dev);
unsigned short tx = AD714x_SPI_CMD_PREFIX | AD714x_SPI_READ | reg; struct spi_message message;
struct spi_transfer xfer[2];
int i;
int error;
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 spi_write_then_read(spi, (u8 *)&tx, 2, (u8 *)data, 2); return 0;
} }
static int ad714x_spi_write(struct device *dev, unsigned short reg, static int ad714x_spi_write(struct ad714x_chip *chip,
unsigned short data) unsigned short reg, unsigned short data)
{ {
struct spi_device *spi = to_spi_device(dev); struct spi_device *spi = to_spi_device(chip->dev);
unsigned short tx[2] = { int error;
AD714x_SPI_CMD_PREFIX | reg,
data 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 spi_write(spi, (u8 *)tx, 4); return 0;
} }
static int __devinit ad714x_spi_probe(struct spi_device *spi) static int __devinit ad714x_spi_probe(struct spi_device *spi)
{ {
struct ad714x_chip *chip; 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, chip = ad714x_probe(&spi->dev, BUS_SPI, spi->irq,
ad714x_spi_read, ad714x_spi_write); ad714x_spi_read, ad714x_spi_write);
......
/* /*
* AD714X CapTouch Programmable Controller driver supporting AD7142/3/7/8/7A * 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. * Licensed under the GPL-2 or later.
*/ */
...@@ -59,7 +59,6 @@ ...@@ -59,7 +59,6 @@
#define STAGE11_AMBIENT 0x27D #define STAGE11_AMBIENT 0x27D
#define PER_STAGE_REG_NUM 36 #define PER_STAGE_REG_NUM 36
#define STAGE_NUM 12
#define STAGE_CFGREG_NUM 8 #define STAGE_CFGREG_NUM 8
#define SYS_CFGREG_NUM 8 #define SYS_CFGREG_NUM 8
...@@ -124,27 +123,6 @@ struct ad714x_driver_data { ...@@ -124,27 +123,6 @@ struct ad714x_driver_data {
* information to integrate all things which will be private data * information to integrate all things which will be private data
* of spi/i2c device * 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, static void ad714x_use_com_int(struct ad714x_chip *ad714x,
int start_stage, int end_stage) int start_stage, int end_stage)
...@@ -154,13 +132,13 @@ static void ad714x_use_com_int(struct ad714x_chip *ad714x, ...@@ -154,13 +132,13 @@ static void ad714x_use_com_int(struct ad714x_chip *ad714x,
mask = ((1 << (end_stage + 1)) - 1) - ((1 << start_stage) - 1); 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; 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; 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, static void ad714x_use_thr_int(struct ad714x_chip *ad714x,
...@@ -171,13 +149,13 @@ 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); 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); 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; 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, 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) ...@@ -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]; struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx];
int i; 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++) { for (i = hw->start_stage; i <= hw->end_stage; i++) {
ad714x->read(ad714x->dev, CDC_RESULT_S0 + i, ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
&ad714x->adc_reg[i]); &ad714x->amb_reg[i], 1);
ad714x->read(ad714x->dev,
STAGE0_AMBIENT + i * PER_STAGE_REG_NUM, ad714x->sensor_val[i] =
&ad714x->amb_reg[i]); abs(ad714x->adc_reg[i] - ad714x->amb_reg[i]);
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) ...@@ -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]; struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx];
int i; 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++) { for (i = hw->start_stage; i <= hw->end_stage; i++) {
ad714x->read(ad714x->dev, CDC_RESULT_S0 + i, ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
&ad714x->adc_reg[i]); &ad714x->amb_reg[i], 1);
ad714x->read(ad714x->dev,
STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
&ad714x->amb_reg[i]);
if (ad714x->adc_reg[i] > ad714x->amb_reg[i]) if (ad714x->adc_reg[i] > ad714x->amb_reg[i])
ad714x->sensor_val[i] = ad714x->adc_reg[i] - ad714x->sensor_val[i] =
ad714x->amb_reg[i]; ad714x->adc_reg[i] - ad714x->amb_reg[i];
else else
ad714x->sensor_val[i] = 0; ad714x->sensor_val[i] = 0;
} }
...@@ -597,15 +577,16 @@ static void touchpad_cal_sensor_val(struct ad714x_chip *ad714x, int idx) ...@@ -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]; struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
int i; 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++) { for (i = hw->x_start_stage; i <= hw->x_end_stage; i++) {
ad714x->read(ad714x->dev, CDC_RESULT_S0 + i, ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
&ad714x->adc_reg[i]); &ad714x->amb_reg[i], 1);
ad714x->read(ad714x->dev,
STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
&ad714x->amb_reg[i]);
if (ad714x->adc_reg[i] > ad714x->amb_reg[i]) if (ad714x->adc_reg[i] > ad714x->amb_reg[i])
ad714x->sensor_val[i] = ad714x->adc_reg[i] - ad714x->sensor_val[i] =
ad714x->amb_reg[i]; ad714x->adc_reg[i] - ad714x->amb_reg[i];
else else
ad714x->sensor_val[i] = 0; ad714x->sensor_val[i] = 0;
} }
...@@ -891,7 +872,7 @@ static int ad714x_hw_detect(struct ad714x_chip *ad714x) ...@@ -891,7 +872,7 @@ static int ad714x_hw_detect(struct ad714x_chip *ad714x)
{ {
unsigned short data; unsigned short data;
ad714x->read(ad714x->dev, AD714X_PARTID_REG, &data); ad714x->read(ad714x, AD714X_PARTID_REG, &data, 1);
switch (data & 0xFFF0) { switch (data & 0xFFF0) {
case AD7142_PARTID: case AD7142_PARTID:
ad714x->product = 0x7142; ad714x->product = 0x7142;
...@@ -940,23 +921,20 @@ static void ad714x_hw_init(struct ad714x_chip *ad714x) ...@@ -940,23 +921,20 @@ static void ad714x_hw_init(struct ad714x_chip *ad714x)
for (i = 0; i < STAGE_NUM; i++) { for (i = 0; i < STAGE_NUM; i++) {
reg_base = AD714X_STAGECFG_REG + i * STAGE_CFGREG_NUM; reg_base = AD714X_STAGECFG_REG + i * STAGE_CFGREG_NUM;
for (j = 0; j < STAGE_CFGREG_NUM; j++) 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]); ad714x->hw->stage_cfg_reg[i][j]);
} }
for (i = 0; i < SYS_CFGREG_NUM; i++) 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]); ad714x->hw->sys_cfg_reg[i]);
for (i = 0; i < SYS_CFGREG_NUM; i++) for (i = 0; i < SYS_CFGREG_NUM; i++)
ad714x->read(ad714x->dev, AD714X_SYSCFG_REG + i, ad714x->read(ad714x, AD714X_SYSCFG_REG + i, &data, 1);
&data);
ad714x->write(ad714x->dev, AD714X_STG_CAL_EN_REG, 0xFFF); ad714x->write(ad714x, AD714X_STG_CAL_EN_REG, 0xFFF);
/* clear all interrupts */ /* clear all interrupts */
ad714x->read(ad714x->dev, STG_LOW_INT_STA_REG, &data); ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3);
ad714x->read(ad714x->dev, STG_HIGH_INT_STA_REG, &data);
ad714x->read(ad714x->dev, STG_COM_INT_STA_REG, &data);
} }
static irqreturn_t ad714x_interrupt_thread(int irq, void *data) static irqreturn_t ad714x_interrupt_thread(int irq, void *data)
...@@ -966,9 +944,7 @@ 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); mutex_lock(&ad714x->mutex);
ad714x->read(ad714x->dev, STG_LOW_INT_STA_REG, &ad714x->l_state); ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3);
ad714x->read(ad714x->dev, STG_HIGH_INT_STA_REG, &ad714x->h_state);
ad714x->read(ad714x->dev, STG_COM_INT_STA_REG, &ad714x->c_state);
for (i = 0; i < ad714x->hw->button_num; i++) for (i = 0; i < ad714x->hw->button_num; i++)
ad714x_button_state_machine(ad714x, i); ad714x_button_state_machine(ad714x, i);
...@@ -1245,7 +1221,7 @@ int ad714x_disable(struct ad714x_chip *ad714x) ...@@ -1245,7 +1221,7 @@ int ad714x_disable(struct ad714x_chip *ad714x)
mutex_lock(&ad714x->mutex); mutex_lock(&ad714x->mutex);
data = ad714x->hw->sys_cfg_reg[AD714X_PWR_CTRL] | 0x3; 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); mutex_unlock(&ad714x->mutex);
...@@ -1255,24 +1231,20 @@ EXPORT_SYMBOL(ad714x_disable); ...@@ -1255,24 +1231,20 @@ EXPORT_SYMBOL(ad714x_disable);
int ad714x_enable(struct ad714x_chip *ad714x) int ad714x_enable(struct ad714x_chip *ad714x)
{ {
unsigned short data;
dev_dbg(ad714x->dev, "%s enter\n", __func__); dev_dbg(ad714x->dev, "%s enter\n", __func__);
mutex_lock(&ad714x->mutex); mutex_lock(&ad714x->mutex);
/* resume to non-shutdown mode */ /* 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]); ad714x->hw->sys_cfg_reg[AD714X_PWR_CTRL]);
/* make sure the interrupt output line is not low level after resume, /* make sure the interrupt output line is not low level after resume,
* otherwise we will get no chance to enter falling-edge irq again * 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, STG_LOW_INT_STA_REG, &ad714x->l_state, 3);
ad714x->read(ad714x->dev, STG_HIGH_INT_STA_REG, &data);
ad714x->read(ad714x->dev, STG_COM_INT_STA_REG, &data);
mutex_unlock(&ad714x->mutex); mutex_unlock(&ad714x->mutex);
......
/* /*
* AD714X CapTouch Programmable Controller driver (bus interfaces) * 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. * Licensed under the GPL-2 or later.
*/ */
...@@ -11,11 +11,40 @@ ...@@ -11,11 +11,40 @@
#include <linux/types.h> #include <linux/types.h>
#define STAGE_NUM 12
struct device; struct device;
struct ad714x_platform_data;
struct ad714x_driver_data;
struct ad714x_chip; struct ad714x_chip;
typedef int (*ad714x_read_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 device *, unsigned short, unsigned short); 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_disable(struct ad714x_chip *ad714x);
int ad714x_enable(struct ad714x_chip *ad714x); int ad714x_enable(struct ad714x_chip *ad714x);
......
...@@ -234,7 +234,7 @@ static const struct of_device_id mma8450_dt_ids[] = { ...@@ -234,7 +234,7 @@ static const struct of_device_id mma8450_dt_ids[] = {
{ .compatible = "fsl,mma8450", }, { .compatible = "fsl,mma8450", },
{ /* sentinel */ } { /* sentinel */ }
}; };
MODULE_DEVICE_TABLE(i2c, mma8450_dt_ids); MODULE_DEVICE_TABLE(of, mma8450_dt_ids);
static struct i2c_driver mma8450_driver = { static struct i2c_driver mma8450_driver = {
.driver = { .driver = {
......
...@@ -282,7 +282,7 @@ static int __devinit mpu3050_probe(struct i2c_client *client, ...@@ -282,7 +282,7 @@ static int __devinit mpu3050_probe(struct i2c_client *client,
err_pm_set_suspended: err_pm_set_suspended:
pm_runtime_set_suspended(&client->dev); pm_runtime_set_suspended(&client->dev);
err_free_mem: err_free_mem:
input_unregister_device(idev); input_free_device(idev);
kfree(sensor); kfree(sensor);
return error; return error;
} }
......
...@@ -67,6 +67,14 @@ ...@@ -67,6 +67,14 @@
#define USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI 0x0245 #define USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI 0x0245
#define USB_DEVICE_ID_APPLE_WELLSPRING5_ISO 0x0246 #define USB_DEVICE_ID_APPLE_WELLSPRING5_ISO 0x0246
#define USB_DEVICE_ID_APPLE_WELLSPRING5_JIS 0x0247 #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) { \ #define BCM5974_DEVICE(prod) { \
.match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \
...@@ -104,6 +112,14 @@ static const struct usb_device_id bcm5974_table[] = { ...@@ -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_ANSI),
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_ISO), BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_ISO),
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_JIS), 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 */ /* Terminating entry */
{} {}
}; };
...@@ -294,6 +310,30 @@ static const struct bcm5974_config bcm5974_config_table[] = { ...@@ -294,6 +310,30 @@ static const struct bcm5974_config bcm5974_config_table[] = {
{ DIM_X, DIM_X / SN_COORD, -4415, 5050 }, { DIM_X, DIM_X / SN_COORD, -4415, 5050 },
{ DIM_Y, DIM_Y / SN_COORD, -55, 6680 } { 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 { ...@@ -49,6 +49,7 @@ struct hid_descriptor {
#define USB_REQ_GET_REPORT 0x01 #define USB_REQ_GET_REPORT 0x01
#define USB_REQ_SET_REPORT 0x09 #define USB_REQ_SET_REPORT 0x09
#define WAC_HID_FEATURE_REPORT 0x03 #define WAC_HID_FEATURE_REPORT 0x03
#define WAC_MSG_RETRIES 5
static int usb_get_report(struct usb_interface *intf, unsigned char type, static int usb_get_report(struct usb_interface *intf, unsigned char type,
unsigned char id, void *buf, int size) unsigned char id, void *buf, int size)
...@@ -165,7 +166,7 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi ...@@ -165,7 +166,7 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
report, report,
hid_desc->wDescriptorLength, hid_desc->wDescriptorLength,
5000); /* 5 secs */ 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 */ /* No need to parse the Descriptor. It isn't an error though */
if (result < 0) if (result < 0)
...@@ -319,24 +320,26 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat ...@@ -319,24 +320,26 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat
int limit = 0, report_id = 2; int limit = 0, report_id = 2;
int error = -ENOMEM; int error = -ENOMEM;
rep_data = kmalloc(2, GFP_KERNEL); rep_data = kmalloc(4, GFP_KERNEL);
if (!rep_data) if (!rep_data)
return error; 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 */ * not a Tablet PC */
if (features->type == TABLETPC2FG) { if (features->type == TABLETPC2FG) {
do { do {
rep_data[0] = 3; rep_data[0] = 3;
rep_data[1] = 4; rep_data[1] = 4;
rep_data[2] = 0;
rep_data[3] = 0;
report_id = 3; report_id = 3;
error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, error = usb_set_report(intf, WAC_HID_FEATURE_REPORT,
report_id, rep_data, 2); report_id, rep_data, 4);
if (error >= 0) if (error >= 0)
error = usb_get_report(intf, error = usb_get_report(intf,
WAC_HID_FEATURE_REPORT, report_id, WAC_HID_FEATURE_REPORT, report_id,
rep_data, 3); rep_data, 4);
} while ((error < 0 || rep_data[1] != 4) && limit++ < 5); } while ((error < 0 || rep_data[1] != 4) && limit++ < WAC_MSG_RETRIES);
} else if (features->type != TABLETPC) { } else if (features->type != TABLETPC) {
do { do {
rep_data[0] = 2; rep_data[0] = 2;
...@@ -347,7 +350,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat ...@@ -347,7 +350,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat
error = usb_get_report(intf, error = usb_get_report(intf,
WAC_HID_FEATURE_REPORT, report_id, WAC_HID_FEATURE_REPORT, report_id,
rep_data, 2); 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); kfree(rep_data);
......
...@@ -1460,6 +1460,9 @@ static const struct wacom_features wacom_features_0xD3 = ...@@ -1460,6 +1460,9 @@ static const struct wacom_features wacom_features_0xD3 =
static const struct wacom_features wacom_features_0xD4 = static const struct wacom_features wacom_features_0xD4 =
{ "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, { "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
63, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 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 = static const struct wacom_features wacom_features_0xD6 =
{ "Wacom BambooPT 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, { "Wacom BambooPT 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023,
63, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 63, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
...@@ -1564,6 +1567,7 @@ const struct usb_device_id wacom_ids[] = { ...@@ -1564,6 +1567,7 @@ const struct usb_device_id wacom_ids[] = {
{ USB_DEVICE_WACOM(0xD2) }, { USB_DEVICE_WACOM(0xD2) },
{ USB_DEVICE_WACOM(0xD3) }, { USB_DEVICE_WACOM(0xD3) },
{ USB_DEVICE_WACOM(0xD4) }, { USB_DEVICE_WACOM(0xD4) },
{ USB_DEVICE_WACOM(0xD5) },
{ USB_DEVICE_WACOM(0xD6) }, { USB_DEVICE_WACOM(0xD6) },
{ USB_DEVICE_WACOM(0xD7) }, { USB_DEVICE_WACOM(0xD7) },
{ USB_DEVICE_WACOM(0xD8) }, { USB_DEVICE_WACOM(0xD8) },
......
...@@ -244,6 +244,7 @@ struct mxt_finger { ...@@ -244,6 +244,7 @@ struct mxt_finger {
int x; int x;
int y; int y;
int area; int area;
int pressure;
}; };
/* Each client has this additional data */ /* Each client has this additional data */
...@@ -536,6 +537,8 @@ static void mxt_input_report(struct mxt_data *data, int single_id) ...@@ -536,6 +537,8 @@ static void mxt_input_report(struct mxt_data *data, int single_id)
finger[id].x); finger[id].x);
input_report_abs(input_dev, ABS_MT_POSITION_Y, input_report_abs(input_dev, ABS_MT_POSITION_Y,
finger[id].y); finger[id].y);
input_report_abs(input_dev, ABS_MT_PRESSURE,
finger[id].pressure);
} else { } else {
finger[id].status = 0; finger[id].status = 0;
} }
...@@ -546,6 +549,8 @@ static void mxt_input_report(struct mxt_data *data, int single_id) ...@@ -546,6 +549,8 @@ static void mxt_input_report(struct mxt_data *data, int single_id)
if (status != MXT_RELEASE) { if (status != MXT_RELEASE) {
input_report_abs(input_dev, ABS_X, finger[single_id].x); 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_Y, finger[single_id].y);
input_report_abs(input_dev,
ABS_PRESSURE, finger[single_id].pressure);
} }
input_sync(input_dev); input_sync(input_dev);
...@@ -560,6 +565,7 @@ static void mxt_input_touchevent(struct mxt_data *data, ...@@ -560,6 +565,7 @@ static void mxt_input_touchevent(struct mxt_data *data,
int x; int x;
int y; int y;
int area; int area;
int pressure;
/* Check the touch is present on the screen */ /* Check the touch is present on the screen */
if (!(status & MXT_DETECT)) { if (!(status & MXT_DETECT)) {
...@@ -584,6 +590,7 @@ static void mxt_input_touchevent(struct mxt_data *data, ...@@ -584,6 +590,7 @@ static void mxt_input_touchevent(struct mxt_data *data,
y = y >> 2; y = y >> 2;
area = message->message[4]; area = message->message[4];
pressure = message->message[5];
dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id, dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id,
status & MXT_MOVE ? "moved" : "pressed", status & MXT_MOVE ? "moved" : "pressed",
...@@ -594,6 +601,7 @@ static void mxt_input_touchevent(struct mxt_data *data, ...@@ -594,6 +601,7 @@ static void mxt_input_touchevent(struct mxt_data *data,
finger[id].x = x; finger[id].x = x;
finger[id].y = y; finger[id].y = y;
finger[id].area = area; finger[id].area = area;
finger[id].pressure = pressure;
mxt_input_report(data, id); mxt_input_report(data, id);
} }
...@@ -1116,6 +1124,8 @@ static int __devinit mxt_probe(struct i2c_client *client, ...@@ -1116,6 +1124,8 @@ static int __devinit mxt_probe(struct i2c_client *client,
0, data->max_x, 0, 0); 0, data->max_x, 0, 0);
input_set_abs_params(input_dev, ABS_Y, input_set_abs_params(input_dev, ABS_Y,
0, data->max_y, 0, 0); 0, data->max_y, 0, 0);
input_set_abs_params(input_dev, ABS_PRESSURE,
0, 255, 0, 0);
/* For multi touch */ /* For multi touch */
input_mt_init_slots(input_dev, MXT_MAX_FINGER); input_mt_init_slots(input_dev, MXT_MAX_FINGER);
...@@ -1125,6 +1135,8 @@ static int __devinit mxt_probe(struct i2c_client *client, ...@@ -1125,6 +1135,8 @@ static int __devinit mxt_probe(struct i2c_client *client,
0, data->max_x, 0, 0); 0, data->max_x, 0, 0);
input_set_abs_params(input_dev, ABS_MT_POSITION_Y, input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
0, data->max_y, 0, 0); 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); input_set_drvdata(input_dev, data);
i2c_set_clientdata(client, data); i2c_set_clientdata(client, data);
......
...@@ -9,7 +9,8 @@ ...@@ -9,7 +9,8 @@
* *
* This program is free software; you can redistribute it and/or modify * 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 * 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 @@ ...@@ -13,6 +13,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/errno.h> #include <linux/errno.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment