* [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support
@ 2015-01-19 13:22 Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 1/8] [media] exynos-gsc: Simplify clock management Ulf Hansson
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-01-19 13:22 UTC (permalink / raw)
To: linux-arm-kernel
Changes in v2:
- Rebase patches.
- Adapt to changes for the PM core. Especially, the Kconfig option for
CONFIG_PM_RUNTIME has been removed and the runtime PM core is now
build for CONFIG_PM.
This patchset fixup the PM support and adds some minor improvements to
potentially save some more power at runtime PM suspend.
Ulf Hansson (8):
[media] exynos-gsc: Simplify clock management
[media] exynos-gsc: Convert gsc_m2m_resume() from int to void
[media] exynos-gsc: Make driver functional when CONFIG_PM is unset
[media] exynos-gsc: Make runtime PM callbacks available for CONFIG_PM
[media] exynos-gsc: Fixup clock management at ->remove()
[media] exynos-gsc: Do full clock gating at runtime PM suspend
[media] exynos-gsc: Make system PM callbacks available for
CONFIG_PM_SLEEP
[media] exynos-gsc: Simplify system PM
drivers/media/platform/exynos-gsc/gsc-core.c | 183 +++++++++++----------------
drivers/media/platform/exynos-gsc/gsc-core.h | 3 -
2 files changed, 72 insertions(+), 114 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH V2 1/8] [media] exynos-gsc: Simplify clock management
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
@ 2015-01-19 13:22 ` Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 2/8] [media] exynos-gsc: Convert gsc_m2m_resume() from int to void Ulf Hansson
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-01-19 13:22 UTC (permalink / raw)
To: linux-arm-kernel
Instead of having separate functions that fecthes, prepares and
unprepares the clock, let's encapsulate this code into ->probe().
This makes error handling easier and decreases the lines of code.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/media/platform/exynos-gsc/gsc-core.c | 49 ++++++++--------------------
1 file changed, 14 insertions(+), 35 deletions(-)
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
index fd2891c..bd769d4 100644
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
@@ -1003,36 +1003,6 @@ static void *gsc_get_drv_data(struct platform_device *pdev)
return driver_data;
}
-static void gsc_clk_put(struct gsc_dev *gsc)
-{
- if (!IS_ERR(gsc->clock))
- clk_unprepare(gsc->clock);
-}
-
-static int gsc_clk_get(struct gsc_dev *gsc)
-{
- int ret;
-
- dev_dbg(&gsc->pdev->dev, "gsc_clk_get Called\n");
-
- gsc->clock = devm_clk_get(&gsc->pdev->dev, GSC_CLOCK_GATE_NAME);
- if (IS_ERR(gsc->clock)) {
- dev_err(&gsc->pdev->dev, "failed to get clock~~~: %s\n",
- GSC_CLOCK_GATE_NAME);
- return PTR_ERR(gsc->clock);
- }
-
- ret = clk_prepare(gsc->clock);
- if (ret < 0) {
- dev_err(&gsc->pdev->dev, "clock prepare failed for clock: %s\n",
- GSC_CLOCK_GATE_NAME);
- gsc->clock = ERR_PTR(-EINVAL);
- return ret;
- }
-
- return 0;
-}
-
static int gsc_m2m_suspend(struct gsc_dev *gsc)
{
unsigned long flags;
@@ -1101,7 +1071,6 @@ static int gsc_probe(struct platform_device *pdev)
init_waitqueue_head(&gsc->irq_queue);
spin_lock_init(&gsc->slock);
mutex_init(&gsc->lock);
- gsc->clock = ERR_PTR(-EINVAL);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
gsc->regs = devm_ioremap_resource(dev, res);
@@ -1114,9 +1083,19 @@ static int gsc_probe(struct platform_device *pdev)
return -ENXIO;
}
- ret = gsc_clk_get(gsc);
- if (ret)
+ gsc->clock = devm_clk_get(dev, GSC_CLOCK_GATE_NAME);
+ if (IS_ERR(gsc->clock)) {
+ dev_err(dev, "failed to get clock~~~: %s\n",
+ GSC_CLOCK_GATE_NAME);
+ return PTR_ERR(gsc->clock);
+ }
+
+ ret = clk_prepare(gsc->clock);
+ if (ret) {
+ dev_err(&gsc->pdev->dev, "clock prepare failed for clock: %s\n",
+ GSC_CLOCK_GATE_NAME);
return ret;
+ }
ret = devm_request_irq(dev, res->start, gsc_irq_handler,
0, pdev->name, gsc);
@@ -1157,7 +1136,7 @@ err_m2m:
err_v4l2:
v4l2_device_unregister(&gsc->v4l2_dev);
err_clk:
- gsc_clk_put(gsc);
+ clk_unprepare(gsc->clock);
return ret;
}
@@ -1170,7 +1149,7 @@ static int gsc_remove(struct platform_device *pdev)
vb2_dma_contig_cleanup_ctx(gsc->alloc_ctx);
pm_runtime_disable(&pdev->dev);
- gsc_clk_put(gsc);
+ clk_unprepare(gsc->clock);
dev_dbg(&pdev->dev, "%s driver unloaded\n", pdev->name);
return 0;
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH V2 2/8] [media] exynos-gsc: Convert gsc_m2m_resume() from int to void
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 1/8] [media] exynos-gsc: Simplify clock management Ulf Hansson
@ 2015-01-19 13:22 ` Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 3/8] [media] exynos-gsc: Make driver functional when CONFIG_PM is unset Ulf Hansson
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-01-19 13:22 UTC (permalink / raw)
To: linux-arm-kernel
Since gsc_m2m_resume() always returns 0, convert it to a void instead.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/media/platform/exynos-gsc/gsc-core.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
index bd769d4..1865738 100644
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
@@ -1025,7 +1025,7 @@ static int gsc_m2m_suspend(struct gsc_dev *gsc)
return timeout == 0 ? -EAGAIN : 0;
}
-static int gsc_m2m_resume(struct gsc_dev *gsc)
+static void gsc_m2m_resume(struct gsc_dev *gsc)
{
struct gsc_ctx *ctx;
unsigned long flags;
@@ -1038,8 +1038,6 @@ static int gsc_m2m_resume(struct gsc_dev *gsc)
if (test_and_clear_bit(ST_M2M_SUSPENDED, &gsc->state))
gsc_m2m_job_finish(ctx, VB2_BUF_STATE_ERROR);
-
- return 0;
}
static int gsc_probe(struct platform_device *pdev)
@@ -1168,8 +1166,9 @@ static int gsc_runtime_resume(struct device *dev)
gsc_hw_set_sw_reset(gsc);
gsc_wait_reset(gsc);
+ gsc_m2m_resume(gsc);
- return gsc_m2m_resume(gsc);
+ return 0;
}
static int gsc_runtime_suspend(struct device *dev)
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH V2 3/8] [media] exynos-gsc: Make driver functional when CONFIG_PM is unset
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 1/8] [media] exynos-gsc: Simplify clock management Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 2/8] [media] exynos-gsc: Convert gsc_m2m_resume() from int to void Ulf Hansson
@ 2015-01-19 13:22 ` Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 4/8] [media] exynos-gsc: Make runtime PM callbacks available for CONFIG_PM Ulf Hansson
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-01-19 13:22 UTC (permalink / raw)
To: linux-arm-kernel
The driver depended on CONFIG_PM to be functional. Let's remove that
dependency, by enable the runtime PM resourses during ->probe() and
update the device's runtime PM status to reflect this.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/media/platform/exynos-gsc/gsc-core.c | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
index 1865738..532daa8 100644
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
@@ -1088,7 +1088,7 @@ static int gsc_probe(struct platform_device *pdev)
return PTR_ERR(gsc->clock);
}
- ret = clk_prepare(gsc->clock);
+ ret = clk_prepare_enable(gsc->clock);
if (ret) {
dev_err(&gsc->pdev->dev, "clock prepare failed for clock: %s\n",
GSC_CLOCK_GATE_NAME);
@@ -1111,30 +1111,29 @@ static int gsc_probe(struct platform_device *pdev)
goto err_v4l2;
platform_set_drvdata(pdev, gsc);
- pm_runtime_enable(dev);
- ret = pm_runtime_get_sync(&pdev->dev);
- if (ret < 0)
- goto err_m2m;
+
+ gsc_hw_set_sw_reset(gsc);
+ gsc_wait_reset(gsc);
/* Initialize continious memory allocator */
gsc->alloc_ctx = vb2_dma_contig_init_ctx(dev);
if (IS_ERR(gsc->alloc_ctx)) {
ret = PTR_ERR(gsc->alloc_ctx);
- goto err_pm;
+ goto err_m2m;
}
dev_dbg(dev, "gsc-%d registered successfully\n", gsc->id);
- pm_runtime_put(dev);
+ pm_runtime_set_active(dev);
+ pm_runtime_enable(dev);
+
return 0;
-err_pm:
- pm_runtime_put(dev);
err_m2m:
gsc_unregister_m2m_device(gsc);
err_v4l2:
v4l2_device_unregister(&gsc->v4l2_dev);
err_clk:
- clk_unprepare(gsc->clock);
+ clk_disable_unprepare(gsc->clock);
return ret;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH V2 4/8] [media] exynos-gsc: Make runtime PM callbacks available for CONFIG_PM
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
` (2 preceding siblings ...)
2015-01-19 13:22 ` [PATCH V2 3/8] [media] exynos-gsc: Make driver functional when CONFIG_PM is unset Ulf Hansson
@ 2015-01-19 13:22 ` Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 5/8] [media] exynos-gsc: Fixup clock management at ->remove() Ulf Hansson
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-01-19 13:22 UTC (permalink / raw)
To: linux-arm-kernel
There are no need to set up the runtime PM callbacks unless they are
being used. It also causes compiler warnings about unused functions.
Silence the warnings by making them available for CONFIG_PM.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/media/platform/exynos-gsc/gsc-core.c | 79 ++++++++++++++--------------
1 file changed, 40 insertions(+), 39 deletions(-)
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
index 532daa8..e84bc35 100644
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
@@ -1003,43 +1003,6 @@ static void *gsc_get_drv_data(struct platform_device *pdev)
return driver_data;
}
-static int gsc_m2m_suspend(struct gsc_dev *gsc)
-{
- unsigned long flags;
- int timeout;
-
- spin_lock_irqsave(&gsc->slock, flags);
- if (!gsc_m2m_pending(gsc)) {
- spin_unlock_irqrestore(&gsc->slock, flags);
- return 0;
- }
- clear_bit(ST_M2M_SUSPENDED, &gsc->state);
- set_bit(ST_M2M_SUSPENDING, &gsc->state);
- spin_unlock_irqrestore(&gsc->slock, flags);
-
- timeout = wait_event_timeout(gsc->irq_queue,
- test_bit(ST_M2M_SUSPENDED, &gsc->state),
- GSC_SHUTDOWN_TIMEOUT);
-
- clear_bit(ST_M2M_SUSPENDING, &gsc->state);
- return timeout == 0 ? -EAGAIN : 0;
-}
-
-static void gsc_m2m_resume(struct gsc_dev *gsc)
-{
- struct gsc_ctx *ctx;
- unsigned long flags;
-
- spin_lock_irqsave(&gsc->slock, flags);
- /* Clear for full H/W setup in first run after resume */
- ctx = gsc->m2m.ctx;
- gsc->m2m.ctx = NULL;
- spin_unlock_irqrestore(&gsc->slock, flags);
-
- if (test_and_clear_bit(ST_M2M_SUSPENDED, &gsc->state))
- gsc_m2m_job_finish(ctx, VB2_BUF_STATE_ERROR);
-}
-
static int gsc_probe(struct platform_device *pdev)
{
struct gsc_dev *gsc;
@@ -1152,6 +1115,44 @@ static int gsc_remove(struct platform_device *pdev)
return 0;
}
+#ifdef CONFIG_PM
+static int gsc_m2m_suspend(struct gsc_dev *gsc)
+{
+ unsigned long flags;
+ int timeout;
+
+ spin_lock_irqsave(&gsc->slock, flags);
+ if (!gsc_m2m_pending(gsc)) {
+ spin_unlock_irqrestore(&gsc->slock, flags);
+ return 0;
+ }
+ clear_bit(ST_M2M_SUSPENDED, &gsc->state);
+ set_bit(ST_M2M_SUSPENDING, &gsc->state);
+ spin_unlock_irqrestore(&gsc->slock, flags);
+
+ timeout = wait_event_timeout(gsc->irq_queue,
+ test_bit(ST_M2M_SUSPENDED, &gsc->state),
+ GSC_SHUTDOWN_TIMEOUT);
+
+ clear_bit(ST_M2M_SUSPENDING, &gsc->state);
+ return timeout == 0 ? -EAGAIN : 0;
+}
+
+static void gsc_m2m_resume(struct gsc_dev *gsc)
+{
+ struct gsc_ctx *ctx;
+ unsigned long flags;
+
+ spin_lock_irqsave(&gsc->slock, flags);
+ /* Clear for full H/W setup in first run after resume */
+ ctx = gsc->m2m.ctx;
+ gsc->m2m.ctx = NULL;
+ spin_unlock_irqrestore(&gsc->slock, flags);
+
+ if (test_and_clear_bit(ST_M2M_SUSPENDED, &gsc->state))
+ gsc_m2m_job_finish(ctx, VB2_BUF_STATE_ERROR);
+}
+
static int gsc_runtime_resume(struct device *dev)
{
struct gsc_dev *gsc = dev_get_drvdata(dev);
@@ -1182,6 +1183,7 @@ static int gsc_runtime_suspend(struct device *dev)
pr_debug("gsc%d: state: 0x%lx", gsc->id, gsc->state);
return ret;
}
+#endif
static int gsc_resume(struct device *dev)
{
@@ -1223,8 +1225,7 @@ static int gsc_suspend(struct device *dev)
static const struct dev_pm_ops gsc_pm_ops = {
.suspend = gsc_suspend,
.resume = gsc_resume,
- .runtime_suspend = gsc_runtime_suspend,
- .runtime_resume = gsc_runtime_resume,
+ SET_RUNTIME_PM_OPS(gsc_runtime_suspend, gsc_runtime_resume, NULL)
};
static struct platform_driver gsc_driver = {
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH V2 5/8] [media] exynos-gsc: Fixup clock management at ->remove()
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
` (3 preceding siblings ...)
2015-01-19 13:22 ` [PATCH V2 4/8] [media] exynos-gsc: Make runtime PM callbacks available for CONFIG_PM Ulf Hansson
@ 2015-01-19 13:22 ` Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 6/8] [media] exynos-gsc: Do full clock gating at runtime PM suspend Ulf Hansson
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-01-19 13:22 UTC (permalink / raw)
To: linux-arm-kernel
To make sure the clock is fully gated in ->remove(), we first need to
to bring the device into full power by invoking pm_runtime_get_sync().
Then, let's both unprepare and disable the clock.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/media/platform/exynos-gsc/gsc-core.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
index e84bc35..5d3cfe8 100644
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
@@ -1104,12 +1104,15 @@ static int gsc_remove(struct platform_device *pdev)
{
struct gsc_dev *gsc = platform_get_drvdata(pdev);
+ pm_runtime_get_sync(&pdev->dev);
+
gsc_unregister_m2m_device(gsc);
v4l2_device_unregister(&gsc->v4l2_dev);
-
vb2_dma_contig_cleanup_ctx(gsc->alloc_ctx);
+ clk_disable_unprepare(gsc->clock);
+
pm_runtime_disable(&pdev->dev);
- clk_unprepare(gsc->clock);
+ pm_runtime_put_noidle(&pdev->dev);
dev_dbg(&pdev->dev, "%s driver unloaded\n", pdev->name);
return 0;
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH V2 6/8] [media] exynos-gsc: Do full clock gating at runtime PM suspend
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
` (4 preceding siblings ...)
2015-01-19 13:22 ` [PATCH V2 5/8] [media] exynos-gsc: Fixup clock management at ->remove() Ulf Hansson
@ 2015-01-19 13:22 ` Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 7/8] [media] exynos-gsc: Make system PM callbacks available for CONFIG_PM_SLEEP Ulf Hansson
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-01-19 13:22 UTC (permalink / raw)
To: linux-arm-kernel
To potentially save more power in runtime PM suspend state, let's also
prepare/unprepare the clock from the runtime PM callbacks.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/media/platform/exynos-gsc/gsc-core.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
index 5d3cfe8..0b126eb 100644
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
@@ -1163,7 +1163,7 @@ static int gsc_runtime_resume(struct device *dev)
pr_debug("gsc%d: state: 0x%lx", gsc->id, gsc->state);
- ret = clk_enable(gsc->clock);
+ ret = clk_prepare_enable(gsc->clock);
if (ret)
return ret;
@@ -1181,7 +1181,7 @@ static int gsc_runtime_suspend(struct device *dev)
ret = gsc_m2m_suspend(gsc);
if (!ret)
- clk_disable(gsc->clock);
+ clk_disable_unprepare(gsc->clock);
pr_debug("gsc%d: state: 0x%lx", gsc->id, gsc->state);
return ret;
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH V2 7/8] [media] exynos-gsc: Make system PM callbacks available for CONFIG_PM_SLEEP
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
` (5 preceding siblings ...)
2015-01-19 13:22 ` [PATCH V2 6/8] [media] exynos-gsc: Do full clock gating at runtime PM suspend Ulf Hansson
@ 2015-01-19 13:22 ` Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 8/8] [media] exynos-gsc: Simplify system PM Ulf Hansson
2015-03-02 12:28 ` [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
8 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-01-19 13:22 UTC (permalink / raw)
To: linux-arm-kernel
There are no need to set up the system PM callbacks unless they are
being used. It also causes compiler warnings about unused functions.
Silence the warnings by making them available for CONFIG_PM_SLEEP.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/media/platform/exynos-gsc/gsc-core.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
index 0b126eb..194f9fc 100644
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
@@ -1188,6 +1188,7 @@ static int gsc_runtime_suspend(struct device *dev)
}
#endif
+#ifdef CONFIG_PM_SLEEP
static int gsc_resume(struct device *dev)
{
struct gsc_dev *gsc = dev_get_drvdata(dev);
@@ -1224,10 +1225,10 @@ static int gsc_suspend(struct device *dev)
return 0;
}
+#endif
static const struct dev_pm_ops gsc_pm_ops = {
- .suspend = gsc_suspend,
- .resume = gsc_resume,
+ SET_SYSTEM_SLEEP_PM_OPS(gsc_suspend, gsc_resume)
SET_RUNTIME_PM_OPS(gsc_runtime_suspend, gsc_runtime_resume, NULL)
};
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH V2 8/8] [media] exynos-gsc: Simplify system PM
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
` (6 preceding siblings ...)
2015-01-19 13:22 ` [PATCH V2 7/8] [media] exynos-gsc: Make system PM callbacks available for CONFIG_PM_SLEEP Ulf Hansson
@ 2015-01-19 13:22 ` Ulf Hansson
2015-03-02 12:28 ` [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
8 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-01-19 13:22 UTC (permalink / raw)
To: linux-arm-kernel
It's not needed to keep a local flag about the current system PM state.
Let's just remove that code and the corresponding debug print.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/media/platform/exynos-gsc/gsc-core.c | 21 ---------------------
drivers/media/platform/exynos-gsc/gsc-core.h | 3 ---
2 files changed, 24 deletions(-)
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
index 194f9fc..71b227c 100644
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
@@ -1191,20 +1191,6 @@ static int gsc_runtime_suspend(struct device *dev)
#ifdef CONFIG_PM_SLEEP
static int gsc_resume(struct device *dev)
{
- struct gsc_dev *gsc = dev_get_drvdata(dev);
- unsigned long flags;
-
- pr_debug("gsc%d: state: 0x%lx", gsc->id, gsc->state);
-
- /* Do not resume if the device was idle before system suspend */
- spin_lock_irqsave(&gsc->slock, flags);
- if (!test_and_clear_bit(ST_SUSPEND, &gsc->state) ||
- !gsc_m2m_opened(gsc)) {
- spin_unlock_irqrestore(&gsc->slock, flags);
- return 0;
- }
- spin_unlock_irqrestore(&gsc->slock, flags);
-
if (!pm_runtime_suspended(dev))
return gsc_runtime_resume(dev);
@@ -1213,13 +1199,6 @@ static int gsc_resume(struct device *dev)
static int gsc_suspend(struct device *dev)
{
- struct gsc_dev *gsc = dev_get_drvdata(dev);
-
- pr_debug("gsc%d: state: 0x%lx", gsc->id, gsc->state);
-
- if (test_and_set_bit(ST_SUSPEND, &gsc->state))
- return 0;
-
if (!pm_runtime_suspended(dev))
return gsc_runtime_suspend(dev);
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.h b/drivers/media/platform/exynos-gsc/gsc-core.h
index fa572aa..2f62271 100644
--- a/drivers/media/platform/exynos-gsc/gsc-core.h
+++ b/drivers/media/platform/exynos-gsc/gsc-core.h
@@ -48,9 +48,6 @@
#define GSC_CTX_ABORT (1 << 7)
enum gsc_dev_flags {
- /* for global */
- ST_SUSPEND,
-
/* for m2m node */
ST_M2M_OPEN,
ST_M2M_RUN,
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
` (7 preceding siblings ...)
2015-01-19 13:22 ` [PATCH V2 8/8] [media] exynos-gsc: Simplify system PM Ulf Hansson
@ 2015-03-02 12:28 ` Ulf Hansson
8 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2015-03-02 12:28 UTC (permalink / raw)
To: linux-arm-kernel
On 19 January 2015 at 14:22, Ulf Hansson <ulf.hansson@linaro.org> wrote:
> Changes in v2:
> - Rebase patches.
> - Adapt to changes for the PM core. Especially, the Kconfig option for
> CONFIG_PM_RUNTIME has been removed and the runtime PM core is now
> build for CONFIG_PM.
>
> This patchset fixup the PM support and adds some minor improvements to
> potentially save some more power at runtime PM suspend.
>
>
> Ulf Hansson (8):
> [media] exynos-gsc: Simplify clock management
> [media] exynos-gsc: Convert gsc_m2m_resume() from int to void
> [media] exynos-gsc: Make driver functional when CONFIG_PM is unset
> [media] exynos-gsc: Make runtime PM callbacks available for CONFIG_PM
> [media] exynos-gsc: Fixup clock management at ->remove()
> [media] exynos-gsc: Do full clock gating at runtime PM suspend
> [media] exynos-gsc: Make system PM callbacks available for
> CONFIG_PM_SLEEP
> [media] exynos-gsc: Simplify system PM
>
> drivers/media/platform/exynos-gsc/gsc-core.c | 183 +++++++++++----------------
> drivers/media/platform/exynos-gsc/gsc-core.h | 3 -
> 2 files changed, 72 insertions(+), 114 deletions(-)
>
> --
> 1.9.1
>
I guess you guys have been busy, but it would be nice to get some
feedback of these patches.
Kind regards
Uffe
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-03-02 12:28 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-19 13:22 [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 1/8] [media] exynos-gsc: Simplify clock management Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 2/8] [media] exynos-gsc: Convert gsc_m2m_resume() from int to void Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 3/8] [media] exynos-gsc: Make driver functional when CONFIG_PM is unset Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 4/8] [media] exynos-gsc: Make runtime PM callbacks available for CONFIG_PM Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 5/8] [media] exynos-gsc: Fixup clock management at ->remove() Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 6/8] [media] exynos-gsc: Do full clock gating at runtime PM suspend Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 7/8] [media] exynos-gsc: Make system PM callbacks available for CONFIG_PM_SLEEP Ulf Hansson
2015-01-19 13:22 ` [PATCH V2 8/8] [media] exynos-gsc: Simplify system PM Ulf Hansson
2015-03-02 12:28 ` [PATCH V2 0/8] [media] exynos-gsc: Fixup PM support Ulf Hansson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).