From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-119847-1516385335-2-325844855253911019 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, FREEMAIL_FORGED_FROMDOMAIN 0.25, FREEMAIL_FROM 0.001, HEADER_FROM_DIFFERENT_DOMAINS 0.25, RCVD_IN_DNSWL_HI -5, T_RP_MATCHES_RCVD -0.01, LANGUAGES enro, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='209.132.180.67', Host='vger.kernel.org', Country='US', FromHeader='com', MailFrom='org' X-Spam-charsets: plain='UTF-8' X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: stable-owner@vger.kernel.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1516385335; b=EJMhelVRDOAu4s39WF/bgPXZviy3GZXZwpiVRM2/BDGc33U tatdth4EX3kGZNiTLXqjQ0UBDkqfBsm5UGwvFGXDkvs0B+Nf+UEWep/+YAgj9Lx4 44YK6OfhQ785KZq13s/hcDHuSRwkqZEhUx1caPfvO8mWKscCwj0V3a1q+7AFgD6y e7GLECqtG04i4TgDRXeSIV+P95OteGzDZdtiiL1rY44tme2GGcmUswud12BjRkSW CJ8TkLxmfNew2hl+a2Im9Hf7jfPVF5mmgQMKLY6e1Wbgyqsth2jGV+pG5hlDDh9j 8CW0OmLICbIkUxdIL7yM3/MjJjd92X589VNDQoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=message-id:subject:from:to:cc:date :in-reply-to:references:content-type:mime-version :content-transfer-encoding:sender:list-id; s=arctest; t= 1516385335; bh=fe9/Swp0m1+Wxh/abBr2DUhz8Eza8AnF4jxU52BO1tI=; b=S 8uuijLX4PGCOeGx8h2xMWv+AO9o+LYmwSMJRLynRerTKcbvWfQsUiC84Ssm8HKjn YEX+F1H7RT3JrvbMacmsmXQByVfZA6eOzL4UyohVNCBkzkNrBigprP4zoySgdssv sd32iHBWgZABckkJ7HJFyCw9N9+ntsxc37gGf9a8vvNBotKtwLH7V9objabDAbw+ xMG1xmsjemRN4Cl09Mc+sFtIqAh8G42sq0k2EsqHMSQq+fVoNFmN2Yuy608eH2Hf Q+9NUq2wDnsxZjUYqcBQ9Hjrr+eLgUK5nGIWEtfLflnLUa8BRi8PJ3CXPZP+F6Kq SLG6Xf6ja2IFUfKucMvkw== ARC-Authentication-Results: i=1; mx5.messagingengine.com; arc=none (no signatures found); dkim=pass (2048-bit rsa key sha256) header.d=gmail.com header.i=@gmail.com header.b=lj9YtTLj x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=20161025; dmarc=pass (p=none,has-list-id=yes,d=none) header.from=gmail.com; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=stable-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-google-dkim=pass (2048-bit rsa key) header.d=1e100.net header.i=@1e100.net header.b=A9AFF2Wz; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=gmail.com header.result=pass header_is_org_domain=yes Authentication-Results: mx5.messagingengine.com; arc=none (no signatures found); dkim=pass (2048-bit rsa key sha256) header.d=gmail.com header.i=@gmail.com header.b=lj9YtTLj x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=20161025; dmarc=pass (p=none,has-list-id=yes,d=none) header.from=gmail.com; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=stable-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-google-dkim=pass (2048-bit rsa key) header.d=1e100.net header.i=@1e100.net header.b=A9AFF2Wz; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=gmail.com header.result=pass header_is_org_domain=yes Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755993AbeASSIw (ORCPT ); Fri, 19 Jan 2018 13:08:52 -0500 Received: from mail-qt0-f195.google.com ([209.85.216.195]:41733 "EHLO mail-qt0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755899AbeASSIu (ORCPT ); Fri, 19 Jan 2018 13:08:50 -0500 X-Google-Smtp-Source: ACJfBosb/o1SuYedlAQZ0239s2zEPppQacXURNkxgQWhCLWIlJcNvsmL5GWgZ1+hfgDDKEq9qPz4kA== Message-ID: <1516385327.2814.4.camel@gmail.com> Subject: Re: [PATCH 2/3] Input: synaptics_rmi4 - unmask F03 interrupts when port is opened From: thatslyude@gmail.com To: Dmitry Torokhov , Benjamin Tissoires , Damjan Georgievski Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Andrew Duggan , stable@vger.kernel.org Date: Fri, 19 Jan 2018 13:08:47 -0500 In-Reply-To: <20180119004955.247190-3-dmitry.torokhov@gmail.com> References: <20180119004955.247190-1-dmitry.torokhov@gmail.com> <20180119004955.247190-3-dmitry.torokhov@gmail.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.26.4 (3.26.4-1.fc27) Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: stable-owner@vger.kernel.org X-Mailing-List: stable@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: Looks good to me. Reviewed-by: Lyude Paul On Thu, 2018-01-18 at 16:49 -0800, Dmitry Torokhov wrote: > Currently we register the pass-through serio port when we probe the F03 RMI > function, and then, in sensor configure phase, we unmask interrupts. > Unfortunately this is too late, as other drivers are free probe devices > attached to the serio port as soon as it is probed. Because interrupts are > masked, the IO times out, which may result in not being able to detect > trackpoints on the pass-through port. > > To fix the issue we implement open() and close() methods for the > pass-through serio port and unmask interrupts from there. We also move > creation of the pass-through port form probe to configure stage, as RMI > driver does not enable transport interrupt until all functions are probed > (we should change this, but this is a separate topic). > > We also try to clear the pending data before unmasking interrupts, because > some devices like to spam the system with multiple 0xaa 0x00 announcements, > which may interfere with us trying to query ID of the device. > > Fixes: c5e8848fc98e ("Input: synaptics-rmi4 - add support for F03") > Cc: stable@vger.kernel.org > Signed-off-by: Dmitry Torokhov > --- > drivers/input/rmi4/rmi_f03.c | 64 +++++++++++++++++++++++++++++++++++++-- > ----- > 1 file changed, 54 insertions(+), 10 deletions(-) > > diff --git a/drivers/input/rmi4/rmi_f03.c b/drivers/input/rmi4/rmi_f03.c > index ad71a5e768dc4..7ccbb370a9a81 100644 > --- a/drivers/input/rmi4/rmi_f03.c > +++ b/drivers/input/rmi4/rmi_f03.c > @@ -32,6 +32,7 @@ struct f03_data { > struct rmi_function *fn; > > struct serio *serio; > + bool serio_registered; > > unsigned int overwrite_buttons; > > @@ -138,6 +139,37 @@ static int rmi_f03_initialize(struct f03_data *f03) > return 0; > } > > +static int rmi_f03_pt_open(struct serio *serio) > +{ > + struct f03_data *f03 = serio->port_data; > + struct rmi_function *fn = f03->fn; > + const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE; > + const u16 data_addr = fn->fd.data_base_addr + RMI_F03_OB_OFFSET; > + u8 obs[RMI_F03_QUEUE_LENGTH * RMI_F03_OB_SIZE]; > + int error; > + > + /* > + * Consume any pending data. Some devices like to spam with > + * 0xaa 0x00 announcements which may confuse us as we try to > + * probe the device. > + */ > + error = rmi_read_block(fn->rmi_dev, data_addr, &obs, ob_len); > + if (!error) > + rmi_dbg(RMI_DEBUG_FN, &fn->dev, > + "%s: Consumed %*ph (%d) from PS2 guest\n", > + __func__, ob_len, obs, ob_len); > + > + return fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn- > >irq_mask); > +} > + > +static void rmi_f03_pt_close(struct serio *serio) > +{ > + struct f03_data *f03 = serio->port_data; > + struct rmi_function *fn = f03->fn; > + > + fn->rmi_dev->driver->clear_irq_bits(fn->rmi_dev, fn->irq_mask); > +} > + > static int rmi_f03_register_pt(struct f03_data *f03) > { > struct serio *serio; > @@ -148,6 +180,8 @@ static int rmi_f03_register_pt(struct f03_data *f03) > > serio->id.type = SERIO_PS_PSTHRU; > serio->write = rmi_f03_pt_write; > + serio->open = rmi_f03_pt_open; > + serio->close = rmi_f03_pt_close; > serio->port_data = f03; > > strlcpy(serio->name, "Synaptics RMI4 PS/2 pass-through", > @@ -184,17 +218,27 @@ static int rmi_f03_probe(struct rmi_function *fn) > f03->device_count); > > dev_set_drvdata(dev, f03); > - > - error = rmi_f03_register_pt(f03); > - if (error) > - return error; > - > return 0; > } > > static int rmi_f03_config(struct rmi_function *fn) > { > - fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn->irq_mask); > + struct f03_data *f03 = dev_get_drvdata(&fn->dev); > + int error; > + > + if (!f03->serio_registered) { > + error = rmi_f03_register_pt(f03); > + if (error) > + return error; > + > + f03->serio_registered = true; > + } else { > + /* > + * We must be re-configuring the sensor, just enable > + * interrupts for this function. > + */ > + fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn- > >irq_mask); > + } > > return 0; > } > @@ -204,7 +248,7 @@ static int rmi_f03_attention(struct rmi_function *fn, > unsigned long *irq_bits) > struct rmi_device *rmi_dev = fn->rmi_dev; > struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); > struct f03_data *f03 = dev_get_drvdata(&fn->dev); > - u16 data_addr = fn->fd.data_base_addr; > + const u16 data_addr = fn->fd.data_base_addr + RMI_F03_OB_OFFSET; > const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE; > u8 obs[RMI_F03_QUEUE_LENGTH * RMI_F03_OB_SIZE]; > u8 ob_status; > @@ -226,8 +270,7 @@ static int rmi_f03_attention(struct rmi_function *fn, > unsigned long *irq_bits) > drvdata->attn_data.size -= ob_len; > } else { > /* Grab all of the data registers, and check them for data > */ > - error = rmi_read_block(fn->rmi_dev, data_addr + > RMI_F03_OB_OFFSET, > - &obs, ob_len); > + error = rmi_read_block(fn->rmi_dev, data_addr, &obs, > ob_len); > if (error) { > dev_err(&fn->dev, > "%s: Failed to read F03 output buffers: > %d\n", > @@ -266,7 +309,8 @@ static void rmi_f03_remove(struct rmi_function *fn) > { > struct f03_data *f03 = dev_get_drvdata(&fn->dev); > > - serio_unregister_port(f03->serio); > + if (f03->serio_registered) > + serio_unregister_port(f03->serio); > } > > struct rmi_function_handler rmi_f03_handler = {