lkml.org 
[lkml]   [2021]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] power_supply: Register cooling device outside of probe
    Date
    Registering the cooling device from the probe can result in the
    execution of get_property() function before it gets initialized.

    To avoid this, register the cooling device from a workqueue
    instead of registering in the probe.

    Signed-off-by: Manaf Meethalavalappu Pallikunhi <quic_manafm@quicinc.com>
    ---
    drivers/power/supply/power_supply_core.c | 10 ++++------
    1 file changed, 4 insertions(+), 6 deletions(-)

    diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
    index 10a357a..c306b9d 100644
    --- a/drivers/power/supply/power_supply_core.c
    +++ b/drivers/power/supply/power_supply_core.c
    @@ -132,6 +132,7 @@ void power_supply_changed(struct power_supply *psy)
    }
    EXPORT_SYMBOL_GPL(power_supply_changed);

    +static int psy_register_cooler(struct device *dev, struct power_supply *psy);
    /*
    * Notify that power supply was registered after parent finished the probing.
    *
    @@ -139,6 +140,8 @@ EXPORT_SYMBOL_GPL(power_supply_changed);
    * calling power_supply_changed() directly from power_supply_register()
    * would lead to execution of get_property() function provided by the driver
    * too early - before the probe ends.
    + * Also, registering cooling device from the probe will execute the
    + * get_property() function. So register the cooling device after the probe.
    *
    * Avoid that by waiting on parent's mutex.
    */
    @@ -156,6 +159,7 @@ static void power_supply_deferred_register_work(struct work_struct *work)
    }

    power_supply_changed(psy);
    + psy_register_cooler(psy->dev.parent, psy);

    if (psy->dev.parent)
    mutex_unlock(&psy->dev.parent->mutex);
    @@ -1257,10 +1261,6 @@ __power_supply_register(struct device *parent,
    if (rc)
    goto register_thermal_failed;

    - rc = psy_register_cooler(psy);
    - if (rc)
    - goto register_cooler_failed;
    -
    rc = power_supply_create_triggers(psy);
    if (rc)
    goto create_triggers_failed;
    @@ -1290,8 +1290,6 @@ __power_supply_register(struct device *parent,
    add_hwmon_sysfs_failed:
    power_supply_remove_triggers(psy);
    create_triggers_failed:
    - psy_unregister_cooler(psy);
    -register_cooler_failed:
    psy_unregister_thermal(psy);
    register_thermal_failed:
    device_del(dev);
    --
    The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
    a Linux Foundation Collaborative Project
    \
     
     \ /
      Last update: 2021-12-13 12:13    [W:3.440 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site