lkml.org 
[lkml]   [2016]   [Oct]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 1/7] base: soc: Early register bus when needed
    Date
    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>
    ---
    v2:
    - Add Acked-by.
    ---
    drivers/base/soc.c | 9 +++++++++
    1 file changed, 9 insertions(+)

    diff --git a/drivers/base/soc.c b/drivers/base/soc.c
    index b63f23e6ad61b647..028cef377fd49959 100644
    --- a/drivers/base/soc.c
    +++ b/drivers/base/soc.c
    @@ -113,6 +113,12 @@ struct soc_device *soc_device_register(struct soc_device_attribute *soc_dev_attr
    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_device *soc_dev)

    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);
    --
    1.9.1
    \
     
     \ /
      Last update: 2016-10-31 12:32    [W:4.320 / U:1.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site