From patchwork Mon Feb 25 10:31:43 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Tissoires X-Patchwork-Id: 2180691 X-Patchwork-Delegate: jikos@jikos.cz Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id E48A33FDF1 for ; Mon, 25 Feb 2013 10:34:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759568Ab3BYKcq (ORCPT ); Mon, 25 Feb 2013 05:32:46 -0500 Received: from mail-wg0-f44.google.com ([74.125.82.44]:56255 "EHLO mail-wg0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759161Ab3BYKcp (ORCPT ); Mon, 25 Feb 2013 05:32:45 -0500 Received: by mail-wg0-f44.google.com with SMTP id dr12so2283138wgb.35 for ; Mon, 25 Feb 2013 02:32:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:subject:date:message-id:x-mailer:in-reply-to :references; bh=+qbkBUcFLvRj/f/qVCrumaa/oDPsBKKvW0q377q7RYQ=; b=uTomaYfsmZ6M88Q0R7x/YNG6g9nNo4HZttN9YUZ5lrkxYmv6qPN2ZaLLMnWIyyy6TA L6VcdlzQTr7XElieLJVNZAR4MtdUv4vxu9OP5XkX9N+jEhZTtHrUDord8T2LwhNRrIUL vUynfKCCZClbxdmcfVEEw5VfB3kQ/2FxfhaRNfDejuejqELt8dqZZ6NjZlcsPxLvu9aF Ie/30gxTWwPPpLtHDN+kGQaDRBkh/EqslXKrziLHwo2uIgZTz/MG0Fc3KamKendsoCKc Fwo2jXP/hrfuOm5kCNADAcn+WIk0TifZcLBPrIxHBu34YD6q586hZ+gpFu3nGS0fCuiJ qEcA== X-Received: by 10.180.85.97 with SMTP id g1mr11107330wiz.29.1361788363630; Mon, 25 Feb 2013 02:32:43 -0800 (PST) Received: from localhost.localdomain.com (lan31-8-82-247-176-67.fbx.proxad.net. [82.247.176.67]) by mx.google.com with ESMTPS id fv2sm15624068wib.6.2013.02.25.02.32.41 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 25 Feb 2013 02:32:42 -0800 (PST) From: Benjamin Tissoires To: Benjamin Tissoires , Jiri Kosina , Stephane Chatty , Mika Westerberg , Henrik Rydberg , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/8] HID: Extend the interface with report requests Date: Mon, 25 Feb 2013 11:31:43 +0100 Message-Id: <1361788310-6048-2-git-send-email-benjamin.tissoires@gmail.com> X-Mailer: git-send-email 1.8.1.2 In-Reply-To: <1361788310-6048-1-git-send-email-benjamin.tissoires@gmail.com> References: <1361788310-6048-1-git-send-email-benjamin.tissoires@gmail.com> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org From: Henrik Rydberg Some drivers send reports directly to underlying device, creating an unwanted dependency on the underlying transport layer. This patch adds hid_hw_request() to the interface, thereby removing usbhid from the lion share of the drivers. Signed-off-by: Henrik Rydberg Signed-off-by: Benjamin Tissoires Reviewed-by: Mika Westerberg --- drivers/hid/usbhid/hid-core.c | 13 +++++++++++++ include/linux/hid.h | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 8e0c4bf94..366fd09 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -1243,6 +1243,18 @@ static int usbhid_power(struct hid_device *hid, int lvl) return r; } +static void usbhid_request(struct hid_device *hid, struct hid_report *rep, int reqtype) +{ + switch (reqtype) { + case HID_REQ_GET_REPORT: + usbhid_submit_report(hid, rep, USB_DIR_IN); + break; + case HID_REQ_SET_REPORT: + usbhid_submit_report(hid, rep, USB_DIR_OUT); + break; + } +} + static struct hid_ll_driver usb_hid_driver = { .parse = usbhid_parse, .start = usbhid_start, @@ -1251,6 +1263,7 @@ static struct hid_ll_driver usb_hid_driver = { .close = usbhid_close, .power = usbhid_power, .hidinput_input_event = usb_hidinput_input_event, + .request = usbhid_request, }; static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id) diff --git a/include/linux/hid.h b/include/linux/hid.h index e14b465..261c713 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -662,6 +662,7 @@ struct hid_driver { * @hidinput_input_event: event input event (e.g. ff or leds) * @parse: this method is called only once to parse the device data, * shouldn't allocate anything to not leak memory + * @request: send report request to device (e.g. feature report) */ struct hid_ll_driver { int (*start)(struct hid_device *hdev); @@ -676,6 +677,10 @@ struct hid_ll_driver { unsigned int code, int value); int (*parse)(struct hid_device *hdev); + + void (*request)(struct hid_device *hdev, + struct hid_report *report, int reqtype); + }; #define PM_HINT_FULLON 1<<5 @@ -883,6 +888,21 @@ static inline int hid_hw_power(struct hid_device *hdev, int level) return hdev->ll_driver->power ? hdev->ll_driver->power(hdev, level) : 0; } + +/** + * hid_hw_request - send report request to device + * + * @hdev: hid device + * @report: report to send + * @reqtype: hid request type + */ +static inline void hid_hw_request(struct hid_device *hdev, + struct hid_report *report, int reqtype) +{ + if (hdev->ll_driver->request) + hdev->ll_driver->request(hdev, report, reqtype); +} + int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, int interrupt);