| From 0c2851a91abbf4ea96e549c695f89aa2f57bba3d Mon Sep 17 00:00:00 2001 |
| From: Geert Uytterhoeven <geert+renesas@glider.be> |
| Date: Tue, 27 Sep 2016 17:10:29 +0200 |
| Subject: [PATCH 021/299] 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: Geert Uytterhoeven <geert+renesas@glider.be> |
| Acked-by: Arnd Bergmann <arnd@arndb.de> |
| (cherry picked from commit 1da1b3628df34a2a5e38b70c8551770aadce969d) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/base/soc.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/drivers/base/soc.c |
| +++ b/drivers/base/soc.c |
| @@ -113,6 +113,12 @@ struct soc_device *soc_device_register(s |
| struct soc_device *soc_dev; |
| 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); |
| if (!soc_dev) { |
| ret = -ENOMEM; |
| @@ -156,6 +162,9 @@ void soc_device_unregister(struct soc_de |
| |
| static int __init soc_bus_register(void) |
| { |
| + if (soc_bus_type.p) |
| + return 0; |
| + |
| return bus_register(&soc_bus_type); |
| } |
| core_initcall(soc_bus_register); |