提交 1da1b362 编写于 作者: G Geert Uytterhoeven

base: soc: Early register bus when needed

If soc_device_register() is called before soc_bus_register(), it crashes
with a NULL pointer dereference.

soc_bus_register() is already a core_initcall(), but drivers/base/ is
entered later than e.g. drivers/pinctrl/ and drivers/soc/. Hence there
are several subsystems that may need to know SoC revision information,
while it's not so easy to initialize the SoC bus even earlier using an
initcall.

To fix this, let soc_device_register() register the bus early if that
hasn't happened yet.
Signed-off-by: NGeert Uytterhoeven <geert+renesas@glider.be>
Acked-by: NArnd Bergmann <arnd@arndb.de>
上级 1001354c
...@@ -113,6 +113,12 @@ struct soc_device *soc_device_register(struct soc_device_attribute *soc_dev_attr ...@@ -113,6 +113,12 @@ struct soc_device *soc_device_register(struct soc_device_attribute *soc_dev_attr
struct soc_device *soc_dev; struct soc_device *soc_dev;
int ret; int ret;
if (!soc_bus_type.p) {
ret = bus_register(&soc_bus_type);
if (ret)
goto out1;
}
soc_dev = kzalloc(sizeof(*soc_dev), GFP_KERNEL); soc_dev = kzalloc(sizeof(*soc_dev), GFP_KERNEL);
if (!soc_dev) { if (!soc_dev) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -156,6 +162,9 @@ void soc_device_unregister(struct soc_device *soc_dev) ...@@ -156,6 +162,9 @@ void soc_device_unregister(struct soc_device *soc_dev)
static int __init soc_bus_register(void) static int __init soc_bus_register(void)
{ {
if (soc_bus_type.p)
return 0;
return bus_register(&soc_bus_type); return bus_register(&soc_bus_type);
} }
core_initcall(soc_bus_register); core_initcall(soc_bus_register);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册