162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2009 Nokia Corporation
462306a36Sopenharmony_ci * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Some code and ideas taken from drivers/video/omap/ driver
762306a36Sopenharmony_ci * by Imre Deak.
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __OMAP2_DSS_H
1162306a36Sopenharmony_ci#define __OMAP2_DSS_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/interrupt.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "omapdss.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct dispc_device;
1862306a36Sopenharmony_cistruct dss_debugfs_entry;
1962306a36Sopenharmony_cistruct platform_device;
2062306a36Sopenharmony_cistruct seq_file;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define MAX_DSS_LCD_MANAGERS	3
2362306a36Sopenharmony_ci#define MAX_NUM_DSI		2
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#ifdef pr_fmt
2662306a36Sopenharmony_ci#undef pr_fmt
2762306a36Sopenharmony_ci#endif
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#ifdef DSS_SUBSYS_NAME
3062306a36Sopenharmony_ci#define pr_fmt(fmt) DSS_SUBSYS_NAME ": " fmt
3162306a36Sopenharmony_ci#else
3262306a36Sopenharmony_ci#define pr_fmt(fmt) fmt
3362306a36Sopenharmony_ci#endif
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define DSSDBG(format, ...) \
3662306a36Sopenharmony_ci	pr_debug(format, ## __VA_ARGS__)
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#ifdef DSS_SUBSYS_NAME
3962306a36Sopenharmony_ci#define DSSERR(format, ...) \
4062306a36Sopenharmony_ci	pr_err("omapdss " DSS_SUBSYS_NAME " error: " format, ##__VA_ARGS__)
4162306a36Sopenharmony_ci#else
4262306a36Sopenharmony_ci#define DSSERR(format, ...) \
4362306a36Sopenharmony_ci	pr_err("omapdss error: " format, ##__VA_ARGS__)
4462306a36Sopenharmony_ci#endif
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#ifdef DSS_SUBSYS_NAME
4762306a36Sopenharmony_ci#define DSSINFO(format, ...) \
4862306a36Sopenharmony_ci	pr_info("omapdss " DSS_SUBSYS_NAME ": " format, ##__VA_ARGS__)
4962306a36Sopenharmony_ci#else
5062306a36Sopenharmony_ci#define DSSINFO(format, ...) \
5162306a36Sopenharmony_ci	pr_info("omapdss: " format, ## __VA_ARGS__)
5262306a36Sopenharmony_ci#endif
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#ifdef DSS_SUBSYS_NAME
5562306a36Sopenharmony_ci#define DSSWARN(format, ...) \
5662306a36Sopenharmony_ci	pr_warn("omapdss " DSS_SUBSYS_NAME ": " format, ##__VA_ARGS__)
5762306a36Sopenharmony_ci#else
5862306a36Sopenharmony_ci#define DSSWARN(format, ...) \
5962306a36Sopenharmony_ci	pr_warn("omapdss: " format, ##__VA_ARGS__)
6062306a36Sopenharmony_ci#endif
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/* OMAP TRM gives bitfields as start:end, where start is the higher bit
6362306a36Sopenharmony_ci   number. For example 7:0 */
6462306a36Sopenharmony_ci#define FLD_MASK(start, end)	(((1 << ((start) - (end) + 1)) - 1) << (end))
6562306a36Sopenharmony_ci#define FLD_VAL(val, start, end) (((val) << (end)) & FLD_MASK(start, end))
6662306a36Sopenharmony_ci#define FLD_GET(val, start, end) (((val) & FLD_MASK(start, end)) >> (end))
6762306a36Sopenharmony_ci#define FLD_MOD(orig, val, start, end) \
6862306a36Sopenharmony_ci	(((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end))
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cienum dss_model {
7162306a36Sopenharmony_ci	DSS_MODEL_OMAP2,
7262306a36Sopenharmony_ci	DSS_MODEL_OMAP3,
7362306a36Sopenharmony_ci	DSS_MODEL_OMAP4,
7462306a36Sopenharmony_ci	DSS_MODEL_OMAP5,
7562306a36Sopenharmony_ci	DSS_MODEL_DRA7,
7662306a36Sopenharmony_ci};
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cienum dss_io_pad_mode {
7962306a36Sopenharmony_ci	DSS_IO_PAD_MODE_RESET,
8062306a36Sopenharmony_ci	DSS_IO_PAD_MODE_RFBI,
8162306a36Sopenharmony_ci	DSS_IO_PAD_MODE_BYPASS,
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cienum dss_hdmi_venc_clk_source_select {
8562306a36Sopenharmony_ci	DSS_VENC_TV_CLK = 0,
8662306a36Sopenharmony_ci	DSS_HDMI_M_PCLK = 1,
8762306a36Sopenharmony_ci};
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cienum dss_dsi_content_type {
9062306a36Sopenharmony_ci	DSS_DSI_CONTENT_DCS,
9162306a36Sopenharmony_ci	DSS_DSI_CONTENT_GENERIC,
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cienum dss_clk_source {
9562306a36Sopenharmony_ci	DSS_CLK_SRC_FCK = 0,
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	DSS_CLK_SRC_PLL1_1,
9862306a36Sopenharmony_ci	DSS_CLK_SRC_PLL1_2,
9962306a36Sopenharmony_ci	DSS_CLK_SRC_PLL1_3,
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	DSS_CLK_SRC_PLL2_1,
10262306a36Sopenharmony_ci	DSS_CLK_SRC_PLL2_2,
10362306a36Sopenharmony_ci	DSS_CLK_SRC_PLL2_3,
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	DSS_CLK_SRC_HDMI_PLL,
10662306a36Sopenharmony_ci};
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cienum dss_pll_id {
10962306a36Sopenharmony_ci	DSS_PLL_DSI1,
11062306a36Sopenharmony_ci	DSS_PLL_DSI2,
11162306a36Sopenharmony_ci	DSS_PLL_HDMI,
11262306a36Sopenharmony_ci	DSS_PLL_VIDEO1,
11362306a36Sopenharmony_ci	DSS_PLL_VIDEO2,
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cistruct dss_pll;
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci#define DSS_PLL_MAX_HSDIVS 4
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cienum dss_pll_type {
12162306a36Sopenharmony_ci	DSS_PLL_TYPE_A,
12262306a36Sopenharmony_ci	DSS_PLL_TYPE_B,
12362306a36Sopenharmony_ci};
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci/*
12662306a36Sopenharmony_ci * Type-A PLLs: clkout[]/mX[] refer to hsdiv outputs m4, m5, m6, m7.
12762306a36Sopenharmony_ci * Type-B PLLs: clkout[0] refers to m2.
12862306a36Sopenharmony_ci */
12962306a36Sopenharmony_cistruct dss_pll_clock_info {
13062306a36Sopenharmony_ci	/* rates that we get with dividers below */
13162306a36Sopenharmony_ci	unsigned long fint;
13262306a36Sopenharmony_ci	unsigned long clkdco;
13362306a36Sopenharmony_ci	unsigned long clkout[DSS_PLL_MAX_HSDIVS];
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	/* dividers */
13662306a36Sopenharmony_ci	u16 n;
13762306a36Sopenharmony_ci	u16 m;
13862306a36Sopenharmony_ci	u32 mf;
13962306a36Sopenharmony_ci	u16 mX[DSS_PLL_MAX_HSDIVS];
14062306a36Sopenharmony_ci	u16 sd;
14162306a36Sopenharmony_ci};
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cistruct dss_pll_ops {
14462306a36Sopenharmony_ci	int (*enable)(struct dss_pll *pll);
14562306a36Sopenharmony_ci	void (*disable)(struct dss_pll *pll);
14662306a36Sopenharmony_ci	int (*set_config)(struct dss_pll *pll,
14762306a36Sopenharmony_ci		const struct dss_pll_clock_info *cinfo);
14862306a36Sopenharmony_ci};
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_cistruct dss_pll_hw {
15162306a36Sopenharmony_ci	enum dss_pll_type type;
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	unsigned int n_max;
15462306a36Sopenharmony_ci	unsigned int m_min;
15562306a36Sopenharmony_ci	unsigned int m_max;
15662306a36Sopenharmony_ci	unsigned int mX_max;
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	unsigned long fint_min, fint_max;
15962306a36Sopenharmony_ci	unsigned long clkdco_min, clkdco_low, clkdco_max;
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	u8 n_msb, n_lsb;
16262306a36Sopenharmony_ci	u8 m_msb, m_lsb;
16362306a36Sopenharmony_ci	u8 mX_msb[DSS_PLL_MAX_HSDIVS], mX_lsb[DSS_PLL_MAX_HSDIVS];
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	bool has_stopmode;
16662306a36Sopenharmony_ci	bool has_freqsel;
16762306a36Sopenharmony_ci	bool has_selfreqdco;
16862306a36Sopenharmony_ci	bool has_refsel;
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci	/* DRA7 errata i886: use high N & M to avoid jitter */
17162306a36Sopenharmony_ci	bool errata_i886;
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	/* DRA7 errata i932: retry pll lock on failure */
17462306a36Sopenharmony_ci	bool errata_i932;
17562306a36Sopenharmony_ci};
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_cistruct dss_pll {
17862306a36Sopenharmony_ci	const char *name;
17962306a36Sopenharmony_ci	enum dss_pll_id id;
18062306a36Sopenharmony_ci	struct dss_device *dss;
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	struct clk *clkin;
18362306a36Sopenharmony_ci	struct regulator *regulator;
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	void __iomem *base;
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	const struct dss_pll_hw *hw;
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	const struct dss_pll_ops *ops;
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci	struct dss_pll_clock_info cinfo;
19262306a36Sopenharmony_ci};
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci/* Defines a generic omap register field */
19562306a36Sopenharmony_cistruct dss_reg_field {
19662306a36Sopenharmony_ci	u8 start, end;
19762306a36Sopenharmony_ci};
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistruct dispc_clock_info {
20062306a36Sopenharmony_ci	/* rates that we get with dividers below */
20162306a36Sopenharmony_ci	unsigned long lck;
20262306a36Sopenharmony_ci	unsigned long pck;
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	/* dividers */
20562306a36Sopenharmony_ci	u16 lck_div;
20662306a36Sopenharmony_ci	u16 pck_div;
20762306a36Sopenharmony_ci};
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_cistruct dss_lcd_mgr_config {
21062306a36Sopenharmony_ci	enum dss_io_pad_mode io_pad_mode;
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	bool stallmode;
21362306a36Sopenharmony_ci	bool fifohandcheck;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	struct dispc_clock_info clock_info;
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	int video_port_width;
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci	int lcden_sig_polarity;
22062306a36Sopenharmony_ci};
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci#define DSS_SZ_REGS			SZ_512
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_cistruct dss_device {
22562306a36Sopenharmony_ci	struct platform_device *pdev;
22662306a36Sopenharmony_ci	void __iomem    *base;
22762306a36Sopenharmony_ci	struct regmap	*syscon_pll_ctrl;
22862306a36Sopenharmony_ci	u32		syscon_pll_ctrl_offset;
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	struct platform_device *drm_pdev;
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	struct clk	*parent_clk;
23362306a36Sopenharmony_ci	struct clk	*dss_clk;
23462306a36Sopenharmony_ci	unsigned long	dss_clk_rate;
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	unsigned long	cache_req_pck;
23762306a36Sopenharmony_ci	unsigned long	cache_prate;
23862306a36Sopenharmony_ci	struct dispc_clock_info cache_dispc_cinfo;
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci	enum dss_clk_source dsi_clk_source[MAX_NUM_DSI];
24162306a36Sopenharmony_ci	enum dss_clk_source dispc_clk_source;
24262306a36Sopenharmony_ci	enum dss_clk_source lcd_clk_source[MAX_DSS_LCD_MANAGERS];
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci	bool		ctx_valid;
24562306a36Sopenharmony_ci	u32		ctx[DSS_SZ_REGS / sizeof(u32)];
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	const struct dss_features *feat;
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci	struct {
25062306a36Sopenharmony_ci		struct dentry *root;
25162306a36Sopenharmony_ci		struct dss_debugfs_entry *clk;
25262306a36Sopenharmony_ci		struct dss_debugfs_entry *dss;
25362306a36Sopenharmony_ci	} debugfs;
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci	struct dss_pll *plls[4];
25662306a36Sopenharmony_ci	struct dss_pll	*video1_pll;
25762306a36Sopenharmony_ci	struct dss_pll	*video2_pll;
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	struct dispc_device *dispc;
26062306a36Sopenharmony_ci	struct omap_drm_private *mgr_ops_priv;
26162306a36Sopenharmony_ci};
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci/* core */
26462306a36Sopenharmony_cistatic inline int dss_set_min_bus_tput(struct device *dev, unsigned long tput)
26562306a36Sopenharmony_ci{
26662306a36Sopenharmony_ci	/* To be implemented when the OMAP platform will provide this feature */
26762306a36Sopenharmony_ci	return 0;
26862306a36Sopenharmony_ci}
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_cistatic inline bool dss_mgr_is_lcd(enum omap_channel id)
27162306a36Sopenharmony_ci{
27262306a36Sopenharmony_ci	if (id == OMAP_DSS_CHANNEL_LCD || id == OMAP_DSS_CHANNEL_LCD2 ||
27362306a36Sopenharmony_ci			id == OMAP_DSS_CHANNEL_LCD3)
27462306a36Sopenharmony_ci		return true;
27562306a36Sopenharmony_ci	else
27662306a36Sopenharmony_ci		return false;
27762306a36Sopenharmony_ci}
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci/* DSS */
28062306a36Sopenharmony_ci#if defined(CONFIG_OMAP2_DSS_DEBUGFS)
28162306a36Sopenharmony_cistruct dss_debugfs_entry *
28262306a36Sopenharmony_cidss_debugfs_create_file(struct dss_device *dss, const char *name,
28362306a36Sopenharmony_ci			int (*show_fn)(struct seq_file *s, void *data),
28462306a36Sopenharmony_ci			void *data);
28562306a36Sopenharmony_civoid dss_debugfs_remove_file(struct dss_debugfs_entry *entry);
28662306a36Sopenharmony_ci#else
28762306a36Sopenharmony_cistatic inline struct dss_debugfs_entry *
28862306a36Sopenharmony_cidss_debugfs_create_file(struct dss_device *dss, const char *name,
28962306a36Sopenharmony_ci			int (*show_fn)(struct seq_file *s, void *data),
29062306a36Sopenharmony_ci			void *data)
29162306a36Sopenharmony_ci{
29262306a36Sopenharmony_ci	return NULL;
29362306a36Sopenharmony_ci}
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_cistatic inline void dss_debugfs_remove_file(struct dss_debugfs_entry *entry)
29662306a36Sopenharmony_ci{
29762306a36Sopenharmony_ci}
29862306a36Sopenharmony_ci#endif /* CONFIG_OMAP2_DSS_DEBUGFS */
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_cistruct dss_device *dss_get_device(struct device *dev);
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ciint dss_runtime_get(struct dss_device *dss);
30362306a36Sopenharmony_civoid dss_runtime_put(struct dss_device *dss);
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ciunsigned long dss_get_dispc_clk_rate(struct dss_device *dss);
30662306a36Sopenharmony_ciunsigned long dss_get_max_fck_rate(struct dss_device *dss);
30762306a36Sopenharmony_ciint dss_dpi_select_source(struct dss_device *dss, int port,
30862306a36Sopenharmony_ci			  enum omap_channel channel);
30962306a36Sopenharmony_civoid dss_select_hdmi_venc_clk_source(struct dss_device *dss,
31062306a36Sopenharmony_ci				     enum dss_hdmi_venc_clk_source_select src);
31162306a36Sopenharmony_ciconst char *dss_get_clk_source_name(enum dss_clk_source clk_src);
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci/* DSS VIDEO PLL */
31462306a36Sopenharmony_cistruct dss_pll *dss_video_pll_init(struct dss_device *dss,
31562306a36Sopenharmony_ci				   struct platform_device *pdev, int id,
31662306a36Sopenharmony_ci				   struct regulator *regulator);
31762306a36Sopenharmony_civoid dss_video_pll_uninit(struct dss_pll *pll);
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_civoid dss_ctrl_pll_enable(struct dss_pll *pll, bool enable);
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_civoid dss_sdi_init(struct dss_device *dss, int datapairs);
32262306a36Sopenharmony_ciint dss_sdi_enable(struct dss_device *dss);
32362306a36Sopenharmony_civoid dss_sdi_disable(struct dss_device *dss);
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_civoid dss_select_dsi_clk_source(struct dss_device *dss, int dsi_module,
32662306a36Sopenharmony_ci			       enum dss_clk_source clk_src);
32762306a36Sopenharmony_civoid dss_select_lcd_clk_source(struct dss_device *dss,
32862306a36Sopenharmony_ci			       enum omap_channel channel,
32962306a36Sopenharmony_ci			       enum dss_clk_source clk_src);
33062306a36Sopenharmony_cienum dss_clk_source dss_get_dispc_clk_source(struct dss_device *dss);
33162306a36Sopenharmony_cienum dss_clk_source dss_get_dsi_clk_source(struct dss_device *dss,
33262306a36Sopenharmony_ci					   int dsi_module);
33362306a36Sopenharmony_cienum dss_clk_source dss_get_lcd_clk_source(struct dss_device *dss,
33462306a36Sopenharmony_ci					   enum omap_channel channel);
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_civoid dss_set_venc_output(struct dss_device *dss, enum omap_dss_venc_type type);
33762306a36Sopenharmony_civoid dss_set_dac_pwrdn_bgz(struct dss_device *dss, bool enable);
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ciint dss_set_fck_rate(struct dss_device *dss, unsigned long rate);
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_citypedef bool (*dss_div_calc_func)(unsigned long fck, void *data);
34262306a36Sopenharmony_cibool dss_div_calc(struct dss_device *dss, unsigned long pck,
34362306a36Sopenharmony_ci		  unsigned long fck_min, dss_div_calc_func func, void *data);
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci/* SDI */
34662306a36Sopenharmony_ci#ifdef CONFIG_OMAP2_DSS_SDI
34762306a36Sopenharmony_ciint sdi_init_port(struct dss_device *dss, struct platform_device *pdev,
34862306a36Sopenharmony_ci		  struct device_node *port);
34962306a36Sopenharmony_civoid sdi_uninit_port(struct device_node *port);
35062306a36Sopenharmony_ci#else
35162306a36Sopenharmony_cistatic inline int sdi_init_port(struct dss_device *dss,
35262306a36Sopenharmony_ci				struct platform_device *pdev,
35362306a36Sopenharmony_ci				struct device_node *port)
35462306a36Sopenharmony_ci{
35562306a36Sopenharmony_ci	return 0;
35662306a36Sopenharmony_ci}
35762306a36Sopenharmony_cistatic inline void sdi_uninit_port(struct device_node *port)
35862306a36Sopenharmony_ci{
35962306a36Sopenharmony_ci}
36062306a36Sopenharmony_ci#endif
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci/* DSI */
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci#ifdef CONFIG_OMAP2_DSS_DSI
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_civoid dsi_irq_handler(void);
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci#endif
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci/* DPI */
37162306a36Sopenharmony_ci#ifdef CONFIG_OMAP2_DSS_DPI
37262306a36Sopenharmony_ciint dpi_init_port(struct dss_device *dss, struct platform_device *pdev,
37362306a36Sopenharmony_ci		  struct device_node *port, enum dss_model dss_model);
37462306a36Sopenharmony_civoid dpi_uninit_port(struct device_node *port);
37562306a36Sopenharmony_ci#else
37662306a36Sopenharmony_cistatic inline int dpi_init_port(struct dss_device *dss,
37762306a36Sopenharmony_ci				struct platform_device *pdev,
37862306a36Sopenharmony_ci				struct device_node *port,
37962306a36Sopenharmony_ci				enum dss_model dss_model)
38062306a36Sopenharmony_ci{
38162306a36Sopenharmony_ci	return 0;
38262306a36Sopenharmony_ci}
38362306a36Sopenharmony_cistatic inline void dpi_uninit_port(struct device_node *port)
38462306a36Sopenharmony_ci{
38562306a36Sopenharmony_ci}
38662306a36Sopenharmony_ci#endif
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci/* DISPC */
38962306a36Sopenharmony_civoid dispc_dump_clocks(struct dispc_device *dispc, struct seq_file *s);
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ciint dispc_runtime_get(struct dispc_device *dispc);
39262306a36Sopenharmony_civoid dispc_runtime_put(struct dispc_device *dispc);
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ciint dispc_get_num_ovls(struct dispc_device *dispc);
39562306a36Sopenharmony_ciint dispc_get_num_mgrs(struct dispc_device *dispc);
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ciconst u32 *dispc_ovl_get_color_modes(struct dispc_device *dispc,
39862306a36Sopenharmony_ci					    enum omap_plane_id plane);
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_civoid dispc_ovl_get_max_size(struct dispc_device *dispc, u16 *width, u16 *height);
40162306a36Sopenharmony_cibool dispc_ovl_color_mode_supported(struct dispc_device *dispc,
40262306a36Sopenharmony_ci				    enum omap_plane_id plane, u32 fourcc);
40362306a36Sopenharmony_cienum omap_overlay_caps dispc_ovl_get_caps(struct dispc_device *dispc, enum omap_plane_id plane);
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ciu32 dispc_read_irqstatus(struct dispc_device *dispc);
40662306a36Sopenharmony_civoid dispc_clear_irqstatus(struct dispc_device *dispc, u32 mask);
40762306a36Sopenharmony_civoid dispc_write_irqenable(struct dispc_device *dispc, u32 mask);
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ciint dispc_request_irq(struct dispc_device *dispc, irq_handler_t handler,
41062306a36Sopenharmony_ci			     void *dev_id);
41162306a36Sopenharmony_civoid dispc_free_irq(struct dispc_device *dispc, void *dev_id);
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ciu32 dispc_mgr_get_vsync_irq(struct dispc_device *dispc,
41462306a36Sopenharmony_ci				   enum omap_channel channel);
41562306a36Sopenharmony_ciu32 dispc_mgr_get_framedone_irq(struct dispc_device *dispc,
41662306a36Sopenharmony_ci				       enum omap_channel channel);
41762306a36Sopenharmony_ciu32 dispc_mgr_get_sync_lost_irq(struct dispc_device *dispc,
41862306a36Sopenharmony_ci				       enum omap_channel channel);
41962306a36Sopenharmony_ciu32 dispc_wb_get_framedone_irq(struct dispc_device *dispc);
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ciu32 dispc_get_memory_bandwidth_limit(struct dispc_device *dispc);
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_civoid dispc_mgr_enable(struct dispc_device *dispc,
42462306a36Sopenharmony_ci			     enum omap_channel channel, bool enable);
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_cibool dispc_mgr_go_busy(struct dispc_device *dispc,
42762306a36Sopenharmony_ci			      enum omap_channel channel);
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_civoid dispc_mgr_go(struct dispc_device *dispc, enum omap_channel channel);
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_civoid dispc_mgr_set_lcd_config(struct dispc_device *dispc,
43262306a36Sopenharmony_ci				     enum omap_channel channel,
43362306a36Sopenharmony_ci				     const struct dss_lcd_mgr_config *config);
43462306a36Sopenharmony_civoid dispc_mgr_set_timings(struct dispc_device *dispc,
43562306a36Sopenharmony_ci				  enum omap_channel channel,
43662306a36Sopenharmony_ci				  const struct videomode *vm);
43762306a36Sopenharmony_civoid dispc_mgr_setup(struct dispc_device *dispc,
43862306a36Sopenharmony_ci			    enum omap_channel channel,
43962306a36Sopenharmony_ci			    const struct omap_overlay_manager_info *info);
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ciint dispc_mgr_check_timings(struct dispc_device *dispc,
44262306a36Sopenharmony_ci				   enum omap_channel channel,
44362306a36Sopenharmony_ci				   const struct videomode *vm);
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ciu32 dispc_mgr_gamma_size(struct dispc_device *dispc,
44662306a36Sopenharmony_ci				enum omap_channel channel);
44762306a36Sopenharmony_civoid dispc_mgr_set_gamma(struct dispc_device *dispc,
44862306a36Sopenharmony_ci				enum omap_channel channel,
44962306a36Sopenharmony_ci				const struct drm_color_lut *lut,
45062306a36Sopenharmony_ci				unsigned int length);
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ciint dispc_ovl_setup(struct dispc_device *dispc,
45362306a36Sopenharmony_ci			   enum omap_plane_id plane,
45462306a36Sopenharmony_ci			   const struct omap_overlay_info *oi,
45562306a36Sopenharmony_ci			   const struct videomode *vm, bool mem_to_mem,
45662306a36Sopenharmony_ci			   enum omap_channel channel);
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ciint dispc_ovl_enable(struct dispc_device *dispc,
45962306a36Sopenharmony_ci			    enum omap_plane_id plane, bool enable);
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_cibool dispc_has_writeback(struct dispc_device *dispc);
46262306a36Sopenharmony_ciint dispc_wb_setup(struct dispc_device *dispc,
46362306a36Sopenharmony_ci		   const struct omap_dss_writeback_info *wi,
46462306a36Sopenharmony_ci		   bool mem_to_mem, const struct videomode *vm,
46562306a36Sopenharmony_ci		   enum dss_writeback_channel channel_in);
46662306a36Sopenharmony_cibool dispc_wb_go_busy(struct dispc_device *dispc);
46762306a36Sopenharmony_civoid dispc_wb_go(struct dispc_device *dispc);
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_civoid dispc_enable_sidle(struct dispc_device *dispc);
47062306a36Sopenharmony_civoid dispc_disable_sidle(struct dispc_device *dispc);
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_civoid dispc_lcd_enable_signal(struct dispc_device *dispc, bool enable);
47362306a36Sopenharmony_civoid dispc_pck_free_enable(struct dispc_device *dispc, bool enable);
47462306a36Sopenharmony_civoid dispc_enable_fifomerge(struct dispc_device *dispc, bool enable);
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_citypedef bool (*dispc_div_calc_func)(int lckd, int pckd, unsigned long lck,
47762306a36Sopenharmony_ci		unsigned long pck, void *data);
47862306a36Sopenharmony_cibool dispc_div_calc(struct dispc_device *dispc, unsigned long dispc_freq,
47962306a36Sopenharmony_ci		    unsigned long pck_min, unsigned long pck_max,
48062306a36Sopenharmony_ci		    dispc_div_calc_func func, void *data);
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ciint dispc_calc_clock_rates(struct dispc_device *dispc,
48362306a36Sopenharmony_ci			   unsigned long dispc_fclk_rate,
48462306a36Sopenharmony_ci			   struct dispc_clock_info *cinfo);
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_civoid dispc_ovl_set_fifo_threshold(struct dispc_device *dispc,
48862306a36Sopenharmony_ci				  enum omap_plane_id plane, u32 low, u32 high);
48962306a36Sopenharmony_civoid dispc_ovl_compute_fifo_thresholds(struct dispc_device *dispc,
49062306a36Sopenharmony_ci				       enum omap_plane_id plane,
49162306a36Sopenharmony_ci				       u32 *fifo_low, u32 *fifo_high,
49262306a36Sopenharmony_ci				       bool use_fifomerge, bool manual_update);
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_civoid dispc_mgr_set_clock_div(struct dispc_device *dispc,
49562306a36Sopenharmony_ci			     enum omap_channel channel,
49662306a36Sopenharmony_ci			     const struct dispc_clock_info *cinfo);
49762306a36Sopenharmony_ciint dispc_mgr_get_clock_div(struct dispc_device *dispc,
49862306a36Sopenharmony_ci			    enum omap_channel channel,
49962306a36Sopenharmony_ci			    struct dispc_clock_info *cinfo);
50062306a36Sopenharmony_civoid dispc_set_tv_pclk(struct dispc_device *dispc, unsigned long pclk);
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
50362306a36Sopenharmony_cistatic inline void dss_collect_irq_stats(u32 irqstatus, unsigned int *irq_arr)
50462306a36Sopenharmony_ci{
50562306a36Sopenharmony_ci	int b;
50662306a36Sopenharmony_ci	for (b = 0; b < 32; ++b) {
50762306a36Sopenharmony_ci		if (irqstatus & (1 << b))
50862306a36Sopenharmony_ci			irq_arr[b]++;
50962306a36Sopenharmony_ci	}
51062306a36Sopenharmony_ci}
51162306a36Sopenharmony_ci#endif
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci/* PLL */
51462306a36Sopenharmony_citypedef bool (*dss_pll_calc_func)(int n, int m, unsigned long fint,
51562306a36Sopenharmony_ci		unsigned long clkdco, void *data);
51662306a36Sopenharmony_citypedef bool (*dss_hsdiv_calc_func)(int m_dispc, unsigned long dispc,
51762306a36Sopenharmony_ci		void *data);
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ciint dss_pll_register(struct dss_device *dss, struct dss_pll *pll);
52062306a36Sopenharmony_civoid dss_pll_unregister(struct dss_pll *pll);
52162306a36Sopenharmony_cistruct dss_pll *dss_pll_find(struct dss_device *dss, const char *name);
52262306a36Sopenharmony_cistruct dss_pll *dss_pll_find_by_src(struct dss_device *dss,
52362306a36Sopenharmony_ci				    enum dss_clk_source src);
52462306a36Sopenharmony_ciunsigned int dss_pll_get_clkout_idx_for_src(enum dss_clk_source src);
52562306a36Sopenharmony_ciint dss_pll_enable(struct dss_pll *pll);
52662306a36Sopenharmony_civoid dss_pll_disable(struct dss_pll *pll);
52762306a36Sopenharmony_ciint dss_pll_set_config(struct dss_pll *pll,
52862306a36Sopenharmony_ci		const struct dss_pll_clock_info *cinfo);
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_cibool dss_pll_hsdiv_calc_a(const struct dss_pll *pll, unsigned long clkdco,
53162306a36Sopenharmony_ci		unsigned long out_min, unsigned long out_max,
53262306a36Sopenharmony_ci		dss_hsdiv_calc_func func, void *data);
53362306a36Sopenharmony_cibool dss_pll_calc_a(const struct dss_pll *pll, unsigned long clkin,
53462306a36Sopenharmony_ci		unsigned long pll_min, unsigned long pll_max,
53562306a36Sopenharmony_ci		dss_pll_calc_func func, void *data);
53662306a36Sopenharmony_ci
53762306a36Sopenharmony_cibool dss_pll_calc_b(const struct dss_pll *pll, unsigned long clkin,
53862306a36Sopenharmony_ci	unsigned long target_clkout, struct dss_pll_clock_info *cinfo);
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ciint dss_pll_write_config_type_a(struct dss_pll *pll,
54162306a36Sopenharmony_ci		const struct dss_pll_clock_info *cinfo);
54262306a36Sopenharmony_ciint dss_pll_write_config_type_b(struct dss_pll *pll,
54362306a36Sopenharmony_ci		const struct dss_pll_clock_info *cinfo);
54462306a36Sopenharmony_ciint dss_pll_wait_reset_done(struct dss_pll *pll);
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ciextern struct platform_driver omap_dsshw_driver;
54762306a36Sopenharmony_ciextern struct platform_driver omap_dispchw_driver;
54862306a36Sopenharmony_ci#ifdef CONFIG_OMAP2_DSS_DSI
54962306a36Sopenharmony_ciextern struct platform_driver omap_dsihw_driver;
55062306a36Sopenharmony_ci#endif
55162306a36Sopenharmony_ci#ifdef CONFIG_OMAP2_DSS_VENC
55262306a36Sopenharmony_ciextern struct platform_driver omap_venchw_driver;
55362306a36Sopenharmony_ci#endif
55462306a36Sopenharmony_ci#ifdef CONFIG_OMAP4_DSS_HDMI
55562306a36Sopenharmony_ciextern struct platform_driver omapdss_hdmi4hw_driver;
55662306a36Sopenharmony_ci#endif
55762306a36Sopenharmony_ci#ifdef CONFIG_OMAP5_DSS_HDMI
55862306a36Sopenharmony_ciextern struct platform_driver omapdss_hdmi5hw_driver;
55962306a36Sopenharmony_ci#endif
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci#endif
562