diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c index 9c833529ea0f..6a5e71fa5f24 100644 --- a/drivers/media/platform/rockchip/isp/dev.c +++ b/drivers/media/platform/rockchip/isp/dev.c @@ -795,19 +795,23 @@ static int rkisp_plat_remove(struct platform_device *pdev) static int __maybe_unused rkisp_runtime_suspend(struct device *dev) { struct rkisp_device *isp_dev = dev_get_drvdata(dev); + int ret; - if (atomic_dec_return(&isp_dev->hw_dev->power_cnt)) - return 0; - return pm_runtime_put_sync(isp_dev->hw_dev->dev); + mutex_lock(&isp_dev->hw_dev->dev_lock); + ret = pm_runtime_put_sync(isp_dev->hw_dev->dev); + mutex_unlock(&isp_dev->hw_dev->dev_lock); + return (ret > 0) ? 0 : ret; } static int __maybe_unused rkisp_runtime_resume(struct device *dev) { struct rkisp_device *isp_dev = dev_get_drvdata(dev); + int ret; - if (atomic_inc_return(&isp_dev->hw_dev->power_cnt) > 1) - return 0; - return pm_runtime_get_sync(isp_dev->hw_dev->dev); + mutex_lock(&isp_dev->hw_dev->dev_lock); + ret = pm_runtime_get_sync(isp_dev->hw_dev->dev); + mutex_unlock(&isp_dev->hw_dev->dev_lock); + return (ret > 0) ? 0 : ret; } #ifndef MODULE diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index 026a15db986a..8ae99358ac62 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -690,9 +690,9 @@ static int rkisp_hw_probe(struct platform_device *pdev) hw_dev->cur_dev_id = 0; hw_dev->mipi_dev_id = 0; hw_dev->isp_ver = match_data->isp_ver; + mutex_init(&hw_dev->dev_lock); spin_lock_init(&hw_dev->rdbk_lock); atomic_set(&hw_dev->refcnt, 0); - atomic_set(&hw_dev->power_cnt, 0); spin_lock_init(&hw_dev->buf_lock); INIT_LIST_HEAD(&hw_dev->list); hw_dev->is_idle = true; @@ -713,7 +713,10 @@ err: static int rkisp_hw_remove(struct platform_device *pdev) { + struct rkisp_hw_dev *hw_dev = platform_get_drvdata(pdev); + pm_runtime_disable(&pdev->dev); + mutex_destroy(&hw_dev->dev_lock); return 0; } diff --git a/drivers/media/platform/rockchip/isp/hw.h b/drivers/media/platform/rockchip/isp/hw.h index d3ed23cb8850..abf80e635ab6 100644 --- a/drivers/media/platform/rockchip/isp/hw.h +++ b/drivers/media/platform/rockchip/isp/hw.h @@ -44,7 +44,6 @@ struct rkisp_hw_dev { /* lock for multi dev */ struct mutex dev_lock; spinlock_t rdbk_lock; - atomic_t power_cnt; atomic_t refcnt; /* share buf for multi dev */ diff --git a/drivers/media/platform/rockchip/ispp/dev.c b/drivers/media/platform/rockchip/ispp/dev.c index 43fc2fea8956..7f0a8c0eea51 100644 --- a/drivers/media/platform/rockchip/ispp/dev.c +++ b/drivers/media/platform/rockchip/ispp/dev.c @@ -302,23 +302,29 @@ static int rkispp_plat_remove(struct platform_device *pdev) static int __maybe_unused rkispp_runtime_suspend(struct device *dev) { struct rkispp_device *ispp_dev = dev_get_drvdata(dev); + int ret; - if (atomic_dec_return(&ispp_dev->hw_dev->power_cnt)) - return 0; rkispp_free_common_dummy_buf(ispp_dev); - return pm_runtime_put_sync(ispp_dev->hw_dev->dev); + + mutex_lock(&ispp_dev->hw_dev->dev_lock); + ret = pm_runtime_put_sync(ispp_dev->hw_dev->dev); + mutex_unlock(&ispp_dev->hw_dev->dev_lock); + return (ret > 0) ? 0 : ret; } static int __maybe_unused rkispp_runtime_resume(struct device *dev) { struct rkispp_device *ispp_dev = dev_get_drvdata(dev); + int ret; ispp_dev->isp_mode = rkisp_ispp_mode; ispp_dev->stream_sync = rkispp_stream_sync; ispp_dev->stream_vdev.monitor.is_en = rkispp_monitor; - if (atomic_inc_return(&ispp_dev->hw_dev->power_cnt) > 1) - return 0; - return pm_runtime_get_sync(ispp_dev->hw_dev->dev); + + mutex_lock(&ispp_dev->hw_dev->dev_lock); + ret = pm_runtime_get_sync(ispp_dev->hw_dev->dev); + mutex_unlock(&ispp_dev->hw_dev->dev_lock); + return (ret > 0) ? 0 : ret; } static const struct dev_pm_ops rkispp_plat_pm_ops = { diff --git a/drivers/media/platform/rockchip/ispp/hw.c b/drivers/media/platform/rockchip/ispp/hw.c index 3dc56cd3393e..e8237d8936d5 100644 --- a/drivers/media/platform/rockchip/ispp/hw.c +++ b/drivers/media/platform/rockchip/ispp/hw.c @@ -274,7 +274,6 @@ static int rkispp_hw_probe(struct platform_device *pdev) spin_lock_init(&hw_dev->irq_lock); spin_lock_init(&hw_dev->buf_lock); atomic_set(&hw_dev->refcnt, 0); - atomic_set(&hw_dev->power_cnt, 0); INIT_LIST_HEAD(&hw_dev->list); hw_dev->is_idle = true; hw_dev->is_single = true; diff --git a/drivers/media/platform/rockchip/ispp/hw.h b/drivers/media/platform/rockchip/ispp/hw.h index c3ef66e2ee73..77033d1295b6 100644 --- a/drivers/media/platform/rockchip/ispp/hw.h +++ b/drivers/media/platform/rockchip/ispp/hw.h @@ -45,7 +45,6 @@ struct rkispp_hw_dev { struct mutex dev_lock; spinlock_t buf_lock; atomic_t refcnt; - atomic_t power_cnt; bool is_idle; bool is_single; };