Message ID | 20221127004617.722553-1-alex.hung@amd.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | platform/x86: wireless-hotkey: use ACPI HID as phys | expand |
Hi, On 11/27/22 01:46, Alex Hung wrote: > From: Alex Hung <alexhung@gmail.com> > > Removed the hardcoded "hpq6001" as phys but uses ACPI HID instead. > > Signed-off-by: Alex Hung <alexhung@gmail.com> Thank you for your patch, I've applied this patch to my review-hans branch: https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans Note it will show up in my review-hans branch once I've pushed my local branch there, which might take a while. Once I've run some tests on this branch the patches there will be added to the platform-drivers-x86/for-next branch and eventually will be included in the pdx86 pull-request to Linus for the next merge-window. Regards, Hans > --- > drivers/platform/x86/wireless-hotkey.c | 60 +++++++++++++++++--------- > 1 file changed, 40 insertions(+), 20 deletions(-) > > diff --git a/drivers/platform/x86/wireless-hotkey.c b/drivers/platform/x86/wireless-hotkey.c > index 11c60a273446..eb48ca060bad 100644 > --- a/drivers/platform/x86/wireless-hotkey.c > +++ b/drivers/platform/x86/wireless-hotkey.c > @@ -20,7 +20,10 @@ MODULE_ALIAS("acpi*:HPQ6001:*"); > MODULE_ALIAS("acpi*:WSTADEF:*"); > MODULE_ALIAS("acpi*:AMDI0051:*"); > > -static struct input_dev *wl_input_dev; > +struct wl_button { > + struct input_dev *input_dev; > + char phys[32]; > +}; > > static const struct acpi_device_id wl_ids[] = { > {"HPQ6001", 0}, > @@ -29,63 +32,80 @@ static const struct acpi_device_id wl_ids[] = { > {"", 0}, > }; > > -static int wireless_input_setup(void) > +static int wireless_input_setup(struct acpi_device *device) > { > + struct wl_button *button = acpi_driver_data(device); > int err; > > - wl_input_dev = input_allocate_device(); > - if (!wl_input_dev) > + button->input_dev = input_allocate_device(); > + if (!button->input_dev) > return -ENOMEM; > > - wl_input_dev->name = "Wireless hotkeys"; > - wl_input_dev->phys = "hpq6001/input0"; > - wl_input_dev->id.bustype = BUS_HOST; > - wl_input_dev->evbit[0] = BIT(EV_KEY); > - set_bit(KEY_RFKILL, wl_input_dev->keybit); > + snprintf(button->phys, sizeof(button->phys), "%s/input0", acpi_device_hid(device)); > + > + button->input_dev->name = "Wireless hotkeys"; > + button->input_dev->phys = button->phys; > + button->input_dev->id.bustype = BUS_HOST; > + button->input_dev->evbit[0] = BIT(EV_KEY); > + set_bit(KEY_RFKILL, button->input_dev->keybit); > > - err = input_register_device(wl_input_dev); > + err = input_register_device(button->input_dev); > if (err) > goto err_free_dev; > > return 0; > > err_free_dev: > - input_free_device(wl_input_dev); > + input_free_device(button->input_dev); > return err; > } > > -static void wireless_input_destroy(void) > +static void wireless_input_destroy(struct acpi_device *device) > { > - input_unregister_device(wl_input_dev); > + struct wl_button *button = acpi_driver_data(device); > + > + input_unregister_device(button->input_dev); > + kfree(button); > } > > static void wl_notify(struct acpi_device *acpi_dev, u32 event) > { > + struct wl_button *button = acpi_driver_data(acpi_dev); > + > if (event != 0x80) { > pr_info("Received unknown event (0x%x)\n", event); > return; > } > > - input_report_key(wl_input_dev, KEY_RFKILL, 1); > - input_sync(wl_input_dev); > - input_report_key(wl_input_dev, KEY_RFKILL, 0); > - input_sync(wl_input_dev); > + input_report_key(button->input_dev, KEY_RFKILL, 1); > + input_sync(button->input_dev); > + input_report_key(button->input_dev, KEY_RFKILL, 0); > + input_sync(button->input_dev); > } > > static int wl_add(struct acpi_device *device) > { > + struct wl_button *button; > int err; > > - err = wireless_input_setup(); > - if (err) > + button = kzalloc(sizeof(struct wl_button), GFP_KERNEL); > + if (!button) > + return -ENOMEM; > + > + device->driver_data = button; > + > + err = wireless_input_setup(device); > + if (err) { > pr_err("Failed to setup wireless hotkeys\n"); > + kfree(button); > + } > > return err; > } > > static int wl_remove(struct acpi_device *device) > { > - wireless_input_destroy(); > + wireless_input_destroy(device); > return 0; > } >
diff --git a/drivers/platform/x86/wireless-hotkey.c b/drivers/platform/x86/wireless-hotkey.c index 11c60a273446..eb48ca060bad 100644 --- a/drivers/platform/x86/wireless-hotkey.c +++ b/drivers/platform/x86/wireless-hotkey.c @@ -20,7 +20,10 @@ MODULE_ALIAS("acpi*:HPQ6001:*"); MODULE_ALIAS("acpi*:WSTADEF:*"); MODULE_ALIAS("acpi*:AMDI0051:*"); -static struct input_dev *wl_input_dev; +struct wl_button { + struct input_dev *input_dev; + char phys[32]; +}; static const struct acpi_device_id wl_ids[] = { {"HPQ6001", 0}, @@ -29,63 +32,80 @@ static const struct acpi_device_id wl_ids[] = { {"", 0}, }; -static int wireless_input_setup(void) +static int wireless_input_setup(struct acpi_device *device) { + struct wl_button *button = acpi_driver_data(device); int err; - wl_input_dev = input_allocate_device(); - if (!wl_input_dev) + button->input_dev = input_allocate_device(); + if (!button->input_dev) return -ENOMEM; - wl_input_dev->name = "Wireless hotkeys"; - wl_input_dev->phys = "hpq6001/input0"; - wl_input_dev->id.bustype = BUS_HOST; - wl_input_dev->evbit[0] = BIT(EV_KEY); - set_bit(KEY_RFKILL, wl_input_dev->keybit); + snprintf(button->phys, sizeof(button->phys), "%s/input0", acpi_device_hid(device)); + + button->input_dev->name = "Wireless hotkeys"; + button->input_dev->phys = button->phys; + button->input_dev->id.bustype = BUS_HOST; + button->input_dev->evbit[0] = BIT(EV_KEY); + set_bit(KEY_RFKILL, button->input_dev->keybit); - err = input_register_device(wl_input_dev); + err = input_register_device(button->input_dev); if (err) goto err_free_dev; return 0; err_free_dev: - input_free_device(wl_input_dev); + input_free_device(button->input_dev); return err; } -static void wireless_input_destroy(void) +static void wireless_input_destroy(struct acpi_device *device) { - input_unregister_device(wl_input_dev); + struct wl_button *button = acpi_driver_data(device); + + input_unregister_device(button->input_dev); + kfree(button); } static void wl_notify(struct acpi_device *acpi_dev, u32 event) { + struct wl_button *button = acpi_driver_data(acpi_dev); + if (event != 0x80) { pr_info("Received unknown event (0x%x)\n", event); return; } - input_report_key(wl_input_dev, KEY_RFKILL, 1); - input_sync(wl_input_dev); - input_report_key(wl_input_dev, KEY_RFKILL, 0); - input_sync(wl_input_dev); + input_report_key(button->input_dev, KEY_RFKILL, 1); + input_sync(button->input_dev); + input_report_key(button->input_dev, KEY_RFKILL, 0); + input_sync(button->input_dev); } static int wl_add(struct acpi_device *device) { + struct wl_button *button; int err; - err = wireless_input_setup(); - if (err) + button = kzalloc(sizeof(struct wl_button), GFP_KERNEL); + if (!button) + return -ENOMEM; + + device->driver_data = button; + + err = wireless_input_setup(device); + if (err) { pr_err("Failed to setup wireless hotkeys\n"); + kfree(button); + } return err; } static int wl_remove(struct acpi_device *device) { - wireless_input_destroy(); + wireless_input_destroy(device); return 0; }