4 #include <linux/kernel.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>
12 #include <linux/switch.h>
14 #ifdef CONFIG_HAS_EARLYSUSPEND
15 #include <linux/earlysuspend.h>
17 #include <asm/atomic.h>
18 #include<linux/rk_screen.h>
19 #include <linux/rk_fb.h>
21 /* default HDMI output video mode */
22 #define HDMI_VIDEO_DEFAULT_MODE HDMI_1280x720p_60Hz//HDMI_1920x1080p_60Hz
26 HDMI_SOURCE_LCDC0 = 0,
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
33 #define HDMI_AUTO_CONFIGURE HDMI_DISABLE
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
41 VIDEO_INPUT_RGB_YCBCR_444 = 0,
43 VIDEO_INPUT_YCBCR422_EMBEDDED_SYNC,
45 VIDEO_INPUT_2X_CLOCK_EMBEDDED_SYNC,
46 VIDEO_INPUT_RGB444_DDR,
47 VIDEO_INPUT_YCBCR422_DDR
51 VIDEO_OUTPUT_RGB444 = 0,
52 VIDEO_OUTPUT_YCBCR444,
53 VIDEO_OUTPUT_YCBCR422,
58 VIDEO_INPUT_COLOR_RGB = 0,
59 VIDEO_INPUT_COLOR_YCBCR444,
60 VIDEO_INPUT_COLOR_YCBCR422,
61 VIDEO_INPUT_COLOR_YCBCR420
63 /********************************************************************
65 ********************************************************************/
66 /* HDMI video mode code according CEA-861-E*/
69 HDMI_640x480p_60Hz = 1,
70 HDMI_720x480p_60Hz_4_3,
71 HDMI_720x480p_60Hz_16_9,
73 HDMI_1920x1080i_60Hz, //5
74 HDMI_720x480i_60Hz_4_3,
75 HDMI_720x480i_60Hz_16_9,
76 HDMI_720x240p_60Hz_4_3,
77 HDMI_720x240p_60Hz_16_9,
78 HDMI_2880x480i_60Hz_4_3, //10
79 HDMI_2880x480i_60Hz_16_9,
80 HDMI_2880x240p_60Hz_4_3,
81 HDMI_2880x240p_60Hz_16_9,
82 HDMI_1440x480p_60Hz_4_3,
83 HDMI_1440x480p_60Hz_16_9, //15
85 HDMI_720x576p_50Hz_4_3,
86 HDMI_720x576p_50Hz_16_9,
88 HDMI_1920x1080i_50Hz, //20
89 HDMI_720x576i_50Hz_4_3,
90 HDMI_720x576i_50Hz_16_9,
91 HDMI_720x288p_50Hz_4_3,
92 HDMI_720x288p_50Hz_16_9,
93 HDMI_2880x576i_50Hz_4_3, //25
94 HDMI_2880x576i_50Hz_16_9,
95 HDMI_2880x288p_50Hz_4_3,
96 HDMI_2880x288p_50Hz_16_9,
97 HDMI_1440x576p_50Hz_4_3,
98 HDMI_1440x576p_50Hz_16_9, //30
100 HDMI_1920x1080p_24Hz,
101 HDMI_1920x1080p_25Hz,
102 HDMI_1920x1080p_30Hz,
103 HDMI_2880x480p_60Hz_4_3, //35
104 HDMI_2880x480p_60Hz_16_9,
105 HDMI_2880x576p_50Hz_4_3,
106 HDMI_2880x576p_50Hz_16_9,
107 HDMI_1920x1080i_50Hz_2, // V Line 1250 total
108 HDMI_1920x1080i_100Hz, //40
109 HDMI_1280x720p_100Hz,
110 HDMI_720x576p_100Hz_4_3,
111 HDMI_720x576p_100Hz_16_9,
112 HDMI_720x576i_100Hz_4_3,
113 HDMI_720x576i_100Hz_16_9, //45
114 HDMI_1920x1080i_120Hz,
115 HDMI_1280x720p_120Hz,
116 HDMI_720x480p_120Hz_4_3,
117 HDMI_720x480p_120Hz_16_9,
118 HDMI_720x480i_120Hz_4_3, //50
119 HDMI_720x480i_120Hz_16_9,
120 HDMI_720x576p_200Hz_4_3,
121 HDMI_720x576p_200Hz_16_9,
122 HDMI_720x576i_200Hz_4_3,
123 HDMI_720x576i_200Hz_16_9, //55
124 HDMI_720x480p_240Hz_4_3,
125 HDMI_720x480p_240Hz_16_9,
126 HDMI_720x480i_240Hz_4_3,
127 HDMI_720x480i_240Hz_16_9,
128 HDMI_1280x720p_24Hz, //60
131 HDMI_1920x1080p_120Hz,
132 HDMI_1920x1080p_100Hz,
135 /* HDMI Video Data Color Mode */
142 /*HDMI Video Color Depth*/
144 HDMI_COLOR_DEPTH_8BIT = 0x1,
145 HDMI_COLOR_DEPTH_10BIT = 0x2,
146 HDMI_COLOR_DEPTH_12BIT = 0x4,
147 HDMI_COLOR_DEPTH_16BIT = 0x8
150 /* HDMI Audio type */
158 HDMI_AUDIO_AAC_LC, //AAC
161 HDMI_AUDIO_DSD, //One bit Audio
171 HDMI_AUDIO_FS_32000 = 0x1,
172 HDMI_AUDIO_FS_44100 = 0x2,
173 HDMI_AUDIO_FS_48000 = 0x4,
174 HDMI_AUDIO_FS_88200 = 0x8,
175 HDMI_AUDIO_FS_96000 = 0x10,
176 HDMI_AUDIO_FS_176400 = 0x20,
177 HDMI_AUDIO_FS_192000 = 0x40
180 /* Audio Word Length */
181 enum hdmi_audio_word_length {
182 HDMI_AUDIO_WORD_LENGTH_16bit = 0x1,
183 HDMI_AUDIO_WORD_LENGTH_20bit = 0x2,
184 HDMI_AUDIO_WORD_LENGTH_24bit = 0x4
187 /* EDID block size */
188 #define HDMI_EDID_BLOCK_SIZE 128
190 // HDMI state machine
203 // HDMI configuration command
205 HDMI_CONFIG_NONE = 0,
215 // HDMI Hotplug status
217 HDMI_HPD_REMOVED = 0,
223 #define HDMI_DISABLE 0
224 #define HDMI_ENABLE 1
225 #define HDMI_UNKOWN 0xFF
227 /* HDMI Error Code */
230 HDMI_ERROR_SUCESS = 0,
236 /* HDMI audio parameters */
238 u32 type; //Audio type
239 u32 channel; //Audio channel number
240 u32 rate; //Audio sampling rate
241 u32 word_length; //Audio data word length
245 unsigned char sink_hdmi; //HDMI display device flag
246 unsigned char ycbcr444; //Display device support YCbCr444
247 unsigned char ycbcr422; //Display device support YCbCr422
248 unsigned char deepcolor; //bit3:DC_48bit; bit2:DC_36bit; bit1:DC_30bit; bit0:DC_Y444;
249 unsigned char latency_fields_present;
250 unsigned char i_latency_fields_present;
251 unsigned char video_latency;
252 unsigned char audio_latency;
253 unsigned char interlaced_video_latency;
254 unsigned char interlaced_audio_latency;
255 unsigned char video_present; //have additional video format abount 4k and/or 3d
256 unsigned char support_3d; //3D format support
257 unsigned int maxtmdsclock; //max tmds clock freq support
258 struct fb_monspecs *specs; //Device spec
259 struct list_head modelist; //Device supported display mode list
260 struct hdmi_audio *audio; //Device supported audio info
261 int audio_num; //Device supported audio type number
262 int base_audio_support; //Device supported base audio
265 /* RK HDMI Video Configure Parameters */
266 struct hdmi_video_para {
268 int input_mode; //input video data interface
269 int input_color; //input video color mode
270 int output_mode; //output hdmi or dvi
271 int output_color; //output video color mode
272 unsigned char format_3d; //output 3d format
273 unsigned char color_depth; //color depth: 8bit; 10bit; 12bit; 16bit;
274 unsigned char pixel_repet; //pixel repettion
275 unsigned char pixel_pack_phase; //pixel packing default phase
276 unsigned char color_limit_range;//quantization range 0: full range(0~255) 1:limit range(16~235)
283 struct rk_lcdc_driver *lcdc;
286 struct switch_dev switch_hdmi;
289 struct workqueue_struct *workqueue;
290 struct delayed_work delay_work;
293 struct mutex enable_mutex;
296 struct completion complete;
299 #ifdef CONFIG_HAS_EARLYSUSPEND
300 struct early_suspend early_suspend;
303 struct hdmi_edid edid;
304 int enable; // Enable HDMI output or not
305 int vic; // HDMI output video mode code
306 struct hdmi_audio audio; // HDMI output audio type.
308 int pwr_mode; // power mode
309 int hotplug; // hot plug status
310 int state; // hdmi state machine status
311 int autoconfig; // if true, auto config hdmi output mode according to EDID.
312 int command; // HDMI configuration command
313 int display; // HDMI display status
314 int xscale; // x direction scale value
315 int yscale; // y directoon scale value
316 int tmdsclk; // TDMS Clock frequency
317 int pixclock; //Pixel Clcok frequency
319 struct list_head pwrlist_head;
321 int (*insert)(struct hdmi *hdmi);
322 int (*remove)(struct hdmi *hdmi);
323 void (*control_output)(struct hdmi *hdmi, int enable);
324 int (*config_video)(struct hdmi *hdmi, struct hdmi_video_para *vpara);
325 int (*config_audio)(struct hdmi *hdmi, struct hdmi_audio *audio);
326 int (*detect_hotplug)(struct hdmi *hdmi);
327 // call back for edid
328 int (*read_edid)(struct hdmi *hdmi, int block, unsigned char *buff);
329 int (*set_vif)(struct hdmi *hdmi, struct rk_screen *screen, bool connect);
331 // call back for hdcp operatoion
332 void (*hdcp_cb)(void);
333 void (*hdcp_irq_cb)(int);
334 int (*hdcp_power_on_cb)(void);
335 void (*hdcp_power_off_cb)(void);
338 #define hdmi_err(dev, format, arg...) \
339 dev_printk(KERN_ERR , dev , format , ## arg)
342 #define hdmi_dbg(dev, format, arg...) \
343 dev_printk(KERN_INFO , dev , format , ## arg)
345 #define hdmi_dbg(dev, format, arg...)
348 extern int hdmi_drv_register(struct hdmi *hdmi_drv);
349 extern int hdmi_get_hotplug(void);
350 extern int hdmi_set_info(struct rk_screen *screen, unsigned int vic);
351 extern void hdmi_init_lcdc(struct rk_screen *screen, struct rk29lcd_info *lcd_info);
352 extern int hdmi_sys_init(struct hdmi *hdmi_drv);
353 extern int hdmi_sys_parse_edid(struct hdmi* hdmi_drv);
354 extern const char *hdmi_get_video_mode_name(unsigned char vic);
355 extern int hdmi_videomode_to_vic(struct fb_videomode *vmode);
356 extern const struct fb_videomode* hdmi_vic_to_videomode(int vic);
357 extern int hdmi_add_videomode(const struct fb_videomode *mode, struct list_head *head);
358 extern struct hdmi_video_timing * hdmi_find_mode(int vic);
359 extern int hdmi_find_best_mode(struct hdmi* hdmi_drv, int vic);
360 extern int hdmi_ouputmode_select(struct hdmi *hdmi_drv, int edid_ok);
361 extern int hdmi_switch_fb(struct hdmi *hdmi_drv, int vic);
362 extern int hdmi_init_video_para(struct hdmi *hdmi_drv, struct hdmi_video_para *video);
363 extern void hdmi_work(struct work_struct *work);
364 extern void hdmi_register_display_sysfs(struct hdmi *hdmi_drv, struct device *parent);
365 extern void hdmi_unregister_display_sysfs(struct hdmi *hdmi_drv);
367 int rk_hdmi_parse_dt(struct hdmi *hdmi_drv);
368 int rk_hdmi_pwr_enable(struct hdmi *dev_drv);
369 int rk_hdmi_pwr_disable(struct hdmi *dev_drv);