public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
From: Armin Wolf <W_Armin@gmx.de>
To: "Mario Limonciello" <mario.limonciello@amd.com>,
	"Hans de Goede" <hdegoede@redhat.com>,
	"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Cc: "Rafael J . Wysocki" <rafael@kernel.org>,
	"Len Brown" <lenb@kernel.org>,
	"Maximilian Luz" <luzmaximilian@gmail.com>,
	"Lee Chun-Yi" <jlee@suse.com>,
	"Shyam Sundar S K" <Shyam-sundar.S-k@amd.com>,
	"Corentin Chary" <corentin.chary@gmail.com>,
	"Luke D . Jones" <luke@ljones.dev>,
	"Ike Panhc" <ike.pan@canonical.com>,
	"Henrique de Moraes Holschuh" <hmh@hmh.eng.br>,
	"Alexis Belmonte" <alexbelm48@gmail.com>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
	"Ai Chao" <aichao@kylinos.cn>, "Gergo Koteles" <soyer@irl.hu>,
	"open list" <linux-kernel@vger.kernel.org>,
	"open list:ACPI" <linux-acpi@vger.kernel.org>,
	"open list:MICROSOFT SURFACE PLATFORM PROFILE DRIVER"
	<platform-driver-x86@vger.kernel.org>,
	"open list:THINKPAD ACPI EXTRAS DRIVER"
	<ibm-acpi-devel@lists.sourceforge.net>,
	"Mark Pearson" <mpearson-lenovo@squebb.ca>,
	"Matthew Schwartz" <matthew.schwartz@linux.dev>
Subject: Re: [PATCH v5 08/20] ACPI: platform_profile: Create class for ACPI platform profile
Date: Thu, 7 Nov 2024 09:16:25 +0100	[thread overview]
Message-ID: <84a647ba-50ec-4d60-b4be-758ff50335bd@gmx.de> (raw)
In-Reply-To: <20241107060254.17615-9-mario.limonciello@amd.com>

Am 07.11.24 um 07:02 schrieb Mario Limonciello:

> When registering a platform profile handler create a class device
> that will allow changing a single platform profile handler.
>
> Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
> v5:
>   * Use ida instead of idr
>   * Use device_unregister instead of device_destroy()
>   * MKDEV (0, 0)
> ---
>   drivers/acpi/platform_profile.c  | 50 +++++++++++++++++++++++++++++---
>   include/linux/platform_profile.h |  2 ++
>   2 files changed, 48 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c
> index 0450bdae7c88b..652034b71ee9b 100644
> --- a/drivers/acpi/platform_profile.c
> +++ b/drivers/acpi/platform_profile.c
> @@ -5,6 +5,7 @@
>   #include <linux/acpi.h>
>   #include <linux/bits.h>
>   #include <linux/init.h>
> +#include <linux/kdev_t.h>
>   #include <linux/mutex.h>
>   #include <linux/platform_profile.h>
>   #include <linux/sysfs.h>
> @@ -22,6 +23,12 @@ static const char * const profile_names[] = {
>   };
>   static_assert(ARRAY_SIZE(profile_names) == PLATFORM_PROFILE_LAST);
>
> +static DEFINE_IDA(platform_profile_ida);
> +
> +static const struct class platform_profile_class = {
> +	.name = "platform-profile",
> +};
> +
>   static ssize_t platform_profile_choices_show(struct device *dev,
>   					struct device_attribute *attr,
>   					char *buf)
> @@ -113,6 +120,8 @@ void platform_profile_notify(void)
>   {
>   	if (!cur_profile)
>   		return;
> +	if (!class_is_registered(&platform_profile_class))
> +		return;
>   	sysfs_notify(acpi_kobj, NULL, "platform_profile");
>   }
>   EXPORT_SYMBOL_GPL(platform_profile_notify);
> @@ -123,6 +132,9 @@ int platform_profile_cycle(void)
>   	enum platform_profile_option next;
>   	int err;
>
> +	if (!class_is_registered(&platform_profile_class))
> +		return -ENODEV;
> +
>   	scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
>   		if (!cur_profile)
>   			return -ENODEV;
> @@ -163,20 +175,50 @@ int platform_profile_register(struct platform_profile_handler *pprof)
>   	if (cur_profile)
>   		return -EEXIST;
>
> -	err = sysfs_create_group(acpi_kobj, &platform_profile_group);
> -	if (err)
> -		return err;
> +	if (!class_is_registered(&platform_profile_class)) {
> +		/* class for individual handlers */
> +		err = class_register(&platform_profile_class);
> +		if (err)
> +			return err;
> +		/* legacy sysfs files */
> +		err = sysfs_create_group(acpi_kobj, &platform_profile_group);
> +		if (err)
> +			goto cleanup_class;
> +	}
> +
> +	/* create class interface for individual handler */
> +	pprof->minor = ida_alloc(&platform_profile_ida, GFP_KERNEL);

Missing error handling.

> +	pprof->class_dev = device_create(&platform_profile_class, NULL,
> +					 MKDEV(0, 0), NULL, "platform-profile-%d",
> +					 pprof->minor);

Two things:

1. Please allow drivers to pass in their struct device so the resulting class device
has a parent device. This would allow userspace applications to determine which device
handles which platform profile device. This parameter is optional and can be NULL.

2. Please use the fourth argument of device_create() instead of dev_set_drvdata().

Thanks,
Armin Wolf

