Loading drivers/regulator/core.c +15 −18 Original line number Diff line number Diff line Loading @@ -1326,7 +1326,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, regulator->dev = dev; /* Add a link to the device sysfs entry */ size = scnprintf(buf, REG_STR_SIZE, "%s-%s", size = snprintf(buf, REG_STR_SIZE, "%s-%s", dev->kobj.name, supply_name); if (size >= REG_STR_SIZE) goto overflow_err; Loading @@ -1343,7 +1343,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, /* non-fatal */ } } else { regulator->supply_name = kstrdup(supply_name, GFP_KERNEL); regulator->supply_name = kstrdup_const(supply_name, GFP_KERNEL); if (regulator->supply_name == NULL) goto overflow_err; } Loading Loading @@ -1451,8 +1451,6 @@ static struct regulator_dev *regulator_lookup_by_name(const char *name) * regulator_dev_lookup - lookup a regulator device. * @dev: device for regulator "consumer". * @supply: Supply name or regulator ID. * @ret: 0 on success, -ENODEV if lookup fails permanently, -EPROBE_DEFER if * lookup could succeed in the future. * * If successful, returns a struct regulator_dev that corresponds to the name * @supply and with the embedded struct device refcount incremented by one. Loading Loading @@ -1534,14 +1532,6 @@ static int regulator_resolve_supply(struct regulator_dev *rdev) if (IS_ERR(r)) { ret = PTR_ERR(r); if (ret == -ENODEV) { /* * No supply was specified for this regulator and * there will never be one. */ return 0; } /* Did the lookup explicitly defer for us? */ if (ret == -EPROBE_DEFER) return ret; Loading Loading @@ -1799,7 +1789,7 @@ static void _regulator_put(struct regulator *regulator) put_device(&rdev->dev); mutex_unlock(&rdev->mutex); kfree(regulator->supply_name); kfree_const(regulator->supply_name); kfree(regulator); module_put(rdev->owner); Loading Loading @@ -2486,7 +2476,7 @@ static int _regulator_list_voltage(struct regulator *regulator, ret = ops->list_voltage(rdev, selector); if (lock) mutex_unlock(&rdev->mutex); } else if (rdev->supply) { } else if (rdev->is_switch && rdev->supply) { ret = _regulator_list_voltage(rdev->supply, selector, lock); } else { return -EINVAL; Loading Loading @@ -2544,7 +2534,7 @@ int regulator_count_voltages(struct regulator *regulator) if (rdev->desc->n_voltages) return rdev->desc->n_voltages; if (!rdev->supply) if (!rdev->is_switch || !rdev->supply) return -EINVAL; return regulator_count_voltages(rdev->supply); Loading Loading @@ -2941,8 +2931,10 @@ static int regulator_set_voltage_unlocked(struct regulator *regulator, if (ret < 0) goto out2; if (rdev->supply && (rdev->desc->min_dropout_uV || !rdev->desc->ops->get_voltage)) { if (rdev->supply && regulator_ops_is_valid(rdev->supply->rdev, REGULATOR_CHANGE_VOLTAGE) && (rdev->desc->min_dropout_uV || !rdev->desc->ops->get_voltage)) { int current_supply_uV; int selector; Loading Loading @@ -4099,6 +4091,11 @@ regulator_register(const struct regulator_desc *regulator_desc, mutex_unlock(®ulator_list_mutex); } if (!rdev->desc->ops->get_voltage && !rdev->desc->ops->list_voltage && !rdev->desc->fixed_uV) rdev->is_switch = true; ret = device_register(&rdev->dev); if (ret != 0) { put_device(&rdev->dev); Loading drivers/regulator/internal.h +1 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ struct regulator { int uA_load; int min_uV; int max_uV; char *supply_name; const char *supply_name; struct device_attribute dev_attr; struct regulator_dev *rdev; struct dentry *debugfs; Loading include/linux/regulator/driver.h +2 −0 Original line number Diff line number Diff line Loading @@ -429,6 +429,8 @@ struct regulator_dev { struct regulator_enable_gpio *ena_pin; unsigned int ena_gpio_state:1; unsigned int is_switch:1; /* time when this regulator was disabled last time */ unsigned long last_off_jiffy; }; Loading Loading
drivers/regulator/core.c +15 −18 Original line number Diff line number Diff line Loading @@ -1326,7 +1326,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, regulator->dev = dev; /* Add a link to the device sysfs entry */ size = scnprintf(buf, REG_STR_SIZE, "%s-%s", size = snprintf(buf, REG_STR_SIZE, "%s-%s", dev->kobj.name, supply_name); if (size >= REG_STR_SIZE) goto overflow_err; Loading @@ -1343,7 +1343,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, /* non-fatal */ } } else { regulator->supply_name = kstrdup(supply_name, GFP_KERNEL); regulator->supply_name = kstrdup_const(supply_name, GFP_KERNEL); if (regulator->supply_name == NULL) goto overflow_err; } Loading Loading @@ -1451,8 +1451,6 @@ static struct regulator_dev *regulator_lookup_by_name(const char *name) * regulator_dev_lookup - lookup a regulator device. * @dev: device for regulator "consumer". * @supply: Supply name or regulator ID. * @ret: 0 on success, -ENODEV if lookup fails permanently, -EPROBE_DEFER if * lookup could succeed in the future. * * If successful, returns a struct regulator_dev that corresponds to the name * @supply and with the embedded struct device refcount incremented by one. Loading Loading @@ -1534,14 +1532,6 @@ static int regulator_resolve_supply(struct regulator_dev *rdev) if (IS_ERR(r)) { ret = PTR_ERR(r); if (ret == -ENODEV) { /* * No supply was specified for this regulator and * there will never be one. */ return 0; } /* Did the lookup explicitly defer for us? */ if (ret == -EPROBE_DEFER) return ret; Loading Loading @@ -1799,7 +1789,7 @@ static void _regulator_put(struct regulator *regulator) put_device(&rdev->dev); mutex_unlock(&rdev->mutex); kfree(regulator->supply_name); kfree_const(regulator->supply_name); kfree(regulator); module_put(rdev->owner); Loading Loading @@ -2486,7 +2476,7 @@ static int _regulator_list_voltage(struct regulator *regulator, ret = ops->list_voltage(rdev, selector); if (lock) mutex_unlock(&rdev->mutex); } else if (rdev->supply) { } else if (rdev->is_switch && rdev->supply) { ret = _regulator_list_voltage(rdev->supply, selector, lock); } else { return -EINVAL; Loading Loading @@ -2544,7 +2534,7 @@ int regulator_count_voltages(struct regulator *regulator) if (rdev->desc->n_voltages) return rdev->desc->n_voltages; if (!rdev->supply) if (!rdev->is_switch || !rdev->supply) return -EINVAL; return regulator_count_voltages(rdev->supply); Loading Loading @@ -2941,8 +2931,10 @@ static int regulator_set_voltage_unlocked(struct regulator *regulator, if (ret < 0) goto out2; if (rdev->supply && (rdev->desc->min_dropout_uV || !rdev->desc->ops->get_voltage)) { if (rdev->supply && regulator_ops_is_valid(rdev->supply->rdev, REGULATOR_CHANGE_VOLTAGE) && (rdev->desc->min_dropout_uV || !rdev->desc->ops->get_voltage)) { int current_supply_uV; int selector; Loading Loading @@ -4099,6 +4091,11 @@ regulator_register(const struct regulator_desc *regulator_desc, mutex_unlock(®ulator_list_mutex); } if (!rdev->desc->ops->get_voltage && !rdev->desc->ops->list_voltage && !rdev->desc->fixed_uV) rdev->is_switch = true; ret = device_register(&rdev->dev); if (ret != 0) { put_device(&rdev->dev); Loading
drivers/regulator/internal.h +1 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ struct regulator { int uA_load; int min_uV; int max_uV; char *supply_name; const char *supply_name; struct device_attribute dev_attr; struct regulator_dev *rdev; struct dentry *debugfs; Loading
include/linux/regulator/driver.h +2 −0 Original line number Diff line number Diff line Loading @@ -429,6 +429,8 @@ struct regulator_dev { struct regulator_enable_gpio *ena_pin; unsigned int ena_gpio_state:1; unsigned int is_switch:1; /* time when this regulator was disabled last time */ unsigned long last_off_jiffy; }; Loading