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 __DEV_DISP_H__
12 #define __DEV_DISP_H__
13 
14 #include "de/include.h"
15 #include "de/bsp_display.h"
16 #include "de/disp_display.h"
17 #include "de/disp_manager.h"
18 
19 enum disp_standby_flags {
20     DISPLAY_NORMAL = 0,
21     DISPLAY_LIGHT_SLEEP = 1,
22     DISPLAY_DEEP_SLEEP = 2,
23     DISPLAY_BLANK = 4,
24 };
25 
26 
27 struct disp_init_para {
28     bool b_init;
29     enum disp_init_mode disp_mode;
30 
31     /* for screen0/1/2 */
32     enum disp_output_type output_type[8];
33     unsigned int output_mode[8];
34     enum disp_csc_type      output_format[DISP_SCREEN_NUM];
35     enum disp_data_bits     output_bits[DISP_SCREEN_NUM];
36     enum disp_eotf          output_eotf[DISP_SCREEN_NUM];
37     enum disp_color_space   output_cs[DISP_SCREEN_NUM];
38     enum disp_dvi_hdmi      output_dvi_hdmi[DISP_SCREEN_NUM];
39     enum disp_color_range   output_range[DISP_SCREEN_NUM];
40     enum disp_scan_info     output_scan[DISP_SCREEN_NUM];
41     unsigned int            output_aspect_ratio[DISP_SCREEN_NUM];
42     bool using_device_config[DISP_SCREEN_NUM];
43     unsigned int            reserve1;
44     unsigned int            reserve2;
45 
46     /* for fb0/1/2 */
47     unsigned int buffer_num[DISP_SCREEN_NUM];
48     enum disp_pixel_format format[DISP_SCREEN_NUM];
49     unsigned int fb_width[DISP_SCREEN_NUM];
50     unsigned int fb_height[DISP_SCREEN_NUM];
51 
52     unsigned int chn_cfg_mode;
53 };
54 
55 
56 struct disp_drv_info {
57     struct device *dev;
58     uintptr_t reg_base[DISP_MOD_NUM];
59     u32 irq_no[DISP_MOD_NUM];
60 
61     hal_clk_id_t clk_de[DE_NUM];
62     hal_clk_id_t clk_bus_de[DE_NUM];
63     hal_clk_id_t clk_bus_dpss_top[DISP_DEVICE_NUM];
64     hal_clk_id_t clk_tcon_lcd[DISP_DEVICE_NUM];
65     hal_clk_id_t clk_bus_tcon_lcd[DISP_DEVICE_NUM];
66 
67 #if defined(SUPPORT_DSI)
68     hal_clk_id_t clk_mipi_dsi[CLK_DSI_NUM];
69     hal_clk_id_t clk_bus_mipi_dsi[CLK_DSI_NUM];
70 #endif
71 
72     struct disp_init_para disp_init;
73     struct disp_manager *mgr[DISP_SCREEN_NUM];
74     hal_sem_t mlock;
75     hal_work start_work;
76 
77     u32 exit_mode;      /* 0:clean all  1:disable interrupt */
78     bool b_lcd_enabled[DISP_SCREEN_NUM];
79     bool inited;        /* indicate driver if init */
80     struct disp_bsp_init_para para;
81 };
82 
83 struct sunxi_disp_mod {
84     enum disp_mod_id id;
85     char name[32];
86 };
87 
88 struct __fb_addr_para {
89     uintptr_t fb_paddr;
90     int fb_size;
91 };
92 
93 struct bmp_color_table_entry {
94     u8 blue;
95     u8 green;
96     u8 red;
97     u8 reserved;
98 } __packed;
99 
100 struct lzma_header {
101     char signature[4];
102     u32 file_size;
103     u32 original_file_size;
104 };
105 
106 struct bmp_header {
107     /* Header */
108     char signature[2];
109     u32 file_size;
110     u32 reserved;
111     u32 data_offset;
112     /* InfoHeader */
113     u32 size;
114     u32 width;
115     u32 height;
116     u16 planes;
117     u16 bit_count;
118     u32 compression;
119     u32 image_size;
120     u32 x_pixels_per_m;
121     u32 y_pixels_per_m;
122     u32 colors_used;
123     u32 colors_important;
124     /* ColorTable */
125 } __packed;
126 
127 struct bmp_pad_header {
128     char data[2];       /* pading 2 byte */
129     char signature[2];
130     u32 file_size;
131     u32 reserved;
132     u32 data_offset;
133     /* InfoHeader */
134     u32 size;
135     u32 width;
136     u32 height;
137     u16 planes;
138     u16 bit_count;
139     u32 compression;
140     u32 image_size;
141     u32 x_pixels_per_m;
142     u32 y_pixels_per_m;
143     u32 colors_used;
144     u32 colors_important;
145 } __packed;
146 
147 struct bmp_image {
148     struct bmp_header header;
149     /*
150      * We use a zero sized array just as a placeholder for variable
151      * sized array
152      */
153     struct bmp_color_table_entry color_table[0];
154 };
155 
156 struct sunxi_bmp_store {
157     int x;
158     int y;
159     int bit;
160     void *buffer;
161 };
162 
163 void disp_set_suspend_output_type(u8 disp, u8 output_type);
164 
165 int disp_suspend(void *para);
166 int disp_resume(void *para);
167 s32 disp_create_heap(u32 pHeapHead, u32 pHeapHeadPhy, u32 nHeapSize);
168 void *disp_malloc(u32 num_bytes, void *phy_addr);
169 void disp_free(void *virt_addr, void *phy_addr, u32 num_bytes);
170 
171 extern s32 disp_register_sync_proc(void (*proc) (u32));
172 extern s32 disp_unregister_sync_proc(void (*proc) (u32));
173 extern s32 disp_register_sync_finish_proc(void (*proc) (u32));
174 extern s32 disp_unregister_sync_finish_proc(void (*proc) (u32));
175 extern s32 disp_register_ioctl_func(unsigned int cmd,
176                     int (*proc)(unsigned int cmd,
177                          unsigned long arg));
178 extern s32 disp_unregister_ioctl_func(unsigned int cmd);
179 extern s32 disp_register_compat_ioctl_func(unsigned int cmd,
180                        int (*proc)(unsigned int cmd,
181                             unsigned long arg));
182 extern s32 disp_unregister_compat_ioctl_func(unsigned int cmd);
183 extern s32 disp_register_standby_func(int (*suspend) (void),
184                       int (*resume)(void));
185 extern s32 disp_unregister_standby_func(int (*suspend) (void),
186                     int (*resume)(void));
187 extern s32 composer_init(struct disp_drv_info *psg_disp_drv);
188 extern unsigned int composer_dump(char *buf);
189 extern s32 disp_tv_register(struct disp_tv_func *func);
190 extern s32 disp_set_hdmi_detect(bool hpd);
191 s32 disp_set_edp_func(struct disp_tv_func *func);
192 
193 extern struct disp_drv_info g_disp_drv;
194 
195 extern int sunxi_disp_get_source_ops(struct sunxi_disp_source_ops *src_ops);
196 extern s32 disp_lcd_open(u32 sel);
197 extern s32 disp_lcd_close(u32 sel);
198 extern s32 fb_exit(void);
199 extern unsigned long fb_get_address_info(u32 fb_id, u32 phy_virt_flag);
200 extern int lcd_init(void);
201 
202 s32 disp_set_hdmi_func(struct disp_device_func *func);
203 s32 disp_set_vdpo_func(struct disp_tv_func *func);
204 s32 sunxi_get_fb_addr_para(struct __fb_addr_para *fb_addr_para);
205 s32 drv_disp_vsync_event(u32 sel);
206 void DRV_disp_int_process(u32 sel);
207 s32 Display_set_fb_timming(u32 sel);
208 unsigned int disp_boot_para_parse(const char *name);
209 const char *disp_boot_para_parse_str(const char *name);
210 int disp_get_parameter_for_cmdlind(char *cmdline, char *name, char *value);
211 extern s32 bsp_disp_shadow_protect(u32 disp, bool protect);
212 extern int disp_attr_node_init(void);
213 extern int capture_module_init(void);
214 extern void capture_module_exit(void);
215 ssize_t disp_sys_show(void);
216 ssize_t disp_colorbar_store(u32 disp, u32 val);
217 ssize_t disp_capture_dump(u32 disp, const char *image_name);
218 
219 int disp_enhance_mode_store(u32 disp, u32 value);
220 int disp_enhance_saturation_store(u32 disp, u32 value);
221 int disp_enhance_bright_store(u32 disp, u32 value);
222 int disp_enhance_contrast_store(u32 disp, u32 value);
223 int disp_color_temperature_store(u32 disp, s32 value);
224 int disp_enhance_denoise_store(u32 disp, u32 value);
225 int disp_enhance_detail_store(u32 disp, u32 value);
226 
227 int disp_enhance_mode_show(u32 disp, char *buf);
228 int disp_enhance_saturation_show(u32 disp, char *buf);
229 int disp_enhance_bright_show(u32 disp, char *buf);
230 int disp_enhance_contrast_show(u32 disp, char *buf);
231 int disp_color_temperature_show(u32 disp, char *buf);
232 int disp_enhance_denoise_show(u32 disp, char *buf);
233 int disp_enhance_detail_show(u32 disp, char *buf);
234 
235 
236 #endif
237