From 570ca7f242ee1307d3a43efca73178b82a531a45 Mon Sep 17 00:00:00 2001 From: Ding Wei Date: Fri, 22 Oct 2021 17:16:19 +0800 Subject: [PATCH] video: rockchip: mpp: fix issue for devices register to service The device must be registered last. If there is an error, the device should not succeed. Change-Id: Ie342c8bbf30e8a94822dcb2e0417fe1230e4482a Signed-off-by: Ding Wei --- drivers/video/rockchip/mpp/mpp_common.c | 14 ++++++++++---- drivers/video/rockchip/mpp/mpp_common.h | 1 + drivers/video/rockchip/mpp/mpp_iep2.c | 2 ++ drivers/video/rockchip/mpp/mpp_jpgdec.c | 2 ++ drivers/video/rockchip/mpp/mpp_rkvdec.c | 2 ++ drivers/video/rockchip/mpp/mpp_rkvdec2.c | 2 ++ drivers/video/rockchip/mpp/mpp_rkvenc.c | 2 ++ drivers/video/rockchip/mpp/mpp_vdpu1.c | 2 ++ drivers/video/rockchip/mpp/mpp_vdpu2.c | 2 ++ drivers/video/rockchip/mpp/mpp_vepu1.c | 2 ++ drivers/video/rockchip/mpp/mpp_vepu2.c | 2 ++ 11 files changed, 29 insertions(+), 4 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 47e1e6bb66f0..63144255eae6 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -927,10 +927,6 @@ static int mpp_attach_service(struct mpp_dev *mpp, struct device *dev) } } - /* register current device to mpp service */ - mpp->srv->sub_devices[mpp->var->device_type] = mpp; - set_bit(mpp->var->device_type, &mpp->srv->hw_support); - return 0; err_put_pdev: @@ -1962,6 +1958,16 @@ int mpp_dev_remove(struct mpp_dev *mpp) return 0; } +int mpp_dev_register_srv(struct mpp_dev *mpp, struct mpp_service *srv) +{ + enum MPP_DEVICE_TYPE device_type = mpp->var->device_type; + + srv->sub_devices[device_type] = mpp; + set_bit(device_type, &srv->hw_support); + + return 0; +} + irqreturn_t mpp_dev_irq(int irq, void *param) { struct mpp_dev *mpp = param; diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h index 53b63feb0355..d6791a4c4cc7 100644 --- a/drivers/video/rockchip/mpp/mpp_common.h +++ b/drivers/video/rockchip/mpp/mpp_common.h @@ -589,6 +589,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); +int mpp_dev_register_srv(struct mpp_dev *mpp, struct mpp_service *srv); int mpp_power_on(struct mpp_dev *mpp); int mpp_power_off(struct mpp_dev *mpp); diff --git a/drivers/video/rockchip/mpp/mpp_iep2.c b/drivers/video/rockchip/mpp/mpp_iep2.c index 0aaf187f0da6..16f729b69398 100644 --- a/drivers/video/rockchip/mpp/mpp_iep2.c +++ b/drivers/video/rockchip/mpp/mpp_iep2.c @@ -967,6 +967,8 @@ static int iep2_probe(struct platform_device *pdev) mpp->session_max_buffers = IEP2_SESSION_MAX_BUFFERS; iep2_procfs_init(mpp); + /* register current device to mpp service */ + mpp_dev_register_srv(mpp, mpp->srv); dev_info(dev, "probing finish\n"); return 0; diff --git a/drivers/video/rockchip/mpp/mpp_jpgdec.c b/drivers/video/rockchip/mpp/mpp_jpgdec.c index 5f1def03ee00..3e94ceef256b 100644 --- a/drivers/video/rockchip/mpp/mpp_jpgdec.c +++ b/drivers/video/rockchip/mpp/mpp_jpgdec.c @@ -599,6 +599,8 @@ static int jpgdec_probe(struct platform_device *pdev) mpp->session_max_buffers = JPGDEC_SESSION_MAX_BUFFERS; jpgdec_procfs_init(mpp); + /* register current device to mpp service */ + mpp_dev_register_srv(mpp, mpp->srv); dev_info(dev, "probing finish\n"); return 0; diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec.c b/drivers/video/rockchip/mpp/mpp_rkvdec.c index f51fa65ba87d..09bea1e86e22 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec.c @@ -1900,6 +1900,8 @@ static int rkvdec_probe(struct platform_device *pdev) mpp->session_max_buffers = RKVDEC_SESSION_MAX_BUFFERS; rkvdec_procfs_init(mpp); + /* register current device to mpp service */ + mpp_dev_register_srv(mpp, mpp->srv); dev_info(dev, "probing finish\n"); return 0; diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c index a75867671ffc..49a594b3512a 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c @@ -1037,6 +1037,8 @@ static int rkvdec2_probe(struct platform_device *pdev) mpp->session_max_buffers = RKVDEC_SESSION_MAX_BUFFERS; rkvdec2_procfs_init(mpp); rkvdec2_link_procfs_init(mpp); + /* register current device to mpp service */ + mpp_dev_register_srv(mpp, mpp->srv); dev_info(dev, "probing finish\n"); return 0; diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c index 9c92c7643b25..50e40f408f15 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -1453,6 +1453,8 @@ static int rkvenc_probe(struct platform_device *pdev) mpp->session_max_buffers = RKVENC_SESSION_MAX_BUFFERS; rkvenc_procfs_init(mpp); + /* register current device to mpp service */ + mpp_dev_register_srv(mpp, mpp->srv); dev_info(dev, "probing finish\n"); return 0; diff --git a/drivers/video/rockchip/mpp/mpp_vdpu1.c b/drivers/video/rockchip/mpp/mpp_vdpu1.c index f6c16295c542..a14f10208ced 100644 --- a/drivers/video/rockchip/mpp/mpp_vdpu1.c +++ b/drivers/video/rockchip/mpp/mpp_vdpu1.c @@ -827,6 +827,8 @@ static int vdpu_probe(struct platform_device *pdev) mpp->session_max_buffers = VDPU1_SESSION_MAX_BUFFERS; vdpu_procfs_init(mpp); + /* register current device to mpp service */ + mpp_dev_register_srv(mpp, mpp->srv); dev_info(dev, "probing finish\n"); return 0; diff --git a/drivers/video/rockchip/mpp/mpp_vdpu2.c b/drivers/video/rockchip/mpp/mpp_vdpu2.c index 49cf098c037b..f6970331bb8e 100644 --- a/drivers/video/rockchip/mpp/mpp_vdpu2.c +++ b/drivers/video/rockchip/mpp/mpp_vdpu2.c @@ -721,6 +721,8 @@ static int vdpu_probe(struct platform_device *pdev) mpp->session_max_buffers = VDPU2_SESSION_MAX_BUFFERS; vdpu_procfs_init(mpp); + /* register current device to mpp service */ + mpp_dev_register_srv(mpp, mpp->srv); dev_info(dev, "probing finish\n"); return 0; diff --git a/drivers/video/rockchip/mpp/mpp_vepu1.c b/drivers/video/rockchip/mpp/mpp_vepu1.c index 1600a7735ffc..aef0ad7b42cb 100644 --- a/drivers/video/rockchip/mpp/mpp_vepu1.c +++ b/drivers/video/rockchip/mpp/mpp_vepu1.c @@ -748,6 +748,8 @@ static int vepu_probe(struct platform_device *pdev) mpp->session_max_buffers = VEPU1_SESSION_MAX_BUFFERS; vepu_procfs_init(mpp); + /* register current device to mpp service */ + mpp_dev_register_srv(mpp, mpp->srv); dev_info(dev, "probing finish\n"); return 0; diff --git a/drivers/video/rockchip/mpp/mpp_vepu2.c b/drivers/video/rockchip/mpp/mpp_vepu2.c index 3cc3823e24f1..75188f28cb28 100644 --- a/drivers/video/rockchip/mpp/mpp_vepu2.c +++ b/drivers/video/rockchip/mpp/mpp_vepu2.c @@ -841,6 +841,8 @@ static int vepu_probe(struct platform_device *pdev) mpp->session_max_buffers = VEPU2_SESSION_MAX_BUFFERS; vepu_procfs_init(mpp); + /* register current device to mpp service */ + mpp_dev_register_srv(mpp, mpp->srv); dev_info(dev, "probing finish\n"); return 0;