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