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_ENABLE
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
40 VIDEO_INPUT_RGB_YCBCR_444 = 0,
42 VIDEO_INPUT_YCBCR422_EMBEDDED_SYNC,
44 VIDEO_INPUT_2X_CLOCK_EMBEDDED_SYNC,
45 VIDEO_INPUT_RGB444_DDR,
46 VIDEO_INPUT_YCBCR422_DDR
49 VIDEO_OUTPUT_RGB444 = 0,
50 VIDEO_OUTPUT_YCBCR444,
54 VIDEO_INPUT_COLOR_RGB = 0,
55 VIDEO_INPUT_COLOR_YCBCR
57 /********************************************************************
59 ********************************************************************/
60 /* HDMI video mode code according CEA-861-E*/
63 HDMI_640x480p_60Hz = 1,
64 HDMI_720x480p_60Hz_4_3,
65 HDMI_720x480p_60Hz_16_9,
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
79 HDMI_720x576p_50Hz_4_3,
80 HDMI_720x576p_50Hz_16_9,
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
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
125 HDMI_1920x1080p_120Hz,
126 HDMI_1920x1080p_100Hz,
129 /* HDMI Video Data Color Mode */
136 /* HDMI Audio type */
144 HDMI_AUDIO_AAC_LC, //AAC
147 HDMI_AUDIO_DSD, //One bit Audio
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
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
173 /* EDID block size */
174 #define HDMI_EDID_BLOCK_SIZE 128
176 // HDMI state machine
189 // HDMI configuration command
191 HDMI_CONFIG_NONE = 0,
201 // HDMI Hotplug status
203 HDMI_HPD_REMOVED = 0,
209 #define HDMI_DISABLE 0
210 #define HDMI_ENABLE 1
211 #define HDMI_UNKOWN 0xFF
213 /* HDMI Error Code */
216 HDMI_ERROR_SUCESS = 0,
222 /* HDMI audio parameters */
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
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
241 /* RK HDMI Video Configure Parameters */
242 struct hdmi_video_para {
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
252 struct clk *hclk; //HDMI AHP clk
258 struct rk_lcdc_device_driver *lcdc;
261 struct switch_dev switch_hdmi;
264 struct workqueue_struct *workqueue;
265 struct delayed_work delay_work;
268 struct mutex enable_mutex;
271 struct completion complete;
274 #ifdef CONFIG_HAS_EARLYSUSPEND
275 struct early_suspend early_suspend;
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.
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
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);
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);
309 #define hdmi_err(dev, format, arg...) \
310 dev_printk(KERN_ERR , dev , format , ## arg)
313 #define hdmi_dbg(dev, format, arg...) \
314 dev_printk(KERN_INFO , dev , format , ## arg)
316 #define hdmi_dbg(dev, format, arg...)
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);