From patchwork Fri Oct 26 08:44:27 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Tissoires X-Patchwork-Id: 1650251 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 F396C40135 for ; Fri, 26 Oct 2012 08:47:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757503Ab2JZIpG (ORCPT ); Fri, 26 Oct 2012 04:45:06 -0400 Received: from mail-we0-f174.google.com ([74.125.82.174]:58210 "EHLO mail-we0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757425Ab2JZIov (ORCPT ); Fri, 26 Oct 2012 04:44:51 -0400 Received: by mail-we0-f174.google.com with SMTP id t9so1288402wey.19 for ; Fri, 26 Oct 2012 01:44:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:x-mailer:in-reply-to:references; bh=pUvFIHAZts7771zo9FfvB0HzARV4WD7HHn0PDaj2mF8=; b=GLw5ZAFdOROP4qL5u//P9mzZG3BaG8DfkKwl9L4aWH5UFa2gNFMKjNOV90rYs3q7t2 DE4+3eKakBOxJCW0ZpFkwl9sbQF6cjes12SrcGUY1mXXpJQwX238hT5U9P+woKeB69Pw UtPN4AW8sRVti+Md4VWlyughFv2vJjhAidMZvwYdtLMnq++qcoN/xXVmVBgGcMTYbhew g6krKjjVUAVjUhibIYbhe4S9xWolnnmUdjC6tfoDXulVTlGFwFXpV0yjV6Mo2sl50YT5 JZv7POLdRKXe1vAJepcltS/kZXFSV0Lw+bSP9uTGeqveUxif9dwD7FePyybQ8QhNX4hl mWPQ== Received: by 10.216.71.20 with SMTP id q20mr12537616wed.172.1351241090400; Fri, 26 Oct 2012 01:44:50 -0700 (PDT) Received: from miniplouf.lan (lan31-8-82-247-176-67.fbx.proxad.net. [82.247.176.67]) by mx.google.com with ESMTPS id dq6sm14151586wib.5.2012.10.26.01.44.49 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 26 Oct 2012 01:44:49 -0700 (PDT) From: Benjamin Tissoires To: "benjamin.tissoires" , Dmitry Torokhov , Henrik Rydberg , Jiri Kosina , Stephane Chatty , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 11/11] HID: hid-multitouch: get rid of usbhid depedency for general path Date: Fri, 26 Oct 2012 10:44:27 +0200 Message-Id: <1351241067-9521-12-git-send-email-benjamin.tissoires@gmail.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1351241067-9521-1-git-send-email-benjamin.tissoires@gmail.com> References: <1351241067-9521-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 This patch factorizes the hid set_feature command by using hid_device->hid_output_raw_report instead of direclty relying on usbhid. This makes the driver usb independant. However I still can't remove the 2 usb related headers because the function mt_resume has a specific patch for usb devices. Signed-off-by: Benjamin Tissoires --- drivers/hid/hid-multitouch.c | 63 ++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 21a120b..33038c5 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -670,47 +670,58 @@ static int mt_event(struct hid_device *hid, struct hid_field *field, return 1; } -static void mt_set_input_mode(struct hid_device *hdev) +static void mt_set_feature(struct hid_device *hdev, __s8 feature_id, + u8 value, size_t index) { - struct mt_device *td = hid_get_drvdata(hdev); struct hid_report *r; struct hid_report_enum *re; + u8 *data; + u8 max_value; + int len; + + if (feature_id < 0 || !hdev->hid_output_raw_report) + return; + + re = &hdev->report_enum[HID_FEATURE_REPORT]; + r = re->report_id_hash[feature_id]; + if (!r) + return; + + len = ((r->size - 1) >> 3) + 1 + (r->id > 0); + max_value = r->field[0]->logical_maximum; + value = min(value, max_value); - if (td->inputmode < 0) + if (r->field[0]->value[index] == value || len < 2 || index + 1 >= len) return; - re = &(hdev->report_enum[HID_FEATURE_REPORT]); - r = re->report_id_hash[td->inputmode]; - if (r) { - r->field[0]->value[td->inputmode_index] = 0x02; - usbhid_submit_report(hdev, r, USB_DIR_OUT); + data = kzalloc(len, GFP_ATOMIC); + if (!data) { + hid_warn(hdev, "output queueing failed\n"); + return; } + + data[0] = r->id; + data[index + 1] = value; + hdev->hid_output_raw_report(hdev, data, len, HID_FEATURE_REPORT); + kfree(data); } -static void mt_set_maxcontacts(struct hid_device *hdev) +static void mt_set_input_mode(struct hid_device *hdev) { struct mt_device *td = hid_get_drvdata(hdev); - struct hid_report *r; - struct hid_report_enum *re; - int fieldmax, max; - if (td->maxcontact_report_id < 0) - return; + mt_set_feature(hdev, td->inputmode, 0x02, td->inputmode_index); +} - if (!td->mtclass.maxcontacts) +static void mt_set_maxcontacts(struct hid_device *hdev) +{ + struct mt_device *td = hid_get_drvdata(hdev); + int max = td->mtclass.maxcontacts; + + if (!max) return; - re = &hdev->report_enum[HID_FEATURE_REPORT]; - r = re->report_id_hash[td->maxcontact_report_id]; - if (r) { - max = td->mtclass.maxcontacts; - fieldmax = r->field[0]->logical_maximum; - max = min(fieldmax, max); - if (r->field[0]->value[0] != max) { - r->field[0]->value[0] = max; - usbhid_submit_report(hdev, r, USB_DIR_OUT); - } - } + mt_set_feature(hdev, td->maxcontact_report_id, max, 0); } static void mt_post_parse_default_settings(struct mt_device *td)