> +	if (IS_ERR(pprof->class_dev)) {
> +		err = PTR_ERR(pprof->class_dev);
> +		goto cleanup_ida;
> +	}
> +	dev_set_drvdata(pprof->class_dev, pprof);
>
>   	cur_profile = pprof;
>   	return 0;
> +
> +cleanup_ida:
> +	ida_free(&platform_profile_ida, pprof->minor);
> +
> +cleanup_class:
> +	class_unregister(&platform_profile_class);
> +
> +	return err;
>   }
>   EXPORT_SYMBOL_GPL(platform_profile_register);
>
>   int platform_profile_remove(struct platform_profile_handler *pprof)
>   {
> +	int id;
>   	guard(mutex)(&profile_lock);
>
> -	sysfs_remove_group(acpi_kobj, &platform_profile_group);
> +	id = pprof->minor;
> +	device_unregister(pprof->class_dev);
> +	ida_free(&platform_profile_ida, id);
> +
>   	cur_profile = NULL;
>   	return 0;
>   }
> diff --git a/include/linux/platform_profile.h b/include/linux/platform_profile.h
> index 58279b76d740e..d92a035e6ba6a 100644
> --- a/include/linux/platform_profile.h
> +++ b/include/linux/platform_profile.h
> @@ -28,6 +28,8 @@ enum platform_profile_option {
>
>   struct platform_profile_handler {
>   	const char *name;
> +	struct device *class_dev;
> +	int minor;
>   	unsigned long choices[BITS_TO_LONGS(PLATFORM_PROFILE_LAST)];
>   	int (*profile_get)(struct platform_profile_handler *pprof,
>   				enum platform_profile_option *profile);

  reply	other threads:[~2024-11-07  8:17 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-07  6:02 [PATCH v5 00/20] Add support for binding ACPI platform profile to multiple drivers Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 01/20] ACPI: platform-profile: Add a name member to handlers Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 02/20] platform/x86/dell: dell-pc: Create platform device Mario Limonciello
2024-11-07  8:07   ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 03/20] ACPI: platform_profile: Add platform handler argument to platform_profile_remove() Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 04/20] ACPI: platform_profile: Move sanity check out of the mutex Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 05/20] ACPI: platform_profile: Move matching string for new profile out of mutex Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 06/20] ACPI: platform_profile: Use guard(mutex) for register/unregister Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 07/20] ACPI: platform_profile: Use `scoped_cond_guard` Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 08/20] ACPI: platform_profile: Create class for ACPI platform profile Mario Limonciello
2024-11-07  8:16   ` Armin Wolf [this message]
2024-11-07 21:09     ` Mario Limonciello
2024-11-08 17:34       ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 09/20] ACPI: platform_profile: Unregister class and sysfs group on module unload Mario Limonciello
2024-11-07  8:21   ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 10/20] ACPI: platform_profile: Add name attribute to class interface Mario Limonciello
2024-11-07  8:23   ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 11/20] ACPI: platform_profile: Add choices attribute for " Mario Limonciello
2024-11-07  8:28   ` Armin Wolf
2024-11-07 22:09     ` Mario Limonciello
2024-11-08 18:06       ` Armin Wolf
2024-11-08 19:25         ` Mario Limonciello
2024-11-08 19:44           ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 12/20] ACPI: platform_profile: Add profile " Mario Limonciello
2024-11-07  8:34   ` Armin Wolf
2024-11-07 21:41     ` Mario Limonciello
2024-11-08 18:00       ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 13/20] ACPI: platform_profile: Notify change events on register and unregister Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 14/20] ACPI: platform_profile: Only show profiles common for all handlers Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 15/20] ACPI: platform_profile: Add concept of a "custom" profile Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 16/20] ACPI: platform_profile: Make sure all profile handlers agree on profile Mario Limonciello
2024-11-07  8:53   ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 17/20] ACPI: platform_profile: Check all profile handler to calculate next Mario Limonciello
2024-11-07  8:58   ` Armin Wolf
2024-11-07 22:05     ` Mario Limonciello
2024-11-08 18:10       ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 18/20] ACPI: platform_profile: Allow multiple handlers Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 19/20] platform/x86/amd: pmf: Drop all quirks Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 20/20] Documentation: Add documentation about class interface for platform profiles Mario Limonciello
2024-11-07  9:06 ` [PATCH v5 00/20] Add support for binding ACPI platform profile to multiple drivers Armin Wolf
2024-11-07 21:45   ` Mario Limonciello
2024-11-08 18:13     ` Armin Wolf

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=84a647ba-50ec-4d60-b4be-758ff50335bd@gmx.de \
    --to=w_armin@gmx.de \
    --cc=Shyam-sundar.S-k@amd.com \
    --cc=aichao@kylinos.cn \
    --cc=alexbelm48@gmail.com \
    --cc=corentin.chary@gmail.com \
    --cc=hdegoede@redhat.com \
    --cc=hmh@hmh.eng.br \
    --cc=ibm-acpi-devel@lists.sourceforge.net \
    --cc=ike.pan@canonical.com \
    --cc=ilpo.jarvinen@linux.intel.com \
    --cc=jlee@suse.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luke@ljones.dev \
    --cc=luzmaximilian@gmail.com \
    --cc=mario.limonciello@amd.com \
    --cc=matthew.schwartz@linux.dev \
    --cc=mpearson-lenovo@squebb.ca \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=rafael@kernel.org \
    --cc=soyer@irl.hu \
    --cc=u.kleine-koenig@pengutronix.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox