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 */ 7af41e8dbSPrzemyslaw Marczak #include <common.h> 8af41e8dbSPrzemyslaw Marczak #include <fdtdec.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); 44af41e8dbSPrzemyslaw Marczak 45af41e8dbSPrzemyslaw Marczak if (!ops || !ops->set_value) 46af41e8dbSPrzemyslaw Marczak return -ENOSYS; 47af41e8dbSPrzemyslaw Marczak 48af41e8dbSPrzemyslaw Marczak return ops->set_value(dev, uV); 49af41e8dbSPrzemyslaw Marczak } 50af41e8dbSPrzemyslaw Marczak 51af41e8dbSPrzemyslaw Marczak int regulator_get_current(struct udevice *dev) 52af41e8dbSPrzemyslaw Marczak { 53af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 54af41e8dbSPrzemyslaw Marczak 55af41e8dbSPrzemyslaw Marczak if (!ops || !ops->get_current) 56af41e8dbSPrzemyslaw Marczak return -ENOSYS; 57af41e8dbSPrzemyslaw Marczak 58af41e8dbSPrzemyslaw Marczak return ops->get_current(dev); 59af41e8dbSPrzemyslaw Marczak } 60af41e8dbSPrzemyslaw Marczak 61af41e8dbSPrzemyslaw Marczak int regulator_set_current(struct udevice *dev, int uA) 62af41e8dbSPrzemyslaw Marczak { 63af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 64af41e8dbSPrzemyslaw Marczak 65af41e8dbSPrzemyslaw Marczak if (!ops || !ops->set_current) 66af41e8dbSPrzemyslaw Marczak return -ENOSYS; 67af41e8dbSPrzemyslaw Marczak 68af41e8dbSPrzemyslaw Marczak return ops->set_current(dev, uA); 69af41e8dbSPrzemyslaw Marczak } 70af41e8dbSPrzemyslaw Marczak 71af41e8dbSPrzemyslaw Marczak bool regulator_get_enable(struct udevice *dev) 72af41e8dbSPrzemyslaw Marczak { 73af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 74af41e8dbSPrzemyslaw Marczak 75af41e8dbSPrzemyslaw Marczak if (!ops || !ops->get_enable) 76af41e8dbSPrzemyslaw Marczak return -ENOSYS; 77af41e8dbSPrzemyslaw Marczak 78af41e8dbSPrzemyslaw Marczak return ops->get_enable(dev); 79af41e8dbSPrzemyslaw Marczak } 80af41e8dbSPrzemyslaw Marczak 81af41e8dbSPrzemyslaw Marczak int regulator_set_enable(struct udevice *dev, bool enable) 82af41e8dbSPrzemyslaw Marczak { 83af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 84af41e8dbSPrzemyslaw Marczak 85af41e8dbSPrzemyslaw Marczak if (!ops || !ops->set_enable) 86af41e8dbSPrzemyslaw Marczak return -ENOSYS; 87af41e8dbSPrzemyslaw Marczak 88af41e8dbSPrzemyslaw Marczak return ops->set_enable(dev, enable); 89af41e8dbSPrzemyslaw Marczak } 90af41e8dbSPrzemyslaw Marczak 91af41e8dbSPrzemyslaw Marczak int regulator_get_mode(struct udevice *dev) 92af41e8dbSPrzemyslaw Marczak { 93af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 94af41e8dbSPrzemyslaw Marczak 95af41e8dbSPrzemyslaw Marczak if (!ops || !ops->get_mode) 96af41e8dbSPrzemyslaw Marczak return -ENOSYS; 97af41e8dbSPrzemyslaw Marczak 98af41e8dbSPrzemyslaw Marczak return ops->get_mode(dev); 99af41e8dbSPrzemyslaw Marczak } 100af41e8dbSPrzemyslaw Marczak 101af41e8dbSPrzemyslaw Marczak int regulator_set_mode(struct udevice *dev, int mode) 102af41e8dbSPrzemyslaw Marczak { 103af41e8dbSPrzemyslaw Marczak const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); 104af41e8dbSPrzemyslaw Marczak 105af41e8dbSPrzemyslaw Marczak if (!ops || !ops->set_mode) 106af41e8dbSPrzemyslaw Marczak return -ENOSYS; 107af41e8dbSPrzemyslaw Marczak 108af41e8dbSPrzemyslaw Marczak return ops->set_mode(dev, mode); 109af41e8dbSPrzemyslaw Marczak } 110af41e8dbSPrzemyslaw Marczak 1113b880757SPrzemyslaw Marczak int regulator_get_by_platname(const char *plat_name, struct udevice **devp) 112af41e8dbSPrzemyslaw Marczak { 113af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 114af41e8dbSPrzemyslaw Marczak struct udevice *dev; 1153b880757SPrzemyslaw Marczak int ret; 116af41e8dbSPrzemyslaw Marczak 117af41e8dbSPrzemyslaw Marczak *devp = NULL; 118af41e8dbSPrzemyslaw Marczak 1193b880757SPrzemyslaw Marczak for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev; 1203b880757SPrzemyslaw Marczak ret = uclass_find_next_device(&dev)) { 1213b880757SPrzemyslaw Marczak if (ret) 1223b880757SPrzemyslaw Marczak continue; 1233b880757SPrzemyslaw Marczak 124af41e8dbSPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 125af41e8dbSPrzemyslaw Marczak if (!uc_pdata || strcmp(plat_name, uc_pdata->name)) 126af41e8dbSPrzemyslaw Marczak continue; 127af41e8dbSPrzemyslaw Marczak 128af41e8dbSPrzemyslaw Marczak return uclass_get_device_tail(dev, 0, devp); 129af41e8dbSPrzemyslaw Marczak } 130af41e8dbSPrzemyslaw Marczak 131af41e8dbSPrzemyslaw Marczak debug("%s: can't find: %s\n", __func__, plat_name); 132af41e8dbSPrzemyslaw Marczak 133af41e8dbSPrzemyslaw Marczak return -ENODEV; 134af41e8dbSPrzemyslaw Marczak } 135af41e8dbSPrzemyslaw Marczak 1363b880757SPrzemyslaw Marczak int regulator_get_by_devname(const char *devname, struct udevice **devp) 137af41e8dbSPrzemyslaw Marczak { 138af41e8dbSPrzemyslaw Marczak return uclass_get_device_by_name(UCLASS_REGULATOR, devname, devp); 139af41e8dbSPrzemyslaw Marczak } 140af41e8dbSPrzemyslaw Marczak 1413b880757SPrzemyslaw Marczak static int failed(int ret, bool verbose, const char *fmt, ...) 142af41e8dbSPrzemyslaw Marczak { 143af41e8dbSPrzemyslaw Marczak va_list args; 144af41e8dbSPrzemyslaw Marczak char buf[64]; 145af41e8dbSPrzemyslaw Marczak 146af41e8dbSPrzemyslaw Marczak if (verbose == false) 147af41e8dbSPrzemyslaw Marczak return ret; 148af41e8dbSPrzemyslaw Marczak 149af41e8dbSPrzemyslaw Marczak va_start(args, fmt); 150af41e8dbSPrzemyslaw Marczak vscnprintf(buf, sizeof(buf), fmt, args); 151af41e8dbSPrzemyslaw Marczak va_end(args); 152af41e8dbSPrzemyslaw Marczak 153af41e8dbSPrzemyslaw Marczak printf(buf); 154af41e8dbSPrzemyslaw Marczak 155af41e8dbSPrzemyslaw Marczak if (!ret) 156af41e8dbSPrzemyslaw Marczak return 0; 157af41e8dbSPrzemyslaw Marczak 158af41e8dbSPrzemyslaw Marczak printf(" (ret: %d)", ret); 159af41e8dbSPrzemyslaw Marczak 160af41e8dbSPrzemyslaw Marczak return ret; 161af41e8dbSPrzemyslaw Marczak } 162af41e8dbSPrzemyslaw Marczak 1633b880757SPrzemyslaw Marczak int regulator_autoset(const char *platname, 164af41e8dbSPrzemyslaw Marczak struct udevice **devp, 165af41e8dbSPrzemyslaw Marczak bool verbose) 166af41e8dbSPrzemyslaw Marczak { 167af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 168af41e8dbSPrzemyslaw Marczak struct udevice *dev; 169af41e8dbSPrzemyslaw Marczak int ret; 170af41e8dbSPrzemyslaw Marczak 171af41e8dbSPrzemyslaw Marczak if (devp) 172af41e8dbSPrzemyslaw Marczak *devp = NULL; 173af41e8dbSPrzemyslaw Marczak 1743b880757SPrzemyslaw Marczak ret = regulator_get_by_platname(platname, &dev); 175af41e8dbSPrzemyslaw Marczak if (ret) { 176af41e8dbSPrzemyslaw Marczak error("Can get the regulator: %s!", platname); 177af41e8dbSPrzemyslaw Marczak return ret; 178af41e8dbSPrzemyslaw Marczak } 179af41e8dbSPrzemyslaw Marczak 180af41e8dbSPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 181af41e8dbSPrzemyslaw Marczak if (!uc_pdata) { 182af41e8dbSPrzemyslaw Marczak error("Can get the regulator %s uclass platdata!", platname); 183af41e8dbSPrzemyslaw Marczak return -ENXIO; 184af41e8dbSPrzemyslaw Marczak } 185af41e8dbSPrzemyslaw Marczak 1863b880757SPrzemyslaw Marczak if (!uc_pdata->always_on && !uc_pdata->boot_on) 1873b880757SPrzemyslaw Marczak goto retdev; 1883b880757SPrzemyslaw Marczak 1893b880757SPrzemyslaw Marczak if (verbose) 190af41e8dbSPrzemyslaw Marczak printf("%s@%s: ", dev->name, uc_pdata->name); 191af41e8dbSPrzemyslaw Marczak 192af41e8dbSPrzemyslaw Marczak /* Those values are optional (-ENODATA if unset) */ 193af41e8dbSPrzemyslaw Marczak if ((uc_pdata->min_uV != -ENODATA) && 194af41e8dbSPrzemyslaw Marczak (uc_pdata->max_uV != -ENODATA) && 195af41e8dbSPrzemyslaw Marczak (uc_pdata->min_uV == uc_pdata->max_uV)) { 196af41e8dbSPrzemyslaw Marczak ret = regulator_set_value(dev, uc_pdata->min_uV); 1973b880757SPrzemyslaw Marczak if (failed(ret, verbose, "set %d uV", uc_pdata->min_uV)) 198af41e8dbSPrzemyslaw Marczak goto exit; 199af41e8dbSPrzemyslaw Marczak } 200af41e8dbSPrzemyslaw Marczak 201af41e8dbSPrzemyslaw Marczak /* Those values are optional (-ENODATA if unset) */ 202af41e8dbSPrzemyslaw Marczak if ((uc_pdata->min_uA != -ENODATA) && 203af41e8dbSPrzemyslaw Marczak (uc_pdata->max_uA != -ENODATA) && 204af41e8dbSPrzemyslaw Marczak (uc_pdata->min_uA == uc_pdata->max_uA)) { 205af41e8dbSPrzemyslaw Marczak ret = regulator_set_current(dev, uc_pdata->min_uA); 2063b880757SPrzemyslaw Marczak if (failed(ret, verbose, "; set %d uA", uc_pdata->min_uA)) 207af41e8dbSPrzemyslaw Marczak goto exit; 208af41e8dbSPrzemyslaw Marczak } 209af41e8dbSPrzemyslaw Marczak 210af41e8dbSPrzemyslaw Marczak ret = regulator_set_enable(dev, true); 2113b880757SPrzemyslaw Marczak if (failed(ret, verbose, "; enabling", uc_pdata->min_uA)) 212af41e8dbSPrzemyslaw Marczak goto exit; 213af41e8dbSPrzemyslaw Marczak 214af41e8dbSPrzemyslaw Marczak retdev: 215af41e8dbSPrzemyslaw Marczak if (devp) 216af41e8dbSPrzemyslaw Marczak *devp = dev; 217af41e8dbSPrzemyslaw Marczak exit: 2183b880757SPrzemyslaw Marczak if (verbose) 219af41e8dbSPrzemyslaw Marczak printf("\n"); 2203b880757SPrzemyslaw Marczak 221af41e8dbSPrzemyslaw Marczak return ret; 222af41e8dbSPrzemyslaw Marczak } 223af41e8dbSPrzemyslaw Marczak 2243b880757SPrzemyslaw Marczak int regulator_list_autoset(const char *list_platname[], 225af41e8dbSPrzemyslaw Marczak struct udevice *list_devp[], 226af41e8dbSPrzemyslaw Marczak bool verbose) 227af41e8dbSPrzemyslaw Marczak { 228af41e8dbSPrzemyslaw Marczak struct udevice *dev; 2293b880757SPrzemyslaw Marczak int error = 0, i = 0, ret; 230af41e8dbSPrzemyslaw Marczak 2313b880757SPrzemyslaw Marczak while (list_platname[i]) { 232af41e8dbSPrzemyslaw Marczak ret = regulator_autoset(list_platname[i], &dev, verbose); 2333b880757SPrzemyslaw Marczak if (ret & !error) 2343b880757SPrzemyslaw Marczak error = ret; 235af41e8dbSPrzemyslaw Marczak 2363b880757SPrzemyslaw Marczak if (list_devp) 237af41e8dbSPrzemyslaw Marczak list_devp[i] = dev; 2383b880757SPrzemyslaw Marczak 2393b880757SPrzemyslaw Marczak i++; 240af41e8dbSPrzemyslaw Marczak } 241af41e8dbSPrzemyslaw Marczak 2423b880757SPrzemyslaw Marczak return error; 2433b880757SPrzemyslaw Marczak } 2443b880757SPrzemyslaw Marczak 2453b880757SPrzemyslaw Marczak static bool regulator_name_is_unique(struct udevice *check_dev, 2463b880757SPrzemyslaw Marczak const char *check_name) 2473b880757SPrzemyslaw Marczak { 2483b880757SPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 2493b880757SPrzemyslaw Marczak struct udevice *dev; 2503b880757SPrzemyslaw Marczak int check_len = strlen(check_name); 2513b880757SPrzemyslaw Marczak int ret; 2523b880757SPrzemyslaw Marczak int len; 2533b880757SPrzemyslaw Marczak 2543b880757SPrzemyslaw Marczak for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev; 2553b880757SPrzemyslaw Marczak ret = uclass_find_next_device(&dev)) { 2563b880757SPrzemyslaw Marczak if (ret || dev == check_dev) 2573b880757SPrzemyslaw Marczak continue; 2583b880757SPrzemyslaw Marczak 2593b880757SPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 2603b880757SPrzemyslaw Marczak len = strlen(uc_pdata->name); 2613b880757SPrzemyslaw Marczak if (len != check_len) 2623b880757SPrzemyslaw Marczak continue; 2633b880757SPrzemyslaw Marczak 2643b880757SPrzemyslaw Marczak if (!strcmp(uc_pdata->name, check_name)) 2653b880757SPrzemyslaw Marczak return false; 2663b880757SPrzemyslaw Marczak } 2673b880757SPrzemyslaw Marczak 2683b880757SPrzemyslaw Marczak return true; 269af41e8dbSPrzemyslaw Marczak } 270af41e8dbSPrzemyslaw Marczak 271af41e8dbSPrzemyslaw Marczak static int regulator_post_bind(struct udevice *dev) 272af41e8dbSPrzemyslaw Marczak { 273af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 274af41e8dbSPrzemyslaw Marczak int offset = dev->of_offset; 275af41e8dbSPrzemyslaw Marczak const void *blob = gd->fdt_blob; 2763b880757SPrzemyslaw Marczak const char *property = "regulator-name"; 277af41e8dbSPrzemyslaw Marczak 278af41e8dbSPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 279af41e8dbSPrzemyslaw Marczak if (!uc_pdata) 280af41e8dbSPrzemyslaw Marczak return -ENXIO; 281af41e8dbSPrzemyslaw Marczak 282af41e8dbSPrzemyslaw Marczak /* Regulator's mandatory constraint */ 2833b880757SPrzemyslaw Marczak uc_pdata->name = fdt_getprop(blob, offset, property, NULL); 284af41e8dbSPrzemyslaw Marczak if (!uc_pdata->name) { 285af41e8dbSPrzemyslaw Marczak debug("%s: dev: %s has no property 'regulator-name'\n", 286af41e8dbSPrzemyslaw Marczak __func__, dev->name); 2873b880757SPrzemyslaw Marczak return -EINVAL; 288af41e8dbSPrzemyslaw Marczak } 289af41e8dbSPrzemyslaw Marczak 2903b880757SPrzemyslaw Marczak if (regulator_name_is_unique(dev, uc_pdata->name)) 291af41e8dbSPrzemyslaw Marczak return 0; 2923b880757SPrzemyslaw Marczak 2933b880757SPrzemyslaw Marczak error("\"%s\" of dev: \"%s\", has nonunique value: \"%s\"", 2943b880757SPrzemyslaw Marczak property, dev->name, uc_pdata->name); 2953b880757SPrzemyslaw Marczak 2963b880757SPrzemyslaw Marczak return -EINVAL; 297af41e8dbSPrzemyslaw Marczak } 298af41e8dbSPrzemyslaw Marczak 299af41e8dbSPrzemyslaw Marczak static int regulator_pre_probe(struct udevice *dev) 300af41e8dbSPrzemyslaw Marczak { 301af41e8dbSPrzemyslaw Marczak struct dm_regulator_uclass_platdata *uc_pdata; 302af41e8dbSPrzemyslaw Marczak int offset = dev->of_offset; 303af41e8dbSPrzemyslaw Marczak 304af41e8dbSPrzemyslaw Marczak uc_pdata = dev_get_uclass_platdata(dev); 305af41e8dbSPrzemyslaw Marczak if (!uc_pdata) 306af41e8dbSPrzemyslaw Marczak return -ENXIO; 307af41e8dbSPrzemyslaw Marczak 308af41e8dbSPrzemyslaw Marczak /* Regulator's optional constraints */ 309af41e8dbSPrzemyslaw Marczak uc_pdata->min_uV = fdtdec_get_int(gd->fdt_blob, offset, 310af41e8dbSPrzemyslaw Marczak "regulator-min-microvolt", -ENODATA); 311af41e8dbSPrzemyslaw Marczak uc_pdata->max_uV = fdtdec_get_int(gd->fdt_blob, offset, 312af41e8dbSPrzemyslaw Marczak "regulator-max-microvolt", -ENODATA); 313af41e8dbSPrzemyslaw Marczak uc_pdata->min_uA = fdtdec_get_int(gd->fdt_blob, offset, 314af41e8dbSPrzemyslaw Marczak "regulator-min-microamp", -ENODATA); 315af41e8dbSPrzemyslaw Marczak uc_pdata->max_uA = fdtdec_get_int(gd->fdt_blob, offset, 316af41e8dbSPrzemyslaw Marczak "regulator-max-microamp", -ENODATA); 317af41e8dbSPrzemyslaw Marczak uc_pdata->always_on = fdtdec_get_bool(gd->fdt_blob, offset, 318af41e8dbSPrzemyslaw Marczak "regulator-always-on"); 319af41e8dbSPrzemyslaw Marczak uc_pdata->boot_on = fdtdec_get_bool(gd->fdt_blob, offset, 320af41e8dbSPrzemyslaw Marczak "regulator-boot-on"); 321af41e8dbSPrzemyslaw Marczak 322*7837ceabSSimon Glass /* Those values are optional (-ENODATA if unset) */ 323*7837ceabSSimon Glass if ((uc_pdata->min_uV != -ENODATA) && 324*7837ceabSSimon Glass (uc_pdata->max_uV != -ENODATA) && 325*7837ceabSSimon Glass (uc_pdata->min_uV == uc_pdata->max_uV)) 326*7837ceabSSimon Glass uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UV; 327*7837ceabSSimon Glass 328*7837ceabSSimon Glass /* Those values are optional (-ENODATA if unset) */ 329*7837ceabSSimon Glass if ((uc_pdata->min_uA != -ENODATA) && 330*7837ceabSSimon Glass (uc_pdata->max_uA != -ENODATA) && 331*7837ceabSSimon Glass (uc_pdata->min_uA == uc_pdata->max_uA)) 332*7837ceabSSimon Glass uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UA; 333*7837ceabSSimon Glass 334af41e8dbSPrzemyslaw Marczak return 0; 335af41e8dbSPrzemyslaw Marczak } 336af41e8dbSPrzemyslaw Marczak 337af41e8dbSPrzemyslaw Marczak UCLASS_DRIVER(regulator) = { 338af41e8dbSPrzemyslaw Marczak .id = UCLASS_REGULATOR, 339af41e8dbSPrzemyslaw Marczak .name = "regulator", 340af41e8dbSPrzemyslaw Marczak .post_bind = regulator_post_bind, 341af41e8dbSPrzemyslaw Marczak .pre_probe = regulator_pre_probe, 342af41e8dbSPrzemyslaw Marczak .per_device_platdata_auto_alloc_size = 343af41e8dbSPrzemyslaw Marczak sizeof(struct dm_regulator_uclass_platdata), 344af41e8dbSPrzemyslaw Marczak }; 345