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