1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2021, STMicroelectronics - All Rights Reserved 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu #ifndef REGULATOR_H 7*91f16700Schasinglulu #define REGULATOR_H 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <platform_def.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #ifndef PLAT_NB_RDEVS 12*91f16700Schasinglulu #error "Missing PLAT_NB_RDEVS" 13*91f16700Schasinglulu #endif 14*91f16700Schasinglulu 15*91f16700Schasinglulu /* 16*91f16700Schasinglulu * Consumer interface 17*91f16700Schasinglulu */ 18*91f16700Schasinglulu 19*91f16700Schasinglulu /* regulator-always-on : regulator should never be disabled */ 20*91f16700Schasinglulu #define REGUL_ALWAYS_ON BIT(0) 21*91f16700Schasinglulu /* 22*91f16700Schasinglulu * regulator-boot-on: 23*91f16700Schasinglulu * It's expected that this regulator was left on by the bootloader. 24*91f16700Schasinglulu * The core shouldn't prevent it from being turned off later. 25*91f16700Schasinglulu * The regulator is needed to exit from suspend so it is turned on during suspend entry. 26*91f16700Schasinglulu */ 27*91f16700Schasinglulu #define REGUL_BOOT_ON BIT(1) 28*91f16700Schasinglulu /* regulator-over-current-protection: Enable over current protection. */ 29*91f16700Schasinglulu #define REGUL_OCP BIT(2) 30*91f16700Schasinglulu /* regulator-active-discharge: enable active discharge. */ 31*91f16700Schasinglulu #define REGUL_ACTIVE_DISCHARGE BIT(3) 32*91f16700Schasinglulu /* regulator-pull-down: Enable pull down resistor when the regulator is disabled. */ 33*91f16700Schasinglulu #define REGUL_PULL_DOWN BIT(4) 34*91f16700Schasinglulu /* 35*91f16700Schasinglulu * st,mask-reset: set mask reset for the regulator, meaning that the regulator 36*91f16700Schasinglulu * setting is maintained during pmic reset. 37*91f16700Schasinglulu */ 38*91f16700Schasinglulu #define REGUL_MASK_RESET BIT(5) 39*91f16700Schasinglulu /* st,regulator-sink-source: set the regulator in sink source mode */ 40*91f16700Schasinglulu #define REGUL_SINK_SOURCE BIT(6) 41*91f16700Schasinglulu /* st,regulator-bypass: set the regulator in bypass mode */ 42*91f16700Schasinglulu #define REGUL_ENABLE_BYPASS BIT(7) 43*91f16700Schasinglulu 44*91f16700Schasinglulu struct rdev *regulator_get_by_name(const char *node_name); 45*91f16700Schasinglulu 46*91f16700Schasinglulu struct rdev *regulator_get_by_supply_name(const void *fdt, int node, const char *name); 47*91f16700Schasinglulu 48*91f16700Schasinglulu int regulator_enable(struct rdev *rdev); 49*91f16700Schasinglulu int regulator_disable(struct rdev *rdev); 50*91f16700Schasinglulu int regulator_is_enabled(const struct rdev *rdev); 51*91f16700Schasinglulu 52*91f16700Schasinglulu int regulator_set_voltage(struct rdev *rdev, uint16_t volt); 53*91f16700Schasinglulu int regulator_set_min_voltage(struct rdev *rdev); 54*91f16700Schasinglulu int regulator_get_voltage(const struct rdev *rdev); 55*91f16700Schasinglulu 56*91f16700Schasinglulu int regulator_list_voltages(const struct rdev *rdev, const uint16_t **levels, size_t *count); 57*91f16700Schasinglulu void regulator_get_range(const struct rdev *rdev, uint16_t *min_mv, uint16_t *max_mv); 58*91f16700Schasinglulu int regulator_set_flag(struct rdev *rdev, uint16_t flag); 59*91f16700Schasinglulu 60*91f16700Schasinglulu /* 61*91f16700Schasinglulu * Driver Interface 62*91f16700Schasinglulu */ 63*91f16700Schasinglulu 64*91f16700Schasinglulu /* set_state() arguments */ 65*91f16700Schasinglulu #define STATE_DISABLE false 66*91f16700Schasinglulu #define STATE_ENABLE true 67*91f16700Schasinglulu 68*91f16700Schasinglulu struct regul_description { 69*91f16700Schasinglulu const char *node_name; 70*91f16700Schasinglulu const struct regul_ops *ops; 71*91f16700Schasinglulu const void *driver_data; 72*91f16700Schasinglulu const char *supply_name; 73*91f16700Schasinglulu const uint32_t enable_ramp_delay; 74*91f16700Schasinglulu }; 75*91f16700Schasinglulu 76*91f16700Schasinglulu struct regul_ops { 77*91f16700Schasinglulu int (*set_state)(const struct regul_description *desc, bool state); 78*91f16700Schasinglulu int (*get_state)(const struct regul_description *desc); 79*91f16700Schasinglulu int (*set_voltage)(const struct regul_description *desc, uint16_t mv); 80*91f16700Schasinglulu int (*get_voltage)(const struct regul_description *desc); 81*91f16700Schasinglulu int (*list_voltages)(const struct regul_description *desc, 82*91f16700Schasinglulu const uint16_t **levels, size_t *count); 83*91f16700Schasinglulu int (*set_flag)(const struct regul_description *desc, uint16_t flag); 84*91f16700Schasinglulu void (*lock)(const struct regul_description *desc); 85*91f16700Schasinglulu void (*unlock)(const struct regul_description *desc); 86*91f16700Schasinglulu }; 87*91f16700Schasinglulu 88*91f16700Schasinglulu int regulator_register(const struct regul_description *desc, int node); 89*91f16700Schasinglulu 90*91f16700Schasinglulu /* 91*91f16700Schasinglulu * Internal regulator structure 92*91f16700Schasinglulu * The structure is internal to the core, and the content should not be used 93*91f16700Schasinglulu * by a consumer nor a driver. 94*91f16700Schasinglulu */ 95*91f16700Schasinglulu struct rdev { 96*91f16700Schasinglulu const struct regul_description *desc; 97*91f16700Schasinglulu 98*91f16700Schasinglulu int32_t phandle; 99*91f16700Schasinglulu 100*91f16700Schasinglulu uint16_t min_mv; 101*91f16700Schasinglulu uint16_t max_mv; 102*91f16700Schasinglulu 103*91f16700Schasinglulu uint16_t flags; 104*91f16700Schasinglulu 105*91f16700Schasinglulu uint32_t enable_ramp_delay; 106*91f16700Schasinglulu }; 107*91f16700Schasinglulu 108*91f16700Schasinglulu #endif /* REGULATOR_H */ 109