lkml.org 
[lkml]   [2022]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH] hid: Support for Litra Glow
    From
    Date
    On Fri, 2022-12-16 at 10:53 +0100, Bastien Nocera wrote:
    > On Thu, 2022-12-15 at 22:09 +0100, Andreas Bergmeier wrote:
    > > Tries to implement as general support for Illumination Light as
    > > possible. Note that it is singular, which means by Logitech spec we
    > > are
    > > fine off with just handling one capability/device.
    >
    > Your email client absolutely trashed the patch's indentation, it's
    > unreadable as-is.
    >
    > > Implementation currently only exposes Brightness and On/Off
    > > controls.
    > > Does currently not expose Color Temperature because LEDs does not
    > > support it.
    > >
    > > Introduces HIDPP_QUIRK_CLASS_SIMPLE_START to prevent reconnect on
    > > startup. Could not get Glow to work with that.
    >
    > I'd really rather we didn't introduce a new quirk, but instead fixed
    > the fact that we need to restart the HID transport to support 3 (!)
    > devices.
    >
    > Would something like the attached patch work? I haven't tested it
    > yet,
    > but if it works for you, I'll test it on the devices I have here.

    A tested version attached. I'll need to test it against a T650 before
    sending it for review.
    From beae2de086546f6a3187a31f2f406b1e3fe21f5e Mon Sep 17 00:00:00 2001
    From: Bastien Nocera <hadess@hadess.net>
    Date: Fri, 16 Dec 2022 10:41:16 +0100
    Subject: [PATCH] HID: logitech-hidpp: Don't restart communication if not
    necessary

    Don't stop and restart communication with the device unless we need to
    modify the connect flags used because of a device quirk.
    ---
    drivers/hid/hid-logitech-hidpp.c | 31 +++++++++++++++++++------------
    1 file changed, 19 insertions(+), 12 deletions(-)

    diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
    index 7f9187201913..b4e4a8c79c75 100644
    --- a/drivers/hid/hid-logitech-hidpp.c
    +++ b/drivers/hid/hid-logitech-hidpp.c
    @@ -4310,6 +4310,7 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
    bool connected;
    unsigned int connect_mask = HID_CONNECT_DEFAULT;
    struct hidpp_ff_private_data data;
    + bool will_restart = false;

    /* report_fixup needs drvdata to be set before we call hid_parse */
    hidpp = devm_kzalloc(&hdev->dev, sizeof(*hidpp), GFP_KERNEL);
    @@ -4360,6 +4361,9 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
    return ret;
    }

    + if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT)
    + will_restart = true;
    +
    INIT_WORK(&hidpp->work, delayed_work_cb);
    mutex_init(&hidpp->send_mutex);
    init_waitqueue_head(&hidpp->wait);
    @@ -4374,7 +4378,7 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
    * Plain USB connections need to actually call start and open
    * on the transport driver to allow incoming data.
    */
    - ret = hid_hw_start(hdev, 0);
    + ret = hid_hw_start(hdev, will_restart ? 0 : connect_mask);
    if (ret) {
    hid_err(hdev, "hw start failed\n");
    goto hid_hw_start_fail;
    @@ -4411,6 +4415,7 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
    hidpp->wireless_feature_index = 0;
    else if (ret)
    goto hid_hw_init_fail;
    + ret = 0;
    }

    if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) {
    @@ -4425,19 +4430,21 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)

    hidpp_connect_event(hidpp);

    - /* Reset the HID node state */
    - hid_device_io_stop(hdev);
    - hid_hw_close(hdev);
    - hid_hw_stop(hdev);
    + if (will_restart) {
    + /* Reset the HID node state */
    + hid_device_io_stop(hdev);
    + hid_hw_close(hdev);
    + hid_hw_stop(hdev);

    - if (hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT)
    - connect_mask &= ~HID_CONNECT_HIDINPUT;
    + if (hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT)
    + connect_mask &= ~HID_CONNECT_HIDINPUT;

    - /* Now export the actual inputs and hidraw nodes to the world */
    - ret = hid_hw_start(hdev, connect_mask);
    - if (ret) {
    - hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
    - goto hid_hw_start_fail;
    + /* Now export the actual inputs and hidraw nodes to the world */
    + ret = hid_hw_start(hdev, connect_mask);
    + if (ret) {
    + hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
    + goto hid_hw_start_fail;
    + }
    }

    if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
    --
    2.38.1
    \
     
     \ /
      Last update: 2022-12-16 15:28    [W:4.196 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site