Files

138 lines
3.5 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Paolo Sabatino <[email protected]>
Date: Sun, 30 Jun 2024 17:41:01 +0200
Subject: rk3228 vop driver
---
drivers/video/rockchip/Makefile | 1 +
drivers/video/rockchip/rk3228_vop.c | 107 ++++++++++
2 files changed, 108 insertions(+)
diff --git a/drivers/video/rockchip/Makefile b/drivers/video/rockchip/Makefile
index 111111111111..222222222222 100644
--- a/drivers/video/rockchip/Makefile
+++ b/drivers/video/rockchip/Makefile
@@ -5,6 +5,7 @@
ifdef CONFIG_VIDEO_ROCKCHIP
obj-y += rk_vop.o
+obj-$(CONFIG_ROCKCHIP_RK322X) += rk3228_vop.o
obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288_vop.o
obj-$(CONFIG_ROCKCHIP_RK3328) += rk3328_vop.o
obj-$(CONFIG_ROCKCHIP_RK3399) += rk3399_vop.o
diff --git a/drivers/video/rockchip/rk3228_vop.c b/drivers/video/rockchip/rk3228_vop.c
new file mode 100644
index 000000000000..111111111111
--- /dev/null
+++ b/drivers/video/rockchip/rk3228_vop.c
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2023 Edgeble AI Technologies Pvt. Ltd.
+ */
+#include <dm.h>
+#include <video.h>
+#include <asm/io.h>
+#include <reset.h>
+#include <clk.h>
+#include <linux/delay.h>
+#include "rk_vop.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static void rk3228_set_pin_polarity(struct udevice *dev,
+ enum vop_modes mode, u32 polarity)
+{
+ struct rk_vop_priv *priv = dev_get_priv(dev);
+ struct rk3288_vop *regs = priv->regs;
+
+ switch (mode) {
+ case VOP_MODE_HDMI:
+ clrsetbits_le32(&regs->dsp_ctrl1,
+ M_RK3399_DSP_HDMI_POL,
+ V_RK3399_DSP_HDMI_POL(polarity));
+ break;
+ default:
+ debug("%s: unsupported output mode %x\n", __func__, mode);
+ }
+}
+
+static int rk3228_vop_probe(struct udevice *dev)
+{
+ /* Before relocation we don't need to do anything */
+ if (!(gd->flags & GD_FLG_RELOC))
+ return 0;
+
+ return rk_vop_probe(dev);
+}
+
+/**
+ * During remove phase we assert the resets and deassert them,
+ * so in practice we "turn off" the VOP resetting it and then
+ * "turn on" it. This is especially true for the dlck because
+ * this avoids iommu complaining later during kernel boot
+ * @see https://lore.kernel.org/linux-arm-kernel/[email protected]/
+ */
+static int rk3228_vop_remove(struct udevice *dev)
+{
+ struct rk_vop_priv *priv = dev_get_priv(dev);
+ struct rk3288_vop *regs = priv->regs;
+ struct reset_ctl_bulk resets;
+
+ int ret;
+
+ debug("%s\n", __func__);
+
+ /* set to standby */
+ setbits_le32(&regs->sys_ctrl, V_STANDBY_EN(1));
+ clrsetbits_le32(&regs->sys_ctrl, M_ALL_OUT_EN, 0x0);
+
+ ret = reset_get_bulk(dev, &resets);
+ if (ret) {
+ printf("failed to get resets (ret=%d)\n", ret);
+ return ret;
+ }
+
+ reset_assert_bulk(&resets);
+ udelay(20);
+
+ reset_deassert_bulk(&resets);
+ udelay(20);
+
+ return 0;
+
+}
+
+struct rkvop_driverdata rk3228_driverdata = {
+ .dsp_offset = 0x0,
+ .win_offset = 0x0,
+ .features = VOP_FEATURE_OUTPUT_10BIT,
+ .set_pin_polarity = rk3228_set_pin_polarity,
+};
+
+static const struct udevice_id rk3228_vop_ids[] = {
+ {
+ .compatible = "rockchip,rk3228-vop",
+ .data = (ulong)&rk3228_driverdata
+ },
+ { /* sentile */ }
+};
+
+static const struct video_ops rk3228_vop_ops = {
+};
+
+U_BOOT_DRIVER(rockchip_rk3228_vop) = {
+ .name = "rockchip_rk3228_vop",
+ .id = UCLASS_VIDEO,
+ .of_match = rk3228_vop_ids,
+ .ops = &rk3228_vop_ops,
+ .bind = rk_vop_bind,
+ .probe = rk3228_vop_probe,
+ .remove = rk3228_vop_remove,
+ .priv_auto = sizeof(struct rk_vop_priv),
+ .flags = DM_FLAG_OS_PREPARE
+};
--
Armbian