162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * HDMI driver definition for TI OMAP4 Processor. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com/ 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _HDMI_H 962306a36Sopenharmony_ci#define _HDMI_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/delay.h> 1262306a36Sopenharmony_ci#include <linux/io.h> 1362306a36Sopenharmony_ci#include <linux/platform_device.h> 1462306a36Sopenharmony_ci#include <linux/hdmi.h> 1562306a36Sopenharmony_ci#include <sound/omap-hdmi-audio.h> 1662306a36Sopenharmony_ci#include <media/cec.h> 1762306a36Sopenharmony_ci#include <drm/drm_bridge.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include "omapdss.h" 2062306a36Sopenharmony_ci#include "dss.h" 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistruct dss_device; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* HDMI Wrapper */ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define HDMI_WP_REVISION 0x0 2762306a36Sopenharmony_ci#define HDMI_WP_SYSCONFIG 0x10 2862306a36Sopenharmony_ci#define HDMI_WP_IRQSTATUS_RAW 0x24 2962306a36Sopenharmony_ci#define HDMI_WP_IRQSTATUS 0x28 3062306a36Sopenharmony_ci#define HDMI_WP_IRQENABLE_SET 0x2C 3162306a36Sopenharmony_ci#define HDMI_WP_IRQENABLE_CLR 0x30 3262306a36Sopenharmony_ci#define HDMI_WP_IRQWAKEEN 0x34 3362306a36Sopenharmony_ci#define HDMI_WP_PWR_CTRL 0x40 3462306a36Sopenharmony_ci#define HDMI_WP_DEBOUNCE 0x44 3562306a36Sopenharmony_ci#define HDMI_WP_VIDEO_CFG 0x50 3662306a36Sopenharmony_ci#define HDMI_WP_VIDEO_SIZE 0x60 3762306a36Sopenharmony_ci#define HDMI_WP_VIDEO_TIMING_H 0x68 3862306a36Sopenharmony_ci#define HDMI_WP_VIDEO_TIMING_V 0x6C 3962306a36Sopenharmony_ci#define HDMI_WP_CLK 0x70 4062306a36Sopenharmony_ci#define HDMI_WP_AUDIO_CFG 0x80 4162306a36Sopenharmony_ci#define HDMI_WP_AUDIO_CFG2 0x84 4262306a36Sopenharmony_ci#define HDMI_WP_AUDIO_CTRL 0x88 4362306a36Sopenharmony_ci#define HDMI_WP_AUDIO_DATA 0x8C 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* HDMI WP IRQ flags */ 4662306a36Sopenharmony_ci#define HDMI_IRQ_CORE (1 << 0) 4762306a36Sopenharmony_ci#define HDMI_IRQ_OCP_TIMEOUT (1 << 4) 4862306a36Sopenharmony_ci#define HDMI_IRQ_AUDIO_FIFO_UNDERFLOW (1 << 8) 4962306a36Sopenharmony_ci#define HDMI_IRQ_AUDIO_FIFO_OVERFLOW (1 << 9) 5062306a36Sopenharmony_ci#define HDMI_IRQ_AUDIO_FIFO_SAMPLE_REQ (1 << 10) 5162306a36Sopenharmony_ci#define HDMI_IRQ_VIDEO_VSYNC (1 << 16) 5262306a36Sopenharmony_ci#define HDMI_IRQ_VIDEO_FRAME_DONE (1 << 17) 5362306a36Sopenharmony_ci#define HDMI_IRQ_PHY_LINE5V_ASSERT (1 << 24) 5462306a36Sopenharmony_ci#define HDMI_IRQ_LINK_CONNECT (1 << 25) 5562306a36Sopenharmony_ci#define HDMI_IRQ_LINK_DISCONNECT (1 << 26) 5662306a36Sopenharmony_ci#define HDMI_IRQ_PLL_LOCK (1 << 29) 5762306a36Sopenharmony_ci#define HDMI_IRQ_PLL_UNLOCK (1 << 30) 5862306a36Sopenharmony_ci#define HDMI_IRQ_PLL_RECAL (1 << 31) 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/* HDMI PLL */ 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci#define PLLCTRL_PLL_CONTROL 0x0 6362306a36Sopenharmony_ci#define PLLCTRL_PLL_STATUS 0x4 6462306a36Sopenharmony_ci#define PLLCTRL_PLL_GO 0x8 6562306a36Sopenharmony_ci#define PLLCTRL_CFG1 0xC 6662306a36Sopenharmony_ci#define PLLCTRL_CFG2 0x10 6762306a36Sopenharmony_ci#define PLLCTRL_CFG3 0x14 6862306a36Sopenharmony_ci#define PLLCTRL_SSC_CFG1 0x18 6962306a36Sopenharmony_ci#define PLLCTRL_SSC_CFG2 0x1C 7062306a36Sopenharmony_ci#define PLLCTRL_CFG4 0x20 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* HDMI PHY */ 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define HDMI_TXPHY_TX_CTRL 0x0 7562306a36Sopenharmony_ci#define HDMI_TXPHY_DIGITAL_CTRL 0x4 7662306a36Sopenharmony_ci#define HDMI_TXPHY_POWER_CTRL 0x8 7762306a36Sopenharmony_ci#define HDMI_TXPHY_PAD_CFG_CTRL 0xC 7862306a36Sopenharmony_ci#define HDMI_TXPHY_BIST_CONTROL 0x1C 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cienum hdmi_pll_pwr { 8162306a36Sopenharmony_ci HDMI_PLLPWRCMD_ALLOFF = 0, 8262306a36Sopenharmony_ci HDMI_PLLPWRCMD_PLLONLY = 1, 8362306a36Sopenharmony_ci HDMI_PLLPWRCMD_BOTHON_ALLCLKS = 2, 8462306a36Sopenharmony_ci HDMI_PLLPWRCMD_BOTHON_NOPHYCLK = 3 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cienum hdmi_phy_pwr { 8862306a36Sopenharmony_ci HDMI_PHYPWRCMD_OFF = 0, 8962306a36Sopenharmony_ci HDMI_PHYPWRCMD_LDOON = 1, 9062306a36Sopenharmony_ci HDMI_PHYPWRCMD_TXON = 2 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cienum hdmi_core_hdmi_dvi { 9462306a36Sopenharmony_ci HDMI_DVI = 0, 9562306a36Sopenharmony_ci HDMI_HDMI = 1 9662306a36Sopenharmony_ci}; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cienum hdmi_packing_mode { 9962306a36Sopenharmony_ci HDMI_PACK_10b_RGB_YUV444 = 0, 10062306a36Sopenharmony_ci HDMI_PACK_24b_RGB_YUV444_YUV422 = 1, 10162306a36Sopenharmony_ci HDMI_PACK_20b_YUV422 = 2, 10262306a36Sopenharmony_ci HDMI_PACK_ALREADYPACKED = 7 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cienum hdmi_stereo_channels { 10662306a36Sopenharmony_ci HDMI_AUDIO_STEREO_NOCHANNELS = 0, 10762306a36Sopenharmony_ci HDMI_AUDIO_STEREO_ONECHANNEL = 1, 10862306a36Sopenharmony_ci HDMI_AUDIO_STEREO_TWOCHANNELS = 2, 10962306a36Sopenharmony_ci HDMI_AUDIO_STEREO_THREECHANNELS = 3, 11062306a36Sopenharmony_ci HDMI_AUDIO_STEREO_FOURCHANNELS = 4 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cienum hdmi_audio_type { 11462306a36Sopenharmony_ci HDMI_AUDIO_TYPE_LPCM = 0, 11562306a36Sopenharmony_ci HDMI_AUDIO_TYPE_IEC = 1 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cienum hdmi_audio_justify { 11962306a36Sopenharmony_ci HDMI_AUDIO_JUSTIFY_LEFT = 0, 12062306a36Sopenharmony_ci HDMI_AUDIO_JUSTIFY_RIGHT = 1 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cienum hdmi_audio_sample_order { 12462306a36Sopenharmony_ci HDMI_AUDIO_SAMPLE_RIGHT_FIRST = 0, 12562306a36Sopenharmony_ci HDMI_AUDIO_SAMPLE_LEFT_FIRST = 1 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cienum hdmi_audio_samples_perword { 12962306a36Sopenharmony_ci HDMI_AUDIO_ONEWORD_ONESAMPLE = 0, 13062306a36Sopenharmony_ci HDMI_AUDIO_ONEWORD_TWOSAMPLES = 1 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cienum hdmi_audio_sample_size_omap { 13462306a36Sopenharmony_ci HDMI_AUDIO_SAMPLE_16BITS = 0, 13562306a36Sopenharmony_ci HDMI_AUDIO_SAMPLE_24BITS = 1 13662306a36Sopenharmony_ci}; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cienum hdmi_audio_transf_mode { 13962306a36Sopenharmony_ci HDMI_AUDIO_TRANSF_DMA = 0, 14062306a36Sopenharmony_ci HDMI_AUDIO_TRANSF_IRQ = 1 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cienum hdmi_audio_blk_strt_end_sig { 14462306a36Sopenharmony_ci HDMI_AUDIO_BLOCK_SIG_STARTEND_ON = 0, 14562306a36Sopenharmony_ci HDMI_AUDIO_BLOCK_SIG_STARTEND_OFF = 1 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cienum hdmi_core_audio_layout { 14962306a36Sopenharmony_ci HDMI_AUDIO_LAYOUT_2CH = 0, 15062306a36Sopenharmony_ci HDMI_AUDIO_LAYOUT_8CH = 1, 15162306a36Sopenharmony_ci HDMI_AUDIO_LAYOUT_6CH = 2 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cienum hdmi_core_cts_mode { 15562306a36Sopenharmony_ci HDMI_AUDIO_CTS_MODE_HW = 0, 15662306a36Sopenharmony_ci HDMI_AUDIO_CTS_MODE_SW = 1 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cienum hdmi_audio_mclk_mode { 16062306a36Sopenharmony_ci HDMI_AUDIO_MCLK_128FS = 0, 16162306a36Sopenharmony_ci HDMI_AUDIO_MCLK_256FS = 1, 16262306a36Sopenharmony_ci HDMI_AUDIO_MCLK_384FS = 2, 16362306a36Sopenharmony_ci HDMI_AUDIO_MCLK_512FS = 3, 16462306a36Sopenharmony_ci HDMI_AUDIO_MCLK_768FS = 4, 16562306a36Sopenharmony_ci HDMI_AUDIO_MCLK_1024FS = 5, 16662306a36Sopenharmony_ci HDMI_AUDIO_MCLK_1152FS = 6, 16762306a36Sopenharmony_ci HDMI_AUDIO_MCLK_192FS = 7 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistruct hdmi_video_format { 17162306a36Sopenharmony_ci enum hdmi_packing_mode packing_mode; 17262306a36Sopenharmony_ci u32 y_res; /* Line per panel */ 17362306a36Sopenharmony_ci u32 x_res; /* pixel per line */ 17462306a36Sopenharmony_ci}; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistruct hdmi_config { 17762306a36Sopenharmony_ci struct videomode vm; 17862306a36Sopenharmony_ci struct hdmi_avi_infoframe infoframe; 17962306a36Sopenharmony_ci enum hdmi_core_hdmi_dvi hdmi_dvi_mode; 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistruct hdmi_audio_format { 18362306a36Sopenharmony_ci enum hdmi_stereo_channels stereo_channels; 18462306a36Sopenharmony_ci u8 active_chnnls_msk; 18562306a36Sopenharmony_ci enum hdmi_audio_type type; 18662306a36Sopenharmony_ci enum hdmi_audio_justify justification; 18762306a36Sopenharmony_ci enum hdmi_audio_sample_order sample_order; 18862306a36Sopenharmony_ci enum hdmi_audio_samples_perword samples_per_word; 18962306a36Sopenharmony_ci enum hdmi_audio_sample_size_omap sample_size; 19062306a36Sopenharmony_ci enum hdmi_audio_blk_strt_end_sig en_sig_blk_strt_end; 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cistruct hdmi_audio_dma { 19462306a36Sopenharmony_ci u8 transfer_size; 19562306a36Sopenharmony_ci u8 block_size; 19662306a36Sopenharmony_ci enum hdmi_audio_transf_mode mode; 19762306a36Sopenharmony_ci u16 fifo_threshold; 19862306a36Sopenharmony_ci}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistruct hdmi_core_audio_i2s_config { 20162306a36Sopenharmony_ci u8 in_length_bits; 20262306a36Sopenharmony_ci u8 justification; 20362306a36Sopenharmony_ci u8 sck_edge_mode; 20462306a36Sopenharmony_ci u8 vbit; 20562306a36Sopenharmony_ci u8 direction; 20662306a36Sopenharmony_ci u8 shift; 20762306a36Sopenharmony_ci u8 active_sds; 20862306a36Sopenharmony_ci}; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistruct hdmi_core_audio_config { 21162306a36Sopenharmony_ci struct hdmi_core_audio_i2s_config i2s_cfg; 21262306a36Sopenharmony_ci struct snd_aes_iec958 *iec60958_cfg; 21362306a36Sopenharmony_ci bool fs_override; 21462306a36Sopenharmony_ci u32 n; 21562306a36Sopenharmony_ci u32 cts; 21662306a36Sopenharmony_ci u32 aud_par_busclk; 21762306a36Sopenharmony_ci enum hdmi_core_audio_layout layout; 21862306a36Sopenharmony_ci enum hdmi_core_cts_mode cts_mode; 21962306a36Sopenharmony_ci bool use_mclk; 22062306a36Sopenharmony_ci enum hdmi_audio_mclk_mode mclk_mode; 22162306a36Sopenharmony_ci bool en_acr_pkt; 22262306a36Sopenharmony_ci bool en_dsd_audio; 22362306a36Sopenharmony_ci bool en_parallel_aud_input; 22462306a36Sopenharmony_ci bool en_spdif; 22562306a36Sopenharmony_ci}; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_cistruct hdmi_wp_data { 22862306a36Sopenharmony_ci void __iomem *base; 22962306a36Sopenharmony_ci phys_addr_t phys_base; 23062306a36Sopenharmony_ci unsigned int version; 23162306a36Sopenharmony_ci}; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistruct hdmi_pll_data { 23462306a36Sopenharmony_ci struct dss_pll pll; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci void __iomem *base; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci struct platform_device *pdev; 23962306a36Sopenharmony_ci struct hdmi_wp_data *wp; 24062306a36Sopenharmony_ci}; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistruct hdmi_phy_features { 24362306a36Sopenharmony_ci bool bist_ctrl; 24462306a36Sopenharmony_ci bool ldo_voltage; 24562306a36Sopenharmony_ci unsigned long max_phy; 24662306a36Sopenharmony_ci}; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistruct hdmi_phy_data { 24962306a36Sopenharmony_ci void __iomem *base; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci const struct hdmi_phy_features *features; 25262306a36Sopenharmony_ci u8 lane_function[4]; 25362306a36Sopenharmony_ci u8 lane_polarity[4]; 25462306a36Sopenharmony_ci}; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_cistruct hdmi_core_data { 25762306a36Sopenharmony_ci void __iomem *base; 25862306a36Sopenharmony_ci bool cts_swmode; 25962306a36Sopenharmony_ci bool audio_use_mclk; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci struct hdmi_wp_data *wp; 26262306a36Sopenharmony_ci unsigned int core_pwr_cnt; 26362306a36Sopenharmony_ci struct cec_adapter *adap; 26462306a36Sopenharmony_ci}; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_cistatic inline void hdmi_write_reg(void __iomem *base_addr, const u32 idx, 26762306a36Sopenharmony_ci u32 val) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci __raw_writel(val, base_addr + idx); 27062306a36Sopenharmony_ci} 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cistatic inline u32 hdmi_read_reg(void __iomem *base_addr, const u32 idx) 27362306a36Sopenharmony_ci{ 27462306a36Sopenharmony_ci return __raw_readl(base_addr + idx); 27562306a36Sopenharmony_ci} 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci#define REG_FLD_MOD(base, idx, val, start, end) \ 27862306a36Sopenharmony_ci hdmi_write_reg(base, idx, FLD_MOD(hdmi_read_reg(base, idx),\ 27962306a36Sopenharmony_ci val, start, end)) 28062306a36Sopenharmony_ci#define REG_GET(base, idx, start, end) \ 28162306a36Sopenharmony_ci FLD_GET(hdmi_read_reg(base, idx), start, end) 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_cistatic inline int hdmi_wait_for_bit_change(void __iomem *base_addr, 28462306a36Sopenharmony_ci const u32 idx, int b2, int b1, u32 val) 28562306a36Sopenharmony_ci{ 28662306a36Sopenharmony_ci u32 t = 0, v; 28762306a36Sopenharmony_ci while (val != (v = REG_GET(base_addr, idx, b2, b1))) { 28862306a36Sopenharmony_ci if (t++ > 10000) 28962306a36Sopenharmony_ci return v; 29062306a36Sopenharmony_ci udelay(1); 29162306a36Sopenharmony_ci } 29262306a36Sopenharmony_ci return v; 29362306a36Sopenharmony_ci} 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci/* HDMI wrapper funcs */ 29662306a36Sopenharmony_ciint hdmi_wp_video_start(struct hdmi_wp_data *wp); 29762306a36Sopenharmony_civoid hdmi_wp_video_stop(struct hdmi_wp_data *wp); 29862306a36Sopenharmony_civoid hdmi_wp_dump(struct hdmi_wp_data *wp, struct seq_file *s); 29962306a36Sopenharmony_ciu32 hdmi_wp_get_irqstatus(struct hdmi_wp_data *wp); 30062306a36Sopenharmony_civoid hdmi_wp_set_irqstatus(struct hdmi_wp_data *wp, u32 irqstatus); 30162306a36Sopenharmony_civoid hdmi_wp_set_irqenable(struct hdmi_wp_data *wp, u32 mask); 30262306a36Sopenharmony_civoid hdmi_wp_clear_irqenable(struct hdmi_wp_data *wp, u32 mask); 30362306a36Sopenharmony_ciint hdmi_wp_set_phy_pwr(struct hdmi_wp_data *wp, enum hdmi_phy_pwr val); 30462306a36Sopenharmony_ciint hdmi_wp_set_pll_pwr(struct hdmi_wp_data *wp, enum hdmi_pll_pwr val); 30562306a36Sopenharmony_civoid hdmi_wp_video_config_format(struct hdmi_wp_data *wp, 30662306a36Sopenharmony_ci const struct hdmi_video_format *video_fmt); 30762306a36Sopenharmony_civoid hdmi_wp_video_config_interface(struct hdmi_wp_data *wp, 30862306a36Sopenharmony_ci const struct videomode *vm); 30962306a36Sopenharmony_civoid hdmi_wp_video_config_timing(struct hdmi_wp_data *wp, 31062306a36Sopenharmony_ci const struct videomode *vm); 31162306a36Sopenharmony_civoid hdmi_wp_init_vid_fmt_timings(struct hdmi_video_format *video_fmt, 31262306a36Sopenharmony_ci struct videomode *vm, const struct hdmi_config *param); 31362306a36Sopenharmony_ciint hdmi_wp_init(struct platform_device *pdev, struct hdmi_wp_data *wp, 31462306a36Sopenharmony_ci unsigned int version); 31562306a36Sopenharmony_ciphys_addr_t hdmi_wp_get_audio_dma_addr(struct hdmi_wp_data *wp); 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci/* HDMI PLL funcs */ 31862306a36Sopenharmony_civoid hdmi_pll_dump(struct hdmi_pll_data *pll, struct seq_file *s); 31962306a36Sopenharmony_ciint hdmi_pll_init(struct dss_device *dss, struct platform_device *pdev, 32062306a36Sopenharmony_ci struct hdmi_pll_data *pll, struct hdmi_wp_data *wp); 32162306a36Sopenharmony_civoid hdmi_pll_uninit(struct hdmi_pll_data *hpll); 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci/* HDMI PHY funcs */ 32462306a36Sopenharmony_ciint hdmi_phy_configure(struct hdmi_phy_data *phy, unsigned long hfbitclk, 32562306a36Sopenharmony_ci unsigned long lfbitclk); 32662306a36Sopenharmony_civoid hdmi_phy_dump(struct hdmi_phy_data *phy, struct seq_file *s); 32762306a36Sopenharmony_ciint hdmi_phy_init(struct platform_device *pdev, struct hdmi_phy_data *phy, 32862306a36Sopenharmony_ci unsigned int version); 32962306a36Sopenharmony_ciint hdmi_phy_parse_lanes(struct hdmi_phy_data *phy, const u32 *lanes); 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci/* HDMI common funcs */ 33262306a36Sopenharmony_ciint hdmi_parse_lanes_of(struct platform_device *pdev, struct device_node *ep, 33362306a36Sopenharmony_ci struct hdmi_phy_data *phy); 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci/* Audio funcs */ 33662306a36Sopenharmony_ciint hdmi_compute_acr(u32 pclk, u32 sample_freq, u32 *n, u32 *cts); 33762306a36Sopenharmony_ciint hdmi_wp_audio_enable(struct hdmi_wp_data *wp, bool enable); 33862306a36Sopenharmony_ciint hdmi_wp_audio_core_req_enable(struct hdmi_wp_data *wp, bool enable); 33962306a36Sopenharmony_civoid hdmi_wp_audio_config_format(struct hdmi_wp_data *wp, 34062306a36Sopenharmony_ci struct hdmi_audio_format *aud_fmt); 34162306a36Sopenharmony_civoid hdmi_wp_audio_config_dma(struct hdmi_wp_data *wp, 34262306a36Sopenharmony_ci struct hdmi_audio_dma *aud_dma); 34362306a36Sopenharmony_cistatic inline bool hdmi_mode_has_audio(struct hdmi_config *cfg) 34462306a36Sopenharmony_ci{ 34562306a36Sopenharmony_ci return cfg->hdmi_dvi_mode == HDMI_HDMI ? true : false; 34662306a36Sopenharmony_ci} 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci/* HDMI DRV data */ 34962306a36Sopenharmony_cistruct omap_hdmi { 35062306a36Sopenharmony_ci struct mutex lock; 35162306a36Sopenharmony_ci struct platform_device *pdev; 35262306a36Sopenharmony_ci struct dss_device *dss; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci struct dss_debugfs_entry *debugfs; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci struct hdmi_wp_data wp; 35762306a36Sopenharmony_ci struct hdmi_pll_data pll; 35862306a36Sopenharmony_ci struct hdmi_phy_data phy; 35962306a36Sopenharmony_ci struct hdmi_core_data core; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci struct hdmi_config cfg; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci struct regulator *vdda_reg; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci bool core_enabled; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci struct omap_dss_device output; 36862306a36Sopenharmony_ci struct drm_bridge bridge; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci struct platform_device *audio_pdev; 37162306a36Sopenharmony_ci void (*audio_abort_cb)(struct device *dev); 37262306a36Sopenharmony_ci int wp_idlemode; 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci bool audio_configured; 37562306a36Sopenharmony_ci struct omap_dss_audio audio_config; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci /* This lock should be taken when booleans below are touched. */ 37862306a36Sopenharmony_ci spinlock_t audio_playing_lock; 37962306a36Sopenharmony_ci bool audio_playing; 38062306a36Sopenharmony_ci bool display_enabled; 38162306a36Sopenharmony_ci}; 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci#define drm_bridge_to_hdmi(b) container_of(b, struct omap_hdmi, bridge) 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci#endif 386