• Hans de Goede's avatar
    power: supply: bq25890: Fix race causing oops at boot · d01363da
    Hans de Goede authored
    Before this commit the driver was registering its interrupt handler before
    it registered the power_supply, causing bq->charger to potentially be NULL
    when the interrupt handler runs, triggering a NULL pointer exception in
    the interrupt handler:
    
    [   21.213531] BUG: kernel NULL pointer dereference, address: 0000000000000680
    ...
    [   21.213573] Hardware name: Xiaomi Inc Mipad2/Mipad, BIOS MIPad-P4.X64.0043.R03.1603071414 03/07/2016
    [   21.213576] RIP: 0010:__lock_acquire+0x5c5/0x1de0
    ...
    [   21.213629] Call Trace:
    [   21.213636]  ? disable_irq_nosync+0x10/0x10
    [   21.213644]  ? __mutex_unlock_slowpath+0x35/0x260
    [   21.213655]  lock_acquire+0xb5/0x2b0
    [   21.213661]  ? power_supply_changed+0x23/0x90
    [   21.213670]  ? disable_irq_nosync+0x10/0x10
    [   21.213676]  _raw_spin_lock_irqsave+0x48/0x60
    [   21.213682]  ? power_supply_changed+0x23/0x90
    [   21.213687]  power_supply_changed+0x23/0x90
    [   21.213697]  __bq25890_handle_irq+0x5e/0xe0 [bq25890_charger]
    [   21.213709]  bq25890_irq_handler_thread+0x26/0x40 [bq25890_charger]
    [   21.213718]  irq_thread_fn+0x20/0x60
    ...
    
    Fix this by moving the power_supply_register() call to above the
    request_threaded_irq() call.
    
    Note this fix includes making the following 2 (necessary) changes:
    
    1. Switch to the devm version of power_supply_register() to avoid the
    need to make the error-handling in probe() more complicated.
    
    2. Rename the "irq_fail" label to "err_unregister_usb_notifier" since
    the old name no longer makes sense after this fix.
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
    d01363da
bq25890_charger.c 27.8 KB