From 00403f2ea25a511e293fdb27898177ff66bb0983 Mon Sep 17 00:00:00 2001 From: Nian Jing Date: Wed, 20 Mar 2019 11:26:28 +0800 Subject: [PATCH] cvbs: add cvbs support for sm1 [1/1] PD#SWPL-6112 Problem: need add cvbsout support for sm1 Solution: add cvbsout support for sm1 Verify: sm1 Change-Id: I037fbdb41b823d9ef93a9069f3798f8d38ac5796 Signed-off-by: Nian Jing Signed-off-by: Luan Yuan --- arch/arm/boot/dts/amlogic/mesonsm1.dtsi | 2 +- arch/arm/boot/dts/amlogic/sm1_pxp.dts | 4 +-- .../arm/boot/dts/amlogic/sm1_s905d3_ac200.dts | 4 +-- arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts | 4 +-- arch/arm64/boot/dts/amlogic/mesonsm1.dtsi | 2 +- arch/arm64/boot/dts/amlogic/sm1_pxp.dts | 4 +-- .../boot/dts/amlogic/sm1_s905d3_ac200.dts | 4 +-- .../arm64/boot/dts/amlogic/sm1_s905d3_skt.dts | 4 +-- drivers/amlogic/media/vout/cvbs/cvbs_out.c | 29 ++++++++++++++----- drivers/amlogic/media/vout/cvbs/cvbs_out.h | 2 ++ .../amlogic/media/vout/cvbs/enc_clk_config.c | 9 ++++-- drivers/amlogic/media/vout/vdac/vdac_dev.c | 16 ++++++++-- include/linux/amlogic/media/vout/vdac_dev.h | 1 + 13 files changed, 59 insertions(+), 26 deletions(-) diff --git a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi index 3614febc4e47..9d9042bb8e44 100644 --- a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi +++ b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi @@ -1201,7 +1201,7 @@ }; vdac { - compatible = "amlogic, vdac-g12a"; + compatible = "amlogic, vdac-sm1"; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/sm1_pxp.dts b/arch/arm/boot/dts/amlogic/sm1_pxp.dts index d9743acb1d64..c316374af759 100644 --- a/arch/arm/boot/dts/amlogic/sm1_pxp.dts +++ b/arch/arm/boot/dts/amlogic/sm1_pxp.dts @@ -131,7 +131,7 @@ }; cvbsout { - compatible = "amlogic, cvbsout-g12a"; + compatible = "amlogic, cvbsout-sm1"; dev_name = "cvbsout"; status = "okay"; clocks = <&clkc CLKID_VCLK2_ENCI @@ -145,7 +145,7 @@ clk_path = <0>; /* performance: reg_address, reg_value */ - /* g12a */ + /* sm1 */ performance = <0x1bf0 0x9 0x1b56 0x333 0x1b12 0x8080 diff --git a/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts b/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts index 2e3b54753dc1..46ee5e3e523d 100644 --- a/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts +++ b/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts @@ -175,7 +175,7 @@ }; cvbsout { - compatible = "amlogic, cvbsout-g12a"; + compatible = "amlogic, cvbsout-sm1"; dev_name = "cvbsout"; status = "okay"; clocks = <&clkc CLKID_VCLK2_ENCI @@ -194,7 +194,7 @@ clk_path = <0>; /* performance: reg_address, reg_value */ - /* g12a */ + /* sm1 */ performance = <0x1bf0 0x9 0x1b56 0x333 0x1b12 0x8080 diff --git a/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts b/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts index ae14ba05ef72..5f2c838e6e2c 100644 --- a/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts +++ b/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts @@ -175,7 +175,7 @@ }; cvbsout { - compatible = "amlogic, cvbsout-g12a"; + compatible = "amlogic, cvbsout-sm1"; dev_name = "cvbsout"; status = "okay"; clocks = <&clkc CLKID_VCLK2_ENCI @@ -194,7 +194,7 @@ clk_path = <0>; /* performance: reg_address, reg_value */ - /* g12a */ + /* sm1 */ performance = <0x1bf0 0x9 0x1b56 0x333 0x1b12 0x8080 diff --git a/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi b/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi index 0510c10afe4a..242148aa4bd0 100644 --- a/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi @@ -1201,7 +1201,7 @@ }; vdac { - compatible = "amlogic, vdac-g12a"; + compatible = "amlogic, vdac-sm1"; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/sm1_pxp.dts b/arch/arm64/boot/dts/amlogic/sm1_pxp.dts index e83b77c821f5..301501bbd155 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_pxp.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_pxp.dts @@ -132,7 +132,7 @@ }; cvbsout { - compatible = "amlogic, cvbsout-g12a"; + compatible = "amlogic, cvbsout-sm1"; dev_name = "cvbsout"; status = "okay"; clocks = <&clkc CLKID_VCLK2_ENCI @@ -146,7 +146,7 @@ clk_path = <0>; /* performance: reg_address, reg_value */ - /* g12a */ + /* sm1 */ performance = <0x1bf0 0x9 0x1b56 0x333 0x1b12 0x8080 diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts index eb9552f85205..cf907893993d 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts @@ -173,7 +173,7 @@ }; cvbsout { - compatible = "amlogic, cvbsout-g12a"; + compatible = "amlogic, cvbsout-sm1"; dev_name = "cvbsout"; status = "okay"; clocks = <&clkc CLKID_VCLK2_ENCI @@ -192,7 +192,7 @@ clk_path = <0>; /* performance: reg_address, reg_value */ - /* g12a */ + /* sm1 */ performance = <0x1bf0 0x9 0x1b56 0x333 0x1b12 0x8080 diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts b/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts index 49509cc4c653..711b9670c0a4 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts @@ -173,7 +173,7 @@ }; cvbsout { - compatible = "amlogic, cvbsout-g12a"; + compatible = "amlogic, cvbsout-sm1"; dev_name = "cvbsout"; status = "okay"; clocks = <&clkc CLKID_VCLK2_ENCI @@ -192,7 +192,7 @@ clk_path = <0>; /* performance: reg_address, reg_value */ - /* g12a */ + /* sm1 */ performance = <0x1bf0 0x9 0x1b56 0x333 0x1b12 0x8080 diff --git a/drivers/amlogic/media/vout/cvbs/cvbs_out.c b/drivers/amlogic/media/vout/cvbs/cvbs_out.c index cf611fe41040..467535345c92 100644 --- a/drivers/amlogic/media/vout/cvbs/cvbs_out.c +++ b/drivers/amlogic/media/vout/cvbs/cvbs_out.c @@ -903,15 +903,13 @@ static void cvbs_performance_regs_dump(void) pr_info("vcbus [0x%x] = 0x%x\n", performance_regs_enci[i], cvbs_out_reg_read(performance_regs_enci[i])); } - if (cvbs_cpu_type() == CVBS_CPU_TYPE_G12A || - cvbs_cpu_type() == CVBS_CPU_TYPE_G12B) + if (cvbs_cpu_type() >= CVBS_CPU_TYPE_G12A) size = sizeof(performance_regs_vdac_g12a)/sizeof(unsigned int); else size = sizeof(performance_regs_vdac)/sizeof(unsigned int); pr_info("------------------------\n"); for (i = 0; i < size; i++) { - if (cvbs_cpu_type() == CVBS_CPU_TYPE_G12A || - cvbs_cpu_type() == CVBS_CPU_TYPE_G12B) + if (cvbs_cpu_type() >= CVBS_CPU_TYPE_G12A) pr_info("hiu [0x%x] = 0x%x\n", performance_regs_vdac_g12a[i], cvbs_out_hiu_read(performance_regs_vdac_g12a[i])); @@ -1208,9 +1206,8 @@ static void cvbs_debug_store(char *buf) cvbs_performance_config_dump(); break; case CMD_VP_SET_PLLPATH: - if (cvbs_cpu_type() != CVBS_CPU_TYPE_G12A && - cvbs_cpu_type() != CVBS_CPU_TYPE_G12B) { - print_info("ERR:Only g12a/b chip supported\n"); + if (cvbs_cpu_type() < CVBS_CPU_TYPE_G12A) { + print_info("ERR:Only after g12a/b chip supported\n"); break; } if (argc != 2) { @@ -1449,6 +1446,18 @@ struct meson_cvbsout_data meson_g12b_cvbsout_data = { .name = "meson-g12b-cvbsout", }; +struct meson_cvbsout_data meson_tl1_cvbsout_data = { + .cntl0_val = 0x906001, + .cpu_id = CVBS_CPU_TYPE_TL1, + .name = "meson-tl1-cvbsout", +}; + +struct meson_cvbsout_data meson_sm1_cvbsout_data = { + .cntl0_val = 0x8f6001, + .cpu_id = CVBS_CPU_TYPE_SM1, + .name = "meson-sm1-cvbsout", +}; + static const struct of_device_id meson_cvbsout_dt_match[] = { { .compatible = "amlogic, cvbsout-gxl", @@ -1465,6 +1474,12 @@ static const struct of_device_id meson_cvbsout_dt_match[] = { }, { .compatible = "amlogic, cvbsout-g12b", .data = &meson_g12b_cvbsout_data, + }, { + .compatible = "amlogic, cvbsout-tl1", + .data = &meson_tl1_cvbsout_data, + }, { + .compatible = "amlogic, cvbsout-sm1", + .data = &meson_sm1_cvbsout_data, }, {}, }; diff --git a/drivers/amlogic/media/vout/cvbs/cvbs_out.h b/drivers/amlogic/media/vout/cvbs/cvbs_out.h index 79f803caedaf..05f6961225e4 100644 --- a/drivers/amlogic/media/vout/cvbs/cvbs_out.h +++ b/drivers/amlogic/media/vout/cvbs/cvbs_out.h @@ -51,6 +51,8 @@ enum cvbs_cpu_type { CVBS_CPU_TYPE_TXLX = 3, CVBS_CPU_TYPE_G12A = 4, CVBS_CPU_TYPE_G12B = 5, + CVBS_CPU_TYPE_TL1 = 6, + CVBS_CPU_TYPE_SM1 = 7, }; struct meson_cvbsout_data { diff --git a/drivers/amlogic/media/vout/cvbs/enc_clk_config.c b/drivers/amlogic/media/vout/cvbs/enc_clk_config.c index 28b6fc871f51..379e19b2a850 100644 --- a/drivers/amlogic/media/vout/cvbs/enc_clk_config.c +++ b/drivers/amlogic/media/vout/cvbs/enc_clk_config.c @@ -183,7 +183,8 @@ void set_vmode_clk(void) cvbs_out_hiu_setb(HHI_VIID_CLK_CNTL, 0, VCLK2_EN, 1); udelay(5); } else if (cvbs_cpu_type() == CVBS_CPU_TYPE_G12A || - cvbs_cpu_type() == CVBS_CPU_TYPE_G12B) { + cvbs_cpu_type() == CVBS_CPU_TYPE_G12B || + cvbs_cpu_type() == CVBS_CPU_TYPE_SM1) { if (cvbs_clk_path & 0x1) { pr_info("config g12a gp0_pll\n"); cvbs_out_hiu_write(HHI_GP0_PLL_CNTL0, 0x180204f7); @@ -229,7 +230,8 @@ void set_vmode_clk(void) } if (cvbs_cpu_type() == CVBS_CPU_TYPE_G12A || - cvbs_cpu_type() == CVBS_CPU_TYPE_G12B) { + cvbs_cpu_type() == CVBS_CPU_TYPE_G12B || + cvbs_cpu_type() == CVBS_CPU_TYPE_SM1) { if (cvbs_clk_path & 0x2) cvbs_set_vid1_clk(cvbs_clk_path & 0x1); else @@ -248,7 +250,8 @@ void set_vmode_clk(void) void disable_vmode_clk(void) { if (cvbs_cpu_type() == CVBS_CPU_TYPE_G12A || - cvbs_cpu_type() == CVBS_CPU_TYPE_G12B) { + cvbs_cpu_type() == CVBS_CPU_TYPE_G12B || + cvbs_cpu_type() == CVBS_CPU_TYPE_SM1) { if (cvbs_clk_path & 0x2) disable_vid1_clk_out(); else diff --git a/drivers/amlogic/media/vout/vdac/vdac_dev.c b/drivers/amlogic/media/vout/vdac/vdac_dev.c index b5b3533c20ad..361e7deefb34 100644 --- a/drivers/amlogic/media/vout/vdac/vdac_dev.c +++ b/drivers/amlogic/media/vout/vdac/vdac_dev.c @@ -589,6 +589,11 @@ struct meson_vdac_data meson_tl1_vdac_data = { .name = "meson-tl1-vdac", }; +struct meson_vdac_data meson_sm1_vdac_data = { + .cpu_id = VDAC_CPU_SM1, + .name = "meson-sm1-vdac", +}; + static const struct of_device_id meson_vdac_dt_match[] = { { .compatible = "amlogic, vdac-gxtvbb", @@ -620,6 +625,9 @@ static const struct of_device_id meson_vdac_dt_match[] = { }, { .compatible = "amlogic, vdac-tl1", .data = &meson_tl1_vdac_data, + }, { + .compatible = "amlogic, vdac-sm1", + .data = &meson_sm1_vdac_data, }, {}, }; @@ -701,7 +709,8 @@ static int __exit aml_vdac_remove(struct platform_device *pdev) static int amvdac_drv_suspend(struct platform_device *pdev, pm_message_t state) { - if (s_vdac_data->cpu_id == VDAC_CPU_TXL) + if (s_vdac_data->cpu_id == VDAC_CPU_TXL || + s_vdac_data->cpu_id == VDAC_CPU_TXLX) vdac_hiu_reg_write(HHI_VDAC_CNTL0, 0); pr_info("%s: suspend module\n", __func__); return 0; @@ -720,8 +729,11 @@ static void amvdac_drv_shutdown(struct platform_device *pdev) pr_info("%s: shutdown module\n", __func__); cntl0 = 0x0; - if (is_meson_txl_cpu() || is_meson_txlx_cpu()) + if (s_vdac_data->cpu_id == VDAC_CPU_TXL || + s_vdac_data->cpu_id == VDAC_CPU_TXLX) cntl1 = 0x0; + else if (s_vdac_data->cpu_id == VDAC_CPU_TL1) + cntl1 = 0x80; else cntl1 = 0x8; vdac_set_ctrl0_ctrl1(cntl0, cntl1); diff --git a/include/linux/amlogic/media/vout/vdac_dev.h b/include/linux/amlogic/media/vout/vdac_dev.h index 69031fe1d853..90e409653c5d 100644 --- a/include/linux/amlogic/media/vout/vdac_dev.h +++ b/include/linux/amlogic/media/vout/vdac_dev.h @@ -27,6 +27,7 @@ enum vdac_cpu_type { VDAC_CPU_TXHD = 5, VDAC_CPU_G12AB = 6, VDAC_CPU_TL1 = 7, + VDAC_CPU_SM1 = 8, VDAC_CPU_MAX, };