diff options
Diffstat (limited to 'drivers/input')
| -rw-r--r-- | drivers/input/joystick/analog.c | 2 | ||||
| -rw-r--r-- | drivers/input/keyboard/adp5588-keys.c | 1 | ||||
| -rw-r--r-- | drivers/input/keyboard/ep93xx_keypad.c | 1 | ||||
| -rw-r--r-- | drivers/input/keyboard/tegra-kbc.c | 2 | ||||
| -rw-r--r-- | drivers/input/misc/ad714x-i2c.c | 69 | ||||
| -rw-r--r-- | drivers/input/misc/ad714x-spi.c | 68 | ||||
| -rw-r--r-- | drivers/input/misc/ad714x.c | 114 | ||||
| -rw-r--r-- | drivers/input/misc/ad714x.h | 35 | ||||
| -rw-r--r-- | drivers/input/misc/cm109.c | 2 | ||||
| -rw-r--r-- | drivers/input/misc/mma8450.c | 2 | ||||
| -rw-r--r-- | drivers/input/misc/mpu3050.c | 2 | ||||
| -rw-r--r-- | drivers/input/misc/rotary_encoder.c | 2 | ||||
| -rw-r--r-- | drivers/input/mouse/bcm5974.c | 60 | ||||
| -rw-r--r-- | drivers/input/tablet/wacom_sys.c | 31 | ||||
| -rw-r--r-- | drivers/input/tablet/wacom_wac.c | 56 | ||||
| -rw-r--r-- | drivers/input/touchscreen/atmel_mxt_ts.c | 12 | ||||
| -rw-r--r-- | drivers/input/touchscreen/max11801_ts.c | 3 | ||||
| -rw-r--r-- | drivers/input/touchscreen/tnetv107x-ts.c | 1 | ||||
| -rw-r--r-- | drivers/input/touchscreen/wacom_w8001.c | 2 | 
19 files changed, 295 insertions, 170 deletions
diff --git a/drivers/input/joystick/analog.c b/drivers/input/joystick/analog.c index 9882971827e..358cd7ee905 100644 --- a/drivers/input/joystick/analog.c +++ b/drivers/input/joystick/analog.c @@ -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)  { diff --git a/drivers/input/keyboard/adp5588-keys.c b/drivers/input/keyboard/adp5588-keys.c index 7b404e5443e..e34eeb8ae37 100644 --- a/drivers/input/keyboard/adp5588-keys.c +++ b/drivers/input/keyboard/adp5588-keys.c @@ -668,4 +668,3 @@ module_exit(adp5588_exit);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");  MODULE_DESCRIPTION("ADP5588/87 Keypad driver"); -MODULE_ALIAS("platform:adp5588-keys"); diff --git a/drivers/input/keyboard/ep93xx_keypad.c b/drivers/input/keyboard/ep93xx_keypad.c index c8242dd190d..aa17e024d80 100644 --- a/drivers/input/keyboard/ep93xx_keypad.c +++ b/drivers/input/keyboard/ep93xx_keypad.c @@ -20,6 +20,7 @@   * flag.   */ +#include <linux/module.h>  #include <linux/platform_device.h>  #include <linux/interrupt.h>  #include <linux/clk.h> diff --git a/drivers/input/keyboard/tegra-kbc.c b/drivers/input/keyboard/tegra-kbc.c index f270447ba95..a5a77915c65 100644 --- a/drivers/input/keyboard/tegra-kbc.c +++ b/drivers/input/keyboard/tegra-kbc.c @@ -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; diff --git a/drivers/input/misc/ad714x-i2c.c b/drivers/input/misc/ad714x-i2c.c index e21deb1baa8..025417d74ca 100644 --- a/drivers/input/misc/ad714x-i2c.c +++ b/drivers/input/misc/ad714x-i2c.c @@ -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"); +	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 device *dev, unsigned short reg, -				unsigned short *data) +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(dev); -	int ret = 0; -	u8 *_reg = (u8 *)® -	u8 *_data = (u8 *)data; +	struct i2c_client *client = to_i2c_client(chip->dev); +	int i; +	int error; -	u8 tx[2] = { -		_reg[1], -		_reg[0] -	}; -	u8 rx[2]; +	chip->xfer_buf[0] = cpu_to_be16(reg); -	ret = i2c_master_send(client, tx, 2); -	if (ret >= 0) -		ret = i2c_master_recv(client, rx, 2); +	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(ret < 0)) { -		dev_err(&client->dev, "I2C read error\n"); -	} else { -		_data[0] = rx[1]; -		_data[1] = rx[0]; +	if (unlikely(error < 0)) { +		dev_err(&client->dev, "I2C read error: %d\n", error); +		return error;  	} -	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, diff --git a/drivers/input/misc/ad714x-spi.c b/drivers/input/misc/ad714x-spi.c index 4120dd54930..875b5081136 100644 --- a/drivers/input/misc/ad714x-spi.c +++ b/drivers/input/misc/ad714x-spi.c @@ -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; + +	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)  {  	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); diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c index c3a62c42cd2..ca42c7d2a3c 100644 --- a/drivers/input/misc/ad714x.c +++ b/drivers/input/misc/ad714x.c @@ -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; +	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); -		ad714x->sensor_val[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)  	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); diff --git a/drivers/input/misc/ad714x.h b/drivers/input/misc/ad714x.h index 45c54fb13f0..3c85455aa66 100644 --- a/drivers/input/misc/ad714x.h +++ b/drivers/input/misc/ad714x.h @@ -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); diff --git a/drivers/input/misc/cm109.c b/drivers/input/misc/cm109.c index b09c7d12721..ab860511f01 100644 --- a/drivers/input/misc/cm109.c +++ b/drivers/input/misc/cm109.c @@ -475,7 +475,7 @@ static void cm109_toggle_buzzer_sync(struct cm109_dev *dev, int on)  				le16_to_cpu(dev->ctl_req->wIndex),  				dev->ctl_data,  				USB_PKT_LEN, USB_CTRL_SET_TIMEOUT); -	if (error && error != EINTR) +	if (error < 0 && error != -EINTR)  		err("%s: usb_control_msg() failed %d", __func__, error);  } diff --git a/drivers/input/misc/mma8450.c b/drivers/input/misc/mma8450.c index 6c76cf79299..0794778295f 100644 --- a/drivers/input/misc/mma8450.c +++ b/drivers/input/misc/mma8450.c @@ -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 = { diff --git a/drivers/input/misc/mpu3050.c b/drivers/input/misc/mpu3050.c index b95fac15b2e..f71dc728da5 100644 --- a/drivers/input/misc/mpu3050.c +++ b/drivers/input/misc/mpu3050.c @@ -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;  } diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c index 2c8b84dd9da..2be21694fac 100644 --- a/drivers/input/misc/rotary_encoder.c +++ b/drivers/input/misc/rotary_encoder.c @@ -7,7 +7,7 @@   * state machine code inspired by code from Tim Ruetz   *   * A generic driver for rotary encoders connected to GPIO lines. - * See file:Documentation/input/rotary_encoder.txt for more information + * See file:Documentation/input/rotary-encoder.txt for more information   *   * 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 diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c index 3126983c004..5ec617e28f7 100644 --- a/drivers/input/mouse/bcm5974.c +++ b/drivers/input/mouse/bcm5974.c @@ -67,6 +67,18 @@  #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,1 (unibody, July 2011) */ +#define USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI	0x0249 +#define USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO	0x024a +#define USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS	0x024b +/* 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 +116,18 @@ 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,1 */ +	BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI), +	BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO), +	BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6A_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 +318,42 @@ 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 } +	}, +	{ +		USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI, +		USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO, +		USB_DEVICE_ID_APPLE_WELLSPRING6A_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 } +	},  	{}  }; diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 449c0a46dba..958b4eb6369 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c @@ -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) @@ -228,13 +229,6 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi  							get_unaligned_le16(&report[i + 3]);  						i += 4;  					} -				} else if (usage == WCM_DIGITIZER) { -					/* max pressure isn't reported -					features->pressure_max = (unsigned short) -							(report[i+4] << 8  | report[i + 3]); -					*/ -					features->pressure_max = 255; -					i += 4;  				}  				break; @@ -290,13 +284,6 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi  				pen = 1;  				i++;  				break; - -			case HID_USAGE_UNDEFINED: -				if (usage == WCM_DESKTOP && finger) /* capacity */ -					features->pressure_max = -						get_unaligned_le16(&report[i + 3]); -				i += 4; -				break;  			}  			break; @@ -319,24 +306,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 +336,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); diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 03ebcc8b24b..9dea71849f4 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c @@ -800,25 +800,26 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)  	int i;  	for (i = 0; i < 2; i++) { -		int p = data[9 * i + 2]; -		bool touch = p && !wacom->shared->stylus_in_proximity; +		int offset = (data[1] & 0x80) ? (8 * i) : (9 * i); +		bool touch = data[offset + 3] & 0x80; -		input_mt_slot(input, i); -		input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);  		/*  		 * Touch events need to be disabled while stylus is  		 * in proximity because user's hand is resting on touchpad  		 * and sending unwanted events.  User expects tablet buttons  		 * to continue working though.  		 */ +		touch = touch && !wacom->shared->stylus_in_proximity; + +		input_mt_slot(input, i); +		input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);  		if (touch) { -			int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff; -			int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff; +			int x = get_unaligned_be16(&data[offset + 3]) & 0x7ff; +			int y = get_unaligned_be16(&data[offset + 5]) & 0x7ff;  			if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) {  				x <<= 5;  				y <<= 5;  			} -			input_report_abs(input, ABS_MT_PRESSURE, p);  			input_report_abs(input, ABS_MT_POSITION_X, x);  			input_report_abs(input, ABS_MT_POSITION_Y, y);  		} @@ -1056,10 +1057,11 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,  			     features->x_fuzz, 0);  	input_set_abs_params(input_dev, ABS_Y, 0, features->y_max,  			     features->y_fuzz, 0); -	input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, -			     features->pressure_fuzz, 0);  	if (features->device_type == BTN_TOOL_PEN) { +		input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, +			     features->pressure_fuzz, 0); +  		/* penabled devices have fixed resolution for each model */  		input_abs_set_res(input_dev, ABS_X, features->x_resolution);  		input_abs_set_res(input_dev, ABS_Y, features->y_resolution); @@ -1098,6 +1100,8 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,  		__set_bit(BTN_TOOL_MOUSE, input_dev->keybit);  		__set_bit(BTN_STYLUS, input_dev->keybit);  		__set_bit(BTN_STYLUS2, input_dev->keybit); + +		__set_bit(INPUT_PROP_POINTER, input_dev->propbit);  		break;  	case WACOM_21UX2: @@ -1120,12 +1124,12 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,  		for (i = 0; i < 8; i++)  			__set_bit(BTN_0 + i, input_dev->keybit); -		if (wacom_wac->features.type != WACOM_21UX2) { -			input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); -			input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); -		} - +		input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); +		input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);  		input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); + +		__set_bit(INPUT_PROP_DIRECT, input_dev->propbit); +  		wacom_setup_cintiq(wacom_wac);  		break; @@ -1150,6 +1154,8 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,  		/* fall through */  	case INTUOS: +		__set_bit(INPUT_PROP_POINTER, input_dev->propbit); +  		wacom_setup_intuos(wacom_wac);  		break; @@ -1165,6 +1171,8 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,  		input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);  		wacom_setup_intuos(wacom_wac); + +		__set_bit(INPUT_PROP_POINTER, input_dev->propbit);  		break;  	case TABLETPC2FG: @@ -1183,26 +1191,40 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,  	case TABLETPC:  		__clear_bit(ABS_MISC, input_dev->absbit); +		__set_bit(INPUT_PROP_DIRECT, input_dev->propbit); +  		if (features->device_type != BTN_TOOL_PEN)  			break;  /* no need to process stylus stuff */  		/* fall through */  	case PL: -	case PTU:  	case DTU:  		__set_bit(BTN_TOOL_PEN, input_dev->keybit); +		__set_bit(BTN_TOOL_RUBBER, input_dev->keybit);  		__set_bit(BTN_STYLUS, input_dev->keybit);  		__set_bit(BTN_STYLUS2, input_dev->keybit); + +		__set_bit(INPUT_PROP_DIRECT, input_dev->propbit); +		break; + +	case PTU: +		__set_bit(BTN_STYLUS2, input_dev->keybit);  		/* fall through */  	case PENPARTNER: +		__set_bit(BTN_TOOL_PEN, input_dev->keybit);  		__set_bit(BTN_TOOL_RUBBER, input_dev->keybit); +		__set_bit(BTN_STYLUS, input_dev->keybit); + +		__set_bit(INPUT_PROP_POINTER, input_dev->propbit);  		break;  	case BAMBOO_PT:  		__clear_bit(ABS_MISC, input_dev->absbit); +		__set_bit(INPUT_PROP_POINTER, input_dev->propbit); +  		if (features->device_type == BTN_TOOL_DOUBLETAP) {  			__set_bit(BTN_LEFT, input_dev->keybit);  			__set_bit(BTN_FORWARD, input_dev->keybit); @@ -1460,6 +1482,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 +1589,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) }, diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index ae00604a6a8..f5d66859f23 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -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); diff --git a/drivers/input/touchscreen/max11801_ts.c b/drivers/input/touchscreen/max11801_ts.c index 4f2713d9279..4627fe55b40 100644 --- a/drivers/input/touchscreen/max11801_ts.c +++ b/drivers/input/touchscreen/max11801_ts.c @@ -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.   */  /* diff --git a/drivers/input/touchscreen/tnetv107x-ts.c b/drivers/input/touchscreen/tnetv107x-ts.c index 089b0a0f3d8..0e8f63e5b36 100644 --- a/drivers/input/touchscreen/tnetv107x-ts.c +++ b/drivers/input/touchscreen/tnetv107x-ts.c @@ -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> diff --git a/drivers/input/touchscreen/wacom_w8001.c b/drivers/input/touchscreen/wacom_w8001.c index c14412ef464..9941d39df43 100644 --- a/drivers/input/touchscreen/wacom_w8001.c +++ b/drivers/input/touchscreen/wacom_w8001.c @@ -383,6 +383,8 @@ static int w8001_setup(struct w8001 *w8001)  	dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);  	strlcat(w8001->name, "Wacom Serial", sizeof(w8001->name)); +	__set_bit(INPUT_PROP_DIRECT, dev->propbit); +  	/* penabled? */  	error = w8001_command(w8001, W8001_CMD_QUERY, true);  	if (!error) {  |