mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-17 18:28:55 +00:00
5f9f816bb8
Added tidss video driver support which enables display on oldi panel using AM62x, it creates a simple pipeline framebuffer==>vidl1==>ovr1==>vp1==>oldi_panel and calculates clock rates for panel from panel node in device tree. To compile TIDSS when user sets CONFIG_VIDEO_TIDSS add rule in Makefile. Include tidss folder location in Kconfig. TIDSS is ported from linux kernel version 5.10.145 Signed-off-by: Nikhil M Jain <n-jain1@ti.com>
137 lines
3.6 KiB
C
137 lines
3.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/*
|
|
* (C) Copyright 2023 Texas Instruments Incorporated - https://www.ti.com/
|
|
* Nikhil M Jain, n-jain1@ti.com
|
|
*
|
|
* based on the linux tidss driver, which is
|
|
*
|
|
* (C) Copyright 2018 Texas Instruments Incorporated - https://www.ti.com/
|
|
* Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
|
|
*/
|
|
|
|
#ifndef __TIDSS_DRV_H__
|
|
#define __TIDSS_DRV_H__
|
|
|
|
#include <media_bus_format.h>
|
|
|
|
#define TIDSS_MAX_PORTS 4
|
|
#define TIDSS_MAX_PLANES 4
|
|
|
|
enum dss_vp_bus_type {
|
|
DSS_VP_DPI, /* DPI output */
|
|
DSS_VP_OLDI, /* OLDI (LVDS) output */
|
|
DSS_VP_INTERNAL, /* SoC internal routing */
|
|
DSS_VP_MAX_BUS_TYPE,
|
|
};
|
|
|
|
enum dss_oldi_modes {
|
|
OLDI_MODE_OFF, /* OLDI turned off / tied off in IP. */
|
|
OLDI_SINGLE_LINK_SINGLE_MODE, /* Single Output over OLDI 0. */
|
|
OLDI_SINGLE_LINK_DUPLICATE_MODE, /* Duplicate Output over OLDI 0 and 1. */
|
|
OLDI_DUAL_LINK, /* Combined Output over OLDI 0 and 1. */
|
|
};
|
|
|
|
struct dss_features_scaling {
|
|
u32 in_width_max_5tap_rgb;
|
|
u32 in_width_max_3tap_rgb;
|
|
u32 in_width_max_5tap_yuv;
|
|
u32 in_width_max_3tap_yuv;
|
|
u32 upscale_limit;
|
|
u32 downscale_limit_5tap;
|
|
u32 downscale_limit_3tap;
|
|
u32 xinc_max;
|
|
};
|
|
|
|
enum tidss_gamma_type { TIDSS_GAMMA_8BIT, TIDSS_GAMMA_10BIT };
|
|
|
|
/* choose specific DSS based on the board */
|
|
enum dss_subrevision {
|
|
DSS_K2G,
|
|
DSS_AM65X,
|
|
DSS_J721E,
|
|
DSS_AM625,
|
|
};
|
|
|
|
struct tidss_vp_feat {
|
|
struct tidss_vp_color_feat {
|
|
u32 gamma_size;
|
|
enum tidss_gamma_type gamma_type;
|
|
bool has_ctm;
|
|
} color;
|
|
};
|
|
|
|
struct dss_color_lut {
|
|
/*
|
|
* Data is U0.16 fixed point format.
|
|
*/
|
|
__u16 red;
|
|
__u16 green;
|
|
__u16 blue;
|
|
__u16 reserved;
|
|
};
|
|
|
|
struct dss_vp_data {
|
|
u32 *gamma_table;
|
|
};
|
|
|
|
struct dss_features {
|
|
int min_pclk_khz;
|
|
int max_pclk_khz[DSS_VP_MAX_BUS_TYPE];
|
|
|
|
struct dss_features_scaling scaling;
|
|
|
|
enum dss_subrevision subrev;
|
|
|
|
const char *common;
|
|
const u16 *common_regs;
|
|
u32 num_vps;
|
|
const char *vp_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */
|
|
const char *ovr_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */
|
|
const char *vpclk_name[TIDSS_MAX_PORTS]; /* Should match dt clk names */
|
|
const enum dss_vp_bus_type vp_bus_type[TIDSS_MAX_PORTS];
|
|
struct tidss_vp_feat vp_feat;
|
|
u32 num_planes;
|
|
const char *vid_name[TIDSS_MAX_PLANES]; /* Should match dt reg names */
|
|
bool vid_lite[TIDSS_MAX_PLANES];
|
|
u32 vid_order[TIDSS_MAX_PLANES];
|
|
};
|
|
|
|
enum dss_oldi_mode_reg_val { SPWG_18 = 0, JEIDA_24 = 1, SPWG_24 = 2 };
|
|
|
|
struct dss_bus_format {
|
|
u32 bus_fmt;
|
|
u32 data_width;
|
|
bool is_oldi_fmt;
|
|
enum dss_oldi_mode_reg_val oldi_mode_reg_val;
|
|
};
|
|
|
|
static struct dss_bus_format dss_bus_formats[] = {
|
|
{ MEDIA_BUS_FMT_RGB444_1X12, 12, false, 0 },
|
|
{ MEDIA_BUS_FMT_RGB565_1X16, 16, false, 0 },
|
|
{ MEDIA_BUS_FMT_RGB666_1X18, 18, false, 0 },
|
|
{ MEDIA_BUS_FMT_RGB888_1X24, 24, false, 0 },
|
|
{ MEDIA_BUS_FMT_RGB101010_1X30, 30, false, 0 },
|
|
{ MEDIA_BUS_FMT_RGB121212_1X36, 36, false, 0 },
|
|
{ MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, 18, true, SPWG_18 },
|
|
{ MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, 24, true, SPWG_24 },
|
|
{ MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA, 24, true, JEIDA_24 },
|
|
};
|
|
|
|
struct tidss_drv_priv {
|
|
struct udevice *dev;
|
|
void __iomem *base_common; /* common register region of dss*/
|
|
void __iomem *base_vid[TIDSS_MAX_PLANES]; /* plane register region of dss*/
|
|
void __iomem *base_ovr[TIDSS_MAX_PORTS]; /* overlay register region of dss*/
|
|
void __iomem *base_vp[TIDSS_MAX_PORTS]; /* video port register region of dss*/
|
|
struct regmap *oldi_io_ctrl;
|
|
struct clk vp_clk[TIDSS_MAX_PORTS];
|
|
const struct dss_features *feat;
|
|
struct clk fclk;
|
|
struct dss_vp_data vp_data[TIDSS_MAX_PORTS];
|
|
enum dss_oldi_modes oldi_mode;
|
|
struct dss_bus_format *bus_format;
|
|
u32 pixel_format;
|
|
u32 memory_bandwidth_limit;
|
|
};
|
|
|
|
#endif
|