• Quanyang Wang's avatar
    drm: xlnx: zynqmp: release reset to DP controller before accessing DP registers · a338619b
    Quanyang Wang authored
    When insmod zynqmp-dpsub.ko after rmmod it, system will hang with the
    error log as below:
    
    root@xilinx-zynqmp:~# insmod zynqmp-dpsub.ko
    [   88.391289] [drm] Initialized zynqmp-dpsub 1.0.0 20130509 for fd4a0000.display on minor 0
    [   88.529906] Console: switching to colour frame buffer device 128x48
    [   88.549402] zynqmp-dpsub fd4a0000.display: [drm] fb0: zynqmp-dpsubdrm frame buffer device
    [   88.571624] zynqmp-dpsub fd4a0000.display: ZynqMP DisplayPort Subsystem driver probed
    root@xilinx-zynqmp:~# rmmod zynqmp_dpsub
    [   94.023404] Console: switching to colour dummy device 80x25
    root@xilinx-zynqmp:~# insmod zynqmp-dpsub.ko
    	<hang here>
    
    This is because that in zynqmp_dp_probe it tries to access some DP
    registers while the DP controller is still in the reset state. When
    running "rmmod zynqmp_dpsub", zynqmp_dp_reset(dp, true) in
    zynqmp_dp_phy_exit is called to force the DP controller into the reset
    state. Then insmod will call zynqmp_dp_probe to program the DP registers,
    but at this moment the DP controller hasn't been brought out of the reset
    state yet since the function zynqmp_dp_reset(dp, false) is called later and
    this will result the system hang.
    
    Releasing the reset to DP controller before any read/write operation to it
    will fix this issue. And for symmetry, move zynqmp_dp_reset() call from
    zynqmp_dp_phy_exit() to zynqmp_dp_remove().
    Signed-off-by: default avatarQuanyang Wang <quanyang.wang@windriver.com>
    Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
    a338619b
zynqmp_dp.c 48.9 KB