Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: mtk-vcodec: Get rid of mtk_smi_larb_get/put

MediaTek IOMMU has already added the device_link between the consumer
and smi-larb device. If the vcodec devices call the pm_runtime_get_sync,
the smi-larb's pm_runtime_get_sync also be called automatically.

CC: Irui Wang <irui.wang@mediatek.com>
Signed-off-by: Yong Wu <yong.wu@mediatek.com>
Reviewed-by: Evan Green <evgreen@chromium.org>
Acked-by: Tiffany Lin <tiffany.lin@mediatek.com>
Reviewed-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>

authored by

Yong Wu and committed by
Mauro Carvalho Chehab
bf827570 ce6c24ba

+12 -83
-2
drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
··· 450 450 destroy_workqueue(dev->core_workqueue); 451 451 err_res: 452 452 pm_runtime_disable(dev->pm.dev); 453 - put_device(dev->pm.larbvdec); 454 453 err_dec_pm: 455 454 mtk_vcodec_fw_release(dev->fw_handler); 456 455 return ret; ··· 493 494 494 495 v4l2_device_unregister(&dev->v4l2_dev); 495 496 pm_runtime_disable(dev->pm.dev); 496 - put_device(dev->pm.larbvdec); 497 497 mtk_vcodec_fw_release(dev->fw_handler); 498 498 return 0; 499 499 }
-1
drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c
··· 184 184 return 0; 185 185 err: 186 186 pm_runtime_disable(subdev_dev->pm.dev); 187 - put_device(subdev_dev->pm.larbvdec); 188 187 return ret; 189 188 } 190 189
+6 -35
drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
··· 9 9 #include <linux/of_address.h> 10 10 #include <linux/of_platform.h> 11 11 #include <linux/pm_runtime.h> 12 - #include <soc/mediatek/smi.h> 13 12 14 13 #include "mtk_vcodec_dec_hw.h" 15 14 #include "mtk_vcodec_dec_pm.h" ··· 16 17 17 18 int mtk_vcodec_init_dec_clk(struct platform_device *pdev, struct mtk_vcodec_pm *pm) 18 19 { 19 - struct device_node *node; 20 - struct platform_device *larb_pdev; 21 20 struct mtk_vcodec_clk *dec_clk; 22 21 struct mtk_vcodec_clk_info *clk_info; 23 - int i = 0, ret = 0; 22 + int i = 0, ret; 24 23 25 24 dec_clk = &pm->vdec_clk; 26 - node = of_parse_phandle(pdev->dev.of_node, "mediatek,larb", 0); 27 - if (!node) { 28 - mtk_v4l2_err("of_parse_phandle mediatek,larb fail!"); 29 - return -1; 30 - } 31 - 32 - larb_pdev = of_find_device_by_node(node); 33 - of_node_put(node); 34 - if (WARN_ON(!larb_pdev)) 35 - return -1; 36 - 37 - pm->larbvdec = &larb_pdev->dev; 38 25 pm->dev = &pdev->dev; 39 26 40 27 dec_clk->clk_num = ··· 29 44 dec_clk->clk_info = devm_kcalloc(&pdev->dev, 30 45 dec_clk->clk_num, sizeof(*clk_info), 31 46 GFP_KERNEL); 32 - if (!dec_clk->clk_info) { 33 - ret = -ENOMEM; 34 - goto put_device; 35 - } 47 + if (!dec_clk->clk_info) 48 + return -ENOMEM; 36 49 } else { 37 50 mtk_v4l2_err("Failed to get vdec clock count"); 38 - ret = -EINVAL; 39 - goto put_device; 51 + return -EINVAL; 40 52 } 41 53 42 54 for (i = 0; i < dec_clk->clk_num; i++) { ··· 42 60 "clock-names", i, &clk_info->clk_name); 43 61 if (ret) { 44 62 mtk_v4l2_err("Failed to get clock name id = %d", i); 45 - goto put_device; 63 + return ret; 46 64 } 47 65 clk_info->vcodec_clk = devm_clk_get(&pdev->dev, 48 66 clk_info->clk_name); 49 67 if (IS_ERR(clk_info->vcodec_clk)) { 50 68 mtk_v4l2_err("devm_clk_get (%d)%s fail", i, 51 69 clk_info->clk_name); 52 - ret = PTR_ERR(clk_info->vcodec_clk); 53 - goto put_device; 70 + return PTR_ERR(clk_info->vcodec_clk); 54 71 } 55 72 } 56 73 57 74 return 0; 58 - put_device: 59 - put_device(pm->larbvdec); 60 - return ret; 61 75 } 62 76 EXPORT_SYMBOL_GPL(mtk_vcodec_init_dec_clk); 63 77 ··· 135 157 } 136 158 } 137 159 138 - ret = mtk_smi_larb_get(pm->larbvdec); 139 - if (ret) { 140 - mtk_v4l2_err("mtk_smi_larb_get larbvdec fail %d", ret); 141 - goto error; 142 - } 143 160 return; 144 - 145 161 error: 146 162 for (i -= 1; i >= 0; i--) 147 163 clk_disable_unprepare(dec_clk->clk_info[i].vcodec_clk); ··· 163 191 } 164 192 165 193 dec_clk = &pm->vdec_clk; 166 - mtk_smi_larb_put(pm->larbvdec); 167 194 for (i = dec_clk->clk_num - 1; i >= 0; i--) 168 195 clk_disable_unprepare(dec_clk->clk_info[i].vcodec_clk); 169 196 }
-3
drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
··· 214 214 */ 215 215 struct mtk_vcodec_pm { 216 216 struct mtk_vcodec_clk vdec_clk; 217 - struct device *larbvdec; 218 - 219 217 struct mtk_vcodec_clk venc_clk; 220 - struct device *larbvenc; 221 218 struct device *dev; 222 219 }; 223 220
-1
drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c
··· 8 8 #include <media/v4l2-event.h> 9 9 #include <media/v4l2-mem2mem.h> 10 10 #include <media/videobuf2-dma-contig.h> 11 - #include <soc/mediatek/smi.h> 12 11 #include <linux/pm_runtime.h> 13 12 14 13 #include "mtk_vcodec_drv.h"
-2
drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c
··· 371 371 v4l2_device_unregister(&dev->v4l2_dev); 372 372 err_res: 373 373 pm_runtime_disable(dev->pm.dev); 374 - put_device(dev->pm.larbvenc); 375 374 err_enc_pm: 376 375 mtk_vcodec_fw_release(dev->fw_handler); 377 376 return ret; ··· 460 461 461 462 v4l2_device_unregister(&dev->v4l2_dev); 462 463 pm_runtime_disable(dev->pm.dev); 463 - put_device(dev->pm.larbvenc); 464 464 mtk_vcodec_fw_release(dev->fw_handler); 465 465 return 0; 466 466 }
+6 -39
drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c
··· 8 8 #include <linux/of_address.h> 9 9 #include <linux/of_platform.h> 10 10 #include <linux/pm_runtime.h> 11 - #include <soc/mediatek/smi.h> 12 11 13 12 #include "mtk_vcodec_enc_pm.h" 14 13 #include "mtk_vcodec_util.h" 15 14 16 15 int mtk_vcodec_init_enc_clk(struct mtk_vcodec_dev *mtkdev) 17 16 { 18 - struct device_node *node; 19 17 struct platform_device *pdev; 20 18 struct mtk_vcodec_pm *pm; 21 19 struct mtk_vcodec_clk *enc_clk; 22 20 struct mtk_vcodec_clk_info *clk_info; 23 - int ret = 0, i = 0; 24 - struct device *dev; 21 + int ret, i; 25 22 26 23 pdev = mtkdev->plat_dev; 27 24 pm = &mtkdev->pm; 28 25 memset(pm, 0, sizeof(struct mtk_vcodec_pm)); 29 26 pm->dev = &pdev->dev; 30 - dev = &pdev->dev; 31 27 enc_clk = &pm->venc_clk; 32 - 33 - node = of_parse_phandle(dev->of_node, "mediatek,larb", 0); 34 - if (!node) { 35 - mtk_v4l2_err("no mediatek,larb found"); 36 - return -ENODEV; 37 - } 38 - pdev = of_find_device_by_node(node); 39 - of_node_put(node); 40 - if (!pdev) { 41 - mtk_v4l2_err("no mediatek,larb device found"); 42 - return -ENODEV; 43 - } 44 - pm->larbvenc = &pdev->dev; 45 - pdev = mtkdev->plat_dev; 46 - pm->dev = &pdev->dev; 47 28 48 29 enc_clk->clk_num = of_property_count_strings(pdev->dev.of_node, 49 30 "clock-names"); ··· 32 51 enc_clk->clk_info = devm_kcalloc(&pdev->dev, 33 52 enc_clk->clk_num, sizeof(*clk_info), 34 53 GFP_KERNEL); 35 - if (!enc_clk->clk_info) { 36 - ret = -ENOMEM; 37 - goto put_larbvenc; 38 - } 54 + if (!enc_clk->clk_info) 55 + return -ENOMEM; 39 56 } else { 40 57 mtk_v4l2_err("Failed to get venc clock count"); 41 - ret = -EINVAL; 42 - goto put_larbvenc; 58 + return -EINVAL; 43 59 } 44 60 45 61 for (i = 0; i < enc_clk->clk_num; i++) { ··· 45 67 "clock-names", i, &clk_info->clk_name); 46 68 if (ret) { 47 69 mtk_v4l2_err("venc failed to get clk name %d", i); 48 - goto put_larbvenc; 70 + return ret; 49 71 } 50 72 clk_info->vcodec_clk = devm_clk_get(&pdev->dev, 51 73 clk_info->clk_name); 52 74 if (IS_ERR(clk_info->vcodec_clk)) { 53 75 mtk_v4l2_err("venc devm_clk_get (%d)%s fail", i, 54 76 clk_info->clk_name); 55 - ret = PTR_ERR(clk_info->vcodec_clk); 56 - goto put_larbvenc; 77 + return PTR_ERR(clk_info->vcodec_clk); 57 78 } 58 79 } 59 80 60 81 return 0; 61 - 62 - put_larbvenc: 63 - put_device(pm->larbvenc); 64 - return ret; 65 82 } 66 83 67 84 void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm) ··· 73 100 } 74 101 } 75 102 76 - ret = mtk_smi_larb_get(pm->larbvenc); 77 - if (ret) { 78 - mtk_v4l2_err("mtk_smi_larb_get larb3 fail %d", ret); 79 - goto clkerr; 80 - } 81 103 return; 82 104 83 105 clkerr: ··· 85 117 struct mtk_vcodec_clk *enc_clk = &pm->venc_clk; 86 118 int i = 0; 87 119 88 - mtk_smi_larb_put(pm->larbvenc); 89 120 for (i = enc_clk->clk_num - 1; i >= 0; i--) 90 121 clk_disable_unprepare(enc_clk->clk_info[i].vcodec_clk); 91 122 }