From d8bc92af0a6045abb75f968a13ea5491a23a3040 Mon Sep 17 00:00:00 2001 From: Caesar Wang Date: Thu, 14 Feb 2019 10:01:12 +0800 Subject: [PATCH] regulator: core: Fix device link error when registering regulator The sysfs device link can only be created after regulator device registered. Otherwise, the regulator always have some warning logs. ... [ 1.033024] DCDC_REG1: supplied by vcc5v0_sys [ 1.033427] vcc5v0_sys: could not add device link regulator.3 err -2 [ 1.034302] vdd_center: 750 <--> 1350 mV at 900 mV [ 1.034862] rk808 0-0020: Looking up vcc2-supply from device tree [ 1.034907] DCDC_REG2: supplied by vcc5v0_sys [ 1.035298] vcc5v0_sys: could not add device link regulator.4 err -2 [ 1.036301] vdd_cpu_l: 750 <--> 1350 mV at 900 mV [ 1.036837] rk808 0-0020: Looking up vcc3-supply from device tree [ 1.036880] DCDC_REG3: supplied by vcc5v0_sys [ 1.037271] vcc5v0_sys: could not add device link regulator.5 err -2 [ 1.037985] vcc_ddr: at 500 mV [ 1.038508] rk808 0-0020: Looking up vcc4-supply from device tree [ 1.038550] DCDC_REG4: supplied by vcc5v0_sys [ 1.038941] vcc5v0_sys: could not add device link regulator.6 err -2 [ 1.039657] vcc3v3_sys: 3300 mV [ 1.040179] rk808 0-0020: Looking up vcc9-supply from device tree [ 1.040223] DCDC_REG5: supplied by vcc5v0_sys Fixes: c438b9d017362 ("regulator: core: Move registration of regulator device") Change-Id: Ie20421eab45f3f8229a5bedf3fecf99c757160bb Signed-off-by: Caesar Wang --- drivers/regulator/core.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index a93c76762c23..389dadd89fda 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -1337,12 +1337,15 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, if (regulator->supply_name == NULL) goto overflow_err; - err = sysfs_create_link_nowarn(&rdev->dev.kobj, &dev->kobj, - buf); - if (err) { - rdev_dbg(rdev, "could not add device link %s err %d\n", - dev->kobj.name, err); - /* non-fatal */ + if (device_is_registered(dev)) { + err = sysfs_create_link_nowarn(&rdev->dev.kobj, + &dev->kobj, buf); + if (err) { + rdev_dbg(rdev, + "could not add device link %s err %d\n", + dev->kobj.name, err); + /* non-fatal */ + } } } else { regulator->supply_name = kstrdup(supply_name, GFP_KERNEL); @@ -4411,6 +4414,19 @@ regulator_register(const struct regulator_desc *regulator_desc, } dev_set_drvdata(&rdev->dev, rdev); + + /* Add a link to the device sysfs entry */ + if (rdev->supply && rdev->supply->dev) { + ret = sysfs_create_link_nowarn(&rdev->supply->dev->kobj, + &rdev->dev.kobj, + rdev->supply->supply_name); + if (ret) { + rdev_dbg(rdev, "could not add device link %s err %d\n", + rdev->dev.kobj.name, ret); + /* non-fatal */ + } + } + rdev_init_debugfs(rdev); rdev_init_early_min_volt(rdev);