rk30/rk2928 hdmi:
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / hdmi / rk_hdmi.h
1 #ifndef __RK_HDMI_H__
2 #define __RK_HDMI_H__
3
4 #include <linux/kernel.h>
5 #include <linux/fb.h>
6 #include <linux/spinlock.h>
7 #include <linux/mutex.h>
8 #include <linux/device.h>
9 #include <linux/workqueue.h>
10 #include <linux/display-sys.h>
11 #ifdef CONFIG_SWITCH
12 #include <linux/switch.h>
13 #endif
14 #ifdef CONFIG_HAS_EARLYSUSPEND
15 #include <linux/earlysuspend.h>
16 #endif
17 #include <asm/atomic.h>
18 #include<linux/rk_screen.h>
19 #include <linux/rk_fb.h>
20
21 /* default HDMI output video mode */
22 #define HDMI_VIDEO_DEFAULT_MODE                 HDMI_1280x720p_60Hz//HDMI_1920x1080p_60Hz
23
24 // HDMI video source
25 enum {
26         HDMI_SOURCE_LCDC0 = 0,
27         HDMI_SOURCE_LCDC1 = 1
28 };
29
30 /* If HDMI_ENABLE, system will auto configure output mode according to EDID 
31  * If HDMI_DISABLE, system will output mode according to macro HDMI_VIDEO_DEFAULT_MODE
32  */
33 #define HDMI_AUTO_CONFIGURE                     HDMI_ENABLE
34
35 /* default HDMI output audio mode */
36 #define HDMI_AUDIO_DEFAULT_CHANNEL              2
37 #define HDMI_AUDIO_DEFAULT_RATE                 HDMI_AUDIO_FS_44100
38 #define HDMI_AUDIO_DEFAULT_WORD_LENGTH  HDMI_AUDIO_WORD_LENGTH_16bit
39 enum {
40         VIDEO_INPUT_RGB_YCBCR_444 = 0,
41         VIDEO_INPUT_YCBCR422,
42         VIDEO_INPUT_YCBCR422_EMBEDDED_SYNC,
43         VIDEO_INPUT_2X_CLOCK,
44         VIDEO_INPUT_2X_CLOCK_EMBEDDED_SYNC,
45         VIDEO_INPUT_RGB444_DDR,
46         VIDEO_INPUT_YCBCR422_DDR
47 };
48 enum {
49         VIDEO_OUTPUT_RGB444 = 0,
50         VIDEO_OUTPUT_YCBCR444,
51         VIDEO_OUTPUT_YCBCR422
52 };
53 enum {
54         VIDEO_INPUT_COLOR_RGB = 0,
55         VIDEO_INPUT_COLOR_YCBCR
56 };
57 /********************************************************************
58 **                          ½á¹¹¶¨Òå                                *
59 ********************************************************************/
60 /* HDMI video mode code according CEA-861-E*/
61 enum hdmi_video_mode
62 {
63         HDMI_640x480p_60Hz = 1,
64         HDMI_720x480p_60Hz_4_3,
65         HDMI_720x480p_60Hz_16_9,
66         HDMI_1280x720p_60Hz,
67         HDMI_1920x1080i_60Hz,           //5
68         HDMI_720x480i_60Hz_4_3,
69         HDMI_720x480i_60Hz_16_9,
70         HDMI_720x240p_60Hz_4_3,
71         HDMI_720x240p_60Hz_16_9,
72         HDMI_2880x480i_60Hz_4_3,        //10
73         HDMI_2880x480i_60Hz_16_9,
74         HDMI_2880x240p_60Hz_4_3,
75         HDMI_2880x240p_60Hz_16_9,
76         HDMI_1440x480p_60Hz_4_3,
77         HDMI_1440x480p_60Hz_16_9,       //15
78         HDMI_1920x1080p_60Hz,
79         HDMI_720x576p_50Hz_4_3,
80         HDMI_720x576p_50Hz_16_9,
81         HDMI_1280x720p_50Hz,
82         HDMI_1920x1080i_50Hz,           //20
83         HDMI_720x576i_50Hz_4_3,
84         HDMI_720x576i_50Hz_16_9,
85         HDMI_720x288p_50Hz_4_3,
86         HDMI_720x288p_50Hz_16_9,
87         HDMI_2880x576i_50Hz_4_3,        //25
88         HDMI_2880x576i_50Hz_16_9,
89         HDMI_2880x288p_50Hz_4_3,
90         HDMI_2880x288p_50Hz_16_9,
91         HDMI_1440x576p_50Hz_4_3,
92         HDMI_1440x576p_50Hz_16_9,       //30
93         HDMI_1920x1080p_50Hz,
94         HDMI_1920x1080p_24Hz,
95         HDMI_1920x1080p_25Hz,
96         HDMI_1920x1080p_30Hz,
97         HDMI_2880x480p_60Hz_4_3,        //35
98         HDMI_2880x480p_60Hz_16_9,
99         HDMI_2880x576p_50Hz_4_3,
100         HDMI_2880x576p_50Hz_16_9,
101         HDMI_1920x1080i_50Hz_2,         // V Line 1250 total
102         HDMI_1920x1080i_100Hz,          //40
103         HDMI_1280x720p_100Hz,
104         HDMI_720x576p_100Hz_4_3,
105         HDMI_720x576p_100Hz_16_9,
106         HDMI_720x576i_100Hz_4_3,
107         HDMI_720x576i_100Hz_16_9,       //45
108         HDMI_1920x1080i_120Hz,
109         HDMI_1280x720p_120Hz,
110         HDMI_720x480p_120Hz_4_3,
111         HDMI_720x480p_120Hz_16_9,       
112         HDMI_720x480i_120Hz_4_3,        //50
113         HDMI_720x480i_120Hz_16_9,
114         HDMI_720x576p_200Hz_4_3,
115         HDMI_720x576p_200Hz_16_9,
116         HDMI_720x576i_200Hz_4_3,
117         HDMI_720x576i_200Hz_16_9,       //55
118         HDMI_720x480p_240Hz_4_3,
119         HDMI_720x480p_240Hz_16_9,       
120         HDMI_720x480i_240Hz_4_3,
121         HDMI_720x480i_240Hz_16_9,
122         HDMI_1280x720p_24Hz,            //60
123         HDMI_1280x720p_25Hz,
124         HDMI_1280x720p_30Hz,
125         HDMI_1920x1080p_120Hz,
126         HDMI_1920x1080p_100Hz,
127 };
128
129 /* HDMI Video Data Color Mode */
130 enum {
131         HDMI_COLOR_RGB = 0,
132         HDMI_COLOR_YCbCr422,
133         HDMI_COLOR_YCbCr444
134 };
135
136 /* HDMI Audio type */
137 enum hdmi_audio_type
138 {
139         HDMI_AUDIO_LPCM = 1,
140         HDMI_AUDIO_AC3,
141         HDMI_AUDIO_MPEG1,
142         HDMI_AUDIO_MP3,
143         HDMI_AUDIO_MPEG2,
144         HDMI_AUDIO_AAC_LC,              //AAC
145         HDMI_AUDIO_DTS,
146         HDMI_AUDIO_ATARC,
147         HDMI_AUDIO_DSD,                 //One bit Audio
148         HDMI_AUDIO_E_AC3,
149         HDMI_AUDIO_DTS_HD,
150         HDMI_AUDIO_MLP,
151         HDMI_AUDIO_DST,
152         HDMI_AUDIO_WMA_PRO
153 };
154
155 /* I2S Fs */
156 enum hdmi_audio_fs {
157         HDMI_AUDIO_FS_32000  = 0x1,
158         HDMI_AUDIO_FS_44100  = 0x2,
159         HDMI_AUDIO_FS_48000  = 0x4,
160         HDMI_AUDIO_FS_88200  = 0x8,
161         HDMI_AUDIO_FS_96000  = 0x10,
162         HDMI_AUDIO_FS_176400 = 0x20,
163         HDMI_AUDIO_FS_192000 = 0x40
164 };
165
166 /* Audio Word Length */
167 enum hdmi_audio_word_length {
168         HDMI_AUDIO_WORD_LENGTH_16bit = 0x1,
169         HDMI_AUDIO_WORD_LENGTH_20bit = 0x2,
170         HDMI_AUDIO_WORD_LENGTH_24bit = 0x4
171 };
172
173 /* EDID block size */
174 #define HDMI_EDID_BLOCK_SIZE    128
175
176 // HDMI state machine
177 enum hdmi_state{
178         HDMI_SLEEP = 0,
179         HDMI_INITIAL,
180         WAIT_HOTPLUG,
181         READ_PARSE_EDID,
182         WAIT_HDMI_ENABLE,
183         SYSTEM_CONFIG,
184         CONFIG_VIDEO,
185         CONFIG_AUDIO,
186         PLAY_BACK,
187 };
188
189 // HDMI configuration command
190 enum hdmi_change {
191         HDMI_CONFIG_NONE = 0,
192         HDMI_CONFIG_VIDEO,
193         HDMI_CONFIG_AUDIO,
194         HDMI_CONFIG_COLOR,
195         HDMI_CONFIG_HDCP,
196         HDMI_CONFIG_ENABLE,
197         HDMI_CONFIG_DISABLE,
198         HDMI_CONFIG_DISPLAY
199 };
200
201 // HDMI Hotplug status
202 enum {
203         HDMI_HPD_REMOVED = 0,
204         HDMI_HPD_INSERT,
205         HDMI_HPD_ACTIVED
206 };
207
208 /* HDMI STATUS */
209 #define HDMI_DISABLE    0
210 #define HDMI_ENABLE             1
211 #define HDMI_UNKOWN             0xFF
212
213 /* HDMI Error Code */
214 enum hdmi_errorcode
215 {
216         HDMI_ERROR_SUCESS = 0,
217         HDMI_ERROR_FALSE,
218         HDMI_ERROR_I2C,
219         HDMI_ERROR_EDID,
220 };
221
222 /* HDMI audio parameters */
223 struct hdmi_audio {
224         u32 type;                                                       //Audio type
225         u32     channel;                                                //Audio channel number
226         u32     rate;                                                   //Audio sampling rate
227         u32     word_length;                                    //Audio data word length
228 };
229
230 struct hdmi_edid {
231         unsigned char sink_hdmi;                        //HDMI display device flag
232         unsigned char ycbcr444;                         //Display device support YCbCr444
233         unsigned char ycbcr422;                         //Display device support YCbCr422
234         unsigned char deepcolor;                        //bit3:DC_48bit; bit2:DC_36bit; bit1:DC_30bit; bit0:DC_Y444;
235         struct fb_monspecs      *specs;                 //Device spec
236         struct list_head modelist;                      //Device supported display mode list
237         struct hdmi_audio *audio;                       //Device supported audio info
238         int     audio_num;                                              //Device supported audio type number
239 };
240
241 /* RK HDMI Video Configure Parameters */
242 struct hdmi_video_para {
243         int vic;
244         int input_mode;         //input video data interface
245         int input_color;        //input video color mode
246         int output_mode;        //output hdmi or dvi
247         int output_color;       //output video color mode
248 };
249
250 struct hdmi {
251         struct device   *dev;
252         struct clk              *hclk;                          //HDMI AHP clk
253         int             id;
254         int                     regbase;
255         int                             irq;
256         int                             regbase_phy;
257         int                             regsize_phy;
258         struct rk_lcdc_device_driver *lcdc;
259         
260         #ifdef CONFIG_SWITCH
261         struct switch_dev       switch_hdmi;
262         #endif
263         
264         struct workqueue_struct *workqueue;
265         struct delayed_work delay_work;
266         
267         spinlock_t      irq_lock;
268         struct mutex enable_mutex;
269         
270         int wait;
271         struct completion       complete;
272         
273         int suspend;
274 #ifdef CONFIG_HAS_EARLYSUSPEND
275         struct early_suspend    early_suspend;
276 #endif
277         
278         struct hdmi_edid edid;
279         int enable;                                     // Enable HDMI output or not
280         int vic;                                        // HDMI output video mode code
281         struct hdmi_audio audio;        // HDMI output audio type.
282         
283         int pwr_mode;                           // power mode
284         int hotplug;                            // hot plug status
285         int state;                                      // hdmi state machine status
286         int autoconfig;                         // if true, auto config hdmi output mode according to EDID.
287         int command;                            // HDMI configuration command
288         int display;                            // HDMI display status
289         int xscale;                                     // x direction scale value
290         int yscale;                                     // y directoon scale value
291         int tmdsclk;                            // TDMS Clock frequency
292         
293         int (*insert)(void);
294         int (*remove)(void);
295         void (*control_output)(int enable);
296         int (*config_video)(struct hdmi_video_para *vpara);
297         int (*config_audio)(struct hdmi_audio *audio);
298         int (*detect_hotplug)(void);
299         // call back for edid
300         int (*read_edid)(int block, unsigned char *buff);
301
302         // call back for hdcp operatoion
303         void (*hdcp_cb)(void);
304         void (*hdcp_irq_cb)(int);
305         int (*hdcp_power_on_cb)(void);
306         void (*hdcp_power_off_cb)(void);
307 };
308
309 #define hdmi_err(dev, format, arg...)           \
310         dev_printk(KERN_ERR , dev , format , ## arg)
311
312 #ifdef HDMI_DEBUG
313 #define hdmi_dbg(dev, format, arg...)           \
314         dev_printk(KERN_INFO , dev , format , ## arg)
315 #else
316 #define hdmi_dbg(dev, format, arg...)   
317 #endif
318
319 extern struct hdmi *hdmi;
320 extern int hdmi_get_hotplug(void);
321 extern int hdmi_set_info(struct rk29fb_screen *screen, unsigned int vic);
322 extern void hdmi_init_lcdc(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info);
323 extern int hdmi_sys_init(void);
324 extern int hdmi_sys_parse_edid(struct hdmi* hdmi);
325 extern const char *hdmi_get_video_mode_name(unsigned char vic);
326 extern int hdmi_videomode_to_vic(struct fb_videomode *vmode);
327 extern const struct fb_videomode* hdmi_vic_to_videomode(int vic);
328 extern int hdmi_add_videomode(const struct fb_videomode *mode, struct list_head *head);
329 extern struct hdmi_video_timing * hdmi_find_mode(int vic);
330 extern int hdmi_find_best_mode(struct hdmi* hdmi, int vic);
331 extern int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok);
332 extern int hdmi_switch_fb(struct hdmi *hdmi, int vic);
333 extern void hdmi_work(struct work_struct *work);
334 #endif