* [PATCH v2 0/4] HID: ll transport cleanup: final round
@ 2014-03-05 21:18 Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 1/4] HID: cp2112: remove various hid_out_raw_report calls Benjamin Tissoires
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Benjamin Tissoires @ 2014-03-05 21:18 UTC (permalink / raw)
To: Benjamin Tissoires, Jiri Kosina, David Herrmann, David Barksdale,
Antonio Ospite, linux-input, linux-kernel
Alright, this is the re-spin of the last round of transport cleanup.
Some minor but important modifications are here, but nothing very enthousiastic.
Thanks for the reviews and the tests so far.
Cheers,
Benjamin
Benjamin Tissoires (4):
HID: cp2112: remove various hid_out_raw_report calls
HID: cp2112: remove the last hid_output_raw_report() call
HID: sony: do not rely on hid_output_raw_report
HID: remove hid_output_raw_report transport implementations
drivers/hid/hid-cp2112.c | 19 +++++++++-----
drivers/hid/hid-sony.c | 60 ++++++++++---------------------------------
drivers/hid/hidraw.c | 3 ++-
drivers/hid/i2c-hid/i2c-hid.c | 14 ----------
drivers/hid/uhid.c | 1 -
drivers/hid/usbhid/hid-core.c | 19 +++++---------
include/linux/hid.h | 21 ++-------------
net/bluetooth/hidp/core.c | 14 ----------
8 files changed, 36 insertions(+), 115 deletions(-)
--
1.8.5.3
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/4] HID: cp2112: remove various hid_out_raw_report calls
2014-03-05 21:18 [PATCH v2 0/4] HID: ll transport cleanup: final round Benjamin Tissoires
@ 2014-03-05 21:18 ` Benjamin Tissoires
2014-03-07 9:47 ` David Herrmann
2014-03-05 21:18 ` [PATCH v2 2/4] HID: cp2112: remove the last hid_output_raw_report() call Benjamin Tissoires
` (3 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Benjamin Tissoires @ 2014-03-05 21:18 UTC (permalink / raw)
To: Benjamin Tissoires, Jiri Kosina, David Herrmann, David Barksdale,
Antonio Ospite, linux-input, linux-kernel
hid_out_raw_report is going to be obsoleted as it is not part of the
unified HID low level transport documentation
(Documentation/hid/hid-transport.txt)
hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
is strictly equivalent to:
hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
So use the new api.
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
no changes since v1
drivers/hid/hid-cp2112.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
index 1025982..860db694 100644
--- a/drivers/hid/hid-cp2112.c
+++ b/drivers/hid/hid-cp2112.c
@@ -185,8 +185,8 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
buf[1] &= ~(1 << offset);
buf[2] = gpio_push_pull;
- ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf),
- HID_FEATURE_REPORT);
+ ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
+ HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
if (ret < 0) {
hid_err(hdev, "error setting GPIO config: %d\n", ret);
return ret;
@@ -207,8 +207,8 @@ static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
buf[1] = value ? 0xff : 0;
buf[2] = 1 << offset;
- ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf),
- HID_FEATURE_REPORT);
+ ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
+ HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
if (ret < 0)
hid_err(hdev, "error setting GPIO values: %d\n", ret);
}
@@ -253,8 +253,8 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
buf[1] |= 1 << offset;
buf[2] = gpio_push_pull;
- ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf),
- HID_FEATURE_REPORT);
+ ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
+ HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
if (ret < 0) {
hid_err(hdev, "error setting GPIO config: %d\n", ret);
return ret;
--
1.8.5.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/4] HID: cp2112: remove the last hid_output_raw_report() call
2014-03-05 21:18 [PATCH v2 0/4] HID: ll transport cleanup: final round Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 1/4] HID: cp2112: remove various hid_out_raw_report calls Benjamin Tissoires
@ 2014-03-05 21:18 ` Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 3/4] HID: sony: do not rely on hid_output_raw_report Benjamin Tissoires
` (2 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Benjamin Tissoires @ 2014-03-05 21:18 UTC (permalink / raw)
To: Benjamin Tissoires, Jiri Kosina, David Herrmann, David Barksdale,
Antonio Ospite, linux-input, linux-kernel
tests have shown that output reports use hid_hw_output_report().
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
changes since v1:
- removed FIXME
- actually use the proper calls and do not guess
drivers/hid/hid-cp2112.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
index 860db694..a4fff699 100644
--- a/drivers/hid/hid-cp2112.c
+++ b/drivers/hid/hid-cp2112.c
@@ -290,7 +290,12 @@ static int cp2112_hid_output(struct hid_device *hdev, u8 *data, size_t count,
if (!buf)
return -ENOMEM;
- ret = hdev->hid_output_raw_report(hdev, buf, count, report_type);
+ if (report_type == HID_OUTPUT_REPORT)
+ ret = hid_hw_output_report(hdev, buf, count);
+ else
+ ret = hid_hw_raw_request(hdev, buf[0], buf, count, report_type,
+ HID_REQ_SET_REPORT);
+
kfree(buf);
return ret;
}
--
1.8.5.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/4] HID: sony: do not rely on hid_output_raw_report
2014-03-05 21:18 [PATCH v2 0/4] HID: ll transport cleanup: final round Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 1/4] HID: cp2112: remove various hid_out_raw_report calls Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 2/4] HID: cp2112: remove the last hid_output_raw_report() call Benjamin Tissoires
@ 2014-03-05 21:18 ` Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 4/4] HID: remove hid_output_raw_report transport implementations Benjamin Tissoires
2014-03-07 9:52 ` [PATCH v2 0/4] HID: ll transport cleanup: final round David Herrmann
4 siblings, 0 replies; 9+ messages in thread
From: Benjamin Tissoires @ 2014-03-05 21:18 UTC (permalink / raw)
To: Benjamin Tissoires, Jiri Kosina, David Herrmann, David Barksdale,
Antonio Ospite, linux-input, linux-kernel
hid_out_raw_report is going to be obsoleted as it is not part of the
unified HID low level transport documentation
(Documentation/hid/hid-transport.txt)
To do so, we need to introduce two new quirks:
* HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP: this quirks prevents the
transport driver to use the interrupt channel to send output report
(and thus force to use HID_REQ_SET_REPORT command)
* HID_QUIRK_SKIP_OUTPUT_REPORT_ID: this one forces usbhid to not
include the report ID in the buffer it sends to the device through
HID_REQ_SET_REPORT in case of an output report
This also fixes a regression introduced in commit 3a75b24949a8
(HID: hidraw: replace hid_output_raw_report() calls by appropriates ones).
The hidraw API was not able to communicate with the PS3 SixAxis
controllers in USB mode.
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
changes since v1:
- removed usb.h include
- renamed HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP
- fix typo
drivers/hid/hid-sony.c | 60 ++++++++++---------------------------------
drivers/hid/hidraw.c | 3 ++-
drivers/hid/usbhid/hid-core.c | 7 ++++-
include/linux/hid.h | 2 ++
4 files changed, 24 insertions(+), 48 deletions(-)
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index b5fe65e..4884bb5 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -29,7 +29,6 @@
#include <linux/hid.h>
#include <linux/module.h>
#include <linux/slab.h>
-#include <linux/usb.h>
#include <linux/leds.h>
#include <linux/power_supply.h>
#include <linux/spinlock.h>
@@ -1007,45 +1006,6 @@ static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
}
/*
- * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
- * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
- * so we need to override that forcing HID Output Reports on the Control EP.
- *
- * There is also another issue about HID Output Reports via USB, the Sixaxis
- * does not want the report_id as part of the data packet, so we have to
- * discard buf[0] when sending the actual control message, even for numbered
- * reports, humpf!
- */
-static int sixaxis_usb_output_raw_report(struct hid_device *hid, __u8 *buf,
- size_t count, unsigned char report_type)
-{
- struct usb_interface *intf = to_usb_interface(hid->dev.parent);
- struct usb_device *dev = interface_to_usbdev(intf);
- struct usb_host_interface *interface = intf->cur_altsetting;
- int report_id = buf[0];
- int ret;
-
- if (report_type == HID_OUTPUT_REPORT) {
- /* Don't send the Report ID */
- buf++;
- count--;
- }
-
- ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
- HID_REQ_SET_REPORT,
- USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
- ((report_type + 1) << 8) | report_id,
- interface->desc.bInterfaceNumber, buf, count,
- USB_CTRL_SET_TIMEOUT);
-
- /* Count also the Report ID, in case of an Output report. */
- if (ret > 0 && report_type == HID_OUTPUT_REPORT)
- ret++;
-
- return ret;
-}
-
-/*
* Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
* to "operational". Without this, the ps3 controller will not report any
* events.
@@ -1305,11 +1265,8 @@ static void sixaxis_state_worker(struct work_struct *work)
buf[10] |= sc->led_state[2] << 3;
buf[10] |= sc->led_state[3] << 4;
- if (sc->quirks & SIXAXIS_CONTROLLER_USB)
- hid_output_raw_report(sc->hdev, buf, sizeof(buf), HID_OUTPUT_REPORT);
- else
- hid_hw_raw_request(sc->hdev, 0x01, buf, sizeof(buf),
- HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
+ hid_hw_raw_request(sc->hdev, 0x01, buf, sizeof(buf), HID_OUTPUT_REPORT,
+ HID_REQ_SET_REPORT);
}
static void dualshock4_state_worker(struct work_struct *work)
@@ -1659,7 +1616,18 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
}
if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
- hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
+ /*
+ * The Sony Sixaxis does not handle HID Output Reports on the
+ * Interrupt EP like it could, so we need to force HID Output
+ * Reports to use HID_REQ_SET_REPORT on the Control EP.
+ *
+ * There is also another issue about HID Output Reports via USB,
+ * the Sixaxis does not want the report_id as part of the data
+ * packet, so we have to discard buf[0] when sending the actual
+ * control message, even for numbered reports, humpf!
+ */
+ hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
+ hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
ret = sixaxis_set_operational_usb(hdev);
sc->worker_initialized = 1;
INIT_WORK(&sc->state_worker, sixaxis_state_worker);
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
index 2cc484c..ffa648c 100644
--- a/drivers/hid/hidraw.c
+++ b/drivers/hid/hidraw.c
@@ -149,7 +149,8 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer,
goto out_free;
}
- if (report_type == HID_OUTPUT_REPORT) {
+ if ((report_type == HID_OUTPUT_REPORT) &&
+ !(dev->quirks & HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP)) {
ret = hid_hw_output_report(dev, buf, count);
/*
* compatibility with old implementation of USB-HID and I2C-HID:
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 0d1d875..3bc7cad 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -894,7 +894,12 @@ static int usbhid_set_raw_report(struct hid_device *hid, unsigned int reportnum,
int ret, skipped_report_id = 0;
/* Byte 0 is the report number. Report data starts at byte 1.*/
- buf[0] = reportnum;
+ if ((rtype == HID_OUTPUT_REPORT) &&
+ (hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORT_ID))
+ buf[0] = 0;
+ else
+ buf[0] = reportnum;
+
if (buf[0] == 0x0) {
/* Don't send the Report ID */
buf++;
diff --git a/include/linux/hid.h b/include/linux/hid.h
index e224516..2cd7174 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -290,6 +290,8 @@ struct hid_item {
#define HID_QUIRK_NO_EMPTY_INPUT 0x00000100
#define HID_QUIRK_NO_INIT_INPUT_REPORTS 0x00000200
#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000
+#define HID_QUIRK_SKIP_OUTPUT_REPORT_ID 0x00020000
+#define HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP 0x00040000
#define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000
#define HID_QUIRK_NO_INIT_REPORTS 0x20000000
#define HID_QUIRK_NO_IGNORE 0x40000000
--
1.8.5.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 4/4] HID: remove hid_output_raw_report transport implementations
2014-03-05 21:18 [PATCH v2 0/4] HID: ll transport cleanup: final round Benjamin Tissoires
` (2 preceding siblings ...)
2014-03-05 21:18 ` [PATCH v2 3/4] HID: sony: do not rely on hid_output_raw_report Benjamin Tissoires
@ 2014-03-05 21:18 ` Benjamin Tissoires
2014-03-07 9:52 ` [PATCH v2 0/4] HID: ll transport cleanup: final round David Herrmann
4 siblings, 0 replies; 9+ messages in thread
From: Benjamin Tissoires @ 2014-03-05 21:18 UTC (permalink / raw)
To: Benjamin Tissoires, Jiri Kosina, David Herrmann, David Barksdale,
Antonio Ospite, linux-input, linux-kernel
Nobody calls hid_output_raw_report anymore, and nobody should.
We can now remove the various implementation in the different
transport drivers and the declarations.
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
no changes since v1 (what did you expected?)
drivers/hid/i2c-hid/i2c-hid.c | 14 --------------
drivers/hid/uhid.c | 1 -
drivers/hid/usbhid/hid-core.c | 12 ------------
include/linux/hid.h | 19 -------------------
net/bluetooth/hidp/core.c | 14 --------------
5 files changed, 60 deletions(-)
diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
index cbd44a7..8c52a07 100644
--- a/drivers/hid/i2c-hid/i2c-hid.c
+++ b/drivers/hid/i2c-hid/i2c-hid.c
@@ -596,19 +596,6 @@ static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
return ret;
}
-static int __i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
- size_t count, unsigned char report_type)
-{
- struct i2c_client *client = hid->driver_data;
- struct i2c_hid *ihid = i2c_get_clientdata(client);
- bool data = true; /* SET_REPORT */
-
- if (report_type == HID_OUTPUT_REPORT)
- data = le16_to_cpu(ihid->hdesc.wMaxOutputLength) == 0;
-
- return i2c_hid_output_raw_report(hid, buf, count, report_type, data);
-}
-
static int i2c_hid_output_report(struct hid_device *hid, __u8 *buf,
size_t count)
{
@@ -1037,7 +1024,6 @@ static int i2c_hid_probe(struct i2c_client *client,
hid->driver_data = client;
hid->ll_driver = &i2c_hid_ll_driver;
- hid->hid_output_raw_report = __i2c_hid_output_raw_report;
hid->dev.parent = &client->dev;
ACPI_COMPANION_SET(&hid->dev, ACPI_COMPANION(&client->dev));
hid->bus = BUS_I2C;
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
index 60acee4..7ed79be 100644
--- a/drivers/hid/uhid.c
+++ b/drivers/hid/uhid.c
@@ -400,7 +400,6 @@ static int uhid_dev_create(struct uhid_device *uhid,
hid->uniq[63] = 0;
hid->ll_driver = &uhid_hid_driver;
- hid->hid_output_raw_report = uhid_hid_output_raw;
hid->bus = ev->u.create.bus;
hid->vendor = ev->u.create.vendor;
hid->product = ev->u.create.product;
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 3bc7cad..7b88f4c 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -950,17 +950,6 @@ static int usbhid_output_report(struct hid_device *hid, __u8 *buf, size_t count)
return ret;
}
-static int usbhid_output_raw_report(struct hid_device *hid, __u8 *buf,
- size_t count, unsigned char report_type)
-{
- struct usbhid_device *usbhid = hid->driver_data;
-
- if (usbhid->urbout && report_type != HID_FEATURE_REPORT)
- return usbhid_output_report(hid, buf, count);
-
- return usbhid_set_raw_report(hid, buf[0], buf, count, report_type);
-}
-
static void usbhid_restart_queues(struct usbhid_device *usbhid)
{
if (usbhid->urbout && !test_bit(HID_OUT_RUNNING, &usbhid->iofl))
@@ -1294,7 +1283,6 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *
usb_set_intfdata(intf, hid);
hid->ll_driver = &usb_hid_driver;
- hid->hid_output_raw_report = usbhid_output_raw_report;
hid->ff_init = hid_pidff_init;
#ifdef CONFIG_USB_HIDDEV
hid->hiddev_connect = hiddev_connect;
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 2cd7174..720e3a1 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -513,9 +513,6 @@ struct hid_device { /* device report descriptor */
struct hid_usage *, __s32);
void (*hiddev_report_event) (struct hid_device *, struct hid_report *);
- /* handler for raw output data, used by hidraw */
- int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t, unsigned char);
-
/* debugging support via debugfs */
unsigned short debug;
struct dentry *debug_dir;
@@ -1023,22 +1020,6 @@ static inline int hid_hw_output_report(struct hid_device *hdev, __u8 *buf,
}
/**
- * hid_output_raw_report - send an output or a feature report to the device
- *
- * @hdev: hid device
- * @buf: raw data to transfer
- * @len: length of buf
- * @report_type: HID_FEATURE_REPORT or HID_OUTPUT_REPORT
- *
- * @return: count of data transfered, negative if error
- */
-static inline int hid_output_raw_report(struct hid_device *hdev, __u8 *buf,
- size_t len, unsigned char report_type)
-{
- return hdev->hid_output_raw_report(hdev, buf, len, report_type);
-}
-
-/**
* hid_hw_idle - send idle request to device
*
* @hdev: hid device
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
index 98e4840..514ddb5 100644
--- a/net/bluetooth/hidp/core.c
+++ b/net/bluetooth/hidp/core.c
@@ -382,18 +382,6 @@ static int hidp_output_report(struct hid_device *hid, __u8 *data, size_t count)
data, count);
}
-static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data,
- size_t count, unsigned char report_type)
-{
- if (report_type == HID_OUTPUT_REPORT) {
- return hidp_output_report(hid, data, count);
- } else if (report_type != HID_FEATURE_REPORT) {
- return -EINVAL;
- }
-
- return hidp_set_raw_report(hid, data[0], data, count, report_type);
-}
-
static int hidp_raw_request(struct hid_device *hid, unsigned char reportnum,
__u8 *buf, size_t len, unsigned char rtype,
int reqtype)
@@ -776,8 +764,6 @@ static int hidp_setup_hid(struct hidp_session *session,
hid->dev.parent = &session->conn->hcon->dev;
hid->ll_driver = &hidp_hid_driver;
- hid->hid_output_raw_report = hidp_output_raw_report;
-
/* True if device is blacklisted in drivers/hid/hid-core.c */
if (hid_ignore(hid)) {
hid_destroy_device(session->hid);
--
1.8.5.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/4] HID: cp2112: remove various hid_out_raw_report calls
2014-03-05 21:18 ` [PATCH v2 1/4] HID: cp2112: remove various hid_out_raw_report calls Benjamin Tissoires
@ 2014-03-07 9:47 ` David Herrmann
2014-03-09 3:23 ` Benjamin Tissoires
0 siblings, 1 reply; 9+ messages in thread
From: David Herrmann @ 2014-03-07 9:47 UTC (permalink / raw)
To: Benjamin Tissoires
Cc: Benjamin Tissoires, Jiri Kosina, David Barksdale, Antonio Ospite,
open list:HID CORE LAYER, linux-kernel
Hi
On Wed, Mar 5, 2014 at 10:18 PM, Benjamin Tissoires
<benjamin.tissoires@redhat.com> wrote:
> hid_out_raw_report is going to be obsoleted as it is not part of the
> unified HID low level transport documentation
> (Documentation/hid/hid-transport.txt)
>
> hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
> is strictly equivalent to:
> hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
> HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
This time you might be right that feature-reports always put the
report-id into the first byte, but I'd still prefer if we avoid using
this. Besides, the code is much nicer imho if we pass the ID directly,
see below..
>
> So use the new api.
>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> ---
>
> no changes since v1
>
> drivers/hid/hid-cp2112.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
> index 1025982..860db694 100644
> --- a/drivers/hid/hid-cp2112.c
> +++ b/drivers/hid/hid-cp2112.c
> @@ -185,8 +185,8 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
> buf[1] &= ~(1 << offset);
> buf[2] = gpio_push_pull;
>
> - ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf),
> - HID_FEATURE_REPORT);
> + ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
> + HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
buf[0] => CP2112_GPIO_CONFIG
> if (ret < 0) {
> hid_err(hdev, "error setting GPIO config: %d\n", ret);
> return ret;
> @@ -207,8 +207,8 @@ static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
> buf[1] = value ? 0xff : 0;
> buf[2] = 1 << offset;
>
> - ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf),
> - HID_FEATURE_REPORT);
> + ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
> + HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
Here buf[0] seems fine as it is set explicitly just 3 lines above to
CP2112_GPIO_SET.
> if (ret < 0)
> hid_err(hdev, "error setting GPIO values: %d\n", ret);
> }
> @@ -253,8 +253,8 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
> buf[1] |= 1 << offset;
> buf[2] = gpio_push_pull;
>
> - ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf),
> - HID_FEATURE_REPORT);
> + ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
> + HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
Here an explicit CP2112_GPIO_CONFIG seems nicer, imho.
Thanks
David
> if (ret < 0) {
> hid_err(hdev, "error setting GPIO config: %d\n", ret);
> return ret;
> --
> 1.8.5.3
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/4] HID: ll transport cleanup: final round
2014-03-05 21:18 [PATCH v2 0/4] HID: ll transport cleanup: final round Benjamin Tissoires
` (3 preceding siblings ...)
2014-03-05 21:18 ` [PATCH v2 4/4] HID: remove hid_output_raw_report transport implementations Benjamin Tissoires
@ 2014-03-07 9:52 ` David Herrmann
2014-03-09 3:40 ` Benjamin Tissoires
4 siblings, 1 reply; 9+ messages in thread
From: David Herrmann @ 2014-03-07 9:52 UTC (permalink / raw)
To: Benjamin Tissoires
Cc: Benjamin Tissoires, Jiri Kosina, David Barksdale, Antonio Ospite,
open list:HID CORE LAYER, linux-kernel
Hi
On Wed, Mar 5, 2014 at 10:18 PM, Benjamin Tissoires
<benjamin.tissoires@redhat.com> wrote:
> Alright, this is the re-spin of the last round of transport cleanup.
>
> Some minor but important modifications are here, but nothing very enthousiastic.
>
> Thanks for the reviews and the tests so far.
Apart from some minor comments on #1 and #2, this is:
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
Thanks
David
> Cheers,
> Benjamin
>
> Benjamin Tissoires (4):
> HID: cp2112: remove various hid_out_raw_report calls
> HID: cp2112: remove the last hid_output_raw_report() call
> HID: sony: do not rely on hid_output_raw_report
> HID: remove hid_output_raw_report transport implementations
>
> drivers/hid/hid-cp2112.c | 19 +++++++++-----
> drivers/hid/hid-sony.c | 60 ++++++++++---------------------------------
> drivers/hid/hidraw.c | 3 ++-
> drivers/hid/i2c-hid/i2c-hid.c | 14 ----------
> drivers/hid/uhid.c | 1 -
> drivers/hid/usbhid/hid-core.c | 19 +++++---------
> include/linux/hid.h | 21 ++-------------
> net/bluetooth/hidp/core.c | 14 ----------
> 8 files changed, 36 insertions(+), 115 deletions(-)
>
> --
> 1.8.5.3
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/4] HID: cp2112: remove various hid_out_raw_report calls
2014-03-07 9:47 ` David Herrmann
@ 2014-03-09 3:23 ` Benjamin Tissoires
0 siblings, 0 replies; 9+ messages in thread
From: Benjamin Tissoires @ 2014-03-09 3:23 UTC (permalink / raw)
To: David Herrmann
Cc: Benjamin Tissoires, Jiri Kosina, David Barksdale, Antonio Ospite,
open list:HID CORE LAYER, linux-kernel
On Fri, Mar 7, 2014 at 4:47 AM, David Herrmann <dh.herrmann@gmail.com> wrote:
> Hi
>
> On Wed, Mar 5, 2014 at 10:18 PM, Benjamin Tissoires
> <benjamin.tissoires@redhat.com> wrote:
>> hid_out_raw_report is going to be obsoleted as it is not part of the
>> unified HID low level transport documentation
>> (Documentation/hid/hid-transport.txt)
>>
>> hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
>> is strictly equivalent to:
>> hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
>> HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
>
> This time you might be right that feature-reports always put the
> report-id into the first byte, but I'd still prefer if we avoid using
> this. Besides, the code is much nicer imho if we pass the ID directly,
> see below..
Yes you are completely right.
Will send a v3 ASAP.
Cheers,
Benjamin
>
>>
>> So use the new api.
>>
>> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>> ---
>>
>> no changes since v1
>>
>> drivers/hid/hid-cp2112.c | 12 ++++++------
>> 1 file changed, 6 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
>> index 1025982..860db694 100644
>> --- a/drivers/hid/hid-cp2112.c
>> +++ b/drivers/hid/hid-cp2112.c
>> @@ -185,8 +185,8 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
>> buf[1] &= ~(1 << offset);
>> buf[2] = gpio_push_pull;
>>
>> - ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf),
>> - HID_FEATURE_REPORT);
>> + ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
>> + HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
>
> buf[0] => CP2112_GPIO_CONFIG
>
>> if (ret < 0) {
>> hid_err(hdev, "error setting GPIO config: %d\n", ret);
>> return ret;
>> @@ -207,8 +207,8 @@ static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
>> buf[1] = value ? 0xff : 0;
>> buf[2] = 1 << offset;
>>
>> - ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf),
>> - HID_FEATURE_REPORT);
>> + ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
>> + HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
>
> Here buf[0] seems fine as it is set explicitly just 3 lines above to
> CP2112_GPIO_SET.
>
>> if (ret < 0)
>> hid_err(hdev, "error setting GPIO values: %d\n", ret);
>> }
>> @@ -253,8 +253,8 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
>> buf[1] |= 1 << offset;
>> buf[2] = gpio_push_pull;
>>
>> - ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf),
>> - HID_FEATURE_REPORT);
>> + ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
>> + HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
>
> Here an explicit CP2112_GPIO_CONFIG seems nicer, imho.
>
> Thanks
> David
>
>> if (ret < 0) {
>> hid_err(hdev, "error setting GPIO config: %d\n", ret);
>> return ret;
>> --
>> 1.8.5.3
>>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/4] HID: ll transport cleanup: final round
2014-03-07 9:52 ` [PATCH v2 0/4] HID: ll transport cleanup: final round David Herrmann
@ 2014-03-09 3:40 ` Benjamin Tissoires
0 siblings, 0 replies; 9+ messages in thread
From: Benjamin Tissoires @ 2014-03-09 3:40 UTC (permalink / raw)
To: David Herrmann
Cc: Benjamin Tissoires, Jiri Kosina, David Barksdale, Antonio Ospite,
open list:HID CORE LAYER, linux-kernel
On Fri, Mar 7, 2014 at 4:52 AM, David Herrmann <dh.herrmann@gmail.com> wrote:
> Hi
>
> On Wed, Mar 5, 2014 at 10:18 PM, Benjamin Tissoires
> <benjamin.tissoires@redhat.com> wrote:
>> Alright, this is the re-spin of the last round of transport cleanup.
>>
>> Some minor but important modifications are here, but nothing very enthousiastic.
>>
>> Thanks for the reviews and the tests so far.
>
> Apart from some minor comments on #1 and #2, this is:
Hmm, neither my mailboxes nor patchwork gives me your comments on #2...
By looking at the code, (assuming you mean the same comment that you
made on #1), this is not so obvious.
What we can do is add an arg to cp2112_hid_output() with the report
number (and pass it to hid_hw_raw_request() ). However, this function
is also used by cp2112_xfer(), and there is chances that I introduce a
bug if I am not careful enough.
I'd rather split cp2112_hid_output() in two, one for output reports,
and one for features (with the reportID as an arg). I'll send this one
after this series because I would like to do some more tests.
>
> Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
>
Thanks a lot!
Cheers,
Benjamin
> Thanks
> David
>
>> Cheers,
>> Benjamin
>>
>> Benjamin Tissoires (4):
>> HID: cp2112: remove various hid_out_raw_report calls
>> HID: cp2112: remove the last hid_output_raw_report() call
>> HID: sony: do not rely on hid_output_raw_report
>> HID: remove hid_output_raw_report transport implementations
>>
>> drivers/hid/hid-cp2112.c | 19 +++++++++-----
>> drivers/hid/hid-sony.c | 60 ++++++++++---------------------------------
>> drivers/hid/hidraw.c | 3 ++-
>> drivers/hid/i2c-hid/i2c-hid.c | 14 ----------
>> drivers/hid/uhid.c | 1 -
>> drivers/hid/usbhid/hid-core.c | 19 +++++---------
>> include/linux/hid.h | 21 ++-------------
>> net/bluetooth/hidp/core.c | 14 ----------
>> 8 files changed, 36 insertions(+), 115 deletions(-)
>>
>> --
>> 1.8.5.3
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2014-03-09 3:40 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-05 21:18 [PATCH v2 0/4] HID: ll transport cleanup: final round Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 1/4] HID: cp2112: remove various hid_out_raw_report calls Benjamin Tissoires
2014-03-07 9:47 ` David Herrmann
2014-03-09 3:23 ` Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 2/4] HID: cp2112: remove the last hid_output_raw_report() call Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 3/4] HID: sony: do not rely on hid_output_raw_report Benjamin Tissoires
2014-03-05 21:18 ` [PATCH v2 4/4] HID: remove hid_output_raw_report transport implementations Benjamin Tissoires
2014-03-07 9:52 ` [PATCH v2 0/4] HID: ll transport cleanup: final round David Herrmann
2014-03-09 3:40 ` Benjamin Tissoires
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).