1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2016 Maxime Ripard 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Maxime Ripard <maxime.ripard@free-electrons.com> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _SUN4I_HDMI_H_ 9*4882a593Smuzhiyun #define _SUN4I_HDMI_H_ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <drm/drm_connector.h> 12*4882a593Smuzhiyun #include <drm/drm_encoder.h> 13*4882a593Smuzhiyun #include <linux/regmap.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <media/cec-pin.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define SUN4I_HDMI_CTRL_REG 0x004 18*4882a593Smuzhiyun #define SUN4I_HDMI_CTRL_ENABLE BIT(31) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define SUN4I_HDMI_IRQ_REG 0x008 21*4882a593Smuzhiyun #define SUN4I_HDMI_IRQ_STA_MASK 0x73 22*4882a593Smuzhiyun #define SUN4I_HDMI_IRQ_STA_FIFO_OF BIT(1) 23*4882a593Smuzhiyun #define SUN4I_HDMI_IRQ_STA_FIFO_UF BIT(0) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define SUN4I_HDMI_HPD_REG 0x00c 26*4882a593Smuzhiyun #define SUN4I_HDMI_HPD_HIGH BIT(0) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define SUN4I_HDMI_VID_CTRL_REG 0x010 29*4882a593Smuzhiyun #define SUN4I_HDMI_VID_CTRL_ENABLE BIT(31) 30*4882a593Smuzhiyun #define SUN4I_HDMI_VID_CTRL_HDMI_MODE BIT(30) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_ACT_REG 0x014 33*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_BP_REG 0x018 34*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_FP_REG 0x01c 35*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_SPW_REG 0x020 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_X(x) ((((x) - 1) & GENMASK(11, 0))) 38*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_Y(y) ((((y) - 1) & GENMASK(11, 0)) << 16) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_POL_REG 0x024 41*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_POL_TX_CLK (0x3e0 << 16) 42*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_POL_VSYNC BIT(1) 43*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_POL_HSYNC BIT(0) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define SUN4I_HDMI_AVI_INFOFRAME_REG(n) (0x080 + (n)) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_REG 0x200 48*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_BIASEN BIT(31) 49*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_LDOCEN BIT(30) 50*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_LDODEN BIT(29) 51*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_PWENC BIT(28) 52*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_PWEND BIT(27) 53*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_PWENG BIT(26) 54*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_CKEN BIT(25) 55*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_TXEN BIT(23) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG 0x204 58*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_UNKNOWN BIT(24) /* set on A31 */ 59*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_AMP_OPT BIT(23) 60*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_AMPCK_OPT BIT(22) 61*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_EMP_OPT BIT(20) 62*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_EMPCK_OPT BIT(19) 63*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_PWSCK BIT(18) 64*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_PWSDT BIT(17) 65*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG_DEN BIT(15) 66*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG_DENCK BIT(14) 67*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG_EMP(n) (((n) & 7) << 10) 68*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_HALVE_CLK BIT(6) 69*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG_AMP(n) (((n) & 7) << 3) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* These bits seem to invert the TMDS data channels */ 72*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_INVERT_R BIT(2) 73*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_INVERT_G BIT(1) 74*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_INVERT_B BIT(0) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_REG 0x208 77*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_PLL_EN BIT(31) 78*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_BWS BIT(30) 79*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_HV_IS_33 BIT(29) 80*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_LDO1_EN BIT(28) 81*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_LDO2_EN BIT(27) 82*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_SDIV2 BIT(25) 83*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_VCO_GAIN(n) (((n) & 7) << 20) 84*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_S(n) (((n) & 7) << 17) 85*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_CP_S(n) (((n) & 0x1f) << 12) 86*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_CS(n) (((n) & 0xf) << 8) 87*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_DIV(n) (((n) & 0xf) << 4) 88*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_DIV_MASK GENMASK(7, 4) 89*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_VCO_S(n) ((n) & 0xf) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_DBG0_REG 0x20c 92*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_DBG0_TMDS_PARENT(n) (((n) & 1) << 21) 93*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_DBG0_TMDS_PARENT_MASK BIT(21) 94*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_DBG0_TMDS_PARENT_SHIFT 21 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #define SUN4I_HDMI_CEC 0x214 97*4882a593Smuzhiyun #define SUN4I_HDMI_CEC_ENABLE BIT(11) 98*4882a593Smuzhiyun #define SUN4I_HDMI_CEC_TX BIT(9) 99*4882a593Smuzhiyun #define SUN4I_HDMI_CEC_RX BIT(8) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define SUN4I_HDMI_PKT_CTRL_REG(n) (0x2f0 + (4 * (n))) 102*4882a593Smuzhiyun #define SUN4I_HDMI_PKT_CTRL_TYPE(n, t) ((t) << (((n) % 4) * 4)) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #define SUN4I_HDMI_UNKNOWN_REG 0x300 105*4882a593Smuzhiyun #define SUN4I_HDMI_UNKNOWN_INPUT_SYNC BIT(27) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_REG 0x500 108*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_ENABLE BIT(31) 109*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_START_CMD BIT(30) 110*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_FIFO_DIR_MASK BIT(8) 111*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_FIFO_DIR_WRITE (1 << 8) 112*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_FIFO_DIR_READ (0 << 8) 113*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_RESET BIT(0) 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_REG 0x504 116*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_SEGMENT(seg) (((seg) & 0xff) << 24) 117*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_EDDC(addr) (((addr) & 0xff) << 16) 118*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_OFFSET(off) (((off) & 0xff) << 8) 119*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_SLAVE(addr) ((addr) & 0xff) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_REG 0x50c 122*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_ILLEGAL_FIFO_OPERATION BIT(7) 123*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_DDC_RX_FIFO_UNDERFLOW BIT(6) 124*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_DDC_TX_FIFO_OVERFLOW BIT(5) 125*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_FIFO_REQUEST BIT(4) 126*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_ARBITRATION_ERROR BIT(3) 127*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_ACK_ERROR BIT(2) 128*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_BUS_ERROR BIT(1) 129*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_TRANSFER_COMPLETE BIT(0) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_REG 0x510 132*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_CLEAR BIT(31) 133*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_RX_THRES(n) (((n) & 0xf) << 4) 134*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_RX_THRES_MASK GENMASK(7, 4) 135*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_RX_THRES_MAX (BIT(4) - 1) 136*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_TX_THRES(n) ((n) & 0xf) 137*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_TX_THRES_MASK GENMASK(3, 0) 138*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_TX_THRES_MAX (BIT(4) - 1) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_DATA_REG 0x518 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_BYTE_COUNT_REG 0x51c 143*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_BYTE_COUNT_MAX (BIT(10) - 1) 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CMD_REG 0x520 146*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CMD_EXPLICIT_EDDC_READ 6 147*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CMD_IMPLICIT_READ 5 148*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CLK_REG 0x528 151*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0xf) << 3) 152*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CLK_N(n) ((n) & 0x7) 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540 155*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_LINE_CTRL_SDA_ENABLE BIT(9) 156*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_LINE_CTRL_SCL_ENABLE BIT(8) 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_SIZE 16 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* A31 specific */ 161*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_REG 0x500 162*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_RESET BIT(31) 163*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_START_CMD BIT(27) 164*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_SDA_ENABLE BIT(6) 165*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_SCL_ENABLE BIT(4) 166*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_ENABLE BIT(0) 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CMD_REG 0x508 169*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CMD_BYTE_COUNT(count) ((count) << 16) 170*4882a593Smuzhiyun /* command types in lower 3 bits are the same as sun4i */ 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_REG 0x50c 173*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_SEGMENT(seg) (((seg) & 0xff) << 24) 174*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_EDDC(addr) (((addr) & 0xff) << 16) 175*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_OFFSET(off) (((off) & 0xff) << 8) 176*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_SLAVE(addr) (((addr) & 0xff) << 1) 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_INT_STATUS_REG 0x514 179*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_INT_STATUS_TIMEOUT BIT(8) 180*4882a593Smuzhiyun /* lower 8 bits are the same as sun4i */ 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_FIFO_CTRL_REG 0x518 183*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_FIFO_CTRL_CLEAR BIT(15) 184*4882a593Smuzhiyun /* lower 9 bits are the same as sun4i */ 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CLK_REG 0x520 187*4882a593Smuzhiyun /* DDC CLK bit fields are the same, but the formula is not */ 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_FIFO_DATA_REG 0x580 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun enum sun4i_hdmi_pkt_type { 192*4882a593Smuzhiyun SUN4I_HDMI_PKT_AVI = 2, 193*4882a593Smuzhiyun SUN4I_HDMI_PKT_END = 15, 194*4882a593Smuzhiyun }; 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun struct sun4i_hdmi_variant { 197*4882a593Smuzhiyun bool has_ddc_parent_clk; 198*4882a593Smuzhiyun bool has_reset_control; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun u32 pad_ctrl0_init_val; 201*4882a593Smuzhiyun u32 pad_ctrl1_init_val; 202*4882a593Smuzhiyun u32 pll_ctrl_init_val; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun struct reg_field ddc_clk_reg; 205*4882a593Smuzhiyun u8 ddc_clk_pre_divider; 206*4882a593Smuzhiyun u8 ddc_clk_m_offset; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun u8 tmds_clk_div_offset; 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /* Register fields for I2C adapter */ 211*4882a593Smuzhiyun struct reg_field field_ddc_en; 212*4882a593Smuzhiyun struct reg_field field_ddc_start; 213*4882a593Smuzhiyun struct reg_field field_ddc_reset; 214*4882a593Smuzhiyun struct reg_field field_ddc_addr_reg; 215*4882a593Smuzhiyun struct reg_field field_ddc_slave_addr; 216*4882a593Smuzhiyun struct reg_field field_ddc_int_mask; 217*4882a593Smuzhiyun struct reg_field field_ddc_int_status; 218*4882a593Smuzhiyun struct reg_field field_ddc_fifo_clear; 219*4882a593Smuzhiyun struct reg_field field_ddc_fifo_rx_thres; 220*4882a593Smuzhiyun struct reg_field field_ddc_fifo_tx_thres; 221*4882a593Smuzhiyun struct reg_field field_ddc_byte_count; 222*4882a593Smuzhiyun struct reg_field field_ddc_cmd; 223*4882a593Smuzhiyun struct reg_field field_ddc_sda_en; 224*4882a593Smuzhiyun struct reg_field field_ddc_sck_en; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /* DDC FIFO register offset */ 227*4882a593Smuzhiyun u32 ddc_fifo_reg; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun /* 230*4882a593Smuzhiyun * DDC FIFO threshold boundary conditions 231*4882a593Smuzhiyun * 232*4882a593Smuzhiyun * This is used to cope with the threshold boundary condition 233*4882a593Smuzhiyun * being slightly different on sun5i and sun6i. 234*4882a593Smuzhiyun * 235*4882a593Smuzhiyun * On sun5i the threshold is exclusive, i.e. does not include, 236*4882a593Smuzhiyun * the value of the threshold. ( > for RX; < for TX ) 237*4882a593Smuzhiyun * On sun6i the threshold is inclusive, i.e. includes, the 238*4882a593Smuzhiyun * value of the threshold. ( >= for RX; <= for TX ) 239*4882a593Smuzhiyun */ 240*4882a593Smuzhiyun bool ddc_fifo_thres_incl; 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun bool ddc_fifo_has_dir; 243*4882a593Smuzhiyun }; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun struct sun4i_hdmi { 246*4882a593Smuzhiyun struct drm_connector connector; 247*4882a593Smuzhiyun struct drm_encoder encoder; 248*4882a593Smuzhiyun struct device *dev; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun void __iomem *base; 251*4882a593Smuzhiyun struct regmap *regmap; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* Reset control */ 254*4882a593Smuzhiyun struct reset_control *reset; 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun /* Parent clocks */ 257*4882a593Smuzhiyun struct clk *bus_clk; 258*4882a593Smuzhiyun struct clk *mod_clk; 259*4882a593Smuzhiyun struct clk *ddc_parent_clk; 260*4882a593Smuzhiyun struct clk *pll0_clk; 261*4882a593Smuzhiyun struct clk *pll1_clk; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun /* And the clocks we create */ 264*4882a593Smuzhiyun struct clk *ddc_clk; 265*4882a593Smuzhiyun struct clk *tmds_clk; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun struct i2c_adapter *i2c; 268*4882a593Smuzhiyun struct i2c_adapter *ddc_i2c; 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun /* Regmap fields for I2C adapter */ 271*4882a593Smuzhiyun struct regmap_field *field_ddc_en; 272*4882a593Smuzhiyun struct regmap_field *field_ddc_start; 273*4882a593Smuzhiyun struct regmap_field *field_ddc_reset; 274*4882a593Smuzhiyun struct regmap_field *field_ddc_addr_reg; 275*4882a593Smuzhiyun struct regmap_field *field_ddc_slave_addr; 276*4882a593Smuzhiyun struct regmap_field *field_ddc_int_mask; 277*4882a593Smuzhiyun struct regmap_field *field_ddc_int_status; 278*4882a593Smuzhiyun struct regmap_field *field_ddc_fifo_clear; 279*4882a593Smuzhiyun struct regmap_field *field_ddc_fifo_rx_thres; 280*4882a593Smuzhiyun struct regmap_field *field_ddc_fifo_tx_thres; 281*4882a593Smuzhiyun struct regmap_field *field_ddc_byte_count; 282*4882a593Smuzhiyun struct regmap_field *field_ddc_cmd; 283*4882a593Smuzhiyun struct regmap_field *field_ddc_sda_en; 284*4882a593Smuzhiyun struct regmap_field *field_ddc_sck_en; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun struct sun4i_drv *drv; 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun bool hdmi_monitor; 289*4882a593Smuzhiyun struct cec_adapter *cec_adap; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun const struct sun4i_hdmi_variant *variant; 292*4882a593Smuzhiyun }; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun int sun4i_ddc_create(struct sun4i_hdmi *hdmi, struct clk *clk); 295*4882a593Smuzhiyun int sun4i_tmds_create(struct sun4i_hdmi *hdmi); 296*4882a593Smuzhiyun int sun4i_hdmi_i2c_create(struct device *dev, struct sun4i_hdmi *hdmi); 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun #endif /* _SUN4I_HDMI_H_ */ 299