From c6d2acabdec6f603dc6f1fb5a3e294332294739a Mon Sep 17 00:00:00 2001 From: Marek Czerski Date: Tue, 30 Sep 2025 19:33:10 +0200 Subject: [PATCH 1/4] AML: rename remote control led trigger to common name --- drivers/input/ir/meson_ir_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/input/ir/meson_ir_main.c b/drivers/input/ir/meson_ir_main.c index 2a05c6b39..f431faf19 100644 --- a/drivers/input/ir/meson_ir_main.c +++ b/drivers/input/ir/meson_ir_main.c @@ -948,7 +948,7 @@ static int meson_ir_probe(struct platform_device *pdev) device_init_wakeup(&pdev->dev, true); - led_trigger_register_simple("ir_led", &dev->led_feedback); + led_trigger_register_simple("rc-feedback", &dev->led_feedback); if (MULTI_IR_SOFTWARE_DECODE(dev->rc_type)) meson_ir_raw_event_register(dev); From a4d57ec44d09aa6582f4aee853b320b8beea121e Mon Sep 17 00:00:00 2001 From: Marek Czerski Date: Mon, 22 Sep 2025 17:23:34 +0200 Subject: [PATCH 2/4] AML: DVB: fix for SC2 DVB not receiving stream from demod background: Demux driver does not work on SC2 device that was originally released with kernel v4.9 (mecool KT1) The issue was introduced in kernel v5.4 with: commit 15954fc01f8a97f897d6daf21699a11f466e8d1a Author: chuangcheng peng Date: Thu Mar 3 19:16:01 2022 +0800 demux: use new tee interface to set [1/1] PD#SWPL-74508 Problem: tee flag conflict Solution: call new tee interface Verify: not verified Change-Id: Iccd8988af3a2ec612d858951dfc871d97bb4f1ac Signed-off-by: chuangcheng peng action taken: Introduce new dts parameter tee_compat. If set, the old behaviour of the driver is enabled which solves the issue (for mecool KT1). --- drivers/dvb/demux/aml_dvb.c | 32 +++++++++++++++++++++++++++----- drivers/dvb/demux/aml_dvb.h | 1 + 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/drivers/dvb/demux/aml_dvb.c b/drivers/dvb/demux/aml_dvb.c index dc8ada792..e7819b1dd 100644 --- a/drivers/dvb/demux/aml_dvb.c +++ b/drivers/dvb/demux/aml_dvb.c @@ -70,11 +70,16 @@ static int force_tsn_source; int is_security_dmx; -static void demux_config_pipeline(int cfg_demod_tsn, int cfg_tsn_out) +static void demux_config_pipeline(int cfg_demod_tsn, int cfg_tsn_out, int tee_compat) { u32 value = 0; int ret = 0; + if (tee_compat) { + tee_demux_config_pipeline(cfg_demod_tsn, cfg_tsn_out); + return; + } + value = cfg_demod_tsn; value += cfg_tsn_out << 1; @@ -332,7 +337,7 @@ ssize_t tsn_source_store(struct class *class, // pr_dbg("tsn_in:%d, tsn_out:%d\n", tsn_in_reg, tsn_out); advb->dsc_pipeline = tsn_in_reg; //set demod/local - demux_config_pipeline(tsn_in_reg, tsn_out); + demux_config_pipeline(tsn_in_reg, tsn_out, advb->tee_compat); mutex_unlock(&advb->mutex); return count; @@ -341,6 +346,7 @@ ssize_t tsn_source_store(struct class *class, int tsn_set_double_out(int flag) { int tsn_in_reg = 0; + struct aml_dvb *advb = aml_get_dvb_device(); if (tsn_out == flag) return 0; @@ -350,7 +356,7 @@ int tsn_set_double_out(int flag) if (tsn_in == INPUT_DEMOD) tsn_in_reg = 1; - demux_config_pipeline(tsn_in_reg, tsn_out); + demux_config_pipeline(tsn_in_reg, tsn_out, advb->tee_compat); return 0; } @@ -369,7 +375,7 @@ int tsn_source_force_set(int source) tsn_in = source; advb->dsc_pipeline = tsn_in_reg; - demux_config_pipeline(tsn_in_reg, 0); + demux_config_pipeline(tsn_in_reg, 0, advb->tee_compat); force_tsn_source = 1; return 0; } @@ -678,6 +684,21 @@ int dmx_get_tsn_flag(struct platform_device *pdev, int *tsn_in, int *tsn_out) return 0; } +u32 dmx_get_tee_compat_flag(struct platform_device *pdev) +{ + char buf[32]; + u32 tee_compat = 0; + int ret = 0; + + memset(buf, 0, sizeof(buf)); + snprintf(buf, sizeof(buf), "tee_compat"); + ret = of_property_read_u32(pdev->dev.of_node, buf, &tee_compat); + if (!ret) + dprint_i("%s:%d\n", buf, tee_compat); + + return tee_compat; +} + struct aml_dvb *aml_get_dvb_device(void) { return &aml_dvb_device; @@ -843,8 +864,9 @@ static int aml_dvb_probe(struct platform_device *pdev) pr_dbg("tsn_in:%d, tsn_out:%d\n", tsn_in_reg, tsn_out); advb->dsc_pipeline = tsn_in_reg; + advb->tee_compat = dmx_get_tee_compat_flag(pdev); //set demod/local - demux_config_pipeline(tsn_in_reg, tsn_out); + demux_config_pipeline(tsn_in_reg, tsn_out, advb->tee_compat); dmx_init_hw(); diff --git a/drivers/dvb/demux/aml_dvb.h b/drivers/dvb/demux/aml_dvb.h index 4b48652b4..8fab17b3b 100644 --- a/drivers/dvb/demux/aml_dvb.h +++ b/drivers/dvb/demux/aml_dvb.h @@ -61,6 +61,7 @@ struct aml_dvb { unsigned int tsn_flag; unsigned char loop_tsn; unsigned char ts_clone; + unsigned char tee_compat; }; struct aml_dvb *aml_get_dvb_device(void); From 858a8d6b94056c689cfb31d0f030f72f845e246d Mon Sep 17 00:00:00 2001 From: Marek Czerski Date: Sat, 20 Sep 2025 11:27:59 +0200 Subject: [PATCH 3/4] AML: enable support for more demod and tuner chips --- drivers/dvb/aml_dtvdemod.c | 6 ------ drivers/dvb/aml_tuner.c | 4 ---- 2 files changed, 10 deletions(-) diff --git a/drivers/dvb/aml_dtvdemod.c b/drivers/dvb/aml_dtvdemod.c index 972438187..be51344fe 100644 --- a/drivers/dvb/aml_dtvdemod.c +++ b/drivers/dvb/aml_dtvdemod.c @@ -39,7 +39,6 @@ static const struct demod_module demod_modules[] = { .register_frontend = aml_dvb_register_frontend, .unregister_frontend = aml_dvb_unregister_frontend }, -#ifdef DEMOD_UNUSED { .name = "m1", .id = AM_DTV_DEMOD_M1, @@ -64,7 +63,6 @@ static const struct demod_module demod_modules[] = { .register_frontend = aml_dvb_register_frontend, .unregister_frontend = aml_dvb_unregister_frontend }, -#endif //DEMOD_UNUSED { .name = "avl6211", .id = AM_DTV_DEMOD_AVL6211, @@ -89,7 +87,6 @@ static const struct demod_module demod_modules[] = { .register_frontend = aml_dvb_register_frontend, .unregister_frontend = aml_dvb_unregister_frontend }, -#ifdef DEMOD_UNUSED { .name = "ite9173", .id = AM_DTV_DEMOD_ITE9173, @@ -162,7 +159,6 @@ static const struct demod_module demod_modules[] = { .register_frontend = aml_dvb_register_frontend, .unregister_frontend = aml_dvb_unregister_frontend }, -#endif //DEMOD_UNUSED { .name = "atbm8881", .id = AM_DTV_DEMOD_ATBM8881, @@ -247,7 +243,6 @@ static const struct demod_module demod_modules[] = { .register_frontend = aml_dvb_register_frontend, .unregister_frontend = aml_dvb_unregister_frontend }, -#ifdef DEMOD_UNUSED { .name = "mxl212c", .id = AM_DTV_DEMOD_MXL212C, @@ -320,7 +315,6 @@ static const struct demod_module demod_modules[] = { .register_frontend = aml_dvb_register_frontend, .unregister_frontend = aml_dvb_unregister_frontend }, -#endif //DEMOD_UNUSED { .name = "mxl258c", //compatible with mxl212c/213c/214c/252c/254c/256c. .id = AM_DTV_DEMOD_MXL258C, diff --git a/drivers/dvb/aml_tuner.c b/drivers/dvb/aml_tuner.c index e09c02ff1..34be69980 100644 --- a/drivers/dvb/aml_tuner.c +++ b/drivers/dvb/aml_tuner.c @@ -13,7 +13,6 @@ static int aml_tuner_match(const struct tuner_module *module, int std); static int aml_tuner_detect(const struct tuner_config *cfg); static const struct tuner_module tuner_modules[] = { -#ifdef TUNER_UNUSED { .name = "si2176", .id = AM_TUNER_SI2176, @@ -98,7 +97,6 @@ static const struct tuner_module tuner_modules[] = { .match = aml_tuner_match, .detect = aml_tuner_detect }, -#endif //TUNER_UNUSED { .name = "r840", .id = AM_TUNER_R840, @@ -116,7 +114,6 @@ static const struct tuner_module tuner_modules[] = { .match = aml_tuner_match, .detect = aml_tuner_detect }, -#ifdef TUNER_UNUSED { .name = "si2157", .id = AM_TUNER_SI2157, @@ -134,7 +131,6 @@ static const struct tuner_module tuner_modules[] = { .match = aml_tuner_match, .detect = aml_tuner_detect }, -#endif //TUNER_UNUSED { .name = "si2151", .id = AM_TUNER_SI2151, From eddc7c36ca0dcc55a516ae0d83ddfd342f178997 Mon Sep 17 00:00:00 2001 From: Marek Czerski Date: Sat, 20 Sep 2025 11:32:34 +0200 Subject: [PATCH 4/4] DTS: dts for mecool kt1 --- arch/arm64/boot/dts/amlogic/Makefile | 1 + .../boot/dts/amlogic/coreelec_common.dtsi | 1 + .../boot/dts/amlogic/coreelec_sc2_common.dtsi | 2 + .../dts/amlogic/sc2_s905x4_mecool_kt1.dts | 116 ++++++++++++++++++ .../boot/dts/amlogic/sc2_s905x4_ugoos_x4.dts | 2 - 5 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 arch/arm64/boot/dts/amlogic/sc2_s905x4_mecool_kt1.dts diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile index 116313084..105403b5b 100644 --- a/arch/arm64/boot/dts/amlogic/Makefile +++ b/arch/arm64/boot/dts/amlogic/Makefile @@ -77,6 +77,7 @@ dtb-y += sc2_s905x4_buzztv_x5_2g.dtb dtb-y += sc2_s905x4_buzztv_x5_2g_1gbit.dtb dtb-y += sc2_s905x4_buzztv_x5_4g.dtb dtb-y += sc2_s905x4_buzztv_x5_4g_1gbit.dtb +dtb-y += sc2_s905x4_mecool_kt1.dtb dtb-y += sc2_s905x4_sei_smb_280_id5.dtb dtb-y += sc2_s905x4_sei_smb_280_id6.dtb dtb-y += sc2_s905x4_sei_smb_280_id7.dtb diff --git a/arch/arm64/boot/dts/amlogic/coreelec_common.dtsi b/arch/arm64/boot/dts/amlogic/coreelec_common.dtsi index ab0bd3e81..d47e21943 100644 --- a/arch/arm64/boot/dts/amlogic/coreelec_common.dtsi +++ b/arch/arm64/boot/dts/amlogic/coreelec_common.dtsi @@ -71,6 +71,7 @@ pinctrl-0 = <&remote_pins>; protocol = ; max_frame_time = <200>; /*set software decoder max frame time*/ + led_blink = <1>; }; openvfd { diff --git a/arch/arm64/boot/dts/amlogic/coreelec_sc2_common.dtsi b/arch/arm64/boot/dts/amlogic/coreelec_sc2_common.dtsi index a9c740e83..c2429bbfa 100644 --- a/arch/arm64/boot/dts/amlogic/coreelec_sc2_common.dtsi +++ b/arch/arm64/boot/dts/amlogic/coreelec_sc2_common.dtsi @@ -128,6 +128,8 @@ key_name = "power"; key_code = <116>; }; + + /delete-node/ gpio_leds; }; &aml_wifi { diff --git a/arch/arm64/boot/dts/amlogic/sc2_s905x4_mecool_kt1.dts b/arch/arm64/boot/dts/amlogic/sc2_s905x4_mecool_kt1.dts new file mode 100644 index 000000000..7848ccdef --- /dev/null +++ b/arch/arm64/boot/dts/amlogic/sc2_s905x4_mecool_kt1.dts @@ -0,0 +1,116 @@ +#include "sc2_s905x4_ah212_drm.dts" +#include "coreelec_sc2_common.dtsi" + +/ { + model = "Mecool KT1"; + coreelec-dt-id = "sc2_s905x4_mecool_kt1"; + + auge_sound { + /delete-property/ avout_mute-gpios; + }; + + gpioleds { + sys_led { + label = "sys_led"; + gpios = <&gpio GPIOD_11 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "default-on"; + }; + net_led { + label = "net_led"; + gpios=<&gpio GPIOD_4 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "none"; + }; + rc_led { + label = "rc_led"; + gpios=<&gpio GPIOD_6 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "rc-feedback"; + }; + }; + + gpio_keypad { + status = "disabled"; + }; + + /delete-node/ dvb-extern; + dvb-extern { + compatible = "amlogic, dvb-extern"; + dev_name = "dvb-extern"; + status = "okay"; + + fe_num = <1>; + fe0_demod = "avl68xx"; + fe0_i2c_adap_id = <&i2c3>; + fe0_demod_i2c_addr = <0x14>; + fe0_ts_out_mode = <1>; + fe0_ts = <1>; + fe0_tuner0 = <0>; + + tuner_num = <1>; + tuner0_name = "mxl603_tuner"; + tuner0_i2c_adap = <&i2c3>; + tuner0_i2c_addr = <0x60>; + tuner0_xtal = <0>; + tuner0_if_hz = <6>; + tuner0_if_agc = <0>; + tuner0_xtal_cap = <25>; + tuner0_if_invert = <1>; + tuner0_lt_out = <0>; + tuner0_xtal_mode = <0>; + tuner0_dual_power = <0>; + }; + + /delete-node/ dvb-demux; + dvb-demux { + compatible = "amlogic sc2, dvb-demux"; + dev_name = "dvb-demux"; + status = "okay"; + + reg = <0x0 0xfe000000 0x0 0x480000>; + + dmxdev_num = <3>; + + tsn_from = "demod"; + ts_clone = <0>; + tee_compat = <1>; + + ts1_sid = <0x20>; + ts1 = "parallel"; + ts1_control = <0>; + ts1_invert = <0>; + + pinctrl-names = "p_ts1"; + pinctrl-0 = <&dvb_p_ts1_pins>; + }; +}; + +&i2c2 { + status = "disabled"; +}; + +&i2c3 { + status = "okay"; +}; + +&sd_emmc_b { + max-frequency = <150000000>; +}; + +&periphs_pinctrl { + dvb_p_ts1_pins: dvb_p_ts1_pins { + tsin_b { + groups = "tsin_b_sop", + "tsin_b_valid", + "tsin_b_clk", + "tsin_b_fail", + "tsin_b_din0", + "tsin_b_din1", + "tsin_b_din2", + "tsin_b_din3", + "tsin_b_din4", + "tsin_b_din5", + "tsin_b_din6", + "tsin_b_din7"; + function = "tsin_b"; + }; + }; +}; diff --git a/arch/arm64/boot/dts/amlogic/sc2_s905x4_ugoos_x4.dts b/arch/arm64/boot/dts/amlogic/sc2_s905x4_ugoos_x4.dts index adfe5932e..f380902ac 100644 --- a/arch/arm64/boot/dts/amlogic/sc2_s905x4_ugoos_x4.dts +++ b/arch/arm64/boot/dts/amlogic/sc2_s905x4_ugoos_x4.dts @@ -4,8 +4,6 @@ model = "Ugoos X4"; coreelec-dt-id = "sc2_s905x4_ugoos_x4"; - /delete-node/ gpio_leds; - gpioleds { /delete-node/ net_red; /delete-node/ net_green;