diff options
Diffstat (limited to 'drivers/video/samsung_duallcd/s3cfb.h')
-rw-r--r-- | drivers/video/samsung_duallcd/s3cfb.h | 397 |
1 files changed, 397 insertions, 0 deletions
diff --git a/drivers/video/samsung_duallcd/s3cfb.h b/drivers/video/samsung_duallcd/s3cfb.h new file mode 100644 index 0000000..ca60173 --- /dev/null +++ b/drivers/video/samsung_duallcd/s3cfb.h @@ -0,0 +1,397 @@ +/* linux/drivers/video/samsung/s3cfb.h + * + * Copyright (c) 2010 Samsung Electronics Co., Ltd. + * http://www.samsung.com/ + * + * Header file for Samsung Display Driver (FIMD) driver + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ + +#ifndef _S3CFB_H +#define _S3CFB_H __FILE__ + +#ifdef __KERNEL__ +#include <linux/mutex.h> +#include <linux/fb.h> +#ifdef CONFIG_HAS_WAKELOCK +#include <linux/wakelock.h> +#include <linux/earlysuspend.h> +#endif +#include <plat/fb-s5p.h> +#endif +#include <mach/cpufreq.h> + +#define S3CFB_NAME "s3cfb" +#define S3CFB_AVALUE(r, g, b) (((r & 0xf) << 8) | \ + ((g & 0xf) << 4) | \ + ((b & 0xf) << 0)) +#define S3CFB_CHROMA(r, g, b) (((r & 0xff) << 16) | \ + ((g & 0xff) << 8) | \ + ((b & 0xff) << 0)) + +#if defined(CONFIG_FB_S5P_DUAL_LCD) +#define FIMD_MAX 2 +#else +#define FIMD_MAX 1 +#endif +#define MAX_BUFFER_NUM 3 + +#define POWER_ON 1 +#define POWER_OFF 0 + +#if defined(CONFIG_MACH_PX) || defined(CONFIG_MACH_Q1_BD) +#define FEATURE_BUSFREQ_LOCK /* Now, this feature only avaliable in 4210 */ +#endif + +enum s3cfb_data_path_t { + DATA_PATH_FIFO = 0, + DATA_PATH_DMA = 1, + DATA_PATH_IPC = 2, +}; + +enum s3cfb_alpha_t { + PLANE_BLENDING, + PIXEL_BLENDING, +}; + +enum s3cfb_chroma_dir_t { + CHROMA_FG, + CHROMA_BG, +}; + +enum s3cfb_output_t { + OUTPUT_RGB, + OUTPUT_ITU, + OUTPUT_I80LDI0, + OUTPUT_I80LDI1, + OUTPUT_WB_RGB, + OUTPUT_WB_I80LDI0, + OUTPUT_WB_I80LDI1, +}; + +enum s3cfb_rgb_mode_t { + MODE_RGB_P = 0, + MODE_BGR_P = 1, + MODE_RGB_S = 2, + MODE_BGR_S = 3, +}; + +enum s3cfb_mem_owner_t { + DMA_MEM_NONE = 0, + DMA_MEM_FIMD = 1, + DMA_MEM_OTHER = 2, +}; + +struct s3cfb_alpha { + enum s3cfb_alpha_t mode; + int channel; + unsigned int value; +}; + +struct s3cfb_chroma { + int enabled; + int blended; + unsigned int key; + unsigned int comp_key; + unsigned int alpha; + enum s3cfb_chroma_dir_t dir; +}; + +struct s3cfb_lcd_timing { + int h_fp; + int h_bp; + int h_sw; + int v_fp; + int v_fpe; + int v_bp; + int v_bpe; + int v_sw; +#if defined(CONFIG_FB_S5P_MIPI_DSIM) || defined(CONFIG_S5P_MIPI_DSI2) + int cmd_allow_len; + int stable_vfp; + void (*cfg_gpio)(struct platform_device *dev); + int (*backlight_on)(struct platform_device *dev); + int (*reset_lcd)(struct platform_device *dev); +#endif +}; + +struct s3cfb_lcd_polarity { + int rise_vclk; + int inv_hsync; + int inv_vsync; + int inv_vden; +}; + +#ifdef CONFIG_FB_S5P_MIPI_DSIM +/* for CPU Interface */ +struct s3cfb_cpu_timing { + unsigned int cs_setup; + unsigned int wr_setup; + unsigned int wr_act; + unsigned int wr_hold; +}; +#endif + +struct s3cfb_lcd { +#ifdef CONFIG_FB_S5P_MIPI_DSIM + char *name; +#endif + int width; + int height; + int p_width; + int p_height; + int bpp; + int freq; + int vclk; + struct s3cfb_lcd_timing timing; + struct s3cfb_lcd_polarity polarity; +#ifdef CONFIG_FB_S5P_MIPI_DSIM + struct s3cfb_cpu_timing cpu_timing; +#endif + void (*init_ldi)(void); + void (*deinit_ldi)(void); +}; + +struct s3cfb_fimd_desc { + int state; + int dual; + struct s3cfb_global *fbdev[FIMD_MAX]; +}; + +struct s3cfb_global { + void __iomem *regs; + void __iomem *regs_org; + void __iomem *ielcd_regs; + void *data; + struct mutex lock; + spinlock_t slock; + struct device *dev; +#ifdef CONFIG_BUSFREQ_OPP + struct device *bus_dev; +#endif + struct clk *clock; + int irq; + wait_queue_head_t wq; + unsigned int wq_count; + struct fb_info **fb; + + atomic_t enabled_win; + enum s3cfb_output_t output; + enum s3cfb_rgb_mode_t rgb_mode; + struct s3cfb_lcd *lcd; + int system_state; +#ifdef CONFIG_HAS_WAKELOCK + struct early_suspend early_suspend; + struct wake_lock idle_lock; +#endif +#ifdef FEATURE_BUSFREQ_LOCK + atomic_t busfreq_lock_cnt; /* Bus frequency Lock count */ + int busfreq_flag; /* context bus frequency flag*/ +#endif +}; + +struct s3cfb_window { + int id; + int enabled; + atomic_t in_use; + int x; + int y; + enum s3cfb_data_path_t path; + enum s3cfb_mem_owner_t owner; + int local_channel; + int dma_burst; + unsigned int pseudo_pal[16]; + struct s3cfb_alpha alpha; + struct s3cfb_chroma chroma; + int power_state; +}; + +struct s3cfb_user_window { + int x; + int y; +}; + +struct s3cfb_user_plane_alpha { + int channel; + unsigned char red; + unsigned char green; + unsigned char blue; +}; + +struct s3cfb_user_chroma { + int enabled; + unsigned char red; + unsigned char green; + unsigned char blue; +}; + +#define BLENDING_NONE 0x0100 +#define BLENDING_PREMULT 0x0105 +#define BLENDING_COVERAGE 0x0405 + +/* IOCTL commands */ +#define S3CFB_WIN_POSITION _IOW('F', 203, \ + struct s3cfb_user_window) +#define S3CFB_WIN_SET_PLANE_ALPHA _IOW('F', 204, \ + struct s3cfb_user_plane_alpha) +#define S3CFB_WIN_SET_CHROMA _IOW('F', 205, \ + struct s3cfb_user_chroma) +#define S3CFB_SET_VSYNC_INT _IOW('F', 206, u32) +#define S3CFB_GET_VSYNC_INT_STATUS _IOR('F', 207, u32) +#define S3CFB_GET_LCD_WIDTH _IOR('F', 302, int) +#define S3CFB_GET_LCD_HEIGHT _IOR('F', 303, int) +#define S3CFB_SET_WRITEBACK _IOW('F', 304, u32) +#define S3CFB_SET_WIN_ON _IOW('F', 305, u32) +#define S3CFB_SET_WIN_OFF _IOW('F', 306, u32) +#define S3CFB_SET_WIN_PATH _IOW('F', 307, \ + enum s3cfb_data_path_t) +#define S3CFB_SET_WIN_ADDR _IOW('F', 308, unsigned long) +#define S3CFB_SET_WIN_MEM _IOW('F', 309, \ + enum s3cfb_mem_owner_t) +#define S3CFB_GET_FB_PHY_ADDR _IOR('F', 310, unsigned int) +#define S3CFB_GET_CUR_WIN_BUF_ADDR _IOR('F', 311, unsigned int) +#if defined(CONFIG_CPU_EXYNOS4210) +#define S3CFB_SET_WIN_MEM_START _IOW('F', 312, u32) +#endif +#define S3CFB_SET_ALPHA_MODE _IOW('F', 313, unsigned int) + +extern struct fb_ops s3cfb_ops; +extern inline struct s3cfb_global *get_fimd_global(int id); + +/* S3CFB */ +extern struct s3c_platform_fb *to_fb_plat(struct device *dev); +extern int s3cfb_draw_logo(struct fb_info *fb); +extern int s3cfb_enable_window(struct s3cfb_global *fbdev, int id); +extern int s3cfb_disable_window(struct s3cfb_global *fbdev, int id); +extern int s3cfb_update_power_state(struct s3cfb_global *fbdev, int id, + int state); +extern int s3cfb_init_global(struct s3cfb_global *fbdev); +extern int s3cfb_map_video_memory(struct s3cfb_global *fbdev, + struct fb_info *fb); +extern int s3cfb_unmap_video_memory(struct s3cfb_global *fbdev, + struct fb_info *fb); +extern int s3cfb_map_default_video_memory(struct s3cfb_global *fbdev, + struct fb_info *fb, int fimd_id); +extern int s3cfb_unmap_default_video_memory(struct s3cfb_global *fbdev, + struct fb_info *fb); +extern int s3cfb_set_bitfield(struct fb_var_screeninfo *var); +extern int s3cfb_set_alpha_info(struct fb_var_screeninfo *var, + struct s3cfb_window *win); +extern int s3cfb_check_var(struct fb_var_screeninfo *var, struct fb_info *fb); +extern int s3cfb_check_var_window(struct s3cfb_global *fbdev, + struct fb_var_screeninfo *var, struct fb_info *fb); +extern void s3cfb_set_win_params(struct s3cfb_global *fbdev, int id); +extern int s3cfb_set_par_window(struct s3cfb_global *fbdev, struct fb_info *fb); +extern int s3cfb_set_par(struct fb_info *fb); +extern int s3cfb_init_fbinfo(struct s3cfb_global *fbdev, int id); +extern int s3cfb_alloc_framebuffer(struct s3cfb_global *fbdev, int fimd_id); +extern int s3cfb_open(struct fb_info *fb, int user); +extern int s3cfb_release_window(struct fb_info *fb); +extern int s3cfb_release(struct fb_info *fb, int user); +extern int s3cfb_pan_display(struct fb_var_screeninfo *var, + struct fb_info *fb); +extern int s3cfb_blank(int blank_mode, struct fb_info *fb); +extern inline unsigned int __chan_to_field(unsigned int chan, + struct fb_bitfield bf); +extern int s3cfb_setcolreg(unsigned int regno, unsigned int red, + unsigned int green, unsigned int blue, + unsigned int transp, struct fb_info *fb); +extern int s3cfb_cursor(struct fb_info *fb, struct fb_cursor *cursor); +extern int s3cfb_ioctl(struct fb_info *fb, unsigned int cmd, unsigned long arg); +extern int s3cfb_enable_localpath(struct s3cfb_global *fbdev, int id); +extern int s3cfb_disable_localpath(struct s3cfb_global *fbdev, int id); + +/* FIMD */ +extern int s3cfb_clear_interrupt(struct s3cfb_global *ctrl); +extern int s3cfb_display_on(struct s3cfb_global *ctrl); +extern int s3cfb_set_output(struct s3cfb_global *ctrl); +extern int s3cfb_set_display_mode(struct s3cfb_global *ctrl); +extern int s3cfb_display_on(struct s3cfb_global *ctrl); +extern int s3cfb_display_off(struct s3cfb_global *ctrl); +extern int s3cfb_set_clock(struct s3cfb_global *ctrl); +extern int s3cfb_set_polarity(struct s3cfb_global *ctrl); +extern int s3cfb_set_polarity_only(struct s3cfb_global *ctrl); +extern int s3cfb_set_timing(struct s3cfb_global *ctrl); +extern int s3cfb_set_lcd_size(struct s3cfb_global *ctrl); +extern int s3cfb_set_global_interrupt(struct s3cfb_global *ctrl, int enable); +extern int s3cfb_set_vsync_interrupt(struct s3cfb_global *ctrl, int enable); +extern int s3cfb_get_vsync_interrupt(struct s3cfb_global *ctrl); +extern int s3cfb_set_fifo_interrupt(struct s3cfb_global *ctrl, int enable); +extern int s3cfb_window_on(struct s3cfb_global *ctrl, int id); +extern int s3cfb_window_off(struct s3cfb_global *ctrl, int id); +extern int s3cfb_win_map_on(struct s3cfb_global *ctrl, int id, int color); +extern int s3cfb_win_map_off(struct s3cfb_global *ctrl, int id); +extern int s3cfb_set_window_control(struct s3cfb_global *ctrl, int id); +extern int s3cfb_set_alpha_mode(struct s3cfb_global *ctrl, int id, unsigned int mode); +extern int s3cfb_set_alpha_value_width(struct s3cfb_global *ctrl, int id); +extern int s3cfb_set_alpha_blending(struct s3cfb_global *ctrl, int id); +extern int s3cfb_set_oneshot(struct s3cfb_global *ctrl, int value); +extern int s3cfb_set_alpha_value(struct s3cfb_global *ctrl, int value); +extern int s3cfb_set_window_position(struct s3cfb_global *ctrl, int id); +extern int s3cfb_set_window_size(struct s3cfb_global *ctrl, int id); +extern int s3cfb_set_buffer_address(struct s3cfb_global *ctrl, int id); +extern int s3cfb_get_win_cur_buf_addr(struct s3cfb_global *ctrl, int id); +extern int s3cfb_set_buffer_size(struct s3cfb_global *ctrl, int id); +extern int s3cfb_set_chroma_key(struct s3cfb_global *ctrl, int id); +extern int s3cfb_channel_localpath_on(struct s3cfb_global *ctrl, int id); +extern int s3cfb_channel_localpath_off(struct s3cfb_global *ctrl, int id); +extern int s3cfb_check_vsync_status(struct s3cfb_global *ctrl); +extern int s3cfb_set_dualrgb(struct s3cfb_global *ctrl, int mode); +#ifdef CONFIG_FB_S5P_MIPI_DSIM +extern int s3cfb_vsync_status_check(void); +#endif + +#ifdef CONFIG_HAS_WAKELOCK +#ifdef CONFIG_HAS_EARLYSUSPEND +extern void s3cfb_early_suspend(struct early_suspend *h); +extern void s3cfb_late_resume(struct early_suspend *h); +#endif +#endif + +/* LCD */ +extern void s3cfb_set_lcd_info(struct s3cfb_global *ctrl); + +#ifdef CONFIG_FB_S5P_MIPI_DSIM +extern void s5p_dsim_early_suspend(void); +extern void s5p_dsim_late_resume(void); +#ifdef CONFIG_FB_S5P_S6E63M0 +extern int s6e63m0_sleep_in(void); +extern void s6e63m0_early_suspend(void); +extern void s6e63m0_late_resume(void); +#else +extern void s6e8ax0_early_suspend(void); +extern void s6e8ax0_late_resume(void); +#endif +#if defined(CONFIG_S5P_DSIM_SWITCHABLE_DUAL_LCD) +extern int s5p_dsim_get_panel_sel_value(void); +extern int s5p_dsim_get_lcd_sel_value(void); +extern int s5p_dsim_toggle_lcd(void); +extern int s5p_dsim_select_lcd(unsigned int lcd_sel); +#endif /* CONFIG_S5P_DSIM_SWITCHABLE_DUAL_LCD */ +extern int s5p_dsim_fifo_clear(void); +extern void set_dsim_hs_clk_toggle_count(u8 count); +extern void set_dsim_lcd_enabled(u8 enable); +extern u32 read_dsim_register(u32 num); +#endif + + +#ifdef CONFIG_FB_S5P_AMS369FG06 +extern void ams369fg06_ldi_init(void); +extern void ams369fg06_ldi_enable(void); +extern void ams369fg06_ldi_disable(void); +extern void ams369fg06_gpio_cfg(void); +#elif defined(CONFIG_FB_S5P_LMS501KF03) +extern void lms501kf03_ldi_disable(void); +#endif + +#if defined(CONFIG_FB_S5P_S6C1372) || defined(CONFIG_FB_S5P_S6F1202A) +extern void s5c1372_ldi_enable(void); +extern void s5c1372_ldi_disable(void); +#endif + +extern int lcdfreq_init(struct fb_info *fb); + +#endif /* _S3CFB_H */ |