Merge tag 'v3.13-rc4' into next
Synchronize with mainline to bring in the new keycode definitions and new hwmon API.
This commit is contained in:
@@ -422,14 +422,15 @@ static struct gameport *gameport_get_pending_child(struct gameport *parent)
|
||||
* Gameport port operations
|
||||
*/
|
||||
|
||||
static ssize_t gameport_show_description(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t gameport_description_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gameport *gameport = to_gameport_port(dev);
|
||||
|
||||
return sprintf(buf, "%s\n", gameport->name);
|
||||
}
|
||||
static DEVICE_ATTR(description, S_IRUGO, gameport_description_show, NULL);
|
||||
|
||||
static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
static ssize_t drvctl_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
struct gameport *gameport = to_gameport_port(dev);
|
||||
struct device_driver *drv;
|
||||
@@ -457,12 +458,14 @@ static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribut
|
||||
|
||||
return error ? error : count;
|
||||
}
|
||||
static DEVICE_ATTR_WO(drvctl);
|
||||
|
||||
static struct device_attribute gameport_device_attrs[] = {
|
||||
__ATTR(description, S_IRUGO, gameport_show_description, NULL),
|
||||
__ATTR(drvctl, S_IWUSR, NULL, gameport_rebind_driver),
|
||||
__ATTR_NULL
|
||||
static struct attribute *gameport_device_attrs[] = {
|
||||
&dev_attr_description.attr,
|
||||
&dev_attr_drvctl.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(gameport_device);
|
||||
|
||||
static void gameport_release_port(struct device *dev)
|
||||
{
|
||||
@@ -750,7 +753,7 @@ static int gameport_bus_match(struct device *dev, struct device_driver *drv)
|
||||
|
||||
static struct bus_type gameport_bus = {
|
||||
.name = "gameport",
|
||||
.dev_attrs = gameport_device_attrs,
|
||||
.dev_groups = gameport_device_groups,
|
||||
.drv_groups = gameport_driver_groups,
|
||||
.match = gameport_bus_match,
|
||||
.probe = gameport_driver_probe,
|
||||
|
||||
@@ -1734,6 +1734,7 @@ EXPORT_SYMBOL_GPL(input_class);
|
||||
*/
|
||||
struct input_dev *input_allocate_device(void)
|
||||
{
|
||||
static atomic_t input_no = ATOMIC_INIT(0);
|
||||
struct input_dev *dev;
|
||||
|
||||
dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL);
|
||||
@@ -1743,9 +1744,13 @@ struct input_dev *input_allocate_device(void)
|
||||
device_initialize(&dev->dev);
|
||||
mutex_init(&dev->mutex);
|
||||
spin_lock_init(&dev->event_lock);
|
||||
init_timer(&dev->timer);
|
||||
INIT_LIST_HEAD(&dev->h_list);
|
||||
INIT_LIST_HEAD(&dev->node);
|
||||
|
||||
dev_set_name(&dev->dev, "input%ld",
|
||||
(unsigned long) atomic_inc_return(&input_no) - 1);
|
||||
|
||||
__module_get(THIS_MODULE);
|
||||
}
|
||||
|
||||
@@ -2019,7 +2024,6 @@ static void devm_input_device_unregister(struct device *dev, void *res)
|
||||
*/
|
||||
int input_register_device(struct input_dev *dev)
|
||||
{
|
||||
static atomic_t input_no = ATOMIC_INIT(0);
|
||||
struct input_devres *devres = NULL;
|
||||
struct input_handler *handler;
|
||||
unsigned int packet_size;
|
||||
@@ -2059,7 +2063,6 @@ int input_register_device(struct input_dev *dev)
|
||||
* If delay and period are pre-set by the driver, then autorepeating
|
||||
* is handled by the driver itself and we don't do it in input.c.
|
||||
*/
|
||||
init_timer(&dev->timer);
|
||||
if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {
|
||||
dev->timer.data = (long) dev;
|
||||
dev->timer.function = input_repeat_key;
|
||||
@@ -2073,9 +2076,6 @@ int input_register_device(struct input_dev *dev)
|
||||
if (!dev->setkeycode)
|
||||
dev->setkeycode = input_default_setkeycode;
|
||||
|
||||
dev_set_name(&dev->dev, "input%ld",
|
||||
(unsigned long) atomic_inc_return(&input_no) - 1);
|
||||
|
||||
error = device_add(&dev->dev);
|
||||
if (error)
|
||||
goto err_free_vals;
|
||||
|
||||
@@ -538,7 +538,8 @@ static int adp5588_probe(struct i2c_client *client,
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
|
||||
for (i = 0; i < input->keycodemax; i++)
|
||||
__set_bit(kpad->keycode[i] & KEY_MAX, input->keybit);
|
||||
if (kpad->keycode[i] <= KEY_MAX)
|
||||
__set_bit(kpad->keycode[i], input->keybit);
|
||||
__clear_bit(KEY_RESERVED, input->keybit);
|
||||
|
||||
if (kpad->gpimapsize)
|
||||
|
||||
@@ -992,7 +992,8 @@ static int adp5589_probe(struct i2c_client *client,
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
|
||||
for (i = 0; i < input->keycodemax; i++)
|
||||
__set_bit(kpad->keycode[i] & KEY_MAX, input->keybit);
|
||||
if (kpad->keycode[i] <= KEY_MAX)
|
||||
__set_bit(kpad->keycode[i], input->keybit);
|
||||
__clear_bit(KEY_RESERVED, input->keybit);
|
||||
|
||||
if (kpad->gpimapsize)
|
||||
|
||||
@@ -289,7 +289,8 @@ static int bfin_kpad_probe(struct platform_device *pdev)
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
|
||||
for (i = 0; i < input->keycodemax; i++)
|
||||
__set_bit(bf54x_kpad->keycode[i] & KEY_MAX, input->keybit);
|
||||
if (bf54x_kpad->keycode[i] <= KEY_MAX)
|
||||
__set_bit(bf54x_kpad->keycode[i], input->keybit);
|
||||
__clear_bit(KEY_RESERVED, input->keybit);
|
||||
|
||||
error = input_register_device(input);
|
||||
|
||||
@@ -787,10 +787,17 @@ static int pxa27x_keypad_probe(struct platform_device *pdev)
|
||||
input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
|
||||
input_set_capability(input_dev, EV_MSC, MSC_SCAN);
|
||||
|
||||
if (pdata)
|
||||
if (pdata) {
|
||||
error = pxa27x_keypad_build_keycode(keypad);
|
||||
else
|
||||
} else {
|
||||
error = pxa27x_keypad_build_keycode_from_dt(keypad);
|
||||
/*
|
||||
* Data that we get from DT resides in dynamically
|
||||
* allocated memory so we need to update our pdata
|
||||
* pointer.
|
||||
*/
|
||||
pdata = keypad->pdata;
|
||||
}
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "failed to build keycode\n");
|
||||
goto failed_put_clk;
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
|
||||
/* ORIENT ADXL346 only */
|
||||
#define ADXL346_2D_VALID (1 << 6)
|
||||
#define ADXL346_2D_ORIENT(x) (((x) & 0x3) >> 4)
|
||||
#define ADXL346_2D_ORIENT(x) (((x) & 0x30) >> 4)
|
||||
#define ADXL346_3D_VALID (1 << 3)
|
||||
#define ADXL346_3D_ORIENT(x) ((x) & 0x7)
|
||||
#define ADXL346_2D_PORTRAIT_POS 0 /* +X */
|
||||
|
||||
@@ -351,7 +351,9 @@ static void cm109_urb_irq_callback(struct urb *urb)
|
||||
if (status) {
|
||||
if (status == -ESHUTDOWN)
|
||||
return;
|
||||
dev_err(&dev->intf->dev, "%s: urb status %d\n", __func__, status);
|
||||
dev_err_ratelimited(&dev->intf->dev, "%s: urb status %d\n",
|
||||
__func__, status);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Special keys */
|
||||
@@ -418,8 +420,12 @@ static void cm109_urb_ctl_callback(struct urb *urb)
|
||||
dev->ctl_data->byte[2],
|
||||
dev->ctl_data->byte[3]);
|
||||
|
||||
if (status)
|
||||
dev_err(&dev->intf->dev, "%s: urb status %d\n", __func__, status);
|
||||
if (status) {
|
||||
if (status == -ESHUTDOWN)
|
||||
return;
|
||||
dev_err_ratelimited(&dev->intf->dev, "%s: urb status %d\n",
|
||||
__func__, status);
|
||||
}
|
||||
|
||||
spin_lock(&dev->ctl_submit_lock);
|
||||
|
||||
@@ -427,7 +433,7 @@ static void cm109_urb_ctl_callback(struct urb *urb)
|
||||
|
||||
if (likely(!dev->shutdown)) {
|
||||
|
||||
if (dev->buzzer_pending) {
|
||||
if (dev->buzzer_pending || status) {
|
||||
dev->buzzer_pending = 0;
|
||||
dev->ctl_urb_pending = 1;
|
||||
cm109_submit_buzz_toggle(dev);
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
|
||||
@@ -35,15 +36,12 @@ static void ixp4xx_spkr_control(unsigned int pin, unsigned int count)
|
||||
|
||||
spin_lock_irqsave(&beep_lock, flags);
|
||||
|
||||
if (count) {
|
||||
gpio_line_config(pin, IXP4XX_GPIO_OUT);
|
||||
gpio_line_set(pin, IXP4XX_GPIO_LOW);
|
||||
|
||||
if (count) {
|
||||
gpio_direction_output(pin, 0);
|
||||
*IXP4XX_OSRT2 = (count & ~IXP4XX_OST_RELOAD_MASK) | IXP4XX_OST_ENABLE;
|
||||
} else {
|
||||
gpio_line_config(pin, IXP4XX_GPIO_IN);
|
||||
gpio_line_set(pin, IXP4XX_GPIO_HIGH);
|
||||
|
||||
gpio_direction_output(pin, 1);
|
||||
gpio_direction_input(pin);
|
||||
*IXP4XX_OSRT2 = 0;
|
||||
}
|
||||
|
||||
@@ -78,11 +76,13 @@ static int ixp4xx_spkr_event(struct input_dev *dev, unsigned int type, unsigned
|
||||
|
||||
static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
unsigned int pin = (unsigned int) dev_id;
|
||||
|
||||
/* clear interrupt */
|
||||
*IXP4XX_OSST = IXP4XX_OSST_TIMER_2_PEND;
|
||||
|
||||
/* flip the beeper output */
|
||||
*IXP4XX_GPIO_GPOUTR ^= (1 << (unsigned int) dev_id);
|
||||
gpio_set_value(pin, !gpio_get_value(pin));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -110,11 +110,15 @@ static int ixp4xx_spkr_probe(struct platform_device *dev)
|
||||
input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE);
|
||||
input_dev->event = ixp4xx_spkr_event;
|
||||
|
||||
err = gpio_request(dev->id, "ixp4-beeper");
|
||||
if (err)
|
||||
goto err_free_device;
|
||||
|
||||
err = request_irq(IRQ_IXP4XX_TIMER2, &ixp4xx_spkr_interrupt,
|
||||
IRQF_NO_SUSPEND, "ixp4xx-beeper",
|
||||
(void *) dev->id);
|
||||
if (err)
|
||||
goto err_free_device;
|
||||
goto err_free_gpio;
|
||||
|
||||
err = input_register_device(input_dev);
|
||||
if (err)
|
||||
@@ -126,6 +130,8 @@ static int ixp4xx_spkr_probe(struct platform_device *dev)
|
||||
|
||||
err_free_irq:
|
||||
free_irq(IRQ_IXP4XX_TIMER2, (void *)dev->id);
|
||||
err_free_gpio:
|
||||
gpio_free(dev->id);
|
||||
err_free_device:
|
||||
input_free_device(input_dev);
|
||||
|
||||
@@ -144,6 +150,7 @@ static int ixp4xx_spkr_remove(struct platform_device *dev)
|
||||
ixp4xx_spkr_control(pin, 0);
|
||||
|
||||
free_irq(IRQ_IXP4XX_TIMER2, (void *)dev->id);
|
||||
gpio_free(dev->id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -113,9 +113,12 @@ static int pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_i
|
||||
idev->keycodemax = ARRAY_SIZE(lp->btncode);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(pcf8574_kp_btncode); i++) {
|
||||
lp->btncode[i] = pcf8574_kp_btncode[i];
|
||||
__set_bit(lp->btncode[i] & KEY_MAX, idev->keybit);
|
||||
if (lp->btncode[i] <= KEY_MAX) {
|
||||
lp->btncode[i] = pcf8574_kp_btncode[i];
|
||||
__set_bit(lp->btncode[i], idev->keybit);
|
||||
}
|
||||
}
|
||||
__clear_bit(KEY_RESERVED, idev->keybit);
|
||||
|
||||
sprintf(lp->name, DRV_NAME);
|
||||
sprintf(lp->phys, "kp_data/input0");
|
||||
|
||||
+203
-3
@@ -70,6 +70,25 @@ static const struct alps_nibble_commands alps_v4_nibble_commands[] = {
|
||||
{ PSMOUSE_CMD_SETSCALE11, 0x00 }, /* f */
|
||||
};
|
||||
|
||||
static const struct alps_nibble_commands alps_v6_nibble_commands[] = {
|
||||
{ PSMOUSE_CMD_ENABLE, 0x00 }, /* 0 */
|
||||
{ PSMOUSE_CMD_SETRATE, 0x0a }, /* 1 */
|
||||
{ PSMOUSE_CMD_SETRATE, 0x14 }, /* 2 */
|
||||
{ PSMOUSE_CMD_SETRATE, 0x28 }, /* 3 */
|
||||
{ PSMOUSE_CMD_SETRATE, 0x3c }, /* 4 */
|
||||
{ PSMOUSE_CMD_SETRATE, 0x50 }, /* 5 */
|
||||
{ PSMOUSE_CMD_SETRATE, 0x64 }, /* 6 */
|
||||
{ PSMOUSE_CMD_SETRATE, 0xc8 }, /* 7 */
|
||||
{ PSMOUSE_CMD_GETID, 0x00 }, /* 8 */
|
||||
{ PSMOUSE_CMD_GETINFO, 0x00 }, /* 9 */
|
||||
{ PSMOUSE_CMD_SETRES, 0x00 }, /* a */
|
||||
{ PSMOUSE_CMD_SETRES, 0x01 }, /* b */
|
||||
{ PSMOUSE_CMD_SETRES, 0x02 }, /* c */
|
||||
{ PSMOUSE_CMD_SETRES, 0x03 }, /* d */
|
||||
{ PSMOUSE_CMD_SETSCALE21, 0x00 }, /* e */
|
||||
{ PSMOUSE_CMD_SETSCALE11, 0x00 }, /* f */
|
||||
};
|
||||
|
||||
|
||||
#define ALPS_DUALPOINT 0x02 /* touchpad has trackstick */
|
||||
#define ALPS_PASS 0x04 /* device has a pass-through port */
|
||||
@@ -103,6 +122,7 @@ static const struct alps_model_info alps_model_data[] = {
|
||||
/* Dell Latitude E5500, E6400, E6500, Precision M4400 */
|
||||
{ { 0x62, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xcf, 0xcf,
|
||||
ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED },
|
||||
{ { 0x73, 0x00, 0x14 }, 0x00, ALPS_PROTO_V6, 0xff, 0xff, ALPS_DUALPOINT }, /* Dell XT2 */
|
||||
{ { 0x73, 0x02, 0x50 }, 0x00, ALPS_PROTO_V2, 0xcf, 0xcf, ALPS_FOUR_BUTTONS }, /* Dell Vostro 1400 */
|
||||
{ { 0x52, 0x01, 0x14 }, 0x00, ALPS_PROTO_V2, 0xff, 0xff,
|
||||
ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, /* Toshiba Tecra A11-11L */
|
||||
@@ -645,6 +665,76 @@ static void alps_process_packet_v3(struct psmouse *psmouse)
|
||||
alps_process_touchpad_packet_v3(psmouse);
|
||||
}
|
||||
|
||||
static void alps_process_packet_v6(struct psmouse *psmouse)
|
||||
{
|
||||
struct alps_data *priv = psmouse->private;
|
||||
unsigned char *packet = psmouse->packet;
|
||||
struct input_dev *dev = psmouse->dev;
|
||||
struct input_dev *dev2 = priv->dev2;
|
||||
int x, y, z, left, right, middle;
|
||||
|
||||
/*
|
||||
* We can use Byte5 to distinguish if the packet is from Touchpad
|
||||
* or Trackpoint.
|
||||
* Touchpad: 0 - 0x7E
|
||||
* Trackpoint: 0x7F
|
||||
*/
|
||||
if (packet[5] == 0x7F) {
|
||||
/* It should be a DualPoint when received Trackpoint packet */
|
||||
if (!(priv->flags & ALPS_DUALPOINT))
|
||||
return;
|
||||
|
||||
/* Trackpoint packet */
|
||||
x = packet[1] | ((packet[3] & 0x20) << 2);
|
||||
y = packet[2] | ((packet[3] & 0x40) << 1);
|
||||
z = packet[4];
|
||||
left = packet[3] & 0x01;
|
||||
right = packet[3] & 0x02;
|
||||
middle = packet[3] & 0x04;
|
||||
|
||||
/* To prevent the cursor jump when finger lifted */
|
||||
if (x == 0x7F && y == 0x7F && z == 0x7F)
|
||||
x = y = z = 0;
|
||||
|
||||
/* Divide 4 since trackpoint's speed is too fast */
|
||||
input_report_rel(dev2, REL_X, (char)x / 4);
|
||||
input_report_rel(dev2, REL_Y, -((char)y / 4));
|
||||
|
||||
input_report_key(dev2, BTN_LEFT, left);
|
||||
input_report_key(dev2, BTN_RIGHT, right);
|
||||
input_report_key(dev2, BTN_MIDDLE, middle);
|
||||
|
||||
input_sync(dev2);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Touchpad packet */
|
||||
x = packet[1] | ((packet[3] & 0x78) << 4);
|
||||
y = packet[2] | ((packet[4] & 0x78) << 4);
|
||||
z = packet[5];
|
||||
left = packet[3] & 0x01;
|
||||
right = packet[3] & 0x02;
|
||||
|
||||
if (z > 30)
|
||||
input_report_key(dev, BTN_TOUCH, 1);
|
||||
if (z < 25)
|
||||
input_report_key(dev, BTN_TOUCH, 0);
|
||||
|
||||
if (z > 0) {
|
||||
input_report_abs(dev, ABS_X, x);
|
||||
input_report_abs(dev, ABS_Y, y);
|
||||
}
|
||||
|
||||
input_report_abs(dev, ABS_PRESSURE, z);
|
||||
input_report_key(dev, BTN_TOOL_FINGER, z > 0);
|
||||
|
||||
/* v6 touchpad does not have middle button */
|
||||
input_report_key(dev, BTN_LEFT, left);
|
||||
input_report_key(dev, BTN_RIGHT, right);
|
||||
|
||||
input_sync(dev);
|
||||
}
|
||||
|
||||
static void alps_process_packet_v4(struct psmouse *psmouse)
|
||||
{
|
||||
struct alps_data *priv = psmouse->private;
|
||||
@@ -897,7 +987,7 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
|
||||
}
|
||||
|
||||
/* Bytes 2 - pktsize should have 0 in the highest bit */
|
||||
if (priv->proto_version != ALPS_PROTO_V5 &&
|
||||
if ((priv->proto_version < ALPS_PROTO_V5) &&
|
||||
psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize &&
|
||||
(psmouse->packet[psmouse->pktcnt - 1] & 0x80)) {
|
||||
psmouse_dbg(psmouse, "refusing packet[%i] = %x\n",
|
||||
@@ -1085,6 +1175,80 @@ static int alps_absolute_mode_v1_v2(struct psmouse *psmouse)
|
||||
return ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETPOLL);
|
||||
}
|
||||
|
||||
static int alps_monitor_mode_send_word(struct psmouse *psmouse, u16 word)
|
||||
{
|
||||
int i, nibble;
|
||||
|
||||
/*
|
||||
* b0-b11 are valid bits, send sequence is inverse.
|
||||
* e.g. when word = 0x0123, nibble send sequence is 3, 2, 1
|
||||
*/
|
||||
for (i = 0; i <= 8; i += 4) {
|
||||
nibble = (word >> i) & 0xf;
|
||||
if (alps_command_mode_send_nibble(psmouse, nibble))
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alps_monitor_mode_write_reg(struct psmouse *psmouse,
|
||||
u16 addr, u16 value)
|
||||
{
|
||||
struct ps2dev *ps2dev = &psmouse->ps2dev;
|
||||
|
||||
/* 0x0A0 is the command to write the word */
|
||||
if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE) ||
|
||||
alps_monitor_mode_send_word(psmouse, 0x0A0) ||
|
||||
alps_monitor_mode_send_word(psmouse, addr) ||
|
||||
alps_monitor_mode_send_word(psmouse, value) ||
|
||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alps_monitor_mode(struct psmouse *psmouse, bool enable)
|
||||
{
|
||||
struct ps2dev *ps2dev = &psmouse->ps2dev;
|
||||
|
||||
if (enable) {
|
||||
/* EC E9 F5 F5 E7 E6 E7 E9 to enter monitor mode */
|
||||
if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) ||
|
||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_GETINFO) ||
|
||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||
|
||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||
|
||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
|
||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) ||
|
||||
ps2_command(ps2dev, NULL, PSMOUSE_CMD_GETINFO))
|
||||
return -1;
|
||||
} else {
|
||||
/* EC to exit monitor mode */
|
||||
if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP))
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alps_absolute_mode_v6(struct psmouse *psmouse)
|
||||
{
|
||||
u16 reg_val = 0x181;
|
||||
int ret = -1;
|
||||
|
||||
/* enter monitor mode, to write the register */
|
||||
if (alps_monitor_mode(psmouse, true))
|
||||
return -1;
|
||||
|
||||
ret = alps_monitor_mode_write_reg(psmouse, 0x000, reg_val);
|
||||
|
||||
if (alps_monitor_mode(psmouse, false))
|
||||
ret = -1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int alps_get_status(struct psmouse *psmouse, char *param)
|
||||
{
|
||||
/* Get status: 0xF5 0xF5 0xF5 0xE9 */
|
||||
@@ -1189,6 +1353,32 @@ static int alps_hw_init_v1_v2(struct psmouse *psmouse)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alps_hw_init_v6(struct psmouse *psmouse)
|
||||
{
|
||||
unsigned char param[2] = {0xC8, 0x14};
|
||||
|
||||
/* Enter passthrough mode to let trackpoint enter 6byte raw mode */
|
||||
if (alps_passthrough_mode_v2(psmouse, true))
|
||||
return -1;
|
||||
|
||||
if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
||||
ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
||||
ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
||||
ps2_command(&psmouse->ps2dev, ¶m[0], PSMOUSE_CMD_SETRATE) ||
|
||||
ps2_command(&psmouse->ps2dev, ¶m[1], PSMOUSE_CMD_SETRATE))
|
||||
return -1;
|
||||
|
||||
if (alps_passthrough_mode_v2(psmouse, false))
|
||||
return -1;
|
||||
|
||||
if (alps_absolute_mode_v6(psmouse)) {
|
||||
psmouse_err(psmouse, "Failed to enable absolute mode\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable or disable passthrough mode to the trackstick.
|
||||
*/
|
||||
@@ -1553,6 +1743,8 @@ static void alps_set_defaults(struct alps_data *priv)
|
||||
priv->hw_init = alps_hw_init_v1_v2;
|
||||
priv->process_packet = alps_process_packet_v1_v2;
|
||||
priv->set_abs_params = alps_set_abs_params_st;
|
||||
priv->x_max = 1023;
|
||||
priv->y_max = 767;
|
||||
break;
|
||||
case ALPS_PROTO_V3:
|
||||
priv->hw_init = alps_hw_init_v3;
|
||||
@@ -1584,6 +1776,14 @@ static void alps_set_defaults(struct alps_data *priv)
|
||||
priv->x_bits = 23;
|
||||
priv->y_bits = 12;
|
||||
break;
|
||||
case ALPS_PROTO_V6:
|
||||
priv->hw_init = alps_hw_init_v6;
|
||||
priv->process_packet = alps_process_packet_v6;
|
||||
priv->set_abs_params = alps_set_abs_params_st;
|
||||
priv->nibble_commands = alps_v6_nibble_commands;
|
||||
priv->x_max = 2047;
|
||||
priv->y_max = 1535;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1705,8 +1905,8 @@ static void alps_disconnect(struct psmouse *psmouse)
|
||||
static void alps_set_abs_params_st(struct alps_data *priv,
|
||||
struct input_dev *dev1)
|
||||
{
|
||||
input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0);
|
||||
input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0);
|
||||
input_set_abs_params(dev1, ABS_X, 0, priv->x_max, 0, 0);
|
||||
input_set_abs_params(dev1, ABS_Y, 0, priv->y_max, 0, 0);
|
||||
}
|
||||
|
||||
static void alps_set_abs_params_mt(struct alps_data *priv,
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#define ALPS_PROTO_V3 3
|
||||
#define ALPS_PROTO_V4 4
|
||||
#define ALPS_PROTO_V5 5
|
||||
#define ALPS_PROTO_V6 6
|
||||
|
||||
/**
|
||||
* struct alps_model_info - touchpad ID table
|
||||
|
||||
@@ -1313,6 +1313,7 @@ static int elantech_set_properties(struct elantech_data *etd)
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
etd->hw_version = 4;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -21,7 +21,7 @@ if SERIO
|
||||
config SERIO_I8042
|
||||
tristate "i8042 PC Keyboard controller"
|
||||
default y
|
||||
depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && \
|
||||
depends on !PARISC && (!ARM || FOOTBRIDGE_HOST) && \
|
||||
(!SUPERH || SH_CAYMAN) && !M68K && !BLACKFIN && !S390 && \
|
||||
!ARC
|
||||
help
|
||||
|
||||
+15
-10
@@ -223,21 +223,26 @@ static int i8042_flush(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned char data, str;
|
||||
int i = 0;
|
||||
int count = 0;
|
||||
int retval = 0;
|
||||
|
||||
spin_lock_irqsave(&i8042_lock, flags);
|
||||
|
||||
while (((str = i8042_read_status()) & I8042_STR_OBF) && (i < I8042_BUFFER_SIZE)) {
|
||||
udelay(50);
|
||||
data = i8042_read_data();
|
||||
i++;
|
||||
dbg("%02x <- i8042 (flush, %s)\n",
|
||||
data, str & I8042_STR_AUXDATA ? "aux" : "kbd");
|
||||
while ((str = i8042_read_status()) & I8042_STR_OBF) {
|
||||
if (count++ < I8042_BUFFER_SIZE) {
|
||||
udelay(50);
|
||||
data = i8042_read_data();
|
||||
dbg("%02x <- i8042 (flush, %s)\n",
|
||||
data, str & I8042_STR_AUXDATA ? "aux" : "kbd");
|
||||
} else {
|
||||
retval = -EIO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&i8042_lock, flags);
|
||||
|
||||
return i;
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -849,7 +854,7 @@ static int __init i8042_check_aux(void)
|
||||
|
||||
static int i8042_controller_check(void)
|
||||
{
|
||||
if (i8042_flush() == I8042_BUFFER_SIZE) {
|
||||
if (i8042_flush()) {
|
||||
pr_err("No controller found\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -1031,7 +1036,7 @@ static void i8042_controller_reset(bool force_reset)
|
||||
/*
|
||||
* i8042_panic_blink() will turn the keyboard LEDs on or off and is called
|
||||
* when kernel panics. Flashing LEDs is useful for users running X who may
|
||||
* not see the console and will help distingushing panics from "real"
|
||||
* not see the console and will help distinguishing panics from "real"
|
||||
* lockups.
|
||||
*
|
||||
* Note that DELAY has a limit of 10ms so we will not get stuck here
|
||||
|
||||
+44
-36
@@ -365,7 +365,7 @@ static ssize_t serio_show_description(struct device *dev, struct device_attribut
|
||||
return sprintf(buf, "%s\n", serio->name);
|
||||
}
|
||||
|
||||
static ssize_t serio_show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct serio *serio = to_serio_port(dev);
|
||||
|
||||
@@ -373,54 +373,31 @@ static ssize_t serio_show_modalias(struct device *dev, struct device_attribute *
|
||||
serio->id.type, serio->id.proto, serio->id.id, serio->id.extra);
|
||||
}
|
||||
|
||||
static ssize_t serio_show_id_type(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t type_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct serio *serio = to_serio_port(dev);
|
||||
return sprintf(buf, "%02x\n", serio->id.type);
|
||||
}
|
||||
|
||||
static ssize_t serio_show_id_proto(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t proto_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct serio *serio = to_serio_port(dev);
|
||||
return sprintf(buf, "%02x\n", serio->id.proto);
|
||||
}
|
||||
|
||||
static ssize_t serio_show_id_id(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t id_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct serio *serio = to_serio_port(dev);
|
||||
return sprintf(buf, "%02x\n", serio->id.id);
|
||||
}
|
||||
|
||||
static ssize_t serio_show_id_extra(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t extra_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct serio *serio = to_serio_port(dev);
|
||||
return sprintf(buf, "%02x\n", serio->id.extra);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(type, S_IRUGO, serio_show_id_type, NULL);
|
||||
static DEVICE_ATTR(proto, S_IRUGO, serio_show_id_proto, NULL);
|
||||
static DEVICE_ATTR(id, S_IRUGO, serio_show_id_id, NULL);
|
||||
static DEVICE_ATTR(extra, S_IRUGO, serio_show_id_extra, NULL);
|
||||
|
||||
static struct attribute *serio_device_id_attrs[] = {
|
||||
&dev_attr_type.attr,
|
||||
&dev_attr_proto.attr,
|
||||
&dev_attr_id.attr,
|
||||
&dev_attr_extra.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group serio_id_attr_group = {
|
||||
.name = "id",
|
||||
.attrs = serio_device_id_attrs,
|
||||
};
|
||||
|
||||
static const struct attribute_group *serio_device_attr_groups[] = {
|
||||
&serio_id_attr_group,
|
||||
NULL
|
||||
};
|
||||
|
||||
static ssize_t serio_rebind_driver(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
static ssize_t drvctl_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
struct serio *serio = to_serio_port(dev);
|
||||
struct device_driver *drv;
|
||||
@@ -474,14 +451,46 @@ static ssize_t serio_set_bind_mode(struct device *dev, struct device_attribute *
|
||||
return retval;
|
||||
}
|
||||
|
||||
static struct device_attribute serio_device_attrs[] = {
|
||||
__ATTR(description, S_IRUGO, serio_show_description, NULL),
|
||||
__ATTR(modalias, S_IRUGO, serio_show_modalias, NULL),
|
||||
__ATTR(drvctl, S_IWUSR, NULL, serio_rebind_driver),
|
||||
__ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode),
|
||||
__ATTR_NULL
|
||||
static DEVICE_ATTR_RO(type);
|
||||
static DEVICE_ATTR_RO(proto);
|
||||
static DEVICE_ATTR_RO(id);
|
||||
static DEVICE_ATTR_RO(extra);
|
||||
|
||||
static struct attribute *serio_device_id_attrs[] = {
|
||||
&dev_attr_type.attr,
|
||||
&dev_attr_proto.attr,
|
||||
&dev_attr_id.attr,
|
||||
&dev_attr_extra.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group serio_id_attr_group = {
|
||||
.name = "id",
|
||||
.attrs = serio_device_id_attrs,
|
||||
};
|
||||
|
||||
static DEVICE_ATTR_RO(modalias);
|
||||
static DEVICE_ATTR_WO(drvctl);
|
||||
static DEVICE_ATTR(description, S_IRUGO, serio_show_description, NULL);
|
||||
static DEVICE_ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode);
|
||||
|
||||
static struct attribute *serio_device_attrs[] = {
|
||||
&dev_attr_modalias.attr,
|
||||
&dev_attr_description.attr,
|
||||
&dev_attr_drvctl.attr,
|
||||
&dev_attr_bind_mode.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group serio_device_attr_group = {
|
||||
.attrs = serio_device_attrs,
|
||||
};
|
||||
|
||||
static const struct attribute_group *serio_device_attr_groups[] = {
|
||||
&serio_id_attr_group,
|
||||
&serio_device_attr_group,
|
||||
NULL
|
||||
};
|
||||
|
||||
static void serio_release_port(struct device *dev)
|
||||
{
|
||||
@@ -996,7 +1005,6 @@ EXPORT_SYMBOL(serio_interrupt);
|
||||
|
||||
static struct bus_type serio_bus = {
|
||||
.name = "serio",
|
||||
.dev_attrs = serio_device_attrs,
|
||||
.drv_groups = serio_driver_groups,
|
||||
.match = serio_bus_match,
|
||||
.uevent = serio_uevent,
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#define DRIVER_NAME "xilinx_ps2"
|
||||
@@ -235,12 +236,12 @@ static void sxps2_close(struct serio *pserio)
|
||||
*/
|
||||
static int xps2_of_probe(struct platform_device *ofdev)
|
||||
{
|
||||
struct resource r_irq; /* Interrupt resources */
|
||||
struct resource r_mem; /* IO mem resources */
|
||||
struct xps2data *drvdata;
|
||||
struct serio *serio;
|
||||
struct device *dev = &ofdev->dev;
|
||||
resource_size_t remap_size, phys_addr;
|
||||
unsigned int irq;
|
||||
int error;
|
||||
|
||||
dev_info(dev, "Device Tree Probing \'%s\'\n",
|
||||
@@ -254,7 +255,8 @@ static int xps2_of_probe(struct platform_device *ofdev)
|
||||
}
|
||||
|
||||
/* Get IRQ for the device */
|
||||
if (!of_irq_to_resource(ofdev->dev.of_node, 0, &r_irq)) {
|
||||
irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
|
||||
if (!irq) {
|
||||
dev_err(dev, "no IRQ found\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -267,7 +269,7 @@ static int xps2_of_probe(struct platform_device *ofdev)
|
||||
}
|
||||
|
||||
spin_lock_init(&drvdata->lock);
|
||||
drvdata->irq = r_irq.start;
|
||||
drvdata->irq = irq;
|
||||
drvdata->serio = serio;
|
||||
drvdata->dev = dev;
|
||||
|
||||
|
||||
@@ -1041,6 +1041,7 @@ static void wacom_destroy_leds(struct wacom *wacom)
|
||||
}
|
||||
|
||||
static enum power_supply_property wacom_battery_props[] = {
|
||||
POWER_SUPPLY_PROP_SCOPE,
|
||||
POWER_SUPPLY_PROP_CAPACITY
|
||||
};
|
||||
|
||||
@@ -1052,6 +1053,9 @@ static int wacom_battery_get_property(struct power_supply *psy,
|
||||
int ret = 0;
|
||||
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_SCOPE:
|
||||
val->intval = POWER_SUPPLY_SCOPE_DEVICE;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CAPACITY:
|
||||
val->intval =
|
||||
wacom->wacom_wac.battery_capacity * 100 / 31;
|
||||
|
||||
@@ -2143,6 +2143,12 @@ static const struct wacom_features wacom_features_0x101 =
|
||||
static const struct wacom_features wacom_features_0x10D =
|
||||
{ "Wacom ISDv4 10D", WACOM_PKGLEN_MTTPC, 26202, 16325, 255,
|
||||
0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
static const struct wacom_features wacom_features_0x10E =
|
||||
{ "Wacom ISDv4 10E", WACOM_PKGLEN_MTTPC, 27760, 15694, 255,
|
||||
0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
static const struct wacom_features wacom_features_0x10F =
|
||||
{ "Wacom ISDv4 10F", WACOM_PKGLEN_MTTPC, 27760, 15694, 255,
|
||||
0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
static const struct wacom_features wacom_features_0x4001 =
|
||||
{ "Wacom ISDv4 4001", WACOM_PKGLEN_MTTPC, 26202, 16325, 255,
|
||||
0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
@@ -2355,6 +2361,8 @@ const struct usb_device_id wacom_ids[] = {
|
||||
{ USB_DEVICE_WACOM(0x100) },
|
||||
{ USB_DEVICE_WACOM(0x101) },
|
||||
{ USB_DEVICE_WACOM(0x10D) },
|
||||
{ USB_DEVICE_WACOM(0x10E) },
|
||||
{ USB_DEVICE_WACOM(0x10F) },
|
||||
{ USB_DEVICE_WACOM(0x300) },
|
||||
{ USB_DEVICE_WACOM(0x301) },
|
||||
{ USB_DEVICE_DETAILED(0x302, USB_CLASS_HID, 0, 0) },
|
||||
|
||||
@@ -242,7 +242,7 @@ static int cyttsp_soft_reset(struct cyttsp *ts)
|
||||
int retval;
|
||||
|
||||
/* wait for interrupt to set ready completion */
|
||||
INIT_COMPLETION(ts->bl_ready);
|
||||
reinit_completion(&ts->bl_ready);
|
||||
ts->state = CY_BL_STATE;
|
||||
|
||||
enable_irq(ts->irq);
|
||||
|
||||
@@ -251,7 +251,7 @@ static void sur40_poll(struct input_polled_dev *polldev)
|
||||
struct sur40_state *sur40 = polldev->private;
|
||||
struct input_dev *input = polldev->input;
|
||||
int result, bulk_read, need_blobs, packet_blobs, i;
|
||||
u32 packet_id;
|
||||
u32 uninitialized_var(packet_id);
|
||||
|
||||
struct sur40_header *header = &sur40->bulk_in_buffer->header;
|
||||
struct sur40_blob *inblob = &sur40->bulk_in_buffer->blobs[0];
|
||||
@@ -286,7 +286,7 @@ static void sur40_poll(struct input_polled_dev *polldev)
|
||||
if (need_blobs == -1) {
|
||||
need_blobs = le16_to_cpu(header->count);
|
||||
dev_dbg(sur40->dev, "need %d blobs\n", need_blobs);
|
||||
packet_id = header->packet_id;
|
||||
packet_id = le32_to_cpu(header->packet_id);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -52,6 +52,7 @@ struct titsc {
|
||||
u32 config_inp[4];
|
||||
u32 bit_xp, bit_xn, bit_yp, bit_yn;
|
||||
u32 inp_xp, inp_xn, inp_yp, inp_yn;
|
||||
u32 step_mask;
|
||||
};
|
||||
|
||||
static unsigned int titsc_readl(struct titsc *ts, unsigned int reg)
|
||||
@@ -196,7 +197,8 @@ static void titsc_step_config(struct titsc *ts_dev)
|
||||
|
||||
/* The steps1 … end and bit 0 for TS_Charge */
|
||||
stepenable = (1 << (end_step + 2)) - 1;
|
||||
am335x_tsc_se_set(ts_dev->mfd_tscadc, stepenable);
|
||||
ts_dev->step_mask = stepenable;
|
||||
am335x_tsc_se_set(ts_dev->mfd_tscadc, ts_dev->step_mask);
|
||||
}
|
||||
|
||||
static void titsc_read_coordinates(struct titsc *ts_dev,
|
||||
@@ -260,6 +262,10 @@ static irqreturn_t titsc_irq(int irq, void *dev)
|
||||
unsigned int fsm;
|
||||
|
||||
status = titsc_readl(ts_dev, REG_IRQSTATUS);
|
||||
/*
|
||||
* ADC and touchscreen share the IRQ line.
|
||||
* FIFO1 interrupts are used by ADC. Handle FIFO0 IRQs here only
|
||||
*/
|
||||
if (status & IRQENB_FIFO0THRES) {
|
||||
|
||||
titsc_read_coordinates(ts_dev, &x, &y, &z1, &z2);
|
||||
@@ -316,7 +322,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)
|
||||
|
||||
if (irqclr) {
|
||||
titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
|
||||
am335x_tsc_se_update(ts_dev->mfd_tscadc);
|
||||
am335x_tsc_se_set(ts_dev->mfd_tscadc, ts_dev->step_mask);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
return IRQ_NONE;
|
||||
@@ -396,7 +402,7 @@ static int titsc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
err = request_irq(ts_dev->irq, titsc_irq,
|
||||
0, pdev->dev.driver->name, ts_dev);
|
||||
IRQF_SHARED, pdev->dev.driver->name, ts_dev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to allocate irq.\n");
|
||||
goto err_free_mem;
|
||||
|
||||
@@ -106,6 +106,7 @@ struct usbtouch_device_info {
|
||||
struct usbtouch_usb {
|
||||
unsigned char *data;
|
||||
dma_addr_t data_dma;
|
||||
int data_size;
|
||||
unsigned char *buffer;
|
||||
int buf_len;
|
||||
struct urb *irq;
|
||||
@@ -146,12 +147,10 @@ enum {
|
||||
|
||||
#define USB_DEVICE_HID_CLASS(vend, prod) \
|
||||
.match_flags = USB_DEVICE_ID_MATCH_INT_CLASS \
|
||||
| USB_DEVICE_ID_MATCH_INT_PROTOCOL \
|
||||
| USB_DEVICE_ID_MATCH_DEVICE, \
|
||||
.idVendor = (vend), \
|
||||
.idProduct = (prod), \
|
||||
.bInterfaceClass = USB_INTERFACE_CLASS_HID, \
|
||||
.bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE
|
||||
.bInterfaceClass = USB_INTERFACE_CLASS_HID
|
||||
|
||||
static const struct usb_device_id usbtouch_devices[] = {
|
||||
#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX
|
||||
@@ -1523,7 +1522,7 @@ static int usbtouch_reset_resume(struct usb_interface *intf)
|
||||
static void usbtouch_free_buffers(struct usb_device *udev,
|
||||
struct usbtouch_usb *usbtouch)
|
||||
{
|
||||
usb_free_coherent(udev, usbtouch->type->rept_size,
|
||||
usb_free_coherent(udev, usbtouch->data_size,
|
||||
usbtouch->data, usbtouch->data_dma);
|
||||
kfree(usbtouch->buffer);
|
||||
}
|
||||
@@ -1568,7 +1567,20 @@ static int usbtouch_probe(struct usb_interface *intf,
|
||||
if (!type->process_pkt)
|
||||
type->process_pkt = usbtouch_process_pkt;
|
||||
|
||||
usbtouch->data = usb_alloc_coherent(udev, type->rept_size,
|
||||
usbtouch->data_size = type->rept_size;
|
||||
if (type->get_pkt_len) {
|
||||
/*
|
||||
* When dealing with variable-length packets we should
|
||||
* not request more than wMaxPacketSize bytes at once
|
||||
* as we do not know if there is more data coming or
|
||||
* we filled exactly wMaxPacketSize bytes and there is
|
||||
* nothing else.
|
||||
*/
|
||||
usbtouch->data_size = min(usbtouch->data_size,
|
||||
usb_endpoint_maxp(endpoint));
|
||||
}
|
||||
|
||||
usbtouch->data = usb_alloc_coherent(udev, usbtouch->data_size,
|
||||
GFP_KERNEL, &usbtouch->data_dma);
|
||||
if (!usbtouch->data)
|
||||
goto out_free;
|
||||
@@ -1628,12 +1640,12 @@ static int usbtouch_probe(struct usb_interface *intf,
|
||||
if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT)
|
||||
usb_fill_int_urb(usbtouch->irq, udev,
|
||||
usb_rcvintpipe(udev, endpoint->bEndpointAddress),
|
||||
usbtouch->data, type->rept_size,
|
||||
usbtouch->data, usbtouch->data_size,
|
||||
usbtouch_irq, usbtouch, endpoint->bInterval);
|
||||
else
|
||||
usb_fill_bulk_urb(usbtouch->irq, udev,
|
||||
usb_rcvbulkpipe(udev, endpoint->bEndpointAddress),
|
||||
usbtouch->data, type->rept_size,
|
||||
usbtouch->data, usbtouch->data_size,
|
||||
usbtouch_irq, usbtouch);
|
||||
|
||||
usbtouch->irq->dev = udev;
|
||||
|
||||
Reference in New Issue
Block a user