xref: /linux/include/linux/pwrseq/provider.h (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2024 Linaro Ltd.
4  */
5 
6 #ifndef __POWER_SEQUENCING_PROVIDER_H__
7 #define __POWER_SEQUENCING_PROVIDER_H__
8 
9 struct device;
10 struct module;
11 struct pwrseq_device;
12 
13 typedef int (*pwrseq_power_state_func)(struct pwrseq_device *);
14 typedef int (*pwrseq_match_func)(struct pwrseq_device *, struct device *);
15 
16 /**
17  * struct pwrseq_unit_data - Configuration of a single power sequencing
18  *                           unit.
19  * @name: Name of the unit.
20  * @deps: Units that must be enabled before this one and disabled after it
21  *        in the order they come in this array. Must be NULL-terminated.
22  * @enable: Callback running the part of the power-on sequence provided by
23  *          this unit.
24  * @disable: Callback running the part of the power-off sequence provided
25  *           by this unit.
26  */
27 struct pwrseq_unit_data {
28 	const char *name;
29 	const struct pwrseq_unit_data **deps;
30 	pwrseq_power_state_func enable;
31 	pwrseq_power_state_func disable;
32 };
33 
34 /**
35  * struct pwrseq_target_data - Configuration of a power sequencing target.
36  * @name: Name of the target.
37  * @unit: Final unit that this target must reach in order to be considered
38  *        enabled.
39  * @post_enable: Callback run after the target unit has been enabled, *after*
40  *               the state lock has been released. It's useful for implementing
41  *               boot-up delays without blocking other users from powering up
42  *               using the same power sequencer.
43  */
44 struct pwrseq_target_data {
45 	const char *name;
46 	const struct pwrseq_unit_data *unit;
47 	pwrseq_power_state_func post_enable;
48 };
49 
50 /**
51  * struct pwrseq_config - Configuration used for registering a new provider.
52  * @parent: Parent device for the sequencer. Must be set.
53  * @owner: Module providing this device.
54  * @drvdata: Private driver data.
55  * @match: Provider callback used to match the consumer device to the sequencer.
56  * @targets: Array of targets for this power sequencer. Must be NULL-terminated.
57  */
58 struct pwrseq_config {
59 	struct device *parent;
60 	struct module *owner;
61 	void *drvdata;
62 	pwrseq_match_func match;
63 	const struct pwrseq_target_data **targets;
64 };
65 
66 struct pwrseq_device *
67 pwrseq_device_register(const struct pwrseq_config *config);
68 void pwrseq_device_unregister(struct pwrseq_device *pwrseq);
69 struct pwrseq_device *
70 devm_pwrseq_device_register(struct device *dev,
71 			    const struct pwrseq_config *config);
72 
73 void *pwrseq_device_get_drvdata(struct pwrseq_device *pwrseq);
74 
75 #endif /* __POWER_SEQUENCING_PROVIDER_H__ */
76