All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: Mario Limonciello <mario.limonciello@amd.com>
Cc: "Hans de Goede" <hdegoede@redhat.com>,
	"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>,
	"Armin Wolf" <W_Armin@gmx.de>
Subject: Re: [PATCH v9 10/22] ACPI: platform_profile: Create class for ACPI platform profile
Date: Wed, 4 Dec 2024 15:41:12 +0200 (EET)	[thread overview]
Message-ID: <9ab7b709-33eb-45fa-3e5d-a1f0c8c72e14@linux.intel.com> (raw)
In-Reply-To: <20241202055031.8038-11-mario.limonciello@amd.com>

[-- Attachment #1: Type: text/plain, Size: 5327 bytes --]

On Sun, 1 Dec 2024, Mario Limonciello wrote:

> When registering a platform profile handler create a class device
> that will allow changing a single platform profile handler.
> 
> The class and sysfs group are no longer needed when the platform profile
> core is a module and unloaded, so remove them at that time as well.
> 
> Reviewed-by: Armin Wolf <W_Armin@gmx.de>
> Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>

Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>

-- 
 i.

> ---
> v8:
>  * Use attr->mode
> ---
>  drivers/acpi/platform_profile.c  | 82 ++++++++++++++++++++++++++++++--
>  include/linux/platform_profile.h |  2 +
>  2 files changed, 79 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c
> index a1f0378f15e62..11eb60b09bac4 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)
> @@ -101,8 +108,21 @@ static struct attribute *platform_profile_attrs[] = {
>  	NULL
>  };
>  
> +static int profile_class_registered(struct device *dev, const void *data)
> +{
> +	return 1;
> +}
> +
> +static umode_t profile_class_is_visible(struct kobject *kobj, struct attribute *attr, int idx)
> +{
> +	if (!class_find_device(&platform_profile_class, NULL, NULL, profile_class_registered))
> +		return 0;
> +	return attr->mode;
> +}
> +
>  static const struct attribute_group platform_profile_group = {
> -	.attrs = platform_profile_attrs
> +	.attrs = platform_profile_attrs,
> +	.is_visible = profile_class_is_visible,
>  };
>  
>  void platform_profile_notify(struct platform_profile_handler *pprof)
> @@ -160,25 +180,77 @@ 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;
> +	/* create class interface for individual handler */
> +	pprof->minor = ida_alloc(&platform_profile_ida, GFP_KERNEL);
> +	if (pprof->minor < 0)
> +		return pprof->minor;
> +	pprof->class_dev = device_create(&platform_profile_class, pprof->dev,
> +					 MKDEV(0, 0), pprof, "platform-profile-%d",
> +					 pprof->minor);
> +	if (IS_ERR(pprof->class_dev)) {
> +		err = PTR_ERR(pprof->class_dev);
> +		goto cleanup_ida;
> +	}
>  
>  	cur_profile = pprof;
> +
> +	err = sysfs_update_group(acpi_kobj, &platform_profile_group);
> +	if (err)
> +		goto cleanup_cur;
> +
>  	return 0;
> +
> +cleanup_cur:
> +	cur_profile = NULL;
> +	device_unregister(pprof->class_dev);
> +
> +cleanup_ida:
> +	ida_free(&platform_profile_ida, pprof->minor);
> +
> +	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);
>  	cur_profile = NULL;
> +
> +	id = pprof->minor;
> +	device_unregister(pprof->class_dev);
> +	ida_free(&platform_profile_ida, id);
> +
> +	sysfs_update_group(acpi_kobj, &platform_profile_group);
> +
>  	return 0;
>  }
>  EXPORT_SYMBOL_GPL(platform_profile_remove);
>  
> +static int __init platform_profile_init(void)
> +{
> +	int err;
> +
> +	err = class_register(&platform_profile_class);
> +	if (err)
> +		return err;
> +
> +	err = sysfs_create_group(acpi_kobj, &platform_profile_group);
> +	if (err)
> +		class_unregister(&platform_profile_class);
> +
> +	return err;
> +}
> +
> +static void __exit platform_profile_exit(void)
> +{
> +	sysfs_remove_group(acpi_kobj, &platform_profile_group);
> +	class_unregister(&platform_profile_class);
> +}
> +module_init(platform_profile_init);
> +module_exit(platform_profile_exit);
> +
>  MODULE_AUTHOR("Mark Pearson <markpearson@lenovo.com>");
>  MODULE_DESCRIPTION("ACPI platform profile sysfs interface");
>  MODULE_LICENSE("GPL");
> diff --git a/include/linux/platform_profile.h b/include/linux/platform_profile.h
> index 8ec0b8da56db5..a888fd085c513 100644
> --- a/include/linux/platform_profile.h
> +++ b/include/linux/platform_profile.h
> @@ -29,6 +29,8 @@ enum platform_profile_option {
>  struct platform_profile_handler {
>  	const char *name;
>  	struct device *dev;
> +	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-12-04 13:41 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-02  5:50 [PATCH v9 00/22] Add support for binding ACPI platform profile to multiple drivers Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 01/22] ACPI: platform-profile: Add a name member to handlers Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 02/22] platform/x86/dell: dell-pc: Create platform device Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 03/22] ACPI: platform_profile: Add device pointer into platform profile handler Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 04/22] ACPI: platform_profile: Add platform handler argument to platform_profile_remove() Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 05/22] ACPI: platform_profile: Pass the profile handler into platform_profile_notify() Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 06/22] ACPI: platform_profile: Move sanity check out of the mutex Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 07/22] ACPI: platform_profile: Move matching string for new profile out of mutex Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 08/22] ACPI: platform_profile: Use guard(mutex) for register/unregister Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 09/22] ACPI: platform_profile: Use `scoped_cond_guard` Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 10/22] ACPI: platform_profile: Create class for ACPI platform profile Mario Limonciello
2024-12-04 13:41   ` Ilpo Järvinen [this message]
2024-12-02  5:50 ` [PATCH v9 11/22] ACPI: platform_profile: Add name attribute to class interface Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 12/22] ACPI: platform_profile: Add choices attribute for " Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 13/22] ACPI: platform_profile: Add profile " Mario Limonciello
2024-12-05 11:40   ` Ilpo Järvinen
2024-12-02  5:50 ` [PATCH v9 14/22] ACPI: platform_profile: Notify change events on register and unregister Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 15/22] ACPI: platform_profile: Only show profiles common for all handlers Mario Limonciello
2024-12-05 11:47   ` Ilpo Järvinen
2024-12-02  5:50 ` [PATCH v9 16/22] ACPI: platform_profile: Add concept of a "custom" profile Mario Limonciello
2024-12-05 11:50   ` Ilpo Järvinen
2024-12-02  5:50 ` [PATCH v9 17/22] ACPI: platform_profile: Make sure all profile handlers agree on profile Mario Limonciello
2024-12-05 12:07   ` Ilpo Järvinen
2024-12-02  5:50 ` [PATCH v9 18/22] ACPI: platform_profile: Check all profile handler to calculate next Mario Limonciello
2024-12-05 14:22   ` Ilpo Järvinen
2024-12-05 14:46     ` Mario Limonciello
2024-12-05 15:22       ` Ilpo Järvinen
2024-12-05 15:35         ` Mario Limonciello
2024-12-02  5:50 ` [PATCH v9 19/22] ACPI: platform_profile: Notify class device from platform_profile_notify() Mario Limonciello
2024-12-05 14:24   ` Ilpo Järvinen
2024-12-02  5:50 ` [PATCH v9 20/22] ACPI: platform_profile: Allow multiple handlers Mario Limonciello
2024-12-05 14:27   ` Ilpo Järvinen
2024-12-02  5:50 ` [PATCH v9 21/22] platform/x86/amd: pmf: Drop all quirks Mario Limonciello
2024-12-05 14:30   ` Ilpo Järvinen
2024-12-02  5:50 ` [PATCH v9 22/22] Documentation: Add documentation about class interface for platform profiles Mario Limonciello
2024-12-05 14:33   ` Ilpo Järvinen
2024-12-02 14:31 ` [PATCH v9 00/22] Add support for binding ACPI platform profile to multiple drivers 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=9ab7b709-33eb-45fa-3e5d-a1f0c8c72e14@linux.intel.com \
    --to=ilpo.jarvinen@linux.intel.com \
    --cc=Shyam-sundar.S-k@amd.com \
    --cc=W_Armin@gmx.de \
    --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=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 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.