13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
23d0407baSopenharmony_ci/*
33d0407baSopenharmony_ci * Copyright (c) 2020 Rockchip Electronics Co. Ltd.
43d0407baSopenharmony_ci *
53d0407baSopenharmony_ci * Author: Wyon Bi <bivvy.bi@rock-chips.com>
63d0407baSopenharmony_ci */
73d0407baSopenharmony_ci
83d0407baSopenharmony_ci#ifndef _RK628_H
93d0407baSopenharmony_ci#define _RK628_H
103d0407baSopenharmony_ci
113d0407baSopenharmony_ci#include <linux/clk.h>
123d0407baSopenharmony_ci#include <linux/delay.h>
133d0407baSopenharmony_ci#include <linux/regmap.h>
143d0407baSopenharmony_ci#include <linux/irq.h>
153d0407baSopenharmony_ci#include <linux/irqdomain.h>
163d0407baSopenharmony_ci
173d0407baSopenharmony_ci#include <drm/drm_crtc_helper.h>
183d0407baSopenharmony_ci
193d0407baSopenharmony_ci#define UPDATE(x, h, l)		(((x) << (l)) & GENMASK((h), (l)))
203d0407baSopenharmony_ci#define HIWORD_UPDATE(v, h, l)	(((v) << (l)) | (GENMASK((h), (l)) << 16))
213d0407baSopenharmony_ci
223d0407baSopenharmony_ci#define GRF_SYSTEM_CON0			0x0000
233d0407baSopenharmony_ci#define SW_VSYNC_POL_MASK		BIT(26)
243d0407baSopenharmony_ci#define SW_VSYNC_POL(x)			UPDATE(x, 26, 26)
253d0407baSopenharmony_ci#define SW_HSYNC_POL_MASK		BIT(25)
263d0407baSopenharmony_ci#define SW_HSYNC_POL(x)			UPDATE(x, 25, 25)
273d0407baSopenharmony_ci#define SW_ADAPTER_I2CSLADR_MASK	GENMASK(24, 22)
283d0407baSopenharmony_ci#define SW_ADAPTER_I2CSLADR(x)		UPDATE(x, 24, 22)
293d0407baSopenharmony_ci#define SW_EDID_MODE_MASK		BIT(21)
303d0407baSopenharmony_ci#define SW_EDID_MODE(x)			UPDATE(x, 21, 21)
313d0407baSopenharmony_ci#define SW_I2S_DATA_OEN_MASK		BIT(10)
323d0407baSopenharmony_ci#define SW_I2S_DATA_OEN(x)		UPDATE(x, 10, 10)
333d0407baSopenharmony_ci#define SW_BT_DATA_OEN_MASK		BIT(9)
343d0407baSopenharmony_ci#define SW_BT_DATA_OEN			BIT(9)
353d0407baSopenharmony_ci#define SW_EFUSE_HDCP_EN_MASK		BIT(8)
363d0407baSopenharmony_ci#define SW_EFUSE_HDCP_EN(x)		UPDATE(x, 8, 8)
373d0407baSopenharmony_ci#define SW_OUTPUT_MODE_MASK		GENMASK(7, 3)
383d0407baSopenharmony_ci#define SW_OUTPUT_MODE(x)		UPDATE(x, 7, 3)
393d0407baSopenharmony_ci#define SW_INPUT_MODE_MASK		GENMASK(2, 0)
403d0407baSopenharmony_ci#define SW_INPUT_MODE(x)		UPDATE(x, 2, 0)
413d0407baSopenharmony_ci#define GRF_SYSTEM_CON1			0x0004
423d0407baSopenharmony_ci#define GRF_SYSTEM_CON2			0x0008
433d0407baSopenharmony_ci#define GRF_SYSTEM_CON3			0x000c
443d0407baSopenharmony_ci#define GRF_GPIO_RX_CEC_SEL_MASK	BIT(7)
453d0407baSopenharmony_ci#define GRF_GPIO_RX_CEC_SEL(x)		UPDATE(x, 7, 7)
463d0407baSopenharmony_ci#define GRF_GPIO_RXDDC_SDA_SEL_MASK	BIT(6)
473d0407baSopenharmony_ci#define GRF_GPIO_RXDDC_SDA_SEL(x)	UPDATE(x, 6, 6)
483d0407baSopenharmony_ci#define GRF_GPIO_RXDDC_SCL_SEL_MASK	BIT(5)
493d0407baSopenharmony_ci#define GRF_GPIO_RXDDC_SCL_SEL(x)	UPDATE(x, 5, 5)
503d0407baSopenharmony_ci#define GRF_SCALER_CON0			0x0010
513d0407baSopenharmony_ci#define SCL_VER_DOWN_MODE(x)		HIWORD_UPDATE(x, 8, 8)
523d0407baSopenharmony_ci#define SCL_HOR_DOWN_MODE(x)		HIWORD_UPDATE(x, 7, 7)
533d0407baSopenharmony_ci#define SCL_BIC_COE_SEL(x)		HIWORD_UPDATE(x, 6, 5)
543d0407baSopenharmony_ci#define SCL_VER_MODE(x)			HIWORD_UPDATE(x, 4, 3)
553d0407baSopenharmony_ci#define SCL_HOR_MODE(x)			HIWORD_UPDATE(x, 2, 1)
563d0407baSopenharmony_ci#define SCL_EN(x)			HIWORD_UPDATE(x, 0, 0)
573d0407baSopenharmony_ci#define GRF_SCALER_CON1			0x0014
583d0407baSopenharmony_ci#define SCL_V_FACTOR(x)			UPDATE(x, 31, 16)
593d0407baSopenharmony_ci#define SCL_H_FACTOR(x)			UPDATE(x, 15, 0)
603d0407baSopenharmony_ci#define GRF_SCALER_CON2			0x0018
613d0407baSopenharmony_ci#define DSP_FRAME_VST(x)		UPDATE(x, 28, 16)
623d0407baSopenharmony_ci#define DSP_FRAME_HST(x)		UPDATE(x, 12, 0)
633d0407baSopenharmony_ci#define GRF_SCALER_CON3			0x001c
643d0407baSopenharmony_ci#define DSP_HS_END(x)			UPDATE(x, 23, 16)
653d0407baSopenharmony_ci#define DSP_HTOTAL(x)			UPDATE(x, 12, 0)
663d0407baSopenharmony_ci#define GRF_SCALER_CON4			0x0020
673d0407baSopenharmony_ci#define DSP_HACT_ST(x)			UPDATE(x, 28, 16)
683d0407baSopenharmony_ci#define DSP_HACT_END(x)			UPDATE(x, 12, 0)
693d0407baSopenharmony_ci#define GRF_SCALER_CON5			0x0024
703d0407baSopenharmony_ci#define DSP_VS_END(x)			UPDATE(x, 23, 16)
713d0407baSopenharmony_ci#define DSP_VTOTAL(x)			UPDATE(x, 12, 0)
723d0407baSopenharmony_ci#define GRF_SCALER_CON6			0x0028
733d0407baSopenharmony_ci#define DSP_VACT_ST(x)			UPDATE(x, 28, 16)
743d0407baSopenharmony_ci#define DSP_VACT_END(x)			UPDATE(x, 12, 0)
753d0407baSopenharmony_ci#define GRF_SCALER_CON7			0x002c
763d0407baSopenharmony_ci#define DSP_HBOR_ST(x)			UPDATE(x, 28, 16)
773d0407baSopenharmony_ci#define DSP_HBOR_END(x)			UPDATE(x, 12, 0)
783d0407baSopenharmony_ci#define GRF_SCALER_CON8			0x0030
793d0407baSopenharmony_ci#define DSP_VBOR_ST(x)			UPDATE(x, 28, 16)
803d0407baSopenharmony_ci#define DSP_VBOR_END(x)			UPDATE(x, 12, 0)
813d0407baSopenharmony_ci#define GRF_POST_PROC_CON		0x0034
823d0407baSopenharmony_ci#define SW_DCLK_OUT_INV_EN		BIT(9)
833d0407baSopenharmony_ci#define SW_DCLK_IN_INV_EN		BIT(8)
843d0407baSopenharmony_ci#define SW_TXPHY_REFCLK_SEL_MASK	GENMASK(6, 5)
853d0407baSopenharmony_ci#define SW_TXPHY_REFCLK_SEL(x)		UPDATE(x, 6, 5)
863d0407baSopenharmony_ci#define SW_HDMITX_VCLK_PLLREF_SEL_MASK	BIT(4)
873d0407baSopenharmony_ci#define SW_HDMITX_VCLK_PLLREF_SEL(x)	UPDATE(x, 4, 4)
883d0407baSopenharmony_ci#define SW_HDMITX_DCLK_INV_EN		BIT(3)
893d0407baSopenharmony_ci#define SW_SPLIT_MODE(x)		UPDATE(x, 1, 1)
903d0407baSopenharmony_ci#define SW_SPLIT_EN			BIT(0)
913d0407baSopenharmony_ci#define GRF_CSC_CTRL_CON		0x0038
923d0407baSopenharmony_ci#define SW_YUV2VYU_SWP(x)		HIWORD_UPDATE(x, 8, 8)
933d0407baSopenharmony_ci#define SW_R2Y_EN(x)			HIWORD_UPDATE(x, 4, 4)
943d0407baSopenharmony_ci#define SW_Y2R_EN(x)			HIWORD_UPDATE(x, 0, 0)
953d0407baSopenharmony_ci#define GRF_LVDS_TX_CON			0x003c
963d0407baSopenharmony_ci#define SW_LVDS_CON_DUAL_SEL(x)		HIWORD_UPDATE(x, 12, 12)
973d0407baSopenharmony_ci#define SW_LVDS_CON_DEN_POLARITY(x)	HIWORD_UPDATE(x, 11, 11)
983d0407baSopenharmony_ci#define SW_LVDS_CON_HS_POLARITY(x)	HIWORD_UPDATE(x, 10, 10)
993d0407baSopenharmony_ci#define SW_LVDS_CON_CLKINV(x)		HIWORD_UPDATE(x, 9, 9)
1003d0407baSopenharmony_ci#define SW_LVDS_STARTPHASE(x)		HIWORD_UPDATE(x, 8, 8)
1013d0407baSopenharmony_ci#define SW_LVDS_CON_STARTSEL(x)		HIWORD_UPDATE(x, 7, 7)
1023d0407baSopenharmony_ci#define SW_LVDS_CON_CHASEL(x)		HIWORD_UPDATE(x, 6, 6)
1033d0407baSopenharmony_ci#define SW_LVDS_TIE_VSYNC_VALUE(x)	HIWORD_UPDATE(x, 5, 5)
1043d0407baSopenharmony_ci#define SW_LVDS_TIE_HSYNC_VALUE(x)	HIWORD_UPDATE(x, 4, 4)
1053d0407baSopenharmony_ci#define SW_LVDS_TIE_DEN_ONLY(x)		HIWORD_UPDATE(x, 3, 3)
1063d0407baSopenharmony_ci#define SW_LVDS_CON_MSBSEL(x)		HIWORD_UPDATE(x, 2, 2)
1073d0407baSopenharmony_ci#define SW_LVDS_CON_SELECT(x)		HIWORD_UPDATE(x, 1, 0)
1083d0407baSopenharmony_ci#define GRF_RGB_DEC_CON0		0x0040
1093d0407baSopenharmony_ci#define SW_HRES_MASK			GENMASK(28, 16)
1103d0407baSopenharmony_ci#define SW_HRES(x)			UPDATE(x, 28, 16)
1113d0407baSopenharmony_ci#define DUAL_DATA_SWAP			BIT(6)
1123d0407baSopenharmony_ci#define DEC_DUALEDGE_EN			BIT(5)
1133d0407baSopenharmony_ci#define SW_PROGRESS_EN			BIT(4)
1143d0407baSopenharmony_ci#define SW_YC_SWAP			BIT(3)
1153d0407baSopenharmony_ci#define SW_CAP_EN_ASYNC			BIT(1)
1163d0407baSopenharmony_ci#define SW_CAP_EN_PSYNC			BIT(0)
1173d0407baSopenharmony_ci#define GRF_RGB_DEC_CON1		0x0044
1183d0407baSopenharmony_ci#define SW_SET_X_MASK			GENMASK(28, 16)
1193d0407baSopenharmony_ci#define SW_SET_X(x)			HIWORD_UPDATE(x, 28, 16)
1203d0407baSopenharmony_ci#define SW_SET_Y_MASK			GENMASK(28, 16)
1213d0407baSopenharmony_ci#define SW_SET_Y(x)			HIWORD_UPDATE(x, 28, 16)
1223d0407baSopenharmony_ci#define GRF_RGB_DEC_CON2		0x0048
1233d0407baSopenharmony_ci#define GRF_RGB_ENC_CON			0x004c
1243d0407baSopenharmony_ci#define BT1120_UV_SWAP(x)		HIWORD_UPDATE(x, 5, 5)
1253d0407baSopenharmony_ci#define ENC_DUALEDGE_EN(x)		HIWORD_UPDATE(x, 3, 3)
1263d0407baSopenharmony_ci#define GRF_MIPI_LANE_DELAY_CON0	0x0050
1273d0407baSopenharmony_ci#define GRF_MIPI_LANE_DELAY_CON1	0x0054
1283d0407baSopenharmony_ci#define GRF_BT1120_DCLK_DELAY_CON0	0x0058
1293d0407baSopenharmony_ci#define GRF_BT1120_DCLK_DELAY_CON1	0x005c
1303d0407baSopenharmony_ci#define GRF_MIPI_TX0_CON		0x0060
1313d0407baSopenharmony_ci#define DPIUPDATECFG			BIT(26)
1323d0407baSopenharmony_ci#define DPICOLORM			BIT(25)
1333d0407baSopenharmony_ci#define DPISHUTDN			BIT(24)
1343d0407baSopenharmony_ci#define CSI_PHYRSTZ			BIT(21)
1353d0407baSopenharmony_ci#define CSI_PHYSHUTDOWNZ		BIT(20)
1363d0407baSopenharmony_ci#define FORCETXSTOPMODE_MASK		GENMASK(19, 16)
1373d0407baSopenharmony_ci#define FORCETXSTOPMODE(x)		UPDATE(x, 19, 16)
1383d0407baSopenharmony_ci#define FORCERXMODE_MASK		GENMASK(15, 12)
1393d0407baSopenharmony_ci#define FORCERXMODE(x)			UPDATE(x, 15, 12)
1403d0407baSopenharmony_ci#define PHY_TESTCLR			BIT(10)
1413d0407baSopenharmony_ci#define PHY_TESTCLK			BIT(9)
1423d0407baSopenharmony_ci#define PHY_TESTEN			BIT(8)
1433d0407baSopenharmony_ci#define PHY_TESTDIN_MASK		GENMASK(7, 0)
1443d0407baSopenharmony_ci#define PHY_TESTDIN(x)			UPDATE(x, 7, 0)
1453d0407baSopenharmony_ci#define GRF_DPHY0_STATUS		0x0064
1463d0407baSopenharmony_ci#define DPHY_PHYLOCK			BIT(24)
1473d0407baSopenharmony_ci#define PHY_TESTDOUT_SHIFT		8
1483d0407baSopenharmony_ci#define GRF_MIPI_TX1_CON		0x0068
1493d0407baSopenharmony_ci#define GRF_DPHY1_STATUS		0x006c
1503d0407baSopenharmony_ci#define GRF_GPIO0AB_SEL_CON		0x0070
1513d0407baSopenharmony_ci#define GRF_GPIO1AB_SEL_CON		0x0074
1523d0407baSopenharmony_ci#define GRF_GPIO2AB_SEL_CON		0x0078
1533d0407baSopenharmony_ci#define GRF_GPIO2C_SEL_CON		0x007c
1543d0407baSopenharmony_ci#define GRF_GPIO3AB_SEL_CON		0x0080
1553d0407baSopenharmony_ci#define GRF_GPIO2A_SMT			0x0090
1563d0407baSopenharmony_ci#define GRF_GPIO2B_SMT			0x0094
1573d0407baSopenharmony_ci#define GRF_GPIO2C_SMT			0x0098
1583d0407baSopenharmony_ci#define GRF_GPIO3AB_SMT			0x009c
1593d0407baSopenharmony_ci#define GRF_GPIO0A_P_CON		0x00a0
1603d0407baSopenharmony_ci#define GRF_GPIO1A_P_CON		0x00a4
1613d0407baSopenharmony_ci#define GRF_GPIO2A_P_CON		0x00a8
1623d0407baSopenharmony_ci#define GRF_GPIO2B_P_CON		0x00ac
1633d0407baSopenharmony_ci#define GRF_GPIO2C_P_CON		0x00b0
1643d0407baSopenharmony_ci#define GRF_GPIO3A_P_CON		0x00b4
1653d0407baSopenharmony_ci#define GRF_GPIO3B_P_CON		0x00b8
1663d0407baSopenharmony_ci#define GRF_GPIO0B_D_CON		0x00c0
1673d0407baSopenharmony_ci#define GRF_GPIO1B_D_CON		0x00c4
1683d0407baSopenharmony_ci#define GRF_GPIO2A_D0_CON		0x00c8
1693d0407baSopenharmony_ci#define GRF_GPIO2A_D1_CON		0x00cc
1703d0407baSopenharmony_ci#define GRF_GPIO2B_D0_CON		0x00d0
1713d0407baSopenharmony_ci#define GRF_GPIO2B_D1_CON		0x00d4
1723d0407baSopenharmony_ci#define GRF_GPIO2C_D0_CON		0x00d8
1733d0407baSopenharmony_ci#define GRF_GPIO2C_D1_CON		0x00dc
1743d0407baSopenharmony_ci#define GRF_GPIO3A_D0_CON		0x00e0
1753d0407baSopenharmony_ci#define GRF_GPIO3A_D1_CON		0x00e4
1763d0407baSopenharmony_ci#define GRF_GPIO3B_D_CON		0x00e8
1773d0407baSopenharmony_ci#define GRF_GPIO_SR_CON			0x00ec
1783d0407baSopenharmony_ci#define GRF_INTR0_EN			0x0100
1793d0407baSopenharmony_ci#define GRF_INTR0_CLR_EN		0x0104
1803d0407baSopenharmony_ci#define GRF_INTR0_STATUS		0x0108
1813d0407baSopenharmony_ci#define GRF_INTR0_RAW_STATUS		0x010c
1823d0407baSopenharmony_ci#define GRF_INTR1_EN			0x0110
1833d0407baSopenharmony_ci#define GRF_INTR1_CLR_EN		0x0114
1843d0407baSopenharmony_ci#define GRF_INTR1_STATUS		0x0118
1853d0407baSopenharmony_ci#define GRF_INTR1_RAW_STATUS		0x011c
1863d0407baSopenharmony_ci#define GRF_SYSTEM_STATUS0		0x0120
1873d0407baSopenharmony_ci/* 0: i2c mode and mcu mode; 1: i2c mode only */
1883d0407baSopenharmony_ci#define I2C_ONLY_FLAG			BIT(6)
1893d0407baSopenharmony_ci#define GRF_SYSTEM_STATUS3		0x012c
1903d0407baSopenharmony_ci#define GRF_SYSTEM_STATUS4		0x0130
1913d0407baSopenharmony_ci#define GRF_OS_REG0			0x0140
1923d0407baSopenharmony_ci#define GRF_OS_REG1			0x0144
1933d0407baSopenharmony_ci#define GRF_OS_REG2			0x0148
1943d0407baSopenharmony_ci#define GRF_OS_REG3			0x014c
1953d0407baSopenharmony_ci#define GRF_SOC_VERSION			0x0150
1963d0407baSopenharmony_ci#define GRF_MAX_REGISTER		GRF_SOC_VERSION
1973d0407baSopenharmony_ci
1983d0407baSopenharmony_cienum {
1993d0407baSopenharmony_ci	COMBTXPHY_MODULEA_EN = BIT(0),
2003d0407baSopenharmony_ci	COMBTXPHY_MODULEB_EN = BIT(1),
2013d0407baSopenharmony_ci};
2023d0407baSopenharmony_ci
2033d0407baSopenharmony_cienum {
2043d0407baSopenharmony_ci	OUTPUT_MODE_GVI = 1,
2053d0407baSopenharmony_ci	OUTPUT_MODE_LVDS,
2063d0407baSopenharmony_ci	OUTPUT_MODE_HDMI,
2073d0407baSopenharmony_ci	OUTPUT_MODE_CSI,
2083d0407baSopenharmony_ci	OUTPUT_MODE_DSI,
2093d0407baSopenharmony_ci	OUTPUT_MODE_BT1120 = 8,
2103d0407baSopenharmony_ci	OUTPUT_MODE_RGB = 16,
2113d0407baSopenharmony_ci	OUTPUT_MODE_YUV = 24,
2123d0407baSopenharmony_ci};
2133d0407baSopenharmony_ci
2143d0407baSopenharmony_cienum {
2153d0407baSopenharmony_ci	INPUT_MODE_HDMI,
2163d0407baSopenharmony_ci	INPUT_MODE_BT1120 = 2,
2173d0407baSopenharmony_ci	INPUT_MODE_RGB,
2183d0407baSopenharmony_ci	INPUT_MODE_YUV,
2193d0407baSopenharmony_ci};
2203d0407baSopenharmony_ci
2213d0407baSopenharmony_cistruct rk628_irq_chip_data {
2223d0407baSopenharmony_ci	const char *name;
2233d0407baSopenharmony_ci	unsigned int status_base;
2243d0407baSopenharmony_ci	unsigned int mask_base;
2253d0407baSopenharmony_ci	unsigned int ack_base;
2263d0407baSopenharmony_ci	int num_regs;
2273d0407baSopenharmony_ci	const struct regmap_irq *irqs;
2283d0407baSopenharmony_ci	int num_irqs;
2293d0407baSopenharmony_ci	struct mutex lock;
2303d0407baSopenharmony_ci	struct irq_chip irq_chip;
2313d0407baSopenharmony_ci	struct regmap *map;
2323d0407baSopenharmony_ci	struct irq_domain *domain;
2333d0407baSopenharmony_ci	int irq;
2343d0407baSopenharmony_ci	unsigned int *status_buf;
2353d0407baSopenharmony_ci	unsigned int *mask_buf;
2363d0407baSopenharmony_ci	unsigned int *mask_buf_def;
2373d0407baSopenharmony_ci	unsigned int irq_reg_stride;
2383d0407baSopenharmony_ci	unsigned int reg_stride;
2393d0407baSopenharmony_ci};
2403d0407baSopenharmony_ci
2413d0407baSopenharmony_cistruct rk628 {
2423d0407baSopenharmony_ci	struct device *dev;
2433d0407baSopenharmony_ci	struct i2c_client *client;
2443d0407baSopenharmony_ci	struct regmap *grf;
2453d0407baSopenharmony_ci	struct gpio_desc *reset_gpio;
2463d0407baSopenharmony_ci	struct gpio_desc *enable_gpio;
2473d0407baSopenharmony_ci	struct rk628_irq_chip_data *irq_data;
2483d0407baSopenharmony_ci	struct drm_display_mode src_mode;
2493d0407baSopenharmony_ci	struct drm_display_mode dst_mode;
2503d0407baSopenharmony_ci	bool dst_mode_valid;
2513d0407baSopenharmony_ci};
2523d0407baSopenharmony_ci
2533d0407baSopenharmony_ci/**
2543d0407baSopenharmony_ci * rk628_scaler_add_src_mode - add source mode for scaler
2553d0407baSopenharmony_ci * @rk628: parent device
2563d0407baSopenharmony_ci * @connector: DRM connector
2573d0407baSopenharmony_ci * If need scale, call the function at last of get_modes.
2583d0407baSopenharmony_ci */
2593d0407baSopenharmony_ciint rk628_scaler_add_src_mode(struct rk628 *rk628,
2603d0407baSopenharmony_ci			      struct drm_connector *connector);
2613d0407baSopenharmony_ci
2623d0407baSopenharmony_ci/**
2633d0407baSopenharmony_ci * rk628_mode_copy - rk628 mode copy
2643d0407baSopenharmony_ci * @rk628: parent device
2653d0407baSopenharmony_ci * @dst: dst mode
2663d0407baSopenharmony_ci * @src: src mode
2673d0407baSopenharmony_ci * Call the function at mode_set, replace drm_mode_copy.
2683d0407baSopenharmony_ci */
2693d0407baSopenharmony_civoid rk628_mode_copy(struct rk628 *rk628, struct drm_display_mode *dst,
2703d0407baSopenharmony_ci		     const struct drm_display_mode *src);
2713d0407baSopenharmony_ci
2723d0407baSopenharmony_ci#endif
273