1*af41e8dbSPrzemyslaw Marczak /* 2*af41e8dbSPrzemyslaw Marczak * Copyright (C) 2014-2015 Samsung Electronics 3*af41e8dbSPrzemyslaw Marczak * Przemyslaw Marczak <p.marczak@samsung.com> 4*af41e8dbSPrzemyslaw Marczak * 5*af41e8dbSPrzemyslaw Marczak * SPDX-License-Identifier: GPL-2.0+ 6*af41e8dbSPrzemyslaw Marczak */ 7*af41e8dbSPrzemyslaw Marczak 8*af41e8dbSPrzemyslaw Marczak #ifndef _INCLUDE_REGULATOR_H_ 9*af41e8dbSPrzemyslaw Marczak #define _INCLUDE_REGULATOR_H_ 10*af41e8dbSPrzemyslaw Marczak 11*af41e8dbSPrzemyslaw Marczak /** 12*af41e8dbSPrzemyslaw Marczak * U-Boot Voltage/Current Regulator 13*af41e8dbSPrzemyslaw Marczak * ================================ 14*af41e8dbSPrzemyslaw Marczak * 15*af41e8dbSPrzemyslaw Marczak * The regulator API is based on a driver model, with the device tree support. 16*af41e8dbSPrzemyslaw Marczak * And this header describes the functions and data types for the uclass id: 17*af41e8dbSPrzemyslaw Marczak * 'UCLASS_REGULATOR' and the regulator driver API. 18*af41e8dbSPrzemyslaw Marczak * 19*af41e8dbSPrzemyslaw Marczak * The regulator uclass - is based on uclass platform data which is allocated, 20*af41e8dbSPrzemyslaw Marczak * automatically for each regulator device on bind and 'dev->uclass_platdata' 21*af41e8dbSPrzemyslaw Marczak * points to it. The data type is: 'struct dm_regulator_uclass_platdata'. 22*af41e8dbSPrzemyslaw Marczak * The uclass file: 'drivers/power/regulator/regulator-uclass.c' 23*af41e8dbSPrzemyslaw Marczak * 24*af41e8dbSPrzemyslaw Marczak * The regulator device - is based on driver's model 'struct udevice'. 25*af41e8dbSPrzemyslaw Marczak * The API can use regulator name in two meanings: 26*af41e8dbSPrzemyslaw Marczak * - devname - the regulator device's name: 'dev->name' 27*af41e8dbSPrzemyslaw Marczak * - platname - the device's platdata's name. So in the code it looks like: 28*af41e8dbSPrzemyslaw Marczak * 'uc_pdata = dev->uclass_platdata'; 'name = uc_pdata->name'. 29*af41e8dbSPrzemyslaw Marczak * 30*af41e8dbSPrzemyslaw Marczak * The regulator device driver - provide an implementation of uclass operations 31*af41e8dbSPrzemyslaw Marczak * pointed by 'dev->driver->ops' as a struct of type 'struct dm_regulator_ops'. 32*af41e8dbSPrzemyslaw Marczak * 33*af41e8dbSPrzemyslaw Marczak * To proper bind the regulator device, the device tree node should provide 34*af41e8dbSPrzemyslaw Marczak * regulator constraints, like in the example below: 35*af41e8dbSPrzemyslaw Marczak * 36*af41e8dbSPrzemyslaw Marczak * ldo1 { 37*af41e8dbSPrzemyslaw Marczak * regulator-name = "VDD_MMC_1.8V"; (mandatory for bind) 38*af41e8dbSPrzemyslaw Marczak * regulator-min-microvolt = <1000000>; (optional) 39*af41e8dbSPrzemyslaw Marczak * regulator-max-microvolt = <1000000>; (optional) 40*af41e8dbSPrzemyslaw Marczak * regulator-min-microamp = <1000>; (optional) 41*af41e8dbSPrzemyslaw Marczak * regulator-max-microamp = <1000>; (optional) 42*af41e8dbSPrzemyslaw Marczak * regulator-always-on; (optional) 43*af41e8dbSPrzemyslaw Marczak * regulator-boot-on; (optional) 44*af41e8dbSPrzemyslaw Marczak * }; 45*af41e8dbSPrzemyslaw Marczak * 46*af41e8dbSPrzemyslaw Marczak * Please take a notice, that for the proper operation at least name constraint 47*af41e8dbSPrzemyslaw Marczak * is needed, e.g. for call the device_by_platname(...). 48*af41e8dbSPrzemyslaw Marczak * 49*af41e8dbSPrzemyslaw Marczak * Regulator bind: 50*af41e8dbSPrzemyslaw Marczak * For each regulator device, the device_bind() should be called with passed 51*af41e8dbSPrzemyslaw Marczak * device tree offset. This is required for this uclass's '.post_bind' method, 52*af41e8dbSPrzemyslaw Marczak * which do the scan on the device node, for the 'regulator-name' constraint. 53*af41e8dbSPrzemyslaw Marczak * If the parent is not a PMIC device, and the child is not bind by function: 54*af41e8dbSPrzemyslaw Marczak * 'pmic_bind_childs()', then it's recommended to bind the device by call to 55*af41e8dbSPrzemyslaw Marczak * dm_scan_fdt_node() - this is usually done automatically for bus devices, 56*af41e8dbSPrzemyslaw Marczak * as a post bind method. 57*af41e8dbSPrzemyslaw Marczak * Having the device's name constraint, we can call regulator_by_platname(), 58*af41e8dbSPrzemyslaw Marczak * to find interesting regulator. Before return, the regulator is probed, 59*af41e8dbSPrzemyslaw Marczak * and the rest of its constraints are put into the device's uclass platform 60*af41e8dbSPrzemyslaw Marczak * data, by the uclass regulator '.pre_probe' method. 61*af41e8dbSPrzemyslaw Marczak * 62*af41e8dbSPrzemyslaw Marczak * For more info about PMIC bind, please refer to file: 'include/power/pmic.h' 63*af41e8dbSPrzemyslaw Marczak * 64*af41e8dbSPrzemyslaw Marczak * Note: 65*af41e8dbSPrzemyslaw Marczak * Please do not use the device_bind_by_name() function, since it pass '-1' as 66*af41e8dbSPrzemyslaw Marczak * device node offset - and the bind will fail on uclass .post_bind method, 67*af41e8dbSPrzemyslaw Marczak * because of missing 'regulator-name' constraint. 68*af41e8dbSPrzemyslaw Marczak * 69*af41e8dbSPrzemyslaw Marczak * 70*af41e8dbSPrzemyslaw Marczak * Fixed Voltage/Current Regulator 71*af41e8dbSPrzemyslaw Marczak * =============================== 72*af41e8dbSPrzemyslaw Marczak * 73*af41e8dbSPrzemyslaw Marczak * When fixed voltage regulator is needed, then enable the config: 74*af41e8dbSPrzemyslaw Marczak * - CONFIG_DM_REGULATOR_FIXED 75*af41e8dbSPrzemyslaw Marczak * 76*af41e8dbSPrzemyslaw Marczak * The driver file: 'drivers/power/regulator/fixed.c', provides basic support 77*af41e8dbSPrzemyslaw Marczak * for control the GPIO, and return the device tree constraint values. 78*af41e8dbSPrzemyslaw Marczak * 79*af41e8dbSPrzemyslaw Marczak * To bind the fixed voltage regulator device, we usually use a 'simple-bus' 80*af41e8dbSPrzemyslaw Marczak * node as a parent. And 'regulator-fixed' for the driver compatible. This is 81*af41e8dbSPrzemyslaw Marczak * the same as in the kernel. The example node of fixed regulator: 82*af41e8dbSPrzemyslaw Marczak * 83*af41e8dbSPrzemyslaw Marczak * simple-bus { 84*af41e8dbSPrzemyslaw Marczak * compatible = "simple-bus"; 85*af41e8dbSPrzemyslaw Marczak * #address-cells = <1>; 86*af41e8dbSPrzemyslaw Marczak * #size-cells = <0>; 87*af41e8dbSPrzemyslaw Marczak * 88*af41e8dbSPrzemyslaw Marczak * blue_led { 89*af41e8dbSPrzemyslaw Marczak * compatible = "regulator-fixed"; 90*af41e8dbSPrzemyslaw Marczak * regulator-name = "VDD_LED_3.3V"; 91*af41e8dbSPrzemyslaw Marczak * regulator-min-microvolt = <3300000>; 92*af41e8dbSPrzemyslaw Marczak * regulator-max-microvolt = <3300000>; 93*af41e8dbSPrzemyslaw Marczak * gpio = <&gpc1 0 GPIO_ACTIVE_LOW>; 94*af41e8dbSPrzemyslaw Marczak * }; 95*af41e8dbSPrzemyslaw Marczak * }; 96*af41e8dbSPrzemyslaw Marczak * 97*af41e8dbSPrzemyslaw Marczak * The fixed regulator devices also provide regulator uclass platform data. And 98*af41e8dbSPrzemyslaw Marczak * devices bound from such node, can use the regulator drivers API. 99*af41e8dbSPrzemyslaw Marczak */ 100*af41e8dbSPrzemyslaw Marczak 101*af41e8dbSPrzemyslaw Marczak /* enum regulator_type - used for regulator_*() variant calls */ 102*af41e8dbSPrzemyslaw Marczak enum regulator_type { 103*af41e8dbSPrzemyslaw Marczak REGULATOR_TYPE_LDO = 0, 104*af41e8dbSPrzemyslaw Marczak REGULATOR_TYPE_BUCK, 105*af41e8dbSPrzemyslaw Marczak REGULATOR_TYPE_DVS, 106*af41e8dbSPrzemyslaw Marczak REGULATOR_TYPE_FIXED, 107*af41e8dbSPrzemyslaw Marczak REGULATOR_TYPE_OTHER, 108*af41e8dbSPrzemyslaw Marczak }; 109*af41e8dbSPrzemyslaw Marczak 110*af41e8dbSPrzemyslaw Marczak /** 111*af41e8dbSPrzemyslaw Marczak * struct dm_regulator_mode - this structure holds an information about 112*af41e8dbSPrzemyslaw Marczak * each regulator operation mode. Probably in most cases - an array. 113*af41e8dbSPrzemyslaw Marczak * This will be probably a driver-static data, since it is device-specific. 114*af41e8dbSPrzemyslaw Marczak * 115*af41e8dbSPrzemyslaw Marczak * @id - a driver-specific mode id 116*af41e8dbSPrzemyslaw Marczak * @register_value - a driver-specific value for its mode id 117*af41e8dbSPrzemyslaw Marczak * @name - the name of mode - used for regulator command 118*af41e8dbSPrzemyslaw Marczak * Note: 119*af41e8dbSPrzemyslaw Marczak * The field 'id', should be always a positive number, since the negative values 120*af41e8dbSPrzemyslaw Marczak * are reserved for the errno numbers when returns the mode id. 121*af41e8dbSPrzemyslaw Marczak */ 122*af41e8dbSPrzemyslaw Marczak struct dm_regulator_mode { 123*af41e8dbSPrzemyslaw Marczak int id; /* Set only as >= 0 (negative value is reserved for errno) */ 124*af41e8dbSPrzemyslaw Marczak int register_value; 125*af41e8dbSPrzemyslaw Marczak const char *name; 126*af41e8dbSPrzemyslaw Marczak }; 127*af41e8dbSPrzemyslaw Marczak 128*af41e8dbSPrzemyslaw Marczak /** 129*af41e8dbSPrzemyslaw Marczak * struct dm_regulator_uclass_platdata - pointed by dev->uclass_platdata, and 130*af41e8dbSPrzemyslaw Marczak * allocated on each regulator bind. This structure holds an information 131*af41e8dbSPrzemyslaw Marczak * about each regulator's constraints and supported operation modes. 132*af41e8dbSPrzemyslaw Marczak * There is no "step" voltage value - so driver should take care of this. 133*af41e8dbSPrzemyslaw Marczak * 134*af41e8dbSPrzemyslaw Marczak * @type - one of 'enum regulator_type' 135*af41e8dbSPrzemyslaw Marczak * @mode - pointer to the regulator mode (array if more than one) 136*af41e8dbSPrzemyslaw Marczak * @mode_count - number of '.mode' entries 137*af41e8dbSPrzemyslaw Marczak * @min_uV* - minimum voltage (micro Volts) 138*af41e8dbSPrzemyslaw Marczak * @max_uV* - maximum voltage (micro Volts) 139*af41e8dbSPrzemyslaw Marczak * @min_uA* - minimum amperage (micro Amps) 140*af41e8dbSPrzemyslaw Marczak * @max_uA* - maximum amperage (micro Amps) 141*af41e8dbSPrzemyslaw Marczak * @always_on* - bool type, true or false 142*af41e8dbSPrzemyslaw Marczak * @boot_on* - bool type, true or false 143*af41e8dbSPrzemyslaw Marczak * @name** - fdt regulator name - should be taken from the device tree 144*af41e8dbSPrzemyslaw Marczak * 145*af41e8dbSPrzemyslaw Marczak * Note: 146*af41e8dbSPrzemyslaw Marczak * * - set automatically on device probe by the uclass's '.pre_probe' method. 147*af41e8dbSPrzemyslaw Marczak * ** - set automatically on device bind by the uclass's '.post_bind' method. 148*af41e8dbSPrzemyslaw Marczak * The constraints: type, mode, mode_count, can be set by device driver, e.g. 149*af41e8dbSPrzemyslaw Marczak * by the driver '.probe' method. 150*af41e8dbSPrzemyslaw Marczak */ 151*af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata { 152*af41e8dbSPrzemyslaw Marczak enum regulator_type type; 153*af41e8dbSPrzemyslaw Marczak struct dm_regulator_mode *mode; 154*af41e8dbSPrzemyslaw Marczak int mode_count; 155*af41e8dbSPrzemyslaw Marczak int min_uV; 156*af41e8dbSPrzemyslaw Marczak int max_uV; 157*af41e8dbSPrzemyslaw Marczak int min_uA; 158*af41e8dbSPrzemyslaw Marczak int max_uA; 159*af41e8dbSPrzemyslaw Marczak bool always_on; 160*af41e8dbSPrzemyslaw Marczak bool boot_on; 161*af41e8dbSPrzemyslaw Marczak const char *name; 162*af41e8dbSPrzemyslaw Marczak }; 163*af41e8dbSPrzemyslaw Marczak 164*af41e8dbSPrzemyslaw Marczak /* Regulator device operations */ 165*af41e8dbSPrzemyslaw Marczak struct dm_regulator_ops { 166*af41e8dbSPrzemyslaw Marczak /** 167*af41e8dbSPrzemyslaw Marczak * The regulator output value function calls operates on a micro Volts. 168*af41e8dbSPrzemyslaw Marczak * 169*af41e8dbSPrzemyslaw Marczak * get/set_value - get/set output value of the given output number 170*af41e8dbSPrzemyslaw Marczak * @dev - regulator device 171*af41e8dbSPrzemyslaw Marczak * Sets: 172*af41e8dbSPrzemyslaw Marczak * @uV - set the output value [micro Volts] 173*af41e8dbSPrzemyslaw Marczak * Returns: output value [uV] on success or negative errno if fail. 174*af41e8dbSPrzemyslaw Marczak */ 175*af41e8dbSPrzemyslaw Marczak int (*get_value)(struct udevice *dev); 176*af41e8dbSPrzemyslaw Marczak int (*set_value)(struct udevice *dev, int uV); 177*af41e8dbSPrzemyslaw Marczak 178*af41e8dbSPrzemyslaw Marczak /** 179*af41e8dbSPrzemyslaw Marczak * The regulator output current function calls operates on a micro Amps. 180*af41e8dbSPrzemyslaw Marczak * 181*af41e8dbSPrzemyslaw Marczak * get/set_current - get/set output current of the given output number 182*af41e8dbSPrzemyslaw Marczak * @dev - regulator device 183*af41e8dbSPrzemyslaw Marczak * Sets: 184*af41e8dbSPrzemyslaw Marczak * @uA - set the output current [micro Amps] 185*af41e8dbSPrzemyslaw Marczak * Returns: output value [uA] on success or negative errno if fail. 186*af41e8dbSPrzemyslaw Marczak */ 187*af41e8dbSPrzemyslaw Marczak int (*get_current)(struct udevice *dev); 188*af41e8dbSPrzemyslaw Marczak int (*set_current)(struct udevice *dev, int uA); 189*af41e8dbSPrzemyslaw Marczak 190*af41e8dbSPrzemyslaw Marczak /** 191*af41e8dbSPrzemyslaw Marczak * The most basic feature of the regulator output is its enable state. 192*af41e8dbSPrzemyslaw Marczak * 193*af41e8dbSPrzemyslaw Marczak * get/set_enable - get/set enable state of the given output number 194*af41e8dbSPrzemyslaw Marczak * @dev - regulator device 195*af41e8dbSPrzemyslaw Marczak * Sets: 196*af41e8dbSPrzemyslaw Marczak * @enable - set true - enable or false - disable 197*af41e8dbSPrzemyslaw Marczak * Returns: true/false for get; or 0 / -errno for set. 198*af41e8dbSPrzemyslaw Marczak */ 199*af41e8dbSPrzemyslaw Marczak bool (*get_enable)(struct udevice *dev); 200*af41e8dbSPrzemyslaw Marczak int (*set_enable)(struct udevice *dev, bool enable); 201*af41e8dbSPrzemyslaw Marczak 202*af41e8dbSPrzemyslaw Marczak /** 203*af41e8dbSPrzemyslaw Marczak * The 'get/set_mode()' function calls should operate on a driver 204*af41e8dbSPrzemyslaw Marczak * specific mode definitions, which should be found in: 205*af41e8dbSPrzemyslaw Marczak * field 'mode' of struct mode_desc. 206*af41e8dbSPrzemyslaw Marczak * 207*af41e8dbSPrzemyslaw Marczak * get/set_mode - get/set operation mode of the given output number 208*af41e8dbSPrzemyslaw Marczak * @dev - regulator device 209*af41e8dbSPrzemyslaw Marczak * Sets 210*af41e8dbSPrzemyslaw Marczak * @mode_id - set output mode id (struct dm_regulator_mode->id) 211*af41e8dbSPrzemyslaw Marczak * Returns: id/0 for get/set on success or negative errno if fail. 212*af41e8dbSPrzemyslaw Marczak * Note: 213*af41e8dbSPrzemyslaw Marczak * The field 'id' of struct type 'dm_regulator_mode', should be always 214*af41e8dbSPrzemyslaw Marczak * positive number, since the negative is reserved for the error. 215*af41e8dbSPrzemyslaw Marczak */ 216*af41e8dbSPrzemyslaw Marczak int (*get_mode)(struct udevice *dev); 217*af41e8dbSPrzemyslaw Marczak int (*set_mode)(struct udevice *dev, int mode_id); 218*af41e8dbSPrzemyslaw Marczak }; 219*af41e8dbSPrzemyslaw Marczak 220*af41e8dbSPrzemyslaw Marczak /** 221*af41e8dbSPrzemyslaw Marczak * regulator_mode: returns a pointer to the array of regulator mode info 222*af41e8dbSPrzemyslaw Marczak * 223*af41e8dbSPrzemyslaw Marczak * @dev - pointer to the regulator device 224*af41e8dbSPrzemyslaw Marczak * @modep - pointer to the returned mode info array 225*af41e8dbSPrzemyslaw Marczak * Returns - count of modep entries on success or negative errno if fail. 226*af41e8dbSPrzemyslaw Marczak */ 227*af41e8dbSPrzemyslaw Marczak int regulator_mode(struct udevice *dev, struct dm_regulator_mode **modep); 228*af41e8dbSPrzemyslaw Marczak 229*af41e8dbSPrzemyslaw Marczak /** 230*af41e8dbSPrzemyslaw Marczak * regulator_get_value: get microvoltage voltage value of a given regulator 231*af41e8dbSPrzemyslaw Marczak * 232*af41e8dbSPrzemyslaw Marczak * @dev - pointer to the regulator device 233*af41e8dbSPrzemyslaw Marczak * Returns - positive output value [uV] on success or negative errno if fail. 234*af41e8dbSPrzemyslaw Marczak */ 235*af41e8dbSPrzemyslaw Marczak int regulator_get_value(struct udevice *dev); 236*af41e8dbSPrzemyslaw Marczak 237*af41e8dbSPrzemyslaw Marczak /** 238*af41e8dbSPrzemyslaw Marczak * regulator_set_value: set the microvoltage value of a given regulator. 239*af41e8dbSPrzemyslaw Marczak * 240*af41e8dbSPrzemyslaw Marczak * @dev - pointer to the regulator device 241*af41e8dbSPrzemyslaw Marczak * @uV - the output value to set [micro Volts] 242*af41e8dbSPrzemyslaw Marczak * Returns - 0 on success or -errno val if fails 243*af41e8dbSPrzemyslaw Marczak */ 244*af41e8dbSPrzemyslaw Marczak int regulator_set_value(struct udevice *dev, int uV); 245*af41e8dbSPrzemyslaw Marczak 246*af41e8dbSPrzemyslaw Marczak /** 247*af41e8dbSPrzemyslaw Marczak * regulator_get_current: get microampere value of a given regulator 248*af41e8dbSPrzemyslaw Marczak * 249*af41e8dbSPrzemyslaw Marczak * @dev - pointer to the regulator device 250*af41e8dbSPrzemyslaw Marczak * Returns - positive output current [uA] on success or negative errno if fail. 251*af41e8dbSPrzemyslaw Marczak */ 252*af41e8dbSPrzemyslaw Marczak int regulator_get_current(struct udevice *dev); 253*af41e8dbSPrzemyslaw Marczak 254*af41e8dbSPrzemyslaw Marczak /** 255*af41e8dbSPrzemyslaw Marczak * regulator_set_current: set the microampere value of a given regulator. 256*af41e8dbSPrzemyslaw Marczak * 257*af41e8dbSPrzemyslaw Marczak * @dev - pointer to the regulator device 258*af41e8dbSPrzemyslaw Marczak * @uA - set the output current [micro Amps] 259*af41e8dbSPrzemyslaw Marczak * Returns - 0 on success or -errno val if fails 260*af41e8dbSPrzemyslaw Marczak */ 261*af41e8dbSPrzemyslaw Marczak int regulator_set_current(struct udevice *dev, int uA); 262*af41e8dbSPrzemyslaw Marczak 263*af41e8dbSPrzemyslaw Marczak /** 264*af41e8dbSPrzemyslaw Marczak * regulator_get_enable: get regulator device enable state. 265*af41e8dbSPrzemyslaw Marczak * 266*af41e8dbSPrzemyslaw Marczak * @dev - pointer to the regulator device 267*af41e8dbSPrzemyslaw Marczak * Returns - true/false of enable state 268*af41e8dbSPrzemyslaw Marczak */ 269*af41e8dbSPrzemyslaw Marczak bool regulator_get_enable(struct udevice *dev); 270*af41e8dbSPrzemyslaw Marczak 271*af41e8dbSPrzemyslaw Marczak /** 272*af41e8dbSPrzemyslaw Marczak * regulator_set_enable: set regulator enable state 273*af41e8dbSPrzemyslaw Marczak * 274*af41e8dbSPrzemyslaw Marczak * @dev - pointer to the regulator device 275*af41e8dbSPrzemyslaw Marczak * @enable - set true or false 276*af41e8dbSPrzemyslaw Marczak * Returns - 0 on success or -errno val if fails 277*af41e8dbSPrzemyslaw Marczak */ 278*af41e8dbSPrzemyslaw Marczak int regulator_set_enable(struct udevice *dev, bool enable); 279*af41e8dbSPrzemyslaw Marczak 280*af41e8dbSPrzemyslaw Marczak /** 281*af41e8dbSPrzemyslaw Marczak * regulator_get_mode: get mode of a given device regulator 282*af41e8dbSPrzemyslaw Marczak * 283*af41e8dbSPrzemyslaw Marczak * @dev - pointer to the regulator device 284*af41e8dbSPrzemyslaw Marczak * Returns - positive mode number on success or -errno val if fails 285*af41e8dbSPrzemyslaw Marczak * Note: 286*af41e8dbSPrzemyslaw Marczak * The regulator driver should return one of defined, mode number rather, than 287*af41e8dbSPrzemyslaw Marczak * the raw register value. The struct type 'mode_desc' provides a field 'mode' 288*af41e8dbSPrzemyslaw Marczak * for this purpose and register_value for a raw register value. 289*af41e8dbSPrzemyslaw Marczak */ 290*af41e8dbSPrzemyslaw Marczak int regulator_get_mode(struct udevice *dev); 291*af41e8dbSPrzemyslaw Marczak 292*af41e8dbSPrzemyslaw Marczak /** 293*af41e8dbSPrzemyslaw Marczak * regulator_set_mode: set given regulator mode 294*af41e8dbSPrzemyslaw Marczak * 295*af41e8dbSPrzemyslaw Marczak * @dev - pointer to the regulator device 296*af41e8dbSPrzemyslaw Marczak * @mode - mode type (field 'mode' of struct mode_desc) 297*af41e8dbSPrzemyslaw Marczak * Returns - 0 on success or -errno value if fails 298*af41e8dbSPrzemyslaw Marczak * Note: 299*af41e8dbSPrzemyslaw Marczak * The regulator driver should take one of defined, mode number rather 300*af41e8dbSPrzemyslaw Marczak * than a raw register value. The struct type 'regulator_mode_desc' has 301*af41e8dbSPrzemyslaw Marczak * a mode field for this purpose and register_value for a raw register value. 302*af41e8dbSPrzemyslaw Marczak */ 303*af41e8dbSPrzemyslaw Marczak int regulator_set_mode(struct udevice *dev, int mode); 304*af41e8dbSPrzemyslaw Marczak 305*af41e8dbSPrzemyslaw Marczak /** 306*af41e8dbSPrzemyslaw Marczak * regulator_by_platname_autoset_and_enable: setup the regulator given by 307*af41e8dbSPrzemyslaw Marczak * its uclass's platform data '.name'. The setup depends on constraints found 308*af41e8dbSPrzemyslaw Marczak * in device's uclass's platform data (struct dm_regulator_uclass_platdata): 309*af41e8dbSPrzemyslaw Marczak * - Voltage value - will set - if '.min_uV' and '.max_uV' values are equal 310*af41e8dbSPrzemyslaw Marczak * - Current limit - will set - if '.min_uA' and '.max_uA' values are equal 311*af41e8dbSPrzemyslaw Marczak * - Enable - will set - if '.always_on' or '.boot_on' are set to true 312*af41e8dbSPrzemyslaw Marczak * 313*af41e8dbSPrzemyslaw Marczak * The function returns on first encountered error. 314*af41e8dbSPrzemyslaw Marczak * 315*af41e8dbSPrzemyslaw Marczak * @platname - expected string for dm_regulator_uclass_platdata .name field 316*af41e8dbSPrzemyslaw Marczak * @devp - returned pointer to the regulator device - if non-NULL passed 317*af41e8dbSPrzemyslaw Marczak * @verbose - (true/false) print regulator setup info, or be quiet 318*af41e8dbSPrzemyslaw Marczak * Returns: 0 on success or negative value of errno. 319*af41e8dbSPrzemyslaw Marczak * 320*af41e8dbSPrzemyslaw Marczak * The returned 'regulator' device can be used with: 321*af41e8dbSPrzemyslaw Marczak * - regulator_get/set_* 322*af41e8dbSPrzemyslaw Marczak * For shorter call name, the below macro regulator_autoset() can be used. 323*af41e8dbSPrzemyslaw Marczak */ 324*af41e8dbSPrzemyslaw Marczak int regulator_by_platname_autoset_and_enable(const char *platname, 325*af41e8dbSPrzemyslaw Marczak struct udevice **devp, 326*af41e8dbSPrzemyslaw Marczak bool verbose); 327*af41e8dbSPrzemyslaw Marczak 328*af41e8dbSPrzemyslaw Marczak #define regulator_autoset(platname, devp, verbose) \ 329*af41e8dbSPrzemyslaw Marczak regulator_by_platname_autoset_and_enable(platname, devp, verbose) 330*af41e8dbSPrzemyslaw Marczak 331*af41e8dbSPrzemyslaw Marczak /** 332*af41e8dbSPrzemyslaw Marczak * regulator_by_platname_list_autoset_and_enable: setup the regulators given by 333*af41e8dbSPrzemyslaw Marczak * list of its uclass's platform data '.name'. The setup depends on constraints 334*af41e8dbSPrzemyslaw Marczak * found in device's uclass's platform data. The function loops with calls to: 335*af41e8dbSPrzemyslaw Marczak * regulator_by_platname_autoset_and_enable() for each name of list. 336*af41e8dbSPrzemyslaw Marczak * 337*af41e8dbSPrzemyslaw Marczak * @list_platname - an array of expected strings for .name field of each 338*af41e8dbSPrzemyslaw Marczak * regulator's uclass platdata 339*af41e8dbSPrzemyslaw Marczak * @list_entries - number of regulator's name list entries 340*af41e8dbSPrzemyslaw Marczak * @list_devp - an array of returned pointers to the successfully setup 341*af41e8dbSPrzemyslaw Marczak * regulator devices if non-NULL passed 342*af41e8dbSPrzemyslaw Marczak * @verbose - (true/false) print each regulator setup info, or be quiet 343*af41e8dbSPrzemyslaw Marczak * Returns: 0 on successfully setup of all list entries or 1 otwerwise. 344*af41e8dbSPrzemyslaw Marczak * 345*af41e8dbSPrzemyslaw Marczak * The returned 'regulator' devices can be used with: 346*af41e8dbSPrzemyslaw Marczak * - regulator_get/set_* 347*af41e8dbSPrzemyslaw Marczak * For shorter call name, the below macro regulator_list_autoset() can be used. 348*af41e8dbSPrzemyslaw Marczak */ 349*af41e8dbSPrzemyslaw Marczak int regulator_by_platname_list_autoset_and_enable(const char *list_platname[], 350*af41e8dbSPrzemyslaw Marczak int list_entries, 351*af41e8dbSPrzemyslaw Marczak struct udevice *list_devp[], 352*af41e8dbSPrzemyslaw Marczak bool verbose); 353*af41e8dbSPrzemyslaw Marczak 354*af41e8dbSPrzemyslaw Marczak #define regulator_list_autoset(namelist, entries, devlist, verbose) \ 355*af41e8dbSPrzemyslaw Marczak regulator_by_platname_list_autoset_and_enable(namelist, entries, \ 356*af41e8dbSPrzemyslaw Marczak devlist, verbose) 357*af41e8dbSPrzemyslaw Marczak 358*af41e8dbSPrzemyslaw Marczak /** 359*af41e8dbSPrzemyslaw Marczak * regulator_by_devname: returns the pointer to the pmic regulator device. 360*af41e8dbSPrzemyslaw Marczak * Search by name, found in regulator device's name. 361*af41e8dbSPrzemyslaw Marczak * 362*af41e8dbSPrzemyslaw Marczak * @devname - expected string for 'dev->name' of regulator device 363*af41e8dbSPrzemyslaw Marczak * @devp - returned pointer to the regulator device 364*af41e8dbSPrzemyslaw Marczak * Returns: 0 on success or negative value of errno. 365*af41e8dbSPrzemyslaw Marczak * 366*af41e8dbSPrzemyslaw Marczak * The returned 'regulator' device can be used with: 367*af41e8dbSPrzemyslaw Marczak * - regulator_get/set_* 368*af41e8dbSPrzemyslaw Marczak */ 369*af41e8dbSPrzemyslaw Marczak int regulator_by_devname(const char *devname, struct udevice **devp); 370*af41e8dbSPrzemyslaw Marczak 371*af41e8dbSPrzemyslaw Marczak /** 372*af41e8dbSPrzemyslaw Marczak * regulator_by_platname: returns the pointer to the pmic regulator device. 373*af41e8dbSPrzemyslaw Marczak * Search by name, found in regulator uclass platdata. 374*af41e8dbSPrzemyslaw Marczak * 375*af41e8dbSPrzemyslaw Marczak * @platname - expected string for dm_regulator_uclass_platdata .name field 376*af41e8dbSPrzemyslaw Marczak * @devp - returned pointer to the regulator device 377*af41e8dbSPrzemyslaw Marczak * Returns: 0 on success or negative value of errno. 378*af41e8dbSPrzemyslaw Marczak * 379*af41e8dbSPrzemyslaw Marczak * The returned 'regulator' device can be used with: 380*af41e8dbSPrzemyslaw Marczak * - regulator_get/set_* 381*af41e8dbSPrzemyslaw Marczak */ 382*af41e8dbSPrzemyslaw Marczak int regulator_by_platname(const char *platname, struct udevice **devp); 383*af41e8dbSPrzemyslaw Marczak 384*af41e8dbSPrzemyslaw Marczak #endif /* _INCLUDE_REGULATOR_H_ */ 385