diff mbox series

platform/x86: wireless-hotkey: use ACPI HID as phys

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

Commit Message

Alex Hung Nov. 27, 2022, 12:46 a.m. UTC
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>
---
 drivers/platform/x86/wireless-hotkey.c | 60 +++++++++++++++++---------
 1 file changed, 40 insertions(+), 20 deletions(-)

Comments

Hans de Goede Dec. 8, 2022, 10:46 a.m. UTC | #1
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 mbox series

Patch

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;
 }