media: rockchip: isp/ispp add lock for multi dev runtime

Change-Id: If4cb8f6c6e1f99102c8a9bb23d06eaf609d0b86e
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2020-11-14 11:12:44 +08:00
committed by Tao Huang
parent ff78b5290b
commit 44673b5ea7
6 changed files with 26 additions and 16 deletions

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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 */

View File

@@ -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 = {

View File

@@ -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;

View File

@@ -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;
};