• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Allwinner SoCs display driver.
3  *
4  * Copyright (C) 2016 Allwinner.
5  *
6  * This file is licensed under the terms of the GNU General Public
7  * License version 2.  This program is licensed "as is" without any
8  * warranty of any kind, whether express or implied.
9  */
10 
11 #ifndef _DISP_AL_H_
12 #define _DISP_AL_H_
13 
14 #include "../include.h"
15 #include "de_feat.h"
16 #include "de_hal.h"
17 #include "de_enhance.h"
18 #include "de_wb.h"
19 #include "de_smbl.h"
20 #include "de_csc.h"
21 #include "de_lcd.h"
22 #if defined(SUPPORT_DSI)
23 #include "de_dsi.h"
24 #endif
25 #include "de_clock.h"
26 
27 #if defined(CONFIG_EINK_PANEL_USED)
28 #include "de_rtmx.h"
29 #include "rtmx_eink.h"
30 #include "disp_waveform.h"
31 #include "disp_eink_data.h"
32 #endif
33 
34 enum {
35 	DISP_AL_IRQ_FLAG_FRAME_END  = DE_IRQ_FLAG_FRAME_END,
36 	DISP_AL_IRQ_FLAG_RCQ_FINISH = DE_IRQ_FLAG_RCQ_FINISH,
37 	DISP_AL_IRQ_FLAG_RCQ_ACCEPT = DE_IRQ_FLAG_RCQ_ACCEPT,
38 	DISP_AL_IRQ_FLAG_MASK       = DE_IRQ_FLAG_MASK,
39 };
40 
41 enum  {
42 	DISP_AL_IRQ_STATE_FRAME_END  = DE_IRQ_STATE_FRAME_END,
43 	DISP_AL_IRQ_STATE_RCQ_FINISH = DE_IRQ_STATE_RCQ_FINISH,
44 	DISP_AL_IRQ_STATE_RCQ_ACCEPT = DE_IRQ_STATE_RCQ_ACCEPT,
45 	DISP_AL_IRQ_STATE_MASK = DE_IRQ_STATE_MASK,
46 };
47 
48 enum {
49 	DISP_AL_CAPTURE_IRQ_FLAG_FRAME_END = WB_IRQ_FLAG_INTR,
50 	DISP_AL_CAPTURE_IRQ_FLAG_RCQ_ACCEPT = DE_WB_IRQ_FLAG_RCQ_ACCEPT,
51 	DISP_AL_CAPTURE_IRQ_FLAG_RCQ_FINISH = DE_WB_IRQ_FLAG_RCQ_FINISH,
52 	DISP_AL_CAPTURE_IRQ_FLAG_MASK =
53 		DISP_AL_CAPTURE_IRQ_FLAG_FRAME_END
54 		| DISP_AL_CAPTURE_IRQ_FLAG_RCQ_ACCEPT
55 		| DISP_AL_CAPTURE_IRQ_FLAG_RCQ_FINISH,
56 };
57 
58 enum {
59 	DISP_AL_CAPTURE_IRQ_STATE_FRAME_END = WB_IRQ_STATE_PROC_END,
60 	DISP_AL_CAPTURE_IRQ_STATE_RCQ_ACCEPT = DE_WB_IRQ_STATE_RCQ_ACCEPT,
61 	DISP_AL_CAPTURE_IRQ_STATE_RCQ_FINISH = DE_WB_IRQ_STATE_RCQ_FINISH,
62 	DISP_AL_CAPTURE_IRQ_STATE_MASK =
63 		DISP_AL_CAPTURE_IRQ_STATE_FRAME_END
64 		| DISP_AL_CAPTURE_IRQ_STATE_RCQ_ACCEPT
65 		| DISP_AL_CAPTURE_IRQ_STATE_RCQ_FINISH,
66 };
67 
68 struct lcd_clk_info {
69 	enum disp_lcd_if lcd_if;
70 	int tcon_div;
71 	int lcd_div;
72 	int dsi_div;
73 	int dsi_rate;
74 };
75 
76 int disp_al_de_clk_enable(unsigned int disp);
77 int disp_al_de_clk_disable(unsigned int disp);
78 int disp_al_manager_init(unsigned int disp);
79 int disp_al_manager_exit(unsigned int disp);
80 int disp_al_manager_apply(unsigned int disp,
81 				 struct disp_manager_data *data);
82 int disp_al_layer_apply(unsigned int disp,
83 			       struct disp_layer_config_data *data,
84 			       unsigned int layer_num);
85 int disp_init_al(struct disp_bsp_init_para *para);
86 int disp_exit_al(void);
87 int disp_al_manager_sync(unsigned int disp);
88 int disp_al_manager_update_regs(unsigned int disp);
89 int disp_al_manager_query_irq(unsigned int disp);
90 int disp_al_manager_enable_irq(unsigned int disp);
91 int disp_al_manager_disable_irq(unsigned int disp);
92 
93 int disp_al_enhance_apply(unsigned int disp,
94 			  struct disp_enhance_config *config);
95 int disp_al_enhance_update_regs(unsigned int disp);
96 int disp_al_enhance_sync(unsigned int disp);
97 int disp_al_enhance_tasklet(unsigned int disp);
98 
99 int disp_al_smbl_apply(unsigned int disp, struct disp_smbl_info *info);
100 int disp_al_smbl_update_regs(unsigned int disp);
101 int disp_al_smbl_sync(unsigned int disp);
102 int disp_al_smbl_get_status(unsigned int disp);
103 int disp_al_smbl_tasklet(unsigned int disp);
104 
105 int disp_al_write_back_clk_init(unsigned int disp);
106 int disp_al_write_back_clk_exit(unsigned int disp);
107 int disp_al_capture_init(unsigned int disp);
108 int disp_al_capture_exit(unsigned int disp);
109 int disp_al_capture_sync(u32 disp);
110 int disp_al_capture_apply(unsigned int disp, struct disp_capture_config *cfg);
111 int disp_al_capture_get_status(unsigned int disp);
112 
113 int disp_al_lcd_cfg(u32 screen_id, struct disp_panel_para *panel,
114 		    struct panel_extend_para *extend_panel);
115 int disp_al_lcd_cfg_ext(u32 screen_id, struct panel_extend_para *extend_panel);
116 int disp_al_lcd_enable(u32 screen_id, struct disp_panel_para *panel);
117 int disp_al_lcd_disable(u32 screen_id, struct disp_panel_para *panel);
118 int disp_al_lcd_query_irq(u32 screen_id, enum __lcd_irq_id_t irq_id,
119 			  struct disp_panel_para *panel);
120 int disp_al_lcd_tri_busy(u32 screen_id, struct disp_panel_para *panel);
121 int disp_al_lcd_tri_start(u32 screen_id, struct disp_panel_para *panel);
122 int disp_al_lcd_io_cfg(u32 screen_id,
123 		       u32 enable,
124 		       struct disp_panel_para *panel);
125 int disp_al_lcd_get_cur_line(u32 screen_id, struct disp_panel_para *panel);
126 int disp_al_lcd_get_start_delay(u32 screen_id, struct disp_panel_para *panel);
127 int disp_al_lcd_get_clk_info(u32 screen_id, struct lcd_clk_info *info,
128 			     struct disp_panel_para *panel);
129 int disp_al_lcd_enable_irq(u32 screen_id, enum __lcd_irq_id_t irq_id,
130 			   struct disp_panel_para *panel);
131 int disp_al_lcd_disable_irq(u32 screen_id, enum __lcd_irq_id_t irq_id,
132 			    struct disp_panel_para *panel);
133 
134 int disp_al_hdmi_enable(u32 screen_id);
135 int disp_al_hdmi_disable(u32 screen_id);
136 int disp_al_hdmi_cfg(u32 screen_id, struct disp_video_timings *video_info);
137 int disp_al_hdmi_irq_enable(u32 screen_id);
138 int disp_al_hdmi_irq_disable(u32 screen_id);
139 int disp_al_hdmi_pad_sel(u32 screen_id, u32 pad);
140 
141 int disp_al_tv_enable(u32 screen_id);
142 int disp_al_tv_disable(u32 screen_id);
143 int disp_al_tv_cfg(u32 screen_id, struct disp_video_timings *video_info);
144 int disp_al_tv_irq_enable(u32 screen_id);
145 int disp_al_tv_irq_disable(u32 screen_id);
146 #if defined(SUPPORT_VGA)
147 int disp_al_vga_enable(u32 screen_id);
148 int disp_al_vga_disable(u32 screen_id);
149 int disp_al_vga_cfg(u32 screen_id, struct disp_video_timings *video_info);
150 int disp_al_vga_irq_enable(u32 screen_id);
151 int disp_al_vga_irq_disable(u32 screen_id);
152 #endif
153 int disp_al_vdevice_cfg(u32 screen_id, struct disp_video_timings *video_info,
154 			struct disp_vdevice_interface_para *para,
155 			u8 config_tcon_only);
156 int disp_al_vdevice_enable(u32 screen_id);
157 int disp_al_vdevice_disable(u32 screen_id);
158 
159 int disp_al_device_get_cur_line(u32 screen_id);
160 int disp_al_device_get_start_delay(u32 screen_id);
161 int disp_al_device_query_irq(u32 screen_id);
162 int disp_al_device_enable_irq(u32 screen_id);
163 int disp_al_device_disable_irq(u32 screen_id);
164 int disp_al_device_get_status(u32 screen_id);
165 int disp_al_device_src_select(u32 screen_id, u32 src);
166 bool disp_al_get_direct_show_state(unsigned int disp);
167 int disp_al_vdpo_disable(u32 screen_id);
168 int disp_al_vdpo_enable(u32 screen_id, u32 vdpo_index);
169 int disp_al_vdpo_cfg(u32 screen_id, u32 vdpo_index,
170 		     struct disp_video_timings *video_info);
171 
172 int disp_al_get_fb_info(unsigned int sel, struct disp_layer_info *info);
173 int disp_al_get_display_size(unsigned int sel, unsigned int *width,
174 			     unsigned int *height);
175 
176 #ifdef SUPPORT_WB
177 int disp_al_set_rtmx_base(u32 disp, unsigned int base);
178 int disp_al_rtmx_init(u32 disp, unsigned int addr0, unsigned int addr1,
179 			unsigned int addr2, unsigned int w, unsigned int h,
180 			unsigned int outw, unsigned int outh, unsigned int fmt);
181 int disp_al_rtmx_set_addr(u32 disp, unsigned int addr0);
182 int disp_al_set_eink_wb_base(u32 disp, unsigned int base);
183 int disp_al_set_eink_wb_param(u32 disp, unsigned int w, unsigned int h,
184 							unsigned int addr);
185 int disp_al_enable_eink_wb_interrupt(u32 disp);
186 int disp_al_disable_eink_wb_interrupt(u32 disp);
187 int disp_al_clear_eink_wb_interrupt(u32 disp);
188 int disp_al_enable_eink_wb(u32 disp);
189 int disp_al_disable_eink_wb(u32 disp);
190 int disp_al_get_eink_wb_status(u32 disp);
191 int disp_al_eink_wb_reset(u32 disp);
192 int disp_al_eink_wb_dereset(u32 disp);
193 
194 #endif
195 #if defined(CONFIG_EINK_PANEL_USED)
196 int disp_al_set_eink_base(u32 disp, unsigned long base);
197 int disp_al_eink_irq_enable(u32 disp);
198 int disp_al_eink_irq_disable(u32 disp);
199 int disp_al_eink_irq_query(u32 disp);
200 int disp_al_eink_config(u32 disp, struct eink_init_param *param);
201 int disp_al_eink_disable(u32 disp);
202 int disp_al_eink_start_calculate_index(u32 disp,
203 				unsigned long old_index_data_paddr,
204 				unsigned long new_index_data_paddr,
205 				struct eink_8bpp_image *last_image,
206 				struct eink_8bpp_image *current_image);
207 int disp_al_is_calculate_index_finish(unsigned int disp);
208 int disp_al_get_update_area(unsigned int disp, struct area_info *area);
209 int disp_al_eink_pipe_enable(u32 disp, unsigned int pipe_no);
210 int disp_al_eink_pipe_disable(u32 disp, unsigned int pipe_no);
211 int disp_al_eink_pipe_config(u32 disp,  unsigned int pipe_no, struct area_info area);
212 int disp_al_eink_pipe_config_wavefile(u32 disp, unsigned int wav_file_addr,
213 							unsigned int pipe_no);
214 int disp_al_eink_start_decode(unsigned int disp, unsigned long new_idx_addr,
215 						unsigned long wav_data_addr,
216 						struct eink_init_param *param);
217 int disp_al_init_waveform(const char *path);
218 int disp_al_edma_init(unsigned int disp, struct eink_init_param *param);
219 int disp_al_edma_config(unsigned int disp, unsigned long wave_data_addr,
220 					struct eink_init_param *param);
221 int disp_al_eink_edma_cfg_addr(unsigned int disp, unsigned long wav_addr);
222 int disp_al_dbuf_rdy(void);
223 int disp_al_edma_write(unsigned int disp, unsigned char en);
224 int disp_al_get_waveform_data(unsigned int disp, enum eink_update_mode mode,
225 				unsigned int temp, unsigned int *total_frames,
226 							unsigned int *wf_buf);
227 int disp_al_get_eink_panel_bit_num(unsigned int disp,
228 						enum  eink_bit_num *bit_num);
229 void disp_al_free_waveform(void);
230 int disp_al_init_eink_ctrl_data_8(unsigned int disp, unsigned long wavedata_buf,
231 		struct eink_timing_param *eink_timing_info, unsigned int i);
232 int disp_al_init_eink_ctrl_data_16(unsigned int disp, unsigned int wavedata_buf,
233 		struct eink_timing_param *eink_timing_info);
234 #endif
235 void disp_al_show_builtin_patten(u32 hwdev_index, u32 patten);
236 void disp_al_update_de_clk_rate(u32 rate);
237 
238 int disp_al_lcd_get_status(u32 screen_id, struct disp_panel_para *panel);
239 
disp_al_capture_set_rcq_update(u32 disp,u32 en)240 static inline s32 disp_al_capture_set_rcq_update(u32 disp, u32 en) { return 0; }
241 
disp_al_capture_query_irq_state(u32 disp,u32 irq_state)242 static inline u32 disp_al_capture_query_irq_state(u32 disp, u32 irq_state) { return 0; }
243 
disp_al_capture_set_all_rcq_head_dirty(u32 disp,u32 dirty)244 static inline s32 disp_al_capture_set_all_rcq_head_dirty(u32 disp, u32 dirty) { return 0; }
245 
disp_al_capture_set_irq_enable(u32 disp,u32 irq_flag,u32 en)246 static inline s32 disp_al_capture_set_irq_enable(u32 disp, u32 irq_flag, u32 en) { return 0; }
247 
disp_al_manager_set_rcq_update(u32 disp,u32 en)248 static inline s32 disp_al_manager_set_rcq_update(u32 disp, u32 en) { return 0; }
249 
disp_al_manager_set_all_rcq_head_dirty(u32 disp,u32 dirty)250 static inline s32 disp_al_manager_set_all_rcq_head_dirty(u32 disp, u32 dirty) { return 0; }
251 
disp_al_manager_set_irq_enable(u32 disp,u32 irq_flag,u32 en)252 static inline s32 disp_al_manager_set_irq_enable(u32 disp, u32 irq_flag, u32 en) { return 0; }
253 
disp_al_manager_query_irq_state(u32 disp,u32 irq_state)254 static inline u32 disp_al_manager_query_irq_state(u32 disp, u32 irq_state) { return 0; }
255 
disp_al_device_set_de_id(u32 screen_id,u32 de_id)256 static inline int disp_al_device_set_de_id(u32 screen_id, u32 de_id) { return 0; }
257 
disp_al_device_set_de_use_rcq(u32 screen_id,u32 use_rcq)258 static inline int disp_al_device_set_de_use_rcq(u32 screen_id, u32 use_rcq) { return 0; }
259 
disp_al_device_set_output_type(u32 screen_id,u32 output_type)260 static inline int disp_al_device_set_output_type(u32 screen_id, u32 output_type) { return 0; }
261 
262 #endif
263