diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0449-drm-vc4-Add-support-for-more-analog-TV-standards.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.15/950-0449-drm-vc4-Add-support-for-more-analog-TV-standards.patch | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0449-drm-vc4-Add-support-for-more-analog-TV-standards.patch b/target/linux/bcm27xx/patches-5.15/950-0449-drm-vc4-Add-support-for-more-analog-TV-standards.patch new file mode 100644 index 0000000000..b2103efafa --- /dev/null +++ b/target/linux/bcm27xx/patches-5.15/950-0449-drm-vc4-Add-support-for-more-analog-TV-standards.patch @@ -0,0 +1,148 @@ +From c8d584240d12646a609276e56f3b884f954ad3ea Mon Sep 17 00:00:00 2001 +From: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> +Date: Thu, 15 Jul 2021 01:07:58 +0200 +Subject: [PATCH] drm/vc4: Add support for more analog TV standards + +Add support for the following composite output modes (all of them are +somewhat more obscure than the previously defined ones): + +- NTSC_443 - NTSC-style signal with the chroma subcarrier shifted to + 4.43361875 MHz (the PAL subcarrier frequency). Never used for + broadcasting, but sometimes used as a hack to play NTSC content in PAL + regions (e.g. on VCRs). +- PAL_N - PAL with alternative chroma subcarrier frequency, + 3.58205625 MHz. Used as a broadcast standard in Argentina, Paraguay + and Uruguay to fit 576i50 with colour in 6 MHz channel raster. +- PAL60 - 480i60 signal with PAL-style color at normal European PAL + frequency. Another non-standard, non-broadcast mode, used in similar + contexts as NTSC_443. Some displays support one but not the other. +- SECAM - French frequency-modulated analog color standard; also have + been broadcast in Eastern Europe and various parts of Africa and Asia. + Uses the same 576i50 timings as PAL. + +Also added some comments explaining color subcarrier frequency +registers. + +Signed-off-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> +--- + drivers/gpu/drm/vc4/vc4_vec.c | 63 +++++++++++++++++++++++++++++++++++ + 1 file changed, 63 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_vec.c ++++ b/drivers/gpu/drm/vc4/vc4_vec.c +@@ -45,6 +45,7 @@ + #define VEC_CONFIG0_YDEL(x) ((x) << 26) + #define VEC_CONFIG0_CDEL_MASK GENMASK(25, 24) + #define VEC_CONFIG0_CDEL(x) ((x) << 24) ++#define VEC_CONFIG0_SECAM_STD BIT(21) + #define VEC_CONFIG0_PBPR_FIL BIT(18) + #define VEC_CONFIG0_CHROMA_GAIN_MASK GENMASK(17, 16) + #define VEC_CONFIG0_CHROMA_GAIN_UNITY (0 << 16) +@@ -75,6 +76,27 @@ + #define VEC_SOFT_RESET 0x10c + #define VEC_CLMP0_START 0x144 + #define VEC_CLMP0_END 0x148 ++ ++/* ++ * These set the color subcarrier frequency ++ * if VEC_CONFIG1_CUSTOM_FREQ is enabled. ++ * ++ * VEC_FREQ1_0 contains the most significant 16-bit half-word, ++ * VEC_FREQ3_2 contains the least significant 16-bit half-word. ++ * 0x80000000 seems to be equivalent to the pixel clock ++ * (which itself is the VEC clock divided by 8). ++ * ++ * Reference values (with the default pixel clock of 13.5 MHz): ++ * ++ * NTSC (3579545.[45] Hz) - 0x21F07C1F ++ * PAL (4433618.75 Hz) - 0x2A098ACB ++ * PAL-M (3575611.[888111] Hz) - 0x21E6EFE3 ++ * PAL-N (3582056.25 Hz) - 0x21F69446 ++ * ++ * NOTE: For SECAM, it is used as the Dr center frequency, ++ * regardless of whether VEC_CONFIG1_CUSTOM_FREQ is enabled or not; ++ * that is specified as 4406250 Hz, which corresponds to 0x29C71C72. ++ */ + #define VEC_FREQ3_2 0x180 + #define VEC_FREQ1_0 0x184 + +@@ -117,6 +139,14 @@ + + #define VEC_INTERRUPT_CONTROL 0x190 + #define VEC_INTERRUPT_STATUS 0x194 ++ ++/* ++ * Db center frequency for SECAM; the clock for this is the same as for ++ * VEC_FREQ3_2/VEC_FREQ1_0, which is used for Dr center frequency. ++ * ++ * This is specified as 4250000 Hz, which corresponds to 0x284BDA13. ++ * That is also the default value, so no need to set it explicitly. ++ */ + #define VEC_FCW_SECAM_B 0x198 + #define VEC_SECAM_GAIN_VAL 0x19c + +@@ -204,8 +234,12 @@ struct vc4_vec_connector { + enum vc4_vec_tv_mode_id { + VC4_VEC_TV_MODE_NTSC, + VC4_VEC_TV_MODE_NTSC_J, ++ VC4_VEC_TV_MODE_NTSC_443, + VC4_VEC_TV_MODE_PAL, + VC4_VEC_TV_MODE_PAL_M, ++ VC4_VEC_TV_MODE_PAL_N, ++ VC4_VEC_TV_MODE_PAL60, ++ VC4_VEC_TV_MODE_SECAM, + }; + + struct vc4_vec_tv_mode { +@@ -267,6 +301,13 @@ static const struct vc4_vec_tv_mode vc4_ + .config0 = VEC_CONFIG0_NTSC_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, ++ [VC4_VEC_TV_MODE_NTSC_443] = { ++ /* NTSC with PAL chroma frequency */ ++ .mode = &drm_mode_480i, ++ .config0 = VEC_CONFIG0_NTSC_STD, ++ .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, ++ .custom_freq = 0x2a098acb, ++ }, + [VC4_VEC_TV_MODE_PAL] = { + .mode = &drm_mode_576i, + .config0 = VEC_CONFIG0_PAL_BDGHI_STD, +@@ -277,6 +318,24 @@ static const struct vc4_vec_tv_mode vc4_ + .config0 = VEC_CONFIG0_PAL_M_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, ++ [VC4_VEC_TV_MODE_PAL_N] = { ++ .mode = &drm_mode_576i, ++ .config0 = VEC_CONFIG0_PAL_N_STD, ++ .config1 = VEC_CONFIG1_C_CVBS_CVBS, ++ }, ++ [VC4_VEC_TV_MODE_PAL60] = { ++ /* PAL-M with chroma frequency of regular PAL */ ++ .mode = &drm_mode_480i, ++ .config0 = VEC_CONFIG0_PAL_M_STD, ++ .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, ++ .custom_freq = 0x2a098acb, ++ }, ++ [VC4_VEC_TV_MODE_SECAM] = { ++ .mode = &drm_mode_576i, ++ .config0 = VEC_CONFIG0_SECAM_STD, ++ .config1 = VEC_CONFIG1_C_CVBS_CVBS, ++ .custom_freq = 0x29c71c72, ++ }, + }; + + static enum drm_connector_status +@@ -499,8 +558,12 @@ static const struct of_device_id vc4_vec + static const char * const tv_mode_names[] = { + [VC4_VEC_TV_MODE_NTSC] = "NTSC", + [VC4_VEC_TV_MODE_NTSC_J] = "NTSC-J", ++ [VC4_VEC_TV_MODE_NTSC_443] = "NTSC-443", + [VC4_VEC_TV_MODE_PAL] = "PAL", + [VC4_VEC_TV_MODE_PAL_M] = "PAL-M", ++ [VC4_VEC_TV_MODE_PAL_N] = "PAL-N", ++ [VC4_VEC_TV_MODE_PAL60] = "PAL60", ++ [VC4_VEC_TV_MODE_SECAM] = "SECAM", + }; + + static int vc4_vec_bind(struct device *dev, struct device *master, void *data) |