[media] v4l: vsp1: Add support for RT clock
The VSPR and VSPS instances use two clocks, the VSP1 system clock and
the VSP1 realtime clock. Both of them need to be enabled to access the
VSP1 registers.
Add support for an optional RT clock and enable/disable it along with
the system clock.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c
index aa8b9b2..1c9e771 100644
--- a/drivers/media/platform/vsp1/vsp1_drv.c
+++ b/drivers/media/platform/vsp1/vsp1_drv.c
@@ -290,6 +290,33 @@
return 0;
}
+static int vsp1_clocks_enable(struct vsp1_device *vsp1)
+{
+ int ret;
+
+ ret = clk_prepare_enable(vsp1->clock);
+ if (ret < 0)
+ return ret;
+
+ if (IS_ERR(vsp1->rt_clock))
+ return 0;
+
+ ret = clk_prepare_enable(vsp1->rt_clock);
+ if (ret < 0) {
+ clk_disable_unprepare(vsp1->clock);
+ return ret;
+ }
+
+ return 0;
+}
+
+static void vsp1_clocks_disable(struct vsp1_device *vsp1)
+{
+ if (!IS_ERR(vsp1->rt_clock))
+ clk_disable_unprepare(vsp1->rt_clock);
+ clk_disable_unprepare(vsp1->clock);
+}
+
/*
* vsp1_device_get - Acquire the VSP1 device
*
@@ -307,7 +334,7 @@
if (vsp1->ref_count > 0)
goto done;
- ret = clk_prepare_enable(vsp1->clock);
+ ret = vsp1_clocks_enable(vsp1);
if (ret < 0) {
__vsp1 = NULL;
goto done;
@@ -315,7 +342,7 @@
ret = vsp1_device_init(vsp1);
if (ret < 0) {
- clk_disable_unprepare(vsp1->clock);
+ vsp1_clocks_disable(vsp1);
__vsp1 = NULL;
goto done;
}
@@ -339,7 +366,7 @@
mutex_lock(&vsp1->lock);
if (--vsp1->ref_count == 0)
- clk_disable_unprepare(vsp1->clock);
+ vsp1_clocks_disable(vsp1);
mutex_unlock(&vsp1->lock);
}
@@ -358,7 +385,7 @@
if (vsp1->ref_count == 0)
return 0;
- clk_disable_unprepare(vsp1->clock);
+ vsp1_clocks_disable(vsp1);
return 0;
}
@@ -371,7 +398,7 @@
if (vsp1->ref_count)
return 0;
- return clk_prepare_enable(vsp1->clock);
+ return vsp1_clocks_enable(vsp1);
}
#endif
@@ -445,6 +472,9 @@
return PTR_ERR(vsp1->clock);
}
+ /* The RT clock is optional */
+ vsp1->rt_clock = devm_clk_get(&pdev->dev, "rt");
+
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!irq) {
dev_err(&pdev->dev, "missing IRQ\n");