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