* [PATCH] Input: add regulator haptic driver
From: hyunhee.kim @ 2013-10-11 2:22 UTC (permalink / raw)
To: dmitry.torokhov, broonie, peter.ujfalusi, wfp5p, linux-input,
linux-kernel, akpm
From: Hyunhee Kim <hyunhee.kim@samsung.com>
Date: Wed, 9 Oct 2013 16:21:36 +0900
Subject: [PATCH] Input: add regulator haptic driver
The regulator haptic driver function can be used to control motor by on/off
regulator.
User can control the haptic driver by using force feedback framework.
Signed-off-by: Hyunhee Kim <hyunhee.kim@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
drivers/input/misc/Kconfig | 6 ++
drivers/input/misc/Makefile | 1 +
drivers/input/misc/regulator-haptic.c | 185
+++++++++++++++++++++++++++++++++
3 files changed, 192 insertions(+)
create mode 100644 drivers/input/misc/regulator-haptic.c
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index bb698e1..f391cd7 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -82,6 +82,12 @@ config INPUT_ARIZONA_HAPTICS
To compile this driver as a module, choose M here: the
module will be called arizona-haptics.
+config INPUT_REGULATOR_HAPTIC
+ tristate "regulator haptics support"
+ select INPUT_FF_MEMLESS
+ help
+ Say Y to enable support for the haptics module for regulator.
+
config INPUT_BMA150
tristate "BMA150/SMB380 acceleration sensor support"
depends on I2C
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index d7fc17f..106f0bc 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -15,6 +15,7 @@ obj-$(CONFIG_INPUT_ADXL34X_I2C) +=
adxl34x-i2c.o
obj-$(CONFIG_INPUT_ADXL34X_SPI) += adxl34x-spi.o
obj-$(CONFIG_INPUT_APANEL) += apanel.o
obj-$(CONFIG_INPUT_ARIZONA_HAPTICS) += arizona-haptics.o
+obj-$(CONFIG_INPUT_REGULATOR_HAPTIC) += regulator-haptic.o
obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o
obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o
obj-$(CONFIG_INPUT_BFIN_ROTARY) += bfin_rotary.o
diff --git a/drivers/input/misc/regulator-haptic.c
b/drivers/input/misc/regulator-haptic.c
new file mode 100644
index 0000000..29f57ea
--- /dev/null
+++ b/drivers/input/misc/regulator-haptic.c
@@ -0,0 +1,185 @@
+/*
+ * Regulator haptic driver
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ *
+ * Author: Hyunhee Kim <hyunhee.kim@samsung.com>
+ *
+ * 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
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/input.h>
+#include <linux/slab.h>
+#include <linux/regulator/driver.h>
+
+struct regulator_haptic {
+ struct device *dev;
+ struct input_dev *input_dev;
+ struct work_struct work;
+ bool enabled;
+ struct regulator *regulator;
+ struct mutex mutex;
+ int level;
+};
+
+static void regulator_haptic_enable(struct regulator_haptic *haptic, bool
enable)
+{
+ int ret;
+
+ mutex_lock(&haptic->mutex);
+ if (enable && !haptic->enabled) {
+ haptic->enabled = true;
+ ret = regulator_enable(haptic->regulator);
+ if (ret)
+ pr_err("haptic: %s failed to enable regulator\n",
+ __func__);
+ } else if (!enable && haptic->enabled) {
+ haptic->enabled = false;
+ ret = regulator_disable(haptic->regulator);
+ if (ret)
+ pr_err("haptic: %s failed to disable regulator\n",
+ __func__);
+ }
+ mutex_unlock(&haptic->mutex);
+}
+
+static void regulator_haptic_work(struct work_struct *work)
+{
+ struct regulator_haptic *haptic = container_of(work,
+ struct
regulator_haptic,
+ work);
+ if (haptic->level)
+ regulator_haptic_enable(haptic, true);
+ else
+ regulator_haptic_enable(haptic, false);
+
+}
+
+static int regulator_haptic_play(struct input_dev *input, void *data,
+ struct ff_effect *effect)
+{
+ struct regulator_haptic *haptic = input_get_drvdata(input);
+
+ haptic->level = effect->u.rumble.strong_magnitude;
+ if (!haptic->level)
+ haptic->level = effect->u.rumble.weak_magnitude;
+ schedule_work(&haptic->work);
+
+ return 0;
+}
+
+static void regulator_haptic_close(struct input_dev *input)
+{
+ struct regulator_haptic *haptic = input_get_drvdata(input);
+
+ cancel_work_sync(&haptic->work);
+ regulator_haptic_enable(haptic, false);
+}
+
+static int regulator_haptic_probe(struct platform_device *pdev)
+{
+ struct regulator_haptic *haptic;
+ struct input_dev *input_dev;
+ int error;
+
+ haptic = kzalloc(sizeof(*haptic), GFP_KERNEL);
+ if (!haptic) {
+ dev_err(&pdev->dev, "unable to allocate memory for
haptic\n");
+ return -ENOMEM;
+ }
+
+ input_dev = input_allocate_device();
+
+ if (!input_dev) {
+ dev_err(&pdev->dev, "unable to allocate memory\n");
+ error = -ENOMEM;
+ goto err_kfree_mem;
+ }
+
+ INIT_WORK(&haptic->work, regulator_haptic_work);
+ mutex_init(&haptic->mutex);
+ haptic->input_dev = input_dev;
+ haptic->dev = &pdev->dev;
+ haptic->regulator = regulator_get(&pdev->dev, "haptic");
+
+ if (IS_ERR(haptic->regulator)) {
+ error = PTR_ERR(haptic->regulator);
+ dev_err(&pdev->dev, "unable to get regulator, err: %d\n",
+ error);
+ goto err_ifree_mem;
+ }
+
+ haptic->input_dev->name = "regulator:haptic";
+ haptic->input_dev->dev.parent = &pdev->dev;
+ haptic->input_dev->close = regulator_haptic_close;
+ haptic->enabled = false;
+ input_set_drvdata(haptic->input_dev, haptic);
+ input_set_capability(haptic->input_dev, EV_FF, FF_RUMBLE);
+
+ error = input_ff_create_memless(input_dev, NULL,
+ regulator_haptic_play);
+ if (error) {
+ dev_err(&pdev->dev,
+ "input_ff_create_memless() failed: %d\n",
+ error);
+ goto err_put_regulator;
+ }
+
+ error = input_register_device(haptic->input_dev);
+ if (error) {
+ dev_err(&pdev->dev,
+ "couldn't register input device: %d\n",
+ error);
+ goto err_destroy_ff;
+ }
+
+ platform_set_drvdata(pdev, haptic);
+
+ return 0;
+
+err_destroy_ff:
+ input_ff_destroy(haptic->input_dev);
+err_put_regulator:
+ regulator_put(haptic->regulator);
+err_ifree_mem:
+ input_free_device(haptic->input_dev);
+err_kfree_mem:
+ kfree(haptic);
+
+ return error;
+}
+
+static int regulator_haptic_remove(struct platform_device *pdev)
+{
+ struct regulator_haptic *haptic = platform_get_drvdata(pdev);
+
+ input_unregister_device(haptic->input_dev);
+
+ return 0;
+}
+
+static struct of_device_id regulator_haptic_dt_match[] = {
+ { .compatible = "linux,regulator-haptic" },
+ {},
+};
+
+static struct platform_driver regulator_haptic_driver = {
+ .driver = {
+ .name = "regulator-haptic",
+ .owner = THIS_MODULE,
+ .of_match_table = regulator_haptic_dt_match,
+ },
+
+ .probe = regulator_haptic_probe,
+ .remove = regulator_haptic_remove,
+};
+module_platform_driver(regulator_haptic_driver);
+
+MODULE_ALIAS("platform:regulator-haptic");
+MODULE_DESCRIPTION("Regulator haptic driver");
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Hyunhee Kim <hyunhee.kim@samsung.com>");
--
1.7.9.5
^ permalink raw reply related
* [PATCH v2 2/2] Input: wacom - add support for three new Intuos devices
From: Ping Cheng @ 2013-10-10 21:17 UTC (permalink / raw)
To: linux-input; +Cc: dmitry.torokhov, peter.hutterer, chris, Ping Cheng
This series of models added a hardware switch to turn touch
data on/off. To report the state of the switch, SW_TOUCH
is added in include/uapi/linux/input.h.
The driver is also updated to process wireless devices that do
not support touch interface.
Tested-by: Jason Gerecke <killertofu@gmail.com>
Signed-off-by: Ping Cheng <pingc@wacom.com>
---
v2: Change SW_TOUCH_ENABLED to SW_TOUCH and clear BTN_TOUCH bit
for button only interfaces as suggested by Peter Hutterer.
---
drivers/input/tablet/wacom_sys.c | 16 +++++++-
drivers/input/tablet/wacom_wac.c | 87 ++++++++++++++++++++++++++++++++--------
drivers/input/tablet/wacom_wac.h | 7 ++++
include/uapi/linux/input.h | 1 +
4 files changed, 93 insertions(+), 18 deletions(-)
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
index 7bdb5e9..efd9729 100644
--- a/drivers/input/tablet/wacom_sys.c
+++ b/drivers/input/tablet/wacom_sys.c
@@ -1190,12 +1190,15 @@ static void wacom_wireless_work(struct work_struct *work)
wacom_wac1->features.device_type = BTN_TOOL_PEN;
snprintf(wacom_wac1->name, WACOM_NAME_MAX, "%s (WL) Pen",
wacom_wac1->features.name);
+ wacom_wac1->shared->touch_max = wacom_wac1->features.touch_max;
+ wacom_wac1->shared->type = wacom_wac1->features.type;
error = wacom_register_input(wacom1);
if (error)
goto fail;
/* Touch interface */
- if (wacom_wac1->features.touch_max) {
+ if (wacom_wac1->features.touch_max ||
+ wacom_wac1->features.type == INTUOS_HT) {
wacom_wac2->features =
*((struct wacom_features *)id->driver_info);
wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
@@ -1210,6 +1213,10 @@ static void wacom_wireless_work(struct work_struct *work)
error = wacom_register_input(wacom2);
if (error)
goto fail;
+
+ if (wacom_wac1->features.type == INTUOS_HT &&
+ wacom_wac1->features.touch_max)
+ wacom_wac->shared->touch_input = wacom_wac2->input;
}
error = wacom_initialize_battery(wacom);
@@ -1318,7 +1325,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
* HID descriptor. If this is the touch interface (wMaxPacketSize
* of WACOM_PKGLEN_BBTOUCH3), override the table values.
*/
- if (features->type >= INTUOS5S && features->type <= INTUOSPL) {
+ if (features->type >= INTUOS5S && features->type <= INTUOS_HT) {
if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) {
features->device_type = BTN_TOOL_FINGER;
features->pktlen = WACOM_PKGLEN_BBTOUCH3;
@@ -1390,6 +1397,11 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
}
}
+ if (wacom_wac->features.type == INTUOS_HT && wacom_wac->features.touch_max) {
+ if (wacom_wac->features.device_type == BTN_TOOL_FINGER)
+ wacom_wac->shared->touch_input = wacom_wac->input;
+ }
+
return 0;
fail5: wacom_destroy_leds(wacom);
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
index 9c8eded..4cbea85 100644
--- a/drivers/input/tablet/wacom_wac.c
+++ b/drivers/input/tablet/wacom_wac.c
@@ -1176,10 +1176,17 @@ static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data)
{
struct input_dev *input = wacom->input;
+ struct wacom_features *features = &wacom->features;
- input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
+ if (features->type == INTUOS_HT) {
+ input_report_key(input, BTN_LEFT, (data[1] & 0x02) != 0);
+ input_report_key(input, BTN_BACK, (data[1] & 0x08) != 0);
+ } else {
+
+ input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
+ input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
+ }
input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0);
- input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
}
@@ -1213,13 +1220,23 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
static int wacom_bpt_pen(struct wacom_wac *wacom)
{
+ struct wacom_features *features = &wacom->features;
struct input_dev *input = wacom->input;
unsigned char *data = wacom->data;
int prox = 0, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0;
- if (data[0] != 0x02)
+ if (data[0] != WACOM_REPORT_PENABLED && data[0] != WACOM_REPORT_USB_MODE)
return 0;
+ if (data[0] == WACOM_REPORT_USB_MODE) {
+ if ((features->type == INTUOS_HT) && features->touch_max) {
+ input_report_switch(wacom->shared->touch_input,
+ SW_TOUCH, data[8] & 0x40);
+ input_sync(wacom->shared->touch_input);
+ }
+ return 0;
+ }
+
prox = (data[1] & 0x20) == 0x20;
/*
@@ -1297,13 +1314,20 @@ static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
unsigned char *data = wacom->data;
int connected;
- if (len != WACOM_PKGLEN_WIRELESS || data[0] != 0x80)
+ if (len != WACOM_PKGLEN_WIRELESS || data[0] != WACOM_REPORT_WL_MODE)
return 0;
connected = data[1] & 0x01;
if (connected) {
int pid, battery;
+ if ((wacom->shared->type == INTUOS_HT) &&
+ wacom->shared->touch_max) {
+ input_report_switch(wacom->shared->touch_input,
+ SW_TOUCH, data[5] & 0x40);
+ input_sync(wacom->shared->touch_input);
+ }
+
pid = get_unaligned_be16(&data[6]);
battery = data[5] & 0x3f;
if (wacom->pid != pid) {
@@ -1391,6 +1415,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
break;
case BAMBOO_PT:
+ case INTUOS_HT:
sync = wacom_bpt_irq(wacom_wac, len);
break;
@@ -1459,7 +1484,7 @@ void wacom_setup_device_quirks(struct wacom_features *features)
/* these device have multiple inputs */
if (features->type >= WIRELESS ||
- (features->type >= INTUOS5S && features->type <= INTUOSPL) ||
+ (features->type >= INTUOS5S && features->type <= INTUOS_HT) ||
(features->oVid && features->oPid))
features->quirks |= WACOM_QUIRK_MULTI_INPUT;
@@ -1531,7 +1556,8 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
struct wacom_features *features = &wacom_wac->features;
int i;
- input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
+ input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) |
+ BIT_MASK(EV_SW);
__set_bit(BTN_TOUCH, input_dev->keybit);
__set_bit(ABS_MISC, input_dev->absbit);
@@ -1771,33 +1797,48 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
__set_bit(INPUT_PROP_POINTER, input_dev->propbit);
break;
+ case INTUOS_HT:
+ if (features->touch_max &&
+ (features->device_type == BTN_TOOL_FINGER))
+ __set_bit(SW_TOUCH, input_dev->swbit);
+ /* fall through */
+
case BAMBOO_PT:
__clear_bit(ABS_MISC, input_dev->absbit);
- __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
-
if (features->device_type == BTN_TOOL_FINGER) {
- unsigned int flags = INPUT_MT_POINTER;
__set_bit(BTN_LEFT, input_dev->keybit);
__set_bit(BTN_FORWARD, input_dev->keybit);
__set_bit(BTN_BACK, input_dev->keybit);
__set_bit(BTN_RIGHT, input_dev->keybit);
- if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
- input_set_abs_params(input_dev,
+ if (features->touch_max) {
+ /* touch interface */
+ unsigned int flags = INPUT_MT_POINTER;
+
+ __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
+ if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
+ input_set_abs_params(input_dev,
ABS_MT_TOUCH_MAJOR,
0, features->x_max, 0, 0);
- input_set_abs_params(input_dev,
+ input_set_abs_params(input_dev,
ABS_MT_TOUCH_MINOR,
0, features->y_max, 0, 0);
+ } else {
+ __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+ __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
+ flags = 0;
+ }
+ input_mt_init_slots(input_dev, features->touch_max, flags);
} else {
- __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
- __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
- flags = 0;
+ /* buttons/keys only interface */
+ __clear_bit(ABS_X, input_dev->absbit);
+ __clear_bit(ABS_Y, input_dev->absbit);
+ __clear_bit(BTN_TOUCH, input_dev->keybit);
}
- input_mt_init_slots(input_dev, features->touch_max, flags);
} else if (features->device_type == BTN_TOOL_PEN) {
+ __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
__set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
__set_bit(BTN_TOOL_PEN, input_dev->keybit);
__set_bit(BTN_STYLUS, input_dev->keybit);
@@ -2194,6 +2235,17 @@ static const struct wacom_features wacom_features_0x300 =
static const struct wacom_features wacom_features_0x301 =
{ "Wacom Bamboo One M", WACOM_PKGLEN_BBPEN, 21648, 13530, 1023,
31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x302 =
+ { "Wacom Intuos PT S", WACOM_PKGLEN_BBPEN, 15200, 9500, 1023,
+ 31, INTUOS_HT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
+ .touch_max = 16 };
+static const struct wacom_features wacom_features_0x303 =
+ { "Wacom Intuos PT M", WACOM_PKGLEN_BBPEN, 21600, 13500, 1023,
+ 31, INTUOS_HT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
+ .touch_max = 16 };
+static const struct wacom_features wacom_features_0x30E =
+ { "Wacom Intuos S", WACOM_PKGLEN_BBPEN, 15200, 9500, 1023,
+ 31, INTUOS_HT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
static const struct wacom_features wacom_features_0x6004 =
{ "ISD-V4", WACOM_PKGLEN_GRAPHIRE, 12800, 8000, 255,
0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@@ -2329,6 +2381,9 @@ const struct usb_device_id wacom_ids[] = {
{ USB_DEVICE_WACOM(0x10D) },
{ USB_DEVICE_WACOM(0x300) },
{ USB_DEVICE_WACOM(0x301) },
+ { USB_DEVICE_WACOM(0x302) },
+ { USB_DEVICE_DETAILED(0x303, USB_CLASS_HID, 0, 0) },
+ { USB_DEVICE_DETAILED(0x30E, USB_CLASS_HID, 0, 0) },
{ USB_DEVICE_WACOM(0x304) },
{ USB_DEVICE_DETAILED(0x314, USB_CLASS_HID, 0, 0) },
{ USB_DEVICE_DETAILED(0x315, USB_CLASS_HID, 0, 0) },
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
index fd23a37..ba9e335 100644
--- a/drivers/input/tablet/wacom_wac.h
+++ b/drivers/input/tablet/wacom_wac.h
@@ -54,6 +54,8 @@
#define WACOM_REPORT_TPCST 16
#define WACOM_REPORT_TPC1FGE 18
#define WACOM_REPORT_24HDT 1
+#define WACOM_REPORT_WL_MODE 128
+#define WACOM_REPORT_USB_MODE 192
/* device quirks */
#define WACOM_QUIRK_MULTI_INPUT 0x0001
@@ -81,6 +83,7 @@ enum {
INTUOSPS,
INTUOSPM,
INTUOSPL,
+ INTUOS_HT,
WACOM_21UX2,
WACOM_22HD,
DTK,
@@ -129,6 +132,10 @@ struct wacom_features {
struct wacom_shared {
bool stylus_in_proximity;
bool touch_down;
+ /* for wireless device to access USB interfaces */
+ unsigned touch_max;
+ int type;
+ struct input_dev *touch_input;
};
struct wacom_wac {
diff --git a/include/uapi/linux/input.h b/include/uapi/linux/input.h
index d08abf9..70e53e8 100644
--- a/include/uapi/linux/input.h
+++ b/include/uapi/linux/input.h
@@ -855,6 +855,7 @@ struct input_keymap_entry {
#define SW_FRONT_PROXIMITY 0x0b /* set = front proximity sensor active */
#define SW_ROTATE_LOCK 0x0c /* set = rotate locked/disabled */
#define SW_LINEIN_INSERT 0x0d /* set = inserted */
+#define SW_TOUCH 0x0e /* set = touch switch turned on (touch events off) */
#define SW_MAX 0x0f
#define SW_CNT (SW_MAX+1)
--
1.8.1.2
^ permalink raw reply related
* [PATCH v2 1/2] Input - wacom: Not all multi-interface devices support touch
From: Ping Cheng @ 2013-10-10 21:17 UTC (permalink / raw)
To: linux-input; +Cc: dmitry.torokhov, peter.hutterer, chris, Ping Cheng
Some multi-interface devices support expresskeys on a separate interface,
such as Bamboo; some multi-interface devices do not support touch at all,
such as Pen only Intuos5. Make sure we report the right device names.
Tested-by: Jason Gerecke <killertofu@gmail.com>
Signed-off-by: Ping Cheng <pingc@wacom.com>
---
drivers/input/tablet/wacom_sys.c | 58 +++++++++++++++++++++++++---------------
drivers/input/tablet/wacom_wac.h | 4 ++-
2 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
index 63971b8..7bdb5e9 100644
--- a/drivers/input/tablet/wacom_sys.c
+++ b/drivers/input/tablet/wacom_sys.c
@@ -1188,34 +1188,47 @@ static void wacom_wireless_work(struct work_struct *work)
wacom_wac1->features =
*((struct wacom_features *)id->driver_info);
wacom_wac1->features.device_type = BTN_TOOL_PEN;
+ snprintf(wacom_wac1->name, WACOM_NAME_MAX, "%s (WL) Pen",
+ wacom_wac1->features.name);
error = wacom_register_input(wacom1);
if (error)
- goto fail1;
+ goto fail;
/* Touch interface */
- wacom_wac2->features =
- *((struct wacom_features *)id->driver_info);
- wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
- wacom_wac2->features.device_type = BTN_TOOL_FINGER;
- wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096;
- error = wacom_register_input(wacom2);
- if (error)
- goto fail2;
+ if (wacom_wac1->features.touch_max) {
+ wacom_wac2->features =
+ *((struct wacom_features *)id->driver_info);
+ wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
+ wacom_wac2->features.device_type = BTN_TOOL_FINGER;
+ wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096;
+ if (wacom_wac2->features.touch_max)
+ snprintf(wacom_wac2->name, WACOM_NAME_MAX,
+ "%s (WL) Finger",wacom_wac2->features.name);
+ else
+ snprintf(wacom_wac2->name, WACOM_NAME_MAX,
+ "%s (WL) Pad",wacom_wac2->features.name);
+ error = wacom_register_input(wacom2);
+ if (error)
+ goto fail;
+ }
error = wacom_initialize_battery(wacom);
if (error)
- goto fail3;
+ goto fail;
}
return;
-fail3:
- input_unregister_device(wacom_wac2->input);
- wacom_wac2->input = NULL;
-fail2:
- input_unregister_device(wacom_wac1->input);
- wacom_wac1->input = NULL;
-fail1:
+fail:
+ if (wacom_wac2->input) {
+ input_unregister_device(wacom_wac2->input);
+ wacom_wac2->input = NULL;
+ }
+ if (wacom_wac1->input) {
+
+ input_unregister_device(wacom_wac1->input);
+ wacom_wac1->input = NULL;
+ }
return;
}
@@ -1332,10 +1345,13 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
struct usb_device *other_dev;
/* Append the device type to the name */
- strlcat(wacom_wac->name,
- features->device_type == BTN_TOOL_PEN ?
- " Pen" : " Finger",
- sizeof(wacom_wac->name));
+ if (features->device_type == BTN_TOOL_FINGER) {
+ if (features->touch_max)
+ strlcat(wacom_wac->name, " Finger", WACOM_NAME_MAX);
+ else
+ strlcat(wacom_wac->name, " Pad", WACOM_NAME_MAX);
+ } else
+ strlcat(wacom_wac->name, " Pen", WACOM_NAME_MAX);
other_dev = wacom_get_sibling(dev, features->oVid, features->oPid);
if (other_dev == NULL || wacom_get_usbdev_data(other_dev) == NULL)
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
index 2a432e6..fd23a37 100644
--- a/drivers/input/tablet/wacom_wac.h
+++ b/drivers/input/tablet/wacom_wac.h
@@ -14,6 +14,8 @@
/* maximum packet length for USB devices */
#define WACOM_PKGLEN_MAX 64
+#define WACOM_NAME_MAX 64
+
/* packet length for individual models */
#define WACOM_PKGLEN_PENPRTN 7
#define WACOM_PKGLEN_GRAPHIRE 8
@@ -130,7 +132,7 @@ struct wacom_shared {
};
struct wacom_wac {
- char name[64];
+ char name[WACOM_NAME_MAX];
unsigned char *data;
int tool[2];
int id[2];
--
1.8.1.2
^ permalink raw reply related
* Re: [PATCH 1/1] HID: wiimote: invert Y-Axis and add automatic calibration for Wii U Pro Controller
From: Rafael Brune @ 2013-10-10 15:46 UTC (permalink / raw)
To: David Herrmann; +Cc: open list:HID CORE LAYER
In-Reply-To: <CANq1E4ToCfOCe9Fe0iDdJGJv_D4rOT6gB5g=7neTaHj9_esiLA@mail.gmail.com>
Hi
On Oct 10, 2013, at 11:16 AM, David Herrmann wrote:
> Hi
>
> On Sun, Oct 6, 2013 at 8:44 PM, Rafael Brune <mail@rbrune.de> wrote:
>> With these changes the Wii U Pro Controller fully complies
>> to the gamepad-API and with the calibration is fully usable
>> out-of-the-box without any user-space tools. This potentially
>> breaks compatibility with software that relies on the two
>> inverted Y-Axis but since current bluez 4.x and 5.x versions
>> don't even support pairing with the controller yet the amount
>> of people affected should be rather small.
>
> Did anyone try to read the calibration values from the EEPROM? Doing
> calibration in the kernel is fine, but I'd rather have the
> hardware-calibration values instead. Even if we cannot figure it out
> now, we should try to stay as compatible to the real values as we can.
>
> So how about keeping the min/max and neutral point as we have it know
> and instead adjusting the reported values by scaling/moving them?
>
After googling a little bit it seems like their might actually be no
calibration data for the Classic Controller and Wii U Pro Controller. The
midpoint is supposedly just detected when the device connects.
http://wiibrew.org/wiki/Classic_Controller
My code did not change what we output as the min/max/mid values it's
still -0x800,0x000,0x800. As you suggest it scales/moves the raw values
so that the reported values fall into that range.
>> Signed-off-by: Rafael Brune <mail@rbrune.de>
>> ---
>> drivers/hid/hid-wiimote-modules.c | 45 +++++++++++++++++++++++++++++++++++----
>> 1 file changed, 41 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/hid/hid-wiimote-modules.c b/drivers/hid/hid-wiimote-modules.c
>> index 2e7d644..1422b0b 100644
>> --- a/drivers/hid/hid-wiimote-modules.c
>> +++ b/drivers/hid/hid-wiimote-modules.c
>> @@ -1640,10 +1640,41 @@ static void wiimod_pro_in_ext(struct wiimote_data *wdata, const __u8 *ext)
>> ly = (ext[4] & 0xff) | ((ext[5] & 0x0f) << 8);
>> ry = (ext[6] & 0xff) | ((ext[7] & 0x0f) << 8);
>>
>> - input_report_abs(wdata->extension.input, ABS_X, lx - 0x800);
>> - input_report_abs(wdata->extension.input, ABS_Y, ly - 0x800);
>> - input_report_abs(wdata->extension.input, ABS_RX, rx - 0x800);
>> - input_report_abs(wdata->extension.input, ABS_RY, ry - 0x800);
>> + /* Calibrating the sticks by saving the global min/max per axis */
>> + if (lx < wdata->state.calib_bboard[0][0])
>> + wdata->state.calib_bboard[0][0] = lx;
>> + if (lx > wdata->state.calib_bboard[0][1])
>> + wdata->state.calib_bboard[0][1] = lx;
>> +
>> + if (ly < wdata->state.calib_bboard[1][0])
>> + wdata->state.calib_bboard[1][0] = ly;
>> + if (ly > wdata->state.calib_bboard[1][1])
>> + wdata->state.calib_bboard[1][1] = ly;
>> +
>> + if (rx < wdata->state.calib_bboard[2][0])
>> + wdata->state.calib_bboard[2][0] = rx;
>> + if (rx > wdata->state.calib_bboard[2][1])
>> + wdata->state.calib_bboard[2][1] = rx;
>> +
>> + if (ry < wdata->state.calib_bboard[3][0])
>> + wdata->state.calib_bboard[3][0] = ry;
>> + if (ry > wdata->state.calib_bboard[3][1])
>> + wdata->state.calib_bboard[3][1] = ry;
>> +
>> + /* Normalize using int math to prevent conversion to/from float */
>> + lx = -2048 + (((__s32)(lx - wdata->state.calib_bboard[0][0]) * 4096)/
>> + (wdata->state.calib_bboard[0][1]-wdata->state.calib_bboard[0][0]));
>> + ly = -2048 + (((__s32)(ly - wdata->state.calib_bboard[1][0]) * 4096)/
>> + (wdata->state.calib_bboard[1][1]-wdata->state.calib_bboard[1][0]));
>> + rx = -2048 + (((__s32)(rx - wdata->state.calib_bboard[2][0]) * 4096)/
>> + (wdata->state.calib_bboard[2][1]-wdata->state.calib_bboard[2][0]));
>> + ry = -2048 + (((__s32)(ry - wdata->state.calib_bboard[3][0]) * 4096)/
>> + (wdata->state.calib_bboard[3][1]-wdata->state.calib_bboard[3][0]));
>
> Don't use calib_bboard. Add a new array (or use a union). This is confusing.
I agree, will do that.
>> +
>> + input_report_abs(wdata->extension.input, ABS_X, lx);
>> + input_report_abs(wdata->extension.input, ABS_Y, -ly);
>> + input_report_abs(wdata->extension.input, ABS_RX, rx);
>> + input_report_abs(wdata->extension.input, ABS_RY, -ry);
>>
>> input_report_key(wdata->extension.input,
>> wiimod_pro_map[WIIMOD_PRO_KEY_RIGHT],
>> @@ -1760,6 +1791,12 @@ static int wiimod_pro_probe(const struct wiimod_ops *ops,
>> if (!wdata->extension.input)
>> return -ENOMEM;
>>
>> + /* Initialize min/max values for all Axis with reasonable values */
>> + for (i = 0; i < 4; ++i) {
>> + wdata->state.calib_bboard[i][0] = 0x780;
>> + wdata->state.calib_bboard[i][1] = 0x880;
>
> Ugh, these values look weird. We have a reported range of -0x400 to
> +0x400 but you limit it to a virtual range of 0x100. That's a loss of
> precision of 80%. Where are these values from?
I picked these values arbitrarily as starting points since they will update
during use of the gamepad as soon as lower/higher values are observed.
As soon as the sticks have been moved to their extreme positions once
everything is perfect.
We could also set those values in a similar fashion as to what Nintendo
seems to be doing. Wait for a first report of raw values, use them as the
mid point and set these min/max values as midpoint +/- ~0x800.
>> + }
>> +
>> set_bit(FF_RUMBLE, wdata->extension.input->ffbit);
>> input_set_drvdata(wdata->extension.input, wdata);
>
> Thanks for hacking this up. Could you give me some values from your
> device so I can see how big the deviation is? My device reports:
>
> Range: 0-4095 (0x0fff)
> Neutral-Point: 2048 (0x800)
>
> I haven't seen any big deviations from these values. I can try to take
> this over if you want, just let me know.
>
> Thanks
> David
When I write out the observed raw min/max values of all Axis I get these:
LX: 1033 - 3326 (center~=2179 (0x883))
LY: 857 - 3211 (center~=2034 (0x7F2))
RX: 944 - 3176 (center~=2060 (0x80C))
RY: 853 - 3159 (center~=2006 (0x7D6))
So not really the whole range of 0x0FFF is actually used and offsets due
to manufacturing differences are present.
Regards,
Rafael
^ permalink raw reply
* [PATCHv2 3/3] HID:Kconfig: Correct MOMO description in wrong place (handled by LG4FF).
From: Simon Wood @ 2013-10-10 14:20 UTC (permalink / raw)
To: linux-input
Cc: Jiri Kosina, linux-kernel, simon, Elias Vanderstuyft,
Michal Malý
In-Reply-To: <1381414814-2107-1-git-send-email-simon@mungewell.org>
Minor correction to the description in Kconfig.
The Logitect MOMO wheel is actually handled by the LOGITECH_WHEELS (hid-lg4ff)
section, not by the LOGITECH_FF (hid-lgff).
Signed-off-by: Simon Wood <simon@mungewell.org>
---
drivers/hid/Kconfig | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 46fd27f..aee7182 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -362,7 +362,6 @@ config LOGITECH_FF
- Logitech WingMan Force 3D
- Logitech Formula Force EX
- Logitech WingMan Formula Force GP
- - Logitech MOMO Force wheel
and if you want to enable force feedback for them.
Note: if you say N here, this device will still be supported, but without
--
1.8.1.2
^ permalink raw reply related
* [PATCHv2 1/3] HID:hid-lg: Fixed ReportDescriptor for Logitech Formula Vibration to split Accel/Brake into seperate axis
From: Simon Wood @ 2013-10-10 14:20 UTC (permalink / raw)
To: linux-input
Cc: Jiri Kosina, linux-kernel, simon, Elias Vanderstuyft,
Michal Malý
In-Reply-To: <alpine.LNX.2.00.1310101002120.13289@pobox.suse.cz>
Requires https://patchwork.kernel.org/patch/2998241/
By default the Logitech Formula Vibration presents a combined accel/brake
axis ('Y'). This patch modifies the HID descriptor to present seperate
accel/brake axes ('Y' and 'Z').
Signed-off-by: Simon Wood <simon@mungewell.org>
---
drivers/hid/hid-lg.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index c2c7dab..c6efdae 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -45,6 +45,7 @@
/* Size of the original descriptors of the Driving Force (and Pro) wheels */
#define DF_RDESC_ORIG_SIZE 130
#define DFP_RDESC_ORIG_SIZE 97
+#define FV_RDESC_ORIG_SIZE 130
#define MOMO_RDESC_ORIG_SIZE 87
/* Fixed report descriptors for Logitech Driving Force (and Pro)
@@ -170,6 +171,73 @@ static __u8 dfp_rdesc_fixed[] = {
0xC0 /* End Collection */
};
+static __u8 fv_rdesc_fixed[] = {
+0x05, 0x01, /* Usage Page (Desktop), */
+0x09, 0x04, /* Usage (Joystik), */
+0xA1, 0x01, /* Collection (Application), */
+0xA1, 0x02, /* Collection (Logical), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x0A, /* Report Size (10), */
+0x15, 0x00, /* Logical Minimum (0), */
+0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+0x35, 0x00, /* Physical Minimum (0), */
+0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
+0x09, 0x30, /* Usage (X), */
+0x81, 0x02, /* Input (Variable), */
+0x95, 0x0C, /* Report Count (12), */
+0x75, 0x01, /* Report Size (1), */
+0x25, 0x01, /* Logical Maximum (1), */
+0x45, 0x01, /* Physical Maximum (1), */
+0x05, 0x09, /* Usage Page (Button), */
+0x19, 0x01, /* Usage Minimum (01h), */
+0x29, 0x0C, /* Usage Maximum (0Ch), */
+0x81, 0x02, /* Input (Variable), */
+0x95, 0x02, /* Report Count (2), */
+0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
+0x09, 0x01, /* Usage (01h), */
+0x81, 0x02, /* Input (Variable), */
+0x09, 0x02, /* Usage (02h), */
+0x26, 0xFF, 0x00, /* Logical Maximum (255), */
+0x46, 0xFF, 0x00, /* Physical Maximum (255), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x08, /* Report Size (8), */
+0x81, 0x02, /* Input (Variable), */
+0x05, 0x01, /* Usage Page (Desktop), */
+0x25, 0x07, /* Logical Maximum (7), */
+0x46, 0x3B, 0x01, /* Physical Maximum (315), */
+0x75, 0x04, /* Report Size (4), */
+0x65, 0x14, /* Unit (Degrees), */
+0x09, 0x39, /* Usage (Hat Switch), */
+0x81, 0x42, /* Input (Variable, Null State), */
+0x75, 0x01, /* Report Size (1), */
+0x95, 0x04, /* Report Count (4), */
+0x65, 0x00, /* Unit, */
+0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
+0x09, 0x01, /* Usage (01h), */
+0x25, 0x01, /* Logical Maximum (1), */
+0x45, 0x01, /* Physical Maximum (1), */
+0x81, 0x02, /* Input (Variable), */
+0x05, 0x01, /* Usage Page (Desktop), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x08, /* Report Size (8), */
+0x26, 0xFF, 0x00, /* Logical Maximum (255), */
+0x46, 0xFF, 0x00, /* Physical Maximum (255), */
+0x09, 0x31, /* Usage (Y), */
+0x81, 0x02, /* Input (Variable), */
+0x09, 0x32, /* Usage (Z), */
+0x81, 0x02, /* Input (Variable), */
+0xC0, /* End Collection, */
+0xA1, 0x02, /* Collection (Logical), */
+0x26, 0xFF, 0x00, /* Logical Maximum (255), */
+0x46, 0xFF, 0x00, /* Physical Maximum (255), */
+0x95, 0x07, /* Report Count (7), */
+0x75, 0x08, /* Report Size (8), */
+0x09, 0x03, /* Usage (03h), */
+0x91, 0x02, /* Output (Variable), */
+0xC0, /* End Collection, */
+0xC0 /* End Collection */
+};
+
static __u8 momo_rdesc_fixed[] = {
0x05, 0x01, /* Usage Page (Desktop), */
0x09, 0x04, /* Usage (Joystik), */
@@ -275,6 +343,15 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
}
break;
+ case USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL:
+ if (*rsize == FV_RDESC_ORIG_SIZE) {
+ hid_info(hdev,
+ "fixing up Logitech Formula Vibration report descriptor\n");
+ rdesc = fv_rdesc_fixed;
+ *rsize = sizeof(fv_rdesc_fixed);
+ }
+ break;
+
case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
if (*rsize == DFP_RDESC_ORIG_SIZE) {
hid_info(hdev,
--
1.8.1.2
^ permalink raw reply related
* [PATCHv2 2/3] HID:hid-lg: Fixed Report Descriptor for Logitech MOMO Force (Black) to split Accel/Brake into seperate axis
From: Simon Wood @ 2013-10-10 14:20 UTC (permalink / raw)
To: linux-input
Cc: Jiri Kosina, linux-kernel, simon, Elias Vanderstuyft,
Michal Malý
In-Reply-To: <1381414814-2107-1-git-send-email-simon@mungewell.org>
By default the Logitech MOMO Force (Black) presents a combined accel/brake
axis ('Y'). This patch modifies the HID descriptor to present seperate
accel/brake axes ('Y' and 'Z').
Signed-off-by: Simon Wood <simon@mungewell.org>
---
drivers/hid/hid-lg.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index c6efdae..545da44 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -47,6 +47,7 @@
#define DFP_RDESC_ORIG_SIZE 97
#define FV_RDESC_ORIG_SIZE 130
#define MOMO_RDESC_ORIG_SIZE 87
+#define MOMO2_RDESC_ORIG_SIZE 87
/* Fixed report descriptors for Logitech Driving Force (and Pro)
* wheel controllers
@@ -284,6 +285,54 @@ static __u8 momo_rdesc_fixed[] = {
0xC0 /* End Collection */
};
+static __u8 momo2_rdesc_fixed[] = {
+0x05, 0x01, /* Usage Page (Desktop), */
+0x09, 0x04, /* Usage (Joystik), */
+0xA1, 0x01, /* Collection (Application), */
+0xA1, 0x02, /* Collection (Logical), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x0A, /* Report Size (10), */
+0x15, 0x00, /* Logical Minimum (0), */
+0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+0x35, 0x00, /* Physical Minimum (0), */
+0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
+0x09, 0x30, /* Usage (X), */
+0x81, 0x02, /* Input (Variable), */
+0x95, 0x0A, /* Report Count (10), */
+0x75, 0x01, /* Report Size (1), */
+0x25, 0x01, /* Logical Maximum (1), */
+0x45, 0x01, /* Physical Maximum (1), */
+0x05, 0x09, /* Usage Page (Button), */
+0x19, 0x01, /* Usage Minimum (01h), */
+0x29, 0x0A, /* Usage Maximum (0Ah), */
+0x81, 0x02, /* Input (Variable), */
+0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
+0x09, 0x00, /* Usage (00h), */
+0x95, 0x04, /* Report Count (4), */
+0x81, 0x02, /* Input (Variable), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x08, /* Report Size (8), */
+0x26, 0xFF, 0x00, /* Logical Maximum (255), */
+0x46, 0xFF, 0x00, /* Physical Maximum (255), */
+0x09, 0x01, /* Usage (01h), */
+0x81, 0x02, /* Input (Variable), */
+0x05, 0x01, /* Usage Page (Desktop), */
+0x09, 0x31, /* Usage (Y), */
+0x81, 0x02, /* Input (Variable), */
+0x09, 0x32, /* Usage (Z), */
+0x81, 0x02, /* Input (Variable), */
+0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
+0x09, 0x00, /* Usage (00h), */
+0x81, 0x02, /* Input (Variable), */
+0xC0, /* End Collection, */
+0xA1, 0x02, /* Collection (Logical), */
+0x09, 0x02, /* Usage (02h), */
+0x95, 0x07, /* Report Count (7), */
+0x91, 0x02, /* Output (Variable), */
+0xC0, /* End Collection, */
+0xC0 /* End Collection */
+};
+
/*
* Certain Logitech keyboards send in report #3 keys which are far
* above the logical maximum described in descriptor. This extends
@@ -343,6 +392,15 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
}
break;
+ case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
+ if (*rsize == MOMO2_RDESC_ORIG_SIZE) {
+ hid_info(hdev,
+ "fixing up Logitech Momo Racing Force (Black) report descriptor\n");
+ rdesc = momo2_rdesc_fixed;
+ *rsize = sizeof(momo2_rdesc_fixed);
+ }
+ break;
+
case USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL:
if (*rsize == FV_RDESC_ORIG_SIZE) {
hid_info(hdev,
--
1.8.1.2
^ permalink raw reply related
* Re: [PATCH v2 2/2] input: rotary-encoder: Add 'on-each-step' to binding documentation
From: Ezequiel García @ 2013-10-10 13:55 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Mark Rutland, linux-kernel@vger.kernel.org, Daniel Mack,
Dmitry Torokhov, rob.herring@calxeda.com
In-Reply-To: <20131004140925.GA27809@localhost>
On 4 October 2013 11:09, Ezequiel Garcia
<ezequiel.garcia@free-electrons.com> wrote:
> On Fri, Oct 04, 2013 at 02:19:56PM +0100, Mark Rutland wrote:
>> On Fri, Oct 04, 2013 at 01:53:23PM +0100, Ezequiel Garcia wrote:
>> > The driver now supports a new mode to handle the interruptions generated
>> > by the device: on this new mode an input event is generated on each step
>> > (i.e. on each IRQ). Therefore, add a new DT property, to select the
>> > mode: 'rotary-encoder,on-each-step'.
>> >
>> > Cc: Daniel Mack <zonque@gmail.com>
>> > Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
>> > Cc: Rob Herring <rob.herring@calxeda.com>
>> > Cc: devicetree@vger.kernel.org
>> > Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
>> > ---
>> > I'm not at all happy with this DT binding as it's way to customized
>> > for the current driver. For instance, if we want to support mapping
>> > key events (or better arbitrary linux-input event types) it seems
>> > there's no easy way to fix the binding.
>> >
>> > Maybe a better way of handling the different 'modes' is through
>> > compatible strings?
>>
>> I'd prefer not to have more pseudo-devices in DT, and would prefer not
>> to have compatible strings that boil down to driver options. We end up
>> just embedding a tonne of Linux-specific driver configuration in the DT
>> rather than describing hardware.
>>
>> That said, I'm not sure what the best solution is here.
>>
>> >
>> > I'm not really sure, so I hope the DT guys have some comment on this.
>> >
>> > Documentation/devicetree/bindings/input/rotary-encoder.txt | 1 +
>> > 1 file changed, 1 insertion(+)
>> >
>> > diff --git a/Documentation/devicetree/bindings/input/rotary-encoder.txt b/Documentation/devicetree/bindings/input/rotary-encoder.txt
>> > index 3315495..b89e38d 100644
>> > --- a/Documentation/devicetree/bindings/input/rotary-encoder.txt
>> > +++ b/Documentation/devicetree/bindings/input/rotary-encoder.txt
>> > @@ -15,6 +15,7 @@ Optional properties:
>> > - rotary-encoder,rollover: Automatic rollove when the rotary value becomes
>> > greater than the specified steps or smaller than 0. For absolute axis only.
>> > - rotary-encoder,half-period: Makes the driver work on half-period mode.
>> > +- rotary-encoder,on-each-step: Makes the driver send an event on each step.
>>
>> Could this not be something requested at runtime?
>>
>
> Sure. The different modes:
>
> * default (no option)
> * rotary-encoder,half-period
> * rotary-encoder,on-each-step
>
> Just map to different interruption handlers. I don't have any other
> rotary-encoder device, so I'm not at all sure what's the use of the
> other two cases.
> My particular device is detented, and produces a 'stable' event on each
> step (i.e on each IRQ).
>
> Regarding the runtime specification: you mean as a module parameter?
> That should be trivial to add, no?
>
>> Could you explain what you want to achieve with this? -- what events do
>> you want to occur when, to be handled in what way?
>>
>
> Hm.. maybe I should have added the binding to the 1/2 patch and CCed
> everybody involved for better context.
>
> Anyway, I hope the above is clearer, I'm not really sure how to specify
> the details in the DT binding, since it's a specific interruption handler
> for this class of encoder devices (stable on each step).
>
> That said, I really hope I'm crafting a generic solution and not some
> tailor-made implementation that just happens to match my use case.
>
> The input maintainer's opinion on this would be valuable.
Any insights on this binding?
If nobody objects, then I'd like to get this change accepted,
together with the driver change.
Thanks!
--
Ezequiel García, VanguardiaSur
www.vanguardiasur.com.ar
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: Q: weird hidraw behaviour
From: David Herrmann @ 2013-10-10 9:41 UTC (permalink / raw)
To: Mika Westerberg; +Cc: Jiri Kosina, Manoj Chourasia, open list:HID CORE LAYER
In-Reply-To: <20131010093939.GH3521@intel.com>
Hi
On Thu, Oct 10, 2013 at 11:39 AM, Mika Westerberg
<mika.westerberg@linux.intel.com> wrote:
> On Thu, Oct 10, 2013 at 11:26:45AM +0200, David Herrmann wrote:
>> I don't know whether it's intentional, but it is hardcoded this way
>> now. Logic is, ->close() is called on hidraw_disconnect() that is,
>> when hidraw is unloaded on a device. It no longer depends on
>> user-space processes.
>>
>> Any reason to change it back? It's no bug, so if no-one cares I'd
>> leave it as it is now. Otherwise, we can try to change it again.
>
> Well, if you open the device and close it from userspace, the device stays
> opened forever. I'm not sure if that's the intention.
>
> I think that fix for this was already merged.
Indeed, fixed upstream in:
http://git.kernel.org/cgit/linux/kernel/git/jikos/hid.git/commit/?h=for-3.12/upstream-fixes&id=0f5a24c6602063e014ee48892ebf56093241106e
Thanks
David
^ permalink raw reply
* Re: Q: weird hidraw behaviour
From: Mika Westerberg @ 2013-10-10 9:39 UTC (permalink / raw)
To: David Herrmann; +Cc: Jiri Kosina, Manoj Chourasia, open list:HID CORE LAYER
In-Reply-To: <CANq1E4TxGS4NSc3BOon2+zVwkvY2LQTmQowHxOJnypf860+-jw@mail.gmail.com>
On Thu, Oct 10, 2013 at 11:26:45AM +0200, David Herrmann wrote:
> Hi
>
> On Tue, Sep 24, 2013 at 10:56 AM, Mika Westerberg
> <mika.westerberg@linux.intel.com> wrote:
> > Hi,
> >
> > I noticed that after commit 212a871a393 (HID: hidraw: correctly deallocate
> > memory on device disconnect) hidraw doesn't close the underlying hid device
> > when the device node is closed last time.
> >
> > For example I have a touch panel (HID over I2C) device with added debug
> > prints in i2c_hid_open()/i2c_hid_close():
> >
> > # od -x /dev/hidraw0
> > [ 41.363813] i2c_hid 1-004c: i2c_hid_power lvl:32
> > [ 41.368464] i2c_hid 1-004c: i2c_hid_set_power
> > [ 41.372831] i2c_hid 1-004c: __i2c_hid_command: cmd=54 01 00 08
> > [ 41.451455] i2c_hid 1-004c: i2c_hid_open
> > ^C
> >
> > # od -x /dev/hidraw0
> > [ 58.420928] i2c_hid 1-004c: i2c_hid_power lvl:32
> > [ 58.425577] i2c_hid 1-004c: i2c_hid_set_power
> > [ 58.429945] i2c_hid 1-004c: __i2c_hid_command: cmd=54 01 00 08
> > [ 58.525276] i2c_hid 1-004c: i2c_hid_open
> > ^C
> >
> > i2c_hid_close() is never called. Is this intended or am I missing
> > something?
>
> I don't know whether it's intentional, but it is hardcoded this way
> now. Logic is, ->close() is called on hidraw_disconnect() that is,
> when hidraw is unloaded on a device. It no longer depends on
> user-space processes.
>
> Any reason to change it back? It's no bug, so if no-one cares I'd
> leave it as it is now. Otherwise, we can try to change it again.
Well, if you open the device and close it from userspace, the device stays
opened forever. I'm not sure if that's the intention.
I think that fix for this was already merged.
^ permalink raw reply
* Re: Q: weird hidraw behaviour
From: David Herrmann @ 2013-10-10 9:26 UTC (permalink / raw)
To: Mika Westerberg; +Cc: Jiri Kosina, Manoj Chourasia, open list:HID CORE LAYER
In-Reply-To: <20130924085606.GI28875@intel.com>
Hi
On Tue, Sep 24, 2013 at 10:56 AM, Mika Westerberg
<mika.westerberg@linux.intel.com> wrote:
> Hi,
>
> I noticed that after commit 212a871a393 (HID: hidraw: correctly deallocate
> memory on device disconnect) hidraw doesn't close the underlying hid device
> when the device node is closed last time.
>
> For example I have a touch panel (HID over I2C) device with added debug
> prints in i2c_hid_open()/i2c_hid_close():
>
> # od -x /dev/hidraw0
> [ 41.363813] i2c_hid 1-004c: i2c_hid_power lvl:32
> [ 41.368464] i2c_hid 1-004c: i2c_hid_set_power
> [ 41.372831] i2c_hid 1-004c: __i2c_hid_command: cmd=54 01 00 08
> [ 41.451455] i2c_hid 1-004c: i2c_hid_open
> ^C
>
> # od -x /dev/hidraw0
> [ 58.420928] i2c_hid 1-004c: i2c_hid_power lvl:32
> [ 58.425577] i2c_hid 1-004c: i2c_hid_set_power
> [ 58.429945] i2c_hid 1-004c: __i2c_hid_command: cmd=54 01 00 08
> [ 58.525276] i2c_hid 1-004c: i2c_hid_open
> ^C
>
> i2c_hid_close() is never called. Is this intended or am I missing
> something?
I don't know whether it's intentional, but it is hardcoded this way
now. Logic is, ->close() is called on hidraw_disconnect() that is,
when hidraw is unloaded on a device. It no longer depends on
user-space processes.
Any reason to change it back? It's no bug, so if no-one cares I'd
leave it as it is now. Otherwise, we can try to change it again.
Regards
David
^ permalink raw reply
* Re: [PATCH 1/1] HID: wiimote: invert Y-Axis and add automatic calibration for Wii U Pro Controller
From: David Herrmann @ 2013-10-10 9:16 UTC (permalink / raw)
To: Rafael Brune; +Cc: open list:HID CORE LAYER
In-Reply-To: <1381085096-4511-1-git-send-email-mail@rbrune.de>
Hi
On Sun, Oct 6, 2013 at 8:44 PM, Rafael Brune <mail@rbrune.de> wrote:
> With these changes the Wii U Pro Controller fully complies
> to the gamepad-API and with the calibration is fully usable
> out-of-the-box without any user-space tools. This potentially
> breaks compatibility with software that relies on the two
> inverted Y-Axis but since current bluez 4.x and 5.x versions
> don't even support pairing with the controller yet the amount
> of people affected should be rather small.
Did anyone try to read the calibration values from the EEPROM? Doing
calibration in the kernel is fine, but I'd rather have the
hardware-calibration values instead. Even if we cannot figure it out
now, we should try to stay as compatible to the real values as we can.
So how about keeping the min/max and neutral point as we have it know
and instead adjusting the reported values by scaling/moving them?
> Signed-off-by: Rafael Brune <mail@rbrune.de>
> ---
> drivers/hid/hid-wiimote-modules.c | 45 +++++++++++++++++++++++++++++++++++----
> 1 file changed, 41 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/hid/hid-wiimote-modules.c b/drivers/hid/hid-wiimote-modules.c
> index 2e7d644..1422b0b 100644
> --- a/drivers/hid/hid-wiimote-modules.c
> +++ b/drivers/hid/hid-wiimote-modules.c
> @@ -1640,10 +1640,41 @@ static void wiimod_pro_in_ext(struct wiimote_data *wdata, const __u8 *ext)
> ly = (ext[4] & 0xff) | ((ext[5] & 0x0f) << 8);
> ry = (ext[6] & 0xff) | ((ext[7] & 0x0f) << 8);
>
> - input_report_abs(wdata->extension.input, ABS_X, lx - 0x800);
> - input_report_abs(wdata->extension.input, ABS_Y, ly - 0x800);
> - input_report_abs(wdata->extension.input, ABS_RX, rx - 0x800);
> - input_report_abs(wdata->extension.input, ABS_RY, ry - 0x800);
> + /* Calibrating the sticks by saving the global min/max per axis */
> + if (lx < wdata->state.calib_bboard[0][0])
> + wdata->state.calib_bboard[0][0] = lx;
> + if (lx > wdata->state.calib_bboard[0][1])
> + wdata->state.calib_bboard[0][1] = lx;
> +
> + if (ly < wdata->state.calib_bboard[1][0])
> + wdata->state.calib_bboard[1][0] = ly;
> + if (ly > wdata->state.calib_bboard[1][1])
> + wdata->state.calib_bboard[1][1] = ly;
> +
> + if (rx < wdata->state.calib_bboard[2][0])
> + wdata->state.calib_bboard[2][0] = rx;
> + if (rx > wdata->state.calib_bboard[2][1])
> + wdata->state.calib_bboard[2][1] = rx;
> +
> + if (ry < wdata->state.calib_bboard[3][0])
> + wdata->state.calib_bboard[3][0] = ry;
> + if (ry > wdata->state.calib_bboard[3][1])
> + wdata->state.calib_bboard[3][1] = ry;
> +
> + /* Normalize using int math to prevent conversion to/from float */
> + lx = -2048 + (((__s32)(lx - wdata->state.calib_bboard[0][0]) * 4096)/
> + (wdata->state.calib_bboard[0][1]-wdata->state.calib_bboard[0][0]));
> + ly = -2048 + (((__s32)(ly - wdata->state.calib_bboard[1][0]) * 4096)/
> + (wdata->state.calib_bboard[1][1]-wdata->state.calib_bboard[1][0]));
> + rx = -2048 + (((__s32)(rx - wdata->state.calib_bboard[2][0]) * 4096)/
> + (wdata->state.calib_bboard[2][1]-wdata->state.calib_bboard[2][0]));
> + ry = -2048 + (((__s32)(ry - wdata->state.calib_bboard[3][0]) * 4096)/
> + (wdata->state.calib_bboard[3][1]-wdata->state.calib_bboard[3][0]));
Don't use calib_bboard. Add a new array (or use a union). This is confusing.
> +
> + input_report_abs(wdata->extension.input, ABS_X, lx);
> + input_report_abs(wdata->extension.input, ABS_Y, -ly);
> + input_report_abs(wdata->extension.input, ABS_RX, rx);
> + input_report_abs(wdata->extension.input, ABS_RY, -ry);
>
> input_report_key(wdata->extension.input,
> wiimod_pro_map[WIIMOD_PRO_KEY_RIGHT],
> @@ -1760,6 +1791,12 @@ static int wiimod_pro_probe(const struct wiimod_ops *ops,
> if (!wdata->extension.input)
> return -ENOMEM;
>
> + /* Initialize min/max values for all Axis with reasonable values */
> + for (i = 0; i < 4; ++i) {
> + wdata->state.calib_bboard[i][0] = 0x780;
> + wdata->state.calib_bboard[i][1] = 0x880;
Ugh, these values look weird. We have a reported range of -0x400 to
+0x400 but you limit it to a virtual range of 0x100. That's a loss of
precision of 80%. Where are these values from?
> + }
> +
> set_bit(FF_RUMBLE, wdata->extension.input->ffbit);
> input_set_drvdata(wdata->extension.input, wdata);
Thanks for hacking this up. Could you give me some values from your
device so I can see how big the deviation is? My device reports:
Range: 0-4095 (0x0fff)
Neutral-Point: 2048 (0x800)
I haven't seen any big deviations from these values. I can try to take
this over if you want, just let me know.
Thanks
David
^ permalink raw reply
* Re: [PATCH 2/3] HID:hid-lg: Fixed Report Descriptor for Logitech MOMO Force (Black) to split Accel/Brake into seperate axis
From: Jiri Kosina @ 2013-10-10 8:02 UTC (permalink / raw)
To: Simon Wood
Cc: linux-input, linux-kernel, Elias Vanderstuyft, Michal Malý
In-Reply-To: <1381363487-2167-2-git-send-email-simon@mungewell.org>
On Wed, 9 Oct 2013, Simon Wood wrote:
>
> Signed-off-by: Simon Wood <simon@mungewell.org>
Simon,
thanks for the series. I however very much dislike commits without a
single line of changelog ... could you please resend the series with a few
sentences as a patch description (i.e. what, why, how).
Thanks a lot.
> ---
> drivers/hid/hid-lg.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 58 insertions(+)
>
> diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
> index c6efdae..545da44 100644
> --- a/drivers/hid/hid-lg.c
> +++ b/drivers/hid/hid-lg.c
> @@ -47,6 +47,7 @@
> #define DFP_RDESC_ORIG_SIZE 97
> #define FV_RDESC_ORIG_SIZE 130
> #define MOMO_RDESC_ORIG_SIZE 87
> +#define MOMO2_RDESC_ORIG_SIZE 87
>
> /* Fixed report descriptors for Logitech Driving Force (and Pro)
> * wheel controllers
> @@ -284,6 +285,54 @@ static __u8 momo_rdesc_fixed[] = {
> 0xC0 /* End Collection */
> };
>
> +static __u8 momo2_rdesc_fixed[] = {
> +0x05, 0x01, /* Usage Page (Desktop), */
> +0x09, 0x04, /* Usage (Joystik), */
> +0xA1, 0x01, /* Collection (Application), */
> +0xA1, 0x02, /* Collection (Logical), */
> +0x95, 0x01, /* Report Count (1), */
> +0x75, 0x0A, /* Report Size (10), */
> +0x15, 0x00, /* Logical Minimum (0), */
> +0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
> +0x35, 0x00, /* Physical Minimum (0), */
> +0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
> +0x09, 0x30, /* Usage (X), */
> +0x81, 0x02, /* Input (Variable), */
> +0x95, 0x0A, /* Report Count (10), */
> +0x75, 0x01, /* Report Size (1), */
> +0x25, 0x01, /* Logical Maximum (1), */
> +0x45, 0x01, /* Physical Maximum (1), */
> +0x05, 0x09, /* Usage Page (Button), */
> +0x19, 0x01, /* Usage Minimum (01h), */
> +0x29, 0x0A, /* Usage Maximum (0Ah), */
> +0x81, 0x02, /* Input (Variable), */
> +0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
> +0x09, 0x00, /* Usage (00h), */
> +0x95, 0x04, /* Report Count (4), */
> +0x81, 0x02, /* Input (Variable), */
> +0x95, 0x01, /* Report Count (1), */
> +0x75, 0x08, /* Report Size (8), */
> +0x26, 0xFF, 0x00, /* Logical Maximum (255), */
> +0x46, 0xFF, 0x00, /* Physical Maximum (255), */
> +0x09, 0x01, /* Usage (01h), */
> +0x81, 0x02, /* Input (Variable), */
> +0x05, 0x01, /* Usage Page (Desktop), */
> +0x09, 0x31, /* Usage (Y), */
> +0x81, 0x02, /* Input (Variable), */
> +0x09, 0x32, /* Usage (Z), */
> +0x81, 0x02, /* Input (Variable), */
> +0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
> +0x09, 0x00, /* Usage (00h), */
> +0x81, 0x02, /* Input (Variable), */
> +0xC0, /* End Collection, */
> +0xA1, 0x02, /* Collection (Logical), */
> +0x09, 0x02, /* Usage (02h), */
> +0x95, 0x07, /* Report Count (7), */
> +0x91, 0x02, /* Output (Variable), */
> +0xC0, /* End Collection, */
> +0xC0 /* End Collection */
> +};
> +
> /*
> * Certain Logitech keyboards send in report #3 keys which are far
> * above the logical maximum described in descriptor. This extends
> @@ -343,6 +392,15 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
> }
> break;
>
> + case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
> + if (*rsize == MOMO2_RDESC_ORIG_SIZE) {
> + hid_info(hdev,
> + "fixing up Logitech Momo Racing Force (Black) report descriptor\n");
> + rdesc = momo2_rdesc_fixed;
> + *rsize = sizeof(momo2_rdesc_fixed);
> + }
> + break;
> +
> case USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL:
> if (*rsize == FV_RDESC_ORIG_SIZE) {
> hid_info(hdev,
> --
> 1.8.1.2
>
--
Jiri Kosina
SUSE Labs
^ permalink raw reply
* [PATCH 3/3] HID:Kconfig: Correct MOMO description in wrong place (handled by LG4FF).
From: Simon Wood @ 2013-10-10 0:04 UTC (permalink / raw)
To: linux-input
Cc: Jiri Kosina, linux-kernel, simon, Elias Vanderstuyft,
Michal Malý
In-Reply-To: <1381363487-2167-1-git-send-email-simon@mungewell.org>
Signed-off-by: Simon Wood <simon@mungewell.org>
---
drivers/hid/Kconfig | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 46fd27f..aee7182 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -362,7 +362,6 @@ config LOGITECH_FF
- Logitech WingMan Force 3D
- Logitech Formula Force EX
- Logitech WingMan Formula Force GP
- - Logitech MOMO Force wheel
and if you want to enable force feedback for them.
Note: if you say N here, this device will still be supported, but without
--
1.8.1.2
^ permalink raw reply related
* [PATCH 2/3] HID:hid-lg: Fixed Report Descriptor for Logitech MOMO Force (Black) to split Accel/Brake into seperate axis
From: Simon Wood @ 2013-10-10 0:04 UTC (permalink / raw)
To: linux-input
Cc: Jiri Kosina, linux-kernel, simon, Elias Vanderstuyft,
Michal Malý
In-Reply-To: <1381363487-2167-1-git-send-email-simon@mungewell.org>
Signed-off-by: Simon Wood <simon@mungewell.org>
---
drivers/hid/hid-lg.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index c6efdae..545da44 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -47,6 +47,7 @@
#define DFP_RDESC_ORIG_SIZE 97
#define FV_RDESC_ORIG_SIZE 130
#define MOMO_RDESC_ORIG_SIZE 87
+#define MOMO2_RDESC_ORIG_SIZE 87
/* Fixed report descriptors for Logitech Driving Force (and Pro)
* wheel controllers
@@ -284,6 +285,54 @@ static __u8 momo_rdesc_fixed[] = {
0xC0 /* End Collection */
};
+static __u8 momo2_rdesc_fixed[] = {
+0x05, 0x01, /* Usage Page (Desktop), */
+0x09, 0x04, /* Usage (Joystik), */
+0xA1, 0x01, /* Collection (Application), */
+0xA1, 0x02, /* Collection (Logical), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x0A, /* Report Size (10), */
+0x15, 0x00, /* Logical Minimum (0), */
+0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+0x35, 0x00, /* Physical Minimum (0), */
+0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
+0x09, 0x30, /* Usage (X), */
+0x81, 0x02, /* Input (Variable), */
+0x95, 0x0A, /* Report Count (10), */
+0x75, 0x01, /* Report Size (1), */
+0x25, 0x01, /* Logical Maximum (1), */
+0x45, 0x01, /* Physical Maximum (1), */
+0x05, 0x09, /* Usage Page (Button), */
+0x19, 0x01, /* Usage Minimum (01h), */
+0x29, 0x0A, /* Usage Maximum (0Ah), */
+0x81, 0x02, /* Input (Variable), */
+0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
+0x09, 0x00, /* Usage (00h), */
+0x95, 0x04, /* Report Count (4), */
+0x81, 0x02, /* Input (Variable), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x08, /* Report Size (8), */
+0x26, 0xFF, 0x00, /* Logical Maximum (255), */
+0x46, 0xFF, 0x00, /* Physical Maximum (255), */
+0x09, 0x01, /* Usage (01h), */
+0x81, 0x02, /* Input (Variable), */
+0x05, 0x01, /* Usage Page (Desktop), */
+0x09, 0x31, /* Usage (Y), */
+0x81, 0x02, /* Input (Variable), */
+0x09, 0x32, /* Usage (Z), */
+0x81, 0x02, /* Input (Variable), */
+0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
+0x09, 0x00, /* Usage (00h), */
+0x81, 0x02, /* Input (Variable), */
+0xC0, /* End Collection, */
+0xA1, 0x02, /* Collection (Logical), */
+0x09, 0x02, /* Usage (02h), */
+0x95, 0x07, /* Report Count (7), */
+0x91, 0x02, /* Output (Variable), */
+0xC0, /* End Collection, */
+0xC0 /* End Collection */
+};
+
/*
* Certain Logitech keyboards send in report #3 keys which are far
* above the logical maximum described in descriptor. This extends
@@ -343,6 +392,15 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
}
break;
+ case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
+ if (*rsize == MOMO2_RDESC_ORIG_SIZE) {
+ hid_info(hdev,
+ "fixing up Logitech Momo Racing Force (Black) report descriptor\n");
+ rdesc = momo2_rdesc_fixed;
+ *rsize = sizeof(momo2_rdesc_fixed);
+ }
+ break;
+
case USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL:
if (*rsize == FV_RDESC_ORIG_SIZE) {
hid_info(hdev,
--
1.8.1.2
^ permalink raw reply related
* [PATCH 1/3] HID:hid-lg: Fixed ReportDescriptor for Logitech Formular Vibration to split Accel/Brake into seperate axis
From: Simon Wood @ 2013-10-10 0:04 UTC (permalink / raw)
To: linux-input
Cc: Jiri Kosina, linux-kernel, simon, Elias Vanderstuyft,
Michal Malý
Requires https://patchwork.kernel.org/patch/2998241/
Signed-off-by: Simon Wood <simon@mungewell.org>
---
drivers/hid/hid-lg.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index c2c7dab..c6efdae 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -45,6 +45,7 @@
/* Size of the original descriptors of the Driving Force (and Pro) wheels */
#define DF_RDESC_ORIG_SIZE 130
#define DFP_RDESC_ORIG_SIZE 97
+#define FV_RDESC_ORIG_SIZE 130
#define MOMO_RDESC_ORIG_SIZE 87
/* Fixed report descriptors for Logitech Driving Force (and Pro)
@@ -170,6 +171,73 @@ static __u8 dfp_rdesc_fixed[] = {
0xC0 /* End Collection */
};
+static __u8 fv_rdesc_fixed[] = {
+0x05, 0x01, /* Usage Page (Desktop), */
+0x09, 0x04, /* Usage (Joystik), */
+0xA1, 0x01, /* Collection (Application), */
+0xA1, 0x02, /* Collection (Logical), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x0A, /* Report Size (10), */
+0x15, 0x00, /* Logical Minimum (0), */
+0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+0x35, 0x00, /* Physical Minimum (0), */
+0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
+0x09, 0x30, /* Usage (X), */
+0x81, 0x02, /* Input (Variable), */
+0x95, 0x0C, /* Report Count (12), */
+0x75, 0x01, /* Report Size (1), */
+0x25, 0x01, /* Logical Maximum (1), */
+0x45, 0x01, /* Physical Maximum (1), */
+0x05, 0x09, /* Usage Page (Button), */
+0x19, 0x01, /* Usage Minimum (01h), */
+0x29, 0x0C, /* Usage Maximum (0Ch), */
+0x81, 0x02, /* Input (Variable), */
+0x95, 0x02, /* Report Count (2), */
+0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
+0x09, 0x01, /* Usage (01h), */
+0x81, 0x02, /* Input (Variable), */
+0x09, 0x02, /* Usage (02h), */
+0x26, 0xFF, 0x00, /* Logical Maximum (255), */
+0x46, 0xFF, 0x00, /* Physical Maximum (255), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x08, /* Report Size (8), */
+0x81, 0x02, /* Input (Variable), */
+0x05, 0x01, /* Usage Page (Desktop), */
+0x25, 0x07, /* Logical Maximum (7), */
+0x46, 0x3B, 0x01, /* Physical Maximum (315), */
+0x75, 0x04, /* Report Size (4), */
+0x65, 0x14, /* Unit (Degrees), */
+0x09, 0x39, /* Usage (Hat Switch), */
+0x81, 0x42, /* Input (Variable, Null State), */
+0x75, 0x01, /* Report Size (1), */
+0x95, 0x04, /* Report Count (4), */
+0x65, 0x00, /* Unit, */
+0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
+0x09, 0x01, /* Usage (01h), */
+0x25, 0x01, /* Logical Maximum (1), */
+0x45, 0x01, /* Physical Maximum (1), */
+0x81, 0x02, /* Input (Variable), */
+0x05, 0x01, /* Usage Page (Desktop), */
+0x95, 0x01, /* Report Count (1), */
+0x75, 0x08, /* Report Size (8), */
+0x26, 0xFF, 0x00, /* Logical Maximum (255), */
+0x46, 0xFF, 0x00, /* Physical Maximum (255), */
+0x09, 0x31, /* Usage (Y), */
+0x81, 0x02, /* Input (Variable), */
+0x09, 0x32, /* Usage (Z), */
+0x81, 0x02, /* Input (Variable), */
+0xC0, /* End Collection, */
+0xA1, 0x02, /* Collection (Logical), */
+0x26, 0xFF, 0x00, /* Logical Maximum (255), */
+0x46, 0xFF, 0x00, /* Physical Maximum (255), */
+0x95, 0x07, /* Report Count (7), */
+0x75, 0x08, /* Report Size (8), */
+0x09, 0x03, /* Usage (03h), */
+0x91, 0x02, /* Output (Variable), */
+0xC0, /* End Collection, */
+0xC0 /* End Collection */
+};
+
static __u8 momo_rdesc_fixed[] = {
0x05, 0x01, /* Usage Page (Desktop), */
0x09, 0x04, /* Usage (Joystik), */
@@ -275,6 +343,15 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
}
break;
+ case USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL:
+ if (*rsize == FV_RDESC_ORIG_SIZE) {
+ hid_info(hdev,
+ "fixing up Logitech Formula Vibration report descriptor\n");
+ rdesc = fv_rdesc_fixed;
+ *rsize = sizeof(fv_rdesc_fixed);
+ }
+ break;
+
case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
if (*rsize == DFP_RDESC_ORIG_SIZE) {
hid_info(hdev,
--
1.8.1.2
^ permalink raw reply related
* [PATCH 2/2] ARM: dts: N900: TWL4030 Keypad Matrix definition
From: Sebastian Reichel @ 2013-10-09 21:17 UTC (permalink / raw)
To: Sebastian Reichel, linux-input
Cc: 'Benoît Cousson', Tony Lindgren, Rob Herring,
Pawel Moll, Mark Rutland, Stephen Warren, Ian Campbell,
Rob Landley, Russell King, Dmitry Torokhov, Grant Likely,
devicetree, linux-doc, linux-kernel, linux-arm-kernel, linux-omap,
Sebastian Reichel
In-Reply-To: <1381353447-32708-1-git-send-email-sre@debian.org>
Add Keyboard Matrix information to N900's DTS file.
This patch maps the keys exactly as the original
board code.
Signed-off-by: Sebastian Reichel <sre@debian.org>
---
arch/arm/boot/dts/omap3-n900.dts | 55 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts
index 0fbb77e..d11ff6e 100644
--- a/arch/arm/boot/dts/omap3-n900.dts
+++ b/arch/arm/boot/dts/omap3-n900.dts
@@ -120,6 +120,61 @@
#include "twl4030.dtsi"
#include "twl4030_omap3.dtsi"
+&twl_keypad {
+ linux,keymap = < 0x00000010 /* KEY_Q */
+ 0x00010018 /* KEY_O */
+ 0x00020019 /* KEY_P */
+ 0x00030033 /* KEY_COMMA */
+ 0x0004000e /* KEY_BACKSPACE */
+ 0x0006001e /* KEY_A */
+ 0x0007001f /* KEY_S */
+
+ 0x01000011 /* KEY_W */
+ 0x01010020 /* KEY_D */
+ 0x01020021 /* KEY_F */
+ 0x01030022 /* KEY_G */
+ 0x01040023 /* KEY_H */
+ 0x01050024 /* KEY_J */
+ 0x01060025 /* KEY_K */
+ 0x01070026 /* KEY_L */
+
+ 0x02000012 /* KEY_E */
+ 0x02010034 /* KEY_DOT */
+ 0x02020067 /* KEY_UP */
+ 0x0203001c /* KEY_ENTER */
+ 0x0205002c /* KEY_Z */
+ 0x0206002d /* KEY_X */
+ 0x0207002e /* KEY_C */
+ 0x02080043 /* KEY_F9 */
+
+ 0x03000013 /* KEY_R */
+ 0x0301002f /* KEY_V */
+ 0x03020030 /* KEY_B */
+ 0x03030031 /* KEY_N */
+ 0x03040032 /* KEY_M */
+ 0x03050039 /* KEY_SPACE */
+ 0x03060039 /* KEY_SPACE */
+ 0x03070069 /* KEY_LEFT */
+
+ 0x04000014 /* KEY_T */
+ 0x0401006c /* KEY_DOWN */
+ 0x0402006a /* KEY_RIGHT */
+ 0x0404001d /* KEY_LEFTCTRL */
+ 0x04050064 /* KEY_RIGHTALT */
+ 0x0406002a /* KEY_LEFTSHIFT */
+ 0x04080044 /* KEY_F10 */
+
+ 0x05000015 /* KEY_Y */
+ 0x05080057 /* KEY_F11 */
+
+ 0x06000016 /* KEY_U */
+
+ 0x07000017 /* KEY_I */
+ 0x07010041 /* KEY_F7 */
+ 0x07020042 /* KEY_F8 */
+ >;
+};
+
&twl_gpio {
ti,pullups = <0x0>;
ti,pulldowns = <0x03ff3f>; /* BIT(0..5) | BIT(8..17) */
--
1.8.4.rc3
^ permalink raw reply related
* [PATCH 1/2] Input: twl4030_keypad - add device tree support
From: Sebastian Reichel @ 2013-10-09 21:17 UTC (permalink / raw)
To: Sebastian Reichel, linux-input
Cc: 'Benoît Cousson', Tony Lindgren, Rob Herring,
Pawel Moll, Mark Rutland, Stephen Warren, Ian Campbell,
Rob Landley, Russell King, Dmitry Torokhov, Grant Likely,
devicetree, linux-doc, linux-kernel, linux-arm-kernel, linux-omap,
Sebastian Reichel
Add device tree support for twl4030 keypad driver and update the
Documentation with twl4030 keypad device tree binding information.
This patch also adds a twl4030 keypad node to the twl4030.dtsi file,
so that board files can just add the keymap.
Tested on Nokia N900.
Signed-off-by: Sebastian Reichel <sre@debian.org>
---
.../devicetree/bindings/input/twl4030-keypad.txt | 31 ++++++++
arch/arm/boot/dts/twl4030.dtsi | 7 ++
drivers/input/keyboard/twl4030_keypad.c | 91 ++++++++++++++++++----
3 files changed, 112 insertions(+), 17 deletions(-)
create mode 100644 Documentation/devicetree/bindings/input/twl4030-keypad.txt
diff --git a/Documentation/devicetree/bindings/input/twl4030-keypad.txt b/Documentation/devicetree/bindings/input/twl4030-keypad.txt
new file mode 100644
index 0000000..2b4bd7a
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/twl4030-keypad.txt
@@ -0,0 +1,31 @@
+* TWL4030's Keypad Controller device tree bindings
+
+TWL4030's Keypad controller is used to interface a SoC with a matrix-type
+keypad device. The keypad controller supports multiple row and column lines.
+A key can be placed at each intersection of a unique row and a unique column.
+The keypad controller can sense a key-press and key-release and report the
+event using a interrupt to the cpu.
+
+This binding is based on the matrix-keymap binding with the following
+changes:
+
+ * keypad,num-rows and keypad,num-columns are required.
+
+Required SoC Specific Properties:
+- compatible: should be one of the following
+ - "ti,twl4030-keypad": For controllers compatible with twl4030 keypad
+ controller.
+- interrupt: should be one of the following
+ - <1>: For controllers compatible with twl4030 keypad controller.
+
+Optional Properties specific to linux:
+- linux,keypad-no-autorepeat: do no enable autorepeat feature.
+
+Example:
+ twl_keypad: keypad {
+ compatible = "ti,twl4030-keypad";
+ interrupts = <1>;
+ keypad,num-rows = <8>;
+ keypad,num-columns = <8>;
+ linux,keypad-no-autorepeat;
+ };
diff --git a/arch/arm/boot/dts/twl4030.dtsi b/arch/arm/boot/dts/twl4030.dtsi
index ae6a17a..773c94c 100644
--- a/arch/arm/boot/dts/twl4030.dtsi
+++ b/arch/arm/boot/dts/twl4030.dtsi
@@ -97,4 +97,11 @@
compatible = "ti,twl4030-pwmled";
#pwm-cells = <2>;
};
+
+ twl_keypad: keypad {
+ compatible = "ti,twl4030-keypad";
+ interrupts = <1>;
+ keypad,num-rows = <8>;
+ keypad,num-columns = <8>;
+ };
};
diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c
index d2d178c..3cd8090 100644
--- a/drivers/input/keyboard/twl4030_keypad.c
+++ b/drivers/input/keyboard/twl4030_keypad.c
@@ -33,6 +33,7 @@
#include <linux/platform_device.h>
#include <linux/i2c/twl.h>
#include <linux/slab.h>
+#include <linux/of.h>
/*
* The TWL4030 family chips include a keypad controller that supports
@@ -60,6 +61,7 @@
struct twl4030_keypad {
unsigned short keymap[TWL4030_KEYMAP_SIZE];
u16 kp_state[TWL4030_MAX_ROWS];
+ bool no_autorepeat;
unsigned n_rows;
unsigned n_cols;
unsigned irq;
@@ -324,6 +326,31 @@ static int twl4030_kp_program(struct twl4030_keypad *kp)
return 0;
}
+#ifdef CONFIG_OF
+static int twl4030_keypad_parse_dt(struct device *dev,
+ struct twl4030_keypad *keypad_data)
+{
+ struct device_node *np = dev->of_node;
+ int err;
+
+ err = matrix_keypad_parse_of_params(dev, &keypad_data->n_rows,
+ &keypad_data->n_cols);
+ if (err)
+ return err;
+
+ if (of_get_property(np, "linux,input-no-autorepeat", NULL))
+ keypad_data->no_autorepeat = true;
+
+ return 0;
+}
+#else
+static inline int twl4030_keypad_parse_dt(struct device *dev,
+ struct twl4030_keypad *keypad_data)
+{
+ return -ENOSYS;
+}
+#endif
+
/*
* Registers keypad device with input subsystem
* and configures TWL4030 keypad registers
@@ -331,20 +358,12 @@ static int twl4030_kp_program(struct twl4030_keypad *kp)
static int twl4030_kp_probe(struct platform_device *pdev)
{
struct twl4030_keypad_data *pdata = pdev->dev.platform_data;
- const struct matrix_keymap_data *keymap_data;
+ const struct matrix_keymap_data *keymap_data = NULL;
struct twl4030_keypad *kp;
struct input_dev *input;
u8 reg;
int error;
- if (!pdata || !pdata->rows || !pdata->cols || !pdata->keymap_data ||
- pdata->rows > TWL4030_MAX_ROWS || pdata->cols > TWL4030_MAX_COLS) {
- dev_err(&pdev->dev, "Invalid platform_data\n");
- return -EINVAL;
- }
-
- keymap_data = pdata->keymap_data;
-
kp = kzalloc(sizeof(*kp), GFP_KERNEL);
input = input_allocate_device();
if (!kp || !input) {
@@ -352,13 +371,9 @@ static int twl4030_kp_probe(struct platform_device *pdev)
goto err1;
}
- /* Get the debug Device */
- kp->dbg_dev = &pdev->dev;
- kp->input = input;
-
- kp->n_rows = pdata->rows;
- kp->n_cols = pdata->cols;
- kp->irq = platform_get_irq(pdev, 0);
+ /* get the debug device */
+ kp->dbg_dev = &pdev->dev;
+ kp->input = input;
/* setup input device */
input->name = "TWL4030 Keypad";
@@ -370,6 +385,36 @@ static int twl4030_kp_probe(struct platform_device *pdev)
input->id.product = 0x0001;
input->id.version = 0x0003;
+ if (pdata) {
+ if (!pdata->rows || !pdata->cols || !pdata->keymap_data) {
+ dev_err(&pdev->dev, "Missing platform_data\n");
+ error = -EINVAL;
+ goto err1;
+ }
+
+ kp->n_rows = pdata->rows;
+ kp->n_cols = pdata->cols;
+ kp->no_autorepeat = !pdata->rep;
+ keymap_data = pdata->keymap_data;
+ } else {
+ error = twl4030_keypad_parse_dt(&pdev->dev, kp);
+ if (error)
+ goto err1;
+ }
+
+ if (kp->n_rows > TWL4030_MAX_ROWS || kp->n_cols > TWL4030_MAX_COLS) {
+ dev_err(&pdev->dev, "Invalid rows/cols amount specified in platform/devicetree data\n");
+ error = -EINVAL;
+ goto err1;
+ }
+
+ kp->irq = platform_get_irq(pdev, 0);
+ if (!kp->irq) {
+ dev_err(&pdev->dev, "no keyboard irq assigned\n");
+ error = -EINVAL;
+ goto err1;
+ }
+
error = matrix_keypad_build_keymap(keymap_data, NULL,
TWL4030_MAX_ROWS,
1 << TWL4030_ROW_SHIFT,
@@ -381,7 +426,7 @@ static int twl4030_kp_probe(struct platform_device *pdev)
input_set_capability(input, EV_MSC, MSC_SCAN);
/* Enable auto repeat feature of Linux input subsystem */
- if (pdata->rep)
+ if (!kp->no_autorepeat)
__set_bit(EV_REP, input->evbit);
error = input_register_device(input);
@@ -443,6 +488,17 @@ static int twl4030_kp_remove(struct platform_device *pdev)
return 0;
}
+#ifdef CONFIG_OF
+static const struct of_device_id twl4030_keypad_dt_match_table[] = {
+ { .compatible = "ti,twl4030-keypad" },
+ {},
+};
+MODULE_DEVICE_TABLE(of, twl4030_keypad_dt_match_table);
+#define twl4030_keypad_dt_match of_match_ptr(twl4030_keypad_dt_match_table)
+#else
+#define twl4030_keypad_dt_match NULL
+#endif
+
/*
* NOTE: twl4030 are multi-function devices connected via I2C.
* So this device is a child of an I2C parent, thus it needs to
@@ -455,6 +511,7 @@ static struct platform_driver twl4030_kp_driver = {
.driver = {
.name = "twl4030_keypad",
.owner = THIS_MODULE,
+ .of_match_table = twl4030_keypad_dt_match,
},
};
module_platform_driver(twl4030_kp_driver);
--
1.8.4.rc3
^ permalink raw reply related
* Re: [PATCH 1/1 FROM FIXED] Revert "HID: fix unit exponent parsing"
From: Nikolai Kondrashov @ 2013-10-09 21:13 UTC (permalink / raw)
To: Benjamin Tissoires; +Cc: Jiri Kosina, linux-input
In-Reply-To: <5255A391.6040501@gmail.com>
On 10/09/2013 09:42 PM, Nikolai Kondrashov wrote:
>> So definitely, Microsoft considers that the unit exponent is a 4 bits
>> two's complement, otherwise, the firmware will not get a Windows 8
>> certification.
>
> I think this is due to their use of the "HID Descriptor Tool". Maybe
> assuming it is a reference implementation, which it is not, but more likely
> just not noticing the discrepancy.
>
> I'll try to reach Microsoft on this and maybe make them correct their
> specification.
I've started my attempts with a post on Microsoft's official hardware
development forums:
http://social.msdn.microsoft.com/Forums/windowshardware/en-US/e87d0db1-486e-42ae-bf95-d1ac5ffc0b02/unit-exponent-item-value-encoding-in-hid-report-descriptors?forum=whck
Let's see how it goes.
Sincerely,
Nick
^ permalink raw reply
* Re: [PATCH 1/1 FROM FIXED] Revert "HID: fix unit exponent parsing"
From: Nikolai Kondrashov @ 2013-10-09 19:04 UTC (permalink / raw)
To: Benjamin Tissoires; +Cc: Jiri Kosina, linux-input
In-Reply-To: <5255A391.6040501@gmail.com>
On 10/09/2013 09:42 PM, Nikolai Kondrashov wrote:
>> I would say that the current approach (without the revert) is exactly this:
>> - if the data is stored on only 1 byte ( if (!(raw_value&
>> 0xfffffff0))), do the two's complement -> any value less than 7 will
>> be the same, above are considered as negative.
>> - if not, then use the raw value.
>
> It is not exactly what I suggested. It also considers anything above 15 to be
> a normal integer. However, it might be a cleaner way.
>
> All-in-all, I'd say that the relevant hid-core.c code should have its comment
> fixed, and the hid-input.c (hidinput_calc_abs_res) change needs to be reverted
> as it (incorrectly) takes the component unit power into account for resolution
> calculation and makes the "unit" item value handling harder to comprehend.
On a second glance at the test data, hid-core.c needs to be fixed as well, as
for the non-nibble case it loses the sign by reading the item value as
unsigned. So a perfectly valid 1 byte 0xFD value becomes 253, instead of -3.
I'll include that into the patch.
Sincerely,
Nick
^ permalink raw reply
* Re: [PATCH 1/1 FROM FIXED] Revert "HID: fix unit exponent parsing"
From: Nikolai Kondrashov @ 2013-10-09 18:42 UTC (permalink / raw)
To: Benjamin Tissoires; +Cc: Jiri Kosina, linux-input
In-Reply-To: <CAN+gG=FiMk-EhQi2BE49MXLY71DMJW7cjzGt8wijrAJG_snyHQ@mail.gmail.com>
Hi Benjamin,
On 10/09/2013 12:02 PM, Benjamin Tissoires wrote:
> first, I wouldn't revert the patch as this, because I think the patch
> also fixes the nibbles parsing in unit:
> - the part regarding the unit exponent seems blurry
> - the part regarding the unit exponent seems correct to me.
This statement is sure confusing :)
> On Wed, Oct 9, 2013 at 9:37 AM, Nikolai Kondrashov<spbnick@gmail.com> wrote:
>> On 10/08/2013 10:05 PM, Nikolai Kondrashov wrote:
>> From what data I have on various non-Wacom graphics tablets, most of the
>> older ones provide incorrect "unit" item value, so "unit exponent" doesn't
>> apply.
>
> Yes. The "correct" specification of unit and unit exponent has only be
> a requirements since Windows 8 [1]. (Note, there used to be a pdf [2],
> which I found more convenient to read, but still...).
I've stumbled on the very same document yesterday.
> So definitely, Microsoft considers that the unit exponent is a 4 bits
> two's complement, otherwise, the firmware will not get a Windows 8
> certification.
I think this is due to their use of the "HID Descriptor Tool". Maybe
assuming it is a reference implementation, which it is not, but more likely
just not noticing the discrepancy.
I'll try to reach Microsoft on this and maybe make them correct their
specification.
>> Meanwhile, can I suggest a hybrid approach? As positive unit exponent
>> beyond 7 is unlikely to appear for axes which have their resolution
>> calculated currently, can we assume anything higher than 7 to be
>> nibble-stored negative exponents and anything else normal signed integers?
>
> I would say that the current approach (without the revert) is exactly this:
> - if the data is stored on only 1 byte ( if (!(raw_value&
> 0xfffffff0))), do the two's complement -> any value less than 7 will
> be the same, above are considered as negative.
> - if not, then use the raw value.
It is not exactly what I suggested. It also considers anything above 15 to be
a normal integer. However, it might be a cleaner way.
All-in-all, I'd say that the relevant hid-core.c code should have its comment
fixed, and the hid-input.c (hidinput_calc_abs_res) change needs to be reverted
as it (incorrectly) takes the component unit power into account for resolution
calculation and makes the "unit" item value handling harder to comprehend.
I'll prepare and test a patch and we can carry on from there.
> Could you please share some of the report descriptors which you found
> problematic, so that I can have a better understanding of the problem?
> If you want to have a look at some multitouch descriptors (and few
> other devices), I started to build a database of hid devices[3].
I have my repository of tablet diagnostics published at
https://github.com/DIGImend/devices
The original report descriptors are in */rd/original*.txt files and their XML
representation is in */rd/original*.xml files. Most (if not all) of them have
the "unit exponent" as nibble.
The XML representation was created by my "hidrd-convert" tool [1], which can
also output binary, specification example format and code from either binary
or XML input.
I use it to generate fixed report descriptors for graphics tablets. Maybe you
can find it useful as well. However, it interprets the "unit exponent" per
specification, i.e. just as an integer.
> [1] http://msdn.microsoft.com/en-us/library/windows/hardware/dn383621.aspx
> [2] http://feishare.com/attachments/article/299/windows-pointer-device-protocol.pdf
> [3] https://github.com/bentiss/hid-devices
>
> PS: I'll be mostly offline until the 1st of November when I'll finish
> my transfer to the RH Westford Office.
> PPS: my nick on the RH internal IRC is bentiss :)
My nick there is "nkondrashov". However, I would prefer to keep this
discussion on the mailing list.
Good luck in the US!
Sincerely,
Nick
[1] https://sf.net/apps/mediawiki/digimend?title=Hidrd
^ permalink raw reply
* Re: PROBLEM: XPS 12-9Q33 touchpad not recognized, problem with i2c_hid module
From: Wouter van der Graaf @ 2013-10-09 12:17 UTC (permalink / raw)
To: Benjamin Tissoires; +Cc: linux-input, Jiri Kosina
In-Reply-To: <CAN+gG=GnpGYVfrXL9ZB6mX1p+ODEWWp9SDKYnd_aw7bpCuf8dw@mail.gmail.com>
Hi Benjamin,
Thank you very much for your response.
> ok, this is something which was expected to happen at some point (at
> least which does not surprise me :-P ).
Is HID over i2c something new, only found in newer 'ultrabooks'?
> The solution is to write a proper driver for the Synaptics i2c-hid
> touchpad, when in HID mode. I started doing this some months ago, and
> I will have to ping Synaptics again to this extend.
If there is anything I can contribute to, let me know. I'm not a kernel
dev with any C experience, but I am a developer using Linux 10+ years.
The least I can do is test the bunch :-)
> However, I will not be able to do anything before Nov. 1st.
That's fine, of course. Is there a way for me to follow progress on this
issue, e.g. bug tracker? Do you want me to take action?
Again thank you for your time.
Wouter
^ permalink raw reply
* Re: PROBLEM: XPS 12-9Q33 touchpad not recognized, problem with i2c_hid module
From: Benjamin Tissoires @ 2013-10-09 11:03 UTC (permalink / raw)
To: Wouter van der Graaf; +Cc: linux-input, Jiri Kosina
In-Reply-To: <525274D2.8080707@dynora.nl>
Hi Wouter,
(Adding in CC Jiri, the HID maintainer)
ok, this is something which was expected to happen at some point (at
least which does not surprise me :-P ).
The solution is to write a proper driver for the Synaptics i2c-hid
touchpad, when in HID mode. I started doing this some months ago, and
I will have to ping Synaptics again to this extend.
However, I will not be able to do anything before Nov. 1st.
Cheers,
Benjamin
On Mon, Oct 7, 2013 at 10:46 AM, Wouter van der Graaf <wouter@dynora.nl> wrote:
> Dear Maintainers,
>
> [1.] One line summary of the problem:
>
> Dell XPS 12-9Q33 touchpad is not recognized, works when i2c_hid (needed for
> touchscreen) is blacklisted
>
>
> [2.] Full description of the problem/report:
>
> Problem exists in kernels 3.10, 3.11 and 3.12rc3 (latest mainline kernel
> release as of this writing).
>
> The Dell XPS 12, 2013 Haswell version, comes with both multitouch
> touchscreen and touchpad, of which only the touchscreen functions correctly.
> The touchpad is not correctly detected and acts like a generic pointing
> device without any touchpad (multitouch, scrolling, etc.) features.
>
> Below I've included environment and device information as well as Xorg log,
> xinput list and dmesg output.
>
> The device named "DLL05E3:01 06CB:2734" is the touchpad.
>
> When i2c_hid module is blacklisted, the touchpad *does* work and is detected
> by the psmouse module as a Synaptics touchpad. However, the touchscreen
> needs the i2c_hid module.
>
> With i2c_hid module enabled, both touchpad and touchscreen are detected by
> i2c_hid, but maybe this causes a conflict and the psmouse module is not able
> to detect the touchpad anymore.
>
>
> [3.] Keywords (i.e., modules, networking, kernel):
>
>
> [4.] Kernel version (from /proc/version):
>
> Linux version 3.12.0-031200rc3-generic (apw@gomeisa) (gcc version 4.6.3
> (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #201309291835 SMP Sun Sep 29 22:37:02 UTC
> 2013
>
>
> [5.] Output of Oops.. message (if applicable) with symbolic information
> resolved (see Documentation/oops-tracing.txt)
>
> N/A
>
>
> [6.] A small shell script or example program which triggers the
> problem (if possible)
>
> N/A
>
>
> [7.] Environment
>
> Description: Ubuntu Saucy Salamander (development branch)
> Release: 13.10
>
>
> [7.1.] Software (add the output of the ver_linux script here)
>
> Linux wouter-xps12 3.12.0-031200rc3-generic #201309291835 SMP Sun Sep 29
> 22:37:02 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
>
> Gnu C 4.8
> Gnu make 3.81
> binutils 2.23.52.20130913
> util-linux 2.20.1
> mount support
> module-init-tools 9
> e2fsprogs 1.42.8
> pcmciautils 018
> PPP 2.4.5
> Linux C Library 2.17
> Dynamic linker (ldd) 2.17
> Procps 3.3.3
> Net-tools 1.60
> Kbd 1.15.5
> Sh-utils 8.20
> wireless-tools 30
> Modules Loaded dm_crypt x86_pkg_temp_thermal coretemp kvm_intel kvm
> crct10dif_pclmul crc32_pclmul ghash_clmulni_intel aesni_intel aes_x86_64 lrw
> gf128mul glue_helper ablk_helper cryptd joydev pn544_mei mei_phy pn544 hci
> snd_hda_codec_realtek nfc snd_hda_codec_hdmi hid_sensor_magn_3d
> hid_sensor_accel_3d hid_sensor_gyro_3d hid_sensor_trigger
> industrialio_triggered_buffer kfifo_buf industrialio arc4 snd_hda_intel
> hid_sensor_iio_common snd_hda_codec snd_hwdep hid_multitouch snd_pcm
> hid_generic dell_wmi sparse_keymap snd_page_alloc snd_seq_midi
> snd_seq_midi_event snd_rawmidi dell_laptop parport_pc dcdbas ppdev snd_seq
> mei_me uvcvideo hid_sensor_hub iwlmvm microcode videobuf2_vmalloc
> videobuf2_memops mac80211 videobuf2_core mei videodev usb_storage rfcomm
> bnep psmouse iwlwifi serio_raw snd_seq_device btusb bluetooth cfg80211
> snd_timer lpc_ich snd soundcore i2c_hid i2c_designware_platform
> i2c_designware_core mac_hid intel_smartconnect tpm_tis nls_iso8859_1 lp
> parport usbhid hid i915 i2c_algo_bit drm_kms_helper ahci drm libahci wmi
> video
>
>
> [7.2.] Processor information (from /proc/cpuinfo):
>
> processor : 0
> vendor_id : GenuineIntel
> cpu family : 6
> model : 69
> model name : Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz
> stepping : 1
> microcode : 0x14
> cpu MHz : 1800.000
> cache size : 4096 KB
> physical id : 0
> siblings : 4
> core id : 0
> cpu cores : 2
> apicid : 0
> initial apicid : 0
> fpu : yes
> fpu_exception : yes
> cpuid level : 13
> wp : yes
> flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
> pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb
> rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology
> nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est
> tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt
> tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb
> xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase
> tsc_adjust bmi1 avx2 smep bmi2 erms invpcid
> bogomips : 4788.86
> clflush size : 64
> cache_alignment : 64
> address sizes : 39 bits physical, 48 bits virtual
> power management:
>
> processor : 1
> vendor_id : GenuineIntel
> cpu family : 6
> model : 69
> model name : Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz
> stepping : 1
> microcode : 0x14
> cpu MHz : 1800.000
> cache size : 4096 KB
> physical id : 0
> siblings : 4
> core id : 1
> cpu cores : 2
> apicid : 2
> initial apicid : 2
> fpu : yes
> fpu_exception : yes
> cpuid level : 13
> wp : yes
> flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
> pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb
> rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology
> nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est
> tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt
> tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb
> xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase
> tsc_adjust bmi1 avx2 smep bmi2 erms invpcid
> bogomips : 4788.86
> clflush size : 64
> cache_alignment : 64
> address sizes : 39 bits physical, 48 bits virtual
> power management:
>
> processor : 2
> vendor_id : GenuineIntel
> cpu family : 6
> model : 69
> model name : Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz
> stepping : 1
> microcode : 0x14
> cpu MHz : 1800.000
> cache size : 4096 KB
> physical id : 0
> siblings : 4
> core id : 0
> cpu cores : 2
> apicid : 1
> initial apicid : 1
> fpu : yes
> fpu_exception : yes
> cpuid level : 13
> wp : yes
> flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
> pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb
> rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology
> nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est
> tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt
> tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb
> xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase
> tsc_adjust bmi1 avx2 smep bmi2 erms invpcid
> bogomips : 4788.86
> clflush size : 64
> cache_alignment : 64
> address sizes : 39 bits physical, 48 bits virtual
> power management:
>
> processor : 3
> vendor_id : GenuineIntel
> cpu family : 6
> model : 69
> model name : Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz
> stepping : 1
> microcode : 0x14
> cpu MHz : 1800.000
> cache size : 4096 KB
> physical id : 0
> siblings : 4
> core id : 1
> cpu cores : 2
> apicid : 3
> initial apicid : 3
> fpu : yes
> fpu_exception : yes
> cpuid level : 13
> wp : yes
> flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
> pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb
> rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology
> nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est
> tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt
> tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb
> xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase
> tsc_adjust bmi1 avx2 smep bmi2 erms invpcid
> bogomips : 4788.86
> clflush size : 64
> cache_alignment : 64
> address sizes : 39 bits physical, 48 bits virtual
> power management:
>
>
> [7.3.] Module information (from /proc/modules):
>
> dm_crypt 23012 1 - Live 0x0000000000000000
> x86_pkg_temp_thermal 14269 0 - Live 0x0000000000000000
> coretemp 17728 0 - Live 0x0000000000000000
> kvm_intel 144049 0 - Live 0x0000000000000000
> kvm 457676 1 kvm_intel, Live 0x0000000000000000
> crct10dif_pclmul 14250 0 - Live 0x0000000000000000
> crc32_pclmul 13160 0 - Live 0x0000000000000000
> ghash_clmulni_intel 13259 0 - Live 0x0000000000000000
> aesni_intel 55720 268 - Live 0x0000000000000000
> aes_x86_64 17131 1 aesni_intel, Live 0x0000000000000000
> lrw 13294 1 aesni_intel, Live 0x0000000000000000
> gf128mul 14951 1 lrw, Live 0x0000000000000000
> glue_helper 14095 1 aesni_intel, Live 0x0000000000000000
> ablk_helper 13597 1 aesni_intel, Live 0x0000000000000000
> cryptd 20501 136 ghash_clmulni_intel,aesni_intel,ablk_helper, Live
> 0x0000000000000000
> joydev 17575 0 - Live 0x0000000000000000
> pn544_mei 12787 0 - Live 0x0000000000000000
> mei_phy 13929 1 pn544_mei, Live 0x0000000000000000
> pn544 17995 1 pn544_mei, Live 0x0000000000000000
> hci 44774 2 mei_phy,pn544, Live 0x0000000000000000
> snd_hda_codec_realtek 56695 1 - Live 0x0000000000000000
> nfc 99413 2 pn544,hci, Live 0x0000000000000000
> snd_hda_codec_hdmi 41684 1 - Live 0x0000000000000000
> hid_sensor_magn_3d 13266 0 - Live 0x0000000000000000
> hid_sensor_accel_3d 13279 0 - Live 0x0000000000000000
> hid_sensor_gyro_3d 13266 0 - Live 0x0000000000000000
> hid_sensor_trigger 12916 3
> hid_sensor_magn_3d,hid_sensor_accel_3d,hid_sensor_gyro_3d, Live
> 0x0000000000000000
> industrialio_triggered_buffer 12882 3
> hid_sensor_magn_3d,hid_sensor_accel_3d,hid_sensor_gyro_3d, Live
> 0x0000000000000000
> kfifo_buf 13294 1 industrialio_triggered_buffer, Live 0x0000000000000000
> industrialio 54016 6
> hid_sensor_magn_3d,hid_sensor_accel_3d,hid_sensor_gyro_3d,hid_sensor_trigger,industrialio_triggered_buffer,kfifo_buf,
> Live 0x0000000000000000
> arc4 12573 2 - Live 0x0000000000000000
> snd_hda_intel 57183 5 - Live 0x0000000000000000
> hid_sensor_iio_common 13807 3
> hid_sensor_magn_3d,hid_sensor_accel_3d,hid_sensor_gyro_3d, Live
> 0x0000000000000000
> snd_hda_codec 194881 3
> snd_hda_codec_realtek,snd_hda_codec_hdmi,snd_hda_intel, Live
> 0x0000000000000000
> snd_hwdep 13613 1 snd_hda_codec, Live 0x0000000000000000
> hid_multitouch 17645 0 - Live 0x0000000000000000
> snd_pcm 107140 3 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec, Live
> 0x0000000000000000
> hid_generic 12548 0 - Live 0x0000000000000000
> dell_wmi 12681 0 - Live 0x0000000000000000
> sparse_keymap 13890 1 dell_wmi, Live 0x0000000000000000
> snd_page_alloc 18798 2 snd_hda_intel,snd_pcm, Live 0x0000000000000000
> snd_seq_midi 13324 0 - Live 0x0000000000000000
> snd_seq_midi_event 14899 1 snd_seq_midi, Live 0x0000000000000000
> snd_rawmidi 30465 1 snd_seq_midi, Live 0x0000000000000000
> dell_laptop 17425 0 - Live 0x0000000000000000
> parport_pc 32866 0 - Live 0x0000000000000000
> dcdbas 14977 1 dell_laptop, Live 0x0000000000000000
> ppdev 17711 0 - Live 0x0000000000000000
> snd_seq 66061 2 snd_seq_midi,snd_seq_midi_event, Live 0x0000000000000000
> mei_me 18418 0 - Live 0x0000000000000000
> uvcvideo 82247 0 - Live 0x0000000000000000
> hid_sensor_hub 19096 5
> hid_sensor_magn_3d,hid_sensor_accel_3d,hid_sensor_gyro_3d,hid_sensor_trigger,hid_sensor_iio_common,
> Live 0x0000000000000000
> iwlmvm 176559 0 - Live 0x0000000000000000
> microcode 23650 0 - Live 0x0000000000000000
> videobuf2_vmalloc 13216 1 uvcvideo, Live 0x0000000000000000
> videobuf2_memops 13362 1 videobuf2_vmalloc, Live 0x0000000000000000
> mac80211 634661 1 iwlmvm, Live 0x0000000000000000
> videobuf2_core 40903 1 uvcvideo, Live 0x0000000000000000
> mei 78609 3 pn544_mei,mei_phy,mei_me, Live 0x0000000000000000
> videodev 139144 2 uvcvideo,videobuf2_core, Live 0x0000000000000000
> usb_storage 66714 0 - Live 0x0000000000000000
> rfcomm 74658 12 - Live 0x0000000000000000
> bnep 23966 2 - Live 0x0000000000000000
> psmouse 104113 0 - Live 0x0000000000000000
> iwlwifi 171124 1 iwlmvm, Live 0x0000000000000000
> serio_raw 13462 0 - Live 0x0000000000000000
> snd_seq_device 14497 3 snd_seq_midi,snd_rawmidi,snd_seq, Live
> 0x0000000000000000
> btusb 28326 0 - Live 0x0000000000000000
> bluetooth 391597 22 rfcomm,bnep,btusb, Live 0x0000000000000000
> cfg80211 504229 3 iwlmvm,mac80211,iwlwifi, Live 0x0000000000000000
> snd_timer 30038 2 snd_pcm,snd_seq, Live 0x0000000000000000
> lpc_ich 21163 0 - Live 0x0000000000000000
> snd 73802 21
> snd_hda_codec_realtek,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hwdep,snd_pcm,snd_seq_midi,snd_rawmidi,snd_seq,snd_seq_device,snd_timer,
> Live 0x0000000000000000
> soundcore 12680 1 snd, Live 0x0000000000000000
> i2c_hid 19067 0 - Live 0x0000000000000000
> i2c_designware_platform 13006 0 - Live 0x0000000000000000
> i2c_designware_core 14990 1 i2c_designware_platform, Live 0x0000000000000000
> mac_hid 13253 0 - Live 0x0000000000000000
> intel_smartconnect 12619 0 - Live 0x0000000000000000
> tpm_tis 19116 0 - Live 0x0000000000000000
> nls_iso8859_1 12713 1 - Live 0x0000000000000000
> lp 17799 0 - Live 0x0000000000000000
> parport 42481 3 parport_pc,ppdev,lp, Live 0x0000000000000000
> usbhid 53067 0 - Live 0x0000000000000000
> hid 106254 5 hid_multitouch,hid_generic,hid_sensor_hub,i2c_hid,usbhid, Live
> 0x0000000000000000
> i915 733800 5 - Live 0x0000000000000000
> i2c_algo_bit 13564 1 i915, Live 0x0000000000000000
> drm_kms_helper 53165 1 i915, Live 0x0000000000000000
> ahci 30063 3 - Live 0x0000000000000000
> drm 303133 4 i915,drm_kms_helper, Live 0x0000000000000000
> libahci 32088 1 ahci, Live 0x0000000000000000
> wmi 19363 1 dell_wmi, Live 0x0000000000000000
> video 19574 1 i915, Live 0x0000000000000000
>
>
> [7.4.] Loaded driver and hardware information (/proc/ioports, /proc/iomem)
>
> 0000-0cf7 : PCI Bus 0000:00
> 0000-001f : dma1
> 0020-0021 : pic1
> 0040-0043 : timer0
> 0050-0053 : timer1
> 0060-0060 : keyboard
> 0062-0062 : EC data
> 0064-0064 : keyboard
> 0066-0066 : EC cmd
> 0070-0077 : rtc0
> 0080-008f : dma page reg
> 00a0-00a1 : pic2
> 00c0-00df : dma2
> 00f0-00ff : fpu
> 04d0-04d1 : pnp 00:06
> 0680-069f : pnp 00:03
> 0cf8-0cff : PCI conf1
> 0d00-ffff : PCI Bus 0000:00
> 164e-164f : pnp 00:03
> 1800-1803 : ACPI PM1a_EVT_BLK
> 1804-1805 : ACPI PM1a_CNT_BLK
> 1808-180b : ACPI PM_TMR
> 1810-1815 : ACPI CPU throttle
> 1830-1833 : iTCO_wdt
> 1850-1850 : ACPI PM2_CNT_BLK
> 1854-1857 : pnp 00:05
> 1860-187f : iTCO_wdt
> 1880-189f : ACPI GPE0_BLK
> 1c00-1fff : INT33C7:00
> 1c00-1fff : lp-gpio
> 2000-2fff : PCI Bus 0000:04
> f000-f03f : 0000:00:02.0
> f040-f05f : 0000:00:1f.3
> f060-f07f : 0000:00:1f.2
> f060-f07f : ahci
> f080-f083 : 0000:00:1f.2
> f080-f083 : ahci
> f090-f097 : 0000:00:1f.2
> f090-f097 : ahci
> f0a0-f0a3 : 0000:00:1f.2
> f0a0-f0a3 : ahci
> f0b0-f0b7 : 0000:00:1f.2
> f0b0-f0b7 : ahci
> ffff-ffff : pnp 00:03
> ffff-ffff : pnp 00:03
> ffff-ffff : pnp 00:03
>
> 00000000-00000fff : reserved
> 00001000-00057fff : System RAM
> 00058000-00058fff : reserved
> 00059000-0009efff : System RAM
> 0009f000-0009ffff : reserved
> 000a0000-000bffff : PCI Bus 0000:00
> 000c0000-000ce9ff : Video ROM
> 000d0000-000d3fff : PCI Bus 0000:00
> 000d4000-000d7fff : PCI Bus 0000:00
> 000d8000-000dbfff : PCI Bus 0000:00
> 000dc000-000dffff : PCI Bus 0000:00
> 000f0000-000fffff : System ROM
> 00100000-c98d3fff : System RAM
> 02000000-02762924 : Kernel code
> 02762925-02d18c7f : Kernel data
> 02e72000-02fe4fff : Kernel bss
> c98d4000-c98dafff : ACPI Non-volatile Storage
> c98db000-c9d18fff : System RAM
> c9d19000-ca2b4fff : reserved
> ca2b5000-da96efff : System RAM
> da96f000-dae4bfff : reserved
> dae4c000-dae65fff : ACPI Tables
> dae66000-db764fff : ACPI Non-volatile Storage
> db765000-dbffefff : reserved
> dbfff000-dbffffff : System RAM
> dd000000-df1fffff : reserved
> dd200000-df1fffff : Graphics Stolen Memory
> df200000-feafffff : PCI Bus 0000:00
> df200000-df3fffff : PCI Bus 0000:04
> df400000-df5fffff : PCI Bus 0000:04
> e0000000-efffffff : 0000:00:02.0
> f7800000-f7bfffff : 0000:00:02.0
> f7c00000-f7cfffff : PCI Bus 0000:06
> f7c00000-f7c01fff : 0000:06:00.0
> f7c00000-f7c01fff : iwlwifi
> f7d00000-f7d0ffff : 0000:00:14.0
> f7d00000-f7d0ffff : xhci_hcd
> f7d10000-f7d13fff : 0000:00:1b.0
> f7d10000-f7d13fff : ICH HD audio
> f7d14000-f7d17fff : 0000:00:03.0
> f7d14000-f7d17fff : ICH HD audio
> f7d19000-f7d190ff : 0000:00:1f.3
> f7d1a000-f7d1a7ff : 0000:00:1f.2
> f7d1a000-f7d1a7ff : ahci
> f7d1b000-f7d1b3ff : 0000:00:1d.0
> f7d1b000-f7d1b3ff : ehci_hcd
> f7d1d000-f7d1d01f : 0000:00:16.0
> f7d1d000-f7d1d01f : mei_me
> f7fef000-f7feffff : pnp 00:0c
> f7ff0000-f7ff0fff : pnp 00:0c
> f8000000-fbffffff : PCI MMCONFIG 0000 [bus 00-3f]
> f8000000-fbffffff : reserved
> f8000000-fbffffff : pnp 00:0c
> fe102000-fe102fff : pnp 00:09
> fe104000-fe104fff : pnp 00:09
> fe105000-fe105fff : INT33C3:00
> fe105000-fe105fff : INT33C3:00
> fe106000-fe106fff : pnp 00:09
> fe108000-fe108fff : pnp 00:09
> fe10a000-fe10afff : pnp 00:09
> fe10c000-fe10cfff : pnp 00:09
> fe10e000-fe10efff : pnp 00:09
> fe111000-fe111007 : pnp 00:09
> fe111014-fe111fff : pnp 00:09
> fe112000-fe112fff : pnp 00:09
> fec00000-fec00fff : reserved
> fec00000-fec003ff : IOAPIC 0
> fed00000-fed03fff : reserved
> fed00000-fed003ff : HPET 0
> fed10000-fed17fff : pnp 00:0c
> fed18000-fed18fff : pnp 00:0c
> fed19000-fed19fff : pnp 00:0c
> fed1c000-fed1ffff : reserved
> fed1c000-fed1ffff : pnp 00:0c
> fed1f410-fed1f414 : iTCO_wdt
> fed20000-fed3ffff : pnp 00:0c
> fed45000-fed8ffff : pnp 00:0c
> fed90000-fed93fff : pnp 00:0c
> fee00000-fee00fff : Local APIC
> fee00000-fee00fff : reserved
> ff000000-ffffffff : reserved
> ff000000-ffffffff : pnp 00:0c
> 100000000-21fdfffff : System RAM
> 21fe00000-21fffffff : RAM buffer
>
>
> [7.5.] PCI information ('lspci -vvv' as root)
>
> 00:00.0 Host bridge: Intel Corporation Haswell-ULT DRAM Controller (rev 09)
> Subsystem: Dell Device 05e3
> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx-
> Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort+ >SERR- <PERR- INTx-
> Latency: 0
> Capabilities: [e0] Vendor Specific Information: Len=0c <?>
>
> 00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated
> Graphics Controller (rev 09) (prog-if 00 [VGA controller])
> Subsystem: Dell Device 05e3
> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx+
> Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort- >SERR- <PERR- INTx-
> Latency: 0
> Interrupt: pin A routed to IRQ 58
> Region 0: Memory at f7800000 (64-bit, non-prefetchable) [size=4M]
> Region 2: Memory at e0000000 (64-bit, prefetchable) [size=256M]
> Region 4: I/O ports at f000 [size=64]
> Expansion ROM at <unassigned> [disabled]
> Capabilities: [90] MSI: Enable+ Count=1/1 Maskable- 64bit-
> Address: fee0f00c Data: 41b1
> Capabilities: [d0] Power Management version 2
> Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA
> PME(D0-,D1-,D2-,D3hot-,D3cold-)
> Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
> Capabilities: [a4] PCI Advanced Features
> AFCap: TP+ FLR+
> AFCtrl: FLR-
> AFStatus: TP-
> Kernel driver in use: i915
>
> 00:03.0 Audio device: Intel Corporation Device 0a0c (rev 09)
> Subsystem: Intel Corporation Device 2010
> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx+
> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort- >SERR- <PERR- INTx-
> Latency: 0, Cache Line Size: 64 bytes
> Interrupt: pin A routed to IRQ 61
> Region 0: Memory at f7d14000 (64-bit, non-prefetchable) [size=16K]
> Capabilities: [50] Power Management version 2
> Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA
> PME(D0-,D1-,D2-,D3hot-,D3cold-)
> Status: D3 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
> Capabilities: [60] MSI: Enable+ Count=1/1 Maskable- 64bit-
> Address: fee0f00c Data: 4142
> Capabilities: [70] Express (v1) Root Complex Integrated Endpoint, MSI 00
> DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s unlimited,
> L1 unlimited
> ExtTag- RBE- FLReset+
> DevCtl: Report errors: Correctable- Non-Fatal- Fatal-
> Unsupported-
> RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
> MaxPayload 128 bytes, MaxReadReq 128 bytes
> DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr-
> TransPend-
> LnkCap: Port #0, Speed unknown, Width x0, ASPM unknown, Latency
> L0 <64ns, L1 <1us
> ClockPM- Surprise- LLActRep- BwNot-
> LnkCtl: ASPM Disabled; Disabled- Retrain- CommClk-
> ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
> LnkSta: Speed unknown, Width x0, TrErr- Train- SlotClk- DLActive-
> BWMgmt- ABWMgmt-
> Kernel driver in use: snd_hda_intel
>
> 00:14.0 USB controller: Intel Corporation Lynx Point-LP USB xHCI HC (rev 04)
> (prog-if 30 [XHCI])
> Subsystem: Dell Device 05e3
> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx+
> Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
> <TAbort- <MAbort- >SERR- <PERR- INTx-
> Latency: 0
> Interrupt: pin A routed to IRQ 56
> Region 0: Memory at f7d00000 (64-bit, non-prefetchable) [size=64K]
> Capabilities: [70] Power Management version 2
> Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA
> PME(D0-,D1-,D2-,D3hot+,D3cold+)
> Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
> Capabilities: [80] MSI: Enable+ Count=1/8 Maskable- 64bit+
> Address: 00000000fee0a00c Data: 4181
> Kernel driver in use: xhci_hcd
>
> 00:16.0 Communication controller: Intel Corporation Lynx Point-LP HECI #0
> (rev 04)
> Subsystem: Dell Device 05e3
> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx+
> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort- >SERR- <PERR- INTx-
> Latency: 0
> Interrupt: pin A routed to IRQ 60
> Region 0: Memory at f7d1d000 (64-bit, non-prefetchable) [size=32]
> Capabilities: [50] Power Management version 3
> Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA
> PME(D0+,D1-,D2-,D3hot+,D3cold+)
> Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
> Capabilities: [8c] MSI: Enable+ Count=1/1 Maskable- 64bit+
> Address: 00000000fee0f00c Data: 4122
> Kernel driver in use: mei_me
>
> 00:1b.0 Audio device: Intel Corporation Lynx Point-LP HD Audio Controller
> (rev 04)
> Subsystem: Dell Device 05e3
> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx+
> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort- >SERR- <PERR- INTx-
> Latency: 0, Cache Line Size: 64 bytes
> Interrupt: pin A routed to IRQ 62
> Region 0: Memory at f7d10000 (64-bit, non-prefetchable) [size=16K]
> Capabilities: [50] Power Management version 3
> Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA
> PME(D0+,D1-,D2-,D3hot+,D3cold+)
> Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
> Capabilities: [60] MSI: Enable+ Count=1/1 Maskable- 64bit+
> Address: 00000000fee0f00c Data: 4162
> Capabilities: [70] Express (v1) Root Complex Integrated Endpoint, MSI 00
> DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1
> <1us
> ExtTag- RBE- FLReset+
> DevCtl: Report errors: Correctable- Non-Fatal- Fatal-
> Unsupported-
> RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
> MaxPayload 128 bytes, MaxReadReq 128 bytes
> DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+
> TransPend-
> LnkCap: Port #0, Speed unknown, Width x0, ASPM unknown, Latency
> L0 <64ns, L1 <1us
> ClockPM- Surprise- LLActRep- BwNot-
> LnkCtl: ASPM Disabled; Disabled- Retrain- CommClk-
> ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
> LnkSta: Speed unknown, Width x0, TrErr- Train- SlotClk- DLActive-
> BWMgmt- ABWMgmt-
> Capabilities: [100 v1] Virtual Channel
> Caps: LPEVC=0 RefClk=100ns PATEntryBits=1
> Arb: Fixed- WRR32- WRR64- WRR128-
> Ctrl: ArbSelect=Fixed
> Status: InProgress-
> VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
> Arb: Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
> Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=01
> Status: NegoPending- InProgress-
> VC1: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
> Arb: Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
> Ctrl: Enable- ID=2 ArbSelect=Fixed TC/VC=04
> Status: NegoPending- InProgress-
> Kernel driver in use: snd_hda_intel
>
> 00:1c.0 PCI bridge: Intel Corporation Lynx Point-LP PCI Express Root Port 1
> (rev e4) (prog-if 00 [Normal decode])
> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx-
> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort- >SERR- <PERR- INTx-
> Latency: 0, Cache Line Size: 64 bytes
> Bus: primary=00, secondary=04, subordinate=05, sec-latency=0
> I/O behind bridge: 00002000-00002fff
> Memory behind bridge: df200000-df3fffff
> Prefetchable memory behind bridge: 00000000df400000-00000000df5fffff
> Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort- <SERR- <PERR-
> BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B-
> PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
> Capabilities: [40] Express (v2) Root Port (Slot+), MSI 00
> DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1
> <1us
> ExtTag- RBE+ FLReset-
> DevCtl: Report errors: Correctable- Non-Fatal- Fatal-
> Unsupported-
> RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
> MaxPayload 128 bytes, MaxReadReq 128 bytes
> DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+
> TransPend-
> LnkCap: Port #1, Speed 5GT/s, Width x1, ASPM L0s L1, Latency L0
> <1us, L1 <4us
> ClockPM- Surprise- LLActRep+ BwNot+
> LnkCtl: ASPM L0s L1 Enabled; RCB 64 bytes Disabled- Retrain-
> CommClk-
> ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
> LnkSta: Speed 2.5GT/s, Width x0, TrErr- Train- SlotClk+ DLActive-
> BWMgmt- ABWMgmt-
> SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+
> Surprise+
> Slot #0, PowerLimit 0.000W; Interlock- NoCompl+
> SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq-
> LinkChg-
> Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock-
> SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet-
> Interlock-
> Changed: MRL- PresDet- LinkState-
> RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna-
> CRSVisible-
> RootCap: CRSVisible-
> RootSta: PME ReqID 0000, PMEStatus- PMEPending-
> DevCap2: Completion Timeout: Range ABC, TimeoutDis+ ARIFwd-
> DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- ARIFwd-
> LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-,
> Selectable De-emphasis: -6dB
> Transmit Margin: Normal Operating Range,
> EnterModifiedCompliance- ComplianceSOS-
> Compliance De-emphasis: -6dB
> LnkSta2: Current De-emphasis Level: -3.5dB, EqualizationComplete-,
> EqualizationPhase1-
> EqualizationPhase2-, EqualizationPhase3-,
> LinkEqualizationRequest-
> Capabilities: [80] MSI: Enable- Count=1/1 Maskable- 64bit-
> Address: 00000000 Data: 0000
> Capabilities: [90] Subsystem: Dell Device 05e3
> Capabilities: [a0] Power Management version 3
> Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA
> PME(D0+,D1-,D2-,D3hot+,D3cold+)
> Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
> Kernel driver in use: pcieport
>
> 00:1c.2 PCI bridge: Intel Corporation Lynx Point-LP PCI Express Root Port 3
> (rev e4) (prog-if 00 [Normal decode])
> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx-
> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort- >SERR- <PERR- INTx-
> Latency: 0, Cache Line Size: 64 bytes
> Bus: primary=00, secondary=06, subordinate=06, sec-latency=0
> I/O behind bridge: 0000f000-00000fff
> Memory behind bridge: f7c00000-f7cfffff
> Prefetchable memory behind bridge: 00000000fff00000-00000000000fffff
> Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort- <SERR- <PERR-
> BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B-
> PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
> Capabilities: [40] Express (v2) Root Port (Slot+), MSI 00
> DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1
> <1us
> ExtTag- RBE+ FLReset-
> DevCtl: Report errors: Correctable- Non-Fatal- Fatal-
> Unsupported-
> RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
> MaxPayload 128 bytes, MaxReadReq 128 bytes
> DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+
> TransPend-
> LnkCap: Port #3, Speed 5GT/s, Width x1, ASPM L0s L1, Latency L0
> <512ns, L1 <16us
> ClockPM- Surprise- LLActRep+ BwNot+
> LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+
> ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
> LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive+
> BWMgmt+ ABWMgmt-
> SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug-
> Surprise-
> Slot #2, PowerLimit 10.000W; Interlock- NoCompl+
> SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq-
> LinkChg-
> Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock-
> SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet+
> Interlock-
> Changed: MRL- PresDet- LinkState-
> RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna-
> CRSVisible-
> RootCap: CRSVisible-
> RootSta: PME ReqID 0000, PMEStatus- PMEPending-
> DevCap2: Completion Timeout: Range ABC, TimeoutDis+ ARIFwd-
> DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- ARIFwd-
> LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-,
> Selectable De-emphasis: -6dB
> Transmit Margin: Normal Operating Range,
> EnterModifiedCompliance- ComplianceSOS-
> Compliance De-emphasis: -6dB
> LnkSta2: Current De-emphasis Level: -3.5dB, EqualizationComplete-,
> EqualizationPhase1-
> EqualizationPhase2-, EqualizationPhase3-,
> LinkEqualizationRequest-
> Capabilities: [80] MSI: Enable- Count=1/1 Maskable- 64bit-
> Address: 00000000 Data: 0000
> Capabilities: [90] Subsystem: Dell Device 05e3
> Capabilities: [a0] Power Management version 3
> Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA
> PME(D0+,D1-,D2-,D3hot+,D3cold+)
> Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
> Capabilities: [100 v0] #00
> Capabilities: [200 v1] #1e
> Kernel driver in use: pcieport
>
> 00:1d.0 USB controller: Intel Corporation Lynx Point-LP USB EHCI #1 (rev 04)
> (prog-if 20 [EHCI])
> Subsystem: Dell Device 05e3
> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx-
> Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
> <TAbort- <MAbort- >SERR- <PERR- INTx-
> Latency: 0
> Interrupt: pin A routed to IRQ 23
> Region 0: Memory at f7d1b000 (32-bit, non-prefetchable) [size=1K]
> Capabilities: [50] Power Management version 3
> Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA
> PME(D0+,D1-,D2-,D3hot+,D3cold+)
> Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
> Capabilities: [58] Debug port: BAR=1 offset=00a0
> Capabilities: [98] PCI Advanced Features
> AFCap: TP+ FLR+
> AFCtrl: FLR-
> AFStatus: TP-
> Kernel driver in use: ehci-pci
>
> 00:1f.0 ISA bridge: Intel Corporation Lynx Point-LP LPC Controller (rev 04)
> Subsystem: Dell Device 05e3
> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx-
> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort-
> <TAbort- <MAbort- >SERR- <PERR- INTx-
> Latency: 0
> Capabilities: [e0] Vendor Specific Information: Len=0c <?>
> Kernel driver in use: lpc_ich
>
> 00:1f.2 SATA controller: Intel Corporation Lynx Point-LP SATA Controller 1
> [AHCI mode] (rev 04) (prog-if 01 [AHCI 1.0])
> Subsystem: Dell Device 05e3
> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx+
> Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
> <TAbort- <MAbort- >SERR- <PERR- INTx-
> Latency: 0
> Interrupt: pin B routed to IRQ 57
> Region 0: I/O ports at f0b0 [size=8]
> Region 1: I/O ports at f0a0 [size=4]
> Region 2: I/O ports at f090 [size=8]
> Region 3: I/O ports at f080 [size=4]
> Region 4: I/O ports at f060 [size=32]
> Region 5: Memory at f7d1a000 (32-bit, non-prefetchable) [size=2K]
> Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
> Address: fee0a00c Data: 41a1
> Capabilities: [70] Power Management version 3
> Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA
> PME(D0-,D1-,D2-,D3hot+,D3cold-)
> Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
> Capabilities: [a8] SATA HBA v1.0 BAR4 Offset=00000004
> Kernel driver in use: ahci
>
> 00:1f.3 SMBus: Intel Corporation Lynx Point-LP SMBus Controller (rev 04)
> Subsystem: Dell Device 05e3
> Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx-
> Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
> <TAbort- <MAbort- >SERR- <PERR- INTx-
> Interrupt: pin C routed to IRQ 3
> Region 0: Memory at f7d19000 (64-bit, non-prefetchable) [size=256]
> Region 4: I/O ports at f040 [size=32]
>
> 06:00.0 Network controller: Intel Corporation Wireless 7260 (rev 6b)
> Subsystem: Intel Corporation Dual Band Wireless-AC 7260
> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
> Stepping- SERR- FastB2B- DisINTx+
> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort-
> <MAbort- >SERR- <PERR- INTx-
> Latency: 0, Cache Line Size: 64 bytes
> Interrupt: pin A routed to IRQ 59
> Region 0: Memory at f7c00000 (64-bit, non-prefetchable) [size=8K]
> Capabilities: [c8] Power Management version 3
> Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA
> PME(D0+,D1-,D2-,D3hot+,D3cold+)
> Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
> Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
> Address: 00000000fee0100c Data: 41e1
> Capabilities: [40] Express (v2) Endpoint, MSI 00
> DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <512ns, L1
> unlimited
> ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset+
> DevCtl: Report errors: Correctable- Non-Fatal- Fatal-
> Unsupported-
> RlxdOrd- ExtTag- PhantFunc- AuxPwr+ NoSnoop+ FLReset-
> MaxPayload 128 bytes, MaxReadReq 128 bytes
> DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+
> TransPend-
> LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Latency L0
> <4us, L1 <32us
> ClockPM+ Surprise- LLActRep- BwNot-
> LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+
> ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
> LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive-
> BWMgmt- ABWMgmt-
> DevCap2: Completion Timeout: Range B, TimeoutDis+
> DevCtl2: Completion Timeout: 16ms to 55ms, TimeoutDis-
> LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-,
> Selectable De-emphasis: -6dB
> Transmit Margin: Normal Operating Range,
> EnterModifiedCompliance- ComplianceSOS-
> Compliance De-emphasis: -6dB
> LnkSta2: Current De-emphasis Level: -3.5dB, EqualizationComplete-,
> EqualizationPhase1-
> EqualizationPhase2-, EqualizationPhase3-,
> LinkEqualizationRequest-
> Capabilities: [100 v1] Advanced Error Reporting
> UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF-
> MalfTLP- ECRC- UnsupReq- ACSViol-
> UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF-
> MalfTLP- ECRC- UnsupReq- ACSViol-
> UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+
> MalfTLP+ ECRC- UnsupReq- ACSViol-
> CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
> CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
> AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
> Capabilities: [140 v1] Device Serial Number 5c-51-4f-ff-ff-11-a5-9e
> Capabilities: [14c v1] Latency Tolerance Reporting
> Max snoop latency: 3145728ns
> Max no snoop latency: 3145728ns
> Capabilities: [154 v1] Vendor Specific Information: ID=cafe Rev=1
> Len=014 <?>
> Kernel driver in use: iwlwifi
>
>
> [7.6.] SCSI information (from /proc/scsi/scsi)
>
> Attached devices:
> Host: scsi0 Channel: 00 Id: 00 Lun: 00
> Vendor: ATA Model: LITEONIT LMT-256 Rev: DM81
> Type: Direct-Access ANSI SCSI revision: 05
>
>
> [7.7.] Other information that might be relevant to the problem (please look
> in /proc and include all information that you think to be relevant):
>
> Relevant info from /proc/bus/input/devices
>
> I: Bus=0018 Vendor=06cb Product=2734 Version=0100
> N: Name="DLL05E3:01 06CB:2734"
> P: Phys=
> S: Sysfs=/devices/pci0000:00/INT33C3:00/i2c-8/8-002c/input/input7
> U: Uniq=
> H: Handlers=mouse0 event7
> B: PROP=0
> B: EV=17
> B: KEY=30000 0 0 0 0
> B: REL=3
> B: MSC=10
>
> I: Bus=0018 Vendor=03eb Product=842f Version=0100
> N: Name="ATML1000:00 03EB:842F"
> P: Phys=
> S: Sysfs=/devices/pci0000:00/INT33C3:00/i2c-8/8-004b/input/input8
> U: Uniq=
> H: Handlers=mouse1 event8
> B: PROP=2
> B: EV=b
> B: KEY=400 0 0 0 0 0
> B: ABS=260800000000003
>
>
> /var/log/Xorg.0.log
>
> [ 11.411] X.Org X Server 1.14.2.901 (1.14.3 RC 1) Release Date:
> 2013-07-25
> [ 11.411] X Protocol Version 11, Revision 0
> [ 11.411] Build Operating System: Linux 3.2.0-37-generic x86_64 Ubuntu
> [ 11.411] Current Operating System: Linux wouter-xps12
> 3.12.0-031200rc3-generic #201309291835 SMP Sun Sep 29 22:37:02 UTC 2013
> x86_64
> [ 11.411] Kernel command line:
> BOOT_IMAGE=/boot/vmlinuz-3.12.0-031200rc3-generic
> root=UUID=8e4879ce-4777-4c48-b6d7-5b3b4b116ad3 ro quiet splash vt.handoff=7
> [ 11.411] Build Date: 26 September 2013 05:25:08PM
> [ 11.411] xorg-server 2:1.14.2.901-2ubuntu6 (For technical support please
> see http://www.ubuntu.com/support)
> [ 11.411] Current version of pixman: 0.30.2
> [ 11.411] Before reporting problems, check http://wiki.x.org to make
> sure that you have the latest version.
> [ 11.411] Markers: (--) probed, (**) from config file, (==) default
> setting, (++) from command line, (!!) notice, (II) informational, (WW)
> warning, (EE) error, (NI) not implemented, (??) unknown.
> [ 11.411] (==) Log file: "/var/log/Xorg.0.log", Time: Sun Oct 6 21:24:45
> 2013
> [ 11.412] (==) Using config file: "/etc/X11/xorg.conf"
> [ 11.412] (==) Using system config directory "/usr/share/X11/xorg.conf.d"
> [ 11.414] (==) No Layout section. Using the first Screen section.
> [ 11.414] (==) No screen section available. Using defaults.
> [ 11.414] (**) |-->Screen "Default Screen Section" (0)
> [ 11.414] (**) | |-->Monitor "<default monitor>"
> [ 11.414] (==) No monitor specified for screen "Default Screen Section".
> Using a default monitor configuration.
> [ 11.414] (==) Automatically adding devices
> [ 11.414] (==) Automatically enabling devices
> [ 11.414] (==) Automatically adding GPU devices
> [ 11.416] (WW) The directory "/usr/share/fonts/X11/cyrillic" does not
> exist.
> [ 11.416] Entry deleted from font path.
> [ 11.416] (WW) The directory "/usr/share/fonts/X11/100dpi/" does not
> exist.
> [ 11.416] Entry deleted from font path.
> [ 11.416] (WW) The directory "/usr/share/fonts/X11/75dpi/" does not
> exist.
> [ 11.416] Entry deleted from font path.
> [ 11.416] (WW) The directory "/usr/share/fonts/X11/100dpi" does not
> exist.
> [ 11.416] Entry deleted from font path.
> [ 11.416] (WW) The directory "/usr/share/fonts/X11/75dpi" does not exist.
> [ 11.416] Entry deleted from font path.
> [ 11.416] (WW) The directory
> "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType" does not exist.
> [ 11.416] Entry deleted from font path.
> [ 11.416] (==) FontPath set to:
> /usr/share/fonts/X11/misc,
> /usr/share/fonts/X11/Type1,
> built-ins
> [ 11.416] (==) ModulePath set to
> "/usr/lib/x86_64-linux-gnu/xorg/extra-modules,/usr/lib/xorg/extra-modules,/usr/lib/xorg/modules"
> [ 11.416] (II) The server relies on udev to provide the list of input
> devices.
> If no devices become available, reconfigure udev or disable
> AutoAddDevices.
> [ 11.416] (II) Loader magic: 0x7fe40c4a1d20
> [ 11.416] (II) Module ABI versions:
> [ 11.416] X.Org ANSI C Emulation: 0.4
> [ 11.416] X.Org Video Driver: 14.1
> [ 11.416] X.Org XInput driver : 19.1
> [ 11.416] X.Org Server Extension : 7.0
> [ 11.417] (II) xfree86: Adding drm device (/dev/dri/card0)
> [ 11.417] (--) PCI:*(0:0:2:0) 8086:0a16:1028:05e3 rev 9, Mem @
> 0xf7800000/4194304, 0xe0000000/268435456, I/O @ 0x0000f000/64
> [ 11.417] (II) Open ACPI successful (/var/run/acpid.socket)
> [ 11.418] Initializing built-in extension Generic Event Extension
> [ 11.418] Initializing built-in extension SHAPE
> [ 11.418] Initializing built-in extension MIT-SHM
> [ 11.418] Initializing built-in extension XInputExtension
> [ 11.418] Initializing built-in extension XTEST
> [ 11.418] Initializing built-in extension BIG-REQUESTS
> [ 11.418] Initializing built-in extension SYNC
> [ 11.418] Initializing built-in extension XKEYBOARD
> [ 11.418] Initializing built-in extension XC-MISC
> [ 11.418] Initializing built-in extension SECURITY
> [ 11.418] Initializing built-in extension XINERAMA
> [ 11.418] Initializing built-in extension XFIXES
> [ 11.418] Initializing built-in extension RENDER
> [ 11.418] Initializing built-in extension RANDR
> [ 11.418] Initializing built-in extension COMPOSITE
> [ 11.418] Initializing built-in extension DAMAGE
> [ 11.418] Initializing built-in extension MIT-SCREEN-SAVER
> [ 11.418] Initializing built-in extension DOUBLE-BUFFER
> [ 11.418] Initializing built-in extension RECORD
> [ 11.418] Initializing built-in extension DPMS
> [ 11.418] Initializing built-in extension X-Resource
> [ 11.418] Initializing built-in extension XVideo
> [ 11.418] Initializing built-in extension XVideo-MotionCompensation
> [ 11.418] Initializing built-in extension SELinux
> [ 11.418] Initializing built-in extension XFree86-VidModeExtension
> [ 11.418] Initializing built-in extension XFree86-DGA
> [ 11.418] Initializing built-in extension XFree86-DRI
> [ 11.418] Initializing built-in extension DRI2
> [ 11.418] (II) "glx" will be loaded by default.
> [ 11.418] (WW) "xmir" is not to be loaded by default. Skipping.
> [ 11.418] (II) LoadModule: "dri2"
> [ 11.418] (II) Module "dri2" already built-in
> [ 11.418] (II) LoadModule: "glamoregl"
> [ 11.419] (II) Loading /usr/lib/xorg/modules/libglamoregl.so
> [ 11.431] (II) Module glamoregl: vendor="X.Org Foundation"
> [ 11.431] compiled for 1.14.2.901, module version = 0.5.1
> [ 11.432] ABI class: X.Org ANSI C Emulation, version 0.4
> [ 11.432] (II) LoadModule: "glx"
> [ 11.432] (II) Loading /usr/lib/xorg/modules/extensions/libglx.so
> [ 11.434] (II) Module glx: vendor="X.Org Foundation"
> [ 11.434] compiled for 1.14.2.901, module version = 1.0.0
> [ 11.434] ABI class: X.Org Server Extension, version 7.0
> [ 11.434] (==) AIGLX enabled
> [ 11.434] Loading extension GLX
> [ 11.434] (==) Matched intel as autoconfigured driver 0
> [ 11.434] (==) Matched intel as autoconfigured driver 1
> [ 11.434] (==) Matched vesa as autoconfigured driver 2
> [ 11.434] (==) Matched modesetting as autoconfigured driver 3
> [ 11.434] (==) Matched fbdev as autoconfigured driver 4
> [ 11.434] (==) Assigned the driver to the xf86ConfigLayout
> [ 11.434] (II) LoadModule: "intel"
> [ 11.434] (II) Loading /usr/lib/xorg/modules/drivers/intel_drv.so
> [ 11.437] (II) Module intel: vendor="X.Org Foundation"
> [ 11.437] compiled for 1.14.2.901, module version = 2.21.14
> [ 11.437] Module class: X.Org Video Driver
> [ 11.437] ABI class: X.Org Video Driver, version 14.1
> [ 11.437] (II) LoadModule: "vesa"
> [ 11.437] (II) Loading /usr/lib/xorg/modules/drivers/vesa_drv.so
> [ 11.437] (II) Module vesa: vendor="X.Org Foundation"
> [ 11.437] compiled for 1.14.1, module version = 2.3.2
> [ 11.438] Module class: X.Org Video Driver
> [ 11.438] ABI class: X.Org Video Driver, version 14.1
> [ 11.438] (II) LoadModule: "modesetting"
> [ 11.438] (II) Loading /usr/lib/xorg/modules/drivers/modesetting_drv.so
> [ 11.438] (II) Module modesetting: vendor="X.Org Foundation"
> [ 11.438] compiled for 1.14.1, module version = 0.8.0
> [ 11.438] Module class: X.Org Video Driver
> [ 11.438] ABI class: X.Org Video Driver, version 14.1
> [ 11.438] (II) LoadModule: "fbdev"
> [ 11.438] (II) Loading /usr/lib/xorg/modules/drivers/fbdev_drv.so
> [ 11.439] (II) Module fbdev: vendor="X.Org Foundation"
> [ 11.439] compiled for 1.14.1, module version = 0.4.3
> [ 11.439] Module class: X.Org Video Driver
> [ 11.439] ABI class: X.Org Video Driver, version 14.1
> [ 11.439] (II) intel: Driver for Intel(R) Integrated Graphics Chipsets:
> i810, i810-dc100, i810e, i815, i830M, 845G, 854, 852GM/855GM, 865G,
> 915G, E7221 (i915), 915GM, 945G, 945GM, 945GME, Pineview GM,
> Pineview G, 965G, G35, 965Q, 946GZ, 965GM, 965GME/GLE, G33, Q35, Q33,
> GM45, 4 Series, G45/G43, Q45/Q43, G41, B43, HD Graphics,
> HD Graphics 2000, HD Graphics 3000, HD Graphics 2500,
> HD Graphics 4000, HD Graphics P4000, HD Graphics 4600,
> HD Graphics 5000, HD Graphics P4600/P4700, Iris(TM) Graphics 5100,
> HD Graphics 4400, HD Graphics 4200, Iris(TM) Pro Graphics 5200
> [ 11.439] (II) VESA: driver for VESA chipsets: vesa
> [ 11.439] (II) modesetting: Driver for Modesetting Kernel Drivers: kms
> [ 11.439] (II) FBDEV: driver for framebuffer: fbdev
> [ 11.439] (++) using VT number 7
>
> [ 11.440] (II) intel(0): SNA compiled: xserver-xorg-video-intel
> 2:2.21.14-4ubuntu4 (Christopher James Halse Rogers <raof@ubuntu.com>)
> [ 11.441] (WW) Falling back to old probe method for vesa
> [ 11.441] (WW) Falling back to old probe method for modesetting
> [ 11.441] (WW) Falling back to old probe method for fbdev
> [ 11.441] (II) Loading sub module "fbdevhw"
> [ 11.441] (II) LoadModule: "fbdevhw"
> [ 11.442] (II) Loading /usr/lib/xorg/modules/libfbdevhw.so
> [ 11.442] (II) Module fbdevhw: vendor="X.Org Foundation"
> [ 11.442] compiled for 1.14.2.901, module version = 0.0.2
> [ 11.442] ABI class: X.Org Video Driver, version 14.1
> [ 11.443] (II) intel(0): Creating default Display subsection in Screen
> section
> "Default Screen Section" for depth/fbbpp 24/32
> [ 11.443] (==) intel(0): Depth 24, (--) framebuffer bpp 32
> [ 11.443] (==) intel(0): RGB weight 888
> [ 11.443] (==) intel(0): Default visual is TrueColor
> [ 11.443] (--) intel(0): Integrated Graphics Chipset: Intel(R) HD
> Graphics 4400
> [ 11.443] (--) intel(0): CPU: x86-64, sse2, sse3, ssse3, sse4.1, sse4.2,
> avx, avx2
> [ 11.443] (**) intel(0): Framebuffer tiled
> [ 11.443] (**) intel(0): Pixmaps tiled
> [ 11.443] (**) intel(0): "Tear free" disabled
> [ 11.443] (**) intel(0): Forcing per-crtc-pixmaps? no
> [ 11.443] (II) intel(0): Output eDP1 has no monitor section
> [ 11.443] (--) intel(0): found backlight control interface acpi_video0
> (type 'firmware')
> [ 11.443] (II) intel(0): Output DP1 has no monitor section
> [ 11.443] (II) intel(0): Output HDMI1 has no monitor section
> [ 11.443] (--) intel(0): Output eDP1 using initial mode 1920x1080 on pipe
> 0
> [ 11.443] (==) intel(0): DPI set to (96, 96)
> [ 11.443] (II) Loading sub module "dri2"
> [ 11.443] (II) LoadModule: "dri2"
> [ 11.443] (II) Module "dri2" already built-in
> [ 11.443] (II) UnloadModule: "vesa"
> [ 11.443] (II) Unloading vesa
> [ 11.443] (II) UnloadModule: "modesetting"
> [ 11.443] (II) Unloading modesetting
> [ 11.443] (II) UnloadModule: "fbdev"
> [ 11.443] (II) Unloading fbdev
> [ 11.443] (II) UnloadSubModule: "fbdevhw"
> [ 11.443] (II) Unloading fbdevhw
> [ 11.443] (==) Depth 24 pixmap format is 32 bpp
> [ 11.446] (II) intel(0): SNA initialized with Haswell (gen7.5, gt2)
> backend
> [ 11.446] (==) intel(0): Backing store disabled
> [ 11.446] (==) intel(0): Silken mouse enabled
> [ 11.446] (II) intel(0): HW Cursor enabled
> [ 11.446] (II) intel(0): RandR 1.2 enabled, ignore the following RandR
> disabled message.
> [ 11.447] (==) intel(0): DPMS enabled
> [ 11.447] (II) intel(0): [DRI2] Setup complete
> [ 11.447] (II) intel(0): [DRI2] DRI driver: i965
> [ 11.447] (II) intel(0): direct rendering: DRI2 Enabled
> [ 11.447] (==) intel(0): hotplug detection: "enabled"
> [ 11.447] (--) RandR disabled
> [ 11.452] (II) SELinux: Disabled on system
> [ 11.467] (II) AIGLX: enabled GLX_MESA_copy_sub_buffer
> [ 11.467] (II) AIGLX: enabled GLX_INTEL_swap_event
> [ 11.467] (II) AIGLX: enabled GLX_ARB_create_context
> [ 11.467] (II) AIGLX: enabled GLX_ARB_create_context_profile
> [ 11.467] (II) AIGLX: enabled GLX_EXT_create_context_es2_profile
> [ 11.467] (II) AIGLX: enabled GLX_SGI_swap_control and
> GLX_MESA_swap_control
> [ 11.467] (II) AIGLX: GLX_EXT_texture_from_pixmap backed by buffer
> objects
> [ 11.467] (II) AIGLX: Loaded and initialized i965
> [ 11.467] (II) GLX: Initialized DRI2 GL provider for screen 0
> [ 11.470] (II) intel(0): switch to mode 1920x1080@59.9 on pipe 0 using
> eDP1, position (0, 0), rotation normal
> [ 11.488] (II) intel(0): Setting screen physical size to 508 x 285
> [ 11.497] (II) XKB: reuse xkmfile
> /var/lib/xkb/server-B20D7FC79C7F597315E3E501AEF10E0D866E8E92.xkm
> [ 11.499] (II) config/udev: Adding input device Power Button
> (/dev/input/event2)
> [ 11.499] (**) Power Button: Applying InputClass "evdev keyboard
> catchall"
> [ 11.499] (II) LoadModule: "evdev"
> [ 11.499] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so
> [ 11.500] (II) Module evdev: vendor="X.Org Foundation"
> [ 11.500] compiled for 1.14.1, module version = 2.7.3
> [ 11.500] Module class: X.Org XInput Driver
> [ 11.500] ABI class: X.Org XInput driver, version 19.1
> [ 11.500] (II) Using input driver 'evdev' for 'Power Button'
> [ 11.500] (**) Power Button: always reports core events
> [ 11.500] (**) evdev: Power Button: Device: "/dev/input/event2"
> [ 11.500] (--) evdev: Power Button: Vendor 0 Product 0x1
> [ 11.500] (--) evdev: Power Button: Found keys
> [ 11.500] (II) evdev: Power Button: Configuring as keyboard
> [ 11.500] (**) Option "config_info"
> "udev:/sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input2/event2"
> [ 11.500] (II) XINPUT: Adding extended input device "Power Button" (type:
> KEYBOARD, id 6)
> [ 11.500] (**) Option "xkb_rules" "evdev"
> [ 11.500] (**) Option "xkb_model" "pc105"
> [ 11.500] (**) Option "xkb_layout" "us"
> [ 11.500] (**) Option "xkb_variant" "intl"
> [ 11.502] (II) XKB: reuse xkmfile
> /var/lib/xkb/server-A5431D4A34463C892C9E905E2E421B30A3CC30DD.xkm
> [ 11.503] (II) config/udev: Adding input device Video Bus
> (/dev/input/event4)
> [ 11.503] (**) Video Bus: Applying InputClass "evdev keyboard catchall"
> [ 11.503] (II) Using input driver 'evdev' for 'Video Bus'
> [ 11.503] (**) Video Bus: always reports core events
> [ 11.503] (**) evdev: Video Bus: Device: "/dev/input/event4"
> [ 11.503] (--) evdev: Video Bus: Vendor 0 Product 0x6
> [ 11.503] (--) evdev: Video Bus: Found keys
> [ 11.503] (II) evdev: Video Bus: Configuring as keyboard
> [ 11.503] (**) Option "config_info"
> "udev:/sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/LNXVIDEO:00/input/input4/event4"
> [ 11.503] (II) XINPUT: Adding extended input device "Video Bus" (type:
> KEYBOARD, id 7)
> [ 11.503] (**) Option "xkb_rules" "evdev"
> [ 11.503] (**) Option "xkb_model" "pc105"
> [ 11.503] (**) Option "xkb_layout" "us"
> [ 11.503] (**) Option "xkb_variant" "intl"
> [ 11.504] (II) config/udev: Adding input device Power Button
> (/dev/input/event0)
> [ 11.504] (**) Power Button: Applying InputClass "evdev keyboard
> catchall"
> [ 11.504] (II) Using input driver 'evdev' for 'Power Button'
> [ 11.504] (**) Power Button: always reports core events
> [ 11.504] (**) evdev: Power Button: Device: "/dev/input/event0"
> [ 11.504] (--) evdev: Power Button: Vendor 0 Product 0x1
> [ 11.504] (--) evdev: Power Button: Found keys
> [ 11.504] (II) evdev: Power Button: Configuring as keyboard
> [ 11.504] (**) Option "config_info"
> "udev:/sys/devices/LNXSYSTM:00/device:00/PNP0C0C:00/input/input0/event0"
> [ 11.504] (II) XINPUT: Adding extended input device "Power Button" (type:
> KEYBOARD, id 8)
> [ 11.504] (**) Option "xkb_rules" "evdev"
> [ 11.504] (**) Option "xkb_model" "pc105"
> [ 11.504] (**) Option "xkb_layout" "us"
> [ 11.504] (**) Option "xkb_variant" "intl"
> [ 11.504] (II) config/udev: Adding input device Lid Switch
> (/dev/input/event1)
> [ 11.504] (II) No input driver specified, ignoring this device.
> [ 11.504] (II) This device may have been added with another device file.
> [ 11.504] (II) config/udev: Adding drm device (/dev/dri/card0)
> [ 11.504] (II) config/udev: Ignoring already known drm device
> (/dev/dri/card0)
> [ 11.504] (II) config/udev: Adding input device HDA Intel MID
> HDMI/DP,pcm=7 (/dev/input/event10)
> [ 11.504] (II) No input driver specified, ignoring this device.
> [ 11.504] (II) This device may have been added with another device file.
> [ 11.504] (II) config/udev: Adding input device HDA Intel MID
> HDMI/DP,pcm=3 (/dev/input/event11)
> [ 11.504] (II) No input driver specified, ignoring this device.
> [ 11.504] (II) This device may have been added with another device file.
> [ 11.505] (II) config/udev: Adding input device HDA Intel MID
> HDMI/DP,pcm=8 (/dev/input/event9)
> [ 11.505] (II) No input driver specified, ignoring this device.
> [ 11.505] (II) This device may have been added with another device file.
> [ 11.505] (II) config/udev: Adding input device Integrated Webcam
> (/dev/input/event5)
> [ 11.505] (**) Integrated Webcam: Applying InputClass "evdev keyboard
> catchall"
> [ 11.505] (II) Using input driver 'evdev' for 'Integrated Webcam'
> [ 11.505] (**) Integrated Webcam: always reports core events
> [ 11.505] (**) evdev: Integrated Webcam: Device: "/dev/input/event5"
> [ 11.505] (--) evdev: Integrated Webcam: Vendor 0xbda Product 0x5602
> [ 11.505] (--) evdev: Integrated Webcam: Found keys
> [ 11.505] (II) evdev: Integrated Webcam: Configuring as keyboard
> [ 11.505] (**) Option "config_info"
> "udev:/sys/devices/pci0000:00/0000:00:14.0/usb2/2-5/2-5:1.0/input/input5/event5"
> [ 11.505] (II) XINPUT: Adding extended input device "Integrated Webcam"
> (type: KEYBOARD, id 9)
> [ 11.505] (**) Option "xkb_rules" "evdev"
> [ 11.505] (**) Option "xkb_model" "pc105"
> [ 11.505] (**) Option "xkb_layout" "us"
> [ 11.505] (**) Option "xkb_variant" "intl"
> [ 11.505] (II) config/udev: Adding input device HDA Intel PCH Headphone
> (/dev/input/event12)
> [ 11.505] (II) No input driver specified, ignoring this device.
> [ 11.505] (II) This device may have been added with another device file.
> [ 11.505] (II) config/udev: Adding input device DLL05E3:01 06CB:2734
> (/dev/input/event7)
> [ 11.505] (**) DLL05E3:01 06CB:2734: Applying InputClass "evdev pointer
> catchall"
> [ 11.505] (II) Using input driver 'evdev' for 'DLL05E3:01 06CB:2734'
> [ 11.505] (**) DLL05E3:01 06CB:2734: always reports core events
> [ 11.505] (**) evdev: DLL05E3:01 06CB:2734: Device: "/dev/input/event7"
> [ 11.512] (--) evdev: DLL05E3:01 06CB:2734: Vendor 0x6cb Product 0x2734
> [ 11.512] (--) evdev: DLL05E3:01 06CB:2734: Found 3 mouse buttons
> [ 11.512] (--) evdev: DLL05E3:01 06CB:2734: Found relative axes
> [ 11.512] (--) evdev: DLL05E3:01 06CB:2734: Found x and y relative axes
> [ 11.512] (II) evdev: DLL05E3:01 06CB:2734: Configuring as mouse
> [ 11.512] (**) evdev: DLL05E3:01 06CB:2734: YAxisMapping: buttons 4 and 5
> [ 11.512] (**) evdev: DLL05E3:01 06CB:2734: EmulateWheelButton: 4,
> EmulateWheelInertia: 10, EmulateWheelTimeout: 200
> [ 11.512] (**) Option "config_info"
> "udev:/sys/devices/pci0000:00/INT33C3:00/i2c-8/8-002c/input/input7/event7"
> [ 11.512] (II) XINPUT: Adding extended input device "DLL05E3:01
> 06CB:2734" (type: MOUSE, id 10)
> [ 11.512] (II) evdev: DLL05E3:01 06CB:2734: initialized for relative
> axes.
> [ 11.513] (**) DLL05E3:01 06CB:2734: (accel) keeping acceleration scheme
> 1
> [ 11.513] (**) DLL05E3:01 06CB:2734: (accel) acceleration profile 0
> [ 11.513] (**) DLL05E3:01 06CB:2734: (accel) acceleration factor: 2.000
> [ 11.513] (**) DLL05E3:01 06CB:2734: (accel) acceleration threshold: 4
> [ 11.513] (II) config/udev: Adding input device DLL05E3:01 06CB:2734
> (/dev/input/mouse0)
> [ 11.513] (II) No input driver specified, ignoring this device.
> [ 11.513] (II) This device may have been added with another device file.
> [ 11.513] (II) config/udev: Adding input device ATML1000:00 03EB:842F
> (/dev/input/event8)
> [ 11.513] (**) ATML1000:00 03EB:842F: Applying InputClass "evdev
> touchscreen catchall"
> [ 11.513] (II) Using input driver 'evdev' for 'ATML1000:00 03EB:842F'
> [ 11.513] (**) ATML1000:00 03EB:842F: always reports core events
> [ 11.513] (**) evdev: ATML1000:00 03EB:842F: Device: "/dev/input/event8"
> [ 11.514] (--) evdev: ATML1000:00 03EB:842F: Vendor 0x3eb Product 0x842f
> [ 11.514] (--) evdev: ATML1000:00 03EB:842F: Found absolute axes
> [ 11.514] (--) evdev: ATML1000:00 03EB:842F: Found absolute multitouch
> axes
> [ 11.514] (--) evdev: ATML1000:00 03EB:842F: Found x and y absolute axes
> [ 11.514] (--) evdev: ATML1000:00 03EB:842F: Found absolute touchscreen
> [ 11.514] (II) evdev: ATML1000:00 03EB:842F: Configuring as touchscreen
> [ 11.514] (**) evdev: ATML1000:00 03EB:842F: YAxisMapping: buttons 4 and
> 5
> [ 11.514] (**) evdev: ATML1000:00 03EB:842F: EmulateWheelButton: 4,
> EmulateWheelInertia: 10, EmulateWheelTimeout: 200
> [ 11.514] (**) Option "config_info"
> "udev:/sys/devices/pci0000:00/INT33C3:00/i2c-8/8-004b/input/input8/event8"
> [ 11.514] (II) XINPUT: Adding extended input device "ATML1000:00
> 03EB:842F" (type: TOUCHSCREEN, id 11)
> [ 11.514] (II) evdev: ATML1000:00 03EB:842F: initialized for absolute
> axes.
> [ 11.514] (**) ATML1000:00 03EB:842F: (accel) keeping acceleration scheme
> 1
> [ 11.514] (**) ATML1000:00 03EB:842F: (accel) acceleration profile 0
> [ 11.514] (**) ATML1000:00 03EB:842F: (accel) acceleration factor: 2.000
> [ 11.514] (**) ATML1000:00 03EB:842F: (accel) acceleration threshold: 4
> [ 11.515] (II) config/udev: Adding input device ATML1000:00 03EB:842F
> (/dev/input/mouse1)
> [ 11.515] (II) No input driver specified, ignoring this device.
> [ 11.515] (II) This device may have been added with another device file.
> [ 11.515] (II) config/udev: Adding input device AT Translated Set 2
> keyboard (/dev/input/event3)
> [ 11.515] (**) AT Translated Set 2 keyboard: Applying InputClass "evdev
> keyboard catchall"
> [ 11.515] (II) Using input driver 'evdev' for 'AT Translated Set 2
> keyboard'
> [ 11.515] (**) AT Translated Set 2 keyboard: always reports core events
> [ 11.515] (**) evdev: AT Translated Set 2 keyboard: Device:
> "/dev/input/event3"
> [ 11.515] (--) evdev: AT Translated Set 2 keyboard: Vendor 0x1 Product
> 0x1
> [ 11.515] (--) evdev: AT Translated Set 2 keyboard: Found keys
> [ 11.515] (II) evdev: AT Translated Set 2 keyboard: Configuring as
> keyboard
> [ 11.515] (**) Option "config_info"
> "udev:/sys/devices/platform/i8042/serio0/input/input3/event3"
> [ 11.515] (II) XINPUT: Adding extended input device "AT Translated Set 2
> keyboard" (type: KEYBOARD, id 12)
> [ 11.515] (**) Option "xkb_rules" "evdev"
> [ 11.515] (**) Option "xkb_model" "pc105"
> [ 11.515] (**) Option "xkb_layout" "us"
> [ 11.515] (**) Option "xkb_variant" "intl"
> [ 11.516] (II) config/udev: Adding input device Dell WMI hotkeys
> (/dev/input/event6)
> [ 11.516] (**) Dell WMI hotkeys: Applying InputClass "evdev keyboard
> catchall"
> [ 11.516] (II) Using input driver 'evdev' for 'Dell WMI hotkeys'
> [ 11.516] (**) Dell WMI hotkeys: always reports core events
> [ 11.516] (**) evdev: Dell WMI hotkeys: Device: "/dev/input/event6"
> [ 11.516] (--) evdev: Dell WMI hotkeys: Vendor 0 Product 0
> [ 11.516] (--) evdev: Dell WMI hotkeys: Found keys
> [ 11.516] (II) evdev: Dell WMI hotkeys: Configuring as keyboard
> [ 11.516] (**) Option "config_info"
> "udev:/sys/devices/virtual/input/input6/event6"
> [ 11.516] (II) XINPUT: Adding extended input device "Dell WMI hotkeys"
> (type: KEYBOARD, id 13)
> [ 11.516] (**) Option "xkb_rules" "evdev"
> [ 11.516] (**) Option "xkb_model" "pc105"
> [ 11.516] (**) Option "xkb_layout" "us"
> [ 11.516] (**) Option "xkb_variant" "intl"
> [ 11.793] (II) intel(0): EDID vendor "LGD", prod id 1021
> [ 11.793] (II) intel(0): Printing DDC gathered Modelines:
> [ 11.793] (II) intel(0): Modeline "1920x1080"x0.0 138.50 1920 1968 2000
> 2080 1080 1083 1088 1111 +hsync -vsync (66.6 kHz eP)
> [ 17.641] (II) XKB: reuse xkmfile
> /var/lib/xkb/server-8CD2763E246F7107805A70A0C7DBAC594B3523D9.xkm
> [ 18.165] (II) XKB: reuse xkmfile
> /var/lib/xkb/server-657D1E36EA86B8E7C9DA9E3D0CE267494DF7D894.xkm
> [ 18.168] (II) XKB: reuse xkmfile
> /var/lib/xkb/server-657D1E36EA86B8E7C9DA9E3D0CE267494DF7D894.xkm
> [ 18.381] (II) XKB: reuse xkmfile
> /var/lib/xkb/server-280C0FB5E1610579A23BBD0FBA8EB1281D867EEF.xkm
> [ 18.722] (II) XKB: reuse xkmfile
> /var/lib/xkb/server-8CD2763E246F7107805A70A0C7DBAC594B3523D9.xkm
> [ 18.727] (II) XKB: reuse xkmfile
> /var/lib/xkb/server-657D1E36EA86B8E7C9DA9E3D0CE267494DF7D894.xkm
>
>
> xinput --list
>
> ⎡ Virtual core pointer id=2 [master pointer (3)]
> ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer
> (2)]
> ⎜ ↳ DLL05E3:01 06CB:2734 id=10 [slave pointer
> (2)]
> ⎜ ↳ ATML1000:00 03EB:842F id=11 [slave pointer
> (2)]
> ⎣ Virtual core keyboard id=3 [master keyboard (2)]
> ↳ Virtual core XTEST keyboard id=5 [slave keyboard
> (3)]
> ↳ Power Button id=6 [slave keyboard
> (3)]
> ↳ Video Bus id=7 [slave keyboard
> (3)]
> ↳ Power Button id=8 [slave keyboard
> (3)]
> ↳ Integrated Webcam id=9 [slave keyboard
> (3)]
> ↳ AT Translated Set 2 keyboard id=12 [slave keyboard
> (3)]
> ↳ Dell WMI hotkeys id=13 [slave keyboard
> (3)]
>
>
> Relevant lines from dmesg
>
> [ 0.000000] Linux version 3.12.0-031200rc3-generic (apw@gomeisa) (gcc
> version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #201309291835 SMP Sun Sep 29
> 22:37:02 UTC 2013
> [ 0.000000] Command line:
> BOOT_IMAGE=/boot/vmlinuz-3.12.0-031200rc3-generic
> root=UUID=8e4879ce-4777-4c48-b6d7-5b3b4b116ad3 ro quiet splash vt.handoff=7
> [ 0.000000] DMI: Dell Inc. XPS 12-9Q33/XPS 12-9Q33, BIOS A02 07/26/2013
>
> [ 1.145083] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at
> 0x60,0x64 irq 1,12
> [ 1.169878] serio: i8042 KBD port at 0x60,0x64 irq 1
> [ 1.169882] serio: i8042 AUX port at 0x60,0x64 irq 12
> [ 1.170063] mousedev: PS/2 mouse device common for all mice
>
> [ 8.636649] ACPI Warning: 0x0000000000001828-0x000000000000182f SystemIO
> conflicts with Region \PMIO 1 (20130725/utaddress-251)
> [ 8.636656] ACPI: If an ACPI driver is available for this device, you
> should use it instead of the native driver
> [ 8.636660] ACPI Warning: 0x0000000000001c30-0x0000000000001c3f SystemIO
> conflicts with Region \GPRL 1 (20130725/utaddress-251)
> [ 8.636664] ACPI Warning: 0x0000000000001c30-0x0000000000001c3f SystemIO
> conflicts with Region \GPR_ 2 (20130725/utaddress-251)
> [ 8.636667] ACPI: If an ACPI driver is available for this device, you
> should use it instead of the native driver
> [ 8.636669] ACPI Warning: 0x0000000000001c00-0x0000000000001c2f SystemIO
> conflicts with Region \GPRL 1 (20130725/utaddress-251)
> [ 8.636672] ACPI Warning: 0x0000000000001c00-0x0000000000001c2f SystemIO
> conflicts with Region \GPR_ 2 (20130725/utaddress-251)
> [ 8.636675] ACPI: If an ACPI driver is available for this device, you
> should use it instead of the native driver
> [ 8.636677] lpc_ich: Resource conflict(s) found affecting gpio_ich
>
> [ 8.915773] i2c_hid 8-002c: failed to retrieve report from device.
> [ 8.918200] i2c_hid 8-002c: failed to retrieve report from device.
> [ 8.918897] i2c_hid 8-002c: failed to retrieve report from device.
> [ 8.924053] i2c_hid 8-002c: failed to retrieve report from device.
> [ 8.924118] input: DLL05E3:01 06CB:2734 as
> /devices/pci0000:00/INT33C3:00/i2c-8/8-002c/input/input7
> [ 8.924297] hid-generic 0018:06CB:2734.0003: input,hidraw0: <UNKNOWN> HID
> v1.00 Pointer [DLL05E3:01 06CB:2734] on
> [ 8.928162] i2c_hid 8-004b: error in i2c_hid_init_report size:20 /
> ret_size:0
> [ 8.930894] i2c_hid 8-004b: error in i2c_hid_init_report size:20 /
> ret_size:0
> [ 8.933598] i2c_hid 8-004b: error in i2c_hid_init_report size:13 /
> ret_size:0
>
> [ 8.946226] input: ATML1000:00 03EB:842F as
> /devices/pci0000:00/INT33C3:00/i2c-8/8-004b/input/input8
> [ 8.946815] hid-multitouch 0018:03EB:842F.0002: input,hidraw1: <UNKNOWN>
> HID v1.00 Device [ATML1000:00 03EB:842F] on
>
>
> ls /proc
>
> 1 1353 1671 1794 1995 23 304 485 56 922 iomem
> sched_debug
> 10 14 1673 18 2 2334 31 490 57 928 ioports
> schedstat
> 1005 140 1681 1807 20 24 33 493 579 93 irq scsi
> 1016 141 1683 1821 2002 2456 330 495 629 acpi kallsyms
> self
> 1027 1413 1686 1844 2005 2480 338 496 637 asound kcore
> slabinfo
> 1044 142 1690 1851 2011 2486 34 498 69 buddyinfo key-users
> softirqs
> 1058 143 1692 1853 2021 2487 35 499 7 bus kmsg stat
> 1094 15 17 19 2028 25 36 5 718 cgroups kpagecount swaps
> 11 1522 1701 192 2029 2557 37 507 73 cmdline kpageflags sys
> 1142 1566 1720 1920 2034 2562 38 51 765 consoles latency_stats
> sysrq-trigger
> 1155 1568 1738 1922 2044 26 39 510 795 cpuinfo loadavg
> sysvipc
> 1156 16 1748 1924 2048 2668 41 511 8 crypto locks
> timer_list
> 1157 1617 1760 1925 2052 2683 42 513 800 devices mdstat
> timer_stats
> 1158 1619 1761 1928 21 2716 43 514 822 diskstats meminfo
> tty
> 1189 1633 1762 193 2186 2738 44 52 832 dma misc uptime
> 12 1639 1763 1931 2194 2765 45 528 834 driver modules
> version
> 1200 1645 1765 194 2201 2767 457 529 9 execdomains mounts
> vmallocinfo
> 1214 1658 1781 1945 2207 28 46 53 900 fb mtrr vmstat
> 1261 1661 1785 1948 2215 29 467 531 908 filesystems net zoneinfo
> 1292 1664 1786 1965 2232 3 47 54 919 fs pagetypeinfo
> 13 1666 1787 1976 2284 30 483 55 92 interrupts partitions
>
>
> [X.] Other notes, patches, fixes, workarounds:
>
> Downstream Launchpad bug report:
> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1218973
>
> After blacklisting i2c_hid this is my xinput list:
>
> ⎡ Virtual core pointer id=2 [master pointer (3)]
> ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer
> (2)]
> ⎜ ↳ SynPS/2 Synaptics TouchPad id=11 [slave pointer
> (2)]
> ⎣ Virtual core keyboard id=3 [master keyboard (2)]
> ↳ Virtual core XTEST keyboard id=5 [slave keyboard
> (3)]
> ↳ Power Button id=6 [slave keyboard
> (3)]
> ↳ Video Bus id=7 [slave keyboard
> (3)]
> ↳ Power Button id=8 [slave keyboard
> (3)]
> ↳ Integrated Webcam id=9 [slave keyboard
> (3)]
> ↳ AT Translated Set 2 keyboard id=10 [slave keyboard
> (3)]
> ↳ Dell WMI hotkeys id=12 [slave keyboard
> (3)]
>
> As you can see, the touchpad is no longer called "DLL05E3:01 06CB:2734".
> However, touchscreen "ATML1000:00 03EB:842F" is missing now.
>
> Thank you for your time.
>
> --
> Wouter van der Graaf
> --
> To unsubscribe from this list: send the line "unsubscribe linux-input" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH] HID: i2c-hid: add platform data for quirks
From: Benjamin Tissoires @ 2013-10-09 10:59 UTC (permalink / raw)
To: Jiri Kosina
Cc: Bibek Basu, linux-tegra-u79uwXL29TY76Z2rM5mHXA, Kiran Adduri,
linux-input
In-Reply-To: <alpine.LNX.2.00.1310091225230.13289-ztGlSCb7Y1iN3ZZ/Hiejyg@public.gmane.org>
On Wed, Oct 9, 2013 at 12:26 PM, Jiri Kosina <jkosina-AlSwsSmVLrQ@public.gmane.org> wrote:
> On Thu, 3 Oct 2013, Bibek Basu wrote:
>
>> Some HID device does not responds to INPUT/FEATURE
>> report query during initialization. As a result HID driver
>> throws error even when its not mandatory according to the
>> HID specification. Add platform data to provide
>> quirk information to the driver so that init query is not
>> done on such devices.
>>
>> Signed-off-by: Bibek Basu <bbasu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
>> ---
>> drivers/hid/i2c-hid/i2c-hid.c | 1 +
>> include/linux/i2c/i2c-hid.h | 3 ++-
>> 2 files changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
>> index fd7ce37..a7aec2c 100644
>> --- a/drivers/hid/i2c-hid/i2c-hid.c
>> +++ b/drivers/hid/i2c-hid/i2c-hid.c
>> @@ -1017,6 +1017,7 @@ static int i2c_hid_probe(struct i2c_client *client,
>> hid->version = le16_to_cpu(ihid->hdesc.bcdVersion);
>> hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID);
>> hid->product = le16_to_cpu(ihid->hdesc.wProductID);
>> + hid->quirks = platform_data->quirks;
>>
>> snprintf(hid->name, sizeof(hid->name), "%s %04hX:%04hX",
>> client->name, hid->vendor, hid->product);
>> diff --git a/include/linux/i2c/i2c-hid.h b/include/linux/i2c/i2c-hid.h
>> index 7aa901d..12e682d 100644
>> --- a/include/linux/i2c/i2c-hid.h
>> +++ b/include/linux/i2c/i2c-hid.h
>> @@ -17,7 +17,7 @@
>> /**
>> * struct i2chid_platform_data - used by hid over i2c implementation.
>> * @hid_descriptor_address: i2c register where the HID descriptor is stored.
>> - *
>> + * @quirks: quirks, if any for i2c-hid devices
>> * Note that it is the responsibility of the platform driver (or the acpi 5.0
>> * driver, or the flattened device tree) to setup the irq related to the gpio in
>> * the struct i2c_board_info.
>> @@ -31,6 +31,7 @@
>> */
>> struct i2c_hid_platform_data {
>> u16 hid_descriptor_address;
>> + u32 quirks;
>> };
>
Hi Jiri,
> Umm, and where does the quirks field of platform data actually get set? I
> don't seem to see any followup patchset doing that?
The platform data is filled by specific march-* board definition data.
In this case some I would say a tegra board. So it's fine not having a
patchset setting the quirk (as it is per board, and maybe per
version/manufacturer).
Other than that I would love seeing the same for the device tree
binding if we add this to the struct i2c_hid_platform_data.
BTW, Jiri, the aim of the patch was to be able to add the quirk
HID_QUIRK_NO_INIT_INPUT_REPORTS to some of the i2c-hid devices.
However, the Windows driver uses this by default, so I already told to
Bibek that we could just drop the related calls in
i2c_hid_init_reports().
Cheers,
Benjamin
^ permalink raw reply
* Re: [PATCH] HID: i2c-hid: add platform data for quirks
From: Jiri Kosina @ 2013-10-09 10:26 UTC (permalink / raw)
To: Bibek Basu; +Cc: benjamin.tissoires, linux-tegra, kadduri, linux-input
In-Reply-To: <1380790121-1355-1-git-send-email-bbasu@nvidia.com>
On Thu, 3 Oct 2013, Bibek Basu wrote:
> Some HID device does not responds to INPUT/FEATURE
> report query during initialization. As a result HID driver
> throws error even when its not mandatory according to the
> HID specification. Add platform data to provide
> quirk information to the driver so that init query is not
> done on such devices.
>
> Signed-off-by: Bibek Basu <bbasu@nvidia.com>
> ---
> drivers/hid/i2c-hid/i2c-hid.c | 1 +
> include/linux/i2c/i2c-hid.h | 3 ++-
> 2 files changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
> index fd7ce37..a7aec2c 100644
> --- a/drivers/hid/i2c-hid/i2c-hid.c
> +++ b/drivers/hid/i2c-hid/i2c-hid.c
> @@ -1017,6 +1017,7 @@ static int i2c_hid_probe(struct i2c_client *client,
> hid->version = le16_to_cpu(ihid->hdesc.bcdVersion);
> hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID);
> hid->product = le16_to_cpu(ihid->hdesc.wProductID);
> + hid->quirks = platform_data->quirks;
>
> snprintf(hid->name, sizeof(hid->name), "%s %04hX:%04hX",
> client->name, hid->vendor, hid->product);
> diff --git a/include/linux/i2c/i2c-hid.h b/include/linux/i2c/i2c-hid.h
> index 7aa901d..12e682d 100644
> --- a/include/linux/i2c/i2c-hid.h
> +++ b/include/linux/i2c/i2c-hid.h
> @@ -17,7 +17,7 @@
> /**
> * struct i2chid_platform_data - used by hid over i2c implementation.
> * @hid_descriptor_address: i2c register where the HID descriptor is stored.
> - *
> + * @quirks: quirks, if any for i2c-hid devices
> * Note that it is the responsibility of the platform driver (or the acpi 5.0
> * driver, or the flattened device tree) to setup the irq related to the gpio in
> * the struct i2c_board_info.
> @@ -31,6 +31,7 @@
> */
> struct i2c_hid_platform_data {
> u16 hid_descriptor_address;
> + u32 quirks;
> };
Umm, and where does the quirks field of platform data actually get set? I
don't seem to see any followup patchset doing that?
Thanks,
--
Jiri Kosina
SUSE Labs
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox