122851890Sopenharmony_cidiff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
222851890Sopenharmony_ciindex 3cd7e76cc562..2a08002ea765 100644
322851890Sopenharmony_ci--- a/arch/arm64/kernel/vmlinux.lds.S
422851890Sopenharmony_ci+++ b/arch/arm64/kernel/vmlinux.lds.S
522851890Sopenharmony_ci@@ -260,6 +260,15 @@ SECTIONS
622851890Sopenharmony_ci 		INIT_RAM_FS
722851890Sopenharmony_ci 		*(.init.altinstructions .init.bss)	/* from the EFI stub */
822851890Sopenharmony_ci 	}
922851890Sopenharmony_ci+
1022851890Sopenharmony_ci+#ifdef CONFIG_DRIVERS_HDF
1122851890Sopenharmony_ci+	.init.hdf_table : {
1222851890Sopenharmony_ci+		_hdf_drivers_start = .;
1322851890Sopenharmony_ci+		*(.hdf.driver)
1422851890Sopenharmony_ci+		_hdf_drivers_end = .;
1522851890Sopenharmony_ci+	}
1622851890Sopenharmony_ci+#endif
1722851890Sopenharmony_ci+
1822851890Sopenharmony_ci 	.exit.data : {
1922851890Sopenharmony_ci 		EXIT_DATA
2022851890Sopenharmony_ci 	}
2122851890Sopenharmony_cidiff --git a/drivers/Kconfig b/drivers/Kconfig
2222851890Sopenharmony_ciindex efb66e25fa2d..c03c41f408cb 100644
2322851890Sopenharmony_ci--- a/drivers/Kconfig
2422851890Sopenharmony_ci+++ b/drivers/Kconfig
2522851890Sopenharmony_ci@@ -235,6 +235,8 @@ source "drivers/interconnect/Kconfig"
2622851890Sopenharmony_ci 
2722851890Sopenharmony_ci source "drivers/counter/Kconfig"
2822851890Sopenharmony_ci 
2922851890Sopenharmony_ci+source "drivers/hdf/khdf/Kconfig"
3022851890Sopenharmony_ci+
3122851890Sopenharmony_ci source "drivers/most/Kconfig"
3222851890Sopenharmony_ci 
3322851890Sopenharmony_ci source "drivers/peci/Kconfig"
3422851890Sopenharmony_cidiff --git a/drivers/Makefile b/drivers/Makefile
3522851890Sopenharmony_ciindex 1bec7819a837..c34686c8bc82 100644
3622851890Sopenharmony_ci--- a/drivers/Makefile
3722851890Sopenharmony_ci+++ b/drivers/Makefile
3822851890Sopenharmony_ci@@ -192,6 +192,7 @@ obj-$(CONFIG_SIOX)		+= siox/
3922851890Sopenharmony_ci obj-$(CONFIG_GNSS)		+= gnss/
4022851890Sopenharmony_ci obj-$(CONFIG_INTERCONNECT)	+= interconnect/
4122851890Sopenharmony_ci obj-$(CONFIG_COUNTER)		+= counter/
4222851890Sopenharmony_ci+obj-$(CONFIG_DRIVERS_HDF)	+= hdf/
4322851890Sopenharmony_ci obj-$(CONFIG_MOST)		+= most/
4422851890Sopenharmony_ci obj-$(CONFIG_PECI)		+= peci/
4522851890Sopenharmony_ci obj-$(CONFIG_HTE)		+= hte/
4622851890Sopenharmony_cidiff --git a/drivers/hdf/Makefile b/drivers/hdf/Makefile
4722851890Sopenharmony_cinew file mode 100644
4822851890Sopenharmony_ciindex 000000000000..5c5e1911c4f7
4922851890Sopenharmony_ci--- /dev/null
5022851890Sopenharmony_ci+++ b/drivers/hdf/Makefile
5122851890Sopenharmony_ci@@ -0,0 +1,2 @@
5222851890Sopenharmony_ci+export PROJECT_ROOT := ../../../../../
5322851890Sopenharmony_ci+obj-$(CONFIG_DRIVERS_HDF) += khdf/
5422851890Sopenharmony_cidiff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
5522851890Sopenharmony_ciindex 8a06d0f840bc..5e3382ccdcbf 100644
5622851890Sopenharmony_ci--- a/drivers/hid/Makefile
5722851890Sopenharmony_ci+++ b/drivers/hid/Makefile
5822851890Sopenharmony_ci@@ -2,6 +2,19 @@
5922851890Sopenharmony_ci #
6022851890Sopenharmony_ci # Makefile for the HID driver
6122851890Sopenharmony_ci #
6222851890Sopenharmony_ci+HDF_ROOT_DIR = -I$(srctree)/drivers/hdf
6322851890Sopenharmony_ci+ccflags-$(CONFIG_DRIVERS_HDF_INPUT) += $(HDF_ROOT_DIR)/framework/model/input/driver \
6422851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/framework/include/core \
6522851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/framework/core/common/include/host \
6622851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/framework/include/utils \
6722851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/framework/include/osal \
6822851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/framework/ability/sbuf/include \
6922851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/inner_api/utils \
7022851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/inner_api/osal/shared \
7122851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/inner_api/core \
7222851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/inner_api/host/shared \
7322851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/khdf/osal/include \
7422851890Sopenharmony_ci+             $(HDF_ROOT_DIR)/evdev
7522851890Sopenharmony_ci hid-y			:= hid-core.o hid-input.o hid-quirks.o
7622851890Sopenharmony_ci hid-$(CONFIG_DEBUG_FS)		+= hid-debug.o
7722851890Sopenharmony_ci 
7822851890Sopenharmony_cidiff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
7922851890Sopenharmony_ciindex e0181218ad85..57125af807d3 100644
8022851890Sopenharmony_ci--- a/drivers/hid/hid-core.c
8122851890Sopenharmony_ci+++ b/drivers/hid/hid-core.c
8222851890Sopenharmony_ci@@ -33,6 +33,9 @@
8322851890Sopenharmony_ci #include <linux/hid-debug.h>
8422851890Sopenharmony_ci #include <linux/hidraw.h>
8522851890Sopenharmony_ci 
8622851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
8722851890Sopenharmony_ci+#include "hdf_hid_adapter.h"
8822851890Sopenharmony_ci+#endif
8922851890Sopenharmony_ci #include "hid-ids.h"
9022851890Sopenharmony_ci 
9122851890Sopenharmony_ci /*
9222851890Sopenharmony_ci@@ -1541,6 +1544,11 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field,
9322851890Sopenharmony_ci 		hidinput_hid_event(hid, field, usage, value);
9422851890Sopenharmony_ci 	if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event)
9522851890Sopenharmony_ci 		hid->hiddev_hid_event(hid, field, usage, value);
9622851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
9722851890Sopenharmony_ci+	if (hid->input_dev) {
9822851890Sopenharmony_ci+		HidReportEvent(hid->input_dev, usage->type, usage->code, value);
9922851890Sopenharmony_ci+	}
10022851890Sopenharmony_ci+#endif
10122851890Sopenharmony_ci }
10222851890Sopenharmony_ci 
10322851890Sopenharmony_ci /*
10422851890Sopenharmony_ci@@ -2166,6 +2174,81 @@ static const struct device_attribute dev_attr_country = {
10522851890Sopenharmony_ci 	.show = show_country,
10622851890Sopenharmony_ci };
10722851890Sopenharmony_ci 
10822851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
10922851890Sopenharmony_ci+static bool check_mouse(char *name)
11022851890Sopenharmony_ci+{
11122851890Sopenharmony_ci+	static char *option[]={"Mouse", "mouse", "MOUSE", "Razer"};
11222851890Sopenharmony_ci+	for (int i = 0; i < 4; i++) {
11322851890Sopenharmony_ci+		if (strstr(name, option[i]))
11422851890Sopenharmony_ci+			return true;
11522851890Sopenharmony_ci+	}
11622851890Sopenharmony_ci+	return false;
11722851890Sopenharmony_ci+}
11822851890Sopenharmony_ci+static bool check_kbd(char *name)
11922851890Sopenharmony_ci+{
12022851890Sopenharmony_ci+	static char *option[]={"Keyboard", "keyboard"};
12122851890Sopenharmony_ci+	for (int i = 0; i < 2; i++) {
12222851890Sopenharmony_ci+		if (strstr(name, option[i]))
12322851890Sopenharmony_ci+			return true;
12422851890Sopenharmony_ci+	}
12522851890Sopenharmony_ci+	return false;
12622851890Sopenharmony_ci+}
12722851890Sopenharmony_ci+static bool check_rocker(char *name)
12822851890Sopenharmony_ci+{
12922851890Sopenharmony_ci+	static char *option[]={"Thrustmaster"};
13022851890Sopenharmony_ci+	for (int i = 0; i < 1; i++) {
13122851890Sopenharmony_ci+		if (strstr(name, option[i]))
13222851890Sopenharmony_ci+			return true;
13322851890Sopenharmony_ci+	}
13422851890Sopenharmony_ci+	return false;
13522851890Sopenharmony_ci+}
13622851890Sopenharmony_ci+static bool check_encoder(char *name)
13722851890Sopenharmony_ci+{
13822851890Sopenharmony_ci+	if (strcmp(name, "Wired KeyBoard") == 0) {
13922851890Sopenharmony_ci+		return true;
14022851890Sopenharmony_ci+	}
14122851890Sopenharmony_ci+	return false;
14222851890Sopenharmony_ci+}
14322851890Sopenharmony_ci+static bool check_trackball(char *name)
14422851890Sopenharmony_ci+{
14522851890Sopenharmony_ci+	static char *option[]={"Trackball"};
14622851890Sopenharmony_ci+	for (int i = 0; i < 1; i++) {
14722851890Sopenharmony_ci+		if (strstr(name, option[i]))
14822851890Sopenharmony_ci+			return true;
14922851890Sopenharmony_ci+	}
15022851890Sopenharmony_ci+	return false;
15122851890Sopenharmony_ci+}
15222851890Sopenharmony_ci+static void notify_connect_event(struct hid_device *hdev)
15322851890Sopenharmony_ci+{
15422851890Sopenharmony_ci+	bool check;
15522851890Sopenharmony_ci+	int type = -1;
15622851890Sopenharmony_ci+	HidInfo *dev = (HidInfo *)kmalloc(sizeof(HidInfo), GFP_KERNEL);
15722851890Sopenharmony_ci+	if (dev == NULL) {
15822851890Sopenharmony_ci+		printk("%s: malloc failed", __func__);
15922851890Sopenharmony_ci+		return;
16022851890Sopenharmony_ci+	}
16122851890Sopenharmony_ci+	type = check_mouse(hdev->name)?HID_TYPE_MOUSE:type;
16222851890Sopenharmony_ci+	type = check_kbd(hdev->name)?HID_TYPE_KEYBOARD:type;
16322851890Sopenharmony_ci+	type = check_rocker(hdev->name)?HID_TYPE_ROCKER:type;
16422851890Sopenharmony_ci+	type = check_encoder(hdev->name)?HID_TYPE_ENCODER:type;
16522851890Sopenharmony_ci+	type = check_trackball(hdev->name)?HID_TYPE_TRACKBALL:type;
16622851890Sopenharmony_ci+	if ( type < 0) {
16722851890Sopenharmony_ci+		kfree(dev);
16822851890Sopenharmony_ci+		dev = NULL;
16922851890Sopenharmony_ci+		return;
17022851890Sopenharmony_ci+	}
17122851890Sopenharmony_ci+
17222851890Sopenharmony_ci+	dev->devType = type;
17322851890Sopenharmony_ci+	dev->devName = hdev->name;
17422851890Sopenharmony_ci+	hdev->input_dev = HidRegisterHdfInputDev(dev);
17522851890Sopenharmony_ci+	if (hdev->input_dev == NULL) {
17622851890Sopenharmony_ci+		printk("%s: RegisterInputDevice failed\n", __func__);
17722851890Sopenharmony_ci+	}
17822851890Sopenharmony_ci+	kfree(dev);
17922851890Sopenharmony_ci+	dev = NULL;
18022851890Sopenharmony_ci+}
18122851890Sopenharmony_ci+#endif
18222851890Sopenharmony_ci+
18322851890Sopenharmony_ci int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
18422851890Sopenharmony_ci {
18522851890Sopenharmony_ci 	static const char *types[] = { "Device", "Pointer", "Mouse", "Device",
18622851890Sopenharmony_ci@@ -2268,6 +2351,9 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
18722851890Sopenharmony_ci 	hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n",
18822851890Sopenharmony_ci 		 buf, bus, hdev->version >> 8, hdev->version & 0xff,
18922851890Sopenharmony_ci 		 type, hdev->name, hdev->phys);
19022851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
19122851890Sopenharmony_ci+	notify_connect_event(hdev);
19222851890Sopenharmony_ci+#endif
19322851890Sopenharmony_ci 
19422851890Sopenharmony_ci 	return 0;
19522851890Sopenharmony_ci }
19622851890Sopenharmony_ci@@ -2283,7 +2369,10 @@ void hid_disconnect(struct hid_device *hdev)
19722851890Sopenharmony_ci 	if (hdev->claimed & HID_CLAIMED_HIDRAW)
19822851890Sopenharmony_ci 		hidraw_disconnect(hdev);
19922851890Sopenharmony_ci 	hdev->claimed = 0;
20022851890Sopenharmony_ci-
20122851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
20222851890Sopenharmony_ci+	if (hdev->input_dev)
20322851890Sopenharmony_ci+		HidUnregisterHdfInputDev(hdev->input_dev);
20422851890Sopenharmony_ci+#endif
20522851890Sopenharmony_ci 	hid_bpf_disconnect_device(hdev);
20622851890Sopenharmony_ci }
20722851890Sopenharmony_ci EXPORT_SYMBOL_GPL(hid_disconnect);
20822851890Sopenharmony_ci@@ -2369,6 +2458,11 @@ EXPORT_SYMBOL_GPL(hid_hw_open);
20922851890Sopenharmony_ci  */
21022851890Sopenharmony_ci void hid_hw_close(struct hid_device *hdev)
21122851890Sopenharmony_ci {
21222851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
21322851890Sopenharmony_ci+	if (hdev->input_dev) {
21422851890Sopenharmony_ci+		return;
21522851890Sopenharmony_ci+	}
21622851890Sopenharmony_ci+#endif
21722851890Sopenharmony_ci 	mutex_lock(&hdev->ll_open_lock);
21822851890Sopenharmony_ci 	if (!--hdev->ll_open_count)
21922851890Sopenharmony_ci 		hdev->ll_driver->close(hdev);
22022851890Sopenharmony_cidiff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
22122851890Sopenharmony_ciindex c8b20d44b147..710495f014a9 100644
22222851890Sopenharmony_ci--- a/drivers/hid/hid-input.c
22322851890Sopenharmony_ci+++ b/drivers/hid/hid-input.c
22422851890Sopenharmony_ci@@ -20,6 +20,10 @@
22522851890Sopenharmony_ci #include <linux/hid.h>
22622851890Sopenharmony_ci #include <linux/hid-debug.h>
22722851890Sopenharmony_ci 
22822851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
22922851890Sopenharmony_ci+#include "hdf_hid_adapter.h"
23022851890Sopenharmony_ci+#endif
23122851890Sopenharmony_ci+
23222851890Sopenharmony_ci #include "hid-ids.h"
23322851890Sopenharmony_ci 
23422851890Sopenharmony_ci #define unk	KEY_UNKNOWN
23522851890Sopenharmony_ci@@ -1745,7 +1749,15 @@ void hidinput_report_event(struct hid_device *hid, struct hid_report *report)
23622851890Sopenharmony_ci 		return;
23722851890Sopenharmony_ci 
23822851890Sopenharmony_ci 	list_for_each_entry(hidinput, &hid->inputs, list)
23922851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
24022851890Sopenharmony_ci+	{
24122851890Sopenharmony_ci+#endif
24222851890Sopenharmony_ci 		input_sync(hidinput->input);
24322851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
24422851890Sopenharmony_ci+		if(hid->input_dev)
24522851890Sopenharmony_ci+			HidReportEvent(hid->input_dev, EV_SYN, SYN_REPORT, 0);
24622851890Sopenharmony_ci+	}
24722851890Sopenharmony_ci+#endif
24822851890Sopenharmony_ci }
24922851890Sopenharmony_ci EXPORT_SYMBOL_GPL(hidinput_report_event);
25022851890Sopenharmony_ci 
25122851890Sopenharmony_ci@@ -2267,6 +2279,41 @@ static inline void hidinput_configure_usages(struct hid_input *hidinput,
25222851890Sopenharmony_ci 						 j);
25322851890Sopenharmony_ci }
25422851890Sopenharmony_ci 
25522851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
25622851890Sopenharmony_ci+static void transfer_info(struct input_dev *dev)
25722851890Sopenharmony_ci+{
25822851890Sopenharmony_ci+	HidInfo *info = (HidInfo *)kmalloc(sizeof(HidInfo),GFP_KERNEL);
25922851890Sopenharmony_ci+	if (info == NULL) {
26022851890Sopenharmony_ci+		printk("%s: malloc failed\n",__func__);
26122851890Sopenharmony_ci+		return;
26222851890Sopenharmony_ci+	}
26322851890Sopenharmony_ci+	info->devName = dev->name;
26422851890Sopenharmony_ci+	memcpy(info->devProp, dev->propbit, sizeof(unsigned long) * BITS_TO_LONGS(INPUT_PROP_CNT));
26522851890Sopenharmony_ci+	memcpy(info->eventType, dev->evbit, sizeof(unsigned long) * BITS_TO_LONGS(EV_CNT));
26622851890Sopenharmony_ci+	memcpy(info->keyCode, dev->keybit, sizeof(unsigned long) * BITS_TO_LONGS(KEY_CNT));
26722851890Sopenharmony_ci+	memcpy(info->relCode, dev->relbit, sizeof(unsigned long) * BITS_TO_LONGS(REL_CNT));
26822851890Sopenharmony_ci+	memcpy(info->absCode, dev->absbit, sizeof(unsigned long) * BITS_TO_LONGS(ABS_CNT));
26922851890Sopenharmony_ci+	memcpy(info->miscCode, dev->mscbit, sizeof(unsigned long) * BITS_TO_LONGS(MSC_CNT));
27022851890Sopenharmony_ci+	memcpy(info->ledCode, dev->ledbit, sizeof(unsigned long) * BITS_TO_LONGS(LED_CNT));
27122851890Sopenharmony_ci+	memcpy(info->soundCode, dev->sndbit, sizeof(unsigned long) * BITS_TO_LONGS(SND_CNT));
27222851890Sopenharmony_ci+	memcpy(info->forceCode, dev->ffbit, sizeof(unsigned long) * BITS_TO_LONGS(FF_CNT));
27322851890Sopenharmony_ci+	memcpy(info->switchCode, dev->swbit, sizeof(unsigned long) * BITS_TO_LONGS(SW_CNT));
27422851890Sopenharmony_ci+	for (int i = 0; i < BITS_TO_LONGS(ABS_CNT); i++) {
27522851890Sopenharmony_ci+		if (dev->absbit[i] != 0) {
27622851890Sopenharmony_ci+			memcpy(info->axisInfo, dev->absinfo, sizeof(struct input_absinfo) * ABS_CNT);
27722851890Sopenharmony_ci+			break;
27822851890Sopenharmony_ci+		}
27922851890Sopenharmony_ci+	}
28022851890Sopenharmony_ci+	info->bustype = dev->id.bustype;
28122851890Sopenharmony_ci+	info->vendor = dev->id.vendor;
28222851890Sopenharmony_ci+	info->product = dev->id.product;
28322851890Sopenharmony_ci+	info->version = dev->id.version;
28422851890Sopenharmony_ci+	SendInfoToHdf(info);
28522851890Sopenharmony_ci+	kfree(info);
28622851890Sopenharmony_ci+	info = NULL;
28722851890Sopenharmony_ci+}
28822851890Sopenharmony_ci+#endif
28922851890Sopenharmony_ci+
29022851890Sopenharmony_ci /*
29122851890Sopenharmony_ci  * Register the input device; print a message.
29222851890Sopenharmony_ci  * Configure the input layer interface
29322851890Sopenharmony_ci@@ -2352,6 +2399,9 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
29422851890Sopenharmony_ci 			continue;
29522851890Sopenharmony_ci 		}
29622851890Sopenharmony_ci 
29722851890Sopenharmony_ci+#if defined(CONFIG_DRIVERS_HDF_INPUT)
29822851890Sopenharmony_ci+		transfer_info(hidinput->input);
29922851890Sopenharmony_ci+#endif
30022851890Sopenharmony_ci 		if (input_register_device(hidinput->input))
30122851890Sopenharmony_ci 			goto out_unwind;
30222851890Sopenharmony_ci 		hidinput->registered = true;
30322851890Sopenharmony_cidiff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
30422851890Sopenharmony_ciindex 04296a4abe8e..31315c7ac6ae 100644
30522851890Sopenharmony_ci--- a/drivers/input/misc/Makefile
30622851890Sopenharmony_ci+++ b/drivers/input/misc/Makefile
30722851890Sopenharmony_ci@@ -90,3 +90,22 @@ obj-$(CONFIG_INPUT_WM831X_ON)		+= wm831x-on.o
30822851890Sopenharmony_ci obj-$(CONFIG_INPUT_XEN_KBDDEV_FRONTEND)	+= xen-kbdfront.o
30922851890Sopenharmony_ci obj-$(CONFIG_INPUT_YEALINK)		+= yealink.o
31022851890Sopenharmony_ci obj-$(CONFIG_INPUT_IDEAPAD_SLIDEBAR)	+= ideapad_slidebar.o
31122851890Sopenharmony_ci+
31222851890Sopenharmony_ci+ccflags-y +=-I$(srctree)/drivers/hdf/framework/model/input/driver \
31322851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/model/input/driver/input_bus_ops \
31422851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/include/core \
31522851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/core/common/include/host \
31622851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/include/utils \
31722851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/include/osal \
31822851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/include/platform \
31922851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/include/config \
32022851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/core/host/include \
32122851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/core/shared/include \
32222851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/framework/utils/include \
32322851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/inner_api/osal/shared \
32422851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/inner_api/host/shared \
32522851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/inner_api/utils \
32622851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/inner_api/core \
32722851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/khdf/osal/include
32822851890Sopenharmony_ci+ccflags-y +=-I$(srctree)/bounds_checking_function/include \
32922851890Sopenharmony_ci+             -I$(srctree)/drivers/hdf/evdev
33022851890Sopenharmony_cidiff --git a/drivers/input/misc/rk805-pwrkey.c b/drivers/input/misc/rk805-pwrkey.c
33122851890Sopenharmony_ciindex 76873aa005b4..4ef4b031fdb8 100644
33222851890Sopenharmony_ci--- a/drivers/input/misc/rk805-pwrkey.c
33322851890Sopenharmony_ci+++ b/drivers/input/misc/rk805-pwrkey.c
33422851890Sopenharmony_ci@@ -14,6 +14,9 @@
33522851890Sopenharmony_ci #include <linux/kernel.h>
33622851890Sopenharmony_ci #include <linux/module.h>
33722851890Sopenharmony_ci #include <linux/platform_device.h>
33822851890Sopenharmony_ci+#include "hdf_hid_adapter.h"
33922851890Sopenharmony_ci+
34022851890Sopenharmony_ci+InputDevice *HidinputDev = NULL;
34122851890Sopenharmony_ci 
34222851890Sopenharmony_ci static irqreturn_t pwrkey_fall_irq(int irq, void *_pwr)
34322851890Sopenharmony_ci {
34422851890Sopenharmony_ci@@ -22,6 +25,9 @@ static irqreturn_t pwrkey_fall_irq(int irq, void *_pwr)
34522851890Sopenharmony_ci 	input_report_key(pwr, KEY_POWER, 1);
34622851890Sopenharmony_ci 	input_sync(pwr);
34722851890Sopenharmony_ci 
34822851890Sopenharmony_ci+	HidReportEvent(HidinputDev, EV_KEY, KEY_POWER, 1);
34922851890Sopenharmony_ci+	HidReportEvent(HidinputDev, EV_SYN, SYN_REPORT, 0);
35022851890Sopenharmony_ci+
35122851890Sopenharmony_ci 	return IRQ_HANDLED;
35222851890Sopenharmony_ci }
35322851890Sopenharmony_ci 
35422851890Sopenharmony_ci@@ -32,9 +38,25 @@ static irqreturn_t pwrkey_rise_irq(int irq, void *_pwr)
35522851890Sopenharmony_ci 	input_report_key(pwr, KEY_POWER, 0);
35622851890Sopenharmony_ci 	input_sync(pwr);
35722851890Sopenharmony_ci 
35822851890Sopenharmony_ci+	HidReportEvent(HidinputDev, EV_KEY, KEY_POWER, 0);
35922851890Sopenharmony_ci+	HidReportEvent(HidinputDev, EV_SYN, SYN_REPORT, 0);
36022851890Sopenharmony_ci+
36122851890Sopenharmony_ci 	return IRQ_HANDLED;
36222851890Sopenharmony_ci }
36322851890Sopenharmony_ci 
36422851890Sopenharmony_ci+static InputDevice* HidRegisterHdfPowerKeyDev(void) 
36522851890Sopenharmony_ci+{
36622851890Sopenharmony_ci+	InputDevice* inputDev = NULL;
36722851890Sopenharmony_ci+	HidInfo Hid_keyInfo;
36822851890Sopenharmony_ci+
36922851890Sopenharmony_ci+	Hid_keyInfo.devType = HID_TYPE_KEY;
37022851890Sopenharmony_ci+	Hid_keyInfo.eventType[0] = SET_BIT(EV_KEY);
37122851890Sopenharmony_ci+	Hid_keyInfo.keyCode[3] = SET_BIT(KEY_POWER);
37222851890Sopenharmony_ci+	Hid_keyInfo.devName = "hid-powerkey";
37322851890Sopenharmony_ci+	inputDev = HidRegisterHdfInputDev(&Hid_keyInfo);
37422851890Sopenharmony_ci+	return inputDev;
37522851890Sopenharmony_ci+}
37622851890Sopenharmony_ci+
37722851890Sopenharmony_ci static int rk805_pwrkey_probe(struct platform_device *pdev)
37822851890Sopenharmony_ci {
37922851890Sopenharmony_ci 	struct input_dev *pwr;
38022851890Sopenharmony_ci@@ -87,6 +109,12 @@ static int rk805_pwrkey_probe(struct platform_device *pdev)
38122851890Sopenharmony_ci 	platform_set_drvdata(pdev, pwr);
38222851890Sopenharmony_ci 	device_init_wakeup(&pdev->dev, true);
38322851890Sopenharmony_ci 
38422851890Sopenharmony_ci+	HidinputDev = HidRegisterHdfPowerKeyDev();
38522851890Sopenharmony_ci+	if (NULL == HidinputDev) {
38622851890Sopenharmony_ci+		pr_err("HidRegisterHdfInputDev error\n");
38722851890Sopenharmony_ci+		return -EINVAL;
38822851890Sopenharmony_ci+	}
38922851890Sopenharmony_ci+
39022851890Sopenharmony_ci 	return 0;
39122851890Sopenharmony_ci }
39222851890Sopenharmony_ci 
39322851890Sopenharmony_cidiff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c
39422851890Sopenharmony_ciindex 505c562a5daa..67d451beba08 100644
39522851890Sopenharmony_ci--- a/drivers/input/mousedev.c
39622851890Sopenharmony_ci+++ b/drivers/input/mousedev.c
39722851890Sopenharmony_ci@@ -869,7 +869,7 @@ static struct mousedev *mousedev_create(struct input_dev *dev,
39822851890Sopenharmony_ci 
39922851890Sopenharmony_ci 	if (mixdev) {
40022851890Sopenharmony_ci 		dev_set_name(&mousedev->dev, "mice");
40122851890Sopenharmony_ci-
40222851890Sopenharmony_ci+		mousedev->open = 1;
40322851890Sopenharmony_ci 		mousedev->open_device = mixdev_open_devices;
40422851890Sopenharmony_ci 		mousedev->close_device = mixdev_close_devices;
40522851890Sopenharmony_ci 	} else {
40622851890Sopenharmony_cidiff --git a/drivers/usb/core/notify.c b/drivers/usb/core/notify.c
40722851890Sopenharmony_ciindex e6143663778f..8256d576c762 100644
40822851890Sopenharmony_ci--- a/drivers/usb/core/notify.c
40922851890Sopenharmony_ci+++ b/drivers/usb/core/notify.c
41022851890Sopenharmony_ci@@ -66,3 +66,12 @@ void usb_notify_remove_bus(struct usb_bus *ubus)
41122851890Sopenharmony_ci {
41222851890Sopenharmony_ci 	blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus);
41322851890Sopenharmony_ci }
41422851890Sopenharmony_ci+
41522851890Sopenharmony_ci+void usb_notify_online_status(bool online)
41622851890Sopenharmony_ci+{
41722851890Sopenharmony_ci+	if (online) {
41822851890Sopenharmony_ci+		blocking_notifier_call_chain(&usb_notifier_list, USB_GADGET_ADD, NULL);
41922851890Sopenharmony_ci+	} else {
42022851890Sopenharmony_ci+		blocking_notifier_call_chain(&usb_notifier_list, USB_GADGET_REMOVE, NULL);
42122851890Sopenharmony_ci+	}
42222851890Sopenharmony_ci+}
42322851890Sopenharmony_cidiff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
42422851890Sopenharmony_ciindex 28f49400f3e8..abcc53a0779c 100644
42522851890Sopenharmony_ci--- a/drivers/usb/dwc3/gadget.c
42622851890Sopenharmony_ci+++ b/drivers/usb/dwc3/gadget.c
42722851890Sopenharmony_ci@@ -4360,6 +4360,7 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc,
42822851890Sopenharmony_ci {
42922851890Sopenharmony_ci 	switch (event->type) {
43022851890Sopenharmony_ci 	case DWC3_DEVICE_EVENT_DISCONNECT:
43122851890Sopenharmony_ci+		usb_notify_online_status(false);
43222851890Sopenharmony_ci 		dwc3_gadget_disconnect_interrupt(dwc);
43322851890Sopenharmony_ci 		break;
43422851890Sopenharmony_ci 	case DWC3_DEVICE_EVENT_RESET:
43522851890Sopenharmony_ci@@ -4367,6 +4368,7 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc,
43622851890Sopenharmony_ci 		break;
43722851890Sopenharmony_ci 	case DWC3_DEVICE_EVENT_CONNECT_DONE:
43822851890Sopenharmony_ci 		dwc3_gadget_conndone_interrupt(dwc);
43922851890Sopenharmony_ci+		usb_notify_online_status(true);
44022851890Sopenharmony_ci 		break;
44122851890Sopenharmony_ci 	case DWC3_DEVICE_EVENT_WAKEUP:
44222851890Sopenharmony_ci 		dwc3_gadget_wakeup_interrupt(dwc, event->event_info);
44322851890Sopenharmony_cidiff --git a/include/linux/hid.h b/include/linux/hid.h
44422851890Sopenharmony_ciindex 3b08a2957229..046de8cd3be0 100644
44522851890Sopenharmony_ci--- a/include/linux/hid.h
44622851890Sopenharmony_ci+++ b/include/linux/hid.h
44722851890Sopenharmony_ci@@ -686,6 +686,7 @@ struct hid_device {							/* device report descriptor */
44822851890Sopenharmony_ci #ifdef CONFIG_BPF
44922851890Sopenharmony_ci 	struct hid_bpf bpf;						/* hid-bpf data */
45022851890Sopenharmony_ci #endif /* CONFIG_BPF */
45122851890Sopenharmony_ci+	void *input_dev;
45222851890Sopenharmony_ci };
45322851890Sopenharmony_ci 
45422851890Sopenharmony_ci void hiddev_free(struct kref *ref);
45522851890Sopenharmony_cidiff --git a/include/linux/usb.h b/include/linux/usb.h
45622851890Sopenharmony_ciindex a21074861f91..9e75513e4f7e 100644
45722851890Sopenharmony_ci--- a/include/linux/usb.h
45822851890Sopenharmony_ci+++ b/include/linux/usb.h
45922851890Sopenharmony_ci@@ -2056,8 +2056,11 @@ static inline int usb_translate_errors(int error_code)
46022851890Sopenharmony_ci #define USB_DEVICE_REMOVE	0x0002
46122851890Sopenharmony_ci #define USB_BUS_ADD		0x0003
46222851890Sopenharmony_ci #define USB_BUS_REMOVE		0x0004
46322851890Sopenharmony_ci+#define USB_GADGET_ADD		0x0005
46422851890Sopenharmony_ci+#define USB_GADGET_REMOVE	0x0006
46522851890Sopenharmony_ci extern void usb_register_notify(struct notifier_block *nb);
46622851890Sopenharmony_ci extern void usb_unregister_notify(struct notifier_block *nb);
46722851890Sopenharmony_ci+extern void usb_notify_online_status(bool online);
46822851890Sopenharmony_ci 
46922851890Sopenharmony_ci /* debugfs stuff */
47022851890Sopenharmony_ci extern struct dentry *usb_debug_root;
471