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