1 /* 2 * Copyright (C) 2015 Samsung Electronics 3 * 4 * Przemyslaw Marczak <p.marczak@samsung.com> 5 * 6 * SPDX-License-Identifier: GPL-2.0+ 7 */ 8 9 #include <common.h> 10 #include <errno.h> 11 #include <dm.h> 12 #include <i2c.h> 13 #include <asm/gpio.h> 14 #include <power/pmic.h> 15 #include <power/regulator.h> 16 17 DECLARE_GLOBAL_DATA_PTR; 18 19 struct fixed_regulator_platdata { 20 struct gpio_desc gpio; /* GPIO for regulator enable control */ 21 unsigned int startup_delay_us; 22 }; 23 24 static int fixed_regulator_ofdata_to_platdata(struct udevice *dev) 25 { 26 struct dm_regulator_uclass_platdata *uc_pdata; 27 struct fixed_regulator_platdata *dev_pdata; 28 struct gpio_desc *gpio; 29 int flags = GPIOD_IS_OUT; 30 int ret; 31 32 dev_pdata = dev_get_platdata(dev); 33 uc_pdata = dev_get_uclass_platdata(dev); 34 if (!uc_pdata) 35 return -ENXIO; 36 37 /* Set type to fixed */ 38 uc_pdata->type = REGULATOR_TYPE_FIXED; 39 if (!dev_read_bool(dev, "enable-active-high")) 40 flags |= GPIOD_ACTIVE_LOW; 41 if (dev_read_bool(dev, "regulator-boot-on")) 42 flags |= GPIOD_IS_OUT_ACTIVE; 43 44 /* Get fixed regulator optional enable GPIO desc */ 45 gpio = &dev_pdata->gpio; 46 ret = gpio_request_by_name(dev, "gpio", 0, gpio, flags); 47 if (ret) { 48 debug("Fixed regulator optional enable GPIO - not found! Error: %d\n", 49 ret); 50 if (ret != -ENOENT) 51 return ret; 52 } 53 54 /* Get optional ramp up delay */ 55 dev_pdata->startup_delay_us = dev_read_u32_default(dev, 56 "startup-delay-us", 0); 57 58 return 0; 59 } 60 61 static int fixed_regulator_get_value(struct udevice *dev) 62 { 63 struct dm_regulator_uclass_platdata *uc_pdata; 64 65 uc_pdata = dev_get_uclass_platdata(dev); 66 if (!uc_pdata) 67 return -ENXIO; 68 69 if (uc_pdata->min_uV != uc_pdata->max_uV) { 70 debug("Invalid constraints for: %s\n", uc_pdata->name); 71 return -EINVAL; 72 } 73 74 return uc_pdata->min_uV; 75 } 76 77 static int fixed_regulator_get_current(struct udevice *dev) 78 { 79 struct dm_regulator_uclass_platdata *uc_pdata; 80 81 uc_pdata = dev_get_uclass_platdata(dev); 82 if (!uc_pdata) 83 return -ENXIO; 84 85 if (uc_pdata->min_uA != uc_pdata->max_uA) { 86 debug("Invalid constraints for: %s\n", uc_pdata->name); 87 return -EINVAL; 88 } 89 90 return uc_pdata->min_uA; 91 } 92 93 static int fixed_regulator_get_enable(struct udevice *dev) 94 { 95 struct fixed_regulator_platdata *dev_pdata = dev_get_platdata(dev); 96 97 /* Enable GPIO is optional */ 98 if (!dev_pdata->gpio.dev) 99 return true; 100 101 return dm_gpio_get_value(&dev_pdata->gpio); 102 } 103 104 static int fixed_regulator_set_enable(struct udevice *dev, bool enable) 105 { 106 struct fixed_regulator_platdata *dev_pdata = dev_get_platdata(dev); 107 int ret; 108 109 debug("%s: dev='%s', enable=%d, delay=%d, has_gpio=%d\n", __func__, 110 dev->name, enable, dev_pdata->startup_delay_us, 111 dm_gpio_is_valid(&dev_pdata->gpio)); 112 /* Enable GPIO is optional */ 113 if (!dm_gpio_is_valid(&dev_pdata->gpio)) { 114 if (!enable) 115 return -ENOSYS; 116 return 0; 117 } 118 119 ret = dm_gpio_set_value(&dev_pdata->gpio, enable); 120 if (ret) { 121 pr_err("Can't set regulator : %s gpio to: %d\n", dev->name, 122 enable); 123 return ret; 124 } 125 126 if (enable && dev_pdata->startup_delay_us) 127 udelay(dev_pdata->startup_delay_us); 128 debug("%s: done\n", __func__); 129 130 return 0; 131 } 132 133 static const struct dm_regulator_ops fixed_regulator_ops = { 134 .get_value = fixed_regulator_get_value, 135 .get_current = fixed_regulator_get_current, 136 .get_enable = fixed_regulator_get_enable, 137 .set_enable = fixed_regulator_set_enable, 138 }; 139 140 static const struct udevice_id fixed_regulator_ids[] = { 141 { .compatible = "regulator-fixed" }, 142 { }, 143 }; 144 145 U_BOOT_DRIVER(fixed_regulator) = { 146 .name = "fixed regulator", 147 .id = UCLASS_REGULATOR, 148 .ops = &fixed_regulator_ops, 149 .of_match = fixed_regulator_ids, 150 .ofdata_to_platdata = fixed_regulator_ofdata_to_platdata, 151 .platdata_auto_alloc_size = sizeof(struct fixed_regulator_platdata), 152 }; 153