mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-04 10:21:00 +00:00
When two drivers don't support all the same profiles the legacy interface
only exports the common profiles.
This causes problems for cases where one driver uses low-power but another
uses quiet because the result is that neither is exported to sysfs.
To allow two drivers to disagree, add support for "hidden choices".
Hidden choices are platform profiles that a driver supports to be
compatible with the platform profile of another driver.
Fixes: 688834743d ("ACPI: platform_profile: Allow multiple handlers")
Reported-by: Antheas Kapenekakis <lkml@antheas.dev>
Closes: https://lore.kernel.org/platform-driver-x86/e64b771e-3255-42ad-9257-5b8fc6c24ac9@gmx.de/T/#mc068042dd29df36c16c8af92664860fc4763974b
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Tested-by: Antheas Kapenekakis <lkml@antheas.dev>
Tested-by: Derek J. Clark <derekjohn.clark@gmail.com>
Acked-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://patch.msgid.link/20250228170155.2623386-2-superm1@kernel.org
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
61 lines
2.0 KiB
C
61 lines
2.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Platform profile sysfs interface
|
|
*
|
|
* See Documentation/userspace-api/sysfs-platform_profile.rst for more
|
|
* information.
|
|
*/
|
|
|
|
#ifndef _PLATFORM_PROFILE_H_
|
|
#define _PLATFORM_PROFILE_H_
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/bitops.h>
|
|
|
|
/*
|
|
* If more options are added please update profile_names array in
|
|
* platform_profile.c and sysfs-platform_profile documentation.
|
|
*/
|
|
|
|
enum platform_profile_option {
|
|
PLATFORM_PROFILE_LOW_POWER,
|
|
PLATFORM_PROFILE_COOL,
|
|
PLATFORM_PROFILE_QUIET,
|
|
PLATFORM_PROFILE_BALANCED,
|
|
PLATFORM_PROFILE_BALANCED_PERFORMANCE,
|
|
PLATFORM_PROFILE_PERFORMANCE,
|
|
PLATFORM_PROFILE_CUSTOM,
|
|
PLATFORM_PROFILE_LAST, /*must always be last */
|
|
};
|
|
|
|
/**
|
|
* struct platform_profile_ops - platform profile operations
|
|
* @probe: Callback to setup choices available to the new class device. These
|
|
* choices will only be enforced when setting a new profile, not when
|
|
* getting the current one.
|
|
* @hidden_choices: Callback to setup choices that are not visible to the user
|
|
* but can be set by the driver.
|
|
* @profile_get: Callback that will be called when showing the current platform
|
|
* profile in sysfs.
|
|
* @profile_set: Callback that will be called when storing a new platform
|
|
* profile in sysfs.
|
|
*/
|
|
struct platform_profile_ops {
|
|
int (*probe)(void *drvdata, unsigned long *choices);
|
|
int (*hidden_choices)(void *drvdata, unsigned long *choices);
|
|
int (*profile_get)(struct device *dev, enum platform_profile_option *profile);
|
|
int (*profile_set)(struct device *dev, enum platform_profile_option profile);
|
|
};
|
|
|
|
struct device *platform_profile_register(struct device *dev, const char *name,
|
|
void *drvdata,
|
|
const struct platform_profile_ops *ops);
|
|
int platform_profile_remove(struct device *dev);
|
|
struct device *devm_platform_profile_register(struct device *dev, const char *name,
|
|
void *drvdata,
|
|
const struct platform_profile_ops *ops);
|
|
int platform_profile_cycle(void);
|
|
void platform_profile_notify(struct device *dev);
|
|
|
|
#endif /*_PLATFORM_PROFILE_H_*/
|