1 #ifndef _RK3036_HDMI_HW_H
2 #define _RK3036_HDMI_HW_H
4 #include <linux/rockchip/iomap.h>
5 #include <linux/delay.h>
18 C0_C2_CHANGE_ENABLE, /* enable c0 c2 change*/
19 C0_C2_CHANGE_DISABLE /* disable c0 c2 change*/
22 /* Auto CSC mode enable */
24 AUTO_CSC_DISABLE, /* disable auto csc*/
25 AUTO_CSC_ENABLE /* enable auto csc*/
29 /* Color Limit Range */
31 COLOR_LIMIT_RANGE_0_255, /* Color Limit Range 0 To 255*/
32 COLOR_LIMIT_RANGE_16_235, /* Color Limit Range 16 To 235*/
34 /* Color Space Convertion Mode */
36 CSC_ITU601_16_235_TO_RGB_0_255_8BIT, /* YCbCr 16-235 input to RGB 0-255 output according BT601 that is 8bit clolor depth */
37 CSC_ITU601_0_255_TO_RGB_0_255_8BIT, /* YCbCr 0-255 input to RGB 0-255 output according BT601 that is 8bit clolor depth */
38 CSC_ITU709_16_235_TO_RGB_0_255_8BIT, /* YCbCr 16-235 input to RGB 0-255 output according BT709 that is 8bit clolor depth */
39 CSC_RGB_0_255_TO_ITU601_16_235_8BIT, /* RGB 0-255 input to YCbCr 16-235 output according BT601 that is 8bit clolor depth */
40 CSC_RGB_0_255_TO_ITU709_16_235_8BIT, /* RGB 0-255 input to YCbCr 16-235 output accroding BT709 that is 8bit clolor depth */
41 CSC_RGB_0_255_TO_RGB_16_235_8BIT, /* RGB 0-255 input to RGB 16-235 output that is 8bit clolor depth */
45 #define AUTO_DEFINE_CSC
46 #ifdef RK616_USE_MCLK_12M
47 #define HDMI_SYS_FREG_CLK 12000000
49 #define HDMI_SYS_FREG_CLK 11289600
52 #define HDMI_SCL_RATE (100*1000)
53 #define DDC_BUS_FREQ_L 0x4b
54 #define DDC_BUS_FREQ_H 0x4c
57 #define m_RST_ANALOG (1 << 6)
58 #define v_RST_ANALOG (0 << 6)
59 #define v_NOT_RST_ANALOG (1 << 6)
61 #define m_RST_DIGITAL (1 << 5)
62 #define v_RST_DIGITAL (0 << 5)
63 #define v_NOT_RST_DIGITAL (1 << 5)
65 #define m_REG_CLK_INV (1 << 4)
66 #define v_REG_CLK_NOT_INV (0 << 4)
67 #define v_REG_CLK_INV (1 << 4)
68 #define m_VCLK_INV (1 << 3)
69 #define v_VCLK_NOT_INV (0 << 3)
70 #define v_VCLK_INV (1 << 3)
71 #define m_REG_CLK_SOURCE (1 << 2)
72 #define v_REG_CLK_SOURCE_TMDS (0 << 2)
73 #define v_REG_CLK_SOURCE_SYS (1 << 2)
74 #define m_POWER (1 << 1)
75 #define v_PWR_ON (0 << 1)
76 #define v_PWR_OFF (1 << 1)
77 #define m_INT_POL (1 << 0)
78 #define v_INT_POL_HIGH 1
79 #define v_INT_POL_LOW 0
81 #define VIDEO_CONTRL1 0x01
82 #define m_VIDEO_INPUT_FORMAT (7 << 1)
83 #define m_DE_SOURCE (1 << 0)
85 VIDEO_INPUT_SDR_RGB444 = 0,
86 VIDEO_INPUT_DDR_RGB444 = 5,
87 VIDEO_INPUT_DDR_YCBCR422 = 6
89 #define v_VIDEO_INPUT_FORMAT(n) (n << 1)
90 #define v_DE_EXTERNAL 1
91 #define v_DE_INTERANL 0
93 #define VIDEO_CONTRL2 0x02
94 #define m_VIDEO_OUTPUT_FORMAT (3 << 6)
95 #define m_VIDEO_INPUT_BITS (3 << 4)
96 #define m_VIDEO_INPUT_CSP (1 << 0)
97 #define v_VIDEO_OUTPUT_FORMAT(n) (((n)&0x3) << 6)
98 #define v_VIDEO_INPUT_BITS(n) (n << 4)
99 #define v_VIDEO_INPUT_CSP(n) (n << 0)
102 VIDEO_INPUT_12BITS = 0,
107 #define VIDEO_CONTRL 0x03
108 #define m_VIDEO_AUTO_CSC (1 << 7)
109 #define v_VIDEO_AUTO_CSC(n) (n << 7)
110 #define m_VIDEO_C0_C2_EXCHANGE (1 << 0)
111 #define v_VIDEO_C0_C2_EXCHANGE(n) (n << 0)
114 #define VIDEO_CONTRL3 0x04
115 #define m_SOF (1 << 3)
116 #define m_CSC (1 << 0)
117 #define v_SOF_ENABLE (0 << 3)
118 #define v_SOF_DISABLE (1 << 3)
119 #define v_CSC_ENABLE 1
120 #define v_CSC_DISABLE 0
123 #define m_AVMUTE_CLEAR (1 << 7)
124 #define m_AVMUTE_ENABLE (1 << 6)
125 #define m_AUDIO_MUTE (1 << 1)
126 #define m_VIDEO_BLACK (1 << 0)
127 #define v_AVMUTE_CLEAR(n) (n << 7)
128 #define v_AVMUTE_ENABLE(n) (n << 6)
129 #define v_AUDIO_MUTE(n) (n << 1)
130 #define v_VIDEO_MUTE(n) (n << 0)
132 #define VIDEO_TIMING_CTL 0x08
133 #define v_HSYNC_POLARITY(n) (n << 3)
134 #define v_VSYNC_POLARITY(n) (n << 2)
135 #define v_INETLACE(n) (n << 1)
136 #define v_EXTERANL_VIDEO(n) (n << 0)
138 #define VIDEO_EXT_HTOTAL_L 0x09
139 #define VIDEO_EXT_HTOTAL_H 0x0a
140 #define VIDEO_EXT_HBLANK_L 0x0b
141 #define VIDEO_EXT_HBLANK_H 0x0c
142 #define VIDEO_EXT_HDELAY_L 0x0d
143 #define VIDEO_EXT_HDELAY_H 0x0e
144 #define VIDEO_EXT_HDURATION_L 0x0f
145 #define VIDEO_EXT_HDURATION_H 0x10
146 #define VIDEO_EXT_VTOTAL_L 0x11
147 #define VIDEO_EXT_VTOTAL_H 0x12
148 #define VIDEO_EXT_VBLANK 0x13
149 #define VIDEO_EXT_VDELAY 0x14
150 #define VIDEO_EXT_VDURATION 0x15
152 #define VIDEO_CSC_COEF 0x18
155 #define AUDIO_CTRL1 0x35
157 CTS_SOURCE_INTERNAL = 0,
160 #define v_CTS_SOURCE(n) (n << 7)
162 DOWNSAMPLE_DISABLE = 0,
166 #define v_DOWN_SAMPLE(n) (n << 5)
168 AUDIO_SOURCE_IIS = 0,
171 #define v_AUDIO_SOURCE(n) (n << 3)
172 #define v_MCLK_ENABLE(n) (n << 2)
179 #define v_MCLK_RATIO(n) (n)
181 #define AUDIO_SAMPLE_RATE 0x37
192 #define AUDIO_I2S_MODE 0x38
197 I2S_CHANNEL_7_8 = 0xf
199 #define v_I2S_CHANNEL(n) ((n) << 2)
205 #define v_I2S_MODE(n) (n)
207 #define AUDIO_I2S_MAP 0x39
208 #define AUDIO_I2S_SWAPS_SPDIF 0x3a
209 #define v_SPIDF_FREQ(n) (n)
212 #define N_441K 0x1880
213 #define N_882K 0x3100
214 #define N_1764K 0x6200
217 #define N_192K 0x6000
219 #define AUDIO_N_H 0x3f
220 #define AUDIO_N_M 0x40
221 #define AUDIO_N_L 0x41
223 #define AUDIO_CTS_H 0x45
224 #define AUDIO_CTS_M 0x46
225 #define AUDIO_CTS_L 0x47
227 #define DDC_CLK_L 0x4b
228 #define DDC_CLK_H 0x4c
230 #define EDID_SEGMENT_POINTER 0x4d
231 #define EDID_WORD_ADDR 0x4e
232 #define EDID_FIFO_OFFSET 0x4f
233 #define EDID_FIFO_ADDR 0x50
236 #define PACKET_SEND_MANUAL 0x9c
237 #define PACKET_SEND_AUTO 0x9d
238 #define m_PACKET_GCP_EN (1 << 7)
239 /* CONTROL_PACKET_BUF_INDEX */
240 #define CONTROL_PACKET_BUF_INDEX 0x9f
242 INFOFRAME_AVI = 0x06,
245 #define CONTROL_PACKET_ADDR 0xa0
247 #define SIZE_AVI_INFOFRAME 0x11 /* 14 bytes */
248 #define SIZE_AUDIO_INFOFRAME 0x0F /* 15 bytes */
250 AVI_COLOR_MODE_RGB = 0,
251 AVI_COLOR_MODE_YCBCR422,
252 AVI_COLOR_MODE_YCBCR444
255 AVI_COLORIMETRY_NO_DATA = 0,
256 AVI_COLORIMETRY_SMPTE_170M,
257 AVI_COLORIMETRY_ITU709,
258 AVI_COLORIMETRY_EXTENDED
261 AVI_CODED_FRAME_ASPECT_NO_DATA,
262 AVI_CODED_FRAME_ASPECT_4_3,
263 AVI_CODED_FRAME_ASPECT_16_9
266 ACTIVE_ASPECT_RATE_SAME_AS_CODED_FRAME = 0x08,
267 ACTIVE_ASPECT_RATE_4_3,
268 ACTIVE_ASPECT_RATE_16_9,
269 ACTIVE_ASPECT_RATE_14_9
272 #define HDCP_CTRL 0x52
273 #define m_HDMI_DVI (1 << 1)
274 #define v_HDMI_DVI(n) (n << 1)
276 #define INTERRUPT_MASK1 0xc0
277 #define INTERRUPT_STATUS1 0xc1
278 #define m_INT_ACTIVE_VSYNC (1 << 5)
279 #define m_INT_EDID_READY (1 << 2)
281 #define INTERRUPT_MASK2 0xc2
282 #define INTERRUPT_STATUS2 0xc3
283 #define m_INT_HDCP_ERR (1 << 7)
284 #define m_INT_BKSV_FLAG (1 << 6)
285 #define m_INT_HDCP_OK (1 << 4)
287 #define HDMI_STATUS 0xc8
288 #define m_HOTPLUG (1 << 7)
289 #define m_MASK_INT_HOTPLUG (1 << 5)
290 #define m_INT_HOTPLUG (1 << 1)
293 #define HDMI_COLORBAR 0xc9
295 #define PHY_SYNC 0xce /* sync phy parameter */
296 #define PHY_SYS_CTL 0xe0
297 #define m_TMDS_CLK_SOURCE (1 << 5)
298 #define v_TMDS_FROM_PLL (0 << 5)
299 #define v_TMDS_FROM_GEN (1 << 5)
300 #define m_PHASE_CLK (1 << 4)
301 #define v_DEFAULT_PHASE (0 << 4)
302 #define v_SYNC_PHASE (1 << 4)
303 #define m_TMDS_CURRENT_PWR (1 << 3)
304 #define v_TURN_ON_CURRENT (0 << 3)
305 #define v_CAT_OFF_CURRENT (1 << 3)
306 #define m_BANDGAP_PWR (1 << 2)
307 #define v_BANDGAP_PWR_UP (0 << 2)
308 #define v_BANDGAP_PWR_DOWN (1 << 2)
309 #define m_PLL_PWR (1 << 1)
310 #define v_PLL_PWR_UP (0 << 1)
311 #define v_PLL_PWR_DOWN (1 << 1)
312 #define m_TMDS_CHG_PWR (1 << 0)
313 #define v_TMDS_CHG_PWR_UP (0 << 0)
314 #define v_TMDS_CHG_PWR_DOWN (1 << 0)
316 #define PHY_CHG_PWR 0xe1
317 #define v_CLK_CHG_PWR(n) ((n & 1) << 3)
318 #define v_DATA_CHG_PWR(n) ((n & 7) << 0)
320 #define PHY_DRIVER 0xe2
321 #define v_CLK_MAIN_DRIVER(n) (n << 4)
322 #define v_DATA_MAIN_DRIVER(n) (n << 0)
324 #define PHY_PRE_EMPHASIS 0xe3
325 #define v_PRE_EMPHASIS(n) ((n & 7) << 4)
326 #define v_CLK_PRE_DRIVER(n) ((n & 3) << 2)
327 #define v_DATA_PRE_DRIVER(n) ((n & 3) << 0)
329 #define PHY_FEEDBACK_DIV_RATIO_LOW 0xe7
330 #define v_FEEDBACK_DIV_LOW(n) (n & 0xff)
331 #define PHY_FEEDBACK_DIV_RATIO_HIGH 0xe8
332 #define v_FEEDBACK_DIV_HIGH(n) (n & 1)
334 #define PHY_PRE_DIV_RATIO 0xed
335 #define v_PRE_DIV_RATIO(n) (n & 0x1f)
338 /*-----START----- HDMI CEC CTRL------START------*/
339 #define CEC_CTRL 0xd0
340 #define m_ADJUST_FOR_HISENSE (1 << 6)
341 #define m_REJECT_RX_BROADCAST (1 << 5)
342 #define m_BUSFREETIME_ENABLE (1 << 2)
343 #define m_REJECT_RX (1 << 1)
344 #define m_START_TX (1 << 0)
346 #define CEC_DATA 0xd1
347 #define CEC_TX_OFFSET 0xd2
348 #define CEC_RX_OFFSET 0xd3
349 #define CEC_CLK_H 0xd4
350 #define CEC_CLK_L 0xd5
351 #define CEC_TX_LENGTH 0xd6
352 #define CEC_RX_LENGTH 0xd7
353 #define CEC_TX_INT_MASK 0xd8
354 #define m_TX_DONE (1 << 3)
355 #define m_TX_NOACK (1 << 2)
356 #define m_TX_BROADCAST_REJ (1 << 1)
357 #define m_TX_BUSNOTFREE (1 << 0)
359 #define CEC_RX_INT_MASK 0xd9
360 #define m_RX_LA_ERR (1 << 4)
361 #define m_RX_GLITCH (1 << 3)
362 #define m_RX_DONE (1 << 0)
364 #define CEC_TX_INT 0xda
365 #define CEC_RX_INT 0xdb
366 #define CEC_BUSFREETIME_L 0xdc
367 #define CEC_BUSFREETIME_H 0xdd
368 #define CEC_LOGICADDR 0xde
369 /*------END------ HDMI CEC CTRL------END-------*/
372 static inline int hdmi_readl(struct rk_hdmi_device *hdmi_dev, u16 offset,
377 *val = readl_relaxed(hdmi_dev->regbase + (offset) * 0x04);
381 static inline int hdmi_writel(struct rk_hdmi_device *hdmi_dev, u16 offset,
386 writel_relaxed(val, hdmi_dev->regbase + (offset) * 0x04);
390 static inline int hdmi_msk_reg(struct rk_hdmi_device *hdmi_dev, u16 offset,
396 temp = readl_relaxed(hdmi_dev->regbase + (offset) * 0x04) & (0xFF - (msk));
397 writel_relaxed(temp | ((val) & (msk)), hdmi_dev->regbase + (offset) * 0x04);
400 static inline void rk3036_hdmi_reset_pclk(void)
402 writel_relaxed(0x00010001, RK_CRU_VIRT+ 0x128);
404 writel_relaxed(0x00010000, RK_CRU_VIRT + 0x128);
407 extern int rk3036_hdmi_initial(struct hdmi *hdmi);
408 extern void rk3036_hdmi_irq(struct hdmi *hdmi);