All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Herrmann <dh.herrmann@gmail.com>
To: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Cc: Benjamin Tissoires <benjamin.tissoires@gmail.com>,
	Jiri Kosina <jkosina@suse.cz>,
	Frank Praznik <frank.praznik@oh.rr.com>,
	"open list:HID CORE LAYER" <linux-input@vger.kernel.org>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 02/11] HID: i2c-hid: implement ll_driver transport-layer callbacks
Date: Mon, 3 Feb 2014 17:04:19 +0100	[thread overview]
Message-ID: <CANq1E4S0WjuqW3coJDKqH9Gm5JWwb_W_CEU8Ety15m0CjhOqZQ@mail.gmail.com> (raw)
In-Reply-To: <1391316630-29541-3-git-send-email-benjamin.tissoires@redhat.com>

Hi

On Sun, Feb 2, 2014 at 5:50 AM, Benjamin Tissoires
<benjamin.tissoires@redhat.com> wrote:
> Add output_report and raw_request to i2c-hid.
> Hopefully, we will manage to have the same transport level between
> all the transport drivers.
>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> ---
>  drivers/hid/i2c-hid/i2c-hid.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
>
> diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
> index ce68a12..5099f1f 100644
> --- a/drivers/hid/i2c-hid/i2c-hid.c
> +++ b/drivers/hid/i2c-hid/i2c-hid.c
> @@ -574,6 +574,28 @@ static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
>         return ret;
>  }
>
> +static int i2c_hid_output_report(struct hid_device *hid, __u8 *buf,
> +               size_t count)
> +{
> +       return i2c_hid_output_raw_report(hid, buf, count, HID_OUTPUT_REPORT);
> +}
> +
> +static int i2c_hid_raw_request(struct hid_device *hid, unsigned char reportnum,
> +                              __u8 *buf, size_t len, unsigned char rtype,
> +                              int reqtype)
> +{
> +       switch (reqtype) {
> +       case HID_REQ_GET_REPORT:
> +               return i2c_hid_get_raw_report(hid, reportnum, buf, len, rtype);
> +       case HID_REQ_SET_REPORT:
> +               if (buf[0] != reportnum)
> +                       return -EINVAL;
> +               return i2c_hid_output_raw_report(hid, buf, len, rtype);

I just skimmed the I2C-HID specs and it defines three methods for
input/output reports:

1) Section 6.2:
raw async output-reports can be sent by writing the data at any time
to wOutputRegister.
This should be used as method for hid->output_report().

2) Section 7.1:
SET_REPORT can be issued by writing the right OPCODE + report-ID into
wCommandRegister and the data into wDataRegister.
This should be used as method for hid->raw_request() + HID_REQ_SET_REPORT.

3) Section 7.1:
GET_REPORT can be issued by writing the right OPCODE + report-ID into
wCommandRegister and then waiting for the device to write the data
into wDataRegister.
This should be used for hid->raw_request() + HID_REQ_GET_REPORT


The GET_REPORT implementation looks fine to me, but the
i2c_hid_set_report() seems to support both 1) and 2) depending on the
passed type and capabilities:
 - it uses 2) for FEATURE_REPORT reports or if the max OUTPUT_LENGTH is 0
 - it uses 1) otherwise

I'm not sure whether the i2c-hid-spec mandates this behavior, so I am
not saying it's wrong. I just wanna understand what we do here. So if
we use hid->output_report() with HID_FEATURE_REPORT, the current code
turns this into a SET_REPORT. Likewise, an hid->raw_request() with
HID_REQ_SET_REPORT but with HID_OUTPUT_REPORT turns into an
output-report.

I'd rather expect this behavior:

hid->output_report() should always do this:
  args[index++] = outputRegister & 0xFF;
  args[index++] = outputRegister >> 8;
  hidcmd = &hid_no_cmd;

while hid->raw_request() should always do this:
  args[index++] = dataRegister & 0xFF;
  args[index++] = dataRegister >> 8;

