On Fri, Dec 11, 2020 at 3:15 AM Mark Pearson <markpearson@xxxxxxxxxx> wrote: > > This is the initial implementation of the platform-profile feature. > It provides the details discussed and outlined in the > sysfs-platform_profile document. > > Many modern systems have the ability to modify the operating profile to > control aspects like fan speed, temperature and power levels. This > module provides a common sysfs interface that platform modules can register > against to control their individual profile options. > > Signed-off-by: Mark Pearson <markpearson@xxxxxxxxxx> [cut] > diff --git a/include/linux/platform_profile.h b/include/linux/platform_profile.h > new file mode 100644 > index 000000000000..9a1e2abd7602 > --- /dev/null > +++ b/include/linux/platform_profile.h > @@ -0,0 +1,39 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > +/* > + * Platform profile sysfs interface > + * > + * See Documentation/ABI/testing/sysfs-platform_profile.rst for more > + * information. > + */ > + > +#ifndef _PLATFORM_PROFILE_H_ > +#define _PLATFORM_PROFILE_H_ > + > +#include <linux/bitops.h> > + > +/* > + * If more options are added please update profile_names > + * array in platform-profile.c and sysfs-platform-profile.rst > + * documentation. > + */ > + > +enum platform_profile_option { > + PLATFORM_PROFILE_LOW, > + PLATFORM_PROFILE_COOL, > + PLATFORM_PROFILE_QUIET, > + PLATFORM_PROFILE_BALANCED, > + PLATFORM_PROFILE_PERFORM, > + PLATFORM_PROFILE_LAST, /*must always be last */ > +}; > + > +struct platform_profile_handler { > + unsigned long choices[BITS_TO_LONGS(PLATFORM_PROFILE_LAST)]; > + int (*profile_get)(enum platform_profile_option *profile); I'm not sure why this callback is necessary and, provided that there is a good enough reason, why it cannot return an enum platform_profile_option value. In principle, if ->profile_set() returns 0, the requested profile can be saved in a static var and then returned by subsequent "read" operations. > + int (*profile_set)(enum platform_profile_option profile); > +}; > + > +int platform_profile_register(const struct platform_profile_handler *pprof); > +int platform_profile_remove(void); > +void platform_profile_notify(void); > + > +#endif /*_PLATFORM_PROFILE_H_*/ > --