From dd8ed58c0748165bbe2ac82fc64fdcab10b2250d Mon Sep 17 00:00:00 2001 From: Ding Wei Date: Mon, 28 Feb 2022 11:37:27 +0800 Subject: [PATCH] video: rockchip: mpp: Iusse for insmod/rmmod rk_vcodec.ko tips: 1.In mpp_dev_remove, it wrong to device put mpp->pdev, and the true is srv->pdev. 2. It is no used following, thus, put it directly. backtrace: [ 119.059922 ][ T2179 ] refcount_warn_saturate+0xe0/0x150 [ 119.059930 ][ T2179 ] klist_next+0x108/0x10c [ 119.059938 ][ T2179 ] bus_for_each_dev+0x6c/0xd0 [ 119.059945 ][ T2179 ] driver_attach+0x28/0x38 [ 119.059951 ][ T2179 ] bus_add_driver+0x108/0x1e8 [ 119.059956 ][ T2179 ] driver_register+0x7c/0x118 [ 119.059963 ][ T2179 ] __platform_driver_register+0x48/0x58 [ 119.060018 ][ T2179 ] mpp_add_driver+0xf8/0x140 [rk_vcodec] [ 119.060068 ][ T2179 ] mpp_service_probe+0x43c/0x550 [rk_vcodec] [ 119.060075 ][ T2179 ] platform_drv_probe+0x9c/0xc4 [ 119.060081 ][ T2179 ] really_probe+0x204/0x510 [ 119.060087 ][ T2179 ] driver_probe_device+0x80/0xc0 [ 119.060093 ][ T2179 ] device_driver_attach+0x70/0xb4 [ 119.060099 ][ T2179 ] __driver_attach+0xc8/0x150 [ 119.060104 ][ T2179 ] bus_for_each_dev+0x80/0xd0 [ 119.060109 ][ T2179 ] driver_attach+0x28/0x38 [ 119.060114 ][ T2179 ] bus_add_driver+0x108/0x1e8 [ 119.060120 ][ T2179 ] driver_register+0x7c/0x118 [ 119.060127 ][ T2179 ] __platform_driver_register+0x48/0x58 [ 119.060175 ][ T2179 ] init_module+0x24/0xfe8 [rk_vcodec] [ 119.060184 ][ T2179 ] do_one_initcall+0x98/0x2dc [ 119.060192 ][ T2179 ] do_init_module+0x60/0x21c [ 119.060197 ][ T2179 ] load_module+0x2cf0/0x34a8 [ 119.060203 ][ T2179 ] __arm64_sys_finit_module+0xbc/0xfc [ 119.060211 ][ T2179 ] el0_svc_common+0xc0/0x23c [ 119.060217 ][ T2179 ] do_el0_svc+0x28/0x88 [ 119.060225 ][ T2179 ] el0_svc+0x14/0x24 [ 119.060232 ][ T2179 ] el0_sync_handler+0x88/0xec [ 119.060238 ][ T2179 ] el0_sync+0x1a8/0x1c0 Change-Id: Ib6442228d27dde2ff07336edef02fe391ebeb135 Signed-off-by: Ding Wei --- drivers/video/rockchip/mpp/mpp_common.c | 26 ++++++++----------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 6fdd3d4e79a1..9bd50ae14aa1 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -878,35 +878,32 @@ static int mpp_attach_service(struct mpp_dev *mpp, struct device *dev) of_node_put(np); if (!pdev) { dev_err(dev, "failed to get mpp service from node\n"); - ret = -ENODEV; - goto err_put_pdev; + return -ENODEV; } mpp->srv = platform_get_drvdata(pdev); + platform_device_put(pdev); if (!mpp->srv) { - dev_err(&pdev->dev, "failed attach service\n"); - ret = -EINVAL; - goto err_put_pdev; + dev_err(dev, "failed attach service\n"); + return -EINVAL; } ret = of_property_read_u32(dev->of_node, "rockchip,taskqueue-node", &taskqueue_node); if (ret) { dev_err(dev, "failed to get taskqueue-node\n"); - goto err_put_pdev; + return ret; } else if (taskqueue_node >= mpp->srv->taskqueue_cnt) { dev_err(dev, "taskqueue-node %d must less than %d\n", taskqueue_node, mpp->srv->taskqueue_cnt); - ret = -ENODEV; - goto err_put_pdev; + return -ENODEV; } /* set taskqueue according dtsi */ queue = mpp->srv->task_queues[taskqueue_node]; if (!queue) { dev_err(dev, "taskqueue attach to invalid node %d\n", taskqueue_node); - ret = -ENODEV; - goto err_put_pdev; + return -ENODEV; } mpp_attach_workqueue(mpp, queue); @@ -917,19 +914,13 @@ static int mpp_attach_service(struct mpp_dev *mpp, struct device *dev) if (reset_group_node >= mpp->srv->reset_group_cnt) { dev_err(dev, "resetgroup-node %d must less than %d\n", reset_group_node, mpp->srv->reset_group_cnt); - ret = -ENODEV; - goto err_put_pdev; + return -ENODEV; } else { mpp->reset_group = mpp->srv->reset_groups[reset_group_node]; } } return 0; - -err_put_pdev: - platform_device_put(pdev); - - return ret; } struct mpp_taskqueue *mpp_taskqueue_init(struct device *dev) @@ -2115,7 +2106,6 @@ int mpp_dev_remove(struct mpp_dev *mpp) mpp->hw_ops->exit(mpp); mpp_iommu_remove(mpp->iommu_info); - platform_device_put(to_platform_device(mpp->dev)); mpp_detach_workqueue(mpp); device_init_wakeup(mpp->dev, false); pm_runtime_disable(mpp->dev);