[PATCH 07/10] media: rcar-fcp: Handle resets
From: Paul Elder
Date: Thu Sep 17 2026 - 08:21:56 EST
On some versions of the FCP, such as the one on the X5H, reset control
is required to operate the FCP. Add support for handling resets
optionally, to continue supporting versions that do not require it.
Signed-off-by: Paul Elder <paul.elder+renesas@xxxxxxxxxxxxxxxx>
---
drivers/media/platform/renesas/rcar-fcp.c | 34 +++++++++++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-fcp.c b/drivers/media/platform/renesas/rcar-fcp.c
index d99b3ff976e80f275af19e5dc02c6e1de98c38a3..15bcbbda3b853f71780aae876f6440b33addf193 100644
--- a/drivers/media/platform/renesas/rcar-fcp.c
+++ b/drivers/media/platform/renesas/rcar-fcp.c
@@ -18,6 +18,7 @@
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/property.h>
+#include <linux/reset.h>
#include <linux/slab.h>
#include <media/rcar-fcp.h>
@@ -63,6 +64,8 @@
#define RCAR_FCP_REG_BA_REF_Y2 0x0118
#define RCAR_FCP_REG_BA_REF_C 0x011c
+struct reset_control;
+
enum rcar_fcp_type {
RCAR_FCPF,
RCAR_FCPV,
@@ -73,6 +76,7 @@ struct rcar_fcp_device {
struct device *dev;
void __iomem *base;
enum rcar_fcp_type type;
+ struct reset_control *rstc;
};
static LIST_HEAD(fcp_devices);
@@ -262,12 +266,19 @@ static int rcar_fcp_probe(struct platform_device *pdev)
fcp->dev = &pdev->dev;
fcp->type = (enum rcar_fcp_type)device_get_match_data(&pdev->dev);
+ platform_set_drvdata(pdev, fcp);
+
fcp->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(fcp->base))
return PTR_ERR(fcp->base);
dma_set_max_seg_size(fcp->dev, UINT_MAX);
+ fcp->rstc = devm_reset_control_get_optional(&pdev->dev, NULL);
+ if (IS_ERR(fcp->rstc))
+ return dev_err_probe(&pdev->dev, PTR_ERR(fcp->rstc),
+ "failed to get reset control\n");
+
pm_runtime_enable(&pdev->dev);
ret = pm_runtime_resume_and_get(&pdev->dev);
if (ret < 0)
@@ -283,8 +294,6 @@ static int rcar_fcp_probe(struct platform_device *pdev)
list_add_tail(&fcp->list, &fcp_devices);
mutex_unlock(&fcp_lock);
- platform_set_drvdata(pdev, fcp);
-
return 0;
error_pm_put:
@@ -305,11 +314,32 @@ static void rcar_fcp_remove(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev);
}
+static int fcp_pm_runtime_suspend(struct device *dev)
+{
+ struct rcar_fcp_device *fcp = dev_get_drvdata(dev);
+
+ reset_control_assert(fcp->rstc);
+ return 0;
+}
+
+static int fcp_pm_runtime_resume(struct device *dev)
+{
+ struct rcar_fcp_device *fcp = dev_get_drvdata(dev);
+
+ reset_control_deassert(fcp->rstc);
+ return 0;
+}
+
+static const struct dev_pm_ops fcp_pm_ops = {
+ RUNTIME_PM_OPS(fcp_pm_runtime_suspend, fcp_pm_runtime_resume, NULL)
+};
+
static struct platform_driver rcar_fcp_platform_driver = {
.probe = rcar_fcp_probe,
.remove = rcar_fcp_remove,
.driver = {
.name = "rcar-fcp",
+ .pm = pm_ptr(&fcp_pm_ops),
.of_match_table = rcar_fcp_of_match,
.suppress_bind_attrs = true,
},
--
2.47.3