162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2011 Freescale Semiconductor, Inc. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __DW_HDMI__ 762306a36Sopenharmony_ci#define __DW_HDMI__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <sound/hdmi-codec.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct drm_display_info; 1262306a36Sopenharmony_cistruct drm_display_mode; 1362306a36Sopenharmony_cistruct drm_encoder; 1462306a36Sopenharmony_cistruct dw_hdmi; 1562306a36Sopenharmony_cistruct platform_device; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/** 1862306a36Sopenharmony_ci * DOC: Supported input formats and encodings 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * Depending on the Hardware configuration of the Controller IP, it supports 2162306a36Sopenharmony_ci * a subset of the following input formats and encodings on its internal 2262306a36Sopenharmony_ci * 48bit bus. 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 2562306a36Sopenharmony_ci * | Format Name | Format Code | Encodings | 2662306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 2762306a36Sopenharmony_ci * | RGB 4:4:4 8bit | ``MEDIA_BUS_FMT_RGB888_1X24`` | ``V4L2_YCBCR_ENC_DEFAULT`` | 2862306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 2962306a36Sopenharmony_ci * | RGB 4:4:4 10bits | ``MEDIA_BUS_FMT_RGB101010_1X30`` | ``V4L2_YCBCR_ENC_DEFAULT`` | 3062306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 3162306a36Sopenharmony_ci * | RGB 4:4:4 12bits | ``MEDIA_BUS_FMT_RGB121212_1X36`` | ``V4L2_YCBCR_ENC_DEFAULT`` | 3262306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 3362306a36Sopenharmony_ci * | RGB 4:4:4 16bits | ``MEDIA_BUS_FMT_RGB161616_1X48`` | ``V4L2_YCBCR_ENC_DEFAULT`` | 3462306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 3562306a36Sopenharmony_ci * | YCbCr 4:4:4 8bit | ``MEDIA_BUS_FMT_YUV8_1X24`` | ``V4L2_YCBCR_ENC_601`` | 3662306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 3762306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_XV601`` | 3862306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_XV709`` | 3962306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 4062306a36Sopenharmony_ci * | YCbCr 4:4:4 10bits | ``MEDIA_BUS_FMT_YUV10_1X30`` | ``V4L2_YCBCR_ENC_601`` | 4162306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 4262306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_XV601`` | 4362306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_XV709`` | 4462306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 4562306a36Sopenharmony_ci * | YCbCr 4:4:4 12bits | ``MEDIA_BUS_FMT_YUV12_1X36`` | ``V4L2_YCBCR_ENC_601`` | 4662306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 4762306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_XV601`` | 4862306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_XV709`` | 4962306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 5062306a36Sopenharmony_ci * | YCbCr 4:4:4 16bits | ``MEDIA_BUS_FMT_YUV16_1X48`` | ``V4L2_YCBCR_ENC_601`` | 5162306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 5262306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_XV601`` | 5362306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_XV709`` | 5462306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 5562306a36Sopenharmony_ci * | YCbCr 4:2:2 8bit | ``MEDIA_BUS_FMT_UYVY8_1X16`` | ``V4L2_YCBCR_ENC_601`` | 5662306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 5762306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 5862306a36Sopenharmony_ci * | YCbCr 4:2:2 10bits | ``MEDIA_BUS_FMT_UYVY10_1X20`` | ``V4L2_YCBCR_ENC_601`` | 5962306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 6062306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 6162306a36Sopenharmony_ci * | YCbCr 4:2:2 12bits | ``MEDIA_BUS_FMT_UYVY12_1X24`` | ``V4L2_YCBCR_ENC_601`` | 6262306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 6362306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 6462306a36Sopenharmony_ci * | YCbCr 4:2:0 8bit | ``MEDIA_BUS_FMT_UYYVYY8_0_5X24`` | ``V4L2_YCBCR_ENC_601`` | 6562306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 6662306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 6762306a36Sopenharmony_ci * | YCbCr 4:2:0 10bits | ``MEDIA_BUS_FMT_UYYVYY10_0_5X30``| ``V4L2_YCBCR_ENC_601`` | 6862306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 6962306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 7062306a36Sopenharmony_ci * | YCbCr 4:2:0 12bits | ``MEDIA_BUS_FMT_UYYVYY12_0_5X36``| ``V4L2_YCBCR_ENC_601`` | 7162306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 7262306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 7362306a36Sopenharmony_ci * | YCbCr 4:2:0 16bits | ``MEDIA_BUS_FMT_UYYVYY16_0_5X48``| ``V4L2_YCBCR_ENC_601`` | 7462306a36Sopenharmony_ci * | | | or ``V4L2_YCBCR_ENC_709`` | 7562306a36Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+ 7662306a36Sopenharmony_ci */ 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cienum { 7962306a36Sopenharmony_ci DW_HDMI_RES_8, 8062306a36Sopenharmony_ci DW_HDMI_RES_10, 8162306a36Sopenharmony_ci DW_HDMI_RES_12, 8262306a36Sopenharmony_ci DW_HDMI_RES_MAX, 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cienum dw_hdmi_phy_type { 8662306a36Sopenharmony_ci DW_HDMI_PHY_DWC_HDMI_TX_PHY = 0x00, 8762306a36Sopenharmony_ci DW_HDMI_PHY_DWC_MHL_PHY_HEAC = 0xb2, 8862306a36Sopenharmony_ci DW_HDMI_PHY_DWC_MHL_PHY = 0xc2, 8962306a36Sopenharmony_ci DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY_HEAC = 0xe2, 9062306a36Sopenharmony_ci DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY = 0xf2, 9162306a36Sopenharmony_ci DW_HDMI_PHY_DWC_HDMI20_TX_PHY = 0xf3, 9262306a36Sopenharmony_ci DW_HDMI_PHY_VENDOR_PHY = 0xfe, 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cistruct dw_hdmi_mpll_config { 9662306a36Sopenharmony_ci unsigned long mpixelclock; 9762306a36Sopenharmony_ci struct { 9862306a36Sopenharmony_ci u16 cpce; 9962306a36Sopenharmony_ci u16 gmp; 10062306a36Sopenharmony_ci } res[DW_HDMI_RES_MAX]; 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistruct dw_hdmi_curr_ctrl { 10462306a36Sopenharmony_ci unsigned long mpixelclock; 10562306a36Sopenharmony_ci u16 curr[DW_HDMI_RES_MAX]; 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistruct dw_hdmi_phy_config { 10962306a36Sopenharmony_ci unsigned long mpixelclock; 11062306a36Sopenharmony_ci u16 sym_ctr; /*clock symbol and transmitter control*/ 11162306a36Sopenharmony_ci u16 term; /*transmission termination value*/ 11262306a36Sopenharmony_ci u16 vlev_ctr; /* voltage level control */ 11362306a36Sopenharmony_ci}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistruct dw_hdmi_phy_ops { 11662306a36Sopenharmony_ci int (*init)(struct dw_hdmi *hdmi, void *data, 11762306a36Sopenharmony_ci const struct drm_display_info *display, 11862306a36Sopenharmony_ci const struct drm_display_mode *mode); 11962306a36Sopenharmony_ci void (*disable)(struct dw_hdmi *hdmi, void *data); 12062306a36Sopenharmony_ci enum drm_connector_status (*read_hpd)(struct dw_hdmi *hdmi, void *data); 12162306a36Sopenharmony_ci void (*update_hpd)(struct dw_hdmi *hdmi, void *data, 12262306a36Sopenharmony_ci bool force, bool disabled, bool rxsense); 12362306a36Sopenharmony_ci void (*setup_hpd)(struct dw_hdmi *hdmi, void *data); 12462306a36Sopenharmony_ci}; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistruct dw_hdmi_plat_data { 12762306a36Sopenharmony_ci struct regmap *regm; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci unsigned int output_port; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci unsigned long input_bus_encoding; 13262306a36Sopenharmony_ci bool use_drm_infoframe; 13362306a36Sopenharmony_ci bool ycbcr_420_allowed; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci /* 13662306a36Sopenharmony_ci * Private data passed to all the .mode_valid() and .configure_phy() 13762306a36Sopenharmony_ci * callback functions. 13862306a36Sopenharmony_ci */ 13962306a36Sopenharmony_ci void *priv_data; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci /* Platform-specific mode validation (optional). */ 14262306a36Sopenharmony_ci enum drm_mode_status (*mode_valid)(struct dw_hdmi *hdmi, void *data, 14362306a36Sopenharmony_ci const struct drm_display_info *info, 14462306a36Sopenharmony_ci const struct drm_display_mode *mode); 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci /* Platform-specific audio enable/disable (optional) */ 14762306a36Sopenharmony_ci void (*enable_audio)(struct dw_hdmi *hdmi, int channel, 14862306a36Sopenharmony_ci int width, int rate, int non_pcm); 14962306a36Sopenharmony_ci void (*disable_audio)(struct dw_hdmi *hdmi); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci /* Vendor PHY support */ 15262306a36Sopenharmony_ci const struct dw_hdmi_phy_ops *phy_ops; 15362306a36Sopenharmony_ci const char *phy_name; 15462306a36Sopenharmony_ci void *phy_data; 15562306a36Sopenharmony_ci unsigned int phy_force_vendor; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci /* Synopsys PHY support */ 15862306a36Sopenharmony_ci const struct dw_hdmi_mpll_config *mpll_cfg; 15962306a36Sopenharmony_ci const struct dw_hdmi_curr_ctrl *cur_ctr; 16062306a36Sopenharmony_ci const struct dw_hdmi_phy_config *phy_config; 16162306a36Sopenharmony_ci int (*configure_phy)(struct dw_hdmi *hdmi, void *data, 16262306a36Sopenharmony_ci unsigned long mpixelclock); 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci unsigned int disable_cec : 1; 16562306a36Sopenharmony_ci}; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cistruct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev, 16862306a36Sopenharmony_ci const struct dw_hdmi_plat_data *plat_data); 16962306a36Sopenharmony_civoid dw_hdmi_remove(struct dw_hdmi *hdmi); 17062306a36Sopenharmony_civoid dw_hdmi_unbind(struct dw_hdmi *hdmi); 17162306a36Sopenharmony_cistruct dw_hdmi *dw_hdmi_bind(struct platform_device *pdev, 17262306a36Sopenharmony_ci struct drm_encoder *encoder, 17362306a36Sopenharmony_ci const struct dw_hdmi_plat_data *plat_data); 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_civoid dw_hdmi_resume(struct dw_hdmi *hdmi); 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_civoid dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense); 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ciint dw_hdmi_set_plugged_cb(struct dw_hdmi *hdmi, hdmi_codec_plugged_cb fn, 18062306a36Sopenharmony_ci struct device *codec_dev); 18162306a36Sopenharmony_civoid dw_hdmi_set_sample_non_pcm(struct dw_hdmi *hdmi, unsigned int non_pcm); 18262306a36Sopenharmony_civoid dw_hdmi_set_sample_width(struct dw_hdmi *hdmi, unsigned int width); 18362306a36Sopenharmony_civoid dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate); 18462306a36Sopenharmony_civoid dw_hdmi_set_channel_count(struct dw_hdmi *hdmi, unsigned int cnt); 18562306a36Sopenharmony_civoid dw_hdmi_set_channel_status(struct dw_hdmi *hdmi, u8 *channel_status); 18662306a36Sopenharmony_civoid dw_hdmi_set_channel_allocation(struct dw_hdmi *hdmi, unsigned int ca); 18762306a36Sopenharmony_civoid dw_hdmi_audio_enable(struct dw_hdmi *hdmi); 18862306a36Sopenharmony_civoid dw_hdmi_audio_disable(struct dw_hdmi *hdmi); 18962306a36Sopenharmony_civoid dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi, 19062306a36Sopenharmony_ci const struct drm_display_info *display); 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci/* PHY configuration */ 19362306a36Sopenharmony_civoid dw_hdmi_phy_i2c_set_addr(struct dw_hdmi *hdmi, u8 address); 19462306a36Sopenharmony_civoid dw_hdmi_phy_i2c_write(struct dw_hdmi *hdmi, unsigned short data, 19562306a36Sopenharmony_ci unsigned char addr); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_civoid dw_hdmi_phy_gen1_reset(struct dw_hdmi *hdmi); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_civoid dw_hdmi_phy_gen2_pddq(struct dw_hdmi *hdmi, u8 enable); 20062306a36Sopenharmony_civoid dw_hdmi_phy_gen2_txpwron(struct dw_hdmi *hdmi, u8 enable); 20162306a36Sopenharmony_civoid dw_hdmi_phy_gen2_reset(struct dw_hdmi *hdmi); 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cienum drm_connector_status dw_hdmi_phy_read_hpd(struct dw_hdmi *hdmi, 20462306a36Sopenharmony_ci void *data); 20562306a36Sopenharmony_civoid dw_hdmi_phy_update_hpd(struct dw_hdmi *hdmi, void *data, 20662306a36Sopenharmony_ci bool force, bool disabled, bool rxsense); 20762306a36Sopenharmony_civoid dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi, void *data); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cibool dw_hdmi_bus_fmt_is_420(struct dw_hdmi *hdmi); 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci#endif /* __IMX_HDMI_H__ */ 212