From 108e05c27157863759ff628a4c992490cfe97cf2 Mon Sep 17 00:00:00 2001 From: Hu Kejun Date: Tue, 23 Apr 2019 17:35:46 +0800 Subject: [PATCH] media: rockchip: cif: clear unready subdevice when kernel boot complete Change-Id: Ib53d8138dce1e9237cf40d776241eaa2ac05f816 Signed-off-by: Hu Kejun --- drivers/media/platform/rockchip/cif/dev.c | 20 ++++++++++++++++++++ drivers/media/platform/rockchip/cif/dev.h | 1 + 2 files changed, 21 insertions(+) diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c index 06534e20542f..5bdbfaebfd9a 100644 --- a/drivers/media/platform/rockchip/cif/dev.c +++ b/drivers/media/platform/rockchip/cif/dev.c @@ -43,6 +43,9 @@ MODULE_PARM_DESC(version, "version number"); int using_pingpong; +static DEFINE_MUTEX(rkcif_dev_mutex); +static LIST_HEAD(rkcif_device_list); + /***************************** media controller *******************************/ static int rkcif_create_links(struct rkcif_device *dev) { @@ -632,6 +635,10 @@ static int rkcif_plat_probe(struct platform_device *pdev) pm_runtime_enable(&pdev->dev); + mutex_lock(&rkcif_dev_mutex); + list_add_tail(&cif_dev->list, &rkcif_device_list); + mutex_unlock(&rkcif_dev_mutex); + return 0; err_unreg_media_dev: @@ -678,6 +685,19 @@ static int __maybe_unused rkcif_runtime_resume(struct device *dev) return 0; } +static int __init rkcif_clr_unready_dev(void) +{ + struct rkcif_device *cif_dev; + + mutex_lock(&rkcif_dev_mutex); + list_for_each_entry(cif_dev, &rkcif_device_list, list) + v4l2_async_notifier_clr_unready_dev(&cif_dev->notifier); + mutex_unlock(&rkcif_dev_mutex); + + return 0; +} +late_initcall_sync(rkcif_clr_unready_dev); + static const struct dev_pm_ops rkcif_plat_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h index f82c7fce5f84..2de4600f4d12 100644 --- a/drivers/media/platform/rockchip/cif/dev.h +++ b/drivers/media/platform/rockchip/cif/dev.h @@ -186,6 +186,7 @@ static inline struct rkcif_stream *to_rkcif_stream(struct video_device *vdev) * @stream: capture video device */ struct rkcif_device { + struct list_head list; struct device *dev; int irq; void __iomem *base_addr;