#ifndef __PANEL_H__
#define __PANEL_H__

#include "cal_common/cal_config.h"

/* s6e3fac_rainbow_g0 panel params */
#define VACTIVE 2340
#define HACTIVE	1080
#define VFP	15
#define VSA	1
#define VBP	1
#define HFP	1
#define HSA	1
#define HBP	1
#define FPS	60

#define DSC_EN			1
#define DSC_CNT			2
#define DSC_SLICE_CNT		2
#define DSC_SLICE_HEIGHT	117

#define HS_CLK		1362
#define ESC_CLK		20

#define DPHY_P		0x5
#define DPHY_M		0x59
#define DPHY_S		0x0
#define DPHY_K		0xAC00
#define DPHY_MFR	0x0
#define DPHY_MRR	0x0
#define DPHY_SEL_PF	0x0
#define DPHY_ICP	0x0
#define DPHY_AFC_ENB	0x0
#define DPHY_EXTAFC	0x0
#define DPHY_FEED_EN	0x0
#define DPHY_FSEL	0x0
#define DPHY_FOUT_MASK	0x0
#define DPHY_RSEL	0x0
#define DPHY_DITHER_EN	0

#define DATA_LANE_CNT		4
#define OP_MODE			1 /* 0: video, 1: command */
#define CMD_UNDERRUN_CNT	10442

enum dsim_panel_mode {
	DSIM_VIDEO_MODE = 0,
	DSIM_COMMAND_MODE,
};

struct panel_information {
	unsigned int vactive;
	unsigned int vfp;
	unsigned int vsa;
	unsigned int vbp;
	unsigned int hactive;
	unsigned int hfp;
	unsigned int hsa;
	unsigned int hbp;
	unsigned int vrefresh;

	bool enabled;
	u32 dsc_count;
	u32 slice_count;
	u32 slice_height;

	u32 hs_clk;
	u32 esc_clk;

	unsigned int p;
	unsigned int m;
	unsigned int s;
	unsigned int k;
	unsigned int mfr;
	unsigned int mrr;
	unsigned int sel_pf;
	unsigned int icp;
	unsigned int afc_enb;
	unsigned int extafc;
	unsigned int feed_en;
	unsigned int fsel;
	unsigned int fout_mask;
	unsigned int rsel;
	bool dither_en;

	unsigned int data_lane_cnt;
	enum dsim_panel_mode mode;
	unsigned int cmd_underrun_cnt;
};

enum type_of_ddi {
	TYPE_OF_SM_DDI = 0,
	TYPE_OF_MAGNA_DDI,
	TYPE_OF_NORMAL_DDI,
};

struct dpu_panel_timing {
	unsigned int vactive;
	unsigned int vfp;
	unsigned int vsa;
	unsigned int vbp;

	unsigned int hactive;
	unsigned int hfp;
	unsigned int hsa;
	unsigned int hbp;

	unsigned int vrefresh;
};

struct exynos_dsc {
	bool enabled;
	u32 dsc_count;
	u32 slice_count;
	u32 slice_width;
	u32 slice_height;
};

/* return compressed DSC slice width */
static inline u32 get_comp_dsc_width(const struct exynos_dsc *dsc, u32 bpc)
{
	unsigned int slice_width_pixels =
				DIV_ROUND_UP(dsc->slice_width * bpc, 8);

	return ALIGN(DIV_ROUND_UP(slice_width_pixels, 3), 4);
}
#endif /* __PANEL_H__ */
