This patch adds RK3368 VOP driver based on RK3288. I got its GRF register user manual from a online forum.
Link: https://github.com/ieiao/wiki/blob/master/docs/embedded-dev/rockchip/rk3368/Rockchip_RK3368_GRF.pdf Signed-off-by: WeiHao Li <[email protected]> --- drivers/video/rockchip/Makefile | 1 + drivers/video/rockchip/dw_mipi_dsi_rockchip.c | 20 +++++ drivers/video/rockchip/rk3368_vop.c | 79 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 drivers/video/rockchip/rk3368_vop.c diff --git a/drivers/video/rockchip/Makefile b/drivers/video/rockchip/Makefile index f55beceeb..83c0b7aef 100644 --- a/drivers/video/rockchip/Makefile +++ b/drivers/video/rockchip/Makefile @@ -7,6 +7,7 @@ ifdef CONFIG_VIDEO_ROCKCHIP obj-y += rk_vop.o obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288_vop.o obj-$(CONFIG_ROCKCHIP_RK3328) += rk3328_vop.o +obj-$(CONFIG_ROCKCHIP_RK3368) += rk3368_vop.o obj-$(CONFIG_ROCKCHIP_RK3399) += rk3399_vop.o obj-$(CONFIG_DISPLAY_ROCKCHIP_EDP) += rk_edp.o obj-$(CONFIG_DISPLAY_ROCKCHIP_LVDS) += rk_lvds.o diff --git a/drivers/video/rockchip/dw_mipi_dsi_rockchip.c b/drivers/video/rockchip/dw_mipi_dsi_rockchip.c index fa5121735..122974d60 100644 --- a/drivers/video/rockchip/dw_mipi_dsi_rockchip.c +++ b/drivers/video/rockchip/dw_mipi_dsi_rockchip.c @@ -134,6 +134,11 @@ #define DW_MIPI_NEEDS_PHY_CFG_CLK BIT(0) #define DW_MIPI_NEEDS_GRF_CLK BIT(1) +#define RK3368_GRF_SOC_CON7 0x41c +#define RK3368_DSI_FORCETXSTOPMODE (0xf << 7) +#define RK3368_DSI_FORCERXMODE (0x1 << 6) +#define RK3368_DSI_TURNDISABLE (0x1 << 5) + #define RK3399_GRF_SOC_CON20 0x6250 #define RK3399_DSI0_LCDC_SEL BIT(0) #define RK3399_DSI1_LCDC_SEL BIT(4) @@ -911,6 +916,18 @@ struct video_bridge_ops dw_mipi_dsi_rockchip_ops = { .set_backlight = dw_mipi_dsi_rockchip_set_bl, }; +static const struct rockchip_dw_dsi_chip_data rk3368_chip_data[] = { + { + .reg = 0xff960000, + .lanecfg1_grf_reg = RK3368_GRF_SOC_CON7, + .lanecfg1 = HIWORD_UPDATE(0, RK3368_DSI_TURNDISABLE | + RK3368_DSI_FORCETXSTOPMODE | + RK3368_DSI_FORCERXMODE), + .max_data_lanes = 4, + }, + { /* sentinel */ } +}; + static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = { { .reg = 0xff960000, @@ -980,6 +997,9 @@ static const struct rockchip_dw_dsi_chip_data rk3568_chip_data[] = { }; static const struct udevice_id dw_mipi_dsi_rockchip_dt_ids[] = { + { .compatible = "rockchip,rk3368-mipi-dsi", + .data = (long)&rk3368_chip_data, + }, { .compatible = "rockchip,rk3399-mipi-dsi", .data = (long)&rk3399_chip_data, }, diff --git a/drivers/video/rockchip/rk3368_vop.c b/drivers/video/rockchip/rk3368_vop.c new file mode 100644 index 000000000..b4aac51c5 --- /dev/null +++ b/drivers/video/rockchip/rk3368_vop.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Author(s): WeiHao Li <[email protected]> + */ + +#include <display.h> +#include <dm.h> +#include <regmap.h> +#include <syscon.h> +#include <video.h> +#include <asm/global_data.h> +#include <asm/arch-rockchip/clock.h> +#include <asm/arch-rockchip/hardware.h> +#include <linux/delay.h> +#include "rk_vop.h" + +DECLARE_GLOBAL_DATA_PTR; + +static void rk3368_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; + + /* The RK3368 VOP (v3.2) has its polarity configuration in ctrl0 */ + clrsetbits_le32(®s->dsp_ctrl0, + M_DSP_DCLK_POL | M_DSP_DEN_POL | + M_DSP_VSYNC_POL | M_DSP_HSYNC_POL, + V_DSP_PIN_POL(polarity)); +} + +/* + * Try some common regulators. We should really get these from the + * device tree somehow. + */ +static const char * const rk3368_regulator_names[] = { + "vcc18_lcd", + "VCC18_LCD", + "vdd10_lcd_pwren_h", + "vdd10_lcd", + "VDD10_LCD", + "vcc33_lcd" +}; + +static int rk3368_vop_probe(struct udevice *dev) +{ + /* Before relocation we don't need to do anything */ + if (!(gd->flags & GD_FLG_RELOC)) + return 0; + + /* Probe regulators required for the RK3368 VOP */ + rk_vop_probe_regulators(dev, rk3368_regulator_names, + ARRAY_SIZE(rk3368_regulator_names)); + + return rk_vop_probe(dev); +} + +struct rkvop_driverdata rk3368_driverdata = { + .set_pin_polarity = rk3368_set_pin_polarity, +}; + +static const struct udevice_id rk3368_vop_ids[] = { + { .compatible = "rockchip,rk3368-vop", + .data = (ulong)&rk3368_driverdata }, + { } +}; + +static const struct video_ops rk3368_vop_ops = { +}; + +U_BOOT_DRIVER(rockchip_rk3368_vop) = { + .name = "rockchip_rk3368_vop", + .id = UCLASS_VIDEO, + .of_match = rk3368_vop_ids, + .ops = &rk3368_vop_ops, + .bind = rk_vop_bind, + .probe = rk3368_vop_probe, + .priv_auto = sizeof(struct rk_vop_priv), +}; -- 2.39.5

