From patchwork Sat Aug 6 21:30:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cameron Gutman X-Patchwork-Id: 9266063 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5867E60760 for ; Sat, 6 Aug 2016 21:30:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4AD7127FAC for ; Sat, 6 Aug 2016 21:30:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3FE3E283EF; Sat, 6 Aug 2016 21:30:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DF52627FAC for ; Sat, 6 Aug 2016 21:30:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751821AbcHFVaf (ORCPT ); Sat, 6 Aug 2016 17:30:35 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:35545 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751672AbcHFVae (ORCPT ); Sat, 6 Aug 2016 17:30:34 -0400 Received: by mail-pf0-f193.google.com with SMTP id h186so22219978pfg.2 for ; Sat, 06 Aug 2016 14:30:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IkHOpJ1ZDKaWQOWT7lD1mrSlZkxuyfBYS+Z7uKcdhS4=; b=OZ8JUay3a9A2IHmik8VCYvn6DwxFZHXl+b/82MRAx1APIxa7QOJiW5Cf19SaVcvPaA 3mgVHPWfIgjZAG3h9h1tD2U1E3sOjbsvkeOd8GZnHAHW3aJqoTzwnM+MUEwPt9Ainjh0 sQzW160EsprzGTCvKAhmFYl4WellG4d1nuG0dRidWHHF7W3HOkwv2KO06dbyMrv5T6Dw XW9Dsb+icenvPqaihfmBrDprkPcgGTlQXXNUFC2z9hoALaQgkap6IakRIttBU5QQXytQ 6lXdje4VvpTjUr7bH18C9uCV0dmPNrn0T1enXm6a/BlZ2UAqJ1Sv6wvJrNFXoFI6WACm x7oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=IkHOpJ1ZDKaWQOWT7lD1mrSlZkxuyfBYS+Z7uKcdhS4=; b=AXnD1mtjuL/i8zFCHiQEYDlXCJlGROzbDizhx0g6pNHQ6bVQEhTqUE+GqLYfUBYPSq QOfUjTiH3IGiVN8FymCSYLxgMAJ2v2A3srd+IAbG8E7Rj6Zm5DBPBHAr2/V21hiKou2n UOK/enz8mcktl+Aa/1pmFJg/HgeEE+U2avawwWOZtM11VtA30/rRsF4DD8oOPQLC/YPJ xM/qh16rtFgVrmnlUdDpVlJtM5FwdOdT5TY9vC2GQ0ijGvExscqSaEzKzisW19uPSaWj dnhcwfKUjOx9rShixW5JROtD+ta9PJ0EaIr8KdGT7dSFA7TkujlhkWh+P8OBBlQSEHjt 2jCA== X-Gm-Message-State: AEkoousvGI4JrSZrccAJFINZFlHsJ6Eq9aEzWH2JdKpZHbm8X2J1gVBpvufLmZ8+UnkudQ== X-Received: by 10.98.201.138 with SMTP id l10mr147272533pfk.77.1470519033893; Sat, 06 Aug 2016 14:30:33 -0700 (PDT) Received: from localhost.localdomain (c-24-16-1-64.hsd1.wa.comcast.net. [24.16.1.64]) by smtp.gmail.com with ESMTPSA id o2sm37266645pfg.10.2016.08.06.14.30.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 06 Aug 2016 14:30:33 -0700 (PDT) From: Cameron Gutman To: dmitry.torokhov@gmail.com, rojtberg@gmail.com Cc: linux-input@vger.kernel.org Subject: [PATCH 3/3] Input: xpad - fix stuck mode button on Xbox One S pad Date: Sat, 6 Aug 2016 14:30:30 -0700 Message-Id: <1470519030-23051-4-git-send-email-aicommander@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1470519030-23051-1-git-send-email-aicommander@gmail.com> References: <1470519030-23051-1-git-send-email-aicommander@gmail.com> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The Xbox One S requires an ack to its mode button report otherwise it continuously retransmits the report. This makes the mode button appear to be stuck down after it is pressed for the first time. Signed-off-by: Cameron Gutman --- drivers/input/joystick/xpad.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 6a3a775..0dd5cf6 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -389,6 +389,7 @@ struct usb_xpad { static int xpad_init_input(struct usb_xpad *xpad); static void xpad_deinit_input(struct usb_xpad *xpad); +static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num); /* * xpad_process_packet @@ -699,6 +700,13 @@ static void xpadone_process_packet(struct usb_xpad *xpad, break; case 0x07: + /* The Xbox One S controller requires these reports to be + * acked otherwise it continues sending them forever and + * won't report further mode button events. + */ + if (data[1] == 0x30) + xpadone_ack_mode_report(xpad, data[2]); + /* the xbox button has its own special report */ input_report_key(dev, BTN_MODE, data[4] & 0x01); input_sync(dev); @@ -974,6 +982,30 @@ static int xpad_start_xbox_one(struct usb_xpad *xpad) return retval; } +static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num) +{ + unsigned long flags; + struct xpad_output_packet *packet = + &xpad->out_packets[XPAD_OUT_CMD_IDX]; + static const u8 mode_report_ack[] = { + 0x01, 0x20, 0x00, 0x09, 0x00, 0x07, 0x20, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + spin_lock_irqsave(&xpad->odata_lock, flags); + + packet->len = sizeof(mode_report_ack); + memcpy(packet->data, mode_report_ack, packet->len); + packet->data[2] = seq_num; + packet->pending = true; + + /* Reset the sequence so we send out the ack now */ + xpad->last_out_packet = -1; + xpad_try_sending_next_out_packet(xpad); + + spin_unlock_irqrestore(&xpad->odata_lock, flags); +} + #ifdef CONFIG_JOYSTICK_XPAD_FF static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect) {