mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user