From a5ff1fa26c02a0d6491163d554498740bb819c2b Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 8 Mar 2019 10:49:17 +0000 Subject: [PATCH 1/5] staging: vc-sm-cma: Remove the debugfs directory on remove Without removing that, reloading the driver fails. Signed-off-by: Dave Stevenson --- drivers/staging/vc04_services/vc-sm-cma/vc_sm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c b/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c index 4bc738a2abf34a..f70e3e7aedb357 100644 --- a/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c +++ b/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c @@ -757,7 +757,7 @@ static int bcm2835_vc_sm_cma_remove(struct platform_device *pdev) pr_debug("[%s]: start\n", __func__); if (sm_inited) { /* Remove all proc entries. */ - //debugfs_remove_recursive(sm_state->dir_root); + debugfs_remove_recursive(sm_state->dir_root); /* Stop the videocore shared memory service. */ vc_sm_cma_vchi_stop(&sm_state->sm_handle); From 8a349fc9a9ccbaf3ef292ea7ec1da1e4c2317e7b Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 8 Mar 2019 11:06:41 +0000 Subject: [PATCH 2/5] staging: vc-sm-cma: Use devm_ allocs for sm_state. Use managed allocations for sm_state, removing reliance on manual management. Signed-off-by: Dave Stevenson --- drivers/staging/vc04_services/vc-sm-cma/vc_sm.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c b/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c index f70e3e7aedb357..c77d2088b2f5d5 100644 --- a/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c +++ b/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c @@ -656,7 +656,7 @@ static void vc_sm_connected_init(void) __func__, ret); ret = -EIO; - goto err_free_mem; + goto err_failed; } ret = vchi_connect(NULL, 0, vchi_instance); @@ -665,7 +665,7 @@ static void vc_sm_connected_init(void) __func__, ret); ret = -EIO; - goto err_free_mem; + goto err_failed; } /* Initialize an instance of the shared memory service. */ @@ -676,7 +676,7 @@ static void vc_sm_connected_init(void) __func__); ret = -EPERM; - goto err_free_mem; + goto err_failed; } /* Create a debug fs directory entry (root). */ @@ -722,8 +722,7 @@ static void vc_sm_connected_init(void) debugfs_remove_recursive(sm_state->dir_root); err_stop_sm_service: vc_sm_cma_vchi_stop(&sm_state->sm_handle); -err_free_mem: - kfree(sm_state); +err_failed: pr_info("[%s]: failed, ret %d\n", __func__, ret); } @@ -732,7 +731,7 @@ static int bcm2835_vc_sm_cma_probe(struct platform_device *pdev) { pr_info("%s: Videocore shared memory driver\n", __func__); - sm_state = kzalloc(sizeof(*sm_state), GFP_KERNEL); + sm_state = devm_kzalloc(&pdev->dev, sizeof(*sm_state), GFP_KERNEL); if (!sm_state) return -ENOMEM; sm_state->pdev = pdev; @@ -766,7 +765,6 @@ static int bcm2835_vc_sm_cma_remove(struct platform_device *pdev) /* Free the memory for the state structure. */ mutex_destroy(&sm_state->map_lock); - kfree(sm_state); } pr_debug("[%s]: end\n", __func__); From 86f02fe6e9830800466296676dd1839c6038c790 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 8 Mar 2019 11:09:49 +0000 Subject: [PATCH 3/5] staging: vc-sm-cma: Don't fail if debugfs calls fail. Return codes from debugfs calls should never alter the flow of the main code. Signed-off-by: Dave Stevenson --- drivers/staging/vc04_services/vc-sm-cma/vc_sm.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c b/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c index c77d2088b2f5d5..8ae7810f1f9ad0 100644 --- a/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c +++ b/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c @@ -681,13 +681,6 @@ static void vc_sm_connected_init(void) /* Create a debug fs directory entry (root). */ sm_state->dir_root = debugfs_create_dir(VC_SM_DIR_ROOT_NAME, NULL); - if (!sm_state->dir_root) { - pr_err("[%s]: failed to create \'%s\' directory entry\n", - __func__, VC_SM_DIR_ROOT_NAME); - - ret = -EPERM; - goto err_stop_sm_service; - } sm_state->dir_state.show = &vc_sm_cma_global_state_show; sm_state->dir_state.dir_entry = @@ -720,7 +713,6 @@ static void vc_sm_connected_init(void) err_remove_shared_memory: debugfs_remove_recursive(sm_state->dir_root); -err_stop_sm_service: vc_sm_cma_vchi_stop(&sm_state->sm_handle); err_failed: pr_info("[%s]: failed, ret %d\n", __func__, ret); From cf74a1c6331d32de6228d1b71ff86d7104568395 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 8 Mar 2019 11:11:46 +0000 Subject: [PATCH 4/5] staging: vc-sm-cma: Ensure mutex and idr are destroyed map_lock and kernelid_map are created in probe, but not released in release should the vcsm service not connect (eg running the cutdown firmware). Signed-off-by: Dave Stevenson --- drivers/staging/vc04_services/vc-sm-cma/vc_sm.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c b/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c index 8ae7810f1f9ad0..888040e22d3299 100644 --- a/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c +++ b/drivers/staging/vc04_services/vc-sm-cma/vc_sm.c @@ -752,7 +752,9 @@ static int bcm2835_vc_sm_cma_remove(struct platform_device *pdev) /* Stop the videocore shared memory service. */ vc_sm_cma_vchi_stop(&sm_state->sm_handle); + } + if (sm_state) { idr_destroy(&sm_state->kernelid_map); /* Free the memory for the state structure. */ From 42af327defaa969fee6e44770330b3b0d64e60d0 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 8 Mar 2019 11:26:00 +0000 Subject: [PATCH 5/5] staging: bcm2835_codec: Clean up logging on unloading the driver The log line was missing a closing \n, so wasn't added to the log immediately. Adds the function of the V4L2 device that is being unregistered too. Signed-off-by: Dave Stevenson --- .../vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c index eb5c07bc73d063..b022e3621fce6a 100644 --- a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c +++ b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c @@ -77,6 +77,12 @@ enum bcm2835_codec_role { ISP, }; +const static char *roles[] = { + "decode", + "encode", + "isp" +}; + static const char * const components[] = { "ril.video_decode", "ril.video_encode", @@ -2511,7 +2517,6 @@ static int bcm2835_codec_create(struct platform_device *pdev, struct video_device *vfd; int video_nr; int ret; - const static char *roles[] = {"decode", "encode", "isp"}; dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); if (!dev) @@ -2604,7 +2609,8 @@ static int bcm2835_codec_destroy(struct bcm2835_codec_dev *dev) if (!dev) return -ENODEV; - v4l2_info(&dev->v4l2_dev, "Removing " MEM2MEM_NAME); + v4l2_info(&dev->v4l2_dev, "Removing " MEM2MEM_NAME ", %s\n", + roles[dev->role]); v4l2_m2m_release(dev->m2m_dev); video_unregister_device(&dev->vfd); v4l2_device_unregister(&dev->v4l2_dev);