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