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