提交 c438b9d0 编写于 作者: J Jon Hunter 提交者: Mark Brown

regulator: core: Move registration of regulator device

The public functions to acquire a regulator, such as regulator_get(),
internally look-up the regulator from the list of regulators that have
been registered with the regulator device class. The registration of
a new regulator with the regulator device class happens before the
regulator has been completely setup. Therefore, it is possible that
the regulator could be acquired before it has been setup successfully.
To avoid this move the device registration of the regulator to the end
of the regulator setup and update the error exit path accordingly.
Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
Signed-off-by: NMark Brown <broonie@kernel.org>
上级 f89ba338
...@@ -3970,14 +3970,6 @@ regulator_register(const struct regulator_desc *regulator_desc, ...@@ -3970,14 +3970,6 @@ regulator_register(const struct regulator_desc *regulator_desc,
if (ret < 0) if (ret < 0)
goto wash; goto wash;
ret = device_register(&rdev->dev);
if (ret != 0) {
put_device(&rdev->dev);
goto wash;
}
dev_set_drvdata(&rdev->dev, rdev);
if (init_data && init_data->supply_regulator) if (init_data && init_data->supply_regulator)
rdev->supply_name = init_data->supply_regulator; rdev->supply_name = init_data->supply_regulator;
else if (regulator_desc->supply_name) else if (regulator_desc->supply_name)
...@@ -3997,9 +3989,17 @@ regulator_register(const struct regulator_desc *regulator_desc, ...@@ -3997,9 +3989,17 @@ regulator_register(const struct regulator_desc *regulator_desc,
} }
} }
rdev_init_debugfs(rdev);
mutex_unlock(&regulator_list_mutex); mutex_unlock(&regulator_list_mutex);
ret = device_register(&rdev->dev);
if (ret != 0) {
put_device(&rdev->dev);
goto unset_supplies;
}
dev_set_drvdata(&rdev->dev, rdev);
rdev_init_debugfs(rdev);
/* try to resolve regulators supply since a new one was registered */ /* try to resolve regulators supply since a new one was registered */
class_for_each_device(&regulator_class, NULL, NULL, class_for_each_device(&regulator_class, NULL, NULL,
regulator_register_resolve_supply); regulator_register_resolve_supply);
...@@ -4008,17 +4008,11 @@ regulator_register(const struct regulator_desc *regulator_desc, ...@@ -4008,17 +4008,11 @@ regulator_register(const struct regulator_desc *regulator_desc,
unset_supplies: unset_supplies:
unset_regulator_supplies(rdev); unset_regulator_supplies(rdev);
regulator_ena_gpio_free(rdev);
device_unregister(&rdev->dev);
/* device core frees rdev */
goto out;
wash: wash:
kfree(rdev->constraints); kfree(rdev->constraints);
regulator_ena_gpio_free(rdev); regulator_ena_gpio_free(rdev);
clean: clean:
kfree(rdev); kfree(rdev);
out:
mutex_unlock(&regulator_list_mutex); mutex_unlock(&regulator_list_mutex);
kfree(config); kfree(config);
return ERR_PTR(ret); return ERR_PTR(ret);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册