mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
![Linus Torvalds](/assets/img/avatar_default.png)
kobject: * Increase number of allowed uevent variables power-supply core: * Add power-supply type in uevent * Cleanup property handling in core * Make property and usb_type pointers const * Convert core power-supply DT binding to YAML * Cleanup HWMON code * Add new health status "calibration required" * Add new properties for manufacture date and capacity error margin battery drivers: * new cw2015 battery driver used by pine64 Pinebook Pro laptop * axp22: blacklist on Meegopad T02 * sc27xx: support current/voltage reading * max17042: support time-to-empty reading * simple-battery: add more battery parameters * bq27xxx: convert DT binding document to YAML * sbs-battery: add TI BQ20Z65 support, fix technology property, convert DT binding to YAML, add option to disable charger broadcasts, add new properties: manufacture date, capacity error margin, average current, charge current and voltage and support calibration required health status * misc. fixes charger drivers: * bq25890: cleanup, implement charge type, precharge current and input current limiting properties * bd70528: use new linear range helper library * bd99954: new charger driver * mp2629: new charger driver * misc. fixes reboot drivers: * oxnas-restart: introduce new driver * syscon-reboot: convert DT binding to YAML, add parent syscon device support * misc. fixes -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE72YNB0Y/i3JqeVQT2O7X88g7+poFAl7a2L0ACgkQ2O7X88g7 +poAIg//caN2sHqOFEsukXWe1oft/X0IQeGNmlCnj55l1zGJ/x03Yn0GeKb0FZgM go+sfMaM/a6NNdmKhseLIsYFlhVBa2E7qW1nvaxgt66JKS+GXAHfE8LWVwazDJex rq0esXuegsqFdbCUth81YLk2H+0qwnhVVv/Urvv1RaE/woeFHAHL1cYfcFa+YDXm XRDT0W73YozslFkMnZMLBLyQzad3yVnNcnRYF3Dx0CMnUsjGfPjBlyk4RLPTcgUk 8ChTvCcHRG7IhEtF0a1HUr3UjCy9rjwiqWIobQltnbEYImxY0LWkCVVr1EsNjeyr ikl3c4JfwmdlVCBCSPn294mPlGKu8DNBMLN1IgAuJHKW1GuQxd0Tcbd9OwF6VlVj WTFWp2GcoIjKQtOWKDeCqby+hoWhgclxTHUudo7FGTT0xBP9OWTKWDpDL18cZWd8 dNCFMEI6MDMRtwL8+3ilLcnvSoMzyZ94TZmwii9toD3xSI7TMn7oVRuOlq1TkOEw ZuPS3QP6jBHm8NN9JEhLbrwradP+R8qpE/jpsnWiBDR6Jt7xx4W7W0xupq4GdHAl u0Lbh38/0bkTijeo9xoPe03KsSBV8HOr9Lf/QVW3zLcYcGKW17j8QTkes3a0bOs0 DZHVCFeXuWNFa/tJxe6c+J+NsroLucTMwA3lBmlZhI/TPsG2vb8= =He9L -----END PGP SIGNATURE----- Merge tag 'for-v5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply Pull power supply and reset updates from Sebastian Reichel: "This time there are lots of changes. Quite a few changes to the core, lots of driver changes and one change to kobject core (with Ack from Greg). Summary: kobject: - Increase number of allowed uevent variables power-supply core: - Add power-supply type in uevent - Cleanup property handling in core - Make property and usb_type pointers const - Convert core power-supply DT binding to YAML - Cleanup HWMON code - Add new health status "calibration required" - Add new properties for manufacture date and capacity error margin battery drivers: - new cw2015 battery driver used by pine64 Pinebook Pro laptop - axp22: blacklist on Meegopad T02 - sc27xx: support current/voltage reading - max17042: support time-to-empty reading - simple-battery: add more battery parameters - bq27xxx: convert DT binding document to YAML - sbs-battery: add TI BQ20Z65 support, fix technology property, convert DT binding to YAML, add option to disable charger broadcasts, add new properties: manufacture date, capacity error margin, average current, charge current and voltage and support calibration required health status - misc fixes charger drivers: - bq25890: cleanup, implement charge type, precharge current and input current limiting properties - bd70528: use new linear range helper library - bd99954: new charger driver - mp2629: new charger driver - misc fixes reboot drivers: - oxnas-restart: introduce new driver - syscon-reboot: convert DT binding to YAML, add parent syscon device support - misc fixes" * tag 'for-v5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply: (85 commits) power: supply: cw2015: Attach OF ID table to the driver power: reset: gpio-poweroff: add missing '\n' in dev_err() Revert "power: supply: sbs-battery: simplify read_read_string_data" Revert "power: supply: sbs-battery: add PEC support" dt-bindings: power: sbs-battery: Convert to yaml power: supply: sbs-battery: constify power-supply property array power: supply: sbs-battery: switch to i2c's probe_new power: supply: sbs-battery: switch from of_property_* to device_property_* power: supply: sbs-battery: add ability to disable charger broadcasts power: supply: sbs-battery: fix idle battery status power: supply: sbs-battery: add POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED support power: supply: sbs-battery: add MANUFACTURE_DATE support power: supply: sbs-battery: add POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT/VOLTAGE_MAX support power: supply: sbs-battery: Improve POWER_SUPPLY_PROP_TECHNOLOGY support power: supply: sbs-battery: add POWER_SUPPLY_PROP_CURRENT_AVG support power: supply: sbs-battery: add PEC support power: supply: sbs-battery: simplify read_read_string_data power: supply: sbs-battery: add POWER_SUPPLY_PROP_CAPACITY_ERROR_MARGIN support power: supply: sbs-battery: Add TI BQ20Z65 support power: supply: core: add POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED ...
248 lines
7.7 KiB
C
248 lines
7.7 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* kobject.h - generic kernel object infrastructure.
|
|
*
|
|
* Copyright (c) 2002-2003 Patrick Mochel
|
|
* Copyright (c) 2002-2003 Open Source Development Labs
|
|
* Copyright (c) 2006-2008 Greg Kroah-Hartman <greg@kroah.com>
|
|
* Copyright (c) 2006-2008 Novell Inc.
|
|
*
|
|
* Please read Documentation/core-api/kobject.rst before using the kobject
|
|
* interface, ESPECIALLY the parts about reference counts and object
|
|
* destructors.
|
|
*/
|
|
|
|
#ifndef _KOBJECT_H_
|
|
#define _KOBJECT_H_
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/list.h>
|
|
#include <linux/sysfs.h>
|
|
#include <linux/compiler.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/kref.h>
|
|
#include <linux/kobject_ns.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/atomic.h>
|
|
#include <linux/workqueue.h>
|
|
#include <linux/uidgid.h>
|
|
|
|
#define UEVENT_HELPER_PATH_LEN 256
|
|
#define UEVENT_NUM_ENVP 64 /* number of env pointers */
|
|
#define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */
|
|
|
|
#ifdef CONFIG_UEVENT_HELPER
|
|
/* path to the userspace helper executed on an event */
|
|
extern char uevent_helper[];
|
|
#endif
|
|
|
|
/* counter to tag the uevent, read only except for the kobject core */
|
|
extern u64 uevent_seqnum;
|
|
|
|
/*
|
|
* The actions here must match the index to the string array
|
|
* in lib/kobject_uevent.c
|
|
*
|
|
* Do not add new actions here without checking with the driver-core
|
|
* maintainers. Action strings are not meant to express subsystem
|
|
* or device specific properties. In most cases you want to send a
|
|
* kobject_uevent_env(kobj, KOBJ_CHANGE, env) with additional event
|
|
* specific variables added to the event environment.
|
|
*/
|
|
enum kobject_action {
|
|
KOBJ_ADD,
|
|
KOBJ_REMOVE,
|
|
KOBJ_CHANGE,
|
|
KOBJ_MOVE,
|
|
KOBJ_ONLINE,
|
|
KOBJ_OFFLINE,
|
|
KOBJ_BIND,
|
|
KOBJ_UNBIND,
|
|
KOBJ_MAX
|
|
};
|
|
|
|
struct kobject {
|
|
const char *name;
|
|
struct list_head entry;
|
|
struct kobject *parent;
|
|
struct kset *kset;
|
|
struct kobj_type *ktype;
|
|
struct kernfs_node *sd; /* sysfs directory entry */
|
|
struct kref kref;
|
|
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
|
|
struct delayed_work release;
|
|
#endif
|
|
unsigned int state_initialized:1;
|
|
unsigned int state_in_sysfs:1;
|
|
unsigned int state_add_uevent_sent:1;
|
|
unsigned int state_remove_uevent_sent:1;
|
|
unsigned int uevent_suppress:1;
|
|
};
|
|
|
|
extern __printf(2, 3)
|
|
int kobject_set_name(struct kobject *kobj, const char *name, ...);
|
|
extern __printf(2, 0)
|
|
int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
|
|
va_list vargs);
|
|
|
|
static inline const char *kobject_name(const struct kobject *kobj)
|
|
{
|
|
return kobj->name;
|
|
}
|
|
|
|
extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
|
|
extern __printf(3, 4) __must_check
|
|
int kobject_add(struct kobject *kobj, struct kobject *parent,
|
|
const char *fmt, ...);
|
|
extern __printf(4, 5) __must_check
|
|
int kobject_init_and_add(struct kobject *kobj,
|
|
struct kobj_type *ktype, struct kobject *parent,
|
|
const char *fmt, ...);
|
|
|
|
extern void kobject_del(struct kobject *kobj);
|
|
|
|
extern struct kobject * __must_check kobject_create(void);
|
|
extern struct kobject * __must_check kobject_create_and_add(const char *name,
|
|
struct kobject *parent);
|
|
|
|
extern int __must_check kobject_rename(struct kobject *, const char *new_name);
|
|
extern int __must_check kobject_move(struct kobject *, struct kobject *);
|
|
|
|
extern struct kobject *kobject_get(struct kobject *kobj);
|
|
extern struct kobject * __must_check kobject_get_unless_zero(
|
|
struct kobject *kobj);
|
|
extern void kobject_put(struct kobject *kobj);
|
|
|
|
extern const void *kobject_namespace(struct kobject *kobj);
|
|
extern void kobject_get_ownership(struct kobject *kobj,
|
|
kuid_t *uid, kgid_t *gid);
|
|
extern char *kobject_get_path(struct kobject *kobj, gfp_t flag);
|
|
|
|
/**
|
|
* kobject_has_children - Returns whether a kobject has children.
|
|
* @kobj: the object to test
|
|
*
|
|
* This will return whether a kobject has other kobjects as children.
|
|
*
|
|
* It does NOT account for the presence of attribute files, only sub
|
|
* directories. It also assumes there is no concurrent addition or
|
|
* removal of such children, and thus relies on external locking.
|
|
*/
|
|
static inline bool kobject_has_children(struct kobject *kobj)
|
|
{
|
|
WARN_ON_ONCE(kref_read(&kobj->kref) == 0);
|
|
|
|
return kobj->sd && kobj->sd->dir.subdirs;
|
|
}
|
|
|
|
struct kobj_type {
|
|
void (*release)(struct kobject *kobj);
|
|
const struct sysfs_ops *sysfs_ops;
|
|
struct attribute **default_attrs; /* use default_groups instead */
|
|
const struct attribute_group **default_groups;
|
|
const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
|
|
const void *(*namespace)(struct kobject *kobj);
|
|
void (*get_ownership)(struct kobject *kobj, kuid_t *uid, kgid_t *gid);
|
|
};
|
|
|
|
struct kobj_uevent_env {
|
|
char *argv[3];
|
|
char *envp[UEVENT_NUM_ENVP];
|
|
int envp_idx;
|
|
char buf[UEVENT_BUFFER_SIZE];
|
|
int buflen;
|
|
};
|
|
|
|
struct kset_uevent_ops {
|
|
int (* const filter)(struct kset *kset, struct kobject *kobj);
|
|
const char *(* const name)(struct kset *kset, struct kobject *kobj);
|
|
int (* const uevent)(struct kset *kset, struct kobject *kobj,
|
|
struct kobj_uevent_env *env);
|
|
};
|
|
|
|
struct kobj_attribute {
|
|
struct attribute attr;
|
|
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
|
|
char *buf);
|
|
ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
|
|
const char *buf, size_t count);
|
|
};
|
|
|
|
extern const struct sysfs_ops kobj_sysfs_ops;
|
|
|
|
struct sock;
|
|
|
|
/**
|
|
* struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
|
|
*
|
|
* A kset defines a group of kobjects. They can be individually
|
|
* different "types" but overall these kobjects all want to be grouped
|
|
* together and operated on in the same manner. ksets are used to
|
|
* define the attribute callbacks and other common events that happen to
|
|
* a kobject.
|
|
*
|
|
* @list: the list of all kobjects for this kset
|
|
* @list_lock: a lock for iterating over the kobjects
|
|
* @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
|
|
* @uevent_ops: the set of uevent operations for this kset. These are
|
|
* called whenever a kobject has something happen to it so that the kset
|
|
* can add new environment variables, or filter out the uevents if so
|
|
* desired.
|
|
*/
|
|
struct kset {
|
|
struct list_head list;
|
|
spinlock_t list_lock;
|
|
struct kobject kobj;
|
|
const struct kset_uevent_ops *uevent_ops;
|
|
} __randomize_layout;
|
|
|
|
extern void kset_init(struct kset *kset);
|
|
extern int __must_check kset_register(struct kset *kset);
|
|
extern void kset_unregister(struct kset *kset);
|
|
extern struct kset * __must_check kset_create_and_add(const char *name,
|
|
const struct kset_uevent_ops *u,
|
|
struct kobject *parent_kobj);
|
|
|
|
static inline struct kset *to_kset(struct kobject *kobj)
|
|
{
|
|
return kobj ? container_of(kobj, struct kset, kobj) : NULL;
|
|
}
|
|
|
|
static inline struct kset *kset_get(struct kset *k)
|
|
{
|
|
return k ? to_kset(kobject_get(&k->kobj)) : NULL;
|
|
}
|
|
|
|
static inline void kset_put(struct kset *k)
|
|
{
|
|
kobject_put(&k->kobj);
|
|
}
|
|
|
|
static inline struct kobj_type *get_ktype(struct kobject *kobj)
|
|
{
|
|
return kobj->ktype;
|
|
}
|
|
|
|
extern struct kobject *kset_find_obj(struct kset *, const char *);
|
|
|
|
/* The global /sys/kernel/ kobject for people to chain off of */
|
|
extern struct kobject *kernel_kobj;
|
|
/* The global /sys/kernel/mm/ kobject for people to chain off of */
|
|
extern struct kobject *mm_kobj;
|
|
/* The global /sys/hypervisor/ kobject for people to chain off of */
|
|
extern struct kobject *hypervisor_kobj;
|
|
/* The global /sys/power/ kobject for people to chain off of */
|
|
extern struct kobject *power_kobj;
|
|
/* The global /sys/firmware/ kobject for people to chain off of */
|
|
extern struct kobject *firmware_kobj;
|
|
|
|
int kobject_uevent(struct kobject *kobj, enum kobject_action action);
|
|
int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
|
|
char *envp[]);
|
|
int kobject_synth_uevent(struct kobject *kobj, const char *buf, size_t count);
|
|
|
|
__printf(2, 3)
|
|
int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);
|
|
|
|
#endif /* _KOBJECT_H_ */
|