From 8d4ac81601bab81f4eebdd8295e1db3bbcb472b7 Mon Sep 17 00:00:00 2001 From: Joy Cho Date: Tue, 16 Oct 2018 16:18:54 +0900 Subject: [PATCH] ODROID: media: hdmi: add switching vout mode logic (dvi/hdmi) ex) setenv bootargs ${bootargs} voutmode=hdmi setenv bootargs ${bootargs} voutmode=dvi Change-Id: I2fd6cdafa6ae7dff7a7297982add66b038f3ae40 --- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c | 35 ++++++++++++++++--- .../vout/hdmitx/hdmi_tx_20/hdmi_tx_video.c | 23 +++++++++--- .../vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c | 26 ++++++++++++++ .../media/vout/hdmi_tx/hdmi_info_global.h | 8 +++++ 4 files changed, 83 insertions(+), 9 deletions(-) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index 1919a8bc90f8..4c1102ce04e5 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -551,7 +551,19 @@ static int set_disp_mode_auto(void) if ((vic_ready != HDMI_Unknown) && (vic_ready == vic)) { pr_info(SYS "[%s] ALREADY init VIC = %d\n", __func__, vic); +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + if (odroid_voutmode() == VOUTMODE_HDMI) { + hdev->HWOp.CntlConfig(hdev, CONF_HDMI_DVI_MODE, + HDMI_MODE); + pr_info(SYS "change to HDMI mode\n"); + } else if (odroid_voutmode() == VOUTMODE_DVI) { + hdev->HWOp.CntlConfig(hdev, CONF_HDMI_DVI_MODE, + DVI_MODE); + pr_info(SYS "change to DVI mode\n"); + } else if (hdev->RXCap.ieeeoui == 0) { +#else if (hdev->RXCap.ieeeoui == 0) { +#endif /* DVI case judgement. In uboot, directly output HDMI * mode */ @@ -4047,12 +4059,27 @@ static void hdmitx_hpd_plugin_handler(struct work_struct *work) hdmitx_get_edid(hdev); hdev->cedst_policy = hdev->cedst_en & hdev->RXCap.scdc_present; hdmi_physcial_size_update(hdev); - if (hdev->RXCap.ieeeoui != HDMI_IEEEOUI) - hdev->HWOp.CntlConfig(hdev, - CONF_HDMI_DVI_MODE, DVI_MODE); - else + +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + if (odroid_voutmode() == VOUTMODE_HDMI) { + pr_info(VID "Sink is HDMI device\n"); hdev->HWOp.CntlConfig(hdev, CONF_HDMI_DVI_MODE, HDMI_MODE); + } else if (odroid_voutmode() == VOUTMODE_DVI) { + pr_info(VID "Sink is DVI device\n"); + hdev->HWOp.CntlConfig(hdev, + CONF_HDMI_DVI_MODE, DVI_MODE); + } else +#endif + { + if (hdev->RXCap.ieeeoui != HDMI_IEEEOUI) + hdev->HWOp.CntlConfig(hdev, + CONF_HDMI_DVI_MODE, DVI_MODE); + else + hdev->HWOp.CntlConfig(hdev, + CONF_HDMI_DVI_MODE, HDMI_MODE); + } + mutex_lock(&getedid_mutex); if (hdev->chip_type < MESON_CPU_ID_G12A) hdev->HWOp.CntlMisc(hdev, MISC_I2C_REACTIVE, 0); diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_video.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_video.c index 2f96ae9270f0..79b421e3d05c 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_video.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_video.c @@ -982,14 +982,27 @@ int hdmitx_set_display(struct hdmitx_dev *hdev, enum hdmi_vic VideoCode) * TMDS_MODE[hdmi_config] * 0: DVI Mode 1: HDMI Mode */ - if (is_dvi_device(&hdev->RXCap)) { - pr_info(VID "Sink is DVI device\n"); - hdev->HWOp.CntlConfig(hdev, - CONF_HDMI_DVI_MODE, DVI_MODE); - } else { +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + if (odroid_voutmode() == VOUTMODE_HDMI) { pr_info(VID "Sink is HDMI device\n"); hdev->HWOp.CntlConfig(hdev, CONF_HDMI_DVI_MODE, HDMI_MODE); + } else if (odroid_voutmode() == VOUTMODE_DVI) { + pr_info(VID "Sink is DVI device\n"); + hdev->HWOp.CntlConfig(hdev, + CONF_HDMI_DVI_MODE, DVI_MODE); + } else +#endif + { + if (is_dvi_device(&hdev->RXCap)) { + pr_info(VID "Sink is DVI device\n"); + hdev->HWOp.CntlConfig(hdev, + CONF_HDMI_DVI_MODE, DVI_MODE); + } else { + pr_info(VID "Sink is HDMI device\n"); + hdev->HWOp.CntlConfig(hdev, + CONF_HDMI_DVI_MODE, HDMI_MODE); + } } hdmi_tx_construct_avi_packet(param, (char *)AVI_DB); diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c index 71f36e7c8027..26f287db889e 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c @@ -101,6 +101,32 @@ static int hdmitx_cntl_misc(struct hdmitx_dev *hdev, unsigned int cmd, #define TX_INPUT_COLOR_RANGE 0 /* Pixel bit width: 4=24-bit; 5=30-bit; 6=36-bit; 7=48-bit. */ #define TX_COLOR_DEPTH COLORDEPTH_24B + +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) +static int dvi_mode = VOUTMODE_NOINIT; + +int odroid_voutmode(void) +{ + return dvi_mode; +} +EXPORT_SYMBOL(odroid_voutmode); + +static int __init vout_setup(char *s) +{ + if (!strcmp(s, "hdmi")) + dvi_mode = VOUTMODE_HDMI; + else if (!strcmp(s, "dvi")) + dvi_mode = VOUTMODE_DVI; + else + dvi_mode = VOUTMODE_NOINIT; + + pr_info("voutmode : %d\n", dvi_mode); + + return 0; +} +__setup("voutmode=", vout_setup); +#endif + int hdmitx_hpd_hw_op(enum hpd_op cmd) { struct hdmitx_dev *hdev = get_hdmitx_device(); diff --git a/include/linux/amlogic/media/vout/hdmi_tx/hdmi_info_global.h b/include/linux/amlogic/media/vout/hdmi_tx/hdmi_info_global.h index e143e27fff5f..ca037ef68284 100644 --- a/include/linux/amlogic/media/vout/hdmi_tx/hdmi_info_global.h +++ b/include/linux/amlogic/media/vout/hdmi_tx/hdmi_info_global.h @@ -324,4 +324,12 @@ struct hdmitx_info { /* ------------------------------------------------------- */ }; +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) +#define VOUTMODE_NOINIT 0x00 +#define VOUTMODE_HDMI 0x01 +#define VOUTMODE_DVI 0x02 + +int odroid_voutmode(void); +#endif + #endif /* _HDMI_RX_GLOBAL_H */