From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Paolo Sabatino Date: Wed, 17 Sep 2025 12:03:15 +0200 Subject: Fix Linux kernel complaining about IOMMU page fault rk3288 remove handle does not get called at all because the driver is missing the DM_FLAG_OS_PREPARE flag. Also adds proper reset of VOP clocks to further clean up VOP state. --- drivers/video/rockchip/rk3288_vop.c | 22 +++++++++- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/video/rockchip/rk3288_vop.c b/drivers/video/rockchip/rk3288_vop.c index 111111111111..222222222222 100644 --- a/drivers/video/rockchip/rk3288_vop.c +++ b/drivers/video/rockchip/rk3288_vop.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -69,16 +70,32 @@ static int rk3288_vop_probe(struct udevice *dev) return rk_vop_probe(dev); } -static int rk_vop_remove(struct udevice *dev) +static int rk3288_vop_remove(struct udevice *dev) { struct rk_vop_priv *priv = dev_get_priv(dev); struct rk3288_vop *regs = priv->regs; + struct rk3288_vop *win_regs = priv->regs + priv->win_offset; + struct reset_ctl_bulk resets; + struct reset_ctl dclk_rst; + int ret; setbits_le32(®s->sys_ctrl, V_STANDBY_EN(1)); /* wait frame complete (60Hz) to enter standby */ mdelay(17); + ret = reset_get_bulk(dev, &resets); + if (ret) { + printf("failed to get resets (ret=%d)\n", ret); + return ret; + } + + reset_assert_bulk(&resets); + udelay(20); + + reset_deassert_bulk(&resets); + udelay(20); + return 0; } @@ -103,6 +120,7 @@ U_BOOT_DRIVER(rockchip_rk3288_vop) = { .ops = &rk3288_vop_ops, .bind = rk_vop_bind, .probe = rk3288_vop_probe, - .remove = rk_vop_remove, + .remove = rk3288_vop_remove, .priv_auto = sizeof(struct rk_vop_priv), + .flags = DM_FLAG_OS_PREPARE }; -- Armbian