From patchwork Sat Nov 7 15:12:09 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frank Praznik X-Patchwork-Id: 7575671 X-Patchwork-Delegate: jikos@jikos.cz Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 65F179F1AF for ; Sat, 7 Nov 2015 15:12:56 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6CBF8205B3 for ; Sat, 7 Nov 2015 15:12:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 63767205B1 for ; Sat, 7 Nov 2015 15:12:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753454AbbKGPMx (ORCPT ); Sat, 7 Nov 2015 10:12:53 -0500 Received: from mail-ig0-f172.google.com ([209.85.213.172]:33366 "EHLO mail-ig0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753464AbbKGPMw (ORCPT ); Sat, 7 Nov 2015 10:12:52 -0500 Received: by igvi2 with SMTP id i2so50941282igv.0 for ; Sat, 07 Nov 2015 07:12:52 -0800 (PST) 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=28JmKb+1X/GS0EYmYyR/+QkUfrEsl5lLOCxgZWvMPl8=; b=WQwVnBGg0NmnKPnjc3TwrGz2TcnVGWVNgwCFJW2GHHeekqbjdYUwWdWURhyGAYubw1 ztG7sAm4S9gvO4mBZGy2heSj5eRHiTI41OWJlUsyyFHSLfVhhEjMvudFVanoW8WkzAcZ pfv4OuKi5zJYgcaxqRCLd3OnVsSBPkbySStpFuPcAEdtOrrgrvwo96fI3XVXyRyBV+Xj YCX8jgulcdwjkolAFAR7HR8qe6uWQNWmQW1nvPAiSlZWWdUJn+Hb13eIYtD+8H0xxPgk HuSeK5t3r4xQkuo6uRso2lKv7ie8N1D5+GlD1YdOW3+RAOwaiIju7+n4BNTRinDDYVgm gyhw== X-Received: by 10.50.43.129 with SMTP id w1mr14262335igl.96.1446909172211; Sat, 07 Nov 2015 07:12:52 -0800 (PST) Received: from localhost.localdomain.localdomain (cpe-104-231-99-148.neo.res.rr.com. [104.231.99.148]) by smtp.gmail.com with ESMTPSA id yq7sm1676662igb.22.2015.11.07.07.12.51 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 07 Nov 2015 07:12:51 -0800 (PST) From: Frank Praznik To: linux-input@vger.kernel.org Cc: jkosina@suse.cz, Frank Praznik Subject: [PATCH 1/2] hid: sony: Refactor output report sending functions Date: Sat, 7 Nov 2015 10:12:09 -0500 Message-Id: <1446909130-9168-2-git-send-email-frank.praznik@gmail.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1446909130-9168-1-git-send-email-frank.praznik@gmail.com> References: <1446909130-9168-1-git-send-email-frank.praznik@gmail.com> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Refactor output report sending functions to allow for the sending of output reports without enqueing a work item. Output reports for any device can now be sent by calling the sony_send_output_report function which will automatically dispatch the request to the appropriate output function. The individual state worker functions have been replaced with a universal sony_state_worker function which calls sony_send_output_report. Signed-off-by: Frank Praznik --- drivers/hid/hid-sony.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 661f94f..b84b2ce 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c @@ -1782,7 +1782,7 @@ error_leds: return ret; } -static void sixaxis_state_worker(struct work_struct *work) +static void sixaxis_send_output_report(struct sony_sc *sc) { static const union sixaxis_output_report_01 default_report = { .buf = { @@ -1796,7 +1796,6 @@ static void sixaxis_state_worker(struct work_struct *work) 0x00, 0x00, 0x00, 0x00, 0x00 } }; - struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); struct sixaxis_output_report *report = (struct sixaxis_output_report *)sc->output_report_dmabuf; int n; @@ -1839,9 +1838,8 @@ static void sixaxis_state_worker(struct work_struct *work) HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); } -static void dualshock4_state_worker(struct work_struct *work) +static void dualshock4_send_output_report(struct sony_sc *sc) { - struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); struct hid_device *hdev = sc->hdev; __u8 *buf = sc->output_report_dmabuf; int offset; @@ -1886,9 +1884,8 @@ static void dualshock4_state_worker(struct work_struct *work) HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); } -static void motion_state_worker(struct work_struct *work) +static void motion_send_output_report(struct sony_sc *sc) { - struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); struct hid_device *hdev = sc->hdev; struct motion_output_report_02 *report = (struct motion_output_report_02 *)sc->output_report_dmabuf; @@ -1907,6 +1904,23 @@ static void motion_state_worker(struct work_struct *work) hid_hw_output_report(hdev, (__u8 *)report, MOTION_REPORT_0x02_SIZE); } +static void sony_send_output_report(struct sony_sc *sc) +{ + if (sc->quirks & DUALSHOCK4_CONTROLLER) + dualshock4_send_output_report(sc); + else if ((sc->quirks & SIXAXIS_CONTROLLER) || + (sc->quirks & NAVIGATION_CONTROLLER)) + sixaxis_send_output_report(sc); + else if (sc->quirks & MOTION_CONTROLLER) + motion_send_output_report(sc); +} + +static void sony_state_worker(struct work_struct *work) +{ + struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); + sony_send_output_report(sc); +} + static int sony_allocate_output_report(struct sony_sc *sc) { if ((sc->quirks & SIXAXIS_CONTROLLER) || @@ -2234,11 +2248,10 @@ static void sony_release_device_id(struct sony_sc *sc) } } -static inline void sony_init_work(struct sony_sc *sc, - void (*worker)(struct work_struct *)) +static inline void sony_init_work(struct sony_sc *sc) { if (!sc->worker_initialized) - INIT_WORK(&sc->state_worker, worker); + INIT_WORK(&sc->state_worker, sony_state_worker); sc->worker_initialized = 1; } @@ -2312,7 +2325,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID; ret = sixaxis_set_operational_usb(hdev); - sony_init_work(sc, sixaxis_state_worker); + sony_init_work(sc); } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) || (sc->quirks & NAVIGATION_CONTROLLER_BT)) { /* @@ -2321,7 +2334,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) */ hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; ret = sixaxis_set_operational_bt(hdev); - sony_init_work(sc, sixaxis_state_worker); + sony_init_work(sc); } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) { /* @@ -2336,9 +2349,9 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) } } - sony_init_work(sc, dualshock4_state_worker); + sony_init_work(sc); } else if (sc->quirks & MOTION_CONTROLLER) { - sony_init_work(sc, motion_state_worker); + sony_init_work(sc); } else { ret = 0; }