From 022183eb6e5585e4e12c2141ceece040ceca6d7d Mon Sep 17 00:00:00 2001 From: Paolo Sabatino Date: Wed, 11 Oct 2023 22:48:45 +0200 Subject: [PATCH] rk322x: fix NEC/NECX/NEC32 protocol handling for rockchip-ir driver --- .../general-rk322x-gpio-ir-driver.patch | 34 ++++++++++-------- .../general-rk322x-gpio-ir-driver.patch | 35 +++++++++++-------- 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/patch/kernel/archive/rk322x-6.1/general-rk322x-gpio-ir-driver.patch b/patch/kernel/archive/rk322x-6.1/general-rk322x-gpio-ir-driver.patch index 25645bad32..1b86088df6 100644 --- a/patch/kernel/archive/rk322x-6.1/general-rk322x-gpio-ir-driver.patch +++ b/patch/kernel/archive/rk322x-6.1/general-rk322x-gpio-ir-driver.patch @@ -46,10 +46,10 @@ index a9285266e944..057d5b64c121 100644 obj-$(CONFIG_IR_SPI) += ir-spi.o diff --git a/drivers/media/rc/rockchip-ir.c b/drivers/media/rc/rockchip-ir.c new file mode 100644 -index 000000000000..06c483cd8d5b +index 000000000000..43ade8c4adce --- /dev/null +++ b/drivers/media/rc/rockchip-ir.c -@@ -0,0 +1,723 @@ +@@ -0,0 +1,732 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright (c) 2012, Code Aurora Forum. All rights reserved. +*/ @@ -377,7 +377,8 @@ index 000000000000..06c483cd8d5b + + struct rc_map *key_map; + struct rc_map_table *key; -+ int idx, scancode; ++ int idx, key_scancode, rev_scancode; ++ int tee_scancode; + + key_map = &gpio_dev->rcdev->rc_map; + @@ -389,14 +390,22 @@ index 000000000000..06c483cd8d5b + + if (key->keycode != KEY_POWER) + continue; ++ ++ key_scancode = key->scancode; ++ rev_scancode = ~key_scancode; ++ ++ // If key_scancode has higher 16 bits set to 0, then the scancode is NEC protocol, otherwise it is NECX/NEC32 ++ if ((key_scancode & 0xffff) == key_scancode) ++ tee_scancode = (key_scancode & 0xff00) | ((rev_scancode & 0xff00) << 8); // NEC protocol ++ else ++ tee_scancode = ((key_scancode & 0xff0000) >> 8) | ((key_scancode & 0xff00) << 8); // NECX/NEC32 protocol ++ ++ tee_scancode |= rev_scancode & 0xff; ++ tee_scancode <<= 8; ++ ++ sip_smc_remotectl_config(REMOTECTL_SET_PWRKEY, tee_scancode); + -+ scancode = ((key->scancode & 0xff0000) >> 8) | ((key->scancode & 0xff00) << 8); -+ scancode |= (~key->scancode) & 0xff; -+ scancode <<= 8; -+ -+ sip_smc_remotectl_config(REMOTECTL_SET_PWRKEY, scancode); -+ -+ dev_info(dev, "registered scancode %08llx (SIP: %8x)\n", key->scancode, scancode); ++ dev_info(dev, "registered scancode %08x (SIP: %8x)\n", key_scancode, tee_scancode); + + } + @@ -752,7 +761,7 @@ index 000000000000..06c483cd8d5b +#endif + +static const struct of_device_id rockchip_ir_recv_of_match[] = { -+ { .compatible = "rockchip-ir", }, ++ { .compatible = "rockchip-ir-receiver", }, + { }, +}; +MODULE_DEVICE_TABLE(of, rockchip_ir_recv_of_match); @@ -773,6 +782,3 @@ index 000000000000..06c483cd8d5b + +MODULE_DESCRIPTION("Rockchip IR Receiver driver"); +MODULE_LICENSE("GPL v2"); --- -2.34.1 - diff --git a/patch/kernel/archive/rk322x-6.5/general-rk322x-gpio-ir-driver.patch b/patch/kernel/archive/rk322x-6.5/general-rk322x-gpio-ir-driver.patch index 25645bad32..63c72af314 100644 --- a/patch/kernel/archive/rk322x-6.5/general-rk322x-gpio-ir-driver.patch +++ b/patch/kernel/archive/rk322x-6.5/general-rk322x-gpio-ir-driver.patch @@ -46,10 +46,10 @@ index a9285266e944..057d5b64c121 100644 obj-$(CONFIG_IR_SPI) += ir-spi.o diff --git a/drivers/media/rc/rockchip-ir.c b/drivers/media/rc/rockchip-ir.c new file mode 100644 -index 000000000000..06c483cd8d5b +index 000000000000..43ade8c4adce --- /dev/null +++ b/drivers/media/rc/rockchip-ir.c -@@ -0,0 +1,723 @@ +@@ -0,0 +1,733 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright (c) 2012, Code Aurora Forum. All rights reserved. +*/ @@ -59,6 +59,7 @@ index 000000000000..06c483cd8d5b +#include +#include +#include ++#include +#include +#include +#include @@ -377,7 +378,8 @@ index 000000000000..06c483cd8d5b + + struct rc_map *key_map; + struct rc_map_table *key; -+ int idx, scancode; ++ int idx, key_scancode, rev_scancode; ++ int tee_scancode; + + key_map = &gpio_dev->rcdev->rc_map; + @@ -389,14 +391,22 @@ index 000000000000..06c483cd8d5b + + if (key->keycode != KEY_POWER) + continue; ++ ++ key_scancode = key->scancode; ++ rev_scancode = ~key_scancode; ++ ++ // If key_scancode has higher 16 bits set to 0, then the scancode is NEC protocol, otherwise it is NECX/NEC32 ++ if ((key_scancode & 0xffff) == key_scancode) ++ tee_scancode = (key_scancode & 0xff00) | ((rev_scancode & 0xff00) << 8); // NEC protocol ++ else ++ tee_scancode = ((key_scancode & 0xff0000) >> 8) | ((key_scancode & 0xff00) << 8); // NECX/NEC32 protocol ++ ++ tee_scancode |= rev_scancode & 0xff; ++ tee_scancode <<= 8; ++ ++ sip_smc_remotectl_config(REMOTECTL_SET_PWRKEY, tee_scancode); + -+ scancode = ((key->scancode & 0xff0000) >> 8) | ((key->scancode & 0xff00) << 8); -+ scancode |= (~key->scancode) & 0xff; -+ scancode <<= 8; -+ -+ sip_smc_remotectl_config(REMOTECTL_SET_PWRKEY, scancode); -+ -+ dev_info(dev, "registered scancode %08llx (SIP: %8x)\n", key->scancode, scancode); ++ dev_info(dev, "registered scancode %08x (SIP: %8x)\n", key_scancode, tee_scancode); + + } + @@ -752,7 +762,7 @@ index 000000000000..06c483cd8d5b +#endif + +static const struct of_device_id rockchip_ir_recv_of_match[] = { -+ { .compatible = "rockchip-ir", }, ++ { .compatible = "rockchip-ir-receiver", }, + { }, +}; +MODULE_DEVICE_TABLE(of, rockchip_ir_recv_of_match); @@ -773,6 +783,3 @@ index 000000000000..06c483cd8d5b + +MODULE_DESCRIPTION("Rockchip IR Receiver driver"); +MODULE_LICENSE("GPL v2"); --- -2.34.1 -