The special case for maxOutputLength==0 seems fine to me, but the
"reportType == 0x03" looks weird.


Thanks
David

> +       default:
> +               return -EIO;
> +       }
> +}
> +
>  static void i2c_hid_request(struct hid_device *hid, struct hid_report *rep,
>                 int reqtype)
>  {
> @@ -761,6 +783,8 @@ static struct hid_ll_driver i2c_hid_ll_driver = {
>         .close = i2c_hid_close,
>         .power = i2c_hid_power,
>         .request = i2c_hid_request,
> +       .output_report = i2c_hid_output_report,
> +       .raw_request = i2c_hid_raw_request,
>  };
>
>  static int i2c_hid_init_irq(struct i2c_client *client)
> --
> 1.8.3.1
>

  reply	other threads:[~2014-02-03 16:04 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-02  4:50 [PATCH 00/11] HID: spring cleaning Benjamin Tissoires
2014-02-02  4:50 ` [PATCH 01/11] HID: uHID: implement .raw_request Benjamin Tissoires
2014-02-03 15:26   ` David Herrmann
2014-02-03 19:07     ` Benjamin Tissoires
2014-02-02  4:50 ` [PATCH 02/11] HID: i2c-hid: implement ll_driver transport-layer callbacks Benjamin Tissoires
2014-02-03 16:04   ` David Herrmann [this message]
2014-02-03 19:00     ` Benjamin Tissoires
2014-02-02  4:50 ` [PATCH 03/11] HID: add inliners for " Benjamin Tissoires
2014-02-03 15:29   ` David Herrmann
2014-02-02  4:50 ` [PATCH 04/11] HID: logitech-dj: remove hidinput_input_event Benjamin Tissoires
2014-02-03 16:06   ` David Herrmann
2014-02-03 16:21     ` Benjamin Tissoires
2014-02-03 17:07       ` David Herrmann
2014-02-02  4:50 ` [PATCH 05/11] HID: HIDp: remove hidp_hidinput_event Benjamin Tissoires
2014-02-03 15:10   ` David Herrmann
2014-02-03 15:28     ` Benjamin Tissoires
2014-02-02  4:50 ` [PATCH 06/11] HID: remove hidinput_input_event handler Benjamin Tissoires
2014-02-03 16:10   ` David Herrmann
2014-02-02  4:50 ` [PATCH 07/11] HID: HIDp: remove duplicated coded Benjamin Tissoires
2014-02-03 15:02   ` David Herrmann
2014-02-03 15:11     ` Benjamin Tissoires
2014-02-03 15:19       ` David Herrmann
2014-02-02  4:50 ` [PATCH 08/11] HID: usbhid: remove duplicated code Benjamin Tissoires
2014-02-03 16:09   ` David Herrmann
2014-02-02  4:50 ` [PATCH 09/11] HID: remove hid_get_raw_report in struct hid_device Benjamin Tissoires
2014-02-03 16:12   ` David Herrmann
2014-02-02  4:50 ` [PATCH 10/11] HID: introduce helper to access hid_output_raw_report() Benjamin Tissoires
2014-02-03 16:14   ` David Herrmann
2014-02-02  4:50 ` [PATCH 11/11] HID: move hid_output_raw_report to hid_ll_driver Benjamin Tissoires
2014-02-03 16:48 ` [PATCH 00/11] HID: spring cleaning David Herrmann
2014-02-03 19:19   ` Benjamin Tissoires

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CANq1E4S0WjuqW3coJDKqH9Gm5JWwb_W_CEU8Ety15m0CjhOqZQ@mail.gmail.com \
    --to=dh.herrmann@gmail.com \
    --cc=benjamin.tissoires@gmail.com \
    --cc=benjamin.tissoires@redhat.com \
    --cc=frank.praznik@oh.rr.com \
    --cc=jkosina@suse.cz \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.