regulator: core: Don't try to remove device links if add failed

device_link_add() might not always succeed depending on the type of
device link and the rest of the dependencies in the system. If
device_link_add() didn't succeed, then we shouldn't try to remove the
link later on as it might remove a link someone else created.

Signed-off-by: Saravana Kannan <saravanak@google.com>
Link: https://lore.kernel.org/r/20191115000438.45970-1-saravanak@google.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Saravana Kannan 2019-11-14 16:04:38 -08:00 committed by Mark Brown
parent 26c2c997aa
commit b59b654478
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
2 changed files with 7 additions and 2 deletions

View File

@ -1844,6 +1844,7 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
struct regulator_dev *rdev; struct regulator_dev *rdev;
struct regulator *regulator; struct regulator *regulator;
const char *devname = dev ? dev_name(dev) : "deviceless"; const char *devname = dev ? dev_name(dev) : "deviceless";
struct device_link *link;
int ret; int ret;
if (get_type >= MAX_GET_TYPE) { if (get_type >= MAX_GET_TYPE) {
@ -1951,7 +1952,9 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
rdev->use_count = 0; rdev->use_count = 0;
} }
device_link_add(dev, &rdev->dev, DL_FLAG_STATELESS); link = device_link_add(dev, &rdev->dev, DL_FLAG_STATELESS);
if (!IS_ERR_OR_NULL(link))
regulator->device_link = true;
return regulator; return regulator;
} }
@ -2046,7 +2049,8 @@ static void _regulator_put(struct regulator *regulator)
debugfs_remove_recursive(regulator->debugfs); debugfs_remove_recursive(regulator->debugfs);
if (regulator->dev) { if (regulator->dev) {
device_link_remove(regulator->dev, &rdev->dev); if (regulator->device_link)
device_link_remove(regulator->dev, &rdev->dev);
/* remove any sysfs entries */ /* remove any sysfs entries */
sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name); sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name);

View File

@ -36,6 +36,7 @@ struct regulator {
struct list_head list; struct list_head list;
unsigned int always_on:1; unsigned int always_on:1;
unsigned int bypass:1; unsigned int bypass:1;
unsigned int device_link:1;
int uA_load; int uA_load;
unsigned int enable_count; unsigned int enable_count;
unsigned int deferred_disables; unsigned int deferred_disables;