diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 7ea7979d89f4..c3d337456472 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -403,7 +403,7 @@ void mpp_free_task(struct kref *ref) session->index, task->task_index, task->state, atomic_read(&task->abort_request)); - mpp = mpp_get_task_used_device(task, session); + mpp = session->mpp; if (!mpp) { mpp_err("task %d:%d mpp is null.\n", session->index, task->task_index); @@ -789,7 +789,6 @@ static int mpp_attach_service(struct mpp_dev *mpp, struct device *dev) goto err_put_pdev; } - mpp->pdev_srv = pdev; mpp->srv = platform_get_drvdata(pdev); if (!mpp->srv) { dev_err(&pdev->dev, "failed attach service\n"); @@ -1864,7 +1863,7 @@ int mpp_dev_remove(struct mpp_dev *mpp) mpp->hw_ops->exit(mpp); mpp_iommu_remove(mpp->iommu_info); - platform_device_put(mpp->pdev_srv); + platform_device_put(to_platform_device(mpp->dev)); mpp_detach_workqueue(mpp); device_init_wakeup(mpp->dev, false); pm_runtime_disable(mpp->dev); @@ -1872,6 +1871,26 @@ int mpp_dev_remove(struct mpp_dev *mpp) return 0; } +void mpp_dev_shutdown(struct platform_device *pdev) +{ + int ret; + int val; + struct device *dev = &pdev->dev; + struct mpp_dev *mpp = dev_get_drvdata(dev); + + dev_info(dev, "shutdown device\n"); + + atomic_inc(&mpp->srv->shutdown_request); + ret = readx_poll_timeout(atomic_read, + &mpp->task_count, + val, val == 0, 20000, 200000); + if (ret == -ETIMEDOUT) + dev_err(dev, "wait total %d running time out\n", + atomic_read(&mpp->task_count)); + else + dev_info(dev, "shutdown success\n"); +} + int mpp_dev_register_srv(struct mpp_dev *mpp, struct mpp_service *srv) { enum MPP_DEVICE_TYPE device_type = mpp->var->device_type; diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h index 04feba31d401..e63b796d5a81 100644 --- a/drivers/video/rockchip/mpp/mpp_common.h +++ b/drivers/video/rockchip/mpp/mpp_common.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #define MHZ (1000 * 1000) @@ -321,7 +322,6 @@ struct mpp_dev { struct mpp_taskqueue *queue; struct mpp_reset_group *reset_group; /* point to MPP Service */ - struct platform_device *pdev_srv; struct mpp_service *srv; /* multi-core data */ @@ -606,6 +606,7 @@ int mpp_session_deinit(struct mpp_session *session); int mpp_dev_probe(struct mpp_dev *mpp, struct platform_device *pdev); int mpp_dev_remove(struct mpp_dev *mpp); +void mpp_dev_shutdown(struct platform_device *pdev); int mpp_dev_register_srv(struct mpp_dev *mpp, struct mpp_service *srv); int mpp_power_on(struct mpp_dev *mpp); diff --git a/drivers/video/rockchip/mpp/mpp_iep2.c b/drivers/video/rockchip/mpp/mpp_iep2.c index 45b7469f564e..9fb2cedbace1 100644 --- a/drivers/video/rockchip/mpp/mpp_iep2.c +++ b/drivers/video/rockchip/mpp/mpp_iep2.c @@ -941,7 +941,7 @@ static int iep2_probe(struct platform_device *pdev) return -ENOMEM; mpp = &iep->mpp; - platform_set_drvdata(pdev, iep); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_iep2_match, pdev->dev.of_node); @@ -977,39 +977,22 @@ static int iep2_probe(struct platform_device *pdev) static int iep2_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct iep2_dev *iep = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct iep2_dev *iep = to_iep2_dev(mpp); dma_free_coherent(dev, iep->roi.size, iep->roi.vaddr, iep->roi.iova); dev_info(dev, "remove device\n"); - mpp_dev_remove(&iep->mpp); - iep2_procfs_remove(&iep->mpp); + mpp_dev_remove(mpp); + iep2_procfs_remove(mpp); return 0; } -static void iep2_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct iep2_dev *iep = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &iep->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 20000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); -} - struct platform_driver rockchip_iep2_driver = { .probe = iep2_probe, .remove = iep2_remove, - .shutdown = iep2_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = IEP2_DRIVER_NAME, .of_match_table = of_match_ptr(mpp_iep2_match), diff --git a/drivers/video/rockchip/mpp/mpp_jpgdec.c b/drivers/video/rockchip/mpp/mpp_jpgdec.c index 524e2d521437..5cf4cddaeb43 100644 --- a/drivers/video/rockchip/mpp/mpp_jpgdec.c +++ b/drivers/video/rockchip/mpp/mpp_jpgdec.c @@ -572,9 +572,9 @@ static int jpgdec_probe(struct platform_device *pdev) dec = devm_kzalloc(dev, sizeof(struct jpgdec_dev), GFP_KERNEL); if (!dec) return -ENOMEM; - platform_set_drvdata(pdev, dec); - mpp = &dec->mpp; + platform_set_drvdata(pdev, mpp); + if (pdev->dev.of_node) { match = of_match_node(mpp_jpgdec_dt_match, pdev->dev.of_node); if (match) @@ -609,37 +609,19 @@ static int jpgdec_probe(struct platform_device *pdev) static int jpgdec_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct jpgdec_dev *dec = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); dev_info(dev, "remove device\n"); - mpp_dev_remove(&dec->mpp); - jpgdec_procfs_remove(&dec->mpp); + mpp_dev_remove(mpp); + jpgdec_procfs_remove(mpp); return 0; } -static void jpgdec_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct jpgdec_dev *dec = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &dec->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 20000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); -} - struct platform_driver rockchip_jpgdec_driver = { .probe = jpgdec_probe, .remove = jpgdec_remove, - .shutdown = jpgdec_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = JPGDEC_DRIVER_NAME, .of_match_table = of_match_ptr(mpp_jpgdec_dt_match), diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec.c b/drivers/video/rockchip/mpp/mpp_rkvdec.c index 2cd0625f164c..f18f2c6624f6 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec.c @@ -1873,7 +1873,7 @@ static int rkvdec_probe(struct platform_device *pdev) return -ENOMEM; mpp = &dec->mpp; - platform_set_drvdata(pdev, dec); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_rkvdec_dt_match, @@ -1919,28 +1919,10 @@ static int rkvdec_remove(struct platform_device *pdev) return 0; } -static void rkvdec_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct rkvdec_dev *dec = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &dec->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 20000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); -} - struct platform_driver rockchip_rkvdec_driver = { .probe = rkvdec_probe, .remove = rkvdec_remove, - .shutdown = rkvdec_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = RKVDEC_DRIVER_NAME, .of_match_table = of_match_ptr(mpp_rkvdec_dt_match), diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c index 3609e3c427fb..4a77fd7e92e1 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c @@ -1077,7 +1077,7 @@ static int rkvdec2_core_probe(struct platform_device *pdev) return -ENOMEM; mpp = &dec->mpp; - platform_set_drvdata(pdev, dec); + platform_set_drvdata(pdev, mpp); if (dev->of_node) { struct device_node *np = pdev->dev.of_node; @@ -1141,7 +1141,7 @@ static int rkvdec2_probe_default(struct platform_device *pdev) return -ENOMEM; mpp = &dec->mpp; - platform_set_drvdata(pdev, dec); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_rkvdec2_dt_match, pdev->dev.of_node); @@ -1231,14 +1231,15 @@ static int rkvdec2_remove(struct platform_device *pdev) dev_info(dev, "remove ccu device\n"); rkvdec2_ccu_remove(dev); } else { - struct rkvdec2_dev *dec = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); dev_info(dev, "remove device\n"); rkvdec2_free_rcbbuf(pdev, dec); - mpp_dev_remove(&dec->mpp); - rkvdec2_procfs_remove(&dec->mpp); - rkvdec2_link_remove(&dec->mpp, dec->link_dec); + mpp_dev_remove(mpp); + rkvdec2_procfs_remove(mpp); + rkvdec2_link_remove(mpp, dec->link_dec); } return 0; @@ -1248,21 +1249,8 @@ static void rkvdec2_shutdown(struct platform_device *pdev) { struct device *dev = &pdev->dev; - if (!strstr(dev_name(dev), "ccu")) { - int ret; - int val; - struct rkvdec2_dev *dec = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &dec->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 20000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); - } + if (!strstr(dev_name(dev), "ccu")) + mpp_dev_shutdown(pdev); } struct platform_driver rockchip_rkvdec2_driver = { diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c index 9352297ff386..c73f9dff1263 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -1433,7 +1433,7 @@ static int rkvenc_probe(struct platform_device *pdev) if (!enc) return -ENOMEM; mpp = &enc->mpp; - platform_set_drvdata(pdev, enc); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_rkvenc_dt_match, pdev->dev.of_node); @@ -1472,39 +1472,19 @@ failed_get_irq: static int rkvenc_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct rkvenc_dev *enc = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); dev_info(dev, "remove device\n"); - mpp_dev_remove(&enc->mpp); - rkvenc_procfs_remove(&enc->mpp); + mpp_dev_remove(mpp); + rkvenc_procfs_remove(mpp); return 0; } -static void rkvenc_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct rkvenc_dev *enc = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &enc->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 1000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); - - dev_info(dev, "shutdown success\n"); -} - struct platform_driver rockchip_rkvenc_driver = { .probe = rkvenc_probe, .remove = rkvenc_remove, - .shutdown = rkvenc_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = RKVENC_DRIVER_NAME, .of_match_table = of_match_ptr(mpp_rkvenc_dt_match), diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc2.c b/drivers/video/rockchip/mpp/mpp_rkvenc2.c index c13211e7c6a3..8628c44d5d83 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc2.c @@ -1511,7 +1511,7 @@ static int rkvenc_core_probe(struct platform_device *pdev) return -ENOMEM; mpp = &enc->mpp; - platform_set_drvdata(pdev, enc); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { struct device_node *np = pdev->dev.of_node; @@ -1571,7 +1571,7 @@ static int rkvenc_probe_default(struct platform_device *pdev) return -ENOMEM; mpp = &enc->mpp; - platform_set_drvdata(pdev, enc); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_rkvenc_dt_match, pdev->dev.of_node); @@ -1652,7 +1652,8 @@ static int rkvenc_remove(struct platform_device *pdev) if (strstr(np->name, "ccu")) { dev_info(dev, "remove ccu\n"); } else if (strstr(np->name, "core")) { - struct rkvenc_dev *enc = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct rkvenc_dev *enc = to_rkvenc_dev(mpp); dev_info(dev, "remove core\n"); if (enc->ccu) { @@ -1665,12 +1666,13 @@ static int rkvenc_remove(struct platform_device *pdev) mpp_dev_remove(&enc->mpp); rkvenc_procfs_remove(&enc->mpp); } else { - struct rkvenc_dev *enc = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct rkvenc_dev *enc = to_rkvenc_dev(mpp); dev_info(dev, "remove device\n"); rkvenc2_free_rcbbuf(pdev, enc); - mpp_dev_remove(&enc->mpp); - rkvenc_procfs_remove(&enc->mpp); + mpp_dev_remove(mpp); + rkvenc_procfs_remove(mpp); } return 0; @@ -1680,25 +1682,8 @@ static void rkvenc_shutdown(struct platform_device *pdev) { struct device *dev = &pdev->dev; - if (!strstr(dev_name(dev), "ccu")) { - int ret; - int val; - struct rkvenc_dev *enc = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &enc->mpp; - - dev_info(dev, "shutdown device\n"); - - if (mpp->srv) - atomic_inc(&mpp->srv->shutdown_request); - - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 1000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); - - } - dev_info(dev, "shutdown success\n"); + if (!strstr(dev_name(dev), "ccu")) + mpp_dev_shutdown(pdev); } struct platform_driver rockchip_rkvenc2_driver = { diff --git a/drivers/video/rockchip/mpp/mpp_vdpu1.c b/drivers/video/rockchip/mpp/mpp_vdpu1.c index adb6b5951b67..7669f538445b 100644 --- a/drivers/video/rockchip/mpp/mpp_vdpu1.c +++ b/drivers/video/rockchip/mpp/mpp_vdpu1.c @@ -795,9 +795,9 @@ static int vdpu_probe(struct platform_device *pdev) dec = devm_kzalloc(dev, sizeof(struct vdpu_dev), GFP_KERNEL); if (!dec) return -ENOMEM; - platform_set_drvdata(pdev, dec); - mpp = &dec->mpp; + platform_set_drvdata(pdev, mpp); + if (pdev->dev.of_node) { match = of_match_node(mpp_vdpu1_dt_match, pdev->dev.of_node); if (match) @@ -837,37 +837,19 @@ static int vdpu_probe(struct platform_device *pdev) static int vdpu_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct vdpu_dev *dec = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); dev_info(dev, "remove device\n"); - mpp_dev_remove(&dec->mpp); - vdpu_procfs_remove(&dec->mpp); + mpp_dev_remove(mpp); + vdpu_procfs_remove(mpp); return 0; } -static void vdpu_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct vdpu_dev *dec = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &dec->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 20000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); -} - struct platform_driver rockchip_vdpu1_driver = { .probe = vdpu_probe, .remove = vdpu_remove, - .shutdown = vdpu_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = VDPU1_DRIVER_NAME, .of_match_table = of_match_ptr(mpp_vdpu1_dt_match), diff --git a/drivers/video/rockchip/mpp/mpp_vdpu2.c b/drivers/video/rockchip/mpp/mpp_vdpu2.c index 7a83333fef3e..c0e8cda6e723 100644 --- a/drivers/video/rockchip/mpp/mpp_vdpu2.c +++ b/drivers/video/rockchip/mpp/mpp_vdpu2.c @@ -687,9 +687,8 @@ static int vdpu_probe(struct platform_device *pdev) dec = devm_kzalloc(dev, sizeof(struct vdpu_dev), GFP_KERNEL); if (!dec) return -ENOMEM; - platform_set_drvdata(pdev, dec); - mpp = &dec->mpp; + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_vdpu2_dt_match, @@ -731,37 +730,19 @@ static int vdpu_probe(struct platform_device *pdev) static int vdpu_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct vdpu_dev *dec = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); dev_info(dev, "remove device\n"); - mpp_dev_remove(&dec->mpp); - vdpu_procfs_remove(&dec->mpp); + mpp_dev_remove(mpp); + vdpu_procfs_remove(mpp); return 0; } -static void vdpu_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct vdpu_dev *dec = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &dec->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 20000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); -} - struct platform_driver rockchip_vdpu2_driver = { .probe = vdpu_probe, .remove = vdpu_remove, - .shutdown = vdpu_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = VDPU2_DRIVER_NAME, .of_match_table = of_match_ptr(mpp_vdpu2_dt_match), diff --git a/drivers/video/rockchip/mpp/mpp_vepu1.c b/drivers/video/rockchip/mpp/mpp_vepu1.c index 975bda09305d..a50a8355b901 100644 --- a/drivers/video/rockchip/mpp/mpp_vepu1.c +++ b/drivers/video/rockchip/mpp/mpp_vepu1.c @@ -722,7 +722,7 @@ static int vepu_probe(struct platform_device *pdev) return -ENOMEM; mpp = &enc->mpp; - platform_set_drvdata(pdev, enc); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_vepu1_dt_match, pdev->dev.of_node); @@ -758,37 +758,19 @@ static int vepu_probe(struct platform_device *pdev) static int vepu_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct vepu_dev *enc = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); dev_info(dev, "remove device\n"); - mpp_dev_remove(&enc->mpp); - vepu_procfs_remove(&enc->mpp); + mpp_dev_remove(mpp); + vepu_procfs_remove(mpp); return 0; } -static void vepu_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct vepu_dev *enc = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &enc->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 20000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); -} - struct platform_driver rockchip_vepu1_driver = { .probe = vepu_probe, .remove = vepu_remove, - .shutdown = vepu_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = VEPU1_DRIVER_NAME, .of_match_table = of_match_ptr(mpp_vepu1_dt_match), diff --git a/drivers/video/rockchip/mpp/mpp_vepu2.c b/drivers/video/rockchip/mpp/mpp_vepu2.c index 6244157b87b2..d9a196d69c78 100644 --- a/drivers/video/rockchip/mpp/mpp_vepu2.c +++ b/drivers/video/rockchip/mpp/mpp_vepu2.c @@ -994,7 +994,7 @@ static int vepu_core_probe(struct platform_device *pdev) return -ENOMEM; mpp = &enc->mpp; - platform_set_drvdata(pdev, enc); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_vepu2_dt_match, pdev->dev.of_node); @@ -1047,7 +1047,7 @@ static int vepu_probe_default(struct platform_device *pdev) return -ENOMEM; mpp = &enc->mpp; - platform_set_drvdata(pdev, enc); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_vepu2_dt_match, pdev->dev.of_node); @@ -1107,7 +1107,8 @@ static int vepu_remove(struct platform_device *pdev) if (strstr(np->name, "ccu")) { dev_info(dev, "remove ccu device\n"); } else if (strstr(np->name, "core")) { - struct vepu_dev *enc = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct vepu_dev *enc = to_vepu_dev(mpp); dev_info(dev, "remove core\n"); if (enc->ccu) { @@ -1119,11 +1120,11 @@ static int vepu_remove(struct platform_device *pdev) mpp_dev_remove(&enc->mpp); vepu_procfs_remove(&enc->mpp); } else { - struct vepu_dev *enc = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); dev_info(dev, "remove device\n"); - mpp_dev_remove(&enc->mpp); - vepu_procfs_remove(&enc->mpp); + mpp_dev_remove(mpp); + vepu_procfs_remove(mpp); } return 0; @@ -1133,24 +1134,8 @@ static void vepu_shutdown(struct platform_device *pdev) { struct device *dev = &pdev->dev; - if (!strstr(dev_name(dev), "ccu")) { - int ret; - int val; - struct vepu_dev *enc = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &enc->mpp; - - dev_info(dev, "shutdown device\n"); - - if (mpp->srv) - atomic_inc(&mpp->srv->shutdown_request); - - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 20000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); - } - dev_info(dev, "shutdown success\n"); + if (!strstr(dev_name(dev), "ccu")) + mpp_dev_shutdown(pdev); } struct platform_driver rockchip_vepu2_driver = {