1af41e8dbSPrzemyslaw Marczak /* 2af41e8dbSPrzemyslaw Marczak * Copyright (C) 2014-2015 Samsung Electronics 3af41e8dbSPrzemyslaw Marczak * Przemyslaw Marczak <p.marczak@samsung.com> 4af41e8dbSPrzemyslaw Marczak * 5af41e8dbSPrzemyslaw Marczak * SPDX-License-Identifier: GPL-2.0+ 6af41e8dbSPrzemyslaw Marczak */ 7*f15cd4f1SSimon Glass 8af41e8dbSPrzemyslaw Marczak #include <common.h> 9af41e8dbSPrzemyslaw Marczak #include <errno.h> 10af41e8dbSPrzemyslaw Marczak #include <dm.h> 11af41e8dbSPrzemyslaw Marczak #include <dm/uclass-internal.h> 12af41e8dbSPrzemyslaw Marczak #include <power/pmic.h> 13af41e8dbSPrzemyslaw Marczak #include <power/regulator.h> 14af41e8dbSPrzemyslaw Marczak 15af41e8dbSPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR; 16af41e8dbSPrzemyslaw Marczak 17af41e8dbSPrzemyslaw Marczak int regulator_mode(struct udevice *dev, struct dm_regulator_mode **modep) 18af41e8dbSPrzemyslaw Marczak { 19af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 20af41e8dbSPrzemyslaw Marczak 21af41e8dbSPrzemyslaw Marczak *modep = NULL; 22af41e8dbSPrzemyslaw Marczak 23af41e8dbSPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 24af41e8dbSPrzemyslaw Marczak if (!uc_pdata) 25af41e8dbSPrzemyslaw Marczak return -ENXIO; 26af41e8dbSPrzemyslaw Marczak 27af41e8dbSPrzemyslaw Marczak *modep = uc_pdata->mode; 28af41e8dbSPrzemyslaw Marczak return uc_pdata->mode_count; 29af41e8dbSPrzemyslaw Marczak } 30af41e8dbSPrzemyslaw Marczak 31af41e8dbSPrzemyslaw Marczak int regulator_get_value(struct udevice *dev) 32af41e8dbSPrzemyslaw Marczak { 33af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 34af41e8dbSPrzemyslaw Marczak 35af41e8dbSPrzemyslaw Marczak if (!ops || !ops->get_value) 36af41e8dbSPrzemyslaw Marczak return -ENOSYS; 37af41e8dbSPrzemyslaw Marczak 38af41e8dbSPrzemyslaw Marczak return ops->get_value(dev); 39af41e8dbSPrzemyslaw Marczak } 40af41e8dbSPrzemyslaw Marczak 41af41e8dbSPrzemyslaw Marczak int regulator_set_value(struct udevice *dev, int uV) 42af41e8dbSPrzemyslaw Marczak { 43af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 44eaadcf38SKeerthy struct dm_regulator_uclass_platdata *uc_pdata; 45eaadcf38SKeerthy 46eaadcf38SKeerthy uc_pdata = dev_get_uclass_platdata(dev); 47eaadcf38SKeerthy if (uc_pdata->min_uV != -ENODATA && uV < uc_pdata->min_uV) 48eaadcf38SKeerthy return -EINVAL; 49eaadcf38SKeerthy if (uc_pdata->max_uV != -ENODATA && uV > uc_pdata->max_uV) 50eaadcf38SKeerthy return -EINVAL; 51af41e8dbSPrzemyslaw Marczak 52af41e8dbSPrzemyslaw Marczak if (!ops || !ops->set_value) 53af41e8dbSPrzemyslaw Marczak return -ENOSYS; 54af41e8dbSPrzemyslaw Marczak 55af41e8dbSPrzemyslaw Marczak return ops->set_value(dev, uV); 56af41e8dbSPrzemyslaw Marczak } 57af41e8dbSPrzemyslaw Marczak 582f5d532fSKeerthy /* 592f5d532fSKeerthy * To be called with at most caution as there is no check 602f5d532fSKeerthy * before setting the actual voltage value. 612f5d532fSKeerthy */ 622f5d532fSKeerthy int regulator_set_value_force(struct udevice *dev, int uV) 632f5d532fSKeerthy { 642f5d532fSKeerthy const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 652f5d532fSKeerthy 662f5d532fSKeerthy if (!ops || !ops->set_value) 672f5d532fSKeerthy return -ENOSYS; 682f5d532fSKeerthy 692f5d532fSKeerthy return ops->set_value(dev, uV); 702f5d532fSKeerthy } 712f5d532fSKeerthy 72af41e8dbSPrzemyslaw Marczak int regulator_get_current(struct udevice *dev) 73af41e8dbSPrzemyslaw Marczak { 74af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 75af41e8dbSPrzemyslaw Marczak 76af41e8dbSPrzemyslaw Marczak if (!ops || !ops->get_current) 77af41e8dbSPrzemyslaw Marczak return -ENOSYS; 78af41e8dbSPrzemyslaw Marczak 79af41e8dbSPrzemyslaw Marczak return ops->get_current(dev); 80af41e8dbSPrzemyslaw Marczak } 81af41e8dbSPrzemyslaw Marczak 82af41e8dbSPrzemyslaw Marczak int regulator_set_current(struct udevice *dev, int uA) 83af41e8dbSPrzemyslaw Marczak { 84af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 855483456eSKeerthy struct dm_regulator_uclass_platdata *uc_pdata; 865483456eSKeerthy 875483456eSKeerthy uc_pdata = dev_get_uclass_platdata(dev); 885483456eSKeerthy if (uc_pdata->min_uA != -ENODATA && uA < uc_pdata->min_uA) 895483456eSKeerthy return -EINVAL; 905483456eSKeerthy if (uc_pdata->max_uA != -ENODATA && uA > uc_pdata->max_uA) 915483456eSKeerthy return -EINVAL; 92af41e8dbSPrzemyslaw Marczak 93af41e8dbSPrzemyslaw Marczak if (!ops || !ops->set_current) 94af41e8dbSPrzemyslaw Marczak return -ENOSYS; 95af41e8dbSPrzemyslaw Marczak 96af41e8dbSPrzemyslaw Marczak return ops->set_current(dev, uA); 97af41e8dbSPrzemyslaw Marczak } 98af41e8dbSPrzemyslaw Marczak 99af41e8dbSPrzemyslaw Marczak bool regulator_get_enable(struct udevice *dev) 100af41e8dbSPrzemyslaw Marczak { 101af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 102af41e8dbSPrzemyslaw Marczak 103af41e8dbSPrzemyslaw Marczak if (!ops || !ops->get_enable) 104af41e8dbSPrzemyslaw Marczak return -ENOSYS; 105af41e8dbSPrzemyslaw Marczak 106af41e8dbSPrzemyslaw Marczak return ops->get_enable(dev); 107af41e8dbSPrzemyslaw Marczak } 108af41e8dbSPrzemyslaw Marczak 109af41e8dbSPrzemyslaw Marczak int regulator_set_enable(struct udevice *dev, bool enable) 110af41e8dbSPrzemyslaw Marczak { 111af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 112af41e8dbSPrzemyslaw Marczak 113af41e8dbSPrzemyslaw Marczak if (!ops || !ops->set_enable) 114af41e8dbSPrzemyslaw Marczak return -ENOSYS; 115af41e8dbSPrzemyslaw Marczak 116af41e8dbSPrzemyslaw Marczak return ops->set_enable(dev, enable); 117af41e8dbSPrzemyslaw Marczak } 118af41e8dbSPrzemyslaw Marczak 119af41e8dbSPrzemyslaw Marczak int regulator_get_mode(struct udevice *dev) 120af41e8dbSPrzemyslaw Marczak { 121af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 122af41e8dbSPrzemyslaw Marczak 123af41e8dbSPrzemyslaw Marczak if (!ops || !ops->get_mode) 124af41e8dbSPrzemyslaw Marczak return -ENOSYS; 125af41e8dbSPrzemyslaw Marczak 126af41e8dbSPrzemyslaw Marczak return ops->get_mode(dev); 127af41e8dbSPrzemyslaw Marczak } 128af41e8dbSPrzemyslaw Marczak 129af41e8dbSPrzemyslaw Marczak int regulator_set_mode(struct udevice *dev, int mode) 130af41e8dbSPrzemyslaw Marczak { 131af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 132af41e8dbSPrzemyslaw Marczak 133af41e8dbSPrzemyslaw Marczak if (!ops || !ops->set_mode) 134af41e8dbSPrzemyslaw Marczak return -ENOSYS; 135af41e8dbSPrzemyslaw Marczak 136af41e8dbSPrzemyslaw Marczak return ops->set_mode(dev, mode); 137af41e8dbSPrzemyslaw Marczak } 138af41e8dbSPrzemyslaw Marczak 1393b880757SPrzemyslaw Marczak int regulator_get_by_platname(const char *plat_name, struct udevice **devp) 140af41e8dbSPrzemyslaw Marczak { 141af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 142af41e8dbSPrzemyslaw Marczak struct udevice *dev; 1433b880757SPrzemyslaw Marczak int ret; 144af41e8dbSPrzemyslaw Marczak 145af41e8dbSPrzemyslaw Marczak *devp = NULL; 146af41e8dbSPrzemyslaw Marczak 1473b880757SPrzemyslaw Marczak for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev; 1483b880757SPrzemyslaw Marczak ret = uclass_find_next_device(&dev)) { 1493b880757SPrzemyslaw Marczak if (ret) 1503b880757SPrzemyslaw Marczak continue; 1513b880757SPrzemyslaw Marczak 152af41e8dbSPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 153af41e8dbSPrzemyslaw Marczak if (!uc_pdata || strcmp(plat_name, uc_pdata->name)) 154af41e8dbSPrzemyslaw Marczak continue; 155af41e8dbSPrzemyslaw Marczak 156af41e8dbSPrzemyslaw Marczak return uclass_get_device_tail(dev, 0, devp); 157af41e8dbSPrzemyslaw Marczak } 158af41e8dbSPrzemyslaw Marczak 159af41e8dbSPrzemyslaw Marczak debug("%s: can't find: %s\n", __func__, plat_name); 160af41e8dbSPrzemyslaw Marczak 161af41e8dbSPrzemyslaw Marczak return -ENODEV; 162af41e8dbSPrzemyslaw Marczak } 163af41e8dbSPrzemyslaw Marczak 1643b880757SPrzemyslaw Marczak int regulator_get_by_devname(const char *devname, struct udevice **devp) 165af41e8dbSPrzemyslaw Marczak { 166af41e8dbSPrzemyslaw Marczak return uclass_get_device_by_name(UCLASS_REGULATOR, devname, devp); 167af41e8dbSPrzemyslaw Marczak } 168af41e8dbSPrzemyslaw Marczak 1697c816e24SPrzemyslaw Marczak int device_get_supply_regulator(struct udevice *dev, const char *supply_name, 1707c816e24SPrzemyslaw Marczak struct udevice **devp) 1717c816e24SPrzemyslaw Marczak { 1727c816e24SPrzemyslaw Marczak return uclass_get_device_by_phandle(UCLASS_REGULATOR, dev, 1737c816e24SPrzemyslaw Marczak supply_name, devp); 1747c816e24SPrzemyslaw Marczak } 1757c816e24SPrzemyslaw Marczak 1763b55d30fSSimon Glass int regulator_autoset(struct udevice *dev) 177af41e8dbSPrzemyslaw Marczak { 1783b55d30fSSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 1793b55d30fSSimon Glass int ret = 0; 180af41e8dbSPrzemyslaw Marczak 1813b55d30fSSimon Glass uc_pdata = dev_get_uclass_platdata(dev); 1823b55d30fSSimon Glass if (!uc_pdata->always_on && !uc_pdata->boot_on) 1833b55d30fSSimon Glass return -EMEDIUMTYPE; 184af41e8dbSPrzemyslaw Marczak 1853b55d30fSSimon Glass if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UV) 1863b55d30fSSimon Glass ret = regulator_set_value(dev, uc_pdata->min_uV); 1873b55d30fSSimon Glass if (!ret && (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UA)) 1883b55d30fSSimon Glass ret = regulator_set_current(dev, uc_pdata->min_uA); 189af41e8dbSPrzemyslaw Marczak 190af41e8dbSPrzemyslaw Marczak if (!ret) 1913b55d30fSSimon Glass ret = regulator_set_enable(dev, true); 192af41e8dbSPrzemyslaw Marczak 193af41e8dbSPrzemyslaw Marczak return ret; 194af41e8dbSPrzemyslaw Marczak } 195af41e8dbSPrzemyslaw Marczak 1963b55d30fSSimon Glass static void regulator_show(struct udevice *dev, int ret) 197af41e8dbSPrzemyslaw Marczak { 198af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 1993b55d30fSSimon Glass 2003b55d30fSSimon Glass uc_pdata = dev_get_uclass_platdata(dev); 2013b55d30fSSimon Glass 2023b55d30fSSimon Glass printf("%s@%s: ", dev->name, uc_pdata->name); 2033b55d30fSSimon Glass if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UV) 2043b55d30fSSimon Glass printf("set %d uV", uc_pdata->min_uV); 2053b55d30fSSimon Glass if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UA) 2063b55d30fSSimon Glass printf("; set %d uA", uc_pdata->min_uA); 2073b55d30fSSimon Glass printf("; enabling"); 2083b55d30fSSimon Glass if (ret) 2097d577999SSimon Glass printf(" (ret: %d)", ret); 2103b55d30fSSimon Glass printf("\n"); 2113b55d30fSSimon Glass } 2123b55d30fSSimon Glass 2133b55d30fSSimon Glass int regulator_autoset_by_name(const char *platname, struct udevice **devp) 2143b55d30fSSimon Glass { 215af41e8dbSPrzemyslaw Marczak struct udevice *dev; 216af41e8dbSPrzemyslaw Marczak int ret; 217af41e8dbSPrzemyslaw Marczak 2183b880757SPrzemyslaw Marczak ret = regulator_get_by_platname(platname, &dev); 219af41e8dbSPrzemyslaw Marczak if (devp) 220af41e8dbSPrzemyslaw Marczak *devp = dev; 2213b55d30fSSimon Glass if (ret) { 2223b55d30fSSimon Glass debug("Can get the regulator: %s!", platname); 223af41e8dbSPrzemyslaw Marczak return ret; 224af41e8dbSPrzemyslaw Marczak } 225af41e8dbSPrzemyslaw Marczak 2263b55d30fSSimon Glass return regulator_autoset(dev); 2273b55d30fSSimon Glass } 2283b55d30fSSimon Glass 2293b880757SPrzemyslaw Marczak int regulator_list_autoset(const char *list_platname[], 230af41e8dbSPrzemyslaw Marczak struct udevice *list_devp[], 231af41e8dbSPrzemyslaw Marczak bool verbose) 232af41e8dbSPrzemyslaw Marczak { 233af41e8dbSPrzemyslaw Marczak struct udevice *dev; 2343b880757SPrzemyslaw Marczak int error = 0, i = 0, ret; 235af41e8dbSPrzemyslaw Marczak 2363b880757SPrzemyslaw Marczak while (list_platname[i]) { 2373b55d30fSSimon Glass ret = regulator_autoset_by_name(list_platname[i], &dev); 2383b55d30fSSimon Glass if (ret != -EMEDIUMTYPE && verbose) 2393b55d30fSSimon Glass regulator_show(dev, ret); 2403b880757SPrzemyslaw Marczak if (ret & !error) 2413b880757SPrzemyslaw Marczak error = ret; 242af41e8dbSPrzemyslaw Marczak 2433b880757SPrzemyslaw Marczak if (list_devp) 244af41e8dbSPrzemyslaw Marczak list_devp[i] = dev; 2453b880757SPrzemyslaw Marczak 2463b880757SPrzemyslaw Marczak i++; 247af41e8dbSPrzemyslaw Marczak } 248af41e8dbSPrzemyslaw Marczak 2493b880757SPrzemyslaw Marczak return error; 2503b880757SPrzemyslaw Marczak } 2513b880757SPrzemyslaw Marczak 2523b880757SPrzemyslaw Marczak static bool regulator_name_is_unique(struct udevice *check_dev, 2533b880757SPrzemyslaw Marczak const char *check_name) 2543b880757SPrzemyslaw Marczak { 2553b880757SPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 2563b880757SPrzemyslaw Marczak struct udevice *dev; 2573b880757SPrzemyslaw Marczak int check_len = strlen(check_name); 2583b880757SPrzemyslaw Marczak int ret; 2593b880757SPrzemyslaw Marczak int len; 2603b880757SPrzemyslaw Marczak 2613b880757SPrzemyslaw Marczak for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev; 2623b880757SPrzemyslaw Marczak ret = uclass_find_next_device(&dev)) { 2633b880757SPrzemyslaw Marczak if (ret || dev == check_dev) 2643b880757SPrzemyslaw Marczak continue; 2653b880757SPrzemyslaw Marczak 2663b880757SPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 2673b880757SPrzemyslaw Marczak len = strlen(uc_pdata->name); 2683b880757SPrzemyslaw Marczak if (len != check_len) 2693b880757SPrzemyslaw Marczak continue; 2703b880757SPrzemyslaw Marczak 2713b880757SPrzemyslaw Marczak if (!strcmp(uc_pdata->name, check_name)) 2723b880757SPrzemyslaw Marczak return false; 2733b880757SPrzemyslaw Marczak } 2743b880757SPrzemyslaw Marczak 2753b880757SPrzemyslaw Marczak return true; 276af41e8dbSPrzemyslaw Marczak } 277af41e8dbSPrzemyslaw Marczak 278af41e8dbSPrzemyslaw Marczak static int regulator_post_bind(struct udevice *dev) 279af41e8dbSPrzemyslaw Marczak { 280af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 2813b880757SPrzemyslaw Marczak const char *property = "regulator-name"; 282af41e8dbSPrzemyslaw Marczak 283af41e8dbSPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 284af41e8dbSPrzemyslaw Marczak 285af41e8dbSPrzemyslaw Marczak /* Regulator's mandatory constraint */ 286*f15cd4f1SSimon Glass uc_pdata->name = dev_read_string(dev, property); 287af41e8dbSPrzemyslaw Marczak if (!uc_pdata->name) { 288*f15cd4f1SSimon Glass debug("%s: dev '%s' has no property '%s'\n", 289*f15cd4f1SSimon Glass __func__, dev->name, property); 290*f15cd4f1SSimon Glass uc_pdata->name = dev_read_name(dev); 291cf260011SPeng Fan if (!uc_pdata->name) 2923b880757SPrzemyslaw Marczak return -EINVAL; 293af41e8dbSPrzemyslaw Marczak } 294af41e8dbSPrzemyslaw Marczak 2953b880757SPrzemyslaw Marczak if (regulator_name_is_unique(dev, uc_pdata->name)) 296af41e8dbSPrzemyslaw Marczak return 0; 2973b880757SPrzemyslaw Marczak 298*f15cd4f1SSimon Glass debug("'%s' of dev: '%s', has nonunique value: '%s\n", 2993b880757SPrzemyslaw Marczak property, dev->name, uc_pdata->name); 3003b880757SPrzemyslaw Marczak 3013b880757SPrzemyslaw Marczak return -EINVAL; 302af41e8dbSPrzemyslaw Marczak } 303af41e8dbSPrzemyslaw Marczak 304af41e8dbSPrzemyslaw Marczak static int regulator_pre_probe(struct udevice *dev) 305af41e8dbSPrzemyslaw Marczak { 306af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 307af41e8dbSPrzemyslaw Marczak 308af41e8dbSPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 309af41e8dbSPrzemyslaw Marczak if (!uc_pdata) 310af41e8dbSPrzemyslaw Marczak return -ENXIO; 311af41e8dbSPrzemyslaw Marczak 312af41e8dbSPrzemyslaw Marczak /* Regulator's optional constraints */ 313*f15cd4f1SSimon Glass uc_pdata->min_uV = dev_read_u32_default(dev, "regulator-min-microvolt", 314*f15cd4f1SSimon Glass -ENODATA); 315*f15cd4f1SSimon Glass uc_pdata->max_uV = dev_read_u32_default(dev, "regulator-max-microvolt", 316*f15cd4f1SSimon Glass -ENODATA); 317*f15cd4f1SSimon Glass uc_pdata->min_uA = dev_read_u32_default(dev, "regulator-min-microamp", 318*f15cd4f1SSimon Glass -ENODATA); 319*f15cd4f1SSimon Glass uc_pdata->max_uA = dev_read_u32_default(dev, "regulator-max-microamp", 320*f15cd4f1SSimon Glass -ENODATA); 321*f15cd4f1SSimon Glass uc_pdata->always_on = dev_read_bool(dev, "regulator-always-on"); 322*f15cd4f1SSimon Glass uc_pdata->boot_on = dev_read_bool(dev, "regulator-boot-on"); 323af41e8dbSPrzemyslaw Marczak 3247837ceabSSimon Glass /* Those values are optional (-ENODATA if unset) */ 3257837ceabSSimon Glass if ((uc_pdata->min_uV != -ENODATA) && 3267837ceabSSimon Glass (uc_pdata->max_uV != -ENODATA) && 3277837ceabSSimon Glass (uc_pdata->min_uV == uc_pdata->max_uV)) 3287837ceabSSimon Glass uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UV; 3297837ceabSSimon Glass 3307837ceabSSimon Glass /* Those values are optional (-ENODATA if unset) */ 3317837ceabSSimon Glass if ((uc_pdata->min_uA != -ENODATA) && 3327837ceabSSimon Glass (uc_pdata->max_uA != -ENODATA) && 3337837ceabSSimon Glass (uc_pdata->min_uA == uc_pdata->max_uA)) 3347837ceabSSimon Glass uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UA; 3357837ceabSSimon Glass 336af41e8dbSPrzemyslaw Marczak return 0; 337af41e8dbSPrzemyslaw Marczak } 338af41e8dbSPrzemyslaw Marczak 339083fc83aSSimon Glass int regulators_enable_boot_on(bool verbose) 340083fc83aSSimon Glass { 341083fc83aSSimon Glass struct udevice *dev; 342083fc83aSSimon Glass struct uclass *uc; 343083fc83aSSimon Glass int ret; 344083fc83aSSimon Glass 345083fc83aSSimon Glass ret = uclass_get(UCLASS_REGULATOR, &uc); 346083fc83aSSimon Glass if (ret) 347083fc83aSSimon Glass return ret; 348083fc83aSSimon Glass for (uclass_first_device(UCLASS_REGULATOR, &dev); 3493f603cbbSSimon Glass dev; 350083fc83aSSimon Glass uclass_next_device(&dev)) { 351083fc83aSSimon Glass ret = regulator_autoset(dev); 352d08504d1SSimon Glass if (ret == -EMEDIUMTYPE) { 353d08504d1SSimon Glass ret = 0; 354083fc83aSSimon Glass continue; 355d08504d1SSimon Glass } 356083fc83aSSimon Glass if (verbose) 357083fc83aSSimon Glass regulator_show(dev, ret); 358364809deSSimon Glass if (ret == -ENOSYS) 359364809deSSimon Glass ret = 0; 360083fc83aSSimon Glass } 361083fc83aSSimon Glass 362083fc83aSSimon Glass return ret; 363083fc83aSSimon Glass } 364083fc83aSSimon Glass 365af41e8dbSPrzemyslaw Marczak UCLASS_DRIVER(regulator) = { 366af41e8dbSPrzemyslaw Marczak .id = UCLASS_REGULATOR, 367af41e8dbSPrzemyslaw Marczak .name = "regulator", 368af41e8dbSPrzemyslaw Marczak .post_bind = regulator_post_bind, 369af41e8dbSPrzemyslaw Marczak .pre_probe = regulator_pre_probe, 370af41e8dbSPrzemyslaw Marczak .per_device_platdata_auto_alloc_size = 371af41e8dbSPrzemyslaw Marczak sizeof(struct dm_regulator_uclass_platdata), 372af41e8dbSPrzemyslaw Marczak }; 373