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