/* * Allwinner SoCs display driver. * * Copyright (C) 2016 Allwinner. * * This file is licensed under the terms of the GNU General Public * License version 2. This program is licensed "as is" without any * warranty of any kind, whether express or implied. */ #ifndef __DEV_DISP_H__ #define __DEV_DISP_H__ #include "dev_disp_debugfs.h" #include "de/bsp_display.h" #include "de/disp_display.h" #include "de/disp_manager.h" #ifdef CONFIG_HAS_EARLYSUSPEND #include #endif #if defined(CONFIG_EXTCON) #include #endif #ifdef CONFIG_ION_SUNXI #define FB_RESERVED_MEM #endif enum disp_standby_flags { DISPLAY_NORMAL = 0, DISPLAY_LIGHT_SLEEP = 1, DISPLAY_DEEP_SLEEP = 2, DISPLAY_BLANK = 4, }; struct info_mm { void *info_base; /* Virtual address */ uintptr_t mem_start; /* Start of frame buffer mem */ /* (physical address) */ u32 mem_len; /* Length of frame buffer mem */ struct disp_ion_mem *p_ion_mem; }; struct proc_list { void (*proc)(u32 screen_id); struct list_head list; }; struct ioctl_list { unsigned int cmd; int (*func)(unsigned int cmd, unsigned long arg); struct list_head list; }; struct standby_cb_list { int (*suspend)(void); int (*resume)(void); struct list_head list; }; struct disp_init_para { bool b_init; enum disp_init_mode disp_mode; /* for screen0/1/2 */ enum disp_output_type output_type[8]; unsigned int output_mode[8]; enum disp_csc_type output_format[DISP_SCREEN_NUM]; enum disp_data_bits output_bits[DISP_SCREEN_NUM]; enum disp_eotf output_eotf[DISP_SCREEN_NUM]; enum disp_color_space output_cs[DISP_SCREEN_NUM]; enum disp_dvi_hdmi output_dvi_hdmi[DISP_SCREEN_NUM]; enum disp_color_range output_range[DISP_SCREEN_NUM]; enum disp_scan_info output_scan[DISP_SCREEN_NUM]; unsigned int output_aspect_ratio[DISP_SCREEN_NUM]; bool using_device_config[DISP_SCREEN_NUM]; unsigned int reserve1; unsigned int reserve2; /* for fb0/1/2 */ unsigned int buffer_num[DISP_SCREEN_NUM]; enum disp_pixel_format format[DISP_SCREEN_NUM]; unsigned int fb_width[DISP_SCREEN_NUM]; unsigned int fb_height[DISP_SCREEN_NUM]; unsigned int chn_cfg_mode; }; struct disp_ion_mgr { struct ion_client *client; struct ion_handle *handle; struct mutex mlock; struct list_head ion_list; }; struct disp_ion_mem { struct ion_handle *handle; void *vaddr; size_t size; struct dmabuf_item *p_item; }; struct disp_ion_list_node { struct list_head node; struct disp_ion_mem mem; }; struct disp_drv_info { struct device *dev; uintptr_t reg_base[DISP_MOD_NUM]; u32 irq_no[DISP_MOD_NUM]; struct clk *mclk[DISP_MOD_NUM]; struct disp_init_para disp_init; struct disp_manager *mgr[DISP_SCREEN_NUM]; struct disp_eink_manager *eink_manager[1]; struct proc_list sync_proc_list; struct proc_list sync_finish_proc_list; struct ioctl_list ioctl_extend_list; struct ioctl_list compat_ioctl_extend_list; struct standby_cb_list stb_cb_list; struct mutex mlock; struct work_struct resume_work[DISP_SCREEN_NUM]; struct work_struct start_work; u32 exit_mode; /* 0:clean all 1:disable interrupt */ bool b_lcd_enabled[DISP_SCREEN_NUM]; bool inited; /* indicate driver if init */ struct disp_bsp_init_para para; #if defined(CONFIG_ION_SUNXI) struct disp_ion_mgr ion_mgr; #endif }; struct sunxi_disp_mod { enum disp_mod_id id; char name[32]; }; struct __fb_addr_para { uintptr_t fb_paddr; int fb_size; }; #define DISP_RESOURCE(res_name, res_start, res_end, res_flags) \ {\ .start = (int __force)res_start, \ .end = (int __force)res_end, \ .flags = res_flags, \ .name = #res_name \ }, struct bmp_color_table_entry { u8 blue; u8 green; u8 red; u8 reserved; } __packed; struct bmp_header { /* Header */ char signature[2]; u32 file_size; u32 reserved; u32 data_offset; /* InfoHeader */ u32 size; u32 width; u32 height; u16 planes; u16 bit_count; u32 compression; u32 image_size; u32 x_pixels_per_m; u32 y_pixels_per_m; u32 colors_used; u32 colors_important; /* ColorTable */ } __packed; struct bmp_pad_header { char data[2]; /* pading 2 byte */ char signature[2]; u32 file_size; u32 reserved; u32 data_offset; /* InfoHeader */ u32 size; u32 width; u32 height; u16 planes; u16 bit_count; u32 compression; u32 image_size; u32 x_pixels_per_m; u32 y_pixels_per_m; u32 colors_used; u32 colors_important; } __packed; struct bmp_image { struct bmp_header header; /* * We use a zero sized array just as a placeholder for variable * sized array */ struct bmp_color_table_entry color_table[0]; }; struct sunxi_bmp_store { int x; int y; int bit; void *buffer; }; int disp_open(struct inode *inode, struct file *file); int disp_release(struct inode *inode, struct file *file); ssize_t disp_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); ssize_t disp_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos); int disp_mmap(struct file *file, struct vm_area_struct *vma); long disp_ioctl(struct file *file, unsigned int cmd, unsigned long arg); int disp_suspend(struct device *dev); int disp_resume(struct device *dev); s32 disp_create_heap(u32 pHeapHead, u32 pHeapHeadPhy, u32 nHeapSize); void *disp_malloc(u32 num_bytes, void *phy_addr); void disp_free(void *virt_addr, void *phy_addr, u32 num_bytes); extern s32 disp_register_sync_proc(void (*proc) (u32)); extern s32 disp_unregister_sync_proc(void (*proc) (u32)); extern s32 disp_register_sync_finish_proc(void (*proc) (u32)); extern s32 disp_unregister_sync_finish_proc(void (*proc) (u32)); extern s32 disp_register_ioctl_func(unsigned int cmd, int (*proc)(unsigned int cmd, unsigned long arg)); extern s32 disp_unregister_ioctl_func(unsigned int cmd); extern s32 disp_register_compat_ioctl_func(unsigned int cmd, int (*proc)(unsigned int cmd, unsigned long arg)); extern s32 disp_unregister_compat_ioctl_func(unsigned int cmd); extern s32 disp_register_standby_func(int (*suspend) (void), int (*resume)(void)); extern s32 disp_unregister_standby_func(int (*suspend) (void), int (*resume)(void)); extern s32 composer_init(struct disp_drv_info *psg_disp_drv); extern unsigned int composer_dump(char *buf); extern s32 disp_tv_register(struct disp_tv_func *func); extern s32 disp_set_hdmi_detect(bool hpd); s32 disp_set_edp_func(struct disp_tv_func *func); extern struct disp_drv_info g_disp_drv; extern int sunxi_disp_get_source_ops(struct sunxi_disp_source_ops *src_ops); extern s32 disp_lcd_open(u32 sel); extern s32 disp_lcd_close(u32 sel); extern s32 fb_init(struct platform_device *pdev); extern s32 fb_exit(void); extern unsigned long fb_get_address_info(u32 fb_id, u32 phy_virt_flag); extern s32 fb_exit(void); extern int lcd_init(void); s32 disp_set_hdmi_func(struct disp_device_func *func); s32 disp_set_vdpo_func(struct disp_tv_func *func); s32 sunxi_get_fb_addr_para(struct __fb_addr_para *fb_addr_para); s32 fb_draw_colorbar(char *base, u32 width, u32 height, struct fb_var_screeninfo *var); s32 fb_draw_gray_pictures(char *base, u32 width, u32 height, struct fb_var_screeninfo *var); s32 drv_disp_vsync_event(u32 sel); void DRV_disp_int_process(u32 sel); s32 Display_set_fb_timming(u32 sel); unsigned int disp_boot_para_parse(const char *name); const char *disp_boot_para_parse_str(const char *name); int disp_get_parameter_for_cmdlind(char *cmdline, char *name, char *value); extern s32 bsp_disp_shadow_protect(u32 disp, bool protect); extern int disp_attr_node_init(void); extern int capture_module_init(void); extern void capture_module_exit(void); #if defined(SUPPORT_VDPO) extern s32 disp_vdpo_set_config(struct disp_device *p_vdpo, struct disp_vdpo_config *p_cfg); #endif /*endif SUPPORT_VDPO */ struct disp_ion_mem *disp_ion_malloc(u32 num_bytes, void *phys_addr); void disp_ion_free(void *virt_addr, void *phys_addr, u32 num_bytes); void disp_ion_flush_cache(void *startAddr, int size); #endif