20b326653e6c44589209d0ff92d26275a72137fe
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / hdmi / chips / rk3036 / rk3036_hdmi_hw.h
1 #ifndef _RK3036_HDMI_HW_H
2 #define _RK3036_HDMI_HW_H
3
4 #include <linux/rockchip/iomap.h>
5 #include <linux/delay.h>
6
7 enum PWR_MODE {
8         NORMAL,
9         LOWER_PWR,
10 };
11 enum {
12         OUTPUT_DVI = 0,
13         OUTPUT_HDMI
14 };
15
16 /* C0 C2 Change */
17 enum {
18         C0_C2_CHANGE_ENABLE,    /* enable c0 c2 change*/
19         C0_C2_CHANGE_DISABLE    /* disable c0 c2 change*/
20 };
21
22 /* Auto CSC mode enable */
23 enum {
24         AUTO_CSC_DISABLE,       /* disable auto csc*/
25         AUTO_CSC_ENABLE /* enable auto csc*/
26 };
27
28
29 /* Color Limit Range */
30 enum {
31         COLOR_LIMIT_RANGE_0_255,        /* Color Limit Range 0 To 255*/
32         COLOR_LIMIT_RANGE_16_235,       /* Color Limit Range 16 To 235*/
33 };
34 /* Color Space Convertion Mode */
35 enum {
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 */
42 };
43
44
45 #define AUTO_DEFINE_CSC
46 #ifdef RK616_USE_MCLK_12M
47 #define HDMI_SYS_FREG_CLK        12000000
48 #else
49 #define HDMI_SYS_FREG_CLK        11289600
50 #endif
51
52 #define HDMI_SCL_RATE            (100*1000)
53 #define DDC_BUS_FREQ_L                  0x4b
54 #define DDC_BUS_FREQ_H                  0x4c
55
56 #define SYS_CTRL                        0x00
57 #define m_RST_ANALOG            (1 << 6)
58 #define v_RST_ANALOG            (0 << 6)
59 #define v_NOT_RST_ANALOG        (1 << 6)
60
61 #define m_RST_DIGITAL           (1 << 5)
62 #define v_RST_DIGITAL           (0 << 5)
63 #define v_NOT_RST_DIGITAL       (1 << 5)
64
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
80
81 #define VIDEO_CONTRL1                   0x01
82 #define m_VIDEO_INPUT_FORMAT    (7 << 1)
83 #define m_DE_SOURCE             (1 << 0)
84 enum {
85         VIDEO_INPUT_SDR_RGB444 = 0,
86         VIDEO_INPUT_DDR_RGB444 = 5,
87         VIDEO_INPUT_DDR_YCBCR422 = 6
88 };
89 #define v_VIDEO_INPUT_FORMAT(n) (n << 1)
90 #define v_DE_EXTERNAL           1
91 #define v_DE_INTERANL           0
92
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)
100
101 enum {
102         VIDEO_INPUT_12BITS = 0,
103         VIDEO_INPUT_10BITS,
104         VIDEO_INPUT_REVERT,
105         VIDEO_INPUT_8BITS
106 };
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)
112
113
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
121
122 #define AV_MUTE                         0x05
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)
131
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)
137
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
151
152 #define VIDEO_CSC_COEF                  0x18
153
154
155 #define AUDIO_CTRL1                     0x35
156 enum {
157         CTS_SOURCE_INTERNAL = 0,
158         CTS_SOURCE_EXTERNAL
159 };
160 #define v_CTS_SOURCE(n)         (n << 7)
161 enum {
162         DOWNSAMPLE_DISABLE = 0,
163         DOWNSAMPLE_1_2,
164         DOWNSAMPLE_1_4
165 };
166 #define v_DOWN_SAMPLE(n)        (n << 5)
167 enum {
168         AUDIO_SOURCE_IIS = 0,
169         AUDIO_SOURCE_SPDIF
170 };
171 #define v_AUDIO_SOURCE(n)       (n << 3)
172 #define v_MCLK_ENABLE(n)        (n << 2)
173 enum {
174         MCLK_128FS = 0,
175         MCLK_256FS,
176         MCLK_384FS,
177         MCLK_512FS
178 };
179 #define v_MCLK_RATIO(n)         (n)
180
181 #define AUDIO_SAMPLE_RATE               0x37
182 enum {
183         AUDIO_32K = 0x3,
184         AUDIO_441K = 0x0,
185         AUDIO_48K = 0x2,
186         AUDIO_882K = 0x8,
187         AUDIO_96K = 0xa,
188         AUDIO_1764K = 0xc,
189         AUDIO_192K = 0xe,
190 };
191
192 #define AUDIO_I2S_MODE                  0x38
193 enum {
194         I2S_CHANNEL_1_2 = 1,
195         I2S_CHANNEL_3_4 = 3,
196         I2S_CHANNEL_5_6 = 7,
197         I2S_CHANNEL_7_8 = 0xf
198 };
199 #define v_I2S_CHANNEL(n)        ((n) << 2)
200 enum {
201         I2S_STANDARD = 0,
202         I2S_LEFT_JUSTIFIED,
203         I2S_RIGHT_JUSTIFIED
204 };
205 #define v_I2S_MODE(n)           (n)
206
207 #define AUDIO_I2S_MAP                   0x39
208 #define AUDIO_I2S_SWAPS_SPDIF           0x3a
209 #define v_SPIDF_FREQ(n)         (n)
210
211 #define N_32K           0x1000
212 #define N_441K          0x1880
213 #define N_882K          0x3100
214 #define N_1764K         0x6200
215 #define N_48K           0x1800
216 #define N_96K           0x3000
217 #define N_192K          0x6000
218
219 #define AUDIO_N_H                       0x3f
220 #define AUDIO_N_M                       0x40
221 #define AUDIO_N_L                       0x41
222
223 #define AUDIO_CTS_H                     0x45
224 #define AUDIO_CTS_M                     0x46
225 #define AUDIO_CTS_L                     0x47
226
227 #define DDC_CLK_L                       0x4b
228 #define DDC_CLK_H                       0x4c
229
230 #define EDID_SEGMENT_POINTER            0x4d
231 #define EDID_WORD_ADDR                  0x4e
232 #define EDID_FIFO_OFFSET                0x4f
233 #define EDID_FIFO_ADDR                  0x50
234
235
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
241 enum {
242         INFOFRAME_AVI = 0x06,
243         INFOFRAME_AAI = 0x08
244 };
245 #define CONTROL_PACKET_ADDR             0xa0
246
247 #define SIZE_AVI_INFOFRAME              0x11    /* 14 bytes */
248 #define SIZE_AUDIO_INFOFRAME            0x0F    /* 15 bytes */
249 enum {
250         AVI_COLOR_MODE_RGB = 0,
251         AVI_COLOR_MODE_YCBCR422,
252         AVI_COLOR_MODE_YCBCR444
253 };
254 enum {
255         AVI_COLORIMETRY_NO_DATA = 0,
256         AVI_COLORIMETRY_SMPTE_170M,
257         AVI_COLORIMETRY_ITU709,
258         AVI_COLORIMETRY_EXTENDED
259 };
260 enum {
261         AVI_CODED_FRAME_ASPECT_NO_DATA,
262         AVI_CODED_FRAME_ASPECT_4_3,
263         AVI_CODED_FRAME_ASPECT_16_9
264 };
265 enum {
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
270 };
271
272 #define HDCP_CTRL                       0x52
273 #define m_HDMI_DVI              (1 << 1)
274 #define v_HDMI_DVI(n)           (n << 1)
275
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)
280
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)
286
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)
291
292
293 #define HDMI_COLORBAR                   0xc9
294
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)
315
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)
319
320 #define PHY_DRIVER                      0xe2
321 #define v_CLK_MAIN_DRIVER(n)    (n << 4)
322 #define v_DATA_MAIN_DRIVER(n)   (n << 0)
323
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)
328
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)
333
334 #define PHY_PRE_DIV_RATIO               0xed
335 #define v_PRE_DIV_RATIO(n)      (n & 0x1f)
336
337
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)
345
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)
358
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)
363
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-------*/
370
371
372 static inline int hdmi_readl(struct rk_hdmi_device *hdmi_dev, u16 offset,
373                              u32 *val)
374 {
375         int ret = 0;
376
377         *val = readl_relaxed(hdmi_dev->regbase + (offset) * 0x04);
378         return ret;
379 }
380
381 static inline int hdmi_writel(struct rk_hdmi_device *hdmi_dev, u16 offset,
382                               u32 val)
383 {
384         int ret = 0;
385
386         writel_relaxed(val, hdmi_dev->regbase + (offset) * 0x04);
387         return ret;
388 }
389
390 static inline int hdmi_msk_reg(struct rk_hdmi_device *hdmi_dev, u16 offset,
391                                u32 msk, u32 val)
392 {
393         int ret = 0;
394         u32 temp;
395
396         temp = readl_relaxed(hdmi_dev->regbase + (offset) * 0x04) & (0xFF - (msk));
397         writel_relaxed(temp | ((val) & (msk)), hdmi_dev->regbase + (offset) * 0x04);
398         return ret;
399 }
400 static inline void rk3036_hdmi_reset_pclk(void)
401 {
402         writel_relaxed(0x00010001, RK_CRU_VIRT+ 0x128);
403         msleep(100);
404         writel_relaxed(0x00010000, RK_CRU_VIRT + 0x128);
405 }
406
407 extern int rk3036_hdmi_initial(struct hdmi *hdmi);
408 extern void rk3036_hdmi_irq(struct hdmi *hdmi);
409
410 #endif