mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-08-25 00:21:28 +02:00
Add support for Rockchip RK3328 VOP. Require VOP cleanup before handoff to Linux by writing reset values to WIN registers. Without this Linux VOP trigger page fault as below [ 0.752016] Loading compiled-in X.509 certificates [ 0.787796] inno_hdmi_phy_rk3328_clk_recalc_rate: parent 24000000 [ 0.788391] inno-hdmi-phy ff430000.phy: inno_hdmi_phy_rk3328_clk_recalc_rate rate 148500000 vco 148500000 [ 0.798353] rockchip-drm display-subsystem: bound ff370000.vop (ops vop_component_ops) [ 0.799403] dwhdmi-rockchip ff3c0000.hdmi: supply avdd-0v9 not found, using dummy regulator [ 0.800288] rk_iommu ff373f00.iommu: Enable stall request timed out, status: 0x00004b [ 0.801131] dwhdmi-rockchip ff3c0000.hdmi: supply avdd-1v8 not found, using dummy regulator [ 0.802056] rk_iommu ff373f00.iommu: Disable paging request timed out, status: 0x00004b [ 0.803233] dwhdmi-rockchip ff3c0000.hdmi: Detected HDMI TX controller v2.11a with HDCP (inno_dw_hdmi_phy2) [ 0.805355] dwhdmi-rockchip ff3c0000.hdmi: registered DesignWare HDMI I2C bus driver [ 0.808769] rockchip-drm display-subsystem: bound ff3c0000.hdmi (ops dw_hdmi_rockchip_ops) [ 0.810869] [drm] Initialized rockchip 1.0.0 20140818 for display-subsystem on minor 0 Signed-off-by: Jagan Teki <jagan@edgeble.ai>
84 lines
1.9 KiB
C
84 lines
1.9 KiB
C
// 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 "rk_vop.h"
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
static void rk3328_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 rk3328_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);
|
|
}
|
|
|
|
static int rk3328_vop_remove(struct udevice *dev)
|
|
{
|
|
struct rk_vop_priv *priv = dev_get_priv(dev);
|
|
struct rk3288_vop *regs = priv->regs;
|
|
struct rk3288_vop *win_regs = priv->regs + priv->win_offset;
|
|
|
|
/* FIXME: Explicit disabling of WIN0 is needed to avoid iommu
|
|
* page-fault in Linux, better handling of iommu-address in
|
|
* Linux might drop this.
|
|
*/
|
|
clrbits_le32(&win_regs->win0_ctrl0, M_WIN0_EN);
|
|
writel(0x01, ®s->reg_cfg_done);
|
|
|
|
return 0;
|
|
}
|
|
|
|
struct rkvop_driverdata rk3328_driverdata = {
|
|
.dsp_offset = 0x490,
|
|
.win_offset = 0xd0,
|
|
.features = VOP_FEATURE_OUTPUT_10BIT,
|
|
.set_pin_polarity = rk3328_set_pin_polarity,
|
|
};
|
|
|
|
static const struct udevice_id rk3328_vop_ids[] = {
|
|
{
|
|
.compatible = "rockchip,rk3328-vop",
|
|
.data = (ulong)&rk3328_driverdata
|
|
},
|
|
{ /* sentile */ }
|
|
};
|
|
|
|
static const struct video_ops rk3328_vop_ops = {
|
|
};
|
|
|
|
U_BOOT_DRIVER(rk3328_vop) = {
|
|
.name = "rk3328_vop",
|
|
.id = UCLASS_VIDEO,
|
|
.of_match = rk3328_vop_ids,
|
|
.ops = &rk3328_vop_ops,
|
|
.bind = rk_vop_bind,
|
|
.probe = rk3328_vop_probe,
|
|
.remove = rk3328_vop_remove,
|
|
.priv_auto = sizeof(struct rk_vop_priv),
|
|
.flags = DM_FLAG_PRE_RELOC | DM_FLAG_OS_PREPARE,
|
|
};
|