From patchwork Fri Mar 12 14:44:13 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Neukum X-Patchwork-Id: 85292 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o2CEiJWT013974 for ; Fri, 12 Mar 2010 14:44:20 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758211Ab0CLOoS (ORCPT ); Fri, 12 Mar 2010 09:44:18 -0500 Received: from smtp-out003.kontent.com ([81.88.40.217]:34261 "EHLO smtp-out003.kontent.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756373Ab0CLOoR convert rfc822-to-8bit (ORCPT ); Fri, 12 Mar 2010 09:44:17 -0500 Received: from vanamonde.localnet (p549A1C46.dip0.t-ipconnect.de [84.154.28.70]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: neukum_org@smtp-out003.kontent.com) by smtp-out003.kontent.com (Postfix) with ESMTPSA id DA5DC4000205; Fri, 12 Mar 2010 15:44:16 +0100 (CET) To: Daniel Ritz Subject: [RFC/RFT 5/5] USB: usbtouch: autosuspend for active touchscreens Cc: linux-input@vger.kernel.org, USB list From: Oliver Neukum Date: Fri, 12 Mar 2010 15:44:13 +0100 MIME-Version: 1.0 Message-Id: <201003121544.13173.oliver@neukum.org> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Fri, 12 Mar 2010 14:44:40 +0000 (UTC) diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index cc0eb7c..f89036a 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c @@ -1260,6 +1260,7 @@ static void usbtouch_irq(struct urb *urb) usbtouch->type->process_pkt(usbtouch, usbtouch->data, urb->actual_length); exit: + usb_mark_last_busy(interface_to_usbdev(usbtouch->interface)); retval = usb_submit_urb(urb, GFP_ATOMIC); if (retval) err("%s - usb_submit_urb failed with result: %d", @@ -1269,36 +1270,48 @@ exit: static int usbtouch_open(struct input_dev *input) { struct usbtouch_usb *usbtouch = input_get_drvdata(input); - int r; + int rv = 0; usbtouch->irq->dev = interface_to_usbdev(usbtouch->interface); - r = usb_autopm_get_interface(usbtouch->interface); - if (r < 0) + rv = usb_autopm_get_interface(usbtouch->interface); + if (rv < 0) goto err_out; if (!usbtouch->type->irq_always) { - if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) - goto err_out_revert; + rv = usb_submit_urb(usbtouch->irq, GFP_KERNEL); + if (rv < 0) + goto err_out_revert; usbtouch->submitted = true; } - - return 0; + usbtouch->interface->needs_remote_wakeup = 1; err_out_revert: usb_autopm_put_interface(usbtouch->interface); err_out: - return -EIO; + return rv < 0 ? -EIO : 0; } static void usbtouch_close(struct input_dev *input) { struct usbtouch_usb *usbtouch = input_get_drvdata(input); + int r; usbtouch->submitted = false; - if (!usbtouch->type->irq_always) + + /* + * if the irq needs to be kept running we know remote + * wakeup will be needed and as it is requested at this + * time we do nothing + */ + if (!usbtouch->type->irq_always) { usb_kill_urb(usbtouch->irq); - usb_autopm_put_interface(usbtouch->interface); + r = usb_autopm_get_interface(usbtouch->interface); + if (r == 0) { + usbtouch->interface->needs_remote_wakeup = 0; + usb_autopm_put_interface(usbtouch->interface); + } + } } static int usbtouch_suspend(struct usb_interface *intf, pm_message_t message)