Patch "drm: bridge: adv7511: unregister cec i2c device after cec adapter" has been added to the 6.0-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    drm: bridge: adv7511: unregister cec i2c device after cec adapter

to the 6.0-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drm-bridge-adv7511-unregister-cec-i2c-device-after-c.patch
and it can be found in the queue-6.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e10c1640a17169acbfb342521067c3dbf9c563bb
Author: Alvin Šipraga <alsi@xxxxxxxxxxxxxxx>
Date:   Sun Jun 12 16:48:54 2022 +0200

    drm: bridge: adv7511: unregister cec i2c device after cec adapter
    
    [ Upstream commit 40cdb02cb9f965732eb543d47f15bef8d10f0f5f ]
    
    cec_unregister_adapter() assumes that the underlying adapter ops are
    callable. For example, if the CEC adapter currently has a valid physical
    address, then the unregistration procedure will invalidate the physical
    address by setting it to f.f.f.f. Whence the following kernel oops
    observed after removing the adv7511 module:
    
        Unable to handle kernel execution of user memory at virtual address 0000000000000000
        Internal error: Oops: 86000004 [#1] PREEMPT_RT SMP
        Call trace:
         0x0
         adv7511_cec_adap_log_addr+0x1ac/0x1c8 [adv7511]
         cec_adap_unconfigure+0x44/0x90 [cec]
         __cec_s_phys_addr.part.0+0x68/0x230 [cec]
         __cec_s_phys_addr+0x40/0x50 [cec]
         cec_unregister_adapter+0xb4/0x118 [cec]
         adv7511_remove+0x60/0x90 [adv7511]
         i2c_device_remove+0x34/0xe0
         device_release_driver_internal+0x114/0x1f0
         driver_detach+0x54/0xe0
         bus_remove_driver+0x60/0xd8
         driver_unregister+0x34/0x60
         i2c_del_driver+0x2c/0x68
         adv7511_exit+0x1c/0x67c [adv7511]
         __arm64_sys_delete_module+0x154/0x288
         invoke_syscall+0x48/0x100
         el0_svc_common.constprop.0+0x48/0xe8
         do_el0_svc+0x28/0x88
         el0_svc+0x1c/0x50
         el0t_64_sync_handler+0xa8/0xb0
         el0t_64_sync+0x15c/0x160
        Code: bad PC value
        ---[ end trace 0000000000000000 ]---
    
    Protect against this scenario by unregistering i2c_cec after
    unregistering the CEC adapter. Duly disable the CEC clock afterwards
    too.
    
    Fixes: 3b1b975003e4 ("drm: adv7511/33: add HDMI CEC support")
    Signed-off-by: Alvin Šipraga <alsi@xxxxxxxxxxxxxxx>
    Reviewed-by: Robert Foss <robert.foss@xxxxxxxxxx>
    Signed-off-by: Robert Foss <robert.foss@xxxxxxxxxx>
    Link: https://patchwork.freedesktop.org/patch/msgid/20220612144854.2223873-3-alvin@xxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index 38bf28720f3a..6031bdd92342 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -1340,9 +1340,6 @@ static int adv7511_remove(struct i2c_client *i2c)
 {
 	struct adv7511 *adv7511 = i2c_get_clientdata(i2c);
 
-	i2c_unregister_device(adv7511->i2c_cec);
-	clk_disable_unprepare(adv7511->cec_clk);
-
 	adv7511_uninit_regulators(adv7511);
 
 	drm_bridge_remove(&adv7511->bridge);
@@ -1350,6 +1347,8 @@ static int adv7511_remove(struct i2c_client *i2c)
 	adv7511_audio_exit(adv7511);
 
 	cec_unregister_adapter(adv7511->cec_adap);
+	i2c_unregister_device(adv7511->i2c_cec);
+	clk_disable_unprepare(adv7511->cec_clk);
 
 	i2c_unregister_device(adv7511->i2c_packet);
 	i2c_unregister_device(adv7511->i2c_edid);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux