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