diff mbox

HID: Add quirk for Lenovo Yoga 910 with ITE Chips

Message ID 20170715122721.6908-1-ctx.xda@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Patrick Pedersen July 15, 2017, 12:27 p.m. UTC
As with previous generations of this device (see https://patchwork.kernel.org/patch/7887361/), the ITE
HID Sensor Hub, responsible for the accelerometer and als sensor, requires a quirk entry.

Without the entry, the Sensor Hub can't be accessed and the kernel fails to report any movements. As a result
iio-sensor-proxy receives no new data.

It shall additionally be noted that the i2c-hid 'sleep' bug (present since kernel ver. 4.3)
still affects the driver. This means that the sensor hub will not report any movement, until
the device is suspended and resumed.

Signed-off-by: Patrick Pedersen <ctx.xda@gmail.com>
---
 drivers/hid/hid-ids.h        | 1 +
 drivers/hid/hid-sensor-hub.c | 3 +++
 2 files changed, 4 insertions(+)

Comments

Bastien Nocera July 15, 2017, 2:29 p.m. UTC | #1
On Sat, 2017-07-15 at 14:27 +0200, Patrick Pedersen wrote:
> As with previous generations of this device (see https://patchwork.ke
> rnel.org/patch/7887361/), the ITE
> HID Sensor Hub, responsible for the accelerometer and als sensor,
> requires a quirk entry.
> 
> Without the entry, the Sensor Hub can't be accessed and the kernel
> fails to report any movements. As a result
> iio-sensor-proxy receives no new data.
> 
> It shall additionally be noted that the i2c-hid 'sleep' bug (present
> since kernel ver. 4.3)
> still affects the driver. This means that the sensor hub will not
> report any movement, until
> the device is suspended and resumed.
> 
> Signed-off-by: Patrick Pedersen <ctx.xda@gmail.com>
> ---
>  drivers/hid/hid-ids.h        | 1 +
>  drivers/hid/hid-sensor-hub.c | 3 +++
>  2 files changed, 4 insertions(+)
> 
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index 4f9a3938189a..b427a0bcfbe8 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -565,6 +565,7 @@
>  #define USB_DEVICE_ID_ITE_LENOVO_YOGA   0x8386
>  #define USB_DEVICE_ID_ITE_LENOVO_YOGA2  0x8350
>  #define USB_DEVICE_ID_ITE_LENOVO_YOGA900	0x8396
> +#define USB_DEVICE_ID_ITE_LENOVO_YOGA910	0x8186
>  
>  #define USB_VENDOR_ID_JABRA		0x0b0e
>  #define USB_DEVICE_ID_JABRA_SPEAK_410	0x0412
> diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-
> hub.c
> index 4ef73374a8f9..85b8425483bd 100644
> --- a/drivers/hid/hid-sensor-hub.c
> +++ b/drivers/hid/hid-sensor-hub.c
> @@ -820,6 +820,9 @@ static const struct hid_device_id
> sensor_hub_devices[] = {
>  	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB,
> USB_VENDOR_ID_ITE,
>  			USB_DEVICE_ID_ITE_LENOVO_YOGA900),
>  			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
> +	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB,
> USB_VENDOR_ID_ITE,
> +			USB_DEVICE_ID_ITE_LENOVO_YOGA910),
> +			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
>  	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB,
> USB_VENDOR_ID_INTEL_0,
>  			0x22D8),
>  			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},

