139 lines
3.5 KiB
Diff
139 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,107 @@
|
|
+// SPDX-License-Identifier: GPL-2.0+
|
|
+/*
|
|
+ * Copyright (c) 2023 Edgeble AI Technologies Pvt. Ltd.
|
|
+ */
|
|
+#include <common.h>
|
|
+#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(®s->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(®s->sys_ctrl, V_STANDBY_EN(1));
|
|
+ clrsetbits_le32(®s->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
|
|
|