lkml.org 
[lkml]   [2015]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RESEND] Lenovo Yoga 900 touchpad issues
    On Wed, 16 Dec 2015, Mika Westerberg wrote:

    > > [Apologies for the resend, didn't realize I hadn't changed my GMail settings
    > > to not use HTML.]
    > >
    > > I have recently purchased a Lenovo Yoga 900 and most everything is working
    > > with a slightly modified 4.4-rc5 (https://lkml.org/lkml/2015/11/30/441 applied
    > > to enable the touchpad itself), I am seeing two issues:
    > >
    > > 1) On suspend/resume, the touchpad is non-functional. A `modprobe -r i2c-hid;
    > > modprobe i2c-hid` "fixes" it.
    > >
    > > The kernel emits:
    > >
    > > i2c_hid i2c-SYNA2B29:00: failed to reset device.
    > > dpm_run_callback(): i2c_hid_resume+0x0/0xc0 [i2c_hid] returns -61
    > > PM: Device i2c-SYNA2B29:00 failed to resume: error -61
    > >
    > > During the resume. So perhaps this is a timing issue (given that once
    > > resumed, the
    > > module reload does work?).
    >
    > Linus noticed this as well and Jiri suggested the below patch which
    > seemed to fix the issue (although it increased resume time a bit).
    >
    > I was supposed to get one Lenovo Yoga 900 here to debug this issue but
    > I'm still waiting for it (sloow big corporation bureaucracy takes some
    > time to get things purchased outside).
    >
    > diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
    > index 55d8f9d..52dd03a0 100644
    > --- a/drivers/hid/i2c-hid/i2c-hid.c
    > +++ b/drivers/hid/i2c-hid/i2c-hid.c
    > @@ -1121,10 +1121,16 @@ static int i2c_hid_resume(struct device *dev)
    > struct i2c_client *client = to_i2c_client(dev);
    > struct i2c_hid *ihid = i2c_get_clientdata(client);
    > struct hid_device *hid = ihid->hid;
    > - int wake_status;
    > + int wake_status, tries = 3;
    >
    > enable_irq(ihid->irq);
    > - ret = i2c_hid_hwreset(client);
    > +
    > + do {
    > + ret = i2c_hid_hwreset(client);
    > + if (ret)
    > + msleep(1000);
    > + } while (tries-- > 0 && ret);
    > +
    > if (ret)
    > return ret;

    As a possible alternative, please test the patch above on top of for-next
    branch of

    git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git

    It contains 64bebefcf3 ("HID: enable hid device to suspend/resume
    asynchronously") and knowing whether that changes something might be
    interesting datapoint as well.

    Thanks,

    --
    Jiri Kosina
    SUSE Labs



    \
     
     \ /
      Last update: 2015-12-16 14:41    [W:3.211 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site