18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * HDMI driver definition for TI OMAP4 Processor. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com/ 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _HDMI_H 98c2ecf20Sopenharmony_ci#define _HDMI_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/delay.h> 128c2ecf20Sopenharmony_ci#include <linux/io.h> 138c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 148c2ecf20Sopenharmony_ci#include <linux/hdmi.h> 158c2ecf20Sopenharmony_ci#include <sound/omap-hdmi-audio.h> 168c2ecf20Sopenharmony_ci#include <media/cec.h> 178c2ecf20Sopenharmony_ci#include <drm/drm_bridge.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include "omapdss.h" 208c2ecf20Sopenharmony_ci#include "dss.h" 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistruct dss_device; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* HDMI Wrapper */ 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define HDMI_WP_REVISION 0x0 278c2ecf20Sopenharmony_ci#define HDMI_WP_SYSCONFIG 0x10 288c2ecf20Sopenharmony_ci#define HDMI_WP_IRQSTATUS_RAW 0x24 298c2ecf20Sopenharmony_ci#define HDMI_WP_IRQSTATUS 0x28 308c2ecf20Sopenharmony_ci#define HDMI_WP_IRQENABLE_SET 0x2C 318c2ecf20Sopenharmony_ci#define HDMI_WP_IRQENABLE_CLR 0x30 328c2ecf20Sopenharmony_ci#define HDMI_WP_IRQWAKEEN 0x34 338c2ecf20Sopenharmony_ci#define HDMI_WP_PWR_CTRL 0x40 348c2ecf20Sopenharmony_ci#define HDMI_WP_DEBOUNCE 0x44 358c2ecf20Sopenharmony_ci#define HDMI_WP_VIDEO_CFG 0x50 368c2ecf20Sopenharmony_ci#define HDMI_WP_VIDEO_SIZE 0x60 378c2ecf20Sopenharmony_ci#define HDMI_WP_VIDEO_TIMING_H 0x68 388c2ecf20Sopenharmony_ci#define HDMI_WP_VIDEO_TIMING_V 0x6C 398c2ecf20Sopenharmony_ci#define HDMI_WP_CLK 0x70 408c2ecf20Sopenharmony_ci#define HDMI_WP_AUDIO_CFG 0x80 418c2ecf20Sopenharmony_ci#define HDMI_WP_AUDIO_CFG2 0x84 428c2ecf20Sopenharmony_ci#define HDMI_WP_AUDIO_CTRL 0x88 438c2ecf20Sopenharmony_ci#define HDMI_WP_AUDIO_DATA 0x8C 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci/* HDMI WP IRQ flags */ 468c2ecf20Sopenharmony_ci#define HDMI_IRQ_CORE (1 << 0) 478c2ecf20Sopenharmony_ci#define HDMI_IRQ_OCP_TIMEOUT (1 << 4) 488c2ecf20Sopenharmony_ci#define HDMI_IRQ_AUDIO_FIFO_UNDERFLOW (1 << 8) 498c2ecf20Sopenharmony_ci#define HDMI_IRQ_AUDIO_FIFO_OVERFLOW (1 << 9) 508c2ecf20Sopenharmony_ci#define HDMI_IRQ_AUDIO_FIFO_SAMPLE_REQ (1 << 10) 518c2ecf20Sopenharmony_ci#define HDMI_IRQ_VIDEO_VSYNC (1 << 16) 528c2ecf20Sopenharmony_ci#define HDMI_IRQ_VIDEO_FRAME_DONE (1 << 17) 538c2ecf20Sopenharmony_ci#define HDMI_IRQ_PHY_LINE5V_ASSERT (1 << 24) 548c2ecf20Sopenharmony_ci#define HDMI_IRQ_LINK_CONNECT (1 << 25) 558c2ecf20Sopenharmony_ci#define HDMI_IRQ_LINK_DISCONNECT (1 << 26) 568c2ecf20Sopenharmony_ci#define HDMI_IRQ_PLL_LOCK (1 << 29) 578c2ecf20Sopenharmony_ci#define HDMI_IRQ_PLL_UNLOCK (1 << 30) 588c2ecf20Sopenharmony_ci#define HDMI_IRQ_PLL_RECAL (1 << 31) 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci/* HDMI PLL */ 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci#define PLLCTRL_PLL_CONTROL 0x0 638c2ecf20Sopenharmony_ci#define PLLCTRL_PLL_STATUS 0x4 648c2ecf20Sopenharmony_ci#define PLLCTRL_PLL_GO 0x8 658c2ecf20Sopenharmony_ci#define PLLCTRL_CFG1 0xC 668c2ecf20Sopenharmony_ci#define PLLCTRL_CFG2 0x10 678c2ecf20Sopenharmony_ci#define PLLCTRL_CFG3 0x14 688c2ecf20Sopenharmony_ci#define PLLCTRL_SSC_CFG1 0x18 698c2ecf20Sopenharmony_ci#define PLLCTRL_SSC_CFG2 0x1C 708c2ecf20Sopenharmony_ci#define PLLCTRL_CFG4 0x20 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci/* HDMI PHY */ 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci#define HDMI_TXPHY_TX_CTRL 0x0 758c2ecf20Sopenharmony_ci#define HDMI_TXPHY_DIGITAL_CTRL 0x4 768c2ecf20Sopenharmony_ci#define HDMI_TXPHY_POWER_CTRL 0x8 778c2ecf20Sopenharmony_ci#define HDMI_TXPHY_PAD_CFG_CTRL 0xC 788c2ecf20Sopenharmony_ci#define HDMI_TXPHY_BIST_CONTROL 0x1C 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cienum hdmi_pll_pwr { 818c2ecf20Sopenharmony_ci HDMI_PLLPWRCMD_ALLOFF = 0, 828c2ecf20Sopenharmony_ci HDMI_PLLPWRCMD_PLLONLY = 1, 838c2ecf20Sopenharmony_ci HDMI_PLLPWRCMD_BOTHON_ALLCLKS = 2, 848c2ecf20Sopenharmony_ci HDMI_PLLPWRCMD_BOTHON_NOPHYCLK = 3 858c2ecf20Sopenharmony_ci}; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cienum hdmi_phy_pwr { 888c2ecf20Sopenharmony_ci HDMI_PHYPWRCMD_OFF = 0, 898c2ecf20Sopenharmony_ci HDMI_PHYPWRCMD_LDOON = 1, 908c2ecf20Sopenharmony_ci HDMI_PHYPWRCMD_TXON = 2 918c2ecf20Sopenharmony_ci}; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cienum hdmi_core_hdmi_dvi { 948c2ecf20Sopenharmony_ci HDMI_DVI = 0, 958c2ecf20Sopenharmony_ci HDMI_HDMI = 1 968c2ecf20Sopenharmony_ci}; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cienum hdmi_packing_mode { 998c2ecf20Sopenharmony_ci HDMI_PACK_10b_RGB_YUV444 = 0, 1008c2ecf20Sopenharmony_ci HDMI_PACK_24b_RGB_YUV444_YUV422 = 1, 1018c2ecf20Sopenharmony_ci HDMI_PACK_20b_YUV422 = 2, 1028c2ecf20Sopenharmony_ci HDMI_PACK_ALREADYPACKED = 7 1038c2ecf20Sopenharmony_ci}; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cienum hdmi_stereo_channels { 1068c2ecf20Sopenharmony_ci HDMI_AUDIO_STEREO_NOCHANNELS = 0, 1078c2ecf20Sopenharmony_ci HDMI_AUDIO_STEREO_ONECHANNEL = 1, 1088c2ecf20Sopenharmony_ci HDMI_AUDIO_STEREO_TWOCHANNELS = 2, 1098c2ecf20Sopenharmony_ci HDMI_AUDIO_STEREO_THREECHANNELS = 3, 1108c2ecf20Sopenharmony_ci HDMI_AUDIO_STEREO_FOURCHANNELS = 4 1118c2ecf20Sopenharmony_ci}; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cienum hdmi_audio_type { 1148c2ecf20Sopenharmony_ci HDMI_AUDIO_TYPE_LPCM = 0, 1158c2ecf20Sopenharmony_ci HDMI_AUDIO_TYPE_IEC = 1 1168c2ecf20Sopenharmony_ci}; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_cienum hdmi_audio_justify { 1198c2ecf20Sopenharmony_ci HDMI_AUDIO_JUSTIFY_LEFT = 0, 1208c2ecf20Sopenharmony_ci HDMI_AUDIO_JUSTIFY_RIGHT = 1 1218c2ecf20Sopenharmony_ci}; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_cienum hdmi_audio_sample_order { 1248c2ecf20Sopenharmony_ci HDMI_AUDIO_SAMPLE_RIGHT_FIRST = 0, 1258c2ecf20Sopenharmony_ci HDMI_AUDIO_SAMPLE_LEFT_FIRST = 1 1268c2ecf20Sopenharmony_ci}; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_cienum hdmi_audio_samples_perword { 1298c2ecf20Sopenharmony_ci HDMI_AUDIO_ONEWORD_ONESAMPLE = 0, 1308c2ecf20Sopenharmony_ci HDMI_AUDIO_ONEWORD_TWOSAMPLES = 1 1318c2ecf20Sopenharmony_ci}; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cienum hdmi_audio_sample_size_omap { 1348c2ecf20Sopenharmony_ci HDMI_AUDIO_SAMPLE_16BITS = 0, 1358c2ecf20Sopenharmony_ci HDMI_AUDIO_SAMPLE_24BITS = 1 1368c2ecf20Sopenharmony_ci}; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_cienum hdmi_audio_transf_mode { 1398c2ecf20Sopenharmony_ci HDMI_AUDIO_TRANSF_DMA = 0, 1408c2ecf20Sopenharmony_ci HDMI_AUDIO_TRANSF_IRQ = 1 1418c2ecf20Sopenharmony_ci}; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_cienum hdmi_audio_blk_strt_end_sig { 1448c2ecf20Sopenharmony_ci HDMI_AUDIO_BLOCK_SIG_STARTEND_ON = 0, 1458c2ecf20Sopenharmony_ci HDMI_AUDIO_BLOCK_SIG_STARTEND_OFF = 1 1468c2ecf20Sopenharmony_ci}; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_cienum hdmi_core_audio_layout { 1498c2ecf20Sopenharmony_ci HDMI_AUDIO_LAYOUT_2CH = 0, 1508c2ecf20Sopenharmony_ci HDMI_AUDIO_LAYOUT_8CH = 1, 1518c2ecf20Sopenharmony_ci HDMI_AUDIO_LAYOUT_6CH = 2 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_cienum hdmi_core_cts_mode { 1558c2ecf20Sopenharmony_ci HDMI_AUDIO_CTS_MODE_HW = 0, 1568c2ecf20Sopenharmony_ci HDMI_AUDIO_CTS_MODE_SW = 1 1578c2ecf20Sopenharmony_ci}; 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_cienum hdmi_audio_mclk_mode { 1608c2ecf20Sopenharmony_ci HDMI_AUDIO_MCLK_128FS = 0, 1618c2ecf20Sopenharmony_ci HDMI_AUDIO_MCLK_256FS = 1, 1628c2ecf20Sopenharmony_ci HDMI_AUDIO_MCLK_384FS = 2, 1638c2ecf20Sopenharmony_ci HDMI_AUDIO_MCLK_512FS = 3, 1648c2ecf20Sopenharmony_ci HDMI_AUDIO_MCLK_768FS = 4, 1658c2ecf20Sopenharmony_ci HDMI_AUDIO_MCLK_1024FS = 5, 1668c2ecf20Sopenharmony_ci HDMI_AUDIO_MCLK_1152FS = 6, 1678c2ecf20Sopenharmony_ci HDMI_AUDIO_MCLK_192FS = 7 1688c2ecf20Sopenharmony_ci}; 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_cistruct hdmi_video_format { 1718c2ecf20Sopenharmony_ci enum hdmi_packing_mode packing_mode; 1728c2ecf20Sopenharmony_ci u32 y_res; /* Line per panel */ 1738c2ecf20Sopenharmony_ci u32 x_res; /* pixel per line */ 1748c2ecf20Sopenharmony_ci}; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_cistruct hdmi_config { 1778c2ecf20Sopenharmony_ci struct videomode vm; 1788c2ecf20Sopenharmony_ci struct hdmi_avi_infoframe infoframe; 1798c2ecf20Sopenharmony_ci enum hdmi_core_hdmi_dvi hdmi_dvi_mode; 1808c2ecf20Sopenharmony_ci}; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_cistruct hdmi_audio_format { 1838c2ecf20Sopenharmony_ci enum hdmi_stereo_channels stereo_channels; 1848c2ecf20Sopenharmony_ci u8 active_chnnls_msk; 1858c2ecf20Sopenharmony_ci enum hdmi_audio_type type; 1868c2ecf20Sopenharmony_ci enum hdmi_audio_justify justification; 1878c2ecf20Sopenharmony_ci enum hdmi_audio_sample_order sample_order; 1888c2ecf20Sopenharmony_ci enum hdmi_audio_samples_perword samples_per_word; 1898c2ecf20Sopenharmony_ci enum hdmi_audio_sample_size_omap sample_size; 1908c2ecf20Sopenharmony_ci enum hdmi_audio_blk_strt_end_sig en_sig_blk_strt_end; 1918c2ecf20Sopenharmony_ci}; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_cistruct hdmi_audio_dma { 1948c2ecf20Sopenharmony_ci u8 transfer_size; 1958c2ecf20Sopenharmony_ci u8 block_size; 1968c2ecf20Sopenharmony_ci enum hdmi_audio_transf_mode mode; 1978c2ecf20Sopenharmony_ci u16 fifo_threshold; 1988c2ecf20Sopenharmony_ci}; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_cistruct hdmi_core_audio_i2s_config { 2018c2ecf20Sopenharmony_ci u8 in_length_bits; 2028c2ecf20Sopenharmony_ci u8 justification; 2038c2ecf20Sopenharmony_ci u8 sck_edge_mode; 2048c2ecf20Sopenharmony_ci u8 vbit; 2058c2ecf20Sopenharmony_ci u8 direction; 2068c2ecf20Sopenharmony_ci u8 shift; 2078c2ecf20Sopenharmony_ci u8 active_sds; 2088c2ecf20Sopenharmony_ci}; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_cistruct hdmi_core_audio_config { 2118c2ecf20Sopenharmony_ci struct hdmi_core_audio_i2s_config i2s_cfg; 2128c2ecf20Sopenharmony_ci struct snd_aes_iec958 *iec60958_cfg; 2138c2ecf20Sopenharmony_ci bool fs_override; 2148c2ecf20Sopenharmony_ci u32 n; 2158c2ecf20Sopenharmony_ci u32 cts; 2168c2ecf20Sopenharmony_ci u32 aud_par_busclk; 2178c2ecf20Sopenharmony_ci enum hdmi_core_audio_layout layout; 2188c2ecf20Sopenharmony_ci enum hdmi_core_cts_mode cts_mode; 2198c2ecf20Sopenharmony_ci bool use_mclk; 2208c2ecf20Sopenharmony_ci enum hdmi_audio_mclk_mode mclk_mode; 2218c2ecf20Sopenharmony_ci bool en_acr_pkt; 2228c2ecf20Sopenharmony_ci bool en_dsd_audio; 2238c2ecf20Sopenharmony_ci bool en_parallel_aud_input; 2248c2ecf20Sopenharmony_ci bool en_spdif; 2258c2ecf20Sopenharmony_ci}; 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_cistruct hdmi_wp_data { 2288c2ecf20Sopenharmony_ci void __iomem *base; 2298c2ecf20Sopenharmony_ci phys_addr_t phys_base; 2308c2ecf20Sopenharmony_ci unsigned int version; 2318c2ecf20Sopenharmony_ci}; 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_cistruct hdmi_pll_data { 2348c2ecf20Sopenharmony_ci struct dss_pll pll; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci void __iomem *base; 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci struct platform_device *pdev; 2398c2ecf20Sopenharmony_ci struct hdmi_wp_data *wp; 2408c2ecf20Sopenharmony_ci}; 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_cistruct hdmi_phy_features { 2438c2ecf20Sopenharmony_ci bool bist_ctrl; 2448c2ecf20Sopenharmony_ci bool ldo_voltage; 2458c2ecf20Sopenharmony_ci unsigned long max_phy; 2468c2ecf20Sopenharmony_ci}; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_cistruct hdmi_phy_data { 2498c2ecf20Sopenharmony_ci void __iomem *base; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci const struct hdmi_phy_features *features; 2528c2ecf20Sopenharmony_ci u8 lane_function[4]; 2538c2ecf20Sopenharmony_ci u8 lane_polarity[4]; 2548c2ecf20Sopenharmony_ci}; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_cistruct hdmi_core_data { 2578c2ecf20Sopenharmony_ci void __iomem *base; 2588c2ecf20Sopenharmony_ci bool cts_swmode; 2598c2ecf20Sopenharmony_ci bool audio_use_mclk; 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci struct hdmi_wp_data *wp; 2628c2ecf20Sopenharmony_ci unsigned int core_pwr_cnt; 2638c2ecf20Sopenharmony_ci struct cec_adapter *adap; 2648c2ecf20Sopenharmony_ci}; 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_cistatic inline void hdmi_write_reg(void __iomem *base_addr, const u32 idx, 2678c2ecf20Sopenharmony_ci u32 val) 2688c2ecf20Sopenharmony_ci{ 2698c2ecf20Sopenharmony_ci __raw_writel(val, base_addr + idx); 2708c2ecf20Sopenharmony_ci} 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_cistatic inline u32 hdmi_read_reg(void __iomem *base_addr, const u32 idx) 2738c2ecf20Sopenharmony_ci{ 2748c2ecf20Sopenharmony_ci return __raw_readl(base_addr + idx); 2758c2ecf20Sopenharmony_ci} 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci#define REG_FLD_MOD(base, idx, val, start, end) \ 2788c2ecf20Sopenharmony_ci hdmi_write_reg(base, idx, FLD_MOD(hdmi_read_reg(base, idx),\ 2798c2ecf20Sopenharmony_ci val, start, end)) 2808c2ecf20Sopenharmony_ci#define REG_GET(base, idx, start, end) \ 2818c2ecf20Sopenharmony_ci FLD_GET(hdmi_read_reg(base, idx), start, end) 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_cistatic inline int hdmi_wait_for_bit_change(void __iomem *base_addr, 2848c2ecf20Sopenharmony_ci const u32 idx, int b2, int b1, u32 val) 2858c2ecf20Sopenharmony_ci{ 2868c2ecf20Sopenharmony_ci u32 t = 0, v; 2878c2ecf20Sopenharmony_ci while (val != (v = REG_GET(base_addr, idx, b2, b1))) { 2888c2ecf20Sopenharmony_ci if (t++ > 10000) 2898c2ecf20Sopenharmony_ci return v; 2908c2ecf20Sopenharmony_ci udelay(1); 2918c2ecf20Sopenharmony_ci } 2928c2ecf20Sopenharmony_ci return v; 2938c2ecf20Sopenharmony_ci} 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci/* HDMI wrapper funcs */ 2968c2ecf20Sopenharmony_ciint hdmi_wp_video_start(struct hdmi_wp_data *wp); 2978c2ecf20Sopenharmony_civoid hdmi_wp_video_stop(struct hdmi_wp_data *wp); 2988c2ecf20Sopenharmony_civoid hdmi_wp_dump(struct hdmi_wp_data *wp, struct seq_file *s); 2998c2ecf20Sopenharmony_ciu32 hdmi_wp_get_irqstatus(struct hdmi_wp_data *wp); 3008c2ecf20Sopenharmony_civoid hdmi_wp_set_irqstatus(struct hdmi_wp_data *wp, u32 irqstatus); 3018c2ecf20Sopenharmony_civoid hdmi_wp_set_irqenable(struct hdmi_wp_data *wp, u32 mask); 3028c2ecf20Sopenharmony_civoid hdmi_wp_clear_irqenable(struct hdmi_wp_data *wp, u32 mask); 3038c2ecf20Sopenharmony_ciint hdmi_wp_set_phy_pwr(struct hdmi_wp_data *wp, enum hdmi_phy_pwr val); 3048c2ecf20Sopenharmony_ciint hdmi_wp_set_pll_pwr(struct hdmi_wp_data *wp, enum hdmi_pll_pwr val); 3058c2ecf20Sopenharmony_civoid hdmi_wp_video_config_format(struct hdmi_wp_data *wp, 3068c2ecf20Sopenharmony_ci const struct hdmi_video_format *video_fmt); 3078c2ecf20Sopenharmony_civoid hdmi_wp_video_config_interface(struct hdmi_wp_data *wp, 3088c2ecf20Sopenharmony_ci const struct videomode *vm); 3098c2ecf20Sopenharmony_civoid hdmi_wp_video_config_timing(struct hdmi_wp_data *wp, 3108c2ecf20Sopenharmony_ci const struct videomode *vm); 3118c2ecf20Sopenharmony_civoid hdmi_wp_init_vid_fmt_timings(struct hdmi_video_format *video_fmt, 3128c2ecf20Sopenharmony_ci struct videomode *vm, const struct hdmi_config *param); 3138c2ecf20Sopenharmony_ciint hdmi_wp_init(struct platform_device *pdev, struct hdmi_wp_data *wp, 3148c2ecf20Sopenharmony_ci unsigned int version); 3158c2ecf20Sopenharmony_ciphys_addr_t hdmi_wp_get_audio_dma_addr(struct hdmi_wp_data *wp); 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci/* HDMI PLL funcs */ 3188c2ecf20Sopenharmony_civoid hdmi_pll_dump(struct hdmi_pll_data *pll, struct seq_file *s); 3198c2ecf20Sopenharmony_ciint hdmi_pll_init(struct dss_device *dss, struct platform_device *pdev, 3208c2ecf20Sopenharmony_ci struct hdmi_pll_data *pll, struct hdmi_wp_data *wp); 3218c2ecf20Sopenharmony_civoid hdmi_pll_uninit(struct hdmi_pll_data *hpll); 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci/* HDMI PHY funcs */ 3248c2ecf20Sopenharmony_ciint hdmi_phy_configure(struct hdmi_phy_data *phy, unsigned long hfbitclk, 3258c2ecf20Sopenharmony_ci unsigned long lfbitclk); 3268c2ecf20Sopenharmony_civoid hdmi_phy_dump(struct hdmi_phy_data *phy, struct seq_file *s); 3278c2ecf20Sopenharmony_ciint hdmi_phy_init(struct platform_device *pdev, struct hdmi_phy_data *phy, 3288c2ecf20Sopenharmony_ci unsigned int version); 3298c2ecf20Sopenharmony_ciint hdmi_phy_parse_lanes(struct hdmi_phy_data *phy, const u32 *lanes); 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci/* HDMI common funcs */ 3328c2ecf20Sopenharmony_ciint hdmi_parse_lanes_of(struct platform_device *pdev, struct device_node *ep, 3338c2ecf20Sopenharmony_ci struct hdmi_phy_data *phy); 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci/* Audio funcs */ 3368c2ecf20Sopenharmony_ciint hdmi_compute_acr(u32 pclk, u32 sample_freq, u32 *n, u32 *cts); 3378c2ecf20Sopenharmony_ciint hdmi_wp_audio_enable(struct hdmi_wp_data *wp, bool enable); 3388c2ecf20Sopenharmony_ciint hdmi_wp_audio_core_req_enable(struct hdmi_wp_data *wp, bool enable); 3398c2ecf20Sopenharmony_civoid hdmi_wp_audio_config_format(struct hdmi_wp_data *wp, 3408c2ecf20Sopenharmony_ci struct hdmi_audio_format *aud_fmt); 3418c2ecf20Sopenharmony_civoid hdmi_wp_audio_config_dma(struct hdmi_wp_data *wp, 3428c2ecf20Sopenharmony_ci struct hdmi_audio_dma *aud_dma); 3438c2ecf20Sopenharmony_cistatic inline bool hdmi_mode_has_audio(struct hdmi_config *cfg) 3448c2ecf20Sopenharmony_ci{ 3458c2ecf20Sopenharmony_ci return cfg->hdmi_dvi_mode == HDMI_HDMI ? true : false; 3468c2ecf20Sopenharmony_ci} 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_ci/* HDMI DRV data */ 3498c2ecf20Sopenharmony_cistruct omap_hdmi { 3508c2ecf20Sopenharmony_ci struct mutex lock; 3518c2ecf20Sopenharmony_ci struct platform_device *pdev; 3528c2ecf20Sopenharmony_ci struct dss_device *dss; 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ci struct dss_debugfs_entry *debugfs; 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci struct hdmi_wp_data wp; 3578c2ecf20Sopenharmony_ci struct hdmi_pll_data pll; 3588c2ecf20Sopenharmony_ci struct hdmi_phy_data phy; 3598c2ecf20Sopenharmony_ci struct hdmi_core_data core; 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci struct hdmi_config cfg; 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ci struct regulator *vdda_reg; 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci bool core_enabled; 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ci struct omap_dss_device output; 3688c2ecf20Sopenharmony_ci struct drm_bridge bridge; 3698c2ecf20Sopenharmony_ci 3708c2ecf20Sopenharmony_ci struct platform_device *audio_pdev; 3718c2ecf20Sopenharmony_ci void (*audio_abort_cb)(struct device *dev); 3728c2ecf20Sopenharmony_ci int wp_idlemode; 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci bool audio_configured; 3758c2ecf20Sopenharmony_ci struct omap_dss_audio audio_config; 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci /* This lock should be taken when booleans below are touched. */ 3788c2ecf20Sopenharmony_ci spinlock_t audio_playing_lock; 3798c2ecf20Sopenharmony_ci bool audio_playing; 3808c2ecf20Sopenharmony_ci bool display_enabled; 3818c2ecf20Sopenharmony_ci}; 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci#define drm_bridge_to_hdmi(b) container_of(b, struct omap_hdmi, bridge) 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ci#endif 386