18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2011 Freescale Semiconductor, Inc.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef __DW_HDMI__
78c2ecf20Sopenharmony_ci#define __DW_HDMI__
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <sound/hdmi-codec.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistruct drm_display_info;
128c2ecf20Sopenharmony_cistruct drm_display_mode;
138c2ecf20Sopenharmony_cistruct drm_encoder;
148c2ecf20Sopenharmony_cistruct dw_hdmi;
158c2ecf20Sopenharmony_cistruct platform_device;
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci/**
188c2ecf20Sopenharmony_ci * DOC: Supported input formats and encodings
198c2ecf20Sopenharmony_ci *
208c2ecf20Sopenharmony_ci * Depending on the Hardware configuration of the Controller IP, it supports
218c2ecf20Sopenharmony_ci * a subset of the following input formats and encodings on its internal
228c2ecf20Sopenharmony_ci * 48bit bus.
238c2ecf20Sopenharmony_ci *
248c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
258c2ecf20Sopenharmony_ci * | Format Name          | Format Code                      | Encodings                    |
268c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
278c2ecf20Sopenharmony_ci * | RGB 4:4:4 8bit       | ``MEDIA_BUS_FMT_RGB888_1X24``    | ``V4L2_YCBCR_ENC_DEFAULT``   |
288c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
298c2ecf20Sopenharmony_ci * | RGB 4:4:4 10bits     | ``MEDIA_BUS_FMT_RGB101010_1X30`` | ``V4L2_YCBCR_ENC_DEFAULT``   |
308c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
318c2ecf20Sopenharmony_ci * | RGB 4:4:4 12bits     | ``MEDIA_BUS_FMT_RGB121212_1X36`` | ``V4L2_YCBCR_ENC_DEFAULT``   |
328c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
338c2ecf20Sopenharmony_ci * | RGB 4:4:4 16bits     | ``MEDIA_BUS_FMT_RGB161616_1X48`` | ``V4L2_YCBCR_ENC_DEFAULT``   |
348c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
358c2ecf20Sopenharmony_ci * | YCbCr 4:4:4 8bit     | ``MEDIA_BUS_FMT_YUV8_1X24``      | ``V4L2_YCBCR_ENC_601``       |
368c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
378c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_XV601``  |
388c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_XV709``  |
398c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
408c2ecf20Sopenharmony_ci * | YCbCr 4:4:4 10bits   | ``MEDIA_BUS_FMT_YUV10_1X30``     | ``V4L2_YCBCR_ENC_601``       |
418c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
428c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_XV601``  |
438c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_XV709``  |
448c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
458c2ecf20Sopenharmony_ci * | YCbCr 4:4:4 12bits   | ``MEDIA_BUS_FMT_YUV12_1X36``     | ``V4L2_YCBCR_ENC_601``       |
468c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
478c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_XV601``  |
488c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_XV709``  |
498c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
508c2ecf20Sopenharmony_ci * | YCbCr 4:4:4 16bits   | ``MEDIA_BUS_FMT_YUV16_1X48``     | ``V4L2_YCBCR_ENC_601``       |
518c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
528c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_XV601``  |
538c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_XV709``  |
548c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
558c2ecf20Sopenharmony_ci * | YCbCr 4:2:2 8bit     | ``MEDIA_BUS_FMT_UYVY8_1X16``     | ``V4L2_YCBCR_ENC_601``       |
568c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
578c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
588c2ecf20Sopenharmony_ci * | YCbCr 4:2:2 10bits   | ``MEDIA_BUS_FMT_UYVY10_1X20``    | ``V4L2_YCBCR_ENC_601``       |
598c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
608c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
618c2ecf20Sopenharmony_ci * | YCbCr 4:2:2 12bits   | ``MEDIA_BUS_FMT_UYVY12_1X24``    | ``V4L2_YCBCR_ENC_601``       |
628c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
638c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
648c2ecf20Sopenharmony_ci * | YCbCr 4:2:0 8bit     | ``MEDIA_BUS_FMT_UYYVYY8_0_5X24`` | ``V4L2_YCBCR_ENC_601``       |
658c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
668c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
678c2ecf20Sopenharmony_ci * | YCbCr 4:2:0 10bits   | ``MEDIA_BUS_FMT_UYYVYY10_0_5X30``| ``V4L2_YCBCR_ENC_601``       |
688c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
698c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
708c2ecf20Sopenharmony_ci * | YCbCr 4:2:0 12bits   | ``MEDIA_BUS_FMT_UYYVYY12_0_5X36``| ``V4L2_YCBCR_ENC_601``       |
718c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
728c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
738c2ecf20Sopenharmony_ci * | YCbCr 4:2:0 16bits   | ``MEDIA_BUS_FMT_UYYVYY16_0_5X48``| ``V4L2_YCBCR_ENC_601``       |
748c2ecf20Sopenharmony_ci * |                      |                                  | or ``V4L2_YCBCR_ENC_709``    |
758c2ecf20Sopenharmony_ci * +----------------------+----------------------------------+------------------------------+
768c2ecf20Sopenharmony_ci */
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_cienum {
798c2ecf20Sopenharmony_ci	DW_HDMI_RES_8,
808c2ecf20Sopenharmony_ci	DW_HDMI_RES_10,
818c2ecf20Sopenharmony_ci	DW_HDMI_RES_12,
828c2ecf20Sopenharmony_ci	DW_HDMI_RES_MAX,
838c2ecf20Sopenharmony_ci};
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_cienum dw_hdmi_phy_type {
868c2ecf20Sopenharmony_ci	DW_HDMI_PHY_DWC_HDMI_TX_PHY = 0x00,
878c2ecf20Sopenharmony_ci	DW_HDMI_PHY_DWC_MHL_PHY_HEAC = 0xb2,
888c2ecf20Sopenharmony_ci	DW_HDMI_PHY_DWC_MHL_PHY = 0xc2,
898c2ecf20Sopenharmony_ci	DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY_HEAC = 0xe2,
908c2ecf20Sopenharmony_ci	DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY = 0xf2,
918c2ecf20Sopenharmony_ci	DW_HDMI_PHY_DWC_HDMI20_TX_PHY = 0xf3,
928c2ecf20Sopenharmony_ci	DW_HDMI_PHY_VENDOR_PHY = 0xfe,
938c2ecf20Sopenharmony_ci};
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_cistruct dw_hdmi_mpll_config {
968c2ecf20Sopenharmony_ci	unsigned long mpixelclock;
978c2ecf20Sopenharmony_ci	struct {
988c2ecf20Sopenharmony_ci		u16 cpce;
998c2ecf20Sopenharmony_ci		u16 gmp;
1008c2ecf20Sopenharmony_ci	} res[DW_HDMI_RES_MAX];
1018c2ecf20Sopenharmony_ci};
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_cistruct dw_hdmi_curr_ctrl {
1048c2ecf20Sopenharmony_ci	unsigned long mpixelclock;
1058c2ecf20Sopenharmony_ci	u16 curr[DW_HDMI_RES_MAX];
1068c2ecf20Sopenharmony_ci};
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_cistruct dw_hdmi_phy_config {
1098c2ecf20Sopenharmony_ci	unsigned long mpixelclock;
1108c2ecf20Sopenharmony_ci	u16 sym_ctr;    /*clock symbol and transmitter control*/
1118c2ecf20Sopenharmony_ci	u16 term;       /*transmission termination value*/
1128c2ecf20Sopenharmony_ci	u16 vlev_ctr;   /* voltage level control */
1138c2ecf20Sopenharmony_ci};
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_cistruct dw_hdmi_phy_ops {
1168c2ecf20Sopenharmony_ci	int (*init)(struct dw_hdmi *hdmi, void *data,
1178c2ecf20Sopenharmony_ci		    const struct drm_display_info *display,
1188c2ecf20Sopenharmony_ci		    const struct drm_display_mode *mode);
1198c2ecf20Sopenharmony_ci	void (*disable)(struct dw_hdmi *hdmi, void *data);
1208c2ecf20Sopenharmony_ci	enum drm_connector_status (*read_hpd)(struct dw_hdmi *hdmi, void *data);
1218c2ecf20Sopenharmony_ci	void (*update_hpd)(struct dw_hdmi *hdmi, void *data,
1228c2ecf20Sopenharmony_ci			   bool force, bool disabled, bool rxsense);
1238c2ecf20Sopenharmony_ci	void (*setup_hpd)(struct dw_hdmi *hdmi, void *data);
1248c2ecf20Sopenharmony_ci};
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_cistruct dw_hdmi_plat_data {
1278c2ecf20Sopenharmony_ci	struct regmap *regm;
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci	unsigned long input_bus_encoding;
1308c2ecf20Sopenharmony_ci	bool use_drm_infoframe;
1318c2ecf20Sopenharmony_ci	bool ycbcr_420_allowed;
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci	/*
1348c2ecf20Sopenharmony_ci	 * Private data passed to all the .mode_valid() and .configure_phy()
1358c2ecf20Sopenharmony_ci	 * callback functions.
1368c2ecf20Sopenharmony_ci	 */
1378c2ecf20Sopenharmony_ci	void *priv_data;
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci	/* Platform-specific mode validation (optional). */
1408c2ecf20Sopenharmony_ci	enum drm_mode_status (*mode_valid)(struct dw_hdmi *hdmi, void *data,
1418c2ecf20Sopenharmony_ci					   const struct drm_display_info *info,
1428c2ecf20Sopenharmony_ci					   const struct drm_display_mode *mode);
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci	/* Vendor PHY support */
1458c2ecf20Sopenharmony_ci	const struct dw_hdmi_phy_ops *phy_ops;
1468c2ecf20Sopenharmony_ci	const char *phy_name;
1478c2ecf20Sopenharmony_ci	void *phy_data;
1488c2ecf20Sopenharmony_ci	unsigned int phy_force_vendor;
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ci	/* Synopsys PHY support */
1518c2ecf20Sopenharmony_ci	const struct dw_hdmi_mpll_config *mpll_cfg;
1528c2ecf20Sopenharmony_ci	const struct dw_hdmi_curr_ctrl *cur_ctr;
1538c2ecf20Sopenharmony_ci	const struct dw_hdmi_phy_config *phy_config;
1548c2ecf20Sopenharmony_ci	int (*configure_phy)(struct dw_hdmi *hdmi, void *data,
1558c2ecf20Sopenharmony_ci			     unsigned long mpixelclock);
1568c2ecf20Sopenharmony_ci};
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_cistruct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev,
1598c2ecf20Sopenharmony_ci			      const struct dw_hdmi_plat_data *plat_data);
1608c2ecf20Sopenharmony_civoid dw_hdmi_remove(struct dw_hdmi *hdmi);
1618c2ecf20Sopenharmony_civoid dw_hdmi_unbind(struct dw_hdmi *hdmi);
1628c2ecf20Sopenharmony_cistruct dw_hdmi *dw_hdmi_bind(struct platform_device *pdev,
1638c2ecf20Sopenharmony_ci			     struct drm_encoder *encoder,
1648c2ecf20Sopenharmony_ci			     const struct dw_hdmi_plat_data *plat_data);
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_civoid dw_hdmi_resume(struct dw_hdmi *hdmi);
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_civoid dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense);
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ciint dw_hdmi_set_plugged_cb(struct dw_hdmi *hdmi, hdmi_codec_plugged_cb fn,
1718c2ecf20Sopenharmony_ci			   struct device *codec_dev);
1728c2ecf20Sopenharmony_civoid dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate);
1738c2ecf20Sopenharmony_civoid dw_hdmi_set_channel_count(struct dw_hdmi *hdmi, unsigned int cnt);
1748c2ecf20Sopenharmony_civoid dw_hdmi_set_channel_status(struct dw_hdmi *hdmi, u8 *channel_status);
1758c2ecf20Sopenharmony_civoid dw_hdmi_set_channel_allocation(struct dw_hdmi *hdmi, unsigned int ca);
1768c2ecf20Sopenharmony_civoid dw_hdmi_audio_enable(struct dw_hdmi *hdmi);
1778c2ecf20Sopenharmony_civoid dw_hdmi_audio_disable(struct dw_hdmi *hdmi);
1788c2ecf20Sopenharmony_civoid dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi,
1798c2ecf20Sopenharmony_ci				       const struct drm_display_info *display);
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci/* PHY configuration */
1828c2ecf20Sopenharmony_civoid dw_hdmi_phy_i2c_set_addr(struct dw_hdmi *hdmi, u8 address);
1838c2ecf20Sopenharmony_civoid dw_hdmi_phy_i2c_write(struct dw_hdmi *hdmi, unsigned short data,
1848c2ecf20Sopenharmony_ci			   unsigned char addr);
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_civoid dw_hdmi_phy_gen2_pddq(struct dw_hdmi *hdmi, u8 enable);
1878c2ecf20Sopenharmony_civoid dw_hdmi_phy_gen2_txpwron(struct dw_hdmi *hdmi, u8 enable);
1888c2ecf20Sopenharmony_civoid dw_hdmi_phy_reset(struct dw_hdmi *hdmi);
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_cienum drm_connector_status dw_hdmi_phy_read_hpd(struct dw_hdmi *hdmi,
1918c2ecf20Sopenharmony_ci					       void *data);
1928c2ecf20Sopenharmony_civoid dw_hdmi_phy_update_hpd(struct dw_hdmi *hdmi, void *data,
1938c2ecf20Sopenharmony_ci			    bool force, bool disabled, bool rxsense);
1948c2ecf20Sopenharmony_civoid dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi, void *data);
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci#endif /* __IMX_HDMI_H__ */
197