At this point, wouldn't it make sense to apply the quirk to *all* ITE
devices in Lenovo Yoga laptops?
--
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
Bastien Nocera July 15, 2017, 5:58 p.m. UTC | #2
On Sat, 2017-07-15 at 19:52 +0200, Patrick Pedersen wrote:
> On Sat, Jul 15, 2017 at 4:29 PM, Bastien Nocera <hadess@hadess.net>
> wrote:
> > On Sat, 2017-07-15 at 14:27 +0200, Patrick Pedersen wrote:
> > > As with previous generations of this device (see https://patchwor
> > k.ke
> > > rnel.org/patch/7887361/), the ITE
> > > HID Sensor Hub, responsible for the accelerometer and als sensor,
> > > requires a quirk entry.
> > >
> > > Without the entry, the Sensor Hub can't be accessed and the
> > kernel
> > > fails to report any movements. As a result
> > > iio-sensor-proxy receives no new data.
> > >
> > > It shall additionally be noted that the i2c-hid 'sleep' bug
> > (present
> > > since kernel ver. 4.3)
> > > still affects the driver. This means that the sensor hub will not
> > > report any movement, until
> > > the device is suspended and resumed.
> > >
> > > Signed-off-by: Patrick Pedersen <ctx.xda@gmail.com>
> > > ---
> > >  drivers/hid/hid-ids.h        | 1 +
> > >  drivers/hid/hid-sensor-hub.c | 3 +++
> > >  2 files changed, 4 insertions(+)
> > >
> > > diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> > > index 4f9a3938189a..b427a0bcfbe8 100644
> > > --- a/drivers/hid/hid-ids.h
> > > +++ b/drivers/hid/hid-ids.h
> > > @@ -565,6 +565,7 @@
> > >  #define USB_DEVICE_ID_ITE_LENOVO_YOGA   0x8386
> > >  #define USB_DEVICE_ID_ITE_LENOVO_YOGA2  0x8350
> > >  #define USB_DEVICE_ID_ITE_LENOVO_YOGA900     0x8396
> > > +#define USB_DEVICE_ID_ITE_LENOVO_YOGA910     0x8186
> > >
> > >  #define USB_VENDOR_ID_JABRA          0x0b0e
> > >  #define USB_DEVICE_ID_JABRA_SPEAK_410        0x0412
> > > diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-
> > sensor-
> > > hub.c
> > > index 4ef73374a8f9..85b8425483bd 100644
> > > --- a/drivers/hid/hid-sensor-hub.c
> > > +++ b/drivers/hid/hid-sensor-hub.c
> > > @@ -820,6 +820,9 @@ static const struct hid_device_id
> > > sensor_hub_devices[] = {
> > >       { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB,
> > > USB_VENDOR_ID_ITE,
> > >                       USB_DEVICE_ID_ITE_LENOVO_YOGA900),
> > >                       .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
> > > +     { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB,
> > > USB_VENDOR_ID_ITE,
> > > +                     USB_DEVICE_ID_ITE_LENOVO_YOGA910),
> > > +                     .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
> > >       { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB,
> > > USB_VENDOR_ID_INTEL_0,
> > >                       0x22D8),
> > >                       .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
> > 
> > At this point, wouldn't it make sense to apply the quirk to *all*
> > ITE
> > devices in Lenovo Yoga laptops?
> 
> I'm not sure If I got your suggestion right.
> 
> Those laptops do not share the same ITE chip. ITE is simply 
> the vendor/manufacturer of the hid sensor hub. All three defined 
> yoga laptops use a different ITE sensor hub model.
> 
> To make this clear, my device, the 
> Lenovo Yoga 910 uses a ITE8186, 
> where the Yoga 900 uses a ITE8396, 
> the Yoga 2 a ITE8350 and so on
> 
> Now what "could" me done, is to detect and set the quirk
> automatically. 
> This should be doable, as the Hardware PID corresponds to the 
> model number of the Sensor Hub (ex. ITE8186 = PID 0x8186)

I'm saying that if the vendor of the device is USB_VENDOR_ID_ITE and
the manufacturer of the hardware is Lenovo in the DMI information, and
the model of hardware contains "Yoga", that HID_SENSOR_HUB_ENUM_QUIRK
be applied automatically, instead of adding quirks one-by-one.
--
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
Patrick Pedersen July 15, 2017, 8:05 p.m. UTC | #3
On Sat, Jul 15, 2017 at 07:58:10PM +0200, Bastien Nocera wrote:
> On Sat, 2017-07-15 at 19:52 +0200, Patrick Pedersen wrote:
> > On Sat, Jul 15, 2017 at 4:29 PM, Bastien Nocera <hadess@hadess.net>
> > wrote:
> > > On Sat, 2017-07-15 at 14:27 +0200, Patrick Pedersen wrote:
> > > > As with previous generations of this device (see https://patchwor
> > > k.ke
> > > > rnel.org/patch/7887361/), the ITE
> > > > HID Sensor Hub, responsible for the accelerometer and als sensor,
> > > > requires a quirk entry.
> > > >
> > > > Without the entry, the Sensor Hub can't be accessed and the
> > > kernel
> > > > fails to report any movements. As a result
> > > > iio-sensor-proxy receives no new data.
> > > >
> > > > It shall additionally be noted that the i2c-hid 'sleep' bug
> > > (present
> > > > since kernel ver. 4.3)
> > > > still affects the driver. This means that the sensor hub will not
> > > > report any movement, until
> > > > the device is suspended and resumed.
> > > >
> > > > Signed-off-by: Patrick Pedersen <ctx.xda@gmail.com>
> > > > ---
> > > >  drivers/hid/hid-ids.h        | 1 +
> > > >  drivers/hid/hid-sensor-hub.c | 3 +++
> > > >  2 files changed, 4 insertions(+)
> > > >
> > > > diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> > > > index 4f9a3938189a..b427a0bcfbe8 100644
> > > > --- a/drivers/hid/hid-ids.h
> > > > +++ b/drivers/hid/hid-ids.h
> > > > @@ -565,6 +565,7 @@
> > > >  #define USB_DEVICE_ID_ITE_LENOVO_YOGA   0x8386
> > > >  #define USB_DEVICE_ID_ITE_LENOVO_YOGA2  0x8350
> > > >  #define USB_DEVICE_ID_ITE_LENOVO_YOGA900     0x8396
> > > > +#define USB_DEVICE_ID_ITE_LENOVO_YOGA910     0x8186
> > > >
> > > >  #define USB_VENDOR_ID_JABRA          0x0b0e
> > > >  #define USB_DEVICE_ID_JABRA_SPEAK_410        0x0412
> > > > diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-
> > > sensor-
> > > > hub.c
> > > > index 4ef73374a8f9..85b8425483bd 100644
> > > > --- a/drivers/hid/hid-sensor-hub.c
> > > > +++ b/drivers/hid/hid-sensor-hub.c
> > > > @@ -820,6 +820,9 @@ static const struct hid_device_id
> > > > sensor_hub_devices[] = {
> > > >       { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB,
> > > > USB_VENDOR_ID_ITE,
> > > >                       USB_DEVICE_ID_ITE_LENOVO_YOGA900),
> > > >                       .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
> > > > +     { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB,
> > > > USB_VENDOR_ID_ITE,
> > > > +                     USB_DEVICE_ID_ITE_LENOVO_YOGA910),
> > > > +                     .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
> > > >       { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB,
> > > > USB_VENDOR_ID_INTEL_0,
> > > >                       0x22D8),
> > > >                       .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
> > > 
> > > At this point, wouldn't it make sense to apply the quirk to *all*
> > > ITE
> > > devices in Lenovo Yoga laptops?
> > 
> > I'm not sure If I got your suggestion right.
> > 
> > Those laptops do not share the same ITE chip. ITE is simply 
> > the vendor/manufacturer of the hid sensor hub. All three defined 
> > yoga laptops use a different ITE sensor hub model.
> > 
> > To make this clear, my device, the 
> > Lenovo Yoga 910 uses a ITE8186, 
> > where the Yoga 900 uses a ITE8396, 
> > the Yoga 2 a ITE8350 and so on
> > 
> > Now what "could" me done, is to detect and set the quirk
> > automatically. 
> > This should be doable, as the Hardware PID corresponds to the 
> > model number of the Sensor Hub (ex. ITE8186 = PID 0x8186)
> 
> I'm saying that if the vendor of the device is USB_VENDOR_ID_ITE and
> the manufacturer of the hardware is Lenovo in the DMI information, and
> the model of hardware contains "Yoga", that HID_SENSOR_HUB_ENUM_QUIRK
> be applied automatically, instead of adding quirks one-by-one.

First of all, I would like to appologise that my previous reply was
not caught by the mailing list. I had a frustrating time getting
mutt to work and decided to use the gmail web interface. Turns out
that was a bad idea. Fortunately it seems like I got things right 
this time.

Now to the automated ITE chip detection you've proposed. I likely lack
the driver and kernel knowledge to implement a feature of such. In the 
upcoming days I will to do some research on the HID drivers and see what 
I can do. The goal of this patch was to simply fix the issue for my device,
not to find a new or different solution.

Patrick
--
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
Arek Burdach July 16, 2017, 7:39 a.m. UTC | #4
Hi Patrick,

On 15.07.2017 14:27, Patrick Pedersen wrote:
> It shall additionally be noted that the i2c-hid 'sleep' bug (present since kernel ver. 4.3)
> still affects the driver. This means that the sensor hub will not report any movement, until
> the device is suspended and resumed.
>
Do you have workaround for that? In my case suspending and resuming 
doesn't help. Sensor reporting is backing to work in unpredictable way. 
What I've tested:

- kernel v4.13-rc1 with your patch applied
- watch -n1 cat /sys/bus/iio/devices/iio\:device*/*_raw <- value not 
changing
- suspend
- resume
- watch -n1 cat /sys/bus/iio/devices/iio\:device*/*_raw <- still not 
changing

If you have some workaround scenario please add it to bug reported be 
me: https://bugzilla.kernel.org/show_bug.cgi?id=195681

Cheers,
Arek
--
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
Brian Masney July 16, 2017, 10:23 a.m. UTC | #5
On Sun, Jul 16, 2017 at 09:39:19AM +0200, Arek Burdach wrote:
> Hi Patrick,
> 
> On 15.07.2017 14:27, Patrick Pedersen wrote:
> > It shall additionally be noted that the i2c-hid 'sleep' bug (present since kernel ver. 4.3)
> > still affects the driver. This means that the sensor hub will not report any movement, until
> > the device is suspended and resumed.
> > 
> Do you have workaround for that? In my case suspending and resuming doesn't
> help. Sensor reporting is backing to work in unpredictable way. What I've
> tested:
> 
> - kernel v4.13-rc1 with your patch applied
> - watch -n1 cat /sys/bus/iio/devices/iio\:device*/*_raw <- value not
> changing
> - suspend
> - resume
> - watch -n1 cat /sys/bus/iio/devices/iio\:device*/*_raw <- still not
> changing
> 
> If you have some workaround scenario please add it to bug reported be me:
> https://bugzilla.kernel.org/show_bug.cgi?id=195681

I have a Lenovo Yoga 910-13IKB and verified that the patch works
correctly for me on an upstream 4.12 kernel. The ALS sensor and
accelerometer function correctly without suspending the laptop with
this patch. The difference may be due the following kernel boot options
that I use:

	i915.enable_rc6=0 pci=noaer intel_pstate=disable

I have to disable power management for the CPU/GPU (i915.enable_rc6=0)
since I can only suspend and resume once on this laptop. Suspending a
second time will cause the laptop to hang before the suspend finishes.

The pci=noaer is likely not needed for UEFI firmware revisions 2JCN36WW
and newer. I'm stuck on UEFI firmware revision 2JCN28WW, which is what
came preinstalled on the system. Lenovo's UEFI update tool requires
Windows, which I no longer have.

I need to get on the latest UEFI revision and go through
basic-pm-debugging.txt if the power management issues are still present.

Brian
--
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
Arek Burdach July 17, 2017, 6:26 a.m. UTC | #6
On 16.07.2017 12:23, Brian Masney wrote:
> On Sun, Jul 16, 2017 at 09:39:19AM +0200, Arek Burdach wrote:
>> Hi Patrick,
>>
>> On 15.07.2017 14:27, Patrick Pedersen wrote:
>>> It shall additionally be noted that the i2c-hid 'sleep' bug (present since kernel ver. 4.3)
>>> still affects the driver. This means that the sensor hub will not report any movement, until
>>> the device is suspended and resumed.
>>>
>> Do you have workaround for that? In my case suspending and resuming doesn't
>> help. Sensor reporting is backing to work in unpredictable way. What I've
>> tested:
>>
>> - kernel v4.13-rc1 with your patch applied
>> - watch -n1 cat /sys/bus/iio/devices/iio\:device*/*_raw <- value not
>> changing
>> - suspend
>> - resume
>> - watch -n1 cat /sys/bus/iio/devices/iio\:device*/*_raw <- still not
>> changing
>>
>> If you have some workaround scenario please add it to bug reported be me:
>> https://bugzilla.kernel.org/show_bug.cgi?id=195681
> I have a Lenovo Yoga 910-13IKB
So do I
>   and verified that the patch works
> correctly for me on an upstream 4.12 kernel. The ALS sensor and
> accelerometer function correctly without suspending the laptop with
> this patch. The difference may be due the following kernel boot options
> that I use:
>
> 	i915.enable_rc6=0 pci=noaer intel_pstate=disable
>
> I have to disable power management for the CPU/GPU (i915.enable_rc6=0)
> since I can only suspend and resume once on this laptop. Suspending a
> second time will cause the laptop to hang before the suspend finishes.
>
> The pci=noaer is likely not needed for UEFI firmware revisions 2JCN36WW
> and newer. I'm stuck on UEFI firmware revision 2JCN28WW, which is what
> came preinstalled on the system. Lenovo's UEFI update tool requires
> Windows, which I no longer have.
>
> I need to get on the latest UEFI revision and go through
> basic-pm-debugging.txt if the power management issues are still present.
I have installed 2JCN36WW and: pci=noaer intel_pstate=disable flags are 
never need - suspending works ok every time.

I investigated that having iio-sensor-proxy installed may cause sensors 
stopping to work. Looks like only one option can work in the same time - 
either iio-sensor-proxy service or sensor reporting of raw data.

Arek
--
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
diff mbox

Patch

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 4f9a3938189a..b427a0bcfbe8 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -565,6 +565,7 @@ 
 #define USB_DEVICE_ID_ITE_LENOVO_YOGA   0x8386
 #define USB_DEVICE_ID_ITE_LENOVO_YOGA2  0x8350
 #define USB_DEVICE_ID_ITE_LENOVO_YOGA900	0x8396
+#define USB_DEVICE_ID_ITE_LENOVO_YOGA910	0x8186
 
 #define USB_VENDOR_ID_JABRA		0x0b0e
 #define USB_DEVICE_ID_JABRA_SPEAK_410	0x0412
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
index 4ef73374a8f9..85b8425483bd 100644
--- a/drivers/hid/hid-sensor-hub.c
+++ b/drivers/hid/hid-sensor-hub.c
@@ -820,6 +820,9 @@  static const struct hid_device_id sensor_hub_devices[] = {
 	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_ITE,
 			USB_DEVICE_ID_ITE_LENOVO_YOGA900),
 			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
+	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_ITE,
+			USB_DEVICE_ID_ITE_LENOVO_YOGA910),
+			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
 	{ HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_INTEL_0,
 			0x22D8),
 			.driver_data = HID_SENSOR_HUB_ENUM_QUIRK},