diff --git a/src/bach/build.bach/work/libmodem-afe-ctrl/mt2735/src/pcm_ctrl.c b/src/bach/build.bach/work/libmodem-afe-ctrl/mt2735/src/pcm_ctrl.c
index 65b7397..c35c914 100644
--- a/src/bach/build.bach/work/libmodem-afe-ctrl/mt2735/src/pcm_ctrl.c
+++ b/src/bach/build.bach/work/libmodem-afe-ctrl/mt2735/src/pcm_ctrl.c
@@ -156,7 +156,6 @@
 //TBD
 static const Mixer_pair BT_ENABLE_SEQ[] = {
 	/*{mixer name, option name}*/
-	{"ETDM_HD_Mux", "Normal"},
 };
 
 static const Mixer_pair SPK_DISABLE_SEQ[] = {
@@ -189,7 +188,6 @@
 //TBD
 static const Mixer_pair BT_DISABLE_SEQ[] = {
 	/*{mixer name, option name}*/
-	{"ETDM_HD_Mux", "Normal"},
 };
 
 static const Mixer_pair INT_CODEC_INTERCONN_SEQ[] = {
@@ -202,6 +200,10 @@
 
 static const Mixer_pair BT_INTERCONN_SEQ[] = {
 	/*{mixer name, option name}*/
+	{"PCM_2_PB_CH1 PCM_0_CAP_CH1", "1"},
+	{"PCM_2_PB_CH2 PCM_0_CAP_CH2", "1"},
+	{"PCM_0_PB_CH1 PCM_2_CAP_CH1", "1"},
+	{"PCM_0_PB_CH2 PCM_2_CAP_CH1", "1"},
 };
 
 /*external codec seq, should modify if new codec applied*/
diff --git a/src/bsp/lk/platform/mt2735/drivers/ssusb/mtu3.c b/src/bsp/lk/platform/mt2735/drivers/ssusb/mtu3.c
index 9db63b7..c628262 100644
--- a/src/bsp/lk/platform/mt2735/drivers/ssusb/mtu3.c
+++ b/src/bsp/lk/platform/mt2735/drivers/ssusb/mtu3.c
@@ -887,6 +887,10 @@
     g_u3d.is_u3_ip = !!SSUSB_IP_DEV_U3_PORT_NUM(val);
     DBG_C("IP version 0x%x(%s IP)\n", readl(U3D_SSUSB_HW_ID),
           g_u3d.is_u3_ip ? "U3" : "U2");
+    if (g_u3d.is_u3_ip) {
+        DBG_C("fastboot support U2 only, disable U3 by default\n");
+        g_u3d.is_u3_ip = !g_u3d.is_u3_ip;
+    }
 }
 
 static void mu3d_hw_init(void)
diff --git a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb-ivt-emmc.dts b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb-ivt-emmc.dts
index 442f46d..6a33422 100644
--- a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb-ivt-emmc.dts
+++ b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb-ivt-emmc.dts
@@ -641,6 +641,88 @@
 			bias-pull-down=<MTK_PUPD_SET_R1R0_01>;
 		};
 	};
+
+	aud_gpio_pcm0_off: aud_gpio_pcm0_off {
+		pins_cmd0_dat {
+			pinmux = <PINMUX_GPIO97__FUNC_GPIO97>;
+			input-enable;
+			bias-pull-down;
+		};
+		pins_cmd1_dat {
+			pinmux = <PINMUX_GPIO98__FUNC_GPIO98>;
+			input-enable;
+			bias-pull-down;
+		};
+		pins_cmd2_dat {
+			pinmux = <PINMUX_GPIO99__FUNC_GPIO99>;
+			input-enable;
+			bias-pull-down;
+		};
+		pins_cmd3_dat {
+			pinmux = <PINMUX_GPIO100__FUNC_GPIO100>;
+			input-enable;
+			bias-pull-down;
+		};
+	};
+	aud_gpio_pcm0_on: aud_gpio_pcm0_on {
+		pins_cmd0_dat {
+			pinmux = <PINMUX_GPIO97__FUNC_PCM0_CLK>;
+			bias-disable;
+		};
+		pins_cmd1_dat {
+			pinmux = <PINMUX_GPIO98__FUNC_PCM0_SYNC>;
+			bias-disable;
+		};
+		pins_cmd2_dat {
+			pinmux = <PINMUX_GPIO99__FUNC_PCM0_DI>;
+			bias-disable;
+		};
+		pins_cmd3_dat {
+			pinmux = <PINMUX_GPIO100__FUNC_PCM0_DO>;
+			bias-disable;
+		};
+	};
+
+	aud_gpio_pcm1_off: aud_gpio_pcm1_off {
+		pins_cmd0_dat {
+			pinmux = <PINMUX_GPIO199__FUNC_GPIO199>;
+			input-enable;
+			bias-pull-down;
+		};
+		pins_cmd1_dat {
+			pinmux = <PINMUX_GPIO200__FUNC_GPIO200>;
+			input-enable;
+			bias-pull-down;
+		};
+		pins_cmd2_dat {
+			pinmux = <PINMUX_GPIO201__FUNC_GPIO201>;
+			input-enable;
+			bias-pull-down;
+		};
+		pins_cmd3_dat {
+			pinmux = <PINMUX_GPIO202__FUNC_GPIO202>;
+			input-enable;
+			bias-pull-down;
+		};
+	};
+	aud_gpio_pcm1_on: aud_gpio_pcm1_on {
+		pins_cmd0_dat {
+			pinmux = <PINMUX_GPIO199__FUNC_PCM1_CLK>;
+			bias-disable;
+		};
+		pins_cmd1_dat {
+			pinmux = <PINMUX_GPIO200__FUNC_PCM1_SYNC>;
+			bias-disable;
+		};
+		pins_cmd2_dat {
+			pinmux = <PINMUX_GPIO201__FUNC_PCM1_DI>;
+			bias-disable;
+		};
+		pins_cmd3_dat {
+			pinmux = <PINMUX_GPIO202__FUNC_PCM1_DO>;
+			bias-disable;
+		};
+	};
 };
 
 &pcie0 {
diff --git a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts
index db270c9..2e97b3c 100755
--- a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts
+++ b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts
@@ -1269,14 +1269,14 @@
 	aud_pins_extamp_high: audexamphigh {
 		pins_cmd0_dat {
 			pinmux = <PINMUX_GPIO27__FUNC_GPIO27>;
-			output-high;
+			output-low;
 		};
 	};
 	aud_pins_extamp_low: audexamplow {
 		pins_cmd0_dat {
 			pinmux = <PINMUX_GPIO27__FUNC_GPIO27>;
-			input-enable;
-			bias-pull-down=<MTK_PUPD_SET_R1R0_01>;
+			//input-enable;
+			//bias-pull-down=<MTK_PUPD_SET_R1R0_01>;
 		};
 	};
 };
diff --git a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt6330.dtsi b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt6330.dtsi
index 48bc13b..3d686dc 100644
--- a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt6330.dtsi
+++ b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt6330.dtsi
@@ -350,6 +350,15 @@
 				bits = <6 1>;
 			};
 		};
+
+		mt6330chrdet: mt6330chrdet {
+			compatible = "mediatek,mt6330-chrdet";
+
+			chr_det: chr_det {
+				enable;
+				wakeup-source;
+			};
+		};
 	};
 };
 
diff --git a/src/kernel/linux/v4.19/arch/arm64/configs/auto2735evb_defconfig b/src/kernel/linux/v4.19/arch/arm64/configs/auto2735evb_defconfig
index 335e5da..b114cf1 100644
--- a/src/kernel/linux/v4.19/arch/arm64/configs/auto2735evb_defconfig
+++ b/src/kernel/linux/v4.19/arch/arm64/configs/auto2735evb_defconfig
@@ -368,7 +368,7 @@
 CONFIG_EXTCON_MTK_USB=y
 CONFIG_MTK_USB_TYPEC_U3_MUX=y
 CONFIG_TCPC_CLASS=y
-# CONFIG_TCPC_RT1711H is not set
+CONFIG_TCPC_RT1711H=y
 CONFIG_MTK_TINYSYS_SSPM_SUPPORT=y
 CONFIG_MTK_TINYSYS_MCUPM_SUPPORT=y
 CONFIG_MTK_TINYSYS_MEDMCU_SUPPORT=y
diff --git a/src/kernel/linux/v4.19/drivers/mfd/mt6330-core.c b/src/kernel/linux/v4.19/drivers/mfd/mt6330-core.c
index 0da7dc7..4dbb81f 100644
--- a/src/kernel/linux/v4.19/drivers/mfd/mt6330-core.c
+++ b/src/kernel/linux/v4.19/drivers/mfd/mt6330-core.c
@@ -81,6 +81,10 @@
 	DEFINE_RES_IRQ_NAMED(MT6330_IRQ_VRFCK_OC, "VRFCK"),
 };
 
+static const struct resource mt6330_chrdet_resources[] = {
+	DEFINE_RES_IRQ(MT6330_IRQ_CHRDET_EDGE),
+};
+
 static const struct mfd_cell mt6330_devs[] = {
 	{
 		.name = "mt635x-auxadc",
@@ -119,6 +123,11 @@
 	}, {
 		.name = "mt63xx-ot-debug",
 		.of_compatible = "mediatek,mt63xx-ot-debug",
+	}, {
+		.name = "mtk-pmic-chrdet",
+		.num_resources = ARRAY_SIZE(mt6330_chrdet_resources),
+		.resources = mt6330_chrdet_resources,
+		.of_compatible = "mediatek,mt6330-chrdet",
 	},
 };
 
@@ -134,44 +143,42 @@
 	.cid_shift = 0,
 };
 
-static int mt6330_spmi_read(void *context, const void *reg, size_t reg_size,
-			    void *val, size_t val_size)
+static int mt6330_spmi_reg_read(void *context,
+				unsigned int reg, unsigned int *val)
+{
+	struct mt6330_chip *data = context;
+	u8 regval = 0;
+	int ret;
+
+	ret = spmi_ext_register_readl(data->sdev, reg, &regval, 1);
+	if (ret < 0)
+		return ret;
+	*val = regval;
+
+	return 0;
+}
+
+static int mt6330_spmi_reg_write(void *context,
+				 unsigned int reg, unsigned int val)
 {
 	struct mt6330_chip *data = context;
 	int ret;
-	u16 addr = cpu_to_be16(*(u16 *)reg);
 
-	ret = spmi_ext_register_readl(data->sdev, addr, val, val_size);
+	ret = spmi_ext_register_writel(data->sdev, reg, (u8 *)&val, 1);
+	if (ret)
+		return ret;
 
-	return ret;
+	return 0;
 }
 
-static int mt6330_spmi_write(void *context, const void *data, size_t count)
-{
-	struct mt6330_chip *ddata = context;
-	u16 addr = cpu_to_be16(*(u16 *)data);
-	u8 *val = (u8 *)data + 2;
-	int val_size = count - 2;
-	int ret;
-
-	ret = spmi_ext_register_writel(ddata->sdev, addr, (u8 *)val, val_size);
-
-	return ret;
-}
-
-static struct regmap_bus mt6330_regmap_bus = {
-	.read = mt6330_spmi_read,
-	.write = mt6330_spmi_write,
-	.max_raw_read = 2,
-	.max_raw_write = 2,
-};
-
 static const struct regmap_config spmi_regmap_config = {
 	.reg_bits	= 16,
 	.val_bits	= 8,
 	.max_register	= 0x22ff,
 	.fast_io	= true,
-	.use_single_rw  = false,
+	.use_single_rw  = true,
+	.reg_read	= mt6330_spmi_reg_read,
+	.reg_write	= mt6330_spmi_reg_write,
 };
 static int mt6330_probe(struct spmi_device *sdev)
 {
@@ -197,8 +204,7 @@
 	 * mt6330 MFD is child device of soc pmic spmi.
 	 * Regmap is set from its parent.
 	 */
-	regmap = devm_regmap_init(&sdev->dev, &mt6330_regmap_bus,
-				pmic, &spmi_regmap_config);
+	regmap = devm_regmap_init(&sdev->dev, NULL, pmic, &spmi_regmap_config);
 	if (IS_ERR(regmap))
 		return PTR_ERR(regmap);
 	pmic->regmap = regmap;
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/Makefile
index 5d0f05e..27c40f3 100644
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/Makefile
+++ b/src/kernel/linux/v4.19/drivers/misc/mediatek/Makefile
@@ -65,6 +65,7 @@
 obj-$(CONFIG_MTK_LEDS) += leds/
 obj-$(CONFIG_MTK_PCIE) += pcie/
 obj-$(CONFIG_EXTCON_MTK_USB) += extcon/
+obj-$(CONFIG_EXTCON_MTK_USB_MICRO_B) += extcon/
 obj-$(CONFIG_MTK_MHCCIF) += mhccif/
 obj-$(CONFIG_MTK_USB_TYPEC) += typec/
 obj-$(CONFIG_USB) += usb_boost/
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/extcon/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/extcon/Kconfig
index a4637e5..44e631a 100644
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/extcon/Kconfig
+++ b/src/kernel/linux/v4.19/drivers/misc/mediatek/extcon/Kconfig
@@ -1,3 +1,10 @@
+choice
+    help
+      Choose MTK Extcon USB Type here.
+      EXTCON_MTK_USB is for USB TypeC
+      EXTCON_MITK_USB_MICRO_B is for USB MicroB
+    prompt "MTK Extcon USB Type Selection"
+    default EXTCON_MTK_USB
 config EXTCON_MTK_USB
 	tristate "MediaTek EXTCON USB Support"
 	select EXTCON
@@ -5,3 +12,12 @@
 	help
 	  Say Y here to enable extcon support for USB cable detection
 	  on the Mediatek PMIC.
+
+config EXTCON_MTK_USB_MICRO_B
+	help
+	  Say Y here to enable extcon support for Micro TypeB USB cable
+	  detection on the Mediatek PMIC.
+	tristate "MediaTek EXTCON USB Micro TypeB Support"
+	select EXTCON
+	select USB_ROLE_SWITCH
+endchoice
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/extcon/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/extcon/Makefile
index 165c62d..d3f0f60 100644
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/extcon/Makefile
+++ b/src/kernel/linux/v4.19/drivers/misc/mediatek/extcon/Makefile
@@ -3,3 +3,4 @@
 ccflags-$(CONFIG_TCPC_CLASS) += -I$(srctree)/drivers/misc/mediatek/typec/tcpc/inc
 
 obj-$(CONFIG_EXTCON_MTK_USB) += extcon-mtk-usb.o
+obj-$(CONFIG_EXTCON_MTK_USB_MICRO_B) += extcon-mtk-usb-microb.o mtk-pmic-chrdet.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/Kconfig
deleted file mode 100644
index 1598dc1..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/Kconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-config MTK_SENSOR_DRIVERS
-	string "MTK SENSOR DRIVERS"
-    default "test"
-	help
-	  Sensor config for sensor drivers in project.
-	  Please put sensor drives's folder name in it
-	  If unsure, set test.
-
-source "drivers/misc/mediatek/sensor/2.0/mtk_nanohub/Kconfig"
\ No newline at end of file
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/Makefile
deleted file mode 100644
index 763abd5..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-#in case the platform does NOT support this type of sensors
-
-obj-y += core/
-
-ifeq ($(CONFIG_CUSTOM_KERNEL_SENSORHUB),y)
-obj-$(CONFIG_NANOHUB) += mtk_nanohub/
-endif
-
-SENSOR_DRIVER_LIST := $(subst ",,$(CONFIG_MTK_SENSOR_DRIVERS))
-obj-y += $(foreach DRIVER,$(SENSOR_DRIVER_LIST),$(DRIVER)/)
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp280_baro/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp280_baro/Makefile
deleted file mode 100644
index 55a1d29..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp280_baro/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensor/2.0/core/
-
-obj-y += bmp280_baro.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp280_baro/bmp280_baro.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp280_baro/bmp280_baro.c
deleted file mode 100644
index dd9647f..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp280_baro/bmp280_baro.c
+++ /dev/null
@@ -1,1012 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/of.h>
-#include <linux/delay.h>
-#include <linux/math64.h>
-
-#include "hf_manager.h"
-#include "bmp280_baro.h"
-#include "sensor_list.h"
-
-#define BMP280_BARO_NAME "bmp280_baro"
-//#define DEBUG_DATA 1
-
-#ifdef DEBUG_DATA
-#define	BMP_DATA_LOG(fmt, args...)  pr_info(fmt, ##args)
-#else
-#define	BMP_DATA_LOG(fmt, args...)
-#endif
-
-static unsigned char support_sensors[] = {
-	SENSOR_TYPE_PRESSURE,
-};
-
-/* data type */
-#define BMP280_U16_t u16
-#define BMP280_S16_t s16
-#define BMP280_U32_t u32
-#define BMP280_S32_t s32
-#define BMP280_U64_t u64
-#define BMP280_S64_t s64
-
-#define C_I2C_FIFO_SIZE               8
-#define CHECK_CHIP_ID_TIME_MAX        5
-
-/* power mode */
-enum BMP_POWERMODE_ENUM {
-	BMP280_SLEEP_MODE = 0x00,
-	BMP280_FORCED_MODE = 0x01,
-	BMP280_NORMAL_MODE = 0x03,
-
-	BMP280_UNDEFINED_POWERMODE = 0xff
-};
-
-/* filter */
-enum BMP_FILTER_ENUM {
-	BMP_FILTER_OFF = 0x0,
-	BMP_FILTER_2,
-	BMP_FILTER_4,
-	BMP_FILTER_8,
-	BMP_FILTER_16,
-
-	BMP_UNDEFINED_FILTER = 0xff
-};
-/* oversampling */
-enum BMP_OVERSAMPLING_ENUM {
-	BMP_OVERSAMPLING_SKIPPED = 0x0,
-	BMP_OVERSAMPLING_1X,
-	BMP_OVERSAMPLING_2X,
-	BMP_OVERSAMPLING_4X,
-	BMP_OVERSAMPLING_8X,
-	BMP_OVERSAMPLING_16X,
-
-	BMP_UNDEFINED_OVERSAMPLING = 0xff
-};
-
-/* bmp280 calibration */
-struct bmp280_calibration_data {
-	BMP280_U16_t dig_T1;
-	BMP280_S16_t dig_T2;
-	BMP280_S16_t dig_T3;
-	BMP280_U16_t dig_P1;
-	BMP280_S16_t dig_P2;
-	BMP280_S16_t dig_P3;
-	BMP280_S16_t dig_P4;
-	BMP280_S16_t dig_P5;
-	BMP280_S16_t dig_P6;
-	BMP280_S16_t dig_P7;
-	BMP280_S16_t dig_P8;
-	BMP280_S16_t dig_P9;
-};
-
-#define C_MAX_FIR_LENGTH (32)
-#define BMP_DATA_NUM 1
-
-/* s/w filter */
-struct data_filter {
-	u32 raw[C_MAX_FIR_LENGTH][BMP_DATA_NUM];
-	int sum[BMP_DATA_NUM];
-	int num;
-	int idx;
-};
-
-struct baro_hw {
-	int i2c_num;
-	int direction;
-	int power_id;
-	int power_vol;
-	int firlen;    /*!< the length of low pass filter */
-	int (*power)(struct baro_hw *hw, unsigned int on, char *devname);
-	//unsigned char i2c_addr[B_CUST_I2C_ADDR_NUM];
-
-	/*!< i2c address list,for chips which has different addresses with
-	 * different HW layout
-	 */
-	bool is_batch_supported;
-};
-
-struct bmp280_baro_device {
-	struct hf_device hf_dev;
-	atomic_t raw_enable;
-	enum BMP_POWERMODE_ENUM power_mode;
-	enum BMP_FILTER_ENUM filter_num;
-	enum BMP_OVERSAMPLING_ENUM  ovsampling_p;
-	enum BMP_OVERSAMPLING_ENUM  ovsampling_t;
-	unsigned long last_temp_measurement;
-	unsigned long temp_measurement_period;
-	struct bmp280_calibration_data bmp280_cali;
-
-	/* calculated temperature correction coefficient */
-	s32 t_fine;
-	atomic_t filter;
-	uint8_t placement[3];
-
-#if defined(CONFIG_BMP_LOWPASS)
-	struct baro_hw hw;
-	atomic_t firlen;
-	atomic_t fir_en;
-	struct data_filter fir;
-#endif
-
-};
-
-/* I2C operation functions */
-static int bmp280_baro_i2c_read_block(struct i2c_client *client,
-				u8 addr, u8 *data, u8 len)
-{
-	int err = 0;
-	u8 beg = addr;
-	struct i2c_msg msgs[2] = {
-		{/*.addr = client->addr,*/
-		 .flags = 0,
-		 .len = 1,
-		 .buf = &beg},
-		{
-			/*.addr = client->addr*/
-			.flags = I2C_M_RD,
-			.len = len,
-			.buf = data,
-		} };
-	if (!client)
-		return -EINVAL;
-	msgs[0].addr = client->addr;
-	msgs[1].addr = client->addr;
-
-	err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
-	if (err != 2) {
-		pr_err_ratelimited("bmp280 i2c_trans err:%x %x (%d %p %d) %d\n",
-				   msgs[0].addr, client->addr, addr, data, len,
-				   err);
-		err = -EIO;
-	} else {
-		err = 0; /*no error*/
-	}
-	return err;
-}
-
-static int bmp280_baro_i2c_write_block(struct i2c_client *client,
-			u8 addr, u8 *data, u8 len)
-{
-	/* because address also occupies one byte,
-	 * the maximum length for write is 7 bytes
-	 */
-	int err = 0, idx = 0, num = 0;
-	char buf[32];
-
-	if (!client)
-		return -EINVAL;
-	else if (len > C_I2C_FIFO_SIZE) {
-		pr_err_ratelimited("bmp280 len %d fi %d\n", len,
-				   C_I2C_FIFO_SIZE);
-		return -EINVAL;
-	}
-	buf[num++] = addr;
-	for (idx = 0; idx < len; idx++)
-		buf[num++] = data[idx];
-
-	err = i2c_master_send(client, buf, num);
-	if (err < 0) {
-		pr_err_ratelimited("bmp280 send command error!!\n");
-		return -EFAULT;
-	}
-
-	return err;
-}
-
-static int bmp280_baro_soft_reset(struct i2c_client *client)
-{
-	int err = -1;
-	uint8_t data = BMP280_BARO_SOFT_RESET_VALUE;
-
-	err = bmp280_baro_i2c_write_block(client,
-			BMP280_BARO_RESET_ADDR, &data, 1);
-
-	return err;
-}
-
-static int bmp280_baro_check_chip_id(struct i2c_client *client)
-{
-	int err = -1;
-	u8 chip_id = 0;
-	u8 read_count = 0;
-
-	while (read_count++ < CHECK_CHIP_ID_TIME_MAX) {
-		bmp280_baro_i2c_read_block(client,
-				BMP280_BARO_CHIP_ID_ADDR, &chip_id, 1);
-
-		if (chip_id != BMP280_BARO_CHIP_ID_VALUE1 &&
-			chip_id != BMP280_BARO_CHIP_ID_VALUE2 &&
-			chip_id != BMP280_BARO_CHIP_ID_VALUE3) {
-			pr_info("bmp280 get chipId fail(0x%2x).\n", chip_id);
-		} else {
-			err = 0;
-			pr_info("bmp280 get chipId success(0x%2x).\n", chip_id);
-			break;
-		}
-	}
-	return err;
-}
-
-static int bmp280_get_calibration_data(struct i2c_client *client)
-{
-	int status = 0;
-	struct bmp280_baro_device *driver_dev = i2c_get_clientdata(client);
-	u8 a_data_u8r[BMP280_CALIBRATION_DATA_LENGTH] = {0};
-
-	status = bmp280_baro_i2c_read_block(
-			client, BMP280_CALIBRATION_DATA_START, a_data_u8r,
-			BMP280_CALIBRATION_DATA_LENGTH);
-	if (status < 0) {
-		pr_info("bmp280 get cali exit: read data fail!");
-		return status;
-	}
-
-	for (status = 0; status < BMP280_CALIBRATION_DATA_LENGTH; status++)
-		BMP_DATA_LOG("bmp280 cali data: data[%d]:0x%x\n", status,
-			     a_data_u8r[status]);
-
-	driver_dev->bmp280_cali.dig_T1 = (BMP280_U16_t)(
-			(((BMP280_U16_t)((unsigned char)a_data_u8r[1]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[0]);
-	driver_dev->bmp280_cali.dig_T2 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[3]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[2]);
-	driver_dev->bmp280_cali.dig_T3 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[5]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[4]);
-	driver_dev->bmp280_cali.dig_P1 = (BMP280_U16_t)(
-			(((BMP280_U16_t)((unsigned char)a_data_u8r[7]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[6]);
-	driver_dev->bmp280_cali.dig_P2 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[9]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[8]);
-	driver_dev->bmp280_cali.dig_P3 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[11]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[10]);
-	driver_dev->bmp280_cali.dig_P4 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[13]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[12]);
-	driver_dev->bmp280_cali.dig_P5 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[15]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[14]);
-	driver_dev->bmp280_cali.dig_P6 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[17]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[16]);
-	driver_dev->bmp280_cali.dig_P7 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[19]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[18]);
-	driver_dev->bmp280_cali.dig_P8 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[21]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[20]);
-	driver_dev->bmp280_cali.dig_P9 = (BMP280_S16_t)(
-			(((BMP280_S16_t)((signed char)a_data_u8r[23]))
-			 << SHIFT_LEFT_8_POSITION) |
-			a_data_u8r[22]);
-
-	return 0;
-}
-
-
-static int bmp280_baro_set_powermode(struct i2c_client *client,
-				     enum BMP_POWERMODE_ENUM power_mode)
-{
-	int err;
-	u8 data = 0;
-	struct bmp280_baro_device *driver_dev = i2c_get_clientdata(client);
-
-	if (power_mode == BMP280_UNDEFINED_POWERMODE) {
-		pr_info("bmp280 power invalid:%d,(old %d)\n",
-			 power_mode, driver_dev->power_mode);
-		err = -1;
-		return err;
-	}
-
-	if (power_mode == driver_dev->power_mode) {
-		pr_info("bmp280 power no change:%d,(old %d)\n",
-			power_mode, driver_dev->power_mode);
-		return 0;
-	}
-
-	err = bmp280_baro_i2c_read_block(client, BMP280_CTRLMEAS_REG_MODE__REG,
-					 &data, 1);
-	data = BMP_SET_BITSLICE(data, BMP280_CTRLMEAS_REG_MODE,
-				power_mode);
-	err += bmp280_baro_i2c_write_block(client,
-					   BMP280_CTRLMEAS_REG_MODE__REG,
-					   &data, 1);
-
-	if (err < 0)
-		pr_err("bmp280 set power mode failed, err = %d\n", err);
-	else
-		driver_dev->power_mode = power_mode;
-
-	return err;
-}
-
-static int bmp280_baro_set_filter(struct i2c_client *client,
-				  enum BMP_FILTER_ENUM filter)
-{
-	int err;
-	u8 data = 0;
-	struct bmp280_baro_device *driver_dev = i2c_get_clientdata(client);
-
-	if (filter == driver_dev->filter_num ||
-	    filter == BMP_UNDEFINED_FILTER) {
-		pr_info("bmp280 filter no change or invalid:%d,(old %d)\n",
-			filter, driver_dev->filter_num);
-		return 0;
-	}
-
-	err = bmp280_baro_i2c_read_block(client, BMP280_CONFIG_REG_FILTER__REG,
-					 &data, 1);
-	data = BMP_SET_BITSLICE(data, BMP280_CONFIG_REG_FILTER, filter);
-	err += bmp280_baro_i2c_write_block(client,
-					   BMP280_CONFIG_REG_FILTER__REG,
-					   &data, 1);
-
-	if (err < 0)
-		pr_err("bmp280 set filter failed, err = %d\n", err);
-	else
-		driver_dev->filter_num = filter;
-
-	return err;
-}
-
-static int bmp280_baro_set_oversampling_p
-				(struct i2c_client *client,
-				enum BMP_OVERSAMPLING_ENUM oversampling_p)
-{
-	int err;
-	u8 data = 0;
-	struct bmp280_baro_device *driver_dev = i2c_get_clientdata(client);
-
-	if (oversampling_p == driver_dev->ovsampling_p ||
-		oversampling_p == BMP_UNDEFINED_OVERSAMPLING) {
-		pr_info("bmp280 ovsampling_p no change or invlid:%d,(old:%d)\n",
-			oversampling_p, driver_dev->ovsampling_p);
-		return 0;
-	}
-
-	err = bmp280_baro_i2c_read_block(client, BMP280_CTRLMEAS_REG_OSRSP__REG,
-					&data, 1);
-	data = BMP_SET_BITSLICE(data, BMP280_CTRLMEAS_REG_OSRSP,
-				oversampling_p);
-	err += bmp280_baro_i2c_write_block(client,
-					   BMP280_CTRLMEAS_REG_OSRSP__REG,
-					   &data, 1);
-
-	if (err < 0)
-		pr_err("bmp280 set oversampling_p failed, err = %d\n", err);
-	else
-		driver_dev->ovsampling_p = oversampling_p;
-
-	return err;
-}
-
-static int bmp280_baro_set_oversampling_t
-		(struct i2c_client *client,
-		 enum BMP_OVERSAMPLING_ENUM oversampling_t)
-{
-	int err;
-	u8 data = 0;
-	struct bmp280_baro_device *driver_dev = i2c_get_clientdata(client);
-
-	if (oversampling_t == driver_dev->ovsampling_t ||
-		oversampling_t == BMP_UNDEFINED_OVERSAMPLING) {
-		pr_info("bmp280 ovsampling_t no change or invlid:%d,(old:%d)\n",
-			oversampling_t, driver_dev->ovsampling_t);
-		return 0;
-	}
-
-	err = bmp280_baro_i2c_read_block(client, BMP280_CTRLMEAS_REG_OSRST__REG,
-					 &data, 1);
-	data = BMP_SET_BITSLICE(data, BMP280_CTRLMEAS_REG_OSRST,
-				oversampling_t);
-	err += bmp280_baro_i2c_write_block(client,
-					   BMP280_CTRLMEAS_REG_OSRST__REG,
-					   &data, 1);
-
-	if (err < 0)
-		pr_err("bmp280 set oversampling_t failed, err = %d\n", err);
-	else
-		driver_dev->ovsampling_t = oversampling_t;
-
-	return err;
-}
-
-static int bmp280_baro_init_device(struct i2c_client *client)
-{
-	int err = 0;
-
-	err = bmp280_get_calibration_data(client);
-	if (err < 0) {
-		pr_err("get calibration data failed, err = %d\n", err);
-		return err;
-	}
-
-	err = bmp280_baro_set_powermode(client, BMP280_SLEEP_MODE);
-	if (err < 0) {
-		pr_err("bmp280 set power mode failed, err = %d\n", err);
-		return err;
-	}
-
-	err = bmp280_baro_set_filter(client, BMP_FILTER_8);
-	if (err < 0) {
-		pr_err("bmp280 set hw filter failed, err = %d\n", err);
-		return err;
-	}
-
-	err = bmp280_baro_set_oversampling_p(client, BMP_OVERSAMPLING_8X);
-	if (err < 0) {
-		pr_err("bmp280 set oversampling_p failed, err = %d\n", err);
-		return err;
-	}
-
-	err = bmp280_baro_set_oversampling_t(client, BMP_OVERSAMPLING_1X);
-	if (err < 0) {
-		pr_err("bmp280 set oversampling_t failed, err = %d\n", err);
-		return err;
-	}
-
-	pr_info("bmp280 baro init device success.\n");
-
-	return err;
-}
-
-static int bmp_read_raw_temperature(struct i2c_client *client,
-				    s32 *temperature)
-{
-	struct bmp280_baro_device *obj;
-	s32 err = 0;
-	unsigned char a_data_u8r[3] = {0};
-
-	if (client == NULL) {
-		err = -EINVAL;
-		return err;
-	}
-
-	obj = i2c_get_clientdata(client);
-
-	err = bmp280_baro_i2c_read_block(client, BMP280_TEMPERATURE_MSB_REG,
-					a_data_u8r, 3);
-	if (err < 0) {
-		pr_err("bmp280 read raw temperature failed, err = %d\n", err);
-		return err;
-	}
-	*temperature = (BMP280_S32_t)((((BMP280_U32_t)(a_data_u8r[0]))
-				       << SHIFT_LEFT_12_POSITION) |
-				      (((BMP280_U32_t)(a_data_u8r[1]))
-				       << SHIFT_LEFT_4_POSITION) |
-				      ((BMP280_U32_t)a_data_u8r[2] >>
-				       SHIFT_RIGHT_4_POSITION));
-
-	obj->last_temp_measurement = jiffies;
-
-	return err;
-}
-
-static int bmp_read_raw_pressure(struct i2c_client *client, s32 *pressure)
-{
-	struct bmp280_baro_device *priv;
-	s32 err = 0;
-	unsigned char a_data_u8r[3] = {0};
-
-	if (client == NULL) {
-		err = -EINVAL;
-		return err;
-	}
-
-	priv = i2c_get_clientdata(client);
-
-	err = bmp280_baro_i2c_read_block(client, BMP280_PRESSURE_MSB_REG,
-					 a_data_u8r, 3);
-	if (err < 0) {
-		pr_err("bmp280 read raw pressure failed, err = %d\n", err);
-		return err;
-	}
-	*pressure = (BMP280_S32_t)((((BMP280_U32_t)(a_data_u8r[0]))
-				    << SHIFT_LEFT_12_POSITION) |
-				   (((BMP280_U32_t)(a_data_u8r[1]))
-				    << SHIFT_LEFT_4_POSITION) |
-				   ((BMP280_U32_t)a_data_u8r[2] >>
-				    SHIFT_RIGHT_4_POSITION));
-
-#ifdef CONFIG_BMP_LOWPASS
-	/*
-	 *Example: firlen = 16, filter buffer = [0] ... [15],
-	 *when 17th data come, replace [0] with this new data.
-	 *Then, average this filter buffer and report average value to upper
-	 *layer.
-	 */
-	if (atomic_read(&priv->filter)) {
-		if (atomic_read(&priv->fir_en) &&
-		    !atomic_read(&priv->suspend)) {
-			int idx, firlen = atomic_read(&priv->firlen);
-
-			if (priv->fir.num < firlen) {
-				priv->fir.raw[priv->fir.num][BMP_PRESSURE] =
-					*pressure;
-				priv->fir.sum[BMP_PRESSURE] += *pressure;
-				if (atomic_read(&priv->trace) &
-				    BAR_TRC_FILTER) {
-					pr_debug("add [%2d] [%5d] => [%5d]\n",
-						priv->fir.num,
-						priv->fir.raw[priv->fir.num]
-							     [BMP_PRESSURE],
-						priv->fir.sum[BMP_PRESSURE]);
-				}
-				priv->fir.num++;
-				priv->fir.idx++;
-			} else {
-				idx = priv->fir.idx % firlen;
-				priv->fir.sum[BMP_PRESSURE] -=
-					priv->fir.raw[idx][BMP_PRESSURE];
-				priv->fir.raw[idx][BMP_PRESSURE] = *pressure;
-				priv->fir.sum[BMP_PRESSURE] += *pressure;
-				priv->fir.idx++;
-				*pressure =
-					priv->fir.sum[BMP_PRESSURE] / firlen;
-				if (atomic_read(&priv->trace) &
-				    BAR_TRC_FILTER) {
-					pr_debug("add[%2d][%5d]=>[%5d]:[%5d]\n",
-						idx,
-						priv->fir
-							.raw[idx][BMP_PRESSURE],
-						priv->fir.sum[BMP_PRESSURE],
-						*pressure);
-				}
-			}
-		}
-	}
-#endif
-
-	return err;
-}
-
-/*
- *get compensated temperature
- *unit:10 degrees centigrade
- */
-static int bmp_get_temperature(struct i2c_client *client, s32 *t_buf)
-{
-	struct bmp280_baro_device *driver_dev;
-	int status;
-	s32 utemp = 0; /* uncompensated temperature */
-	s32 temperature = 0;
-	BMP280_S32_t v_x1_u32r = 0;
-	BMP280_S32_t v_x2_u32r = 0;
-
-	if (client == NULL || t_buf == NULL) {
-		pr_err("bmp280 get temperature fail, invalid parameter\n");
-		return -1;
-	}
-
-	driver_dev = i2c_get_clientdata(client);
-
-	status = bmp_read_raw_temperature(client, &utemp);
-	if (status != 0) {
-		pr_info("bmp280 read raw temperature fail,status:%d\n", status);
-		return status;
-	}
-	v_x1_u32r = ((((utemp >> 3) -
-		    ((BMP280_S32_t)driver_dev->bmp280_cali.dig_T1 << 1))) *
-		    ((BMP280_S32_t)driver_dev->bmp280_cali.dig_T2)) >> 11;
-	v_x2_u32r = (((((utemp >> 4) -
-		    ((BMP280_S32_t)driver_dev->bmp280_cali.dig_T1)) *
-		    ((utemp >> 4) -
-		    ((BMP280_S32_t)driver_dev->bmp280_cali.dig_T1))) >> 12) *
-		    ((BMP280_S32_t)driver_dev->bmp280_cali.dig_T3)) >> 14;
-
-	driver_dev->t_fine = v_x1_u32r + v_x2_u32r;
-
-	temperature = (driver_dev->t_fine * 5 + 128) >> 8;
-
-	*t_buf = temperature;
-
-	BMP_DATA_LOG("bmp280 temperature: %d\n", temperature);
-	BMP_DATA_LOG("bmp280 temperature/100: %d\n", temperature / 100);
-
-	return status;
-}
-
-/*
- *get compensated pressure
- *unit: hectopascal(hPa)
- */
- #define BMP_BUFSIZE	128
-static int bmp_get_pressure(struct i2c_client *client, s32 *p_buf)
-{
-	struct bmp280_baro_device *driver_dev;
-	int status;
-	s32 temperature = 0, upressure = 0, pressure = 0;
-	BMP280_S64_t v_x1_u32r = 0;
-	BMP280_S64_t v_x2_u32r = 0;
-	BMP280_S64_t p = 0;
-
-	BMP_DATA_LOG("bmp280 get pressure\n");
-
-	if (client == NULL || p_buf == NULL) {
-		pr_err("bmp280 get pressure fail, invalid parameter\n");
-		return -1;
-	}
-
-	driver_dev = i2c_get_clientdata(client);
-	/* update the ambient temperature according to the given meas. period */
-	/* below method will have false problem when jiffies wrap around.
-	 *so replace.
-	 */
-
-	if (time_before_eq((unsigned long)(driver_dev->last_temp_measurement +
-			   driver_dev->temp_measurement_period), jiffies)) {
-
-		status = bmp_get_temperature(client, &temperature);
-		if (status != 0) {
-			pr_info("bmp280 get temperature:%d, exit get prssure\n",
-				status);
-			goto exit;
-		}
-	}
-
-	status = bmp_read_raw_pressure(client, &upressure);
-	if (status != 0) {
-		pr_info("bmp280 get raw pressure status:%d, exit get prssure\n",
-			status);
-		goto exit;
-	}
-
-	v_x1_u32r = ((BMP280_S64_t)driver_dev->t_fine) - 128000;
-	v_x2_u32r = v_x1_u32r * v_x1_u32r *
-			(BMP280_S64_t)driver_dev->bmp280_cali.dig_P6;
-	v_x2_u32r = v_x2_u32r +
-		    ((v_x1_u32r * (BMP280_S64_t)driver_dev->bmp280_cali.dig_P5)
-		     << 17);
-	v_x2_u32r = v_x2_u32r +
-			(((BMP280_S64_t)driver_dev->bmp280_cali.dig_P4) << 35);
-	v_x1_u32r = ((v_x1_u32r * v_x1_u32r *
-		     (BMP280_S64_t)driver_dev->bmp280_cali.dig_P3) >> 8) +
-		    ((v_x1_u32r * (BMP280_S64_t)driver_dev->bmp280_cali.dig_P2)
-		    << 12);
-	v_x1_u32r = (((((BMP280_S64_t)1) << 47) + v_x1_u32r)) *
-		    ((BMP280_S64_t)driver_dev->bmp280_cali.dig_P1) >> 33;
-	if (v_x1_u32r == 0) {
-		/* Avoid exception caused by division by zero */
-		pr_info("bmp280 get_pressure v_x1_32=0, exit get pressure\n");
-		return -1;
-	}
-
-	p = 1048576 - upressure;
-	p = div64_s64(((p << 31) - v_x2_u32r) * 3125, v_x1_u32r);
-	v_x1_u32r = (((BMP280_S64_t)driver_dev->bmp280_cali.dig_P9) *
-			(p >> 13) * (p >> 13)) >> 25;
-	v_x2_u32r = (((BMP280_S64_t)driver_dev->bmp280_cali.dig_P8) * p) >> 19;
-	p = ((p + v_x1_u32r + v_x2_u32r) >> 8) +
-	    (((BMP280_S64_t)driver_dev->bmp280_cali.dig_P7) << 4);
-	pressure = (BMP280_U32_t)p / 256;
-
-	*p_buf = pressure;
-	BMP_DATA_LOG("bmp280 pressure: %d\n", pressure);
-	BMP_DATA_LOG("bmp280 pressure/100: %d\n", pressure / 100);
-
-exit:
-	return status;
-}
-
-int bmp280_baro_sample(struct hf_device *hfdev)
-{
-	struct i2c_client *client;
-	struct bmp280_baro_device *driver_dev;
-	struct hf_manager *manager;
-	struct hf_manager_event event;
-	int64_t current_time;
-	int value = 0, temperature = 0;
-	int err = 0;
-
-	BMP_DATA_LOG("Sample bmp280\n");
-
-	if (!hfdev) {
-		pr_err("bmp280 sample failed:invalid hfdev\n");
-		return -1;
-	}
-	client = hf_device_get_private_data(hfdev);
-	driver_dev = i2c_get_clientdata(client);
-	manager = driver_dev->hf_dev.manager;
-
-	err = bmp_get_pressure(client, &value);
-	if (err) {
-		pr_err("bmp280 get compensated pressure failed, err = %d\n",
-			err);
-		return -1;
-	}
-
-	err = bmp_get_temperature(client, &temperature);
-	if (err != 0) {
-		pr_err("bmp280 get temperature:%d, exit get prssure\n",
-			err);
-		return -1;
-	}
-
-	current_time = ktime_get_boot_ns();
-	if (atomic_read(&driver_dev->raw_enable)) {
-		memset(&event, 0, sizeof(struct hf_manager_event));
-		event.timestamp = current_time;
-		event.sensor_type = SENSOR_TYPE_PRESSURE;
-		event.accurancy = SENSOR_ACCURANCY_HIGH;
-		event.action = RAW_ACTION;
-		event.word[0] = value;
-		event.word[1] = temperature;
-		manager->report(manager, &event);
-	}
-
-	memset(&event, 0, sizeof(struct hf_manager_event));
-	event.timestamp = current_time;
-	event.sensor_type = SENSOR_TYPE_PRESSURE;
-	event.accurancy = SENSOR_ACCURANCY_HIGH;
-	event.action = DATA_ACTION;
-	event.word[0] = value;
-	event.word[1] = temperature;
-
-	manager->report(manager, &event);
-	manager->complete(manager);
-
-	return 0;
-}
-
-int bmp280_baro_enable(struct hf_device *hfdev, int sensor_type, int en)
-{
-	struct i2c_client *client;
-	struct bmp280_baro_device *driver_dev;
-	int ret = 0;
-	int retry = 0;
-	enum BMP_POWERMODE_ENUM power;
-
-	pr_info("%s bmp280\n", en?"En":"Dis");
-	if (!hfdev) {
-		pr_err("bmp280 enable failed:invalid hfdev\n");
-		return -1;
-	}
-	client = hf_device_get_private_data(hfdev);
-	driver_dev = i2c_get_clientdata(client);
-
-	if (en)
-		power = BMP280_NORMAL_MODE;
-	else if (!en)
-		power = BMP280_SLEEP_MODE;
-
-	for (retry = 0; retry < 3; retry++) {
-		ret = bmp280_baro_set_powermode(client, power);
-		if (ret >= 0) {
-			pr_info("bmp280 set pwer mode(%d) done(retry:%d)\n",
-				power, retry);
-			break;
-		}
-	}
-	driver_dev->last_temp_measurement =
-		jiffies - driver_dev->temp_measurement_period;
-
-	if (ret < 0) {
-		pr_err("bmp280 set power mode(%d) fail!\n", power);
-		return -1;
-	}
-
-	pr_info("bmp280 (%s) success\n", power?"enable":"disable");
-	return 0;
-}
-
-static int bmp_set_delay(u64 ns)
-{
-	return 0;
-}
-
-int bmp280_baro_batch(struct hf_device *hfdev,
-		      int sensor_type, int64_t delay, int64_t latency)
-{
-	struct i2c_client *client = hf_device_get_private_data(hfdev);
-	struct bmp280_baro_device *driver_dev = i2c_get_clientdata(client);
-	struct hf_manager *manager = driver_dev->hf_dev.manager;
-	struct hf_manager_event event;
-	int64_t current_time;
-
-	memset(&event, 0, sizeof(struct hf_manager_event));
-	current_time = ktime_get_boot_ns();
-	event.timestamp = current_time;
-	event.sensor_type = SENSOR_TYPE_ADDITIONAL_INFO;
-	event.accurancy = SENSOR_ACCURANCY_HIGH;
-	event.reserved = SENSOR_TYPE_PRESSURE;
-	event.action = DATA_ACTION;
-	event.byte[12] = 1;
-	event.byte[3] = driver_dev->placement[0];
-	event.byte[7] = driver_dev->placement[1];
-	event.byte[11] = driver_dev->placement[2];
-
-	manager->report(manager, &event);
-	manager->complete(manager);
-
-	return bmp_set_delay(delay);
-}
-
-static int bmp280_baro_flush(struct hf_device *hfdev, int sensor_type)
-{
-	struct i2c_client *client = hf_device_get_private_data(hfdev);
-	struct bmp280_baro_device *driver_dev = i2c_get_clientdata(client);
-	struct hf_manager *manager = driver_dev->hf_dev.manager;
-	struct hf_manager_event event;
-	int64_t current_time;
-
-	memset(&event, 0, sizeof(struct hf_manager_event));
-	current_time = ktime_get_boot_ns();
-	event.sensor_type = sensor_type;
-	event.timestamp = current_time;
-	event.action = FLUSH_ACTION;
-
-	manager->report(manager, &event);
-	manager->complete(manager);
-
-	return 0;
-}
-
-int bmp280_baro_raw_enable(struct hf_device *hfdev, int sensor_type, int en)
-{
-	struct i2c_client *client = hf_device_get_private_data(hfdev);
-	struct bmp280_baro_device *driver_dev = i2c_get_clientdata(client);
-
-	atomic_set(&driver_dev->raw_enable, en);
-	return 0;
-}
-
-static int bmp280_baro_remove(struct i2c_client *client)
-{
-	struct bmp280_baro_device *driver_dev = i2c_get_clientdata(client);
-
-	hf_manager_destroy(driver_dev->hf_dev.manager);
-	kfree(driver_dev);
-	return 0;
-}
-
-static int bmp280_baro_probe(struct i2c_client *client,
-		const struct i2c_device_id *id)
-{
-	int err = 0;
-	struct bmp280_baro_device *driver_dev;
-	struct sensorlist_info_t listinfo;
-
-	pr_info("%s enter Slaver 0x76.\n", __func__);
-
-	err = bmp280_baro_soft_reset(client);
-	if (err < 0) {
-		pr_err("bmp280 soft reset fail,exit probe!\n");
-		err = -EINVAL;
-		goto findHW_fail;
-	}
-
-	/* check chip id */
-	err = bmp280_baro_check_chip_id(client);
-	if (err < 0) {
-		pr_err("bmp280 chip id mismatch,exit probe!\n");
-		err = -EINVAL;
-		goto findHW_fail;
-	}
-	mdelay(1);
-
-	driver_dev = kzalloc(sizeof(*driver_dev), GFP_KERNEL);
-	if (!driver_dev) {
-		err = -ENOMEM;
-		goto malloc_fail;
-	}
-
-	if (of_property_read_u8_array(client->dev.of_node, "placement",
-		driver_dev->placement, ARRAY_SIZE(driver_dev->placement))) {
-		pr_err("%s get placement dts fail\n", __func__);
-		err = -EFAULT;
-		goto init_fail;
-	}
-
-	atomic_set(&driver_dev->raw_enable, 0);
-
-	driver_dev->hf_dev.dev_name = BMP280_BARO_NAME;
-	driver_dev->hf_dev.device_poll = HF_DEVICE_IO_POLLING;
-	driver_dev->hf_dev.device_bus = HF_DEVICE_IO_SYNC;
-	driver_dev->hf_dev.support_list = support_sensors;
-	driver_dev->hf_dev.support_size = ARRAY_SIZE(support_sensors);
-	driver_dev->hf_dev.sample = bmp280_baro_sample;
-	driver_dev->hf_dev.enable = bmp280_baro_enable;
-	driver_dev->hf_dev.batch = bmp280_baro_batch;
-	driver_dev->hf_dev.flush = bmp280_baro_flush;
-	driver_dev->hf_dev.rawdata = bmp280_baro_raw_enable;
-
-#ifdef CONFIG_BMP_LOWPASS
-	if (driver_dev->hw.firlen > C_MAX_FIR_LENGTH)
-		atomic_set(&driver_dev->firlen, C_MAX_FIR_LENGTH);
-	else
-		atomic_set(&driver_dev->firlen, driver_dev->hw.firlen);
-
-	if (atomic_read(&driver_dev->firlen) > 0)
-		atomic_set(&driver_dev->fir_en, 1);
-#endif
-
-	err = hf_manager_create(&driver_dev->hf_dev);
-	if (err < 0) {
-		pr_err("bmp280 hf_manager_create fail,exit probe!\n");
-		err = -1;
-		goto create_manager_fail;
-	}
-
-	i2c_set_clientdata(client, driver_dev);
-	hf_device_set_private_data(&driver_dev->hf_dev, client);
-
-	driver_dev->power_mode = BMP280_UNDEFINED_POWERMODE;
-	driver_dev->filter_num = BMP_UNDEFINED_FILTER;
-	driver_dev->ovsampling_p = BMP_UNDEFINED_OVERSAMPLING;
-	driver_dev->ovsampling_t = BMP_UNDEFINED_OVERSAMPLING;
-	driver_dev->last_temp_measurement = 0;
-	driver_dev->temp_measurement_period = 1 * HZ;
-
-	err = bmp280_baro_init_device(client);
-	if (err < 0) {
-		pr_err("bmp280 init device fail,exit probe!\n");
-		goto init_fail;
-	}
-
-	memset(&listinfo, 0, sizeof(struct sensorlist_info_t));
-	strlcpy(listinfo.name, BMP280_BARO_NAME, sizeof(listinfo.name));
-	err = sensorlist_register_devinfo(SENSOR_TYPE_PRESSURE, &listinfo);
-	if (err < 0) {
-		pr_err("bmp280 register sensorlist fail,exit probe!\n");
-		goto init_fail;
-	}
-
-	pr_info("%s success!\n", __func__);
-	return 0;
-
-init_fail:
-	hf_manager_destroy(driver_dev->hf_dev.manager);
-create_manager_fail:
-	kfree(driver_dev);
-malloc_fail:
-findHW_fail:
-	return err;
-}
-
-static const struct of_device_id bmp280_baro_of_match[] = {
-	{.compatible = "mediatek,bmp280_baro"},
-	{},
-};
-
-static const struct i2c_device_id bmp280_baro_id[] = {
-					{BMP280_BARO_NAME, 0}, {} };
-
-static struct i2c_driver bmp280_baro_driver = {
-	.driver = {
-		.name = BMP280_BARO_NAME,
-		.bus = &i2c_bus_type,
-		.owner = THIS_MODULE,
-		.of_match_table = bmp280_baro_of_match,
-	},
-	.probe = bmp280_baro_probe,
-	.remove = bmp280_baro_remove,
-	.id_table =  bmp280_baro_id,
-};
-
-module_i2c_driver(bmp280_baro_driver);
-
-MODULE_AUTHOR("Mediatek");
-MODULE_DESCRIPTION("bmp280 baro i2c driver");
-MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp280_baro/bmp280_baro.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp280_baro/bmp280_baro.h
deleted file mode 100644
index b704280..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp280_baro/bmp280_baro.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#ifndef __BMP280_BARO_H__
-#define __BMP280_BARO_H__
-
-/* common definition */
-#define BMP_GET_BITSLICE(regvar, bitname)\
-	((regvar & bitname##__MSK) >> bitname##__POS)
-
-#define BMP_SET_BITSLICE(regvar, bitname, val)\
-	((regvar & ~bitname##__MSK) | ((val<<bitname##__POS)&bitname##__MSK))
-
-
-/*Define of registers*/
-/* Chip ID Register  */
-#define BMP280_BARO_CHIP_ID_ADDR       0xD0
-
-#define BMP280_BARO_CHIP_ID_VALUE1    (0x56)
-#define BMP280_BARO_CHIP_ID_VALUE2    (0x57)
-#define BMP280_BARO_CHIP_ID_VALUE3    (0x58)
-
-/* soft reset  */
-#define BMP280_BARO_RESET_ADDR         0xE0
-#define BMP280_BARO_SOFT_RESET_VALUE   0xB6
-
-/* Calibration data */
-#define BMP280_CALIBRATION_DATA_START   0x88
-#define BMP280_CALIBRATION_DATA_LENGTH	24
-
-#define SHIFT_RIGHT_4_POSITION		4
-#define SHIFT_LEFT_2_POSITION           2
-#define SHIFT_LEFT_4_POSITION           4
-#define SHIFT_LEFT_5_POSITION           5
-#define SHIFT_LEFT_8_POSITION           8
-#define SHIFT_LEFT_12_POSITION          12
-#define SHIFT_LEFT_16_POSITION          16
-
-
-/* Ctrl Measure Register */
-#define BMP280_CTRLMEAS_REG             0xF4
-
-#define BMP280_CTRLMEAS_REG_MODE__POS   0
-#define BMP280_CTRLMEAS_REG_MODE__MSK   0x03
-#define BMP280_CTRLMEAS_REG_MODE__LEN   2
-#define BMP280_CTRLMEAS_REG_MODE__REG   BMP280_CTRLMEAS_REG
-
-#define BMP280_CTRLMEAS_REG_OSRSP__POS   2
-#define BMP280_CTRLMEAS_REG_OSRSP__MSK   0x1C
-#define BMP280_CTRLMEAS_REG_OSRSP__LEN   3
-#define BMP280_CTRLMEAS_REG_OSRSP__REG   BMP280_CTRLMEAS_REG
-
-#define BMP280_CTRLMEAS_REG_OSRST__POS   5
-#define BMP280_CTRLMEAS_REG_OSRST__MSK   0xE0
-#define BMP280_CTRLMEAS_REG_OSRST__LEN   3
-#define BMP280_CTRLMEAS_REG_OSRST__REG   BMP280_CTRLMEAS_REG
-
-//#define BMP280_OVERSAMPLING_SKIPPED          0x00
-//#define BMP280_OVERSAMPLING_1X               0x01
-//#define BMP280_OVERSAMPLING_2X               0x02
-//#define BMP280_OVERSAMPLING_4X               0x03
-//#define BMP280_OVERSAMPLING_8X               0x04
-//#define BMP280_OVERSAMPLING_16X              0x05
-
-/* config */
-#define BMP280_CONFIG_REG                    0xF5
-
-#define BMP280_CONFIG_REG_FILTER__POS              2
-#define BMP280_CONFIG_REG_FILTER__MSK              0x1C
-#define BMP280_CONFIG_REG_FILTER__LEN              3
-#define BMP280_CONFIG_REG_FILTER__REG              BMP280_CONFIG_REG
-
-#define BMP280_FILTERCOEFF_OFF               0x00
-#define BMP280_FILTERCOEFF_2                 0x01
-#define BMP280_FILTERCOEFF_4                 0x02
-#define BMP280_FILTERCOEFF_8                 0x03
-#define BMP280_FILTERCOEFF_16                0x04
-
-/* data */
-#define BMP280_PRESSURE_MSB_REG              0xF7  /* Pressure MSB Reg */
-#define BMP280_TEMPERATURE_MSB_REG           0xFA  /* Temperature MSB Reg */
-
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp380/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp380/Kconfig
deleted file mode 100644
index 43b2afc..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp380/Kconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-config MTK_BMP380_SUPPORT
-	bool " MTK_BMP380_SUPPORT for MediaTek package"
-	default n
-	help
-	  Enable MTK BMP380 support.
-	  BMP380 is a low-power and low-noise
-	  barometric pressure sensor.
-	  If in doubt, say N here.
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp380/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp380/Makefile
deleted file mode 100644
index 46dd553..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp380/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensor/2.0/core
-
-obj-y += bmp380.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp380/bmp380.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp380/bmp380.c
deleted file mode 100644
index 740b5c1..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/bmp380/bmp380.c
+++ /dev/null
@@ -1,505 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2020 MediaTek Inc.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/of.h>
-#include <linux/delay.h>
-
-#include "hf_manager.h"
-
-#define CHECK_CHIP_ID_TIME_MAX          0x05
-#define C_I2C_FIFO_SIZE                 0x08
-#define PRESSURE_SENSOR_NAME            "bmp380"
-#define BOSCH_BMP380_ID                 0x50
-
-#define BOSCH_BMP380_REG_RESET          0x7e
-#define BOSCH_BMP380_REG_DIG_T1         0x31
-#define BOSCH_BMP380_REG_ID             0x00
-#define BOSCH_BMP380_REG_CTRL_ODR       0x1d  //Control the Output Data Rate
-#define BOSCH_BMP380_REG_CTRL_OSR       0x1c  //Control the OverSampling
-#define BOSCH_BMP380_REG_CTRL_PWR       0x1b
-#define BOSCH_BMP380_REG_CONFIG         0x1f  //iir filter coefficents
-#define BOSCH_BMP380_REG_PRESS_LSB      0x04
-#define BOSCH_BMP380_REG_FIFO_WTM_1     0x16
-#define BOSCH_BMP380_REG_FIFO_WTM_0     0x15
-#define BOSCH_BMP380_REG_FIFO_CONFIG_1  0x17
-#define BOSCH_BMP380_REG_FIFO_CONFIG_2  0x18
-
-struct BMP380CompParams {
-    uint16_t par_t1;
-    uint16_t par_t2;
-    int8_t par_t3;
-
-    int16_t par_p1;
-    int16_t par_p2;
-    int8_t par_p3;
-    int8_t par_p4;
-    u16 par_p5;
-    u16 par_p6;
-    int8_t par_p7;
-    int8_t par_p8;
-    int16_t par_p9;
-    int8_t par_p10;
-    int8_t par_p11;
-    s64 t_lin;
-} __attribute__((packed));
-
-static struct sensor_info bmp380_sensor_info[] = {
-	{
-	.sensor_type = SENSOR_TYPE_PRESSURE,
-	.gain = 100,
-	},
-};
-
-struct bmp380_device {
-	struct hf_device hf_dev;
-	uint32_t i2c_num;
-	uint32_t i2c_addr;
-	struct i2c_client *client;
-	struct BMP380CompParams comp;
-	atomic_t raw_enable;
-};
-
-/* I2C operation functions */
-static int bmp_i2c_read_block(struct i2c_client *client,
-				uint8_t addr, uint8_t *data, uint8_t len)
-{
-	int err = 0;
-	uint8_t beg = addr;
-	struct i2c_msg msgs[2] = {
-		{/*.addr = client->addr,*/
-		 .flags = 0,
-		 .len = 1,
-		 .buf = &beg},
-		{
-			/*.addr = client->addr*/
-			.flags = I2C_M_RD,
-			.len = len,
-			.buf = data,
-		} };
-	if (!client)
-		return -EINVAL;
-	msgs[0].addr = client->addr;
-	msgs[1].addr = client->addr;
-
-	err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
-	if (err != 2) {
-		pr_err_ratelimited("bmp380 i2c_trans err:%x %x (%d %p %d) %d\n",
-				   msgs[0].addr, client->addr, addr, data, len,
-				   err);
-		err = -EIO;
-	} else {
-		err = 0; /*no error*/
-	}
-	return err;
-}
-
-static int bmp_i2c_write_block(struct i2c_client *client,
-				uint8_t addr, uint8_t *data, uint8_t len)
-{
-	/* because address also occupies one byte,
-	 * the maximum length for write is 7 bytes
-	 */
-	int err = 0, idx = 0, num = 0;
-	char buf[32];
-
-	if (!client)
-		return -EINVAL;
-	else if (len > C_I2C_FIFO_SIZE) {
-		pr_err_ratelimited("bmp380 len %d fi %d\n", len,
-				   C_I2C_FIFO_SIZE);
-		return -EINVAL;
-	}
-	buf[num++] = addr;
-	for (idx = 0; idx < len; idx++)
-		buf[num++] = data[idx];
-
-	err = i2c_master_send(client, buf, num);
-	if (err < 0) {
-		pr_err_ratelimited("bmp380 send command error!!\n");
-		return -EFAULT;
-	}
-
-	return err;
-}
-
-static int bmp380_soft_reset(struct i2c_client *client)
-{
-	uint8_t data = 0xb6;
-	return bmp_i2c_write_block(client, BOSCH_BMP380_REG_RESET, &data, 1);
-}
-
-static int bmp380_check_chip_id(struct i2c_client *client)
-{
-	int err = -1;
-	uint8_t chip_id = 0;
-	uint8_t read_count = 0;
-
-	while (read_count++ < CHECK_CHIP_ID_TIME_MAX) {
-		bmp_i2c_read_block(client, BOSCH_BMP380_REG_ID,
-				   &chip_id, 1);
-
-		if (chip_id != BOSCH_BMP380_ID) {
-			mdelay(1);
-			pr_err("%s fail(0x%2x).\n",
-				__func__, chip_id);
-		} else {
-			err = 0;
-			pr_info("%s success(0x%2x).\n",
-				__func__, chip_id);
-			break;
-		}
-	}
-	return err;
-}
-
-static int bmp380_init_device(struct i2c_client *client)
-{
-	int err = -1;
-	uint8_t tx_buf[2] = {0};
- 	uint8_t rx_buf[8] = {0};
-	struct bmp380_device *driver_dev = i2c_get_clientdata(client);
-
-	err = bmp380_soft_reset(client);
-	if (err < 0) {
-		pr_err("bmp380 soft reset fail,exit probe!\n");
-		goto i2c_fail;
-	}
-
-	mdelay(2);
-
-	tx_buf[0] = BOSCH_BMP380_REG_DIG_T1;
-	err = bmp_i2c_read_block(client, tx_buf[0], rx_buf, 0x08);
-	if (err < 0)
-		goto i2c_fail;
-	memcpy((uint8_t*)&driver_dev->comp, rx_buf, 8);
-
-	tx_buf[0] = BOSCH_BMP380_REG_DIG_T1 + 8;
-	err = bmp_i2c_read_block(client, tx_buf[0], rx_buf, 0x08);
-	if (err < 0)
-		goto i2c_fail;
-	memcpy((uint8_t*)((uint8_t*)&driver_dev->comp + 8), rx_buf, 8);
-
-	tx_buf[0] = BOSCH_BMP380_REG_DIG_T1 + 16;
-	err = bmp_i2c_read_block(client, tx_buf[0], rx_buf, 0x05);
-	if (err < 0)
-		goto i2c_fail;
-	memcpy((uint8_t*)((uint8_t*)&driver_dev->comp + 16), rx_buf, 5);
-
-	tx_buf[0] = ((4 << 3) | (1 << 0));//config oversampling: baro:16x, temp:2x
-	err = bmp_i2c_write_block(client, BOSCH_BMP380_REG_CTRL_OSR,
-				  tx_buf, 0x01);
-
-	tx_buf[0] = 4;//config standy time: 62.5ms
-	err = bmp_i2c_write_block(client, BOSCH_BMP380_REG_CTRL_ODR,
-				  tx_buf, 0x01);
-	if (err < 0)
-		goto i2c_fail;
-
-i2c_fail:
-	pr_err("%s fail\n", __func__);
-	return err;
-}
-
-static int64_t compensate_temp(struct i2c_client *client,
-				     uint32_t uncomp_temp)
-{
-
-	uint64_t partial_data1;
-	uint64_t partial_data2;
-	uint64_t partial_data3;
-	int64_t partial_data4;
-	int64_t partial_data5;
-	int64_t partial_data6;
-	int64_t comp_temp;
-	struct bmp380_device *driver_dev;
-
-	driver_dev = i2c_get_clientdata(client);
-	partial_data1 = uncomp_temp - (256 * driver_dev->comp.par_t1);
-	partial_data2 = driver_dev->comp.par_t2 * partial_data1;
-	partial_data3 = partial_data1 * partial_data1;
-	partial_data4 = (int64_t)partial_data3 * driver_dev->comp.par_t3;
-	partial_data5 = ((int64_t)(partial_data2 * 262144) + partial_data4);
-	partial_data6 = partial_data5 / 4294967296;
-	driver_dev->comp.t_lin = partial_data6;
-	comp_temp = (int64_t)((partial_data6 * 25) / 16384);
-
-	//return the tempeature in the unit of 0.01 centigrade.
-	return comp_temp;
-}
-
-static int64_t compensate_baro(struct i2c_client *client,
-				    uint32_t uncomp_press)
-{
-	int64_t partial_data1;
-	int64_t partial_data2;
-	int64_t partial_data3;
-	int64_t partial_data4;
-	int64_t partial_data5;
-	int64_t partial_data6;
-	int64_t offset;
-	int64_t sensitivity;
-	uint64_t comp_press;
-	struct bmp380_device *driver_dev;
-
-	driver_dev = i2c_get_clientdata(client);
-	partial_data1 = driver_dev->comp.t_lin * driver_dev->comp.t_lin;
-	partial_data2 = partial_data1 / 64;
-	partial_data3 = (partial_data2 * driver_dev->comp.t_lin) / 256;
-	partial_data4 = (driver_dev->comp.par_p8 * partial_data3) / 32;
-	partial_data5 = (driver_dev->comp.par_p7 * partial_data1) * 16;
-	partial_data6 = (driver_dev->comp.par_p6 * driver_dev->comp.t_lin)
-		* 4194304;
-	offset = (driver_dev->comp.par_p5 * 140737488355328) + partial_data4
-		+ partial_data5 + partial_data6;
-
-	partial_data2 = (driver_dev->comp.par_p4 * partial_data3) / 32;
-	partial_data4 = (driver_dev->comp.par_p3 * partial_data1) * 4;
-	partial_data5 = (driver_dev->comp.par_p2 - 16384)
-		* driver_dev->comp.t_lin * 2097152;
-	sensitivity = ((driver_dev->comp.par_p1 - 16384) * 70368744177664)
-		+ partial_data2 + partial_data4	+ partial_data5;
-
-	partial_data1 = (sensitivity / 16777216) * uncomp_press;
-	partial_data2 = driver_dev->comp.par_p10 * driver_dev->comp.t_lin;
-	partial_data3 = partial_data2 + (65536 * driver_dev->comp.par_p9);
-	partial_data4 = (partial_data3 * uncomp_press) / 8192;
-	partial_data5 = (partial_data4 * uncomp_press / 10) / 512 * 10;
-	partial_data6 = (int64_t)((uint64_t)uncomp_press
-		* (uint64_t)uncomp_press);
-	partial_data2 = (driver_dev->comp.par_p11 * partial_data6) / 65536;
-	partial_data3 = (partial_data2 * uncomp_press) / 128;
-	partial_data4 = (offset / 4) + partial_data1 + partial_data5
-		+ partial_data3;
-	comp_press = (((uint64_t)partial_data4 * 25)
-		/ (uint64_t)1099511627776);
-
-	//return the press in the unit of the 0.01 Pa.
-	return comp_press;
-}
-
-static int bmp_get_pressure(struct i2c_client *client, s32 *p_buf)
-{
-	uint32_t press_adc;
-	uint32_t temp_adc;
-	int ret = 0;
-	uint32_t data_xlsb;
-	uint32_t data_lsb;
-	uint32_t data_msb;
-	uint8_t tx_buf[1] = {0};
-	uint8_t rx_buf[6] = {0};
-	int64_t temp = 0, press = 0;
-
-	tx_buf[0] = BOSCH_BMP380_REG_PRESS_LSB;
-	ret = bmp_i2c_read_block(client, tx_buf[0], rx_buf, 6);
-	if (ret < 0) {
-		pr_err("%s failed\n", __func__);
-		return ret;
-	}
-
-	data_xlsb = (uint32_t)rx_buf[0];
-	data_lsb = (uint32_t)rx_buf[1] << 8;
-	data_msb = (uint32_t)rx_buf[2] << 16;
-	press_adc  = data_msb | data_lsb | data_xlsb;
-
-	data_xlsb = (uint32_t)rx_buf[3];
-	data_lsb = (uint32_t)rx_buf[4] << 8;
-	data_msb = (uint32_t)rx_buf[5] << 16;
-	temp_adc = data_msb | data_lsb | data_xlsb;
-
-	temp = compensate_temp(client, temp_adc);
-	press = compensate_baro(client, press_adc);
-	*p_buf = (s32)press * bmp380_sensor_info[0].gain / 10000;
-	return 0;
-}
-
-static int bmp380_sample(struct hf_device *hfdev)
-{
-	struct i2c_client *client;
-	struct bmp380_device *driver_dev;
-	struct hf_manager *manager;
-	struct hf_manager_event event;
-	int64_t current_time;
-	s32 value = 0;
-	int err = 0;
-
-	if (!hfdev) {
-		pr_err("bmp380 sample failed:invalid hfdev\n");
-		return -1;
-	}
-	client = hf_device_get_private_data(hfdev);
-	driver_dev = i2c_get_clientdata(client);
-	manager = driver_dev->hf_dev.manager;
-
-	err = bmp_get_pressure(client, &value);
-	if (err) {
-		pr_err("bmp_get_pressure failed\n");
-		return err;
-	}
-
-	current_time = ktime_get_boot_ns();
-	if (atomic_read(&driver_dev->raw_enable)) {
-		memset(&event, 0, sizeof(struct hf_manager_event));
-		event.timestamp = current_time;
-		event.sensor_type = SENSOR_TYPE_PRESSURE;
-		event.accurancy = SENSOR_ACCURANCY_HIGH;
-		event.action = RAW_ACTION;
-		event.word[0] = value;
-		manager->report(manager, &event);
-	}
-
-	memset(&event, 0, sizeof(struct hf_manager_event));
-	event.timestamp = current_time;
-	event.sensor_type = SENSOR_TYPE_PRESSURE;
-	event.accurancy = SENSOR_ACCURANCY_HIGH;
-	event.action = DATA_ACTION;
-	event.word[0] = value;
-
-	manager->report(manager, &event);
-	manager->complete(manager);
-
-	return 0;
-}
-
-static int bmp380_enable(struct hf_device *hfdev, int sensor_type, int en)
-{
-	uint8_t ret = 0;
-	struct i2c_client *client;
-	struct bmp380_device *driver_dev;
-	uint8_t tx_buf[1] = {0};
-	int retry = 0;
-	client = hf_device_get_private_data(hfdev);
-	driver_dev = i2c_get_clientdata(client);
-
-	if (en)
-		tx_buf[0] = (3 << 4 | 1 << 1 | 1 << 0);
-	else
-		tx_buf[0] = (2 << 5 | 5 << 2);
-
-	for (retry = 0; retry < 3; retry++) {
-		ret = bmp_i2c_write_block(client,
-					  BOSCH_BMP380_REG_CTRL_PWR,
-					  tx_buf, 0x01);
-		if (ret >= 0) {
-			pr_debug("bmp380_enable (%d) done(retry:%d)\n",
-				en, retry);
-			break;
-		}
-	}
-
-	return ret;
-}
-
-static int bmp380_batch(struct hf_device *hfdev, int sensor_type,
-		int64_t delay, int64_t latency)
-{
-	pr_debug("%s id:%d delay:%lld latency:%lld\n", __func__, sensor_type,
-			delay, latency);
-	return 0;
-}
-
-int bmp380_raw_enable(struct hf_device *hfdev, int sensor_type, int en)
-{
-	struct i2c_client *client = hf_device_get_private_data(hfdev);
-	struct bmp380_device *driver_dev = i2c_get_clientdata(client);
-
-	atomic_set(&driver_dev->raw_enable, en);
-	return 0;
-}
-
-static int bmp380_probe(struct i2c_client *client,
-			const struct i2c_device_id *id)
-{
-	int err = 0;
-	struct bmp380_device *driver_dev = NULL;
-
-	err = bmp380_check_chip_id(client);
-	if (err < 0) {
-		pr_err("bmp380 chip id mismatch,exit probe!\n");
-		goto findHW_fail;
-	}
-
-	driver_dev = kzalloc(sizeof(*driver_dev), GFP_KERNEL);
-	if (!driver_dev) {
-		err = -ENOMEM;
-		goto malloc_fail;
-	}
-
-	driver_dev->hf_dev.dev_name = PRESSURE_SENSOR_NAME;
-	driver_dev->hf_dev.device_poll = HF_DEVICE_IO_POLLING;
-	driver_dev->hf_dev.device_bus = HF_DEVICE_IO_SYNC;
-	driver_dev->hf_dev.support_list = bmp380_sensor_info;
-	driver_dev->hf_dev.support_size = ARRAY_SIZE(bmp380_sensor_info);
-	driver_dev->hf_dev.sample = bmp380_sample;
-	driver_dev->hf_dev.enable = bmp380_enable;
-	driver_dev->hf_dev.batch = bmp380_batch;
-	driver_dev->hf_dev.rawdata = bmp380_raw_enable;
-
-	err = hf_manager_create(&driver_dev->hf_dev);
-	if (err < 0) {
-		pr_err("%s hf_manager_create fail\n", __func__);
-		err = -1;
-		goto create_manager_fail;
-	}
-
-	i2c_set_clientdata(client, driver_dev);
-	hf_device_set_private_data(&driver_dev->hf_dev, client);
-	err = bmp380_init_device(client);
-	if (err < 0) {
-		pr_err("%s fail\n", __func__);
-		goto init_fail;
-	}
-
-	pr_info("%s success!\n", __func__);
-	return 0;
-
-init_fail:
-create_manager_fail:
-	kfree(driver_dev);
-malloc_fail:
-findHW_fail:
-	pr_err("%s fail!\n", __func__);
-	return err;
-}
-
-static int bmp380_remove(struct i2c_client *client)
-{
-	struct bmp380_device *driver_dev = i2c_get_clientdata(client);
-
-	hf_manager_destroy(driver_dev->hf_dev.manager);
-	kfree(driver_dev);
-	return 0;
-}
-
-static const struct i2c_device_id bmp380_id[] = {
-	{PRESSURE_SENSOR_NAME, 0},
-	{},
-};
-
-static const struct of_device_id bmp380_of_match[] = {
-	{.compatible = "mediatek,barometer"},
-	{},
-};
-
-static struct i2c_driver bmp380_driver = {
-	.driver = {
-		.name = PRESSURE_SENSOR_NAME,
-		.bus = &i2c_bus_type,
-		.owner = THIS_MODULE,
-		.of_match_table = bmp380_of_match,
-	},
-	.probe = bmp380_probe,
-	.remove = bmp380_remove,
-	.id_table = bmp380_id
-};
-
-module_i2c_driver(bmp380_driver);
-
-MODULE_DESCRIPTION("bmp380 driver");
-MODULE_AUTHOR("Mediatek");
-MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/Makefile
deleted file mode 100644
index 71d25c8..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-obj-y += hf_manager.o
-obj-y += sensor_list.o
\ No newline at end of file
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_manager.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_manager.c
deleted file mode 100644
index 9e4e870..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_manager.c
+++ /dev/null
@@ -1,1038 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[hf_manager] " fmt
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/device.h>
-#include <linux/fs.h>
-#include <linux/cdev.h>
-#include <linux/slab.h>
-#include <linux/list.h>
-#include <linux/poll.h>
-#include <linux/bitmap.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#include <uapi/linux/sched/types.h>
-#include <linux/sched_clock.h>
-#include <linux/log2.h>
-
-#include "hf_manager.h"
-
-static DECLARE_BITMAP(sensor_list_bitmap, SENSOR_TYPE_SENSOR_MAX);
-static LIST_HEAD(hf_manager_list);
-static DEFINE_MUTEX(hf_manager_list_mtx);
-static LIST_HEAD(hf_client_list);
-static DEFINE_SPINLOCK(hf_client_list_lock);
-static struct sensor_state prev_request[SENSOR_TYPE_SENSOR_MAX];
-
-static struct task_struct *hf_manager_kthread_task;
-static struct kthread_worker hf_manager_kthread_worker;
-
-static int hf_manager_find_client(struct hf_manager_event *event);
-
-static struct coordinate coordinates[] = {
-	{ { 1, 1, 1}, {0, 1, 2} },
-	{ { -1, 1, 1}, {1, 0, 2} },
-	{ { -1, -1, 1}, {0, 1, 2} },
-	{ { 1, -1, 1}, {1, 0, 2} },
-
-	{ { -1, 1, -1}, {0, 1, 2} },
-	{ { 1, 1, -1}, {1, 0, 2} },
-	{ { 1, -1, -1}, {0, 1, 2} },
-	{ { -1, -1, -1}, {1, 0, 2} },
-};
-
-void coordinate_map(unsigned char direction, int32_t *data)
-{
-	int32_t temp[3] = {0};
-
-	if (direction >= ARRAY_SIZE(coordinates))
-		return;
-
-	temp[coordinates[direction].map[0]] =
-		coordinates[direction].sign[0] * data[0];
-	temp[coordinates[direction].map[1]] =
-		coordinates[direction].sign[1] * data[1];
-	temp[coordinates[direction].map[2]] =
-		coordinates[direction].sign[2] * data[2];
-
-	data[0] = temp[0];
-	data[1] = temp[1];
-	data[2] = temp[2];
-}
-
-void get_placement_info(unsigned char direction, int8_t *data)
-{
-	if (direction >= ARRAY_SIZE(coordinates))
-		return;
-
-	data[coordinates[direction].map[0] * 4 + 0] =
-		coordinates[direction].sign[0];
-	data[coordinates[direction].map[1] * 4 + 1] =
-		coordinates[direction].sign[1];
-	data[coordinates[direction].map[2] * 4 + 2] =
-		coordinates[direction].sign[2];
-}
-
-static bool filter_event_by_timestamp(struct hf_client_fifo *hf_fifo,
-		struct hf_manager_event *event)
-{
-	if (hf_fifo->last_time_stamp[event->sensor_type] ==
-			event->timestamp) {
-		return true;
-	}
-	hf_fifo->last_time_stamp[event->sensor_type] = event->timestamp;
-	return false;
-}
-
-static int hf_manager_report_event(struct hf_client *client,
-		struct hf_manager_event *event)
-{
-	unsigned long flags;
-	unsigned int next = 0;
-	struct hf_client_fifo *hf_fifo = &client->hf_fifo;
-
-	spin_lock_irqsave(&hf_fifo->buffer_lock, flags);
-	if (unlikely(hf_fifo->buffull == true)) {
-		pr_err_ratelimited("%s [%s][%d:%d] buffer full, [%d,%lld]\n",
-			__func__, client->proc_comm, client->leader_pid,
-			client->pid, event->sensor_type, event->timestamp);
-		spin_unlock_irqrestore(&hf_fifo->buffer_lock, flags);
-		wake_up_interruptible(&hf_fifo->wait);
-		/*
-		 * must return -1 when buffer full, tell caller retry
-		 * send data some times later.
-		 */
-		return -1;
-	}
-	/* only data action run filter event */
-	if (likely(event->action == DATA_ACTION) &&
-			unlikely(filter_event_by_timestamp(hf_fifo, event))) {
-		pr_err_ratelimited("%s [%s][%d:%d] filterd, [%d,%lld]\n",
-			__func__, client->proc_comm, client->leader_pid,
-			client->pid, event->sensor_type, event->timestamp);
-		spin_unlock_irqrestore(&hf_fifo->buffer_lock, flags);
-		/*
-		 * must return 0 when timestamp filtered, tell caller data
-		 * already in buffer, don't need send again.
-		 */
-		return 0;
-	}
-	hf_fifo->buffer[hf_fifo->head++] = *event;
-	hf_fifo->head &= hf_fifo->bufsize - 1;
-	/* remain 1 count */
-	next = hf_fifo->head + 1;
-	next &= hf_fifo->bufsize - 1;
-	if (unlikely(next == hf_fifo->tail))
-		hf_fifo->buffull = true;
-	spin_unlock_irqrestore(&hf_fifo->buffer_lock, flags);
-
-	wake_up_interruptible(&hf_fifo->wait);
-	return 0;
-}
-
-static void hf_manager_io_schedule(struct hf_manager *manager)
-{
-	if (!atomic_read(&manager->io_enabled))
-		return;
-	if (READ_ONCE(manager->hf_dev->device_bus) == HF_DEVICE_IO_ASYNC)
-		tasklet_schedule(&manager->io_work_tasklet);
-	else if (READ_ONCE(manager->hf_dev->device_bus) == HF_DEVICE_IO_SYNC)
-		kthread_queue_work(&hf_manager_kthread_worker,
-			&manager->io_kthread_work);
-}
-
-static int hf_manager_io_report(struct hf_manager *manager,
-		struct hf_manager_event *event)
-{
-	/* must return 0 when sensor_type exceed and no need to retry */
-	if (unlikely(event->sensor_type >= SENSOR_TYPE_SENSOR_MAX)) {
-		pr_err_ratelimited("%s %d exceed max sensor id\n", __func__,
-			event->sensor_type);
-		return 0;
-	}
-	return hf_manager_find_client(event);
-}
-
-static void hf_manager_io_complete(struct hf_manager *manager)
-{
-	clear_bit(HF_MANAGER_IO_IN_PROGRESS, &(manager->flags));
-	if (test_and_clear_bit(HF_MANAGER_IO_READY, &manager->flags))
-		hf_manager_io_schedule(manager);
-}
-
-static void hf_manager_io_sample(struct hf_manager *manager)
-{
-	int retval;
-
-	if (!manager->hf_dev || !manager->hf_dev->sample)
-		return;
-
-	if (!test_and_set_bit(HF_MANAGER_IO_IN_PROGRESS, &manager->flags)) {
-		retval = manager->hf_dev->sample(manager->hf_dev);
-		if (retval) {
-			clear_bit(HF_MANAGER_IO_IN_PROGRESS,
-				  &manager->flags);
-			hf_manager_io_schedule(manager);
-		}
-	}
-}
-
-static void hf_manager_io_tasklet(unsigned long data)
-{
-	struct hf_manager *manager = (struct hf_manager *)data;
-
-	hf_manager_io_sample(manager);
-}
-
-static void hf_manager_io_kthread_work(struct kthread_work *work)
-{
-	struct hf_manager *manager =
-		container_of(work, struct hf_manager, io_kthread_work);
-
-	hf_manager_io_sample(manager);
-}
-
-static void hf_manager_sched_sample(struct hf_manager *manager)
-{
-	if (!test_bit(HF_MANAGER_IO_IN_PROGRESS, &manager->flags))
-		hf_manager_io_schedule(manager);
-	else
-		set_bit(HF_MANAGER_IO_READY, &manager->flags);
-}
-
-static enum hrtimer_restart hf_manager_io_poll(struct hrtimer *timer)
-{
-	struct hf_manager *manager =
-		(struct hf_manager *)container_of(timer,
-			struct hf_manager, io_poll_timer);
-
-	hf_manager_sched_sample(manager);
-	hrtimer_forward_now(&manager->io_poll_timer,
-		ns_to_ktime(atomic64_read(&manager->io_poll_interval)));
-	return HRTIMER_RESTART;
-}
-
-static void hf_manager_io_interrupt(struct hf_manager *manager)
-{
-	hf_manager_sched_sample(manager);
-}
-
-int hf_manager_create(struct hf_device *device)
-{
-	unsigned char sensor_type = 0;
-	int i = 0;
-	int err = 0;
-	struct hf_manager *manager = NULL;
-
-	if (!device || !device->dev_name ||
-		!device->support_list || !device->support_size)
-		return -EFAULT;
-
-	manager = kzalloc(sizeof(*manager), GFP_KERNEL);
-	if (!manager)
-		return -ENOMEM;
-
-	manager->hf_dev = device;
-	device->manager = manager;
-
-	atomic_set(&manager->io_enabled, 0);
-	atomic64_set(&manager->io_poll_interval, S64_MAX);
-
-	clear_bit(HF_MANAGER_IO_IN_PROGRESS, &manager->flags);
-	clear_bit(HF_MANAGER_IO_READY, &manager->flags);
-
-	if (device->device_poll == HF_DEVICE_IO_POLLING) {
-		hrtimer_init(&manager->io_poll_timer,
-			CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-		manager->io_poll_timer.function = hf_manager_io_poll;
-	} else if (device->device_poll == HF_DEVICE_IO_INTERRUPT) {
-		manager->interrupt = hf_manager_io_interrupt;
-	}
-	manager->report = hf_manager_io_report;
-	manager->complete = hf_manager_io_complete;
-
-	if (device->device_bus == HF_DEVICE_IO_ASYNC)
-		tasklet_init(&manager->io_work_tasklet,
-			hf_manager_io_tasklet, (unsigned long)manager);
-	else if (device->device_bus == HF_DEVICE_IO_SYNC)
-		kthread_init_work(&manager->io_kthread_work,
-			hf_manager_io_kthread_work);
-
-	for (i = 0; i < device->support_size; ++i) {
-		sensor_type = device->support_list[i];
-		if (unlikely(sensor_type >= SENSOR_TYPE_SENSOR_MAX)) {
-			pr_err("%s %s %d exceed max sensor id\n", __func__,
-				device->dev_name, sensor_type);
-			err = -EINVAL;
-			goto out_err;
-		}
-		if (test_and_set_bit(sensor_type, sensor_list_bitmap)) {
-			pr_err("%s %s %d repeat\n", __func__,
-				device->dev_name, sensor_type);
-			err = -EBUSY;
-			goto out_err;
-		}
-	}
-
-	INIT_LIST_HEAD(&manager->list);
-	mutex_lock(&hf_manager_list_mtx);
-	list_add(&manager->list, &hf_manager_list);
-	mutex_unlock(&hf_manager_list_mtx);
-
-	return 0;
-out_err:
-	kfree(manager);
-	return err;
-}
-
-int hf_manager_destroy(struct hf_manager *manager)
-{
-	int i = 0;
-	struct hf_device *device = NULL;
-
-	if (!manager || !manager->hf_dev || !manager->hf_dev->support_list)
-		return -EFAULT;
-
-	device = manager->hf_dev;
-	for (i = 0; i < device->support_size; ++i) {
-		clear_bit(device->support_list[i],
-			sensor_list_bitmap);
-	}
-	mutex_lock(&hf_manager_list_mtx);
-	list_del(&manager->list);
-	mutex_unlock(&hf_manager_list_mtx);
-	if (manager->hf_dev->device_bus == HF_DEVICE_IO_ASYNC)
-		tasklet_kill(&manager->io_work_tasklet);
-
-	kfree(manager);
-	return 0;
-}
-
-static int hf_manager_distinguish_event(struct hf_client *client,
-		struct hf_manager_event *event)
-{
-	int err = 0;
-	unsigned long flags;
-	struct sensor_state *request = &client->request[event->sensor_type];
-
-	switch (event->action) {
-	case DATA_ACTION:
-		/* must relay on enable status client requested */
-		if (READ_ONCE(request->enable) &&
-				(event->timestamp >
-					atomic64_read(&request->start_time)))
-			err = hf_manager_report_event(client, event);
-		break;
-	case FLUSH_ACTION:
-		/*
-		 * flush relay on flush count client requested,
-		 * must not relay on enable status.
-		 * flush may report both by looper thread and disable thread.
-		 * spinlock prevent flush count report more than request.
-		 * sequence:
-		 * flush = 1
-		 * looper thread flush > 0
-		 *    looper thread hf_manager_report_event
-		 *        disable thread flush > 0
-		 *            disable thread hf_manager_report_event
-		 * flush complete report 2 times but request is 1.
-		 */
-		spin_lock_irqsave(&client->request_lock, flags);
-		if (atomic_read(&request->flush) > 0) {
-			err = hf_manager_report_event(client, event);
-			/* return < 0, don't decrease flush count */
-			if (err < 0) {
-				spin_unlock_irqrestore(&client->request_lock,
-					flags);
-				return err;
-			}
-			atomic_dec_if_positive(&request->flush);
-		}
-		spin_unlock_irqrestore(&client->request_lock, flags);
-		break;
-	case BIAS_ACTION:
-		/* relay on status client requested, don't check return */
-		if (READ_ONCE(request->bias))
-			hf_manager_report_event(client, event);
-		break;
-	case CALI_ACTION:
-		/* cali on status client requested, don't check return */
-		if (READ_ONCE(request->cali))
-			hf_manager_report_event(client, event);
-		break;
-	case TEMP_ACTION:
-		/* temp on status  client requested, don't check return */
-		if (READ_ONCE(request->temp))
-			hf_manager_report_event(client, event);
-		break;
-	case TEST_ACTION:
-		/* test on status client requested, don't check return */
-		if (READ_ONCE(request->test))
-			hf_manager_report_event(client, event);
-		break;
-	case RAW_ACTION:
-		/* raw on status client requested, don't check return */
-		if (READ_ONCE(request->raw))
-			hf_manager_report_event(client, event);
-		break;
-	}
-	return err;
-}
-
-static int hf_manager_find_client(struct hf_manager_event *event)
-{
-	int err = 0;
-	unsigned long flags;
-	struct hf_client *client = NULL;
-
-	spin_lock_irqsave(&hf_client_list_lock, flags);
-	list_for_each_entry(client, &hf_client_list, list) {
-		/* must (err |=), collect all err to decide retry */
-		err |= hf_manager_distinguish_event(client, event);
-	}
-	spin_unlock_irqrestore(&hf_client_list_lock, flags);
-
-	return err;
-}
-
-static struct hf_manager *hf_manager_find_manager(uint8_t sensor_type)
-{
-	int i = 0;
-	struct hf_manager *manager = NULL;
-	struct hf_device *device = NULL;
-
-	list_for_each_entry(manager, &hf_manager_list, list) {
-		device = READ_ONCE(manager->hf_dev);
-		if (!device || !device->support_list)
-			continue;
-		for (i = 0; i < device->support_size; ++i) {
-			if (sensor_type == device->support_list[i])
-				return manager;
-		}
-	}
-	return NULL;
-}
-
-static void hf_manager_update_client_param(
-		struct hf_client *client, struct hf_manager_cmd *cmd)
-{
-	struct sensor_state *request = &client->request[cmd->sensor_type];
-
-	/* only enable disable update action delay and latency */
-	if (cmd->action == HF_MANAGER_SENSOR_ENABLE) {
-		if (!request->enable)
-			atomic64_set(&request->start_time,
-				ktime_get_boot_ns());
-		request->enable = true;
-		request->delay = cmd->delay;
-		request->latency = cmd->latency;
-	} else if (cmd->action == HF_MANAGER_SENSOR_DISABLE) {
-		atomic64_set(&request->start_time, S64_MAX);
-		request->enable = false;
-		request->delay = S64_MAX;
-		request->latency = S64_MAX;
-	}
-}
-
-static void hf_manager_find_best_param(uint8_t sensor_type,
-		bool *action, int64_t *delay, int64_t *latency)
-{
-	unsigned long flags;
-	struct hf_client *client = NULL;
-	struct sensor_state *request = NULL;
-	bool tmp_enable = false;
-	int64_t tmp_delay = S64_MAX;
-	int64_t tmp_latency = S64_MAX;
-
-	spin_lock_irqsave(&hf_client_list_lock, flags);
-	list_for_each_entry(client, &hf_client_list, list) {
-		request = &client->request[sensor_type];
-		if (request->enable) {
-			tmp_enable = true;
-			if (request->delay < tmp_delay)
-				tmp_delay = request->delay;
-			if (request->latency < tmp_latency)
-				tmp_latency = request->latency;
-		}
-	}
-	spin_unlock_irqrestore(&hf_client_list_lock, flags);
-	*action = tmp_enable;
-	*delay = tmp_delay;
-	*latency = tmp_latency;
-
-#ifdef HF_MANAGER_DEBUG
-	if (tmp_enable)
-		pr_notice("%s: %d,%d,%lld,%lld\n", __func__,
-			sensor_type, tmp_enable, tmp_delay, tmp_latency);
-	else
-		pr_notice("%s: %d,%d\n", __func__, sensor_type, tmp_enable);
-#endif
-}
-
-static bool device_rebatch(uint8_t sensor_type,
-			int64_t best_delay, int64_t best_latency)
-{
-	if (prev_request[sensor_type].delay != best_delay ||
-			prev_request[sensor_type].latency != best_latency) {
-		prev_request[sensor_type].delay = best_delay;
-		prev_request[sensor_type].latency = best_latency;
-		return true;
-	}
-	return false;
-}
-
-static bool device_reenable(uint8_t sensor_type, bool best_enable)
-{
-	if (prev_request[sensor_type].enable != best_enable) {
-		prev_request[sensor_type].enable = best_enable;
-		return true;
-	}
-	return false;
-}
-
-static bool device_redisable(uint8_t sensor_type, bool best_enable,
-			int64_t best_delay, int64_t best_latency)
-{
-	if (prev_request[sensor_type].enable != best_enable) {
-		prev_request[sensor_type].enable = best_enable;
-		prev_request[sensor_type].delay = best_delay;
-		prev_request[sensor_type].latency = best_latency;
-		return true;
-	}
-	return false;
-}
-
-static int64_t device_poll_min_interval(struct hf_device *device)
-{
-	int i = 0, j = 0;
-	int64_t interval = S64_MAX;
-
-	for (i = 0; i < device->support_size; ++i) {
-		j = device->support_list[i];
-		if (prev_request[j].enable) {
-			if (prev_request[j].delay < interval)
-				interval = prev_request[j].delay;
-		}
-	}
-	return interval;
-}
-
-static void device_poll_trigger(struct hf_device *device, bool enable)
-{
-	int64_t min_interval = S64_MAX;
-	struct hf_manager *manager = device->manager;
-
-	BUG_ON(enable && !atomic_read(&manager->io_enabled));
-	min_interval = device_poll_min_interval(device);
-	BUG_ON(atomic_read(&manager->io_enabled) && min_interval == S64_MAX);
-	if (atomic64_read(&manager->io_poll_interval) == min_interval)
-		return;
-	atomic64_set(&manager->io_poll_interval, min_interval);
-	if (atomic_read(&manager->io_enabled))
-		hrtimer_start(&manager->io_poll_timer,
-			ns_to_ktime(min_interval), HRTIMER_MODE_REL);
-	else
-		hrtimer_cancel(&manager->io_poll_timer);
-}
-
-static int hf_manager_device_enable(struct hf_device *device,
-				uint8_t sensor_type)
-{
-	int err = 0;
-	struct hf_manager *manager = device->manager;
-	bool best_enable = false;
-	int64_t best_delay = S64_MAX;
-	int64_t best_latency = S64_MAX;
-
-	if (!device->enable || !device->batch)
-		return -EINVAL;
-
-	hf_manager_find_best_param(sensor_type, &best_enable,
-		&best_delay, &best_latency);
-
-	if (best_enable) {
-		if (device_rebatch(sensor_type, best_delay, best_latency))
-			err = device->batch(device, sensor_type,
-				best_delay, best_latency);
-		if (device_reenable(sensor_type, best_enable)) {
-			err = device->enable(device, sensor_type, best_enable);
-			/* must update io_enabled before hrtimer_start */
-			atomic_inc(&manager->io_enabled);
-		}
-		if (device->device_poll == HF_DEVICE_IO_POLLING)
-			device_poll_trigger(device, best_enable);
-	} else {
-		if (device_redisable(sensor_type, best_enable,
-				best_delay, best_latency)) {
-			err = device->enable(device, sensor_type, best_enable);
-			atomic_dec_if_positive(&manager->io_enabled);
-		}
-		if (device->device_poll == HF_DEVICE_IO_POLLING)
-			device_poll_trigger(device, best_enable);
-		if (device->device_bus == HF_DEVICE_IO_ASYNC &&
-				!atomic_read(&manager->io_enabled))
-			tasklet_kill(&manager->io_work_tasklet);
-	}
-	return err;
-}
-
-static int hf_manager_device_flush(struct hf_device *device,
-		uint8_t sensor_type)
-{
-	if (!device->flush)
-		return -EINVAL;
-
-	return device->flush(device, sensor_type);
-}
-
-static int hf_manager_device_calibration(struct hf_device *device,
-		uint8_t sensor_type)
-{
-	if (device->calibration)
-		return device->calibration(device, sensor_type);
-	return 0;
-}
-
-static int hf_manager_device_config_cali(struct hf_device *device,
-		uint8_t sensor_type, int32_t *data)
-{
-	if (device->config_cali)
-		return device->config_cali(device, sensor_type, data);
-	return 0;
-}
-
-static int hf_manager_device_selftest(struct hf_device *device,
-		uint8_t sensor_type)
-{
-	if (device->selftest)
-		return device->selftest(device, sensor_type);
-	return 0;
-}
-
-static int hf_manager_device_rawdata(struct hf_device *device,
-		uint8_t sensor_type)
-{
-	unsigned long flags;
-	struct hf_client *client = NULL;
-	struct sensor_state *request = NULL;
-	bool best_enable = false;
-
-	spin_lock_irqsave(&hf_client_list_lock, flags);
-	list_for_each_entry(client, &hf_client_list, list) {
-		request = &client->request[sensor_type];
-		if (request->raw)
-			best_enable = true;
-	}
-	spin_unlock_irqrestore(&hf_client_list_lock, flags);
-
-	if (prev_request[sensor_type].raw == best_enable)
-		return 0;
-	prev_request[sensor_type].raw = best_enable;
-	if (device->rawdata)
-		return device->rawdata(device, sensor_type, best_enable);
-	return 0;
-}
-
-static int hf_manager_drive_device(struct hf_client *client,
-		struct hf_manager_cmd *cmd)
-{
-	int err = 0;
-	struct hf_manager *manager = NULL;
-	struct hf_device *device = NULL;
-	uint8_t sensor_type = cmd->sensor_type;
-
-	if (unlikely(sensor_type >= SENSOR_TYPE_SENSOR_MAX))
-		return -EINVAL;
-
-	mutex_lock(&hf_manager_list_mtx);
-	manager = hf_manager_find_manager(sensor_type);
-	if (!manager) {
-		pr_err("%s: no manager finded\n", __func__);
-		mutex_unlock(&hf_manager_list_mtx);
-		return -EINVAL;
-	}
-	device = manager->hf_dev;
-	if (!device || !device->dev_name) {
-		pr_err("%s: no hf device or important param finded\n",
-			__func__);
-		mutex_unlock(&hf_manager_list_mtx);
-		return -EINVAL;
-	}
-
-#ifdef HF_MANAGER_DEBUG
-	pr_notice("%s: %s: %d,%d,%lld,%lld\n", __func__, device->dev_name,
-		cmd->sensor_type, cmd->action, cmd->delay, cmd->latency);
-#endif
-
-	switch (cmd->action) {
-	case HF_MANAGER_SENSOR_ENABLE:
-	case HF_MANAGER_SENSOR_DISABLE:
-		hf_manager_update_client_param(client, cmd);
-		err = hf_manager_device_enable(device, sensor_type);
-		break;
-	case HF_MANAGER_SENSOR_FLUSH:
-		atomic_inc(&client->request[sensor_type].flush);
-		err = hf_manager_device_flush(device, sensor_type);
-		if (err < 0)
-			atomic_dec_if_positive(
-				&client->request[sensor_type].flush);
-		break;
-	case HF_MANAGER_SENSOR_ENABLE_CALI:
-		err = hf_manager_device_calibration(device, sensor_type);
-		break;
-	case HF_MANAGER_SENSOR_CONFIG_CALI:
-		err = hf_manager_device_config_cali(device,
-			sensor_type, cmd->data);
-		break;
-	case HF_MANAGER_SENSOR_SELFTEST:
-		err = hf_manager_device_selftest(device, sensor_type);
-		break;
-	case HF_MANAGER_SENSOR_RAWDATA:
-		client->request[sensor_type].raw =
-			cmd->data[0] ? true : false;
-		err = hf_manager_device_rawdata(device, sensor_type);
-		break;
-	}
-	mutex_unlock(&hf_manager_list_mtx);
-	return err;
-}
-
-static int hf_manager_open(struct inode *inode, struct file *filp)
-{
-	int err = 0;
-	unsigned long flags;
-	struct hf_client *client = NULL;
-	struct hf_client_fifo *hf_fifo = NULL;
-
-	client = kzalloc(sizeof(*client), GFP_KERNEL);
-	if (!client) {
-		err = -ENOMEM;
-		goto err_out;
-	}
-
-	/* record process id and thread id for debug */
-	strlcpy(client->proc_comm, current->comm, sizeof(client->proc_comm));
-	client->leader_pid = current->group_leader->pid;
-	client->pid = current->pid;
-
-	pr_notice("%s: [%s][%d:%d]\n", __func__, current->comm,
-		current->group_leader->pid, current->pid);
-
-	INIT_LIST_HEAD(&client->list);
-
-	hf_fifo = &client->hf_fifo;
-	hf_fifo->head = 0;
-	hf_fifo->tail = 0;
-	hf_fifo->bufsize = roundup_pow_of_two(HF_CLIENT_FIFO_SIZE);
-	hf_fifo->buffull = false;
-	spin_lock_init(&hf_fifo->buffer_lock);
-	init_waitqueue_head(&hf_fifo->wait);
-	hf_fifo->buffer =
-		kcalloc(hf_fifo->bufsize, sizeof(*hf_fifo->buffer),
-			GFP_KERNEL);
-	if (!hf_fifo->buffer) {
-		err = -ENOMEM;
-		goto err_free;
-	}
-
-	spin_lock_init(&client->request_lock);
-
-	filp->private_data = client;
-
-	spin_lock_irqsave(&hf_client_list_lock, flags);
-	list_add(&client->list, &hf_client_list);
-	spin_unlock_irqrestore(&hf_client_list_lock, flags);
-
-	nonseekable_open(inode, filp);
-	return 0;
-err_free:
-	kfree(client);
-err_out:
-	return err;
-}
-
-static int hf_manager_release(struct inode *inode, struct file *filp)
-{
-	unsigned long flags;
-	struct hf_client *client = filp->private_data;
-
-	pr_notice("%s: [%s][%d:%d]\n", __func__, current->comm,
-		current->group_leader->pid, current->pid);
-
-	filp->private_data = NULL;
-
-	spin_lock_irqsave(&hf_client_list_lock, flags);
-	list_del(&client->list);
-	spin_unlock_irqrestore(&hf_client_list_lock, flags);
-
-	kfree(client->hf_fifo.buffer);
-	kfree(client);
-	return 0;
-}
-
-static int hf_manager_fetch_next(struct hf_client_fifo *hf_fifo,
-				  struct hf_manager_event *event)
-{
-	unsigned long flags;
-	int have_event;
-
-	spin_lock_irqsave(&hf_fifo->buffer_lock, flags);
-	have_event = hf_fifo->head != hf_fifo->tail;
-	if (have_event) {
-		*event = hf_fifo->buffer[hf_fifo->tail++];
-		hf_fifo->tail &= hf_fifo->bufsize - 1;
-		hf_fifo->buffull = false;
-	}
-	spin_unlock_irqrestore(&hf_fifo->buffer_lock, flags);
-	return have_event;
-}
-
-static ssize_t hf_manager_read(struct file *filp,
-		char __user *buf, size_t count, loff_t *f_pos)
-{
-	struct hf_client *client = filp->private_data;
-	struct hf_client_fifo *hf_fifo = &client->hf_fifo;
-	struct hf_manager_event event;
-	size_t read = 0;
-
-	if (count != 0 && count < sizeof(struct hf_manager_event))
-		return -EINVAL;
-
-	for (;;) {
-		if (hf_fifo->head == hf_fifo->tail)
-			return 0;
-		if (count == 0)
-			break;
-		while (read + sizeof(struct hf_manager_event) <= count &&
-			hf_manager_fetch_next(hf_fifo, &event)) {
-			if (copy_to_user(buf + read,
-				&event, sizeof(struct hf_manager_event)))
-				return -EFAULT;
-			read += sizeof(struct hf_manager_event);
-		}
-		if (read)
-			break;
-	}
-	return read;
-}
-
-static ssize_t hf_manager_write(struct file *filp,
-		const char __user *buf, size_t count, loff_t *f_pos)
-{
-	struct hf_manager_cmd cmd;
-	struct hf_client *client = filp->private_data;
-
-	memset(&cmd, 0, sizeof(struct hf_manager_cmd));
-
-	if (count != sizeof(struct hf_manager_cmd))
-		return -EFAULT;
-
-	if (copy_from_user(&cmd, buf, count))
-		return -EFAULT;
-
-	return hf_manager_drive_device(client, &cmd);
-}
-
-static unsigned int hf_manager_poll(struct file *filp,
-		struct poll_table_struct *wait)
-{
-	struct hf_client *client = filp->private_data;
-	struct hf_client_fifo *hf_fifo = &client->hf_fifo;
-	unsigned int mask = 0;
-
-	poll_wait(filp, &hf_fifo->wait, wait);
-
-	if (hf_fifo->head != hf_fifo->tail)
-		mask |= POLLIN | POLLRDNORM;
-
-	return mask;
-}
-
-static long hf_manager_ioctl(struct file *filp,
-			unsigned int cmd, unsigned long arg)
-{
-	struct hf_client *client = filp->private_data;
-	unsigned int size = _IOC_SIZE(cmd);
-	void __user *ubuf = (void __user *)arg;
-	unsigned int sensor_type = 0;
-	struct ioctl_packet packet;
-
-	memset(&packet, 0, sizeof(struct ioctl_packet));
-
-	if (size != sizeof(struct ioctl_packet))
-		return -EINVAL;
-	if (copy_from_user(&packet, ubuf, sizeof(struct ioctl_packet)))
-		return -EFAULT;
-	sensor_type = packet.sensor_type;
-	if (unlikely(sensor_type >= SENSOR_TYPE_SENSOR_MAX))
-		return -EINVAL;
-
-	switch (cmd) {
-	case HF_MANAGER_REQUEST_REGISTER_STATUS:
-		packet.status = test_bit(sensor_type, sensor_list_bitmap);
-		if (copy_to_user(ubuf, &packet, sizeof(struct ioctl_packet)))
-			return -EFAULT;
-		break;
-	case HF_MANAGER_REQUEST_BIAS_DATA:
-		client->request[sensor_type].bias = packet.status;
-		break;
-	case HF_MANAGER_REQUEST_CALI_DATA:
-		client->request[sensor_type].cali = packet.status;
-		break;
-	case HF_MANAGER_REQUEST_TEMP_DATA:
-		client->request[sensor_type].temp = packet.status;
-		break;
-	case HF_MANAGER_REQUEST_TEST_DATA:
-		client->request[sensor_type].test = packet.status;
-		break;
-	}
-	return 0;
-}
-
-static ssize_t client_info_show(struct device *dev,
-		struct device_attribute *attr, char *buf)
-{
-	return 0;
-}
-
-DEVICE_ATTR(client_info, 0644, client_info_show, NULL);
-
-static struct attribute *hf_manager_attrs[] = {
-	&dev_attr_client_info.attr,
-	NULL
-};
-
-static struct attribute_group hf_manager_group = {
-	.attrs = hf_manager_attrs
-};
-
-static const struct file_operations hf_manager_fops = {
-	.owner          = THIS_MODULE,
-	.open           = hf_manager_open,
-	.release        = hf_manager_release,
-	.read           = hf_manager_read,
-	.write          = hf_manager_write,
-	.poll           = hf_manager_poll,
-	.unlocked_ioctl = hf_manager_ioctl,
-	.compat_ioctl   = hf_manager_ioctl,
-};
-
-static int hf_manager_proc_show(struct seq_file *m, void *v)
-{
-	int i = 0, sensor_type = 0;
-	unsigned long flags;
-	struct hf_manager *manager = NULL;
-	struct hf_client *client = NULL;
-	struct hf_device *device = NULL;
-
-	mutex_lock(&hf_manager_list_mtx);
-	list_for_each_entry(manager, &hf_manager_list, list) {
-		device = READ_ONCE(manager->hf_dev);
-		if (!device || !device->support_list)
-			continue;
-		seq_printf(m, "manager: param:[%d,%lld]\n",
-			atomic_read(&manager->io_enabled),
-			(int64_t)atomic64_read(&manager->io_poll_interval));
-		seq_printf(m, "device:%s poll:%s bus:%s online\n",
-			device->dev_name,
-			device->device_poll ? "io_polling" : "io_interrupt",
-			device->device_bus ? "io_async" : "io_sync");
-		for (i = 0; i < device->support_size; ++i) {
-			sensor_type = device->support_list[i];
-			seq_printf(m, "support:%d now param:[%d,%lld,%lld]\n",
-				sensor_type,
-				prev_request[sensor_type].enable,
-				prev_request[sensor_type].delay,
-				prev_request[sensor_type].latency);
-		}
-	}
-	mutex_unlock(&hf_manager_list_mtx);
-
-	spin_lock_irqsave(&hf_client_list_lock, flags);
-	list_for_each_entry(client, &hf_client_list, list) {
-		seq_printf(m, "client:%s pid:[%d:%d] online\n",
-			client->proc_comm,
-			client->leader_pid,
-			client->pid);
-		for (i = 0; i < SENSOR_TYPE_SENSOR_MAX; ++i) {
-			if (!client->request[i].enable)
-				continue;
-			seq_printf(m, "request:%d param:[%d,%lld,%lld,%lld]\n",
-				i,
-				client->request[i].enable,
-				client->request[i].delay,
-				client->request[i].latency,
-				(int64_t)atomic64_read(
-					&client->request[i].start_time));
-		}
-	}
-	spin_unlock_irqrestore(&hf_client_list_lock, flags);
-	return 0;
-}
-
-static int hf_manager_proc_open(struct inode *inode,
-		struct file *filp)
-{
-	return single_open(filp, hf_manager_proc_show, NULL);
-}
-
-static const struct file_operations hf_manager_proc_fops = {
-	.open           = hf_manager_proc_open,
-	.release        = single_release,
-	.read           = seq_read,
-	.llseek         = seq_lseek,
-};
-
-
-static int __init hf_manager_init(void)
-{
-	int major = -1, i = 0;
-	struct class *hf_manager_class;
-	struct device *dev;
-	struct sched_param param = { .sched_priority = MAX_RT_PRIO / 2 };
-
-	for (i = 0; i < SENSOR_TYPE_SENSOR_MAX; ++i) {
-		prev_request[i].delay = S64_MAX;
-		prev_request[i].latency = S64_MAX;
-		atomic64_set(&prev_request[i].start_time, S64_MAX);
-	}
-
-	major = register_chrdev(0, "hf_manager", &hf_manager_fops);
-	if (major < 0) {
-		pr_err("%s unable to get major %d\n", __func__, major);
-		return -1;
-	}
-	hf_manager_class = class_create(THIS_MODULE, "hf_manager");
-	if (IS_ERR(hf_manager_class))
-		return PTR_ERR(hf_manager_class);
-	dev = device_create(hf_manager_class, NULL, MKDEV(major, 0),
-		NULL, "hf_manager");
-	if (IS_ERR(dev))
-		return -1;
-
-	proc_create("hf_manager", 0644, NULL, &hf_manager_proc_fops);
-
-	if (sysfs_create_group(&dev->kobj, &hf_manager_group) < 0)
-		return -1;
-
-	kthread_init_worker(&hf_manager_kthread_worker);
-	hf_manager_kthread_task = kthread_run(kthread_worker_fn,
-			&hf_manager_kthread_worker, "hf_manager");
-	if (IS_ERR(hf_manager_kthread_task)) {
-		pr_err("%s failed to create kthread\n", __func__);
-		return -1;
-	}
-	sched_setscheduler(hf_manager_kthread_task, SCHED_FIFO, &param);
-	return 0;
-}
-subsys_initcall(hf_manager_init);
-
-
-MODULE_AUTHOR("Mediatek");
-MODULE_DESCRIPTION("high freq sensor manaer driver");
-MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_manager.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_manager.h
deleted file mode 100644
index f92317b..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_manager.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#ifndef _HF_SENSOR_MANAGER_H_
-#define _HF_SENSOR_MANAGER_H_
-
-#include <linux/hrtimer.h>
-#include <linux/interrupt.h>
-#include <linux/kthread.h>
-#include <linux/ioctl.h>
-#include <linux/types.h>
-
-#include "hf_sensor_type.h"
-#include "hf_sensor_io.h"
-
-#define HF_MANAGER_IO_IN_PROGRESS 0
-#define HF_MANAGER_IO_READY       1
-
-#define HF_DEVICE_IO_SYNC  0
-#define HF_DEVICE_IO_ASYNC 1
-
-#define HF_DEVICE_IO_INTERRUPT 0
-#define HF_DEVICE_IO_POLLING   1
-
-#define HF_CLIENT_FIFO_SIZE 128
-
-struct coordinate {
-	int8_t sign[3];
-	uint8_t map[3];
-};
-
-struct sensor_state {
-	bool enable;
-	bool bias;
-	bool cali;
-	bool temp;
-	bool test;
-	bool raw;
-	int64_t delay;
-	int64_t latency;
-	atomic_t flush;
-	atomic64_t start_time;
-};
-
-struct hf_device {
-	int (*sample)(struct hf_device *hfdev);
-	int (*enable)(struct hf_device *hfdev, int sensor_type, int en);
-	int (*batch)(struct hf_device *hfdev, int sensor_type,
-		int64_t delay, int64_t latency);
-	int (*flush)(struct hf_device *hfdev, int sensor_type);
-	int (*calibration)(struct hf_device *hfdev, int sensor_type);
-	int (*config_cali)(struct hf_device *hfdev,
-		int sensor_type, int32_t *data);
-	int (*selftest)(struct hf_device *hfdev, int sensor_type);
-	int (*rawdata)(struct hf_device *hfdev, int sensor_type, int en);
-
-	char *dev_name;
-	unsigned char device_poll;
-	unsigned char device_bus;
-
-	unsigned char *support_list;
-	unsigned int support_size;
-
-	struct hf_manager *manager;
-	void *private_data;
-};
-
-struct hf_client_fifo {
-	spinlock_t buffer_lock;
-	unsigned int head;
-	unsigned int tail;
-	unsigned int bufsize;
-	unsigned int buffull;
-	int64_t last_time_stamp[SENSOR_TYPE_SENSOR_MAX];
-	struct hf_manager_event *buffer;
-	wait_queue_head_t wait;
-};
-
-struct hf_manager {
-	struct list_head list;
-	struct tasklet_struct io_work_tasklet;
-	struct kthread_work io_kthread_work;
-	struct hrtimer io_poll_timer;
-	atomic64_t io_poll_interval;
-	atomic_t io_enabled;
-	unsigned long flags;
-	struct hf_device *hf_dev;
-
-	int (*report)(struct hf_manager *manager,
-		struct hf_manager_event *event);
-	void (*complete)(struct hf_manager *manager);
-	void (*interrupt)(struct hf_manager *manager);
-};
-
-struct hf_client {
-	struct list_head list;
-	struct hf_client_fifo hf_fifo;
-	struct sensor_state request[SENSOR_TYPE_SENSOR_MAX];
-	spinlock_t request_lock;
-
-	/* record process info */
-	char proc_comm[TASK_COMM_LEN];
-	pid_t leader_pid;
-	pid_t pid;
-};
-
-static inline void hf_device_set_private_data(struct hf_device *device,
-		void *data)
-{
-	device->private_data = data;
-}
-
-static inline void *hf_device_get_private_data(struct hf_device *device)
-{
-	return device->private_data;
-}
-
-int hf_manager_create(struct hf_device *device);
-int hf_manager_destroy(struct hf_manager *manager);
-void coordinate_map(unsigned char direction, int32_t *data);
-void get_placement_info(unsigned char direction, int8_t *data);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_sensor_io.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_sensor_io.h
deleted file mode 100644
index c26fd75..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_sensor_io.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#ifndef _HF_SENSOR_IO_H_
-#define _HF_SENSOR_IO_H_
-
-#include <linux/ioctl.h>
-#include <linux/types.h>
-
-enum {
-	HF_MANAGER_SENSOR_DISABLE,
-	HF_MANAGER_SENSOR_ENABLE,
-	HF_MANAGER_SENSOR_FLUSH,
-	HF_MANAGER_SENSOR_ENABLE_CALI,
-	HF_MANAGER_SENSOR_CONFIG_CALI,
-	HF_MANAGER_SENSOR_SELFTEST,
-	HF_MANAGER_SENSOR_RAWDATA,
-};
-
-enum {
-	DATA_ACTION,
-	FLUSH_ACTION,
-	BIAS_ACTION,
-	CALI_ACTION,
-	TEMP_ACTION,
-	TEST_ACTION,
-	RAW_ACTION,
-};
-
-struct hf_manager_cmd {
-	uint8_t sensor_type;
-	uint8_t action;
-	int64_t delay;
-	int64_t latency;
-	int32_t data[12];
-} __packed;
-
-struct hf_manager_event {
-	int64_t timestamp;
-	uint8_t sensor_type;
-	uint8_t accurancy;
-	uint8_t action;
-	uint8_t reserved;
-	union {
-		int32_t word[6];
-		int8_t byte[0];
-	};
-} __packed;
-
-struct ioctl_packet {
-	uint8_t sensor_type;
-	bool status;
-} __packed;
-
-#define HF_MANAGER_REQUEST_REGISTER_STATUS  _IOWR('a', 1, struct ioctl_packet)
-#define HF_MANAGER_REQUEST_BIAS_DATA        _IOW('a', 2, struct ioctl_packet)
-#define HF_MANAGER_REQUEST_CALI_DATA        _IOW('a', 3, struct ioctl_packet)
-#define HF_MANAGER_REQUEST_TEMP_DATA        _IOW('a', 4, struct ioctl_packet)
-#define HF_MANAGER_REQUEST_TEST_DATA        _IOW('a', 5, struct ioctl_packet)
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_sensor_type.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_sensor_type.h
deleted file mode 100644
index 50cd911..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/hf_sensor_type.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#ifndef _HF_SENSOR_TYPE_H_
-#define _HF_SENSOR_TYPE_H_
-
-enum {
-	/* follow google default sensor type */
-	SENSOR_TYPE_ACCELEROMETER = 1,
-	SENSOR_TYPE_MAGNETIC_FIELD,
-	SENSOR_TYPE_ORIENTATION,
-	SENSOR_TYPE_GYROSCOPE,
-	SENSOR_TYPE_LIGHT,
-	SENSOR_TYPE_PRESSURE,
-	SENSOR_TYPE_TEMPERATURE,
-	SENSOR_TYPE_PROXIMITY,
-	SENSOR_TYPE_GRAVITY,
-	SENSOR_TYPE_LINEAR_ACCELERATION,
-	SENSOR_TYPE_ROTATION_VECTOR,
-	SENSOR_TYPE_RELATIVE_HUMIDITY,
-	SENSOR_TYPE_AMBIENT_TEMPERATURE,
-	SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
-	SENSOR_TYPE_GAME_ROTATION_VECTOR,
-	SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
-	SENSOR_TYPE_SIGNIFICANT_MOTION,
-	SENSOR_TYPE_STEP_DETECTOR,
-	SENSOR_TYPE_STEP_COUNTER,
-	SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
-	SENSOR_TYPE_HEART_RATE,
-	SENSOR_TYPE_TILT_DETECTOR,
-	SENSOR_TYPE_WAKE_GESTURE,
-	SENSOR_TYPE_GLANCE_GESTURE,
-	SENSOR_TYPE_PICK_UP_GESTURE,
-	SENSOR_TYPE_WRIST_TILT_GESTURE,
-	SENSOR_TYPE_DEVICE_ORIENTATION,
-	SENSOR_TYPE_POSE_6DOF,
-	SENSOR_TYPE_STATIONARY_DETECT,
-	SENSOR_TYPE_MOTION_DETECT,
-	SENSOR_TYPE_HEART_BEAT,
-	SENSOR_TYPE_DYNAMIC_SENSOR_META,
-	SENSOR_TYPE_ADDITIONAL_INFO,
-	SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT,
-	SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED,
-
-	/* follow mtk add sensor type */
-	SENSOR_TYPE_PEDOMETER = 55,
-	SENSOR_TYPE_IN_POCKET,
-	SENSOR_TYPE_ACTIVITY,
-	SENSOR_TYPE_PDR,
-	SENSOR_TYPE_FREEFALL,
-	SENSOR_TYPE_FLAT,
-	SENSOR_TYPE_FACE_DOWN,
-	SENSOR_TYPE_SHAKE,
-	SENSOR_TYPE_BRINGTOSEE,
-	SENSOR_TYPE_ANSWER_CALL,
-	SENSOR_TYPE_GEOFENCE,
-	SENSOR_TYPE_FLOOR_COUNTER,
-	SENSOR_TYPE_EKG,
-	SENSOR_TYPE_PPG1,
-	SENSOR_TYPE_PPG2,
-	SENSOR_TYPE_RGBW,
-	SENSOR_TYPE_GYRO_TEMPERATURE,
-	SENSOR_TYPE_SAR,
-	SENSOR_TYPE_GYRO_SECONDARY,
-	SENSOR_TYPE_SENSOR_MAX,
-};
-
-enum {
-	ID_OFFSET = 1,
-
-	/* follow google default sensor type */
-	ID_ACCELEROMETER = 0,
-	ID_MAGNETIC_FIELD,
-	ID_ORIENTATION,
-	ID_GYROSCOPE,
-	ID_LIGHT,
-	ID_PRESSURE,
-	ID_TEMPERATURE,
-	ID_PROXIMITY,
-	ID_GRAVITY,
-	ID_LINEAR_ACCELERATION,
-	ID_ROTATION_VECTOR,
-	ID_RELATIVE_HUMIDITY,
-	ID_AMBIENT_TEMPERATURE,
-	ID_MAGNETIC_FIELD_UNCALIBRATED,
-	ID_GAME_ROTATION_VECTOR,
-	ID_GYROSCOPE_UNCALIBRATED,
-	ID_SIGNIFICANT_MOTION,
-	ID_STEP_DETECTOR,
-	ID_STEP_COUNTER,
-	ID_GEOMAGNETIC_ROTATION_VECTOR,
-	ID_HEART_RATE,
-	ID_TILT_DETECTOR,
-	ID_WAKE_GESTURE,
-	ID_GLANCE_GESTURE,
-	ID_PICK_UP_GESTURE,
-	ID_WRIST_TILT_GESTURE,
-	ID_DEVICE_ORIENTATION,
-	ID_POSE_6DOF,
-	ID_STATIONARY_DETECT,
-	ID_MOTION_DETECT,
-	ID_HEART_BEAT,
-	ID_DYNAMIC_SENSOR_META,
-	ID_ADDITIONAL_INFO,
-	ID_LOW_LATENCY_OFFBODY_DETECT,
-	ID_ACCELEROMETER_UNCALIBRATED,
-
-	/* follow mtk add sensor type */
-	ID_PEDOMETER = SENSOR_TYPE_PEDOMETER - ID_OFFSET,
-	ID_IN_POCKET,
-	ID_ACTIVITY,
-	ID_PDR,
-	ID_FREEFALL,
-	ID_FLAT,
-	ID_FACE_DOWN,
-	ID_SHAKE,
-	ID_BRINGTOSEE,
-	ID_ANSWER_CALL,
-	ID_GEOFENCE,
-	ID_FLOOR_COUNTER,
-	ID_EKG,
-	ID_PPG1,
-	ID_PPG2,
-	ID_RGBW,
-	ID_GYRO_TEMPERATURE,
-	ID_SAR,
-	ID_GYRO_SECONDARY,
-	ID_SENSOR_MAX,
-};
-
-enum {
-	SENSOR_ACCURANCY_UNRELIALE,
-	SENSOR_ACCURANCY_LOW,
-	SENSOR_ACCURANCY_MEDIUM,
-	SENSOR_ACCURANCY_HIGH,
-};
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/sensor_list.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/sensor_list.c
deleted file mode 100644
index 399fcc2..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/sensor_list.c
+++ /dev/null
@@ -1,235 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<sensorlist> " fmt
-
-#include <linux/module.h>
-#include <linux/miscdevice.h>
-#include <linux/types.h>
-#include <linux/spinlock.h>
-#include <linux/uaccess.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-
-#include "sensor_list.h"
-#include "hf_sensor_type.h"
-
-enum sensorlist {
-	accel,
-	gyro,
-	mag,
-	als,
-	ps,
-	baro,
-	sar,
-	maxhandle,
-};
-
-static struct sensorlist_info_t sensorlist_info[maxhandle];
-static struct mag_libinfo_t mag_libinfo;
-static DEFINE_SPINLOCK(sensorlist_info_lock);
-
-int sensorlist_find_sensor(int sensor)
-{
-	int handle = -1;
-
-	switch (sensor) {
-	case SENSOR_TYPE_ACCELEROMETER:
-		handle = accel;
-		break;
-	case SENSOR_TYPE_GYROSCOPE:
-		handle = gyro;
-		break;
-	case SENSOR_TYPE_MAGNETIC_FIELD:
-		handle = mag;
-		break;
-	case SENSOR_TYPE_LIGHT:
-		handle = als;
-		break;
-	case SENSOR_TYPE_PROXIMITY:
-		handle = ps;
-		break;
-	case SENSOR_TYPE_PRESSURE:
-		handle = baro;
-		break;
-	case SENSOR_TYPE_SAR:
-		handle = sar;
-		break;
-	}
-	return handle;
-}
-
-int sensorlist_find_type(int handle)
-{
-	int type = -1;
-
-	switch (handle) {
-	case accel:
-		type = SENSOR_TYPE_ACCELEROMETER;
-		break;
-	case gyro:
-		type = SENSOR_TYPE_GYROSCOPE;
-		break;
-	case mag:
-		type = SENSOR_TYPE_MAGNETIC_FIELD;
-		break;
-	case als:
-		type = SENSOR_TYPE_LIGHT;
-		break;
-	case ps:
-		type = SENSOR_TYPE_PROXIMITY;
-		break;
-	case baro:
-		type = SENSOR_TYPE_PRESSURE;
-		break;
-	case sar:
-		type = SENSOR_TYPE_SAR;
-		break;
-	}
-	return type;
-}
-
-static void init_sensorlist_info(void)
-{
-	int handle = -1;
-
-	spin_lock(&sensorlist_info_lock);
-	for (handle = accel; handle < maxhandle; ++handle)
-		strlcpy(sensorlist_info[handle].name, "NULL",
-			sizeof(sensorlist_info[handle].name));
-	spin_unlock(&sensorlist_info_lock);
-}
-
-int sensorlist_register_devinfo(int sensor,
-		struct sensorlist_info_t *devinfo)
-{
-	int handle = -1;
-
-	handle = sensorlist_find_sensor(sensor);
-	if (handle < 0)
-		return -1;
-	pr_notice("name(%s) type(%d) registered\n", devinfo->name, sensor);
-	spin_lock(&sensorlist_info_lock);
-	strlcpy(sensorlist_info[handle].name, devinfo->name,
-			sizeof(sensorlist_info[handle].name));
-	spin_unlock(&sensorlist_info_lock);
-	return 0;
-}
-
-int sensorlist_register_maginfo(struct mag_libinfo_t *maginfo)
-{
-	spin_lock(&sensorlist_info_lock);
-	memcpy(&mag_libinfo, maginfo, sizeof(struct mag_libinfo_t));
-	spin_unlock(&sensorlist_info_lock);
-	return 0;
-}
-
-static int sensorlist_open(struct inode *inode, struct file *file)
-{
-	return nonseekable_open(inode, file);
-}
-
-static ssize_t
-sensorlist_read(struct file *file, char __user *buf,
-		size_t count, loff_t *ptr)
-{
-	struct sensorlist_info_t temp[maxhandle];
-
-	if (count == 0)
-		return -EINVAL;
-	if (count < sizeof(struct sensorlist_info_t))
-		return -EINVAL;
-	if (count > maxhandle * sizeof(struct sensorlist_info_t))
-		count = maxhandle * sizeof(struct sensorlist_info_t);
-
-	memset(temp, 0, sizeof(temp));
-	spin_lock(&sensorlist_info_lock);
-	memcpy(temp, sensorlist_info, sizeof(temp));
-	spin_unlock(&sensorlist_info_lock);
-	if (copy_to_user(buf, temp, count))
-		return -EFAULT;
-	return count;
-}
-
-static long sensorlist_ioctl(struct file *filp,
-			unsigned int cmd, unsigned long arg)
-{
-	unsigned int size = _IOC_SIZE(cmd);
-	void __user *ubuf = (void __user *)arg;
-	struct mag_libinfo_t temp;
-
-	if (size != sizeof(struct mag_libinfo_t))
-		return -EINVAL;
-
-	switch (cmd) {
-	case SENSOR_LIST_GET_MAG_LIB_INFO:
-		memset(&temp, 0, sizeof(struct mag_libinfo_t));
-		spin_lock(&sensorlist_info_lock);
-		memcpy(&temp, &mag_libinfo, sizeof(struct mag_libinfo_t));
-		spin_unlock(&sensorlist_info_lock);
-		if (copy_to_user(ubuf, &temp, sizeof(struct mag_libinfo_t)))
-			return -EFAULT;
-		break;
-	}
-	return 0;
-}
-
-static const struct file_operations sensorlist_fops = {
-	.owner          = THIS_MODULE,
-	.open           = sensorlist_open,
-	.read           = sensorlist_read,
-	.unlocked_ioctl = sensorlist_ioctl,
-	.compat_ioctl   = sensorlist_ioctl,
-};
-
-static struct miscdevice sensorlist_miscdev = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = "sensorlist",
-	.fops = &sensorlist_fops,
-};
-
-static int sensor_list_proc_show(struct seq_file *m, void *v)
-{
-	int handle = -1, type = -1;
-
-	seq_puts(m, "dynamic hardware sensorlist:\n");
-	spin_lock(&sensorlist_info_lock);
-	for (handle = accel; handle < maxhandle; ++handle) {
-		type = sensorlist_find_type(handle);
-		if (type < 0)
-			continue;
-		seq_printf(m, "sensortype:%d chipname:%s\n",
-			type, sensorlist_info[handle].name);
-	}
-	spin_unlock(&sensorlist_info_lock);
-	return 0;
-}
-
-static int sensor_list_proc_open(struct inode *inode,
-		struct file *filp)
-{
-	return single_open(filp, sensor_list_proc_show, NULL);
-}
-
-static const struct file_operations sensor_list_proc_fops = {
-	.open           = sensor_list_proc_open,
-	.release        = single_release,
-	.read           = seq_read,
-	.llseek         = seq_lseek,
-};
-
-static int __init sensorlist_init(void)
-{
-	init_sensorlist_info();
-	if (misc_register(&sensorlist_miscdev) < 0)
-		return -1;
-	proc_create("sensorlist", 0644, NULL, &sensor_list_proc_fops);
-	return 0;
-}
-
-subsys_initcall(sensorlist_init);
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("dynamic sensorlist driver");
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/sensor_list.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/sensor_list.h
deleted file mode 100644
index d32cead..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/core/sensor_list.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#ifndef _SENSOR_LIST_H_
-#define _SENSOR_LIST_H_
-
-#include <linux/ioctl.h>
-
-struct sensorlist_info_t {
-	char name[16];
-};
-
-struct mag_libinfo_t {
-	char libname[64];
-	int32_t layout;
-	int32_t deviceid;
-};
-
-int sensorlist_register_maginfo(struct mag_libinfo_t *mag_info);
-int sensorlist_register_devinfo(int sensor,
-		struct sensorlist_info_t *devinfo);
-int sensorlist_find_sensor(int sensor);
-
-#define SENSOR_LIST_GET_MAG_LIB_INFO _IOWR('a', 1, struct mag_libinfo_t)
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/Kconfig
deleted file mode 100644
index c4935d9..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/Kconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-config MTK_KXTJ3_SUPPORT
-	bool " MTK_KXTJ3_SUPPORT for MediaTek package"
-	default n
-	help
-	  Enable MTK KXTJ3 support.
-	  KXTJ3 is a low-power and low-noise
-	  barometric pressure sensor.
-	  If in doubt, say N here.
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/Makefile
deleted file mode 100644
index f3bf3e8..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensor/2.0/core/
-
-obj-y += kxtj3_acc_i2c.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/kxtj3_acc_i2c.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/kxtj3_acc_i2c.c
deleted file mode 100644
index 91f143d..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/kxtj3_acc_i2c.c
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
- * Copyright (C) 2016 MediaTek Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
- */
-
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/of.h>
-#include <linux/delay.h>
-#include <linux/math64.h>
-#include <linux/atomic.h>
-
-#include "hf_manager.h"
-#include "kxtj3_acc_i2c.h"
-#include "sensor_list.h"
-
-#define KXTJ3_ACC_I2C_NAME "kxtj3_acc_i2c"
-#define KXTJ3_ACC_AXES_NUM          3
-#define C_I2C_FIFO_SIZE              8
-
-//#define GRAVITY_EARTH_SCALAR       9.807f
-//#define ACCELEROMETER_INCREASE_NUM_AP	1000
-
-#define KXTJ3_ACC_SOFT_RESET_VALUE  0x80
-#define KXTJ3_ACC_CHIP_ID_VALUE     (0x35)
-#define CHECK_CHIP_ID_TIME_MAX       5
-
-
-
-#define KXTJ3_ACC_ODR_7HZ 0x0b
-#define KXTJ3_ACC_ODR_12HZ 0x00
-#define KXTJ3_ACC_ODR_25HZ 0x01
-#define KXTJ3_ACC_ODR_50HZ 0x02
-#define KXTJ3_ACC_ODR_100HZ 0x03
-
-#define KXTJ3_ACC_ODR_200HZ 0x04
-#define KXTJ3_ACC_ODR_400HZ 0x05
-#define KXTJ3_ACC_ODR_800HZ 0x06
-#define KXTJ3_ACC_ODR_1600HZ 0x0F
-
-
-#define KXTJ3_ACC_RANGE_2G 0x40
-#define KXTJ3_ACC_RANGE_4G 0x48
-#define KXTJ3_ACC_RANGE_8G_1 0x50
-#define KXTJ3_ACC_RANGE_8G_2 0x58
-#define KXTJ3_ACC_RANGE_16G_1 0x44
-#define KXTJ3_ACC_RANGE_16G_2 0x4C
-#define KXTJ3_ACC_RANGE_16G_3 0x54
-#define KXTJ3_ACC_RANGE_16G_4 0x5C
-
-
-
-
-
-//static struct sensor_info support_sensors[] = {
-//	{
-//	.sensor_type = SENSOR_TYPE_ACCELEROMETER,
-//	.gain = 100,
-//	},
-//};
-static unsigned char support_sensors[] = {
-	SENSOR_TYPE_ACCELEROMETER,
-//	SENSOR_TYPE_GYROSCOPE,
-//	SENSOR_TYPE_GYRO_TEMPERATURE,
-};
-struct kxtj3_acc_device {
-	struct hf_device hf_dev;
-	struct i2c_client *acc_client;
-	uint32_t direction;
-	uint8_t placement[3];
-	atomic_t raw_enable;
-	atomic_t acc_enable;
-};
-
-/* I2C operation functions */
-static int kxtj3_acc_i2c_read_block(struct i2c_client *client,
-			u8 addr, u8 *data, u8 len)
-{
-	int err = 0;
-	u8 beg = addr;
-	struct i2c_msg msgs[2] = {
-		{/*.addr = client->addr,*/
-		 .flags = 0,
-		 .len = 1,
-		 .buf = &beg},
-		{
-			/*.addr = client->addr*/
-			.flags = I2C_M_RD,
-			.len = len,
-			.buf = data,
-		} };
-	if (!client)
-		return -EINVAL;
-	msgs[0].addr = client->addr;
-	msgs[1].addr = client->addr;
-pr_info("kxtj3_acc_i2c_read_block.\n");
-	err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
-	if (err != 2) {
-		pr_err_ratelimited("i2c_trans err: %x %x (%d %p %d) %d\n",
-		       msgs[0].addr, client->addr, addr, data, len, err);
-		err = -EIO;
-	} else {
-		err = 0; /*no error*/
-	}
-	return err;
-}
-
-static int kxtj3_acc_i2c_write_block(struct i2c_client *client,
-			u8 addr, u8 *data, u8 len)
-{
-	/* because address also occupies one byte,
-	 * the maximum length for write is 7 bytes
-	 */
-	int err = 0, idx = 0, num = 0;
-	char buf[32];
-	pr_info("kxtj3_acc_i2c_write_block.\n");
-	if (!client){
-		return -EINVAL;
-	}
-	else if (len > C_I2C_FIFO_SIZE) {
-		pr_err_ratelimited("len %d fi %d\n", len, C_I2C_FIFO_SIZE);
-		return -EINVAL;
-	}
-	buf[num++] = addr;
-	for (idx = 0; idx < len; idx++)
-		buf[num++] = data[idx];
-
-	err = i2c_master_send(client, buf, num);
-	if (err < 0) {
-		pr_err_ratelimited("send command error!!\n");
-		return -EFAULT;
-	}
-
-	return err;
-}
-
-
-static int kxtj3_acc_init_device(struct i2c_client *client)
-{
-	int err = 0;
-	uint8_t data = 0;
-pr_info("kxtj3_acc_init_device.\n");
-	data = KXTJ3_ACC_ODR_100HZ;
-	err = kxtj3_acc_i2c_write_block(client,
-			KXTJ3_ACC_BW_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-#if 0
-	data = 0x00; //filter and lock enable
-	err = kxtj3_acc_i2c_write_block(client,
-			KXTJ3_ACC_RATED_HBW_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-#endif
-	data = KXTJ3_ACC_RANGE_4G;
-	err = kxtj3_acc_i2c_write_block(client,
-			KXTJ3_ACC_RANGE_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x00; //disable int
-	err = kxtj3_acc_i2c_write_block(client,
-			KXTJ3_ACC_INT_ENABLE1_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-#if 0
-	data = 0x80; //map int
-	err = kxtj3_acc_i2c_write_block(client,
-			KXTJ3_ACC_INT_MAP_1_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x00; //push-pull, active low
-	err = kxtj3_acc_i2c_write_block(client,
-			KXTJ3_ACC_INT_OUT_CTRL_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-#endif
-	pr_info("KXTJ3_ACC init OK.\n");
-
-	return err;
-}
-
-static int kxtj3_acc_set_soft_reset(struct i2c_client *client)
-{
-	int err = 0;
-/*	uint8_t data = KXTJ3_ACC_SOFT_RESET_VALUE;
-pr_info("kxtj3_acc_set_soft_reset.\n");
-	err = kxtj3_acc_i2c_write_block(client,
-			KXTJ3_ACC_BGW_SOFTRESET_ADDR, &data, 1);*/
-	return err;
-}
-
-static int kxtj3_acc_check_chip_id(struct i2c_client *client)
-{
-	int err = -1;
-	u8 chip_id = 0;
-	u8 read_count = 0;
-pr_info("kxtj3_acc_check_chip_id\n");
-	while (read_count++ < CHECK_CHIP_ID_TIME_MAX) {
-		kxtj3_acc_i2c_read_block(client,
-				KXTJ3_ACC_CHIP_ID_ADDR, &chip_id, 1);
-
-		if ((chip_id & 0xff) != KXTJ3_ACC_CHIP_ID_VALUE) {
-			continue;
-		} else {
-			err = 0;
-			pr_info("kxtj3_acc_check_chip_id err = 0\n");
-			break;
-		}
-	}
-	return err;
-}
-
-
-
-
-
-
-
-
-
-int kxtj3_acc_sample(struct hf_device *hfdev)
-{
-
-	int err = 0;
-	uint8_t buf[KXTJ3_ACC_AXES_NUM * 2] = {0};
-	int32_t data[KXTJ3_ACC_AXES_NUM] = {0};
-	struct hf_manager_event event;
-	int64_t current_time;
-//	struct i2c_client *client = hf_device_get_private_data(hfdev);
-	struct kxtj3_acc_device *driver_dev = hf_device_get_private_data(hfdev);
-	struct hf_manager *manager = driver_dev->hf_dev.manager;
-pr_info("kxtj3_acc_sample\n");
-	current_time = ktime_get_boot_ns();
-	if (atomic_read(&driver_dev->acc_enable)) {
-	err = kxtj3_acc_i2c_read_block(driver_dev->acc_client,
-			KXTJ3_ACC_RATE_X_LSB_ADDR,
-			&buf[0], KXTJ3_ACC_AXES_NUM * 2);
-	if (err < 0) {
-		pr_err_ratelimited("read fail\n");
-		return err;
-	}
-
-	data[0] = ((int16_t)(buf[0] | (buf[1] << 8))) >> 4;
-	data[1] = ((int16_t)(buf[2] | (buf[3] << 8))) >> 4;
-	data[2] = ((int16_t)(buf[4] | (buf[5] << 8))) >> 4;
-
-	 pr_err("kxtj3 register :%x, %x, %x %x, %x, %x data: %x, %x, %x\n",
-	  buf[0], buf[1], buf[2],
-	  buf[3], buf[4], buf[5],
-	  data[0], data[1], data[2]);
-	 
-	coordinate_map(driver_dev->direction, data);
-	current_time = ktime_get_boot_ns();
-
-//	if (atomic_read(&driver_dev->raw_enable)) {
-		memset(&event, 0, sizeof(struct hf_manager_event));
-		event.timestamp = current_time;
-		event.sensor_type = SENSOR_TYPE_ACCELEROMETER;
-		event.accurancy = SENSOR_ACCURANCY_HIGH;
-		event.action = RAW_ACTION;
-		event.word[0] =
-			(int32_t)div64_s64((int64_t)data[0] * 9807, 256);
-		event.word[1] =
-			(int32_t)div64_s64((int64_t)data[1] * 9807, 256);
-		event.word[2] =
-			(int32_t)div64_s64((int64_t)data[2] * 9807, 256);
-		/* pr_err("kxtj3 raw %d, %d, %d,  m/s %d, %d, %d\n",
-		 * data[0], data[1], data[2],
-		 * event.word[0], event.word[1], event.word[2]);
-		 */
-		manager->report(manager, &event);
-	}
-
-	memset(&event, 0, sizeof(struct hf_manager_event));
-	event.timestamp = current_time;
-	event.sensor_type = SENSOR_TYPE_ACCELEROMETER;
-	event.accurancy = SENSOR_ACCURANCY_HIGH;
-	event.action = DATA_ACTION;
-
-	event.word[0] = (int32_t)div64_s64((int64_t)data[0] * 1000, 512);
-	event.word[1] = (int32_t)div64_s64((int64_t)data[1] * 1000, 512);
-	event.word[2] = (int32_t)div64_s64((int64_t)data[2] * 1000, 512);
-	
-	/* pr_err("kxtj3 raw %d, %d, %d,  m/s %d, %d, %d\n",
-	 * data[0], data[1], data[2],
-	 * event.word[0], event.word[1], event.word[2]);
-	 */
-		
-	manager->report(manager, &event);
-
-	manager->complete(manager);
-
-	return 0;
-}
-
-int kxtj3_acc_raw_enable(struct hf_device *hfdev, int sensor_type, int en)
-{
-	struct kxtj3_acc_device  *driver_dev = hf_device_get_private_data(hfdev);
-//	struct kxtj3_acc_device *driver_dev = i2c_get_clientdata(client);
-pr_info("kxtj3_acc_raw_enable\n");
-	atomic_set(&driver_dev->raw_enable, en);
-	return 0;
-}
-
-int kxtj3_acc_enable(struct hf_device *hfdev, int sensor_type, int en)
-{
-	int err = 0;
-	uint8_t data = 0;
-	struct kxtj3_acc_device *driver_dev = hf_device_get_private_data(hfdev);
-
-	pr_info("%s id:%d en:%d\n", __func__, sensor_type, en);
-
-	if (en) {
-		
-		kxtj3_acc_i2c_read_block(driver_dev->acc_client,KXTJ3_ACC_RANGE_ADDR, &data, 1);
-		data |= 1<<7;
-		err = kxtj3_acc_i2c_write_block(driver_dev->acc_client, KXTJ3_ACC_RANGE_ADDR, &data, 1);
-		if (err < 0) {
-			pr_err_ratelimited("write power mode failed.\n");
-			return -1;
-		}
-		mdelay(1);
-		atomic_set(&driver_dev->acc_enable, en);
-	} else {
-		data = 0x00;
-		err = kxtj3_acc_i2c_write_block(driver_dev->acc_client,KXTJ3_ACC_RANGE_ADDR, &data, 1);
-		if (err < 0) {
-			pr_err_ratelimited("write power mode failed.\n");
-			return -1;
-		}
-			atomic_set(&driver_dev->acc_enable, en);
-		mdelay(1);
-	}
-	return 0;
-
-}
-
-int kxtj3_acc_batch(struct hf_device *hfdev, int sensor_type,
-	int64_t delay, int64_t latency)
-{
-
-	int err = 0;
-	uint8_t data = 0;
-	int value = 0;
-	struct kxtj3_acc_device *driver_dev = hf_device_get_private_data(hfdev);
-	struct hf_manager *manager = driver_dev->hf_dev.manager;
-	struct hf_manager_event event;
-	int64_t current_time;
-
-	pr_info("%s id:%d rate:%lld latency:%lld\n",
-		__func__, sensor_type, delay, latency);
-
-	value = div64_s64(1000000000LL, delay);
-
-	if (value <= 7)
-		data = KXTJ3_ACC_ODR_7HZ;
-	else if (value <= 12)
-		data = KXTJ3_ACC_ODR_12HZ;
-	else if (value <= 25)
-		data = KXTJ3_ACC_ODR_25HZ;
-	else if (value <= 100)
-		data = KXTJ3_ACC_ODR_100HZ;
-	else if (value <= 200)
-		data = KXTJ3_ACC_ODR_200HZ;
-	else if (value <= 400)
-		data = KXTJ3_ACC_ODR_400HZ;
-	else if (value <= 800)
-		data = KXTJ3_ACC_ODR_800HZ;
-	else
-		data = KXTJ3_ACC_ODR_1600HZ;
-
-	err = kxtj3_acc_i2c_write_block(driver_dev->acc_client, KXTJ3_ACC_BW_ADDR, &data, 1);
-	if (err < 0) {
-		pr_err_ratelimited("write rate failed.\n");
-		return -1;
-	}
-		memset(&event, 0, sizeof(struct hf_manager_event));
-		current_time = ktime_get_boot_ns();
-		event.timestamp = current_time;
-		event.sensor_type = SENSOR_TYPE_ADDITIONAL_INFO;
-		event.accurancy = SENSOR_ACCURANCY_HIGH;
-		event.reserved = SENSOR_TYPE_ACCELEROMETER;
-		event.action = DATA_ACTION;
-		get_placement_info(driver_dev->direction, event.byte);
-		event.byte[12] = 1;
-		event.byte[3] = driver_dev->placement[0];
-		event.byte[7] = driver_dev->placement[1];
-		event.byte[11] = driver_dev->placement[2];
-
-		manager->report(manager, &event);
-	mdelay(1);
-	manager->complete(manager);
-	return 0;
-
-}
-
-static int kxtj3_acc_flush(struct hf_device *hfdev, int sensor_type)
-{
-	struct kxtj3_acc_device *driver_dev = hf_device_get_private_data(hfdev);
-	struct hf_manager *manager = driver_dev->hf_dev.manager;
-	struct hf_manager_event event;
-	int64_t current_time;
-
-	memset(&event, 0, sizeof(struct hf_manager_event));
-	current_time = ktime_get_boot_ns();
-	event.sensor_type = sensor_type;
-	event.timestamp = current_time;
-	event.action = FLUSH_ACTION;
-
-	manager->report(manager, &event);
-	manager->complete(manager);
-
-	return 0;
-}
-
-static int kxtj3_acc_i2c_remove(struct i2c_client *client)
-{
-	struct kxtj3_acc_device *driver_dev = i2c_get_clientdata(client);
-pr_info("kxtj3_acc_i2c_remove\n");
-	hf_manager_destroy(driver_dev->hf_dev.manager);
-	kfree(driver_dev);
-	return 0;
-}
-
-static int kxtj3_acc_i2c_probe(struct i2c_client *client,
-			const struct i2c_device_id *id)
-{
-
-	int err = 0;
-	struct kxtj3_acc_device *driver_dev;
-	struct sensorlist_info_t listinfo;
-
-	pr_info("%s\n", __func__);
-
-	driver_dev = devm_kzalloc(&client->dev, sizeof(*driver_dev),
-								GFP_KERNEL);
-	if (!driver_dev)
-		return -ENOMEM;
-
-//	driver_dev->acc_client = client;
-	/* check chip id */
-	err = kxtj3_acc_check_chip_id(client);
-	if (err < 0) {
-		pr_err("Bosch Sensortec Device not found, chip id mismatch\n");
-		err = -EINVAL;
-		goto init_fail;
-	}
-
-	err = kxtj3_acc_set_soft_reset(client);
-	if (err < 0) {
-		pr_err("erro soft reset!\n");
-		err = -EINVAL;
-		goto init_fail;
-	}
-	mdelay(3);
-
-	err = kxtj3_acc_init_device(client);
-	if (err < 0) {
-		pr_err("%s init device fail\n", __func__);
-		goto init_fail;
-	}
-
-	driver_dev = kzalloc(sizeof(*driver_dev), GFP_KERNEL);
-	if (!driver_dev) {
-		err = -ENOMEM;
-		goto malloc_fail;
-	}
-
-	driver_dev->acc_client = client;
-
-	if (of_property_read_u32(client->dev.of_node,
-		"direction", &driver_dev->direction)) {
-		pr_err("%s get direction dts fail\n", __func__);
-		err = -EFAULT;
-		goto dts_fail;
-	}
-if(0){
-	if (of_property_read_u8_array(client->dev.of_node, "placement",
-		driver_dev->placement, ARRAY_SIZE(driver_dev->placement))) {
-		pr_err("%s get placement dts fail\n", __func__);
-		err = -EFAULT;
-		goto dts_fail;
-	}
-}
-	atomic_set(&driver_dev->raw_enable, 0);
-
-	driver_dev->hf_dev.dev_name = KXTJ3_ACC_I2C_NAME;
-	driver_dev->hf_dev.device_poll = HF_DEVICE_IO_POLLING;
-	driver_dev->hf_dev.device_bus = HF_DEVICE_IO_SYNC;
-	driver_dev->hf_dev.support_list = support_sensors;
-	driver_dev->hf_dev.support_size = ARRAY_SIZE(support_sensors);
-	driver_dev->hf_dev.enable = kxtj3_acc_enable;
-	driver_dev->hf_dev.batch = kxtj3_acc_batch;
-	driver_dev->hf_dev.flush = kxtj3_acc_flush;
-	driver_dev->hf_dev.sample = kxtj3_acc_sample;
-	driver_dev->hf_dev.rawdata = kxtj3_acc_raw_enable;
-
-	err = hf_manager_create(&driver_dev->hf_dev);
-	if (err < 0) {
-		pr_err("%s hf_manager_create fail\n", __func__);
-		err = -1;
-		goto create_manager_fail;
-	}
-
-	i2c_set_clientdata(client, driver_dev);
-	hf_device_set_private_data(&driver_dev->hf_dev, driver_dev);
-
-	//memset(&listinfo, 0, sizeof(struct sensorlist_info_t));
-	//strlcpy(listinfo.name, KXTJ3_ACC_I2C_NAME, sizeof(listinfo.name));
-	//sensorlist_register_devinfo(SENSOR_TYPE_ACCELEROMETER, &listinfo);
-	memset(&listinfo, 0, sizeof(struct sensorlist_info_t));
-	strlcpy(listinfo.name, KXTJ3_ACC_I2C_NAME, sizeof(listinfo.name));
-	sensorlist_register_devinfo(SENSOR_TYPE_ACCELEROMETER, &listinfo);
-
-	pr_info("%s success!\n", __func__);
-	return 0;
-
-create_manager_fail:
-dts_fail:
-	kfree(driver_dev);
-malloc_fail:
-init_fail:
-	pr_err("%s fail!\n", __func__);
-	return err;
-}
-
-static const struct of_device_id kxtj3_acc_of_match[] = {
-	{.compatible = "mediatek,kxtj3_gsensor"},
-	{},
-};
-static const struct i2c_device_id kxtj3_acc_i2c_id[] = {
-					{KXTJ3_ACC_I2C_NAME, 0}, {} };
-
-static struct i2c_driver kxtj3_acc_i2c_driver = {
-	.driver = {
-		.name = KXTJ3_ACC_I2C_NAME,
-		.bus = &i2c_bus_type,
-		.owner = THIS_MODULE,
-		.of_match_table = kxtj3_acc_of_match,
-	},
-	.probe = kxtj3_acc_i2c_probe,
-	.remove = kxtj3_acc_i2c_remove,
-	.id_table =  kxtj3_acc_i2c_id,
-};
-
-module_i2c_driver(kxtj3_acc_i2c_driver);
-
-MODULE_AUTHOR("Mediatek");
-MODULE_DESCRIPTION("kxtj3 acc i2c driver");
-MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/kxtj3_acc_i2c.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/kxtj3_acc_i2c.h
deleted file mode 100644
index 5ea7661..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/kxtj3/kxtj3_acc_i2c.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2016 MediaTek Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
- */
-
-#ifndef __KXTJ3_ACC_H__
-#define __KXTJ3_ACC_H__
-
-	/*Define of registers*/
-
-	 /* Hard Wired */
-#define KXTJ3_ACC_CHIP_ID_ADDR                     0x0f
-	/**<Address of Chip ID Register*/
-
-	/* Data Register */
-#define KXTJ3_ACC_RATE_X_LSB_ADDR                  0x06
-	/**<	Address of X axis Rate LSB Register	*/
-#define KXTJ3_ACC_RATE_X_MSB_ADDR                  0x07
-	/**<	Address of X axis Rate MSB Register	*/
-#define KXTJ3_ACC_RATE_Y_LSB_ADDR                  0x08
-	/**<	Address of Y axis Rate LSB Register	*/
-#define KXTJ3_ACC_RATE_Y_MSB_ADDR                  0x09
-	/**<	Address of Y axis Rate MSB Register	*/
-#define KXTJ3_ACC_RATE_Z_LSB_ADDR                  0x0a
-	/**<	Address of Z axis Rate LSB Register	*/
-#define KXTJ3_ACC_RATE_Z_MSB_ADDR                  0x0b
-	/**<	Address of Z axis Rate MSB Register	*/
-//#define KXTJ3_ACC_TEMP_ADDR                        0x08
-	/**<   Address of Temperature Data LSB Register */
-
-//#define KXTJ3_ACC_INT_STATUS1_ADDR                 0x0A
-	/**<   Address of Interrupt status Register 1*/
-
-	/* Control Register */
-#define KXTJ3_ACC_RANGE_ADDR                       0x1b
-	/**<	Address of Range address Register */
-#define KXTJ3_ACC_BW_ADDR                          0x21
-	/**<	Address of Bandwidth Register */
-//#define KXTJ3_ACC_RATED_HBW_ADDR                   0x13
-	/**<	Address of Rate HBW Register */
-#define KXTJ3_ACC_BGW_SOFTRESET_ADDR               0x1b
-	/**<	Address of BGW Softreset Register  */
-
-#define KXTJ3_ACC_INT_ENABLE1_ADDR                 0x1e
-	/**<        Address of Interrupt Enable 1  */
-
-//#define KXTJ3_ACC_INT_MAP_1_ADDR                   0x1A
-	/**<	Address of Interrupt MAP 1  */
-
-//#define KXTJ3_ACC_INT_SRC_ADDR                     0x1E
-	/**<	Address of Interrupt SRC 1  */
-
-//#define KXTJ3_ACC_INT_OUT_CTRL_ADDR                0x20
-	/**<	Address of Interrupt MAP 1  */
-
-//#define KXTJ3_ACC_BGW_SPI3_WDT_ADDR                0x34
-	/**<	Address of BGW SPI3,WDT Register  */
-
-//#define KXTJ3_ACC_SELF_TEST_ADDR                   0x32
-	/**<	Address of BGW Self test Register  */
-
-#define KXTJ3_ACC_DATA_INT_EN                      0x28
-
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/Kconfig
deleted file mode 100644
index 8b13789..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/Kconfig
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/Makefile
deleted file mode 100644
index d32fe0e..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensor/2.0/core
-ccflags-y += -I$(srctree)/drivers/staging/nanohub
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/scp/$(CONFIG_MTK_PLATFORM)
-
-obj-y += mtk_nanohub.o mtk_nanohub_ipi.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub.c
deleted file mode 100644
index 201de38..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub.c
+++ /dev/null
@@ -1,2336 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[mtk_nanohub] " fmt
-
-#include <linux/slab.h>
-#include <linux/workqueue.h>
-#include <linux/kthread.h>
-#include <linux/platform_device.h>
-#include <linux/dma-mapping.h>
-#include <linux/atomic.h>
-#include <linux/types.h>
-#include <linux/module.h>
-#include <linux/suspend.h>
-#include <linux/time.h>
-#include <asm/arch_timer.h>
-#include <linux/math64.h>
-#include <linux/delay.h>
-
-#include "scp_ipi.h"
-#include "scp_helper.h"
-#include "scp_excep.h"
-#include "mtk_nanohub.h"
-#include "comms.h"
-#include "hf_manager.h"
-#include "sensor_list.h"
-#include "mtk_nanohub_ipi.h"
-
-/* ALGIN TO SCP SENSOR_IPI_SIZE AT FILE CONTEXTHUB_FW.H, ALGIN
- * TO SCP_SENSOR_HUB_DATA UNION, ALGIN TO STRUCT DATA_UNIT_T
- * SIZEOF(STRUCT DATA_UNIT_T) = SCP_SENSOR_HUB_DATA = SENSOR_IPI_SIZE
- * BUT AT THE MOMENT AP GET DATA THROUGH IPI, WE ONLY TRANSFER
- * 44 BYTES DATA_UNIT_T, THERE ARE 4 BYTES HEADER IN SCP_SENSOR_HUB_DATA
- * HEAD
- */
-#define SENSOR_IPI_SIZE 48
-/*
- * experience number for delay_count per DELAY_COUNT sensor input delay 10ms
- * msleep(10) system will schedule to hal process then read input node
- */
-#define SENSOR_IPI_HEADER_SIZE 4
-#define SENSOR_IPI_PACKET_SIZE (SENSOR_IPI_SIZE - SENSOR_IPI_HEADER_SIZE)
-#define SENSOR_DATA_SIZE 44
-
-#if SENSOR_DATA_SIZE > SENSOR_IPI_PACKET_SIZE
-#error "SENSOR_DATA_SIZE > SENSOR_IPI_PACKET_SIZE, out of memory"
-#endif
-
-#define SYNC_TIME_CYCLC 10000
-#define SYNC_TIME_START_CYCLC 3000
-
-struct curr_wp_queue {
-	spinlock_t buffer_lock;
-	uint32_t head;
-	uint32_t tail;
-	uint32_t bufsize;
-	uint32_t *ringbuffer;
-};
-
-struct mtk_nanohub_device {
-	struct hf_device hf_dev;
-	struct timer_list sync_time_timer;
-	struct work_struct sync_time_worker;
-	struct wakeup_source time_sync_wakeup_src;
-	struct wakeup_source data_notify_wakeup_src;
-
-	struct sensor_fifo *scp_sensor_fifo;
-	struct curr_wp_queue wp_queue;
-	phys_addr_t shub_dram_phys;
-	phys_addr_t shub_dram_virt;
-	atomic_t traces[ID_SENSOR_MAX];
-
-	atomic_t get_list_first_boot;
-	atomic_t cfg_data_after_reboot;
-	atomic_t start_timesync_first_boot;
-
-	int32_t acc_config_data[6];
-	int32_t gyro_config_data[12];
-	int32_t mag_config_data[9];
-	int32_t light_config_data[1];
-	int32_t proximity_config_data[2];
-};
-
-static uint8_t rtc_compensation_suspend;
-static struct SensorState mSensorState[SENSOR_TYPE_SENSOR_MAX];
-static unsigned char support_sensors[SENSOR_TYPE_SENSOR_MAX];
-static DEFINE_MUTEX(mSensorState_mtx);
-static atomic_t power_status = ATOMIC_INIT(SENSOR_POWER_DOWN);
-static DECLARE_WAIT_QUEUE_HEAD(chre_kthread_wait);
-static DECLARE_WAIT_QUEUE_HEAD(power_reset_wait);
-static uint8_t chre_kthread_wait_condition;
-static DEFINE_SPINLOCK(scp_state_lock);
-static DEFINE_SPINLOCK(config_data_lock);
-static uint8_t scp_system_ready;
-static uint8_t scp_chre_ready;
-static struct mtk_nanohub_device *mtk_nanohub_dev;
-
-static int mtk_nanohub_send_timestamp_to_hub(void);
-static int mtk_nanohub_server_dispatch_data(uint32_t *currWp);
-static int mtk_nanohub_report_to_manager(struct data_unit_t *data);
-
-enum scp_ipi_status __attribute__((weak)) scp_ipi_registration(enum ipi_id id,
-	void (*ipi_handler)(int id, void *data, unsigned int len),
-	const char *name)
-{
-	return SCP_IPI_ERROR;
-}
-
-void __attribute__((weak)) scp_A_register_notify(struct notifier_block *nb)
-{
-
-}
-
-phys_addr_t __attribute__((weak))
-	scp_get_reserve_mem_virt(enum scp_reserve_mem_id_t id)
-{
-	return 0;
-}
-
-phys_addr_t __attribute__((weak))
-	scp_get_reserve_mem_phys(enum scp_reserve_mem_id_t id)
-{
-	return 0;
-}
-
-phys_addr_t __attribute__((weak))
-	scp_get_reserve_mem_size(enum scp_reserve_mem_id_t id)
-{
-	return 0;
-}
-
-void __attribute__((weak)) scp_register_feature(enum feature_id id)
-{
-}
-
-/* arch counter is 13M, mult is 161319385, shift is 21 */
-static inline uint64_t arch_counter_to_ns(uint64_t cyc)
-{
-#define ARCH_TIMER_MULT 161319385
-#define ARCH_TIMER_SHIFT 21
-	return (cyc * ARCH_TIMER_MULT) >> ARCH_TIMER_SHIFT;
-}
-
-#define FILTER_DATAPOINTS	16
-#define FILTER_TIMEOUT		10000000000ULL /* 10 seconds, ~100us drift */
-#define FILTER_FREQ			10000000ULL /* 10 ms */
-struct moving_average {
-	uint64_t last_time;
-	int64_t input[FILTER_DATAPOINTS];
-	atomic64_t output;
-	uint8_t cnt;
-	uint8_t tail;
-};
-static struct moving_average moving_average_algo;
-static uint8_t rtc_compensation_suspend;
-static void moving_average_filter(struct moving_average *filter,
-		uint64_t ap_time, uint64_t hub_time)
-{
-	int i = 0;
-	int64_t avg;
-	int64_t ret_avg = 0;
-
-	if (ap_time > filter->last_time + FILTER_TIMEOUT ||
-		filter->last_time == 0) {
-		filter->tail = 0;
-		filter->cnt = 0;
-	} else if (ap_time < filter->last_time + FILTER_FREQ) {
-		return;
-	}
-	filter->last_time = ap_time;
-
-	filter->input[filter->tail++] = ap_time - hub_time;
-	filter->tail &= (FILTER_DATAPOINTS - 1);
-	if (filter->cnt < FILTER_DATAPOINTS)
-		filter->cnt++;
-
-	/* pr_err("hongxu raw_offset=%lld\n", ap_time - hub_time); */
-
-	for (i = 1, avg = 0; i < filter->cnt; i++)
-		avg += (filter->input[i] - filter->input[0]);
-	ret_avg = div_s64(avg, filter->cnt) + filter->input[0];
-	atomic64_set(&filter->output, ret_avg);
-}
-
-static uint64_t get_filter_output(struct moving_average *filter)
-{
-	return atomic64_read(&filter->output);
-}
-
-struct mtk_nanohub_cmd {
-	uint32_t reason;
-	void (*handler)(union SCP_SENSOR_HUB_DATA *rsp, unsigned int rx_len);
-};
-
-#define MTK_NANOHUB_CMD(_reason, _handler) \
-	{.reason = _reason, .handler = _handler}
-
-#define type_to_id(type) (type - ID_OFFSET)
-#define id_to_type(id) (id + ID_OFFSET)
-
-int mtk_nanohub_req_send(union SCP_SENSOR_HUB_DATA *data)
-{
-	int ret = 0;
-
-	if (data->req.sensorType >= ID_SENSOR_MAX) {
-		pr_err("invalid sensor type %d\n", data->rsp.sensorType);
-		return -1;
-	}
-	ret = mtk_nanohub_ipi_sync((unsigned char *)data,
-		SENSOR_IPI_SIZE);
-	if (ret != 0 || data->rsp.errCode != 0)
-		return -1;
-	return 0;
-}
-
-static void mtk_nanohub_write_wp_queue(union SCP_SENSOR_HUB_DATA *rsp)
-{
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-	struct curr_wp_queue *wp_queue = &device->wp_queue;
-
-	spin_lock(&wp_queue->buffer_lock);
-	wp_queue->ringbuffer[wp_queue->head++] = rsp->notify_rsp.currWp;
-	wp_queue->head &= wp_queue->bufsize - 1;
-	if (unlikely(wp_queue->head == wp_queue->tail))
-		pr_err("dropped currWp due to ringbuffer is full\n");
-	spin_unlock(&wp_queue->buffer_lock);
-}
-
-static int mtk_nanohub_fetch_next_wp(uint32_t *currWp)
-{
-	int have_event;
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-	struct curr_wp_queue *wp_queue = &device->wp_queue;
-
-	spin_lock_irq(&wp_queue->buffer_lock);
-
-	have_event = wp_queue->head != wp_queue->tail;
-	if (have_event) {
-		*currWp = wp_queue->ringbuffer[wp_queue->tail++];
-		wp_queue->tail &= wp_queue->bufsize - 1;
-	}
-	spin_unlock_irq(&wp_queue->buffer_lock);
-	/* pr_err("head:%d, tail:%d, currWp:%d\n",
-	 * wp_queue->head, wp_queue->tail, *currWp);
-	 */
-	return have_event;
-}
-
-static int mtk_nanohub_read_wp_queue(void)
-{
-	uint32_t currWp = 0;
-
-	while (mtk_nanohub_fetch_next_wp(&currWp)) {
-		if (mtk_nanohub_server_dispatch_data(&currWp))
-			return -EFAULT;
-	}
-	return 0;
-}
-
-static void mtk_nanohub_sync_time_work(struct work_struct *work)
-
-{
-	mtk_nanohub_send_timestamp_to_hub();
-}
-
-static void mtk_nanohub_sync_time_func(unsigned long data)
-{
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-
-	schedule_work(&device->sync_time_worker);
-
-	mod_timer(&device->sync_time_timer,
-		jiffies +  msecs_to_jiffies(SYNC_TIME_CYCLC));
-}
-
-static int mtk_nanohub_direct_push_work(void *data)
-{
-	for (;;) {
-		wait_event(chre_kthread_wait,
-			READ_ONCE(chre_kthread_wait_condition));
-		WRITE_ONCE(chre_kthread_wait_condition, false);
-		mtk_nanohub_read_wp_queue();
-	}
-	return 0;
-}
-
-static void mtk_nanohub_common_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-					unsigned int rx_len)
-{
-	mtk_nanohub_ipi_complete((unsigned char *)rsp, rx_len);
-}
-
-static void mtk_nanohub_moving_average(union SCP_SENSOR_HUB_DATA *rsp)
-{
-	uint64_t ap_now_time = 0, arch_counter = 0;
-	uint64_t scp_raw_time = 0, scp_now_time = 0;
-	uint64_t ipi_transfer_time = 0;
-
-	if (!timekeeping_rtc_skipresume()) {
-		if (READ_ONCE(rtc_compensation_suspend))
-			return;
-	}
-	ap_now_time = ktime_get_boot_ns();
-	arch_counter = arch_counter_get_cntvct();
-	scp_raw_time = rsp->notify_rsp.scp_timestamp;
-	ipi_transfer_time = arch_counter_to_ns(arch_counter -
-		rsp->notify_rsp.arch_counter);
-	scp_now_time = scp_raw_time + ipi_transfer_time;
-	moving_average_filter(&moving_average_algo, ap_now_time, scp_now_time);
-}
-
-static void mtk_nanohub_notify_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-		unsigned int rx_len)
-{
-	unsigned long flags = 0;
-
-	switch (rsp->notify_rsp.event) {
-	case SCP_DIRECT_PUSH:
-	case SCP_FIFO_FULL:
-		mtk_nanohub_moving_average(rsp);
-		mtk_nanohub_write_wp_queue(rsp);
-		WRITE_ONCE(chre_kthread_wait_condition, true);
-		wake_up(&chre_kthread_wait);
-		break;
-	case SCP_NOTIFY:
-		break;
-	case SCP_INIT_DONE:
-		spin_lock_irqsave(&scp_state_lock, flags);
-		WRITE_ONCE(scp_chre_ready, true);
-		if (READ_ONCE(scp_system_ready) && READ_ONCE(scp_chre_ready)) {
-			spin_unlock_irqrestore(&scp_state_lock, flags);
-			atomic_set(&power_status, SENSOR_POWER_UP);
-			//scp_power_monitor_notify(SENSOR_POWER_UP, NULL);
-			/* schedule_work(&device->power_up_work); */
-			wake_up(&power_reset_wait);
-		} else
-			spin_unlock_irqrestore(&scp_state_lock, flags);
-		break;
-	default:
-		break;
-	}
-}
-
-static const struct mtk_nanohub_cmd mtk_nanohub_cmds[] = {
-	MTK_NANOHUB_CMD(SENSOR_HUB_NOTIFY,
-		mtk_nanohub_notify_cmd),
-	MTK_NANOHUB_CMD(SENSOR_HUB_GET_DATA,
-		mtk_nanohub_common_cmd),
-	MTK_NANOHUB_CMD(SENSOR_HUB_SET_CONFIG,
-		mtk_nanohub_common_cmd),
-	MTK_NANOHUB_CMD(SENSOR_HUB_SET_CUST,
-		mtk_nanohub_common_cmd),
-	MTK_NANOHUB_CMD(SENSOR_HUB_SET_TIMESTAMP,
-		mtk_nanohub_common_cmd),
-	MTK_NANOHUB_CMD(SENSOR_HUB_RAW_DATA,
-		mtk_nanohub_common_cmd),
-};
-
-const struct mtk_nanohub_cmd *
-mtk_nanohub_find_cmd(uint32_t packetReason)
-{
-	int i;
-	const struct mtk_nanohub_cmd *cmd;
-
-	for (i = 0; i < ARRAY_SIZE(mtk_nanohub_cmds); i++) {
-		cmd = &mtk_nanohub_cmds[i];
-		if (cmd->reason == packetReason)
-			return cmd;
-	}
-	return NULL;
-}
-
-static void mtk_nanohub_ipi_handler(int id,
-		void *data, unsigned int len)
-{
-	union SCP_SENSOR_HUB_DATA *rsp = (union SCP_SENSOR_HUB_DATA *)data;
-	const struct mtk_nanohub_cmd *cmd;
-
-	if (len > SENSOR_IPI_SIZE) {
-		pr_err("%s len=%d error\n", __func__, len);
-		return;
-	}
-	/*pr_err("sensorType:%d, action=%d event:%d len:%d\n",
-	 * rsp->rsp.sensorType, rsp->rsp.action, rsp->notify_rsp.event, len);
-	 */
-	cmd = mtk_nanohub_find_cmd(rsp->rsp.action);
-	if (cmd != NULL)
-		cmd->handler(rsp, len);
-	else
-		pr_err("cannot find cmd!\n");
-}
-
-static void mtk_nanohub_init_sensor_state(void)
-{
-	mSensorState[SENSOR_TYPE_ACCELEROMETER].sensorType =
-		SENSOR_TYPE_ACCELEROMETER;
-	mSensorState[SENSOR_TYPE_ACCELEROMETER].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_GYROSCOPE].sensorType = SENSOR_TYPE_GYROSCOPE;
-	mSensorState[SENSOR_TYPE_GYROSCOPE].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_MAGNETIC_FIELD].sensorType =
-		SENSOR_TYPE_MAGNETIC_FIELD;
-	mSensorState[SENSOR_TYPE_MAGNETIC_FIELD].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_LIGHT].sensorType = SENSOR_TYPE_LIGHT;
-	mSensorState[SENSOR_TYPE_LIGHT].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_PROXIMITY].sensorType = SENSOR_TYPE_PROXIMITY;
-	mSensorState[SENSOR_TYPE_PROXIMITY].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_PRESSURE].sensorType = SENSOR_TYPE_PRESSURE;
-	mSensorState[SENSOR_TYPE_PRESSURE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_ORIENTATION].sensorType =
-		SENSOR_TYPE_ORIENTATION;
-	mSensorState[SENSOR_TYPE_ORIENTATION].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_ROTATION_VECTOR].sensorType =
-		SENSOR_TYPE_ROTATION_VECTOR;
-	mSensorState[SENSOR_TYPE_ROTATION_VECTOR].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_GAME_ROTATION_VECTOR].sensorType =
-		SENSOR_TYPE_GAME_ROTATION_VECTOR;
-	mSensorState[SENSOR_TYPE_GAME_ROTATION_VECTOR].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR].sensorType =
-		SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR;
-	mSensorState[SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR].timestamp_filter =
-		true;
-
-	mSensorState[SENSOR_TYPE_LINEAR_ACCELERATION].sensorType =
-		SENSOR_TYPE_LINEAR_ACCELERATION;
-	mSensorState[SENSOR_TYPE_LINEAR_ACCELERATION].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_GRAVITY].sensorType = SENSOR_TYPE_GRAVITY;
-	mSensorState[SENSOR_TYPE_GRAVITY].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_SIGNIFICANT_MOTION].sensorType =
-		SENSOR_TYPE_SIGNIFICANT_MOTION;
-	mSensorState[SENSOR_TYPE_SIGNIFICANT_MOTION].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_SIGNIFICANT_MOTION].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_STEP_COUNTER].sensorType =
-		SENSOR_TYPE_STEP_COUNTER;
-	mSensorState[SENSOR_TYPE_STEP_COUNTER].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_STEP_COUNTER].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_STEP_DETECTOR].sensorType =
-		SENSOR_TYPE_STEP_DETECTOR;
-	mSensorState[SENSOR_TYPE_STEP_DETECTOR].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_STEP_DETECTOR].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_TILT_DETECTOR].sensorType =
-		SENSOR_TYPE_TILT_DETECTOR;
-	mSensorState[SENSOR_TYPE_TILT_DETECTOR].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_TILT_DETECTOR].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_IN_POCKET].sensorType = SENSOR_TYPE_IN_POCKET;
-	mSensorState[SENSOR_TYPE_IN_POCKET].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_IN_POCKET].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_ACTIVITY].sensorType = SENSOR_TYPE_ACTIVITY;
-	mSensorState[SENSOR_TYPE_ACTIVITY].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_GLANCE_GESTURE].sensorType =
-		SENSOR_TYPE_GLANCE_GESTURE;
-	mSensorState[SENSOR_TYPE_GLANCE_GESTURE].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_GLANCE_GESTURE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_PICK_UP_GESTURE].sensorType =
-		SENSOR_TYPE_PICK_UP_GESTURE;
-	mSensorState[SENSOR_TYPE_PICK_UP_GESTURE].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_PICK_UP_GESTURE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_WAKE_GESTURE].sensorType =
-		SENSOR_TYPE_WAKE_GESTURE;
-	mSensorState[SENSOR_TYPE_WAKE_GESTURE].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_WAKE_GESTURE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_ANSWER_CALL].sensorType =
-		SENSOR_TYPE_ANSWER_CALL;
-	mSensorState[SENSOR_TYPE_ANSWER_CALL].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_ANSWER_CALL].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_STATIONARY_DETECT].sensorType =
-		SENSOR_TYPE_STATIONARY_DETECT;
-	mSensorState[SENSOR_TYPE_STATIONARY_DETECT].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_STATIONARY_DETECT].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_MOTION_DETECT].sensorType =
-		SENSOR_TYPE_MOTION_DETECT;
-	mSensorState[SENSOR_TYPE_MOTION_DETECT].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_MOTION_DETECT].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_DEVICE_ORIENTATION].sensorType =
-		SENSOR_TYPE_DEVICE_ORIENTATION;
-	mSensorState[SENSOR_TYPE_DEVICE_ORIENTATION].rate =
-		SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_DEVICE_ORIENTATION].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_GEOFENCE].sensorType = SENSOR_TYPE_GEOFENCE;
-	mSensorState[SENSOR_TYPE_GEOFENCE].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_GEOFENCE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_FLOOR_COUNTER].sensorType =
-		SENSOR_TYPE_FLOOR_COUNTER;
-	mSensorState[SENSOR_TYPE_FLOOR_COUNTER].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_FLOOR_COUNTER].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_FLAT].sensorType = SENSOR_TYPE_FLAT;
-	mSensorState[SENSOR_TYPE_FLAT].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_FLAT].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_RGBW].sensorType = SENSOR_TYPE_RGBW;
-	mSensorState[SENSOR_TYPE_RGBW].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_SAR].sensorType = SENSOR_TYPE_SAR;
-	mSensorState[SENSOR_TYPE_SAR].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_SAR].timestamp_filter = false;
-}
-
-static void init_sensor_config_cmd(struct ConfigCmd *cmd,
-		int sensor_type)
-{
-	uint8_t alt = mSensorState[sensor_type].alt;
-	bool enable = 0;
-
-	memset(cmd, 0x00, sizeof(*cmd));
-
-	cmd->evtType = EVT_NO_SENSOR_CONFIG_EVENT;
-	cmd->sensorType = mSensorState[sensor_type].sensorType;
-
-	if (alt && mSensorState[alt].enable &&
-			mSensorState[sensor_type].enable) {
-		cmd->cmd = CONFIG_CMD_ENABLE;
-		if (mSensorState[alt].rate > mSensorState[sensor_type].rate)
-			cmd->rate = mSensorState[alt].rate;
-		else
-			cmd->rate = mSensorState[sensor_type].rate;
-		if (mSensorState[alt].latency <
-				mSensorState[sensor_type].latency)
-			cmd->latency = mSensorState[alt].latency;
-		else
-			cmd->latency = mSensorState[sensor_type].latency;
-	} else if (alt && mSensorState[alt].enable) {
-		enable = mSensorState[alt].enable;
-		cmd->cmd =  enable ? CONFIG_CMD_ENABLE : CONFIG_CMD_DISABLE;
-		cmd->rate = mSensorState[alt].rate;
-		cmd->latency = mSensorState[alt].latency;
-	} else { /* !alt || !mSensorState[alt].enable */
-		enable = mSensorState[sensor_type].enable;
-		cmd->cmd = enable ? CONFIG_CMD_ENABLE : CONFIG_CMD_DISABLE;
-		cmd->rate = mSensorState[sensor_type].rate;
-		cmd->latency = mSensorState[sensor_type].latency;
-	}
-}
-
-static int mtk_nanohub_report_data(struct data_unit_t *data_t)
-{
-	int err = 0, sensor_type = 0, sensor_id = 0;
-
-	sensor_id = data_t->sensor_type;
-	sensor_type = id_to_type(sensor_id);
-	data_t->time_stamp += get_filter_output(&moving_average_algo);
-
-	if (sensor_id >= ID_SENSOR_MAX || sensor_id < 0) {
-		pr_err("invalid sensor id %d\n", sensor_id);
-		return 0;
-	}
-	/* must check report err for retry sending */
-	err = mtk_nanohub_report_to_manager(data_t);
-	/* for flush only !err true we decrease flushcnt */
-	if (data_t->flush_action == FLUSH_ACTION && !err)
-		atomic_dec_if_positive(&mSensorState[sensor_type].flushCnt);
-	return err;
-}
-static int mtk_nanohub_server_dispatch_data(uint32_t *currWp)
-{
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-	char *pStart, *pEnd, *rp, *wp;
-	struct data_unit_t event, event_copy;
-	uint32_t wp_copy;
-	int err = 0;
-
-	pStart = (char *)READ_ONCE(device->scp_sensor_fifo) +
-		offsetof(struct sensor_fifo, data);
-	pEnd = pStart +  READ_ONCE(device->scp_sensor_fifo->fifo_size);
-	wp_copy = *currWp;
-	rp = pStart + READ_ONCE(device->scp_sensor_fifo->rp);
-	wp = pStart + wp_copy;
-
-
-	if (wp < pStart || pEnd < wp) {
-		pr_err("FIFO wp invalid : %p, %p, %p\n", pStart, pEnd, wp);
-		return -5;
-	}
-	if (rp == wp) {
-		pr_err("FIFO empty\n");
-		return 0;
-	}
-	/*
-	 * opimize for dram,no cache,we should cpy data to cacheable ram
-	 * event and event_copy are cacheable ram, mtk_nanohub_report_data
-	 * will change time_stamp field, so when mtk_nanohub_report_data fail
-	 * we should reinit the time_stamp by memcpy to event_copy;
-	 * why memcpy_fromio(&event_copy), because rp is not cacheable
-	 */
-	if (rp < wp) {
-		while (rp < wp) {
-			memcpy_fromio(&event, rp, SENSOR_DATA_SIZE);
-			/* sleep safe enough, data save in dram and not lost */
-			do {
-				/* init event_copy when retry */
-				event_copy = event;
-				err = mtk_nanohub_report_data(&event_copy);
-				if (err < 0)
-					usleep_range(2000, 4000);
-			} while (err < 0);
-			rp += SENSOR_DATA_SIZE;
-		}
-	} else if (rp > wp) {
-		while (rp < pEnd) {
-			memcpy_fromio(&event, rp, SENSOR_DATA_SIZE);
-			do {
-				/* init event_copy when retry */
-				event_copy = event;
-				err = mtk_nanohub_report_data(&event_copy);
-				if (err < 0)
-					usleep_range(2000, 4000);
-			} while (err < 0);
-			rp += SENSOR_DATA_SIZE;
-		}
-		rp = pStart;
-		while (rp < wp) {
-			memcpy_fromio(&event, rp, SENSOR_DATA_SIZE);
-			do {
-				/* init event_copy when retry */
-				event_copy = event;
-				err = mtk_nanohub_report_data(&event_copy);
-				if (err < 0)
-					usleep_range(2000, 4000);
-			} while (err < 0);
-			rp += SENSOR_DATA_SIZE;
-		}
-	}
-	/*
-	 * must device->scp_sensor_fifo->rp = wp,
-	 * not device->scp_sensor_fifo->rp = device->scp_sensor_fifo->wp
-	 */
-	WRITE_ONCE(device->scp_sensor_fifo->rp, wp_copy);
-	return 0;
-}
-
-static int mtk_nanohub_send_dram_info_to_hub(void)
-{
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-	union SCP_SENSOR_HUB_DATA data;
-	unsigned int len = 0;
-	int err = 0, retry = 0, total = 10;
-
-	device->shub_dram_phys = scp_get_reserve_mem_phys(SENS_MEM_ID);
-	device->shub_dram_virt = scp_get_reserve_mem_virt(SENS_MEM_ID);
-
-	data.set_config_req.sensorType = 0;
-	data.set_config_req.action = SENSOR_HUB_SET_CONFIG;
-	data.set_config_req.bufferBase =
-		(unsigned int)(device->shub_dram_phys & 0xFFFFFFFF);
-
-	len = sizeof(data.set_config_req);
-	for (retry = 0; retry < total; ++retry) {
-		err = mtk_nanohub_req_send(&data);
-		if (err < 0 || data.rsp.action != SENSOR_HUB_SET_CONFIG) {
-			pr_err("%s fail!\n", __func__);
-			continue;
-		}
-		break;
-	}
-	if (retry < total)
-		pr_notice("%s success\n", __func__);
-	return SCP_SENSOR_HUB_SUCCESS;
-}
-
-static int mtk_nanohub_enable_rawdata_to_hub(int sensor_id,
-		int en)
-{
-	int err = 0;
-	union SCP_SENSOR_HUB_DATA req;
-
-	req.req.sensorType = sensor_id;
-	req.req.action = SENSOR_HUB_RAW_DATA;
-	req.req.data[0] = en;
-
-	err = mtk_nanohub_req_send(&req);
-	if (err < 0 || sensor_id != req.rsp.sensorType ||
-			req.rsp.action != SENSOR_HUB_RAW_DATA) {
-		pr_err("%s fail!\n", __func__);
-		return -1;
-	}
-	return err;
-}
-
-static int mtk_nanohub_send_timestamp_wake_locked(void)
-{
-	union SCP_SENSOR_HUB_DATA req;
-	int len;
-	int err = 0;
-	uint64_t now_time, arch_counter;
-
-	/* send_timestamp_to_hub is process context, disable irq is safe */
-	local_irq_disable();
-	now_time = ktime_get_boot_ns();
-	arch_counter = arch_counter_get_cntvct();
-	local_irq_enable();
-	req.set_config_req.sensorType = 0;
-	req.set_config_req.action = SENSOR_HUB_SET_TIMESTAMP;
-	req.set_config_req.ap_timestamp = now_time;
-	req.set_config_req.arch_counter = arch_counter;
-	/* pr_err("ns=%lld, arch_counter=%lld!\n", now_time, arch_counter); */
-	len = sizeof(req.set_config_req);
-	err = mtk_nanohub_req_send(&req);
-	if (err < 0 || req.rsp.action != SENSOR_HUB_SET_TIMESTAMP) {
-		pr_err("%s fail!\n", __func__);
-		return -1;
-	}
-	return err;
-}
-
-static int mtk_nanohub_send_timestamp_to_hub(void)
-{
-	int err = 0;
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-
-	if (READ_ONCE(rtc_compensation_suspend)) {
-		pr_err("rtc_compensation_suspend suspend,drop time sync\n");
-		return 0;
-	}
-
-	__pm_stay_awake(&device->time_sync_wakeup_src);
-	err = mtk_nanohub_send_timestamp_wake_locked();
-	__pm_relax(&device->time_sync_wakeup_src);
-	return err;
-}
-
-int mtk_nanohub_enable_to_hub(uint8_t sensor_id, int enabledisable)
-{
-	uint8_t sensor_type = id_to_type(sensor_id);
-	struct ConfigCmd cmd;
-	int ret = 0;
-
-	if (enabledisable == 1)
-		scp_register_feature(SENS_FEATURE_ID);
-	mutex_lock(&mSensorState_mtx);
-	if (sensor_id >= ID_SENSOR_MAX) {
-		pr_err("invalid id %d\n", sensor_id);
-		mutex_unlock(&mSensorState_mtx);
-		return -1;
-	}
-	if (!mSensorState[sensor_type].sensorType) {
-		pr_err("unhandle id %d, is inited?\n", sensor_id);
-		mutex_unlock(&mSensorState_mtx);
-		return -1;
-	}
-	mSensorState[sensor_type].enable = enabledisable;
-	init_sensor_config_cmd(&cmd, sensor_type);
-	if (atomic_read(&power_status) == SENSOR_POWER_UP) {
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0)
-			pr_err("fail enable: [%d,%d]\n", sensor_id, cmd.cmd);
-	}
-	if (!enabledisable && atomic_read(&mSensorState[sensor_type].flushCnt))
-		pr_err("id=%d flush count not 0 when disable\n", sensor_id);
-	mutex_unlock(&mSensorState_mtx);
-	return ret < 0 ? ret : 0;
-}
-
-int mtk_nanohub_batch_to_hub(uint8_t sensor_id,
-		int flag, int64_t samplingPeriodNs,
-		int64_t maxBatchReportLatencyNs)
-{
-	uint8_t sensor_type = id_to_type(sensor_id);
-	struct ConfigCmd cmd;
-	int ret = 0;
-	uint64_t rate = 1024000000000ULL;
-
-	mutex_lock(&mSensorState_mtx);
-	if (sensor_id >= ID_SENSOR_MAX) {
-		pr_err("invalid id %d\n", sensor_id);
-		mutex_unlock(&mSensorState_mtx);
-		return -1;
-	}
-	if (!mSensorState[sensor_type].sensorType) {
-		pr_err("unhandle type %d, is inited?\n", sensor_type);
-		mutex_unlock(&mSensorState_mtx);
-		return -1;
-	}
-	if (samplingPeriodNs > 0 &&
-		mSensorState[sensor_type].rate != SENSOR_RATE_ONCHANGE &&
-		mSensorState[sensor_type].rate != SENSOR_RATE_ONESHOT) {
-		rate = div64_u64(rate, samplingPeriodNs);
-		mSensorState[sensor_type].rate = rate;
-	}
-	mSensorState[sensor_type].latency = maxBatchReportLatencyNs;
-	init_sensor_config_cmd(&cmd, sensor_type);
-	if (atomic_read(&power_status) == SENSOR_POWER_UP) {
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0)
-			pr_err("failed batch: [%d,%d,%lld,%d]\n",
-				sensor_id, cmd.rate, cmd.latency, cmd.cmd);
-	}
-	mutex_unlock(&mSensorState_mtx);
-	return ret < 0 ? ret : 0;
-}
-
-int mtk_nanohub_flush_to_hub(uint8_t sensor_id)
-{
-	uint8_t sensor_type = id_to_type(sensor_id);
-	struct ConfigCmd cmd;
-	int ret = 0;
-
-	mutex_lock(&mSensorState_mtx);
-	if (sensor_id >= ID_SENSOR_MAX) {
-		pr_err("invalid id %d\n", sensor_id);
-		mutex_unlock(&mSensorState_mtx);
-		return -1;
-	}
-	if (!mSensorState[sensor_type].sensorType) {
-		pr_err("unhandle id %d, is inited?\n", sensor_id);
-		mutex_unlock(&mSensorState_mtx);
-		return -1;
-	}
-	atomic_inc(&mSensorState[sensor_type].flushCnt);
-	init_sensor_config_cmd(&cmd, sensor_type);
-	cmd.cmd = CONFIG_CMD_FLUSH;
-	if (atomic_read(&power_status) == SENSOR_POWER_UP) {
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0)
-			pr_err("failed flush: [%d]\n", sensor_id);
-	}
-	mutex_unlock(&mSensorState_mtx);
-	return ret < 0 ? ret : 0;
-}
-
-int mtk_nanohub_cfg_to_hub(uint8_t sensor_id, uint8_t *data, uint8_t count)
-{
-	struct ConfigCmd *cmd = NULL;
-	int ret = 0;
-
-	if (sensor_id >= ID_SENSOR_MAX) {
-		pr_err("invalid id %d\n", sensor_id);
-		return -1;
-	}
-	cmd = vzalloc(sizeof(struct ConfigCmd) + count);
-	if (!cmd)
-		return -1;
-	cmd->evtType = EVT_NO_SENSOR_CONFIG_EVENT;
-	cmd->sensorType = id_to_type(sensor_id);
-	cmd->cmd = CONFIG_CMD_CFG_DATA;
-	memcpy(cmd->data, data, count);
-	if (atomic_read(&power_status) == SENSOR_POWER_UP) {
-		ret = nanohub_external_write((const uint8_t *)cmd,
-			sizeof(struct ConfigCmd) + count);
-		if (ret < 0)
-			pr_err("failed cfg: [%d,%d]\n", sensor_id, cmd->cmd);
-	}
-	vfree(cmd);
-	return ret < 0 ? ret : 0;
-}
-
-int mtk_nanohub_calibration_to_hub(uint8_t sensor_id)
-{
-	uint8_t sensor_type = id_to_type(sensor_id);
-	struct ConfigCmd cmd;
-	int ret = 0;
-
-	if (sensor_id >= ID_SENSOR_MAX) {
-		pr_err("invalid id %d\n", sensor_id);
-		return -1;
-	}
-	if (!mSensorState[sensor_type].sensorType) {
-		pr_err("unhandle id %d, is inited?\n", sensor_id);
-		return -1;
-	}
-	init_sensor_config_cmd(&cmd, sensor_type);
-	cmd.cmd = CONFIG_CMD_CALIBRATE;
-	if (atomic_read(&power_status) == SENSOR_POWER_UP) {
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0)
-			pr_err("failed calibration: [%d]\n", sensor_id);
-	}
-	return ret < 0 ? ret : 0;
-}
-
-int mtk_nanohub_selftest_to_hub(uint8_t sensor_id)
-{
-	uint8_t sensor_type = id_to_type(sensor_id);
-	struct ConfigCmd cmd;
-	int ret = 0;
-
-	if (sensor_id >= ID_SENSOR_MAX) {
-		pr_err("invalid id %d\n", sensor_id);
-		return -1;
-	}
-	if (!mSensorState[sensor_type].sensorType) {
-		pr_err("unhandle id %d, is inited?\n", sensor_id);
-		return -1;
-	}
-	init_sensor_config_cmd(&cmd, sensor_type);
-	cmd.cmd = CONFIG_CMD_SELF_TEST;
-	if (atomic_read(&power_status) == SENSOR_POWER_UP) {
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0)
-			pr_err("failed selfttest: [%d]\n", sensor_id);
-	}
-	return ret < 0 ? ret : 0;
-}
-
-int mtk_nanohub_get_data_from_hub(uint8_t sensor_id,
-		struct data_unit_t *data)
-{
-	union SCP_SENSOR_HUB_DATA req;
-	struct data_unit_t *data_t;
-	int len = 0, err = 0;
-
-	if (atomic_read(&power_status) == SENSOR_POWER_DOWN) {
-		pr_err("scp power down, we can not access scp\n");
-		return -1;
-	}
-
-	req.get_data_req.sensorType = sensor_id;
-	req.get_data_req.action = SENSOR_HUB_GET_DATA;
-	len = sizeof(req.get_data_req);
-	err = mtk_nanohub_req_send(&req);
-	if (err < 0) {
-		pr_err("get_data fail:%d!\n", err);
-		return -1;
-	}
-	if (sensor_id != req.get_data_rsp.sensorType ||
-		req.get_data_rsp.action != SENSOR_HUB_GET_DATA ||
-		req.get_data_rsp.errCode != 0) {
-		pr_err("req id: %d, rsp Type:%d action:%d, errcode:%d\n",
-			sensor_id, req.get_data_rsp.sensorType,
-			req.get_data_rsp.action, req.get_data_rsp.errCode);
-
-		return req.get_data_rsp.errCode;
-	}
-
-	data_t = (struct data_unit_t *)req.get_data_rsp.data.int8_Data;
-	switch (sensor_id) {
-	case ID_ACCELEROMETER:
-		data->time_stamp = data_t->time_stamp;
-		data->accelerometer_t.x = data_t->accelerometer_t.x;
-		data->accelerometer_t.y = data_t->accelerometer_t.y;
-		data->accelerometer_t.z = data_t->accelerometer_t.z;
-		data->accelerometer_t.x_bias = data_t->accelerometer_t.x_bias;
-		data->accelerometer_t.y_bias = data_t->accelerometer_t.y_bias;
-		data->accelerometer_t.z_bias = data_t->accelerometer_t.z_bias;
-		data->accelerometer_t.status = data_t->accelerometer_t.status;
-		break;
-	case ID_LIGHT:
-		data->time_stamp = data_t->time_stamp;
-		data->light = data_t->light;
-		break;
-	case ID_PROXIMITY:
-		data->time_stamp = data_t->time_stamp;
-		data->proximity_t.steps = data_t->proximity_t.steps;
-		data->proximity_t.oneshot = data_t->proximity_t.oneshot;
-		break;
-	case ID_PRESSURE:
-		data->time_stamp = data_t->time_stamp;
-		data->pressure_t.pressure = data_t->pressure_t.pressure;
-		data->pressure_t.status = data_t->pressure_t.status;
-		break;
-	case ID_GYROSCOPE:
-		data->time_stamp = data_t->time_stamp;
-		data->gyroscope_t.x = data_t->gyroscope_t.x;
-		data->gyroscope_t.y = data_t->gyroscope_t.y;
-		data->gyroscope_t.z = data_t->gyroscope_t.z;
-		data->gyroscope_t.x_bias = data_t->gyroscope_t.x_bias;
-		data->gyroscope_t.y_bias  = data_t->gyroscope_t.y_bias;
-		data->gyroscope_t.z_bias  = data_t->gyroscope_t.z_bias;
-		data->gyroscope_t.status = data_t->gyroscope_t.status;
-		break;
-	case ID_MAGNETIC_FIELD:
-		data->time_stamp = data_t->time_stamp;
-		data->magnetic_t.x = data_t->magnetic_t.x;
-		data->magnetic_t.y = data_t->magnetic_t.y;
-		data->magnetic_t.z = data_t->magnetic_t.z;
-		data->magnetic_t.x_bias = data_t->magnetic_t.x_bias;
-		data->magnetic_t.y_bias = data_t->magnetic_t.y_bias;
-		data->magnetic_t.z_bias = data_t->magnetic_t.z_bias;
-		data->magnetic_t.status = data_t->magnetic_t.status;
-		break;
-	case ID_SAR:
-		data->time_stamp = data_t->time_stamp;
-		data->sar_event.data[0] = data_t->sar_event.data[0];
-		data->sar_event.data[1] = data_t->sar_event.data[1];
-		data->sar_event.data[2] = data_t->sar_event.data[2];
-		break;
-	default:
-		err = -1;
-		break;
-	}
-	return err;
-}
-
-int mtk_nanohub_set_cmd_to_hub(uint8_t sensor_id,
-		enum CUST_ACTION action, void *data)
-{
-	union SCP_SENSOR_HUB_DATA req;
-	int len = 0, err = 0;
-	struct SCP_SENSOR_HUB_GET_RAW_DATA *pGetRawData;
-
-	req.get_data_req.sensorType = sensor_id;
-	req.get_data_req.action = SENSOR_HUB_SET_CUST;
-
-	if (atomic_read(&power_status) == SENSOR_POWER_DOWN) {
-		pr_err("scp power down, we can not access scp\n");
-		return -1;
-	}
-
-	switch (sensor_id) {
-	case ID_ACCELEROMETER:
-		req.set_cust_req.sensorType = ID_ACCELEROMETER;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_RESET_CALI:
-			req.set_cust_req.resetCali.action =
-				CUST_ACTION_RESET_CALI;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.resetCali);
-			break;
-		case CUST_ACTION_SET_CALI:
-			req.set_cust_req.setCali.action = CUST_ACTION_SET_CALI;
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_X]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_X);
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_Y]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_Y);
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_Z]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_Z);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setCali);
-			break;
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SET_DIRECTION:
-			req.set_cust_req.setDirection.action =
-				CUST_ACTION_SET_DIRECTION;
-			req.set_cust_req.setDirection.direction =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-			     custData) + sizeof(req.set_cust_req.setDirection);
-			break;
-		case CUST_ACTION_SET_FACTORY:
-			req.set_cust_req.setFactory.action =
-				CUST_ACTION_SET_FACTORY;
-			req.set_cust_req.setFactory.factory =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setFactory);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action = CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_LIGHT:
-		req.set_cust_req.sensorType = ID_LIGHT;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_GET_RAW_DATA:
-			req.set_cust_req.getRawData.action =
-				CUST_ACTION_GET_RAW_DATA;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getRawData);
-			err = mtk_nanohub_req_send(&req);
-			if (err == 0) {
-				if ((req.set_cust_rsp.action !=
-					SENSOR_HUB_SET_CUST)
-					|| (req.set_cust_rsp.errCode != 0)) {
-					pr_err("get_raw fail!\n");
-					return -1;
-				}
-				if (req.set_cust_rsp.getRawData.action !=
-					CUST_ACTION_GET_RAW_DATA) {
-					pr_err("get_raw fail!\n");
-					return -1;
-				}
-				pGetRawData = &req.set_cust_rsp.getRawData;
-				*((uint8_t *) data) =
-					pGetRawData->uint8_data[0];
-			} else {
-				pr_err("get_raw failed!\n");
-			}
-			return 0;
-		case CUST_ACTION_SHOW_ALSLV:
-			req.set_cust_req.showAlslv.action =
-				CUST_ACTION_SHOW_ALSLV;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showAlslv);
-			break;
-		case CUST_ACTION_SHOW_ALSVAL:
-			req.set_cust_req.showAlsval.action =
-				CUST_ACTION_GET_RAW_DATA;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showAlsval);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_PROXIMITY:
-		req.set_cust_req.sensorType = ID_PROXIMITY;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_RESET_CALI:
-			req.set_cust_req.resetCali.action =
-				CUST_ACTION_RESET_CALI;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.resetCali);
-			break;
-		case CUST_ACTION_SET_CALI:
-			req.set_cust_req.setCali.action = CUST_ACTION_SET_CALI;
-			req.set_cust_req.setCali.int32_data[0] =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setCali);
-			break;
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action = CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_SET_PS_THRESHOLD:
-			req.set_cust_req.setPSThreshold.action =
-				CUST_ACTION_SET_PS_THRESHOLD;
-			req.set_cust_req.setPSThreshold.threshold[0]
-			    = *((int32_t *) data + 0);
-			req.set_cust_req.setPSThreshold.threshold[1]
-			    = *((int32_t *) data + 1);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-			    custData) + sizeof(req.set_cust_req.setPSThreshold);
-			break;
-		case CUST_ACTION_GET_RAW_DATA:
-			req.set_cust_req.getRawData.action =
-				CUST_ACTION_GET_RAW_DATA;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getRawData);
-			err = mtk_nanohub_req_send(&req);
-			if (err == 0) {
-				if ((req.set_cust_rsp.action !=
-					SENSOR_HUB_SET_CUST)
-					|| (req.set_cust_rsp.errCode != 0)) {
-					pr_err("get_raw fail!\n");
-					return -1;
-				}
-				if (req.set_cust_rsp.getRawData.action !=
-					CUST_ACTION_GET_RAW_DATA) {
-					pr_err("get_raw fail!\n");
-					return -1;
-				}
-				pGetRawData = &req.set_cust_rsp.getRawData;
-				*((uint16_t *) data) =
-					pGetRawData->uint16_data[0];
-			} else {
-				pr_err("get_raw failed!\n");
-			}
-			return 0;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_PRESSURE:
-		req.set_cust_req.sensorType = ID_PRESSURE;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action = CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_GYROSCOPE:
-		req.set_cust_req.sensorType = ID_GYROSCOPE;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_RESET_CALI:
-			req.set_cust_req.resetCali.action =
-				CUST_ACTION_RESET_CALI;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.resetCali);
-			break;
-		case CUST_ACTION_SET_CALI:
-			req.set_cust_req.setCali.action = CUST_ACTION_SET_CALI;
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_X]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_X);
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_Y]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_Y);
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_Z]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_Z);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setCali);
-			break;
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SET_DIRECTION:
-			req.set_cust_req.setDirection.action =
-				CUST_ACTION_SET_DIRECTION;
-			req.set_cust_req.setDirection.direction =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-			     custData) + sizeof(req.set_cust_req.setDirection);
-			break;
-		case CUST_ACTION_SET_FACTORY:
-			req.set_cust_req.setFactory.action =
-				CUST_ACTION_SET_FACTORY;
-			req.set_cust_req.setFactory.factory =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setFactory);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action =
-				CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_MAGNETIC_FIELD:
-		req.set_cust_req.sensorType = ID_MAGNETIC_FIELD;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SET_DIRECTION:
-			req.set_cust_req.setDirection.action =
-				CUST_ACTION_SET_DIRECTION;
-			req.set_cust_req.setDirection.direction =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-			     custData) + sizeof(req.set_cust_req.setDirection);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action = CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_SAR:
-		req.set_cust_req.sensorType = ID_SAR;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	default:
-		req.set_cust_req.sensorType = sensor_id;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		default:
-			return -1;
-		}
-	}
-	err = mtk_nanohub_req_send(&req);
-	if (err < 0) {
-		pr_err("set_cust fail!\n");
-		return -1;
-	}
-	if (sensor_id != req.get_data_rsp.sensorType
-		|| SENSOR_HUB_SET_CUST != req.get_data_rsp.action
-		|| 0 != req.get_data_rsp.errCode) {
-		pr_err("error : %d\n", req.get_data_rsp.errCode);
-		return req.get_data_rsp.errCode;
-	}
-
-	switch (action) {
-	case CUST_ACTION_GET_SENSOR_INFO:
-		if (req.set_cust_rsp.getInfo.action !=
-			CUST_ACTION_GET_SENSOR_INFO) {
-			pr_info("get_info failed!\n");
-			return -1;
-		}
-		memcpy((struct sensorInfo_t *)data,
-			&req.set_cust_rsp.getInfo.sensorInfo,
-			sizeof(struct sensorInfo_t));
-		break;
-	default:
-		break;
-	}
-	return err;
-}
-
-static void mtk_nanohub_restoring_sensor(int sensor_id)
-{
-	uint8_t sensor_type = id_to_type(sensor_id);
-	int ret = 0;
-	int flush_cnt = 0;
-	struct ConfigCmd cmd;
-
-	if (mSensorState[sensor_type].sensorType &&
-			mSensorState[sensor_type].enable) {
-		init_sensor_config_cmd(&cmd, sensor_type);
-		pr_debug("restoring: [%d,%d,%d,%lld]\n",
-			sensor_id, mSensorState[sensor_type].enable,
-			mSensorState[sensor_type].rate,
-			mSensorState[sensor_type].latency);
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0)
-			pr_notice("failed registerlistener [%d,%d]\n",
-				sensor_id, cmd.cmd);
-
-		cmd.cmd = CONFIG_CMD_FLUSH;
-		for (flush_cnt = 0; flush_cnt <
-			atomic_read(&mSensorState[sensor_type].flushCnt);
-				flush_cnt++) {
-			ret = nanohub_external_write((const uint8_t *)&cmd,
-				sizeof(struct ConfigCmd));
-			if (ret < 0)
-				pr_notice("failed flush:%d\n", sensor_id);
-		}
-	}
-}
-
-static void mtk_nanohub_get_devinfo(void)
-{
-	int id = 0, sensor = 0;
-	struct sensorInfo_t hubinfo;
-	struct sensorlist_info_t listinfo;
-	struct mag_libinfo_t maginfo;
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-
-	if (likely(atomic_xchg(&device->get_list_first_boot, 1)))
-		return;
-
-	for (id = 0; id < ID_SENSOR_MAX; ++id) {
-		sensor = id_to_type(id);
-		if (sensorlist_find_sensor(sensor) < 0)
-			continue;
-		memset(&hubinfo, 0, sizeof(struct sensorInfo_t));
-		if (mtk_nanohub_set_cmd_to_hub(id,
-				CUST_ACTION_GET_SENSOR_INFO, &hubinfo) < 0) {
-			pr_err("type(%d) not registered\n", sensor);
-			continue;
-		}
-		memset(&listinfo, 0, sizeof(struct sensorlist_info_t));
-		strlcpy(listinfo.name, hubinfo.name, sizeof(listinfo.name));
-		sensorlist_register_devinfo(sensor, &listinfo);
-		/* restore mag lib info */
-		if (sensor == SENSOR_TYPE_MAGNETIC_FIELD) {
-			memset(&maginfo, 0, sizeof(struct mag_libinfo_t));
-			maginfo.deviceid = hubinfo.mag_dev_info.deviceid;
-			maginfo.layout = hubinfo.mag_dev_info.layout;
-			strlcpy(maginfo.libname, hubinfo.mag_dev_info.libname,
-					sizeof(maginfo.libname));
-			sensorlist_register_maginfo(&maginfo);
-		}
-	}
-}
-
-static void mtk_nanohub_restoring_config(void)
-{
-	int length = 0;
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-	uint8_t *data = NULL;
-
-	if (unlikely(!atomic_xchg(&device->cfg_data_after_reboot, 1)))
-		return;
-
-	pr_notice("restoring sensor config\n");
-
-	length = sizeof(device->acc_config_data);
-	data = vzalloc(length);
-	spin_lock(&config_data_lock);
-	memcpy(data, device->acc_config_data, length);
-	spin_unlock(&config_data_lock);
-	mtk_nanohub_cfg_to_hub(ID_ACCELEROMETER, data, length);
-	vfree(data);
-
-	length = sizeof(device->gyro_config_data);
-	data = vzalloc(length);
-	spin_lock(&config_data_lock);
-	memcpy(data, device->gyro_config_data, length);
-	spin_unlock(&config_data_lock);
-	mtk_nanohub_cfg_to_hub(ID_GYROSCOPE, data, length);
-	vfree(data);
-
-	length = sizeof(device->mag_config_data);
-	data = vzalloc(length);
-	spin_lock(&config_data_lock);
-	memcpy(data, device->mag_config_data, length);
-	spin_unlock(&config_data_lock);
-	mtk_nanohub_cfg_to_hub(ID_MAGNETIC_FIELD, data, length);
-	vfree(data);
-
-	length = sizeof(device->light_config_data);
-	data = vzalloc(length);
-	spin_lock(&config_data_lock);
-	memcpy(data, device->light_config_data, length);
-	spin_unlock(&config_data_lock);
-	mtk_nanohub_cfg_to_hub(ID_LIGHT, data, length);
-	vfree(data);
-
-	length = sizeof(device->proximity_config_data);
-	data = vzalloc(length);
-	spin_lock(&config_data_lock);
-	memcpy(data, device->proximity_config_data, length);
-	spin_unlock(&config_data_lock);
-	mtk_nanohub_cfg_to_hub(ID_PROXIMITY, data, length);
-	vfree(data);
-}
-
-static void mtk_nanohub_start_timesync(void)
-{
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-
-	if (likely(atomic_xchg(&device->start_timesync_first_boot, 1)))
-		return;
-
-	mod_timer(&device->sync_time_timer,
-		jiffies + msecs_to_jiffies(SYNC_TIME_START_CYCLC));
-}
-
-void mtk_nanohub_power_up_loop(void *data)
-{
-	int id = 0;
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-	unsigned long flags = 0;
-
-	wait_event(power_reset_wait,
-		READ_ONCE(scp_system_ready) && READ_ONCE(scp_chre_ready));
-	spin_lock_irqsave(&scp_state_lock, flags);
-	WRITE_ONCE(scp_chre_ready, false);
-	WRITE_ONCE(scp_system_ready, false);
-	spin_unlock_irqrestore(&scp_state_lock, flags);
-
-	/* firstly we should update dram information */
-	/* 1. reset wp queue head and tail */
-	device->wp_queue.head = 0;
-	device->wp_queue.tail = 0;
-	/* 2. init dram information */
-	WRITE_ONCE(device->scp_sensor_fifo,
-		(struct sensor_fifo *)
-		(long)scp_get_reserve_mem_virt(SENS_MEM_ID));
-	WARN_ON(device->scp_sensor_fifo == NULL);
-	WRITE_ONCE(device->scp_sensor_fifo->wp, 0);
-	WRITE_ONCE(device->scp_sensor_fifo->rp, 0);
-	WRITE_ONCE(device->scp_sensor_fifo->fifo_size,
-		((long)scp_get_reserve_mem_size(SENS_MEM_ID) -
-			offsetof(struct sensor_fifo, data)) /
-				SENSOR_DATA_SIZE * SENSOR_DATA_SIZE);
-	pr_debug("scp_sensor_fifo =%p, wp =%d, rp =%d, size =%d\n",
-		READ_ONCE(device->scp_sensor_fifo),
-		READ_ONCE(device->scp_sensor_fifo->wp),
-		READ_ONCE(device->scp_sensor_fifo->rp),
-		READ_ONCE(device->scp_sensor_fifo->fifo_size));
-	/* 3. send dram information to scp */
-	mtk_nanohub_send_dram_info_to_hub();
-	/* 4. get device info for mag lib and dynamic list */
-	mtk_nanohub_get_devinfo();
-	/* 5. start timesync */
-	mtk_nanohub_start_timesync();
-	/* 6. we restore sensor calibration data when scp reboot */
-	mtk_nanohub_restoring_config();
-	/* 7. we enable sensor which sensor is enable by framework */
-	mutex_lock(&mSensorState_mtx);
-	for (id = 0; id < ID_SENSOR_MAX; id++)
-		mtk_nanohub_restoring_sensor(id);
-	mutex_unlock(&mSensorState_mtx);
-}
-
-static int mtk_nanohub_power_up_work(void *data)
-{
-	for (;;)
-		mtk_nanohub_power_up_loop(data);
-	return 0;
-}
-
-static int mtk_nanohub_ready_event(struct notifier_block *this,
-	unsigned long event, void *ptr)
-{
-	unsigned long flags = 0;
-
-	if (event == SCP_EVENT_STOP) {
-		spin_lock_irqsave(&scp_state_lock, flags);
-		WRITE_ONCE(scp_system_ready, false);
-		spin_unlock_irqrestore(&scp_state_lock, flags);
-		atomic_set(&power_status, SENSOR_POWER_DOWN);
-		//scp_power_monitor_notify(SENSOR_POWER_DOWN, ptr);
-	}
-
-	if (event == SCP_EVENT_READY) {
-		spin_lock_irqsave(&scp_state_lock, flags);
-		WRITE_ONCE(scp_system_ready, true);
-		if (READ_ONCE(scp_system_ready) && READ_ONCE(scp_chre_ready)) {
-			spin_unlock_irqrestore(&scp_state_lock, flags);
-			atomic_set(&power_status, SENSOR_POWER_UP);
-			//scp_power_monitor_notify(SENSOR_POWER_UP, ptr);
-			/* schedule_work(&device->power_up_work); */
-			wake_up(&power_reset_wait);
-		} else
-			spin_unlock_irqrestore(&scp_state_lock, flags);
-	}
-
-	return NOTIFY_DONE;
-}
-
-static struct notifier_block mtk_nanohub_ready_notifier = {
-	.notifier_call = mtk_nanohub_ready_event,
-};
-
-static int mtk_nanohub_enable(struct hf_device *hfdev,
-		int sensor_type, int en)
-{
-	if (sensor_type <= 0)
-		return 0;
-	pr_notice("%s [%d,%d]\n", __func__, sensor_type, en);
-	return mtk_nanohub_enable_to_hub(type_to_id(sensor_type), en);
-}
-
-static int mtk_nanohub_batch(struct hf_device *hfdev,
-		int sensor_type, int64_t delay, int64_t latency)
-{
-	if (sensor_type <= 0)
-		return 0;
-	pr_notice("%s [%d,%lld,%lld]\n", __func__, sensor_type, delay, latency);
-	return mtk_nanohub_batch_to_hub(type_to_id(sensor_type),
-		0, delay, latency);
-}
-
-static int mtk_nanohub_flush(struct hf_device *hfdev,
-		int sensor_type)
-{
-	if (sensor_type <= 0)
-		return 0;
-	pr_notice("%s [%d]\n", __func__, sensor_type);
-	return mtk_nanohub_flush_to_hub(type_to_id(sensor_type));
-}
-
-static int mtk_nanohub_calibration(struct hf_device *hfdev,
-		int sensor_type)
-{
-	if (sensor_type <= 0)
-		return 0;
-	pr_notice("%s [%d]\n", __func__, sensor_type);
-	return mtk_nanohub_calibration_to_hub(type_to_id(sensor_type));
-}
-
-static int mtk_nanohub_config(struct hf_device *hfdev,
-		int sensor_type, int32_t *data)
-{
-	int length = 0;
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-
-	if (sensor_type <= 0)
-		return 0;
-	pr_notice("%s [%d]\n", __func__, sensor_type);
-	switch (type_to_id(sensor_type)) {
-	case ID_ACCELEROMETER:
-		length = sizeof(device->acc_config_data);
-		spin_lock(&config_data_lock);
-		memcpy(device->acc_config_data, data, length);
-		spin_unlock(&config_data_lock);
-		break;
-	case ID_GYROSCOPE:
-		length = sizeof(device->gyro_config_data);
-		spin_lock(&config_data_lock);
-		memcpy(device->gyro_config_data, data, length);
-		spin_unlock(&config_data_lock);
-		break;
-	case ID_MAGNETIC_FIELD:
-		length = sizeof(device->mag_config_data);
-		spin_lock(&config_data_lock);
-		memcpy(device->mag_config_data, data, length);
-		spin_unlock(&config_data_lock);
-		break;
-	case ID_LIGHT:
-		length = sizeof(device->light_config_data);
-		spin_lock(&config_data_lock);
-		memcpy(device->light_config_data, data, length);
-		spin_unlock(&config_data_lock);
-		break;
-	case ID_PROXIMITY:
-		length = sizeof(device->proximity_config_data);
-		spin_lock(&config_data_lock);
-		memcpy(device->proximity_config_data, data, length);
-		spin_unlock(&config_data_lock);
-		break;
-	}
-	if (!length) {
-		pr_err("%s type(%d) length fail\n", __func__, sensor_type);
-		return 0;
-	}
-	return mtk_nanohub_cfg_to_hub(type_to_id(sensor_type),
-		(uint8_t *)data, length);
-}
-
-static int mtk_nanohub_selftest(struct hf_device *hfdev,
-		int sensor_type)
-{
-	if (sensor_type <= 0)
-		return 0;
-	pr_notice("%s [%d]\n", __func__, sensor_type);
-	return mtk_nanohub_selftest_to_hub(type_to_id(sensor_type));
-}
-
-static int mtk_nanohub_rawdata(struct hf_device *hfdev,
-		int sensor_type, int en)
-{
-	if (sensor_type <= 0)
-		return 0;
-	pr_notice("%s [%d,%d]\n", __func__, sensor_type, en);
-	return mtk_nanohub_enable_rawdata_to_hub(type_to_id(sensor_type), en);
-}
-
-static int mtk_nanohub_report_to_manager(struct data_unit_t *data)
-{
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-	struct hf_manager *manager = mtk_nanohub_dev->hf_dev.manager;
-	struct hf_manager_event event;
-
-	if (!manager)
-		return 0;
-
-	memset(&event, 0, sizeof(struct hf_manager_event));
-	if (data->flush_action == DATA_ACTION) {
-		switch (data->sensor_type) {
-		case ID_ACCELEROMETER:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.accurancy = data->accelerometer_t.status;
-			event.action = data->flush_action;
-			event.word[0] = data->accelerometer_t.x;
-			event.word[1] = data->accelerometer_t.y;
-			event.word[2] = data->accelerometer_t.z;
-			event.word[3] = data->accelerometer_t.x_bias;
-			event.word[4] = data->accelerometer_t.y_bias;
-			event.word[5] = data->accelerometer_t.z_bias;
-			break;
-		case ID_MAGNETIC_FIELD:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.accurancy = data->magnetic_t.status;
-			event.action = data->flush_action;
-			event.word[0] = data->magnetic_t.x;
-			event.word[1] = data->magnetic_t.y;
-			event.word[2] = data->magnetic_t.z;
-			event.word[3] = data->magnetic_t.x_bias;
-			event.word[4] = data->magnetic_t.y_bias;
-			event.word[5] = data->magnetic_t.z_bias;
-			break;
-		case ID_GYROSCOPE:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.accurancy = data->gyroscope_t.status;
-			event.action = data->flush_action;
-			event.word[0] = data->gyroscope_t.x;
-			event.word[1] = data->gyroscope_t.y;
-			event.word[2] = data->gyroscope_t.z;
-			event.word[3] = data->gyroscope_t.x_bias;
-			event.word[4] = data->gyroscope_t.y_bias;
-			event.word[5] = data->gyroscope_t.z_bias;
-			break;
-		case ID_LIGHT:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->light;
-			break;
-		case ID_PROXIMITY:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->proximity_t.oneshot;
-			event.word[1] = data->proximity_t.steps;
-			break;
-		case ID_PRESSURE:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.accurancy = data->pressure_t.status;
-			event.word[0] = data->pressure_t.pressure;
-			break;
-		case ID_ORIENTATION:
-		case ID_ROTATION_VECTOR:
-		case ID_GAME_ROTATION_VECTOR:
-		case ID_GEOMAGNETIC_ROTATION_VECTOR:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.accurancy = data->orientation_t.status;
-			event.action = data->flush_action;
-			event.word[0] = data->orientation_t.azimuth;
-			event.word[1] = data->orientation_t.pitch;
-			event.word[2] = data->orientation_t.roll;
-			event.word[3] = data->orientation_t.scalar;
-			break;
-		case ID_LINEAR_ACCELERATION:
-		case ID_GRAVITY:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.accurancy = data->accelerometer_t.status;
-			event.action = data->flush_action;
-			event.word[0] = data->accelerometer_t.x;
-			event.word[1] = data->accelerometer_t.y;
-			event.word[2] = data->accelerometer_t.z;
-			break;
-		case ID_STEP_COUNTER:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] =
-				data->step_counter_t.accumulated_step_count;
-			break;
-		case ID_STEP_DETECTOR:
-		case ID_SIGNIFICANT_MOTION:
-		case ID_ANSWER_CALL:
-		case ID_FLAT:
-		case ID_GLANCE_GESTURE:
-		case ID_IN_POCKET:
-		case ID_MOTION_DETECT:
-		case ID_PICK_UP_GESTURE:
-		case ID_STATIONARY_DETECT:
-		case ID_WAKE_GESTURE:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->smd_t.state;
-			break;
-		case ID_TILT_DETECTOR:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->tilt_event.state;
-			break;
-		case ID_DEVICE_ORIENTATION:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->tilt_event.state;
-			break;
-		case ID_SAR:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->sar_event.data[0];
-			event.word[1] = data->sar_event.data[1];
-			event.word[2] = data->sar_event.data[2];
-			break;
-		default:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->data[0];
-			event.word[1] = data->data[1];
-			event.word[2] = data->data[2];
-			event.word[3] = data->data[3];
-			event.word[4] = data->data[4];
-			event.word[5] = data->data[5];
-			break;
-		}
-	} else if (data->flush_action == FLUSH_ACTION) {
-		event.timestamp = data->time_stamp;
-		event.sensor_type = id_to_type(data->sensor_type);
-		event.action = data->flush_action;
-		event.word[0] = data->data[0];
-		event.word[1] = data->data[1];
-		event.word[2] = data->data[2];
-		event.word[3] = data->data[3];
-		event.word[4] = data->data[4];
-		event.word[5] = data->data[5];
-		pr_notice("%s [%d] flush complete\n",
-					__func__, event.sensor_type);
-	} else if (data->flush_action == BIAS_ACTION) {
-		event.timestamp = data->time_stamp;
-		event.sensor_type = id_to_type(data->sensor_type);
-		event.action = data->flush_action;
-		switch (data->sensor_type) {
-		case ID_ACCELEROMETER:
-			event.word[0] = data->accelerometer_t.x_bias;
-			event.word[1] = data->accelerometer_t.y_bias;
-			event.word[2] = data->accelerometer_t.z_bias;
-			break;
-		case ID_MAGNETIC_FIELD:
-			event.word[0] = data->magnetic_t.x_bias;
-			event.word[1] = data->magnetic_t.y_bias;
-			event.word[2] = data->magnetic_t.z_bias;
-			break;
-		case ID_GYROSCOPE:
-			event.word[0] = data->gyroscope_t.x_bias;
-			event.word[1] = data->gyroscope_t.y_bias;
-			event.word[2] = data->gyroscope_t.z_bias;
-			break;
-		}
-	} else if (data->flush_action == CALI_ACTION) {
-		event.timestamp = data->time_stamp;
-		event.sensor_type = id_to_type(data->sensor_type);
-		event.action = data->flush_action;
-		switch (data->sensor_type) {
-		case ID_ACCELEROMETER:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.accurancy = data->accelerometer_t.status;
-			event.action = data->flush_action;
-			event.word[0] = data->accelerometer_t.x_bias;
-			event.word[1] = data->accelerometer_t.y_bias;
-			event.word[2] = data->accelerometer_t.z_bias;
-			break;
-		case ID_GYROSCOPE:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.accurancy = data->gyroscope_t.status;
-			event.action = data->flush_action;
-			event.word[0] = data->gyroscope_t.x_bias;
-			event.word[1] = data->gyroscope_t.y_bias;
-			event.word[2] = data->gyroscope_t.z_bias;
-			break;
-		case ID_PROXIMITY:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->data[0];
-			event.word[1] = data->data[1];
-			break;
-		case ID_LIGHT:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->data[0];
-			break;
-		}
-	} else if (data->flush_action == TEMP_ACTION) {
-		event.timestamp = data->time_stamp;
-		event.sensor_type = id_to_type(data->sensor_type);
-		event.action = data->flush_action;
-		switch (data->sensor_type) {
-		case ID_GYROSCOPE:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.accurancy = data->gyroscope_t.status;
-			event.action = data->flush_action;
-			event.word[0] = data->data[0];
-			event.word[1] = data->data[1];
-			event.word[2] = data->data[2];
-			event.word[3] = data->data[3];
-			event.word[4] = data->data[4];
-			event.word[5] = data->data[5];
-			break;
-		}
-	} else if (data->flush_action == TEST_ACTION) {
-		event.timestamp = data->time_stamp;
-		event.sensor_type = id_to_type(data->sensor_type);
-		event.action = data->flush_action;
-		switch (data->sensor_type) {
-		case ID_ACCELEROMETER:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->accelerometer_t.status;
-			break;
-		case ID_MAGNETIC_FIELD:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->magnetic_t.status;
-			break;
-		case ID_GYROSCOPE:
-			event.timestamp = data->time_stamp;
-			event.sensor_type = id_to_type(data->sensor_type);
-			event.action = data->flush_action;
-			event.word[0] = data->gyroscope_t.status;
-			break;
-		}
-	} else {
-		event.timestamp = data->time_stamp;
-		event.sensor_type = id_to_type(data->sensor_type);
-		event.action = data->flush_action;
-		event.word[0] = data->data[0];
-		event.word[1] = data->data[1];
-		event.word[2] = data->data[2];
-		event.word[3] = data->data[3];
-		event.word[4] = data->data[4];
-		event.word[5] = data->data[5];
-	}
-	/*
-	 * oneshot proximity tiledetect should wakeup source when data action
-	 */
-	if (data->flush_action == DATA_ACTION) {
-		if (data->sensor_type == ID_PROXIMITY ||
-			data->sensor_type == ID_TILT_DETECTOR ||
-			mSensorState[id_to_type(data->sensor_type)].rate ==
-				SENSOR_RATE_ONESHOT) {
-			__pm_wakeup_event(&device->data_notify_wakeup_src,
-				250);
-		}
-	}
-	return manager->report(manager, &event);
-}
-
-static int mtk_nanohub_get_sensor_state(unsigned char *list,
-		int size)
-{
-	int i = 0, j = 0;
-	int count = ARRAY_SIZE(mSensorState);
-
-	count = (count < size) ? count : size;
-	for (i = 0; i < count; ++i) {
-		if (!mSensorState[i].sensorType)
-			continue;
-		list[j++] = mSensorState[i].sensorType;
-	}
-	return j;
-}
-
-static int mtk_nanohub_pm_event(struct notifier_block *notifier,
-	unsigned long pm_event,
-			void *unused)
-{
-	switch (pm_event) {
-	case PM_POST_SUSPEND:
-		pr_debug("resume boottime=%lld\n", ktime_get_boot_ns());
-		WRITE_ONCE(rtc_compensation_suspend, false);
-		mtk_nanohub_send_timestamp_to_hub();
-		return NOTIFY_DONE;
-	case PM_SUSPEND_PREPARE:
-		pr_debug("suspend boottime=%lld\n", ktime_get_boot_ns());
-		WRITE_ONCE(rtc_compensation_suspend, true);
-		return NOTIFY_DONE;
-	default:
-		return NOTIFY_OK;
-	}
-	return NOTIFY_OK;
-}
-
-static struct notifier_block mtk_nanohub_pm_notifier_func = {
-	.notifier_call = mtk_nanohub_pm_event,
-	.priority = 0,
-};
-
-static int mtk_nanohub_create_manager(void)
-{
-	int err = 0;
-	int support_size = 0;
-	struct hf_device *hf_dev = &mtk_nanohub_dev->hf_dev;
-
-	memset(hf_dev, 0, sizeof(*hf_dev));
-
-	support_size = mtk_nanohub_get_sensor_state(support_sensors,
-				ARRAY_SIZE(support_sensors));
-
-	hf_dev->dev_name = "mtk_nanohub";
-	hf_dev->device_poll = HF_DEVICE_IO_INTERRUPT;
-	hf_dev->device_bus = HF_DEVICE_IO_ASYNC;
-	hf_dev->support_list = support_sensors;
-	hf_dev->support_size = support_size;
-	hf_dev->enable = mtk_nanohub_enable;
-	hf_dev->batch = mtk_nanohub_batch;
-	hf_dev->flush = mtk_nanohub_flush;
-	hf_dev->calibration = mtk_nanohub_calibration;
-	hf_dev->config_cali = mtk_nanohub_config;
-	hf_dev->selftest = mtk_nanohub_selftest;
-	hf_dev->rawdata = mtk_nanohub_rawdata;
-
-	err = hf_manager_create(hf_dev);
-	if (err < 0) {
-		pr_err("%s hf_manager_create fail\n", __func__);
-		return err;
-	}
-	return err;
-}
-
-static ssize_t mtk_nanohub_trace_show(struct device_driver *ddri,
-		char *buf)
-{
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-	int i;
-	ssize_t res = 0;
-
-	for (i = 0; i < ID_SENSOR_MAX; i++)
-		res += snprintf(&buf[res], PAGE_SIZE, "%2d:[%d]\n",
-			i, atomic_read(&device->traces[i]));
-	return res;
-}
-
-static ssize_t mtk_nanohub_trace_store(struct device_driver *ddri,
-		const char *buf, size_t count)
-{
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-	int id, trace = 0;
-	int res = 0;
-
-	if (sscanf(buf, "%d,%d", &id, &trace) != 2) {
-		pr_err("invalid content: '%s', length = %zu\n", buf, count);
-		goto err_out;
-	}
-
-	if (id < 0 || id >= ID_SENSOR_MAX) {
-		pr_debug("invalid id value:%d,should be '0<=id<=%d'\n",
-			trace, ID_SENSOR_MAX);
-		goto err_out;
-	}
-
-	if (trace != 0 && trace != 1) {
-		pr_debug("invalid trace value:%d,trace should be '0' or '1'",
-			trace);
-		goto err_out;
-	}
-
-	res = mtk_nanohub_set_cmd_to_hub(id,
-			CUST_ACTION_SET_TRACE, &trace);
-	if (res < 0) {
-		pr_err("cmd_to_hub (ID: %d),(action: %d)err: %d\n", id,
-					CUST_ACTION_SET_TRACE, res);
-	} else
-		atomic_set(&device->traces[id], trace);
-
-err_out:
-	return count;
-}
-
-static DRIVER_ATTR_RW(mtk_nanohub_trace);
-
-static struct driver_attribute *mtk_nanohub_attrs[] = {
-	&driver_attr_mtk_nanohub_trace,
-};
-
-static int mtk_nanohub_create_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(mtk_nanohub_attrs));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++) {
-		err = driver_create_file(driver, mtk_nanohub_attrs[idx]);
-		if (err) {
-			pr_err("driver_create_file (%s) = %d\n",
-				mtk_nanohub_attrs[idx]->attr.name, err);
-			break;
-		}
-	}
-	return err;
-}
-
-static int mtk_nanohub_delete_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(mtk_nanohub_attrs));
-
-	if (!driver)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++)
-		driver_remove_file(driver, mtk_nanohub_attrs[idx]);
-
-	return err;
-}
-
-static int mtk_nanohub_probe(struct platform_device *pdev)
-{
-	int err = 0, index;
-	struct mtk_nanohub_device *device;
-	struct task_struct *task = NULL, *task_power_reset = NULL;
-	struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
-
-	mtk_nanohub_init_sensor_state();
-	device = kzalloc(sizeof(*device), GFP_KERNEL);
-	if (!device) {
-		err = -ENOMEM;
-		goto exit;
-	}
-	mtk_nanohub_dev = device;
-	/* init sensor share dram write pointer event queue */
-	spin_lock_init(&device->wp_queue.buffer_lock);
-	device->wp_queue.head = 0;
-	device->wp_queue.tail = 0;
-	device->wp_queue.bufsize = 32;
-	device->wp_queue.ringbuffer =
-		vzalloc(device->wp_queue.bufsize * sizeof(uint32_t));
-	if (!device->wp_queue.ringbuffer) {
-		err = -ENOMEM;
-		goto exit_kfree;
-	}
-	/* init the debug trace flag */
-	for (index = 0; index < ID_SENSOR_MAX; index++)
-		atomic_set(&device->traces[index], 0);
-	/* init scp boot flags */
-	atomic_set(&device->get_list_first_boot, 0);
-	atomic_set(&device->cfg_data_after_reboot, 0);
-	atomic_set(&device->start_timesync_first_boot, 0);
-	/* init timestamp sync worker */
-	INIT_WORK(&device->sync_time_worker, mtk_nanohub_sync_time_work);
-	device->sync_time_timer.expires =
-		jiffies + msecs_to_jiffies(SYNC_TIME_START_CYCLC);
-	device->sync_time_timer.function = mtk_nanohub_sync_time_func;
-	init_timer(&device->sync_time_timer);
-	/* init wakeup source */
-	wakeup_source_init(&device->time_sync_wakeup_src, "sync_time");
-	wakeup_source_init(&device->data_notify_wakeup_src, "data_notify");
-	/* init nanohub ipi */
-	mtk_nanohub_ipi_init();
-	/* register ipi interrupt handler */
-	scp_ipi_registration(IPI_SENSOR,
-		mtk_nanohub_ipi_handler, "mtk_nanohub");
-	/* this call back can get scp power down status */
-	scp_A_register_notify(&mtk_nanohub_ready_notifier);
-	/* init data path */
-	WRITE_ONCE(chre_kthread_wait_condition, false);
-	task = kthread_run(mtk_nanohub_direct_push_work,
-		NULL, "chre_kthread");
-	if (IS_ERR(task)) {
-		pr_err("mtk_nanohub_direct_push_work create fail!\n");
-		goto exit_scp;
-	}
-	sched_setscheduler(task, SCHED_FIFO, &param);
-	/* this call back can get scp power UP status */
-	task_power_reset = kthread_run(mtk_nanohub_power_up_work,
-		NULL, "scp_power_reset");
-	if (IS_ERR(task_power_reset)) {
-		pr_err("mtk_nanohub_power_up_work create fail!\n");
-		goto exit_scp;
-	}
-	err = mtk_nanohub_create_attr(pdev->dev.driver);
-	if (err < 0) {
-		pr_err("create attribute err\n");
-		goto exit_scp;
-	}
-	err = register_pm_notifier(&mtk_nanohub_pm_notifier_func);
-	if (err < 0) {
-		pr_err("Failed to register PM notifier.\n");
-		goto exit_attr;
-	}
-	/* create mamanger last */
-	err = mtk_nanohub_create_manager();
-	if (err < 0) {
-		pr_err("Failed to create manager.\n");
-		goto exit_manager;
-	}
-
-	pr_info("init done, data_unit_t:%d, SCP_SENSOR_HUB_DATA:%d\n",
-		(int)sizeof(struct data_unit_t),
-		(int)sizeof(union SCP_SENSOR_HUB_DATA));
-	BUG_ON(sizeof(struct data_unit_t) != SENSOR_DATA_SIZE
-		|| sizeof(union SCP_SENSOR_HUB_DATA) != SENSOR_IPI_SIZE);
-	return 0;
-
-exit_manager:
-	unregister_pm_notifier(&mtk_nanohub_pm_notifier_func);
-exit_attr:
-	mtk_nanohub_delete_attr(pdev->dev.driver);
-exit_scp:
-	scp_A_unregister_notify(&mtk_nanohub_ready_notifier);
-	scp_ipi_unregistration(IPI_SENSOR);
-	vfree(device->wp_queue.ringbuffer);
-exit_kfree:
-	kfree(device);
-exit:
-	pr_err("%s: err = %d\n", __func__, err);
-	return err;
-}
-
-static int mtk_nanohub_remove(struct platform_device *pdev)
-{
-	struct mtk_nanohub_device *device = mtk_nanohub_dev;
-
-	del_timer_sync(&device->sync_time_timer);
-	hf_manager_destroy(device->hf_dev.manager);
-	unregister_pm_notifier(&mtk_nanohub_pm_notifier_func);
-	mtk_nanohub_delete_attr(pdev->dev.driver);
-	scp_A_unregister_notify(&mtk_nanohub_ready_notifier);
-	scp_ipi_unregistration(IPI_SENSOR);
-	vfree(device->wp_queue.ringbuffer);
-	kfree(device);
-	return 0;
-}
-
-static void mtk_nanohub_shutdown(struct platform_device *pdev)
-{
-	int id = 0;
-	uint8_t sensor_type;
-	struct ConfigCmd cmd;
-	int ret = 0;
-
-	mutex_lock(&mSensorState_mtx);
-	for (id = 0; id < ID_SENSOR_MAX; id++) {
-		sensor_type = id_to_type(id);
-		if (mSensorState[sensor_type].sensorType &&
-				mSensorState[sensor_type].enable) {
-			mSensorState[sensor_type].enable = false;
-			init_sensor_config_cmd(&cmd, sensor_type);
-
-			ret = nanohub_external_write((const uint8_t *)&cmd,
-				sizeof(struct ConfigCmd));
-			if (ret < 0)
-				pr_notice("failed registerlistener [%d,%d]\n",
-					id, cmd.cmd);
-		}
-	}
-	mutex_unlock(&mSensorState_mtx);
-}
-
-static struct platform_device mtk_nanohub_pdev = {
-	.name = "mtk_nanohub",
-	.id = -1,
-};
-
-static struct platform_driver mtk_nanohub_pdrv = {
-	.driver = {
-	   .name = "mtk_nanohub",
-	},
-	.probe = mtk_nanohub_probe,
-	.remove = mtk_nanohub_remove,
-	.shutdown = mtk_nanohub_shutdown,
-};
-
-static int __init mtk_nanohub_init(void)
-{
-	if (platform_device_register(&mtk_nanohub_pdev)) {
-		pr_err("mtk_nanohub platform device error\n");
-		return -1;
-	}
-	if (platform_driver_register(&mtk_nanohub_pdrv)) {
-		pr_err("mtk_nanohub platform driver error\n");
-		return -1;
-	}
-	return 0;
-}
-
-static void __exit mtk_nanohub_exit(void)
-{
-}
-
-module_init(mtk_nanohub_init);
-module_exit(mtk_nanohub_exit);
-MODULE_AUTHOR("Mediatek");
-MODULE_DESCRIPTION("mtk_nanohub driver");
-MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub.h
deleted file mode 100644
index a3d61a2..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub.h
+++ /dev/null
@@ -1,522 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#ifndef SCP_SENSOR_HUB_H
-#define SCP_SENSOR_HUB_H
-
-#include <linux/ioctl.h>
-
-#define EVT_NO_SENSOR_CONFIG_EVENT 0x00000300
-#define SENSOR_RATE_ONCHANGE       0xFFFFFF01UL
-#define SENSOR_RATE_ONESHOT        0xFFFFFF02UL
-
-enum {
-	CONFIG_CMD_DISABLE      = 0,
-	CONFIG_CMD_ENABLE       = 1,
-	CONFIG_CMD_FLUSH        = 2,
-	CONFIG_CMD_CFG_DATA     = 3,
-	CONFIG_CMD_CALIBRATE    = 4,
-	CONFIG_CMD_SELF_TEST    = 5,
-};
-
-struct ConfigCmd {
-	uint32_t evtType;
-	uint64_t latency;
-	uint32_t rate;
-	uint8_t sensorType;
-	uint8_t cmd;
-	uint16_t flags;
-	uint8_t data[];
-} __packed;
-
-struct SensorState {
-	uint64_t latency;
-	uint32_t rate;
-	uint8_t sensorType;
-	uint8_t alt;
-	bool enable;
-	bool timestamp_filter;
-	atomic_t flushCnt;
-};
-
-#define SCP_SENSOR_HUB_SUCCESS       0
-#define SCP_SENSOR_HUB_FAILURE      (-1)
-
-#define SCP_SENSOR_HUB_X             0
-#define SCP_SENSOR_HUB_Y             1
-#define SCP_SENSOR_HUB_Z             2
-#define SCP_SENSOR_HUB_AXES_NUM      3
-
-/* SCP_ACTION */
-#define SENSOR_HUB_ACTIVATE          0
-#define SENSOR_HUB_SET_DELAY         1
-#define SENSOR_HUB_GET_DATA          2
-#define SENSOR_HUB_BATCH             3
-#define SENSOR_HUB_SET_CONFIG        4
-#define SENSOR_HUB_SET_CUST          5
-#define SENSOR_HUB_NOTIFY            6
-#define SENSOR_HUB_BATCH_TIMEOUT     7
-#define SENSOR_HUB_SET_TIMESTAMP     8
-#define SENSOR_HUB_POWER_NOTIFY      9
-#define SENSOR_HUB_RAW_DATA          10
-
-/* SCP_NOTIFY EVENT */
-#define SCP_INIT_DONE                0
-#define SCP_FIFO_FULL                1
-#define SCP_NOTIFY                   2
-#define SCP_BATCH_TIMEOUT            3
-#define SCP_DIRECT_PUSH              4
-
-enum {
-	SENSOR_POWER_UP = 0,
-	SENSOR_POWER_DOWN,
-};
-
-struct sensor_vec_t {
-	union {
-		struct {
-			int32_t x;
-			int32_t y;
-			int32_t z;
-			int32_t x_bias;
-			int32_t y_bias;
-			int32_t z_bias;
-			int32_t reserved : 14;
-			int32_t temp_result : 2;
-			int32_t temperature : 16;
-		};
-		struct {
-			int32_t azimuth;
-			int32_t pitch;
-			int32_t roll;
-			int32_t scalar;
-		};
-	};
-	uint32_t status;
-};
-
-struct heart_rate_event_t {
-	int32_t bpm;
-	int32_t status;
-};
-
-struct significant_motion_event_t {
-	int32_t state;
-};
-
-struct step_counter_event_t {
-	uint32_t accumulated_step_count;
-};
-
-struct step_detector_event_t {
-	uint32_t step_detect;
-};
-
-struct floor_counter_event_t {
-	uint32_t accumulated_floor_count;
-};
-
-enum gesture_type_t {
-	GESTURE_NONE,
-	SHAKE,
-	TAP,
-	TWIST,
-	FLIP,
-	SNAPSHOT,
-	PICKUP,
-	CHECK
-};
-
-struct gesture_t {
-	int32_t probability;
-};
-
-struct pedometer_event_t {
-	uint32_t accumulated_step_count;
-	uint32_t accumulated_step_length;
-	uint32_t step_frequency;
-	uint32_t step_length;
-};
-
-struct pressure_vec_t {
-	int32_t pressure;	/* Pa, i.e. hPa * 100 */
-	int32_t temperature;
-	uint32_t status;
-};
-
-struct proximity_vec_t {
-	uint32_t steps;
-	int32_t oneshot;
-};
-
-struct relative_humidity_vec_t {
-	int32_t relative_humidity;
-	int32_t temperature;
-	uint32_t status;
-};
-
-struct sleepmonitor_event_t {
-	int32_t state;		/* sleep, restless, awake */
-};
-
-enum fall_type {
-	FALL_NONE,
-	FALL,
-	FLOP,
-	FALL_MAX
-};
-
-struct fall_t {
-	uint8_t probability[FALL_MAX];	/* 0~100 */
-};
-
-struct tilt_event_t {
-	int32_t state;		/* 0,1 */
-};
-
-struct in_pocket_event_t {
-	int32_t state;		/* 0,1 */
-};
-
-struct geofence_event_t {
-	uint32_t state;  /* geofence [source, result, operation_mode] */
-};
-
-struct sar_event_t {
-	struct {
-		int32_t data[3];
-		int32_t x_bias;
-		int32_t y_bias;
-		int32_t z_bias;
-	};
-	uint32_t status;
-};
-
-enum activity_type_t {
-	STILL,
-	STANDING,
-	SITTING,
-	LYING,
-	ON_FOOT,
-	WALKING,
-	RUNNING,
-	CLIMBING,
-	ON_BICYCLE,
-	IN_VEHICLE,
-	TILTING,
-	UNKNOWN,
-	ACTIVITY_MAX
-};
-
-struct activity_t {
-	uint8_t probability[ACTIVITY_MAX];	/* 0~100 */
-};
-
-struct data_unit_t {
-	uint8_t sensor_type;
-	uint8_t flush_action;
-	uint8_t reserve[2];
-	uint64_t time_stamp;
-	union {
-		struct sensor_vec_t accelerometer_t;
-		struct sensor_vec_t gyroscope_t;
-		struct sensor_vec_t magnetic_t;
-		struct sensor_vec_t orientation_t;
-		struct sensor_vec_t pdr_event;
-
-		int32_t light;
-		struct proximity_vec_t proximity_t;
-		int32_t temperature;
-		struct pressure_vec_t pressure_t;
-		struct relative_humidity_vec_t relative_humidity_t;
-
-		struct sensor_vec_t uncalibrated_acc_t;
-		struct sensor_vec_t uncalibrated_mag_t;
-		struct sensor_vec_t uncalibrated_gyro_t;
-
-		struct pedometer_event_t pedometer_t;
-
-		struct heart_rate_event_t heart_rate_t;
-		struct significant_motion_event_t smd_t;
-		struct step_detector_event_t step_detector_t;
-		struct step_counter_event_t step_counter_t;
-		struct floor_counter_event_t floor_counter_t;
-		struct activity_t activity_data_t;
-		struct gesture_t gesture_data_t;
-		struct fall_t fall_data_t;
-		struct tilt_event_t tilt_event;
-		struct in_pocket_event_t inpocket_event;
-		struct geofence_event_t geofence_data_t;
-		struct sar_event_t sar_event;
-		int32_t data[8];
-	};
-} __packed;
-
-struct sensor_fifo {
-	uint32_t rp;
-	uint32_t wp;
-	uint32_t fifo_size;
-	uint32_t reserve;
-	struct data_unit_t data[0];
-};
-
-struct SCP_SENSOR_HUB_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	uint32_t data[11];
-};
-
-struct SCP_SENSOR_HUB_RSP {
-	uint8_t sensorType;
-	uint8_t action;
-	int8_t errCode;
-	uint8_t reserve[1];
-	/* uint32_t    reserved[9]; */
-};
-
-struct SCP_SENSOR_HUB_ACTIVATE_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	uint32_t enable;	/* 0 : disable ; 1 : enable */
-	/* uint32_t    reserved[9]; */
-};
-
-#define SCP_SENSOR_HUB_ACTIVATE_RSP SCP_SENSOR_HUB_RSP
-/* typedef SCP_SENSOR_HUB_RSP SCP_SENSOR_HUB_ACTIVATE_RSP; */
-
-struct SCP_SENSOR_HUB_SET_DELAY_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	uint32_t delay;		/* ms */
-	/* uint32_t    reserved[9]; */
-};
-
-#define SCP_SENSOR_HUB_SET_DELAY_RSP  SCP_SENSOR_HUB_RSP
-/* typedef SCP_SENSOR_HUB_RSP SCP_SENSOR_HUB_SET_DELAY_RSP; */
-
-struct SCP_SENSOR_HUB_GET_DATA_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	/* uint32_t    reserved[10]; */
-};
-
-struct SCP_SENSOR_HUB_GET_DATA_RSP {
-	uint8_t sensorType;
-	uint8_t action;
-	int8_t errCode;
-	uint8_t reserve[1];
-	/* struct data_unit_t data_t; */
-	union {
-		int8_t int8_Data[0];
-		int16_t int16_Data[0];
-		int32_t int32_Data[0];
-	} data;
-};
-
-struct SCP_SENSOR_HUB_BATCH_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t flag;
-	uint8_t reserve[1];
-	uint32_t period_ms;	/* batch reporting time in ms */
-	uint32_t timeout_ms;	/* sampling time in ms */
-	/* uint32_t    reserved[7]; */
-};
-
-#define SCP_SENSOR_HUB_BATCH_RSP SCP_SENSOR_HUB_RSP
-/* typedef SCP_SENSOR_HUB_RSP SCP_SENSOR_HUB_BATCH_RSP; */
-
-struct SCP_SENSOR_HUB_SET_CONFIG_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	/* struct sensorFIFO   *bufferBase; */
-	uint32_t bufferBase;/* use int to store buffer DRAM base LSB 32 bits */
-	uint32_t bufferSize;
-	uint64_t ap_timestamp;
-	uint64_t arch_counter;
-	/* uint32_t    reserved[8]; */
-};
-
-#define SCP_SENSOR_HUB_SET_CONFIG_RSP  SCP_SENSOR_HUB_RSP
-/* typedef SCP_SENSOR_HUB_RSP SCP_SENSOR_HUB_SET_CONFIG_RSP; */
-
-enum CUST_ACTION {
-	CUST_ACTION_SET_CUST = 1,
-	CUST_ACTION_SET_CALI,
-	CUST_ACTION_RESET_CALI,
-	CUST_ACTION_SET_TRACE,
-	CUST_ACTION_SET_DIRECTION,
-	CUST_ACTION_SHOW_REG,
-	CUST_ACTION_GET_RAW_DATA,
-	CUST_ACTION_SET_PS_THRESHOLD,
-	CUST_ACTION_SHOW_ALSLV,
-	CUST_ACTION_SHOW_ALSVAL,
-	CUST_ACTION_SET_FACTORY,
-	CUST_ACTION_GET_SENSOR_INFO,
-};
-
-struct SCP_SENSOR_HUB_CUST {
-	enum CUST_ACTION action;
-};
-
-struct SCP_SENSOR_HUB_SET_CUST {
-	enum CUST_ACTION action;
-	int32_t data[0];
-};
-
-struct SCP_SENSOR_HUB_SET_TRACE {
-	enum CUST_ACTION action;
-	int trace;
-};
-
-struct SCP_SENSOR_HUB_SET_DIRECTION {
-	enum CUST_ACTION action;
-	int direction;
-};
-
-struct SCP_SENSOR_HUB_SET_FACTORY {
-	enum CUST_ACTION	action;
-	unsigned int	factory;
-};
-
-struct SCP_SENSOR_HUB_SET_CALI {
-	enum CUST_ACTION action;
-	union {
-		int8_t int8_data[0];
-		uint8_t uint8_data[0];
-		int16_t int16_data[0];
-		uint16_t uint16_data[0];
-		int32_t int32_data[0];
-		uint32_t uint32_data[SCP_SENSOR_HUB_AXES_NUM];
-	};
-};
-
-#define SCP_SENSOR_HUB_RESET_CALI   SCP_SENSOR_HUB_CUST
-/* typedef SCP_SENSOR_HUB_CUST SCP_SENSOR_HUB_RESET_CALI; */
-
-struct SCP_SENSOR_HUB_SETPS_THRESHOLD {
-	enum CUST_ACTION action;
-	int32_t threshold[2];
-};
-
-#define SCP_SENSOR_HUB_SHOW_REG    SCP_SENSOR_HUB_CUST
-#define SCP_SENSOR_HUB_SHOW_ALSLV  SCP_SENSOR_HUB_CUST
-#define SCP_SENSOR_HUB_SHOW_ALSVAL SCP_SENSOR_HUB_CUST
-/*
- * typedef SCP_SENSOR_HUB_CUST SCP_SENSOR_HUB_SHOW_REG;
- * typedef SCP_SENSOR_HUB_CUST SCP_SENSOR_HUB_SHOW_ALSLV;
- * typedef SCP_SENSOR_HUB_CUST SCP_SENSOR_HUB_SHOW_ALSVAL;
- */
-
-struct SCP_SENSOR_HUB_GET_RAW_DATA {
-	enum CUST_ACTION action;
-	union {
-		int8_t int8_data[0];
-		uint8_t uint8_data[0];
-		int16_t int16_data[0];
-		uint16_t uint16_data[0];
-		int32_t int32_data[0];
-		uint32_t uint32_data[SCP_SENSOR_HUB_AXES_NUM];
-	};
-};
-
-struct mag_dev_info_t {
-	char libname[16];
-	int8_t layout;
-	int8_t deviceid;
-};
-
-struct sensorInfo_t {
-	char name[16];
-	struct mag_dev_info_t mag_dev_info;
-};
-
-struct scp_sensor_hub_get_sensor_info {
-	enum CUST_ACTION action;
-	union {
-		int32_t int32_data[0];
-		struct sensorInfo_t sensorInfo;
-	};
-};
-
-enum {
-	USE_OUT_FACTORY_MODE = 0,
-	USE_IN_FACTORY_MODE
-};
-
-struct SCP_SENSOR_HUB_SET_CUST_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	union {
-		uint32_t custData[11];
-		struct SCP_SENSOR_HUB_CUST cust;
-		struct SCP_SENSOR_HUB_SET_CUST setCust;
-		struct SCP_SENSOR_HUB_SET_CALI setCali;
-		struct SCP_SENSOR_HUB_RESET_CALI resetCali;
-		struct SCP_SENSOR_HUB_SET_TRACE setTrace;
-		struct SCP_SENSOR_HUB_SET_DIRECTION setDirection;
-		struct SCP_SENSOR_HUB_SHOW_REG showReg;
-		struct SCP_SENSOR_HUB_GET_RAW_DATA getRawData;
-		struct SCP_SENSOR_HUB_SETPS_THRESHOLD setPSThreshold;
-		struct SCP_SENSOR_HUB_SHOW_ALSLV showAlslv;
-		struct SCP_SENSOR_HUB_SHOW_ALSVAL showAlsval;
-		struct SCP_SENSOR_HUB_SET_FACTORY setFactory;
-		struct scp_sensor_hub_get_sensor_info getInfo;
-	};
-};
-
-struct SCP_SENSOR_HUB_SET_CUST_RSP {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t errCode;
-	uint8_t reserve[1];
-	union {
-		uint32_t custData[11];
-		struct SCP_SENSOR_HUB_GET_RAW_DATA getRawData;
-		struct scp_sensor_hub_get_sensor_info getInfo;
-	};
-};
-
-struct SCP_SENSOR_HUB_NOTIFY_RSP {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t event;
-	uint8_t reserve[1];
-	union {
-		int8_t		int8_Data[0];
-		int16_t		int16_Data[0];
-		int32_t		int32_Data[0];
-		struct {
-			uint32_t	currWp;
-			uint64_t	scp_timestamp;
-			uint64_t	arch_counter;
-		};
-	};
-};
-
-union SCP_SENSOR_HUB_DATA {
-	struct SCP_SENSOR_HUB_REQ req;
-	struct SCP_SENSOR_HUB_RSP rsp;
-	struct SCP_SENSOR_HUB_ACTIVATE_REQ activate_req;
-	struct SCP_SENSOR_HUB_ACTIVATE_RSP activate_rsp;
-	struct SCP_SENSOR_HUB_SET_DELAY_REQ set_delay_req;
-	struct SCP_SENSOR_HUB_SET_DELAY_RSP set_delay_rsp;
-	struct SCP_SENSOR_HUB_GET_DATA_REQ get_data_req;
-	struct SCP_SENSOR_HUB_GET_DATA_RSP get_data_rsp;
-	struct SCP_SENSOR_HUB_BATCH_REQ batch_req;
-	struct SCP_SENSOR_HUB_BATCH_RSP batch_rsp;
-	struct SCP_SENSOR_HUB_SET_CONFIG_REQ set_config_req;
-	struct SCP_SENSOR_HUB_SET_CONFIG_RSP set_config_rsp;
-	struct SCP_SENSOR_HUB_SET_CUST_REQ set_cust_req;
-	struct SCP_SENSOR_HUB_SET_CUST_RSP set_cust_rsp;
-	struct SCP_SENSOR_HUB_NOTIFY_RSP notify_rsp;
-};
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub_ipi.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub_ipi.c
deleted file mode 100644
index a84787b..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub_ipi.c
+++ /dev/null
@@ -1,254 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[mtk_nanohub_ipi] " fmt
-
-#include <linux/module.h>
-#include <linux/workqueue.h>
-#include <linux/spinlock.h>
-#include <linux/delay.h>
-
-#include "mtk_nanohub_ipi.h"
-#include "scp_ipi.h"
-#include "scp_helper.h"
-#include "scp_excep.h"
-
-enum scp_ipi_status __attribute__((weak)) scp_ipi_send(enum ipi_id id,
-		void *buf, unsigned int  len,
-		unsigned int wait, enum scp_core_id scp_id)
-{
-	return SCP_IPI_ERROR;
-}
-
-struct ipi_hw_master {
-	spinlock_t lock;
-	bool running;
-	struct list_head head;
-	struct workqueue_struct *workqueue;
-	struct work_struct work;
-};
-
-struct ipi_hw_transfer {
-	struct completion done;
-	int count;
-	/* data buffers */
-	const unsigned char *tx;
-	unsigned char *rx;
-	unsigned int tx_len;
-	unsigned int rx_len;
-	void *context;
-};
-
-static struct ipi_hw_master hw_master;
-static struct ipi_hw_transfer hw_transfer;
-static DEFINE_SPINLOCK(hw_transfer_lock);
-
-static int ipi_txrx_bufs(struct ipi_transfer *t)
-{
-	int status = 0, retry = 0;
-	int timeout;
-	unsigned long flags;
-	struct ipi_hw_transfer *hw = &hw_transfer;
-
-	spin_lock_irqsave(&hw_transfer_lock, flags);
-	hw->tx = t->tx_buf;
-	hw->rx = t->rx_buf;
-	hw->tx_len = t->tx_len;
-	hw->rx_len = t->rx_len;
-
-	init_completion(&hw->done);
-	hw->context = &hw->done;
-	spin_unlock_irqrestore(&hw_transfer_lock, flags);
-	do {
-		status = scp_ipi_send(IPI_SENSOR,
-			(unsigned char *)hw->tx, hw->tx_len, 0, SCP_A_ID);
-		if (status == SCP_IPI_ERROR) {
-			pr_err("scp_ipi_send fail\n");
-			return -1;
-		}
-		if (status == SCP_IPI_BUSY) {
-			if (retry++ == 1000) {
-				pr_err("retry fail\n");
-				return -1;
-			}
-			if (retry % 100 == 0)
-				usleep_range(1000, 2000);
-		}
-	} while (status == SCP_IPI_BUSY);
-
-	if (retry >= 100)
-		pr_debug("retry time:%d\n", retry);
-
-	timeout = wait_for_completion_timeout(&hw->done,
-			msecs_to_jiffies(500));
-	spin_lock_irqsave(&hw_transfer_lock, flags);
-	if (!timeout) {
-		pr_err("transfer timeout!");
-		hw->count = -1;
-	}
-	hw->context = NULL;
-	spin_unlock_irqrestore(&hw_transfer_lock, flags);
-	return hw->count;
-}
-
-static void ipi_complete(void *arg)
-{
-	complete(arg);
-}
-
-static void ipi_transfer_messages(void)
-{
-	struct ipi_message *m;
-	struct ipi_transfer *t = NULL;
-	int status = 0;
-	unsigned long flags;
-
-	spin_lock_irqsave(&hw_master.lock, flags);
-	if (list_empty(&hw_master.head) || hw_master.running)
-		goto out;
-	hw_master.running = true;
-	while (!list_empty(&hw_master.head)) {
-		m = list_first_entry(&hw_master.head,
-			struct ipi_message, list);
-		list_del(&m->list);
-		spin_unlock_irqrestore(&hw_master.lock, flags);
-		list_for_each_entry(t, &m->transfers, transfer_list) {
-			if (!t->tx_buf && t->tx_len) {
-				status = -EINVAL;
-				pr_err("transfer param wrong :%d\n",
-					status);
-				break;
-			}
-			if (t->tx_len)
-				status = ipi_txrx_bufs(t);
-			if (status < 0) {
-				status = -EREMOTEIO;
-				/* pr_err("transfer err :%d\n", status); */
-				break;
-			} else if (status != t->rx_len) {
-				pr_err("ack err :%d %d\n", status, t->rx_len);
-				status = -EREMOTEIO;
-				break;
-			}
-			status = 0;
-		}
-		m->status = status;
-		m->complete(m->context);
-		spin_lock_irqsave(&hw_master.lock, flags);
-	}
-	hw_master.running = false;
-out:
-	spin_unlock_irqrestore(&hw_master.lock, flags);
-}
-
-static void ipi_prefetch_messages(void)
-{
-	ipi_transfer_messages();
-}
-
-static void ipi_work(struct work_struct *work)
-{
-	ipi_transfer_messages();
-}
-
-static int __ipi_transfer(struct ipi_message *m)
-{
-	unsigned long flags;
-
-	m->status = -EINPROGRESS;
-
-	spin_lock_irqsave(&hw_master.lock, flags);
-	list_add_tail(&m->list, &hw_master.head);
-	queue_work(hw_master.workqueue, &hw_master.work);
-	spin_unlock_irqrestore(&hw_master.lock, flags);
-	return 0;
-}
-
-static int __ipi_xfer(struct ipi_message *message)
-{
-	DECLARE_COMPLETION_ONSTACK(done);
-	int status;
-
-	message->complete = ipi_complete;
-	message->context = &done;
-
-	status = __ipi_transfer(message);
-
-	if (status == 0) {
-		ipi_prefetch_messages();
-		wait_for_completion(&done);
-		status = message->status;
-	}
-	message->context = NULL;
-	return status;
-}
-
-static int ipi_sync(const unsigned char *txbuf, unsigned int n_tx,
-		unsigned char *rxbuf, unsigned int n_rx)
-{
-	struct ipi_transfer t;
-	struct ipi_message m;
-
-	t.tx_buf = txbuf;
-	t.tx_len = n_tx;
-	t.rx_buf = rxbuf;
-	t.rx_len = n_rx;
-
-	ipi_message_init(&m);
-	ipi_message_add_tail(&t, &m);
-
-	return __ipi_xfer(&m);
-}
-
-static int ipi_async(struct ipi_message *m)
-{
-	return __ipi_transfer(m);
-}
-
-int mtk_nanohub_ipi_sync(unsigned char *buffer, unsigned int len)
-{
-	return ipi_sync(buffer, len, buffer, len);
-}
-
-int mtk_nanohub_ipi_async(struct ipi_message *m)
-{
-	return ipi_async(m);
-}
-
-void mtk_nanohub_ipi_complete(unsigned char *buffer, unsigned int len)
-{
-	struct ipi_hw_transfer *hw = &hw_transfer;
-
-	spin_lock(&hw_transfer_lock);
-	if (!hw->context) {
-		pr_err("after ipi timeout ack occur then dropped this\n");
-		goto out;
-	}
-	/* only copy hw->rx_len bytes to hw->rx to avoid memory corruption */
-	memcpy(hw->rx, buffer, hw->rx_len);
-	/* hw->count give real len */
-	hw->count = len;
-	complete(hw->context);
-out:
-	spin_unlock(&hw_transfer_lock);
-}
-
-int mtk_nanohub_ipi_init(void)
-{
-	INIT_WORK(&hw_master.work, ipi_work);
-	INIT_LIST_HEAD(&hw_master.head);
-	spin_lock_init(&hw_master.lock);
-	hw_master.workqueue = create_singlethread_workqueue("ipi_master");
-	if (hw_master.workqueue == NULL) {
-		pr_err("workqueue fail\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-MODULE_AUTHOR("Mediatek");
-MODULE_DESCRIPTION("mtk_nanohub_ipi driver");
-MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub_ipi.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub_ipi.h
deleted file mode 100644
index ceadca5..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/mtk_nanohub/mtk_nanohub_ipi.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#ifndef _MTK_NANOHUB_IPI_H_
-#define _MTK_NANOHUB_IPI_H_
-
-#include <linux/list.h>
-
-struct ipi_transfer {
-	const unsigned char *tx_buf;
-	unsigned char *rx_buf;
-	unsigned int tx_len;
-	unsigned int rx_len;
-	struct list_head transfer_list;
-};
-
-struct ipi_message {
-	struct list_head transfers;
-	struct list_head list;
-	void *context;
-	int status;
-	void (*complete)(void *context);
-};
-
-static inline void ipi_message_init(struct ipi_message *m)
-{
-	memset(m, 0, sizeof(*m));
-	INIT_LIST_HEAD(&m->transfers);
-}
-
-static inline void ipi_message_add_tail(struct ipi_transfer *t,
-		struct ipi_message *m)
-{
-	list_add_tail(&t->transfer_list, &m->transfers);
-}
-
-int mtk_nanohub_ipi_sync(unsigned char *buffer, unsigned int len);
-int mtk_nanohub_ipi_async(struct ipi_message *m);
-void mtk_nanohub_ipi_complete(unsigned char *buffer, unsigned int len);
-int mtk_nanohub_ipi_init(void);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/smi130_i2c/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/smi130_i2c/Makefile
deleted file mode 100644
index 68a73f0..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/smi130_i2c/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensor/2.0/core/
-
-obj-y += smi130_i2c.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/smi130_i2c/smi130_i2c.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/smi130_i2c/smi130_i2c.c
deleted file mode 100644
index 53f1813..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/smi130_i2c/smi130_i2c.c
+++ /dev/null
@@ -1,741 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/of.h>
-#include <linux/delay.h>
-#include <linux/math64.h>
-#include <linux/atomic.h>
-
-#include "hf_manager.h"
-#include "smi130_i2c.h"
-#include "sensor_list.h"
-
-#define GYRO_TEMP_AMP    100
-#define SMI130_I2C_NAME "smi130_i2c"
-#define GYRO_ADDR               0x68
-#define SMI130_AXES_NUM          3
-#define C_I2C_FIFO_SIZE              8
-
-#define SMI130_SOFT_RESET_VALUE  0xB6
-#define SMI130_ACC_CHIP_ID_VALUE     (0xfa)
-#define SMI130_GYRO_CHIP_ID_VALUE     (0x0f)
-#define CHECK_CHIP_ID_TIME_MAX       5
-
-#define SMI130_ACC_ODR_7HZ 0x08
-#define SMI130_ACC_ODR_15HZ 0x09
-#define SMI130_ACC_ODR_31HZ 0x0A
-#define SMI130_ACC_ODR_62HZ 0x0B
-#define SMI130_ACC_ODR_125HZ 0x0C
-#define SMI130_ACC_ODR_250HZ 0x0D
-#define SMI130_ACC_ODR_500HZ 0x0E
-#define SMI130_ACC_ODR_1000HZ 0x0F
-#define SMI130_ACC_RANGE_4G 0x03
-#define SMI130_ACC_RANGE_8G 0x05
-#define SMI130_ACC_RANGE_16G 0x08
-#define SMI130_ACC_RANGE_32G 0x0C
-
-#define SMI130_GYRO_ODR_32HZ 0x07
-#define SMI130_GYRO_ODR_64HZ 0x06
-#define SMI130_GYRO_ODR_12HZ 0x05
-#define SMI130_GYRO_ODR_23HZ 0x04
-#define SMI130_GYRO_ODR_47HZ 0x03
-#define SMI130_GYRO_ODR_116HZ 0x02
-#define SMI130_GYRO_ODR_230HZ 0x01
-#define SMI130_GYRO_ODR_523HZ 0x00
-#define SMI130_GYRO_RANGE_2000 0x00
-#define SMI130_GYRO_RANGE_1000 0x01
-#define SMI130_GYRO_RANGE_500 0x02
-#define SMI130_GYRO_RANGE_250 0x03
-#define SMI130_GYRO_RANGE_125 0x04
-
-static unsigned char support_sensors[] = {
-	SENSOR_TYPE_ACCELEROMETER,
-	SENSOR_TYPE_GYROSCOPE,
-	SENSOR_TYPE_GYRO_TEMPERATURE,
-};
-
-struct smi130_device {
-	struct hf_device hf_dev;
-	struct i2c_client *acc_client;
-	struct i2c_client *gyro_client;
-	uint32_t direction;
-	uint8_t placement[3];
-	atomic_t raw_acc_enable;
-	atomic_t raw_gyro_enable;
-	atomic_t acc_enable;
-	atomic_t gyro_enable;
-	atomic_t gyro_temp_enable;
-};
-
-/* I2C operation functions */
-static int smi130_i2c_read_block(struct i2c_client *client,
-			u8 addr, u8 *data, u8 len)
-{
-	int err = 0;
-	u8 beg = addr;
-	struct i2c_msg msgs[2] = {
-		{/*.addr = client->addr,*/
-		 .flags = 0,
-		 .len = 1,
-		 .buf = &beg},
-		{
-			/*.addr = client->addr*/
-			.flags = I2C_M_RD,
-			.len = len,
-			.buf = data,
-		} };
-	if (!client)
-		return -EINVAL;
-	msgs[0].addr = client->addr;
-	msgs[1].addr = client->addr;
-
-	err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
-	if (err != 2) {
-		pr_err_ratelimited("i2c_trans err: %x %x (%d %p %d) %d\n",
-		       msgs[0].addr, client->addr, addr, data, len, err);
-		err = -EIO;
-	} else {
-		err = 0; /*no error*/
-	}
-	return err;
-}
-
-static int smi130_i2c_write_block(struct i2c_client *client,
-			u8 addr, u8 *data, u8 len)
-{
-	/* because address also occupies one byte,
-	 * the maximum length for write is 7 bytes
-	 */
-	int err = 0, idx = 0, num = 0;
-	char buf[32];
-
-	if (!client)
-		return -EINVAL;
-	else if (len > C_I2C_FIFO_SIZE) {
-		pr_err_ratelimited("len %d fi %d\n", len, C_I2C_FIFO_SIZE);
-		return -EINVAL;
-	}
-	buf[num++] = addr;
-	for (idx = 0; idx < len; idx++)
-		buf[num++] = data[idx];
-
-	err = i2c_master_send(client, buf, num);
-	if (err < 0) {
-		pr_err_ratelimited("send command error!!\n");
-		return -EFAULT;
-	}
-
-	return err;
-}
-
-
-static int smi130_acc_init_device(struct i2c_client *client)
-{
-	int err = 0;
-	uint8_t data = 0;
-
-	data = SMI130_ACC_ODR_7HZ;
-	err = smi130_i2c_write_block(client,
-			SMI130_ACC_BW_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x00; //filter and lock enable
-	err = smi130_i2c_write_block(client,
-			SMI130_ACC_RATED_HBW_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = SMI130_ACC_RANGE_16G;
-	err = smi130_i2c_write_block(client,
-			SMI130_ACC_RANGE_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x00; //disable int
-	err = smi130_i2c_write_block(client,
-			SMI130_ACC_INT_ENABLE1_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x80; //map int
-	err = smi130_i2c_write_block(client,
-			SMI130_ACC_INT_MAP_1_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x00; //push-pull, active low
-	err = smi130_i2c_write_block(client,
-			SMI130_ACC_INT_OUT_CTRL_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	pr_debug("SMI130_ACC init OK.\n");
-
-	return err;
-}
-
-static int smi130_acc_set_soft_reset(struct i2c_client *client)
-{
-	int err = 0;
-	uint8_t data = SMI130_SOFT_RESET_VALUE;
-
-	err = smi130_i2c_write_block(client,
-			SMI130_ACC_BGW_SOFTRESET_ADDR, &data, 1);
-	return err;
-}
-
-static int smi130_acc_check_chip_id(struct i2c_client *client)
-{
-	int err = -1;
-	u8 chip_id = 0;
-	u8 read_count = 0;
-
-	while (read_count++ < CHECK_CHIP_ID_TIME_MAX) {
-		smi130_i2c_read_block(client,
-				SMI130_ACC_CHIP_ID_ADDR, &chip_id, 1);
-
-		if ((chip_id & 0xff) != SMI130_ACC_CHIP_ID_VALUE) {
-			continue;
-		} else {
-			err = 0;
-			break;
-		}
-	}
-	return err;
-}
-
-static int smi130_gyro_init_device(struct i2c_client *client)
-{
-	int err = 0;
-	uint8_t data = 0;
-
-	data = SMI130_GYRO_ODR_32HZ;
-	err = smi130_i2c_write_block(client,
-			SMI130_GYRO_BW_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x00; //filter and lock enable
-	err = smi130_i2c_write_block(client,
-			SMI130_GYRO_RATED_HBW_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = SMI130_GYRO_RANGE_2000;
-	err = smi130_i2c_write_block(client,
-			SMI130_GYRO_RANGE_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x00; //disable int
-	err = smi130_i2c_write_block(client,
-			SMI130_GYRO_INT_ENABLE0_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x01; //map int
-	err = smi130_i2c_write_block(client,
-			SMI130_GYRO_INT_MAP_1_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	data = 0x00; //push-pull, active low
-	err = smi130_i2c_write_block(client,
-			SMI130_GYRO_INT_ENABLE1_ADDR, &data, 1);
-	if (err < 0)
-		return err;
-
-	pr_debug("SMI130 gyro init OK.\n");
-
-	return err;
-}
-
-static int smi130_gyro_check_chip_id(struct i2c_client *client)
-{
-	int err = -1;
-	u8 chip_id = 0;
-	u8 read_count = 0;
-
-	while (read_count++ < CHECK_CHIP_ID_TIME_MAX) {
-		smi130_i2c_read_block(client,
-				SMI130_GYRO_CHIP_ID_ADDR, &chip_id, 1);
-
-		if ((chip_id & 0xff) != SMI130_GYRO_CHIP_ID_VALUE) {
-			continue;
-		} else {
-			err = 0;
-			break;
-		}
-	}
-	return err;
-}
-
-int smi130_sample(struct hf_device *hfdev)
-{
-
-	int err = 0;
-	uint8_t buf[SMI130_AXES_NUM * 2] = {0};
-	int32_t data[SMI130_AXES_NUM] = {0};
-	int8_t gyro_temp[1] = {0};
-	struct hf_manager_event event;
-	int64_t current_time;
-	struct smi130_device *driver_dev = hf_device_get_private_data(hfdev);
-	struct hf_manager *manager = driver_dev->hf_dev.manager;
-
-	current_time = ktime_get_boot_ns();
-	if (atomic_read(&driver_dev->acc_enable)) {
-		err = smi130_i2c_read_block(driver_dev->acc_client,
-				SMI130_ACC_RATE_X_LSB_ADDR,
-				&buf[0], SMI130_AXES_NUM * 2);
-		if (err < 0) {
-			pr_err_ratelimited("read fail\n");
-			return err;
-		}
-
-		data[0] = ((int16_t)(buf[0] | (buf[1] << 8))) >> 4;
-		data[1] = ((int16_t)(buf[2] | (buf[3] << 8))) >> 4;
-		data[2] = ((int16_t)(buf[4] | (buf[5] << 8))) >> 4;
-
-		coordinate_map(driver_dev->direction, data);
-
-		if (atomic_read(&driver_dev->raw_acc_enable)) {
-			memset(&event, 0, sizeof(struct hf_manager_event));
-			event.timestamp = current_time;
-			event.sensor_type = SENSOR_TYPE_ACCELEROMETER;
-			event.accurancy = SENSOR_ACCURANCY_HIGH;
-			event.action = RAW_ACTION;
-			event.word[0] =
-				(int32_t)div64_s64((int64_t)data[0] * 9807,
-									256);
-			event.word[1] =
-				(int32_t)div64_s64((int64_t)data[1] * 9807,
-									256);
-			event.word[2] =
-				(int32_t)div64_s64((int64_t)data[2] * 9807,
-									256);
-			manager->report(manager, &event);
-		}
-
-		memset(&event, 0, sizeof(struct hf_manager_event));
-		event.timestamp = current_time;
-		event.sensor_type = SENSOR_TYPE_ACCELEROMETER;
-		event.accurancy = SENSOR_ACCURANCY_HIGH;
-		event.action = DATA_ACTION;
-		event.word[0] = (int32_t)div64_s64((int64_t)data[0] * 9807,
-									256);
-		event.word[1] = (int32_t)div64_s64((int64_t)data[1] * 9807,
-									256);
-		event.word[2] = (int32_t)div64_s64((int64_t)data[2] * 9807,
-									256);
-		manager->report(manager, &event);
-	}
-
-	if (atomic_read(&driver_dev->gyro_enable)) {
-		err = smi130_i2c_read_block(driver_dev->gyro_client,
-			SMI130_GYRO_RATE_X_LSB_ADDR, &buf[0],
-						SMI130_AXES_NUM * 2);
-		if (err < 0) {
-			pr_err_ratelimited("read fail\n");
-			return err;
-		}
-
-		data[0] = (int16_t)(buf[0] | (buf[1] << 8));
-		data[1] = (int16_t)(buf[2] | (buf[3] << 8));
-		data[2] = (int16_t)(buf[4] | (buf[5] << 8));
-
-		coordinate_map(driver_dev->direction, data);
-
-		/* read gyro temp */
-		if (atomic_read(&driver_dev->gyro_temp_enable)) {
-			err = smi130_i2c_read_block(driver_dev->gyro_client,
-				SMI130_GYRO_TEMP_ADDR, &gyro_temp[0], 1);
-			if (err < 0) {
-				pr_err_ratelimited("read gyro temp fail\n");
-				return err;
-			}
-		}
-		if (atomic_read(&driver_dev->raw_gyro_enable)) {
-			memset(&event, 0, sizeof(struct hf_manager_event));
-			event.timestamp = current_time;
-			event.sensor_type = SENSOR_TYPE_GYROSCOPE;
-			event.accurancy = SENSOR_ACCURANCY_HIGH;
-			event.action = RAW_ACTION;
-			event.word[0] =
-				(int32_t)div64_s64((int64_t)data[0] * 1310000,
-									164);
-			event.word[1] =
-				(int32_t)div64_s64((int64_t)data[1] * 1310000,
-									164);
-			event.word[2] =
-				(int32_t)div64_s64((int64_t)data[2] * 1310000,
-									164);
-			manager->report(manager, &event);
-		}
-
-		memset(&event, 0, sizeof(struct hf_manager_event));
-		event.timestamp = current_time;
-		event.sensor_type = SENSOR_TYPE_GYROSCOPE;
-		event.accurancy = SENSOR_ACCURANCY_HIGH;
-		event.action = DATA_ACTION;
-		event.word[0] = (int32_t)div64_s64((int64_t)data[0] * 1310000,
-									164);
-		event.word[1] = (int32_t)div64_s64((int64_t)data[1] * 1310000,
-									164);
-		event.word[2] = (int32_t)div64_s64((int64_t)data[2] * 1310000,
-									164);
-		manager->report(manager, &event);
-
-		if (atomic_read(&driver_dev->gyro_temp_enable)) {
-			memset(&event, 0, sizeof(struct hf_manager_event));
-			event.timestamp = current_time;
-			event.sensor_type = SENSOR_TYPE_GYRO_TEMPERATURE;
-			event.accurancy = SENSOR_ACCURANCY_HIGH;
-			event.action = DATA_ACTION;
-			event.word[0] = (int32_t)gyro_temp[0] * GYRO_TEMP_AMP /
-						2 + GYRO_TEMP_AMP * 24;
-			manager->report(manager, &event);
-		}
-	}
-
-	manager->complete(manager);
-
-	return 0;
-}
-
-int smi130_raw_enable(struct hf_device *hfdev, int sensor_type, int en)
-{
-	struct smi130_device *driver_dev = hf_device_get_private_data(hfdev);
-
-	if (sensor_type == SENSOR_TYPE_ACCELEROMETER)
-		atomic_set(&driver_dev->raw_acc_enable, en);
-	else if (sensor_type == SENSOR_TYPE_GYROSCOPE)
-		atomic_set(&driver_dev->raw_gyro_enable, en);
-	return 0;
-}
-
-int smi130_enable(struct hf_device *hfdev, int sensor_type, int en)
-{
-	int err = 0;
-	uint8_t data = 0;
-	struct smi130_device *driver_dev = hf_device_get_private_data(hfdev);
-
-	pr_debug("%s id:%d en:%d\n", __func__, sensor_type, en);
-
-	if (sensor_type == SENSOR_TYPE_ACCELEROMETER) {
-		if (en) {
-			data = SMI130_ACC_DATA_INT_EN;
-			err = smi130_i2c_write_block(driver_dev->acc_client,
-					SMI130_ACC_INT_ENABLE1_ADDR, &data, 1);
-			if (err < 0) {
-				pr_err_ratelimited("write power mode failed\n");
-				return -1;
-			}
-			atomic_set(&driver_dev->acc_enable, en);
-		} else {
-			data = 0x00;
-			err = smi130_i2c_write_block(driver_dev->acc_client,
-					SMI130_ACC_INT_ENABLE1_ADDR, &data, 1);
-			if (err < 0) {
-				pr_err_ratelimited("write power mode failed\n");
-				return -1;
-			}
-			atomic_set(&driver_dev->acc_enable, en);
-		}
-	} else if (sensor_type == SENSOR_TYPE_GYROSCOPE) {
-		if (en) {
-			data = SMI130_GYRO_DATA_INT_EN;
-			err = smi130_i2c_write_block(driver_dev->gyro_client,
-					SMI130_GYRO_INT_ENABLE0_ADDR, &data, 1);
-			if (err < 0) {
-				pr_err_ratelimited("write power mode failed\n");
-				return -1;
-			}
-			atomic_set(&driver_dev->gyro_enable, en);
-		} else {
-			data = 0x00;
-			err = smi130_i2c_write_block(driver_dev->gyro_client,
-					SMI130_GYRO_INT_ENABLE0_ADDR, &data, 1);
-			if (err < 0) {
-				pr_err_ratelimited("write power mode failed\n");
-				return -1;
-			}
-			atomic_set(&driver_dev->gyro_enable, en);
-		}
-	} else if (sensor_type == SENSOR_TYPE_GYRO_TEMPERATURE)
-		atomic_set(&driver_dev->gyro_temp_enable, en);
-
-	return 0;
-
-}
-
-int smi130_batch(struct hf_device *hfdev, int sensor_type,
-	int64_t delay, int64_t latency)
-{
-
-	int err = 0;
-	uint8_t data = 0;
-	int value = 0;
-	struct smi130_device *driver_dev = hf_device_get_private_data(hfdev);
-	struct hf_manager *manager = driver_dev->hf_dev.manager;
-	struct hf_manager_event event;
-	int64_t current_time;
-
-	pr_debug("%s id:%d rate:%lld latency:%lld\n",
-		__func__, sensor_type, delay, latency);
-
-	value = div64_s64(1000000000LL, delay);
-
-	if (sensor_type == SENSOR_TYPE_ACCELEROMETER) {
-		if (value <= 7)
-			data = SMI130_ACC_ODR_7HZ;
-		else if (value <= 15)
-			data = SMI130_ACC_ODR_15HZ;
-		else if (value <= 31)
-			data = SMI130_ACC_ODR_31HZ;
-		else if (value <= 62)
-			data = SMI130_ACC_ODR_62HZ;
-		else if (value <= 125)
-			data = SMI130_ACC_ODR_125HZ;
-		else if (value <= 250)
-			data = SMI130_ACC_ODR_250HZ;
-		else if (value <= 500)
-			data = SMI130_ACC_ODR_500HZ;
-		else
-			data = SMI130_ACC_ODR_1000HZ;
-
-		err = smi130_i2c_write_block(driver_dev->acc_client,
-					SMI130_ACC_BW_ADDR, &data, 1);
-		if (err < 0) {
-			pr_err_ratelimited("write rate failed.\n");
-			return -1;
-		}
-		memset(&event, 0, sizeof(struct hf_manager_event));
-		current_time = ktime_get_boot_ns();
-		event.timestamp = current_time;
-		event.sensor_type = SENSOR_TYPE_ADDITIONAL_INFO;
-		event.accurancy = SENSOR_ACCURANCY_HIGH;
-		event.reserved = SENSOR_TYPE_ACCELEROMETER;
-		event.action = DATA_ACTION;
-		get_placement_info(driver_dev->direction, event.byte);
-		event.byte[12] = 1;
-		event.byte[3] = driver_dev->placement[0];
-		event.byte[7] = driver_dev->placement[1];
-		event.byte[11] = driver_dev->placement[2];
-
-		manager->report(manager, &event);
-	} else if (sensor_type == SENSOR_TYPE_GYROSCOPE) {
-		if (value <= 12)
-			data = SMI130_GYRO_ODR_12HZ;
-		else if (value <= 23)
-			data = SMI130_GYRO_ODR_23HZ;
-		else if (value <= 32)
-			data = SMI130_GYRO_ODR_32HZ;
-		else if (value <= 47)
-			data = SMI130_GYRO_ODR_47HZ;
-		else if (value <= 64)
-			data = SMI130_GYRO_ODR_64HZ;
-		else if (value <= 116)
-			data = SMI130_GYRO_ODR_116HZ;
-		else if (value <= 230)
-			data = SMI130_GYRO_ODR_230HZ;
-		else
-			data = SMI130_GYRO_ODR_523HZ;
-
-		err = smi130_i2c_write_block(driver_dev->gyro_client,
-				SMI130_GYRO_BW_ADDR, &data, 1);
-		if (err < 0) {
-			pr_err_ratelimited("write rate failed.\n");
-			return -1;
-		}
-		memset(&event, 0, sizeof(struct hf_manager_event));
-		current_time = ktime_get_boot_ns();
-		event.timestamp = current_time;
-		event.sensor_type = SENSOR_TYPE_ADDITIONAL_INFO;
-		event.accurancy = SENSOR_ACCURANCY_HIGH;
-		event.reserved = SENSOR_TYPE_GYROSCOPE;
-		event.action = DATA_ACTION;
-		get_placement_info(driver_dev->direction, event.byte);
-		event.byte[12] = 1;
-		event.byte[3] = driver_dev->placement[0];
-		event.byte[7] = driver_dev->placement[1];
-		event.byte[11] = driver_dev->placement[2];
-
-		manager->report(manager, &event);
-	}
-
-	manager->complete(manager);
-
-	return 0;
-
-}
-
-static int smi130_flush(struct hf_device *hfdev, int sensor_type)
-{
-	struct smi130_device *driver_dev = hf_device_get_private_data(hfdev);
-	struct hf_manager *manager = driver_dev->hf_dev.manager;
-	struct hf_manager_event event;
-	int64_t current_time;
-
-	memset(&event, 0, sizeof(struct hf_manager_event));
-	current_time = ktime_get_boot_ns();
-	event.sensor_type = sensor_type;
-	event.timestamp = current_time;
-	event.action = FLUSH_ACTION;
-
-	manager->report(manager, &event);
-	manager->complete(manager);
-
-	return 0;
-}
-
-static int smi130_i2c_remove(struct i2c_client *client)
-{
-	struct smi130_device *driver_dev = i2c_get_clientdata(client);
-
-	hf_manager_destroy(driver_dev->hf_dev.manager);
-	kfree(driver_dev);
-	return 0;
-}
-
-static int smi130_i2c_probe(struct i2c_client *client,
-			const struct i2c_device_id *id)
-{
-
-	int err = 0;
-	struct smi130_device *driver_dev;
-	struct sensorlist_info_t listinfo;
-
-	pr_info("%s\n", __func__);
-
-	driver_dev = devm_kzalloc(&client->dev, sizeof(*driver_dev),
-								GFP_KERNEL);
-	if (!driver_dev)
-		return -ENOMEM;
-
-	driver_dev->acc_client = client;
-	driver_dev->gyro_client = i2c_new_dummy(client->adapter, GYRO_ADDR);
-	if (!driver_dev->gyro_client) {
-		pr_err("Failed to allocate i2c device for gyro\n");
-		return -ENODEV;
-	}
-
-	/* acc init */
-	err = smi130_acc_check_chip_id(client);
-	if (err < 0) {
-		pr_err("smi130 acc chip id mismatch\n");
-		err = -EINVAL;
-		goto init_fail;
-	}
-
-	err = smi130_acc_set_soft_reset(client);
-	if (err < 0) {
-		pr_err("erro soft reset!\n");
-		err = -EINVAL;
-		goto init_fail;
-	}
-
-	err = smi130_acc_init_device(client);
-	if (err < 0) {
-		pr_err("%s init device fail\n", __func__);
-		goto init_fail;
-	}
-
-	/* gyro init */
-	err = smi130_gyro_check_chip_id(driver_dev->gyro_client);
-	if (err < 0) {
-		pr_err("smi130 gyro chip id mismatch\n");
-		err = -EINVAL;
-		goto init_fail;
-	}
-
-	err = smi130_gyro_init_device(driver_dev->gyro_client);
-	if (err < 0) {
-		pr_err("%s init device fail\n", __func__);
-		goto init_fail;
-	}
-
-	if (of_property_read_u32(client->dev.of_node,
-		"direction", &driver_dev->direction)) {
-		pr_err("%s get direction dts fail\n", __func__);
-		err = -EFAULT;
-		goto dts_fail;
-	}
-
-	if (of_property_read_u8_array(client->dev.of_node, "placement",
-		driver_dev->placement, ARRAY_SIZE(driver_dev->placement))) {
-		pr_err("%s get placement dts fail\n", __func__);
-		err = -EFAULT;
-		goto dts_fail;
-	}
-
-	atomic_set(&driver_dev->raw_acc_enable, 0);
-	atomic_set(&driver_dev->raw_gyro_enable, 0);
-
-	driver_dev->hf_dev.dev_name = SMI130_I2C_NAME;
-	driver_dev->hf_dev.device_poll = HF_DEVICE_IO_POLLING;
-	driver_dev->hf_dev.device_bus = HF_DEVICE_IO_SYNC;
-	driver_dev->hf_dev.support_list = support_sensors;
-	driver_dev->hf_dev.support_size = ARRAY_SIZE(support_sensors);
-	driver_dev->hf_dev.enable = smi130_enable;
-	driver_dev->hf_dev.batch = smi130_batch;
-	driver_dev->hf_dev.flush = smi130_flush;
-	driver_dev->hf_dev.sample = smi130_sample;
-	driver_dev->hf_dev.rawdata = smi130_raw_enable;
-
-	err = hf_manager_create(&driver_dev->hf_dev);
-	if (err < 0) {
-		pr_err("%s hf_manager_create fail\n", __func__);
-		err = -1;
-		goto create_manager_fail;
-	}
-
-	i2c_set_clientdata(client, driver_dev);
-	hf_device_set_private_data(&driver_dev->hf_dev, driver_dev);
-
-	memset(&listinfo, 0, sizeof(struct sensorlist_info_t));
-	strlcpy(listinfo.name, SMI130_I2C_NAME, sizeof(listinfo.name));
-	sensorlist_register_devinfo(SENSOR_TYPE_ACCELEROMETER, &listinfo);
-	sensorlist_register_devinfo(SENSOR_TYPE_GYROSCOPE, &listinfo);
-
-	pr_info("%s success!\n", __func__);
-	return 0;
-
-create_manager_fail:
-dts_fail:
-init_fail:
-	i2c_unregister_device(driver_dev->gyro_client);
-	return err;
-}
-
-static const struct of_device_id smi130_acc_of_match[] = {
-	{.compatible = "mediatek,smi130_sensor"},
-	{},
-};
-static const struct i2c_device_id smi130_acc_i2c_id[] = {
-					{SMI130_I2C_NAME, 0}, {} };
-
-static struct i2c_driver smi130_acc_i2c_driver = {
-	.driver = {
-		.name = SMI130_I2C_NAME,
-		.bus = &i2c_bus_type,
-		.owner = THIS_MODULE,
-		.of_match_table = smi130_acc_of_match,
-	},
-	.probe = smi130_i2c_probe,
-	.remove = smi130_i2c_remove,
-	.id_table =  smi130_acc_i2c_id,
-};
-
-module_i2c_driver(smi130_acc_i2c_driver);
-
-MODULE_AUTHOR("Mediatek");
-MODULE_DESCRIPTION("smi130 acc i2c driver");
-MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/smi130_i2c/smi130_i2c.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/smi130_i2c/smi130_i2c.h
deleted file mode 100644
index 7287976..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/smi130_i2c/smi130_i2c.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#ifndef __SMI130_ACC_H__
-#define __SMI130_ACC_H__
-
-	/*Define of registers*/
-
-	 /* Hard Wired */
-#define SMI130_ACC_CHIP_ID_ADDR                     0x00
-	/**<Address of Chip ID Register*/
-
-	/* Data Register */
-#define SMI130_ACC_RATE_X_LSB_ADDR                  0x02
-	/**<	Address of X axis Rate LSB Register	*/
-#define SMI130_ACC_RATE_X_MSB_ADDR                  0x03
-	/**<	Address of X axis Rate MSB Register	*/
-#define SMI130_ACC_RATE_Y_LSB_ADDR                  0x04
-	/**<	Address of Y axis Rate LSB Register	*/
-#define SMI130_ACC_RATE_Y_MSB_ADDR                  0x05
-	/**<	Address of Y axis Rate MSB Register	*/
-#define SMI130_ACC_RATE_Z_LSB_ADDR                  0x06
-	/**<	Address of Z axis Rate LSB Register	*/
-#define SMI130_ACC_RATE_Z_MSB_ADDR                  0x07
-	/**<	Address of Z axis Rate MSB Register	*/
-#define SMI130_ACC_TEMP_ADDR                        0x08
-	/**<   Address of Temperature Data LSB Register */
-
-#define SMI130_ACC_INT_STATUS1_ADDR                 0x0A
-	/**<   Address of Interrupt status Register 1*/
-
-	/* Control Register */
-#define SMI130_ACC_RANGE_ADDR                       0x0F
-	/**<	Address of Range address Register */
-#define SMI130_ACC_BW_ADDR                          0x10
-	/**<	Address of Bandwidth Register */
-#define SMI130_ACC_RATED_HBW_ADDR                   0x13
-	/**<	Address of Rate HBW Register */
-#define SMI130_ACC_BGW_SOFTRESET_ADDR               0x14
-	/**<	Address of BGW Softreset Register  */
-
-#define SMI130_ACC_INT_ENABLE1_ADDR                 0x17
-	/**<        Address of Interrupt Enable 1  */
-
-#define SMI130_ACC_INT_MAP_1_ADDR                   0x1A
-	/**<	Address of Interrupt MAP 1  */
-
-#define SMI130_ACC_INT_SRC_ADDR                     0x1E
-	/**<	Address of Interrupt SRC 1  */
-
-#define SMI130_ACC_INT_OUT_CTRL_ADDR                0x20
-	/**<	Address of Interrupt MAP 1  */
-
-#define SMI130_ACC_BGW_SPI3_WDT_ADDR                0x34
-	/**<	Address of BGW SPI3,WDT Register  */
-
-#define SMI130_ACC_SELF_TEST_ADDR                   0x32
-	/**<	Address of BGW Self test Register  */
-
-#define SMI130_ACC_DATA_INT_EN                      0x10
-
-/* gyro reg */
-#define SMI130_GYRO_CHIP_ID_ADDR                     0x00
-	/**<Address of Chip ID Register  */
-
-	/* Data Register */
-#define SMI130_GYRO_RATE_X_LSB_ADDR                  0x02
-	/**<	 Address of X axis Rate LSB Register  */
-#define SMI130_GYRO_RATE_X_MSB_ADDR                  0x03
-	/**<	 Address of X axis Rate MSB Register  */
-#define SMI130_GYRO_RATE_Y_LSB_ADDR                  0x04
-	/**<	 Address of Y axis Rate LSB Register  */
-#define SMI130_GYRO_RATE_Y_MSB_ADDR                  0x05
-	/**<	 Address of Y axis Rate MSB Register  */
-#define SMI130_GYRO_RATE_Z_LSB_ADDR                  0x06
-	/**<	 Address of Z axis Rate LSB Register  */
-#define SMI130_GYRO_RATE_Z_MSB_ADDR                  0x07
-	/**<	 Address of Z axis Rate MSB Register  */
-#define SMI130_GYRO_TEMP_ADDR                        0x08
-	/**<	 Address of Temperature Data LSB Register */
-
-#define SMI130_GYRO_INT_STATUS1_ADDR                 0x0A
-	/**<	 Address of Interrupt status Register 1  */
-
-	/* Control Register */
-#define SMI130_GYRO_RANGE_ADDR                       0x0F
-	/**<	 Address of Range address Register  */
-#define SMI130_GYRO_BW_ADDR                          0x10
-	/**<	 Address of Bandwidth Register  */
-#define SMI130_GYRO_RATED_HBW_ADDR                   0x13
-	/**<	 Address of Rate HBW Register  */
-#define SMI130_GYRO_BGW_SOFTRESET_ADDR               0x14
-	/**<	 Address of BGW Softreset Register  */
-#define SMI130_GYRO_INT_ENABLE0_ADDR                 0x15
-	/**<    Address of Interrupt Enable 0  */
-#define SMI130_GYRO_INT_ENABLE1_ADDR                 0x16
-	/**<    Address of Interrupt Enable 1  */
-
-#define SMI130_GYRO_INT_MAP_1_ADDR                   0x18
-	/**<	Address of Interrupt MAP 0  */
-
-#define SMI130_GYRO_BGW_SPI3_WDT_ADDR                0x34
-	/**<    Address of BGW SPI3,WDT Register  */
-
-#define SMI130_GYRO_SELF_TEST_ADDR                   0x3C
-	/**<	Address of BGW Self test Register  */
-
-
-#define SMI130_GYRO_DATA_INT_EN                      0x80
-
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/Kconfig
deleted file mode 100644
index c9e2325..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-config MTK_HF_TEST_CASE
-	bool "high frequency manager test demo for MediaTek package"
-	help
-	  It support high frequency manager test demo.
-	  If this option is set,
-	  it will support
-	  high frequency manager test demo.
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/Makefile
deleted file mode 100644
index 0a6dae4..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensor/2.0/core
-
-obj-y += test.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test.c
deleted file mode 100644
index 6ca6239..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test.c
+++ /dev/null
@@ -1,138 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/of.h>
-
-#include "hf_manager.h"
-
-struct test_device {
-	struct hf_device hf_dev;
-};
-
-struct test_device test_driver1;
-struct test_device test_driver2;
-struct test_device test_driver3;
-struct test_device test_driver4;
-
-static unsigned char support_sensors1[] = {
-	1,
-};
-static unsigned char support_sensors2[] = {
-	2,
-};
-static unsigned char support_sensors3[] = {
-	3,
-};
-static unsigned char support_sensors4[] = {
-	4,
-};
-
-static int test_enable(struct hf_device *hfdev, int sensor_type, int en)
-{
-	pr_debug("%s id:%d en:%d\n", __func__, sensor_type, en);
-	return 0;
-}
-
-static int test_batch(struct hf_device *hfdev, int sensor_type,
-		int64_t delay, int64_t latency)
-{
-	pr_debug("%s id:%d delay:%lld latency:%lld\n", __func__, sensor_type,
-		delay, latency);
-	return 0;
-}
-
-static int test_sample(struct hf_device *hfdev)
-{
-	struct test_device *driver_dev = hf_device_get_private_data(hfdev);
-	struct hf_manager *manager = driver_dev->hf_dev.manager;
-
-	pr_debug("%s %s\n", __func__, driver_dev->hf_dev.dev_name);
-	manager->complete(manager);
-	return 0;
-}
-
-static int tests_init(void)
-{
-	int err = 0;
-
-	test_driver1.hf_dev.dev_name = "test_driver1";
-	test_driver1.hf_dev.device_poll = HF_DEVICE_IO_POLLING;
-	test_driver1.hf_dev.device_bus = HF_DEVICE_IO_SYNC;
-	test_driver1.hf_dev.support_list = support_sensors1;
-	test_driver1.hf_dev.support_size = ARRAY_SIZE(support_sensors1);
-	test_driver1.hf_dev.enable = test_enable;
-	test_driver1.hf_dev.batch = test_batch;
-	test_driver1.hf_dev.sample = test_sample;
-
-	err = hf_manager_create(&test_driver1.hf_dev);
-	if (err < 0)
-		pr_err("%s hf_manager_create fail\n", __func__);
-	hf_device_set_private_data(&test_driver1.hf_dev, &test_driver1);
-
-	test_driver2.hf_dev.dev_name = "test_driver2";
-	test_driver2.hf_dev.device_poll = HF_DEVICE_IO_POLLING;
-	test_driver2.hf_dev.device_bus = HF_DEVICE_IO_SYNC;
-	test_driver2.hf_dev.support_list = support_sensors2;
-	test_driver2.hf_dev.support_size = ARRAY_SIZE(support_sensors2);
-	test_driver2.hf_dev.enable = test_enable;
-	test_driver2.hf_dev.batch = test_batch;
-	test_driver2.hf_dev.sample = test_sample;
-
-	err = hf_manager_create(&test_driver2.hf_dev);
-	if (err < 0)
-		pr_err("%s hf_manager_create fail\n", __func__);
-	hf_device_set_private_data(&test_driver2.hf_dev, &test_driver2);
-
-	test_driver3.hf_dev.dev_name = "test_driver3";
-	test_driver3.hf_dev.device_poll = HF_DEVICE_IO_POLLING;
-	test_driver3.hf_dev.device_bus = HF_DEVICE_IO_ASYNC;
-	test_driver3.hf_dev.support_list = support_sensors3;
-	test_driver3.hf_dev.support_size = ARRAY_SIZE(support_sensors3);
-	test_driver3.hf_dev.enable = test_enable;
-	test_driver3.hf_dev.batch = test_batch;
-	test_driver3.hf_dev.sample = test_sample;
-
-	err = hf_manager_create(&test_driver3.hf_dev);
-	if (err < 0)
-		pr_err("%s hf_manager_create fail\n", __func__);
-	hf_device_set_private_data(&test_driver3.hf_dev, &test_driver3);
-
-	test_driver4.hf_dev.dev_name = "test_driver4";
-	test_driver4.hf_dev.device_poll = HF_DEVICE_IO_POLLING;
-	test_driver4.hf_dev.device_bus = HF_DEVICE_IO_ASYNC;
-	test_driver4.hf_dev.support_list = support_sensors4;
-	test_driver4.hf_dev.support_size = ARRAY_SIZE(support_sensors4);
-	test_driver4.hf_dev.enable = test_enable;
-	test_driver4.hf_dev.batch = test_batch;
-	test_driver4.hf_dev.sample = test_sample;
-
-	err = hf_manager_create(&test_driver4.hf_dev);
-	if (err < 0)
-		pr_err("%s hf_manager_create fail\n", __func__);
-	hf_device_set_private_data(&test_driver4.hf_dev, &test_driver4);
-	return 0;
-}
-
-static int __init test_init(void)
-{
-	tests_init();
-	return 0;
-}
-
-static void __exit test_exit(void)
-{
-
-}
-
-module_init(test_init);
-module_exit(test_exit);
-
-
-MODULE_AUTHOR("Mediatek");
-MODULE_DESCRIPTION("test driver");
-MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test_app.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test_app.c
deleted file mode 100644
index 33713a8..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test_app.c
+++ /dev/null
@@ -1,181 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2020 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[test_app] " fmt
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/kthread.h>
-#include <linux/kobject.h>
-
-#include "hf_manager.h"
-
-struct test_app_t {
-	struct task_struct *task;
-	struct hf_client *client;
-	struct kobject *kobj;
-	int sensor_type;
-	int val1;
-	int val2;
-};
-
-static struct test_app_t test_app;
-
-static int test_app_kthread(void *arg)
-{
-	struct hf_client *client = NULL;
-	struct hf_manager_event data[4];
-	int size = 0, i = 0;
-
-	client = hf_client_create();
-	if (!client) {
-		pr_err("hf_client_create fail\n");
-		return -ENOMEM;
-	}
-	test_app.client = client;
-
-	while (!kthread_should_stop()) {
-		memset(data, 0, sizeof(data));
-		size = hf_client_poll_sensor(client, data, ARRAY_SIZE(data));
-		if (size < 0)
-			continue;
-		for (i = 0; i < size; ++i) {
-			pr_info_ratelimited("[%d,%d,%lld,%d,%d,%d]\n",
-				data[i].sensor_type,
-				data[i].action,
-				data[i].timestamp,
-				data[i].word[0],
-				data[i].word[1],
-				data[i].word[2]);
-
-			/* need derequest sensor cali */
-			switch (data[i].action) {
-			case CALI_ACTION:
-				hf_client_request_sensor_cali(test_app.client,
-					test_app.sensor_type,
-					HF_MANAGER_REQUEST_CALI_DATA,
-					false);
-				break;
-			case TEST_ACTION:
-				hf_client_request_sensor_cali(test_app.client,
-					test_app.sensor_type,
-					HF_MANAGER_REQUEST_TEST_DATA,
-					false);
-				break;
-			}
-		}
-	}
-	return 0;
-}
-
-#define test_app_attr(_name) \
-static struct kobj_attribute _name##_attr = {	\
-	.attr	= {				\
-		.name = __stringify(_name),	\
-		.mode = 0644,			\
-	},					\
-	.show	= _name##_show,			\
-	.store	= _name##_store,		\
-}
-
-static ssize_t control_show(struct kobject *kobj,
-		struct kobj_attribute *attr,
-		char *buf)
-{
-	return sprintf(buf, "sensor_type=%u,val1=%u,val2=%u\n",
-		test_app.sensor_type,
-		test_app.val1,
-		test_app.val2);
-}
-
-static ssize_t control_store(struct kobject *kobj,
-		struct kobj_attribute *attr,
-		const char *buf, size_t n)
-{
-	int ret = 0;
-	struct hf_manager_cmd cmd;
-
-	if (!test_app.client)
-		goto out;
-
-	ret = sscanf(buf, "%u,%u,%u", &test_app.sensor_type,
-		&test_app.val1, &test_app.val2);
-	if (ret != 3) {
-		pr_err("control store param error\n");
-		goto out;
-	}
-
-	ret = hf_client_find_sensor(test_app.client, test_app.sensor_type);
-	if (ret < 0) {
-		pr_err("hf_client_find_sensor %u fail\n",
-			test_app.sensor_type);
-		goto out;
-	}
-
-	switch (test_app.val1) {
-	case HF_MANAGER_SENSOR_ENABLE_CALI:
-		hf_client_request_sensor_cali(test_app.client,
-			test_app.sensor_type,
-			HF_MANAGER_REQUEST_CALI_DATA,
-			true);
-		break;
-	case HF_MANAGER_SENSOR_SELFTEST:
-		hf_client_request_sensor_cali(test_app.client,
-			test_app.sensor_type,
-			HF_MANAGER_REQUEST_TEST_DATA,
-			true);
-		break;
-	}
-
-	memset(&cmd, 0, sizeof(cmd));
-	cmd.sensor_type = test_app.sensor_type;
-	cmd.action = test_app.val1;
-	cmd.delay = test_app.val2;
-	cmd.latency = 0;
-	ret = hf_client_control_sensor(test_app.client, &cmd);
-	if (ret < 0) {
-		pr_err("hf_client_control_sensor %u fail\n",
-			test_app.sensor_type);
-		goto out;
-	}
-out:
-	return n;
-}
-
-test_app_attr(control);
-
-static struct attribute *attr[] = {
-	&control_attr.attr,
-	NULL,
-};
-
-static const struct attribute_group attr_group = {
-	.attrs = attr,
-};
-
-static int __init test_app_init(void)
-{
-	test_app.task = kthread_run(test_app_kthread,
-		&test_app, "test_app");
-	if (IS_ERR(test_app.task))
-		pr_err("kthread_run create fail\n");
-
-	test_app.kobj = kobject_create_and_add("test_app", NULL);
-	if (!test_app.kobj) {
-		pr_err("kobject create fail\n");
-		return -ENOMEM;
-	}
-	if (sysfs_create_group(test_app.kobj, &attr_group)) {
-		pr_err("sysfs create fail\n");
-		return -EFAULT;
-	}
-	return 0;
-}
-
-module_init(test_app_init);
-
-MODULE_DESCRIPTION("high frequency manager test");
-MODULE_AUTHOR("Hongxu Zhao <hongxu.zhao@mediatek.com>");
-MODULE_LICENSE("GPL v2");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test_app1.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test_app1.c
deleted file mode 100644
index 994bd60..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test_app1.c
+++ /dev/null
@@ -1,202 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2020 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[test_app1] " fmt
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/kobject.h>
-
-#include "hf_manager.h"
-
-#define test_app_attr(_name) \
-static struct kobj_attribute _name##_attr = {	\
-	.attr	= {				\
-		.name = __stringify(_name),	\
-		.mode = 0644,			\
-	},					\
-	.show	= _name##_show,			\
-}
-
-static ssize_t test_app1_cmd(char *buf, int sensor_type,
-		int action, unsigned int request)
-{
-	ssize_t ret = 0;
-	struct hf_client *client = NULL;
-	struct hf_manager_cmd cmd;
-	struct hf_manager_event data[1];
-
-	client = hf_client_create();
-	if (!client) {
-		pr_err("hf_client_create fail\n");
-		return -ENOMEM;
-	}
-	ret = hf_client_find_sensor(client, sensor_type);
-	if (ret < 0) {
-		pr_err("hf_client_find_sensor %u fail\n", sensor_type);
-		goto out;
-	}
-	hf_client_request_sensor_cali(client, sensor_type,
-		request, true);
-	memset(&cmd, 0, sizeof(cmd));
-	cmd.sensor_type = sensor_type;
-	cmd.action = action;
-	ret = hf_client_control_sensor(client, &cmd);
-	if (ret < 0) {
-		pr_err("hf_client_control_sensor %u %u fail\n",
-			sensor_type, action);
-		goto out;
-	}
-	ret = hf_client_poll_sensor_timeout(client, data, ARRAY_SIZE(data),
-		msecs_to_jiffies(3000));
-	hf_client_request_sensor_cali(client, sensor_type,
-		request, false);
-	if (ret >= 0)
-		ret = sprintf(buf, "[%d,%d,%d,%lld,%d,%d,%d]\n",
-				data[0].sensor_type,
-				data[0].action,
-				data[0].accurancy,
-				data[0].timestamp,
-				data[0].word[0],
-				data[0].word[1],
-				data[0].word[2]);
-out:
-	hf_client_destroy(client);
-	return ret;
-}
-
-static ssize_t test_app1_cust(char *buf, int sensor_type,
-		int action)
-{
-	ssize_t ret = 0;
-	struct hf_client *client = NULL;
-	struct custom_cmd cmd;
-
-	client = hf_client_create();
-	if (!client) {
-		pr_err("hf_client_create fail\n");
-		return -ENOMEM;
-	}
-	ret = hf_client_find_sensor(client, sensor_type);
-	if (ret < 0) {
-		pr_err("hf_client_find_sensor %u fail\n", sensor_type);
-		goto out;
-	}
-	memset(&cmd, 0, sizeof(cmd));
-	cmd.data[0] = action;
-	ret = hf_client_custom_cmd(client, sensor_type, &cmd);
-	if (ret >= 0)
-		ret = sprintf(buf, "[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d]\n",
-				cmd.data[0],
-				cmd.data[1],
-				cmd.data[2],
-				cmd.data[3],
-				cmd.data[4],
-				cmd.data[5],
-				cmd.data[6],
-				cmd.data[7],
-				cmd.data[8],
-				cmd.data[9],
-				cmd.data[10],
-				cmd.data[11]);
-out:
-	hf_client_destroy(client);
-	return ret;
-}
-
-static ssize_t acc_cali_show(struct kobject *kobj,
-		struct kobj_attribute *attr,
-		char *buf)
-{
-	return test_app1_cmd(buf, SENSOR_TYPE_ACCELEROMETER,
-			HF_MANAGER_SENSOR_ENABLE_CALI,
-			HF_MANAGER_REQUEST_CALI_DATA);
-}
-
-static ssize_t acc_cust_show(struct kobject *kobj,
-		struct kobj_attribute *attr,
-		char *buf)
-{
-	return test_app1_cust(buf, SENSOR_TYPE_ACCELEROMETER,
-			CUST_CMD_CALI);
-}
-
-
-static ssize_t acc_seltest_show(struct kobject *kobj,
-		struct kobj_attribute *attr,
-		char *buf)
-{
-	return test_app1_cmd(buf, SENSOR_TYPE_ACCELEROMETER,
-			HF_MANAGER_SENSOR_SELFTEST,
-			HF_MANAGER_REQUEST_TEST_DATA);
-}
-
-static ssize_t gyro_cali_show(struct kobject *kobj,
-		struct kobj_attribute *attr,
-		char *buf)
-{
-	return test_app1_cmd(buf, SENSOR_TYPE_GYROSCOPE,
-			HF_MANAGER_SENSOR_ENABLE_CALI,
-			HF_MANAGER_REQUEST_CALI_DATA);
-}
-
-static ssize_t gyro_cust_show(struct kobject *kobj,
-		struct kobj_attribute *attr,
-		char *buf)
-{
-	return test_app1_cust(buf, SENSOR_TYPE_GYROSCOPE,
-			CUST_CMD_CALI);
-}
-
-static ssize_t gyro_selftest_show(struct kobject *kobj,
-		struct kobj_attribute *attr,
-		char *buf)
-{
-	return test_app1_cmd(buf, SENSOR_TYPE_GYROSCOPE,
-			HF_MANAGER_SENSOR_SELFTEST,
-			HF_MANAGER_REQUEST_TEST_DATA);
-}
-
-test_app_attr(acc_cali);
-test_app_attr(acc_cust);
-test_app_attr(acc_seltest);
-test_app_attr(gyro_cali);
-test_app_attr(gyro_cust);
-test_app_attr(gyro_selftest);
-
-static struct attribute *attr[] = {
-	&acc_cali_attr.attr,
-	&acc_cust_attr.attr,
-	&acc_seltest_attr.attr,
-	&gyro_cali_attr.attr,
-	&gyro_cust_attr.attr,
-	&gyro_selftest_attr.attr,
-	NULL,
-};
-
-static const struct attribute_group attr_group = {
-	.attrs = attr,
-};
-
-static int __init test_app_init(void)
-{
-	struct kobject *kobj = kobject_create_and_add("test_app1", NULL);
-
-	if (!kobj) {
-		pr_err("kobject create fail\n");
-		return -ENOMEM;
-	}
-	if (sysfs_create_group(kobj, &attr_group)) {
-		pr_err("sysfs create fail\n");
-		return -EFAULT;
-	}
-	return 0;
-}
-
-module_init(test_app_init);
-
-MODULE_DESCRIPTION("high frequency manager test");
-MODULE_AUTHOR("Hongxu Zhao <hongxu.zhao@mediatek.com>");
-MODULE_LICENSE("GPL v2");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test_app2.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test_app2.c
deleted file mode 100644
index 9066f32..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensor/2.0/test/test_app2.c
+++ /dev/null
@@ -1,160 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2020 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[test_app2] " fmt
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/kthread.h>
-#include <linux/kobject.h>
-
-#include "hf_manager.h"
-
-struct test_app_t {
-	struct task_struct *task;
-	struct hf_client *client;
-};
-
-static struct test_app_t test_app;
-
-static int test_app_kthread(void *arg)
-{
-	struct hf_client *client = test_app.client;
-	struct hf_manager_event data[4];
-	int size = 0, i = 0;
-
-	if (!client)
-		return -EINVAL;
-
-	while (!kthread_should_stop()) {
-		memset(data, 0, sizeof(data));
-		/*
-		 * must use timeout api to wakeup kthread and do exit
-		 * otherwise kthread_stop will be blocked forever
-		 */
-		size = hf_client_poll_sensor_timeout(client, data,
-			ARRAY_SIZE(data), msecs_to_jiffies(500));
-		if (size < 0)
-			continue;
-		for (i = 0; i < size; ++i) {
-			pr_info_ratelimited("[%d,%d,%lld,%d,%d,%d]\n",
-				data[i].sensor_type,
-				data[i].action,
-				data[i].timestamp,
-				data[i].word[0],
-				data[i].word[1],
-				data[i].word[2]);
-		}
-	}
-	return 0;
-}
-
-#define test_app_attr(_name) \
-static struct kobj_attribute _name##_attr = {	\
-	.attr	= {				\
-		.name = __stringify(_name),	\
-		.mode = 0644,			\
-	},					\
-	.store	= _name##_store,		\
-}
-
-static ssize_t control_store(struct kobject *kobj,
-		struct kobj_attribute *attr,
-		const char *buf, size_t n)
-{
-	int ret = 0;
-	int sensor_type = 0, val1 = 0, val2 = 0;
-	struct hf_manager_cmd cmd;
-
-	ret = sscanf(buf, "%u,%u,%u", &sensor_type, &val1, &val2);
-	if (ret != 3) {
-		pr_err("control store param error\n");
-		return -EINVAL;
-	}
-
-	if (val1 == HF_MANAGER_SENSOR_ENABLE) {
-		if (test_app.client)
-			return -EINVAL;
-		test_app.client = hf_client_create();
-		if (!test_app.client) {
-			pr_err("hf_client_create fail\n");
-			return -ENOMEM;
-		}
-		if (!test_app.task) {
-			test_app.task = kthread_run(test_app_kthread,
-				&test_app, "test_app2");
-			if (IS_ERR(test_app.task)) {
-				pr_err("kthread_run create fail\n");
-				return -ENOMEM;
-			}
-		}
-		ret = hf_client_find_sensor(test_app.client, sensor_type);
-		if (ret < 0) {
-			pr_err("hf_client_find_sensor %u fail\n",
-				sensor_type);
-			return -EINVAL;
-		}
-		memset(&cmd, 0, sizeof(cmd));
-		cmd.sensor_type = sensor_type;
-		cmd.action = val1;
-		cmd.delay = val2;
-		cmd.latency = 0;
-		ret = hf_client_control_sensor(test_app.client, &cmd);
-		if (ret < 0) {
-			pr_err("hf_client_control_sensor %u fail\n",
-				sensor_type);
-			return -EINVAL;
-		}
-	} else if (val1 == HF_MANAGER_SENSOR_DISABLE) {
-		if (test_app.client) {
-			memset(&cmd, 0, sizeof(cmd));
-			cmd.sensor_type = sensor_type;
-			cmd.action = val1;
-			hf_client_control_sensor(test_app.client, &cmd);
-		}
-		if (test_app.task) {
-			kthread_stop(test_app.task);
-			test_app.task = NULL;
-		}
-		if (test_app.client) {
-			hf_client_destroy(test_app.client);
-			test_app.client = NULL;
-		}
-	}
-
-	return n;
-}
-
-test_app_attr(control);
-
-static struct attribute *attr[] = {
-	&control_attr.attr,
-	NULL,
-};
-
-static const struct attribute_group attr_group = {
-	.attrs = attr,
-};
-
-static int __init test_app_init(void)
-{
-	struct kobject *kobj = kobject_create_and_add("test_app2", NULL);
-
-	if (!kobj) {
-		pr_err("kobject create fail\n");
-		return -ENOMEM;
-	}
-	if (sysfs_create_group(kobj, &attr_group)) {
-		pr_err("sysfs create fail\n");
-		return -EFAULT;
-	}
-	return 0;
-}
-
-module_init(test_app_init);
-
-MODULE_DESCRIPTION("high frequency manager test");
-MODULE_AUTHOR("Hongxu Zhao <hongxu.zhao@mediatek.com>");
-MODULE_LICENSE("GPL v2");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/Kconfig
deleted file mode 100644
index ecb7f31..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/Kconfig
+++ /dev/null
@@ -1,18 +0,0 @@
-config MTK_SENSOR_SUPPORT
-	tristate "MTK_SENSOR_SUPPORT"
-	help
-		Sensor config for sensor feature in project.
-		Please say y here if you want to support sensors
-		with mediatek sesnor architecture.
-		If unsure, say N.
-
-source "drivers/misc/mediatek/sensors-1.0/accelerometer/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/alsps/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/gyroscope/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/magnetometer/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/hwmon/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/barometer/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/step_counter/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/sensorHub/Kconfig"
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/Makefile
deleted file mode 100644
index 3e6a9f9..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-ifneq ($(CONFIG_MTK_SENSOR_SUPPORT), n)
-obj-$(CONFIG_CUSTOM_KERNEL_SENSORHUB)	+= sensorHub/
-obj-$(CONFIG_MTK_HWMON)	    += hwmon/
-obj-y += sensor_probe/
-obj-$(CONFIG_CUSTOM_KERNEL_ALSPS) += alsps/
-ifeq ($(CONFIG_CUSTOM_KERNEL_ACCELGYRO),y)
-obj-y += accelgyro/
-else
-obj-$(CONFIG_CUSTOM_KERNEL_ACCELEROMETER) += accelerometer/
-obj-$(CONFIG_CUSTOM_KERNEL_GYROSCOPE) += gyroscope/
-endif
-obj-$(CONFIG_CUSTOM_KERNEL_MAGNETOMETER) += magnetometer/
-obj-$(CONFIG_CUSTOM_KERNEL_BAROMETER) += barometer/
-obj-$(CONFIG_CUSTOM_KERNEL_STEP_COUNTER)	+= step_counter/
-obj-$(CONFIG_CUSTOM_KERNEL_SIGNIFICANT_MOTION_SENSOR)	+= step_counter/
-obj-$(CONFIG_CUSTOM_KERNEL_SITUATION) += situation/
-else
-obj-y += dummy.o
-endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/Kconfig
deleted file mode 100644
index 770be71..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/Kconfig
+++ /dev/null
@@ -1,24 +0,0 @@
-
-config MTK_AUTO_DETECT_ACCELEROMETER
-	bool "MTK AUTO DETECT ACCELEROMETER Sensor"
-	depends on MTK_SENSOR_SUPPORT
-	help
-	  one load to support different accelerometer sensor.
-	  If this option is set, multiple accelerometer driver
-	  can be configured at the same time, but only one
-	  can be probed.
-
-config CUSTOM_KERNEL_ACCELEROMETER
-	bool "CUSTOM KERNEL ACCELEROMETER Config"
-	help
-	  accelerometer sensor to detect accelerometer from x y z axis.
-	  If the platform is supported for acceleometer, this
-	  configuration should be configured, and the acceleometer
-	  driver configuration should be configured as well.
-
-source "drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/accelerometer/bmi160-i2c/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/accelerometer/lis3dh/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/accelerometer/mc3410-i2c/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/accelerometer/mc3433/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/accelerometer/mpu6050g/Kconfig"
\ No newline at end of file
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/Makefile
deleted file mode 100644
index 542e4e4..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-# In case the platform does NOT support this type of sensors
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/include
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)   +=  accel_common.o
-accel_common-$(CONFIG_MTK_SENSOR_SUPPORT) := accel.o accel_factory.o
-
-obj-$(CONFIG_MTK_ACCELHUB) += accelhub/
-#obj-$(CONFIG_MTK_BMI160_I2C)   += bmi160-i2c/
-#obj-$(CONFIG_MTK_LIS3DH_NEW) += lis3dh/
-#obj-$(CONFIG_MTK_MC3410_I2C) += mc3410-i2c/
-#obj-$(CONFIG_MTK_MC3433) += mc3433/
-#obj-$(CONFIG_MTK_MPU6050G) += mpu6050g/
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accel.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accel.c
deleted file mode 100644
index 6caf589..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accel.c
+++ /dev/null
@@ -1,871 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<ACCELEROMETER> " fmt
-#include "inc/accel.h"
-#include "inc/accel_factory.h"
-#include "sensor_performance.h"
-#include <linux/vmalloc.h>
-
-struct acc_context *acc_context_obj /* = NULL*/;
-
-static struct acc_init_info *gsensor_init_list[MAX_CHOOSE_G_NUM] = {0};
-
-static int64_t getCurNS(void)
-{
-	int64_t ns;
-	struct timespec time;
-
-	time.tv_sec = time.tv_nsec = 0;
-	get_monotonic_boottime(&time);
-	ns = time.tv_sec * 1000000000LL + time.tv_nsec;
-
-	return ns;
-}
-
-static void initTimer(struct hrtimer *timer,
-		      enum hrtimer_restart (*callback)(struct hrtimer *))
-{
-	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
-	timer->function = callback;
-}
-
-static void startTimer(struct hrtimer *timer, int delay_ms, bool first)
-{
-	struct acc_context *obj = (struct acc_context *)container_of(timer,
-		struct acc_context, hrTimer);
-	static int count;
-
-	if (obj == NULL) {
-		pr_err("NULL pointer\n");
-		return;
-	}
-
-	if (first) {
-		obj->target_ktime =
-			ktime_add_ns(ktime_get(), (int64_t)delay_ms * 1000000);
-		/* pr_debug("%d, cur_nt = %lld, delay_ms = %d,
-		 * target_nt = %lld\n",count, getCurNT(),
-		 * delay_ms, ktime_to_us(obj->target_ktime));
-		 */
-		count = 0;
-	} else {
-		do {
-			obj->target_ktime = ktime_add_ns(
-				obj->target_ktime, (int64_t)delay_ms * 1000000);
-		} while (ktime_to_ns(obj->target_ktime) <
-			 ktime_to_ns(ktime_get()));
-		/* pr_debug("%d, cur_nt = %lld, delay_ms = %d,
-		 * target_nt = %lld\n",
-		 *  count, getCurNT(), delay_ms,
-		 * ktime_to_us(obj->target_ktime));
-		 */
-		count++;
-	}
-
-	hrtimer_start(timer, obj->target_ktime, HRTIMER_MODE_ABS);
-}
-
-#ifndef CONFIG_NANOHUB
-static void stopTimer(struct hrtimer *timer)
-{
-	hrtimer_cancel(timer);
-}
-#endif
-static void acc_work_func(struct work_struct *work)
-{
-	struct acc_context *cxt = NULL;
-	int x, y, z, status;
-	int64_t pre_ns, cur_ns;
-	int64_t delay_ms;
-	int err;
-
-	cxt = acc_context_obj;
-	delay_ms = atomic_read(&cxt->delay);
-
-	if (cxt->acc_data.get_data == NULL) {
-		pr_err("acc driver not register data path\n");
-		return;
-	}
-
-	cur_ns = getCurNS();
-
-	err = cxt->acc_data.get_data(&x, &y, &z, &status);
-
-	if (err) {
-		pr_err("get acc data fails!!\n");
-		goto acc_loop;
-	} else {
-		if (0 == x && 0 == y && 0 == z)
-			goto acc_loop;
-
-		cxt->drv_data.x = x;
-		cxt->drv_data.y = y;
-		cxt->drv_data.z = z;
-		cxt->drv_data.status = status;
-		pre_ns = cxt->drv_data.timestamp;
-		cxt->drv_data.timestamp = cur_ns;
-	}
-
-	if (true == cxt->is_first_data_after_enable) {
-		pre_ns = cur_ns;
-		cxt->is_first_data_after_enable = false;
-		/* filter -1 value */
-		if (cxt->drv_data.x == ACC_INVALID_VALUE ||
-		    cxt->drv_data.y == ACC_INVALID_VALUE ||
-		    cxt->drv_data.z == ACC_INVALID_VALUE) {
-			pr_debug(" read invalid data\n");
-			goto acc_loop;
-		}
-	}
-	/* report data to input device */
-	/* printk("new acc work run....\n"); */
-	/* pr_debug("acc data[%d,%d,%d]\n" ,cxt->drv_data.acc_data.values[0],*/
-	/* cxt->drv_data.acc_data.values[1],cxt->drv_data.acc_data.values[2]);*/
-
-	while ((cur_ns - pre_ns) >= delay_ms * 1800000LL) {
-		struct acc_data tmp_data = cxt->drv_data;
-
-		pre_ns += delay_ms * 1000000LL;
-		tmp_data.timestamp = pre_ns;
-		acc_data_report(&tmp_data);
-	}
-
-	acc_data_report(&cxt->drv_data);
-
-acc_loop:
-	if (true == cxt->is_polling_run)
-		startTimer(&cxt->hrTimer, atomic_read(&cxt->delay), false);
-}
-
-enum hrtimer_restart acc_poll(struct hrtimer *timer)
-{
-	struct acc_context *obj = (struct acc_context *)container_of(timer,
-		struct acc_context, hrTimer);
-
-	queue_work(obj->accel_workqueue, &obj->report);
-
-	/* pr_debug("cur_ns = %lld\n", getCurNS()); */
-
-	return HRTIMER_NORESTART;
-}
-
-static struct acc_context *acc_context_alloc_object(void)
-{
-
-	struct acc_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-
-	pr_debug("%s start\n", __func__);
-	if (!obj) {
-		pr_err("Alloc accel object error!\n");
-		return NULL;
-	}
-	atomic_set(&obj->delay, 200); /*5Hz,set work queue delay time 200ms */
-	atomic_set(&obj->wake, 0);
-	INIT_WORK(&obj->report, acc_work_func);
-	obj->accel_workqueue = NULL;
-	obj->accel_workqueue = create_workqueue("accel_polling");
-	if (!obj->accel_workqueue) {
-		kfree(obj);
-		return NULL;
-	}
-	initTimer(&obj->hrTimer, acc_poll);
-	obj->is_active_nodata = false;
-	obj->is_active_data = false;
-	obj->is_first_data_after_enable = false;
-	obj->is_polling_run = false;
-	mutex_init(&obj->acc_op_mutex);
-	obj->is_batch_enable = false; /* for batch mode init */
-	obj->cali_sw[ACC_AXIS_X] = 0;
-	obj->cali_sw[ACC_AXIS_Y] = 0;
-	obj->cali_sw[ACC_AXIS_Z] = 0;
-	obj->power = 0;
-	obj->enable = 0;
-	obj->delay_ns = -1;
-	obj->latency_ns = -1;
-	pr_debug("%s end\n", __func__);
-	return obj;
-}
-
-#ifndef CONFIG_NANOHUB
-static int acc_enable_and_batch(void)
-{
-	struct acc_context *cxt = acc_context_obj;
-	int err;
-
-	/* power on -> power off */
-	if (cxt->power == 1 && cxt->enable == 0) {
-		pr_debug("ACC disable\n");
-		/* stop polling firstly, if needed */
-		if (cxt->is_active_data == false &&
-		    cxt->acc_ctl.is_report_input_direct == false &&
-		    cxt->is_polling_run == true) {
-			smp_mb(); /* for memory barrier */
-			stopTimer(&cxt->hrTimer);
-			smp_mb(); /* for memory barrier */
-			cancel_work_sync(&cxt->report);
-			cxt->drv_data.x = ACC_INVALID_VALUE;
-			cxt->drv_data.y = ACC_INVALID_VALUE;
-			cxt->drv_data.z = ACC_INVALID_VALUE;
-			cxt->is_polling_run = false;
-			pr_debug("acc stop polling done\n");
-		}
-		/* turn off the power */
-		if (cxt->is_active_data == false &&
-		    cxt->is_active_nodata == false) {
-			err = cxt->acc_ctl.enable_nodata(0);
-			if (err) {
-				pr_err("acc turn off power err:%d\n", err);
-				return -1;
-			}
-			pr_debug("acc turn off power done\n");
-		}
-
-		cxt->power = 0;
-		cxt->delay_ns = -1;
-		pr_debug("ACC disable done\n");
-		return 0;
-	}
-	/* power off -> power on */
-	if (cxt->power == 0 && cxt->enable == 1) {
-		pr_debug("ACC power on\n");
-		if (true == cxt->is_active_data ||
-		    true == cxt->is_active_nodata) {
-			err = cxt->acc_ctl.enable_nodata(1);
-			if (err) {
-				pr_err("acc turn on power err = %d\n", err);
-				return -1;
-			}
-			pr_debug("acc turn on power done\n");
-		}
-		cxt->power = 1;
-		pr_debug("ACC power on done\n");
-	}
-	/* rate change */
-	if (cxt->power == 1 && cxt->delay_ns >= 0) {
-		pr_debug("ACC set batch\n");
-		/* set ODR, fifo timeout latency */
-		if (cxt->acc_ctl.is_support_batch)
-			err = cxt->acc_ctl.batch(0, cxt->delay_ns,
-						 cxt->latency_ns);
-		else
-			err = cxt->acc_ctl.batch(0, cxt->delay_ns, 0);
-		if (err) {
-			pr_err("acc set batch(ODR) err %d\n", err);
-			return -1;
-		}
-		pr_debug("acc set ODR, fifo latency done\n");
-		/* start polling, if needed */
-		if (cxt->is_active_data == true &&
-		    cxt->acc_ctl.is_report_input_direct == false) {
-			uint64_t mdelay = cxt->delay_ns;
-
-			do_div(mdelay, 1000000);
-			atomic_set(&cxt->delay, mdelay);
-			/* the first sensor start polling timer */
-			if (cxt->is_polling_run == false) {
-				cxt->is_polling_run = true;
-				cxt->is_first_data_after_enable = true;
-				startTimer(&cxt->hrTimer,
-					   atomic_read(&cxt->delay), true);
-			}
-			pr_debug("acc set polling delay %d ms\n",
-				atomic_read(&cxt->delay));
-		}
-		pr_debug("ACC batch done\n");
-	}
-	return 0;
-}
-#endif
-static ssize_t accenablenodata_store(struct device *dev,
-				       struct device_attribute *attr,
-				       const char *buf, size_t count)
-{
-#if !defined(CONFIG_MTK_SCP_SENSORHUB_V1) && !defined(CONFIG_NANOHUB)
-	struct acc_context *cxt = acc_context_obj;
-	int err = 0;
-
-	pr_debug("acc_store_enable nodata buf=%s\n", buf);
-	mutex_lock(&acc_context_obj->acc_op_mutex);
-	if (!strncmp(buf, "1", 1)) {
-		cxt->enable = 1;
-		cxt->is_active_nodata = true;
-	} else if (!strncmp(buf, "0", 1)) {
-		cxt->enable = 0;
-		cxt->is_active_nodata = false;
-	} else {
-		pr_err(" acc_store enable nodata cmd error !!\n");
-		err = -1;
-		goto err_out;
-	}
-	err = acc_enable_and_batch();
-err_out:
-	mutex_unlock(&acc_context_obj->acc_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-#else
-	return count;
-#endif
-}
-
-static ssize_t accenablenodata_show(struct device *dev,
-				      struct device_attribute *attr, char *buf)
-{
-	int len = 0;
-
-	pr_debug(" not support now\n");
-	return len;
-}
-
-static ssize_t accactive_store(struct device *dev,
-				struct device_attribute *attr, const char *buf,
-				size_t count)
-{
-	struct acc_context *cxt = acc_context_obj;
-	int err = 0;
-
-	pr_debug("%s buf=%s\n", __func__, buf);
-	mutex_lock(&acc_context_obj->acc_op_mutex);
-	if (!strncmp(buf, "1", 1)) {
-		cxt->enable = 1;
-		cxt->is_active_data = true;
-	} else if (!strncmp(buf, "0", 1)) {
-		cxt->enable = 0;
-		cxt->is_active_data = false;
-	} else {
-		pr_err("%s error !!\n", __func__);
-		err = -1;
-		goto err_out;
-	}
-#ifdef CONFIG_NANOHUB
-	if (true == cxt->is_active_data || true == cxt->is_active_nodata) {
-		err = cxt->acc_ctl.enable_nodata(1);
-		if (err) {
-			pr_err("acc turn on power err = %d\n", err);
-			goto err_out;
-		}
-		pr_debug("acc turn on power done\n");
-	} else {
-		err = cxt->acc_ctl.enable_nodata(0);
-		if (err) {
-			pr_err("acc turn off power err = %d\n", err);
-			goto err_out;
-		}
-		pr_debug("acc turn off power done\n");
-	}
-#else
-	err = acc_enable_and_batch();
-#endif
-
-err_out:
-	mutex_unlock(&acc_context_obj->acc_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-/*----------------------------------------------------------------------------*/
-static ssize_t accactive_show(struct device *dev,
-			       struct device_attribute *attr, char *buf)
-{
-	struct acc_context *cxt = acc_context_obj;
-	int div = 0;
-
-	div = cxt->acc_data.vender_div;
-	pr_debug("acc vender_div value: %d\n", div);
-	return snprintf(buf, PAGE_SIZE, "%d\n", div);
-}
-
-/* need work around again */
-static ssize_t accdevnum_show(struct device *dev,
-				     struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t accbatch_store(struct device *dev,
-			       struct device_attribute *attr, const char *buf,
-			       size_t count)
-{
-	struct acc_context *cxt = acc_context_obj;
-	int handle = 0, flag = 0, err = 0;
-
-	pr_debug("%s %s\n", __func__, buf);
-	err = sscanf(buf, "%d,%d,%lld,%lld", &handle, &flag, &cxt->delay_ns,
-		     &cxt->latency_ns);
-	if (err != 4) {
-		pr_err("%s param error: err = %d\n", __func__, err);
-		return -1;
-	}
-
-	mutex_lock(&acc_context_obj->acc_op_mutex);
-
-#ifdef CONFIG_NANOHUB
-	if (cxt->acc_ctl.is_support_batch)
-		err = cxt->acc_ctl.batch(0, cxt->delay_ns, cxt->latency_ns);
-	else
-		err = cxt->acc_ctl.batch(0, cxt->delay_ns, 0);
-	if (err)
-		pr_err("acc set batch(ODR) err %d\n", err);
-#else
-	err = acc_enable_and_batch();
-#endif
-
-	mutex_unlock(&acc_context_obj->acc_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-static ssize_t accbatch_show(struct device *dev, struct device_attribute *attr,
-			      char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-static ssize_t accflush_store(struct device *dev,
-			       struct device_attribute *attr, const char *buf,
-			       size_t count)
-{
-	struct acc_context *cxt = NULL;
-	int handle = 0, err = 0;
-
-	err = kstrtoint(buf, 10, &handle);
-	if (err != 0)
-		pr_err("%s param error: err = %d\n", __func__, err);
-
-	pr_debug("%s param: handle %d\n", __func__, handle);
-
-	mutex_lock(&acc_context_obj->acc_op_mutex);
-	cxt = acc_context_obj;
-	if (cxt->acc_ctl.flush != NULL)
-		err = cxt->acc_ctl.flush();
-	else
-		pr_err("DON'T SUPPORT ACC COMMON VERSION FLUSH\n");
-	if (err < 0)
-		pr_err("acc enable flush err %d\n", err);
-	mutex_unlock(&acc_context_obj->acc_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t accflush_show(struct device *dev, struct device_attribute *attr,
-			      char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t acccali_show(struct device *dev, struct device_attribute *attr,
-			     char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t acccali_store(struct device *dev, struct device_attribute *attr,
-			      const char *buf, size_t count)
-{
-	struct acc_context *cxt = NULL;
-	int err = 0;
-	uint8_t *cali_buf = NULL;
-
-	cali_buf = vzalloc(count);
-	if (cali_buf == NULL)
-		return -EFAULT;
-	memcpy(cali_buf, buf, count);
-
-	mutex_lock(&acc_context_obj->acc_op_mutex);
-	cxt = acc_context_obj;
-	if (cxt->acc_ctl.set_cali != NULL)
-		err = cxt->acc_ctl.set_cali(cali_buf, count);
-	else
-		pr_err("DON'T SUPPORT ACC COMMONVERSION FLUSH\n");
-	if (err < 0)
-		pr_err("acc set cali err %d\n", err);
-	mutex_unlock(&acc_context_obj->acc_op_mutex);
-	vfree(cali_buf);
-	return count;
-}
-
-static int gsensor_remove(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static int gsensor_probe(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-#ifdef CONFIG_OF
-static const struct of_device_id gsensor_of_match[] = {
-	{
-		.compatible = "mediatek,gsensor",
-	},
-	{},
-};
-#endif
-static struct platform_driver gsensor_driver = {
-	.probe = gsensor_probe,
-	.remove = gsensor_remove,
-	.driver = {
-		.name = "gsensor",
-#ifdef CONFIG_OF
-		.of_match_table = gsensor_of_match,
-#endif
-	}
-};
-
-static int acc_real_driver_init(void)
-{
-	int i = 0;
-	int err = 0;
-
-	pr_debug("%s start\n", __func__);
-	for (i = 0; i < MAX_CHOOSE_G_NUM; i++) {
-		pr_debug(" i=%d\n", i);
-		if (gsensor_init_list[i] != 0) {
-			pr_debug(" acc try to init driver %s\n",
-				gsensor_init_list[i]->name);
-			err = gsensor_init_list[i]->init();
-			if (err == 0) {
-				pr_debug(" acc real driver %s probe ok\n",
-					gsensor_init_list[i]->name);
-				break;
-			}
-		}
-	}
-
-	if (i == MAX_CHOOSE_G_NUM) {
-		pr_debug("%s fail\n", __func__);
-		err = -1;
-	}
-	return err;
-}
-
-static int acc_real_driver_uninit(void)
-{
-	int i = 0;
-	int err = 0;
-
-	pr_debug("%s start\n", __func__);
-	for (i = 0; i < MAX_CHOOSE_G_NUM; i++) {
-		pr_debug(" i=%d\n", i);
-		if (gsensor_init_list[i] != 0) {
-			pr_debug(" acc try to init driver %s\n",
-				gsensor_init_list[i]->name);
-			err = gsensor_init_list[i]->uninit();
-			if (err == 0) {
-				pr_debug(" acc real driver %s uninit ok\n",
-					gsensor_init_list[i]->name);
-				break;
-			}
-		}
-	}
-
-	if (i == MAX_CHOOSE_G_NUM) {
-		pr_debug("%s fail\n", __func__);
-		err = -1;
-	}
-	return err;
-}
-
-int acc_driver_add(struct acc_init_info *obj)
-{
-	int err = 0;
-	int i = 0;
-
-	if (!obj) {
-		pr_err("ACC driver add fail, acc_init_info is NULL\n");
-		return -1;
-	}
-	for (i = 0; i < MAX_CHOOSE_G_NUM; i++) {
-		if ((i == 0) && (gsensor_init_list[0] == NULL)) {
-			pr_debug("register gensor driver for the first time\n");
-			if (platform_driver_register(&gsensor_driver))
-				pr_err("failed: driveralready exist\n");
-		}
-
-		if (gsensor_init_list[i] == NULL) {
-			obj->platform_diver_addr = &gsensor_driver;
-			gsensor_init_list[i] = obj;
-			break;
-		}
-	}
-	if (i >= MAX_CHOOSE_G_NUM) {
-		pr_err("ACC driver add err\n");
-		err = -1;
-	}
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(acc_driver_add);
-
-static int accel_open(struct inode *inode, struct file *file)
-{
-	nonseekable_open(inode, file);
-	return 0;
-}
-
-static ssize_t accel_read(struct file *file, char __user *buffer, size_t count,
-			  loff_t *ppos)
-{
-	ssize_t read_cnt = 0;
-
-	read_cnt = sensor_event_read(acc_context_obj->mdev.minor, file, buffer,
-				     count, ppos);
-
-	return read_cnt;
-}
-
-static unsigned int accel_poll(struct file *file, poll_table *wait)
-{
-	return sensor_event_poll(acc_context_obj->mdev.minor, file, wait);
-}
-
-static const struct file_operations accel_fops = {
-	.owner = THIS_MODULE,
-	.open = accel_open,
-	.read = accel_read,
-	.poll = accel_poll,
-};
-
-static int acc_misc_init(struct acc_context *cxt)
-{
-	int err = 0;
-
-	cxt->mdev.minor = ID_ACCELEROMETER;
-	cxt->mdev.name = ACC_MISC_DEV_NAME;
-	cxt->mdev.fops = &accel_fops;
-	err = sensor_attr_register(&cxt->mdev);
-	if (err)
-		pr_err("unable to register acc misc device!!\n");
-	return err;
-}
-
-DEVICE_ATTR_RW(accenablenodata);
-DEVICE_ATTR_RW(accactive);
-DEVICE_ATTR_RW(accbatch);
-DEVICE_ATTR_RW(accflush);
-DEVICE_ATTR_RW(acccali);
-DEVICE_ATTR_RO(accdevnum);
-
-static struct attribute *acc_attributes[] = {
-	&dev_attr_accenablenodata.attr,
-	&dev_attr_accactive.attr,
-	&dev_attr_accbatch.attr,
-	&dev_attr_accflush.attr,
-	&dev_attr_acccali.attr,
-	&dev_attr_accdevnum.attr,
-	NULL
-};
-
-static struct attribute_group acc_attribute_group = {
-	.attrs = acc_attributes
-};
-
-int acc_register_data_path(struct acc_data_path *data)
-{
-	struct acc_context *cxt = NULL;
-
-	cxt = acc_context_obj;
-	cxt->acc_data.get_data = data->get_data;
-	cxt->acc_data.get_raw_data = data->get_raw_data;
-	cxt->acc_data.vender_div = data->vender_div;
-	pr_debug("acc register data path vender_div: %d\n",
-		cxt->acc_data.vender_div);
-	if (cxt->acc_data.get_data == NULL) {
-		pr_debug("acc register data path fail\n");
-		return -1;
-	}
-	return 0;
-}
-EXPORT_SYMBOL_GPL(acc_register_data_path);
-
-int acc_register_control_path(struct acc_control_path *ctl)
-{
-	struct acc_context *cxt = NULL;
-	int err = 0;
-
-	cxt = acc_context_obj;
-	cxt->acc_ctl.enable_nodata = ctl->enable_nodata;
-	cxt->acc_ctl.batch = ctl->batch;
-	cxt->acc_ctl.flush = ctl->flush;
-	cxt->acc_ctl.set_cali = ctl->set_cali;
-	cxt->acc_ctl.is_support_batch = ctl->is_support_batch;
-	cxt->acc_ctl.is_report_input_direct = ctl->is_report_input_direct;
-
-	if (cxt->acc_ctl.enable_nodata == NULL || cxt->acc_ctl.batch == NULL ||
-	    cxt->acc_ctl.flush == NULL) {
-		pr_debug("acc register control path fail\n");
-		return -1;
-	}
-	/* add misc dev for sensor hal control cmd */
-	err = acc_misc_init(acc_context_obj);
-	if (err) {
-		pr_err("unable to register acc misc device!!\n");
-		return -2;
-	}
-	err = sysfs_create_group(&acc_context_obj->mdev.this_device->kobj,
-				 &acc_attribute_group);
-	if (err < 0) {
-		pr_err("unable to create acc attribute file\n");
-		return -3;
-	}
-
-	kobject_uevent(&acc_context_obj->mdev.this_device->kobj, KOBJ_ADD);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(acc_register_control_path);
-
-int acc_data_report(struct acc_data *data)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.time_stamp = data->timestamp;
-	event.flush_action = DATA_ACTION;
-	event.status = data->status;
-	event.word[0] = data->x;
-	event.word[1] = data->y;
-	event.word[2] = data->z;
-	event.reserved = data->reserved[0];
-	/* pr_err("x:%d,y:%d,z:%d,time:%lld\n", data->x, data->y, data->z,
-	 * data->timestamp);
-	 */
-	if (event.reserved == 1)
-		mark_timestamp(ID_ACCELEROMETER, DATA_REPORT,
-			       ktime_get_boot_ns(), event.time_stamp);
-	err = sensor_input_event(acc_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(acc_data_report);
-
-int acc_bias_report(struct acc_data *data)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = BIAS_ACTION;
-	event.word[0] = data->x;
-	event.word[1] = data->y;
-	event.word[2] = data->z;
-	/* pr_err("x:%d,y:%d,z:%d,time:%lld\n", x, y, z, nt); */
-	err = sensor_input_event(acc_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(acc_bias_report);
-
-int acc_cali_report(struct acc_data *data)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = CALI_ACTION;
-	event.word[0] = data->x;
-	event.word[1] = data->y;
-	event.word[2] = data->z;
-	/* pr_err("x:%d,y:%d,z:%d,time:%lld\n", x, y, z, nt); */
-	err = sensor_input_event(acc_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(acc_cali_report);
-
-int acc_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	pr_debug_ratelimited("flush\n");
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(acc_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(acc_flush_report);
-
-int acc_probe(void)
-{
-
-	int err;
-
-	pr_debug("+++++++++++++accel_probe!!\n");
-
-	acc_context_obj = acc_context_alloc_object();
-	if (!acc_context_obj) {
-		err = -ENOMEM;
-		pr_err("unable to allocate devobj!\n");
-		goto exit_alloc_data_failed;
-	}
-	/* init real acceleration driver */
-	err = acc_real_driver_init();
-	if (err) {
-		pr_err("acc real driver init fail\n");
-		goto real_driver_init_fail;
-	}
-
-	pr_debug("----accel_probe OK !!\n");
-	return 0;
-
-real_driver_init_fail:
-	kfree(acc_context_obj);
-
-exit_alloc_data_failed:
-
-	pr_err("----accel_probe fail !!!\n");
-	return err;
-}
-EXPORT_SYMBOL_GPL(acc_probe);
-
-int acc_remove(void)
-{
-	int err = 0;
-
-	acc_real_driver_uninit();
-
-	sysfs_remove_group(&acc_context_obj->mdev.this_device->kobj,
-			   &acc_attribute_group);
-
-	err = sensor_attr_deregister(&acc_context_obj->mdev);
-	if (err)
-		pr_err("misc_deregister fail: %d\n", err);
-	kfree(acc_context_obj);
-
-	platform_driver_unregister(&gsensor_driver);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(acc_remove);
-
-static int __init acc_init(void)
-{
-	pr_debug("%s\n", __func__);
-
-	return 0;
-}
-
-static void __exit acc_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(acc_init);
-module_exit(acc_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("ACCELEROMETER device driver");
-MODULE_AUTHOR("Mediatek");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accel_factory.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accel_factory.c
deleted file mode 100644
index 61950c3..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accel_factory.c
+++ /dev/null
@@ -1,271 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<ACCEL_FAC> " fmt
-
-#include "inc/accel_factory.h"
-
-struct accel_factory_private {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct accel_factory_fops *fops;
-};
-
-static struct accel_factory_private accel_factory;
-
-static int acc_factory_open(struct inode *inode, struct file *file)
-{
-	return nonseekable_open(inode, file);
-}
-
-static int acc_factory_release(struct inode *inode, struct file *file)
-{
-	file->private_data = NULL;
-	return 0;
-}
-
-static long acc_factory_unlocked_ioctl(struct file *file, unsigned int cmd,
-				       unsigned long arg)
-{
-	void __user *ptr = (void __user *)arg;
-	int err = 0, status = 0;
-	uint32_t flag = 0;
-	char strbuf[64];
-	int32_t data_buf[3] = {0};
-	struct SENSOR_DATA sensor_data = {0};
-
-	if (_IOC_DIR(cmd) & _IOC_READ)
-		err = !access_ok(VERIFY_WRITE, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-	else if (_IOC_DIR(cmd) & _IOC_WRITE)
-		err = !access_ok(VERIFY_READ, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-
-	if (err) {
-		pr_err("access error: %08X, (%2d, %2d)\n", cmd,
-			   _IOC_DIR(cmd), _IOC_SIZE(cmd));
-		return -EFAULT;
-	}
-
-	switch (cmd) {
-	case GSENSOR_IOCTL_INIT:
-		if (copy_from_user(&flag, ptr, sizeof(flag)))
-			return -EFAULT;
-		if (accel_factory.fops != NULL &&
-		    accel_factory.fops->enable_sensor != NULL) {
-			err = accel_factory.fops->enable_sensor(flag, 5);
-			if (err < 0) {
-				pr_err("GSENSOR_IOCTL_INIT fail!\n");
-				return -EINVAL;
-			}
-			pr_debug("GSENSOR_IOCTL_INIT, enable: %d, s_p:%dms\n",
-				flag, 5);
-		} else {
-			pr_debug("GSENSOR_IOCTL_INIT NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GSENSOR_IOCTL_READ_CHIPINFO:
-		return 0;
-	case GSENSOR_IOCTL_READ_SENSORDATA:
-		if (accel_factory.fops != NULL &&
-		    accel_factory.fops->get_data != NULL) {
-			err = accel_factory.fops->get_data(data_buf, &status);
-			if (err < 0) {
-				pr_err(
-					"GSENSOR_READ_SENSORDATA read fail!\n");
-				return -EINVAL;
-			}
-			sprintf(strbuf, "%x %x %x", data_buf[0], data_buf[1],
-				data_buf[2]);
-			pr_debug("GSENSOR_READ_SENSORDATA read strbuf : (%s)!\n",
-				strbuf);
-			if (copy_to_user(ptr, strbuf, strlen(strbuf) + 1))
-				return -EFAULT;
-		} else {
-			pr_debug("GSENSOR_IOCTL_READ_SENSORDATA NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GSENSOR_IOCTL_READ_RAW_DATA:
-		if (accel_factory.fops != NULL &&
-		    accel_factory.fops->get_raw_data != NULL) {
-			err = accel_factory.fops->get_raw_data(data_buf);
-			if (err < 0) {
-				pr_err(
-					"GSENSOR_READ_RAW_DATA read fail!\n");
-				return -EINVAL;
-			}
-			sprintf(strbuf, "%x %x %x", data_buf[0], data_buf[1],
-				data_buf[2]);
-			pr_debug("GSENSOR_SENSORDATA_RAW read strbuf : (%s)!\n",
-				strbuf);
-			if (copy_to_user(ptr, strbuf, strlen(strbuf) + 1))
-				return -EFAULT;
-		} else {
-			pr_debug("GSENSOR_IOCTL_READ_SENSORDATA_RAW NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GSENSOR_IOCTL_SET_CALI:
-		if (copy_from_user(&sensor_data, ptr, sizeof(sensor_data)))
-			return -EFAULT;
-		data_buf[0] = sensor_data.x;
-		data_buf[1] = sensor_data.y;
-		data_buf[2] = sensor_data.z;
-		pr_debug("GSENSOR_IOCTL_SET_CALI: (%d, %d, %d)!\n", data_buf[0],
-			data_buf[1], data_buf[2]);
-		if (accel_factory.fops != NULL &&
-		    accel_factory.fops->set_cali != NULL) {
-			err = accel_factory.fops->set_cali(data_buf);
-			if (err < 0) {
-				pr_err("GSENSOR_IOCTL_SET_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_debug("GSENSOR_IOCTL_SET_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GSENSOR_IOCTL_CLR_CALI:
-		if (accel_factory.fops != NULL &&
-		    accel_factory.fops->clear_cali != NULL) {
-			err = accel_factory.fops->clear_cali();
-			if (err < 0) {
-				pr_err("GSENSOR_IOCTL_CLR_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("GSENSOR_IOCTL_CLR_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GSENSOR_IOCTL_GET_CALI:
-		if (accel_factory.fops != NULL &&
-		    accel_factory.fops->get_cali != NULL) {
-			err = accel_factory.fops->get_cali(data_buf);
-			if (err < 0) {
-				pr_err("GSENSOR_IOCTL_GET_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("GSENSOR_IOCTL_GET_CALI NULL\n");
-			return -EINVAL;
-		}
-		pr_debug("GSENSOR_IOCTL_GET_CALI: (%d, %d, %d)!\n", data_buf[0],
-			data_buf[1], data_buf[2]);
-		sensor_data.x = data_buf[0];
-		sensor_data.y = data_buf[1];
-		sensor_data.z = data_buf[2];
-		if (copy_to_user(ptr, &sensor_data, sizeof(sensor_data)))
-			return -EFAULT;
-		return 0;
-	case GSENSOR_IOCTL_ENABLE_CALI:
-		if (accel_factory.fops != NULL &&
-		    accel_factory.fops->enable_calibration != NULL) {
-			err = accel_factory.fops->enable_calibration();
-			if (err < 0) {
-				pr_err("GSENSOR_IOCTL_ENABLE_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("GSENSOR_IOCTL_ENABLE_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GSENSOR_IOCTL_SELF_TEST:
-		if (accel_factory.fops != NULL &&
-		    accel_factory.fops->do_self_test != NULL) {
-			err = accel_factory.fops->do_self_test();
-			if (err < 0) {
-				pr_err("GSENSOR_IOCTL_SELF_TEST FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("GSENSOR_IOCTL_SELF_TEST NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	default:
-		pr_err("unknown IOCTL: 0x%08x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-
-	return 0;
-}
-
-#if IS_ENABLED(CONFIG_COMPAT)
-static long compat_acc_factory_unlocked_ioctl(struct file *filp,
-					unsigned int cmd, unsigned long arg)
-{
-	if (!filp->f_op || !filp->f_op->unlocked_ioctl) {
-		pr_err(
-			"compat_ioctl has no f_op or no unlocked_ioctl.\n");
-		return -ENOTTY;
-	}
-
-	switch (cmd) {
-	case COMPAT_GSENSOR_IOCTL_INIT:
-	case COMPAT_GSENSOR_IOCTL_READ_CHIPINFO:
-	/* case COMPAT_GSENSOR_IOCTL_READ_GAIN: */
-	case COMPAT_GSENSOR_IOCTL_READ_RAW_DATA:
-	case COMPAT_GSENSOR_IOCTL_READ_SENSORDATA:
-	/* NVRAM will use below ioctl */
-	case COMPAT_GSENSOR_IOCTL_SET_CALI:
-	case COMPAT_GSENSOR_IOCTL_CLR_CALI:
-	case COMPAT_GSENSOR_IOCTL_GET_CALI:
-	case COMPAT_GSENSOR_IOCTL_ENABLE_CALI:
-	case COMPAT_GSENSOR_IOCTL_SELF_TEST:
-		pr_debug("compat_ioctl : GSENSOR_IOCTL command is 0x%x\n", cmd);
-		return filp->f_op->unlocked_ioctl(
-			filp, cmd, (unsigned long)compat_ptr(arg));
-
-	default:
-		pr_err("compat_ion_ioctl : No such command!! 0x%x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-}
-#endif
-/*----------------------------------------------------------------------------*/
-static const struct file_operations acc_factory_fops = {
-	.open = acc_factory_open,
-	.release = acc_factory_release,
-	.unlocked_ioctl = acc_factory_unlocked_ioctl,
-#if IS_ENABLED(CONFIG_COMPAT)
-	.compat_ioctl = compat_acc_factory_unlocked_ioctl,
-#endif
-};
-
-static struct miscdevice accel_factory_device = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = "gsensor",
-	.fops = &acc_factory_fops,
-};
-
-int accel_factory_device_register(struct accel_factory_public *dev)
-{
-	int err = 0;
-
-	if (!dev || !dev->fops)
-		return -1;
-	accel_factory.gain = dev->gain;
-	accel_factory.sensitivity = dev->sensitivity;
-	accel_factory.fops = dev->fops;
-	err = misc_register(&accel_factory_device);
-	if (err) {
-		pr_err("accel_factory_device register failed\n");
-		err = -1;
-	}
-	return err;
-}
-EXPORT_SYMBOL_GPL(accel_factory_device_register);
-
-int accel_factory_device_deregister(struct accel_factory_public *dev)
-{
-	accel_factory.fops = NULL;
-	misc_deregister(&accel_factory_device);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(accel_factory_device_deregister);
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/Kconfig
deleted file mode 100644
index 8c31fa7..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/Kconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-
-config MTK_ACCELHUB
-	bool "accelhub for MediaTek package"
-	help
-	  It support different accelerometer sensor.
-	  If this option is set,
-	  it will support
-	  sensorhub Accelerometer.
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/Makefile
deleted file mode 100644
index 71affd7..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/accelerometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/scp
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)	:=  accelhub.o
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/accelhub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/accelhub.c
deleted file mode 100644
index 46f36b2..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/accelhub.c
+++ /dev/null
@@ -1,921 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[Gsensor] " fmt
-
-#include "accelhub.h"
-#include "SCP_power_monitor.h"
-#include <SCP_sensorHub.h>
-#include <accel.h>
-#include <hwmsensor.h>
-
-#define DEBUG 1
-#define SW_CALIBRATION
-#define ACCELHUB_AXIS_X 0
-#define ACCELHUB_AXIS_Y 1
-#define ACCELHUB_AXIS_Z 2
-#define ACCELHUB_AXES_NUM 3
-#define ACCELHUB_DATA_LEN 6
-#define ACCELHUB_DEV_NAME                                                      \
-	"accel_hub_pl" /* name must different with accel accelhub */
-/* dadadadada */
-enum ACCELHUB_TRC {
-	ACCELHUB_TRC_FILTER = 0x01,
-	ACCELHUB_TRC_RAWDATA = 0x02,
-	ACCELHUB_TRC_IOCTL = 0x04,
-	ACCELHUB_TRC_CALI = 0X08,
-	ACCELHUB_TRC_INFO = 0X10,
-};
-struct accelhub_ipi_data {
-	/*misc */
-	atomic_t trace;
-	atomic_t suspend;
-	atomic_t selftest_status;
-	int32_t static_cali[ACCELHUB_AXES_NUM];
-	uint8_t static_cali_status;
-	int32_t dynamic_cali[ACCELHUB_AXES_NUM];
-	int direction;
-	struct work_struct init_done_work;
-	atomic_t scp_init_done;
-	atomic_t first_ready_after_boot;
-	bool factory_enable;
-	bool android_enable;
-	struct completion calibration_done;
-	struct completion selftest_done;
-};
-
-static struct acc_init_info accelhub_init_info;
-
-static struct accelhub_ipi_data *obj_ipi_data;
-
-static int gsensor_init_flag = -1;
-static DEFINE_SPINLOCK(calibration_lock);
-
-static int gsensor_get_data(int *x, int *y, int *z, int *status);
-
-int accelhub_SetPowerMode(bool enable)
-{
-	int err = 0;
-
-	err = sensor_enable_to_hub(ID_ACCELEROMETER, enable);
-	if (err < 0) {
-		pr_err("SCP_sensorHub_req_send fail!\n");
-		return err;
-	}
-	return err;
-}
-
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-static int accelhub_ReadCalibration(int dat[ACCELHUB_AXES_NUM])
-{
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	dat[ACCELHUB_AXIS_X] = obj->static_cali[ACCELHUB_AXIS_X];
-	dat[ACCELHUB_AXIS_Y] = obj->static_cali[ACCELHUB_AXIS_Y];
-	dat[ACCELHUB_AXIS_Z] = obj->static_cali[ACCELHUB_AXIS_Z];
-
-	return 0;
-}
-
-static int accelhub_ResetCalibration(void)
-{
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-	int err = 0;
-	unsigned char dat[2];
-
-	err = sensor_set_cmd_to_hub(ID_ACCELEROMETER, CUST_ACTION_RESET_CALI,
-				    dat);
-	if (err < 0) {
-		pr_err(
-			"sensor_set_cmd_to_hub fail, (ID: %d),(action: %d)\n",
-			ID_ACCELEROMETER, CUST_ACTION_RESET_CALI);
-	}
-
-	memset(obj->static_cali, 0x00, sizeof(obj->static_cali));
-
-	return err;
-}
-
-static int accelhub_ReadCalibrationEx(int act[ACCELHUB_AXES_NUM],
-				      int raw[ACCELHUB_AXES_NUM])
-{
-	/*raw: the raw calibration data; act: the actual calibration data */
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	raw[ACCELHUB_AXIS_X] = obj->static_cali[ACCELHUB_AXIS_X];
-	raw[ACCELHUB_AXIS_Y] = obj->static_cali[ACCELHUB_AXIS_Y];
-	raw[ACCELHUB_AXIS_Z] = obj->static_cali[ACCELHUB_AXIS_Z];
-
-	act[ACCELHUB_AXIS_X] = raw[ACCELHUB_AXIS_X];
-	act[ACCELHUB_AXIS_Y] = raw[ACCELHUB_AXIS_Y];
-	act[ACCELHUB_AXIS_Z] = raw[ACCELHUB_AXIS_Z];
-
-	return 0;
-}
-
-static int accelhub_WriteCalibration_scp(int dat[ACCELHUB_AXES_NUM])
-{
-	int err = 0;
-
-	err = sensor_set_cmd_to_hub(ID_ACCELEROMETER, CUST_ACTION_SET_CALI,
-				    dat);
-	if (err < 0)
-		pr_err(
-			"sensor_set_cmd_to_hub fail, (ID: %d),(action: %d)\n",
-			ID_ACCELEROMETER, CUST_ACTION_SET_CALI);
-	return err;
-}
-
-static int accelhub_WriteCalibration(int dat[ACCELHUB_AXES_NUM])
-{
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-	int err = 0;
-	int cali[ACCELHUB_AXES_NUM], raw[ACCELHUB_AXES_NUM];
-
-	err = accelhub_ReadCalibrationEx(cali, raw);
-	if (err) {
-		pr_err("read offset fail, %d\n", err);
-		return err;
-	}
-
-	pr_debug("OLDOFF: (%+3d %+3d %+3d), cali: (%+3d %+3d %+3d)\n",
-		raw[ACCELHUB_AXIS_X], raw[ACCELHUB_AXIS_Y],
-		raw[ACCELHUB_AXIS_Z], obj->static_cali[ACCELHUB_AXIS_X],
-		obj->static_cali[ACCELHUB_AXIS_Y],
-		obj->static_cali[ACCELHUB_AXIS_Z]);
-
-	err = accelhub_WriteCalibration_scp(dat);
-	if (err < 0) {
-		pr_err("accelhub_WriteCalibration_scp fail\n");
-		return err;
-	}
-	/*calculate the real offset expected by caller */
-	cali[ACCELHUB_AXIS_X] += dat[ACCELHUB_AXIS_X];
-	cali[ACCELHUB_AXIS_Y] += dat[ACCELHUB_AXIS_Y];
-	cali[ACCELHUB_AXIS_Z] += dat[ACCELHUB_AXIS_Z];
-
-	pr_debug("UPDATE: (%+3d %+3d %+3d)\n", dat[ACCELHUB_AXIS_X],
-		dat[ACCELHUB_AXIS_Y], dat[ACCELHUB_AXIS_Z]);
-
-	obj->static_cali[ACCELHUB_AXIS_X] = cali[ACCELHUB_AXIS_X];
-	obj->static_cali[ACCELHUB_AXIS_Y] = cali[ACCELHUB_AXIS_Y];
-	obj->static_cali[ACCELHUB_AXIS_Z] = cali[ACCELHUB_AXIS_Z];
-
-	return err;
-}
-#endif
-
-static int accelhub_ReadAllReg(char *buf, int bufsize)
-{
-	int err = 0;
-
-	err = accelhub_SetPowerMode(true);
-	if (err) {
-		pr_err("Power on accelhub error %d!\n", err);
-		return err;
-	}
-
-	/* register map */
-	return 0;
-}
-
-static int accelhub_ReadChipInfo(char *buf, int bufsize)
-{
-	u8 databuf[10];
-
-	memset(databuf, 0, sizeof(u8) * 10);
-
-	if ((buf == NULL) || (bufsize <= 30))
-		return -1;
-
-	sprintf(buf, "ACCELHUB Chip");
-	return 0;
-}
-
-static int accelhub_ReadSensorData(char *buf, int bufsize)
-{
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-	uint64_t time_stamp = 0;
-	struct data_unit_t data;
-	int acc[ACCELHUB_AXES_NUM];
-	int err = 0;
-	int status = 0;
-
-	if (atomic_read(&obj->suspend))
-		return -3;
-
-	if (buf == NULL)
-		return -1;
-	err = sensor_get_data_from_hub(ID_ACCELEROMETER, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!\n");
-		return err;
-	}
-	time_stamp = data.time_stamp;
-	acc[ACCELHUB_AXIS_X] = data.accelerometer_t.x;
-	acc[ACCELHUB_AXIS_Y] = data.accelerometer_t.y;
-	acc[ACCELHUB_AXIS_Z] = data.accelerometer_t.z;
-	status = data.accelerometer_t.status;
-
-	sprintf(buf, "%04x %04x %04x %04x", acc[ACCELHUB_AXIS_X],
-		acc[ACCELHUB_AXIS_Y], acc[ACCELHUB_AXIS_Z], status);
-	if (atomic_read(&obj->trace) & ACCELHUB_TRC_IOCTL)
-		pr_debug("gsensor data: %s!\n", buf);
-
-	return 0;
-}
-static ssize_t chipinfo_show(struct device_driver *ddri, char *buf)
-{
-	char strbuf[ACCELHUB_BUFSIZE];
-
-	accelhub_SetPowerMode(true);
-	msleep(50);
-
-	accelhub_ReadAllReg(strbuf, ACCELHUB_BUFSIZE);
-
-	accelhub_ReadChipInfo(strbuf, ACCELHUB_BUFSIZE);
-	return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
-}
-
-static ssize_t sensordata_show(struct device_driver *ddri, char *buf)
-{
-	char strbuf[ACCELHUB_BUFSIZE];
-
-	accelhub_ReadSensorData(strbuf, ACCELHUB_BUFSIZE);
-	return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
-}
-
-static ssize_t cali_show(struct device_driver *ddri, char *buf)
-{
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-	int len = 0;
-
-	len += snprintf(buf + len, PAGE_SIZE - len,
-			"[SW ][%d] (%+3d, %+3d, %+3d)\n", 1,
-			obj->static_cali[ACCELHUB_AXIS_X],
-			obj->static_cali[ACCELHUB_AXIS_Y],
-			obj->static_cali[ACCELHUB_AXIS_Z]);
-
-	return len;
-}
-
-static ssize_t trace_store(struct device_driver *ddri, const char *buf,
-				 size_t count)
-{
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-	int trace = 0;
-	int res = 0;
-
-	if (obj == NULL) {
-		pr_err("obj is null!!\n");
-		return 0;
-	}
-	if (sscanf(buf, "0x%x", &trace) == 1) {
-		atomic_set(&obj->trace, trace);
-		res = sensor_set_cmd_to_hub(ID_ACCELEROMETER,
-					    CUST_ACTION_SET_TRACE, &trace);
-		if (res < 0) {
-			pr_err(
-				"sensor_set_cmd_to_hub fail, (ID: %d),(action: %d)\n",
-				ID_ACCELEROMETER, CUST_ACTION_SET_TRACE);
-			return 0;
-		}
-	} else {
-		pr_err("invalid content: '%s', length = %zu\n", buf, count);
-		return 0;
-	}
-
-	return count;
-}
-
-static ssize_t chip_orientation_show(struct device_driver *ddri, char *buf)
-{
-	ssize_t _tLength = 0;
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	_tLength = snprintf(buf, PAGE_SIZE, "default direction = %d\n",
-			    obj->direction);
-
-	return _tLength;
-}
-
-static ssize_t chip_orientation_store(struct device_driver *ddri,
-				      const char *buf, size_t tCount)
-{
-	int _nDirection = 0, ret = 0;
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	if (obj == NULL)
-		return 0;
-	ret = kstrtoint(buf, 10, &_nDirection);
-	if (ret != 0) {
-		pr_debug("kstrtoint fail\n");
-		return 0;
-	}
-	obj->direction = _nDirection;
-	ret = sensor_set_cmd_to_hub(ID_ACCELEROMETER, CUST_ACTION_SET_DIRECTION,
-				    &_nDirection);
-	if (ret < 0) {
-		pr_err(
-			"sensor_set_cmd_to_hub fail, (ID: %d),(action: %d)\n",
-			ID_ACCELEROMETER, CUST_ACTION_SET_DIRECTION);
-		return 0;
-	}
-
-	pr_debug("[%s] set direction: %d\n", __func__, _nDirection);
-
-	return tCount;
-}
-
-static int gsensor_factory_enable_calibration(void);
-static ssize_t test_cali_store(struct device_driver *ddri, const char *buf,
-			       size_t tCount)
-{
-	int enable = 0, ret = 0;
-
-	ret = kstrtoint(buf, 10, &enable);
-	if (ret != 0) {
-		pr_debug("kstrtoint fail\n");
-		return 0;
-	}
-	if (enable == 1)
-		gsensor_factory_enable_calibration();
-	return tCount;
-}
-
-static DRIVER_ATTR_RO(chipinfo);
-static DRIVER_ATTR_RO(sensordata);
-static DRIVER_ATTR_RO(cali);
-static DRIVER_ATTR_WO(trace);
-static DRIVER_ATTR_RW(chip_orientation);
-static DRIVER_ATTR_WO(test_cali);
-
-static struct driver_attribute *accelhub_attr_list[] = {
-	&driver_attr_chipinfo,   /*chip information */
-	&driver_attr_sensordata, /*dump sensor data */
-	&driver_attr_cali,       /*show calibration data */
-	&driver_attr_trace,      /*trace log */
-	&driver_attr_chip_orientation,
-	&driver_attr_test_cali,
-};
-
-static int accelhub_create_attr(struct device_driver *driver)
-{
-	int idx, err = 0;
-	int num = (int)(ARRAY_SIZE(accelhub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++) {
-		err = driver_create_file(driver, accelhub_attr_list[idx]);
-		if (err != 0) {
-			pr_err("driver_create_file (%s) = %d\n",
-				   accelhub_attr_list[idx]->attr.name, err);
-			break;
-		}
-	}
-	return err;
-}
-
-static int accelhub_delete_attr(struct device_driver *driver)
-{
-	int idx, err = 0;
-	int num = (int)(ARRAY_SIZE(accelhub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++)
-		driver_remove_file(driver, accelhub_attr_list[idx]);
-
-	return err;
-}
-
-static void scp_init_work_done(struct work_struct *work)
-{
-	int err = 0;
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-#ifndef MTK_OLD_FACTORY_CALIBRATION
-	int32_t cfg_data[6] = {0};
-#endif
-
-	if (atomic_read(&obj->scp_init_done) == 0) {
-		pr_debug("scp is not ready to send cmd\n");
-		return;
-	}
-	if (atomic_xchg(&obj->first_ready_after_boot, 1) == 0)
-		return;
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	err = accelhub_WriteCalibration_scp(obj->static_cali);
-	if (err < 0)
-		pr_err("accelhub_WriteCalibration_scp fail\n");
-#else
-	spin_lock(&calibration_lock);
-	cfg_data[0] = obj->dynamic_cali[0];
-	cfg_data[1] = obj->dynamic_cali[1];
-	cfg_data[2] = obj->dynamic_cali[2];
-
-	cfg_data[3] = obj->static_cali[0];
-	cfg_data[4] = obj->static_cali[1];
-	cfg_data[5] = obj->static_cali[2];
-	spin_unlock(&calibration_lock);
-	err = sensor_cfg_to_hub(ID_ACCELEROMETER, (uint8_t *)cfg_data,
-				sizeof(cfg_data));
-	if (err < 0)
-		pr_err("sensor_cfg_to_hub fail\n");
-#endif
-}
-
-static int gsensor_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-	struct acc_data data;
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	data.x = event->accelerometer_t.x;
-	data.y = event->accelerometer_t.y;
-	data.z = event->accelerometer_t.z;
-	data.status = event->accelerometer_t.status;
-	data.timestamp = (int64_t)event->time_stamp;
-	data.reserved[0] = event->reserve[0];
-
-	if (event->flush_action == DATA_ACTION &&
-	    READ_ONCE(obj->android_enable) == true)
-		err = acc_data_report(&data);
-	else if (event->flush_action == FLUSH_ACTION)
-		err = acc_flush_report();
-	else if (event->flush_action == BIAS_ACTION) {
-		data.x = event->accelerometer_t.x_bias;
-		data.y = event->accelerometer_t.y_bias;
-		data.z = event->accelerometer_t.z_bias;
-		err = acc_bias_report(&data);
-		spin_lock(&calibration_lock);
-		obj->dynamic_cali[ACCELHUB_AXIS_X] =
-			event->accelerometer_t.x_bias;
-		obj->dynamic_cali[ACCELHUB_AXIS_Y] =
-			event->accelerometer_t.y_bias;
-		obj->dynamic_cali[ACCELHUB_AXIS_Z] =
-			event->accelerometer_t.z_bias;
-		spin_unlock(&calibration_lock);
-	} else if (event->flush_action == CALI_ACTION) {
-		data.x = event->accelerometer_t.x_bias;
-		data.y = event->accelerometer_t.y_bias;
-		data.z = event->accelerometer_t.z_bias;
-		if (event->accelerometer_t.status == 0)
-			err = acc_cali_report(&data);
-		spin_lock(&calibration_lock);
-		obj->static_cali[ACCELHUB_AXIS_X] =
-			event->accelerometer_t.x_bias;
-		obj->static_cali[ACCELHUB_AXIS_Y] =
-			event->accelerometer_t.y_bias;
-		obj->static_cali[ACCELHUB_AXIS_Z] =
-			event->accelerometer_t.z_bias;
-		obj->static_cali_status =
-			(uint8_t)event->accelerometer_t.status;
-		spin_unlock(&calibration_lock);
-		complete(&obj->calibration_done);
-	} else if (event->flush_action == TEST_ACTION) {
-		atomic_set(&obj->selftest_status,
-			event->accelerometer_t.status);
-		complete(&obj->selftest_done);
-	}
-	return err;
-}
-static int gsensor_factory_enable_sensor(bool enabledisable,
-					 int64_t sample_periods_ms)
-{
-	int err = 0;
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	if (enabledisable == true)
-		WRITE_ONCE(obj->factory_enable, true);
-	else
-		WRITE_ONCE(obj->factory_enable, false);
-	if (enabledisable == true) {
-		err = sensor_set_delay_to_hub(ID_ACCELEROMETER,
-					      sample_periods_ms);
-		if (err) {
-			pr_err("sensor_set_delay_to_hub failed!\n");
-			return -1;
-		}
-	}
-	err = sensor_enable_to_hub(ID_ACCELEROMETER, enabledisable);
-	if (err) {
-		pr_err("sensor_enable_to_hub failed!\n");
-		return -1;
-	}
-	return 0;
-}
-static int gsensor_factory_get_data(int32_t data[3], int *status)
-{
-	return gsensor_get_data(&data[0], &data[1], &data[2], status);
-}
-static int gsensor_factory_get_raw_data(int32_t data[3])
-{
-	pr_debug("%s don't support!\n", __func__);
-	return 0;
-}
-static int gsensor_factory_enable_calibration(void)
-{
-	return sensor_calibration_to_hub(ID_ACCELEROMETER);
-}
-static int gsensor_factory_clear_cali(void)
-{
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	int err = 0;
-
-	err = accelhub_ResetCalibration();
-	if (err) {
-		pr_err("gsensor_ResetCalibration failed!\n");
-		return -1;
-	}
-#endif
-	return 0;
-}
-static int gsensor_factory_set_cali(int32_t data[3])
-{
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	int err = 0;
-
-	err = accelhub_WriteCalibration(data);
-	if (err) {
-		pr_err("gsensor_WriteCalibration failed!\n");
-		return -1;
-	}
-#endif
-	return 0;
-}
-static int gsensor_factory_get_cali(int32_t data[3])
-{
-	int err = 0;
-#ifndef MTK_OLD_FACTORY_CALIBRATION
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-	uint8_t status = 0;
-#endif
-
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	err = accelhub_ReadCalibration(data);
-	if (err) {
-		pr_err("gsensor_ReadCalibration failed!\n");
-		return -1;
-	}
-#else
-	err = wait_for_completion_timeout(&obj->calibration_done,
-					  msecs_to_jiffies(3000));
-	if (!err) {
-		pr_err("%s fail!\n", __func__);
-		return -1;
-	}
-	spin_lock(&calibration_lock);
-	data[ACCELHUB_AXIS_X] = obj->static_cali[ACCELHUB_AXIS_X];
-	data[ACCELHUB_AXIS_Y] = obj->static_cali[ACCELHUB_AXIS_Y];
-	data[ACCELHUB_AXIS_Z] = obj->static_cali[ACCELHUB_AXIS_Z];
-	status = obj->static_cali_status;
-	spin_unlock(&calibration_lock);
-	if (status != 0) {
-		pr_debug("gsensor static cali detect shake!\n");
-		return -2;
-	}
-#endif
-	return 0;
-}
-static int gsensor_factory_do_self_test(void)
-{
-	int ret = 0;
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	ret = sensor_selftest_to_hub(ID_ACCELEROMETER);
-	if (ret < 0)
-		return -1;
-
-	ret = wait_for_completion_timeout(&obj->selftest_done,
-					  msecs_to_jiffies(3000));
-	if (!ret)
-		return -1;
-	return atomic_read(&obj->selftest_status);
-}
-
-static struct accel_factory_fops gsensor_factory_fops = {
-	.enable_sensor = gsensor_factory_enable_sensor,
-	.get_data = gsensor_factory_get_data,
-	.get_raw_data = gsensor_factory_get_raw_data,
-	.enable_calibration = gsensor_factory_enable_calibration,
-	.clear_cali = gsensor_factory_clear_cali,
-	.set_cali = gsensor_factory_set_cali,
-	.get_cali = gsensor_factory_get_cali,
-	.do_self_test = gsensor_factory_do_self_test,
-};
-
-static struct accel_factory_public gsensor_factory_device = {
-	.gain = 1,
-	.sensitivity = 1,
-	.fops = &gsensor_factory_fops,
-};
-
-static int gsensor_open_report_data(int open)
-{
-
-	return 0;
-}
-
-static int gsensor_enable_nodata(int en)
-{
-	int err = 0;
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	if (en == true)
-		WRITE_ONCE(obj->android_enable, true);
-	else
-		WRITE_ONCE(obj->android_enable, false);
-
-	if (atomic_read(&obj->suspend) == 0) {
-		err = accelhub_SetPowerMode(en);
-		if (err < 0) {
-			pr_err("scp_gsensor_enable_nodata fail!\n");
-			return -1;
-		}
-	}
-
-	pr_debug("scp_gsensor_enable_nodata OK!!!\n");
-	return 0;
-}
-
-static int gsensor_set_delay(u64 ns)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	int err = 0;
-	unsigned int delayms = 0;
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	delayms = (unsigned int)ns / 1000 / 1000;
-	err = sensor_set_delay_to_hub(ID_ACCELEROMETER, delayms);
-	if (err < 0) {
-		pr_err("%s fail!\n", __func__);
-		return err;
-	}
-	pr_debug("%s (%d)\n", __func__, delayms);
-	return 0;
-#elif defined CONFIG_NANOHUB
-	return 0;
-#else
-	return 0;
-#endif
-}
-
-static int gsensor_batch(int flag, int64_t samplingPeriodNs,
-			 int64_t maxBatchReportLatencyNs)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	gsensor_set_delay(samplingPeriodNs);
-#endif
-	return sensor_batch_to_hub(ID_ACCELEROMETER, flag, samplingPeriodNs,
-				   maxBatchReportLatencyNs);
-}
-
-static int gsensor_flush(void)
-{
-	return sensor_flush_to_hub(ID_ACCELEROMETER);
-}
-
-static int gsensor_set_cali(uint8_t *data, uint8_t count)
-{
-	int32_t *buf = (int32_t *)data;
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	spin_lock(&calibration_lock);
-	obj->dynamic_cali[0] = buf[0];
-	obj->dynamic_cali[1] = buf[1];
-	obj->dynamic_cali[2] = buf[2];
-
-	obj->static_cali[0] = buf[3];
-	obj->static_cali[1] = buf[4];
-	obj->static_cali[2] = buf[5];
-	spin_unlock(&calibration_lock);
-
-	return sensor_cfg_to_hub(ID_ACCELEROMETER, data, count);
-}
-
-static int gsensor_get_data(int *x, int *y, int *z, int *status)
-{
-	int err = 0;
-	char buff[ACCELHUB_BUFSIZE];
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	err = accelhub_ReadSensorData(buff, ACCELHUB_BUFSIZE);
-	if (err < 0) {
-		pr_err("accelhub_ReadSensorData fail!!\n");
-		return -1;
-	}
-	err = sscanf(buff, "%x %x %x %x", x, y, z, status);
-	if (err != 4) {
-		pr_err("sscanf fail!!\n");
-		return -1;
-	}
-
-	if (atomic_read(&obj->trace) & ACCELHUB_TRC_RAWDATA)
-		pr_debug("x = %d, y = %d, z = %d\n", *x, *y, *z);
-
-	return 0;
-}
-
-static int scp_ready_event(uint8_t event, void *ptr)
-{
-	struct accelhub_ipi_data *obj = obj_ipi_data;
-
-	switch (event) {
-	case SENSOR_POWER_UP:
-		atomic_set(&obj->scp_init_done, 1);
-		schedule_work(&obj->init_done_work);
-		break;
-	case SENSOR_POWER_DOWN:
-		atomic_set(&obj->scp_init_done, 0);
-		break;
-	}
-	return 0;
-}
-
-static struct scp_power_monitor scp_ready_notifier = {
-	.name = "accel",
-	.notifier_call = scp_ready_event,
-};
-
-static int accelhub_probe(struct platform_device *pdev)
-{
-	struct accelhub_ipi_data *obj;
-	struct acc_control_path ctl = {0};
-	struct acc_data_path data = {0};
-	int err = 0;
-
-	pr_debug("%s\n", __func__);
-	obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-	if (!obj) {
-		err = -ENOMEM;
-		goto exit;
-	}
-
-	memset(obj, 0, sizeof(struct accelhub_ipi_data));
-
-	INIT_WORK(&obj->init_done_work, scp_init_work_done);
-
-	obj_ipi_data = obj;
-
-	platform_set_drvdata(pdev, obj);
-
-	atomic_set(&obj->trace, 0);
-	atomic_set(&obj->suspend, 0);
-	atomic_set(&obj->scp_init_done, 0);
-	atomic_set(&obj->first_ready_after_boot, 0);
-	atomic_set(&obj->selftest_status, 0);
-	WRITE_ONCE(obj->factory_enable, false);
-	WRITE_ONCE(obj->android_enable, false);
-	init_completion(&obj->calibration_done);
-	init_completion(&obj->selftest_done);
-	scp_power_monitor_register(&scp_ready_notifier);
-	err = scp_sensorHub_data_registration(ID_ACCELEROMETER,
-					      gsensor_recv_data);
-	if (err < 0) {
-		pr_err("scp_sensorHub_data_registration failed\n");
-		goto exit_kfree;
-	}
-	err = accel_factory_device_register(&gsensor_factory_device);
-	if (err) {
-		pr_err("gsensor_factory_device register failed\n");
-		goto exit_kfree;
-	}
-	err = accelhub_create_attr(
-		&accelhub_init_info.platform_diver_addr->driver);
-	if (err) {
-		pr_err("create attribute err = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-
-	ctl.open_report_data = gsensor_open_report_data;
-	ctl.enable_nodata = gsensor_enable_nodata;
-	ctl.set_delay = gsensor_set_delay;
-	ctl.batch = gsensor_batch;
-	ctl.flush = gsensor_flush;
-	ctl.set_cali = gsensor_set_cali;
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	ctl.is_report_input_direct = true;
-	ctl.is_support_batch = false;
-#elif defined CONFIG_NANOHUB
-	ctl.is_report_input_direct = true;
-	ctl.is_support_batch = true;
-#else
-#endif
-	err = acc_register_control_path(&ctl);
-	if (err) {
-		pr_err("register acc control path err\n");
-		goto exit_create_attr_failed;
-	}
-
-	data.get_data = gsensor_get_data;
-	data.vender_div = 1000;
-	err = acc_register_data_path(&data);
-	if (err) {
-		pr_err("register acc data path err\n");
-		goto exit_create_attr_failed;
-	}
-	gsensor_init_flag = 0;
-	pr_debug("%s: OK\n", __func__);
-	return 0;
-
-exit_create_attr_failed:
-	accelhub_delete_attr(&(accelhub_init_info.platform_diver_addr->driver));
-exit_kfree:
-	kfree(obj);
-	obj_ipi_data = NULL;
-exit:
-	pr_err("%s: err = %d\n", __func__, err);
-	gsensor_init_flag = -1;
-	return err;
-}
-
-static int accelhub_remove(struct platform_device *pdev)
-{
-	int err = 0;
-
-	err = accelhub_delete_attr(
-		&accelhub_init_info.platform_diver_addr->driver);
-	if (err)
-		pr_err("accelhub_delete_attr fail: %d\n", err);
-	accel_factory_device_deregister(&gsensor_factory_device);
-
-	kfree(platform_get_drvdata(pdev));
-	return 0;
-}
-
-static int accelhub_suspend(struct platform_device *pdev, pm_message_t msg)
-{
-	return 0;
-}
-
-static int accelhub_resume(struct platform_device *pdev)
-{
-	return 0;
-}
-
-static struct platform_device accelhub_device = {
-	.name = ACCELHUB_DEV_NAME, .id = -1,
-};
-
-static struct platform_driver accelhub_driver = {
-	.driver = {
-
-			.name = ACCELHUB_DEV_NAME,
-		},
-	.probe = accelhub_probe,
-	.remove = accelhub_remove,
-	.suspend = accelhub_suspend,
-	.resume = accelhub_resume,
-};
-
-static int gsensor_local_init(void)
-{
-	pr_debug("%s\n", __func__);
-
-	if (platform_driver_register(&accelhub_driver)) {
-		pr_err("add driver error\n");
-		return -1;
-	}
-	if (-1 == gsensor_init_flag)
-		return -1;
-	return 0;
-}
-
-static int gsensor_local_remove(void)
-{
-	pr_debug("%s\n", __func__);
-	platform_driver_unregister(&accelhub_driver);
-	return 0;
-}
-
-static struct acc_init_info accelhub_init_info = {
-	.name = "accelhub",
-	.init = gsensor_local_init,
-	.uninit = gsensor_local_remove,
-};
-
-static int __init accelhub_init(void)
-{
-
-	if (platform_device_register(&accelhub_device)) {
-		pr_err("accel platform device error\n");
-		return -1;
-	}
-	acc_driver_add(&accelhub_init_info);
-	return 0;
-}
-
-static void __exit accelhub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-module_init(accelhub_init);
-module_exit(accelhub_exit);
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("ACCELHUB gse driver");
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/accelhub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/accelhub.h
deleted file mode 100644
index 35191fe..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/accelhub/accelhub.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef ACCELHUB_H
-#define ACCELHUB_H
-
-#include <linux/ioctl.h>
-
-#define ACCELHUB_BUFSIZE 256
-#define ACCELHUB_AXES_NUM 3
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/inc/accel.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/inc/accel.h
deleted file mode 100644
index 70e6574..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/inc/accel.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __ACC_H__
-#define __ACC_H__
-
-#include "sensor_attr.h"
-#include <linux/input.h>
-#include <linux/interrupt.h>
-#include <linux/miscdevice.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-#include <linux/pm_wakeup.h>
-#include <linux/workqueue.h>
-
-#include <linux/atomic.h>
-#include <linux/delay.h>
-#include <linux/i2c.h>
-#include <linux/ioctl.h>
-#include <linux/irq.h>
-#include <linux/kobject.h>
-#include <linux/uaccess.h>
-
-#include "sensor_event.h"
-#include <hwmsen_helper.h>
-#include <hwmsensor.h>
-#include <linux/poll.h>
-#include <sensors_io.h>
-
-#include "accel_factory.h"
-
-#define OP_ACC_DELAY 0X01
-#define OP_ACC_ENABLE 0X02
-#define OP_ACC_GET_DATA 0X04
-
-#define ACC_INVALID_VALUE -1
-
-#define ACC_AXIS_X 0
-#define ACC_AXIS_Y 1
-#define ACC_AXIS_Z 2
-
-#define MAX_CHOOSE_G_NUM 5
-#define ACC_AXES_NUM 3
-struct acc_control_path {
-	int (*open_report_data)(int open);
-	int (*enable_nodata)(int en);
-	int (*set_delay)(u64 delay);
-	int (*batch)(int flag, int64_t samplingPeriodNs,
-		     int64_t maxBatchReportLatencyNs);
-	int (*flush)(void);
-	int (*set_cali)(uint8_t *data, uint8_t count);
-	bool is_report_input_direct;
-	bool is_support_batch;
-	bool is_use_common_factory;
-};
-
-struct acc_data_path {
-	int (*get_data)(int *x, int *y, int *z, int *status);
-	int (*get_raw_data)(int *x, int *y, int *z);
-	int vender_div;
-};
-
-struct acc_init_info {
-	char *name;
-	int (*init)(void);
-	int (*uninit)(void);
-	struct platform_driver *platform_diver_addr;
-};
-
-struct acc_data {
-	int8_t status;
-	int8_t reserved[3];
-	int x;
-	int y;
-	int z;
-	int64_t timestamp;
-	void *reserved1;
-} __packed;
-
-struct acc_drv_obj {
-	void *self;
-	int polling;
-	int (*acc_operate)(void *self, uint32_t command, void *buff_in,
-			   int size_in, void *buff_out, int size_out,
-			   int *actualout);
-};
-
-struct acc_context {
-	struct input_dev *idev;
-	struct sensor_attr_t mdev;
-	struct work_struct report;
-	struct mutex acc_op_mutex;
-	atomic_t delay; /*polling period for reporting input event*/
-	atomic_t wake;  /*user-space request to wake-up, used with stop*/
-	struct timer_list timer; /* polling timer */
-	struct hrtimer hrTimer;
-	ktime_t target_ktime;
-	atomic_t trace;
-	struct workqueue_struct *accel_workqueue;
-
-	atomic_t early_suspend;
-	/* struct acc_drv_obj    drv_obj; */
-	struct acc_data drv_data;
-	int cali_sw[ACC_AXES_NUM + 1];
-	struct acc_control_path acc_ctl;
-	struct acc_data_path acc_data;
-	/* Active, but HAL don't need data sensor. such as orientation need */
-	bool is_active_nodata;
-	bool is_active_data; /* Active and HAL need data . */
-	bool is_first_data_after_enable;
-	bool is_polling_run;
-	bool is_batch_enable; /* v2.judging whether sensor is in batch mode */
-	int power;
-	int enable;
-	int64_t delay_ns;
-	int64_t latency_ns;
-};
-
-/* for auto detect */
-extern int acc_driver_add(struct acc_init_info *obj);
-extern int acc_data_report(struct acc_data *data);
-extern int acc_bias_report(struct acc_data *data);
-extern int acc_cali_report(struct acc_data *data);
-extern int acc_flush_report(void);
-extern int acc_register_control_path(struct acc_control_path *ctl);
-extern int acc_register_data_path(struct acc_data_path *data);
-extern int acc_probe(void);
-extern int acc_remove(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/inc/accel_factory.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/inc/accel_factory.h
deleted file mode 100644
index ba7ebff..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/inc/accel_factory.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __ACC_FACTORY_H__
-#define __ACC_FACTORY_H__
-
-#include <linux/uaccess.h>
-#include <sensors_io.h>
-#include "cust_acc.h"
-#include "accel.h"
-
-struct accel_factory_fops {
-	int (*enable_sensor)(bool enable_disable, int64_t sample_periods_ms);
-	int (*get_data)(int32_t data[3], int *status);
-	int (*get_raw_data)(int32_t data[3]);
-	int (*enable_calibration)(void);
-	int (*clear_cali)(void);
-	int (*set_cali)(int32_t offset[3]);
-	int (*get_cali)(int32_t offset[3]);
-	int (*do_self_test)(void);
-};
-
-struct accel_factory_public {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct accel_factory_fops *fops;
-};
-int accel_factory_device_register(struct accel_factory_public *dev);
-int accel_factory_device_deregister(struct accel_factory_public *dev);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/inc/cust_acc.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/inc/cust_acc.h
deleted file mode 100644
index ac6fea0..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/accelerometer/inc/cust_acc.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __CUST_ACC_H__
-#define __CUST_ACC_H__
-
-#include <linux/of.h>
-#include <linux/types.h>
-#define G_CUST_I2C_ADDR_NUM 2
-
-struct acc_hw {
-	int i2c_num;   /*!< the i2c bus used by the chip */
-	int direction; /*!< the direction of the chip */
-	int power_id;  /*!< the VDD LDO ID of the chip */
-	int power_vol; /*!< the VDD Power Voltage used by the chip */
-	int firlen;    /*!< the length of low pass filter */
-	int (*power)(struct acc_hw *hw, unsigned int on, char *devname);
-	/*!< i2c address list,for chips which has different addresses with
-	 * different HW layout.
-	 */
-	unsigned char i2c_addr[G_CUST_I2C_ADDR_NUM];
-	int power_vio_id;  /*!< the VIO LDO ID of the chip */
-	int power_vio_vol; /*!< the VIO Power Voltage used by the chip */
-	bool is_batch_supported;
-};
-
-int get_accel_dts_func(struct device_node *node, struct acc_hw *hw);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/Kconfig
deleted file mode 100644
index e10ff91..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/Kconfig
+++ /dev/null
@@ -1,20 +0,0 @@
-
-config CUSTOM_KERNEL_ALSPS
-	bool "CUSTOM KERNEL ALSPS Config"
-	help
-	  ALSPS sensor driver to detect ambient light and the object is close
-	  or far awary from device. After configure this configuration,
-	  the specific ambient light and proximity sensor driver configuration
-	  should be configured as well.
-
-config MTK_AUTO_DETECT_ALSPS
-	bool "MTK AUTO DETECT ALSPS Sensor"
-	help
-	  This feature Option is used for projects which using more than one
-	  ALSPS sensors, more than one ALSPS drivers can be builded in to
-	  project and be auto detected by setting this option to yes,
-	  usually only one ALSPS driver can be probed.
-
-source "drivers/misc/mediatek/sensors-1.0/alsps/alspshub/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/alsps/cm36558/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/alsps/ltr303/Kconfig"
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/Makefile
deleted file mode 100644
index dfb08c9..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# In case the platform does NOT support this type of sensors
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)   +=  alsps_common.o
-alsps_common-$(CONFIG_MTK_SENSOR_SUPPORT) := alsps.o alsps_factory.o aal_control.o
-
-obj-$(CONFIG_MTK_ALSPSHUB)      +=  alspshub/
-#obj-$(CONFIG_MTK_CM36558)	+=  cm36558/
-#obj-$(CONFIG_MTK_LTR303)	+=  ltr303/
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/aal_control.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/aal_control.c
deleted file mode 100644
index 6246fb0..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/aal_control.c
+++ /dev/null
@@ -1,135 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[ALS/AAL]" fmt
-
-#include <linux/init.h>
-#include <linux/io.h>
-#include <linux/kernel.h>
-#include <linux/miscdevice.h>
-#include <linux/types.h>
-#include <linux/uaccess.h>
-
-#include "inc/aal_control.h"
-#include "inc/alsps.h"
-#include <sensors_io.h>
-
-int aal_use /* = 0*/;
-
-static int AAL_open(struct inode *inode, struct file *file)
-{
-	return nonseekable_open(inode, file);
-}
-
-static int AAL_release(struct inode *inode, struct file *file)
-{
-	file->private_data = NULL;
-	return 0;
-}
-
-static long AAL_unlocked_ioctl(struct file *file, unsigned int cmd,
-			       unsigned long arg)
-{
-	long err = 0;
-	void __user *ptr = (void __user *)arg;
-	int dat;
-	uint32_t enable;
-
-	switch (cmd) {
-
-	case AAL_SET_ALS_MODE:
-		if (copy_from_user(&enable, ptr, sizeof(enable))) {
-			err = -EFAULT;
-			goto err_out;
-		}
-
-		if (enable)
-			aal_use = 1;
-		else
-			aal_use = 0;
-
-		err = alsps_aal_enable(enable);
-		if (err)
-			pr_err(
-				"als driver don't support new arch, goto execute old arch: %ld\n",
-				err);
-		break;
-
-	case AAL_GET_ALS_MODE:
-		pr_debug("AAL_GET_ALS_MODE do nothing\n");
-		break;
-
-	case AAL_GET_ALS_DATA:
-		dat = alsps_aal_get_data();
-		/* pr_debug("Get als dat :%d\n", dat); */
-
-		if (copy_to_user(ptr, &dat, sizeof(dat))) {
-			err = -EFAULT;
-			goto err_out;
-		}
-		break;
-
-	default:
-		pr_err("%s not supported = 0x%04x", __func__, cmd);
-		err = -ENOIOCTLCMD;
-		break;
-	}
-
-err_out:
-	return err;
-}
-
-#ifdef CONFIG_COMPAT
-static long AAL_compact_ioctl(struct file *file, unsigned int cmd,
-			      unsigned long arg)
-{
-	void __user *data32;
-
-	data32 = compat_ptr(arg);
-	return AAL_unlocked_ioctl(file, cmd, (unsigned long)data32);
-}
-#endif
-
-static const struct file_operations AAL_fops = {
-	.owner = THIS_MODULE,
-	.open = AAL_open,
-	.release = AAL_release,
-	.unlocked_ioctl = AAL_unlocked_ioctl,
-#ifdef CONFIG_COMPAT
-	.compat_ioctl = AAL_compact_ioctl,
-#endif
-};
-
-static struct miscdevice AAL_device = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = "aal_als",
-	.fops = &AAL_fops,
-};
-
-/*----------------------------------------------------------------------------*/
-int __init AAL_init(void)
-{
-	int err;
-
-	err = misc_register(&AAL_device);
-	if (err)
-		pr_err("AAL_device misc_register failed: %d\n", err);
-
-	pr_debug("OK!\n");
-	return 0;
-}
-
-/*----------------------------------------------------------------------------*/
-void __exit AAL_exit(void)
-{
-	/*int err;*/
-
-	/*err = */ misc_deregister(&AAL_device);
-	/*	if (err)
-	 *	pr_err("AAL_device misc_deregister fail: %d\n", err);
-	 */
-
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alsps.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alsps.c
deleted file mode 100644
index 10b34e4..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alsps.c
+++ /dev/null
@@ -1,1321 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<ALS/PS> " fmt
-
-#include "inc/alsps.h"
-#include "inc/aal_control.h"
-struct alsps_context *alsps_context_obj /* = NULL*/;
-struct platform_device *pltfm_dev;
-int last_als_report_data = -1;
-
-/* AAL default delay timer(nano seconds)*/
-#define AAL_DELAY 200000000
-
-static struct alsps_init_info *alsps_init_list[MAX_CHOOSE_ALSPS_NUM] = {0};
-
-int als_data_report_t(int value, int status, int64_t time_stamp)
-{
-	int err = 0;
-	struct alsps_context *cxt = NULL;
-	struct sensor_event event;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	cxt = alsps_context_obj;
-	event.time_stamp = time_stamp;
-	/* pr_debug(" +als_data_report! %d, %d\n", value, status); */
-	/* force trigger data update after sensor enable. */
-	if (cxt->is_get_valid_als_data_after_enable == false) {
-		event.handle = ID_LIGHT;
-		event.flush_action = DATA_ACTION;
-		event.word[0] = value + 1;
-		err = sensor_input_event(cxt->als_mdev.minor, &event);
-		cxt->is_get_valid_als_data_after_enable = true;
-	}
-	if (value != last_als_report_data) {
-		event.handle = ID_LIGHT;
-		event.flush_action = DATA_ACTION;
-		event.word[0] = value;
-		event.status = status;
-		err = sensor_input_event(cxt->als_mdev.minor, &event);
-		if (err >= 0)
-			last_als_report_data = value;
-	}
-	return err;
-}
-EXPORT_SYMBOL_GPL(als_data_report_t);
-
-int als_data_report(int value, int status)
-{
-	return als_data_report_t(value, status, 0);
-}
-EXPORT_SYMBOL_GPL(als_data_report);
-
-int als_cali_report(int *value)
-{
-	int err = 0;
-	struct sensor_event event;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-	event.handle = ID_LIGHT;
-	event.flush_action = CALI_ACTION;
-	event.word[0] = value[0];
-	err = sensor_input_event(alsps_context_obj->als_mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(als_cali_report);
-
-int als_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.handle = ID_LIGHT;
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(alsps_context_obj->als_mdev.minor, &event);
-	pr_debug_ratelimited("flush\n");
-	return err;
-}
-EXPORT_SYMBOL_GPL(als_flush_report);
-
-int rgbw_data_report_t(int *value, int64_t time_stamp)
-{
-	int err = 0;
-	struct alsps_context *cxt = alsps_context_obj;
-	struct sensor_event event;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.handle = ID_RGBW;
-	event.flush_action = DATA_ACTION;
-	event.time_stamp = time_stamp;
-	event.word[0] = value[0];
-	event.word[1] = value[1];
-	event.word[2] = value[2];
-	event.word[3] = value[3];
-	err = sensor_input_event(cxt->als_mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(rgbw_data_report_t);
-
-int rgbw_data_report(int *value)
-{
-	return rgbw_data_report_t(value, 0);
-}
-int rgbw_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.handle = ID_RGBW;
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(alsps_context_obj->als_mdev.minor, &event);
-	pr_debug_ratelimited("flush\n");
-	return err;
-}
-EXPORT_SYMBOL_GPL(rgbw_flush_report);
-
-int ps_data_report_t(int value, int status, int64_t time_stamp)
-{
-	int err = 0;
-	struct sensor_event event;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	pr_notice("[ALS/PS]%s! %d, %d\n", __func__, value, status);
-	event.flush_action = DATA_ACTION;
-	event.time_stamp = time_stamp;
-	event.word[0] = value + 1;
-	event.status = status;
-	err = sensor_input_event(alsps_context_obj->ps_mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(ps_data_report_t);
-
-int ps_data_report(int value, int status)
-{
-	return ps_data_report_t(value, status, 0);
-}
-EXPORT_SYMBOL_GPL(ps_data_report);
-
-int ps_cali_report(int *value)
-{
-	int err = 0;
-	struct sensor_event event;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = CALI_ACTION;
-	event.word[0] = value[0];
-	event.word[1] = value[1];
-	err = sensor_input_event(alsps_context_obj->ps_mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(ps_cali_report);
-
-int ps_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(alsps_context_obj->ps_mdev.minor, &event);
-	pr_debug_ratelimited("flush\n");
-	return err;
-}
-EXPORT_SYMBOL_GPL(ps_flush_report);
-
-static void als_work_func(struct work_struct *work)
-{
-	struct alsps_context *cxt = NULL;
-	int value, status;
-	int64_t nt;
-	struct timespec time;
-	int err;
-
-	cxt = alsps_context_obj;
-	if (cxt->als_data.get_data == NULL) {
-		pr_err("alsps driver not register data path\n");
-		return;
-	}
-
-	time.tv_sec = time.tv_nsec = 0;
-	time = get_monotonic_coarse();
-	nt = time.tv_sec * 1000000000LL + time.tv_nsec;
-	/* add wake lock to make sure data can be read before system suspend */
-	err = cxt->als_data.get_data(&value, &status);
-	if (err) {
-		pr_err("get alsps data fails!!\n");
-		goto als_loop;
-	} else {
-		cxt->drv_data.als_data.values[0] = value;
-		cxt->drv_data.als_data.status = status;
-		cxt->drv_data.als_data.time = nt;
-	}
-
-	if (true == cxt->is_als_first_data_after_enable) {
-		cxt->is_als_first_data_after_enable = false;
-		/* filter -1 value */
-		if (cxt->drv_data.als_data.values[0] == ALSPS_INVALID_VALUE) {
-			pr_debug(" read invalid data\n");
-			goto als_loop;
-		}
-	}
-	/* pr_debug(" als data[%d]\n" , cxt->drv_data.als_data.values[0]); */
-	als_data_report(cxt->drv_data.als_data.values[0],
-			cxt->drv_data.als_data.status);
-
-als_loop:
-	if (true == cxt->is_als_polling_run)
-		mod_timer(&cxt->timer_als,
-			  jiffies + atomic_read(&cxt->delay_als) / (1000 / HZ));
-}
-
-static void ps_work_func(struct work_struct *work)
-{
-
-	struct alsps_context *cxt = NULL;
-	int value, status;
-	int64_t nt;
-	struct timespec time;
-	int err = 0;
-
-	cxt = alsps_context_obj;
-	if (cxt->ps_data.get_data == NULL) {
-		pr_err("alsps driver not register data path\n");
-		return;
-	}
-
-	time.tv_sec = time.tv_nsec = 0;
-	time = get_monotonic_coarse();
-	nt = time.tv_sec * 1000000000LL + time.tv_nsec;
-
-	/* add wake lock to make sure data can be read before system suspend */
-	err = cxt->ps_data.get_data(&value, &status);
-	if (err) {
-		pr_err("get alsps data fails!!\n");
-		goto ps_loop;
-	} else {
-		cxt->drv_data.ps_data.values[0] = value;
-		cxt->drv_data.ps_data.status = status;
-		cxt->drv_data.ps_data.time = nt;
-	}
-
-	if (true == cxt->is_ps_first_data_after_enable) {
-		cxt->is_ps_first_data_after_enable = false;
-		/* filter -1 value */
-		if (cxt->drv_data.ps_data.values[0] == ALSPS_INVALID_VALUE) {
-			pr_debug(" read invalid data\n");
-			goto ps_loop;
-		}
-	}
-
-	if (cxt->is_get_valid_ps_data_after_enable == false) {
-		if (cxt->drv_data.ps_data.values[0] != ALSPS_INVALID_VALUE)
-			cxt->is_get_valid_ps_data_after_enable = true;
-	}
-
-	ps_data_report(cxt->drv_data.ps_data.values[0],
-		       cxt->drv_data.ps_data.status);
-
-ps_loop:
-	if (true == cxt->is_ps_polling_run) {
-		if (cxt->ps_ctl.is_polling_mode ||
-		    (cxt->is_get_valid_ps_data_after_enable == false))
-			mod_timer(&cxt->timer_ps,
-				  jiffies +
-					  atomic_read(&cxt->delay_ps) /
-						  (1000 / HZ));
-	}
-}
-
-static void als_poll(struct timer_list *t)
-{
-	struct alsps_context *obj = from_timer(obj, t, timer_als);
-
-	if ((obj != NULL) && (obj->is_als_polling_run))
-		schedule_work(&obj->report_als);
-}
-
-static void ps_poll(struct timer_list *t)
-{
-	struct alsps_context *obj = from_timer(obj, t, timer_ps);
-
-	if (obj != NULL)
-		schedule_work(&obj->report_ps);
-}
-
-static struct alsps_context *alsps_context_alloc_object(void)
-{
-	struct alsps_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-
-	pr_debug("%s start\n", __func__);
-	if (!obj) {
-		pr_err("Alloc alsps object error!\n");
-		return NULL;
-	}
-	atomic_set(&obj->delay_als,
-		   200); /*5Hz, set work queue delay time 200ms */
-	atomic_set(&obj->delay_ps,
-		   200); /* 5Hz,  set work queue delay time 200ms */
-	atomic_set(&obj->wake, 0);
-	INIT_WORK(&obj->report_als, als_work_func);
-	INIT_WORK(&obj->report_ps, ps_work_func);
-	timer_setup(&obj->timer_als, als_poll, 0);
-	timer_setup(&obj->timer_ps, ps_poll, 0);
-	obj->timer_als.expires =
-		jiffies + atomic_read(&obj->delay_als) / (1000 / HZ);
-
-	obj->timer_ps.expires =
-		jiffies + atomic_read(&obj->delay_ps) / (1000 / HZ);
-
-	obj->is_als_first_data_after_enable = false;
-	obj->is_als_polling_run = false;
-	obj->is_ps_first_data_after_enable = false;
-	obj->is_ps_polling_run = false;
-	mutex_init(&obj->alsps_op_mutex);
-	obj->is_als_batch_enable = false; /* for batch mode init */
-	obj->is_ps_batch_enable = false;  /* for batch mode init */
-	obj->als_power = 0;
-	obj->als_enable = 0;
-	obj->als_delay_ns = -1;
-	obj->als_latency_ns = -1;
-	obj->ps_power = 0;
-	obj->ps_enable = 0;
-	obj->ps_delay_ns = -1;
-	obj->ps_latency_ns = -1;
-
-	pr_debug("%s end\n", __func__);
-	return obj;
-}
-
-#if !defined(CONFIG_NANOHUB) || !defined(CONFIG_MTK_ALSPSHUB)
-static int als_enable_and_batch(void)
-{
-	struct alsps_context *cxt = alsps_context_obj;
-	int err;
-
-	/* als_power on -> power off */
-	if (cxt->als_power == 1 && cxt->als_enable == 0) {
-		pr_debug("ALSPS disable\n");
-		/* stop polling firstly, if needed */
-		if (cxt->als_ctl.is_report_input_direct == false &&
-		    cxt->is_als_polling_run == true) {
-			smp_mb(); /* for memory barrier */
-			del_timer_sync(&cxt->timer_als);
-			smp_mb(); /* for memory barrier */
-			cancel_work_sync(&cxt->report_als);
-			cxt->drv_data.als_data.values[0] = ALSPS_INVALID_VALUE;
-			cxt->is_als_polling_run = false;
-			pr_debug("als stop polling done\n");
-		}
-		/* turn off the als_power */
-		err = cxt->als_ctl.enable_nodata(0);
-		if (err) {
-			pr_err("als turn off als_power err = %d\n", err);
-			return -1;
-		}
-		pr_debug("als turn off als_power done\n");
-
-		cxt->als_power = 0;
-		cxt->als_delay_ns = -1;
-		pr_debug("ALSPS disable done\n");
-		return 0;
-	}
-	/* als_power off -> power on */
-	if (cxt->als_power == 0 && cxt->als_enable == 1) {
-		pr_debug("ALSPS als_power on\n");
-		err = cxt->als_ctl.enable_nodata(1);
-		if (err) {
-			pr_err("als turn on als_power err = %d\n", err);
-			return -1;
-		}
-		pr_debug("als turn on als_power done\n");
-
-		cxt->als_power = 1;
-		pr_debug("ALSPS als_power on done\n");
-	}
-	/* rate change */
-	if (cxt->als_power == 1 && cxt->als_delay_ns >= 0) {
-		pr_debug("ALSPS set batch\n");
-		/* set ODR, fifo timeout latency */
-		if (cxt->als_ctl.is_support_batch)
-			err = cxt->als_ctl.batch(0, cxt->als_delay_ns,
-						 cxt->als_latency_ns);
-		else
-			err = cxt->als_ctl.batch(0, cxt->als_delay_ns, 0);
-		if (err) {
-			pr_err("als set batch(ODR) err %d\n", err);
-			return -1;
-		}
-		pr_debug("als set ODR, fifo latency done\n");
-		/* start polling, if needed */
-		if (cxt->als_ctl.is_report_input_direct == false) {
-			uint64_t mdelay = cxt->als_delay_ns;
-
-			do_div(mdelay, 1000000);
-			/* defaut max polling delay */
-			if (mdelay < 10)
-				mdelay = 10;
-			atomic_set(&cxt->delay_als, mdelay);
-			/* the first sensor start polling timer */
-			if (cxt->is_als_polling_run == false) {
-				mod_timer(&cxt->timer_als,
-					  jiffies +
-						  atomic_read(&cxt->delay_als) /
-							  (1000 / HZ));
-				cxt->is_als_polling_run = true;
-				cxt->is_als_first_data_after_enable = true;
-			}
-			pr_debug("als set polling delay %d ms\n",
-				  atomic_read(&cxt->delay_als));
-		}
-		pr_debug("ALSPS batch done\n");
-	}
-	return 0;
-}
-#endif
-
-static ssize_t alsactive_store(struct device *dev,
-				struct device_attribute *attr, const char *buf,
-				size_t count)
-{
-	struct alsps_context *cxt = alsps_context_obj;
-	int err = 0, handle = -1, en = 0;
-
-	err = sscanf(buf, "%d,%d", &handle, &en);
-	if (err < 0) {
-		pr_err("%s param error: err = %d\n", __func__, err);
-		return err;
-	}
-
-	pr_debug("%s buf=%s\n", __func__, buf);
-	mutex_lock(&alsps_context_obj->alsps_op_mutex);
-	if (handle == ID_LIGHT) {
-		if (en) {
-			cxt->als_enable = 1;
-			last_als_report_data = -1;
-		} else if (!en) {
-			cxt->als_enable = 0;
-		} else {
-			pr_err("alsps_store_active error !!\n");
-			err = -1;
-			goto err_out;
-		}
-#if defined(CONFIG_NANOHUB) && defined(CONFIG_MTK_ALSPSHUB)
-		if (cxt->als_enable) {
-			err = cxt->als_ctl.enable_nodata(cxt->als_enable);
-			if (err) {
-				pr_err("als turn on err = %d\n", err);
-				goto err_out;
-			}
-		} else {
-			err = cxt->als_ctl.enable_nodata(cxt->als_enable);
-			if (err) {
-				pr_err("als turn off err = %d\n", err);
-				goto err_out;
-			}
-		}
-#else
-		err = als_enable_and_batch();
-#endif
-	} else if (handle == ID_RGBW) {
-		if (en)
-			cxt->rgbw_enable = 1;
-		else if (!en)
-			cxt->rgbw_enable = 0;
-		else {
-			pr_err("alsps_store_active error !!\n");
-			err = -1;
-			goto err_out;
-		}
-#if defined(CONFIG_NANOHUB) && defined(CONFIG_MTK_ALSPSHUB)
-		if (cxt->rgbw_enable) {
-			err = cxt->als_ctl.rgbw_enable(cxt->rgbw_enable);
-			if (err) {
-				pr_err("rgbw turn on err = %d\n", err);
-				goto err_out;
-			}
-		} else {
-			err = cxt->als_ctl.rgbw_enable(cxt->rgbw_enable);
-			if (err) {
-				pr_err("rgbw turn off err = %d\n", err);
-				goto err_out;
-			}
-		}
-#endif
-	}
-
-err_out:
-	mutex_unlock(&alsps_context_obj->alsps_op_mutex);
-	pr_debug("%s done\n", __func__);
-	if (err)
-		return err;
-	else
-		return count;
-}
-/*----------------------------------------------------------------------------*/
-static ssize_t alsactive_show(struct device *dev,
-			       struct device_attribute *attr, char *buf)
-{
-	struct alsps_context *cxt = NULL;
-	int div = 0;
-
-	cxt = alsps_context_obj;
-	div = cxt->als_data.vender_div;
-	pr_debug("als vender_div value: %d\n", div);
-	return snprintf(buf, PAGE_SIZE, "%d\n", div);
-}
-
-static ssize_t alsbatch_store(struct device *dev,
-				struct device_attribute *attr, const char *buf,
-				size_t count)
-{
-	struct alsps_context *cxt = alsps_context_obj;
-	int handle = 0, flag = 0, err = 0;
-	int64_t delay_ns = 0;
-	int64_t latency_ns = 0;
-
-	pr_debug("%s %s\n", __func__, buf);
-	err = sscanf(buf, "%d,%d,%lld,%lld", &handle, &flag, &cxt->als_delay_ns,
-		     &cxt->als_latency_ns);
-	if (err != 4) {
-		pr_err("%s param error: err = %d\n", __func__, err);
-		return -1;
-	}
-
-	mutex_lock(&alsps_context_obj->alsps_op_mutex);
-	if (handle == ID_LIGHT) {
-#if defined(CONFIG_NANOHUB) && defined(CONFIG_MTK_ALSPSHUB)
-		if (cxt->als_ctl.is_support_batch)
-			err = cxt->als_ctl.batch(0, cxt->als_delay_ns,
-				cxt->als_latency_ns);
-		else
-			err = cxt->als_ctl.batch(0, cxt->als_delay_ns, 0);
-#else
-		err = als_enable_and_batch();
-#endif
-	} else if (handle == ID_RGBW) {
-		cxt->rgbw_delay_ns = delay_ns;
-		cxt->rgbw_latency_ns = latency_ns;
-#if defined(CONFIG_NANOHUB) && defined(CONFIG_MTK_ALSPSHUB)
-		if (cxt->als_ctl.is_support_batch)
-			err = cxt->als_ctl.rgbw_batch(0, cxt->rgbw_delay_ns,
-				cxt->rgbw_latency_ns);
-		else
-			err = cxt->als_ctl.rgbw_batch(0, cxt->rgbw_delay_ns, 0);
-#endif
-	}
-	mutex_unlock(&alsps_context_obj->alsps_op_mutex);
-	pr_debug("%s done: %d\n", __func__, cxt->is_als_batch_enable);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t alsbatch_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t alsflush_store(struct device *dev,
-			       struct device_attribute *attr, const char *buf,
-			       size_t count)
-{
-	struct alsps_context *cxt = NULL;
-	int handle = 0, err = 0;
-
-	err = kstrtoint(buf, 10, &handle);
-	if (err != 0)
-		pr_err("%s param error: err = %d\n", __func__, err);
-
-	pr_debug("%s param: handle %d\n", __func__, handle);
-
-	mutex_lock(&alsps_context_obj->alsps_op_mutex);
-	cxt = alsps_context_obj;
-	if (handle == ID_LIGHT) {
-		if (cxt->als_ctl.flush != NULL)
-			err = cxt->als_ctl.flush();
-		else
-			pr_err("DON'T SUPPORT ALS COMMON VERSION FLUSH\n");
-		if (err < 0)
-			pr_err("als enable flush err %d\n", err);
-	} else if (handle == ID_RGBW) {
-		if (cxt->als_ctl.rgbw_flush != NULL)
-			err = cxt->als_ctl.rgbw_flush();
-		else
-			pr_err("DON'T SUPPORT RGB COMMON VERSION FLUSH\n");
-		if (err < 0)
-			pr_err("rgbw enable flush err %d\n", err);
-	}
-	mutex_unlock(&alsps_context_obj->alsps_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t alsflush_show(struct device *dev,
-		struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-/* need work around again */
-static ssize_t alsdevnum_show(struct device *dev,
-			       struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-static ssize_t alscali_store(struct device *dev,
-	struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct alsps_context *cxt = NULL;
-	int err = 0;
-	uint8_t *cali_buf = NULL;
-
-	cali_buf = vzalloc(count);
-	if (!cali_buf)
-		return -ENOMEM;
-	memcpy(cali_buf, buf, count);
-
-	mutex_lock(&alsps_context_obj->alsps_op_mutex);
-	cxt = alsps_context_obj;
-	if (cxt->als_ctl.set_cali != NULL)
-		err = cxt->als_ctl.set_cali(cali_buf, count);
-	if (err < 0)
-		pr_err("als set cali err %d\n", err);
-	mutex_unlock(&alsps_context_obj->alsps_op_mutex);
-	vfree(cali_buf);
-	return count;
-}
-
-#if !defined(CONFIG_NANOHUB) || !defined(CONFIG_MTK_ALSPSHUB)
-static int ps_enable_and_batch(void)
-{
-	struct alsps_context *cxt = alsps_context_obj;
-	int err;
-
-	/* ps_power on -> power off */
-	if (cxt->ps_power == 1 && cxt->ps_enable == 0) {
-		pr_debug("PS disable\n");
-/* stop polling firstly, if needed */
-/*
- *		if (cxt->ps_ctl.is_report_input_direct == false
- *			&& cxt->is_ps_polling_run == true) {
- *			smp_mb();// for memory barrier
- *			del_timer_sync(&cxt->timer_ps);
- *			smp_mb();// for memory barrier
- *			cancel_work_sync(&cxt->report_ps);
- *			cxt->drv_data.ps_data.values[0] = ALSPS_INVALID_VALUE;
- *			cxt->is_ps_polling_run = false;
- *			pr_debug("ps stop polling done\n");
- *		}
- */
-		/* turn off the ps_power */
-		err = cxt->ps_ctl.enable_nodata(0);
-		if (err) {
-			pr_err("ps turn off ps_power err = %d\n", err);
-			return -1;
-		}
-		pr_debug("ps turn off ps_power done\n");
-
-		cxt->ps_power = 0;
-		cxt->ps_delay_ns = -1;
-		pr_debug("PS disable done\n");
-		return 0;
-	}
-	/* ps_power off -> power on */
-	if (cxt->ps_power == 0 && cxt->ps_enable == 1) {
-		pr_debug("PS ps_power on\n");
-		err = cxt->ps_ctl.enable_nodata(1);
-		if (err) {
-			pr_err("ps turn on ps_power err = %d\n", err);
-			return -1;
-		}
-		pr_debug("ps turn on ps_power done\n");
-
-		cxt->ps_power = 1;
-		pr_debug("PS ps_power on done\n");
-	}
-	/* rate change */
-	if (cxt->ps_power == 1 && cxt->ps_delay_ns >= 0) {
-		pr_debug("PS set batch\n");
-		/* set ODR, fifo timeout latency */
-		if (cxt->ps_ctl.is_support_batch)
-			err = cxt->ps_ctl.batch(0, cxt->ps_delay_ns,
-						cxt->ps_latency_ns);
-		else
-			err = cxt->ps_ctl.batch(0, cxt->ps_delay_ns, 0);
-		if (err) {
-			pr_err("ps set batch(ODR) err %d\n", err);
-			return -1;
-		}
-		pr_debug("ps set ODR, fifo latency done\n");
-/* start polling, if needed */
-/*		if (cxt->ps_ctl.is_report_input_direct == false) {
- *			int mdelay = cxt->ps_delay_ns;
- *
- *			do_div(mdelay, 1000000);
- *			atomic_set(&cxt->delay_ps, mdelay);
- *			if (cxt->is_ps_polling_run == false) {
- *				mod_timer(&cxt->timer_ps, jiffies +
- *					atomic_read(&cxt->delay_ps)/(1000/HZ));
- *				cxt->is_ps_polling_run = true;
- *				cxt->is_ps_first_data_after_enable = true;
- *			}
- *		pr_debug("ps delay %d ms\n", atomic_read(&cxt->delay_ps));
- *		} else {
- *			ps_data_report(1, 3);
- *		}
- */
-		pr_debug("PS batch done\n");
-	}
-	return 0;
-}
-#endif
-static ssize_t psactive_store(struct device *dev,
-			       struct device_attribute *attr, const char *buf,
-			       size_t count)
-{
-	struct alsps_context *cxt = alsps_context_obj;
-	int err = 0;
-
-	pr_debug("%s buf=%s\n", __func__, buf);
-	mutex_lock(&alsps_context_obj->alsps_op_mutex);
-
-	if (!strncmp(buf, "1", 1))
-		cxt->ps_enable = 1;
-	else if (!strncmp(buf, "0", 1))
-		cxt->ps_enable = 0;
-	else {
-		pr_err("%s error !!\n", __func__);
-		err = -1;
-		goto err_out;
-	}
-#if defined(CONFIG_NANOHUB) && defined(CONFIG_MTK_ALSPSHUB)
-	err = cxt->ps_ctl.enable_nodata(cxt->ps_enable);
-#else
-	err = ps_enable_and_batch();
-#endif
-err_out:
-	mutex_unlock(&alsps_context_obj->alsps_op_mutex);
-	pr_debug("%s done\n", __func__);
-	if (err)
-		return err;
-	else
-		return count;
-}
-/*----------------------------------------------------------------------------*/
-static ssize_t psactive_show(struct device *dev, struct device_attribute *attr,
-			      char *buf)
-{
-	struct alsps_context *cxt = NULL;
-	int div = 0;
-
-	cxt = alsps_context_obj;
-	div = cxt->ps_data.vender_div;
-	pr_debug("ps vender_div value: %d\n", div);
-	return snprintf(buf, PAGE_SIZE, "%d\n", div);
-}
-
-static ssize_t psbatch_store(struct device *dev, struct device_attribute *attr,
-			      const char *buf, size_t count)
-{
-	struct alsps_context *cxt = alsps_context_obj;
-	int handle = 0, flag = 0, err = 0;
-
-	pr_debug("%s %s\n", __func__, buf);
-	err = sscanf(buf, "%d,%d,%lld,%lld", &handle, &flag, &cxt->ps_delay_ns,
-		     &cxt->ps_latency_ns);
-	if (err != 4) {
-		pr_err("%s param error: err = %d\n", __func__, err);
-		return -1;
-	}
-
-	mutex_lock(&alsps_context_obj->alsps_op_mutex);
-#if defined(CONFIG_NANOHUB) && defined(CONFIG_MTK_ALSPSHUB)
-	if (cxt->ps_ctl.is_support_batch)
-		err = cxt->ps_ctl.batch(0, cxt->ps_delay_ns,
-					cxt->ps_latency_ns);
-	else
-		err = cxt->ps_ctl.batch(0, cxt->ps_delay_ns, 0);
-#else
-	err = ps_enable_and_batch();
-#endif
-	mutex_unlock(&alsps_context_obj->alsps_op_mutex);
-	pr_debug("%s done: %d\n", __func__, cxt->is_ps_batch_enable);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t psbatch_show(struct device *dev, struct device_attribute *attr,
-			     char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t psflush_store(struct device *dev, struct device_attribute *attr,
-			      const char *buf, size_t count)
-{
-	struct alsps_context *cxt = NULL;
-	int handle = 0, err = 0;
-
-	err = kstrtoint(buf, 10, &handle);
-	if (err != 0)
-		pr_err("%s param error: err = %d\n", __func__, err);
-
-	pr_debug("%s param: handle %d\n", __func__, handle);
-
-	mutex_lock(&alsps_context_obj->alsps_op_mutex);
-	cxt = alsps_context_obj;
-	if (cxt->ps_ctl.flush != NULL)
-		err = cxt->ps_ctl.flush();
-	if (err < 0)
-		pr_err("ps enable flush err %d\n", err);
-	mutex_unlock(&alsps_context_obj->alsps_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t psflush_show(struct device *dev, struct device_attribute *attr,
-			     char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-/* need work around again */
-static ssize_t psdevnum_show(struct device *dev, struct device_attribute *attr,
-			      char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t pscali_store(struct device *dev, struct device_attribute *attr,
-				  const char *buf, size_t count)
-{
-	struct alsps_context *cxt = NULL;
-	int err = 0;
-	uint8_t *cali_buf = NULL;
-
-	cali_buf = vzalloc(count);
-	if (!cali_buf)
-		return -ENOMEM;
-	memcpy(cali_buf, buf, count);
-
-	mutex_lock(&alsps_context_obj->alsps_op_mutex);
-	cxt = alsps_context_obj;
-	if (cxt->ps_ctl.set_cali != NULL)
-		err = cxt->ps_ctl.set_cali(cali_buf, count);
-	if (err < 0)
-		pr_err("ps set cali err %d\n", err);
-	mutex_unlock(&alsps_context_obj->alsps_op_mutex);
-	vfree(cali_buf);
-	return count;
-}
-
-static int als_ps_remove(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static int als_ps_probe(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	pltfm_dev = pdev;
-	return 0;
-}
-
-#ifdef CONFIG_OF
-static const struct of_device_id als_ps_of_match[] = {
-	{
-		.compatible = "mediatek,als_ps",
-	},
-	{},
-};
-#endif
-
-static struct platform_driver als_ps_driver = {
-	.probe = als_ps_probe,
-	.remove = als_ps_remove,
-	.driver = {
-
-		.name = "als_ps",
-#ifdef CONFIG_OF
-		.of_match_table = als_ps_of_match,
-#endif
-	}
-};
-
-static int alsps_real_driver_init(void)
-{
-	int i = 0;
-	int err = 0;
-
-	pr_debug("%s start\n", __func__);
-	for (i = 0; i < MAX_CHOOSE_ALSPS_NUM; i++) {
-		pr_debug("%s i=%d\n", __func__, i);
-		if (alsps_init_list[i] != 0) {
-			pr_debug(" alsps try to init driver %s\n",
-				  alsps_init_list[i]->name);
-			err = alsps_init_list[i]->init();
-			if (err == 0) {
-				pr_debug(" alsps real driver %s probe ok\n",
-					  alsps_init_list[i]->name);
-				break;
-			}
-		}
-	}
-
-	if (i == MAX_CHOOSE_ALSPS_NUM) {
-		pr_debug("%s fail\n", __func__);
-		err = -1;
-	}
-
-	return err;
-}
-
-int alsps_driver_add(struct alsps_init_info *obj)
-{
-	int err = 0;
-	int i = 0;
-
-	pr_debug("%s\n", __func__);
-
-	if (!obj) {
-		pr_err(
-			"ALSPS driver add fail, alsps_init_info is NULL\n");
-		return -1;
-	}
-
-	for (i = 0; i < MAX_CHOOSE_ALSPS_NUM; i++) {
-		if ((i == 0) && (alsps_init_list[0] == NULL)) {
-			pr_debug("register alsps driver for the first time\n");
-			if (platform_driver_register(&als_ps_driver))
-				pr_err(
-					"failed to register alsps driver already exist\n");
-		}
-
-		if (alsps_init_list[i] == NULL) {
-			obj->platform_diver_addr = &als_ps_driver;
-			alsps_init_list[i] = obj;
-			break;
-		}
-	}
-	if (i >= MAX_CHOOSE_ALSPS_NUM) {
-		pr_err("ALSPS driver add err\n");
-		err = -1;
-	}
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(alsps_driver_add);
-struct platform_device *get_alsps_platformdev(void)
-{
-	return pltfm_dev;
-}
-
-int ps_report_interrupt_data(int value)
-{
-	struct alsps_context *cxt = NULL;
-	/* int err =0; */
-	cxt = alsps_context_obj;
-	pr_notice("[ALS/PS] [%s]:value=%d\n", __func__, value);
-	if (cxt->is_get_valid_ps_data_after_enable == false) {
-		if (value != ALSPS_INVALID_VALUE) {
-			cxt->is_get_valid_ps_data_after_enable = true;
-			smp_mb(); /*for memory barriier*/
-			del_timer_sync(&cxt->timer_ps);
-			smp_mb(); /*for memory barriier*/
-			cancel_work_sync(&cxt->report_ps);
-		}
-	}
-
-	if (cxt->is_ps_batch_enable == false)
-		ps_data_report(value, 3);
-
-	return 0;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(ps_report_interrupt_data);
-DEVICE_ATTR_RW(alsactive);
-DEVICE_ATTR_RW(alsbatch);
-DEVICE_ATTR_RW(alsflush);
-DEVICE_ATTR_RO(alsdevnum);
-DEVICE_ATTR_WO(alscali);
-DEVICE_ATTR_RW(psactive);
-DEVICE_ATTR_RW(psbatch);
-DEVICE_ATTR_RW(psflush);
-DEVICE_ATTR_RO(psdevnum);
-DEVICE_ATTR_WO(pscali);
-
-static struct attribute *als_attributes[] = {
-	&dev_attr_alsactive.attr,
-	&dev_attr_alsbatch.attr,
-	&dev_attr_alsflush.attr,
-	&dev_attr_alsdevnum.attr,
-	&dev_attr_alscali.attr,
-	NULL
-};
-
-static struct attribute *ps_attributes[] = {
-	&dev_attr_psactive.attr,
-	&dev_attr_psbatch.attr,
-	&dev_attr_psflush.attr,
-	&dev_attr_psdevnum.attr,
-	&dev_attr_pscali.attr,
-	NULL
-};
-
-static struct attribute_group als_attribute_group = {
-	.attrs = als_attributes
-};
-
-static struct attribute_group ps_attribute_group = {
-	.attrs = ps_attributes
-};
-static int light_open(struct inode *inode, struct file *file)
-{
-	nonseekable_open(inode, file);
-	return 0;
-}
-
-static ssize_t light_read(struct file *file, char __user *buffer, size_t count,
-			  loff_t *ppos)
-{
-	ssize_t read_cnt = 0;
-
-	read_cnt = sensor_event_read(alsps_context_obj->als_mdev.minor, file,
-				     buffer, count, ppos);
-
-	return read_cnt;
-}
-
-static unsigned int light_poll(struct file *file, poll_table *wait)
-{
-	return sensor_event_poll(alsps_context_obj->als_mdev.minor, file, wait);
-}
-
-static const struct file_operations light_fops = {
-	.owner = THIS_MODULE,
-	.open = light_open,
-	.read = light_read,
-	.poll = light_poll,
-};
-
-static int als_misc_init(struct alsps_context *cxt)
-{
-	int err = 0;
-
-	cxt->als_mdev.minor = ID_LIGHT;
-	cxt->als_mdev.name = ALS_MISC_DEV_NAME;
-	cxt->als_mdev.fops = &light_fops;
-	err = sensor_attr_register(&cxt->als_mdev);
-	if (err)
-		pr_err("unable to register alsps misc device!!\n");
-
-	return err;
-}
-static int proximity_open(struct inode *inode, struct file *file)
-{
-	nonseekable_open(inode, file);
-	return 0;
-}
-
-static ssize_t proximity_read(struct file *file, char __user *buffer,
-			      size_t count, loff_t *ppos)
-{
-	ssize_t read_cnt = 0;
-
-	read_cnt = sensor_event_read(alsps_context_obj->ps_mdev.minor, file,
-				     buffer, count, ppos);
-
-	return read_cnt;
-}
-
-static unsigned int proximity_poll(struct file *file, poll_table *wait)
-{
-	return sensor_event_poll(alsps_context_obj->ps_mdev.minor, file, wait);
-}
-
-static const struct file_operations proximity_fops = {
-	.owner = THIS_MODULE,
-	.open = proximity_open,
-	.read = proximity_read,
-	.poll = proximity_poll,
-};
-
-static int ps_misc_init(struct alsps_context *cxt)
-{
-	int err = 0;
-
-	cxt->ps_mdev.minor = ID_PROXIMITY;
-	cxt->ps_mdev.name = PS_MISC_DEV_NAME;
-	cxt->ps_mdev.fops = &proximity_fops;
-	err = sensor_attr_register(&cxt->ps_mdev);
-	if (err)
-		pr_err("unable to register alsps misc device!!\n");
-
-	return err;
-}
-
-int als_register_data_path(struct als_data_path *data)
-{
-	struct alsps_context *cxt = NULL;
-	/* int err =0; */
-	cxt = alsps_context_obj;
-	cxt->als_data.get_data = data->get_data;
-	cxt->als_data.vender_div = data->vender_div;
-	cxt->als_data.als_get_raw_data = data->als_get_raw_data;
-	pr_debug("alsps register data path vender_div: %d\n",
-		  cxt->als_data.vender_div);
-	if (cxt->als_data.get_data == NULL) {
-		pr_debug("als register data path fail\n");
-		return -1;
-	}
-	return 0;
-}
-EXPORT_SYMBOL_GPL(als_register_data_path);
-
-int ps_register_data_path(struct ps_data_path *data)
-{
-	struct alsps_context *cxt = NULL;
-	/* int err =0; */
-	cxt = alsps_context_obj;
-	cxt->ps_data.get_data = data->get_data;
-	cxt->ps_data.vender_div = data->vender_div;
-	cxt->ps_data.ps_get_raw_data = data->ps_get_raw_data;
-	pr_debug("alsps register data path vender_div: %d\n",
-		  cxt->ps_data.vender_div);
-	if (cxt->ps_data.get_data == NULL) {
-		pr_debug("ps register data path fail\n");
-		return -1;
-	}
-	return 0;
-}
-EXPORT_SYMBOL_GPL(ps_register_data_path);
-
-int als_register_control_path(struct als_control_path *ctl)
-{
-	struct alsps_context *cxt = NULL;
-	int err = 0;
-
-	cxt = alsps_context_obj;
-	cxt->als_ctl.set_delay = ctl->set_delay;
-	cxt->als_ctl.open_report_data = ctl->open_report_data;
-	cxt->als_ctl.enable_nodata = ctl->enable_nodata;
-	cxt->als_ctl.batch = ctl->batch;
-	cxt->als_ctl.flush = ctl->flush;
-	cxt->als_ctl.set_cali = ctl->set_cali;
-	cxt->als_ctl.rgbw_enable = ctl->rgbw_enable;
-	cxt->als_ctl.rgbw_batch = ctl->rgbw_batch;
-	cxt->als_ctl.rgbw_flush = ctl->rgbw_flush;
-	cxt->als_ctl.is_support_batch = ctl->is_support_batch;
-	cxt->als_ctl.is_report_input_direct = ctl->is_report_input_direct;
-	cxt->als_ctl.is_use_common_factory = ctl->is_use_common_factory;
-
-	if (cxt->als_ctl.enable_nodata == NULL || cxt->als_ctl.batch == NULL ||
-	    cxt->als_ctl.flush == NULL) {
-		pr_debug("als register control path fail\n");
-		return -1;
-	}
-
-	/* add misc dev for sensor hal control cmd */
-	err = als_misc_init(alsps_context_obj);
-	if (err) {
-		pr_err("unable to register alsps misc device!!\n");
-		return -2;
-	}
-	err = sysfs_create_group(&alsps_context_obj->als_mdev.this_device->kobj,
-				 &als_attribute_group);
-	if (err < 0) {
-		pr_err("unable to create alsps attribute file\n");
-		return -3;
-	}
-	kobject_uevent(&alsps_context_obj->als_mdev.this_device->kobj,
-		       KOBJ_ADD);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(als_register_control_path);
-
-int ps_register_control_path(struct ps_control_path *ctl)
-{
-	struct alsps_context *cxt = NULL;
-	int err = 0;
-
-	cxt = alsps_context_obj;
-	cxt->ps_ctl.set_delay = ctl->set_delay;
-	cxt->ps_ctl.open_report_data = ctl->open_report_data;
-	cxt->ps_ctl.enable_nodata = ctl->enable_nodata;
-	cxt->ps_ctl.batch = ctl->batch;
-	cxt->ps_ctl.flush = ctl->flush;
-	cxt->ps_ctl.is_support_batch = ctl->is_support_batch;
-	cxt->ps_ctl.is_report_input_direct = ctl->is_report_input_direct;
-	cxt->ps_ctl.ps_calibration = ctl->ps_calibration;
-	cxt->ps_ctl.set_cali = ctl->set_cali;
-	cxt->ps_ctl.is_use_common_factory = ctl->is_use_common_factory;
-	cxt->ps_ctl.is_polling_mode = ctl->is_polling_mode;
-
-	if (cxt->ps_ctl.enable_nodata == NULL || cxt->ps_ctl.batch == NULL ||
-	    cxt->ps_ctl.flush == NULL) {
-		pr_debug("ps register control path fail\n");
-		return -1;
-	}
-
-	err = ps_misc_init(alsps_context_obj);
-	if (err) {
-		pr_err("unable to register alsps misc device!!\n");
-		return -2;
-	}
-	err = sysfs_create_group(&alsps_context_obj->ps_mdev.this_device->kobj,
-				 &ps_attribute_group);
-	if (err < 0) {
-		pr_err("unable to create alsps attribute file\n");
-		return -3;
-	}
-	kobject_uevent(&alsps_context_obj->ps_mdev.this_device->kobj, KOBJ_ADD);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(ps_register_control_path);
-
-/* AAL functions**************************************** */
-int alsps_aal_enable(int enable)
-{
-	return 0;
-}
-
-int alsps_aal_get_status(void)
-{
-	return 0;
-}
-
-int alsps_aal_get_data(void)
-{
-	return 0;
-}
-/* *************************************************** */
-
-int alsps_probe(void)
-{
-	int err;
-
-	pr_debug("%s start!!\n", __func__);
-	alsps_context_obj = alsps_context_alloc_object();
-	if (!alsps_context_obj) {
-		err = -ENOMEM;
-		pr_err("unable to allocate devobj!\n");
-		goto exit_alloc_data_failed;
-	}
-	/* init real alspseleration driver */
-	err = alsps_real_driver_init();
-	if (err) {
-		pr_err("alsps real driver init fail\n");
-		goto real_driver_init_fail;
-	}
-	pr_debug("%s OK !!\n", __func__);
-	return 0;
-
-real_driver_init_fail:
-	kfree(alsps_context_obj);
-	alsps_context_obj = NULL;
-exit_alloc_data_failed:
-	pr_err("%s fail !!!\n", __func__);
-	return err;
-}
-EXPORT_SYMBOL_GPL(alsps_probe);
-
-int alsps_remove(void)
-{
-	int err = 0;
-
-	pr_debug("%s\n", __func__);
-	sysfs_remove_group(&alsps_context_obj->als_mdev.this_device->kobj,
-			   &als_attribute_group);
-	sysfs_remove_group(&alsps_context_obj->ps_mdev.this_device->kobj,
-			   &ps_attribute_group);
-
-	err = sensor_attr_deregister(&alsps_context_obj->als_mdev);
-	err = sensor_attr_deregister(&alsps_context_obj->ps_mdev);
-	if (err)
-		pr_err("misc_deregister fail: %d\n", err);
-	kfree(alsps_context_obj);
-
-	platform_driver_unregister(&als_ps_driver);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(alsps_remove);
-
-static int __init alsps_init(void)
-{
-	pr_debug("%s\n", __func__);
-	AAL_init();
-	return 0;
-}
-
-static void __exit alsps_exit(void)
-{
-	pr_debug("%s\n", __func__);
-	AAL_exit();
-}
-
-module_init(alsps_init);
-module_exit(alsps_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("ALSPS device driver");
-MODULE_AUTHOR("Mediatek");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alsps_factory.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alsps_factory.c
deleted file mode 100644
index aded6e0..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alsps_factory.c
+++ /dev/null
@@ -1,376 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<ALS/PS> " fmt
-
-#include "inc/alsps_factory.h"
-
-struct alsps_factory_private {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct alsps_factory_fops *fops;
-};
-
-static struct alsps_factory_private alsps_factory;
-
-static int alsps_factory_open(struct inode *inode, struct file *file)
-{
-	return nonseekable_open(inode, file);
-}
-
-static int alsps_factory_release(struct inode *inode, struct file *file)
-{
-	file->private_data = NULL;
-	return 0;
-}
-
-static long alsps_factory_unlocked_ioctl(struct file *file, unsigned int cmd,
-					 unsigned long arg)
-{
-	long err = 0;
-	void __user *ptr = (void __user *)arg;
-	int data = 0;
-	uint32_t enable = 0;
-	int threshold_data[2] = {0, 0};
-	int als_cali = 0;
-
-	if (_IOC_DIR(cmd) & _IOC_READ)
-		err = !access_ok(VERIFY_WRITE, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-	else if (_IOC_DIR(cmd) & _IOC_WRITE)
-		err = !access_ok(VERIFY_READ, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-
-	if (err) {
-		pr_debug("access error: %08X, (%2d, %2d)\n", cmd,
-			  _IOC_DIR(cmd), _IOC_SIZE(cmd));
-		return -EFAULT;
-	}
-
-	switch (cmd) {
-	case ALSPS_SET_PS_MODE:
-		if (copy_from_user(&enable, ptr, sizeof(enable)))
-			return -EFAULT;
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->ps_enable_sensor != NULL) {
-			err = alsps_factory.fops->ps_enable_sensor(enable, 200);
-			if (err < 0) {
-				pr_err("ALSPS_SET_PS_MODE fail!\n");
-				return -EINVAL;
-			}
-			pr_debug(
-				"ALSPS_SET_PS_MODE, enable: %d, sample_period:%dms\n",
-				enable, 200);
-		} else {
-			pr_err("ALSPS_SET_PS_MODE NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_GET_PS_RAW_DATA:
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->ps_get_raw_data != NULL) {
-			err = alsps_factory.fops->ps_get_raw_data(&data);
-			if (err < 0) {
-				pr_err(
-					"ALSPS_GET_PS_RAW_DATA read data fail!\n");
-				return -EINVAL;
-			}
-			if (copy_to_user(ptr, &data, sizeof(data)))
-				return -EFAULT;
-		} else {
-			pr_err("ALSPS_GET_PS_RAW_DATA NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_SET_ALS_MODE:
-		if (copy_from_user(&enable, ptr, sizeof(enable)))
-			return -EFAULT;
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->als_enable_sensor != NULL) {
-			err = alsps_factory.fops->als_enable_sensor(enable,
-								    200);
-			if (err < 0) {
-				pr_err("ALSPS_SET_ALS_MODE fail!\n");
-				return -EINVAL;
-			}
-			pr_debug(
-				"ALSPS_SET_ALS_MODE, enable: %d, sample_period:%dms\n",
-				enable, 200);
-		} else {
-			pr_err("ALSPS_SET_ALS_MODE NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_GET_ALS_RAW_DATA:
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->als_get_raw_data != NULL) {
-			err = alsps_factory.fops->als_get_raw_data(&data);
-			if (err < 0) {
-				pr_err(
-					"ALSPS_GET_ALS_RAW_DATA read data fail!\n");
-				return -EINVAL;
-			}
-			if (copy_to_user(ptr, &data, sizeof(data)))
-				return -EFAULT;
-		} else {
-			pr_err("ALSPS_GET_ALS_RAW_DATA NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_ALS_ENABLE_CALI:
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->als_enable_calibration != NULL) {
-			err = alsps_factory.fops->als_enable_calibration();
-			if (err < 0) {
-				pr_err("ALSPS_ALS_ENABLE_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_ALS_ENABLE_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_ALS_SET_CALI:
-		if (copy_from_user(&als_cali, ptr, sizeof(als_cali)))
-			return -EFAULT;
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->als_set_cali != NULL) {
-			err = alsps_factory.fops->als_set_cali(als_cali);
-			if (err < 0) {
-				pr_err("ALSPS_ALS_SET_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_ALS_SET_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_GET_PS_TEST_RESULT:
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->ps_get_data != NULL) {
-			err = alsps_factory.fops->ps_get_data(&data);
-			if (err < 0) {
-				pr_err(
-					"ALSPS_GET_PS_TEST_RESULT read data fail!\n");
-				return -EINVAL;
-			}
-			if (copy_to_user(ptr, &data, sizeof(data)))
-				return -EFAULT;
-		} else {
-			pr_err("ALSPS_GET_PS_TEST_RESULT NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_GET_PS_THRESHOLD_HIGH:
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->ps_get_threshold != NULL) {
-			err = alsps_factory.fops->ps_get_threshold(
-				threshold_data);
-			if (err < 0) {
-				pr_err(
-					"ALSPS_GET_PS_THRESHOLD_HIGH read data fail!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_GET_PS_THRESHOLD_HIGH NULL\n");
-			return -EINVAL;
-		}
-		if (copy_to_user(ptr, &threshold_data[0],
-				 sizeof(threshold_data[0])))
-			return -EFAULT;
-		return 0;
-	case ALSPS_GET_PS_THRESHOLD_LOW:
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->ps_get_threshold != NULL) {
-			err = alsps_factory.fops->ps_get_threshold(
-				threshold_data);
-			if (err < 0) {
-				pr_err(
-					"ALSPS_GET_PS_THRESHOLD_HIGH read data fail!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_GET_PS_THRESHOLD_HIGH NULL\n");
-			return -EINVAL;
-		}
-		if (copy_to_user(ptr, &threshold_data[1],
-				 sizeof(threshold_data[1])))
-			return -EFAULT;
-		return 0;
-	case ALSPS_SET_PS_THRESHOLD:
-		if (copy_from_user(threshold_data, ptr, sizeof(threshold_data)))
-			return -EFAULT;
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->ps_set_threshold != NULL) {
-			err = alsps_factory.fops->ps_set_threshold(
-				threshold_data);
-			if (err < 0) {
-				pr_err("ALSPS_SET_PS_THRESHOLD fail!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_SET_PS_THRESHOLD NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_IOCTL_SET_CALI:
-		if (copy_from_user(&data, ptr, sizeof(data)))
-			return -EFAULT;
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->ps_set_cali != NULL) {
-			err = alsps_factory.fops->ps_set_cali(data);
-			if (err < 0) {
-				pr_err("ALSPS_IOCTL_SET_CALI fail!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_IOCTL_SET_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_IOCTL_GET_CALI:
-		if (alsps_factory.fops != NULL &&
-		    alsps_factory.fops->ps_get_cali != NULL) {
-			err = alsps_factory.fops->ps_get_cali(&data);
-			if (err < 0) {
-				pr_err("ALSPS_IOCTL_GET_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_IOCTL_GET_CALI NULL\n");
-			return -EINVAL;
-		}
-		if (copy_to_user(ptr, &data, sizeof(data)))
-			return -EFAULT;
-		return 0;
-	case ALSPS_IOCTL_ALS_GET_CALI:
-		if (alsps_factory.fops != NULL &&
-			alsps_factory.fops->als_get_cali != NULL) {
-			err = alsps_factory.fops->als_get_cali(&data);
-			if (err < 0) {
-				pr_err("ALSPS_IOCTL_ALS_GET_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_IOCTL_ALS_GET_CALI NULL\n");
-			return -EINVAL;
-		}
-		if (copy_to_user(ptr, &data, sizeof(data)))
-			return -EFAULT;
-		return 0;
-	case ALSPS_IOCTL_CLR_CALI:
-		if (copy_from_user(&data, ptr, sizeof(data)))
-			return -EFAULT;
-		if (alsps_factory.fops != NULL &&
-			alsps_factory.fops->ps_clear_cali != NULL) {
-			err = alsps_factory.fops->ps_clear_cali();
-			if (err < 0) {
-				pr_err("ALSPS_IOCTL_CLR_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_IOCTL_CLR_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case ALSPS_PS_ENABLE_CALI:
-		if (alsps_factory.fops != NULL &&
-			alsps_factory.fops->ps_enable_calibration != NULL) {
-			err = alsps_factory.fops->ps_enable_calibration();
-			if (err < 0) {
-				pr_err("ALSPS_PS_ENABLE_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("ALSPS_PS_ENABLE_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	default:
-		pr_err("unknown IOCTL: 0x%08x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-	return 0;
-}
-#ifdef CONFIG_COMPAT
-static long alsps_factory_compat_ioctl(struct file *file,
-	unsigned int cmd, unsigned long arg)
-{
-	long err = 0;
-
-	void __user *arg32 = compat_ptr(arg);
-
-	if (!file->f_op || !file->f_op->unlocked_ioctl)
-		return -ENOTTY;
-
-	switch (cmd) {
-	case COMPAT_ALSPS_SET_PS_MODE:
-	case COMPAT_ALSPS_GET_PS_RAW_DATA:
-	case COMPAT_ALSPS_SET_ALS_MODE:
-	case COMPAT_ALSPS_GET_ALS_RAW_DATA:
-	case COMPAT_ALSPS_GET_PS_TEST_RESULT:
-	case COMPAT_ALSPS_GET_PS_THRESHOLD_HIGH:
-	case COMPAT_ALSPS_GET_PS_THRESHOLD_LOW:
-	case COMPAT_ALSPS_SET_PS_THRESHOLD:
-	case COMPAT_ALSPS_IOCTL_SET_CALI:
-	case COMPAT_ALSPS_IOCTL_GET_CALI:
-	case COMPAT_ALSPS_IOCTL_ALS_GET_CALI:
-	case COMPAT_ALSPS_IOCTL_CLR_CALI:
-	case COMPAT_ALSPS_ALS_ENABLE_CALI:
-	case COMPAT_ALSPS_PS_ENABLE_CALI:
-	case COMPAT_ALSPS_IOCTL_ALS_SET_CALI:
-		err = file->f_op->unlocked_ioctl(file, cmd,
-						 (unsigned long)arg32);
-		break;
-	default:
-		pr_err("unknown IOCTL: 0x%08x\n", cmd);
-		err = -ENOIOCTLCMD;
-		break;
-	}
-
-	return err;
-}
-#endif
-
-static const struct file_operations _alsps_factory_fops = {
-	.open = alsps_factory_open,
-	.release = alsps_factory_release,
-	.unlocked_ioctl = alsps_factory_unlocked_ioctl,
-#ifdef CONFIG_COMPAT
-	.compat_ioctl = alsps_factory_compat_ioctl,
-#endif
-};
-
-static struct miscdevice alsps_factory_device = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = "als_ps",
-	.fops = &_alsps_factory_fops,
-};
-
-int alsps_factory_device_register(struct alsps_factory_public *dev)
-{
-	int err = 0;
-
-	if (!dev || !dev->fops)
-		return -1;
-	alsps_factory.gain = dev->gain;
-	alsps_factory.sensitivity = dev->sensitivity;
-	alsps_factory.fops = dev->fops;
-	err = misc_register(&alsps_factory_device);
-	if (err) {
-		pr_err("alsps_factory_device register failed\n");
-		err = -1;
-	}
-	return err;
-}
-EXPORT_SYMBOL_GPL(alsps_factory_device_register);
-
-int alsps_factory_device_deregister(struct alsps_factory_public *dev)
-{
-	alsps_factory.fops = NULL;
-	misc_deregister(&alsps_factory_device);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(alsps_factory_device_deregister);
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/Kconfig
deleted file mode 100644
index 4728c0c..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_ALSPSHUB
-	bool "alspshub for MediaTek package"
-	help
-	  It support different alspshub sensor.
-	  If this option is set,
-	  it will support
-	  sensorhub gyroscope.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/Makefile
deleted file mode 100644
index 8569294..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/alsps/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/scp
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)	:=  alspshub.o
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/alspshub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/alspshub.c
deleted file mode 100644
index 6269e6a..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/alspshub.c
+++ /dev/null
@@ -1,1085 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[ALS/PS] " fmt
-
-#include "alspshub.h"
-#include <alsps.h>
-#include <hwmsensor.h>
-#include <SCP_sensorHub.h>
-#include "SCP_power_monitor.h"
-#include <linux/pm_wakeup.h>
-
-
-#define ALSPSHUB_DEV_NAME     "alsps_hub_pl"
-
-struct alspshub_ipi_data {
-	struct work_struct init_done_work;
-	atomic_t first_ready_after_boot;
-	/*misc */
-	atomic_t	als_suspend;
-	atomic_t	ps_suspend;
-	atomic_t	trace;
-	atomic_t	scp_init_done;
-
-	/*data */
-	u16		als;
-	u8		ps;
-	int		ps_cali;
-	atomic_t	als_cali;
-	atomic_t	ps_thd_val_high;
-	atomic_t	ps_thd_val_low;
-	ulong		enable;
-	ulong		pending_intr;
-	bool als_factory_enable;
-	bool ps_factory_enable;
-	bool als_android_enable;
-	bool ps_android_enable;
-	struct wakeup_source *ps_wake_lock;
-};
-
-static struct alspshub_ipi_data *obj_ipi_data;
-static int ps_get_data(int *value, int *status);
-
-static int alspshub_local_init(void);
-static int alspshub_local_remove(void);
-static int alspshub_init_flag = -1;
-static struct alsps_init_info alspshub_init_info = {
-	.name = "alsps_hub",
-	.init = alspshub_local_init,
-	.uninit = alspshub_local_remove,
-
-};
-
-static DEFINE_MUTEX(alspshub_mutex);
-static DEFINE_SPINLOCK(calibration_lock);
-
-enum {
-	CMC_BIT_ALS = 1,
-	CMC_BIT_PS = 2,
-} CMC_BIT;
-enum {
-	CMC_TRC_ALS_DATA = 0x0001,
-	CMC_TRC_PS_DATA = 0x0002,
-	CMC_TRC_EINT = 0x0004,
-	CMC_TRC_IOCTL = 0x0008,
-	CMC_TRC_I2C = 0x0010,
-	CMC_TRC_CVT_ALS = 0x0020,
-	CMC_TRC_CVT_PS = 0x0040,
-	CMC_TRC_DEBUG = 0x8000,
-} CMC_TRC;
-
-long alspshub_read_ps(u8 *ps)
-{
-	long res;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-	struct data_unit_t data_t;
-
-	res = sensor_get_data_from_hub(ID_PROXIMITY, &data_t);
-	if (res < 0) {
-		*ps = -1;
-		pr_err("sensor_get_data_from_hub fail, (ID: %d)\n",
-			ID_PROXIMITY);
-		return -1;
-	}
-	if (data_t.proximity_t.steps < obj->ps_cali)
-		*ps = 0;
-	else
-		*ps = data_t.proximity_t.steps - obj->ps_cali;
-	return 0;
-}
-
-long alspshub_read_als(u16 *als)
-{
-	long res = 0;
-	struct data_unit_t data_t;
-
-	res = sensor_get_data_from_hub(ID_LIGHT, &data_t);
-	if (res < 0) {
-		*als = -1;
-		pr_err_ratelimited("sensor_get_data_from_hub fail, (ID: %d)\n",
-			ID_LIGHT);
-		return -1;
-	}
-	*als = data_t.light;
-
-	return 0;
-}
-
-static ssize_t trace_show(struct device_driver *ddri, char *buf)
-{
-	ssize_t res = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	if (!obj_ipi_data) {
-		pr_err("obj_ipi_data is null!!\n");
-		return 0;
-	}
-
-	res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
-	return res;
-}
-
-static ssize_t trace_store(struct device_driver *ddri,
-				const char *buf, size_t count)
-{
-	int trace = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-	int res = 0;
-	int ret = 0;
-
-	if (!obj) {
-		pr_err("obj_ipi_data is null!!\n");
-		return 0;
-	}
-	ret = sscanf(buf, "0x%x", &trace);
-	if (ret != 1) {
-		pr_err("invalid content: '%s', length = %zu\n", buf, count);
-		return count;
-	}
-	atomic_set(&obj->trace, trace);
-	res = sensor_set_cmd_to_hub(ID_PROXIMITY,
-		CUST_ACTION_SET_TRACE, &trace);
-	if (res < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID: %d),(action: %d)\n",
-			ID_PROXIMITY, CUST_ACTION_SET_TRACE);
-		return 0;
-	}
-	return count;
-}
-
-static ssize_t als_show(struct device_driver *ddri, char *buf)
-{
-	int res = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	if (!obj) {
-		pr_err("obj_ipi_data is null!!\n");
-		return 0;
-	}
-	res = alspshub_read_als(&obj->als);
-	if (res)
-		return snprintf(buf, PAGE_SIZE, "ERROR: %d\n", res);
-	else
-		return snprintf(buf, PAGE_SIZE, "0x%04X\n", obj->als);
-}
-
-static ssize_t ps_show(struct device_driver *ddri, char *buf)
-{
-	ssize_t res = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	if (!obj) {
-		pr_err("cm3623_obj is null!!\n");
-		return 0;
-	}
-	res = alspshub_read_ps(&obj->ps);
-	if (res)
-		return snprintf(buf, PAGE_SIZE, "ERROR: %d\n", (int)res);
-	else
-		return snprintf(buf, PAGE_SIZE, "0x%04X\n", obj->ps);
-}
-
-static ssize_t reg_show(struct device_driver *ddri, char *buf)
-{
-	int res = 0;
-
-	res = sensor_set_cmd_to_hub(ID_PROXIMITY, CUST_ACTION_SHOW_REG, buf);
-	if (res < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID: %d),(action: %d)\n",
-			ID_PROXIMITY, CUST_ACTION_SHOW_REG);
-		return 0;
-	}
-
-	return res;
-}
-
-static ssize_t alslv_show(struct device_driver *ddri, char *buf)
-{
-	int res = 0;
-
-	res = sensor_set_cmd_to_hub(ID_LIGHT, CUST_ACTION_SHOW_ALSLV, buf);
-	if (res < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID: %d),(action: %d)\n",
-			ID_LIGHT, CUST_ACTION_SHOW_ALSLV);
-		return 0;
-	}
-
-	return res;
-}
-
-static ssize_t alsval_show(struct device_driver *ddri, char *buf)
-{
-	int res = 0;
-
-	res = sensor_set_cmd_to_hub(ID_LIGHT, CUST_ACTION_SHOW_ALSVAL, buf);
-	if (res < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID: %d),(action: %d)\n",
-			ID_LIGHT, CUST_ACTION_SHOW_ALSVAL);
-		return 0;
-	}
-
-	return res;
-}
-
-static DRIVER_ATTR_RO(als);
-static DRIVER_ATTR_RO(ps);
-static DRIVER_ATTR_RO(alslv);
-static DRIVER_ATTR_RO(alsval);
-static DRIVER_ATTR_RW(trace);
-static DRIVER_ATTR_RO(reg);
-static struct driver_attribute *alspshub_attr_list[] = {
-	&driver_attr_als,
-	&driver_attr_ps,
-	&driver_attr_trace,	/*trace log */
-	&driver_attr_alslv,
-	&driver_attr_alsval,
-	&driver_attr_reg,
-};
-
-static int alspshub_create_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(alspshub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++) {
-		err = driver_create_file(driver, alspshub_attr_list[idx]);
-		if (err) {
-			pr_err("driver_create_file (%s) = %d\n",
-				alspshub_attr_list[idx]->attr.name, err);
-			break;
-		}
-	}
-	return err;
-}
-
-static int alspshub_delete_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(alspshub_attr_list));
-
-	if (!driver)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++)
-		driver_remove_file(driver, alspshub_attr_list[idx]);
-
-	return err;
-}
-
-static void alspshub_init_done_work(struct work_struct *work)
-{
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-	int err = 0;
-#ifndef MTK_OLD_FACTORY_CALIBRATION
-	int32_t cfg_data[2] = {0};
-#endif
-
-	if (atomic_read(&obj->scp_init_done) == 0) {
-		pr_err("wait for nvram to set calibration\n");
-		return;
-	}
-	if (atomic_xchg(&obj->first_ready_after_boot, 1) == 0)
-		return;
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	err = sensor_set_cmd_to_hub(ID_PROXIMITY,
-		CUST_ACTION_SET_CALI, &obj->ps_cali);
-	if (err < 0)
-		pr_err("sensor_set_cmd_to_hub fail,(ID: %d),(action: %d)\n",
-			ID_PROXIMITY, CUST_ACTION_SET_CALI);
-#else
-	spin_lock(&calibration_lock);
-	cfg_data[0] = atomic_read(&obj->ps_thd_val_high);
-	cfg_data[1] = atomic_read(&obj->ps_thd_val_low);
-	spin_unlock(&calibration_lock);
-	err = sensor_cfg_to_hub(ID_PROXIMITY,
-		(uint8_t *)cfg_data, sizeof(cfg_data));
-	if (err < 0)
-		pr_err("sensor_cfg_to_hub ps fail\n");
-
-	spin_lock(&calibration_lock);
-	cfg_data[0] = atomic_read(&obj->als_cali);
-	spin_unlock(&calibration_lock);
-	err = sensor_cfg_to_hub(ID_LIGHT,
-		(uint8_t *)cfg_data, sizeof(cfg_data));
-	if (err < 0)
-		pr_err("sensor_cfg_to_hub als fail\n");
-#endif
-}
-static int ps_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	if (!obj)
-		return 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = ps_flush_report();
-	else if (event->flush_action == DATA_ACTION &&
-			READ_ONCE(obj->ps_android_enable) == true) {
-		__pm_wakeup_event(obj->ps_wake_lock, msecs_to_jiffies(100));
-		err = ps_data_report_t(event->proximity_t.oneshot,
-			SENSOR_STATUS_ACCURACY_HIGH,
-			(int64_t)event->time_stamp);
-	} else if (event->flush_action == CALI_ACTION) {
-		spin_lock(&calibration_lock);
-		atomic_set(&obj->ps_thd_val_high, event->data[0]);
-		atomic_set(&obj->ps_thd_val_low, event->data[1]);
-		spin_unlock(&calibration_lock);
-		err = ps_cali_report(event->data);
-	}
-	return err;
-}
-static int als_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	if (!obj)
-		return 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = als_flush_report();
-	else if ((event->flush_action == DATA_ACTION) &&
-			READ_ONCE(obj->als_android_enable) == true)
-		err = als_data_report_t(event->light,
-				SENSOR_STATUS_ACCURACY_MEDIUM,
-				(int64_t)event->time_stamp);
-	else if (event->flush_action == CALI_ACTION) {
-		spin_lock(&calibration_lock);
-		atomic_set(&obj->als_cali, event->data[0]);
-		spin_unlock(&calibration_lock);
-		err = als_cali_report(event->data);
-	}
-	return err;
-}
-
-static int rgbw_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = rgbw_flush_report();
-	else if (event->flush_action == DATA_ACTION)
-		err = rgbw_data_report_t(event->data,
-			(int64_t)event->time_stamp);
-	return err;
-}
-
-static int alshub_factory_enable_sensor(bool enable_disable,
-				int64_t sample_periods_ms)
-{
-	int err = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	if (enable_disable == true)
-		WRITE_ONCE(obj->als_factory_enable, true);
-	else
-		WRITE_ONCE(obj->als_factory_enable, false);
-
-	if (enable_disable == true) {
-		err = sensor_set_delay_to_hub(ID_LIGHT, sample_periods_ms);
-		if (err) {
-			pr_err("sensor_set_delay_to_hub failed!\n");
-			return -1;
-		}
-	}
-	err = sensor_enable_to_hub(ID_LIGHT, enable_disable);
-	if (err) {
-		pr_err("sensor_enable_to_hub failed!\n");
-		return -1;
-	}
-	mutex_lock(&alspshub_mutex);
-	if (enable_disable)
-		set_bit(CMC_BIT_ALS, &obj->enable);
-	else
-		clear_bit(CMC_BIT_ALS, &obj->enable);
-	mutex_unlock(&alspshub_mutex);
-	return 0;
-}
-static int alshub_factory_get_data(int32_t *data)
-{
-	int err = 0;
-	struct data_unit_t data_t;
-
-	err = sensor_get_data_from_hub(ID_LIGHT, &data_t);
-	if (err < 0)
-		return -1;
-	*data = data_t.light;
-	return 0;
-}
-static int alshub_factory_get_raw_data(int32_t *data)
-{
-	return alshub_factory_get_data(data);
-}
-static int alshub_factory_enable_calibration(void)
-{
-	return sensor_calibration_to_hub(ID_LIGHT);
-}
-static int alshub_factory_clear_cali(void)
-{
-	return 0;
-}
-static int alshub_factory_set_cali(int32_t offset)
-{
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-	int err = 0;
-	int32_t cfg_data;
-
-	cfg_data = offset;
-	err = sensor_cfg_to_hub(ID_LIGHT,
-		(uint8_t *)&cfg_data, sizeof(cfg_data));
-	if (err < 0)
-		pr_err("sensor_cfg_to_hub fail\n");
-	atomic_set(&obj->als_cali, offset);
-	als_cali_report(&cfg_data);
-
-	return err;
-
-}
-static int alshub_factory_get_cali(int32_t *offset)
-{
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	*offset = atomic_read(&obj->als_cali);
-	return 0;
-}
-static int pshub_factory_enable_sensor(bool enable_disable,
-			int64_t sample_periods_ms)
-{
-	int err = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	if (enable_disable == true) {
-		err = sensor_set_delay_to_hub(ID_PROXIMITY, sample_periods_ms);
-		if (err) {
-			pr_err("sensor_set_delay_to_hub failed!\n");
-			return -1;
-		}
-	}
-	err = sensor_enable_to_hub(ID_PROXIMITY, enable_disable);
-	if (err) {
-		pr_err("sensor_enable_to_hub failed!\n");
-		return -1;
-	}
-	mutex_lock(&alspshub_mutex);
-	if (enable_disable)
-		set_bit(CMC_BIT_PS, &obj->enable);
-	else
-		clear_bit(CMC_BIT_PS, &obj->enable);
-	mutex_unlock(&alspshub_mutex);
-	return 0;
-}
-static int pshub_factory_get_data(int32_t *data)
-{
-	int err = 0, status = 0;
-
-	err = ps_get_data(data, &status);
-	if (err < 0)
-		return -1;
-	return 0;
-}
-static int pshub_factory_get_raw_data(int32_t *data)
-{
-	int err = 0;
-	struct data_unit_t data_t;
-
-	err = sensor_get_data_from_hub(ID_PROXIMITY, &data_t);
-	if (err < 0)
-		return -1;
-	*data = data_t.proximity_t.steps;
-	return 0;
-}
-static int pshub_factory_enable_calibration(void)
-{
-	return sensor_calibration_to_hub(ID_PROXIMITY);
-}
-static int pshub_factory_clear_cali(void)
-{
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	int err = 0;
-#endif
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	obj->ps_cali = 0;
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	err = sensor_set_cmd_to_hub(ID_PROXIMITY,
-			CUST_ACTION_RESET_CALI, &obj->ps_cali);
-	if (err < 0) {
-		pr_err("sensor_set_cmd_to_hub fail, (ID: %d),(action: %d)\n",
-			ID_PROXIMITY, CUST_ACTION_RESET_CALI);
-		return -1;
-	}
-#endif
-	return 0;
-}
-static int pshub_factory_set_cali(int32_t offset)
-{
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	obj->ps_cali = offset;
-	return 0;
-}
-static int pshub_factory_get_cali(int32_t *offset)
-{
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	*offset = obj->ps_cali;
-	return 0;
-}
-static int pshub_factory_set_threshold(int32_t threshold[2])
-{
-	int err = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-#ifndef MTK_OLD_FACTORY_CALIBRATION
-	int32_t cfg_data[2] = {0};
-#endif
-	if (threshold[0] < threshold[1] || threshold[0] <= 0 ||
-		threshold[1] <= 0) {
-		pr_err("PS set threshold fail! invalid value:[%d, %d]\n",
-			threshold[0], threshold[1]);
-		return -1;
-	}
-
-	spin_lock(&calibration_lock);
-	atomic_set(&obj->ps_thd_val_high, (threshold[0] + obj->ps_cali));
-	atomic_set(&obj->ps_thd_val_low, (threshold[1] + obj->ps_cali));
-	spin_unlock(&calibration_lock);
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	err = sensor_set_cmd_to_hub(ID_PROXIMITY,
-		CUST_ACTION_SET_PS_THRESHOLD, threshold);
-	if (err < 0)
-		pr_err("sensor_set_cmd_to_hub fail, (ID:%d),(action:%d)\n",
-			ID_PROXIMITY, CUST_ACTION_SET_PS_THRESHOLD);
-#else
-	spin_lock(&calibration_lock);
-	cfg_data[0] = atomic_read(&obj->ps_thd_val_high);
-	cfg_data[1] = atomic_read(&obj->ps_thd_val_low);
-	spin_unlock(&calibration_lock);
-	err = sensor_cfg_to_hub(ID_PROXIMITY,
-		(uint8_t *)cfg_data, sizeof(cfg_data));
-	if (err < 0)
-		pr_err("sensor_cfg_to_hub fail\n");
-
-	ps_cali_report(cfg_data);
-#endif
-	return err;
-}
-
-static int pshub_factory_get_threshold(int32_t threshold[2])
-{
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	spin_lock(&calibration_lock);
-	threshold[0] = atomic_read(&obj->ps_thd_val_high) - obj->ps_cali;
-	threshold[1] = atomic_read(&obj->ps_thd_val_low) - obj->ps_cali;
-	spin_unlock(&calibration_lock);
-	return 0;
-}
-
-static struct alsps_factory_fops alspshub_factory_fops = {
-	.als_enable_sensor = alshub_factory_enable_sensor,
-	.als_get_data = alshub_factory_get_data,
-	.als_get_raw_data = alshub_factory_get_raw_data,
-	.als_enable_calibration = alshub_factory_enable_calibration,
-	.als_clear_cali = alshub_factory_clear_cali,
-	.als_set_cali = alshub_factory_set_cali,
-	.als_get_cali = alshub_factory_get_cali,
-
-	.ps_enable_sensor = pshub_factory_enable_sensor,
-	.ps_get_data = pshub_factory_get_data,
-	.ps_get_raw_data = pshub_factory_get_raw_data,
-	.ps_enable_calibration = pshub_factory_enable_calibration,
-	.ps_clear_cali = pshub_factory_clear_cali,
-	.ps_set_cali = pshub_factory_set_cali,
-	.ps_get_cali = pshub_factory_get_cali,
-	.ps_set_threshold = pshub_factory_set_threshold,
-	.ps_get_threshold = pshub_factory_get_threshold,
-};
-
-static struct alsps_factory_public alspshub_factory_device = {
-	.gain = 1,
-	.sensitivity = 1,
-	.fops = &alspshub_factory_fops,
-};
-static int als_open_report_data(int open)
-{
-	return 0;
-}
-
-
-static int als_enable_nodata(int en)
-{
-	int res = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	pr_debug("obj_ipi_data als enable value = %d\n", en);
-
-	if (en == true)
-		WRITE_ONCE(obj->als_android_enable, true);
-	else
-		WRITE_ONCE(obj->als_android_enable, false);
-
-	res = sensor_enable_to_hub(ID_LIGHT, en);
-	if (res < 0) {
-		pr_err("%s is failed!!\n", __func__);
-		return -1;
-	}
-
-	mutex_lock(&alspshub_mutex);
-	if (en)
-		set_bit(CMC_BIT_ALS, &obj_ipi_data->enable);
-	else
-		clear_bit(CMC_BIT_ALS, &obj_ipi_data->enable);
-	mutex_unlock(&alspshub_mutex);
-	return 0;
-}
-
-static int als_set_delay(u64 ns)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	int err = 0;
-	unsigned int delayms = 0;
-
-	delayms = (unsigned int)ns / 1000 / 1000;
-	err = sensor_set_delay_to_hub(ID_LIGHT, delayms);
-	if (err) {
-		pr_err("%s fail!\n", __func__);
-		return err;
-	}
-	pr_debug("%s (%d)\n", __func__, delayms);
-	return 0;
-#elif defined CONFIG_NANOHUB
-	return 0;
-#else
-	return 0;
-#endif
-}
-static int als_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	als_set_delay(samplingPeriodNs);
-#endif
-	return sensor_batch_to_hub(ID_LIGHT, flag,
-		samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int als_flush(void)
-{
-	return sensor_flush_to_hub(ID_LIGHT);
-}
-
-static int als_set_cali(uint8_t *data, uint8_t count)
-{
-	int32_t *buf = (int32_t *)data;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	spin_lock(&calibration_lock);
-	atomic_set(&obj->als_cali, buf[0]);
-	spin_unlock(&calibration_lock);
-	return sensor_cfg_to_hub(ID_LIGHT, data, count);
-}
-
-static int rgbw_enable(int en)
-{
-	int res = 0;
-
-	res = sensor_enable_to_hub(ID_RGBW, en);
-	if (res < 0) {
-		pr_err("%s is failed!!\n", __func__);
-		return -1;
-	}
-	return 0;
-}
-
-static int rgbw_batch(int flag, int64_t samplingPeriodNs,
-		int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_RGBW,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int rgbw_flush(void)
-{
-	return sensor_flush_to_hub(ID_RGBW);
-}
-
-static int als_get_data(int *value, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_LIGHT, &data);
-	if (err) {
-		pr_err("sensor_get_data_from_hub fail!\n");
-	} else {
-		time_stamp = data.time_stamp;
-		*value = data.light;
-		*status = SENSOR_STATUS_ACCURACY_MEDIUM;
-	}
-
-	if (atomic_read(&obj_ipi_data->trace) & CMC_TRC_PS_DATA)
-		pr_debug("value = %d\n", *value);
-	return 0;
-}
-
-static int ps_open_report_data(int open)
-{
-	return 0;
-}
-
-static int ps_enable_nodata(int en)
-{
-	int res = 0;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	pr_debug("obj_ipi_data als enable value = %d\n", en);
-	if (en == true)
-		WRITE_ONCE(obj->ps_android_enable, true);
-	else
-		WRITE_ONCE(obj->ps_android_enable, false);
-
-	res = sensor_enable_to_hub(ID_PROXIMITY, en);
-	if (res < 0) {
-		pr_err("als_enable_nodata is failed!!\n");
-		return -1;
-	}
-
-	mutex_lock(&alspshub_mutex);
-	if (en)
-		set_bit(CMC_BIT_PS, &obj_ipi_data->enable);
-	else
-		clear_bit(CMC_BIT_PS, &obj_ipi_data->enable);
-	mutex_unlock(&alspshub_mutex);
-
-
-	return 0;
-
-}
-
-static int ps_set_delay(u64 ns)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	int err = 0;
-	unsigned int delayms = 0;
-
-	delayms = (unsigned int)ns / 1000 / 1000;
-	err = sensor_set_delay_to_hub(ID_PROXIMITY, delayms);
-	if (err < 0) {
-		pr_err("%s fail!\n", __func__);
-		return err;
-	}
-
-	pr_debug("%s (%d)\n", __func__, delayms);
-	return 0;
-#elif defined CONFIG_NANOHUB
-	return 0;
-#else
-	return 0;
-#endif
-}
-static int ps_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	ps_set_delay(samplingPeriodNs);
-#endif
-	return sensor_batch_to_hub(ID_PROXIMITY, flag,
-		samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int ps_flush(void)
-{
-	return sensor_flush_to_hub(ID_PROXIMITY);
-}
-
-static int ps_get_data(int *value, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_PROXIMITY, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!\n");
-		*value = -1;
-		err = -1;
-	} else {
-		time_stamp = data.time_stamp;
-		*value = data.proximity_t.oneshot;
-		*status = SENSOR_STATUS_ACCURACY_MEDIUM;
-	}
-
-	if (atomic_read(&obj_ipi_data->trace) & CMC_TRC_PS_DATA)
-		pr_debug("value = %d\n", *value);
-
-	return err;
-}
-
-static int ps_set_cali(uint8_t *data, uint8_t count)
-{
-	int32_t *buf = (int32_t *)data;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	spin_lock(&calibration_lock);
-	atomic_set(&obj->ps_thd_val_high, buf[0]);
-	atomic_set(&obj->ps_thd_val_low, buf[1]);
-	spin_unlock(&calibration_lock);
-	return sensor_cfg_to_hub(ID_PROXIMITY, data, count);
-}
-
-static int scp_ready_event(uint8_t event, void *ptr)
-{
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	switch (event) {
-	case SENSOR_POWER_UP:
-	    atomic_set(&obj->scp_init_done, 1);
-		schedule_work(&obj->init_done_work);
-		break;
-	case SENSOR_POWER_DOWN:
-	    atomic_set(&obj->scp_init_done, 0);
-		break;
-	}
-	return 0;
-}
-
-static struct scp_power_monitor scp_ready_notifier = {
-	.name = "alsps",
-	.notifier_call = scp_ready_event,
-};
-
-static int alspshub_probe(struct platform_device *pdev)
-{
-	struct alspshub_ipi_data *obj;
-	struct platform_driver *paddr =
-			alspshub_init_info.platform_diver_addr;
-
-	int err = 0;
-	struct als_control_path als_ctl = { 0 };
-	struct als_data_path als_data = { 0 };
-	struct ps_control_path ps_ctl = { 0 };
-	struct ps_data_path ps_data = { 0 };
-
-	pr_debug("%s\n", __func__);
-	obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-	if (!obj) {
-		err = -ENOMEM;
-		goto exit;
-	}
-
-	memset(obj, 0, sizeof(*obj));
-	obj_ipi_data = obj;
-
-	INIT_WORK(&obj->init_done_work, alspshub_init_done_work);
-
-	platform_set_drvdata(pdev, obj);
-
-
-	atomic_set(&obj->als_suspend, 0);
-	atomic_set(&obj->scp_init_done, 0);
-	atomic_set(&obj->first_ready_after_boot, 0);
-
-	obj->enable = 0;
-	obj->pending_intr = 0;
-	obj->ps_cali = 0;
-	atomic_set(&obj->ps_thd_val_low, 21);
-	atomic_set(&obj->ps_thd_val_high, 28);
-	WRITE_ONCE(obj->als_factory_enable, false);
-	WRITE_ONCE(obj->als_android_enable, false);
-	WRITE_ONCE(obj->ps_factory_enable, false);
-	WRITE_ONCE(obj->ps_android_enable, false);
-
-	clear_bit(CMC_BIT_ALS, &obj->enable);
-	clear_bit(CMC_BIT_PS, &obj->enable);
-	scp_power_monitor_register(&scp_ready_notifier);
-	err = scp_sensorHub_data_registration(ID_PROXIMITY, ps_recv_data);
-	if (err < 0) {
-		pr_err("scp_sensorHub_data_registration failed\n");
-		goto exit_kfree;
-	}
-	err = scp_sensorHub_data_registration(ID_LIGHT, als_recv_data);
-	if (err < 0) {
-		pr_err("scp_sensorHub_data_registration failed\n");
-		goto exit_kfree;
-	}
-	err = scp_sensorHub_data_registration(ID_RGBW, rgbw_recv_data);
-	if (err < 0) {
-		pr_err("scp_sensorHub_data_registration failed\n");
-		goto exit_kfree;
-	}
-	err = alsps_factory_device_register(&alspshub_factory_device);
-	if (err) {
-		pr_err("alsps_factory_device_register register failed\n");
-		goto exit_kfree;
-	}
-	pr_debug("alspshub_misc_device misc_register OK!\n");
-	als_ctl.is_use_common_factory = false;
-	ps_ctl.is_use_common_factory = false;
-	err = alspshub_create_attr(&paddr->driver);
-	if (err) {
-		pr_err("create attribute err = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-	als_ctl.open_report_data = als_open_report_data;
-	als_ctl.enable_nodata = als_enable_nodata;
-	als_ctl.set_delay = als_set_delay;
-	als_ctl.batch = als_batch;
-	als_ctl.flush = als_flush;
-	als_ctl.set_cali = als_set_cali;
-	als_ctl.rgbw_enable = rgbw_enable;
-	als_ctl.rgbw_batch = rgbw_batch;
-	als_ctl.rgbw_flush = rgbw_flush;
-	als_ctl.is_report_input_direct = false;
-
-	als_ctl.is_support_batch = false;
-
-	err = als_register_control_path(&als_ctl);
-	if (err) {
-		pr_err("register fail = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-
-	als_data.get_data = als_get_data;
-	als_data.vender_div = 100;
-	err = als_register_data_path(&als_data);
-	if (err) {
-		pr_err("tregister fail = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-
-	ps_ctl.open_report_data = ps_open_report_data;
-	ps_ctl.enable_nodata = ps_enable_nodata;
-	ps_ctl.set_delay = ps_set_delay;
-	ps_ctl.batch = ps_batch;
-	ps_ctl.flush = ps_flush;
-	ps_ctl.set_cali = ps_set_cali;
-	ps_ctl.is_report_input_direct = false;
-
-	ps_ctl.is_support_batch = false;
-
-	err = ps_register_control_path(&ps_ctl);
-	if (err) {
-		pr_err("register fail = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-
-	ps_data.get_data = ps_get_data;
-	ps_data.vender_div = 100;
-	err = ps_register_data_path(&ps_data);
-	if (err) {
-		pr_err("tregister fail = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-	obj->ps_wake_lock = wakeup_source_register(NULL, "ps_wake_lock");
-	if (!obj->ps_wake_lock) {
-		pr_err("wakeup source init fail\n");
-		err = -ENOMEM;
-		goto exit_create_attr_failed;
-	}
-
-	alspshub_init_flag = 0;
-	pr_debug("%s: OK\n", __func__);
-	return 0;
-
-exit_create_attr_failed:
-	alspshub_delete_attr(&(alspshub_init_info.platform_diver_addr->driver));
-exit_kfree:
-	kfree(obj);
-	obj_ipi_data = NULL;
-exit:
-	pr_err("%s: err = %d\n", __func__, err);
-	alspshub_init_flag = -1;
-	return err;
-}
-
-static int alspshub_remove(struct platform_device *pdev)
-{
-	int err = 0;
-	struct platform_driver *paddr =
-			alspshub_init_info.platform_diver_addr;
-	struct alspshub_ipi_data *obj = obj_ipi_data;
-
-	if (obj)
-		wakeup_source_unregister(obj->ps_wake_lock);
-	err = alspshub_delete_attr(&paddr->driver);
-	if (err)
-		pr_err("alspshub_delete_attr fail: %d\n", err);
-	alsps_factory_device_deregister(&alspshub_factory_device);
-	kfree(platform_get_drvdata(pdev));
-	return 0;
-
-}
-
-static int alspshub_suspend(struct platform_device *pdev, pm_message_t msg)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static int alspshub_resume(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-static struct platform_device alspshub_device = {
-	.name = ALSPSHUB_DEV_NAME,
-	.id = -1,
-};
-
-static struct platform_driver alspshub_driver = {
-	.probe = alspshub_probe,
-	.remove = alspshub_remove,
-	.suspend = alspshub_suspend,
-	.resume = alspshub_resume,
-	.driver = {
-		.name = ALSPSHUB_DEV_NAME,
-	},
-};
-
-static int alspshub_local_init(void)
-{
-
-	if (platform_driver_register(&alspshub_driver)) {
-		pr_err("add driver error\n");
-		return -1;
-	}
-	if (-1 == alspshub_init_flag)
-		return -1;
-	return 0;
-}
-static int alspshub_local_remove(void)
-{
-
-	platform_driver_unregister(&alspshub_driver);
-	return 0;
-}
-
-static int __init alspshub_init(void)
-{
-	if (platform_device_register(&alspshub_device)) {
-		pr_err("alsps platform device error\n");
-		return -1;
-	}
-	alsps_driver_add(&alspshub_init_info);
-	return 0;
-}
-
-static void __exit alspshub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(alspshub_init);
-module_exit(alspshub_exit);
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
-MODULE_DESCRIPTION("alspshub driver");
-MODULE_LICENSE("GPL");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/alspshub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/alspshub.h
deleted file mode 100644
index bd7a6c5..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/alspshub/alspshub.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-/*
- * Definitions for ALSPS als/ps sensor chip.
- */
-#ifndef __ALSPSHUB_H__
-#define __ALSPSHUB_H__
-
-#include <linux/ioctl.h>
-
-
-/*ALSPS related driver tag macro*/
-#define ALSPS_SUCCESS						0
-#define ALSPS_ERR_I2C						-1
-#define ALSPS_ERR_STATUS					-3
-#define ALSPS_ERR_SETUP_FAILURE				-4
-#define ALSPS_ERR_GETGSENSORDATA			-5
-#define ALSPS_ERR_IDENTIFICATION			-6
-
-/*----------------------------------------------------------------------------*/
-enum ALSPS_NOTIFY_TYPE {
-	ALSPS_NOTIFY_PROXIMITY_CHANGE = 0,
-};
-
-#endif
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/aal_control.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/aal_control.h
deleted file mode 100644
index 02e645d..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/aal_control.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __AAL_CONTROL_H__
-#define __AAL_CONTROL_H__
-
-#define AAL_TAG                  "[ALS/AAL]"
-
-extern int aal_use;
-int __init AAL_init(void);
-void __exit AAL_exit(void);
-
-#endif
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/alsps.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/alsps.h
deleted file mode 100644
index 69a40a6..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/alsps.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __ALSPS_H__
-#define __ALSPS_H__
-
-#include <linux/atomic.h>
-#include <linux/i2c.h>
-#include <linux/io.h>
-#include <linux/irq.h>
-#include <linux/kobject.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/uaccess.h>
-//#include <linux/wakelock.h>
-#include "alsps_factory.h"
-#include "sensor_attr.h"
-#include "sensor_event.h"
-#include <hwmsensor.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/interrupt.h>
-#include <linux/miscdevice.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/poll.h>
-#include <linux/slab.h>
-#include <linux/workqueue.h>
-#include <sensors_io.h>
-
-#define ALSPS_TAG "<ALS/PS> "
-
-#define OP_ALSPS_DELAY 0X01
-#define OP_ALSPS_ENABLE 0X02
-#define OP_ALSPS_GET_DATA 0X04
-
-#define ALSPS_INVALID_VALUE -1
-
-#define EVENT_TYPE_ALS_VALUE ABS_X
-#define EVENT_TYPE_PS_VALUE REL_Z
-#define EVENT_TYPE_ALS_STATUS ABS_WHEEL
-#define EVENT_TYPE_PS_STATUS REL_Y
-
-#define ALSPS_VALUE_MAX (32767)
-#define ALSPS_VALUE_MIN (-32768)
-#define ALSPS_STATUS_MIN (0)
-#define ALSPS_STATUS_MAX (64)
-#define ALSPS_DIV_MAX (32767)
-#define ALSPS_DIV_MIN (1)
-
-#define MAX_CHOOSE_ALSPS_NUM 5
-
-struct als_control_path {
-	int (*open_report_data)(int open); /* open data rerport to HAL */
-	int (*enable_nodata)(int en); /* only enable not report event to HAL */
-	int (*set_delay)(u64 delay);
-	int (*batch)(int flag, int64_t samplingPeriodNs,
-		int64_t maxBatchReportLatencyNs);
-	int (*flush)(void);	    /* open data rerport to HAL */
-	int (*set_cali)(uint8_t *data, uint8_t count);
-	int (*rgbw_enable)(int en);
-	int (*rgbw_batch)(int flag, int64_t samplingPeriodNs,
-		int64_t maxBatchReportLatencyNs);
-	int (*rgbw_flush)(void);
-	int (*access_data_fifo)(void);
-	bool is_report_input_direct;
-	bool is_support_batch;
-	bool is_polling_mode;
-	bool is_use_common_factory;
-};
-
-struct ps_control_path {
-	int (*open_report_data)(int open); /* open data rerport to HAL */
-	int (*enable_nodata)(int en); /* only enable not report event to HAL */
-	int (*set_delay)(u64 delay);
-	int (*batch)(int flag, int64_t samplingPeriodNs,
-		     int64_t maxBatchReportLatencyNs);
-	int (*flush)(void);	    /* open data rerport to HAL */
-	int (*access_data_fifo)(void); /* version2.used for flush operate */
-	int (*ps_calibration)(int type, int value);
-	int (*set_cali)(uint8_t *data, uint8_t count);
-	bool is_report_input_direct;
-	bool is_support_batch; /* version2.used for batch mode support flag */
-	bool is_polling_mode;
-	bool is_use_common_factory;
-};
-
-struct als_data_path {
-	int (*get_data)(int *als_value, int *status);
-	int (*als_get_raw_data)(int *als_value);
-	int vender_div;
-};
-
-struct ps_data_path {
-	int (*get_data)(int *ps_value, int *status);
-	int (*ps_get_raw_data)(int *ps_value);
-	int vender_div;
-};
-
-struct alsps_init_info {
-	char *name;
-	int (*init)(void);
-	int (*uninit)(void);
-	struct platform_driver *platform_diver_addr;
-};
-
-struct alsps_data {
-	struct hwm_sensor_data als_data;
-	struct hwm_sensor_data ps_data;
-	int data_updata;
-};
-
-struct alsps_drv_obj {
-	void *self;
-	int polling;
-	int (*alsps_operate)(void *self, uint32_t command, void *buff_in,
-			     int size_in, void *buff_out, int size_out,
-			     int *actualout);
-};
-
-struct alsps_context {
-	struct input_dev *idev;
-	struct sensor_attr_t als_mdev;
-	struct sensor_attr_t ps_mdev;
-	struct work_struct report_ps;
-	struct work_struct report_als;
-	struct mutex alsps_op_mutex;
-	struct timer_list timer_als; /*als polling timer */
-	struct timer_list timer_ps;  /* ps polling timer */
-
-	atomic_t trace;
-	atomic_t delay_als; /*als polling period for reporting input event*/
-	atomic_t delay_ps;  /*ps polling period for reporting input event*/
-	atomic_t wake;      /*user-space request to wake-up, used with stop*/
-
-	atomic_t early_suspend;
-
-	struct alsps_data drv_data;
-	struct als_control_path als_ctl;
-	struct als_data_path als_data;
-	struct ps_control_path ps_ctl;
-	struct ps_data_path ps_data;
-	/* Active, but HAL don't need data sensor.such as orientation need */
-	bool is_als_active_nodata;
-	bool is_als_active_data;   /* Active and HAL need data . */
-	/* Active, but HAL don't need data sensor.such as orientation need */
-	bool is_ps_active_nodata;
-	bool is_ps_active_data;    /* Active and HAL need data . */
-
-	bool is_als_first_data_after_enable;
-	bool is_ps_first_data_after_enable;
-	bool is_als_polling_run;
-	bool is_ps_polling_run;
-	/* v2.judging whether sensor is in batch mode */
-	bool is_als_batch_enable;
-	bool is_ps_batch_enable;
-	bool is_get_valid_ps_data_after_enable;
-	bool is_get_valid_als_data_after_enable;
-	int als_power;
-	int rgbw_power;
-	int als_enable;
-	int rgbw_enable;
-	int64_t als_delay_ns;
-	int64_t als_latency_ns;
-	int64_t rgbw_delay_ns;
-	int64_t rgbw_latency_ns;
-	int ps_power;
-	int ps_enable;
-	int64_t ps_delay_ns;
-	int64_t ps_latency_ns;
-};
-
-/* AAL Functions */
-extern int alsps_aal_enable(int enable);
-extern int alsps_aal_get_status(void);
-extern int alsps_aal_get_data(void);
-
-/* for auto detect */
-extern int alsps_driver_add(struct alsps_init_info *obj);
-extern int ps_report_interrupt_data(int value);
-extern int ps_flush_report(void);
-extern int als_data_report(int value, int status);
-extern int als_data_report_t(int value, int status, int64_t time_stamp);
-extern int ps_cali_report(int *value);
-extern int als_cali_report(int *value);
-extern int als_flush_report(void);
-extern int rgbw_data_report(int value[4]);
-extern int rgbw_data_report_t(int value[4], int64_t time_stamp);
-extern int rgbw_flush_report(void);
-extern int als_register_control_path(struct als_control_path *ctl);
-extern int als_register_data_path(struct als_data_path *data);
-extern int ps_data_report(int value, int status);
-extern int ps_data_report_t(int value, int status, int64_t time_stamp);
-extern int ps_register_control_path(struct ps_control_path *ctl);
-extern int ps_register_data_path(struct ps_data_path *data);
-extern struct platform_device *get_alsps_platformdev(void);
-extern int alsps_probe(void);
-extern int alsps_remove(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/alsps_factory.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/alsps_factory.h
deleted file mode 100644
index ee776a0..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/alsps_factory.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __ALSPS_FACTORY_H__
-#define __ALSPS_FACTORY_H__
-
-#include <linux/atomic.h>
-#include <linux/delay.h>
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/kobject.h>
-#include <linux/miscdevice.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-#include <linux/types.h>
-#include <linux/uaccess.h>
-#include <linux/workqueue.h>
-
-#include <hwmsen_helper.h>
-#include <hwmsensor.h>
-#include <sensors_io.h>
-
-/*#include <mach/mt_typedefs.h>*/
-/*#include <mach/mt_gpio.h>*/
-/*#include <mach/mt_pm_ldo.h>*/
-
-#include "alsps.h"
-#include "cust_alsps.h"
-
-struct alsps_factory_fops {
-	int (*als_enable_sensor)(bool enable_disable,
-				 int64_t sample_periods_ms);
-	int (*als_get_data)(int32_t *data);
-	int (*als_get_raw_data)(int32_t *data);
-	int (*als_enable_calibration)(void);
-	int (*als_clear_cali)(void);
-	int (*als_set_cali)(int32_t offset);
-	int (*als_get_cali)(int32_t *offset);
-
-	int (*ps_enable_sensor)(bool enable_disable, int64_t sample_periods_ms);
-	int (*ps_get_data)(int32_t *data);
-	int (*ps_get_raw_data)(int32_t *data);
-	int (*ps_enable_calibration)(void);
-	int (*ps_clear_cali)(void);
-	int (*ps_set_cali)(int32_t offset);
-	int (*ps_get_cali)(int32_t *offset);
-	int (*ps_set_threshold)(int32_t threshold[2]);
-	int (*ps_get_threshold)(int32_t threshold[2]);
-};
-
-struct alsps_factory_public {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct alsps_factory_fops *fops;
-};
-int alsps_factory_device_register(struct alsps_factory_public *dev);
-int alsps_factory_device_deregister(struct alsps_factory_public *dev);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/cust_alsps.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/cust_alsps.h
deleted file mode 100644
index 92d14dc..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/alsps/inc/cust_alsps.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __CUST_ALSPS_H__
-#define __CUST_ALSPS_H__
-
-#include <linux/types.h>
-
-#define C_CUST_ALS_LEVEL 16
-#define C_CUST_I2C_ADDR_NUM 4
-
-#define MAX_THRESHOLD_HIGH 0xffff
-#define MIN_THRESHOLD_LOW 0x0
-
-struct alsps_hw {
-	int i2c_num;	  /*!< the i2c bus used by ALS/PS */
-	int power_id;	 /*!< the VDD power id of the als chip */
-	int power_vol;	/*!< the VDD power voltage of the als chip */
-	int polling_mode;     /*!< 1: polling mode ; 0:interrupt mode*/
-	int polling_mode_ps;  /*!< 1: polling mode ; 0:interrupt mode*/
-	int polling_mode_als; /*!< 1: polling mode ; 0:interrupt mode*/
-	/*!< i2c address list, some chip willhave multiple address*/
-	unsigned char i2c_addr[C_CUST_I2C_ADDR_NUM];
-	/*!< (C_CUST_ALS_LEVEL-1) levels divides all range into C_CUST_ALS_LEVEL
-	 * levels
-	 */
-	unsigned int als_level[C_CUST_ALS_LEVEL - 1];
-	/*!< the value reported in each level */
-	unsigned int als_value[C_CUST_ALS_LEVEL];
-	unsigned int ps_threshold;    /*!< the threshold of proximity sensor */
-	unsigned int als_window_loss; /*!< the window loss  */
-	unsigned int ps_threshold_high;
-	unsigned int ps_threshold_low;
-	unsigned int als_threshold_high;
-	unsigned int als_threshold_low;
-	int als_power_vio_id;  /*!< the VIO power id of the als chip */
-	int als_power_vio_vol; /*!< the VIO power voltage of the als chip */
-	int ps_power_vdd_id;   /*!< the VDD power id of the ps chip */
-	int ps_power_vdd_vol;  /*!< the VDD power voltage of the ps chip */
-	int ps_power_vio_id;   /*!< the VIO power id of the ps chip */
-	int ps_power_vio_vol;  /*!< the VIO power voltage of the ps chip */
-	/*< 1: disable ldo low power mode when psensor enabled ; 0: no action*/
-	int power_lp_mode_ctrl;
-	bool is_batch_supported_ps;
-	bool is_batch_supported_als;
-};
-
-int get_alsps_dts_func(struct device_node *node, struct alsps_hw *hw);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/Kconfig
deleted file mode 100644
index 5aa3de4..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/Kconfig
+++ /dev/null
@@ -1,11 +0,0 @@
-
-config CUSTOM_KERNEL_BAROMETER
-	bool "CUSTOM KERNEL BAROMETER Config"
-	help
-	  one load to support different barometer sensor.
-	  This feature Option is used for projects which using more than one
-	  barometer, and be auto detected by setting this option to yes
-	  If unsure, say N.
-
-source "drivers/misc/mediatek/sensors-1.0/barometer/barohub/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/barometer/BMP280-new/Kconfig"
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/Makefile
deleted file mode 100644
index 6d26cb2..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Copyright (C) 2015 MediaTek Inc.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-
-# In case the platform does NOT support this type of sensors
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)  += baro_common.o
-baro_common-$(CONFIG_MTK_SENSOR_SUPPORT) += barometer.o barometer_factory.o
-
-obj-$(CONFIG_MTK_BAROHUB) += barohub/
-ifneq ($(CONFIG_MTK_BAROHUB),y)
-#obj-$(CONFIG_MTK_BMP280_NEW) += BMP280-new/
-endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/Kconfig
deleted file mode 100644
index 93118c6..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_BAROHUB
-	bool "barohub for MediaTek package"
-	help
-	  It support different barohub sensor.
-	  If this option is set,
-	  it will support
-	  sensorhub gyroscope.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/Makefile
deleted file mode 100644
index 61728fd..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/barometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/scp
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT) += barohub.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/barohub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/barohub.c
deleted file mode 100644
index bf34f95..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/barohub.c
+++ /dev/null
@@ -1,559 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-/*
- * History: V1.0 --- [2013.03.14]Driver creation
- *          V1.1 --- [2013.07.03]Re-write I2C function to fix the bug that
- *                               i2c access error on MT6589 platform.
- *          V1.2 --- [2013.07.04]Add self test function.
- *          V1.3 --- [2013.07.04]Support new chip id 0x57 and 0x58.
- */
-
-#define pr_fmt(fmt) "[barometer] " fmt
-
-#include "barohub.h"
-#include <barometer.h>
-#include <hwmsensor.h>
-#include <SCP_sensorHub.h>
-#include "SCP_power_monitor.h"
-
-/* trace */
-enum BAR_TRC {
-	BAR_TRC_READ = 0x01,
-	BAR_TRC_RAWDATA = 0x02,
-	BAR_TRC_IOCTL = 0x04,
-	BAR_TRC_FILTER = 0x08,
-};
-
-/* barohub i2c client data */
-struct barohub_ipi_data {
-	/* sensor info */
-	atomic_t trace;
-	atomic_t suspend;
-	struct work_struct init_done_work;
-	atomic_t scp_init_done;
-	bool factory_enable;
-	bool android_enable;
-};
-
-static struct barohub_ipi_data *obj_ipi_data;
-static int barohub_local_init(void);
-static int barohub_local_remove(void);
-static int barohub_init_flag = -1;
-static struct baro_init_info barohub_init_info = {
-	.name = "barohub",
-	.init = barohub_local_init,
-	.uninit = barohub_local_remove,
-};
-
-static int barohub_set_powermode(bool enable)
-{
-	int err = 0;
-
-	err = sensor_enable_to_hub(ID_PRESSURE, enable);
-	if (err < 0)
-		pr_err("SCP_sensorHub_req_send fail!\n");
-
-	return err;
-}
-
-/*
- *get compensated pressure
- *unit: hectopascal(hPa)
- */
-static int barohub_get_pressure(char *buf, int bufsize)
-{
-	struct barohub_ipi_data *obj = obj_ipi_data;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-	int pressure;
-	int err = 0;
-
-	if (atomic_read(&obj->suspend))
-		return -3;
-
-	if (buf == NULL)
-		return -1;
-	err = sensor_get_data_from_hub(ID_PRESSURE, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!\n");
-		return err;
-	}
-
-	time_stamp		= data.time_stamp;
-	pressure		= data.pressure_t.pressure;
-	sprintf(buf, "%08x", pressure);
-	if (atomic_read(&obj->trace) & BAR_TRC_IOCTL)
-		pr_debug("compensated pressure value: %s\n", buf);
-
-	return err;
-}
-static ssize_t sensordata_show(struct device_driver *ddri, char *buf)
-{
-	char strbuf[BAROHUB_BUFSIZE] = {0};
-	int err = 0;
-
-	err = barohub_set_powermode(true);
-	if (err < 0) {
-		pr_err("barohub_set_powermode fail!!\n");
-		return 0;
-	}
-	err = barohub_get_pressure(strbuf, BAROHUB_BUFSIZE);
-	if (err < 0) {
-		pr_err("barohub_set_powermode fail!!\n");
-		return 0;
-	}
-	return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
-}
-static ssize_t trace_show(struct device_driver *ddri, char *buf)
-{
-	ssize_t res = 0;
-	struct barohub_ipi_data *obj = obj_ipi_data;
-
-	if (obj == NULL) {
-		pr_err("pointer is null\n");
-		return 0;
-	}
-
-	res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
-	return res;
-}
-
-static ssize_t trace_store(struct device_driver *ddri,
-			const char *buf, size_t count)
-{
-	struct barohub_ipi_data *obj = obj_ipi_data;
-	int trace = 0, res = 0;
-
-	if (obj == NULL) {
-		pr_err("obj is null\n");
-		return 0;
-	}
-	res = kstrtoint(buf, 10, &trace);
-	if (res != 0) {
-		pr_err("invalid content: '%s', length = %d\n",
-							buf, (int)count);
-		return count;
-	}
-	atomic_set(&obj->trace, trace);
-	res = sensor_set_cmd_to_hub(ID_PRESSURE, CUST_ACTION_SET_TRACE, &trace);
-	if (res < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID: %d),(action: %d)\n",
-			ID_PRESSURE, CUST_ACTION_SET_TRACE);
-		return 0;
-	}
-	return count;
-}
-static DRIVER_ATTR_RO(sensordata);
-static DRIVER_ATTR_RW(trace);
-
-static struct driver_attribute *barohub_attr_list[] = {
-	&driver_attr_sensordata,	/* dump sensor data */
-	&driver_attr_trace,	/* trace log */
-};
-
-static int barohub_create_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(barohub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++) {
-		err = driver_create_file(driver, barohub_attr_list[idx]);
-		if (err) {
-			pr_err("driver_create_file (%s) = %d\n",
-				barohub_attr_list[idx]->attr.name, err);
-			break;
-		}
-	}
-	return err;
-}
-
-static int barohub_delete_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(barohub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++)
-		driver_remove_file(driver, barohub_attr_list[idx]);
-
-	return err;
-}
-
-static int baro_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-	struct barohub_ipi_data *obj = obj_ipi_data;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = baro_flush_report();
-	else if (event->flush_action == DATA_ACTION &&
-			READ_ONCE(obj->android_enable) == true)
-		err = baro_data_report(event->pressure_t.pressure, 2,
-			(int64_t)event->time_stamp);
-	return err;
-}
-static int barohub_factory_enable_sensor(bool enabledisable,
-				int64_t sample_periods_ms)
-{
-	int err = 0;
-	struct barohub_ipi_data *obj = obj_ipi_data;
-
-	if (enabledisable == true)
-		WRITE_ONCE(obj->factory_enable, true);
-	else
-		WRITE_ONCE(obj->factory_enable, false);
-
-	if (enabledisable == true) {
-		err = sensor_set_delay_to_hub(ID_PRESSURE, sample_periods_ms);
-		if (err) {
-			pr_err("sensor_set_delay_to_hub failed!\n");
-			return -1;
-		}
-	}
-	err = sensor_enable_to_hub(ID_PRESSURE, enabledisable);
-	if (err) {
-		pr_err("sensor_enable_to_hub failed!\n");
-		return -1;
-	}
-	return 0;
-}
-static int barohub_factory_get_data(int32_t *data)
-{
-	int err = 0;
-	char strbuf[BAROHUB_BUFSIZE];
-
-	err = barohub_get_pressure(strbuf, BAROHUB_BUFSIZE);
-	if (err < 0) {
-		pr_err("barohub_get_pressure fail\n");
-		return -1;
-	}
-	err = kstrtoint(strbuf, 16, data);
-	if (err != 0)
-		pr_debug("kstrtoint fail\n");
-
-	return 0;
-}
-static int barohub_factory_get_raw_data(int32_t *data)
-{
-	return 0;
-}
-static int barohub_factory_enable_calibration(void)
-{
-	return sensor_calibration_to_hub(ID_PRESSURE);
-}
-static int barohub_factory_clear_cali(void)
-{
-	return 0;
-}
-static int barohub_factory_set_cali(int32_t offset)
-{
-	return 0;
-}
-static int barohub_factory_get_cali(int32_t *offset)
-{
-	return 0;
-}
-static int barohub_factory_do_self_test(void)
-{
-	return 0;
-}
-
-static struct baro_factory_fops barohub_factory_fops = {
-	.enable_sensor = barohub_factory_enable_sensor,
-	.get_data = barohub_factory_get_data,
-	.get_raw_data = barohub_factory_get_raw_data,
-	.enable_calibration = barohub_factory_enable_calibration,
-	.clear_cali = barohub_factory_clear_cali,
-	.set_cali = barohub_factory_set_cali,
-	.get_cali = barohub_factory_get_cali,
-	.do_self_test = barohub_factory_do_self_test,
-};
-
-static struct baro_factory_public barohub_factory_device = {
-	.gain = 1,
-	.sensitivity = 1,
-	.fops = &barohub_factory_fops,
-};
-
-static int barohub_open_report_data(int open)
-{
-	return 0;
-}
-
-static int barohub_enable_nodata(int en)
-{
-	int res = 0;
-	bool power = false;
-	struct barohub_ipi_data *obj = obj_ipi_data;
-
-	if (en == true)
-		WRITE_ONCE(obj->android_enable, true);
-	else
-		WRITE_ONCE(obj->android_enable, false);
-
-	if (en == 1)
-		power = true;
-	if (en == 0)
-		power = false;
-
-	res = barohub_set_powermode(power);
-	if (res < 0) {
-		pr_debug("barohub_set_powermode fail\n");
-		return res;
-	}
-	pr_debug("barohub_set_powermode OK!\n");
-	return res;
-}
-
-static int barohub_set_delay(u64 ns)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	int err = 0;
-	unsigned int delayms = 0;
-	struct barohub_ipi_data *obj = obj_ipi_data;
-
-	delayms = (unsigned int)ns / 1000 / 1000;
-	err = sensor_set_delay_to_hub(ID_PRESSURE, delayms);
-	if (err < 0) {
-		pr_err("als_set_delay fail!\n");
-		return err;
-	}
-	return 0;
-#elif defined CONFIG_NANOHUB
-	return 0;
-#else
-	return 0;
-#endif
-}
-static int barohub_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	barohub_set_delay(samplingPeriodNs);
-#endif
-	return sensor_batch_to_hub(ID_PRESSURE,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int barohub_flush(void)
-{
-	return sensor_flush_to_hub(ID_PRESSURE);
-}
-static int barohub_get_data(int *value, int *status)
-{
-	char buff[BAROHUB_BUFSIZE] = {0};
-	int err = 0;
-
-	err = barohub_get_pressure(buff, BAROHUB_BUFSIZE);
-
-	if (err) {
-		pr_err("get compensated pressure value failed, err = %d\n",
-			err);
-		return -1;
-	}
-
-	err = kstrtoint(buff, 16, value);
-	if (err == 0)
-		*status = SENSOR_STATUS_ACCURACY_MEDIUM;
-
-	return 0;
-}
-static int scp_ready_event(uint8_t event, void *ptr)
-{
-	struct barohub_ipi_data *obj = obj_ipi_data;
-
-	switch (event) {
-	case SENSOR_POWER_UP:
-	    atomic_set(&obj->scp_init_done, 1);
-		break;
-	case SENSOR_POWER_DOWN:
-	    atomic_set(&obj->scp_init_done, 0);
-		break;
-	}
-	return 0;
-}
-
-static struct scp_power_monitor scp_ready_notifier = {
-	.name = "baro",
-	.notifier_call = scp_ready_event,
-};
-
-static int barohub_probe(struct platform_device *pdev)
-{
-	struct barohub_ipi_data *obj;
-	struct baro_control_path ctl = { 0 };
-	struct baro_data_path data = { 0 };
-	int err = 0;
-	struct platform_driver *paddr =
-				barohub_init_info.platform_diver_addr;
-
-	pr_debug("%s\n", __func__);
-
-	obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-	if (!obj) {
-		err = -ENOMEM;
-		goto exit;
-	}
-
-	obj_ipi_data = obj;
-	platform_set_drvdata(pdev, obj);
-
-	atomic_set(&obj->trace, 0);
-	atomic_set(&obj->suspend, 0);
-	WRITE_ONCE(obj->factory_enable, false);
-	WRITE_ONCE(obj->android_enable, false);
-
-	atomic_set(&obj->scp_init_done, 0);
-	scp_power_monitor_register(&scp_ready_notifier);
-	err = scp_sensorHub_data_registration(ID_PRESSURE, baro_recv_data);
-	if (err < 0) {
-		pr_err("scp_sensorHub_data_registration failed\n");
-		goto exit_kfree;
-	}
-	err = baro_factory_device_register(&barohub_factory_device);
-	if (err) {
-		pr_err("baro_factory_device_register failed, err = %d\n",
-			err);
-		goto exit_kfree;
-	}
-
-	ctl.is_use_common_factory = false;
-	err = barohub_create_attr(&paddr->driver);
-	if (err) {
-		pr_err("create attribute failed, err = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-
-	ctl.open_report_data = barohub_open_report_data;
-	ctl.enable_nodata = barohub_enable_nodata;
-	ctl.set_delay = barohub_set_delay;
-	ctl.batch = barohub_batch;
-	ctl.flush = barohub_flush;
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	ctl.is_report_input_direct = false;
-	ctl.is_support_batch = false;
-#elif defined CONFIG_NANOHUB
-	ctl.is_report_input_direct = true;
-	ctl.is_support_batch = true;
-#else
-#endif
-	err = baro_register_control_path(&ctl);
-	if (err) {
-		pr_err("register baro control path err\n");
-		goto exit_create_attr_failed;
-	}
-
-	data.get_data = barohub_get_data;
-	data.vender_div = 100;
-	err = baro_register_data_path(&data);
-	if (err) {
-		pr_err("baro_register_data_path failed, err = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-
-	barohub_init_flag = 0;
-	pr_debug("%s: OK\n", __func__);
-	return 0;
-
-exit_create_attr_failed:
-	barohub_delete_attr(&(barohub_init_info.platform_diver_addr->driver));
-exit_kfree:
-	kfree(obj);
-	obj_ipi_data = NULL;
-exit:
-	pr_err("err = %d\n", err);
-	barohub_init_flag = -1;
-	return err;
-}
-
-static int barohub_remove(struct platform_device *pdev)
-{
-	int err = 0;
-	struct platform_driver *paddr =
-				barohub_init_info.platform_diver_addr;
-
-	err = barohub_delete_attr(&paddr->driver);
-	if (err)
-		pr_err("barohub_delete_attr failed, err = %d\n", err);
-
-	baro_factory_device_deregister(&barohub_factory_device);
-
-	obj_ipi_data = NULL;
-	kfree(platform_get_drvdata(pdev));
-
-	return 0;
-}
-static int barohub_suspend(struct platform_device *pdev, pm_message_t msg)
-{
-	return 0;
-}
-
-static int barohub_resume(struct platform_device *pdev)
-{
-	return 0;
-}
-static struct platform_device barohub_device = {
-	.name = BAROHUB_DEV_NAME,
-	.id = -1,
-};
-
-static struct platform_driver barohub_driver = {
-	.driver = {
-		.name = BAROHUB_DEV_NAME,
-	},
-	.probe = barohub_probe,
-	.remove = barohub_remove,
-	.suspend = barohub_suspend,
-	.resume = barohub_resume,
-};
-
-static int barohub_local_remove(void)
-{
-	pr_debug("%s\n", __func__);
-	platform_driver_unregister(&barohub_driver);
-	return 0;
-}
-
-static int barohub_local_init(void)
-{
-	if (platform_driver_register(&barohub_driver)) {
-		pr_err("add driver error\n");
-		return -1;
-	}
-	if (-1 == barohub_init_flag)
-		return -1;
-	return 0;
-}
-
-static int __init barohub_init(void)
-{
-	pr_debug("%s\n", __func__);
-	if (platform_device_register(&barohub_device)) {
-		pr_err("baro platform device error\n");
-		return -1;
-	}
-	baro_driver_add(&barohub_init_info);
-	return 0;
-}
-
-static void __exit barohub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-	platform_driver_unregister(&barohub_driver);
-}
-
-module_init(barohub_init);
-module_exit(barohub_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("BAROHUB Driver");
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
-MODULE_VERSION(BAROHUB_DRIVER_VERSION);
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/barohub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/barohub.h
deleted file mode 100644
index 0503328..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barohub/barohub.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef _BAROHUB_H
-#define _BAROHUB_H
-
-#include <linux/ioctl.h>
-
-
-#define BAROHUB_DRIVER_VERSION "V0.1"
-
-#define BAROHUB_DEV_NAME        "baro_hub_pl"
-
-#define BAROHUB_DATA_NUM 1
-#define BAROHUB_PRESSURE         0
-#define BAROHUB_BUFSIZE			60
-
-#endif/* BOSCH_BARO_H */
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barometer.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barometer.c
deleted file mode 100644
index e416605..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barometer.c
+++ /dev/null
@@ -1,699 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "Barometer " fmt
-
-#include "inc/barometer.h"
-
-struct baro_context *baro_context_obj /* = NULL*/;
-
-static void initTimer(struct hrtimer *timer,
-		      enum hrtimer_restart (*callback)(struct hrtimer *))
-{
-	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
-	timer->function = callback;
-}
-
-static void startTimer(struct hrtimer *timer, int delay_ms, bool first)
-{
-	struct baro_context *obj = (struct baro_context *)container_of(timer,
-		struct baro_context, hrTimer);
-
-	if (obj == NULL) {
-		pr_err("NULL pointer\n");
-		return;
-	}
-
-	if (first) {
-		obj->target_ktime =
-			ktime_add_ns(ktime_get(), (int64_t)delay_ms * 1000000);
-
-		/* pr_debug("cur_ns = %lld, first_target_ns = %lld\n",
-		 *	ktime_to_ns(ktime_get()),
-		 * ktime_to_ns(obj->target_ktime));
-		 */
-	} else {
-		do {
-			obj->target_ktime = ktime_add_ns(
-				obj->target_ktime, (int64_t)delay_ms * 1000000);
-		} while (ktime_to_ns(obj->target_ktime) <
-			 ktime_to_ns(ktime_get()));
-
-		/* pr_debug("cur_ns = %lld, target_ns = %lld\n",
-		 *	ktime_to_ns(ktime_get()),
-		 *	ktime_to_ns(obj->target_ktime));
-		 */
-	}
-
-	hrtimer_start(timer, obj->target_ktime, HRTIMER_MODE_ABS);
-}
-
-#if !defined(CONFIG_NANOHUB) || !defined(CONFIG_MTK_BAROHUB)
-static void stopTimer(struct hrtimer *timer)
-{
-	hrtimer_cancel(timer);
-}
-#endif
-static struct baro_init_info *barometer_init_list[MAX_CHOOSE_BARO_NUM] = {0};
-
-static void baro_work_func(struct work_struct *work)
-{
-
-	struct baro_context *cxt = NULL;
-	/* hwm_sensor_data sensor_data; */
-	int value, status;
-	int64_t pre_ns, cur_ns;
-	int64_t delay_ms;
-	struct timespec time;
-	int err;
-
-	cxt = baro_context_obj;
-	delay_ms = atomic_read(&cxt->delay);
-
-	if (cxt->baro_data.get_data == NULL) {
-		pr_debug("baro driver not register data path\n");
-		goto baro_loop;
-	}
-
-	time.tv_sec = time.tv_nsec = 0;
-	get_monotonic_boottime(&time);
-	cur_ns = time.tv_sec * 1000000000LL + time.tv_nsec;
-
-	/* add wake lock to make sure data can be read before system suspend */
-	err = cxt->baro_data.get_data(&value, &status);
-
-	if (err) {
-		pr_err("get baro data fails!!\n");
-		goto baro_loop;
-	} else {
-		{
-			cxt->drv_data.baro_data.values[0] = value;
-			cxt->drv_data.baro_data.status = status;
-			pre_ns = cxt->drv_data.baro_data.time;
-			cxt->drv_data.baro_data.time = cur_ns;
-		}
-	}
-
-	if (true == cxt->is_first_data_after_enable) {
-		pre_ns = cur_ns;
-		cxt->is_first_data_after_enable = false;
-		/* filter -1 value */
-		if (cxt->drv_data.baro_data.values[0] == BARO_INVALID_VALUE) {
-			pr_debug(" read invalid data\n");
-			goto baro_loop;
-		}
-	}
-	/* report data to input device */
-	/*pr_debug("new baro work run....\n"); */
-	/*pr_debug("baro data[%d].\n", cxt->drv_data.baro_data.values[0]); */
-
-	while ((cur_ns - pre_ns) >= delay_ms * 1800000LL) {
-		pre_ns += delay_ms * 1000000LL;
-		baro_data_report(cxt->drv_data.baro_data.values[0],
-				 cxt->drv_data.baro_data.status, pre_ns);
-	}
-
-	baro_data_report(cxt->drv_data.baro_data.values[0],
-			 cxt->drv_data.baro_data.status,
-			 cxt->drv_data.baro_data.time);
-
-baro_loop:
-	if (true == cxt->is_polling_run) {
-		{
-			startTimer(&cxt->hrTimer, atomic_read(&cxt->delay),
-				   false);
-		}
-	}
-}
-
-enum hrtimer_restart baro_poll(struct hrtimer *timer)
-{
-	struct baro_context *obj = (struct baro_context *)container_of(timer,
-		struct baro_context, hrTimer);
-
-	queue_work(obj->baro_workqueue, &obj->report);
-
-	return HRTIMER_NORESTART;
-}
-
-static struct baro_context *baro_context_alloc_object(void)
-{
-
-	struct baro_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-
-	pr_debug("%s start\n", __func__);
-	if (!obj) {
-		pr_err("Alloc baro object error!\n");
-		return NULL;
-	}
-	atomic_set(&obj->delay, 200); /*5Hz set work queue delay time 200 ms */
-	atomic_set(&obj->wake, 0);
-	INIT_WORK(&obj->report, baro_work_func);
-	obj->baro_workqueue = NULL;
-	obj->baro_workqueue = create_workqueue("baro_polling");
-	if (!obj->baro_workqueue) {
-		kfree(obj);
-		return NULL;
-	}
-	initTimer(&obj->hrTimer, baro_poll);
-	obj->is_first_data_after_enable = false;
-	obj->is_polling_run = false;
-	mutex_init(&obj->baro_op_mutex);
-	obj->is_batch_enable = false; /* for batch mode init */
-	obj->power = 0;
-	obj->enable = 0;
-	obj->delay_ns = -1;
-	obj->latency_ns = -1;
-
-	pr_debug("%s end\n", __func__);
-	return obj;
-}
-#if !defined(CONFIG_NANOHUB) || !defined(CONFIG_MTK_BAROHUB)
-static int baro_enable_and_batch(void)
-{
-	struct baro_context *cxt = baro_context_obj;
-	int err;
-
-	/* power on -> power off */
-	if (cxt->power == 1 && cxt->enable == 0) {
-		pr_debug("BARO disable\n");
-		/* stop polling firstly, if needed */
-		if (cxt->baro_ctl.is_report_input_direct == false &&
-		    cxt->is_polling_run == true) {
-			smp_mb(); /* for memory barrier */
-			stopTimer(&cxt->hrTimer);
-			smp_mb(); /* for memory barrier */
-			cancel_work_sync(&cxt->report);
-			cxt->drv_data.baro_data.values[0] = BARO_INVALID_VALUE;
-			cxt->is_polling_run = false;
-			pr_debug("baro stop polling done\n");
-		}
-		/* turn off the power */
-		err = cxt->baro_ctl.enable_nodata(0);
-		if (err) {
-			pr_err("baro turn off power err = %d\n", err);
-			return -1;
-		}
-		pr_debug("baro turn off power done\n");
-
-		cxt->power = 0;
-		cxt->delay_ns = -1;
-		pr_debug("BARO disable done\n");
-		return 0;
-	}
-	/* power off -> power on */
-	if (cxt->power == 0 && cxt->enable == 1) {
-		pr_debug("BARO power on\n");
-		err = cxt->baro_ctl.enable_nodata(1);
-		if (err) {
-			pr_err("baro turn on power err = %d\n", err);
-			return -1;
-		}
-		pr_debug("baro turn on power done\n");
-
-		cxt->power = 1;
-		pr_debug("BARO power on done\n");
-	}
-	/* rate change */
-	if (cxt->power == 1 && cxt->delay_ns >= 0) {
-		pr_debug("BARO set batch\n");
-		/* set ODR, fifo timeout latency */
-		if (cxt->baro_ctl.is_support_batch)
-			err = cxt->baro_ctl.batch(0, cxt->delay_ns,
-						  cxt->latency_ns);
-		else
-			err = cxt->baro_ctl.batch(0, cxt->delay_ns, 0);
-		if (err) {
-			pr_err("baro set batch(ODR) err %d\n", err);
-			return -1;
-		}
-		pr_debug("baro set ODR, fifo latency done\n");
-		/* start polling, if needed */
-		if (cxt->baro_ctl.is_report_input_direct == false) {
-			uint64_t mdelay = cxt->delay_ns;
-
-			do_div(mdelay, 1000000);
-			atomic_set(&cxt->delay, mdelay);
-			/* the first sensor start polling timer */
-			if (cxt->is_polling_run == false) {
-				cxt->is_polling_run = true;
-				cxt->is_first_data_after_enable = true;
-				startTimer(&cxt->hrTimer,
-					   atomic_read(&cxt->delay), true);
-			}
-			pr_debug("baro set polling delay %d ms\n",
-				 atomic_read(&cxt->delay));
-		}
-		pr_debug("BARO batch done\n");
-	}
-	return 0;
-}
-#endif
-static ssize_t baroactive_store(struct device *dev,
-				 struct device_attribute *attr, const char *buf,
-				 size_t count)
-{
-	struct baro_context *cxt = baro_context_obj;
-	int err = 0;
-
-	pr_debug("%s buf=%s\n", __func__, buf);
-	mutex_lock(&baro_context_obj->baro_op_mutex);
-	if (!strncmp(buf, "1", 1))
-		cxt->enable = 1;
-	else if (!strncmp(buf, "0", 1))
-		cxt->enable = 0;
-	else {
-		pr_err("%s error !!\n", __func__);
-		err = -1;
-		goto err_out;
-	}
-#if defined(CONFIG_NANOHUB) && defined(CONFIG_MTK_BAROHUB)
-	err = cxt->baro_ctl.enable_nodata(cxt->enable);
-	if (err) {
-		pr_err("baro turn on power err = %d\n", err);
-		goto err_out;
-	}
-#else
-	err = baro_enable_and_batch();
-#endif
-err_out:
-	mutex_unlock(&baro_context_obj->baro_op_mutex);
-	pr_debug("%s done\n", __func__);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-/*----------------------------------------------------------------------------*/
-static ssize_t baroactive_show(struct device *dev,
-				struct device_attribute *attr, char *buf)
-{
-	struct baro_context *cxt = NULL;
-	int div;
-
-	cxt = baro_context_obj;
-	div = cxt->baro_data.vender_div;
-
-	pr_debug("baro vender_div value: %d\n", div);
-	return snprintf(buf, PAGE_SIZE, "%d\n", div);
-}
-
-static ssize_t barobatch_store(struct device *dev,
-				struct device_attribute *attr, const char *buf,
-				size_t count)
-{
-	struct baro_context *cxt = baro_context_obj;
-	int handle = 0, flag = 0, err = 0;
-
-	err = sscanf(buf, "%d,%d,%lld,%lld", &handle, &flag, &cxt->delay_ns,
-		     &cxt->latency_ns);
-	if (err != 4) {
-		pr_err("grav_store_batch param error: err = %d\n", err);
-		return -1;
-	}
-
-	mutex_lock(&baro_context_obj->baro_op_mutex);
-#if defined(CONFIG_NANOHUB) && defined(CONFIG_MTK_BAROHUB)
-	if (cxt->baro_ctl.is_support_batch)
-		err = cxt->baro_ctl.batch(0, cxt->delay_ns, cxt->latency_ns);
-	else
-		err = cxt->baro_ctl.batch(0, cxt->delay_ns, 0);
-	if (err)
-		pr_err("baro set batch(ODR) err %d\n", err);
-#else
-	err = baro_enable_and_batch();
-#endif
-	mutex_unlock(&baro_context_obj->baro_op_mutex);
-	pr_debug("%s done: %d\n", __func__, cxt->is_batch_enable);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t barobatch_show(struct device *dev,
-			       struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t baroflush_store(struct device *dev,
-				struct device_attribute *attr, const char *buf,
-				size_t count)
-{
-	struct baro_context *cxt = NULL;
-	int handle = 0, err = 0;
-
-	err = kstrtoint(buf, 10, &handle);
-	if (err != 0)
-		pr_err("%s param error: err = %d\n", __func__, err);
-
-	pr_debug("%s param: handle %d\n", __func__, handle);
-
-	mutex_lock(&baro_context_obj->baro_op_mutex);
-	cxt = baro_context_obj;
-	if (cxt->baro_ctl.flush != NULL)
-		err = cxt->baro_ctl.flush();
-	else
-		pr_err(
-			"BARO DRIVER OLD ARCHITECTURE DON'T SUPPORT BARO COMMON VERSION FLUSH\n");
-	if (err < 0)
-		pr_err("baro enable flush err %d\n", err);
-	mutex_unlock(&baro_context_obj->baro_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t baroflush_show(struct device *dev,
-			       struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t barodevnum_show(struct device *dev,
-				struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static int barometer_remove(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static int barometer_probe(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-#ifdef CONFIG_OF
-static const struct of_device_id barometer_of_match[] = {
-	{
-		.compatible = "mediatek,barometer",
-	},
-	{},
-};
-#endif
-
-static struct platform_driver barometer_driver = {
-	.probe = barometer_probe,
-	.remove = barometer_remove,
-	.driver = {
-		.name = "barometer",
-#ifdef CONFIG_OF
-		.of_match_table = barometer_of_match,
-#endif
-	}
-};
-
-static int baro_real_driver_init(void)
-{
-	int i = 0;
-	int err = 0;
-
-	pr_debug("%s start\n", __func__);
-	for (i = 0; i < MAX_CHOOSE_BARO_NUM; i++) {
-		pr_debug(" i=%d\n", i);
-		if (barometer_init_list[i] != 0) {
-			pr_debug(" baro try to init driver %s\n",
-				 barometer_init_list[i]->name);
-			err = barometer_init_list[i]->init();
-			if (err == 0) {
-				pr_debug(" baro real driver %s probe ok\n",
-					 barometer_init_list[i]->name);
-				break;
-			}
-		}
-	}
-
-	if (i == MAX_CHOOSE_BARO_NUM) {
-		pr_debug("%s fail\n", __func__);
-		err = -1;
-	}
-	return err;
-}
-
-int baro_driver_add(struct baro_init_info *obj)
-{
-	int err = 0;
-	int i = 0;
-
-	pr_debug("%s\n", __func__);
-	if (!obj) {
-		pr_err("BARO driver add fail, baro_init_info is NULL\n");
-		return -1;
-	}
-
-	for (i = 0; i < MAX_CHOOSE_BARO_NUM; i++) {
-		if (i == 0) {
-			pr_debug(
-				"register barometer driver for the first time\n");
-			if (platform_driver_register(&barometer_driver))
-				pr_err(
-					"failed to register gensor driver already exist\n");
-		}
-
-		if (barometer_init_list[i] == NULL) {
-			obj->platform_diver_addr = &barometer_driver;
-			barometer_init_list[i] = obj;
-			break;
-		}
-	}
-	if (i >= MAX_CHOOSE_BARO_NUM) {
-		pr_err("BARO driver add err\n");
-		err = -1;
-	}
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(baro_driver_add);
-
-static int pressure_open(struct inode *inode, struct file *file)
-{
-	nonseekable_open(inode, file);
-	return 0;
-}
-
-static ssize_t pressure_read(struct file *file, char __user *buffer,
-			     size_t count, loff_t *ppos)
-{
-	ssize_t read_cnt = 0;
-
-	read_cnt = sensor_event_read(baro_context_obj->mdev.minor, file, buffer,
-				     count, ppos);
-
-	return read_cnt;
-}
-
-static unsigned int pressure_poll(struct file *file, poll_table *wait)
-{
-	return sensor_event_poll(baro_context_obj->mdev.minor, file, wait);
-}
-
-static const struct file_operations pressure_fops = {
-	.owner = THIS_MODULE,
-	.open = pressure_open,
-	.read = pressure_read,
-	.poll = pressure_poll,
-};
-
-static int baro_misc_init(struct baro_context *cxt)
-{
-
-	int err = 0;
-
-	cxt->mdev.minor = ID_PRESSURE;
-	cxt->mdev.name = BARO_MISC_DEV_NAME;
-	cxt->mdev.fops = &pressure_fops;
-	err = sensor_attr_register(&cxt->mdev);
-	if (err)
-		pr_err("unable to register baro misc device!!\n");
-
-	return err;
-}
-
-DEVICE_ATTR_RW(baroactive);
-DEVICE_ATTR_RW(barobatch);
-DEVICE_ATTR_RW(baroflush);
-DEVICE_ATTR_RO(barodevnum);
-
-static struct attribute *baro_attributes[] = {
-	&dev_attr_baroactive.attr,
-	&dev_attr_barobatch.attr,
-	&dev_attr_baroflush.attr,
-	&dev_attr_barodevnum.attr,
-	NULL
-};
-
-static struct attribute_group baro_attribute_group = {
-	.attrs = baro_attributes
-};
-
-int baro_register_data_path(struct baro_data_path *data)
-{
-	struct baro_context *cxt = NULL;
-
-	cxt = baro_context_obj;
-	cxt->baro_data.get_data = data->get_data;
-	cxt->baro_data.vender_div = data->vender_div;
-	cxt->baro_data.get_raw_data = data->get_raw_data;
-	pr_debug("baro register data path vender_div: %d\n",
-		 cxt->baro_data.vender_div);
-	if (cxt->baro_data.get_data == NULL) {
-		pr_debug("baro register data path fail\n");
-		return -1;
-	}
-	return 0;
-}
-EXPORT_SYMBOL_GPL(baro_register_data_path);
-
-int baro_register_control_path(struct baro_control_path *ctl)
-{
-	struct baro_context *cxt = NULL;
-	int err = 0;
-
-	cxt = baro_context_obj;
-	cxt->baro_ctl.set_delay = ctl->set_delay;
-	cxt->baro_ctl.open_report_data = ctl->open_report_data;
-	cxt->baro_ctl.enable_nodata = ctl->enable_nodata;
-	cxt->baro_ctl.batch = ctl->batch;
-	cxt->baro_ctl.flush = ctl->flush;
-	cxt->baro_ctl.is_support_batch = ctl->is_support_batch;
-	cxt->baro_ctl.is_report_input_direct = ctl->is_report_input_direct;
-	cxt->baro_ctl.is_support_batch = ctl->is_support_batch;
-	cxt->baro_ctl.is_use_common_factory = ctl->is_use_common_factory;
-
-	if (cxt->baro_ctl.set_delay == NULL ||
-	    cxt->baro_ctl.open_report_data == NULL ||
-	    cxt->baro_ctl.enable_nodata == NULL) {
-		pr_debug("baro register control path fail\n");
-		return -1;
-	}
-
-	/* add misc dev for sensor hal control cmd */
-	err = baro_misc_init(baro_context_obj);
-	if (err) {
-		pr_err("unable to register baro misc device!!\n");
-		return -2;
-	}
-	err = sysfs_create_group(&baro_context_obj->mdev.this_device->kobj,
-				 &baro_attribute_group);
-	if (err < 0) {
-		pr_err("unable to create baro attribute file\n");
-		return -3;
-	}
-
-	kobject_uevent(&baro_context_obj->mdev.this_device->kobj, KOBJ_ADD);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(baro_register_control_path);
-
-int baro_data_report(int value, int status, int64_t nt)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = DATA_ACTION;
-	event.time_stamp = nt;
-	event.word[0] = value;
-	event.status = status;
-
-	err = sensor_input_event(baro_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(baro_data_report);
-
-int baro_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	pr_debug_ratelimited("flush\n");
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(baro_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(baro_flush_report);
-
-int baro_probe(void)
-{
-	int err;
-
-	pr_debug("%s+++!!\n", __func__);
-
-	baro_context_obj = baro_context_alloc_object();
-	if (!baro_context_obj) {
-		err = -ENOMEM;
-		pr_err("unable to allocate devobj!\n");
-		goto exit_alloc_data_failed;
-	}
-
-	/* init real baro driver */
-	err = baro_real_driver_init();
-	if (err) {
-		pr_err("baro real driver init fail\n");
-		goto real_driver_init_fail;
-	}
-
-	pr_debug("%s--- OK !!\n", __func__);
-	return 0;
-
-real_driver_init_fail:
-	kfree(baro_context_obj);
-	baro_context_obj = NULL;
-exit_alloc_data_failed:
-
-	pr_debug("%s----fail !!!\n", __func__);
-	return err;
-}
-EXPORT_SYMBOL_GPL(baro_probe);
-
-int baro_remove(void)
-{
-	int err = 0;
-
-	pr_debug("%s\n", __func__);
-
-	sysfs_remove_group(&baro_context_obj->mdev.this_device->kobj,
-			   &baro_attribute_group);
-
-	err = sensor_attr_deregister(&baro_context_obj->mdev);
-	if (err)
-		pr_err("misc_deregister fail: %d\n", err);
-	kfree(baro_context_obj);
-
-	platform_driver_unregister(&barometer_driver);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(baro_remove);
-
-static int __init baro_init(void)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static void __exit baro_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(baro_init);
-module_exit(baro_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("BAROMETER device driver");
-MODULE_AUTHOR("Mediatek");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barometer_factory.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barometer_factory.c
deleted file mode 100644
index a04f2c0..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/barometer_factory.c
+++ /dev/null
@@ -1,177 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<BARO_FAC> " fmt
-
-#include "inc/barometer_factory.h"
-
-struct baro_factory_private {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct baro_factory_fops *fops;
-};
-
-static struct baro_factory_private baro_factory;
-
-static int baro_factory_open(struct inode *inode, struct file *file)
-{
-	return nonseekable_open(inode, file);
-}
-
-static int baro_factory_release(struct inode *inode, struct file *file)
-{
-	file->private_data = NULL;
-	return 0;
-}
-
-static long baro_factory_unlocked_ioctl(struct file *file, unsigned int cmd,
-					unsigned long arg)
-{
-	long err = 0;
-	void __user *ptr = (void __user *)arg;
-	int data = 0;
-	uint32_t flag = 0;
-
-	if (_IOC_DIR(cmd) & _IOC_READ)
-		err = !access_ok(VERIFY_WRITE, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-	else if (_IOC_DIR(cmd) & _IOC_WRITE)
-		err = !access_ok(VERIFY_READ, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-
-	if (err) {
-		pr_err("access error: %08X, (%2d, %2d)\n", cmd,
-			    _IOC_DIR(cmd), _IOC_SIZE(cmd));
-		return -EFAULT;
-	}
-
-	switch (cmd) {
-	case BAROMETER_IOCTL_INIT:
-		if (copy_from_user(&flag, ptr, sizeof(flag)))
-			return -EFAULT;
-		if (baro_factory.fops != NULL &&
-		    baro_factory.fops->enable_sensor != NULL) {
-			err = baro_factory.fops->enable_sensor(flag, 200);
-			if (err < 0) {
-				pr_err("BAROMETER_IOCTL_INIT fail!\n");
-				return -EINVAL;
-			}
-			pr_debug(
-				"BAROMETER_IOCTL_INIT, enable: %d, sample_period:%dms\n",
-				flag, 200);
-		} else {
-			pr_err("BAROMETER_IOCTL_INIT NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case BAROMETER_GET_PRESS_DATA:
-		if (baro_factory.fops != NULL &&
-		    baro_factory.fops->get_data != NULL) {
-			err = baro_factory.fops->get_data(&data);
-			if (err < 0) {
-				pr_err(
-					"BAROMETER_GET_PRESS_DATA read data fail!\n");
-				return -EINVAL;
-			}
-			if (copy_to_user(ptr, &data, sizeof(data)))
-				return -EFAULT;
-		} else {
-			pr_err("BAROMETER_GET_PRESS_DATA NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case BAROMETER_IOCTL_ENABLE_CALI:
-		if (baro_factory.fops != NULL &&
-		    baro_factory.fops->enable_calibration != NULL) {
-			err = baro_factory.fops->enable_calibration();
-			if (err < 0) {
-				pr_err(
-					"BAROMETER_IOCTL_ENABLE_CALI fail!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("BAROMETER_IOCTL_ENABLE_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case BAROMETER_GET_TEMP_DATA:
-		return 0;
-	default:
-		pr_err("unknown IOCTL: 0x%08x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-	return 0;
-}
-
-#if IS_ENABLED(CONFIG_COMPAT)
-static long compat_baro_factory_unlocked_ioctl(struct file *filp,
-					       unsigned int cmd,
-					       unsigned long arg)
-{
-	if (!filp->f_op || !filp->f_op->unlocked_ioctl) {
-		pr_err(
-			"compat_ion_ioctl file has no f_op or no f_op->unlocked_ioctl.\n");
-		return -ENOTTY;
-	}
-
-	switch (cmd) {
-	case COMPAT_BAROMETER_IOCTL_INIT:
-	/* case COMPAT_BAROMETER_IOCTL_READ_CHIPINFO: */
-	case COMPAT_BAROMETER_GET_PRESS_DATA:
-	case COMPAT_BAROMETER_GET_TEMP_DATA:
-	case COMPAT_BAROMETER_IOCTL_ENABLE_CALI: {
-		pr_debug(
-			"compat_ion_ioctl : BAROMETER_IOCTL_XXX command is 0x%x\n",
-			cmd);
-		return filp->f_op->unlocked_ioctl(
-			filp, cmd, (unsigned long)compat_ptr(arg));
-	}
-	default:
-		pr_err("compat_ion_ioctl : No such command!! 0x%x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-}
-#endif
-/*----------------------------------------------------------------------------*/
-static const struct file_operations baro_factory_fops = {
-	.open = baro_factory_open,
-	.release = baro_factory_release,
-	.unlocked_ioctl = baro_factory_unlocked_ioctl,
-#if IS_ENABLED(CONFIG_COMPAT)
-	.compat_ioctl = compat_baro_factory_unlocked_ioctl,
-#endif
-};
-
-static struct miscdevice baro_factory_device = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = "barometer",
-	.fops = &baro_factory_fops,
-};
-
-int baro_factory_device_register(struct baro_factory_public *dev)
-{
-	int err = 0;
-
-	if (!dev || !dev->fops)
-		return -1;
-	baro_factory.gain = dev->gain;
-	baro_factory.sensitivity = dev->sensitivity;
-	baro_factory.fops = dev->fops;
-	err = misc_register(&baro_factory_device);
-	if (err) {
-		pr_err("baro_factory_device register failed\n");
-		err = -1;
-	}
-	return err;
-}
-EXPORT_SYMBOL(baro_factory_device_register);
-
-int baro_factory_device_deregister(struct baro_factory_public *dev)
-{
-	baro_factory.fops = NULL;
-	misc_deregister(&baro_factory_device);
-	return 0;
-}
-EXPORT_SYMBOL(baro_factory_device_deregister);
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/inc/barometer.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/inc/barometer.h
deleted file mode 100644
index 7b367ce..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/inc/barometer.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __BARO_H__
-#define __BARO_H__
-
-#include <linux/atomic.h>
-#include <linux/i2c.h>
-#include <linux/io.h>
-#include <linux/irq.h>
-#include <linux/kobject.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/uaccess.h>
-//#include <linux/wakelock.h>
-#include "barometer_factory.h"
-#include "sensor_attr.h"
-#include "sensor_event.h"
-#include <hwmsensor.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/interrupt.h>
-#include <linux/miscdevice.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/poll.h>
-#include <linux/slab.h>
-#include <linux/workqueue.h>
-#include <sensors_io.h>
-
-#define OP_BARO_DELAY 0X01
-#define OP_BARO_ENABLE 0X02
-#define OP_BARO_GET_DATA 0X04
-
-#define BARO_INVALID_VALUE -1
-
-#define EVENT_TYPE_BARO_VALUE REL_X
-#define EVENT_TYPE_BARO_STATUS ABS_WHEEL
-#define EVENT_TYPE_BARO_TIMESTAMP_HI REL_HWHEEL
-#define EVENT_TYPE_BARO_TIMESTAMP_LO REL_DIAL
-
-#define BARO_VALUE_MAX (32767)
-#define BARO_VALUE_MIN (-32768)
-#define BARO_STATUS_MIN (0)
-#define BARO_STATUS_MAX (64)
-#define BARO_DIV_MAX (32767)
-#define BARO_DIV_MIN (1)
-
-#define MAX_CHOOSE_BARO_NUM 5
-
-struct baro_control_path {
-	int (*open_report_data)(int open);
-	int (*enable_nodata)(int en);
-	int (*set_delay)(u64 delay);
-	int (*batch)(int flag, int64_t samplingPeriodNs,
-		     int64_t maxBatchReportLatencyNs);
-	int (*flush)(void); /* open data rerport to HAL */
-	int (*baroess_data_fifo)(void);
-	bool is_report_input_direct;
-	bool is_support_batch;
-	bool is_use_common_factory;
-};
-
-struct baro_data_path {
-	int (*get_data)(int *value, int *status);
-	int (*get_raw_data)(int type, int *value);
-	int vender_div;
-};
-
-struct baro_init_info {
-	char *name;
-	int (*init)(void);
-	int (*uninit)(void);
-	struct platform_driver *platform_diver_addr;
-};
-
-struct baro_data {
-	struct hwm_sensor_data baro_data;
-	int data_updata;
-};
-
-struct baro_drv_obj {
-	void *self;
-	int polling;
-	int (*baro_operate)(void *self, uint32_t command, void *buff_in,
-			    int size_in, void *buff_out, int size_out,
-			    int *actualout);
-};
-
-struct baro_context {
-	struct input_dev *idev;
-	struct sensor_attr_t mdev;
-	struct work_struct report;
-	struct mutex baro_op_mutex;
-	atomic_t delay;
-	atomic_t wake;
-	struct timer_list timer;
-	struct hrtimer hrTimer;
-	ktime_t target_ktime;
-	atomic_t trace;
-	struct workqueue_struct *baro_workqueue;
-
-	struct baro_data drv_data;
-	struct baro_control_path baro_ctl;
-	struct baro_data_path baro_data;
-	bool is_first_data_after_enable;
-	bool is_polling_run;
-	bool is_batch_enable;
-	int power;
-	int enable;
-	int64_t delay_ns;
-	int64_t latency_ns;
-};
-
-extern int baro_driver_add(struct baro_init_info *obj);
-extern int baro_data_report(int value, int status, int64_t nt);
-extern int baro_flush_report(void);
-extern int baro_register_control_path(struct baro_control_path *ctl);
-extern int baro_register_data_path(struct baro_data_path *data);
-extern int baro_probe(void);
-extern int baro_remove(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/inc/barometer_factory.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/inc/barometer_factory.h
deleted file mode 100644
index 4d2e41a..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/inc/barometer_factory.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __BARO_FACTORY_H__
-#define __BARO_FACTORY_H__
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/types.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include <hwmsen_helper.h>
-
-#include "barometer.h"
-#include "cust_baro.h"
-
-struct baro_factory_fops {
-	int (*enable_sensor)(bool enable_disable, int64_t sample_periods_ms);
-	int (*get_data)(int32_t *data);
-	int (*get_raw_data)(int32_t *data);
-	int (*enable_calibration)(void);
-	int (*clear_cali)(void);
-	int (*set_cali)(int32_t offset);
-	int (*get_cali)(int32_t *offset);
-	int (*do_self_test)(void);
-};
-
-struct baro_factory_public {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct baro_factory_fops *fops;
-};
-int baro_factory_device_register(struct baro_factory_public *dev);
-int baro_factory_device_deregister(struct baro_factory_public *dev);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/inc/cust_baro.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/inc/cust_baro.h
deleted file mode 100644
index 266e315..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/barometer/inc/cust_baro.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __CUST_BARO_H__
-#define __CUST_BARO_H__
-
-#include <linux/types.h>
-
-#define B_CUST_I2C_ADDR_NUM 2
-
-struct baro_hw {
-	int i2c_num;   /*!< the i2c bus used by the chip */
-	int direction; /*!< the direction of the chip */
-	int power_id;  /*!< the LDO ID of the chip, MT6516_POWER_NONE
-			*means the power is always on
-			*/
-	int power_vol; /*!< the Power Voltage used by the chip */
-	int firlen;    /*!< the length of low pass filter */
-	int (*power)(struct baro_hw *hw, unsigned int on, char *devname);
-	unsigned char i2c_addr[B_CUST_I2C_ADDR_NUM];
-	/*!< i2c address list,for chips which has different addresses with
-	 * different HW layout
-	 */
-	bool is_batch_supported;
-};
-
-int get_baro_dts_func(struct device_node *node, struct baro_hw *hw);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/dummy.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/dummy.c
deleted file mode 100644
index 3ba8376..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/dummy.c
+++ /dev/null
@@ -1,9 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-/*
- * this file only when MTK_SENSOR_SUPPORT is not set then build in
- * to resolve build in build error
- */
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/Kconfig
deleted file mode 100644
index d53acb1..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/Kconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-
-config CUSTOM_KERNEL_GYROSCOPE
-	bool "CUSTOM KERNEL GYROSCOPE Config"
-	help
-	  gyroscope sensor to detect gyroscope from x y z axis.
-	  If the platform is supported for gyroscope, this
-	  configuration should be configured, and the gyroscope
-	  driver configuration should be configured as well.
-
-source "drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/gyroscope/bmi160gy-i2c/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/gyroscope/ITG1010/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/gyroscope/mpu6050gy/Kconfig"
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/Makefile
deleted file mode 100644
index e61d95d..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# In case the platform does NOT support this type of sensors
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/include
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)   +=  gyro_common.o
-gyro_common-$(CONFIG_MTK_SENSOR_SUPPORT) := gyroscope.o gyro_factory.o
-
-obj-$(CONFIG_MTK_GYROHUB)      +=  gyrohub/
-#obj-$(CONFIG_MTK_BMI160GY_I2C) +=  bmi160gy-i2c/
-#obj-$(CONFIG_MTK_ITG1010)   +=  ITG1010/
-#obj-$(CONFIG_MTK_MPU6050GY)   +=  mpu6050gy/
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyro_factory.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyro_factory.c
deleted file mode 100644
index 7b29b59..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyro_factory.c
+++ /dev/null
@@ -1,282 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<GYRO_FAC> " fmt
-
-#include "inc/gyro_factory.h"
-
-struct gyro_factory_private {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct gyro_factory_fops *fops;
-};
-
-static struct gyro_factory_private gyro_factory;
-static int gyro_factory_open(struct inode *inode, struct file *file)
-{
-	return nonseekable_open(inode, file);
-}
-
-static int gyro_factory_release(struct inode *inode, struct file *file)
-{
-	return 0;
-}
-
-static long gyro_factory_unlocked_ioctl(struct file *file, unsigned int cmd,
-					unsigned long arg)
-{
-	void __user *ptr = (void __user *)arg;
-	long err = 0;
-	uint32_t flag = 0;
-	int smtRes = 0, status = 0;
-	int32_t data_buf[3] = {0};
-	char strbuf[64] = {0};
-	struct SENSOR_DATA sensor_data = {0};
-
-	if (_IOC_DIR(cmd) & _IOC_READ)
-		err = !access_ok(VERIFY_WRITE, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-	else if (_IOC_DIR(cmd) & _IOC_WRITE)
-		err = !access_ok(VERIFY_READ, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-
-	if (err) {
-		pr_err("access error: %08X, (%2d, %2d)\n", cmd,
-			    _IOC_DIR(cmd), _IOC_SIZE(cmd));
-		return -EFAULT;
-	}
-
-	switch (cmd) {
-	case GYROSCOPE_IOCTL_INIT:
-		if (copy_from_user(&flag, ptr, sizeof(flag)))
-			return -EFAULT;
-		if (gyro_factory.fops != NULL &&
-		    gyro_factory.fops->enable_sensor != NULL) {
-			err = gyro_factory.fops->enable_sensor(flag,
-							       5); /* 5ms */
-			if (err < 0) {
-				pr_err("GYROSCOPE_IOCTL_INIT fail!\n");
-				return -EINVAL;
-			}
-			pr_debug(
-				"GYROSCOPE_IOCTL_INIT, enable: %d, sample_period:%dms\n",
-				flag, 5);
-		} else {
-			pr_err("GYROSCOPE_IOCTL_INIT NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GYROSCOPE_IOCTL_SMT_DATA:
-		smtRes = 1;
-		if (copy_to_user(ptr, &smtRes, sizeof(smtRes)))
-			return -EFAULT;
-		return 0;
-	case GYROSCOPE_IOCTL_READ_SENSORDATA:
-		if (gyro_factory.fops != NULL &&
-		    gyro_factory.fops->get_data != NULL) {
-			err = gyro_factory.fops->get_data(data_buf, &status);
-			if (err < 0) {
-				pr_err(
-					"GYROSCOPE_IOCTL_READ_SENSORDATA read data fail!\n");
-				return -EINVAL;
-			}
-			sprintf(strbuf, "%x %x %x", data_buf[0], data_buf[1],
-				data_buf[2]);
-			pr_debug(
-				"GYROSCOPE_IOCTL_READ_SENSORDATA read strbuf : (%s)!\n",
-				strbuf);
-			if (copy_to_user(ptr, strbuf, strlen(strbuf) + 1))
-				return -EFAULT;
-		} else {
-			pr_err("GYROSCOPE_IOCTL_READ_SENSORDATA NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GYROSCOPE_IOCTL_READ_SENSORDATA_RAW:
-		if (gyro_factory.fops != NULL &&
-		    gyro_factory.fops->get_raw_data != NULL) {
-			err = gyro_factory.fops->get_raw_data(data_buf);
-			if (err < 0) {
-				pr_err(
-					"GSENSOR_IOCTL_READ_RAW_DATA read data fail!\n");
-				return -EINVAL;
-			}
-			sprintf(strbuf, "%x %x %x", data_buf[0], data_buf[1],
-				data_buf[2]);
-			pr_debug(
-				"GYROSCOPE_IOCTL_READ_SENSORDATA_RAW read strbuf : (%s)!\n",
-				strbuf);
-			if (copy_to_user(ptr, strbuf, strlen(strbuf) + 1))
-				return -EFAULT;
-		} else {
-			pr_err(
-				"GYROSCOPE_IOCTL_READ_SENSORDATA_RAW NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GYROSCOPE_IOCTL_SET_CALI:
-		if (copy_from_user(&sensor_data, ptr, sizeof(sensor_data)))
-			return -EFAULT;
-		data_buf[0] = sensor_data.x;
-		data_buf[1] = sensor_data.y;
-		data_buf[2] = sensor_data.z;
-		pr_debug("GYROSCOPE_IOCTL_SET_CALI: (%d, %d, %d)!\n",
-			 data_buf[0], data_buf[1], data_buf[2]);
-		if (gyro_factory.fops != NULL &&
-		    gyro_factory.fops->set_cali != NULL) {
-			err = gyro_factory.fops->set_cali(data_buf);
-			if (err < 0) {
-				pr_err("GYROSCOPE_IOCTL_SET_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("GYROSCOPE_IOCTL_SET_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GYROSCOPE_IOCTL_CLR_CALI:
-		if (gyro_factory.fops != NULL &&
-		    gyro_factory.fops->clear_cali != NULL) {
-			err = gyro_factory.fops->clear_cali();
-			if (err < 0) {
-				pr_err("GYROSCOPE_IOCTL_CLR_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("GYROSCOPE_IOCTL_CLR_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GYROSCOPE_IOCTL_GET_CALI:
-		if (gyro_factory.fops != NULL &&
-		    gyro_factory.fops->get_cali != NULL) {
-			err = gyro_factory.fops->get_cali(data_buf);
-			if (err < 0) {
-				pr_err("GYROSCOPE_IOCTL_GET_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("GYROSCOPE_IOCTL_GET_CALI NULL\n");
-			return -EINVAL;
-		}
-		pr_debug("GYROSCOPE_IOCTL_GET_CALI: (%d, %d, %d)!\n",
-			 data_buf[0], data_buf[1], data_buf[2]);
-		sensor_data.x = data_buf[0];
-		sensor_data.y = data_buf[1];
-		sensor_data.z = data_buf[2];
-		if (copy_to_user(ptr, &sensor_data, sizeof(sensor_data)))
-			return -EFAULT;
-		return 0;
-	case GYROSCOPE_IOCTL_ENABLE_CALI:
-		if (gyro_factory.fops != NULL &&
-		    gyro_factory.fops->enable_calibration != NULL) {
-			err = gyro_factory.fops->enable_calibration();
-			if (err < 0) {
-				pr_err(
-					"GYROSCOPE_IOCTL_ENABLE_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("GYROSCOPE_IOCTL_ENABLE_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case GYROSCOPE_IOCTL_SELF_TEST:
-		if (gyro_factory.fops != NULL &&
-		    gyro_factory.fops->do_self_test != NULL) {
-			err = gyro_factory.fops->do_self_test();
-			if (err < 0) {
-				pr_err(
-					"GYROSCOPE_IOCTL_SELF_TEST FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("GYROSCOPE_IOCTL_SELF_TEST NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	default:
-		pr_err("unknown IOCTL: 0x%08x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-
-	return 0;
-}
-
-#if IS_ENABLED(CONFIG_COMPAT)
-static long compat_gyro_factory_unlocked_ioctl(struct file *filp,
-					       unsigned int cmd,
-					       unsigned long arg)
-{
-	if (!filp->f_op || !filp->f_op->unlocked_ioctl) {
-		pr_err(
-			"compat_ion_ioctl file has no f_op or no f_op->unlocked_ioctl.\n");
-		return -ENOTTY;
-	}
-
-	switch (cmd) {
-	case COMPAT_GYROSCOPE_IOCTL_INIT:
-	case COMPAT_GYROSCOPE_IOCTL_SMT_DATA:
-	case COMPAT_GYROSCOPE_IOCTL_READ_SENSORDATA_RAW:
-	case COMPAT_GYROSCOPE_IOCTL_READ_SENSORDATA:
-	/* NVRAM will use below ioctl */
-	case COMPAT_GYROSCOPE_IOCTL_SET_CALI:
-	case COMPAT_GYROSCOPE_IOCTL_CLR_CALI:
-	case COMPAT_GYROSCOPE_IOCTL_GET_CALI:
-	case COMPAT_GYROSCOPE_IOCTL_ENABLE_CALI:
-	case COMPAT_GYROSCOPE_IOCTL_SELF_TEST:
-		pr_debug(
-			"compat_ion_ioctl : GYROSCOPE_IOCTL_XXX command is 0x%x\n",
-			cmd);
-		return filp->f_op->unlocked_ioctl(
-			filp, cmd, (unsigned long)compat_ptr(arg));
-	default:
-		pr_err("compat_ion_ioctl : No such command!! 0x%x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-}
-#endif
-
-/*----------------------------------------------------------------------------*/
-static const struct file_operations gyro_factory_fops = {
-	.open = gyro_factory_open,
-	.release = gyro_factory_release,
-	.unlocked_ioctl = gyro_factory_unlocked_ioctl,
-#if IS_ENABLED(CONFIG_COMPAT)
-	.compat_ioctl = compat_gyro_factory_unlocked_ioctl,
-#endif
-};
-
-static struct miscdevice gyro_factory_device = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = "gyroscope",
-	.fops = &gyro_factory_fops,
-};
-
-int gyro_factory_device_register(struct gyro_factory_public *dev)
-{
-	int err = 0;
-
-	if (!dev || !dev->fops)
-		return -1;
-	gyro_factory.gain = dev->gain;
-	gyro_factory.sensitivity = dev->sensitivity;
-	gyro_factory.fops = dev->fops;
-	err = misc_register(&gyro_factory_device);
-	if (err) {
-		pr_err("gyro_factory_device register failed\n");
-		err = -1;
-	}
-	return err;
-}
-EXPORT_SYMBOL_GPL(gyro_factory_device_register);
-
-int gyro_factory_device_deregister(struct gyro_factory_public *dev)
-{
-	gyro_factory.fops = NULL;
-	misc_deregister(&gyro_factory_device);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(gyro_factory_device_deregister);
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/Kconfig
deleted file mode 100644
index d249dad..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_GYROHUB
-	bool "gyrohub for MediaTek package"
-	help
-	  It support different gyrohub sensor.
-	  If this option is set,
-	  it will support
-	  sensorhub gyroscope.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/Makefile
deleted file mode 100644
index 8f4c236..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/gyroscope/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/scp
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)	:=  gyrohub.o
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/gyrohub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/gyrohub.c
deleted file mode 100644
index e2ef359..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/gyrohub.c
+++ /dev/null
@@ -1,1019 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[GYRO] " fmt
-
-#include <hwmsensor.h>
-#include "gyrohub.h"
-#include <gyroscope.h>
-#include <SCP_sensorHub.h>
-#include "SCP_power_monitor.h"
-
-/* name must different with gsensor gyrohub */
-#define GYROHUB_DEV_NAME    "gyro_hub"
-
-static struct gyro_init_info gyrohub_init_info;
-struct platform_device *gyroPltFmDev;
-static int gyrohub_init_flag = -1;
-static DEFINE_SPINLOCK(calibration_lock);
-
-enum GYRO_TRC {
-	GYRO_TRC_FILTER = 0x01,
-	GYRO_TRC_RAWDATA = 0x02,
-	GYRO_TRC_IOCTL = 0x04,
-	GYRO_TRC_CALI = 0X08,
-	GYRO_TRC_INFO = 0X10,
-	GYRO_TRC_DATA = 0X20,
-};
-struct gyrohub_ipi_data {
-	int direction;
-	atomic_t trace;
-	atomic_t suspend;
-	atomic_t selftest_status;
-	int32_t static_cali[GYROHUB_AXES_NUM];
-	uint8_t static_cali_status;
-	int32_t dynamic_cali[GYROHUB_AXES_NUM];
-	int32_t temperature_cali[6];
-	struct work_struct init_done_work;
-	/*data */
-	atomic_t scp_init_done;
-	atomic_t first_ready_after_boot;
-	bool factory_enable;
-	bool android_enable;
-	struct completion calibration_done;
-	struct completion selftest_done;
-};
-static struct gyrohub_ipi_data *obj_ipi_data;
-
-static int gyrohub_get_data(int *x, int *y, int *z, int *status);
-
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-static int gyrohub_write_rel_calibration(struct gyrohub_ipi_data *obj,
-	int dat[GYROHUB_AXES_NUM])
-{
-	obj->static_cali[GYROHUB_AXIS_X] = dat[GYROHUB_AXIS_X];
-	obj->static_cali[GYROHUB_AXIS_Y] = dat[GYROHUB_AXIS_Y];
-	obj->static_cali[GYROHUB_AXIS_Z] = dat[GYROHUB_AXIS_Z];
-
-
-	if (atomic_read(&obj->trace) & GYRO_TRC_CALI) {
-		pr_debug("write gyro calibration data  (%5d, %5d, %5d)\n",
-			 obj->static_cali[GYROHUB_AXIS_X],
-			 obj->static_cali[GYROHUB_AXIS_Y],
-			 obj->static_cali[GYROHUB_AXIS_Z]);
-	}
-
-	return 0;
-}
-
-static int gyrohub_ResetCalibration(void)
-{
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-	unsigned char buf[2] = {0};
-	int err = 0;
-
-	err = sensor_set_cmd_to_hub(ID_GYROSCOPE, CUST_ACTION_RESET_CALI, buf);
-	if (err < 0)
-		pr_err("sensor_set_cmd_to_hub fail,(ID:%d),(action:%d)\n",
-			ID_GYROSCOPE, CUST_ACTION_RESET_CALI);
-
-	memset(obj->static_cali, 0x00, sizeof(obj->static_cali));
-	pr_debug("gyro clear cali\n");
-	return err;
-}
-
-static int gyrohub_ReadCalibration(int dat[GYROHUB_AXES_NUM])
-{
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	dat[GYROHUB_AXIS_X] = obj->static_cali[GYROHUB_AXIS_X];
-	dat[GYROHUB_AXIS_Y] = obj->static_cali[GYROHUB_AXIS_Y];
-	dat[GYROHUB_AXIS_Z] = obj->static_cali[GYROHUB_AXIS_Z];
-
-	pr_debug("Read gyro calibration data  (%5d, %5d, %5d)\n",
-		 dat[GYROHUB_AXIS_X], dat[GYROHUB_AXIS_Y], dat[GYROHUB_AXIS_Z]);
-	return 0;
-}
-
-static int gyrohub_WriteCalibration_scp(int dat[GYROHUB_AXES_NUM])
-{
-	int err = 0;
-
-	err = sensor_set_cmd_to_hub(ID_GYROSCOPE, CUST_ACTION_SET_CALI, dat);
-	if (err < 0)
-		pr_err("sensor_set_cmd_to_hub fail,(ID:%d),(action:%d)\n",
-			ID_GYROSCOPE, CUST_ACTION_SET_CALI);
-	return err;
-}
-
-static int gyrohub_WriteCalibration(int dat[GYROHUB_AXES_NUM])
-{
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-	int err = 0;
-	int cali[GYROHUB_AXES_NUM];
-
-	pr_debug("%s\n", __func__);
-
-	if (!obj || !dat) {
-		pr_err("null ptr!!\n");
-		return -EINVAL;
-	}
-
-	err = gyrohub_WriteCalibration_scp(dat);
-	if (err < 0) {
-		pr_err("gyrohub_WriteCalibration_scp fail\n");
-		return -1;
-	}
-
-	cali[GYROHUB_AXIS_X] = obj->static_cali[GYROHUB_AXIS_X];
-	cali[GYROHUB_AXIS_Y] = obj->static_cali[GYROHUB_AXIS_Y];
-	cali[GYROHUB_AXIS_Z] = obj->static_cali[GYROHUB_AXIS_Z];
-
-	cali[GYROHUB_AXIS_X] += dat[GYROHUB_AXIS_X];
-	cali[GYROHUB_AXIS_Y] += dat[GYROHUB_AXIS_Y];
-	cali[GYROHUB_AXIS_Z] += dat[GYROHUB_AXIS_Z];
-
-	pr_debug("write gyro calibration data (%5d,%5d,%5d)-->(%5d,%5d,%5d)\n",
-		 dat[GYROHUB_AXIS_X], dat[GYROHUB_AXIS_Y], dat[GYROHUB_AXIS_Z],
-		 cali[GYROHUB_AXIS_X], cali[GYROHUB_AXIS_Y],
-		 cali[GYROHUB_AXIS_Z]);
-
-	return gyrohub_write_rel_calibration(obj, cali);
-}
-#endif
-
-static int gyrohub_SetPowerMode(bool enable)
-{
-	int err = 0;
-
-	err = sensor_enable_to_hub(ID_GYROSCOPE, enable);
-	if (err < 0)
-		pr_err("sensor_enable_to_hub fail!\n");
-
-	return err;
-}
-
-static int gyrohub_ReadGyroData(char *buf, int bufsize)
-{
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-	int gyro[GYROHUB_AXES_NUM];
-	int err = 0;
-	int status = 0;
-
-	if (atomic_read(&obj->suspend))
-		return -3;
-
-	if (buf == NULL)
-		return -1;
-	err = sensor_get_data_from_hub(ID_GYROSCOPE, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!\n");
-		return err;
-	}
-
-	time_stamp				= data.time_stamp;
-	gyro[GYROHUB_AXIS_X]	= data.gyroscope_t.x;
-	gyro[GYROHUB_AXIS_Y]	= data.gyroscope_t.y;
-	gyro[GYROHUB_AXIS_Z]	= data.gyroscope_t.z;
-	status					= data.gyroscope_t.status;
-	sprintf(buf, "%04x %04x %04x %04x",
-		gyro[GYROHUB_AXIS_X],
-		gyro[GYROHUB_AXIS_Y],
-		gyro[GYROHUB_AXIS_Z],
-		status);
-
-	if (atomic_read(&obj->trace) & GYRO_TRC_DATA)
-		pr_debug("gsensor data: %s!\n", buf);
-
-	return 0;
-
-}
-
-static int gyrohub_ReadChipInfo(char *buf, int bufsize)
-{
-	u8 databuf[10];
-
-	memset(databuf, 0, sizeof(u8) * 10);
-
-	if ((buf == NULL) || (bufsize <= 30))
-		return -1;
-
-	sprintf(buf, "GYROHUB Chip");
-	return 0;
-}
-
-static int gyrohub_ReadAllReg(char *buf, int bufsize)
-{
-	int err = 0;
-
-	err = gyrohub_SetPowerMode(true);
-	if (err)
-		pr_err("Power on mpu6050 error %d!\n", err);
-	msleep(50);
-	err = sensor_set_cmd_to_hub(ID_GYROSCOPE, CUST_ACTION_SHOW_REG, buf);
-	if (err < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID:%d),(action:%d)\n",
-			ID_GYROSCOPE, CUST_ACTION_SHOW_REG);
-		return 0;
-	}
-	return 0;
-}
-
-static ssize_t chipinfo_show(struct device_driver *ddri, char *buf)
-{
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-	char strbuf[GYROHUB_BUFSIZE];
-	int err = 0;
-
-	if (obj == NULL) {
-		pr_err("obj is null!!\n");
-		return 0;
-	}
-	err = gyrohub_ReadAllReg(strbuf, GYROHUB_BUFSIZE);
-	if (err < 0) {
-		pr_debug("gyrohub_ReadAllReg fail!!\n");
-		return 0;
-	}
-	err = gyrohub_ReadChipInfo(strbuf, GYROHUB_BUFSIZE);
-	if (err < 0) {
-		pr_debug("gyrohub_ReadChipInfo fail!!\n");
-		return 0;
-	}
-	return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
-}
-
-static ssize_t sensordata_show(struct device_driver *ddri,
-	char *buf)
-{
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-	char strbuf[GYROHUB_BUFSIZE];
-	int err = 0;
-
-	if (obj == NULL) {
-		pr_err("obj is null!!\n");
-		return 0;
-	}
-
-	err = gyrohub_ReadGyroData(strbuf, GYROHUB_BUFSIZE);
-	if (err < 0) {
-		pr_debug("gyrohub_ReadGyroData fail!!\n");
-		return 0;
-	}
-	return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
-}
-
-static ssize_t trace_show(struct device_driver *ddri, char *buf)
-{
-	ssize_t res;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	if (obj == NULL) {
-		pr_err(" obj is null!!\n");
-		return 0;
-	}
-
-	res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
-	return res;
-}
-
-static ssize_t trace_store(struct device_driver *ddri,
-	const char *buf, size_t count)
-{
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-	int trace = 0;
-	int res = 0;
-
-	if (obj == NULL) {
-		pr_err("obj is null!!\n");
-		return 0;
-	}
-
-	if (sscanf(buf, "0x%x", &trace) != 1) {
-		pr_err("invalid content:'%s', length =%zu\n", buf, count);
-		return count;
-	}
-
-	atomic_set(&obj->trace, trace);
-	res = sensor_set_cmd_to_hub(ID_GYROSCOPE,
-		CUST_ACTION_SET_TRACE, &trace);
-	if (res < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID:%d),(action:%d)\n",
-			ID_GYROSCOPE, CUST_ACTION_SET_TRACE);
-		return 0;
-	}
-
-	return count;
-}
-
-static ssize_t status_show(struct device_driver *ddri, char *buf)
-{
-	ssize_t len = 0;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	if (obj == NULL) {
-		pr_err(" obj is null!!\n");
-		return 0;
-	}
-
-	return len;
-}
-
-static ssize_t orientation_show(struct device_driver *ddri, char *buf)
-{
-	ssize_t _tLength = 0;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	_tLength = snprintf(buf, PAGE_SIZE, "default direction = %d\n",
-								obj->direction);
-
-	return _tLength;
-}
-
-static ssize_t orientation_store(struct device_driver *ddri,
-	const char *buf, size_t tCount)
-{
-	int _nDirection = 0, ret = 0;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	if (obj == NULL)
-		return 0;
-	ret = kstrtoint(buf, 10, &_nDirection);
-
-	if (ret != 0) {
-		pr_debug("[%s] set direction: %d\n", __func__, _nDirection);
-		return tCount;
-	}
-
-	obj->direction = _nDirection;
-	ret = sensor_set_cmd_to_hub(ID_GYROSCOPE,
-		CUST_ACTION_SET_DIRECTION, &_nDirection);
-	if (ret < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID:%d),(action:%d)\n",
-			ID_GYROSCOPE, CUST_ACTION_SET_DIRECTION);
-		return 0;
-	}
-
-	pr_debug("[%s] set direction: %d\n", __func__, _nDirection);
-
-	return tCount;
-}
-
-static int gyrohub_factory_enable_calibration(void);
-static ssize_t test_cali_store(struct device_driver *ddri,
-	const char *buf, size_t tCount)
-{
-	int enable = 0, ret = 0;
-
-	ret = kstrtoint(buf, 10, &enable);
-	if (ret != 0) {
-		pr_debug("kstrtoint fail\n");
-		return 0;
-	}
-	if (enable == 1)
-		gyrohub_factory_enable_calibration();
-	return tCount;
-}
-
-static DRIVER_ATTR_RO(chipinfo);
-static DRIVER_ATTR_RO(sensordata);
-static DRIVER_ATTR_RW(trace);
-static DRIVER_ATTR_RO(status);
-static DRIVER_ATTR_RW(orientation);
-static DRIVER_ATTR_WO(test_cali);
-
-static struct driver_attribute *gyrohub_attr_list[] = {
-	&driver_attr_chipinfo,	/*chip information */
-	&driver_attr_sensordata,	/*dump sensor data */
-	&driver_attr_trace,	/*trace log */
-	&driver_attr_status,
-	&driver_attr_orientation,
-	&driver_attr_test_cali,
-};
-
-static int gyrohub_create_attr(struct device_driver *driver)
-{
-	int idx, err = 0;
-	int num = (int)(ARRAY_SIZE(gyrohub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++) {
-		err = driver_create_file(driver, gyrohub_attr_list[idx]);
-		if (err != 0) {
-			pr_err("driver_create_file (%s) = %d\n",
-				gyrohub_attr_list[idx]->attr.name, err);
-			break;
-		}
-	}
-	return err;
-}
-
-static int gyrohub_delete_attr(struct device_driver *driver)
-{
-	int idx, err = 0;
-	int num = (int)(ARRAY_SIZE(gyrohub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++)
-		driver_remove_file(driver, gyrohub_attr_list[idx]);
-
-	return err;
-}
-
-static void scp_init_work_done(struct work_struct *work)
-{
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-	int err = 0;
-#ifndef MTK_OLD_FACTORY_CALIBRATION
-	int32_t cfg_data[12] = {0};
-#endif
-
-	if (atomic_read(&obj->scp_init_done) == 0) {
-		pr_err("scp is not ready to send cmd\n");
-		return;
-	}
-	if (atomic_xchg(&obj->first_ready_after_boot, 1) == 0)
-		return;
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	err = gyrohub_WriteCalibration_scp(obj->static_cali);
-	if (err < 0)
-		pr_err("gyrohub_WriteCalibration_scp fail\n");
-#else
-	spin_lock(&calibration_lock);
-	cfg_data[0] = obj->dynamic_cali[0];
-	cfg_data[1] = obj->dynamic_cali[1];
-	cfg_data[2] = obj->dynamic_cali[2];
-
-	cfg_data[3] = obj->static_cali[0];
-	cfg_data[4] = obj->static_cali[1];
-	cfg_data[5] = obj->static_cali[2];
-
-	cfg_data[6] = obj->temperature_cali[0];
-	cfg_data[7] = obj->temperature_cali[1];
-	cfg_data[8] = obj->temperature_cali[2];
-	cfg_data[9] = obj->temperature_cali[3];
-	cfg_data[10] = obj->temperature_cali[4];
-	cfg_data[11] = obj->temperature_cali[5];
-	spin_unlock(&calibration_lock);
-	err = sensor_cfg_to_hub(ID_GYROSCOPE,
-		(uint8_t *)cfg_data, sizeof(cfg_data));
-	if (err < 0)
-		pr_err("sensor_cfg_to_hub fail\n");
-#endif
-}
-
-static int gyro_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-	struct gyro_data data;
-
-	memset(&data, 0, sizeof(struct gyro_data));
-	if (event->flush_action == DATA_ACTION &&
-		READ_ONCE(obj->android_enable) == true) {
-		if (READ_ONCE(obj->android_enable) == false)
-			return 0;
-		data.x = event->gyroscope_t.x;
-		data.y = event->gyroscope_t.y;
-		data.z = event->gyroscope_t.z;
-		data.status = event->gyroscope_t.status;
-		data.timestamp = (int64_t)event->time_stamp;
-		data.reserved[0] = event->reserve[0];
-		err = gyro_data_report(&data);
-	} else if (event->flush_action == FLUSH_ACTION) {
-		err = gyro_flush_report();
-	} else if (event->flush_action == BIAS_ACTION) {
-		data.x = event->gyroscope_t.x_bias;
-		data.y = event->gyroscope_t.y_bias;
-		data.z = event->gyroscope_t.z_bias;
-		err = gyro_bias_report(&data);
-		spin_lock(&calibration_lock);
-		obj->dynamic_cali[GYROHUB_AXIS_X] = event->gyroscope_t.x_bias;
-		obj->dynamic_cali[GYROHUB_AXIS_Y] = event->gyroscope_t.y_bias;
-		obj->dynamic_cali[GYROHUB_AXIS_Z] = event->gyroscope_t.z_bias;
-		spin_unlock(&calibration_lock);
-	} else if (event->flush_action == CALI_ACTION) {
-		data.x = event->gyroscope_t.x_bias;
-		data.y = event->gyroscope_t.y_bias;
-		data.z = event->gyroscope_t.z_bias;
-		if (event->gyroscope_t.status == 0)
-			err = gyro_cali_report(&data);
-		spin_lock(&calibration_lock);
-		obj->static_cali[GYROHUB_AXIS_X] = event->gyroscope_t.x_bias;
-		obj->static_cali[GYROHUB_AXIS_Y] = event->gyroscope_t.y_bias;
-		obj->static_cali[GYROHUB_AXIS_Z] = event->gyroscope_t.z_bias;
-		obj->static_cali_status = (uint8_t)event->gyroscope_t.status;
-		spin_unlock(&calibration_lock);
-		complete(&obj->calibration_done);
-	} else if (event->flush_action == TEMP_ACTION) {
-		/* temp action occur when gyro disable,
-		 *so we always should send data to userspace
-		 */
-		err = gyro_temp_report(event->data);
-		spin_lock(&calibration_lock);
-		obj->temperature_cali[0] = event->data[0];
-		obj->temperature_cali[1] = event->data[1];
-		obj->temperature_cali[2] = event->data[2];
-		obj->temperature_cali[3] = event->data[3];
-		obj->temperature_cali[4] = event->data[4];
-		obj->temperature_cali[5] = event->data[5];
-		spin_unlock(&calibration_lock);
-	} else if (event->flush_action == TEST_ACTION) {
-		atomic_set(&obj->selftest_status, event->gyroscope_t.status);
-		complete(&obj->selftest_done);
-	}
-	return err;
-}
-static int gyrohub_factory_enable_sensor(bool enabledisable,
-	int64_t sample_periods_ms)
-{
-	int err = 0;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	if (enabledisable == true)
-		WRITE_ONCE(obj->factory_enable, true);
-	else
-		WRITE_ONCE(obj->factory_enable, false);
-
-	if (enabledisable == true) {
-		err = sensor_set_delay_to_hub(ID_GYROSCOPE, sample_periods_ms);
-		if (err) {
-			pr_err("sensor_set_delay_to_hub failed!\n");
-			return -1;
-		}
-	}
-	err = sensor_enable_to_hub(ID_GYROSCOPE, enabledisable);
-	if (err) {
-		pr_err("sensor_enable_to_hub failed!\n");
-		return -1;
-	}
-	return 0;
-}
-static int gyrohub_factory_get_data(int32_t data[3], int *status)
-{
-	int ret = 0;
-
-	ret = gyrohub_get_data(&data[0], &data[1], &data[2], status);
-	data[0] = data[0] / 1000;
-	data[1] = data[1] / 1000;
-	data[2] = data[2] / 1000;
-
-	return ret;
-}
-static int gyrohub_factory_get_raw_data(int32_t data[3])
-{
-	pr_debug("%s don't support!\n", __func__);
-	return 0;
-}
-static int gyrohub_factory_enable_calibration(void)
-{
-	return sensor_calibration_to_hub(ID_GYROSCOPE);
-}
-static int gyrohub_factory_clear_cali(void)
-{
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	int err = 0;
-
-	err = gyrohub_ResetCalibration();
-	if (err) {
-		pr_err("gyrohub_ResetCalibration failed!\n");
-		return -1;
-	}
-#endif
-	return 0;
-}
-static int gyrohub_factory_set_cali(int32_t data[3])
-{
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	int err = 0;
-
-	err = gyrohub_WriteCalibration(data);
-	if (err) {
-		pr_err("gyrohub_WriteCalibration failed!\n");
-		return -1;
-	}
-#endif
-	return 0;
-}
-static int gyrohub_factory_get_cali(int32_t data[3])
-{
-	int err = 0;
-#ifndef MTK_OLD_FACTORY_CALIBRATION
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-	uint8_t status = 0;
-#endif
-
-#ifdef MTK_OLD_FACTORY_CALIBRATION
-	err = gyrohub_ReadCalibration(data);
-	if (err) {
-		pr_err("gyrohub_ReadCalibration failed!\n");
-		return -1;
-	}
-#else
-	err = wait_for_completion_timeout(&obj->calibration_done,
-		msecs_to_jiffies(3000));
-	if (!err) {
-		pr_err("%s fail!\n", __func__);
-		return -1;
-	}
-	spin_lock(&calibration_lock);
-	data[GYROHUB_AXIS_X] = obj->static_cali[GYROHUB_AXIS_X];
-	data[GYROHUB_AXIS_Y] = obj->static_cali[GYROHUB_AXIS_Y];
-	data[GYROHUB_AXIS_Z] = obj->static_cali[GYROHUB_AXIS_Z];
-	status = obj->static_cali_status;
-	spin_unlock(&calibration_lock);
-	if (status != 0) {
-		pr_debug("gyrohub static cali detect shake!\n");
-		return -2;
-	}
-#endif
-	return err;
-}
-static int gyrohub_factory_do_self_test(void)
-{
-	int ret = 0;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	ret = sensor_selftest_to_hub(ID_GYROSCOPE);
-	if (ret < 0)
-		return -1;
-
-	ret = wait_for_completion_timeout(&obj->selftest_done,
-					  msecs_to_jiffies(3000));
-	if (!ret)
-		return -1;
-	return atomic_read(&obj->selftest_status);
-}
-
-static struct gyro_factory_fops gyrohub_factory_fops = {
-	.enable_sensor = gyrohub_factory_enable_sensor,
-	.get_data = gyrohub_factory_get_data,
-	.get_raw_data = gyrohub_factory_get_raw_data,
-	.enable_calibration = gyrohub_factory_enable_calibration,
-	.clear_cali = gyrohub_factory_clear_cali,
-	.set_cali = gyrohub_factory_set_cali,
-	.get_cali = gyrohub_factory_get_cali,
-	.do_self_test = gyrohub_factory_do_self_test,
-};
-
-static struct gyro_factory_public gyrohub_factory_device = {
-	.gain = 1,
-	.sensitivity = 1,
-	.fops = &gyrohub_factory_fops,
-};
-
-static int gyrohub_open_report_data(int open)
-{
-	return 0;
-}
-
-static int gyrohub_enable_nodata(int en)
-{
-	int res = 0;
-	bool power = false;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	if (en == 1) {
-		power = true;
-		WRITE_ONCE(obj->android_enable, true);
-	}
-	if (en == 0) {
-		power = false;
-		WRITE_ONCE(obj->android_enable, false);
-	}
-
-	res = gyrohub_SetPowerMode(power);
-	if (res < 0) {
-		pr_err("GYROHUB_SetPowerMode fail\n");
-		return res;
-	}
-	pr_debug("%s OK!\n", __func__);
-	return 0;
-
-}
-
-static int gyrohub_set_delay(u64 ns)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	int err = 0;
-	int value = 0;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	value = (int)ns / 1000 / 1000;
-	err = sensor_set_delay_to_hub(ID_GYROSCOPE, value);
-	if (err < 0) {
-		pr_err("sensor_set_delay_to_hub fail!\n");
-		return err;
-	}
-
-	pr_debug("gyro_set_delay (%d)\n", value);
-	return err;
-#elif defined CONFIG_NANOHUB
-	return 0;
-#else
-	return 0;
-#endif
-}
-static int gyrohub_batch(int flag, int64_t samplingPeriodNs,
-	int64_t maxBatchReportLatencyNs)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	gyrohub_set_delay(samplingPeriodNs);
-#endif
-	return sensor_batch_to_hub(ID_GYROSCOPE,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int gyrohub_flush(void)
-{
-	return sensor_flush_to_hub(ID_GYROSCOPE);
-}
-
-static int gyrohub_set_cali(uint8_t *data, uint8_t count)
-{
-	int32_t *buf = (int32_t *)data;
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	spin_lock(&calibration_lock);
-	obj->dynamic_cali[0] = buf[0];
-	obj->dynamic_cali[1] = buf[1];
-	obj->dynamic_cali[2] = buf[2];
-
-	obj->static_cali[0] = buf[3];
-	obj->static_cali[1] = buf[4];
-	obj->static_cali[2] = buf[5];
-
-	obj->temperature_cali[0] = buf[6];
-	obj->temperature_cali[1] = buf[7];
-	obj->temperature_cali[2] = buf[8];
-	obj->temperature_cali[3] = buf[9];
-	obj->temperature_cali[4] = buf[10];
-	obj->temperature_cali[5] = buf[11];
-	spin_unlock(&calibration_lock);
-	return sensor_cfg_to_hub(ID_GYROSCOPE, data, count);
-}
-
-static int gpio_config(void)
-{
-	int ret;
-	struct pinctrl *pinctrl;
-	struct pinctrl_state *pins_default;
-	struct pinctrl_state *pins_cfg;
-
-	if (gyroPltFmDev == NULL) {
-		pr_err("Cannot find gyro device!\n");
-		return 0;
-	}
-
-	pinctrl = devm_pinctrl_get(&gyroPltFmDev->dev);
-	if (IS_ERR(pinctrl)) {
-		ret = PTR_ERR(pinctrl);
-		pr_err("Cannot find gyro pinctrl!\n");
-		return ret;
-	}
-	pins_default = pinctrl_lookup_state(pinctrl, "pin_default");
-	if (IS_ERR(pins_default)) {
-		ret = PTR_ERR(pins_default);
-		pr_err("Cannot find gyro pinctrl default!\n");
-	}
-
-	pins_cfg = pinctrl_lookup_state(pinctrl, "pin_cfg");
-	if (IS_ERR(pins_cfg)) {
-		ret = PTR_ERR(pins_cfg);
-		pr_err("Cannot find gyro pinctrl pin_cfg!\n");
-		return ret;
-	}
-	pinctrl_select_state(pinctrl, pins_cfg);
-
-	return 0;
-}
-
-static int gyrohub_get_data(int *x, int *y, int *z, int *status)
-{
-	char buff[GYROHUB_BUFSIZE];
-	int err = 0;
-
-	err = gyrohub_ReadGyroData(buff, GYROHUB_BUFSIZE);
-	if (err < 0) {
-		pr_err("gyrohub_ReadGyroData fail!!\n");
-		return -1;
-	}
-	err = sscanf(buff, "%x %x %x %x", x, y, z, status);
-	if (err != 4) {
-		pr_err("sscanf fail!!\n");
-		return -1;
-	}
-	return 0;
-}
-static int scp_ready_event(uint8_t event, void *ptr)
-{
-	struct gyrohub_ipi_data *obj = obj_ipi_data;
-
-	switch (event) {
-	case SENSOR_POWER_UP:
-	    atomic_set(&obj->scp_init_done, 1);
-		schedule_work(&obj->init_done_work);
-		break;
-	case SENSOR_POWER_DOWN:
-	    atomic_set(&obj->scp_init_done, 0);
-		break;
-	}
-	return 0;
-}
-static struct scp_power_monitor scp_ready_notifier = {
-	.name = "gyro",
-	.notifier_call = scp_ready_event,
-};
-static int gyrohub_probe(struct platform_device *pdev)
-{
-	struct gyrohub_ipi_data *obj;
-	int err = 0;
-	struct gyro_control_path ctl = { 0 };
-	struct gyro_data_path data = { 0 };
-
-	struct platform_driver *paddr =
-					gyrohub_init_info.platform_diver_addr;
-
-	pr_debug("%s\n", __func__);
-	obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-	if (!obj) {
-		err = -ENOMEM;
-		goto exit;
-	}
-
-	memset(obj, 0, sizeof(struct gyrohub_ipi_data));
-
-	obj_ipi_data = obj;
-	platform_set_drvdata(pdev, obj);
-
-	atomic_set(&obj->trace, 0);
-	atomic_set(&obj->suspend, 0);
-	atomic_set(&obj->first_ready_after_boot, 0);
-	atomic_set(&obj->scp_init_done, 0);
-	atomic_set(&obj->selftest_status, 0);
-	WRITE_ONCE(obj->factory_enable, false);
-	WRITE_ONCE(obj->android_enable, false);
-	INIT_WORK(&obj->init_done_work, scp_init_work_done);
-	init_completion(&obj->calibration_done);
-	init_completion(&obj->selftest_done);
-
-	err = gpio_config();
-	if (err < 0) {
-		pr_err("gpio_config failed\n");
-		goto exit_kfree;
-	}
-	scp_power_monitor_register(&scp_ready_notifier);
-	err = scp_sensorHub_data_registration(ID_GYROSCOPE, gyro_recv_data);
-	if (err < 0) {
-		pr_err("scp_sensorHub_data_registration failed\n");
-		goto exit_kfree;
-	}
-	err = gyro_factory_device_register(&gyrohub_factory_device);
-	if (err) {
-		pr_err("gyro_factory_device_register fail err = %d\n",
-			err);
-		goto exit_kfree;
-	}
-	ctl.is_use_common_factory = true;
-
-	err = gyrohub_create_attr(&paddr->driver);
-	if (err) {
-		pr_err("gyrohub create attribute err = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-
-	ctl.open_report_data = gyrohub_open_report_data;
-	ctl.enable_nodata = gyrohub_enable_nodata;
-	ctl.set_delay = gyrohub_set_delay;
-	ctl.batch = gyrohub_batch;
-	ctl.flush = gyrohub_flush;
-	ctl.set_cali = gyrohub_set_cali;
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	ctl.is_report_input_direct = true;
-	ctl.is_support_batch = false;
-#elif defined CONFIG_NANOHUB
-	ctl.is_report_input_direct = true;
-	ctl.is_support_batch = true;
-#else
-#endif
-
-	err = gyro_register_control_path(&ctl);
-	if (err) {
-		pr_err("register gyro control path err\n");
-		goto exit_create_attr_failed;
-	}
-
-	data.get_data = gyrohub_get_data;
-	data.vender_div = DEGREE_TO_RAD;
-	err = gyro_register_data_path(&data);
-	if (err) {
-		pr_err("gyro_register_data_path fail = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-	gyrohub_init_flag = 0;
-
-	pr_debug("%s: OK\n", __func__);
-	return 0;
-exit_create_attr_failed:
-	gyrohub_delete_attr(&(gyrohub_init_info.platform_diver_addr->driver));
-exit_kfree:
-	kfree(obj);
-	obj_ipi_data = NULL;
-exit:
-	gyrohub_init_flag = -1;
-	pr_err("%s: err = %d\n", __func__, err);
-	return err;
-}
-
-static int gyrohub_remove(struct platform_device *pdev)
-{
-	int err = 0;
-	struct platform_driver *paddr =
-				gyrohub_init_info.platform_diver_addr;
-
-	err = gyrohub_delete_attr(&paddr->driver);
-	if (err)
-		pr_err("gyrohub_delete_attr fail: %d\n", err);
-
-	gyro_factory_device_deregister(&gyrohub_factory_device);
-
-	kfree(platform_get_drvdata(pdev));
-	return 0;
-}
-
-static int gyrohub_suspend(struct platform_device *pdev, pm_message_t msg)
-{
-	return 0;
-}
-
-static int gyrohub_resume(struct platform_device *pdev)
-{
-	return 0;
-}
-static struct platform_device gyrohub_device = {
-	.name = GYROHUB_DEV_NAME,
-	.id = -1,
-};
-static struct platform_driver gyrohub_driver = {
-	.driver = {
-		   .name = GYROHUB_DEV_NAME,
-	},
-	.probe = gyrohub_probe,
-	.remove = gyrohub_remove,
-	.suspend = gyrohub_suspend,
-	.resume = gyrohub_resume,
-};
-
-static int gyrohub_local_remove(void)
-{
-	platform_driver_unregister(&gyrohub_driver);
-	return 0;
-}
-
-static int gyrohub_local_init(struct platform_device *pdev)
-{
-	gyroPltFmDev = pdev;
-
-	if (platform_driver_register(&gyrohub_driver)) {
-		pr_err("add driver error\n");
-		return -1;
-	}
-	if (-1 == gyrohub_init_flag)
-		return -1;
-	return 0;
-}
-static struct gyro_init_info gyrohub_init_info = {
-	.name = "gyrohub",
-	.init = gyrohub_local_init,
-	.uninit = gyrohub_local_remove,
-};
-
-static int __init gyrohub_init(void)
-{
-
-	if (platform_device_register(&gyrohub_device)) {
-		pr_err("platform device error\n");
-		return -1;
-	}
-	gyro_driver_add(&gyrohub_init_info);
-
-	return 0;
-}
-
-static void __exit gyrohub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(gyrohub_init);
-module_exit(gyrohub_exit);
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("GYROHUB gyroscope driver");
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/gyrohub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/gyrohub.h
deleted file mode 100644
index 50024e4..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyrohub/gyrohub.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef GYROHUB_H
-#define GYROHUB_H
-
-#include <linux/ioctl.h>
-#include <linux/pinctrl/consumer.h>
-
-#define GYROHUB_AXIS_X          0
-#define GYROHUB_AXIS_Y          1
-#define GYROHUB_AXIS_Z          2
-#define GYROHUB_AXES_NUM        3
-#define GYROHUB_DATA_LEN        6
-#define GYROHUB_SUCCESS             0
-
-#define GYROHUB_BUFSIZE 60
-
-/* 1 rad = 180/PI degree, MAX_LSB = 131000, */
-/* 180*131000/PI = 7505747 */
-#define DEGREE_TO_RAD	7505747
-
-#endif
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyroscope.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyroscope.c
deleted file mode 100644
index ee41a0a..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/gyroscope.c
+++ /dev/null
@@ -1,917 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<GYROSCOPE> " fmt
-
-#include "inc/gyroscope.h"
-#include "sensor_performance.h"
-#include <linux/vmalloc.h>
-
-struct gyro_context *gyro_context_obj /* = NULL*/;
-static struct platform_device *pltfm_dev;
-
-static struct gyro_init_info *gyroscope_init_list[MAX_CHOOSE_GYRO_NUM] = {0};
-
-static int64_t getCurNS(void)
-{
-	int64_t ns;
-	struct timespec time;
-
-	time.tv_sec = time.tv_nsec = 0;
-	get_monotonic_boottime(&time);
-	ns = time.tv_sec * 1000000000LL + time.tv_nsec;
-
-	return ns;
-}
-
-static void initTimer(struct hrtimer *timer,
-		      enum hrtimer_restart (*callback)(struct hrtimer *))
-{
-	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
-	timer->function = callback;
-}
-
-static void startTimer(struct hrtimer *timer, int delay_ms, bool first)
-{
-	struct gyro_context *obj = (struct gyro_context *)container_of(timer,
-		struct gyro_context, hrTimer);
-	static int count;
-
-	if (obj == NULL) {
-		pr_err("NULL pointer\n");
-		return;
-	}
-
-	if (first) {
-		obj->target_ktime =
-			ktime_add_ns(ktime_get(), (int64_t)delay_ms * 1000000);
-		count = 0;
-	} else {
-		do {
-			obj->target_ktime = ktime_add_ns(
-				obj->target_ktime, (int64_t)delay_ms * 1000000);
-		} while (ktime_to_ns(obj->target_ktime) <
-			 ktime_to_ns(ktime_get()));
-		count++;
-	}
-
-	hrtimer_start(timer, obj->target_ktime, HRTIMER_MODE_ABS);
-}
-
-#ifndef CONFIG_NANOHUB
-static void stopTimer(struct hrtimer *timer)
-{
-	hrtimer_cancel(timer);
-}
-#endif
-static void gyro_work_func(struct work_struct *work)
-{
-
-	struct gyro_context *cxt = NULL;
-	int x = 0, y = 0, z = 0, status = 0;
-	int temperature = -32768; /* =0xFFFF_8000 */
-	int64_t pre_ns, cur_ns;
-	int64_t delay_ms;
-	int err = 0;
-
-	cxt = gyro_context_obj;
-	delay_ms = atomic_read(&cxt->delay);
-
-	cur_ns = getCurNS();
-
-	/* gyro driver has register temperature path */
-	if (cxt->gyro_data.get_temperature) {
-		err = cxt->gyro_data.get_temperature(&temperature);
-		if (err)
-			pr_info("get gyro temperature fails!!\n");
-		else
-			cxt->drv_data.temperature = temperature;
-	}
-
-	/* add wake lock to make sure data can be read before system suspend */
-	if (cxt->gyro_data.get_data != NULL)
-		err = cxt->gyro_data.get_data(&x, &y, &z, &status);
-	else
-		pr_err("gyro driver not register data path\n");
-
-	if (err) {
-		pr_err("get gyro data fails!!\n");
-		goto gyro_loop;
-	} else {
-		cxt->drv_data.x = x;
-		cxt->drv_data.y = y;
-		cxt->drv_data.z = z;
-		cxt->drv_data.status = status;
-		pre_ns = cxt->drv_data.timestamp;
-		cxt->drv_data.timestamp = cur_ns;
-	}
-
-	if (true == cxt->is_first_data_after_enable) {
-		pre_ns = cur_ns;
-		cxt->is_first_data_after_enable = false;
-		/* filter -1 value */
-		if (cxt->drv_data.x == GYRO_INVALID_VALUE ||
-		    cxt->drv_data.y == GYRO_INVALID_VALUE ||
-		    cxt->drv_data.z == GYRO_INVALID_VALUE) {
-			pr_debug(" read invalid data\n");
-			goto gyro_loop;
-		}
-	}
-
-	/* pr_debug("gyro data[%d,%d,%d]\n" ,cxt->drv_data.gyro_data.values[0],
-	 */
-	/* cxt->drv_data.gyro_data.values[1],cxt->drv_data.gyro_data.values[2]);
-	 */
-
-	while ((cur_ns - pre_ns) >= delay_ms * 1800000LL) {
-		struct gyro_data tmp_data = cxt->drv_data;
-
-		pre_ns += delay_ms * 1000000LL;
-		tmp_data.timestamp = pre_ns;
-		gyro_data_report(&tmp_data);
-	}
-
-	gyro_data_report(&cxt->drv_data);
-
-gyro_loop:
-	if (true == cxt->is_polling_run)
-		startTimer(&cxt->hrTimer, atomic_read(&cxt->delay), false);
-}
-
-enum hrtimer_restart gyro_poll(struct hrtimer *timer)
-{
-	struct gyro_context *obj = (struct gyro_context *)container_of(timer,
-		struct gyro_context, hrTimer);
-
-	queue_work(obj->gyro_workqueue, &obj->report);
-
-	/* pr_debug("cur_nt = %lld\n", getCurNT()); */
-
-	return HRTIMER_NORESTART;
-}
-
-static struct gyro_context *gyro_context_alloc_object(void)
-{
-
-	struct gyro_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-
-	pr_debug("%s start\n", __func__);
-	if (!obj) {
-		pr_err("Alloc gyro object error!\n");
-		return NULL;
-	}
-	atomic_set(&obj->delay, 200); /*5Hz,  set work queue delay time 200ms */
-	atomic_set(&obj->wake, 0);
-	INIT_WORK(&obj->report, gyro_work_func);
-	obj->gyro_workqueue = NULL;
-	obj->gyro_workqueue = create_workqueue("gyro_polling");
-	if (!obj->gyro_workqueue) {
-		kfree(obj);
-		return NULL;
-	}
-	initTimer(&obj->hrTimer, gyro_poll);
-	obj->is_active_nodata = false;
-	obj->is_active_data = false;
-	obj->is_first_data_after_enable = false;
-	obj->is_polling_run = false;
-	obj->is_batch_enable = false;
-	obj->cali_sw[GYRO_AXIS_X] = 0;
-	obj->cali_sw[GYRO_AXIS_Y] = 0;
-	obj->cali_sw[GYRO_AXIS_Z] = 0;
-	obj->power = 0;
-	obj->enable = 0;
-	obj->delay_ns = -1;
-	obj->latency_ns = -1;
-	mutex_init(&obj->gyro_op_mutex);
-	pr_debug("%s end\n", __func__);
-	return obj;
-}
-
-#ifndef CONFIG_NANOHUB
-static int gyro_enable_and_batch(void)
-{
-	struct gyro_context *cxt = gyro_context_obj;
-	int err;
-
-	/* power on -> power off */
-	if (cxt->power == 1 && cxt->enable == 0) {
-		pr_debug("GYRO disable\n");
-		/* stop polling firstly, if needed */
-		if (cxt->is_active_data == false &&
-		    cxt->gyro_ctl.is_report_input_direct == false &&
-		    cxt->is_polling_run == true) {
-			smp_mb(); /* for memory barrier */
-			stopTimer(&cxt->hrTimer);
-			smp_mb(); /* for memory barrier */
-			cancel_work_sync(&cxt->report);
-			cxt->drv_data.x = GYRO_INVALID_VALUE;
-			cxt->drv_data.y = GYRO_INVALID_VALUE;
-			cxt->drv_data.z = GYRO_INVALID_VALUE;
-			cxt->drv_data.temperature = 0;
-			cxt->is_polling_run = false;
-			pr_debug("gyro stop polling done\n");
-		}
-		/* turn off the power */
-		if (cxt->is_active_data == false &&
-		    cxt->is_active_nodata == false) {
-			err = cxt->gyro_ctl.enable_nodata(0);
-			if (err) {
-				pr_err("gyro turn off power err = %d\n",
-					    err);
-				return -1;
-			}
-			pr_debug("gyro turn off power done\n");
-		}
-
-		cxt->power = 0;
-		cxt->delay_ns = -1;
-		pr_debug("GYRO disable done\n");
-		return 0;
-	}
-	/* power off -> power on */
-	if (cxt->power == 0 && cxt->enable == 1) {
-		pr_debug("GYRO enable\n");
-		if (true == cxt->is_active_data ||
-		    true == cxt->is_active_nodata) {
-			err = cxt->gyro_ctl.enable_nodata(1);
-			if (err) {
-				pr_err("gyro turn on power err = %d\n",
-					    err);
-				return -1;
-			}
-			pr_debug("gyro turn on power done\n");
-		}
-		cxt->power = 1;
-		pr_debug("GYRO enable done\n");
-	}
-	/* rate change */
-	if (cxt->power == 1 && cxt->delay_ns >= 0) {
-		pr_debug("GYRO set batch\n");
-		/* set ODR, fifo timeout latency */
-		if (cxt->gyro_ctl.is_support_batch)
-			err = cxt->gyro_ctl.batch(0, cxt->delay_ns,
-						  cxt->latency_ns);
-		else
-			err = cxt->gyro_ctl.batch(0, cxt->delay_ns, 0);
-		if (err) {
-			pr_err("gyro set batch(ODR) err %d\n", err);
-			return -1;
-		}
-		pr_debug("gyro set ODR, fifo latency done\n");
-		/* start polling, if needed */
-		if (cxt->is_active_data == true &&
-		    cxt->gyro_ctl.is_report_input_direct == false) {
-			uint64_t mdelay = cxt->delay_ns;
-
-			do_div(mdelay, 1000000);
-			atomic_set(&cxt->delay, mdelay);
-			/* the first sensor start polling timer */
-			if (cxt->is_polling_run == false) {
-				cxt->is_polling_run = true;
-				cxt->is_first_data_after_enable = true;
-				startTimer(&cxt->hrTimer,
-					   atomic_read(&cxt->delay), true);
-			}
-			pr_debug("gyro set polling delay %d ms\n",
-				 atomic_read(&cxt->delay));
-		}
-		pr_debug("GYRO batch done\n");
-	}
-	return 0;
-}
-#endif
-static ssize_t gyroenablenodata_show(struct device *dev,
-				       struct device_attribute *attr, char *buf)
-{
-	int len = 0;
-
-	pr_debug(" not support now\n");
-	return len;
-}
-
-static ssize_t gyroenablenodata_store(struct device *dev,
-					struct device_attribute *attr,
-					const char *buf, size_t count)
-{
-	struct gyro_context *cxt = gyro_context_obj;
-	int err = 0;
-
-	pr_debug("gyro_store_enable nodata buf=%s\n", buf);
-	mutex_lock(&gyro_context_obj->gyro_op_mutex);
-	if (!strncmp(buf, "1", 1)) {
-		cxt->enable = 1;
-		cxt->is_active_nodata = true;
-	} else if (!strncmp(buf, "0", 1)) {
-		cxt->enable = 0;
-		cxt->is_active_nodata = false;
-	} else {
-		pr_info(" gyro_store enable nodata cmd error !!\n");
-		err = -1;
-		goto err_out;
-	}
-#ifdef CONFIG_NANOHUB
-	if (true == cxt->is_active_data || true == cxt->is_active_nodata) {
-		err = cxt->gyro_ctl.enable_nodata(1);
-		if (err) {
-			pr_err("gyro turn on power err = %d\n", err);
-			goto err_out;
-		}
-		pr_debug("gyro turn on power done\n");
-	} else {
-		err = cxt->gyro_ctl.enable_nodata(0);
-		if (err) {
-			pr_err("gyro turn off power err = %d\n", err);
-			goto err_out;
-		}
-		pr_debug("gyro turn off power done\n");
-	}
-#else
-	err = gyro_enable_and_batch();
-#endif
-
-err_out:
-	mutex_unlock(&gyro_context_obj->gyro_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t gyroactive_store(struct device *dev,
-				 struct device_attribute *attr, const char *buf,
-				 size_t count)
-{
-	struct gyro_context *cxt = gyro_context_obj;
-	int err = 0;
-
-	pr_debug("%s buf=%s\n", __func__, buf);
-	mutex_lock(&gyro_context_obj->gyro_op_mutex);
-	if (!strncmp(buf, "1", 1)) {
-		cxt->enable = 1;
-		cxt->is_active_data = true;
-	} else if (!strncmp(buf, "0", 1)) {
-		cxt->enable = 0;
-		cxt->is_active_data = false;
-	} else {
-		pr_err("%s error !!\n", __func__);
-		err = -1;
-		goto err_out;
-	}
-#ifdef CONFIG_NANOHUB
-	if (true == cxt->is_active_data || true == cxt->is_active_nodata) {
-		err = cxt->gyro_ctl.enable_nodata(1);
-		if (err) {
-			pr_err("gyro turn on power err = %d\n", err);
-			goto err_out;
-		}
-		pr_debug("gyro turn on power done\n");
-	} else {
-		err = cxt->gyro_ctl.enable_nodata(0);
-		if (err) {
-			pr_err("gyro turn off power err = %d\n", err);
-			goto err_out;
-		}
-		pr_debug("gyro turn off power done\n");
-	}
-#else
-	err = gyro_enable_and_batch();
-#endif
-err_out:
-	mutex_unlock(&gyro_context_obj->gyro_op_mutex);
-	pr_debug("%s done\n", __func__);
-	if (err)
-		return err;
-	else
-		return count;
-}
-/*----------------------------------------------------------------------------*/
-static ssize_t gyroactive_show(struct device *dev,
-				struct device_attribute *attr, char *buf)
-{
-	struct gyro_context *cxt = NULL;
-	int div = 0;
-
-	cxt = gyro_context_obj;
-
-	pr_debug("gyro show active not support now\n");
-	div = cxt->gyro_data.vender_div;
-	pr_debug("gyro vender_div value: %d\n", div);
-	return snprintf(buf, PAGE_SIZE, "%d\n", div);
-}
-
-static ssize_t gyrobatch_store(struct device *dev,
-				struct device_attribute *attr, const char *buf,
-				size_t count)
-{
-	struct gyro_context *cxt = gyro_context_obj;
-	int handle = 0, flag = 0, err = 0;
-
-	pr_debug("%s %s\n", __func__, buf);
-	err = sscanf(buf, "%d,%d,%lld,%lld", &handle, &flag, &cxt->delay_ns,
-		     &cxt->latency_ns);
-	if (err != 4) {
-		pr_info("%s param error: err = %d\n", __func__, err);
-		return -1;
-	}
-
-	mutex_lock(&gyro_context_obj->gyro_op_mutex);
-#ifdef CONFIG_NANOHUB
-	if (cxt->gyro_ctl.is_support_batch)
-		err = cxt->gyro_ctl.batch(0, cxt->delay_ns, cxt->latency_ns);
-	else
-		err = cxt->gyro_ctl.batch(0, cxt->delay_ns, 0);
-	if (err)
-		pr_err("gyro set batch(ODR) err %d\n", err);
-#else
-	err = gyro_enable_and_batch();
-#endif
-	mutex_unlock(&gyro_context_obj->gyro_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t gyrobatch_show(struct device *dev,
-			       struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t gyroflush_store(struct device *dev,
-				struct device_attribute *attr, const char *buf,
-				size_t count)
-{
-	struct gyro_context *cxt = NULL;
-	int handle = 0, err = 0;
-
-	err = kstrtoint(buf, 10, &handle);
-	if (err != 0)
-		pr_info("%s param error: err = %d\n", __func__, err);
-
-	pr_debug("%s param: handle %d\n", __func__, handle);
-
-	mutex_lock(&gyro_context_obj->gyro_op_mutex);
-	cxt = gyro_context_obj;
-	if (cxt->gyro_ctl.flush != NULL)
-		err = cxt->gyro_ctl.flush();
-	else
-		pr_info(
-			"GYRO DRIVER OLD ARCHITECTURE DON'T SUPPORT GYRO COMMON VERSION FLUSH\n");
-	if (err < 0)
-		pr_info("gyro enable flush err %d\n", err);
-	mutex_unlock(&gyro_context_obj->gyro_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t gyroflush_show(struct device *dev,
-			       struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-static ssize_t gyrocali_show(struct device *dev, struct device_attribute *attr,
-			      char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t gyrocali_store(struct device *dev,
-			       struct device_attribute *attr, const char *buf,
-			       size_t count)
-{
-	struct gyro_context *cxt = NULL;
-	int err = 0;
-	uint8_t *cali_buf = NULL;
-
-	cali_buf = vzalloc(count);
-	if (cali_buf == NULL)
-		return -EFAULT;
-	memcpy(cali_buf, buf, count);
-
-	mutex_lock(&gyro_context_obj->gyro_op_mutex);
-	cxt = gyro_context_obj;
-	if (cxt->gyro_ctl.set_cali != NULL)
-		err = cxt->gyro_ctl.set_cali(cali_buf, count);
-	else
-		pr_info(
-			"GYRO DRIVER OLD ARCHITECTURE DON'T SUPPORT GYRO COMMON VERSION FLUSH\n");
-	if (err < 0)
-		pr_info("gyro set cali err %d\n", err);
-	mutex_unlock(&gyro_context_obj->gyro_op_mutex);
-	vfree(cali_buf);
-	return count;
-}
-
-/* need work around again */
-static ssize_t gyrodevnum_show(struct device *dev,
-				struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-static int gyroscope_remove(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static int gyroscope_probe(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	pltfm_dev = pdev;
-	return 0;
-}
-
-#ifdef CONFIG_OF
-static const struct of_device_id gyroscope_of_match[] = {
-	{
-		.compatible = "mediatek,gyroscope",
-	},
-	{},
-};
-#endif
-
-static struct platform_driver gyroscope_driver = {
-	.probe = gyroscope_probe,
-	.remove = gyroscope_remove,
-	.driver = {
-		.name = "gyroscope",
-#ifdef CONFIG_OF
-		.of_match_table = gyroscope_of_match,
-#endif
-	}
-};
-
-static int gyro_real_driver_init(struct platform_device *pdev)
-{
-	int i = 0;
-	int err = 0;
-
-	pr_debug("%s start\n", __func__);
-	for (i = 0; i < MAX_CHOOSE_GYRO_NUM; i++) {
-		pr_debug("i=%d\n", i);
-		if (gyroscope_init_list[i] != 0) {
-			pr_debug("gyro try to init driver %s\n",
-				 gyroscope_init_list[i]->name);
-			err = gyroscope_init_list[i]->init(pdev);
-			if (err == 0) {
-				pr_debug("gyro real driver %s probe ok\n",
-					 gyroscope_init_list[i]->name);
-				break;
-			}
-		}
-	}
-
-	if (i == MAX_CHOOSE_GYRO_NUM) {
-		pr_debug("%s fail\n", __func__);
-		err = -1;
-	}
-	return err;
-}
-
-int gyro_driver_add(struct gyro_init_info *obj)
-{
-	int err = 0;
-	int i = 0;
-
-	if (!obj) {
-		pr_err("%s fail, gyro_init_info is NULL\n", __func__);
-		return -1;
-	}
-
-	for (i = 0; i < MAX_CHOOSE_GYRO_NUM; i++) {
-		if ((i == 0) && (gyroscope_init_list[0] == NULL)) {
-			pr_debug("register gyro driver for the first time\n");
-			if (platform_driver_register(&gyroscope_driver))
-				pr_err(
-					"failed to register gyro driver already exist\n");
-		}
-
-		if (gyroscope_init_list[i] == NULL) {
-			obj->platform_diver_addr = &gyroscope_driver;
-			gyroscope_init_list[i] = obj;
-			break;
-		}
-	}
-
-	if (i >= MAX_CHOOSE_GYRO_NUM) {
-		pr_err("gyro driver add err\n");
-		err = -1;
-	}
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(gyro_driver_add);
-static int gyroscope_open(struct inode *inode, struct file *file)
-{
-	nonseekable_open(inode, file);
-	return 0;
-}
-
-static ssize_t gyroscope_read(struct file *file, char __user *buffer,
-			      size_t count, loff_t *ppos)
-{
-	ssize_t read_cnt = 0;
-
-	read_cnt = sensor_event_read(gyro_context_obj->mdev.minor, file, buffer,
-				     count, ppos);
-
-	return read_cnt;
-}
-
-static unsigned int gyroscope_poll(struct file *file, poll_table *wait)
-{
-	return sensor_event_poll(gyro_context_obj->mdev.minor, file, wait);
-}
-
-static const struct file_operations gyroscope_fops = {
-	.owner = THIS_MODULE,
-	.open = gyroscope_open,
-	.read = gyroscope_read,
-	.poll = gyroscope_poll,
-};
-
-static int gyro_misc_init(struct gyro_context *cxt)
-{
-	int err = 0;
-
-	cxt->mdev.minor = ID_GYROSCOPE;
-	cxt->mdev.name = GYRO_MISC_DEV_NAME;
-	cxt->mdev.fops = &gyroscope_fops;
-	err = sensor_attr_register(&cxt->mdev);
-	if (err)
-		pr_err("unable to register gyro misc device!!\n");
-
-	return err;
-}
-DEVICE_ATTR_RW(gyroenablenodata);
-DEVICE_ATTR_RW(gyroactive);
-DEVICE_ATTR_RW(gyrobatch);
-DEVICE_ATTR_RW(gyroflush);
-DEVICE_ATTR_RW(gyrocali);
-DEVICE_ATTR_RO(gyrodevnum);
-
-static struct attribute *gyro_attributes[] = {
-	&dev_attr_gyroenablenodata.attr,
-	&dev_attr_gyroactive.attr,
-	&dev_attr_gyrobatch.attr,
-	&dev_attr_gyroflush.attr,
-	&dev_attr_gyrocali.attr,
-	&dev_attr_gyrodevnum.attr,
-	NULL
-};
-
-static struct attribute_group gyro_attribute_group = {
-	.attrs = gyro_attributes
-};
-
-int gyro_register_data_path(struct gyro_data_path *data)
-{
-	struct gyro_context *cxt = NULL;
-
-	cxt = gyro_context_obj;
-	cxt->gyro_data.get_data = data->get_data;
-	cxt->gyro_data.get_temperature = data->get_temperature;
-	cxt->gyro_data.vender_div = data->vender_div;
-	cxt->gyro_data.get_raw_data = data->get_raw_data;
-	pr_debug("gyro register data path vender_div: %d\n",
-		 cxt->gyro_data.vender_div);
-	if (cxt->gyro_data.get_data == NULL) {
-		pr_debug("gyro register data path fail\n");
-		return -1;
-	}
-	if (cxt->gyro_data.get_temperature == NULL)
-		pr_debug("gyro not register temperature path\n");
-	return 0;
-}
-EXPORT_SYMBOL_GPL(gyro_register_data_path);
-
-int gyro_register_control_path(struct gyro_control_path *ctl)
-{
-	struct gyro_context *cxt = NULL;
-	int err = 0;
-
-	cxt = gyro_context_obj;
-	cxt->gyro_ctl.set_delay = ctl->set_delay;
-	cxt->gyro_ctl.open_report_data = ctl->open_report_data;
-	cxt->gyro_ctl.enable_nodata = ctl->enable_nodata;
-	cxt->gyro_ctl.batch = ctl->batch;
-	cxt->gyro_ctl.flush = ctl->flush;
-	cxt->gyro_ctl.set_cali = ctl->set_cali;
-	cxt->gyro_ctl.is_support_batch = ctl->is_support_batch;
-	cxt->gyro_ctl.is_use_common_factory = ctl->is_use_common_factory;
-	cxt->gyro_ctl.is_report_input_direct = ctl->is_report_input_direct;
-	if (cxt->gyro_ctl.batch == NULL ||
-	    cxt->gyro_ctl.open_report_data == NULL ||
-	    cxt->gyro_ctl.enable_nodata == NULL) {
-		pr_debug("gyro register control path fail\n");
-		return -1;
-	}
-
-	/* add misc dev for sensor hal control cmd */
-	err = gyro_misc_init(gyro_context_obj);
-	if (err) {
-		pr_info("unable to register gyro misc device!!\n");
-		return -2;
-	}
-	err = sysfs_create_group(&gyro_context_obj->mdev.this_device->kobj,
-				 &gyro_attribute_group);
-	if (err < 0) {
-		pr_info("unable to create gyro attribute file\n");
-		return -3;
-	}
-
-	kobject_uevent(&gyro_context_obj->mdev.this_device->kobj, KOBJ_ADD);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(gyro_register_control_path);
-
-int x_t /* = 0*/;
-int y_t /* = 0*/;
-int z_t /* = 0*/;
-long pc /* = 0*/;
-
-static int check_repeat_data(int x, int y, int z)
-{
-	if ((x_t == x) && (y_t == y) && (z_t == z))
-		pc++;
-	else
-		pc = 0;
-
-	x_t = x;
-	y_t = y;
-	z_t = z;
-
-	if (pc > 100) {
-		pr_info("Gyro sensor output repeat data\n");
-		pc = 0;
-	}
-
-	return 0;
-}
-
-int gyro_data_report(struct gyro_data *data)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	check_repeat_data(data->x, data->y, data->z);
-	event.time_stamp = data->timestamp;
-	event.flush_action = DATA_ACTION;
-	event.status = data->status;
-	event.word[0] = data->x;
-	event.word[1] = data->y;
-	event.word[2] = data->z;
-	event.word[3] = data->temperature;
-	event.reserved = data->reserved[0];
-
-	if (event.reserved == 1)
-		mark_timestamp(ID_GYROSCOPE, DATA_REPORT, ktime_get_boot_ns(),
-			       event.time_stamp);
-	err = sensor_input_event(gyro_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(gyro_data_report);
-
-int gyro_bias_report(struct gyro_data *data)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = BIAS_ACTION;
-	event.word[0] = data->x;
-	event.word[1] = data->y;
-	event.word[2] = data->z;
-
-	err = sensor_input_event(gyro_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(gyro_bias_report);
-
-int gyro_cali_report(struct gyro_data *data)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = CALI_ACTION;
-	event.word[0] = data->x;
-	event.word[1] = data->y;
-	event.word[2] = data->z;
-
-	err = sensor_input_event(gyro_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(gyro_cali_report);
-
-int gyro_temp_report(int32_t *temp)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = TEMP_ACTION;
-	event.word[0] = temp[0];
-	event.word[1] = temp[1];
-	event.word[2] = temp[2];
-	event.word[3] = temp[3];
-	event.word[4] = temp[4];
-	event.word[5] = temp[5];
-
-	err = sensor_input_event(gyro_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(gyro_temp_report);
-
-int gyro_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	pr_debug_ratelimited("flush\n");
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(gyro_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(gyro_flush_report);
-
-int gyro_probe(void)
-{
-
-	int err;
-
-	pr_debug("%s +++!!\n", __func__);
-
-	gyro_context_obj = gyro_context_alloc_object();
-	if (!gyro_context_obj) {
-		err = -ENOMEM;
-		pr_err("unable to allocate devobj!\n");
-		goto exit_alloc_data_failed;
-	}
-
-	/* init real gyroeleration driver */
-	err = gyro_real_driver_init(pltfm_dev);
-	if (err) {
-		pr_err("gyro real driver init fail\n");
-		goto real_driver_init_fail;
-	}
-	pr_debug("%s OK !!\n", __func__);
-	return 0;
-
-real_driver_init_fail:
-	kfree(gyro_context_obj);
-
-exit_alloc_data_failed:
-	pr_err("%s--- fail !!!\n", __func__);
-	return err;
-}
-EXPORT_SYMBOL_GPL(gyro_probe);
-
-int gyro_remove(void)
-{
-	int err = 0;
-
-	sysfs_remove_group(&gyro_context_obj->mdev.this_device->kobj,
-			   &gyro_attribute_group);
-	err = sensor_attr_deregister(&gyro_context_obj->mdev);
-	if (err)
-		pr_err("misc_deregister fail: %d\n", err);
-
-	kfree(gyro_context_obj);
-
-	platform_driver_unregister(&gyroscope_driver);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(gyro_remove);
-
-static int __init gyro_init(void)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static void __exit gyro_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(gyro_init);
-module_exit(gyro_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("GYROSCOPE device driver");
-MODULE_AUTHOR("Mediatek");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/inc/cust_gyro.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/inc/cust_gyro.h
deleted file mode 100644
index 6c2d76b..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/inc/cust_gyro.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __CUST_GYRO_H__
-#define __CUST_GYRO_H__
-
-#include <linux/types.h>
-#include <linux/of.h>
-
-#define GYRO_CUST_I2C_ADDR_NUM 2
-
-struct gyro_hw {
-	unsigned short addr;
-	int i2c_num;	/*!< the i2c bus used by the chip */
-	int direction;  /*!< the direction of the chip */
-	int power_id;
-	int power_vol;  /*!< the Power Voltage used by the chip */
-	int firlen;	 /*!< the length of low pass filter */
-	int (*power)(struct gyro_hw *hw, unsigned int on, char *devname);
-	unsigned char	i2c_addr[GYRO_CUST_I2C_ADDR_NUM];
-	int power_vio_id;
-	int power_vio_vol;  /*!< the Power Voltage used by the chip */
-	bool is_batch_supported;
-};
-
-int get_gyro_dts_func(struct device_node *node, struct gyro_hw *hw);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/inc/gyro_factory.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/inc/gyro_factory.h
deleted file mode 100644
index 666e4d1..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/inc/gyro_factory.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __GYRO_FACTORY_H__
-#define __GYRO_FACTORY_H__
-
-#include "cust_gyro.h"
-#include "gyroscope.h"
-
-struct gyro_factory_fops {
-	int (*enable_sensor)(bool enable_disable, int64_t sample_periods_ms);
-	int (*get_data)(int32_t data[3], int *status);
-	int (*get_raw_data)(int32_t data[3]);
-	int (*enable_calibration)(void);
-	int (*clear_cali)(void);
-	int (*set_cali)(int32_t offset[3]);
-	int (*get_cali)(int32_t offset[3]);
-	int (*do_self_test)(void);
-};
-
-struct gyro_factory_public {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct gyro_factory_fops *fops;
-};
-int gyro_factory_device_register(struct gyro_factory_public *dev);
-int gyro_factory_device_deregister(struct gyro_factory_public *dev);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/inc/gyroscope.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/inc/gyroscope.h
deleted file mode 100644
index 99cb38e..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/gyroscope/inc/gyroscope.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __GYROSCOPE_H__
-#define __GYROSCOPE_H__
-
-//#include <linux/wakelock.h>
-#include "sensor_attr.h"
-#include <hwmsen_helper.h>
-#include <hwmsensor.h>
-#include <linux/atomic.h>
-#include <linux/delay.h>
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/kernel.h>
-#include <linux/kobject.h>
-#include <linux/miscdevice.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/poll.h>
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-#include <linux/workqueue.h>
-#include <sensors_io.h>
-
-#include "gyro_factory.h"
-#include "sensor_event.h"
-
-#ifndef FALSE
-#define FALSE (0)
-#endif
-#ifndef TRUE
-#define TRUE (1)
-#endif
-
-#define OP_GYRO_DELAY 0X01
-#define OP_GYRO_ENABLE 0X02
-#define OP_GYRO_GET_DATA 0X04
-#define GYRO_INVALID_VALUE -1
-#define EVENT_TYPE_GYRO_X ABS_X
-#define EVENT_TYPE_GYRO_Y ABS_Y
-#define EVENT_TYPE_GYRO_Z ABS_Z
-#define EVENT_TYPE_GYRO_TEMPERATURE ABS_MISC
-#define EVENT_TYPE_GYRO_UPDATE REL_X
-#define EVENT_TYPE_GYRO_STATUS ABS_WHEEL
-#define EVENT_TYPE_GYRO_UPDATE REL_X
-#define EVENT_TYPE_GYRO_TIMESTAMP_HI REL_HWHEEL
-#define EVENT_TYPE_GYRO_TIMESTAMP_LO REL_DIAL
-
-#define GYRO_VALUE_MAX (32767)
-#define GYRO_VALUE_MIN (-32768)
-#define GYRO_STATUS_MIN (0)
-#define GYRO_STATUS_MAX (64)
-#define GYRO_DIV_MAX (32767)
-#define GYRO_DIV_MIN (1)
-#define GYRO_AXIS_X 0
-#define GYRO_AXIS_Y 1
-#define GYRO_AXIS_Z 2
-#define MAX_CHOOSE_GYRO_NUM 5
-#define GYRO_AXES_NUM 3
-
-struct gyro_control_path {
-	int (*open_report_data)(int open);
-	int (*enable_nodata)(int en);
-	int (*set_delay)(u64 delay);
-	int (*batch)(int flag, int64_t samplingPeriodNs,
-		     int64_t maxBatchReportLatencyNs);
-	int (*flush)(void);
-	int (*set_cali)(uint8_t *data, uint8_t count);
-	bool is_report_input_direct;
-	bool is_support_batch;
-	bool is_use_common_factory;
-};
-
-struct gyro_data_path {
-	int (*get_data)(int *x, int *y, int *z, int *status);
-	int (*get_raw_data)(int *x, int *y, int *z);
-	int (*get_temperature)(int *temperature);
-	int vender_div;
-};
-
-struct gyro_init_info {
-	char *name;
-	int (*init)(struct platform_device *pdev);
-	int (*uninit)(void);
-	struct platform_driver *platform_diver_addr;
-};
-
-struct gyro_data {
-	int8_t status;
-	int8_t reserved[3];
-	int x;
-	int y;
-	int z;
-	int64_t timestamp;
-	int temperature;
-	void *reserved1;
-};
-
-struct gyro_drv_obj {
-	void *self;
-	int polling;
-	int (*gyro_operate)(void *self, uint32_t command, void *buff_in,
-			    int size_in, void *buff_out, int size_out,
-			    int *actualout);
-};
-
-struct gyro_context {
-	struct input_dev *idev;
-	struct sensor_attr_t mdev;
-	struct work_struct report;
-	struct mutex gyro_op_mutex;
-	atomic_t delay; /*polling period for reporting input event*/
-	atomic_t wake;  /*user-space request to wake-up, used with stop*/
-	struct timer_list timer; /* polling timer */
-	struct hrtimer hrTimer;
-	ktime_t target_ktime;
-	atomic_t trace;
-	struct workqueue_struct *gyro_workqueue;
-	struct gyro_data drv_data;
-	int cali_sw[GYRO_AXES_NUM + 1];
-	struct gyro_control_path gyro_ctl;
-	struct gyro_data_path gyro_data;
-	/*Active, but HAL don't need data sensor. such as  orientation need*/
-	bool is_active_nodata;
-	bool is_active_data;   /* Active and HAL need data .*/
-	bool is_first_data_after_enable;
-	bool is_polling_run;
-	bool is_batch_enable;
-	int power;
-	int enable;
-	int64_t delay_ns;
-	int64_t latency_ns;
-};
-
-extern int gyro_driver_add(struct gyro_init_info *obj);
-extern int gyro_data_report(struct gyro_data *data);
-extern int gyro_bias_report(struct gyro_data *data);
-extern int gyro_cali_report(struct gyro_data *data);
-extern int gyro_temp_report(int32_t *temp);
-extern int gyro_flush_report(void);
-extern int gyro_register_control_path(struct gyro_control_path *ctl);
-extern int gyro_register_data_path(struct gyro_data_path *data);
-extern int gyro_probe(void);
-extern int gyro_remove(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/Kconfig
deleted file mode 100644
index 33af1c9..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/Kconfig
+++ /dev/null
@@ -1,4 +0,0 @@
-config MTK_HWMON
-	bool "MTK HWMON Config"
-	help
-	  CONFIG_MTK_HWMON for sensor common util
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/Makefile
deleted file mode 100644
index 07f6552..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-ifneq ($CONFIG_MTK_SENSOR_SUPPORT), n)
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT) += hwmon.o
-hwmon-$(CONFIG_MTK_SENSOR_SUPPORT) := sensor_event/sensor_event.o \
-        sensor_attributes/sensor_attr.o \
-        hwmsen/hwmsen_helper.o \
-        sensor_performance/sensor_performance.o
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT) += sensor_list/sensor_list.o
-
-else
-obj-n := hwmsen/
-endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/hwmsen/hwmsen_helper.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/hwmsen/hwmsen_helper.c
deleted file mode 100644
index ba261d8..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/hwmsen/hwmsen_helper.c
+++ /dev/null
@@ -1,599 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<HWMSEN> "fmt
-
-#include <generated/autoconf.h>
-#include <linux/atomic.h>
-#include <linux/ctype.h>
-#include <linux/device.h>
-#include <linux/hwmon-sysfs.h>
-#include <linux/init.h>
-#include <linux/io.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/spinlock.h>
-#include <linux/types.h>
-#include <linux/uaccess.h>
-
-#include <hwmsen_helper.h>
-#include <hwmsensor.h>
-
-#define hex2int(c) ((c >= '0') && (c <= '9') ? (c - '0') : ((c & 0xf) + 9))
-
-#define C_MAX_REG_LEN (4)
-
-int hwmsen_set_bits(struct i2c_client *client, u8 addr, u8 bits)
-{
-	int err;
-	u8 cur, nxt;
-
-	err = hwmsen_read_byte(client, addr, &cur);
-	if (err) {
-		pr_debug("read err: 0x%02X\n", addr);
-		return -EFAULT;
-	}
-
-	nxt = (cur | bits);
-
-	if (nxt ^ cur) {
-		err = hwmsen_write_byte(client, addr, nxt);
-		if (err) {
-			pr_debug("write err: 0x%02X\n", addr);
-			return -EFAULT;
-		}
-	}
-	return 0;
-}
-EXPORT_SYMBOL_GPL(hwmsen_set_bits);
-
-int hwmsen_clr_bits(struct i2c_client *client, u8 addr, u8 bits)
-{
-	int err;
-	u8 cur, nxt;
-
-	err = hwmsen_read_byte(client, addr, &cur);
-	if (err) {
-		pr_debug("read err: 0x%02X\n", addr);
-		return -EFAULT;
-	}
-
-	nxt = cur & (~bits);
-
-	if (nxt ^ cur) {
-		err = hwmsen_write_byte(client, addr, nxt);
-		if (err) {
-			pr_debug("write err: 0x%02X\n", addr);
-			return -EFAULT;
-		}
-	}
-	return 0;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_clr_bits);
-/*----------------------------------------------------------------------------*/
-int hwmsen_read_byte(struct i2c_client *client, u8 addr, u8 *data)
-{
-	u8 beg = addr;
-	int err;
-	struct i2c_msg msgs[2] = {
-		{
-			.flags = 0,
-			.len = 1,
-			.buf = &beg
-		},
-		{
-			.flags = I2C_M_RD,
-			.len = 1,
-			.buf = data,
-		}
-	};
-
-	if (!client)
-		return -EINVAL;
-
-	msgs[0].addr = client->addr;
-	msgs[1].addr = client->addr;
-
-	err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
-	if (err != 2) {
-		pr_debug("i2c_transfer error: (%d %p) %d\n", addr, data, err);
-		err = -EIO;
-	}
-
-	err = 0;
-
-	return err;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_read_byte);
-/*----------------------------------------------------------------------------*/
-int hwmsen_write_byte(struct i2c_client *client, u8 addr, u8 data)
-{
-	u8 buf[] = {addr, data};
-	int ret = 0;
-
-	ret = i2c_master_send(client, (const char *)buf, sizeof(buf));
-	if (ret < 0) {
-		pr_debug("send command error!!\n");
-		return -EFAULT;
-	}
-#if defined(HWMSEN_DEBUG)
-	pr_debug("%s(0x%02X)= %02X\n", __func__, addr, data);
-#endif
-
-	return 0;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_write_byte);
-/*----------------------------------------------------------------------------*/
-int hwmsen_read_block(struct i2c_client *client, u8 addr, u8 *data, u8 len)
-{
-	u8 beg = addr;
-	int err;
-	struct i2c_msg msgs[2] = {{0}, {0} };
-
-	if (!client)
-		return -EINVAL;
-	else if (len > C_I2C_FIFO_SIZE) {
-		pr_debug(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE);
-		return -EINVAL;
-	}
-
-	if (len == 1)
-		return hwmsen_read_byte(client, addr, data);
-
-	msgs[0].addr = client->addr;
-	msgs[0].flags = 0;
-	msgs[0].len = 1;
-	msgs[0].buf = &beg;
-
-	msgs[1].addr = client->addr;
-	msgs[1].flags = I2C_M_RD;
-	msgs[1].len = len;
-	msgs[1].buf = data;
-
-	err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
-	if (err != 2) {
-		pr_debug("i2c_transfer error: (%d %p %d) %d\n", addr, data, len,
-			err);
-		err = -EIO;
-	}
-#if defined(HWMSEN_DEBUG)
-	static char buf[128];
-	int idx, buflen = 0;
-
-	for (idx = 0; idx < len; idx++)
-		buflen += snprintf(buf + buflen, sizeof(buf) - buflen, "%02X ",
-				   data[idx]);
-	pr_debug("%s(0x%02X,%2d) = %s\n", __func__, addr, len, buf);
-#endif
-	err = 0; /*no error*/
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(hwmsen_read_block);
-/*----------------------------------------------------------------------------*/
-int hwmsen_write_block(struct i2c_client *client, u8 addr, u8 *data, u8 len)
-{
-	int err, idx, num;
-	char buf[C_I2C_FIFO_SIZE];
-
-	if (!client)
-		return -EINVAL;
-	else if (len >= C_I2C_FIFO_SIZE) {
-		pr_debug(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE);
-		return -EINVAL;
-	}
-
-	num = 0;
-	buf[num++] = addr;
-	for (idx = 0; idx < len; idx++)
-		buf[num++] = data[idx];
-
-	err = i2c_master_send(client, buf, num);
-	if (err < 0) {
-		pr_debug("send command error!!\n");
-		return -EFAULT;
-	}
-#if defined(HWMSEN_DEBUG)
-	static char buf[128];
-	int idx, buflen = 0;
-
-	for (idx = 0; idx < len; idx++)
-		buflen += snprintf(buf + buflen, sizeof(buf) - buflen, "%02X ",
-				   data[idx]);
-	pr_debug("%s(0x%02X,%2d)= %s\n", __func__, addr, len, buf);
-#endif
-	err = 0; /*no error*/
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(hwmsen_write_block);
-/*----------------------------------------------------------------------------*/
-static int hwmsen_chrs_to_integer(u8 dat[C_MAX_REG_LEN], int datlen)
-{
-	int idx;
-	u32 val = 0;
-
-	for (idx = 0; idx < datlen; idx++)
-		val += (dat[idx] << (8 * idx));
-	return val;
-}
-/*----------------------------------------------------------------------------*/
-static int hwmsen_byte_to_integer(u8 dat, int datlen)
-{
-	int idx;
-	u32 val = 0;
-
-	for (idx = 0; idx < datlen; idx++)
-		val += (dat << (8 * idx));
-	return val;
-}
-/*----------------------------------------------------------------------------*/
-void hwmsen_single_rw(struct i2c_client *client, struct hwmsen_reg *regs,
-		      int reg_num)
-{
-	int idx, pos, num, err = 0, cmp1, cmp2;
-	u8 pattern[] = {0x55, 0xAA};
-	u8 old[C_MAX_REG_LEN], val[C_MAX_REG_LEN], mask;
-	struct hwmsen_reg *ptr;
-
-	for (idx = 0; idx < reg_num; idx++) {
-		if (regs[idx].mode != REG_RW)
-			continue;
-		if (regs[idx].len > C_MAX_REG_LEN) {
-			pr_debug("exceed maximum length\n");
-			continue;
-		}
-		ptr = &regs[idx];
-
-		err = hwmsen_read_block(client, ptr->addr, old, ptr->len);
-		if (err) {
-			pr_debug("read %s fails\n", ptr->name);
-			continue;
-		}
-		for (pos = 0; pos < ARRAY_SIZE(pattern); pos++) {
-			mask = ptr->mask;
-			for (num = 0; num < ptr->len; num++)
-				val[num] = pattern[pos] & mask;
-			err = hwmsen_write_block(client, ptr->addr, val,
-						 ptr->len);
-			if (err) {
-				pr_debug("test: write %s fails, pat[0x%02X]\n",
-					ptr->name, pattern[pos]);
-				continue;
-			}
-			err = hwmsen_read_block(client, ptr->addr, val,
-						ptr->len);
-			if (err) {
-				pr_debug("test: read %s fails\n", ptr->name);
-				continue;
-			}
-
-			cmp1 = hwmsen_chrs_to_integer(val, ptr->len);
-			cmp2 = hwmsen_byte_to_integer(pattern[pos], ptr->len);
-			if ((cmp1 ^ cmp2) & ptr->mask)
-				pr_debug("test: reg %s[%d] 0x%08X <-> 0x%08X\n",
-					ptr->name, num, cmp1, cmp2);
-		}
-
-		err = hwmsen_write_block(client, ptr->addr, old, ptr->len);
-		if (err) {
-			pr_debug("restore: write %s\n", ptr->name);
-			continue;
-		}
-
-		err = hwmsen_read_block(client, ptr->addr, val, ptr->len);
-		if (err) {
-			pr_debug("restore: read %s\n", ptr->name);
-			continue;
-		}
-
-		cmp1 = hwmsen_chrs_to_integer(val, ptr->len);
-		cmp2 = hwmsen_chrs_to_integer(old, ptr->len);
-		if ((cmp1 ^ cmp2) & ptr->mask) {
-			pr_debug("restore %s fails\n", ptr->name);
-			err = -EFAULT;
-		}
-	}
-	if (!err)
-		pr_debug("%s pass!!\n", __func__);
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_single_rw);
-/*----------------------------------------------------------------------------*/
-void hwmsen_multi_rw(struct i2c_client *client, find_reg_t findreg,
-		     struct hwmsen_reg_test_multi *items, int inum)
-{
-	u8 pattern[] = {0x55, 0xAA};
-	u8 buf[C_I2C_FIFO_SIZE], dat[C_I2C_FIFO_SIZE], old[C_I2C_FIFO_SIZE];
-	int pos, idx, p, err = 0;
-
-	for (idx = 0; idx < inum; idx++) {
-		u8 addr = items[idx].addr;
-		u8 len = items[idx].len;
-		u8 mode = items[idx].mode;
-
-		for (pos = 0; pos < ARRAY_SIZE(pattern); pos++) {
-			err = hwmsen_read_block(client, addr, old, len);
-			if (err) {
-				pr_debug("(%d) save block fail!!\n", idx);
-				continue;
-			}
-			if (!(mode & REG_WO))
-				continue;
-
-			memset(buf, pattern[pos], sizeof(buf));
-			for (p = 0; p < len; p++)
-				buf[p] = buf[p] & findreg(addr + p)->mask;
-			err = hwmsen_write_block(client, addr, buf, len);
-			if (err) {
-				pr_debug("(%d) block write fail!!\n", idx);
-				continue;
-			}
-			memset(dat, 0x00, sizeof(dat));
-			err = hwmsen_read_block(client, addr, dat, len);
-			if (err) {
-				pr_debug("(%d) block read fail!!\n", idx);
-				continue;
-			}
-			err = hwmsen_write_block(client, addr, old, len);
-			if (err) {
-				pr_debug("(%d) restore block fail!!\n", idx);
-				continue;
-			}
-
-			if (memcmp(buf, dat, len)) {
-				pr_debug("(%d) data compare fail!!\n", idx);
-				pr_debug("buf:");
-				for (p = 0; p < len; p++)
-					pr_debug("%02X", buf[p]);
-				pr_debug("\n");
-				pr_debug("dat:");
-				for (p = 0; p < len; p++)
-					pr_debug("%02X", dat[p]);
-				pr_debug("\n");
-				err = 1;
-			}
-		}
-	}
-	if (!err)
-		pr_debug("%s success : %d cases\n", __func__, inum);
-	else
-		pr_debug("%s: %d cases\n", __func__, inum);
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_multi_rw);
-/*----------------------------------------------------------------------------*/
-ssize_t hwmsen_show_dump(struct i2c_client *client, u8 startAddr, u8 *regtbl,
-			 u32 regnum, find_reg_t findreg, char *buf, u32 buflen)
-{
-	int err = 0;
-	u8 addr = startAddr;
-	u8 max_len = 8, read_len;
-	const char *name = NULL;
-
-	if (!client)
-		return -EINVAL;
-
-	memset(regtbl, 0x00, regnum);
-
-	do {
-		read_len = ((regnum - addr) > max_len) ? (max_len)
-						       : (regnum - addr);
-		if (!read_len)
-			break;
-
-		err = hwmsen_read_block(client, addr, &regtbl[addr - startAddr],
-					read_len);
-		if (!err)
-			addr += read_len;
-		/* SEN_VER("read block data: %d %d\n", addr, read_len); */
-	} while (!err);
-
-	if (!err) {
-		int idx;
-		ssize_t len = 0;
-
-		for (idx = startAddr; idx < regnum; idx++) {
-			name = findreg(idx)->name;
-			if (name != NULL)
-				len += snprintf(buf + len, buflen - len,
-						"%-16s = 0x%02X\n", name,
-						regtbl[idx - startAddr]);
-		}
-		return len;
-	}
-	return 0;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_show_dump);
-/*----------------------------------------------------------------------------*/
-ssize_t hwmsen_read_all_regs(struct i2c_client *client, struct hwmsen_reg *regs,
-			     u32 num, char *buf, u32 buflen)
-{
-	int err = 0, pos, idx, val;
-	struct hwmsen_reg *ptr;
-	u8 dat[4];
-	ssize_t len = 0;
-
-	if (!client)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++) {
-		ptr = &regs[idx];
-		memset(dat, 0x00, sizeof(dat));
-		if (ptr->len > sizeof(dat)) {
-			pr_debug("exceeds capacity, %d\n", ptr->len);
-			break;
-		}
-		err = hwmsen_read_block(client, ptr->addr, dat, ptr->len);
-		if (err) {
-			pr_debug("read reg %s (0x%2X) fail!!\n", ptr->name,
-				ptr->addr);
-			break;
-		}
-
-		val = 0;
-		for (pos = 0; pos < ptr->len; pos++)
-			val += (dat[pos] << (8 * pos));
-		len += snprintf(buf + len, buflen - len, "%-16s = %8X\n",
-				ptr->name, val);
-	}
-	return (err) ? (0) : len;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_read_all_regs);
-/*----------------------------------------------------------------------------*/
-ssize_t hwmsen_show_reg(struct i2c_client *client, u8 addr, char *buf,
-			u32 buflen)
-{
-	u8 data = 0;
-	int err;
-
-	err = hwmsen_read_byte(client, addr, &data);
-	if (err) {
-		pr_debug("reading address 0x%02X fail!!", addr);
-		return 0;
-	} else
-		return snprintf(buf, buflen, "0x%02X\n", data);
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_show_reg);
-/*----------------------------------------------------------------------------*/
-ssize_t hwmsen_store_reg(struct i2c_client *client, u8 addr, const char *buf,
-			 size_t count)
-{
-	int err, val;
-	u8 data;
-
-	err = kstrtoint(buf, 16, &val);
-	if (err != 0) {
-		pr_debug("format not match: (0xAB) <-> '%s'\n", buf);
-		return count;
-	}
-	data = (u8)val;
-
-	err = hwmsen_write_byte(client, addr, data);
-	if (err)
-		pr_debug("write address 0x%02X fail!!\n", addr);
-	return count;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_store_reg);
-/*----------------------------------------------------------------------------*/
-ssize_t hwmsen_show_byte(struct device *dev, struct device_attribute *attr,
-			 char *buf, u32 buflen)
-{
-	int err, index = to_sensor_dev_attr(attr)->index;
-	struct i2c_client *client = to_i2c_client(dev);
-	u8 addr = (u8)index;
-	u8 dat;
-
-	err = hwmsen_read_byte(client, addr, &dat);
-	if (err) {
-		pr_debug("reading address 0x%02X fail!!", addr);
-		return 0;
-	}
-	return snprintf(buf, buflen, "0x%02X\n", dat);
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_show_byte);
-/*----------------------------------------------------------------------------*/
-ssize_t hwmsen_store_byte(struct device *dev, struct device_attribute *attr,
-			  const char *buf, size_t count)
-{
-	int err, val;
-	int index = to_sensor_dev_attr(attr)->index;
-	struct i2c_client *client = to_i2c_client(dev);
-	u8 addr = (u8)index;
-	u8 dat;
-
-	err = kstrtoint(buf, 16, &val);
-	if (err != 0) {
-		pr_debug("format not match: (0xAB) <-> '%s'\n", buf);
-		return count;
-	}
-	dat = (u8)val;
-
-	err = hwmsen_write_byte(client, addr, dat);
-	if (err)
-		pr_debug("write address 0x%02X fail!!\n", addr);
-	return count;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_store_byte);
-/*----------------------------------------------------------------------------*/
-ssize_t hwmsen_show_word(struct device *dev, struct device_attribute *attr,
-			 char *buf, u32 buflen)
-{
-	int err, index = to_sensor_dev_attr(attr)->index;
-	struct i2c_client *client = to_i2c_client(dev);
-	u8 addr = (u8)index;
-	u8 dat[2];
-
-	err = hwmsen_read_block(client, addr, dat, sizeof(dat));
-	if (err) {
-		pr_debug("reading address 0x%02X fail!!", addr);
-		return 0;
-	}
-	return snprintf(buf, buflen, "0x%04X\n", (dat[0] | (dat[1] << 8)));
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_show_word);
-/*----------------------------------------------------------------------------*/
-ssize_t hwmsen_store_word(struct device *dev, struct device_attribute *attr,
-			  const char *buf, size_t count)
-{
-	int err, val;
-	int index = to_sensor_dev_attr(attr)->index;
-	struct i2c_client *client = to_i2c_client(dev);
-	u8 addr = (u8)index;
-	u8 dat[2];
-
-	err = kstrtoint(buf, 16, &val);
-	if (err != 0) {
-		pr_debug("format not match: (0xAB) <-> '%s'\n", buf);
-		return count;
-	}
-	dat[0] = (u8)((val & 0x00FF));
-	dat[1] = (u8)((val & 0xFF00) >> 8);
-
-	err = hwmsen_write_block(client, addr, dat, sizeof(dat));
-	if (err)
-		pr_debug("write address 0x%02X fail!!\n", addr);
-	return count;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_store_word);
-/*----------------------------------------------------------------------------*/
-struct hwmsen_convert map[] = {
-	{ { 1, 1, 1}, {0, 1, 2} },
-	{ {-1, 1, 1}, {1, 0, 2} },
-	{ {-1, -1, 1}, {0, 1, 2} },
-	{ { 1, -1, 1}, {1, 0, 2} },
-
-	{ {-1, 1, -1}, {0, 1, 2} },
-	{ { 1, 1, -1}, {1, 0, 2} },
-	{ { 1, -1, -1}, {0, 1, 2} },
-	{ {-1, -1, -1}, {1, 0, 2} },
-
-};
-/*----------------------------------------------------------------------------*/
-int hwmsen_get_convert(int direction, struct hwmsen_convert *cvt)
-{
-	if (!cvt)
-		return -EINVAL;
-	else if (direction >= ARRAY_SIZE(map))
-		return -EINVAL;
-
-	*cvt = map[direction];
-	return 0;
-}
-/*----------------------------------------------------------------------------*/
-EXPORT_SYMBOL_GPL(hwmsen_get_convert);
-/*----------------------------------------------------------------------------*/
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/hwmsen_helper.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/hwmsen_helper.h
deleted file mode 100644
index ff9c39c..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/hwmsen_helper.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#include "hwmsensor.h"
-#include <linux/i2c.h>
-#include <linux/types.h>
-#ifndef __HWMSEN_HELPER_H__
-#define __HWMSEN_HELPER_H__
-
-#define C_I2C_FIFO_SIZE 8 /*according i2c_mt6516.c */
-
-struct hwmsen_reg {
-	const char *name;
-	u16 addr;
-	u16 mode;
-	u16 mask;
-	u16 len;
-};
-/*----------------------------------------------------------------------------*/
-#define HWMSEN_DUMMY_REG(X)                                                    \
-{                                                                      \
-	NULL, X, REG_NA, 0x00, 0                                       \
-}
-/*----------------------------------------------------------------------------*/
-struct hwmsen_reg_test_multi {
-	u8 addr;
-	u8 len;
-	u8 mode;
-	u8 _align;
-};
-/*----------------------------------------------------------------------------*/
-enum {
-REG_NA = 0x0000,
-REG_RO = 0x0001,
-REG_WO = 0x0002,
-REG_LK = 0x0004, /*lcoked, register test will by-pass this register */
-REG_RW = REG_RO | REG_WO,
-};
-/*----------------------------------------------------------------------------*/
-/*
- * @sign, map: only used in accelerometer/magnetic field
- *      sometimes, the sensor output need to be remapped before reporting to
- * framework.
- *      the 'sign' is only -1 or +1 to align the sign for framework's coordinate
- * system
- *      the 'map'  align the value for framework's coordinate system. Take
- * accelerometer
- *      as an example:
- *      assume HAL receives original acceleration: acc[] = {100, 0, 100}
- *      sign[] = {1, -1, 1, 0};
- *      map[]  = {HWM_CODE_ACC_Y, HWM_CODE_ACC_X, HWM_CODE_ACC_Z, 0};
- *      according to the above 'sign' & 'map', the sensor output need to remap
- * as {y, -x, z}:
- *      float resolution = unit_numerator*GRAVITY_EARTH/unit_denominator;
- *      acc_x = sign[0]*acc[map[0]]*resolution;
- *      acc_y = sign[1]*acc[map[1]]*resolution;
- *      acc_z = sign[2]*acc[map[2]]*resolution;
- */
-struct hwmsen_convert {
-	s8 sign[C_MAX_HWMSEN_EVENT_NUM];
-	u8 map[C_MAX_HWMSEN_EVENT_NUM];
-};
-/*----------------------------------------------------------------------------*/
-struct hwmsen_conf {
-	/*output sensitivity of sensor data */
-	s32 sensitivity[C_MAX_HWMSEN_EVENT_NUM];
-	int num;
-};
-/*----------------------------------------------------------------------------*/
-typedef struct hwmsen_reg *(*find_reg_t)(int reg_idx);
-/*----------------------------------------------------------------------------*/
-extern int hwmsen_set_bits(struct i2c_client *client, u8 addr, u8 bits);
-extern int hwmsen_clr_bits(struct i2c_client *client, u8 addr, u8 bits);
-extern int hwmsen_read_byte(struct i2c_client *client, u8 addr, u8 *data);
-extern int hwmsen_write_byte(struct i2c_client *client, u8 addr, u8 data);
-extern int hwmsen_read_block(struct i2c_client *client, u8 addr, u8 *data,
-			     u8 len);
-extern int hwmsen_write_block(struct i2c_client *client, u8 addr, u8 *data,
-			      u8 len);
-extern void hwmsen_single_rw(struct i2c_client *client, struct hwmsen_reg *regs,
-			     int num);
-extern void hwmsen_multi_rw(struct i2c_client *client, find_reg_t findreg,
-			    struct hwmsen_reg_test_multi *items, int inum);
-extern ssize_t hwmsen_show_dump(struct i2c_client *client, u8 startAddr,
-				u8 *regtbl, u32 regnum, find_reg_t findreg,
-				char *buf, u32 buflen);
-extern ssize_t hwmsen_read_all_regs(struct i2c_client *client,
-				    struct hwmsen_reg *regs, u32 num, char *buf,
-				    u32 buflen);
-extern ssize_t hwmsen_show_reg(struct i2c_client *client, u8 addr, char *buf,
-			       u32 buflen);
-extern ssize_t hwmsen_store_reg(struct i2c_client *client, u8 addr,
-				const char *buf, size_t count);
-extern ssize_t hwmsen_show_byte(struct device *dev,
-				struct device_attribute *attr, char *buf,
-				u32 buflen);
-extern ssize_t hwmsen_store_byte(struct device *dev,
-				 struct device_attribute *attr, const char *buf,
-				 size_t count);
-extern ssize_t hwmsen_show_word(struct device *dev,
-				struct device_attribute *attr, char *buf,
-				u32 buflen);
-extern ssize_t hwmsen_store_word(struct device *dev,
-				 struct device_attribute *attr, const char *buf,
-				 size_t count);
-extern int hwmsen_get_convert(int direction, struct hwmsen_convert *cvt);
-/*----------------------------------------------------------------------------*/
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/hwmsensor.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/hwmsensor.h
deleted file mode 100644
index 283b16b..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/hwmsensor.h
+++ /dev/null
@@ -1,438 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __HWMSENSOR_H__
-#define __HWMSENSOR_H__
-
-#include <linux/ioctl.h>
-#include <linux/types.h>
-#ifdef CONFIG_COMPAT
-#include <linux/compat.h>
-#endif
-/* follow google default sensor type */
-#define SENSOR_TYPE_ACCELEROMETER                      1
-#define SENSOR_TYPE_MAGNETIC_FIELD                     2
-#define SENSOR_TYPE_ORIENTATION                        3
-#define SENSOR_TYPE_GYROSCOPE                          4
-#define SENSOR_TYPE_LIGHT                              5
-#define SENSOR_TYPE_PRESSURE                           6
-#define SENSOR_TYPE_TEMPERATURE                        7
-#define SENSOR_TYPE_PROXIMITY                          8
-#define SENSOR_TYPE_GRAVITY                            9
-#define SENSOR_TYPE_LINEAR_ACCELERATION                10
-#define SENSOR_TYPE_ROTATION_VECTOR                    11
-#define SENSOR_TYPE_RELATIVE_HUMIDITY                  12
-#define SENSOR_TYPE_AMBIENT_TEMPERATURE                13
-#define SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED        14
-#define SENSOR_TYPE_GAME_ROTATION_VECTOR               15
-#define SENSOR_TYPE_GYROSCOPE_UNCALIBRATED             16
-#define SENSOR_TYPE_SIGNIFICANT_MOTION                 17
-#define SENSOR_TYPE_STEP_DETECTOR                      18
-#define SENSOR_TYPE_STEP_COUNTER                       19
-#define SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR        20
-#define SENSOR_TYPE_HEART_RATE                         21
-#define SENSOR_TYPE_TILT_DETECTOR                      22
-#define SENSOR_TYPE_WAKE_GESTURE                       23
-#define SENSOR_TYPE_GLANCE_GESTURE                     24
-#define SENSOR_TYPE_PICK_UP_GESTURE                    25
-#define SENSOR_TYPE_WRIST_TILT_GESTURE                 26
-#define SENSOR_TYPE_DEVICE_ORIENTATION                 27
-#define SENSOR_TYPE_POSE_6DOF                          28
-#define SENSOR_TYPE_STATIONARY_DETECT                  29
-#define SENSOR_TYPE_MOTION_DETECT                      30
-#define SENSOR_TYPE_HEART_BEAT                         31
-#define SENSOR_TYPE_DYNAMIC_SENSOR_META                32
-#define SENSOR_TYPE_ADDITIONAL_INFO                    33
-#define SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT         34
-#define SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED         35
-
-
-/* follow mtk add sensor type */
-#define SENSOR_TYPE_PEDOMETER                          55
-#define SENSOR_TYPE_IN_POCKET                          56
-#define SENSOR_TYPE_ACTIVITY                           57
-#define SENSOR_TYPE_PDR                                58
-#define SENSOR_TYPE_FREEFALL                           59
-#define SENSOR_TYPE_FLAT                               60
-#define SENSOR_TYPE_FACE_DOWN                          61
-#define SENSOR_TYPE_SHAKE                              62
-#define SENSOR_TYPE_BRINGTOSEE                         63
-#define SENSOR_TYPE_ANSWER_CALL                        64
-#define SENSOR_TYPE_GEOFENCE                           65
-#define SENSOR_TYPE_FLOOR_COUNTER                      66
-#define SENSOR_TYPE_EKG                                67
-#define SENSOR_TYPE_PPG1                               68
-#define SENSOR_TYPE_PPG2                               69
-#define SENSOR_TYPE_RGBW                               70
-#define SENSOR_TYPE_GYRO_TEMPERATURE                   71
-#define SENSOR_TYPE_SAR                                72
-/* end sensor type */
-#define SENSOR_TYPE_MAX_NUM                            SENSOR_TYPE_SAR
-#define SENSOR_TYPE_MAX_NUM_PLUS_ONE                   (SENSOR_TYPE_MAX_NUM + 1)
-
-/*---------------------------------------------------------------------------*/
-#define ID_BASE                 (0)
-#define ID_OFFSET               (1)
-/* follow google default sensor ID */
-#define ID_ACCELEROMETER        (ID_BASE + SENSOR_TYPE_ACCELEROMETER - 1)
-#define ID_MAGNETIC             (ID_BASE + SENSOR_TYPE_MAGNETIC_FIELD - 1)
-#define ID_ORIENTATION          (ID_BASE + SENSOR_TYPE_ORIENTATION - 1)
-#define ID_GYROSCOPE            (ID_BASE + SENSOR_TYPE_GYROSCOPE - 1)
-#define ID_LIGHT                (ID_BASE + SENSOR_TYPE_LIGHT - 1)
-#define ID_PRESSURE             (ID_BASE + SENSOR_TYPE_PRESSURE - 1)
-#define ID_TEMPRERATURE         (ID_BASE + SENSOR_TYPE_TEMPERATURE - 1)
-#define ID_PROXIMITY            (ID_BASE + SENSOR_TYPE_PROXIMITY - 1)
-#define ID_GRAVITY              (ID_BASE + SENSOR_TYPE_GRAVITY - 1)
-#define ID_LINEAR_ACCELERATION  (ID_BASE + SENSOR_TYPE_LINEAR_ACCELERATION - 1)
-#define ID_ROTATION_VECTOR      (ID_BASE + SENSOR_TYPE_ROTATION_VECTOR - 1)
-#define ID_RELATIVE_HUMIDITY    (ID_BASE + SENSOR_TYPE_RELATIVE_HUMIDITY - 1)
-#define ID_AMBIENT_TEMPERATURE  (ID_BASE + SENSOR_TYPE_AMBIENT_TEMPERATURE - 1)
-#define ID_MAGNETIC_UNCALIBRATED        \
-		(ID_BASE + SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED - 1)
-#define ID_GAME_ROTATION_VECTOR         \
-		(ID_BASE + SENSOR_TYPE_GAME_ROTATION_VECTOR - 1)
-#define ID_GYROSCOPE_UNCALIBRATED       \
-		(ID_BASE + SENSOR_TYPE_GYROSCOPE_UNCALIBRATED - 1)
-#define ID_SIGNIFICANT_MOTION           \
-		(ID_BASE + SENSOR_TYPE_SIGNIFICANT_MOTION - 1)
-#define ID_STEP_DETECTOR                \
-		(ID_BASE + SENSOR_TYPE_STEP_DETECTOR - 1)
-#define ID_STEP_COUNTER                 \
-		(ID_BASE + SENSOR_TYPE_STEP_COUNTER - 1)
-#define ID_GEOMAGNETIC_ROTATION_VECTOR  \
-		(ID_BASE + SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR - 1)
-#define ID_HEART_RATE           (ID_BASE + SENSOR_TYPE_HEART_RATE - 1)
-#define ID_TILT_DETECTOR        (ID_BASE + SENSOR_TYPE_TILT_DETECTOR - 1)
-#define ID_WAKE_GESTURE         (ID_BASE + SENSOR_TYPE_WAKE_GESTURE - 1)
-#define ID_GLANCE_GESTURE       (ID_BASE + SENSOR_TYPE_GLANCE_GESTURE - 1)
-#define ID_PICK_UP_GESTURE      (ID_BASE + SENSOR_TYPE_PICK_UP_GESTURE - 1)
-#define ID_WRIST_TITL_GESTURE   (ID_BASE + SENSOR_TYPE_WRIST_TILT_GESTURE - 1)
-#define ID_DEVICE_ORIENTATION   (ID_BASE + SENSOR_TYPE_DEVICE_ORIENTATION - 1)
-#define ID_POSE_6DOF            (ID_BASE + SENSOR_TYPE_POSE_6DOF - 1)
-#define ID_STATIONARY_DETECT    (ID_BASE + SENSOR_TYPE_STATIONARY_DETECT - 1)
-#define ID_MOTION_DETECT        (ID_BASE + SENSOR_TYPE_MOTION_DETECT - 1)
-#define ID_HEART_BEAT           (ID_BASE + SENSOR_TYPE_HEART_BEAT - 1)
-#define ID_DYNAMIC_SENSOR_META  (ID_BASE + SENSOR_TYPE_DYNAMIC_SENSOR_META - 1)
-#define ID_ADDITIONAL_INFO      (ID_BASE + SENSOR_TYPE_ADDITIONAL_INFO - 1)
-#define ID_LOW_LATENCY_OFFBODY_DETECT   \
-		(ID_BASE + SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT - 1)
-#define ID_ACCELEROMETER_UNCALIBRATED   \
-		(ID_BASE + SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED - 1)
-
-
-/* follow mtk add sensor ID */
-#define ID_PEDOMETER            (ID_BASE + SENSOR_TYPE_PEDOMETER - 1)
-#define ID_IN_POCKET            (ID_BASE + SENSOR_TYPE_IN_POCKET - 1)
-#define ID_ACTIVITY             (ID_BASE + SENSOR_TYPE_ACTIVITY - 1)
-#define ID_PDR                  (ID_BASE + SENSOR_TYPE_PDR - 1)
-#define ID_FREEFALL             (ID_BASE + SENSOR_TYPE_FREEFALL - 1)
-#define ID_FLAT                 (ID_BASE + SENSOR_TYPE_FLAT - 1)
-#define ID_FACE_DOWN            (ID_BASE + SENSOR_TYPE_FACE_DOWN - 1)
-#define ID_SHAKE                (ID_BASE + SENSOR_TYPE_SHAKE - 1)
-#define ID_BRINGTOSEE           (ID_BASE + SENSOR_TYPE_BRINGTOSEE - 1)
-#define ID_ANSWER_CALL          (ID_BASE + SENSOR_TYPE_ANSWER_CALL - 1)
-#define ID_GEOFENCE             (ID_BASE + SENSOR_TYPE_GEOFENCE - 1)
-#define ID_FLOOR_COUNTER        (ID_BASE + SENSOR_TYPE_FLOOR_COUNTER - 1)
-#define ID_EKG                  (ID_BASE + SENSOR_TYPE_EKG - 1)
-#define ID_PPG1                 (ID_BASE + SENSOR_TYPE_PPG1 - 1)
-#define ID_PPG2                 (ID_BASE + SENSOR_TYPE_PPG2 - 1)
-#define ID_RGBW                 (ID_BASE + SENSOR_TYPE_RGBW - 1)
-#define ID_GYRO_TEMPERATURE     (ID_BASE + SENSOR_TYPE_GYRO_TEMPERATURE - 1)
-#define ID_SAR                  (ID_BASE + SENSOR_TYPE_SAR - 1)
-/* end sensor ID */
-#define ID_SENSOR_MAX_HANDLE    (ID_SAR)
-#define ID_SENSOR_MAX_HANDLE_PLUS_ONE    (ID_SENSOR_MAX_HANDLE + 1)
-
-#if (ID_SENSOR_MAX_HANDLE_PLUS_ONE != SENSOR_TYPE_MAX_NUM)
-#error ID_SENSOR_MAX_HANDLE not match with SENSOR_TYPE_MAX_NUM
-#endif
-
-#define MAX_SENSOR_DATA_UPDATE_ONCE (20)
-
-/*----------------------------------------------------------------------------*/
-#define HWM_INPUTDEV_NAME "hwmdata"
-#define HWM_SENSOR_DEV_NAME "hwmsensor"
-#define HWM_SENSOR_DEV "/dev/hwmsensor"
-#define C_MAX_HWMSEN_EVENT_NUM 4
-/*----------------------------------------------------------------------------*/
-#define ACC_PL_DEV_NAME "m_acc_pl"
-#define ACC_INPUTDEV_NAME "m_acc_input"
-#define ACC_MISC_DEV_NAME "m_acc_misc"
-#define MAG_PL_DEV_NAME "m_mag_pl"
-#define MAG_INPUTDEV_NAME "m_mag_input"
-#define MAG_MISC_DEV_NAME "m_mag_misc"
-#define UNCALI_MAG_PL_DEV_NAME "m_uncali_mag_pl"
-#define UNCALI_MAG_INPUTDEV_NAME "m_uncali_mag_input"
-#define UNCALI_MAG_MISC_DEV_NAME "m_uncali_mag_misc"
-#define UNCALI_GYRO_PL_DEV_NAME "m_uncali_gyro_pl"
-#define UNCALI_GYRO_INPUTDEV_NAME "m_uncali_gyro_input"
-#define UNCALI_GYRO_MISC_DEV_NAME "m_uncali_gyro_misc"
-#define GYRO_PL_DEV_NAME "m_gyro_pl"
-#define GYRO_INPUTDEV_NAME "m_gyro_input"
-#define GYRO_MISC_DEV_NAME "m_gyro_misc"
-#define ALSPS_PL_DEV_NAME "m_alsps_pl"
-#define ALSPS_INPUTDEV_NAME "m_alsps_input"
-#define ALS_MISC_DEV_NAME "m_als_misc"
-#define PS_MISC_DEV_NAME "m_ps_misc"
-#define BARO_PL_DEV_NAME "m_baro_pl"
-#define BARO_INPUTDEV_NAME "m_baro_input"
-#define BARO_MISC_DEV_NAME "m_baro_misc"
-#define HMDY_PL_DEV_NAME "m_hmdy_pl"
-#define HMDY_INPUTDEV_NAME "m_hmdy_input"
-#define HMDY_MISC_DEV_NAME "m_hmdy_misc"
-
-#define STEP_C_PL_DEV_NAME "m_step_c_pl"
-#define STEP_C_INPUTDEV_NAME "m_step_c_input"
-#define STEP_C_MISC_DEV_NAME "m_step_c_misc"
-
-#define INPK_PL_DEV_NAME "m_inpk_pl"
-#define INPK_INPUTDEV_NAME "m_inpk_input"
-#define INPK_MISC_DEV_NAME "m_inpk_misc"
-
-#define SHK_PL_DEV_NAME "m_shk_pl"
-#define SHK_INPUTDEV_NAME "m_shk_input"
-#define SHK_MISC_DEV_NAME "m_shk_misc"
-
-#define FDN_PL_DEV_NAME "m_fdn_pl"
-#define FDN_INPUTDEV_NAME "m_fdn_input"
-#define FDN_MISC_DEV_NAME "m_fdn_misc"
-
-#define PKUP_PL_DEV_NAME "m_pkup_pl"
-#define PKUP_INPUTDEV_NAME "m_pkup_input"
-#define PKUP_MISC_DEV_NAME "m_pkup_misc"
-
-#define ACT_PL_DEV_NAME "m_act_pl"
-#define ACT_INPUTDEV_NAME "m_act_input"
-#define ACT_MISC_DEV_NAME "m_act_misc"
-
-#define PDR_PL_DEV_NAME "m_pdr_pl"
-#define PDR_INPUTDEV_NAME "m_pdr_input"
-#define PDR_MISC_DEV_NAME "m_pdr_misc"
-
-#define HRM_PL_DEV_NAME "m_hrm_pl"
-#define HRM_INPUTDEV_NAME "m_hrm_input"
-#define HRM_MISC_DEV_NAME "m_hrm_misc"
-
-#define TILT_PL_DEV_NAME "m_tilt_pl"
-#define TILT_INPUTDEV_NAME "m_tilt_input"
-#define TILT_MISC_DEV_NAME "m_tilt_misc"
-
-#define WAG_PL_DEV_NAME "m_wag_pl"
-#define WAG_INPUTDEV_NAME "m_wag_input"
-#define WAG_MISC_DEV_NAME "m_wag_misc"
-
-#define GLG_PL_DEV_NAME "m_glg_pl"
-#define GLG_INPUTDEV_NAME "m_glg_input"
-#define GLG_MISC_DEV_NAME "m_glg_misc"
-
-#define ANSWERCALL_PL_DEV_NAME "m_ancall_pl"
-#define ANSWERCALL_INPUTDEV_NAME "m_ancall_input"
-#define ANSWERCALL_MISC_DEV_NAME "m_ancall_misc"
-
-#define TEMP_PL_DEV_NAME "m_temp_pl"
-#define TEMP_INPUTDEV_NAME "m_temp_input"
-#define TEMP_MISC_DEV_NAME "m_temp_misc"
-
-#define BATCH_PL_DEV_NAME "m_batch_pl"
-#define BATCH_INPUTDEV_NAME "m_batch_input"
-#define BATCH_MISC_DEV_NAME "m_batch_misc"
-
-#define BTS_PL_DEV_NAME "m_bts_pl"
-#define BTS_INPUTDEV_NAME "m_bts_input"
-#define BTS_MISC_DEV_NAME "m_bts_misc"
-
-#define GRV_PL_DEV_NAME "m_grv_pl"
-#define GRV_INPUTDEV_NAME "m_grv_input"
-#define GRV_MISC_DEV_NAME "m_grv_misc"
-
-#define GMRV_PL_DEV_NAME "m_gmrv_pl"
-#define GMRV_INPUTDEV_NAME "m_gmrv_input"
-#define GMRV_MISC_DEV_NAME "m_gmrv_misc"
-
-#define GRAV_PL_DEV_NAME "m_grav_pl"
-#define GRAV_INPUTDEV_NAME "m_grav_input"
-#define GRAV_MISC_DEV_NAME "m_grav_misc"
-
-#define LA_PL_DEV_NAME "m_la_pl"
-#define LA_INPUTDEV_NAME "m_la_input"
-#define LA_MISC_DEV_NAME "m_la_misc"
-
-#define RV_PL_DEV_NAME "m_rv_pl"
-#define RV_INPUTDEV_NAME "m_rv_input"
-#define RV_MISC_DEV_NAME "m_rv_misc"
-
-#define FUSION_PL_DEV_NAME "m_fusion_pl"
-#define FUSION_INPUTDEV_NAME "m_fusion_input"
-#define FUSION_MISC_DEV_NAME "m_fusion_misc"
-
-#define FREEFALL_PL_DEV_NAME "m_frfl_pl"
-#define FREEFALL_INPUTDEV_NAME "m_frfl_input"
-#define FREEFALL_MISC_DEV_NAME "m_frfl_misc"
-
-#define PEDO_PL_DEV_NAME "m_pedo_pl"
-#define PEDO_INPUTDEV_NAME "m_pedo_input"
-#define PEDO_MISC_DEV_NAME "m_pedo_misc"
-
-#define SITU_PL_DEV_NAME "m_situ_pl"
-#define SITU_INPUTDEV_NAME "m_situ_input"
-#define SITU_MISC_DEV_NAME "m_situ_misc"
-
-#define BIO_MISC_DEV_NAME "m_bio_misc"
-
-#define EVENT_TYPE_SENSOR 0x01
-#define EVENT_TYPE_SENSOR_EXT 0x02
-#define EVENT_SENSOR_ACCELERATION SENSOR_ACCELEROMETER
-#define EVENT_SENSOR_MAGNETIC SENSOR_MAGNETIC
-#define EVENT_SENSOR_ORIENTATION SENSOR_ORIENTATION
-#define EVENT_SENSOR_GYROSCOPE SENSOR_GYROSCOPE
-#define EVENT_SENSOR_LIGHT SENSOR_LIGHT
-#define EVENT_SENSOR_PRESSURE SENSOR_PRESSURE
-#define EVENT_SENSOR_TEMPERATURE SENSOR_TEMPRERATURE
-#define EVENT_SENSOR_PROXIMITY SENSOR_PROXIMITY
-#define EVENT_SENSOR_GRAVITY SENSOR_PRESSURE
-#define EVENT_SENSOR_LINEAR_ACCELERATION SENSOR_TEMPRERATURE
-#define EVENT_SENSOR_ROTATION_VECTOR SENSOR_PROXIMITY
-#define EVENT_TYPE_INPK_VALUE 0x1
-#define EVENT_TYPE_STATIONARY_VALUE 0x2
-
-enum { HWM_MODE_DISABLE = 0,
-	HWM_MODE_ENABLE = 1,
-};
-
-struct hwm_sensor_data {
-	/* sensor identifier */
-	int sensor;
-	/* sensor values */
-	union {
-		int values[6];
-		uint8_t probability[12];
-	};
-	/* sensor values divide */
-	uint32_t value_divide;
-	/* sensor accuracy */
-	int8_t status;
-	/* whether updata? */
-	int update;
-	/* time is in nanosecond */
-	int64_t time;
-
-	uint32_t reserved;
-};
-
-#ifdef CONFIG_COMPAT
-struct compat_hwm_sensor_data {
-	/* sensor identifier */
-	compat_int_t sensor;
-	/* sensor values */
-	union {
-		compat_int_t values[6];
-		uint8_t probability[12];
-	};
-	/* sensor values divide */
-	compat_uint_t value_divide;
-	/* sensor accuracy */
-	char status;
-	/* whether updata? */
-	compat_int_t update;
-	/* time is in nanosecond */
-	compat_s64 time;
-
-	compat_uint_t reserved;
-};
-#endif
-
-struct hwm_trans_data {
-	struct hwm_sensor_data data[MAX_SENSOR_DATA_UPDATE_ONCE];
-	uint64_t data_type;
-};
-
-#ifdef CONFIG_COMPAT
-struct compat_hwm_trans_data {
-	struct compat_hwm_sensor_data data[MAX_SENSOR_DATA_UPDATE_ONCE];
-	compat_u64 data_type;
-};
-#endif
-
-#define MAX_BATCH_DATA_PER_QUREY 18
-struct batch_trans_data {
-	int numOfDataReturn;
-	int numOfDataLeft;
-	struct hwm_sensor_data data[MAX_BATCH_DATA_PER_QUREY];
-};
-
-#ifdef CONFIG_COMPAT
-struct compat_batch_trans_data {
-	compat_int_t numOfDataReturn;
-	compat_int_t numOfDataLeft;
-	struct compat_hwm_sensor_data data[MAX_BATCH_DATA_PER_QUREY];
-};
-#endif
-
-/*----------------------------------------------------------------------------*/
-#define HWM_IOC_MAGIC 0x91
-
-/* set delay */
-#define HWM_IO_SET_DELAY _IOW(HWM_IOC_MAGIC, 0x01, uint32_t)
-
-/* wake up */
-#define HWM_IO_SET_WAKE _IO(HWM_IOC_MAGIC, 0x02)
-
-/* Enable/Disable  sensor */
-#define HWM_IO_ENABLE_SENSOR _IOW(HWM_IOC_MAGIC, 0x03, uint32_t)
-#define HWM_IO_DISABLE_SENSOR _IOW(HWM_IOC_MAGIC, 0x04, uint32_t)
-
-/* Enable/Disable sensor */
-#define HWM_IO_ENABLE_SENSOR_NODATA _IOW(HWM_IOC_MAGIC, 0x05, uint32_t)
-#define HWM_IO_DISABLE_SENSOR_NODATA _IOW(HWM_IOC_MAGIC, 0x06, uint32_t)
-/* Get sensors data */
-#define HWM_IO_GET_SENSORS_DATA                                                \
-	_IOWR(HWM_IOC_MAGIC, 0x07, struct hwm_trans_data)
-#ifdef CONFIG_COMPAT
-/* set delay */
-#define COMPAT_HWM_IO_SET_DELAY _IOW(HWM_IOC_MAGIC, 0x01, compat_uint_t)
-
-/* wake up */
-#define COMPAT_HWM_IO_SET_WAKE _IO(HWM_IOC_MAGIC, 0x02)
-
-/* Enable/Disable  sensor */
-#define COMPAT_HWM_IO_ENABLE_SENSOR _IOW(HWM_IOC_MAGIC, 0x03, compat_uint_t)
-#define COMPAT_HWM_IO_DISABLE_SENSOR _IOW(HWM_IOC_MAGIC, 0x04, compat_uint_t)
-
-/* Enable/Disable sensor */
-#define COMPAT_HWM_IO_ENABLE_SENSOR_NODATA                                     \
-	_IOW(HWM_IOC_MAGIC, 0x05, compat_uint_t)
-#define COMPAT_HWM_IO_DISABLE_SENSOR_NODATA                                    \
-	_IOW(HWM_IOC_MAGIC, 0x06, compat_uint_t)
-/* Get sensors data */
-#define COMPAT_HWM_IO_GET_SENSORS_DATA                                         \
-	_IOWR(HWM_IOC_MAGIC, 0x07, struct compat_hwm_trans_data)
-#endif
-/*----------------------------------------------------------------------------*/
-#define BATCH_IOC_MAGIC 0x92
-
-/* Get sensor data */
-#define BATCH_IO_GET_SENSORS_DATA                                              \
-	_IOWR(BATCH_IOC_MAGIC, 0x01, struct batch_trans_data)
-#ifdef CONFIG_COMPAT
-#define COMPAT_BATCH_IO_GET_SENSORS_DATA                                       \
-	_IOWR(BATCH_IOC_MAGIC, 0x01, struct compat_batch_trans_data)
-#endif
-
-#define SENSOR_DELAY 0X01
-#define SENSOR_ENABLE 0X02
-#define SENSOR_GET_DATA 0X04
-
-/**
- * status of each sensor
- */
-
-#define SENSOR_STATUS_UNRELIABLE 0
-#define SENSOR_STATUS_ACCURACY_LOW 1
-#define SENSOR_STATUS_ACCURACY_MEDIUM 2
-#define SENSOR_STATUS_ACCURACY_HIGH 3
-
-#define GRAVITY_EARTH_1000 9807	/* about (9.80665f)*1000 */
-
-#endif				/* __HWMSENSOR_H__ */
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_attr.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_attr.h
deleted file mode 100644
index 7710ce1..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_attr.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef _SENSOR_ATTR_H
-#define _SENSOR_ATTR_H
-#include <linux/major.h>
-#include <linux/types.h>
-#include <linux/module.h>
-
-struct sensor_attr_t  {
-	unsigned char minor;
-	const char *name;
-	const struct file_operations *fops;
-	struct list_head list;
-	struct device *parent;
-	struct device *this_device;
-};
-struct sensor_attr_dev {
-	struct device *dev;
-};
-extern int sensor_attr_register(struct sensor_attr_t *misc);
-extern int sensor_attr_deregister(struct sensor_attr_t *misc);
-extern int __init sensor_attr_init(void);
-extern void __exit sensor_attr_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_event.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_event.h
deleted file mode 100644
index 5999133..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_event.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef _SENSOR_EVENT_H
-#define _SENSOR_EVENT_H
-#include <linux/poll.h>
-#include <linux/ratelimit.h>
-
-#define CONTINUE_SENSOR_BUF_SIZE	2048
-#define BIO_SENSOR_BUF_SIZE	0x20000 /* ((512 + 1024 + 1024) * 60) */
-#define OTHER_SENSOR_BUF_SIZE	16
-enum flushAction {
-	DATA_ACTION,
-	FLUSH_ACTION,
-	BIAS_ACTION,
-	CALI_ACTION,
-	TEMP_ACTION,
-	TEST_ACTION,
-};
-struct sensor_event {
-	int64_t time_stamp;
-	int8_t handle;
-	int8_t flush_action;
-	int8_t status;
-	int8_t reserved;
-	union {
-		int32_t word[6];
-		int8_t byte[0];
-	};
-} __packed;
-ssize_t sensor_event_read(unsigned char handle, struct file *file,
-	char __user *buffer,
-			  size_t count, loff_t *ppos);
-unsigned int sensor_event_poll(unsigned char handle, struct file *file,
-	poll_table *wait);
-int sensor_input_event(unsigned char handle,
-			 const struct sensor_event *event);
-unsigned int sensor_event_register(unsigned char handle);
-unsigned int sensor_event_deregister(unsigned char handle);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_list.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_list.h
deleted file mode 100644
index 16e2d69..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_list.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef _SENSOR_LIST_H
-#define _SENSOR_LIST_H
-
-#ifndef CONFIG_CUSTOM_KERNEL_SENSORHUB
-struct sensorInfo_NonHub_t {
-	char name[16];
-};
-int sensorlist_register_deviceinfo(int sensor,
-		struct sensorInfo_NonHub_t *devinfo);
-#endif
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_performance.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_performance.h
deleted file mode 100644
index 3193a79..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensor_performance.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __SENSOR_PERFORMANCE_H__
-#define __SENSOR_PERFORMANCE_H__
-
-#include "hwmsensor.h"
-#include <linux/types.h>
-
-enum SENSOR_STATUS {
-	GOT_IPI,
-	WORK_START,
-	DATA_REPORT,
-	STATUS_MAX,
-};
-
-struct time_records {
-	u64 check_time;
-	u64 sum_kernel_time;
-	u16 count;
-};
-
-#define LIMIT 1000
-
-/* #define DEBUG_PERFORMANCE */
-
-#ifdef DEBUG_PERFORMANCE
-extern void mark_timestamp(u8 sensor_type, enum SENSOR_STATUS status,
-	u64 current_time,
-				  u64 event_time);
-extern void mark_ipi_timestamp(uint64_t cyc);
-#else
-#define mark_timestamp(A, B, C, D)
-#define mark_ipi_timestamp(A)
-#endif
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensors_io.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensors_io.h
deleted file mode 100644
index 5e8d291..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/include/sensors_io.h
+++ /dev/null
@@ -1,225 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef SENSORS_IO_H
-#define SENSORS_IO_H
-
-#include <linux/ioctl.h>
-
-#ifdef CONFIG_COMPAT
-#include <linux/compat.h>
-#endif
-
-struct GSENSOR_VECTOR3D {
-	unsigned short x; /**< X axis */
-	unsigned short y; /**< Y axis */
-	unsigned short z; /**< Z axis */
-};
-
-struct SENSOR_DATA {
-	int x;
-	int y;
-	int z;
-};
-
-struct biometric_cali {
-	unsigned int pga6;
-	unsigned int ambdac5_5;
-};
-
-struct biometric_test_data {
-	int ppg_ir;
-	int ppg_r;
-	int ekg;
-};
-
-struct biometric_threshold {
-	int ppg_ir_threshold;
-	int ppg_r_threshold;
-	int ekg_threshold;
-};
-
-#ifdef CONFIG_COMPAT
-
-struct compat_biometric_cali {
-	compat_uint_t pga6;
-	compat_uint_t ambdac5_5;
-};
-
-struct compat_biometric_test_data {
-	compat_int_t ppg_ir;
-	compat_int_t ppg_r;
-	compat_int_t ekg;
-};
-
-struct compat_biometric_threshold {
-	compat_int_t ppg_ir_threshold;
-	compat_int_t ppg_r__threshold;
-	compat_int_t ekg_threshold;
-};
-
-#endif
-
-#define GSENSOR 0x85
-#define GSENSOR_IOCTL_INIT _IO(GSENSOR, 0x01)
-#define GSENSOR_IOCTL_READ_CHIPINFO _IOR(GSENSOR, 0x02, int)
-#define GSENSOR_IOCTL_READ_SENSORDATA _IOR(GSENSOR, 0x03, int)
-#define GSENSOR_IOCTL_READ_RAW_DATA _IOR(GSENSOR, 0x06, int)
-#define GSENSOR_IOCTL_SET_CALI _IOW(GSENSOR, 0x06, struct SENSOR_DATA)
-#define GSENSOR_IOCTL_GET_CALI _IOW(GSENSOR, 0x07, struct SENSOR_DATA)
-#define GSENSOR_IOCTL_CLR_CALI _IO(GSENSOR, 0x08)
-#define GSENSOR_IOCTL_ENABLE_CALI _IO(GSENSOR, 0x09)
-#define GSENSOR_IOCTL_SELF_TEST _IO(GSENSOR, 0x0A)
-
-#ifdef CONFIG_COMPAT
-#define COMPAT_GSENSOR_IOCTL_INIT _IO(GSENSOR, 0x01)
-#define COMPAT_GSENSOR_IOCTL_READ_CHIPINFO _IOR(GSENSOR, 0x02, compat_int_t)
-#define COMPAT_GSENSOR_IOCTL_READ_SENSORDATA _IOR(GSENSOR, 0x03, compat_int_t)
-#define COMPAT_GSENSOR_IOCTL_READ_RAW_DATA _IOR(GSENSOR, 0x06, compat_int_t)
-#define COMPAT_GSENSOR_IOCTL_SET_CALI _IOW(GSENSOR, 0x06, struct SENSOR_DATA)
-#define COMPAT_GSENSOR_IOCTL_GET_CALI _IOW(GSENSOR, 0x07, struct SENSOR_DATA)
-#define COMPAT_GSENSOR_IOCTL_CLR_CALI _IO(GSENSOR, 0x08)
-#define COMPAT_GSENSOR_IOCTL_ENABLE_CALI _IO(GSENSOR, 0x09)
-#define COMPAT_GSENSOR_IOCTL_SELF_TEST _IO(GSENSOR, 0x0A)
-#endif
-
-/* IOCTLs for Msensor misc. device library */
-#define MSENSOR 0x83
-#define MSENSOR_IOCTL_READ_SENSORDATA _IOR(MSENSOR, 0x03, int)
-#define MSENSOR_IOCTL_SELF_TEST _IOW(MSENSOR, 0x0B, int)
-#define MSENSOR_IOCTL_SENSOR_ENABLE _IOW(MSENSOR, 0x51, int)
-
-#ifdef CONFIG_COMPAT
-/*COMPACT IOCTL for 64bit kernel running 32bit daemon*/
-#define COMPAT_MSENSOR_IOCTL_READ_SENSORDATA _IOR(MSENSOR, 0x03, compat_int_t)
-#define COMPAT_MSENSOR_IOCTL_SELF_TEST _IOW(MSENSOR, 0x0B, compat_int_t)
-#define COMPAT_MSENSOR_IOCTL_SENSOR_ENABLE _IOW(MSENSOR, 0x51, compat_int_t)
-#endif
-
-#define ALSPS 0x84
-#define ALSPS_SET_PS_MODE _IOW(ALSPS, 0x01, int)
-#define ALSPS_GET_PS_RAW_DATA _IOR(ALSPS, 0x04, int)
-#define ALSPS_SET_ALS_MODE _IOW(ALSPS, 0x05, int)
-#define ALSPS_GET_ALS_RAW_DATA _IOR(ALSPS, 0x08, int)
-
-/*-------------------MTK add-------------------------------------------*/
-#define ALSPS_GET_PS_TEST_RESULT _IOR(ALSPS, 0x09, int)
-#define ALSPS_GET_PS_THRESHOLD_HIGH _IOR(ALSPS, 0x0B, int)
-#define ALSPS_GET_PS_THRESHOLD_LOW _IOR(ALSPS, 0x0C, int)
-#define ALSPS_IOCTL_CLR_CALI _IOW(ALSPS, 0x0F, int)
-#define ALSPS_IOCTL_GET_CALI _IOR(ALSPS, 0x10, int)
-#define ALSPS_IOCTL_SET_CALI _IOW(ALSPS, 0x11, int)
-#define ALSPS_SET_PS_THRESHOLD _IOW(ALSPS, 0x12, int)
-#define AAL_SET_ALS_MODE _IOW(ALSPS, 0x14, int)
-#define AAL_GET_ALS_MODE _IOR(ALSPS, 0x15, int)
-#define AAL_GET_ALS_DATA _IOR(ALSPS, 0x16, int)
-#define ALSPS_ALS_ENABLE_CALI _IO(ALSPS, 0x17)
-#define ALSPS_PS_ENABLE_CALI _IO(ALSPS, 0x18)
-#define ALSPS_IOCTL_ALS_GET_CALI _IOW(ALSPS, 0x19, int)
-#define ALSPS_ALS_SET_CALI _IOW(ALSPS, 0x20, int)
-
-#ifdef CONFIG_COMPAT
-#define COMPAT_ALSPS_SET_PS_MODE _IOW(ALSPS, 0x01, compat_int_t)
-#define COMPAT_ALSPS_GET_PS_RAW_DATA _IOR(ALSPS, 0x04, compat_int_t)
-#define COMPAT_ALSPS_SET_ALS_MODE _IOW(ALSPS, 0x05, compat_int_t)
-#define COMPAT_ALSPS_GET_ALS_RAW_DATA _IOR(ALSPS, 0x08, compat_int_t)
-
-/*-------------------MTK add-------------------------------------------*/
-#define COMPAT_ALSPS_GET_PS_TEST_RESULT _IOR(ALSPS, 0x09, compat_int_t)
-#define COMPAT_ALSPS_GET_PS_THRESHOLD_HIGH _IOR(ALSPS, 0x0B, compat_int_t)
-#define COMPAT_ALSPS_GET_PS_THRESHOLD_LOW _IOR(ALSPS, 0x0C, compat_int_t)
-#define COMPAT_ALSPS_IOCTL_CLR_CALI _IOW(ALSPS, 0x0F, compat_int_t)
-#define COMPAT_ALSPS_IOCTL_GET_CALI _IOR(ALSPS, 0x10, compat_int_t)
-#define COMPAT_ALSPS_IOCTL_SET_CALI _IOW(ALSPS, 0x11, compat_int_t)
-#define COMPAT_ALSPS_SET_PS_THRESHOLD _IOW(ALSPS, 0x12, compat_int_t)
-#define COMPAT_AAL_SET_ALS_MODE _IOW(ALSPS, 0x14, compat_int_t)
-#define COMPAT_AAL_GET_ALS_MODE _IOR(ALSPS, 0x15, compat_int_t)
-#define COMPAT_AAL_GET_ALS_DATA _IOR(ALSPS, 0x16, compat_int_t)
-#define COMPAT_ALSPS_ALS_ENABLE_CALI _IO(ALSPS, 0x17)
-#define COMPAT_ALSPS_PS_ENABLE_CALI _IO(ALSPS, 0x18)
-#define COMPAT_ALSPS_IOCTL_ALS_GET_CALI _IOR(ALSPS, 0x19, compat_int_t)
-#define COMPAT_ALSPS_IOCTL_ALS_SET_CALI _IOR(ALSPS, 0x20, compat_int_t)
-
-#endif
-
-#define GYROSCOPE 0x86
-#define GYROSCOPE_IOCTL_INIT _IO(GYROSCOPE, 0x01)
-#define GYROSCOPE_IOCTL_SMT_DATA _IOR(GYROSCOPE, 0x02, int)
-#define GYROSCOPE_IOCTL_READ_SENSORDATA _IOR(GYROSCOPE, 0x03, int)
-#define GYROSCOPE_IOCTL_SET_CALI _IOW(GYROSCOPE, 0x04, struct SENSOR_DATA)
-#define GYROSCOPE_IOCTL_GET_CALI _IOW(GYROSCOPE, 0x05, struct SENSOR_DATA)
-#define GYROSCOPE_IOCTL_CLR_CALI _IO(GYROSCOPE, 0x06)
-#define GYROSCOPE_IOCTL_READ_SENSORDATA_RAW _IOR(GYROSCOPE, 0x07, int)
-#define GYROSCOPE_IOCTL_ENABLE_CALI _IO(GYROSCOPE, 0x0A)
-#define GYROSCOPE_IOCTL_SELF_TEST _IO(GYROSCOPE, 0x0B)
-#ifdef CONFIG_COMPAT
-#define COMPAT_GYROSCOPE_IOCTL_INIT _IO(GYROSCOPE, 0x01)
-#define COMPAT_GYROSCOPE_IOCTL_SMT_DATA _IOR(GYROSCOPE, 0x02, compat_int_t)
-#define COMPAT_GYROSCOPE_IOCTL_READ_SENSORDATA                                 \
-	_IOR(GYROSCOPE, 0x03, compat_int_t)
-#define COMPAT_GYROSCOPE_IOCTL_SET_CALI                                        \
-	_IOW(GYROSCOPE, 0x04, struct SENSOR_DATA)
-#define COMPAT_GYROSCOPE_IOCTL_GET_CALI                                        \
-	_IOW(GYROSCOPE, 0x05, struct SENSOR_DATA)
-#define COMPAT_GYROSCOPE_IOCTL_CLR_CALI _IO(GYROSCOPE, 0x06)
-#define COMPAT_GYROSCOPE_IOCTL_READ_SENSORDATA_RAW                             \
-	_IOR(GYROSCOPE, 0x07, compat_int_t)
-#define COMPAT_GYROSCOPE_IOCTL_ENABLE_CALI _IO(GYROSCOPE, 0x0A)
-#define COMPAT_GYROSCOPE_IOCTL_SELF_TEST _IO(GYROSCOPE, 0x0B)
-#endif
-#define BROMETER 0x87
-#define BAROMETER_IOCTL_INIT _IO(BROMETER, 0x01)
-#define BAROMETER_GET_PRESS_DATA _IOR(BROMETER, 0x02, int)
-#define BAROMETER_GET_TEMP_DATA _IOR(BROMETER, 0x03, int)
-#define BAROMETER_IOCTL_ENABLE_CALI _IO(BROMETER, 0x05)
-#ifdef CONFIG_COMPAT
-#define COMPAT_BAROMETER_IOCTL_INIT _IO(BROMETER, 0x01)
-#define COMPAT_BAROMETER_GET_PRESS_DATA _IOR(BROMETER, 0x02, compat_int_t)
-#define COMPAT_BAROMETER_GET_TEMP_DATA _IOR(BROMETER, 0x03, compat_int_t)
-#define COMPAT_BAROMETER_IOCTL_ENABLE_CALI _IO(BROMETER, 0x05)
-#endif
-
-#define BIOMETRIC 0x90
-#define BIOMETRIC_IOCTL_INIT _IO(BIOMETRIC, 0x01)
-#define BIOMETRIC_IOCTL_DO_CALI _IOW(BIOMETRIC, 0x02, struct biometric_cali)
-#define BIOMETRIC_IOCTL_SET_CALI _IOW(BIOMETRIC, 0x03, struct biometric_cali)
-#define BIOMETRIC_IOCTL_GET_CALI _IOW(BIOMETRIC, 0x04, struct biometric_cali)
-#define BIOMETRIC_IOCTL_CLR_CALI _IO(BIOMETRIC, 0x05)
-#define BIOMETRIC_IOCTL_FTM_START _IO(BIOMETRIC, 0x06)
-#define BIOMETRIC_IOCTL_FTM_END _IO(BIOMETRIC, 0x07)
-#define BIOMETRIC_IOCTL_FTM_GET_DATA                                           \
-	_IOW(BIOMETRIC, 0x08, struct biometric_test_data)
-#define BIOMETRIC_IOCTL_FTM_GET_THRESHOLD                                      \
-	_IOW(BIOMETRIC, 0x09, struct biometric_threshold)
-#ifdef CONFIG_COMPAT
-#define COMPAT_BIOMETRIC_IOCTL_INIT _IO(BIOMETRIC, 0x01)
-#define COMPAT_BIOMETRIC_IOCTL_DO_CALI                                         \
-	_IOW(BIOMETRIC, 0x02, struct compat_biometric_cali)
-#define COMPAT_BIOMETRIC_IOCTL_SET_CALI                                        \
-	_IOW(BIOMETRIC, 0x03, struct compat_biometric_cali)
-#define COMPAT_BIOMETRIC_IOCTL_GET_CALI                                        \
-	_IOW(BIOMETRIC, 0x04, struct compat_biometric_cali)
-#define COMPAT_BIOMETRIC_IOCTL_CLR_CALI _IO(BIOMETRIC, 0x05)
-#define COMPAT_BIOMETRIC_IOCTL_FTM_START _IO(BIOMETRIC, 0x06)
-#define COMPAT_BIOMETRIC_IOCTL_FTM_END _IO(BIOMETRIC, 0x07)
-#define COMPAT_BIOMETRIC_IOCTL_FTM_GET_DATA                                    \
-	_IOW(BIOMETRIC, 0x08, struct compat_biometric_test_data)
-#define COMPAT_BIOMETRIC_IOCTL_FTM_GET_THRESHOLD                               \
-	_IOW(BIOMETRIC, 0x09, struct compat_biometric_threshold)
-#endif
-
-#define SAR 0x91
-#define SAR_IOCTL_INIT _IOW(SAR, 0x01, int)
-#define SAR_IOCTL_READ_SENSORDATA _IOR(SAR, 0x02, struct SENSOR_DATA)
-#define SAR_IOCTL_GET_CALI  _IOR(SAR, 0x03, struct SENSOR_DATA)
-#define SAR_IOCTL_ENABLE_CALI _IO(SAR, 0x04)
-#ifdef CONFIG_COMPAT
-#define COMPAT_SAR_IOCTL_INIT _IOW(SAR, 0x01, compat_int_t)
-#define COMPAT_SAR_IOCTL_READ_SENSORDATA _IOR(SAR, 0x02, struct SENSOR_DATA)
-#define COMPAT_SAR_IOCTL_GET_CALI _IOR(SAR, 0x03, struct SENSOR_DATA)
-#define COMPAT_SAR_IOCTL_ENABLE_CALI _IO(SAR, 0x04)
-#endif
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_attributes/sensor_attr.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_attributes/sensor_attr.c
deleted file mode 100644
index 3ea7520..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_attributes/sensor_attr.c
+++ /dev/null
@@ -1,148 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2016 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<HWMSEN> " fmt
-
-#include "sensor_attr.h"
-#include "sensor_event.h"
-#include <linux/device.h>
-#include <linux/fs.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/major.h>
-#include <linux/module.h>
-
-static int sensor_attr_major = -1;
-static struct class *sensor_attr_class;
-
-static LIST_HEAD(sensor_attr_list);
-static DEFINE_MUTEX(sensor_attr_mtx);
-
-static int sensor_attr_open(struct inode *inode, struct file *file)
-{
-	int minor = iminor(inode);
-	struct sensor_attr_t *c;
-	int err = -ENODEV;
-	const struct file_operations *new_fops = NULL;
-
-	mutex_lock(&sensor_attr_mtx);
-
-	list_for_each_entry(c, &sensor_attr_list, list) {
-		if (c->minor == minor) {
-			new_fops = fops_get(c->fops);
-			break;
-		}
-	}
-
-	if (!new_fops) {
-		mutex_unlock(&sensor_attr_mtx);
-		request_module("char-major-%d-%d", sensor_attr_major, minor);
-		mutex_lock(&sensor_attr_mtx);
-
-		list_for_each_entry(c, &sensor_attr_list, list) {
-			if (c->minor == minor) {
-				new_fops = fops_get(c->fops);
-				break;
-			}
-		}
-		if (!new_fops)
-			goto fail;
-	}
-
-	err = 0;
-	replace_fops(file, new_fops);
-	if (file->f_op->open) {
-		file->private_data = c;
-		err = file->f_op->open(inode, file);
-	}
-fail:
-	mutex_unlock(&sensor_attr_mtx);
-	return err;
-}
-
-static const struct file_operations sensor_attr_fops = {
-	.owner = THIS_MODULE,
-	.open = sensor_attr_open,
-};
-
-int sensor_attr_register(struct sensor_attr_t *misc)
-{
-	dev_t dev;
-	int err = 0;
-	struct sensor_attr_t *c;
-
-	mutex_lock(&sensor_attr_mtx);
-	list_for_each_entry(c, &sensor_attr_list, list) {
-		if (c->minor == misc->minor) {
-			err = -EBUSY;
-			goto out;
-		}
-	}
-	dev = MKDEV(sensor_attr_major, misc->minor);
-	misc->this_device = device_create(sensor_attr_class, misc->parent, dev,
-					  misc, "%s", misc->name);
-	if (IS_ERR(misc->this_device))
-		goto out;
-	list_add(&misc->list, &sensor_attr_list);
-	mutex_unlock(&sensor_attr_mtx);
-	err = sensor_event_register(misc->minor);
-	return err;
-out:
-	mutex_unlock(&sensor_attr_mtx);
-	return err;
-}
-EXPORT_SYMBOL_GPL(sensor_attr_register);
-
-int sensor_attr_deregister(struct sensor_attr_t *misc)
-{
-	if (WARN_ON(list_empty(&misc->list)))
-		return -EINVAL;
-
-	mutex_lock(&sensor_attr_mtx);
-	list_del(&misc->list);
-	device_destroy(sensor_attr_class,
-		       MKDEV(sensor_attr_major, misc->minor));
-	mutex_unlock(&sensor_attr_mtx);
-	sensor_event_deregister(misc->minor);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(sensor_attr_deregister);
-
-/*
- *static char *sensor_attr_devnode(struct device *dev, umode_t *mode)
- *{
- *	pr_debug("sensor_attr: name :%s\n", dev_name(dev));
- *	return kasprintf(GFP_KERNEL, "sensor/%s", dev_name(dev));
- *}
- */
-
-int __init sensor_attr_init(void)
-{
-	int err;
-
-	sensor_attr_class = class_create(THIS_MODULE, "sensor");
-	err = PTR_ERR(sensor_attr_class);
-	if (IS_ERR(sensor_attr_class)) {
-		err = -EIO;
-		return err;
-	}
-	sensor_attr_major = register_chrdev(0, "sensor", &sensor_attr_fops);
-	if (sensor_attr_major < 0)
-		goto fail_printk;
-	/* sensor_attr_class->devnode = sensor_attr_devnode; */
-	return 0;
-
-fail_printk:
-	pr_err("unable to get major %d for misc devices\n", sensor_attr_major);
-	class_destroy(sensor_attr_class);
-	return err;
-}
-
-void __exit sensor_attr_exit(void)
-{
-	unregister_chrdev(sensor_attr_major, "sensor");
-	class_destroy(sensor_attr_class);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_dts/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_dts/Makefile
deleted file mode 100644
index 2adb891..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_dts/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/accelerometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/alsps/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/gyroscope/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/accelgyro/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/magnetometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/barometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/humidity/inc
-obj-y := sensor_dts.o
\ No newline at end of file
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_dts/sensor_dts.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_dts/sensor_dts.c
deleted file mode 100644
index bd6d04d..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_dts/sensor_dts.c
+++ /dev/null
@@ -1,414 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[Sensor dts] " fmt
-
-#include <cust_acc.h>
-#include <cust_accelgyro.h>
-#include <cust_alsps.h>
-#include <cust_baro.h>
-#include <cust_gyro.h>
-//#include <cust_hmdy.h>
-#include <cust_mag.h>
-#include <linux/of.h>
-#include <linux/of_irq.h>
-
-int get_accel_dts_func(struct device_node *node, struct acc_hw *hw)
-{
-	int i, ret;
-	u32 i2c_num[] = {0};
-	u32 i2c_addr[G_CUST_I2C_ADDR_NUM] = {0};
-	u32 direction[] = {0};
-	u32 power_id[] = {0};
-	u32 power_vol[] = {0};
-	u32 firlen[] = {0};
-	u32 is_batch_supported[] = {0};
-
-	pr_debug("Device Tree get accel info!\n");
-	if (node) {
-		ret = of_property_read_u32_array(node, "i2c_num", i2c_num,
-						 ARRAY_SIZE(i2c_num));
-		if (ret == 0)
-			hw->i2c_num = i2c_num[0];
-
-		ret = of_property_read_u32_array(node, "i2c_addr", i2c_addr,
-						 ARRAY_SIZE(i2c_addr));
-		if (ret == 0) {
-			for (i = 0; i < G_CUST_I2C_ADDR_NUM; i++)
-				hw->i2c_addr[i] = i2c_addr[i];
-		}
-
-		ret = of_property_read_u32_array(node, "direction", direction,
-						 ARRAY_SIZE(direction));
-		if (ret == 0)
-			hw->direction = direction[0];
-
-		ret = of_property_read_u32_array(node, "power_id", power_id,
-						 ARRAY_SIZE(power_id));
-		if (ret == 0) {
-			if (power_id[0] == 0xffff)
-				hw->power_id = -1;
-			else
-				hw->power_id = power_id[0];
-		}
-
-		ret = of_property_read_u32_array(node, "power_vol", power_vol,
-						 ARRAY_SIZE(power_vol));
-		if (ret == 0)
-			hw->power_vol = power_vol[0];
-
-		ret = of_property_read_u32_array(node, "firlen", firlen,
-						 ARRAY_SIZE(firlen));
-		if (ret == 0)
-			hw->firlen = firlen[0];
-
-		ret = of_property_read_u32_array(
-			node, "is_batch_supported", is_batch_supported,
-			ARRAY_SIZE(is_batch_supported));
-		if (ret == 0)
-			hw->is_batch_supported = is_batch_supported[0];
-	} else {
-		pr_err(
-			"Device Tree: can not find accel node!. Go to use old cust info\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-int get_alsps_dts_func(struct device_node *node, struct alsps_hw *hw)
-{
-	int i, ret;
-	u32 i2c_num[] = {0};
-	u32 i2c_addr[C_CUST_I2C_ADDR_NUM] = {0};
-	u32 power_id[] = {0};
-	u32 power_vol[] = {0};
-	u32 polling_mode_ps[] = {0};
-	u32 polling_mode_als[] = {0};
-	u32 als_level[C_CUST_ALS_LEVEL - 1] = {0};
-	u32 als_value[C_CUST_ALS_LEVEL] = {0};
-	u32 ps_threshold_high[] = {0};
-	u32 ps_threshold_low[] = {0};
-	u32 is_batch_supported_ps[] = {0};
-	u32 is_batch_supported_als[] = {0};
-
-	pr_debug("Device Tree get alsps info!\n");
-	if (node) {
-		ret = of_property_read_u32_array(node, "i2c_num", i2c_num,
-						 ARRAY_SIZE(i2c_num));
-		if (ret == 0)
-			hw->i2c_num = i2c_num[0];
-
-		ret = of_property_read_u32_array(node, "i2c_addr", i2c_addr,
-						 ARRAY_SIZE(i2c_addr));
-		if (ret == 0) {
-			for (i = 0; i < C_CUST_I2C_ADDR_NUM; i++)
-				hw->i2c_addr[i] = i2c_addr[i];
-		}
-
-		ret = of_property_read_u32_array(node, "power_id", power_id,
-						 ARRAY_SIZE(power_id));
-		if (ret == 0) {
-			if (power_id[0] == 0xffff)
-				hw->power_id = -1;
-			else
-				hw->power_id = power_id[0];
-		}
-
-		ret = of_property_read_u32_array(node, "power_vol", power_vol,
-						 ARRAY_SIZE(power_vol));
-		if (ret == 0)
-			hw->power_vol = power_vol[0];
-
-		ret = of_property_read_u32_array(node, "als_level", als_level,
-						 ARRAY_SIZE(als_level));
-		if (ret == 0) {
-			for (i = 0; i < ARRAY_SIZE(als_level); i++)
-				hw->als_level[i] = als_level[i];
-		}
-
-		ret = of_property_read_u32_array(node, "als_value", als_value,
-						 ARRAY_SIZE(als_value));
-		if (ret == 0) {
-			for (i = 0; i < ARRAY_SIZE(als_value); i++)
-				hw->als_value[i] = als_value[i];
-		}
-
-		ret = of_property_read_u32_array(node, "polling_mode_ps",
-						 polling_mode_ps,
-						 ARRAY_SIZE(polling_mode_ps));
-		if (ret == 0)
-			hw->polling_mode_ps = polling_mode_ps[0];
-
-		ret = of_property_read_u32_array(node, "polling_mode_als",
-						 polling_mode_als,
-						 ARRAY_SIZE(polling_mode_als));
-		if (ret == 0)
-			hw->polling_mode_als = polling_mode_als[0];
-
-		ret = of_property_read_u32_array(node, "ps_threshold_high",
-						 ps_threshold_high,
-						 ARRAY_SIZE(ps_threshold_high));
-		if (ret == 0)
-			hw->ps_threshold_high = ps_threshold_high[0];
-
-		ret = of_property_read_u32_array(node, "ps_threshold_low",
-						 ps_threshold_low,
-						 ARRAY_SIZE(ps_threshold_low));
-		if (ret == 0)
-			hw->ps_threshold_low = ps_threshold_low[0];
-
-		ret = of_property_read_u32_array(
-			node, "is_batch_supported_ps", is_batch_supported_ps,
-			ARRAY_SIZE(is_batch_supported_ps));
-		if (ret == 0)
-			hw->is_batch_supported_ps = is_batch_supported_ps[0];
-
-		ret = of_property_read_u32_array(
-			node, "is_batch_supported_als", is_batch_supported_als,
-			ARRAY_SIZE(is_batch_supported_als));
-		if (ret == 0)
-			hw->is_batch_supported_als = is_batch_supported_als[0];
-	} else {
-		pr_err(
-			"Device Tree: can not find alsps node!. Go to use old cust info\n");
-		return -1;
-	}
-	return 0;
-}
-
-int get_mag_dts_func(struct device_node *node, struct mag_hw *hw)
-{
-	int i, ret;
-	u32 i2c_num[] = {0};
-	u32 i2c_addr[M_CUST_I2C_ADDR_NUM] = {0};
-	u32 direction[] = {0};
-	u32 power_id[] = {0};
-	u32 power_vol[] = {0};
-	u32 is_batch_supported[] = {0};
-
-	pr_debug("Device Tree get mag info!\n");
-	if (node) {
-		ret = of_property_read_u32_array(node, "i2c_num", i2c_num,
-						 ARRAY_SIZE(i2c_num));
-		if (ret == 0)
-			hw->i2c_num = i2c_num[0];
-
-		ret = of_property_read_u32_array(node, "i2c_addr", i2c_addr,
-						 ARRAY_SIZE(i2c_addr));
-		if (ret == 0) {
-			for (i = 0; i < M_CUST_I2C_ADDR_NUM; i++)
-				hw->i2c_addr[i] = i2c_addr[i];
-		}
-
-		ret = of_property_read_u32_array(node, "direction", direction,
-						 ARRAY_SIZE(direction));
-		if (ret == 0)
-			hw->direction = direction[0];
-
-		ret = of_property_read_u32_array(node, "power_id", power_id,
-						 ARRAY_SIZE(power_id));
-		if (ret == 0) {
-			if (power_id[0] == 0xffff)
-				hw->power_id = -1;
-			else
-				hw->power_id = power_id[0];
-		}
-
-		ret = of_property_read_u32_array(node, "power_vol", power_vol,
-						 ARRAY_SIZE(power_vol));
-		if (ret == 0)
-			hw->power_vol = power_vol[0];
-
-		ret = of_property_read_u32_array(
-			node, "is_batch_supported", is_batch_supported,
-			ARRAY_SIZE(is_batch_supported));
-		if (ret == 0)
-			hw->is_batch_supported = is_batch_supported[0];
-	} else {
-		pr_err(
-			"Device Tree: can not find mag node!. Go to use old cust info\n");
-		return -1;
-	}
-	return 0;
-}
-
-int get_gyro_dts_func(struct device_node *node, struct gyro_hw *hw)
-{
-	int i, ret;
-	u32 i2c_num[] = {0};
-	u32 i2c_addr[C_CUST_I2C_ADDR_NUM] = {0};
-	u32 direction[] = {0};
-	u32 power_id[] = {0};
-	u32 power_vol[] = {0};
-	u32 firlen[] = {0};
-	u32 is_batch_supported[] = {0};
-
-	pr_debug("Device Tree get gyro info!\n");
-	if (node) {
-		ret = of_property_read_u32_array(node, "i2c_num", i2c_num,
-						 ARRAY_SIZE(i2c_num));
-		if (ret == 0)
-			hw->i2c_num = i2c_num[0];
-
-		ret = of_property_read_u32_array(node, "i2c_addr", i2c_addr,
-						 ARRAY_SIZE(i2c_addr));
-		if (ret == 0) {
-			for (i = 0; i < GYRO_CUST_I2C_ADDR_NUM; i++)
-				hw->i2c_addr[i] = i2c_addr[i];
-		}
-
-		ret = of_property_read_u32_array(node, "direction", direction,
-						 ARRAY_SIZE(direction));
-		if (ret == 0)
-			hw->direction = direction[0];
-
-		ret = of_property_read_u32_array(node, "power_id", power_id,
-						 ARRAY_SIZE(power_id));
-		if (ret == 0) {
-			if (power_id[0] == 0xffff)
-				hw->power_id = -1;
-			else
-				hw->power_id = power_id[0];
-		}
-
-		ret = of_property_read_u32_array(node, "power_vol", power_vol,
-						 ARRAY_SIZE(power_vol));
-		if (ret == 0)
-			hw->power_vol = power_vol[0];
-
-		ret = of_property_read_u32_array(node, "firlen", firlen,
-						 ARRAY_SIZE(firlen));
-		if (ret == 0)
-			hw->firlen = firlen[0];
-
-		ret = of_property_read_u32_array(
-			node, "is_batch_supported", is_batch_supported,
-			ARRAY_SIZE(is_batch_supported));
-		if (ret == 0)
-			hw->is_batch_supported = is_batch_supported[0];
-	} else {
-		pr_err(
-			"Device Tree: can not find gyro node!. Go to use old cust info\n");
-		return -1;
-	}
-	return 0;
-}
-
-int get_baro_dts_func(struct device_node *node, struct baro_hw *hw)
-{
-	int i, ret;
-	u32 i2c_num[] = {0};
-	u32 i2c_addr[C_CUST_I2C_ADDR_NUM] = {0};
-	u32 direction[] = {0};
-	u32 power_id[] = {0};
-	u32 power_vol[] = {0};
-	u32 firlen[] = {0};
-	u32 is_batch_supported[] = {0};
-
-	pr_debug("Device Tree get gyro info!\n");
-
-	if (node) {
-		ret = of_property_read_u32_array(node, "i2c_num", i2c_num,
-						 ARRAY_SIZE(i2c_num));
-		if (ret == 0)
-			hw->i2c_num = i2c_num[0];
-
-		ret = of_property_read_u32_array(node, "i2c_addr", i2c_addr,
-						 ARRAY_SIZE(i2c_addr));
-		if (ret == 0) {
-			for (i = 0; i < GYRO_CUST_I2C_ADDR_NUM; i++)
-				hw->i2c_addr[i] = i2c_addr[i];
-		}
-
-		ret = of_property_read_u32_array(node, "direction", direction,
-						 ARRAY_SIZE(direction));
-		if (ret == 0)
-			hw->direction = direction[0];
-
-		ret = of_property_read_u32_array(node, "power_id", power_id,
-						 ARRAY_SIZE(power_id));
-		if (ret == 0) {
-			if (power_id[0] == 0xffff)
-				hw->power_id = -1;
-			else
-				hw->power_id = power_id[0];
-		}
-
-		ret = of_property_read_u32_array(node, "power_vol", power_vol,
-						 ARRAY_SIZE(power_vol));
-		if (ret == 0)
-			hw->power_vol = power_vol[0];
-
-		ret = of_property_read_u32_array(node, "firlen", firlen,
-						 ARRAY_SIZE(firlen));
-		if (ret == 0)
-			hw->firlen = firlen[0];
-
-		ret = of_property_read_u32_array(
-			node, "is_batch_supported", is_batch_supported,
-			ARRAY_SIZE(is_batch_supported));
-		if (ret == 0)
-			hw->is_batch_supported = is_batch_supported[0];
-	} else {
-		pr_err(
-			"Device Tree: can not find gyro node!. Go to use old cust info\n");
-		return -1;
-	}
-	return 0;
-}
-
-int get_accelgyro_dts_func(struct device_node *node, struct accelgyro_hw *hw)
-{
-	int ret;
-
-	u32 direction[] = {0};
-	u32 accel_firlen[] = {0};
-	u32 gyro_firlen[] = {0};
-	u32 accel_is_batch_supported[] = {0};
-	u32 gyro_is_batch_supported[] = {0};
-
-	pr_debug("Device Tree get accel info!\n");
-	if (node) {
-		ret = of_property_read_u32_array(node, "direction", direction,
-						 ARRAY_SIZE(direction));
-		if (ret == 0)
-			hw->direction = direction[0];
-
-		ret = of_property_read_u32_array(node, "accel_firlen",
-						 accel_firlen,
-						 ARRAY_SIZE(accel_firlen));
-		if (ret == 0)
-			hw->accel_firlen = accel_firlen[0];
-
-		ret = of_property_read_u32_array(
-			node, "accel_is_batch_supported",
-			accel_is_batch_supported,
-			ARRAY_SIZE(accel_is_batch_supported));
-		if (ret == 0)
-			hw->accel_is_batch_supported =
-				accel_is_batch_supported[0];
-
-		ret = of_property_read_u32_array(node, "gyro_firlen",
-						 gyro_firlen,
-						 ARRAY_SIZE(gyro_firlen));
-		if (ret == 0)
-			hw->gyro_firlen = gyro_firlen[0];
-
-		ret = of_property_read_u32_array(
-			node, "gyro_is_batch_supported",
-			gyro_is_batch_supported,
-			ARRAY_SIZE(gyro_is_batch_supported));
-		if (ret == 0)
-			hw->gyro_is_batch_supported =
-				gyro_is_batch_supported[0];
-	} else {
-		pr_err(
-			"Device Tree: can not find accel node!. Go to use old cust info\n");
-		return -1;
-	}
-
-	return 0;
-}
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_event/sensor_event.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_event/sensor_event.c
deleted file mode 100644
index 75720a0..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_event/sensor_event.c
+++ /dev/null
@@ -1,268 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2016 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<sensor_event> " fmt
-
-#include "sensor_event.h"
-#include "hwmsensor.h"
-#include "sensor_attr.h"
-#include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/poll.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-
-struct sensor_event_client {
-	spinlock_t buffer_lock;
-	unsigned int head;
-	unsigned int tail;
-	unsigned int bufsize;
-	unsigned int buffull;
-	struct sensor_event *buffer;
-	wait_queue_head_t wait;
-};
-struct sensor_event_obj {
-	struct sensor_event_client client[ID_SENSOR_MAX_HANDLE + 1];
-};
-static struct sensor_event_obj *event_obj;
-static struct lock_class_key buffer_lock_key[ID_SENSOR_MAX_HANDLE + 1];
-/*
- * sensor_input_event only support process context.
- */
-int sensor_input_event(unsigned char handle, const struct sensor_event *event)
-{
-	struct sensor_event_client *client = &event_obj->client[handle];
-	unsigned int dummy = 0;
-
-	/* spin_lock safe, this function don't support interrupt context */
-	spin_lock(&client->buffer_lock);
-	/*
-	 * Reserve below log if need debug LockProve
-	 * SE_ERR("[Lomen]sensor_input_event: printf key handle ID=%d, key
-	 * addr=%p\n",
-	 * handle, (struct
-	 * lock_class_key*)client->buffer_lock.rlock.dep_map.key);
-	 */
-	if (unlikely(client->buffull == true)) {
-		pr_err_ratelimited(
-			"input buffull, handle:%d, head:%d, tail:%d\n", handle,
-			client->head, client->tail);
-		spin_unlock(&client->buffer_lock);
-		wake_up_interruptible(&client->wait);
-		return -1;
-	}
-	client->buffer[client->head++] = *event;
-	client->head &= client->bufsize - 1;
-	/* remain 1 count */
-	dummy = client->head + 1;
-	dummy &= client->bufsize - 1;
-	if (unlikely(dummy == client->tail))
-		client->buffull = true;
-	spin_unlock(&client->buffer_lock);
-
-	wake_up_interruptible(&client->wait);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(sensor_input_event);
-
-static int sensor_event_fetch_next(struct sensor_event_client *client,
-				   struct sensor_event *event)
-{
-	int have_event;
-	/*
-	 * spin_lock safe, sensor_input_event always in process context.
-	 */
-	spin_lock(&client->buffer_lock);
-
-	have_event = client->head != client->tail;
-	if (have_event) {
-		*event = client->buffer[client->tail++];
-		client->tail &= client->bufsize - 1;
-		client->buffull = false;
-	}
-
-	spin_unlock(&client->buffer_lock);
-
-	return have_event;
-}
-
-ssize_t sensor_event_read(unsigned char handle, struct file *file,
-			  char __user *buffer, size_t count, loff_t *ppos)
-{
-	struct sensor_event_client *client = &event_obj->client[handle];
-	struct sensor_event event;
-	size_t read = 0;
-
-	if (count != 0 && count < sizeof(struct sensor_event)) {
-		pr_err("%s handle: %d err count(%d)\n", __func__,
-			  handle, (int)count);
-		return -EINVAL;
-	}
-
-	for (;;) {
-		if (client->head == client->tail)
-			return 0;
-		if (count == 0) {
-			pr_debug("%s count: %d\n", __func__, (int)count);
-			break;
-		}
-
-		while (read + sizeof(struct sensor_event) <= count &&
-		       sensor_event_fetch_next(client, &event)) {
-
-			if (copy_to_user(buffer + read, &event,
-					 sizeof(struct sensor_event)))
-				return -EFAULT;
-
-			read += sizeof(struct sensor_event);
-		}
-
-		if (read)
-			break;
-	}
-
-	return read;
-}
-EXPORT_SYMBOL_GPL(sensor_event_read);
-
-unsigned int sensor_event_poll(unsigned char handle, struct file *file,
-			       poll_table *wait)
-{
-	struct sensor_event_client *client = &event_obj->client[handle];
-	unsigned int mask = 0;
-
-	poll_wait(file, &client->wait, wait);
-
-	if (client->head != client->tail) {
-		/* pr_err("sensor_event_poll handle:%d\n", handle); */
-		mask |= POLLIN | POLLRDNORM;
-	}
-
-	return mask;
-}
-EXPORT_SYMBOL_GPL(sensor_event_poll);
-
-unsigned int sensor_event_register(unsigned char handle)
-{
-	struct sensor_event_obj *obj = event_obj;
-
-	switch (handle) {
-	/* google continues sensor ringbuffer is 2048 for batch flow */
-	case ID_ACCELEROMETER:
-	case ID_MAGNETIC:
-	case ID_MAGNETIC_UNCALIBRATED:
-	case ID_GYROSCOPE:
-	case ID_GYROSCOPE_UNCALIBRATED:
-	case ID_PRESSURE:
-	case ID_ORIENTATION:
-	case ID_ROTATION_VECTOR:
-	case ID_GAME_ROTATION_VECTOR:
-	case ID_GEOMAGNETIC_ROTATION_VECTOR:
-	case ID_GRAVITY:
-	case ID_LINEAR_ACCELERATION:
-	/* mtk add sensor pedometer and activity ringbuffer is 2048 for batch
-	 * flow
-	 */
-	case ID_PEDOMETER:
-	case ID_ACTIVITY:
-		spin_lock_init(&obj->client[handle].buffer_lock);
-		lockdep_set_class(&obj->client[handle].buffer_lock,
-				  &buffer_lock_key[handle]);
-
-		obj->client[handle].head = 0;
-		obj->client[handle].tail = 0;
-		obj->client[handle].bufsize = CONTINUE_SENSOR_BUF_SIZE;
-		obj->client[handle].buffull = false;
-		obj->client[handle].buffer =
-			vzalloc(obj->client[handle].bufsize *
-				sizeof(struct sensor_event));
-		if (!obj->client[handle].buffer) {
-			pr_err("Alloc ringbuffer error!\n");
-			return -1;
-		}
-		init_waitqueue_head(&obj->client[handle].wait);
-		break;
-	case ID_EKG:
-	case ID_PPG1:
-	case ID_PPG2:
-		spin_lock_init(&obj->client[handle].buffer_lock);
-		lockdep_set_class(&obj->client[handle].buffer_lock,
-				  &buffer_lock_key[handle]);
-		obj->client[handle].head = 0;
-		obj->client[handle].tail = 0;
-		obj->client[handle].bufsize = BIO_SENSOR_BUF_SIZE;
-		obj->client[handle].buffull = false;
-		obj->client[handle].buffer =
-			vzalloc(obj->client[handle].bufsize *
-				sizeof(struct sensor_event));
-		if (!obj->client[handle].buffer) {
-			pr_err("Alloc ringbuffer error!\n");
-			return -1;
-		}
-		init_waitqueue_head(&obj->client[handle].wait);
-		break;
-	/*
-	 * other sensor like google onchange and oneshot sensor or mtk add
-	 * oneshot onchange sensor
-	 * ringbuffer is 16 due to no batch flow
-	 */
-	default:
-		spin_lock_init(&obj->client[handle].buffer_lock);
-		lockdep_set_class(&obj->client[handle].buffer_lock,
-				  &buffer_lock_key[handle]);
-
-		obj->client[handle].head = 0;
-		obj->client[handle].tail = 0;
-		obj->client[handle].bufsize = OTHER_SENSOR_BUF_SIZE;
-		obj->client[handle].buffull = false;
-		obj->client[handle].buffer =
-			vzalloc(obj->client[handle].bufsize *
-				sizeof(struct sensor_event));
-		if (!obj->client[handle].buffer) {
-			pr_err("Alloc ringbuffer error!\n");
-			return -1;
-		}
-		init_waitqueue_head(&obj->client[handle].wait);
-		break;
-	}
-	return 0;
-}
-EXPORT_SYMBOL(sensor_event_register);
-
-unsigned int sensor_event_deregister(unsigned char handle)
-{
-	struct sensor_event_obj *obj = event_obj;
-
-	vfree(obj->client[handle].buffer);
-	return 0;
-}
-EXPORT_SYMBOL(sensor_event_deregister);
-
-static int __init sensor_event_entry(void)
-{
-	struct sensor_event_obj *obj =
-		kzalloc(sizeof(struct sensor_event_obj), GFP_KERNEL);
-
-	event_obj = obj;
-
-	sensor_attr_init();
-
-	return 0;
-}
-
-static void __exit sensor_event_exit(void)
-{
-	sensor_attr_exit();
-	kfree(event_obj);
-}
-
-subsys_initcall(sensor_event_entry);
-module_exit(sensor_event_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("sensor event driver");
-MODULE_AUTHOR("Mediatek");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_list/sensor_list.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_list/sensor_list.c
deleted file mode 100644
index 8401523..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_list/sensor_list.c
+++ /dev/null
@@ -1,238 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2016 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<SEN_LIST> " fmt
-
-#include <linux/module.h>
-#include <linux/miscdevice.h>
-#include <linux/types.h>
-#include <linux/workqueue.h>
-#include <linux/atomic.h>
-#include <linux/spinlock.h>
-#include <linux/uaccess.h>
-
-#include "SCP_sensorHub.h"
-#include "sensor_list.h"
-#include "SCP_power_monitor.h"
-#include "hwmsensor.h"
-
-struct sensorlist_info_t {
-	char name[16];
-};
-
-enum {
-	accel,
-	gyro,
-	mag,
-	als,
-	ps,
-	baro,
-	sar,
-	maxhandle,
-};
-
-#ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
-static struct work_struct sensorlist_work;
-#endif
-static atomic_t first_ready_after_boot;
-static struct sensorlist_info_t sensorlist_info[maxhandle];
-static DEFINE_SPINLOCK(sensorlist_info_lock);
-
-inline int sensor_to_handle(int sensor)
-{
-	int handle = -1;
-
-	switch (sensor) {
-	case ID_ACCELEROMETER:
-		handle = accel;
-		break;
-	case ID_GYROSCOPE:
-		handle = gyro;
-		break;
-	case ID_MAGNETIC:
-		handle = mag;
-		break;
-	case ID_LIGHT:
-		handle = als;
-		break;
-	case ID_PROXIMITY:
-		handle = ps;
-		break;
-	case ID_PRESSURE:
-		handle = baro;
-		break;
-	case ID_SAR:
-		handle = sar;
-		break;
-	}
-	return handle;
-}
-
-static inline int handle_to_sensor(int handle)
-{
-	int sensor = -1;
-
-	switch (handle) {
-	case accel:
-		sensor = ID_ACCELEROMETER;
-		break;
-	case gyro:
-		sensor = ID_GYROSCOPE;
-		break;
-	case mag:
-		sensor = ID_MAGNETIC;
-		break;
-	case als:
-		sensor = ID_LIGHT;
-		break;
-	case ps:
-		sensor = ID_PROXIMITY;
-		break;
-	case baro:
-		sensor = ID_PRESSURE;
-		break;
-	case sar:
-		sensor = ID_SAR;
-		break;
-	}
-	return sensor;
-}
-
-static void init_sensorlist_info(void)
-{
-	int handle = -1;
-
-	for (handle = accel; handle < maxhandle; ++handle)
-		strlcpy(sensorlist_info[handle].name,
-			"NULL",
-			sizeof(sensorlist_info[handle].name));
-}
-
-#ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
-static void sensorlist_get_deviceinfo(struct work_struct *work)
-{
-	int err = 0, handle = -1, sensor = -1;
-	struct sensorInfo_t devinfo;
-
-	for (handle = accel; handle < maxhandle; ++handle) {
-		sensor = handle_to_sensor(handle);
-		if (sensor < 0)
-			continue;
-		memset(&devinfo, 0, sizeof(struct sensorInfo_t));
-		err = sensor_set_cmd_to_hub(sensor,
-			CUST_ACTION_GET_SENSOR_INFO, &devinfo);
-		if (err < 0) {
-			pr_err("sensor(%d) not register\n", sensor);
-			continue;
-		}
-		spin_lock(&sensorlist_info_lock);
-		strlcpy(sensorlist_info[handle].name,
-			devinfo.name,
-			sizeof(sensorlist_info[handle].name));
-		spin_unlock(&sensorlist_info_lock);
-	}
-}
-
-static int scp_ready_event(uint8_t event, void *ptr)
-{
-	pr_err("%s, event:%u\n", __func__, event);
-	switch (event) {
-	case SENSOR_POWER_UP:
-		if (likely(atomic_xchg(&first_ready_after_boot, 1)))
-			return 0;
-		schedule_work(&sensorlist_work);
-		break;
-	case SENSOR_POWER_DOWN:
-		break;
-	}
-	return 0;
-}
-
-static struct scp_power_monitor scp_ready_notifier = {
-	.name = "sensorlist",
-	.notifier_call = scp_ready_event,
-};
-#else
-int sensorlist_register_deviceinfo(int sensor,
-		struct sensorInfo_NonHub_t *devinfo)
-{
-	int handle = -1;
-
-	handle = sensor_to_handle(sensor);
-	if (handle < 0)
-		return -1;
-	spin_lock(&sensorlist_info_lock);
-	strlcpy(sensorlist_info[handle].name,
-		devinfo->name,
-		sizeof(sensorlist_info[handle].name));
-	spin_unlock(&sensorlist_info_lock);
-	return 0;
-}
-#endif
-
-static int sensorlist_open(struct inode *inode, struct file *file)
-{
-	return nonseekable_open(inode, file);
-}
-
-static ssize_t
-sensorlist_read(struct file *file, char __user *buf,
-	size_t count, loff_t *ptr)
-{
-	if (!atomic_read(&first_ready_after_boot))
-		return -EINVAL;
-	if (count == 0)
-		return -EINVAL;
-	if (count < sizeof(struct sensorlist_info_t))
-		return -EINVAL;
-	if (count > maxhandle * sizeof(struct sensorlist_info_t))
-		count = maxhandle * sizeof(struct sensorlist_info_t);
-
-	spin_lock(&sensorlist_info_lock);
-	if (copy_to_user(buf, sensorlist_info, count)) {
-		spin_unlock(&sensorlist_info_lock);
-		return -EFAULT;
-	}
-	spin_unlock(&sensorlist_info_lock);
-	return count;
-}
-
-static const struct file_operations sensorlist_fops = {
-	.owner		= THIS_MODULE,
-	.open		= sensorlist_open,
-	.read		= sensorlist_read,
-};
-
-static struct miscdevice sensorlist_miscdev = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = "sensorlist",
-	.fops = &sensorlist_fops,
-};
-
-static int __init sensorlist_init(void)
-{
-	int ret = 0;
-
-	init_sensorlist_info();
-	ret = misc_register(&sensorlist_miscdev);
-	if (ret < 0)
-		return -1;
-	atomic_set(&first_ready_after_boot, 0);
-#ifdef CONFIG_CUSTOM_KERNEL_SENSORHUB
-	INIT_WORK(&sensorlist_work, sensorlist_get_deviceinfo);
-	scp_power_monitor_register(&scp_ready_notifier);
-#endif
-	return 0;
-}
-
-static void __exit sensorlist_exit(void)
-{
-
-}
-module_init(sensorlist_init);
-module_exit(sensorlist_exit);
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("dynamic sensorlist driver");
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_performance/sensor_performance.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_performance/sensor_performance.c
deleted file mode 100644
index d2df104..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/hwmon/sensor_performance/sensor_performance.c
+++ /dev/null
@@ -1,61 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2016 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<SEN_PER> " fmt
-
-#include <hwmsensor.h>
-#include <linux/types.h>
-#include <sensor_performance.h>
-
-#ifdef DEBUG_PERFORMANCE
-struct time_records record[STATUS_MAX];
-void mark_timestamp(u8 sensor_type, enum SENSOR_STATUS status, u64 current_time,
-		    u64 event_time)
-{
-	record[status].check_time = current_time;
-	record[status].count++;
-
-	if (status == STATUS_MAX - 1) {
-		int i;
-
-		record[GOT_IPI].sum_kernel_time +=
-			record[GOT_IPI].check_time - event_time;
-		for (i = 1; i < STATUS_MAX; i++)
-			record[i].sum_kernel_time +=
-				record[i].check_time - record[i - 1].check_time;
-		if (record[status].count == LIMIT) {
-			for (i = 0; i < STATUS_MAX; i++) {
-				pr_debug(
-					"Sensor[%d] ====> last event stage[%d] check time:%lld\n",
-					sensor_type, i, record[i].check_time);
-				pr_debug(
-					"sensor[%d] ====> stage[%d] average delta time:%lld on %d events\n",
-					sensor_type, i,
-					record[i].sum_kernel_time / LIMIT,
-					record[i].count);
-				record[i].sum_kernel_time = 0;
-				record[i].count = 0;
-			}
-		}
-	}
-}
-
-struct time_records ipi_time_records;
-void mark_ipi_timestamp(uint64_t cyc)
-{
-#define ARCH_TIMER_MULT 161319385
-#define ARCH_TIMER_SHIFT 21
-	uint64_t time_ns = (cyc * ARCH_TIMER_MULT) >> ARCH_TIMER_SHIFT;
-
-	ipi_time_records.sum_kernel_time += time_ns;
-	ipi_time_records.count++;
-	if (ipi_time_records.count == LIMIT) {
-		pr_debug("Sensor ====> ipi average time on 1000 is :%lld\n",
-			 ipi_time_records.sum_kernel_time / LIMIT);
-		ipi_time_records.sum_kernel_time = 0;
-		ipi_time_records.count = 0;
-	}
-}
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/Kconfig
deleted file mode 100644
index af4317d..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/Kconfig
+++ /dev/null
@@ -1,20 +0,0 @@
-
-config MTK_AUTO_DETECT_MAGNETOMETER
-	bool "MTK AUTO DETECT MAGNETOMETER Sensor"
-	help
-	  one load to support different magnetometer sensor.
-	  This feature Option is used for projects which using more than one
-	  magnetometer, more than one ALSPS drivers can be builded in to
-	  project and be auto detected by setting this option to yes
-
-config CUSTOM_KERNEL_MAGNETOMETER
-	bool "CUSTOM KERNEL MAGNETOMETER Config"
-	help
-	  compass driver to detect compass raw data and report orientatino
-	  data. A compass is an instrument used for navigation and
-	  orientation that shows direction relative to the geographic
-	  cardinal directions, or "points".
-
-source "drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/magnetometer/akm09915/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/magnetometer/akm09918/Kconfig"
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/Makefile
deleted file mode 100644
index d34b549..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# In case the platform does NOT support this type of sensors
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/accelerometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/magnetometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/include
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)   +=  mag_common.o
-mag_common-$(CONFIG_MTK_SENSOR_SUPPORT)   +=  mag.o mag_factory.o
-
-obj-$(CONFIG_MTK_MAGHUB)        +=  maghub/
-#obj-$(CONFIG_MTK_AKM09915_NEW)         +=  akm09915/
-#obj-$(CONFIG_MTK_AKM09918)          +=  akm09918/
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/inc/cust_mag.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/inc/cust_mag.h
deleted file mode 100644
index dab0e87..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/inc/cust_mag.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __CUST_MAG_H__
-#define __CUST_MAG_H__
-
-#include <linux/i2c.h>
-#include <linux/device.h>
-#include <linux/types.h>
-
-#define M_CUST_I2C_ADDR_NUM 2
-
-struct mag_hw {
-	int i2c_num;
-	int direction;
-	int power_id;
-	int power_vol;
-	unsigned char	i2c_addr[M_CUST_I2C_ADDR_NUM];
-	int power_vio_id;
-	int power_vio_vol;
-	bool is_batch_supported;
-};
-
-int get_mag_dts_func(struct device_node *node, struct mag_hw *hw);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/inc/mag.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/inc/mag.h
deleted file mode 100644
index ecda53d..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/inc/mag.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __MAG_H__
-#define __MAG_H__
-
-//#include <linux/wakelock.h>
-#include <linux/atomic.h>
-#include <linux/delay.h>
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/kobject.h>
-#include <linux/miscdevice.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/poll.h>
-#include <linux/proc_fs.h>
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-#include <linux/workqueue.h>
-
-#include "mag_factory.h"
-#include "sensor_attr.h"
-#include "sensor_event.h"
-#include <hwmsen_helper.h>
-#include <hwmsensor.h>
-#include <sensors_io.h>
-
-
-#define OP_MAG_DELAY 0X01
-#define OP_MAG_ENABLE 0X02
-#define OP_MAG_GET_DATA 0X04
-
-#define MAG_INVALID_VALUE -1
-
-#define EVENT_TYPE_MAGEL_X ABS_X
-#define EVENT_TYPE_MAGEL_Y ABS_Y
-#define EVENT_TYPE_MAGEL_Z ABS_Z
-#define EVENT_TYPE_MAGEL_UPDATE REL_X
-#define EVENT_DIV_MAGEL ABS_RUDDER
-#define EVENT_TYPE_MAGEL_STATUS ABS_WHEEL
-#define EVENT_TYPE_MAG_UPDATE REL_X
-#define EVENT_TYPE_MAG_TIMESTAMP_HI REL_HWHEEL
-#define EVENT_TYPE_MAG_TIMESTAMP_LO REL_DIAL
-
-#define MAG_DIV_MAX (32767)
-#define MAG_DIV_MIN (1)
-
-#define MAG_VALUE_MAX (32767)
-#define MAG_VALUE_MIN (-32768)
-#define MAG_STATUS_MIN (0)
-#define MAG_STATUS_MAX (64)
-
-#define MAX_CHOOSE_G_NUM 5
-
-#define MAX_M_V_SENSOR 5
-
-#define ID_M_V_MAGNETIC 0
-
-struct mag_data_path {
-	int div;
-	int (*get_data)(int *x, int *y, int *z, int *status);
-	int (*get_raw_data)(int *x, int *y, int *z);
-};
-
-struct mag_libinfo_t {
-	char libname[64];
-	int32_t layout;
-	int32_t deviceid;
-};
-
-struct mag_control_path {
-	int (*open_report_data)(int en);
-	int (*set_delay)(u64 delay);
-	int (*enable)(int en);
-	int (*batch)(int flag, int64_t samplingPeriodNs,
-		     int64_t maxBatchReportLatencyNs);
-	int (*flush)(void);
-	int (*set_cali)(uint8_t *data, uint8_t count);
-	bool is_report_input_direct;
-	bool is_support_batch;
-	bool is_use_common_factory;
-	struct mag_libinfo_t libinfo;
-};
-
-struct mag_init_info {
-	char *name;
-	int (*init)(void);
-	int (*uninit)(void);
-	struct platform_driver *platform_diver_addr;
-};
-
-struct mag_data {
-	int8_t status;
-	int8_t reserved[3];
-	int x;
-	int y;
-	int z;
-	int64_t timestamp;
-	void *reserved1;
-};
-
-struct mag_drv_obj {
-	void *self;
-	int polling;
-	int (*mag_operate)(void *self, uint32_t command, void *buff_in,
-			   int size_in, void *buff_out, int size_out,
-			   int *actualout);
-};
-
-struct mag_context {
-	struct sensor_attr_t mdev;
-	struct work_struct report;
-	struct mutex mag_op_mutex;
-	atomic_t delay; /*polling period for reporting input event*/
-	atomic_t wake;  /*user-space request to wake-up, used with stop*/
-	struct timer_list timer; /* polling timer */
-	struct hrtimer hrTimer;
-	ktime_t target_ktime;
-	atomic_t trace;
-	struct workqueue_struct *mag_workqueue;
-
-	struct mag_data_path mag_dev_data;
-	struct mag_control_path mag_ctl;
-	atomic_t early_suspend;
-	struct mag_data drv_data;
-	bool is_first_data_after_enable;
-	bool is_polling_run;
-	bool is_batch_enable;
-	int power;
-	int enable;
-	int64_t delay_ns;
-	int64_t latency_ns;
-};
-
-extern int mag_attach(int sensor, struct mag_drv_obj *obj);
-
-extern int mag_driver_add(struct mag_init_info *obj);
-extern int mag_data_report(struct mag_data *data);
-extern int mag_bias_report(struct mag_data *data);
-extern int mag_flush_report(void);
-extern int mag_info_record(struct mag_libinfo_t *p_mag_info);
-extern int mag_cali_report(int32_t *param);
-extern int mag_register_control_path(struct mag_control_path *ctl);
-extern int mag_register_data_path(struct mag_data_path *ctl);
-extern int mag_probe(void);
-extern int mag_remove(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/inc/mag_factory.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/inc/mag_factory.h
deleted file mode 100644
index fdcb0b6..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/inc/mag_factory.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __MAG_FACTORY_H__
-#define __MAG_FACTORY_H__
-
-#include "mag.h"
-#include "cust_mag.h"
-
-extern struct mag_context *mag_context_obj;
-
-#define SETCALI 1
-#define CLRCALI 2
-#define GETCALI 3
-
-struct mag_factory_fops {
-	int (*enable_sensor)(bool enable_disable, int64_t sample_periods_ms);
-	int (*get_data)(int32_t data[3], int *status);
-	int (*get_raw_data)(int32_t data[3]);
-	int (*enable_calibration)(void);
-	int (*clear_cali)(void);
-	int (*set_cali)(int32_t offset[3]);
-	int (*get_cali)(int32_t offset[3]);
-	int (*do_self_test)(void);
-};
-
-struct mag_factory_public {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct mag_factory_fops *fops;
-};
-int mag_factory_device_register(struct mag_factory_public *dev);
-int mag_factory_device_deregister(struct mag_factory_public *dev);
-
-
-#endif
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/mag.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/mag.c
deleted file mode 100644
index f001726..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/mag.c
+++ /dev/null
@@ -1,824 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2016 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<MAG> " fmt
-
-#include "inc/mag.h"
-#include "sensor_performance.h"
-#include <linux/vmalloc.h>
-
-struct mag_context *mag_context_obj /* = NULL*/;
-static struct mag_init_info *msensor_init_list[MAX_CHOOSE_G_NUM] = {0};
-
-static void initTimer(struct hrtimer *timer,
-		      enum hrtimer_restart (*callback)(struct hrtimer *))
-{
-	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
-	timer->function = callback;
-}
-
-static void startTimer(struct hrtimer *timer, int delay_ms, bool first)
-{
-	struct mag_context *obj = (struct mag_context *)container_of(timer,
-		struct mag_context, hrTimer);
-
-	if (obj == NULL) {
-		pr_err("NULL pointer\n");
-		return;
-	}
-
-	if (first) {
-		obj->target_ktime =
-			ktime_add_ns(ktime_get(), (int64_t)delay_ms * 1000000);
-	} else {
-		do {
-			obj->target_ktime = ktime_add_ns(
-				obj->target_ktime, (int64_t)delay_ms * 1000000);
-		} while (ktime_to_ns(obj->target_ktime) <
-			 ktime_to_ns(ktime_get()));
-	}
-
-	hrtimer_start(timer, obj->target_ktime, HRTIMER_MODE_ABS);
-}
-#ifndef CONFIG_NANOHUB
-static void stopTimer(struct hrtimer *timer)
-{
-	hrtimer_cancel(timer);
-}
-#endif
-static void mag_work_func(struct work_struct *work)
-{
-	struct mag_context *cxt = NULL;
-	struct hwm_sensor_data sensor_data;
-	int64_t m_pre_ns, cur_ns;
-	int64_t delay_ms;
-	struct timespec time;
-	int err;
-	int x, y, z, status;
-
-	cxt = mag_context_obj;
-	delay_ms = atomic_read(&cxt->delay);
-	memset(&sensor_data, 0, sizeof(sensor_data));
-	time.tv_sec = time.tv_nsec = 0;
-	get_monotonic_boottime(&time);
-	cur_ns = time.tv_sec * 1000000000LL + time.tv_nsec;
-
-	err = cxt->mag_dev_data.get_data(&x, &y, &z, &status);
-	if (err) {
-		pr_err("get data fails!!\n");
-		return;
-	}
-	cxt->drv_data.x = x;
-	cxt->drv_data.y = y;
-	cxt->drv_data.z = z;
-	cxt->drv_data.status = status;
-	m_pre_ns = cxt->drv_data.timestamp;
-	cxt->drv_data.timestamp = cur_ns;
-	if (true == cxt->is_first_data_after_enable) {
-		m_pre_ns = cur_ns;
-		cxt->is_first_data_after_enable = false;
-		/* filter -1 value */
-		if (cxt->drv_data.x == MAG_INVALID_VALUE ||
-		    cxt->drv_data.y == MAG_INVALID_VALUE ||
-		    cxt->drv_data.z == MAG_INVALID_VALUE) {
-			pr_debug(" read invalid data\n");
-			goto mag_loop;
-		}
-	}
-	while ((cur_ns - m_pre_ns) >= delay_ms * 1800000LL) {
-		struct mag_data tmp_data = cxt->drv_data;
-
-		m_pre_ns += delay_ms * 1000000LL;
-		tmp_data.timestamp = m_pre_ns;
-		mag_data_report(&tmp_data);
-	}
-
-	mag_data_report(&cxt->drv_data);
-
-mag_loop:
-
-	if (true == cxt->is_polling_run)
-		startTimer(&cxt->hrTimer, atomic_read(&cxt->delay), false);
-}
-
-enum hrtimer_restart mag_poll(struct hrtimer *timer)
-{
-	struct mag_context *obj = (struct mag_context *)container_of(timer,
-		struct mag_context, hrTimer);
-
-	queue_work(obj->mag_workqueue, &obj->report);
-
-	return HRTIMER_NORESTART;
-}
-
-static struct mag_context *mag_context_alloc_object(void)
-{
-
-	struct mag_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-
-	pr_debug("%s start\n", __func__);
-	if (!obj) {
-		pr_err("Alloc magel object error!\n");
-		return NULL;
-	}
-
-	atomic_set(&obj->delay, 200); /* set work queue delay time 200ms */
-	atomic_set(&obj->wake, 0);
-	INIT_WORK(&obj->report, mag_work_func);
-	obj->mag_workqueue = NULL;
-	obj->mag_workqueue = create_workqueue("mag_polling");
-	if (!obj->mag_workqueue) {
-		kfree(obj);
-		return NULL;
-	}
-	initTimer(&obj->hrTimer, mag_poll);
-	obj->is_first_data_after_enable = false;
-	obj->is_polling_run = false;
-	obj->is_batch_enable = false;
-	mutex_init(&obj->mag_op_mutex);
-	obj->power = 0;
-	obj->enable = 0;
-	obj->delay_ns = -1;
-	obj->latency_ns = -1;
-	pr_debug("%s end\n", __func__);
-	return obj;
-}
-
-#ifndef CONFIG_NANOHUB
-static int mag_enable_and_batch(void)
-{
-	struct mag_context *cxt = mag_context_obj;
-	int err;
-
-	/* power on -> power off */
-	if (cxt->power == 1 && cxt->enable == 0) {
-		pr_debug("MAG disable\n");
-		/* stop polling firstly, if needed */
-		if (cxt->mag_ctl.is_report_input_direct == false &&
-		    cxt->is_polling_run == true) {
-			smp_mb(); /* for memory barrier */
-			stopTimer(&cxt->hrTimer);
-			smp_mb(); /* for memory barrier */
-			cancel_work_sync(&cxt->report);
-			cxt->drv_data.x = MAG_INVALID_VALUE;
-			cxt->drv_data.y = MAG_INVALID_VALUE;
-			cxt->drv_data.z = MAG_INVALID_VALUE;
-			cxt->is_polling_run = false;
-			pr_debug("mag stop polling done\n");
-		}
-		/* turn off the power */
-		err = cxt->mag_ctl.enable(0);
-		if (err) {
-			pr_err("mag turn off power err = %d\n", err);
-			return -1;
-		}
-		pr_debug("mag turn off power done\n");
-
-		cxt->power = 0;
-		cxt->delay_ns = -1;
-		pr_debug("MAG disable done\n");
-		return 0;
-	}
-	/* power off -> power on */
-	if (cxt->power == 0 && cxt->enable == 1) {
-		pr_debug("MAG power on\n");
-		err = cxt->mag_ctl.enable(1);
-		if (err) {
-			pr_err("mag turn on power err = %d\n", err);
-			return -1;
-		}
-		pr_debug("mag turn on power done\n");
-
-		cxt->power = 1;
-		pr_debug("MAG power on done\n");
-	}
-	/* rate change */
-	if (cxt->power == 1 && cxt->delay_ns >= 0) {
-		pr_debug("MAG set batch\n");
-		/* set ODR, fifo timeout latency */
-		if (cxt->mag_ctl.is_support_batch)
-			err = cxt->mag_ctl.batch(0, cxt->delay_ns,
-						 cxt->latency_ns);
-		else
-			err = cxt->mag_ctl.batch(0, cxt->delay_ns, 0);
-		if (err) {
-			pr_err("mag set batch(ODR) err %d\n", err);
-			return -1;
-		}
-		pr_debug("mag set ODR, fifo latency done\n");
-		/* start polling, if needed */
-		if (cxt->mag_ctl.is_report_input_direct == false) {
-			uint64_t mdelay = cxt->delay_ns;
-
-			do_div(mdelay, 1000000);
-			atomic_set(&cxt->delay, mdelay);
-			/* the first sensor start polling timer */
-			if (cxt->is_polling_run == false) {
-				cxt->is_polling_run = true;
-				cxt->is_first_data_after_enable = true;
-				startTimer(&cxt->hrTimer,
-					   atomic_read(&cxt->delay), true);
-			}
-			pr_debug("mag set polling delay %d ms\n",
-				atomic_read(&cxt->delay));
-		}
-		pr_debug("MAG batch done\n");
-	}
-	return 0;
-}
-#endif
-/*----------------------------------------------------------------------------*/
-static ssize_t magdev_show(struct device *dev,
-			       struct device_attribute *attr, char *buf)
-{
-	int len = 0;
-
-	pr_debug("sensor test: mag function!\n");
-	return len;
-}
-static ssize_t magactive_store(struct device *dev,
-				struct device_attribute *attr, const char *buf,
-				size_t count)
-{
-	struct mag_context *cxt = mag_context_obj;
-	int err = 0;
-
-	pr_debug("%s buf=%s\n", __func__, buf);
-	mutex_lock(&mag_context_obj->mag_op_mutex);
-
-	if (!strncmp(buf, "1", 1))
-		cxt->enable = 1;
-	else if (!strncmp(buf, "0", 1))
-		cxt->enable = 0;
-	else {
-		pr_err("%s error !!\n", __func__);
-		err = -1;
-		goto err_out;
-	}
-#ifdef CONFIG_NANOHUB
-	err = cxt->mag_ctl.enable(cxt->enable);
-	if (err) {
-		pr_err("mag turn on power err = %d\n", err);
-		goto err_out;
-	}
-#else
-	err = mag_enable_and_batch();
-#endif
-
-err_out:
-	mutex_unlock(&mag_context_obj->mag_op_mutex);
-	pr_debug("%s done\n", __func__);
-	if (err)
-		return err;
-	else
-		return count;
-}
-/*----------------------------------------------------------------------------*/
-static ssize_t magactive_show(struct device *dev,
-			       struct device_attribute *attr, char *buf)
-{
-	struct mag_context *cxt = NULL;
-	int div = 0;
-
-	cxt = mag_context_obj;
-	div = cxt->mag_dev_data.div;
-	pr_debug("mag mag_dev_data m_div value: %d\n", div);
-	return snprintf(buf, PAGE_SIZE, "%d\n", div);
-}
-
-static ssize_t magbatch_store(struct device *dev,
-			       struct device_attribute *attr, const char *buf,
-			       size_t count)
-{
-	struct mag_context *cxt = mag_context_obj;
-	int handle = 0, flag = 0, err = 0;
-
-	pr_debug("%s %s\n", __func__, buf);
-	err = sscanf(buf, "%d,%d,%lld,%lld", &handle, &flag, &cxt->delay_ns,
-		     &cxt->latency_ns);
-	if (err != 4) {
-		pr_err("%s param error: err = %d\n", __func__, err);
-		return -1;
-	}
-
-	mutex_lock(&mag_context_obj->mag_op_mutex);
-#ifdef CONFIG_NANOHUB
-	if (cxt->mag_ctl.is_support_batch)
-		err = cxt->mag_ctl.batch(0, cxt->delay_ns, cxt->latency_ns);
-	else
-		err = cxt->mag_ctl.batch(0, cxt->delay_ns, 0);
-	if (err)
-		pr_err("mag set batch(ODR) err %d\n", err);
-#else
-	err = mag_enable_and_batch();
-#endif
-	mutex_unlock(&mag_context_obj->mag_op_mutex);
-	pr_debug("%s done: %d\n", __func__, cxt->is_batch_enable);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t magbatch_show(struct device *dev, struct device_attribute *attr,
-			      char *buf)
-{
-	int len = 0;
-
-	pr_debug(" not support now\n");
-	return len;
-}
-
-static ssize_t magflush_show(struct device *dev, struct device_attribute *attr,
-			      char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t magflush_store(struct device *dev,
-			       struct device_attribute *attr, const char *buf,
-			       size_t count)
-{
-	struct mag_context *cxt = NULL;
-	int handle = 0, err = 0;
-
-	err = kstrtoint(buf, 10, &handle);
-	if (err != 0)
-		pr_err("%s param error: err = %d\n", __func__, err);
-
-	pr_debug("%s param: handle %d\n", __func__, handle);
-
-	mutex_lock(&mag_context_obj->mag_op_mutex);
-	cxt = mag_context_obj;
-	if (cxt->mag_ctl.flush != NULL)
-		err = cxt->mag_ctl.flush();
-	else
-		pr_debug(
-			"MAG DRIVER OLD ARCHITECTURE DON'T SUPPORT ACC COMMON VERSION FLUSH\n");
-	if (err < 0)
-		pr_err("mag enable flush err %d\n", err);
-	mutex_unlock(&mag_context_obj->mag_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t magcali_show(struct device *dev, struct device_attribute *attr,
-			     char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t magcali_store(struct device *dev, struct device_attribute *attr,
-			      const char *buf, size_t count)
-{
-	struct mag_context *cxt = NULL;
-	int err = 0;
-	uint8_t *cali_buf = NULL;
-
-	cali_buf = vzalloc(count);
-	if (cali_buf == NULL)
-		return -EFAULT;
-	memcpy(cali_buf, buf, count);
-
-	mutex_lock(&mag_context_obj->mag_op_mutex);
-	cxt = mag_context_obj;
-	if (cxt->mag_ctl.set_cali != NULL)
-		err = cxt->mag_ctl.set_cali(cali_buf, count);
-	else
-		pr_debug(
-			"MAG DRIVER OLD ARCHITECTURE DON'T SUPPORT MAG COMMON VERSION FLUSH\n");
-	if (err < 0)
-		pr_err("mag set cali err %d\n", err);
-	mutex_unlock(&mag_context_obj->mag_op_mutex);
-	vfree(cali_buf);
-	return count;
-}
-
-/* need work around again */
-static ssize_t magdevnum_show(struct device *dev,
-				     struct device_attribute *attr, char *buf)
-{
-
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t maglibinfo_show(struct device *dev,
-				struct device_attribute *attr, char *buf)
-{
-	struct mag_context *cxt = mag_context_obj;
-
-	if (!buf)
-		return -1;
-	memcpy(buf, &cxt->mag_ctl.libinfo, sizeof(struct mag_libinfo_t));
-	return sizeof(struct mag_libinfo_t);
-}
-
-static int msensor_remove(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static int msensor_probe(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-#ifdef CONFIG_OF
-static const struct of_device_id msensor_of_match[] = {
-	{
-		.compatible = "mediatek,msensor",
-	},
-	{},
-};
-#endif
-
-static struct platform_driver msensor_driver = {
-	.probe = msensor_probe,
-	.remove = msensor_remove,
-	.driver = {
-
-		.name = "msensor",
-#ifdef CONFIG_OF
-		.of_match_table = msensor_of_match,
-#endif
-	}
-};
-
-static int mag_real_driver_init(void)
-{
-	int i = 0;
-	int err = 0;
-
-	pr_debug("%s start\n", __func__);
-	for (i = 0; i < MAX_CHOOSE_G_NUM; i++) {
-		pr_debug(" i=%d\n", i);
-		if (msensor_init_list[i] != 0) {
-			pr_debug(" mag try to init driver %s\n",
-				msensor_init_list[i]->name);
-			err = msensor_init_list[i]->init();
-			if (err == 0) {
-				pr_debug(" mag real driver %s probe ok\n",
-					msensor_init_list[i]->name);
-				break;
-			}
-		}
-	}
-
-	if (i == MAX_CHOOSE_G_NUM) {
-		pr_debug("%s fail\n", __func__);
-		err = -1;
-	}
-	return err;
-}
-
-int mag_driver_add(struct mag_init_info *obj)
-{
-	int err = 0;
-	int i = 0;
-
-	pr_debug("%s\n", __func__);
-	if (!obj) {
-		pr_err("%s fail, mag_init_info is NULL\n", __func__);
-		return -1;
-	}
-
-	for (i = 0; i < MAX_CHOOSE_G_NUM; i++) {
-		if ((i == 0) && (msensor_init_list[0] == NULL)) {
-			pr_debug("register mensor driver for the first time\n");
-			if (platform_driver_register(&msensor_driver))
-				pr_err(
-					"failed to register msensor driver already exist\n");
-		}
-		if (msensor_init_list[i] == NULL) {
-			obj->platform_diver_addr = &msensor_driver;
-			msensor_init_list[i] = obj;
-			break;
-		}
-	}
-
-	if (i >= MAX_CHOOSE_G_NUM) {
-		pr_err("MAG driver add err\n");
-		err = -1;
-	}
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(mag_driver_add);
-static int magnetic_open(struct inode *inode, struct file *file)
-{
-	nonseekable_open(inode, file);
-	return 0;
-}
-
-static ssize_t magnetic_read(struct file *file, char __user *buffer,
-			     size_t count, loff_t *ppos)
-{
-	ssize_t read_cnt = 0;
-
-	read_cnt = sensor_event_read(mag_context_obj->mdev.minor, file, buffer,
-				     count, ppos);
-
-	return read_cnt;
-}
-
-static unsigned int magnetic_poll(struct file *file, poll_table *wait)
-{
-	return sensor_event_poll(mag_context_obj->mdev.minor, file, wait);
-}
-
-static const struct file_operations mag_fops = {
-	.owner = THIS_MODULE,
-	.open = magnetic_open,
-	.read = magnetic_read,
-	.poll = magnetic_poll,
-};
-
-static int mag_misc_init(struct mag_context *cxt)
-{
-
-	int err = 0;
-
-	cxt->mdev.minor = ID_MAGNETIC;
-	cxt->mdev.name = MAG_MISC_DEV_NAME;
-	cxt->mdev.fops = &mag_fops;
-	err = sensor_attr_register(&cxt->mdev);
-	if (err)
-		pr_err("unable to register mag misc device!!\n");
-
-	return err;
-}
-
-DEVICE_ATTR_RO(magdev);
-DEVICE_ATTR_RW(magactive);
-DEVICE_ATTR_RW(magbatch);
-DEVICE_ATTR_RW(magflush);
-DEVICE_ATTR_RW(magcali);
-DEVICE_ATTR_RO(magdevnum);
-DEVICE_ATTR_RO(maglibinfo);
-
-static struct attribute *mag_attributes[] = {
-	&dev_attr_magdev.attr,
-	&dev_attr_magactive.attr,
-	&dev_attr_magbatch.attr,
-	&dev_attr_magflush.attr,
-	&dev_attr_magcali.attr,
-	&dev_attr_magdevnum.attr,
-	&dev_attr_maglibinfo.attr,
-	NULL
-};
-
-static struct attribute_group mag_attribute_group = {
-	.attrs = mag_attributes
-};
-
-int mag_register_data_path(struct mag_data_path *data)
-{
-	struct mag_context *cxt = NULL;
-
-	cxt = mag_context_obj;
-	cxt->mag_dev_data.div = data->div;
-	cxt->mag_dev_data.get_data = data->get_data;
-	cxt->mag_dev_data.get_raw_data = data->get_raw_data;
-	pr_debug("mag register data path div: %d\n", cxt->mag_dev_data.div);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(mag_register_data_path);
-
-int mag_register_control_path(struct mag_control_path *ctl)
-{
-	struct mag_context *cxt = NULL;
-	int err = 0;
-
-	cxt = mag_context_obj;
-	cxt->mag_ctl.set_delay = ctl->set_delay;
-	cxt->mag_ctl.enable = ctl->enable;
-	cxt->mag_ctl.open_report_data = ctl->open_report_data;
-	cxt->mag_ctl.batch = ctl->batch;
-	cxt->mag_ctl.flush = ctl->flush;
-	cxt->mag_ctl.set_cali = ctl->set_cali;
-	cxt->mag_ctl.is_report_input_direct = ctl->is_report_input_direct;
-	cxt->mag_ctl.is_support_batch = ctl->is_support_batch;
-	cxt->mag_ctl.is_use_common_factory = ctl->is_use_common_factory;
-	memcpy(cxt->mag_ctl.libinfo.libname, ctl->libinfo.libname,
-	       sizeof(cxt->mag_ctl.libinfo.libname));
-	cxt->mag_ctl.libinfo.layout = ctl->libinfo.layout;
-	cxt->mag_ctl.libinfo.deviceid = ctl->libinfo.deviceid;
-
-	if (cxt->mag_ctl.set_delay == NULL || cxt->mag_ctl.enable == NULL ||
-	    cxt->mag_ctl.open_report_data == NULL) {
-		pr_debug("mag register control path fail\n");
-		return -1;
-	}
-
-	/* add misc dev for sensor hal control cmd */
-	err = mag_misc_init(mag_context_obj);
-	if (err) {
-		pr_err("unable to register mag misc device!!\n");
-		return -2;
-	}
-	err = sysfs_create_group(&mag_context_obj->mdev.this_device->kobj,
-				 &mag_attribute_group);
-	if (err < 0) {
-		pr_err("unable to create mag attribute file\n");
-		return -3;
-	}
-
-	kobject_uevent(&mag_context_obj->mdev.this_device->kobj, KOBJ_ADD);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(mag_register_control_path);
-
-static int x1, y1, z1;
-static long pc;
-
-static int check_repeat_data(int x, int y, int z)
-{
-	if ((x1 == x) && (y1 == y) && (z1 == z))
-		pc++;
-	else
-		pc = 0;
-
-	x1 = x;
-	y1 = y;
-	z1 = z;
-
-	if (pc > 100) {
-		pr_debug("Mag sensor output repeat data\n");
-		pc = 0;
-	}
-
-	return 0;
-}
-
-int mag_data_report(struct mag_data *data)
-{
-	/* pr_debug("update!valus: %d, %d, %d, %d\n" , x, y, z, status); */
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	check_repeat_data(data->x, data->y, data->z);
-	event.flush_action = DATA_ACTION;
-	event.status = data->status;
-	event.time_stamp = data->timestamp;
-	event.word[0] = data->x;
-	event.word[1] = data->y;
-	event.word[2] = data->z;
-	event.word[3] = data->reserved[0];
-	event.word[4] = data->reserved[1];
-	event.word[5] = data->reserved[2];
-	event.reserved = data->reserved[0];
-
-	if (event.reserved == 1)
-		mark_timestamp(ID_MAGNETIC, DATA_REPORT, ktime_get_boot_ns(),
-			       event.time_stamp);
-	err = sensor_input_event(mag_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(mag_data_report);
-
-int mag_bias_report(struct mag_data *data)
-{
-	/* pr_debug("update!valus: %d, %d, %d, %d\n" , x, y, z, status); */
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = BIAS_ACTION;
-	event.word[0] = data->x;
-	event.word[1] = data->y;
-	event.word[2] = data->z;
-
-	err = sensor_input_event(mag_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(mag_bias_report);
-
-int mag_cali_report(int32_t *param)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.flush_action = CALI_ACTION;
-	event.word[0] = param[0];
-	event.word[1] = param[1];
-	event.word[2] = param[2];
-	event.word[3] = param[3];
-	event.word[4] = param[4];
-	event.word[5] = param[5];
-
-	err = sensor_input_event(mag_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(mag_cali_report);
-
-int mag_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	pr_debug_ratelimited("flush\n");
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(mag_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(mag_flush_report);
-
-int mag_info_record(struct mag_libinfo_t *p_mag_info)
-{
-	struct mag_context *cxt = NULL;
-	int err = 0;
-
-	cxt = mag_context_obj;
-
-	memcpy(cxt->mag_ctl.libinfo.libname,
-		p_mag_info->libname, sizeof(cxt->mag_ctl.libinfo.libname));
-	cxt->mag_ctl.libinfo.layout = p_mag_info->layout;
-	cxt->mag_ctl.libinfo.deviceid = p_mag_info->deviceid;
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(mag_info_record);
-
-int mag_probe(void)
-{
-	int err;
-
-	pr_debug("%s ++++!!\n", __func__);
-	mag_context_obj = mag_context_alloc_object();
-	if (!mag_context_obj) {
-		err = -ENOMEM;
-		pr_err("unable to allocate devobj!\n");
-		goto exit_alloc_data_failed;
-	}
-
-	/* init real mageleration driver */
-	err = mag_real_driver_init();
-	if (err) {
-		pr_err("mag_real_driver_init fail\n");
-		goto real_driver_init_fail;
-	}
-
-	pr_debug("%s OK !!\n", __func__);
-	return 0;
-
-real_driver_init_fail:
-	kfree(mag_context_obj);
-
-exit_alloc_data_failed:
-
-	pr_err("%s fail !!!\n", __func__);
-	return err;
-}
-EXPORT_SYMBOL_GPL(mag_probe);
-
-int mag_remove(void)
-{
-	int err = 0;
-
-	pr_debug("%s\n", __func__);
-	sysfs_remove_group(&mag_context_obj->mdev.this_device->kobj,
-			   &mag_attribute_group);
-
-	err = sensor_attr_deregister(&mag_context_obj->mdev);
-	if (err)
-		pr_err("misc_deregister fail: %d\n", err);
-
-	kfree(mag_context_obj);
-	platform_driver_unregister(&msensor_driver);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(mag_remove);
-
-static int __init mag_init(void)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static void __exit mag_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(mag_init);
-module_exit(mag_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("MAGELEROMETER device driver");
-MODULE_AUTHOR("Mediatek");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/mag_factory.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/mag_factory.c
deleted file mode 100644
index 7e1619e..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/mag_factory.c
+++ /dev/null
@@ -1,182 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<MAG_FAC> " fmt
-
-#include "inc/mag_factory.h"
-
-struct mag_factory_private {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct mag_factory_fops *fops;
-};
-
-static struct mag_factory_private mag_factory;
-
-static int mag_factory_open(struct inode *inode, struct file *file)
-{
-	file->private_data = mag_context_obj;
-
-	if (file->private_data == NULL) {
-		pr_err("null pointer!!\n");
-		return -EINVAL;
-	}
-	return nonseekable_open(inode, file);
-}
-
-static int mag_factory_release(struct inode *inode, struct file *file)
-{
-	file->private_data = NULL;
-	return 0;
-}
-
-static long mag_factory_unlocked_ioctl(struct file *file, unsigned int cmd,
-				       unsigned long arg)
-{
-	void __user *ptr = (void __user *)arg;
-	int err = 0, status = 0;
-	uint32_t flag = 0;
-	char strbuf[64];
-	int32_t data_buf[3] = {0};
-
-	if (_IOC_DIR(cmd) & _IOC_READ)
-		err = !access_ok(VERIFY_WRITE, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-	else if (_IOC_DIR(cmd) & _IOC_WRITE)
-		err = !access_ok(VERIFY_READ, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-
-	if (err) {
-		pr_err("access error: %08X, (%2d, %2d)\n", cmd,
-			   _IOC_DIR(cmd), _IOC_SIZE(cmd));
-		return -EFAULT;
-	}
-
-	switch (cmd) {
-	case MSENSOR_IOCTL_SENSOR_ENABLE:
-		if (copy_from_user(&flag, ptr, sizeof(flag)))
-			return -EFAULT;
-		if (mag_factory.fops != NULL &&
-		    mag_factory.fops->enable_sensor != NULL) {
-			pr_debug("MSENSOR_ENABLE,en: %d, sample_period:%dms\n",
-				flag, 5);
-			err = mag_factory.fops->enable_sensor(flag, 20);
-			if (err < 0) {
-				pr_err(
-					"MSENSOR_IOCTL_SENSOR_ENABLE fail!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("MSENSOR_IOCTL_SENSOR_ENABLE NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case MSENSOR_IOCTL_READ_SENSORDATA:
-		if (mag_factory.fops != NULL &&
-		    mag_factory.fops->get_data != NULL) {
-			err = mag_factory.fops->get_data(data_buf, &status);
-			if (err < 0) {
-				pr_err(
-					"MSENSOR_READ_SENSORDATA fail!\n");
-				return -EINVAL;
-			}
-			sprintf(strbuf, "%x %x %x", data_buf[0], data_buf[1],
-				data_buf[2]);
-			pr_debug("MSENSOR_IOCTL_READ_SENSORDATA read:(%s)!\n",
-				strbuf);
-			if (copy_to_user(ptr, strbuf, strlen(strbuf) + 1))
-				return -EFAULT;
-		} else {
-			pr_err("MSENSOR_IOCTL_READ_SENSORDATA NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case MSENSOR_IOCTL_SELF_TEST:
-		if (mag_factory.fops != NULL &&
-		    mag_factory.fops->do_self_test != NULL) {
-			err = mag_factory.fops->do_self_test();
-			if (err < 0) {
-				pr_err(
-					"MSENSOR_IOCTL_SELF_TEST fail!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("MSENSOR_IOCTL_SELF_TEST NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	default:
-		pr_debug("unknown IOCTL: 0x%08x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-	return 0;
-}
-
-#if IS_ENABLED(CONFIG_COMPAT)
-static long compat_mag_factory_unlocked_ioctl(struct file *filp,
-					      unsigned int cmd,
-					      unsigned long arg)
-{
-	if (!filp->f_op || !filp->f_op->unlocked_ioctl) {
-		pr_err(
-			"compat_ion_ioctl file has no f_op or no f_op->unlocked_ioctl.\n");
-		return -ENOTTY;
-	}
-
-	switch (cmd) {
-	case COMPAT_MSENSOR_IOCTL_READ_SENSORDATA:
-	case COMPAT_MSENSOR_IOCTL_SENSOR_ENABLE:
-	case COMPAT_MSENSOR_IOCTL_SELF_TEST:
-		pr_debug("compat_ion_ioctl : MSENSOR_IOCTL_XXX is 0x%x\n",
-			cmd);
-		return filp->f_op->unlocked_ioctl(
-			filp, cmd, (unsigned long)compat_ptr(arg));
-	default:
-		pr_err("compat_ion_ioctl : No such command!! 0x%x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-}
-#endif
-
-static const struct file_operations mag_factory_fops = {
-	.open = mag_factory_open,
-	.release = mag_factory_release,
-	.unlocked_ioctl = mag_factory_unlocked_ioctl,
-#if IS_ENABLED(CONFIG_COMPAT)
-	.compat_ioctl = compat_mag_factory_unlocked_ioctl,
-#endif
-};
-
-static struct miscdevice mag_factory_device = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = "msensor",
-	.fops = &mag_factory_fops,
-};
-
-int mag_factory_device_register(struct mag_factory_public *dev)
-{
-	int err = 0;
-
-	if (!dev || !dev->fops)
-		return -1;
-	mag_factory.gain = dev->gain;
-	mag_factory.sensitivity = dev->sensitivity;
-	mag_factory.fops = dev->fops;
-	err = misc_register(&mag_factory_device);
-	if (err) {
-		pr_err("%s register failed\n", __func__);
-		err = -1;
-	}
-	return err;
-}
-EXPORT_SYMBOL_GPL(mag_factory_device_register);
-
-int mag_factory_device_deregister(struct mag_factory_public *dev)
-{
-	mag_factory.fops = NULL;
-	misc_deregister(&mag_factory_device);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(mag_factory_device_deregister);
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/Kconfig
deleted file mode 100644
index f8a2772..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_MAGHUB
-	bool "maghub for MediaTek package"
-	help
-	  It support different maghub sensor.
-	  If this option is set,
-	  it will support
-	  sensorhub gyroscope.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/Makefile
deleted file mode 100644
index 3ec8fd1..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/magnetometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/scp
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT) += maghub.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/maghub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/maghub.c
deleted file mode 100644
index 92e3c0d..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/maghub.c
+++ /dev/null
@@ -1,724 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[Msensor] " fmt
-
-#include <hwmsensor.h>
-#include "maghub.h"
-#include "mag.h"
-#include <SCP_sensorHub.h>
-#include "SCP_power_monitor.h"
-
-#define MAGHUB_DEV_NAME         "mag_hub"
-#define DRIVER_VERSION          "1.0.1"
-
-struct maghub_ipi_data *mag_ipi_data;
-static struct mag_init_info maghub_init_info;
-
-static int maghub_init_flag = -1;
-static DEFINE_SPINLOCK(calibration_lock);
-
-enum {
-	MAG_FUN_DEBUG = 0x01,
-	MAG_MDATA_DEBUG = 0X02,
-	MAG_ODATA_DEBUG = 0X04,
-	MAG_CTR_DEBUG = 0X08,
-	MAG_IPI_DEBUG = 0x10,
-};
-struct maghub_ipi_data {
-	int		direction;
-	int32_t dynamic_cali[MAGHUB_AXES_NUM];
-	int32_t parameter_cali[6];
-	atomic_t	trace;
-	atomic_t	suspend;
-	atomic_t	scp_init_done;
-	atomic_t first_ready_after_boot;
-	atomic_t selftest_status;
-	struct work_struct init_done_work;
-	struct data_unit_t m_data_t;
-	bool factory_enable;
-	bool android_enable;
-	struct sensorInfo_t mag_info;
-	struct completion selftest_done;
-};
-static int maghub_m_setPowerMode(bool enable)
-{
-	int res = 0;
-
-	pr_debug("magnetic enable value = %d\n", enable);
-	res = sensor_enable_to_hub(ID_MAGNETIC, enable);
-	if (res < 0)
-		pr_err("%s is failed!!\n", __func__);
-
-	return res;
-}
-
-static int maghub_GetMData(char *buf, int size)
-{
-	struct maghub_ipi_data *obj = mag_ipi_data;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-	int mag_m[MAGHUB_AXES_NUM];
-	int err = 0;
-	unsigned int status = 0;
-
-	if (atomic_read(&obj->suspend))
-		return -3;
-
-	if (buf == NULL)
-		return -1;
-	err = sensor_get_data_from_hub(ID_MAGNETIC, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!\n");
-		return err;
-	}
-
-	time_stamp				= data.time_stamp;
-	mag_m[MAGHUB_AXIS_X]	= data.magnetic_t.x;
-	mag_m[MAGHUB_AXIS_Y]	= data.magnetic_t.y;
-	mag_m[MAGHUB_AXIS_Z]	= data.magnetic_t.z;
-	status					= data.magnetic_t.status;
-
-	sprintf(buf, "%04x %04x %04x %04x", mag_m[MAGHUB_AXIS_X],
-		mag_m[MAGHUB_AXIS_Y], mag_m[MAGHUB_AXIS_Z], status);
-
-	if (atomic_read(&obj->trace) & MAG_MDATA_DEBUG)
-		pr_debug("RAW DATA: %s!\n", buf);
-
-
-	return 0;
-}
-
-static int maghub_ReadChipInfo(char *buf, int bufsize)
-{
-	if ((!buf) || (bufsize <= MAGHUB_BUFSIZE - 1))
-		return -1;
-
-	sprintf(buf, "maghub Chip");
-	return 0;
-}
-
-static ssize_t chipinfo_show(struct device_driver *ddri, char *buf)
-{
-	char strbuf[MAGHUB_BUFSIZE] = {0};
-
-	maghub_ReadChipInfo(strbuf, MAGHUB_BUFSIZE);
-	return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
-}
-static ssize_t sensordata_show(struct device_driver *ddri,
-	char *buf)
-{
-	char strbuf[MAGHUB_BUFSIZE] = {0};
-
-	maghub_m_setPowerMode(true);
-	msleep(20);
-	maghub_GetMData(strbuf, MAGHUB_BUFSIZE);
-	return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
-}
-static ssize_t trace_show(struct device_driver *ddri, char *buf)
-{
-	ssize_t res = 0;
-	struct maghub_ipi_data *obj = mag_ipi_data;
-
-	if (obj == NULL) {
-		pr_err("maghub_ipi_data is null!!\n");
-		return 0;
-	}
-
-	res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
-	return res;
-}
-static ssize_t trace_store(struct device_driver *ddri,
-	const char *buf, size_t count)
-{
-	struct maghub_ipi_data *obj = mag_ipi_data;
-	int trace = 0;
-	int res = 0;
-
-	if (obj == NULL) {
-		pr_err("maghub_ipi_data is null!!\n");
-		return 0;
-	}
-
-	if (sscanf(buf, "0x%x", &trace) != 1) {
-		pr_err("invalid content: '%s',length = %zu\n", buf, count);
-		return count;
-	}
-	atomic_set(&obj->trace, trace);
-	res = sensor_set_cmd_to_hub(ID_MAGNETIC, CUST_ACTION_SET_TRACE, &trace);
-	if (res < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID:%d),(action:%d)\n",
-			ID_MAGNETIC, CUST_ACTION_SET_TRACE);
-		return 0;
-	}
-
-	return count;
-}
-
-static ssize_t orientation_show(struct device_driver *ddri, char *buf)
-{
-	ssize_t _tLength = 0;
-	struct maghub_ipi_data *obj = mag_ipi_data;
-
-	pr_debug("[%s] default direction: %d\n", __func__, obj->direction);
-
-	_tLength = snprintf(buf, PAGE_SIZE, "default direction = %d\n",
-		obj->direction);
-
-	return _tLength;
-}
-
-static ssize_t orientation_store(struct device_driver *ddri,
-	const char *buf, size_t tCount)
-{
-	int _nDirection = 0, err = 0;
-	struct maghub_ipi_data *obj = mag_ipi_data;
-	int res = 0;
-
-	if (obj == NULL)
-		return 0;
-	err = kstrtoint(buf, 10, &_nDirection);
-
-	if (err != 0) {
-		pr_debug("[%s] set direction: %d\n", __func__, _nDirection);
-		return tCount;
-	}
-
-	obj->direction = _nDirection;
-	res = sensor_set_cmd_to_hub(ID_MAGNETIC,
-		CUST_ACTION_SET_DIRECTION, &_nDirection);
-	if (res < 0) {
-		pr_err("sensor_set_cmd_to_hub fail,(ID:%d),(action:%d)\n",
-			ID_MAGNETIC, CUST_ACTION_SET_DIRECTION);
-		return 0;
-	}
-
-	pr_debug("[%s] set direction: %d\n", __func__, _nDirection);
-
-	return tCount;
-}
-
-static ssize_t regmap_show(struct device_driver *ddri, char *buf)
-{
-
-	ssize_t _tLength = 0;
-
-	return _tLength;
-}
-static DRIVER_ATTR_RO(chipinfo);
-static DRIVER_ATTR_RO(sensordata);
-static DRIVER_ATTR_RW(trace);
-static DRIVER_ATTR_RW(orientation);
-static DRIVER_ATTR_RO(regmap);
-static struct driver_attribute *maghub_attr_list[] = {
-	&driver_attr_chipinfo,
-	&driver_attr_sensordata,
-	&driver_attr_trace,
-	&driver_attr_orientation,
-	&driver_attr_regmap,
-};
-static int maghub_create_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(maghub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++) {
-		err = driver_create_file(driver, maghub_attr_list[idx]);
-		if (err) {
-			pr_err("driver_create_file (%s) = %d\n",
-				maghub_attr_list[idx]->attr.name, err);
-			break;
-		}
-	}
-	return err;
-}
-static int maghub_delete_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(maghub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++)
-		driver_remove_file(driver, maghub_attr_list[idx]);
-
-	return err;
-}
-
-static void scp_init_work_done(struct work_struct *work)
-{
-	int32_t cfg_data[9] = {0};
-	struct maghub_ipi_data *obj = mag_ipi_data;
-	int err = 0;
-	struct mag_libinfo_t mag_libinfo;
-
-	if (atomic_read(&obj->scp_init_done) == 0) {
-		pr_err("scp is not ready to send cmd\n");
-		return;
-	}
-	if (atomic_xchg(&obj->first_ready_after_boot, 1) == 0) {
-		err = sensor_set_cmd_to_hub(ID_MAGNETIC,
-			CUST_ACTION_GET_SENSOR_INFO, &obj->mag_info);
-		if (err < 0) {
-			pr_err("set_cmd_to_hub fail, (ID: %d),(action: %d)\n",
-				ID_MAGNETIC, CUST_ACTION_GET_SENSOR_INFO);
-			return;
-		}
-		strlcpy(mag_libinfo.libname,
-			obj->mag_info.mag_dev_info.libname,
-			sizeof(mag_libinfo.libname));
-		mag_libinfo.layout = obj->mag_info.mag_dev_info.layout;
-		mag_libinfo.deviceid = obj->mag_info.mag_dev_info.deviceid;
-
-		err = mag_info_record(&mag_libinfo);
-		return;
-	}
-
-	spin_lock(&calibration_lock);
-	cfg_data[0] = obj->dynamic_cali[0];
-	cfg_data[1] = obj->dynamic_cali[1];
-	cfg_data[2] = obj->dynamic_cali[2];
-
-	cfg_data[3] = obj->parameter_cali[0];
-	cfg_data[4] = obj->parameter_cali[1];
-	cfg_data[5] = obj->parameter_cali[2];
-	cfg_data[6] = obj->parameter_cali[3];
-	cfg_data[7] = obj->parameter_cali[4];
-	cfg_data[8] = obj->parameter_cali[5];
-	spin_unlock(&calibration_lock);
-	err = sensor_cfg_to_hub(ID_MAGNETIC,
-		(uint8_t *)cfg_data, sizeof(cfg_data));
-			if (err < 0)
-				pr_err("sensor_cfg_to_hub fail\n");
-}
-static int mag_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-	struct mag_data data;
-	struct maghub_ipi_data *obj = mag_ipi_data;
-
-	data.x = event->magnetic_t.x;
-	data.y = event->magnetic_t.y;
-	data.z = event->magnetic_t.z;
-	data.status = event->magnetic_t.status;
-	data.timestamp = (int64_t)event->time_stamp;
-	data.reserved[0] = event->reserve[0];
-
-	if (event->flush_action == DATA_ACTION &&
-		READ_ONCE(obj->android_enable) == true)
-		err = mag_data_report(&data);
-	else if (event->flush_action == FLUSH_ACTION)
-		err = mag_flush_report();
-	else if (event->flush_action == BIAS_ACTION) {
-		data.x = event->magnetic_t.x_bias;
-		data.y = event->magnetic_t.y_bias;
-		data.z = event->magnetic_t.z_bias;
-		err = mag_bias_report(&data);
-		spin_lock(&calibration_lock);
-		obj->dynamic_cali[MAGHUB_AXIS_X] = event->magnetic_t.x_bias;
-		obj->dynamic_cali[MAGHUB_AXIS_Y] = event->magnetic_t.y_bias;
-		obj->dynamic_cali[MAGHUB_AXIS_Z] = event->magnetic_t.z_bias;
-		spin_unlock(&calibration_lock);
-	} else if (event->flush_action == TEST_ACTION) {
-		atomic_set(&obj->selftest_status, event->magnetic_t.status);
-		complete(&obj->selftest_done);
-	} else if (event->flush_action == CALI_ACTION) {
-		err = mag_cali_report(event->data);
-		spin_lock(&calibration_lock);
-		obj->parameter_cali[0] = event->data[0];
-		obj->parameter_cali[1] = event->data[1];
-		obj->parameter_cali[2] = event->data[2];
-		obj->parameter_cali[3] = event->data[3];
-		obj->parameter_cali[4] = event->data[4];
-		obj->parameter_cali[5] = event->data[5];
-		spin_unlock(&calibration_lock);
-	}
-	return err;
-}
-static int maghub_enable(int en)
-{
-	int res = 0;
-	struct maghub_ipi_data *obj = mag_ipi_data;
-
-	if (en == true)
-		WRITE_ONCE(obj->android_enable, true);
-	else
-		WRITE_ONCE(obj->android_enable, false);
-
-	res = maghub_m_setPowerMode(en);
-	if (res)
-		pr_err("maghub_m_setPowerMode is failed!!\n");
-	return res;
-}
-
-static int maghub_set_delay(u64 ns)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	int delayms = 0, err = 0;
-	struct maghub_ipi_data *obj = mag_ipi_data;
-
-	delayms = (int)ns / 1000 / 1000;
-	err = sensor_set_delay_to_hub(ID_MAGNETIC, delayms);
-	if (err < 0) {
-		pr_err("maghub_m_set_delay fail!\n");
-		return err;
-	}
-
-	pr_debug("maghub_m_set_delay (%d)\n", delayms);
-	return err;
-#elif defined CONFIG_NANOHUB
-	return 0;
-#else
-	return 0;
-#endif
-}
-static int maghub_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	maghub_set_delay(samplingPeriodNs);
-#endif
-	return sensor_batch_to_hub(ID_MAGNETIC,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int maghub_flush(void)
-{
-	return sensor_flush_to_hub(ID_MAGNETIC);
-}
-
-static int maghub_set_cali(uint8_t *data, uint8_t count)
-{
-	int32_t *buf = (int32_t *)data;
-	struct maghub_ipi_data *obj = mag_ipi_data;
-
-	spin_lock(&calibration_lock);
-	obj->dynamic_cali[0] = buf[0];
-	obj->dynamic_cali[1] = buf[1];
-	obj->dynamic_cali[2] = buf[2];
-
-	obj->parameter_cali[0] = buf[3];
-	obj->parameter_cali[1] = buf[4];
-	obj->parameter_cali[2] = buf[5];
-	obj->parameter_cali[3] = buf[6];
-	obj->parameter_cali[4] = buf[7];
-	obj->parameter_cali[5] = buf[8];
-	spin_unlock(&calibration_lock);
-	return sensor_cfg_to_hub(ID_MAGNETIC, data, count);
-}
-
-static int maghub_open_report_data(int open)
-{
-	return 0;
-}
-
-static int maghub_get_data(int *x, int *y, int *z, int *status)
-{
-	char buff[MAGHUB_BUFSIZE] = { 0 };
-	int ret;
-
-	ret = maghub_GetMData(buff, MAGHUB_BUFSIZE);
-	if (ret < 0) {
-		pr_err("maghub_GetMData fail, ret:%d\n", ret);
-		return ret;
-	}
-
-	if (sscanf(buff, "%x %x %x %x", x, y, z, status) != 4)
-		pr_err("maghub_m_get_data sscanf fail!!\n");
-	return 0;
-}
-static int scp_ready_event(uint8_t event, void *ptr)
-{
-	struct maghub_ipi_data *obj = mag_ipi_data;
-
-	switch (event) {
-	case SENSOR_POWER_UP:
-	    atomic_set(&obj->scp_init_done, 1);
-		schedule_work(&obj->init_done_work);
-		break;
-	case SENSOR_POWER_DOWN:
-	    atomic_set(&obj->scp_init_done, 0);
-		break;
-	}
-	return 0;
-}
-static struct scp_power_monitor scp_ready_notifier = {
-	.name = "mag",
-	.notifier_call = scp_ready_event,
-};
-static int maghub_factory_enable_sensor(bool enabledisable,
-	int64_t sample_periods_ms)
-{
-	int err = 0;
-	struct maghub_ipi_data *obj = mag_ipi_data;
-
-	if (enabledisable == true)
-		WRITE_ONCE(obj->factory_enable, true);
-	else
-		WRITE_ONCE(obj->factory_enable, false);
-
-	if (enabledisable == 1) {
-		err = sensor_set_delay_to_hub(ID_MAGNETIC, sample_periods_ms);
-		if (err < 0) {
-			pr_err("sensor_set_delay_to_hub fail!\r\n");
-			return -1;
-		}
-	}
-	err = sensor_enable_to_hub(ID_MAGNETIC, enabledisable == true ? 1 : 0);
-	if (err < 0) {
-		pr_err("sensor_enable_to_hub fail!\r\n");
-		return -1;
-	}
-	return 0;
-}
-static int maghub_factory_get_data(int32_t data[3], int *status)
-{
-	int err = 0;
-
-	/* get raw data */
-	err = maghub_get_data(&data[0], &data[1], &data[2], status);
-	data[0] = data[0] / CONVERT_M_DIV;
-	data[1] = data[1] / CONVERT_M_DIV;
-	data[2] = data[2] / CONVERT_M_DIV;
-
-	return err;
-}
-static int maghub_factory_get_raw_data(int32_t data[3])
-{
-	pr_debug("%s do not support!\n", __func__);
-	return 0;
-}
-static int maghub_factory_enable_calibration(void)
-{
-	return 0;
-}
-static int maghub_factory_clear_cali(void)
-{
-	return 0;
-}
-static int maghub_factory_set_cali(int32_t data[3])
-{
-	return 0;
-}
-static int maghub_factory_get_cali(int32_t data[3])
-{
-	return 0;
-}
-static int maghub_factory_do_self_test(void)
-{
-	int ret = 0;
-	struct maghub_ipi_data *obj = mag_ipi_data;
-
-	ret = sensor_selftest_to_hub(ID_MAGNETIC);
-	if (ret < 0)
-		return -1;
-
-	ret = wait_for_completion_timeout(&obj->selftest_done,
-					  msecs_to_jiffies(3000));
-	if (!ret)
-		return -1;
-	return atomic_read(&obj->selftest_status);
-}
-
-static struct mag_factory_fops maghub_factory_fops = {
-	.enable_sensor = maghub_factory_enable_sensor,
-	.get_data = maghub_factory_get_data,
-	.get_raw_data = maghub_factory_get_raw_data,
-	.enable_calibration = maghub_factory_enable_calibration,
-	.clear_cali = maghub_factory_clear_cali,
-	.set_cali = maghub_factory_set_cali,
-	.get_cali = maghub_factory_get_cali,
-	.do_self_test = maghub_factory_do_self_test,
-};
-
-static struct mag_factory_public maghub_factory_device = {
-	.gain = 1,
-	.sensitivity = 1,
-	.fops = &maghub_factory_fops,
-};
-static int maghub_probe(struct platform_device *pdev)
-{
-	int err = 0;
-	struct maghub_ipi_data *data;
-	struct mag_control_path ctl = { 0 };
-	struct mag_data_path mag_data = { 0 };
-
-	struct platform_driver *paddr =
-					maghub_init_info.platform_diver_addr;
-
-	pr_debug("%s\n", __func__);
-	data = kzalloc(sizeof(struct maghub_ipi_data), GFP_KERNEL);
-	if (!data) {
-		err = -ENOMEM;
-		goto exit;
-	}
-	mag_ipi_data = data;
-	atomic_set(&data->trace, 0);
-	atomic_set(&data->selftest_status, 0);
-	WRITE_ONCE(data->factory_enable, false);
-	WRITE_ONCE(data->android_enable, false);
-	init_completion(&data->selftest_done);
-
-	platform_set_drvdata(pdev, data);
-
-	err = scp_sensorHub_data_registration(ID_MAGNETIC, mag_recv_data);
-	if (err < 0) {
-		pr_err("scp_sensorHub_data_registration failed\n");
-		goto exit_kfree;
-	}
-	err = mag_factory_device_register(&maghub_factory_device);
-	if (err) {
-		pr_err("mag_factory_device_register register failed\n");
-		goto exit_kfree;
-	}
-	/* Register sysfs attribute */
-	err = maghub_create_attr(&paddr->driver);
-	if (err) {
-		pr_err("create attribute err = %d\n", err);
-		goto exit_misc_device_register_failed;
-	}
-	ctl.is_use_common_factory = false;
-	ctl.enable = maghub_enable;
-	ctl.set_delay = maghub_set_delay;
-	ctl.batch = maghub_batch;
-	ctl.flush = maghub_flush;
-	ctl.set_cali = maghub_set_cali;
-	ctl.open_report_data = maghub_open_report_data;
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	ctl.is_report_input_direct = true;
-	ctl.is_support_batch = false;
-#elif defined CONFIG_NANOHUB
-	ctl.is_report_input_direct = true;
-	ctl.is_support_batch = true;
-#else
-#endif
-
-	err = mag_register_control_path(&ctl);
-	if (err) {
-		pr_err("register mag control path err\n");
-		goto create_attr_failed;
-	}
-
-	mag_data.div = CONVERT_M_DIV;
-	mag_data.get_data = maghub_get_data;
-
-	err = mag_register_data_path(&mag_data);
-	if (err) {
-		pr_err("register data control path err\n");
-		goto create_attr_failed;
-	}
-	pr_debug("%s: OK\n", __func__);
-	maghub_init_flag = 1;
-	/*Mointor scp ready notify,
-	 *need monitor at the end of probe for two function:
-	 * 1.read mag_info from sensorhub,
-	 * write to mag context
-	 * 2.set cali to sensorhub
-	 */
-	INIT_WORK(&data->init_done_work, scp_init_work_done);
-	scp_power_monitor_register(&scp_ready_notifier);
-
-	return 0;
-
-create_attr_failed:
-	maghub_delete_attr(&(maghub_init_info.platform_diver_addr->driver));
-exit_misc_device_register_failed:
-	mag_factory_device_deregister(&maghub_factory_device);
-exit_kfree:
-	kfree(data);
-exit:
-	pr_err("%s: err = %d\n", __func__, err);
-	maghub_init_flag = -1;
-	return err;
-}
-
-/*----------------------------------------------------------------------------*/
-static int maghub_remove(struct platform_device *pdev)
-{
-	int err = 0;
-	struct platform_driver *paddr =
-					maghub_init_info.platform_diver_addr;
-
-	err = maghub_delete_attr(&paddr->driver);
-	if (err)
-		pr_err("maghub_delete_attr fail: %d\n", err);
-
-	kfree(platform_get_drvdata(pdev));
-	mag_factory_device_deregister(&maghub_factory_device);
-	return 0;
-}
-
-static int maghub_suspend(struct platform_device *pdev, pm_message_t msg)
-{
-	return 0;
-}
-
-static int maghub_resume(struct platform_device *pdev)
-{
-	return 0;
-}
-static struct platform_device maghub_device = {
-	.name = MAGHUB_DEV_NAME,
-	.id = -1,
-};
-
-static struct platform_driver maghub_driver = {
-	.driver = {
-		   .name = MAGHUB_DEV_NAME,
-	},
-	.probe = maghub_probe,
-	.remove = maghub_remove,
-	.suspend = maghub_suspend,
-	.resume = maghub_resume,
-};
-
-static int maghub_local_remove(void)
-{
-	platform_driver_unregister(&maghub_driver);
-	return 0;
-}
-
-static int maghub_local_init(void)
-{
-	if (platform_driver_register(&maghub_driver)) {
-		pr_err("add_driver error\n");
-		return -1;
-	}
-	if (-1 == maghub_init_flag)
-		return -1;
-	return 0;
-}
-static struct mag_init_info maghub_init_info = {
-	.name = "maghub",
-	.init = maghub_local_init,
-	.uninit = maghub_local_remove,
-};
-
-static int __init maghub_init(void)
-{
-	if (platform_device_register(&maghub_device)) {
-		pr_err("platform device error\n");
-		return -1;
-	}
-	mag_driver_add(&maghub_init_info);
-	return 0;
-}
-
-static void __exit maghub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(maghub_init);
-module_exit(maghub_exit);
-
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
-MODULE_DESCRIPTION("MAGHUB compass driver");
-MODULE_LICENSE("GPL");
-MODULE_VERSION(DRIVER_VERSION);
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/maghub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/maghub.h
deleted file mode 100644
index 87c5eb0..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/magnetometer/maghub/maghub.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-/*
- * Definitions for akm09912 compass chip.
- */
-#ifndef MAGHUB_H
-#define MAGHUB_H
-
-#include <linux/ioctl.h>
-#define MAGHUB_AXIS_X          0
-#define MAGHUB_AXIS_Y          1
-#define MAGHUB_AXIS_Z          2
-#define MAGHUB_STATUS          2
-#define MAGHUB_AXES_NUM        3
-#define MAGHUB_DATA_LEN        6
-
-#define MAGHUB_SUCCESS             0
-
-#define MAGHUB_BUFSIZE 60
-
-#define CONVERT_M_DIV		100
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/Kconfig
deleted file mode 100644
index 03b6094..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/Kconfig
+++ /dev/null
@@ -1,14 +0,0 @@
-
-config CUSTOM_KERNEL_SENSORHUB
-	bool "CUSTOM KERNEL SENSORHUB support"
-	help
-	  Kernel space sensor hub driver.
-	  Define project used all sensor hub
-	  sensors. The value is combination of sensor hub driver(get data...etc)
-	  and sensor hub framework driver(transmit shf info)
-
-#source "drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_sensorHub/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_sensorHub_v1/Kconfig"
-#source "drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_shf/Kconfig"
-
-source "drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/Kconfig"
\ No newline at end of file
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/Makefile
deleted file mode 100644
index b77ad0c..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# Copyright (C) 2015 MediaTek Inc.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-
-# In case the platform does NOT support this type of sensors
-#obj-$(CONFIG_MTK_SCP_SENSORHUB) += SCP_sensorHub/
-#obj-$(CONFIG_MTK_SENSOR_HUB_SUPPORT) += SCP_shf/
-#obj-$(CONFIG_MTK_SCP_SENSORHUB_V1) += SCP_sensorHub_v1/
-
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/scp
-#ccflags-y += -I$(srctree)/arch/arm/mach-mt2601/pike/dct/dct
-
-ifeq ($(CONFIG_NANOHUB), y)
-obj-$(CONFIG_MTK_SENSOR_SUPPORT) += sensorHub.o
-
-sensorHub-$(CONFIG_NANOHUB_MTK_IPI) := nanohub/main.o \
-            nanohub/bl.o nanohub/comms.o
-sensorHub-$(CONFIG_NANOHUB_MTK_IPI) += nanohub/nanohub-mtk.o
-
-sensorHub-$(CONFIG_NANOHUB_MTK_IPI) += SCP_nanoHub/SCP_nanoHub.o \
-        SCP_power_monitor/SCP_power_monitor.o
-endif
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_nanoHub/SCP_nanoHub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_nanoHub/SCP_nanoHub.c
deleted file mode 100644
index ed0292e..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_nanoHub/SCP_nanoHub.c
+++ /dev/null
@@ -1,2534 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2016 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[sensorHub] " fmt
-
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kthread.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/dma-mapping.h>
-#include <linux/atomic.h>
-#include <linux/types.h>
-#include <linux/module.h>
-#include <asm/arch_timer.h>
-#include <linux/pm_wakeup.h>
-#include <linux/suspend.h>
-#include <linux/time.h>
-#include "include/scp.h"
-#include "cust_sensorHub.h"
-#include "hwmsensor.h"
-#include "sensors_io.h"
-#include "SCP_sensorHub.h"
-#include "hwmsen_helper.h"
-#include "comms.h"
-#include "sensor_event.h"
-#include "sensor_performance.h"
-#include "SCP_power_monitor.h"
-#include <asm/arch_timer.h>
-#include <linux/math64.h>
-#include <linux/timekeeping.h>
-#include <uapi/linux/sched/types.h>
-
-/* ALGIN TO SCP SENSOR_IPI_SIZE AT FILE CONTEXTHUB_FW.H, ALGIN
- * TO SCP_SENSOR_HUB_DATA UNION, ALGIN TO STRUCT DATA_UNIT_T
- * SIZEOF(STRUCT DATA_UNIT_T) = SCP_SENSOR_HUB_DATA = SENSOR_IPI_SIZE
- * BUT AT THE MOMENT AP GET DATA THROUGH IPI, WE ONLY TRANSFER
- * 44 BYTES DATA_UNIT_T, THERE ARE 4 BYTES HEADER IN SCP_SENSOR_HUB_DATA
- * HEAD
- */
-#define SENSOR_IPI_SIZE 48
-/*
- * experience number for delay_count per DELAY_COUNT sensor input delay 10ms
- * msleep(10) system will schedule to hal process then read input node
- */
-#define SENSOR_IPI_HEADER_SIZE 4
-#define SENSOR_IPI_PACKET_SIZE (SENSOR_IPI_SIZE - SENSOR_IPI_HEADER_SIZE)
-#define SENSOR_DATA_SIZE 44
-
-#if SENSOR_DATA_SIZE > SENSOR_IPI_PACKET_SIZE
-#error "SENSOR_DATA_SIZE > SENSOR_IPI_PACKET_SIZE, out of memory"
-#endif
-
-#define SYNC_TIME_CYCLC 10000
-#define SYNC_TIME_START_CYCLC 3000
-#define SCP_sensorHub_DEV_NAME "SCP_sensorHub"
-
-#define CHRE_POWER_RESET_NOTIFY
-
-static int sensor_send_timestamp_to_hub(void);
-static int SCP_sensorHub_server_dispatch_data(uint32_t *currWp);
-static int SCP_sensorHub_init_flag = -1;
-static uint8_t rtc_compensation_suspend;
-struct curr_wp_queue {
-	spinlock_t buffer_lock;
-	uint32_t head;
-	uint32_t tail;
-	uint32_t bufsize;
-	uint32_t *ringbuffer;
-};
-
-struct SCP_sensorHub_data {
-	/* struct work_struct power_up_work; */
-
-	struct sensorHub_hw *hw;
-	struct work_struct direct_push_work;
-	struct workqueue_struct	*direct_push_workqueue;
-	struct timer_list sync_time_timer;
-	struct work_struct sync_time_worker;
-	struct wakeup_source *ws;
-
-	struct sensorFIFO *SCP_sensorFIFO;
-	struct curr_wp_queue wp_queue;
-	phys_addr_t shub_dram_phys;
-	phys_addr_t shub_dram_virt;
-	SCP_sensorHub_handler dispatch_data_cb[ID_SENSOR_MAX_HANDLE_PLUS_ONE];
-	atomic_t traces[ID_SENSOR_MAX_HANDLE_PLUS_ONE];
-};
-static struct SensorState mSensorState[SENSOR_TYPE_MAX_NUM_PLUS_ONE];
-static DEFINE_MUTEX(mSensorState_mtx);
-static DEFINE_MUTEX(flush_mtx);
-static atomic_t power_status = ATOMIC_INIT(SENSOR_POWER_DOWN);
-static DECLARE_WAIT_QUEUE_HEAD(chre_kthread_wait);
-static DECLARE_WAIT_QUEUE_HEAD(power_reset_wait);
-static uint8_t chre_kthread_wait_condition;
-static DEFINE_SPINLOCK(scp_state_lock);
-static uint8_t scp_system_ready;
-static uint8_t scp_chre_ready;
-static struct SCP_sensorHub_data *obj_data;
-
-/* arch counter is 13M, mult is 161319385, shift is 21 */
-static inline uint64_t arch_counter_to_ns(uint64_t cyc)
-{
-#define ARCH_TIMER_MULT 161319385
-#define ARCH_TIMER_SHIFT 21
-	return (cyc * ARCH_TIMER_MULT) >> ARCH_TIMER_SHIFT;
-}
-
-#define FILTER_DATAPOINTS	16
-#define FILTER_TIMEOUT		10000000000ULL /* 10 seconds, ~100us drift */
-#define FILTER_FREQ			10000000ULL /* 10 ms */
-struct moving_average {
-	uint64_t last_time;
-	int64_t input[FILTER_DATAPOINTS];
-	atomic64_t output;
-	uint8_t cnt;
-	uint8_t tail;
-};
-static struct moving_average moving_average_algo;
-static uint8_t rtc_compensation_suspend;
-static void moving_average_filter(struct moving_average *filter,
-		uint64_t ap_time, uint64_t hub_time)
-{
-	int i = 0;
-	int64_t avg = 0;
-	int64_t ret_avg = 0;
-
-	if (ap_time > filter->last_time + FILTER_TIMEOUT ||
-		filter->last_time == 0) {
-		filter->tail = 0;
-		filter->cnt = 0;
-	} else if (ap_time < filter->last_time + FILTER_FREQ) {
-		return;
-	}
-	filter->last_time = ap_time;
-
-	filter->input[filter->tail++] = ap_time - hub_time;
-	filter->tail &= (FILTER_DATAPOINTS - 1);
-	if (filter->cnt < FILTER_DATAPOINTS)
-		filter->cnt++;
-
-	/* pr_err("hongxu raw_offset=%lld\n", ap_time - hub_time); */
-
-	for (i = 1, avg = 0; i < filter->cnt; i++)
-		avg += (filter->input[i] - filter->input[0]);
-	ret_avg = div_s64(avg, filter->cnt) + filter->input[0];
-	atomic64_set(&filter->output, ret_avg);
-}
-
-static uint64_t get_filter_output(struct moving_average *filter)
-{
-	return atomic64_read(&filter->output);
-}
-
-struct SCP_sensorHub_Cmd {
-	uint32_t reason;
-	void (*handler)(union SCP_SENSOR_HUB_DATA *rsp, int rx_len);
-};
-
-#define SCP_SENSORHUB_CMD(_reason, _handler) \
-	{.reason = _reason, .handler = _handler}
-
-struct ipi_master {
-	spinlock_t		    lock;
-	struct list_head	queue;
-	struct workqueue_struct	*workqueue;
-	struct work_struct	work;
-};
-
-struct ipi_transfer {
-	const unsigned char	*tx_buf;
-	unsigned char		rx_buf[SENSOR_IPI_SIZE];
-	unsigned int		len;
-	struct list_head transfer_list;
-};
-
-struct ipi_message {
-	struct list_head	transfers;
-	struct list_head	queue;
-	void			*context;
-	int				status;
-	void			(*complete)(void *context);
-};
-
-struct scp_send_ipi {
-	struct completion	 done;
-	int			 len;
-	int			 count;
-	/* data buffers */
-	const unsigned char	*tx;
-	unsigned char		*rx;
-	void			*context;
-};
-
-static struct scp_send_ipi txrx_cmd;
-static DEFINE_SPINLOCK(txrx_cmd_lock);
-static struct ipi_master master;
-
-static inline void ipi_message_init(struct ipi_message *m)
-{
-	memset(m, 0, sizeof(*m));
-	INIT_LIST_HEAD(&m->transfers);
-}
-
-static inline void ipi_message_add_tail(struct ipi_transfer *t,
-	struct ipi_message *m)
-{
-	list_add_tail(&t->transfer_list, &m->transfers);
-}
-
-static int ipi_txrx_bufs(struct ipi_transfer *t)
-{
-	int status = 0, retry = 0;
-	int timeout;
-	unsigned long flags;
-	struct scp_send_ipi *hw = &txrx_cmd;
-
-	/* union SCP_SENSOR_HUB_DATA *req =
-	 *		(union SCP_SENSOR_HUB_DATA *)t->tx_buf;
-	 * pr_err("sensorType:%d, action:%d\n",
-	 *req->req.sensorType, req->req.action);
-	 */
-	spin_lock_irqsave(&txrx_cmd_lock, flags);
-	hw->tx = t->tx_buf;
-	hw->rx = t->rx_buf;
-	hw->len = t->len;
-
-	init_completion(&hw->done);
-	hw->context = &hw->done;
-	spin_unlock_irqrestore(&txrx_cmd_lock, flags);
-	do {
-		status = scp_ipi_send(IPI_SENSOR,
-			(unsigned char *)hw->tx, hw->len, 0, SCP_A_ID);
-		if (status == SCP_IPI_ERROR) {
-			pr_err("scp_ipi_send fail\n");
-			return -1;
-		}
-		if (status == SCP_IPI_BUSY) {
-			if (retry++ == 1000) {
-				pr_err("retry fail\n");
-				return -1;
-			}
-			if (retry % 100 == 0)
-				usleep_range(1000, 2000);
-		}
-	} while (status == SCP_IPI_BUSY);
-
-	if (retry >= 100)
-		pr_debug("retry time:%d\n", retry);
-
-	timeout = wait_for_completion_timeout(&hw->done, msecs_to_jiffies(500));
-	spin_lock_irqsave(&txrx_cmd_lock, flags);
-	if (!timeout) {
-		pr_err("transfer timeout!");
-		hw->count = -1;
-	}
-	hw->context = NULL;
-	spin_unlock_irqrestore(&txrx_cmd_lock, flags);
-	return hw->count;
-}
-
-static void ipi_complete(void *arg)
-{
-	complete(arg);
-}
-
-static void ipi_work(struct work_struct *work)
-{
-	struct ipi_message	*m, *_m;
-	struct ipi_transfer	*t = NULL;
-	int			status = 0;
-
-	spin_lock(&master.lock);
-	list_for_each_entry_safe(m, _m, &master.queue, queue) {
-		list_del(&m->queue);
-		spin_unlock(&master.lock);
-		list_for_each_entry(t, &m->transfers, transfer_list) {
-			if (!t->tx_buf && t->len) {
-				status = -EINVAL;
-				pr_err("transfer param wrong :%d\n",
-					status);
-				break;
-			}
-			if (t->len)
-				status = ipi_txrx_bufs(t);
-			if (status < 0) {
-				status = -EREMOTEIO;
-				/* pr_err("transfer err :%d\n", status); */
-				break;
-			} else if (status != t->len) {
-				status = -EREMOTEIO;
-				pr_err("ack err :%d\n", status);
-				break;
-			}
-			status = 0;
-		}
-		m->status = status;
-		m->complete(m->context);
-		spin_lock(&master.lock);
-	}
-	spin_unlock(&master.lock);
-}
-
-static int __ipi_transfer(struct ipi_message *m)
-{
-	m->status = -EINPROGRESS;
-
-	spin_lock(&master.lock);
-	list_add_tail(&m->queue, &master.queue);
-	queue_work(master.workqueue, &master.work);
-	spin_unlock(&master.lock);
-	return 0;
-}
-
-static int __ipi_xfer(struct ipi_message *message)
-{
-	DECLARE_COMPLETION_ONSTACK(done);
-	int status;
-
-	message->complete = ipi_complete;
-	message->context = &done;
-
-	status = __ipi_transfer(message);
-
-	if (status == 0) {
-		wait_for_completion(&done);
-		status = message->status;
-	}
-	message->context = NULL;
-	return status;
-}
-
-static int scp_ipi_txrx(const unsigned char *txbuf, unsigned int n_tx,
-	unsigned char *rxbuf, unsigned int n_rx)
-{
-	struct ipi_transfer t;
-	struct ipi_message	m;
-	int status = 0;
-
-	t.tx_buf = txbuf,
-	t.len = n_tx,
-
-	ipi_message_init(&m);
-	ipi_message_add_tail(&t, &m);
-	status =  __ipi_xfer(&m);
-	if (status == 0)
-		memcpy(rxbuf, t.rx_buf, n_rx);
-	return status;
-}
-
-static int SCP_sensorHub_ipi_txrx(unsigned char *txrxbuf)
-{
-	return scp_ipi_txrx(txrxbuf,
-		SENSOR_IPI_SIZE, txrxbuf, SENSOR_IPI_SIZE);
-}
-
-static int SCP_sensorHub_ipi_master_init(void)
-{
-	INIT_WORK(&master.work, ipi_work);
-	INIT_LIST_HEAD(&master.queue);
-	spin_lock_init(&master.lock);
-	master.workqueue = create_singlethread_workqueue("ipi_master");
-	if (master.workqueue == NULL) {
-		pr_err("workqueue fail\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-int scp_sensorHub_req_send(union SCP_SENSOR_HUB_DATA *data,
-	uint *len, unsigned int wait)
-{
-	int ret = 0;
-
-	/* pr_err("sensorType = %d, action = %d\n", data->req.sensorType,
-	 *	data->req.action);
-	 */
-
-	if (*len > SENSOR_IPI_SIZE) {
-		pr_err("over sensor data size!!\n");
-		return -1;
-	}
-
-	if (in_interrupt()) {
-		pr_err("Can't do %s in interrupt context!!\n", __func__);
-		return -1;
-	}
-
-	if (data->rsp.sensorType > ID_SENSOR_MAX_HANDLE) {
-		pr_err("SCP_sensorHub_IPI_handler invalid sensor type %d\n",
-			data->rsp.sensorType);
-		return -1;
-	}
-	ret = SCP_sensorHub_ipi_txrx((unsigned char *)data);
-	if (ret != 0 || data->rsp.errCode != 0)
-		return -1;
-	return 0;
-}
-
-int scp_sensorHub_data_registration(uint8_t sensor,
-	SCP_sensorHub_handler handler)
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-
-	if (sensor > ID_SENSOR_MAX_HANDLE) {
-		pr_err("SCP_sensorHub_rsp_registration invalid sensor %d\n",
-			sensor);
-		return -1;
-	}
-
-	if (handler == NULL)
-		pr_err("SCP_sensorHub_rsp_registration null handler\n");
-
-	obj->dispatch_data_cb[sensor] = handler;
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(scp_sensorHub_data_registration);
-
-static void SCP_sensorHub_write_wp_queue(union SCP_SENSOR_HUB_DATA *rsp)
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-	struct curr_wp_queue *wp_queue = &obj->wp_queue;
-
-	spin_lock(&wp_queue->buffer_lock);
-	wp_queue->ringbuffer[wp_queue->head++] = rsp->notify_rsp.currWp;
-	wp_queue->head &= wp_queue->bufsize - 1;
-	if (unlikely(wp_queue->head == wp_queue->tail))
-		pr_err("dropped currWp due to ringbuffer is full\n");
-	spin_unlock(&wp_queue->buffer_lock);
-}
-static int SCP_sensorHub_fetch_next_wp(uint32_t *currWp)
-{
-	int have_event;
-	struct SCP_sensorHub_data *obj = obj_data;
-	struct curr_wp_queue *wp_queue = &obj->wp_queue;
-
-	spin_lock_irq(&wp_queue->buffer_lock);
-
-	have_event = wp_queue->head != wp_queue->tail;
-	if (have_event) {
-		*currWp = wp_queue->ringbuffer[wp_queue->tail++];
-		wp_queue->tail &= wp_queue->bufsize - 1;
-	}
-	spin_unlock_irq(&wp_queue->buffer_lock);
-	/* pr_err("head:%d, tail:%d, currWp:%d\n",
-	 * wp_queue->head, wp_queue->tail, *currWp);
-	 */
-	return have_event;
-}
-static int SCP_sensorHub_read_wp_queue(void)
-{
-	uint32_t currWp = 0;
-
-	while (SCP_sensorHub_fetch_next_wp(&currWp)) {
-		if (SCP_sensorHub_server_dispatch_data(&currWp))
-			return -EFAULT;
-	}
-	return 0;
-}
-static void SCP_sensorHub_sync_time_work(struct work_struct *work)
-
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-
-	sensor_send_timestamp_to_hub();
-	mod_timer(&obj->sync_time_timer,
-		jiffies +  msecs_to_jiffies(SYNC_TIME_CYCLC));
-}
-
-static void SCP_sensorHub_sync_time_func(struct timer_list *t)
-{
-	struct SCP_sensorHub_data *obj = from_timer(obj, t, sync_time_timer);
-
-	schedule_work(&obj->sync_time_worker);
-}
-
-static int SCP_sensorHub_direct_push_work(void *data)
-{
-	for (;;) {
-		wait_event(chre_kthread_wait,
-			READ_ONCE(chre_kthread_wait_condition));
-		WRITE_ONCE(chre_kthread_wait_condition, false);
-		mark_timestamp(0, WORK_START, ktime_get_boot_ns(), 0);
-		SCP_sensorHub_read_wp_queue();
-	}
-	return 0;
-}
-
-static void SCP_sensorHub_xcmd_putdata(union SCP_SENSOR_HUB_DATA *rsp,
-			int rx_len)
-{
-	union SCP_SENSOR_HUB_DATA *req;
-	struct scp_send_ipi *hw = &txrx_cmd;
-
-	spin_lock(&txrx_cmd_lock);
-	if (!hw->context) {
-		pr_err("after ipi timeout ack occur then dropped this\n");
-		goto out;
-	}
-
-	req = (union SCP_SENSOR_HUB_DATA *)hw->tx;
-
-	if (req->req.sensorType != rsp->rsp.sensorType ||
-		req->req.action != rsp->rsp.action) {
-		pr_debug("req type %d != rsp %d req action %d != rsq %d\n",
-			req->req.sensorType, rsp->rsp.sensorType,
-			req->req.action, rsp->rsp.action);
-	} else {
-		memcpy(hw->rx, rsp, rx_len);
-		hw->count = rx_len;
-		complete(hw->context);
-	}
-out:
-	spin_unlock(&txrx_cmd_lock);
-}
-
-static void SCP_sensorHub_enable_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-					int rx_len)
-{
-	SCP_sensorHub_xcmd_putdata(rsp, rx_len);
-}
-static void SCP_sensorHub_set_delay_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-						int rx_len)
-{
-	SCP_sensorHub_xcmd_putdata(rsp, rx_len);
-}
-static void SCP_sensorHub_get_data_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-						int rx_len)
-{
-	SCP_sensorHub_xcmd_putdata(rsp, rx_len);
-}
-static void SCP_sensorHub_batch_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-					int rx_len)
-{
-	SCP_sensorHub_xcmd_putdata(rsp, rx_len);
-}
-static void SCP_sensorHub_set_cfg_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-					int rx_len)
-{
-	SCP_sensorHub_xcmd_putdata(rsp, rx_len);
-}
-static void SCP_sensorHub_set_cust_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-						int rx_len)
-{
-	SCP_sensorHub_xcmd_putdata(rsp, rx_len);
-}
-static void
-SCP_sensorHub_batch_timeout_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-					int rx_len)
-{
-	SCP_sensorHub_xcmd_putdata(rsp, rx_len);
-}
-static void
-SCP_sensorHub_set_timestamp_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-					int rx_len)
-{
-	SCP_sensorHub_xcmd_putdata(rsp, rx_len);
-}
-
-static void SCP_sensorHub_moving_average(union SCP_SENSOR_HUB_DATA *rsp)
-{
-	uint64_t ap_now_time = 0, arch_counter = 0;
-	uint64_t scp_raw_time = 0, scp_now_time = 0;
-	uint64_t ipi_transfer_time = 0;
-
-	/* if (!timekeeping_rtc_skipresume()) {
-	 *	if (READ_ONCE(rtc_compensation_suspend))
-	 *	return;
-	 * }
-	 */
-	ap_now_time = ktime_get_boot_ns();
-	arch_counter = arch_counter_get_cntvct();
-	scp_raw_time = rsp->notify_rsp.scp_timestamp;
-	ipi_transfer_time = arch_counter_to_ns(arch_counter -
-		rsp->notify_rsp.arch_counter);
-	scp_now_time = scp_raw_time + ipi_transfer_time;
-	moving_average_filter(&moving_average_algo, ap_now_time, scp_now_time);
-}
-static void SCP_sensorHub_notify_cmd(union SCP_SENSOR_HUB_DATA *rsp,
-	int rx_len)
-{
-	/* struct SCP_sensorHub_data *obj = obj_data; */
-	/*
-	 *struct data_unit_t *event;
-	 *int handle = 0;
-	 */
-
-	unsigned long flags = 0;
-
-	switch (rsp->notify_rsp.event) {
-	case SCP_DIRECT_PUSH:
-	case SCP_FIFO_FULL:
-		mark_timestamp(0, GOT_IPI, ktime_get_boot_ns(), 0);
-		mark_ipi_timestamp(arch_counter_get_cntvct() -
-			rsp->notify_rsp.arch_counter);
-#ifdef DEBUG_PERFORMANCE_HW_TICK
-		pr_notice("[Performance] AP_get_ipi Stanley kernel tick:%llu\n",
-			arch_counter_get_cntvct());
-
-#endif
-		SCP_sensorHub_moving_average(rsp);
-		SCP_sensorHub_write_wp_queue(rsp);
-		/* queue_work(obj->direct_push_workqueue,
-		 * &obj->direct_push_work);
-		 */
-		WRITE_ONCE(chre_kthread_wait_condition, true);
-		wake_up(&chre_kthread_wait);
-		break;
-	case SCP_NOTIFY:
-/*
- *		handle = rsp->rsp.sensorType;
- *		if (handle > ID_SENSOR_MAX_HANDLE) {
- *			pr_err("invalid sensor %d\n", handle);
- *		} else {
- *			event = (struct data_unit_t *)rsp->notify_rsp.int8_Data;
- *			if (obj->dispatch_data_cb[handle] != NULL)
- *				obj->dispatch_data_cb[handle](event, NULL);
- *			else
- *				pr_err("type:%d don't support this flow?\n",
- *					handle);
- *			if (event->flush_action == FLUSH_ACTION)
- *				atomic_dec(&mSensorState[handle].flushCnt);
- *		}
- */
-		break;
-	case SCP_INIT_DONE:
-		spin_lock_irqsave(&scp_state_lock, flags);
-		WRITE_ONCE(scp_chre_ready, true);
-		if (READ_ONCE(scp_system_ready) && READ_ONCE(scp_chre_ready)) {
-			spin_unlock_irqrestore(&scp_state_lock, flags);
-			atomic_set(&power_status, SENSOR_POWER_UP);
-			scp_power_monitor_notify(SENSOR_POWER_UP, NULL);
-			/* schedule_work(&obj->power_up_work); */
-			wake_up(&power_reset_wait);
-		} else
-			spin_unlock_irqrestore(&scp_state_lock, flags);
-		break;
-	default:
-		break;
-	}
-}
-
-static const struct SCP_sensorHub_Cmd SCP_sensorHub_Cmds[] = {
-	SCP_SENSORHUB_CMD(SENSOR_HUB_ACTIVATE,
-		SCP_sensorHub_enable_cmd),
-	SCP_SENSORHUB_CMD(SENSOR_HUB_SET_DELAY,
-		SCP_sensorHub_set_delay_cmd),
-	SCP_SENSORHUB_CMD(SENSOR_HUB_GET_DATA,
-		SCP_sensorHub_get_data_cmd),
-	SCP_SENSORHUB_CMD(SENSOR_HUB_BATCH,
-		SCP_sensorHub_batch_cmd),
-	SCP_SENSORHUB_CMD(SENSOR_HUB_SET_CONFIG,
-		SCP_sensorHub_set_cfg_cmd),
-	SCP_SENSORHUB_CMD(SENSOR_HUB_SET_CUST,
-		SCP_sensorHub_set_cust_cmd),
-	SCP_SENSORHUB_CMD(SENSOR_HUB_BATCH_TIMEOUT,
-		SCP_sensorHub_batch_timeout_cmd),
-	SCP_SENSORHUB_CMD(SENSOR_HUB_SET_TIMESTAMP,
-		SCP_sensorHub_set_timestamp_cmd),
-	SCP_SENSORHUB_CMD(SENSOR_HUB_NOTIFY,
-		SCP_sensorHub_notify_cmd),
-};
-
-const struct SCP_sensorHub_Cmd *
-	SCP_sensorHub_find_cmd(uint32_t packetReason)
-{
-	int i;
-	const struct SCP_sensorHub_Cmd *cmd;
-
-	for (i = 0; i < ARRAY_SIZE(SCP_sensorHub_Cmds); i++) {
-		cmd = &SCP_sensorHub_Cmds[i];
-		if (cmd->reason == packetReason)
-			return cmd;
-	}
-	return NULL;
-}
-
-static void SCP_sensorHub_IPI_handler(int id,
-	void *data, unsigned int len)
-{
-	union SCP_SENSOR_HUB_DATA *rsp = (union SCP_SENSOR_HUB_DATA *) data;
-	const struct SCP_sensorHub_Cmd *cmd;
-
-	if (len > SENSOR_IPI_SIZE) {
-		pr_err("%s len=%d error\n", __func__, len);
-		return;
-	}
-	/*pr_err("sensorType:%d, action=%d event:%d len:%d\n",
-	 * rsp->rsp.sensorType, rsp->rsp.action, rsp->notify_rsp.event, len);
-	 */
-	cmd = SCP_sensorHub_find_cmd(rsp->rsp.action);
-	if (cmd != NULL)
-		cmd->handler(rsp, len);
-	else
-		pr_err("cannot find cmd!\n");
-}
-
-static void SCP_sensorHub_init_sensor_state(void)
-{
-	mSensorState[SENSOR_TYPE_ACCELEROMETER].sensorType =
-		SENSOR_TYPE_ACCELEROMETER;
-	mSensorState[SENSOR_TYPE_ACCELEROMETER].timestamp_filter = true;
-#ifdef CONFIG_MTK_UNCALI_ACCHUB
-	mSensorState[SENSOR_TYPE_ACCELEROMETER].alt =
-		SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED;
-	mSensorState[SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED].sensorType =
-		SENSOR_TYPE_ACCELEROMETER;
-	mSensorState[SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED].alt =
-		SENSOR_TYPE_ACCELEROMETER;
-	mSensorState[SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED].timestamp_filter =
-		true;
-#endif
-
-	mSensorState[SENSOR_TYPE_GYROSCOPE].sensorType = SENSOR_TYPE_GYROSCOPE;
-	mSensorState[SENSOR_TYPE_GYROSCOPE].timestamp_filter = true;
-#ifdef CONFIG_MTK_UNCALI_GYROHUB
-	mSensorState[SENSOR_TYPE_GYROSCOPE].alt =
-		SENSOR_TYPE_GYROSCOPE_UNCALIBRATED;
-	mSensorState[SENSOR_TYPE_GYROSCOPE_UNCALIBRATED].sensorType =
-		SENSOR_TYPE_GYROSCOPE;
-	mSensorState[SENSOR_TYPE_GYROSCOPE_UNCALIBRATED].alt =
-		SENSOR_TYPE_GYROSCOPE;
-	mSensorState[SENSOR_TYPE_GYROSCOPE_UNCALIBRATED].timestamp_filter =
-		true;
-#endif
-
-	mSensorState[SENSOR_TYPE_MAGNETIC_FIELD].sensorType =
-		SENSOR_TYPE_MAGNETIC_FIELD;
-	mSensorState[SENSOR_TYPE_MAGNETIC_FIELD].timestamp_filter = true;
-#ifdef CONFIG_MTK_UNCALI_MAGHUB
-	mSensorState[SENSOR_TYPE_MAGNETIC_FIELD].alt =
-		SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED;
-	mSensorState[SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED].sensorType =
-		SENSOR_TYPE_MAGNETIC_FIELD;
-	mSensorState[SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED].alt =
-		SENSOR_TYPE_MAGNETIC_FIELD;
-	mSensorState[SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED].timestamp_filter =
-		true;
-#endif
-
-	mSensorState[SENSOR_TYPE_LIGHT].sensorType = SENSOR_TYPE_LIGHT;
-	mSensorState[SENSOR_TYPE_LIGHT].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_PROXIMITY].sensorType = SENSOR_TYPE_PROXIMITY;
-	mSensorState[SENSOR_TYPE_PROXIMITY].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_PRESSURE].sensorType = SENSOR_TYPE_PRESSURE;
-	mSensorState[SENSOR_TYPE_PRESSURE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_ORIENTATION].sensorType =
-		SENSOR_TYPE_ORIENTATION;
-	mSensorState[SENSOR_TYPE_ORIENTATION].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_ROTATION_VECTOR].sensorType =
-		SENSOR_TYPE_ROTATION_VECTOR;
-	mSensorState[SENSOR_TYPE_ROTATION_VECTOR].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_GAME_ROTATION_VECTOR].sensorType =
-		SENSOR_TYPE_GAME_ROTATION_VECTOR;
-	mSensorState[SENSOR_TYPE_GAME_ROTATION_VECTOR].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR].sensorType =
-		SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR;
-	mSensorState[SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR].timestamp_filter =
-		true;
-
-	mSensorState[SENSOR_TYPE_LINEAR_ACCELERATION].sensorType =
-		SENSOR_TYPE_LINEAR_ACCELERATION;
-	mSensorState[SENSOR_TYPE_LINEAR_ACCELERATION].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_GRAVITY].sensorType = SENSOR_TYPE_GRAVITY;
-	mSensorState[SENSOR_TYPE_GRAVITY].timestamp_filter = true;
-
-	mSensorState[SENSOR_TYPE_SIGNIFICANT_MOTION].sensorType =
-		SENSOR_TYPE_SIGNIFICANT_MOTION;
-	mSensorState[SENSOR_TYPE_SIGNIFICANT_MOTION].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_SIGNIFICANT_MOTION].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_STEP_COUNTER].sensorType =
-		SENSOR_TYPE_STEP_COUNTER;
-	mSensorState[SENSOR_TYPE_STEP_COUNTER].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_STEP_COUNTER].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_STEP_DETECTOR].sensorType =
-		SENSOR_TYPE_STEP_DETECTOR;
-	mSensorState[SENSOR_TYPE_STEP_DETECTOR].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_STEP_DETECTOR].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_TILT_DETECTOR].sensorType =
-		SENSOR_TYPE_TILT_DETECTOR;
-	mSensorState[SENSOR_TYPE_TILT_DETECTOR].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_TILT_DETECTOR].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_IN_POCKET].sensorType = SENSOR_TYPE_IN_POCKET;
-	mSensorState[SENSOR_TYPE_IN_POCKET].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_IN_POCKET].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_ACTIVITY].sensorType = SENSOR_TYPE_ACTIVITY;
-	mSensorState[SENSOR_TYPE_ACTIVITY].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_GLANCE_GESTURE].sensorType =
-		SENSOR_TYPE_GLANCE_GESTURE;
-	mSensorState[SENSOR_TYPE_GLANCE_GESTURE].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_GLANCE_GESTURE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_PICK_UP_GESTURE].sensorType =
-		SENSOR_TYPE_PICK_UP_GESTURE;
-	mSensorState[SENSOR_TYPE_PICK_UP_GESTURE].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_PICK_UP_GESTURE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_WAKE_GESTURE].sensorType =
-		SENSOR_TYPE_WAKE_GESTURE;
-	mSensorState[SENSOR_TYPE_WAKE_GESTURE].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_WAKE_GESTURE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_ANSWER_CALL].sensorType =
-		SENSOR_TYPE_ANSWER_CALL;
-	mSensorState[SENSOR_TYPE_ANSWER_CALL].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_ANSWER_CALL].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_STATIONARY_DETECT].sensorType =
-		SENSOR_TYPE_STATIONARY_DETECT;
-	mSensorState[SENSOR_TYPE_STATIONARY_DETECT].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_STATIONARY_DETECT].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_MOTION_DETECT].sensorType =
-		SENSOR_TYPE_MOTION_DETECT;
-	mSensorState[SENSOR_TYPE_MOTION_DETECT].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_MOTION_DETECT].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_DEVICE_ORIENTATION].sensorType =
-		SENSOR_TYPE_DEVICE_ORIENTATION;
-	mSensorState[SENSOR_TYPE_DEVICE_ORIENTATION].rate =
-		SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_DEVICE_ORIENTATION].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_GEOFENCE].sensorType = SENSOR_TYPE_GEOFENCE;
-	mSensorState[SENSOR_TYPE_GEOFENCE].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_GEOFENCE].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_FLOOR_COUNTER].sensorType =
-		SENSOR_TYPE_FLOOR_COUNTER;
-	mSensorState[SENSOR_TYPE_FLOOR_COUNTER].rate = SENSOR_RATE_ONCHANGE;
-	mSensorState[SENSOR_TYPE_FLOOR_COUNTER].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_FLAT].sensorType = SENSOR_TYPE_FLAT;
-	mSensorState[SENSOR_TYPE_FLAT].rate = SENSOR_RATE_ONESHOT;
-	mSensorState[SENSOR_TYPE_FLAT].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_RGBW].sensorType = SENSOR_TYPE_RGBW;
-	mSensorState[SENSOR_TYPE_RGBW].timestamp_filter = false;
-
-	mSensorState[SENSOR_TYPE_SAR].sensorType = SENSOR_TYPE_SAR;
-	mSensorState[SENSOR_TYPE_SAR].timestamp_filter = false;
-}
-
-static void init_sensor_config_cmd(struct ConfigCmd *cmd,
-		int sensor_type)
-{
-	uint8_t alt = mSensorState[sensor_type].alt;
-	bool enable = 0;
-
-	memset(cmd, 0x00, sizeof(*cmd));
-
-	cmd->evtType = EVT_NO_SENSOR_CONFIG_EVENT;
-	cmd->sensorType = mSensorState[sensor_type].sensorType;
-
-	if (alt && mSensorState[alt].enable &&
-			mSensorState[sensor_type].enable) {
-		cmd->cmd = CONFIG_CMD_ENABLE;
-		if (mSensorState[alt].rate > mSensorState[sensor_type].rate)
-			cmd->rate = mSensorState[alt].rate;
-		else
-			cmd->rate = mSensorState[sensor_type].rate;
-		if (mSensorState[alt].latency <
-				mSensorState[sensor_type].latency)
-			cmd->latency = mSensorState[alt].latency;
-		else
-			cmd->latency = mSensorState[sensor_type].latency;
-	} else if (alt && mSensorState[alt].enable) {
-		enable = mSensorState[alt].enable;
-		cmd->cmd =  enable ? CONFIG_CMD_ENABLE : CONFIG_CMD_DISABLE;
-		cmd->rate = mSensorState[alt].rate;
-		cmd->latency = mSensorState[alt].latency;
-	} else { /* !alt || !mSensorState[alt].enable */
-		enable = mSensorState[sensor_type].enable;
-		cmd->cmd = enable ? CONFIG_CMD_ENABLE : CONFIG_CMD_DISABLE;
-		cmd->rate = mSensorState[sensor_type].rate;
-		cmd->latency = mSensorState[sensor_type].latency;
-	}
-}
-
-static int SCP_sensorHub_batch(int handle, int flag,
-	long long samplingPeriodNs, long long maxBatchReportLatencyNs)
-{
-	uint8_t sensor_type = handle + ID_OFFSET;
-	struct ConfigCmd cmd;
-	int ret = 0;
-	uint64_t rate = 1024000000000ULL;
-
-	if (mSensorState[sensor_type].sensorType) {
-		if (samplingPeriodNs > 0 && mSensorState[sensor_type].rate !=
-			SENSOR_RATE_ONCHANGE &&
-			mSensorState[sensor_type].rate != SENSOR_RATE_ONESHOT) {
-			rate = div64_u64(rate, samplingPeriodNs);
-			mSensorState[sensor_type].rate = rate;
-		}
-		mSensorState[sensor_type].latency = maxBatchReportLatencyNs;
-		init_sensor_config_cmd(&cmd, sensor_type);
-		if (atomic_read(&power_status) != SENSOR_POWER_UP)
-			return 0;
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0) {
-			pr_err("fail enbatch h:%d, r: %d,l: %lld, cmd:%d\n",
-				handle, cmd.rate, cmd.latency, cmd.cmd);
-			return -1;
-		}
-	} else {
-		pr_err("unhandle handle=%d, is inited?\n", handle);
-		return -1;
-	}
-	return 0;
-}
-
-static int SCP_sensorHub_flush(int handle)
-{
-	uint8_t sensor_type = handle + ID_OFFSET;
-	struct ConfigCmd cmd;
-	int ret = 0;
-	atomic_t *p_flush_count = NULL;
-
-	if (mSensorState[sensor_type].sensorType) {
-		init_sensor_config_cmd(&cmd, sensor_type);
-		cmd.cmd = CONFIG_CMD_FLUSH;
-		/*
-		 * add count must before flush, if we add count after
-		 * flush right return and flush callback directly report
-		 * flush will lose flush complete
-		 */
-		p_flush_count = &mSensorState[sensor_type].flushCnt;
-		mutex_lock(&flush_mtx);
-		atomic_inc(p_flush_count);
-		mutex_unlock(&flush_mtx);
-		if (atomic_read(&power_status) == SENSOR_POWER_UP) {
-			ret = nanohub_external_write((const uint8_t *)&cmd,
-				sizeof(struct ConfigCmd));
-			if (ret < 0) {
-				pr_err("failed flush handle:%d\n", handle);
-				mutex_lock(&flush_mtx);
-				if (atomic_read(p_flush_count) > 0)
-					atomic_dec(p_flush_count);
-				mutex_unlock(&flush_mtx);
-				return -1;
-			}
-		}
-	} else {
-		pr_err("unhandle handle=%d, is inited?\n", handle);
-		return -1;
-	}
-	return 0;
-}
-
-static int SCP_sensorHub_report_raw_data(struct data_unit_t *data_t)
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-	int err = 0, sensor_type = 0, sensor_id = 0;
-	atomic_t *p_flush_count = NULL;
-	bool raw_enable = 0;
-	int64_t raw_enable_time = 0;
-
-	sensor_id = data_t->sensor_type;
-	sensor_type = sensor_id + ID_OFFSET;
-
-	if (sensor_id < 0 || sensor_id > ID_SENSOR_MAX_HANDLE) {
-		pr_err("invalid sensor %d\n", sensor_id);
-		return 0;
-	}
-
-	if (obj->dispatch_data_cb[sensor_id] == NULL) {
-		pr_err("type:%d don't support this flow?\n", sensor_id);
-		return 0;
-	}
-
-	raw_enable = READ_ONCE(mSensorState[sensor_type].enable);
-	raw_enable_time = atomic64_read(&mSensorState[sensor_type].enableTime);
-
-	if (raw_enable && data_t->flush_action == DATA_ACTION) {
-		if (data_t->time_stamp > raw_enable_time)
-			err = obj->dispatch_data_cb[sensor_id](data_t, NULL);
-		else
-			pr_info("ac:%d, e:%lld, d:%lld\n", data_t->flush_action,
-				raw_enable_time, data_t->time_stamp);
-	} else if (data_t->flush_action == FLUSH_ACTION) {
-		mutex_lock(&flush_mtx);
-		p_flush_count = &mSensorState[sensor_type].flushCnt;
-		if (atomic_read(p_flush_count) > 0) {
-			err = obj->dispatch_data_cb[sensor_id](data_t, NULL);
-			if (!err)
-				atomic_dec(p_flush_count);
-		}
-		mutex_unlock(&flush_mtx);
-	} else if (data_t->flush_action == BIAS_ACTION ||
-			data_t->flush_action == CALI_ACTION ||
-			data_t->flush_action == TEMP_ACTION ||
-			data_t->flush_action == TEST_ACTION)
-		err = obj->dispatch_data_cb[sensor_id](data_t, NULL);
-	return err;
-}
-
-static int SCP_sensorHub_report_alt_data(struct data_unit_t *data_t)
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-	int err = 0, sensor_type = 0, sensor_id = 0, alt_id;
-	uint8_t alt = 0;
-	atomic_t *p_flush_count = NULL;
-	bool alt_enable = 0;
-	int64_t alt_enable_time = 0;
-
-	sensor_id = data_t->sensor_type;
-	sensor_type = sensor_id + ID_OFFSET;
-
-	if (sensor_id < 0 || sensor_id > ID_SENSOR_MAX_HANDLE) {
-		pr_err("invalid sensor %d\n", sensor_id);
-		return 0;
-	}
-
-	alt = READ_ONCE(mSensorState[sensor_type].alt);
-	alt_id = alt - ID_OFFSET;
-
-	if (alt == 0)
-		return 0;
-
-	if (obj->dispatch_data_cb[alt_id] == NULL) {
-		pr_err("alt:%d don't support this flow?\n", alt_id);
-		return 0;
-	}
-
-	alt_enable = READ_ONCE(mSensorState[alt].enable);
-	alt_enable_time = atomic64_read(&mSensorState[alt].enableTime);
-
-	if (alt_enable && data_t->flush_action == DATA_ACTION) {
-		if (data_t->time_stamp > alt_enable_time)
-			err = obj->dispatch_data_cb[alt_id](data_t, NULL);
-		else
-			pr_info("ac:%d, e:%lld, d:%lld\n", data_t->flush_action,
-				alt_enable_time, data_t->time_stamp);
-	} else if (data_t->flush_action == FLUSH_ACTION) {
-		mutex_lock(&flush_mtx);
-		p_flush_count = &mSensorState[alt].flushCnt;
-		if (atomic_read(p_flush_count) > 0) {
-			err = obj->dispatch_data_cb[alt_id](data_t, NULL);
-			if (!err)
-				atomic_dec(p_flush_count);
-		}
-		mutex_unlock(&flush_mtx);
-	}
-
-	return err;
-}
-
-static int SCP_sensorHub_server_dispatch_data(uint32_t *currWp)
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-	char *pStart, *pEnd, *rp, *wp;
-	struct data_unit_t event;
-	uint32_t wp_copy;
-	int err = 0;
-
-	int64_t scp_time = 0;
-
-	pStart = (char *)READ_ONCE(obj->SCP_sensorFIFO) +
-		offsetof(struct sensorFIFO, data);
-	pEnd = pStart +  READ_ONCE(obj->SCP_sensorFIFO->FIFOSize);
-	wp_copy = *currWp;
-	rp = pStart + READ_ONCE(obj->SCP_sensorFIFO->rp);
-	wp = pStart + wp_copy;
-
-	if (wp < pStart || pEnd < wp) {
-		pr_err("FIFO wp invalid : %p, %p, %p\n", pStart, pEnd, wp);
-		return -5;
-	}
-	if (rp == wp) {
-		pr_err("FIFO empty\n");
-		return 0;
-	}
-	/*
-	 * opimize for dram,no cache,we should cpy data to cacheable ram
-	 * event and event_copy are cacheable ram, SCP_sensorHub_report_data
-	 * will change time_stamp field, so when SCP_sensorHub_report_data fail
-	 * we should reinit the time_stamp by memcpy to event_copy;
-	 * why memcpy_fromio(&event_copy), because rp is not cacheable
-	 */
-	if (rp < wp) {
-		while (rp < wp) {
-			memcpy_fromio(&event, rp, SENSOR_DATA_SIZE);
-
-			scp_time = event.time_stamp;
-			event.time_stamp +=
-				get_filter_output(&moving_average_algo);
-
-			do {
-				err = SCP_sensorHub_report_raw_data(&event);
-				if (err < 0)
-					usleep_range(2000, 4000);
-			} while (err < 0);
-
-			do {
-				err = SCP_sensorHub_report_alt_data(&event);
-				if (err < 0)
-					usleep_range(2000, 4000);
-			} while (err < 0);
-
-			rp += SENSOR_DATA_SIZE;
-		}
-	} else if (rp > wp) {
-		while (rp < pEnd) {
-			memcpy_fromio(&event, rp, SENSOR_DATA_SIZE);
-			scp_time = event.time_stamp;
-			event.time_stamp +=
-				get_filter_output(&moving_average_algo);
-
-			do {
-				err = SCP_sensorHub_report_raw_data(&event);
-				if (err < 0)
-					usleep_range(2000, 4000);
-			} while (err < 0);
-
-			do {
-				err = SCP_sensorHub_report_alt_data(&event);
-				if (err < 0)
-					usleep_range(2000, 4000);
-			} while (err < 0);
-
-			rp += SENSOR_DATA_SIZE;
-		}
-		rp = pStart;
-		while (rp < wp) {
-			memcpy_fromio(&event, rp, SENSOR_DATA_SIZE);
-			scp_time = event.time_stamp;
-			event.time_stamp +=
-				get_filter_output(&moving_average_algo);
-
-			do {
-				err = SCP_sensorHub_report_raw_data(&event);
-				if (err < 0)
-					usleep_range(2000, 4000);
-			} while (err < 0);
-
-			do {
-				err = SCP_sensorHub_report_alt_data(&event);
-				if (err < 0)
-					usleep_range(2000, 4000);
-			} while (err < 0);
-
-			rp += SENSOR_DATA_SIZE;
-		}
-	}
-	/* must obj->SCP_sensorFIFO->rp = wp,
-	 *there can not obj->SCP_sensorFIFO->rp = obj->SCP_sensorFIFO->wp
-	 */
-	WRITE_ONCE(obj->SCP_sensorFIFO->rp, wp_copy);
-	return 0;
-}
-
-static int sensor_send_dram_info_to_hub(void)
-{				/* call by init done workqueue */
-	struct SCP_sensorHub_data *obj = obj_data;
-	union SCP_SENSOR_HUB_DATA data;
-	unsigned int len = 0;
-	int err = 0, retry = 0, total = 10;
-
-	obj->shub_dram_phys = scp_get_reserve_mem_phys(SENS_MEM_ID);
-	obj->shub_dram_virt = scp_get_reserve_mem_virt(SENS_MEM_ID);
-
-	data.set_config_req.sensorType = 0;
-	data.set_config_req.action = SENSOR_HUB_SET_CONFIG;
-	data.set_config_req.bufferBase =
-		(unsigned int)(obj->shub_dram_phys & 0xFFFFFFFF);
-
-	len = sizeof(data.set_config_req);
-	for (retry = 0; retry < total; ++retry) {
-		err = scp_sensorHub_req_send(&data, &len, 1);
-		if (err < 0) {
-			pr_err("%s fail!\n", __func__);
-			continue;
-		}
-		break;
-	}
-	if (retry < total)
-		pr_notice("[sensorHub] %s success\n", __func__);
-	return SCP_SENSOR_HUB_SUCCESS;
-}
-
-static int sensor_send_timestamp_wake_locked(void)
-{
-	union SCP_SENSOR_HUB_DATA req;
-	int len;
-	int err = 0;
-	uint64_t now_time, arch_counter;
-
-	/* send_timestamp_to_hub is process context, disable irq is safe */
-	local_irq_disable();
-	now_time = ktime_get_boot_ns();
-	arch_counter = arch_counter_get_cntvct();
-	local_irq_enable();
-	req.set_config_req.sensorType = 0;
-	req.set_config_req.action = SENSOR_HUB_SET_TIMESTAMP;
-	req.set_config_req.ap_timestamp = now_time;
-	req.set_config_req.arch_counter = arch_counter;
-	pr_debug("sync ap boottime=%lld\n", now_time);
-	len = sizeof(req.set_config_req);
-	err = scp_sensorHub_req_send(&req, &len, 1);
-	if (err < 0)
-		pr_err("scp_sensorHub_req_send fail!\n");
-	return err;
-}
-
-static int sensor_send_timestamp_to_hub(void)
-{
-	int err = 0;
-	struct SCP_sensorHub_data *obj = obj_data;
-
-	if (READ_ONCE(rtc_compensation_suspend)) {
-		pr_err("rtc_compensation_suspend suspend,drop time sync\n");
-		return 0;
-	}
-
-	__pm_stay_awake(obj->ws);
-	err = sensor_send_timestamp_wake_locked();
-	__pm_relax(obj->ws);
-	return err;
-}
-static void sensor_disable_report_flush(uint8_t handle)
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-	uint8_t sensor_type = handle + ID_OFFSET;
-	struct data_unit_t data_t;
-	atomic_t *p_flush_count = NULL;
-	SCP_sensorHub_handler func;
-	int ret = 0, retry = 0;
-
-	func = obj->dispatch_data_cb[handle];
-	if (!func)
-		return;
-
-	/*
-	 * disable sensor only check func return err 5 times
-	 */
-	mutex_lock(&flush_mtx);
-	p_flush_count = &mSensorState[sensor_type].flushCnt;
-	while (atomic_read(p_flush_count) > 0) {
-		atomic_dec(p_flush_count);
-		memset(&data_t, 0, sizeof(struct data_unit_t));
-		data_t.sensor_type = handle;
-		data_t.flush_action = FLUSH_ACTION;
-		do {
-			ret = func(&data_t, NULL);
-			if (ret < 0)
-				usleep_range(2000, 4000);
-		} while (ret < 0 && retry++ < 5);
-		if (ret < 0)
-			pr_err("%d flush complete err when disable\n",
-				handle);
-	}
-	mutex_unlock(&flush_mtx);
-}
-int sensor_enable_to_hub(uint8_t handle, int enabledisable)
-{
-	uint8_t sensor_type = handle + ID_OFFSET;
-	struct ConfigCmd cmd;
-	int ret = 0;
-
-	if (enabledisable == 1)
-		scp_register_feature(SENS_FEATURE_ID);
-	mutex_lock(&mSensorState_mtx);
-	if (handle > ID_SENSOR_MAX_HANDLE) {
-		pr_err("invalid handle %d\n", handle);
-		ret = -1;
-		mutex_unlock(&mSensorState_mtx);
-		return ret;
-	}
-	if (mSensorState[sensor_type].sensorType) {
-		mSensorState[sensor_type].enable = enabledisable;
-		if (enabledisable)
-			atomic64_set(&mSensorState[sensor_type].enableTime,
-							ktime_get_boot_ns());
-		init_sensor_config_cmd(&cmd, sensor_type);
-		if (atomic_read(&power_status) == SENSOR_POWER_UP) {
-			ret = nanohub_external_write((const uint8_t *)&cmd,
-				sizeof(struct ConfigCmd));
-			if (ret < 0)
-				pr_err
-				    ("fail registerlistener handle:%d,cmd:%d\n",
-				     handle, cmd.cmd);
-		}
-		if (!enabledisable)
-			sensor_disable_report_flush(handle);
-	} else {
-		pr_err("unhandle handle=%d, is inited?\n", handle);
-		mutex_unlock(&mSensorState_mtx);
-		return -1;
-	}
-	mutex_unlock(&mSensorState_mtx);
-	return ret < 0 ? ret : 0;
-}
-EXPORT_SYMBOL_GPL(sensor_enable_to_hub);
-
-int sensor_set_delay_to_hub(uint8_t handle, unsigned int delayms)
-{
-	int ret = 0;
-	long long samplingPeriodNs = delayms * 1000000ULL;
-
-	mutex_lock(&mSensorState_mtx);
-	if (handle > ID_SENSOR_MAX_HANDLE) {
-		pr_err("invalid sensor %d\n", handle);
-		ret = -1;
-	} else {
-		ret = SCP_sensorHub_batch(handle, 0, samplingPeriodNs, 0);
-	}
-	mutex_unlock(&mSensorState_mtx);
-	return ret < 0 ? ret : 0;
-}
-EXPORT_SYMBOL_GPL(sensor_set_delay_to_hub);
-
-int sensor_batch_to_hub(uint8_t handle,
-	int flag, int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	int ret = 0;
-
-	mutex_lock(&mSensorState_mtx);
-	if (handle > ID_SENSOR_MAX_HANDLE) {
-		pr_err("invalid handle %d\n", handle);
-		ret = -1;
-	} else
-		ret = SCP_sensorHub_batch(handle,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-	mutex_unlock(&mSensorState_mtx);
-	return ret;
-}
-EXPORT_SYMBOL_GPL(sensor_batch_to_hub);
-
-int sensor_flush_to_hub(uint8_t handle)
-{
-	int ret = 0;
-
-	mutex_lock(&mSensorState_mtx);
-	if (handle > ID_SENSOR_MAX_HANDLE) {
-		pr_err("invalid handle %d\n", handle);
-		ret = -1;
-	} else
-		ret = SCP_sensorHub_flush(handle);
-	mutex_unlock(&mSensorState_mtx);
-	return ret;
-}
-EXPORT_SYMBOL_GPL(sensor_flush_to_hub);
-
-int sensor_cfg_to_hub(uint8_t handle, uint8_t *data, uint8_t count)
-{
-	struct ConfigCmd *cmd = NULL;
-	int ret = 0;
-
-	if (handle > ID_SENSOR_MAX_HANDLE) {
-		pr_err("invalid handle %d\n", handle);
-		ret = -1;
-	} else {
-		cmd = vzalloc(sizeof(struct ConfigCmd) + count);
-		if (cmd == NULL)
-			return -1;
-		cmd->evtType = EVT_NO_SENSOR_CONFIG_EVENT;
-		cmd->sensorType = handle + ID_OFFSET;
-		cmd->cmd = CONFIG_CMD_CFG_DATA;
-		memcpy(cmd->data, data, count);
-		ret = nanohub_external_write((const uint8_t *)cmd,
-			sizeof(struct ConfigCmd) + count);
-		if (ret < 0) {
-			pr_err("failed cfg data handle:%d, cmd:%d\n",
-				handle, cmd->cmd);
-			ret =  -1;
-		}
-		vfree(cmd);
-	}
-	return ret;
-}
-EXPORT_SYMBOL_GPL(sensor_cfg_to_hub);
-
-int sensor_calibration_to_hub(uint8_t handle)
-{
-	uint8_t sensor_type = handle + ID_OFFSET;
-	struct ConfigCmd cmd;
-	int ret = 0;
-
-	if (mSensorState[sensor_type].sensorType) {
-		init_sensor_config_cmd(&cmd, sensor_type);
-		cmd.cmd = CONFIG_CMD_CALIBRATE;
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0) {
-			pr_err("failed calibration handle:%d\n",
-				handle);
-			return -1;
-		}
-	} else {
-		pr_err("unhandle handle=%d, is inited?\n", handle);
-		return -1;
-	}
-	return 0;
-}
-EXPORT_SYMBOL_GPL(sensor_calibration_to_hub);
-
-int sensor_selftest_to_hub(uint8_t handle)
-{
-	uint8_t sensor_type = handle + ID_OFFSET;
-	struct ConfigCmd cmd;
-	int ret = 0;
-
-	if (mSensorState[sensor_type].sensorType) {
-		init_sensor_config_cmd(&cmd, sensor_type);
-		cmd.cmd = CONFIG_CMD_SELF_TEST;
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0) {
-			pr_err("failed selfttest handle:%d\n",
-				handle);
-			return -1;
-		}
-	} else {
-		pr_err("unhandle handle=%d, is inited?\n", handle);
-		return -1;
-	}
-	return 0;
-}
-EXPORT_SYMBOL_GPL(sensor_selftest_to_hub);
-
-int sensor_get_data_from_hub(uint8_t sensorType,
-	struct data_unit_t *data)
-{
-	union SCP_SENSOR_HUB_DATA req;
-	struct data_unit_t *data_t;
-	int len = 0, err = 0;
-
-	if (atomic_read(&power_status) == SENSOR_POWER_DOWN) {
-		pr_err("scp power down, we can not access scp\n");
-		return -1;
-	}
-
-	req.get_data_req.sensorType = sensorType;
-	req.get_data_req.action = SENSOR_HUB_GET_DATA;
-	len = sizeof(req.get_data_req);
-	err = scp_sensorHub_req_send(&req, &len, 1);
-	if (err < 0) {
-		pr_err("fail :%d!\n", err);
-		return -1;
-	}
-	if (sensorType != req.get_data_rsp.sensorType ||
-		req.get_data_rsp.action != SENSOR_HUB_GET_DATA ||
-		req.get_data_rsp.errCode != 0) {
-		pr_err("req Type: %d, rsp Type:%d action:%d, errcode:%d\n",
-			sensorType, req.get_data_rsp.sensorType,
-			req.get_data_rsp.action, req.get_data_rsp.errCode);
-
-		return req.get_data_rsp.errCode;
-	}
-
-	data_t = (struct data_unit_t *)req.get_data_rsp.data.int8_Data;
-	switch (sensorType) {
-	case ID_ACCELEROMETER:
-		data->time_stamp = data_t->time_stamp;
-		data->accelerometer_t.x = data_t->accelerometer_t.x;
-		data->accelerometer_t.y = data_t->accelerometer_t.y;
-		data->accelerometer_t.z = data_t->accelerometer_t.z;
-		data->accelerometer_t.x_bias = data_t->accelerometer_t.x_bias;
-		data->accelerometer_t.y_bias = data_t->accelerometer_t.y_bias;
-		data->accelerometer_t.z_bias = data_t->accelerometer_t.z_bias;
-		data->accelerometer_t.status = data_t->accelerometer_t.status;
-		break;
-	case ID_GRAVITY:
-		data->time_stamp = data_t->time_stamp;
-		data->accelerometer_t.x = data_t->accelerometer_t.x;
-		data->accelerometer_t.y = data_t->accelerometer_t.y;
-		data->accelerometer_t.z = data_t->accelerometer_t.z;
-		data->accelerometer_t.status = data_t->accelerometer_t.status;
-		break;
-	case ID_LINEAR_ACCELERATION:
-		data->time_stamp = data_t->time_stamp;
-		data->accelerometer_t.x = data_t->accelerometer_t.x;
-		data->accelerometer_t.y = data_t->accelerometer_t.y;
-		data->accelerometer_t.z = data_t->accelerometer_t.z;
-		data->accelerometer_t.status = data_t->accelerometer_t.status;
-		break;
-	case ID_LIGHT:
-		data->time_stamp = data_t->time_stamp;
-		data->light = data_t->light;
-		break;
-	case ID_PROXIMITY:
-		data->time_stamp = data_t->time_stamp;
-		data->proximity_t.steps = data_t->proximity_t.steps;
-		data->proximity_t.oneshot = data_t->proximity_t.oneshot;
-		break;
-	case ID_PRESSURE:
-		data->time_stamp = data_t->time_stamp;
-		data->pressure_t.pressure = data_t->pressure_t.pressure;
-		data->pressure_t.status = data_t->pressure_t.status;
-		break;
-	case ID_GYROSCOPE:
-		data->time_stamp = data_t->time_stamp;
-		data->gyroscope_t.x = data_t->gyroscope_t.x;
-		data->gyroscope_t.y = data_t->gyroscope_t.y;
-		data->gyroscope_t.z = data_t->gyroscope_t.z;
-		data->gyroscope_t.x_bias = data_t->gyroscope_t.x_bias;
-		data->gyroscope_t.y_bias  = data_t->gyroscope_t.y_bias;
-		data->gyroscope_t.z_bias  = data_t->gyroscope_t.z_bias;
-		data->gyroscope_t.status = data_t->gyroscope_t.status;
-		break;
-	case ID_GYROSCOPE_UNCALIBRATED:
-		data->time_stamp = data_t->time_stamp;
-		data->uncalibrated_gyro_t.x = data_t->uncalibrated_gyro_t.x;
-		data->uncalibrated_gyro_t.y = data_t->uncalibrated_gyro_t.y;
-		data->uncalibrated_gyro_t.z = data_t->uncalibrated_gyro_t.z;
-		data->uncalibrated_gyro_t.x_bias =
-			data_t->uncalibrated_gyro_t.x_bias;
-		data->uncalibrated_gyro_t.y_bias  =
-			data_t->uncalibrated_gyro_t.y_bias;
-		data->uncalibrated_gyro_t.z_bias  =
-			data_t->uncalibrated_gyro_t.z_bias;
-		data->uncalibrated_gyro_t.status =
-			data_t->uncalibrated_gyro_t.status;
-		break;
-	case ID_RELATIVE_HUMIDITY:
-		data->time_stamp = data_t->time_stamp;
-		data->relative_humidity_t.relative_humidity =
-		data_t->relative_humidity_t.relative_humidity;
-		data->relative_humidity_t.status =
-			data_t->relative_humidity_t.status;
-		break;
-	case ID_MAGNETIC:
-		data->time_stamp = data_t->time_stamp;
-		data->magnetic_t.x = data_t->magnetic_t.x;
-		data->magnetic_t.y = data_t->magnetic_t.y;
-		data->magnetic_t.z = data_t->magnetic_t.z;
-		data->magnetic_t.x_bias = data_t->magnetic_t.x_bias;
-		data->magnetic_t.y_bias = data_t->magnetic_t.y_bias;
-		data->magnetic_t.z_bias = data_t->magnetic_t.z_bias;
-		data->magnetic_t.status = data_t->magnetic_t.status;
-		break;
-	case ID_MAGNETIC_UNCALIBRATED:
-		data->time_stamp = data_t->time_stamp;
-		data->uncalibrated_mag_t.x = data_t->uncalibrated_mag_t.x;
-		data->uncalibrated_mag_t.y = data_t->uncalibrated_mag_t.y;
-		data->uncalibrated_mag_t.z = data_t->uncalibrated_mag_t.z;
-		data->uncalibrated_mag_t.x_bias =
-			data_t->uncalibrated_mag_t.x_bias;
-		data->uncalibrated_mag_t.y_bias =
-			data_t->uncalibrated_mag_t.y_bias;
-		data->uncalibrated_mag_t.z_bias =
-			data_t->uncalibrated_mag_t.z_bias;
-		data->uncalibrated_mag_t.status =
-			data_t->uncalibrated_mag_t.status;
-		break;
-	case ID_GEOMAGNETIC_ROTATION_VECTOR:
-		data->time_stamp = data_t->time_stamp;
-		data->magnetic_t.x = data_t->magnetic_t.x;
-		data->magnetic_t.y = data_t->magnetic_t.y;
-		data->magnetic_t.z = data_t->magnetic_t.z;
-		data->magnetic_t.scalar = data_t->magnetic_t.scalar;
-		data->magnetic_t.status = data_t->magnetic_t.status;
-		break;
-	case ID_ORIENTATION:
-		data->time_stamp = data_t->time_stamp;
-		data->orientation_t.azimuth = data_t->orientation_t.azimuth;
-		data->orientation_t.pitch = data_t->orientation_t.pitch;
-		data->orientation_t.roll = data_t->orientation_t.roll;
-		data->orientation_t.status = data_t->orientation_t.status;
-		break;
-	case ID_ROTATION_VECTOR:
-		data->time_stamp = data_t->time_stamp;
-		data->orientation_t.azimuth = data_t->orientation_t.azimuth;
-		data->orientation_t.pitch = data_t->orientation_t.pitch;
-		data->orientation_t.roll = data_t->orientation_t.roll;
-		data->orientation_t.scalar = data_t->orientation_t.scalar;
-		data->orientation_t.status = data_t->orientation_t.status;
-		break;
-	case ID_GAME_ROTATION_VECTOR:
-		data->time_stamp = data_t->time_stamp;
-		data->orientation_t.azimuth = data_t->orientation_t.azimuth;
-		data->orientation_t.pitch = data_t->orientation_t.pitch;
-		data->orientation_t.roll = data_t->orientation_t.roll;
-		data->orientation_t.scalar = data_t->orientation_t.scalar;
-		data->orientation_t.status = data_t->orientation_t.status;
-		break;
-	case ID_STEP_COUNTER:
-		data->time_stamp = data_t->time_stamp;
-		data->step_counter_t.accumulated_step_count
-		    = data_t->step_counter_t.accumulated_step_count;
-		break;
-	case ID_STEP_DETECTOR:
-		data->time_stamp = data_t->time_stamp;
-		data->step_detector_t.step_detect =
-			data_t->step_detector_t.step_detect;
-		break;
-	case ID_SIGNIFICANT_MOTION:
-		data->time_stamp = data_t->time_stamp;
-		data->smd_t.state = data_t->smd_t.state;
-		break;
-	case ID_HEART_RATE:
-		data->time_stamp = data_t->time_stamp;
-		data->heart_rate_t.bpm = data_t->heart_rate_t.bpm;
-		data->heart_rate_t.status = data_t->heart_rate_t.status;
-		break;
-	case ID_PEDOMETER:
-		data->time_stamp = data_t->time_stamp;
-		data->pedometer_t.accumulated_step_count =
-		    data_t->pedometer_t.accumulated_step_count;
-		data->pedometer_t.accumulated_step_length =
-		    data_t->pedometer_t.accumulated_step_length;
-		data->pedometer_t.step_frequency =
-			data_t->pedometer_t.step_frequency;
-		data->pedometer_t.step_length =
-			data_t->pedometer_t.step_length;
-		break;
-	case ID_ACTIVITY:
-		data->time_stamp = data_t->time_stamp;
-		data->activity_data_t.probability[STILL] =
-		    data_t->activity_data_t.probability[STILL];
-		data->activity_data_t.probability[STANDING] =
-		    data_t->activity_data_t.probability[STANDING];
-		data->activity_data_t.probability[SITTING] =
-		    data_t->activity_data_t.probability[SITTING];
-		data->activity_data_t.probability[LYING] =
-		    data_t->activity_data_t.probability[LYING];
-		data->activity_data_t.probability[ON_FOOT] =
-		    data_t->activity_data_t.probability[ON_FOOT];
-		data->activity_data_t.probability[WALKING] =
-		    data_t->activity_data_t.probability[WALKING];
-		data->activity_data_t.probability[RUNNING] =
-		    data_t->activity_data_t.probability[RUNNING];
-		data->activity_data_t.probability[CLIMBING] =
-		    data_t->activity_data_t.probability[CLIMBING];
-		data->activity_data_t.probability[ON_BICYCLE] =
-		    data_t->activity_data_t.probability[ON_BICYCLE];
-		data->activity_data_t.probability[IN_VEHICLE] =
-		    data_t->activity_data_t.probability[IN_VEHICLE];
-		data->activity_data_t.probability[TILTING] =
-		    data_t->activity_data_t.probability[TILTING];
-		data->activity_data_t.probability[UNKNOWN] =
-		    data_t->activity_data_t.probability[UNKNOWN];
-		break;
-	case ID_IN_POCKET:
-		data->time_stamp = data_t->time_stamp;
-		data->inpocket_event.state = data_t->inpocket_event.state;
-		break;
-	case ID_PICK_UP_GESTURE:
-		data->time_stamp = data_t->time_stamp;
-		data->gesture_data_t.probability =
-			data_t->gesture_data_t.probability;
-		break;
-	case ID_TILT_DETECTOR:
-		data->time_stamp = data_t->time_stamp;
-		data->tilt_event.state = data_t->tilt_event.state;
-		break;
-	case ID_WAKE_GESTURE:
-		data->time_stamp = data_t->time_stamp;
-		data->gesture_data_t.probability =
-			data_t->gesture_data_t.probability;
-		break;
-	case ID_GLANCE_GESTURE:
-		data->time_stamp = data_t->time_stamp;
-		data->gesture_data_t.probability =
-			data_t->gesture_data_t.probability;
-		break;
-	case ID_PDR:
-		data->time_stamp = data_t->time_stamp;
-		data->pdr_event.x = data_t->pdr_event.x;
-		data->pdr_event.y = data_t->pdr_event.y;
-		data->pdr_event.z = data_t->pdr_event.z;
-		data->pdr_event.status = data_t->pdr_event.status;
-		break;
-	case ID_FLOOR_COUNTER:
-		data->time_stamp = data_t->time_stamp;
-		data->floor_counter_t.accumulated_floor_count
-		    = data_t->floor_counter_t.accumulated_floor_count;
-		break;
-	case ID_SAR:
-		data->time_stamp = data_t->time_stamp;
-		data->sar_event.data[0] = data_t->sar_event.data[0];
-		data->sar_event.data[1] = data_t->sar_event.data[1];
-		data->sar_event.data[2] = data_t->sar_event.data[2];
-		break;
-	default:
-		err = -1;
-		break;
-	}
-	return err;
-}
-EXPORT_SYMBOL_GPL(sensor_get_data_from_hub);
-
-int sensor_set_cmd_to_hub(uint8_t sensorType,
-	enum CUST_ACTION action, void *data)
-{
-	union SCP_SENSOR_HUB_DATA req;
-	int len = 0, err = 0;
-	struct SCP_SENSOR_HUB_GET_RAW_DATA *pGetRawData;
-
-	req.get_data_req.sensorType = sensorType;
-	req.get_data_req.action = SENSOR_HUB_SET_CUST;
-
-	if (atomic_read(&power_status) == SENSOR_POWER_DOWN) {
-		pr_err("scp power down, we can not access scp\n");
-		return -1;
-	}
-
-	switch (sensorType) {
-	case ID_ACCELEROMETER:
-		req.set_cust_req.sensorType = ID_ACCELEROMETER;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_RESET_CALI:
-			req.set_cust_req.resetCali.action =
-				CUST_ACTION_RESET_CALI;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.resetCali);
-			break;
-		case CUST_ACTION_SET_CALI:
-			req.set_cust_req.setCali.action = CUST_ACTION_SET_CALI;
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_X]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_X);
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_Y]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_Y);
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_Z]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_Z);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setCali);
-			break;
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SET_DIRECTION:
-			req.set_cust_req.setDirection.action =
-				CUST_ACTION_SET_DIRECTION;
-			req.set_cust_req.setDirection.direction =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-			     custData) + sizeof(req.set_cust_req.setDirection);
-			break;
-		case CUST_ACTION_SET_FACTORY:
-			req.set_cust_req.setFactory.action =
-				CUST_ACTION_SET_FACTORY;
-			req.set_cust_req.setFactory.factory =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setFactory);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action = CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_LIGHT:
-		req.set_cust_req.sensorType = ID_LIGHT;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_GET_RAW_DATA:
-			req.set_cust_req.getRawData.action =
-				CUST_ACTION_GET_RAW_DATA;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getRawData);
-			err = scp_sensorHub_req_send(&req, &len, 1);
-			if (err == 0) {
-				if ((req.set_cust_rsp.action !=
-					SENSOR_HUB_SET_CUST)
-					|| (req.set_cust_rsp.errCode != 0)) {
-					pr_err("scp_sHub_req_send fail!\n");
-					return -1;
-				}
-				if (req.set_cust_rsp.getRawData.action !=
-					CUST_ACTION_GET_RAW_DATA) {
-					pr_err("scp_sHub_req_send fail!\n");
-					return -1;
-				}
-				pGetRawData = &req.set_cust_rsp.getRawData;
-				*((uint8_t *) data) =
-					pGetRawData->uint8_data[0];
-			} else {
-				pr_err("scp_sensorHub_req_send failed!\n");
-			}
-			return 0;
-		case CUST_ACTION_SHOW_ALSLV:
-			req.set_cust_req.showAlslv.action =
-				CUST_ACTION_SHOW_ALSLV;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showAlslv);
-			break;
-		case CUST_ACTION_SHOW_ALSVAL:
-			req.set_cust_req.showAlsval.action =
-				CUST_ACTION_GET_RAW_DATA;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showAlsval);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_PROXIMITY:
-		req.set_cust_req.sensorType = ID_PROXIMITY;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_RESET_CALI:
-			req.set_cust_req.resetCali.action =
-				CUST_ACTION_RESET_CALI;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.resetCali);
-			break;
-		case CUST_ACTION_SET_CALI:
-			req.set_cust_req.setCali.action = CUST_ACTION_SET_CALI;
-			req.set_cust_req.setCali.int32_data[0] =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setCali);
-			break;
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action = CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_SET_PS_THRESHOLD:
-			req.set_cust_req.setPSThreshold.action =
-				CUST_ACTION_SET_PS_THRESHOLD;
-			req.set_cust_req.setPSThreshold.threshold[0]
-			    = *((int32_t *) data + 0);
-			req.set_cust_req.setPSThreshold.threshold[1]
-			    = *((int32_t *) data + 1);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-			    custData) + sizeof(req.set_cust_req.setPSThreshold);
-			break;
-		case CUST_ACTION_GET_RAW_DATA:
-			req.set_cust_req.getRawData.action =
-				CUST_ACTION_GET_RAW_DATA;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getRawData);
-			err = scp_sensorHub_req_send(&req, &len, 1);
-			if (err == 0) {
-				if ((req.set_cust_rsp.action !=
-					SENSOR_HUB_SET_CUST)
-					|| (req.set_cust_rsp.errCode != 0)) {
-					pr_err("scp_sHub_req_send fail!\n");
-					return -1;
-				}
-				if (req.set_cust_rsp.getRawData.action !=
-					CUST_ACTION_GET_RAW_DATA) {
-					pr_err("scp_sHub_req_send fail!\n");
-					return -1;
-				}
-				pGetRawData = &req.set_cust_rsp.getRawData;
-				*((uint16_t *) data) =
-					pGetRawData->uint16_data[0];
-			} else {
-				pr_err("scp_sensorHub_req_send failed!\n");
-			}
-			return 0;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_PRESSURE:
-		req.set_cust_req.sensorType = ID_PRESSURE;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action = CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_GYROSCOPE:
-		req.set_cust_req.sensorType = ID_GYROSCOPE;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_RESET_CALI:
-			req.set_cust_req.resetCali.action =
-				CUST_ACTION_RESET_CALI;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.resetCali);
-			break;
-		case CUST_ACTION_SET_CALI:
-			req.set_cust_req.setCali.action = CUST_ACTION_SET_CALI;
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_X]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_X);
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_Y]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_Y);
-			req.set_cust_req.setCali.int32_data[SCP_SENSOR_HUB_Z]
-			    = *((int32_t *) data + SCP_SENSOR_HUB_Z);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setCali);
-			break;
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SET_DIRECTION:
-			req.set_cust_req.setDirection.action =
-				CUST_ACTION_SET_DIRECTION;
-			req.set_cust_req.setDirection.direction =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-			     custData) + sizeof(req.set_cust_req.setDirection);
-			break;
-		case CUST_ACTION_SET_FACTORY:
-			req.set_cust_req.setFactory.action =
-				CUST_ACTION_SET_FACTORY;
-			req.set_cust_req.setFactory.factory =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setFactory);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action =
-				CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_RELATIVE_HUMIDITY:
-		req.set_cust_req.sensorType = ID_MAGNETIC;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action = CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_MAGNETIC:
-		req.set_cust_req.sensorType = ID_MAGNETIC;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		case CUST_ACTION_SET_DIRECTION:
-			req.set_cust_req.setDirection.action =
-				CUST_ACTION_SET_DIRECTION;
-			req.set_cust_req.setDirection.direction =
-				*((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-			     custData) + sizeof(req.set_cust_req.setDirection);
-			break;
-		case CUST_ACTION_SHOW_REG:
-			req.set_cust_req.showReg.action = CUST_ACTION_SHOW_REG;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.showReg);
-			break;
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	case ID_SAR:
-		req.set_cust_req.sensorType = ID_SAR;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_GET_SENSOR_INFO:
-			req.set_cust_req.getInfo.action =
-				CUST_ACTION_GET_SENSOR_INFO;
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.getInfo);
-			break;
-		default:
-			return -1;
-		}
-		break;
-	default:
-		req.set_cust_req.sensorType = sensorType;
-		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
-		switch (action) {
-		case CUST_ACTION_SET_TRACE:
-			req.set_cust_req.setTrace.action =
-				CUST_ACTION_SET_TRACE;
-			req.set_cust_req.setTrace.trace = *((int32_t *) data);
-			len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
-				custData) + sizeof(req.set_cust_req.setTrace);
-			break;
-		default:
-			return -1;
-		}
-	}
-	err = scp_sensorHub_req_send(&req, &len, 1);
-	if (err < 0) {
-		pr_err("scp_sensorHub_req_send fail!\n");
-		return -1;
-	}
-	if (sensorType != req.get_data_rsp.sensorType
-		|| SENSOR_HUB_SET_CUST != req.get_data_rsp.action
-		|| 0 != req.get_data_rsp.errCode) {
-		pr_err("error : %d\n", req.get_data_rsp.errCode);
-		return req.get_data_rsp.errCode;
-	}
-
-	switch (action) {
-	case CUST_ACTION_GET_SENSOR_INFO:
-		if (req.set_cust_rsp.getInfo.action !=
-			CUST_ACTION_GET_SENSOR_INFO) {
-			pr_info("scp_sensorHub_req_send failed action!\n");
-			return -1;
-		}
-		memcpy((struct sensorInfo_t *)data,
-			&req.set_cust_rsp.getInfo.sensorInfo,
-			sizeof(struct sensorInfo_t));
-		break;
-	default:
-		break;
-	}
-	return err;
-}
-EXPORT_SYMBOL_GPL(sensor_set_cmd_to_hub);
-
-static void restoring_enable_sensorHub_sensor(int handle)
-{
-	uint8_t sensor_type = handle + ID_OFFSET;
-	int ret = 0;
-	int i = 0, flush_cnt = 0;
-	struct ConfigCmd cmd;
-
-	if (mSensorState[sensor_type].sensorType &&
-		mSensorState[sensor_type].enable) {
-		init_sensor_config_cmd(&cmd, sensor_type);
-		pr_debug("restoring: handle=%d,enable=%d,rate=%d,latency=%lld\n",
-			handle, mSensorState[sensor_type].enable,
-			mSensorState[sensor_type].rate,
-			mSensorState[sensor_type].latency);
-		ret = nanohub_external_write((const uint8_t *)&cmd,
-			sizeof(struct ConfigCmd));
-		if (ret < 0)
-			pr_notice("failed registerlistener handle:%d, cmd:%d\n",
-				handle, cmd.cmd);
-
-		cmd.cmd = CONFIG_CMD_FLUSH;
-		mutex_lock(&flush_mtx);
-		flush_cnt = atomic_read(&mSensorState[sensor_type].flushCnt);
-		for (i = 0; i < flush_cnt; i++) {
-			ret = nanohub_external_write((const uint8_t *)&cmd,
-				sizeof(struct ConfigCmd));
-			if (ret < 0)
-				pr_notice("failed flush handle:%d\n", handle);
-		}
-		mutex_unlock(&flush_mtx);
-	}
-
-}
-
-void sensorHub_power_up_loop(void *data)
-{
-	int handle = 0;
-	struct SCP_sensorHub_data *obj = obj_data;
-	unsigned long flags = 0;
-
-	wait_event(power_reset_wait,
-		READ_ONCE(scp_system_ready) && READ_ONCE(scp_chre_ready));
-	spin_lock_irqsave(&scp_state_lock, flags);
-	WRITE_ONCE(scp_chre_ready, false);
-	WRITE_ONCE(scp_system_ready, false);
-	spin_unlock_irqrestore(&scp_state_lock, flags);
-
-	/* firstly we should update dram information */
-	/* 1. reset wp queue head and tail */
-	obj->wp_queue.head = 0;
-	obj->wp_queue.tail = 0;
-	/* 2. init dram information */
-	WRITE_ONCE(obj->SCP_sensorFIFO,
-		(struct sensorFIFO *)
-		(long)scp_get_reserve_mem_virt(SENS_MEM_ID));
-	BUG_ON(obj->SCP_sensorFIFO == NULL);
-	WRITE_ONCE(obj->SCP_sensorFIFO->wp, 0);
-	WRITE_ONCE(obj->SCP_sensorFIFO->rp, 0);
-	WRITE_ONCE(obj->SCP_sensorFIFO->FIFOSize,
-		((long)scp_get_reserve_mem_size(SENS_MEM_ID) -
-		offsetof(struct sensorFIFO, data)) /
-		SENSOR_DATA_SIZE * SENSOR_DATA_SIZE);
-	pr_debug("obj->SCP_sensorFIFO =%p, wp =%d, rp =%d, size =%d\n",
-		READ_ONCE(obj->SCP_sensorFIFO),
-		READ_ONCE(obj->SCP_sensorFIFO->wp),
-		READ_ONCE(obj->SCP_sensorFIFO->rp),
-		READ_ONCE(obj->SCP_sensorFIFO->FIFOSize));
-#ifndef CHRE_POWER_RESET_NOTIFY
-	/* 3. wait for chre init done when don't support power reset feature */
-	msleep(2000);
-#endif
-	/* 4. send dram information to scp */
-	sensor_send_dram_info_to_hub();
-	/* secondly we enable sensor which sensor is enable by framework */
-	mutex_lock(&mSensorState_mtx);
-	for (handle = 0; handle < ID_SENSOR_MAX_HANDLE_PLUS_ONE; handle++)
-		restoring_enable_sensorHub_sensor(handle);
-	mutex_unlock(&mSensorState_mtx);
-}
-
-static int sensorHub_power_up_work(void *data)
-{
-	for (;;)
-		sensorHub_power_up_loop(data);
-	return 0;
-}
-
-static int sensorHub_ready_event(struct notifier_block *this,
-	unsigned long event, void *ptr)
-{
-	unsigned long flags = 0;
-
-	if (event == SCP_EVENT_STOP) {
-		spin_lock_irqsave(&scp_state_lock, flags);
-		WRITE_ONCE(scp_system_ready, false);
-		spin_unlock_irqrestore(&scp_state_lock, flags);
-		atomic_set(&power_status, SENSOR_POWER_DOWN);
-		scp_power_monitor_notify(SENSOR_POWER_DOWN, ptr);
-	}
-
-	if (event == SCP_EVENT_READY) {
-		spin_lock_irqsave(&scp_state_lock, flags);
-		WRITE_ONCE(scp_system_ready, true);
-		if (READ_ONCE(scp_system_ready) && READ_ONCE(scp_chre_ready)) {
-			spin_unlock_irqrestore(&scp_state_lock, flags);
-			atomic_set(&power_status, SENSOR_POWER_UP);
-			scp_power_monitor_notify(SENSOR_POWER_UP, ptr);
-			/* schedule_work(&obj->power_up_work); */
-			wake_up(&power_reset_wait);
-		} else
-			spin_unlock_irqrestore(&scp_state_lock, flags);
-	}
-
-	return NOTIFY_DONE;
-}
-
-static struct notifier_block sensorHub_ready_notifier = {
-	.notifier_call = sensorHub_ready_event,
-};
-static int sensorHub_probe(struct platform_device *pdev)
-{
-	struct SCP_sensorHub_data *obj;
-	int err = 0, index;
-	struct task_struct *task = NULL;
-	struct task_struct *task_power_reset = NULL;
-	struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
-
-	pr_debug("%s\n", __func__);
-	SCP_sensorHub_init_sensor_state();
-	obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-	if (!obj) {
-		pr_err("Allocate SCP_sensorHub_data fail\n");
-		err = -ENOMEM;
-		goto exit;
-	}
-	memset(obj, 0, sizeof(struct SCP_sensorHub_data));
-	obj_data = obj;
-
-	/* init sensor share dram write pointer event queue */
-	spin_lock_init(&obj->wp_queue.buffer_lock);
-	obj->wp_queue.head = 0;
-	obj->wp_queue.tail = 0;
-	obj->wp_queue.bufsize = 32;
-	obj->wp_queue.ringbuffer =
-		vzalloc(obj->wp_queue.bufsize * sizeof(uint32_t));
-	if (!obj->wp_queue.ringbuffer) {
-		pr_err("Alloc ringbuffer error!\n");
-		goto exit;
-	}
-	/* register ipi interrupt handler */
-	scp_ipi_registration(IPI_SENSOR,
-		SCP_sensorHub_IPI_handler, "SCP_sensorHub");
-	/* init receive scp dram data worker */
-	/* INIT_WORK(&obj->direct_push_work, SCP_sensorHub_direct_push_work); */
-	/* obj->direct_push_workqueue = alloc_workqueue("chre_work",
-	 * WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1);
-	 */
-	/* obj->direct_push_workqueue =
-	 *		create_singlethread_workqueue("chre_work");
-	 *	if (obj->direct_push_workqueue == NULL) {
-	 *	pr_err("direct_push_workqueue fail\n");
-	 *	return -1;
-	 *}
-	 */
-
-	WRITE_ONCE(chre_kthread_wait_condition, false);
-	task = kthread_run(SCP_sensorHub_direct_push_work,
-		NULL, "chre_kthread");
-	if (IS_ERR(task)) {
-		pr_err("SCP_sensorHub_direct_push_work create fail!\n");
-		goto exit;
-	}
-	sched_setscheduler(task, SCHED_FIFO, &param);
-	/* init the debug trace flag */
-	for (index = 0; index < ID_SENSOR_MAX_HANDLE_PLUS_ONE; index++)
-		atomic_set(&obj->traces[index], 0);
-	/* init timestamp sync worker */
-	INIT_WORK(&obj->sync_time_worker, SCP_sensorHub_sync_time_work);
-	obj->sync_time_timer.expires =
-		jiffies + msecs_to_jiffies(SYNC_TIME_START_CYCLC);
-	obj->sync_time_timer.function = SCP_sensorHub_sync_time_func;
-	timer_setup(&obj->sync_time_timer, SCP_sensorHub_sync_time_func, 0);
-	mod_timer(&obj->sync_time_timer,
-		jiffies + msecs_to_jiffies(SYNC_TIME_START_CYCLC));
-	obj->ws = wakeup_source_register(NULL, "sync_time");
-	if (!obj->ws) {
-		pr_err("SCP_sensorHub: wakeup source init fail\n");
-		err = -ENOMEM;
-		goto exit;
-	}
-
-	/* this call back can get scp power down status */
-	scp_A_register_notify(&sensorHub_ready_notifier);
-	/* this call back can get scp power UP status */
-	/* INIT_WORK(&obj->power_up_work, sensorHub_power_up_work); */
-	task_power_reset = kthread_run(sensorHub_power_up_work,
-		NULL, "scp_power_reset");
-	if (IS_ERR(task_power_reset)) {
-		pr_err("sensorHub_power_up_work create fail!\n");
-		goto exit;
-	}
-
-	SCP_sensorHub_init_flag = 0;
-	pr_debug("init done, data_unit_t size: %d,SCP_SENSOR_HUB_DATA size:%d\n",
-		(int)sizeof(struct data_unit_t),
-		(int)sizeof(union SCP_SENSOR_HUB_DATA));
-	BUG_ON(sizeof(struct data_unit_t) != SENSOR_DATA_SIZE
-		|| sizeof(union SCP_SENSOR_HUB_DATA) != SENSOR_IPI_SIZE);
-	return 0;
-exit:
-	pr_err("%s: err = %d\n", __func__, err);
-	SCP_sensorHub_init_flag = -1;
-	return err;
-}
-
-static int sensorHub_remove(struct platform_device *pdev)
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-
-	if (obj)
-		wakeup_source_unregister(obj->ws);
-
-	return 0;
-}
-
-static int sensorHub_suspend(struct platform_device *pdev,
-	pm_message_t msg)
-{
-	/* sensor_send_timestamp_to_hub(); */
-	return 0;
-}
-
-static int sensorHub_resume(struct platform_device *pdev)
-{
-	/* sensor_send_timestamp_to_hub(); */
-	return 0;
-}
-
-static void sensorHub_shutdown(struct platform_device *pdev)
-{
-	int handle = 0;
-	uint8_t sensor_type;
-	struct ConfigCmd cmd;
-	int ret = 0;
-
-	mutex_lock(&mSensorState_mtx);
-	for (handle = 0; handle < ID_SENSOR_MAX_HANDLE_PLUS_ONE; handle++) {
-		sensor_type = handle + ID_OFFSET;
-		if (mSensorState[sensor_type].sensorType &&
-				mSensorState[sensor_type].enable) {
-			mSensorState[sensor_type].enable = false;
-			init_sensor_config_cmd(&cmd, sensor_type);
-
-			ret = nanohub_external_write((const uint8_t *)&cmd,
-				sizeof(struct ConfigCmd));
-			if (ret < 0)
-				pr_notice("failed registerlistener handle:%d, cmd:%d\n",
-					handle, cmd.cmd);
-		}
-	}
-	mutex_unlock(&mSensorState_mtx);
-}
-static ssize_t nanohub_trace_show(struct device_driver *ddri, char *buf)
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-	int i;
-	ssize_t res = 0;
-
-	for (i = 0; i < ID_SENSOR_MAX_HANDLE_PLUS_ONE; i++)
-		res += snprintf(&buf[res], PAGE_SIZE, "%2d:[%d]\n",
-			i, atomic_read(&obj->traces[i]));
-	return res;
-}
-
-static ssize_t nanohub_trace_store(struct device_driver *ddri,
-	const char *buf, size_t count)
-{
-	struct SCP_sensorHub_data *obj = obj_data;
-	int handle, trace = 0;
-	int res = 0;
-
-	pr_debug("%s buf:%s\n", __func__, buf);
-	if (sscanf(buf, "%d,%d", &handle, &trace) != 2) {
-		pr_err("invalid content: '%s', length = %zu\n", buf, count);
-		goto err_out;
-	}
-
-	if (handle < 0 || handle > ID_SENSOR_MAX_HANDLE) {
-		pr_debug("invalid handle value:%d,should be '0<=handle<=%d'\n",
-			trace, ID_SENSOR_MAX_HANDLE);
-		goto err_out;
-	}
-
-	if (trace != 0 && trace != 1) {
-		pr_debug("invalid trace value:%d,trace should be '0' or '1'",
-			trace);
-		goto err_out;
-	}
-
-	res = sensor_set_cmd_to_hub(handle, CUST_ACTION_SET_TRACE, &trace);
-	if (res < 0) {
-		pr_err("cmd_to_hub (ID: %d),(action: %d)err: %d\n", handle,
-					CUST_ACTION_SET_TRACE, res);
-	} else
-		atomic_set(&obj->traces[handle], trace);
-
-err_out:
-	return count;
-}
-
-static DRIVER_ATTR_RW(nanohub_trace);
-
-static struct driver_attribute *nanohub_attr_list[] = {
-	&driver_attr_nanohub_trace,	/*trace log */
-};
-
-static int nanohub_create_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(nanohub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++) {
-		err = driver_create_file(driver, nanohub_attr_list[idx]);
-		if (err) {
-			pr_err("driver_create_file (%s) = %d\n",
-				nanohub_attr_list[idx]->attr.name, err);
-			break;
-		}
-	}
-	return err;
-}
-
-static int nanohub_delete_attr(struct device_driver *driver)
-{
-	int idx = 0, err = 0;
-	int num = (int)(ARRAY_SIZE(nanohub_attr_list));
-
-	if (!driver)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++)
-		driver_remove_file(driver, nanohub_attr_list[idx]);
-
-	return err;
-}
-
-static struct platform_device sensorHub_device = {
-	.name = "sensor_hub_pl",
-	.id = -1,
-};
-
-static struct platform_driver sensorHub_driver = {
-	.driver = {
-	   .name = "sensor_hub_pl",
-	},
-	.probe = sensorHub_probe,
-	.remove = sensorHub_remove,
-	.suspend = sensorHub_suspend,
-	.resume = sensorHub_resume,
-	.shutdown = sensorHub_shutdown,
-};
-
-#ifdef CONFIG_PM
-static int sensorHub_pm_event(struct notifier_block *notifier,
-	unsigned long pm_event,
-			void *unused)
-{
-	switch (pm_event) {
-	case PM_POST_SUSPEND:
-		pr_debug("resume ap boottime=%lld\n", ktime_get_boot_ns());
-		WRITE_ONCE(rtc_compensation_suspend, false);
-		sensor_send_timestamp_to_hub();
-		return NOTIFY_DONE;
-	case PM_SUSPEND_PREPARE:
-		pr_debug("suspend ap boottime=%lld\n", ktime_get_boot_ns());
-		WRITE_ONCE(rtc_compensation_suspend, true);
-		return NOTIFY_DONE;
-	default:
-		return NOTIFY_OK;
-	}
-	return NOTIFY_OK;
-}
-
-static struct notifier_block sensorHub_pm_notifier_func = {
-	.notifier_call = sensorHub_pm_event,
-	.priority = 0,
-};
-#endif /* CONFIG_PM */
-
-int __init SCP_sensorHub_init(void)
-{
-	nanohub_init();
-	SCP_sensorHub_ipi_master_init();
-	pr_debug("%s\n", __func__);
-	if (platform_device_register(&sensorHub_device)) {
-		pr_err("SCP_sensorHub platform device error\n");
-		return -1;
-	}
-	if (platform_driver_register(&sensorHub_driver)) {
-		pr_err("SCP_sensorHub platform driver error\n");
-		return -1;
-	}
-	if (nanohub_create_attr(&sensorHub_driver.driver)) {
-		pr_err("create attribute err\n");
-		nanohub_delete_attr(&sensorHub_driver.driver);
-	}
-#ifdef CONFIG_PM
-	if (register_pm_notifier(&sensorHub_pm_notifier_func)) {
-		pr_err("Failed to register PM notifier.\n");
-		return -1;
-	}
-#endif /* CONFIG_PM */
-	return 0;
-}
-
-void __exit SCP_sensorHub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-	nanohub_cleanup();
-}
-module_init(SCP_sensorHub_init);
-module_exit(SCP_sensorHub_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("SCP sensor hub driver");
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_power_monitor/SCP_power_monitor.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_power_monitor/SCP_power_monitor.c
deleted file mode 100644
index 7a9f161..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_power_monitor/SCP_power_monitor.c
+++ /dev/null
@@ -1,83 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#include <linux/module.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include "SCP_power_monitor.h"
-
-static LIST_HEAD(power_monitor_list);
-static DEFINE_SPINLOCK(pm_lock);
-static atomic_t power_status = ATOMIC_INIT(SENSOR_POWER_DOWN);
-void scp_power_monitor_notify(uint8_t action, void *data)
-{
-	struct scp_power_monitor *c;
-	unsigned long flags;
-
-	spin_lock_irqsave(&pm_lock, flags);
-	list_for_each_entry(c, &power_monitor_list, list) {
-		if (c->notifier_call == NULL) {
-			WARN_ON(true);
-			continue;
-		}
-		c->notifier_call(action, data);
-		pr_debug("%s, module name:%s notify\n", __func__, c->name);
-	}
-	switch (action) {
-	case SENSOR_POWER_DOWN:
-		atomic_set(&power_status, SENSOR_POWER_DOWN);
-		break;
-	case SENSOR_POWER_UP:
-		atomic_set(&power_status, SENSOR_POWER_UP);
-		break;
-	}
-	spin_unlock_irqrestore(&pm_lock, flags);
-}
-EXPORT_SYMBOL(scp_power_monitor_notify);
-
-int scp_power_monitor_register(struct scp_power_monitor *monitor)
-{
-	int err = 0;
-	struct scp_power_monitor *c;
-
-	if (monitor->name == NULL || monitor->notifier_call == NULL) {
-		WARN_ON(true);
-		return -1;
-	}
-
-	spin_lock_irq(&pm_lock);
-	list_for_each_entry(c, &power_monitor_list, list) {
-		if (!strcmp(c->name, monitor->name)) {
-			err = -1;
-			goto out;
-		}
-	}
-
-	list_add_tail(&monitor->list, &power_monitor_list);
-	if (atomic_read(&power_status) == SENSOR_POWER_UP) {
-		pr_debug("scp_power_monitor_notify, module name:%s notify\n",
-			monitor->name);
-		monitor->notifier_call(SENSOR_POWER_UP, NULL);
-	}
-	spin_unlock_irq(&pm_lock);
-	return err;
- out:
-	pr_err("%s %s register fail\n", __func__, monitor->name);
-	spin_unlock_irq(&pm_lock);
-	return err;
-}
-EXPORT_SYMBOL(scp_power_monitor_register);
-
-int scp_power_monitor_deregister(struct scp_power_monitor *monitor)
-{
-	if (WARN_ON(list_empty(&monitor->list)))
-		return -1;
-
-	spin_lock_irq(&pm_lock);
-	list_del(&monitor->list);
-	spin_unlock_irq(&pm_lock);
-	return 0;
-}
-EXPORT_SYMBOL(scp_power_monitor_deregister);
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1/SCP_power_monitor.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1/SCP_power_monitor.h
deleted file mode 100644
index 3d7314f..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1/SCP_power_monitor.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef _SCP_POWER_MONITOR_H_
-#define _SCP_POWER_MONITOR_H_
-#include <linux/major.h>
-#include <linux/types.h>
-
-enum SCP_SENSOR_POWER {
-	SENSOR_POWER_UP = 0,
-	SENSOR_POWER_DOWN,
-};
-struct scp_power_monitor  {
-	const char *name;
-	struct list_head list;
-	int (*notifier_call)(uint8_t action, void *data);
-};
-extern int scp_power_monitor_register(struct scp_power_monitor *monitor);
-extern int scp_power_monitor_deregister(struct scp_power_monitor *monitor);
-extern void scp_power_monitor_notify(uint8_t action, void *data);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1/SCP_sensorHub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1/SCP_sensorHub.h
deleted file mode 100644
index 880dccb..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1/SCP_sensorHub.h
+++ /dev/null
@@ -1,553 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef SCP_SENSOR_HUB_H
-#define SCP_SENSOR_HUB_H
-
-#include <linux/ioctl.h>
-#include <linux/atomic.h>
-
-#if defined(CONFIG_MTK_SCP_SENSORHUB_V1)
-#error CONFIG_MTK_SCP_SENSORHUB_V1 should not configed
-#elif defined(CONFIG_NANOHUB)
-
-#define EVT_NO_SENSOR_CONFIG_EVENT       0x00000300
-#define SENSOR_RATE_ONCHANGE    0xFFFFFF01UL
-#define SENSOR_RATE_ONESHOT     0xFFFFFF02UL
-
-enum {
-	CONFIG_CMD_DISABLE      = 0,
-	CONFIG_CMD_ENABLE       = 1,
-	CONFIG_CMD_FLUSH        = 2,
-	CONFIG_CMD_CFG_DATA     = 3,
-	CONFIG_CMD_CALIBRATE    = 4,
-	CONFIG_CMD_SELF_TEST    = 5,
-};
-
-struct ConfigCmd {
-	uint32_t evtType;
-	uint64_t latency;
-	uint32_t rate;
-	uint8_t sensorType;
-	uint8_t cmd;
-	uint16_t flags;
-	uint8_t data[];
-} __packed;
-
-struct SensorState {
-	uint64_t latency;
-	uint32_t rate;
-	uint8_t sensorType;
-	uint8_t alt;
-	bool enable;
-	bool timestamp_filter;
-	atomic_t flushCnt;
-	atomic64_t enableTime;
-};
-
-#define SCP_SENSOR_HUB_TEMP_BUFSIZE     256
-
-//#define SCP_SENSOR_HUB_FIFO_SIZE        0x800000
-#define SCP_KFIFO_BUFFER_SIZE			(2048)
-#define SCP_DIRECT_PUSH_FIFO_SIZE       8192
-
-#define SCP_SENSOR_HUB_SUCCESS          0
-#define SCP_SENSOR_HUB_FAILURE          (-1)
-
-#define SCP_SENSOR_HUB_X				0
-#define SCP_SENSOR_HUB_Y				1
-#define SCP_SENSOR_HUB_Z				2
-#define SCP_SENSOR_HUB_AXES_NUM			3
-
-/* SCP_ACTION */
-#define    SENSOR_HUB_ACTIVATE		0
-#define    SENSOR_HUB_SET_DELAY		1
-#define    SENSOR_HUB_GET_DATA		2
-#define    SENSOR_HUB_BATCH			3
-#define    SENSOR_HUB_SET_CONFIG	4
-#define    SENSOR_HUB_SET_CUST		5
-#define    SENSOR_HUB_NOTIFY		6
-#define    SENSOR_HUB_BATCH_TIMEOUT 7
-#define    SENSOR_HUB_SET_TIMESTAMP	8
-#define    SENSOR_HUB_POWER_NOTIFY	9
-
-/* SCP_NOTIFY EVENT */
-#define    SCP_INIT_DONE			0
-#define    SCP_FIFO_FULL			1
-#define    SCP_NOTIFY				2
-#define    SCP_BATCH_TIMEOUT		3
-#define	   SCP_DIRECT_PUSH          4
-
-struct sensor_vec_t {
-	union {
-		struct {
-			int32_t x;
-			int32_t y;
-			int32_t z;
-			int32_t x_bias;
-			int32_t y_bias;
-			int32_t z_bias;
-			int32_t reserved : 14;
-			int32_t temp_result : 2;
-			int32_t temperature : 16;
-		};
-		struct {
-			int32_t azimuth;
-			int32_t pitch;
-			int32_t roll;
-			int32_t scalar;
-		};
-	};
-	uint32_t status;
-};
-
-struct heart_rate_event_t {
-	int32_t bpm;
-	int32_t status;
-};
-
-struct significant_motion_event_t {
-	int32_t state;
-};
-
-struct step_counter_event_t {
-	uint32_t accumulated_step_count;
-};
-
-struct step_detector_event_t {
-	uint32_t step_detect;
-};
-
-struct floor_counter_event_t {
-	uint32_t accumulated_floor_count;
-};
-
-enum gesture_type_t {
-	GESTURE_NONE,
-	SHAKE,
-	TAP,
-	TWIST,
-	FLIP,
-	SNAPSHOT,
-	PICKUP,
-	CHECK
-};
-
-struct gesture_t {
-	int32_t probability;
-};
-
-struct pedometer_event_t {
-	uint32_t accumulated_step_count;
-	uint32_t accumulated_step_length;
-	uint32_t step_frequency;
-	uint32_t step_length;
-};
-
-struct pressure_vec_t {
-	int32_t pressure;	/* Pa, i.e. hPa * 100 */
-	int32_t temperature;
-	uint32_t status;
-};
-
-struct proximity_vec_t {
-	uint32_t steps;
-	int32_t oneshot;
-};
-
-struct relative_humidity_vec_t {
-	int32_t relative_humidity;
-	int32_t temperature;
-	uint32_t status;
-};
-
-struct sleepmonitor_event_t {
-	int32_t state;		/* sleep, restless, awake */
-};
-
-enum fall_type {
-	FALL_NONE,
-	FALL,
-	FLOP,
-	FALL_MAX
-};
-
-struct fall_t {
-	uint8_t probability[FALL_MAX];	/* 0~100 */
-};
-
-struct tilt_event_t {
-	int32_t state;		/* 0,1 */
-};
-
-struct in_pocket_event_t {
-	int32_t state;		/* 0,1 */
-};
-
-struct geofence_event_t {
-	uint32_t state;  /* geofence [source, result, operation_mode] */
-};
-
-struct sar_event_t {
-	struct {
-		int32_t data[3];
-		int32_t x_bias;
-		int32_t y_bias;
-		int32_t z_bias;
-	};
-	uint32_t status;
-};
-
-enum activity_type_t {
-	STILL,
-	STANDING,
-	SITTING,
-	LYING,
-	ON_FOOT,
-	WALKING,
-	RUNNING,
-	CLIMBING,
-	ON_BICYCLE,
-	IN_VEHICLE,
-	TILTING,
-	UNKNOWN,
-	ACTIVITY_MAX
-};
-
-struct activity_t {
-	uint8_t probability[ACTIVITY_MAX];	/* 0~100 */
-};
-
-struct data_unit_t {
-	uint8_t sensor_type;
-	uint8_t flush_action;
-	uint8_t reserve[2];
-	uint64_t time_stamp;
-	union {
-		struct sensor_vec_t accelerometer_t;
-		struct sensor_vec_t gyroscope_t;
-		struct sensor_vec_t magnetic_t;
-		struct sensor_vec_t orientation_t;
-		struct sensor_vec_t pdr_event;
-
-		int32_t light;
-		struct proximity_vec_t proximity_t;
-		int32_t temperature;
-		struct pressure_vec_t pressure_t;
-		struct relative_humidity_vec_t relative_humidity_t;
-
-		struct sensor_vec_t uncalibrated_acc_t;
-		struct sensor_vec_t uncalibrated_mag_t;
-		struct sensor_vec_t uncalibrated_gyro_t;
-
-		struct pedometer_event_t pedometer_t;
-
-		struct heart_rate_event_t heart_rate_t;
-		struct significant_motion_event_t smd_t;
-		struct step_detector_event_t step_detector_t;
-		struct step_counter_event_t step_counter_t;
-		struct floor_counter_event_t floor_counter_t;
-		struct activity_t activity_data_t;
-		struct gesture_t gesture_data_t;
-		struct fall_t fall_data_t;
-		struct tilt_event_t tilt_event;
-		struct in_pocket_event_t inpocket_event;
-		struct geofence_event_t geofence_data_t;
-		struct sar_event_t sar_event;
-		int32_t data[8];
-	};
-} __packed;
-
-struct sensorFIFO {
-	uint32_t rp;	/* use int for store DRAM FIFO LSB 32bit read pointer */
-	uint32_t wp;
-	uint32_t FIFOSize;
-	uint32_t reserve;
-	struct data_unit_t data[0];
-};
-
-struct SCP_SENSOR_HUB_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	uint32_t data[11];
-};
-
-struct SCP_SENSOR_HUB_RSP {
-	uint8_t sensorType;
-	uint8_t action;
-	int8_t errCode;
-	uint8_t reserve[1];
-	/* uint32_t    reserved[9]; */
-};
-
-struct SCP_SENSOR_HUB_ACTIVATE_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	uint32_t enable;	/* 0 : disable ; 1 : enable */
-	/* uint32_t    reserved[9]; */
-};
-
-#define SCP_SENSOR_HUB_ACTIVATE_RSP SCP_SENSOR_HUB_RSP
-/* typedef SCP_SENSOR_HUB_RSP SCP_SENSOR_HUB_ACTIVATE_RSP; */
-
-struct SCP_SENSOR_HUB_SET_DELAY_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	uint32_t delay;		/* ms */
-	/* uint32_t    reserved[9]; */
-};
-
-#define SCP_SENSOR_HUB_SET_DELAY_RSP  SCP_SENSOR_HUB_RSP
-/* typedef SCP_SENSOR_HUB_RSP SCP_SENSOR_HUB_SET_DELAY_RSP; */
-
-struct SCP_SENSOR_HUB_GET_DATA_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	/* uint32_t    reserved[10]; */
-};
-
-struct SCP_SENSOR_HUB_GET_DATA_RSP {
-	uint8_t sensorType;
-	uint8_t action;
-	int8_t errCode;
-	uint8_t reserve[1];
-	/* struct data_unit_t data_t; */
-	union {
-		int8_t int8_Data[0];
-		int16_t int16_Data[0];
-		int32_t int32_Data[0];
-	} data;
-};
-
-struct SCP_SENSOR_HUB_BATCH_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t flag;
-	uint8_t reserve[1];
-	uint32_t period_ms;	/* batch reporting time in ms */
-	uint32_t timeout_ms;	/* sampling time in ms */
-	/* uint32_t    reserved[7]; */
-};
-
-#define SCP_SENSOR_HUB_BATCH_RSP SCP_SENSOR_HUB_RSP
-/* typedef SCP_SENSOR_HUB_RSP SCP_SENSOR_HUB_BATCH_RSP; */
-
-struct SCP_SENSOR_HUB_SET_CONFIG_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	/* struct sensorFIFO   *bufferBase; */
-	uint32_t bufferBase;/* use int to store buffer DRAM base LSB 32 bits */
-	uint32_t bufferSize;
-	uint64_t ap_timestamp;
-	uint64_t arch_counter;
-	/* uint32_t    reserved[8]; */
-};
-
-#define SCP_SENSOR_HUB_SET_CONFIG_RSP  SCP_SENSOR_HUB_RSP
-/* typedef SCP_SENSOR_HUB_RSP SCP_SENSOR_HUB_SET_CONFIG_RSP; */
-
-enum CUST_ACTION {
-	CUST_ACTION_SET_CUST = 1,
-	CUST_ACTION_SET_CALI,
-	CUST_ACTION_RESET_CALI,
-	CUST_ACTION_SET_TRACE,
-	CUST_ACTION_SET_DIRECTION,
-	CUST_ACTION_SHOW_REG,
-	CUST_ACTION_GET_RAW_DATA,
-	CUST_ACTION_SET_PS_THRESHOLD,
-	CUST_ACTION_SHOW_ALSLV,
-	CUST_ACTION_SHOW_ALSVAL,
-	CUST_ACTION_SET_FACTORY,
-	CUST_ACTION_GET_SENSOR_INFO,
-};
-
-struct SCP_SENSOR_HUB_CUST {
-	enum CUST_ACTION action;
-};
-
-struct SCP_SENSOR_HUB_SET_CUST {
-	enum CUST_ACTION action;
-	int32_t data[0];
-};
-
-struct SCP_SENSOR_HUB_SET_TRACE {
-	enum CUST_ACTION action;
-	int trace;
-};
-
-struct SCP_SENSOR_HUB_SET_DIRECTION {
-	enum CUST_ACTION action;
-	int direction;
-};
-
-struct SCP_SENSOR_HUB_SET_FACTORY {
-	enum CUST_ACTION	action;
-	unsigned int	factory;
-};
-
-struct SCP_SENSOR_HUB_SET_CALI {
-	enum CUST_ACTION action;
-	union {
-		int8_t int8_data[0];
-		uint8_t uint8_data[0];
-		int16_t int16_data[0];
-		uint16_t uint16_data[0];
-		int32_t int32_data[0];
-		uint32_t uint32_data[SCP_SENSOR_HUB_AXES_NUM];
-	};
-};
-
-#define SCP_SENSOR_HUB_RESET_CALI   SCP_SENSOR_HUB_CUST
-/* typedef SCP_SENSOR_HUB_CUST SCP_SENSOR_HUB_RESET_CALI; */
-
-struct SCP_SENSOR_HUB_SETPS_THRESHOLD {
-	enum CUST_ACTION action;
-	int32_t threshold[2];
-};
-
-#define SCP_SENSOR_HUB_SHOW_REG    SCP_SENSOR_HUB_CUST
-#define SCP_SENSOR_HUB_SHOW_ALSLV  SCP_SENSOR_HUB_CUST
-#define SCP_SENSOR_HUB_SHOW_ALSVAL SCP_SENSOR_HUB_CUST
-/*
- * typedef SCP_SENSOR_HUB_CUST SCP_SENSOR_HUB_SHOW_REG;
- * typedef SCP_SENSOR_HUB_CUST SCP_SENSOR_HUB_SHOW_ALSLV;
- * typedef SCP_SENSOR_HUB_CUST SCP_SENSOR_HUB_SHOW_ALSVAL;
- */
-
-struct SCP_SENSOR_HUB_GET_RAW_DATA {
-	enum CUST_ACTION action;
-	union {
-		int8_t int8_data[0];
-		uint8_t uint8_data[0];
-		int16_t int16_data[0];
-		uint16_t uint16_data[0];
-		int32_t int32_data[0];
-		uint32_t uint32_data[SCP_SENSOR_HUB_AXES_NUM];
-	};
-};
-
-struct mag_dev_info_t {
-	char libname[16];
-	int8_t layout;
-	int8_t deviceid;
-};
-
-struct sensorInfo_t {
-	char name[16];
-	struct mag_dev_info_t mag_dev_info;
-};
-
-struct scp_sensor_hub_get_sensor_info {
-	enum CUST_ACTION action;
-	union {
-		int32_t int32_data[0];
-		struct sensorInfo_t sensorInfo;
-	};
-};
-
-enum {
-	USE_OUT_FACTORY_MODE = 0,
-	USE_IN_FACTORY_MODE
-};
-
-struct SCP_SENSOR_HUB_SET_CUST_REQ {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t reserve[2];
-	union {
-		uint32_t custData[11];
-		struct SCP_SENSOR_HUB_CUST cust;
-		struct SCP_SENSOR_HUB_SET_CUST setCust;
-		struct SCP_SENSOR_HUB_SET_CALI setCali;
-		struct SCP_SENSOR_HUB_RESET_CALI resetCali;
-		struct SCP_SENSOR_HUB_SET_TRACE setTrace;
-		struct SCP_SENSOR_HUB_SET_DIRECTION setDirection;
-		struct SCP_SENSOR_HUB_SHOW_REG showReg;
-		struct SCP_SENSOR_HUB_GET_RAW_DATA getRawData;
-		struct SCP_SENSOR_HUB_SETPS_THRESHOLD setPSThreshold;
-		struct SCP_SENSOR_HUB_SHOW_ALSLV showAlslv;
-		struct SCP_SENSOR_HUB_SHOW_ALSVAL showAlsval;
-		struct SCP_SENSOR_HUB_SET_FACTORY setFactory;
-		struct scp_sensor_hub_get_sensor_info getInfo;
-	};
-};
-
-struct SCP_SENSOR_HUB_SET_CUST_RSP {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t errCode;
-	uint8_t reserve[1];
-	union {
-		uint32_t custData[11];
-		struct SCP_SENSOR_HUB_GET_RAW_DATA getRawData;
-		struct scp_sensor_hub_get_sensor_info getInfo;
-	};
-};
-
-struct SCP_SENSOR_HUB_NOTIFY_RSP {
-	uint8_t sensorType;
-	uint8_t action;
-	uint8_t event;
-	uint8_t reserve[1];
-	union {
-		int8_t		int8_Data[0];
-		int16_t		int16_Data[0];
-		int32_t		int32_Data[0];
-		struct {
-			uint32_t	currWp;
-			uint64_t	scp_timestamp;
-			uint64_t	arch_counter;
-		};
-	};
-};
-
-union SCP_SENSOR_HUB_DATA {
-	struct SCP_SENSOR_HUB_REQ req;
-	struct SCP_SENSOR_HUB_RSP rsp;
-	struct SCP_SENSOR_HUB_ACTIVATE_REQ activate_req;
-	struct SCP_SENSOR_HUB_ACTIVATE_RSP activate_rsp;
-	struct SCP_SENSOR_HUB_SET_DELAY_REQ set_delay_req;
-	struct SCP_SENSOR_HUB_SET_DELAY_RSP set_delay_rsp;
-	struct SCP_SENSOR_HUB_GET_DATA_REQ get_data_req;
-	struct SCP_SENSOR_HUB_GET_DATA_RSP get_data_rsp;
-	struct SCP_SENSOR_HUB_BATCH_REQ batch_req;
-	struct SCP_SENSOR_HUB_BATCH_RSP batch_rsp;
-	struct SCP_SENSOR_HUB_SET_CONFIG_REQ set_config_req;
-	struct SCP_SENSOR_HUB_SET_CONFIG_RSP set_config_rsp;
-	struct SCP_SENSOR_HUB_SET_CUST_REQ set_cust_req;
-	struct SCP_SENSOR_HUB_SET_CUST_RSP set_cust_rsp;
-	struct SCP_SENSOR_HUB_NOTIFY_RSP notify_rsp;
-};
-
-typedef int (*SCP_sensorHub_handler)(struct data_unit_t *event,
-	void *reserved);
-
-int scp_sensorHub_req_send(union SCP_SENSOR_HUB_DATA *data,
-	uint *len, unsigned int wait);
-int scp_sensorHub_data_registration(uint8_t sensor,
-	SCP_sensorHub_handler handler);
-int sensor_enable_to_hub(uint8_t sensorType, int enabledisable);
-int sensor_set_delay_to_hub(uint8_t sensorType, unsigned int delayms);
-int sensor_get_data_from_hub(uint8_t sensorType,
-	struct data_unit_t *data);
-int sensor_set_cmd_to_hub(uint8_t sensorType,
-	enum CUST_ACTION action, void *data);
-int sensor_batch_to_hub(uint8_t sensorType,
-	int flag, int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs);
-int sensor_flush_to_hub(uint8_t sensorType);
-int sensor_cfg_to_hub(uint8_t sensorType, uint8_t *data, uint8_t count);
-int sensor_calibration_to_hub(uint8_t sensorType);
-int sensor_selftest_to_hub(uint8_t sensorType);
-
-extern int __init nanohub_init(void);
-extern void __exit nanohub_cleanup(void);
-
-#endif
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1/cust_sensorHub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1/cust_sensorHub.h
deleted file mode 100644
index 8b67ba6..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1/cust_sensorHub.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __CUST_ACC_H__
-#define __CUST_ACC_H__
-
-#define G_CUST_I2C_ADDR_NUM 2
-
-struct sensorHub_hw {
-	int is_batch_enabled;
-};
-
-extern struct sensorHub_hw *get_cust_sensorHub_hw(void);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/Kconfig
deleted file mode 100644
index 744ae3a..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/Kconfig
+++ /dev/null
@@ -1,21 +0,0 @@
-config NANOHUB
-	tristate "Nanohub"
-	default N
-	help
-	  Enable support for the nanohub sensorhub driver.
-	  This driver supports the android nanohub sensorhub.
-	  Set Y to enable this feature.
-	  If in doubt, say N here.
-
-if NANOHUB
-
-config NANOHUB_MTK_IPI
-	bool "Nanohub MTK IPI"
-	default Y
-	help
-	  Enable nanohub MTK IPI support.
-	  Either this or NANOHUB_SPI/NANOHUB_I2C should be selected.
-	  MTK platform only protocol.
-	  If in doubt, say N here.
-
-endif # NANOHUB
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/bl.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/bl.c
deleted file mode 100644
index e59e9c2..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/bl.c
+++ /dev/null
@@ -1,361 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#include <linux/vmalloc.h>
-
-#include "nanohub.h"
-#include "main.h"
-#include "bl.h"
-
-#define MAX_BUFFER_SIZE		1024
-#define MAX_FLASH_BANKS		16
-#define READ_ACK_TIMEOUT	100000
-
-static u8 write_len(struct nanohub_data *data, int len)
-{
-	u8 buffer[sizeof(u8) + 1];
-
-	buffer[0] = len - 1;
-
-	return data->bl.write_data(data, buffer, sizeof(u8));
-}
-
-static u8 write_cnt(struct nanohub_data *data, uint16_t cnt)
-{
-	u8 buffer[sizeof(uint16_t) + 1];
-
-	buffer[0] = (cnt >> 8) & 0xFF;
-	buffer[1] = (cnt >> 0) & 0xFF;
-
-	return data->bl.write_data(data, buffer, sizeof(uint16_t));
-}
-
-static u8 write_addr(struct nanohub_data *data, u32 addr)
-{
-	u8 buffer[sizeof(u32) + 1];
-
-	buffer[0] = (addr >> 24) & 0xFF;
-	buffer[1] = (addr >> 16) & 0xFF;
-	buffer[2] = (addr >> 8) & 0xFF;
-	buffer[3] = addr & 0xFF;
-
-	return data->bl.write_data(data, buffer, sizeof(u32));
-}
-
-/* write length followed by the data */
-static u8 write_len_data(struct nanohub_data *data, int len,
-			 const u8 *buf)
-{
-	u8 buffer[sizeof(u8) + 256 + sizeof(u8)];
-
-	buffer[0] = len - 1;
-
-	memcpy(&buffer[1], buf, len);
-
-	return data->bl.write_data(data, buffer, sizeof(u8) + len);
-}
-
-/* keep checking for ack until we receive a ack or nack */
-static u8 read_ack_loop(struct nanohub_data *data)
-{
-	u8 ret;
-	s32 timeout = READ_ACK_TIMEOUT;
-
-	do {
-		ret = data->bl.read_ack(data);
-		if (ret != CMD_ACK && ret != CMD_NACK)
-			schedule();
-	} while (ret != CMD_ACK && ret != CMD_NACK && timeout-- > 0);
-
-	return ret;
-}
-
-u8 nanohub_bl_sync(struct nanohub_data *data)
-{
-	return data->bl.sync(data);
-}
-
-int nanohub_bl_open(struct nanohub_data *data)
-{
-	int ret = -1;
-
-	data->bl.tx_buffer = kmalloc(MAX_BUFFER_SIZE, GFP_KERNEL | GFP_DMA);
-	if (!data->bl.tx_buffer)
-		goto out;
-
-	data->bl.rx_buffer = kmalloc(MAX_BUFFER_SIZE, GFP_KERNEL | GFP_DMA);
-	if (!data->bl.rx_buffer)
-		goto free_tx;
-
-	ret = data->bl.open(data);
-	if (!ret)
-		goto out;
-
-	kfree(data->bl.rx_buffer);
-free_tx:
-	kfree(data->bl.tx_buffer);
-out:
-	return ret;
-}
-
-void nanohub_bl_close(struct nanohub_data *data)
-{
-	data->bl.close(data);
-	kfree(data->bl.tx_buffer);
-	kfree(data->bl.rx_buffer);
-}
-
-static u8 write_bank(struct nanohub_data *data, int bank, u32 addr,
-		     const u8 *buf, size_t length)
-{
-	const struct nanohub_platform_data *pdata = data->pdata;
-	u8 status = CMD_ACK;
-	u32 offset;
-
-	if (addr <= pdata->flash_banks[bank].address) {
-		offset = pdata->flash_banks[bank].address - addr;
-		if (addr + length >
-		    pdata->flash_banks[bank].address +
-		    pdata->flash_banks[bank].length)
-			status = nanohub_bl_write_memory
-				(data, pdata->flash_banks[bank].address,
-				 pdata->flash_banks[bank].length, buf + offset);
-		else
-			status = nanohub_bl_write_memory
-				(data, pdata->flash_banks[bank].address,
-				 length - offset, buf + offset);
-	} else {
-		if (addr + length >
-		    pdata->flash_banks[bank].address +
-		    pdata->flash_banks[bank].length)
-			status = nanohub_bl_write_memory
-				(data, addr, pdata->flash_banks[bank].address +
-				 pdata->flash_banks[bank].length - addr, buf);
-		else
-			status = nanohub_bl_write_memory(data, addr, length,
-							 buf);
-	}
-
-	return status;
-}
-
-u8 nanohub_bl_download(struct nanohub_data *data, u32 addr,
-		       const u8 *image, size_t length)
-{
-	const struct nanohub_platform_data *pdata = data->pdata;
-	u8 *ptr;
-	int i, j;
-	u8 status;
-	u32 offset;
-	u8 erase_mask[MAX_FLASH_BANKS] = { 0 };
-	u8 erase_write_mask[MAX_FLASH_BANKS] = { 0 };
-	u8 write_mask[MAX_FLASH_BANKS] = { 0 };
-
-	if (pdata->num_flash_banks > MAX_FLASH_BANKS) {
-		status = CMD_NACK;
-		goto out;
-	}
-
-	status = nanohub_bl_sync(data);
-
-	if (status != CMD_ACK) {
-		pr_err("%s: sync=%02x\n", __func__, status);
-		goto out;
-	}
-
-	ptr = vmalloc(length);
-	if (!ptr) {
-		status = CMD_NACK;
-		goto out;
-	}
-
-	status = nanohub_bl_read_memory(data, addr, length, ptr);
-	pr_info(
-	    "nanohub: nanohub_bl_read_memory: status=%02x, addr=%08x, length=%zd\n",
-	    status, addr, length);
-
-	for (i = 0; i < pdata->num_flash_banks; i++) {
-		if (addr >= pdata->flash_banks[i].address &&
-		    addr <
-		    pdata->flash_banks[i].address +
-		    pdata->flash_banks[i].length) {
-			break;
-		}
-	}
-
-	offset = (u32)(addr - pdata->flash_banks[i].address);
-	j = 0;
-	while (j < length && i < pdata->num_flash_banks) {
-		if (image[j] != 0xFF)
-			erase_write_mask[i] = true;
-
-		if ((ptr[j] & image[j]) != image[j]) {
-			erase_mask[i] = true;
-			if (erase_write_mask[i]) {
-				j += pdata->flash_banks[i].length - offset;
-				offset = pdata->flash_banks[i].length;
-			} else {
-				j++;
-				offset++;
-			}
-		} else {
-			if (ptr[j] != image[j])
-				write_mask[i] = true;
-			j++;
-			offset++;
-		}
-
-		if (offset == pdata->flash_banks[i].length) {
-			i++;
-			offset = 0;
-			if (i < pdata->num_flash_banks)
-				j += (pdata->flash_banks[i].address -
-				      pdata->flash_banks[i - 1].address -
-				      pdata->flash_banks[i - 1].length);
-			else
-				j = length;
-		}
-	}
-
-	for (i = 0; status == CMD_ACK && i < pdata->num_flash_banks; i++) {
-		pr_info("nanohub: i=%d, erase=%d, erase_write=%d, write=%d\n",
-			i, erase_mask[i], erase_write_mask[i], write_mask[i]);
-		if (erase_mask[i]) {
-			status =
-			    nanohub_bl_erase_sector(data,
-						    pdata->flash_banks[i].bank);
-			if (status == CMD_ACK && erase_write_mask[i])
-				status =
-				    write_bank(data, i, addr, image, length);
-		} else if (write_mask[i]) {
-			status = write_bank(data, i, addr, image, length);
-		}
-	}
-
-	vfree(ptr);
-out:
-	return status;
-}
-
-u8 nanohub_bl_erase_shared(struct nanohub_data *data)
-{
-	const struct nanohub_platform_data *pdata = data->pdata;
-	int i;
-	u8 status;
-
-	if (pdata->num_shared_flash_banks > MAX_FLASH_BANKS) {
-		status = CMD_NACK;
-		goto out;
-	}
-
-	status = nanohub_bl_sync(data);
-
-	if (status != CMD_ACK) {
-		pr_err("%s: sync=%02x\n", __func__, status);
-		goto out;
-	}
-
-	for (i = 0;
-	     status == CMD_ACK && i < pdata->num_shared_flash_banks;
-	     i++) {
-		status = nanohub_bl_erase_sector
-				(data, pdata->shared_flash_banks[i].bank);
-	}
-out:
-	return status;
-}
-
-/* erase a single sector */
-u8 nanohub_bl_erase_sector(struct nanohub_data *data, uint16_t sector)
-{
-	u8 ret;
-
-	data->bl.write_cmd(data, data->bl.cmd_erase);
-	ret = data->bl.read_ack(data);
-	if (ret == CMD_ACK)
-		ret = write_cnt(data, 0x0000);
-	if (ret != CMD_NACK)
-		ret = read_ack_loop(data);
-	if (ret == CMD_ACK)
-		ret = write_cnt(data, sector);
-	if (ret != CMD_NACK)
-		ret = read_ack_loop(data);
-
-	return ret;
-}
-
-/* read memory - this will chop the request into 256 byte reads */
-u8 nanohub_bl_read_memory(struct nanohub_data *data, u32 addr,
-			  u32 length, u8 *buffer)
-{
-	u8 ret = CMD_ACK;
-	u32 offset = 0;
-
-	while (ret == CMD_ACK && length > offset) {
-		data->bl.write_cmd(data, data->bl.cmd_read_memory);
-		ret = data->bl.read_ack(data);
-		if (ret == CMD_ACK) {
-			write_addr(data, addr + offset);
-			ret = read_ack_loop(data);
-			if (ret == CMD_ACK) {
-				if (length - offset >= 256) {
-					write_len(data, 256);
-					ret = read_ack_loop(data);
-					if (ret == CMD_ACK) {
-						data->bl.read_data(data,
-								   &buffer
-								   [offset],
-								   256);
-						offset += 256;
-					}
-				} else {
-					write_len(data, length - offset);
-					ret = read_ack_loop(data);
-					if (ret == CMD_ACK) {
-						data->bl.read_data(data,
-								   &buffer
-								   [offset],
-								   length -
-								   offset);
-						offset = length;
-					}
-				}
-			}
-		}
-	}
-
-	return ret;
-}
-
-/* write memory - this will chop the request into 256 byte writes */
-u8 nanohub_bl_write_memory(struct nanohub_data *data, u32 addr,
-			   u32 length, const u8 *buffer)
-{
-	u8 ret = CMD_ACK;
-	u32 offset = 0;
-
-	while (ret == CMD_ACK && length > offset) {
-		data->bl.write_cmd(data, data->bl.cmd_write_memory);
-		ret = data->bl.read_ack(data);
-		if (ret == CMD_ACK) {
-			write_addr(data, addr + offset);
-			ret = read_ack_loop(data);
-			if (ret == CMD_ACK) {
-				if (length - offset >= 256) {
-					write_len_data(data, 256,
-						       &buffer[offset]);
-					offset += 256;
-				} else {
-					write_len_data(data, length - offset,
-						       &buffer[offset]);
-					offset = length;
-				}
-				ret = read_ack_loop(data);
-			}
-		}
-	}
-
-	return ret;
-}
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/bl.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/bl.h
deleted file mode 100644
index 79eed99..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/bl.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef _NANOHUB_BL_H
-#define _NANOHUB_BL_H
-
-#include <linux/i2c.h>
-#include <linux/spi/spi.h>
-#include "nanohub.h"
-
-struct nanohub_data;
-
-struct nanohub_bl {
-	u8 cmd_erase;
-	u8 cmd_read_memory;
-	u8 cmd_write_memory;
-
-	int (*open)(const void *data);
-	void (*close)(const void *data);
-	u8 (*sync)(const void *data);
-	u8 (*write_data)(const void *data, u8 *buf, int size);
-	u8 (*write_cmd)(const void *data, u8 cmd_memory);
-	u8 (*read_data)(const void *data, u8 *buf, int size);
-	u8 (*read_ack)(const void *data);
-
-	u8 *tx_buffer;
-	u8 *rx_buffer;
-};
-
-int nanohub_bl_open(struct nanohub_data *data);
-u8 nanohub_bl_sync(struct nanohub_data *data);
-void nanohub_bl_close(struct nanohub_data *data);
-u8 nanohub_bl_download(struct nanohub_data *data,
-		       u32 addr, const u8 *image, size_t length);
-u8 nanohub_bl_erase_shared(struct nanohub_data *data);
-u8 nanohub_bl_erase_sector(struct nanohub_data *data, uint16_t sector);
-u8 nanohub_bl_read_memory(struct nanohub_data *data, u32 addr,
-			  u32 length, u8 *buffer);
-u8 nanohub_bl_write_memory(struct nanohub_data *data, u32 addr,
-			   u32 length, const u8 *buffer);
-
-/*
- * Bootloader commands
- * _NS versions are no-stretch. (Only valid on I2C)
- * will return CMD_BUSY instead of stretching the clock
- */
-
-#define CMD_GET				0x00
-#define CMD_GET_VERSION			0x01
-#define CMD_GET_ID			0x02
-#define CMD_READ_MEMORY			0x11
-#define CMD_NACK			0x1F
-#define CMD_GO				0x21
-#define CMD_WRITE_MEMORY		0x31
-#define CMD_WRITE_MEMORY_NS		0x32
-#define CMD_ERASE			0x44
-#define CMD_ERASE_NS			0x45
-#define CMD_SOF				0x5A
-#define CMD_WRITE_PROTECT		0x63
-#define CMD_WRITE_PROTECT_NS		0x64
-#define CMD_WRITE_UNPROTECT		0x73
-#define CMD_WRITE_UNPROTECT_NS		0x74
-#define CMD_BUSY			0x76
-#define CMD_ACK				0x79
-#define CMD_READOUT_PROTECT		0x82
-#define CMD_READOUT_PROTECT_NS		0x83
-#define CMD_READOUT_UNPROTECT		0x92
-#define CMD_READOUT_UNPROTECT_NS	0x93
-#define CMD_SOF_ACK			0xA5
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/comms.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/comms.c
deleted file mode 100644
index 26d635c..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/comms.c
+++ /dev/null
@@ -1,525 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/semaphore.h>
-#include <linux/gpio.h>
-
-#include "main.h"
-#include "comms.h"
-
-#define READ_ACK_TIMEOUT_MS	10
-#define READ_MSG_TIMEOUT_MS	70
-
-static const u32 crc_table[] = {
-	0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,
-	0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
-	0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
-	0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD
-};
-
-static u32 crc32_word(u32 crc, u32 data, int cnt)
-{
-	int i;
-
-	crc = crc ^ data;
-	for (i = 0; i < cnt; i++)
-		crc = (crc << 4) ^ crc_table[crc >> 28];
-
-	return crc;
-}
-
-u32 crc32(const u8 *buffer, int length, u32 crc)
-{
-	u32 *data = (u32 *)buffer;
-	u32 word;
-	int i;
-
-	/* word by word crc32 */
-	for (i = 0; i < (length >> 2); i++)
-		crc = crc32_word(crc, data[i], 8);
-
-	/* zero pad last word if required */
-	if (length & 0x3) {
-		for (i *= 4, word = 0; i < length; i++)
-			word |= buffer[i] << ((i & 0x3) * 8);
-		crc = crc32_word(crc, word, 8);
-	}
-
-	return crc;
-}
-
-static inline size_t pad(size_t length)
-{
-	return (length + 3) & ~3;
-}
-
-static inline size_t tot_len(size_t length)
-{
-	/* [TYPE:1] [LENGTH:3] [DATA] [PAD:0-3] [CRC:4] */
-	return sizeof(u32) + pad(length) + sizeof(u32);
-}
-
-static struct nanohub_packet_pad *packet_alloc(int flags)
-{
-	int len =
-	    sizeof(struct nanohub_packet_pad) + MAX_UINT8 +
-	    sizeof(struct nanohub_packet_crc);
-	u8 *packet = kmalloc(len, flags);
-
-	if (packet)
-		memset(packet, 0xFF, len);
-	return (struct nanohub_packet_pad *)packet;
-}
-
-static int packet_create(struct nanohub_packet *packet, u32 seq,
-			 u32 reason, u8 len, const u8 *data,
-			 bool user)
-{
-	struct nanohub_packet_crc crc;
-	int ret = sizeof(struct nanohub_packet) + len +
-	    sizeof(struct nanohub_packet_crc);
-
-	if (packet) {
-		packet->sync = COMMS_SYNC;
-		packet->seq = seq;
-		packet->reason = reason;
-		packet->len = len;
-		if (len > 0) {
-			if (user) {
-				if (copy_from_user(packet->data, data, len) !=
-				    0)
-					ret = ERROR_NACK;
-			} else {
-				memcpy(packet->data, data, len);
-			}
-		}
-		crc.crc =
-		    crc32((u8 *)packet,
-			  sizeof(struct nanohub_packet) + len, ~0);
-		memcpy(&packet->data[len], &crc.crc,
-		       sizeof(struct nanohub_packet_crc));
-	} else {
-		ret = ERROR_NACK;
-	}
-
-	return ret;
-}
-
-static int packet_verify(struct nanohub_packet *packet)
-{
-	struct nanohub_packet_crc crc;
-	int cmp;
-
-	crc.crc =
-	    crc32((u8 *)packet,
-		  sizeof(struct nanohub_packet) + packet->len, ~0);
-
-	cmp =
-	    memcmp(&crc.crc, &packet->data[packet->len],
-		   sizeof(struct nanohub_packet_crc));
-
-	if (cmp != 0)
-		pr_debug("nanohub: gen crc: %08x, got crc: %08x\n", crc.crc,
-			 *(u32 *)&packet->data[packet->len]);
-
-	return cmp;
-}
-
-static void packet_free(struct nanohub_packet_pad *packet)
-{
-	kfree(packet);
-}
-
-static int read_ack(struct nanohub_data *data,
-		    struct nanohub_packet *response, int timeout)
-{
-	int ret, i;
-	const int max_size = sizeof(struct nanohub_packet) + MAX_UINT8 +
-	    sizeof(struct nanohub_packet_crc);
-	unsigned long end = jiffies + msecs_to_jiffies(READ_ACK_TIMEOUT_MS);
-
-	for (i = 0; time_before(jiffies, end); i++) {
-		ret =
-		    data->comms.read(data, (u8 *)response, max_size,
-				     timeout);
-
-		if (ret == 0) {
-			pr_debug("nanohub: %s: %d: empty packet\n", __func__,
-				 i);
-			ret = ERROR_NACK;
-			continue;
-		} else if (ret < sizeof(struct nanohub_packet)) {
-			pr_debug("nanohub %s: %d: too small\n", __func__, i);
-			ret = ERROR_NACK;
-			continue;
-		} else if (ret <
-			   sizeof(struct nanohub_packet) + response->len +
-			   sizeof(struct nanohub_packet_crc)) {
-			pr_debug("nanohub %s: %d: too small length\n",
-				 __func__, i);
-			ret = ERROR_NACK;
-			continue;
-		} else if (ret !=
-			   sizeof(struct nanohub_packet) + response->len +
-			   sizeof(struct nanohub_packet_crc)) {
-			pr_debug("nanohub %s: %d: wrong length\n", __func__,
-				 i);
-			ret = ERROR_NACK;
-			break;
-		} else if (packet_verify(response) != 0) {
-			pr_debug("nanohub %s: %d: invalid crc\n", __func__, i);
-			ret = ERROR_NACK;
-			break;
-		}
-		break;
-	}
-
-	return ret;
-}
-
-static int read_msg(struct nanohub_data *data,
-		    struct nanohub_packet *response, int timeout)
-{
-	int ret, i;
-	const int max_size = sizeof(struct nanohub_packet) + MAX_UINT8 +
-	    sizeof(struct nanohub_packet_crc);
-	unsigned long end = jiffies + msecs_to_jiffies(READ_MSG_TIMEOUT_MS);
-
-	for (i = 0; time_before(jiffies, end); i++) {
-		ret =
-		    data->comms.read(data, (u8 *)response, max_size,
-				     timeout);
-
-		if (ret == 0) {
-			pr_debug("nanohub: %s: %d: empty packet\n", __func__,
-				 i);
-			ret = ERROR_NACK;
-			continue;
-		} else if (ret < sizeof(struct nanohub_packet)) {
-			pr_debug("nanohub: %s: %d: too small\n", __func__, i);
-			ret = ERROR_NACK;
-			continue;
-		} else if (ret <
-			   sizeof(struct nanohub_packet) + response->len +
-			   sizeof(struct nanohub_packet_crc)) {
-			pr_debug("nanohub: %s: %d: too small length\n",
-				 __func__, i);
-			ret = ERROR_NACK;
-			continue;
-		} else if (ret !=
-			   sizeof(struct nanohub_packet) + response->len +
-			   sizeof(struct nanohub_packet_crc)) {
-			pr_debug("nanohub: %s: %d: wrong length\n", __func__,
-				 i);
-			ret = ERROR_NACK;
-			break;
-		} else if (packet_verify(response) != 0) {
-			pr_debug("nanohub: %s: %d: invalid crc\n", __func__,
-				 i);
-			ret = ERROR_NACK;
-			break;
-		}
-		break;
-	}
-
-	return ret;
-}
-
-static int get_reply(struct nanohub_data *data,
-		     struct nanohub_packet *response, u32 seq)
-{
-	int ret;
-
-	ret = read_ack(data, response, data->comms.timeout_ack);
-
-	if (ret >= 0 && response->seq == seq) {
-		if (response->reason == CMD_COMMS_ACK) {
-			if (response->len == sizeof(data->interrupts))
-				memcpy(data->interrupts, response->data,
-				       response->len);
-			ret =
-			    read_msg(data, response, data->comms.timeout_reply);
-			if (ret < 0)
-				ret = ERROR_NACK;
-		} else {
-			if (response->reason == CMD_COMMS_NACK)
-				ret = ERROR_NACK;
-			else if (response->reason == CMD_COMMS_BUSY)
-				ret = ERROR_BUSY;
-		}
-
-		if (response->seq != seq)
-			ret = ERROR_NACK;
-	} else {
-		ret = ERROR_NACK;
-	}
-	return ret;
-}
-
-static int nanohub_comms_tx_rx(struct nanohub_data *data,
-			       struct nanohub_packet_pad *pad, int packet_size,
-			       u32 seq, u8 *rx, size_t rx_len)
-{
-	int ret;
-
-	ret = data->comms.write(data, (u8 *)&pad->packet, packet_size,
-				data->comms.timeout_write);
-
-	if (ret == packet_size) {
-		ret = get_reply(data, &pad->packet, seq);
-
-		if (ret >= 0) {
-			if (pad->packet.len > 0) {
-				if (pad->packet.len > rx_len) {
-					memcpy(rx, pad->packet.data, rx_len);
-					ret = rx_len;
-				} else {
-					memcpy(rx, pad->packet.data,
-					       pad->packet.len);
-					ret = pad->packet.len;
-				}
-			} else {
-				ret = 0;
-			}
-		}
-	} else {
-		ret = ERROR_NACK;
-	}
-
-	return ret;
-}
-
-int nanohub_comms_rx_retrans_boottime(struct nanohub_data *data, u32 cmd,
-				      u8 *rx, size_t rx_len,
-				      int retrans_cnt,
-				      int retrans_delay)
-{
-	int packet_size = 0;
-	struct nanohub_packet_pad *pad = packet_alloc(GFP_KERNEL);
-	int delay = 0;
-	int ret;
-	u32 seq;
-	struct timespec ts;
-	s64 boottime;
-
-	if (!pad)
-		return ERROR_NACK;
-
-	seq = data->comms.seq++;
-
-	do {
-		data->comms.open(data);
-		get_monotonic_boottime(&ts);
-		boottime = timespec_to_ns(&ts);
-		packet_size =
-		    packet_create(&pad->packet, seq, cmd, sizeof(boottime),
-				  (u8 *)&boottime, false);
-
-		ret =
-		    nanohub_comms_tx_rx(data, pad, packet_size, seq, rx,
-					rx_len);
-
-		if (nanohub_wakeup_eom(data,
-				       ret == ERROR_BUSY ||
-				       (ret == ERROR_NACK && retrans_cnt >= 0)))
-			ret = -EFAULT;
-
-		data->comms.close(data);
-
-		if (ret == ERROR_NACK) {
-			retrans_cnt--;
-			delay += retrans_delay;
-			if (retrans_cnt >= 0)
-				udelay(retrans_delay);
-		} else if (ret == ERROR_BUSY) {
-			usleep_range(100000, 200000);
-		}
-	} while ((ret == ERROR_BUSY) ||
-		(ret == ERROR_NACK && retrans_cnt >= 0));
-
-	packet_free(pad);
-
-	return ret;
-}
-
-int nanohub_comms_tx_rx_retrans(struct nanohub_data *data, u32 cmd,
-				const u8 *tx, u8 tx_len,
-				u8 *rx, size_t rx_len, bool user,
-				int retrans_cnt, int retrans_delay)
-{
-	int packet_size = 0;
-	struct nanohub_packet_pad *pad = packet_alloc(GFP_KERNEL);
-	int delay = 0;
-	int ret;
-	u32 seq;
-
-	if (!pad)
-		return ERROR_NACK;
-	seq = data->comms.seq++;
-
-	do {
-		packet_size =
-		    packet_create(&pad->packet, seq, cmd, tx_len, tx, user);
-
-		data->comms.open(data);
-		ret =
-		    nanohub_comms_tx_rx(data, pad, packet_size, seq, rx,
-					rx_len);
-
-		if (nanohub_wakeup_eom(data,
-				       ret == ERROR_BUSY ||
-				       (ret == ERROR_NACK && retrans_cnt >= 0)))
-			ret = -EFAULT;
-
-		data->comms.close(data);
-
-		if (ret == ERROR_NACK) {
-			retrans_cnt--;
-			delay += retrans_delay;
-			if (retrans_cnt >= 0)
-				udelay(retrans_delay);
-		} else if (ret == ERROR_BUSY) {
-			usleep_range(100000, 200000);
-		}
-	} while ((ret == ERROR_BUSY) ||
-		(ret == ERROR_NACK && retrans_cnt >= 0));
-
-	packet_free(pad);
-
-	return ret;
-}
-
-struct firmware_header {
-	u32 size;
-	u32 crc;
-	u8 type;
-} __packed;
-
-struct firmware_chunk {
-	u32 offset;
-	u8 data[252 - sizeof(u32)];
-} __packed;
-
-static int nanohub_comms_download(struct nanohub_data *data,
-				  const u8 *image, size_t length,
-				  u8 type)
-{
-	u8 accepted;
-	struct firmware_header header;
-	struct firmware_chunk chunk;
-	int max_chunk_size = sizeof(chunk.data);
-	int chunk_size;
-	u32 offset = 0;
-	int ret;
-	u8 chunk_reply = 0, upload_reply = 0;
-	u32 clear_interrupts[8] = { 0x00000008 };
-
-	header.type = type;
-	header.size = cpu_to_le32(length);
-	header.crc = cpu_to_le32(~crc32(image, length, ~0));
-
-	if (request_wakeup(data))
-		return -ERESTARTSYS;
-	ret = nanohub_comms_tx_rx_retrans(data, CMD_COMMS_START_KERNEL_UPLOAD,
-					  (const u8 *)&header,
-					  sizeof(header), &accepted,
-					  sizeof(accepted), false, 10, 10);
-	release_wakeup(data);
-
-	if (ret == 1 && accepted == 1) {
-		do {
-			if (request_wakeup(data))
-				continue;
-
-			chunk.offset = cpu_to_le32(offset);
-			if (offset + max_chunk_size > length)
-				chunk_size = length - offset;
-			else
-				chunk_size = max_chunk_size;
-			memcpy(chunk.data, image + offset, chunk_size);
-
-			ret =
-			    nanohub_comms_tx_rx_retrans(data,
-							CMD_COMMS_KERNEL_CHUNK,
-							(const u8 *)&chunk,
-							sizeof(u32) +
-							chunk_size,
-							&chunk_reply,
-							sizeof(chunk_reply),
-							false, 10, 10);
-
-			pr_debug("nanohub: ret=%d, chunk_reply=%d, offset=%d\n",
-				 ret, chunk_reply, offset);
-			if (ret == sizeof(chunk_reply)) {
-				if (chunk_reply == CHUNK_REPLY_ACCEPTED) {
-					offset += chunk_size;
-				} else if (chunk_reply == CHUNK_REPLY_WAIT) {
-					ret = nanohub_wait_for_interrupt(data);
-					if (ret < 0) {
-						release_wakeup(data);
-						continue;
-					}
-					nanohub_comms_tx_rx_retrans
-						(data, CMD_COMMS_CLR_GET_INTR,
-						 (u8 *)clear_interrupts,
-						 sizeof(clear_interrupts),
-						 (u8 *)data->interrupts,
-						 sizeof(data->interrupts),
-						 false, 10, 0);
-				} else if (chunk_reply == CHUNK_REPLY_RESEND) {
-					;
-				} else if (chunk_reply == CHUNK_REPLY_RESTART) {
-					offset = 0;
-				} else if (chunk_reply == CHUNK_REPLY_CANCEL ||
-					(chunk_reply ==
-					CHUNK_REPLY_CANCEL_NO_RETRY)) {
-					release_wakeup(data);
-					break;
-				}
-			} else if (ret <= 0) {
-				release_wakeup(data);
-				break;
-			}
-			release_wakeup(data);
-		} while (offset < length);
-	}
-
-	do {
-		if (request_wakeup(data)) {
-			ret = sizeof(upload_reply);
-			upload_reply = UPLOAD_REPLY_PROCESSING;
-			continue;
-		}
-		ret = nanohub_comms_tx_rx_retrans
-			(data,
-			 CMD_COMMS_FINISH_KERNEL_UPLOAD, NULL, 0,
-			 &upload_reply, sizeof(upload_reply), false, 10, 10);
-		release_wakeup(data);
-	} while (ret == sizeof(upload_reply) &&
-		 upload_reply == UPLOAD_REPLY_PROCESSING);
-
-	pr_info("nanohub: %s: ret=%d, upload_reply=%d\n", __func__,
-		ret, upload_reply);
-
-	return 0;
-}
-
-int nanohub_comms_kernel_download(struct nanohub_data *data,
-				  const u8 *image, size_t length)
-{
-	return nanohub_comms_download(data, image, length,
-				      COMMS_FLASH_KERNEL_ID);
-}
-
-int nanohub_comms_app_download(struct nanohub_data *data, const u8 *image,
-			       size_t length)
-{
-	return nanohub_comms_download(data, image, length, COMMS_FLASH_APP_ID);
-}
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/comms.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/comms.h
deleted file mode 100644
index 8fb3d4f..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/comms.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef _NANOHUB_COMMS_H
-#define _NANOHUB_COMMS_H
-
-struct __attribute__ ((__packed__)) nanohub_packet {
-	u8 sync;
-	u32 seq;
-	u32 reason;
-	u8 len;
-	u8 data[];
-};
-
-struct __attribute__ ((__packed__)) nanohub_packet_pad {
-	u8 pad[3];
-	struct nanohub_packet
-	 packet;
-};
-
-struct __attribute__ ((__packed__)) nanohub_packet_crc {
-	u32 crc;
-};
-
-struct nanohub_data;
-
-struct nanohub_comms {
-	struct semaphore sem;
-	u32 seq;
-	int timeout_write;
-	int timeout_ack;
-	int timeout_reply;
-	int (*open)(void *data);
-	void (*close)(void *data);
-	int (*write)(void *data, u8 *buf, int size, int timeout_w);
-	int (*read)(void *data, u8 *buf, int size, int timeout_r);
-
-	union {
-		struct i2c_client *i2c_client;
-		struct spi_device *spi_device;
-	};
-
-	u8 *tx_buffer;
-	u8 *rx_buffer;
-};
-
-int nanohub_comms_kernel_download(struct nanohub_data *data,
-				  const u8 *image,
-				  size_t length);
-int nanohub_comms_app_download(struct nanohub_data *data,
-			       const u8 *image, size_t length);
-int nanohub_comms_rx_retrans_boottime(struct nanohub_data *data,
-				      u32 cmd, u8 *rx,
-				      size_t rx_len,
-				      int retrans_cnt,
-				      int retrans_delay);
-int nanohub_comms_tx_rx_retrans(struct nanohub_data *data, u32 cmd,
-				const u8 *tx, u8 tx_len,
-				u8 *rx, size_t rx_len, bool user,
-				int retrans_cnt, int retrans_delay);
-
-#define ERROR_NACK			-1
-#define ERROR_BUSY			-2
-
-#define MAX_UINT8			((1 << (8 * sizeof(u8))) - 1)
-
-#define COMMS_SYNC			0x31
-#define COMMS_FLASH_KERNEL_ID		0x1
-#define COMMS_FLASH_EEDATA_ID		0x2
-#define COMMS_FLASH_APP_ID		0x4
-
-#define CMD_COMMS_ACK			0x00000000
-#define CMD_COMMS_NACK			0x00000001
-#define CMD_COMMS_BUSY			0x00000002
-
-#define CMD_COMMS_GET_OS_HW_VERSIONS	0x00001000
-#define CMD_COMMS_GET_APP_VERSIONS	0x00001001
-#define CMD_COMMS_QUERY_APP_INFO	0x00001002
-
-#define CMD_COMMS_START_KERNEL_UPLOAD	0x00001040
-#define CMD_COMMS_KERNEL_CHUNK		0x00001041
-#define CMD_COMMS_FINISH_KERNEL_UPLOAD	0x00001042
-
-#define CMD_COMMS_START_APP_UPLOAD	0x00001050
-#define CMD_COMMS_APP_CHUNK		0x00001051
-
-#define CMD_COMMS_CLR_GET_INTR		0x00001080
-#define CMD_COMMS_MASK_INTR		0x00001081
-#define CMD_COMMS_UNMASK_INTR		0x00001082
-#define CMD_COMMS_READ			0x00001090
-#define CMD_COMMS_WRITE			0x00001091
-
-#define CHUNK_REPLY_ACCEPTED		0
-#define CHUNK_REPLY_WAIT                1
-#define CHUNK_REPLY_RESEND              2
-#define CHUNK_REPLY_RESTART             3
-#define CHUNK_REPLY_CANCEL              4
-#define CHUNK_REPLY_CANCEL_NO_RETRY     5
-
-#define UPLOAD_REPLY_SUCCESS			0
-#define UPLOAD_REPLY_PROCESSING			1
-#define UPLOAD_REPLY_WAITING_FOR_DATA		2
-#define UPLOAD_REPLY_APP_SEC_KEY_NOT_FOUND	3
-#define UPLOAD_REPLY_APP_SEC_HEADER_ERROR	4
-#define UPLOAD_REPLY_APP_SEC_TOO_MUCH_DATA	5
-#define UPLOAD_REPLY_APP_SEC_TOO_LITTLE_DATA	6
-#define UPLOAD_REPLY_APP_SEC_SIG_VERIFY_FAIL	7
-#define UPLOAD_REPLY_APP_SEC_SIG_DECODE_FAIL	8
-#define UPLOAD_REPLY_APP_SEC_SIG_ROOT_UNKNOWN	9
-#define UPLOAD_REPLY_APP_SEC_MEMORY_ERROR	10
-#define UPLOAD_REPLY_APP_SEC_INVALID_DATA	11
-#define UPLOAD_REPLY_APP_SEC_BAD		12
-
-static inline int nanohub_comms_write(struct nanohub_data *data,
-				      const u8 *buffer, size_t buffer_len)
-{
-	u8 ret;
-
-	if (nanohub_comms_tx_rx_retrans
-	    (data, CMD_COMMS_WRITE, buffer, buffer_len, &ret, sizeof(ret), true,
-	     10, 10) == sizeof(ret)) {
-		if (ret)
-			return buffer_len;
-		else
-			return 0;
-	} else {
-		return ERROR_NACK;
-	}
-}
-
-ssize_t nanohub_external_write(const char *buffer, size_t length);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/main.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/main.c
deleted file mode 100644
index f6e0ccb..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/main.c
+++ /dev/null
@@ -1,1019 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/iio/iio.h>
-#include <linux/firmware.h>
-#include <linux/fs.h>
-#include <linux/cdev.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/of_gpio.h>
-#include <linux/of_irq.h>
-#include <linux/interrupt.h>
-#include <linux/poll.h>
-#include <linux/list.h>
-#include <linux/vmalloc.h>
-#include <linux/spinlock.h>
-#include <linux/semaphore.h>
-#include <linux/sched.h>
-#include <linux/sched/rt.h>
-#include <uapi/linux/sched/types.h>
-
-#include "main.h"
-#include "comms.h"
-#include "bl.h"
-#include "nanohub-mtk.h"
-#include "nanohub.h"
-
-#define READ_QUEUE_DEPTH	10
-#define APP_FROM_HOST_EVENTID	0x000000F8
-#define FIRST_SENSOR_EVENTID	0x00000200
-#define LAST_SENSOR_EVENTID	0x000002FF
-#define APP_TO_HOST_EVENTID	0x00000401
-#define OS_LOG_EVENTID		0x3B474F4C
-#define WAKEUP_INTERRUPT	1
-#define WAKEUP_TIMEOUT_MS	1000
-#define SUSPEND_TIMEOUT_MS	100
-
-struct nanohub_data *g_nanohub_data_p;
-
-/**
- * struct gpio_config - this is a binding between platform data and driver data
- * @label:     for diagnostics
- * @flags:     to pass to gpio_request_one()
- * @options:   one or more of GPIO_OPT_* flags, below
- * @pdata_off: offset of u32 field in platform data with gpio #
- * @data_off:  offset of int field in driver data with irq # (optional)
- */
-struct gpio_config {
-	const char *label;
-	u16 flags;
-	u16 options;
-	u16 pdata_off;
-	u16 data_off;
-};
-
-#define GPIO_OPT_HAS_IRQ	0x0001
-#define GPIO_OPT_OPTIONAL	0x8000
-
-#define PLAT_GPIO_DEF(name, _flags) \
-	.pdata_off = offsetof(struct nanohub_platform_data, name ## _gpio), \
-	.label = "nanohub_" #name, \
-	.flags = _flags
-
-#define PLAT_GPIO_DEF_IRQ(name, _opts) \
-	.data_off = offsetof(struct nanohub_data, name), \
-	.options = GPIO_OPT_HAS_IRQ | (_opts)
-
-static struct class *sensor_class;
-static int major;
-
-static const struct gpio_config gconf[] = {
-	{ PLAT_GPIO_DEF(nreset, GPIOF_OUT_INIT_HIGH) },
-	{ PLAT_GPIO_DEF(wakeup, GPIOF_OUT_INIT_HIGH) },
-	{ PLAT_GPIO_DEF(boot0, GPIOF_OUT_INIT_LOW) },
-	{ PLAT_GPIO_DEF(irq1, GPIOF_DIR_IN),
-	  PLAT_GPIO_DEF_IRQ(irq1, 0)
-	},
-	{ PLAT_GPIO_DEF(irq2, GPIOF_DIR_IN),
-	  PLAT_GPIO_DEF_IRQ(irq2, GPIO_OPT_OPTIONAL)
-	},
-};
-
-static const struct iio_info nanohub_iio_info = {
-};
-
-static const struct file_operations nanohub_fileops = {
-	.owner = THIS_MODULE,
-};
-
-enum {
-	ST_IDLE,
-	ST_ERROR,
-	ST_RUNNING
-};
-
-static inline bool gpio_is_optional(const struct gpio_config *_cfg)
-{
-	return _cfg->options & GPIO_OPT_OPTIONAL;
-}
-
-static inline bool gpio_has_irq(const struct gpio_config *_cfg)
-{
-	return _cfg->options & GPIO_OPT_HAS_IRQ;
-}
-
-static inline bool
-nanohub_has_priority_lock_locked(struct nanohub_data *data)
-{
-	return  atomic_read(&data->wakeup_lock_cnt) >
-		atomic_read(&data->wakeup_cnt);
-}
-
-static inline void nanohub_notify_thread(struct nanohub_data *data)
-{
-	atomic_set(&data->kthread_run, 1);
-	/* wake_up implementation works as memory barrier */
-	wake_up_interruptible_sync(&data->kthread_wait);
-}
-
-static inline void nanohub_io_init(struct nanohub_io *io,
-				   struct nanohub_data *data,
-				   struct device *dev)
-{
-	init_waitqueue_head(&io->buf_wait);
-	INIT_LIST_HEAD(&io->buf_list);
-	io->data = data;
-	io->dev = dev;
-}
-
-static inline bool nanohub_io_has_buf(struct nanohub_io *io)
-{
-	return !list_empty(&io->buf_list);
-}
-
-static struct nanohub_buf *nanohub_io_get_buf(struct nanohub_io *io,
-					      bool wait)
-{
-	struct nanohub_buf *buf = NULL;
-	int ret;
-
-	spin_lock(&io->buf_wait.lock);
-	if (wait) {
-		ret = wait_event_interruptible_locked(io->buf_wait,
-						      nanohub_io_has_buf(io));
-		if (ret < 0) {
-			spin_unlock(&io->buf_wait.lock);
-			return ERR_PTR(ret);
-		}
-	}
-
-	if (nanohub_io_has_buf(io)) {
-		buf = list_first_entry(&io->buf_list, struct nanohub_buf, list);
-		list_del(&buf->list);
-	}
-	spin_unlock(&io->buf_wait.lock);
-
-	return buf;
-}
-
-static void nanohub_io_put_buf(struct nanohub_io *io,
-			       struct nanohub_buf *buf)
-{
-	bool was_empty;
-
-	spin_lock(&io->buf_wait.lock);
-	was_empty = !nanohub_io_has_buf(io);
-	list_add_tail(&buf->list, &io->buf_list);
-	spin_unlock(&io->buf_wait.lock);
-
-	if (was_empty) {
-		if (&io->data->free_pool == io)
-			nanohub_notify_thread(io->data);
-		else
-			wake_up_interruptible(&io->buf_wait);
-	}
-}
-
-static inline bool mcu_wakeup_try_lock(struct nanohub_data *data, int key)
-{
-	/* implementation contains memory barrier */
-	return atomic_cmpxchg(&data->wakeup_acquired, 0, key) == 0;
-}
-
-static inline void mcu_wakeup_unlock(struct nanohub_data *data, int key)
-{
-	WARN(atomic_cmpxchg(&data->wakeup_acquired, key, 0) != key,
-	     "%s: failed to unlock with key %d; current state: %d",
-	     __func__, key, atomic_read(&data->wakeup_acquired));
-}
-
-static inline void nanohub_set_state(struct nanohub_data *data, int state)
-{
-	atomic_set(&data->thread_state, state);
-	smp_mb__after_atomic(); /* updated thread state is now visible */
-}
-
-static inline int nanohub_get_state(struct nanohub_data *data)
-{
-	smp_mb__before_atomic(); /* wait for all updates to finish */
-	return atomic_read(&data->thread_state);
-}
-
-int request_wakeup_ex(struct nanohub_data *data, long timeout_ms,
-		      int key, int lock_mode)
-{
-	return 0;
-}
-
-void release_wakeup_ex(struct nanohub_data *data, int key, int lock_mode)
-{
-}
-
-int nanohub_wait_for_interrupt(struct nanohub_data *data)
-{
-	return 0;
-}
-
-int nanohub_wakeup_eom(struct nanohub_data *data, bool repeat)
-{
-	return 0;
-}
-
-static void __nanohub_interrupt_cfg(struct nanohub_data *data,
-				    u8 interrupt, bool mask)
-{
-	int ret;
-	u8 mask_ret = 0;
-	int cnt = 10;
-	struct device *dev = data->io[ID_NANOHUB_SENSOR].dev;
-	int cmd = mask ? CMD_COMMS_MASK_INTR : CMD_COMMS_UNMASK_INTR;
-
-	do {
-		ret = request_wakeup_timeout(data, WAKEUP_TIMEOUT_MS);
-		if (ret) {
-			dev_err(dev,
-				"%s: interrupt %d %smask failed: ret=%d\n",
-				__func__, interrupt, mask ? "" : "un", ret);
-			return;
-		}
-
-		ret =
-		    nanohub_comms_tx_rx_retrans(data, cmd,
-						&interrupt, sizeof(interrupt),
-						&mask_ret, sizeof(mask_ret),
-						false, 10, 0);
-		release_wakeup(data);
-		dev_dbg(dev,
-			"%smasking interrupt %d, ret=%d, mask_ret=%d\n",
-			mask ? "" : "un",
-			interrupt, ret, mask_ret);
-	} while ((ret != 1 || mask_ret != 1) && --cnt > 0);
-}
-
-static inline void nanohub_mask_interrupt(struct nanohub_data *data,
-					  u8 interrupt)
-{
-	__nanohub_interrupt_cfg(data, interrupt, true);
-}
-
-static inline void nanohub_unmask_interrupt(struct nanohub_data *data,
-					    u8 interrupt)
-{
-	__nanohub_interrupt_cfg(data, interrupt, false);
-}
-
-static ssize_t nanohub_wakeup_query(struct device *dev,
-				    struct device_attribute *attr, char *buf)
-{
-	struct nanohub_data *data = dev_get_nanohub_data(dev);
-	const struct nanohub_platform_data *pdata = data->pdata;
-
-	data->err_cnt = 0;
-	if (nanohub_irq1_fired(data) || nanohub_irq2_fired(data))
-		wake_up_interruptible(&data->wakeup_wait);
-
-	return scnprintf(buf, PAGE_SIZE, "WAKEUP: %d INT1: %d INT2: %d\n",
-			 gpio_get_value(pdata->wakeup_gpio),
-			 gpio_get_value(pdata->irq1_gpio),
-			 data->irq2 ? gpio_get_value(pdata->irq2_gpio) : -1);
-}
-
-static ssize_t nanohub_app_info(struct device *dev,
-				struct device_attribute *attr, char *buf)
-{
-	struct nanohub_data *data = dev_get_nanohub_data(dev);
-	struct {
-		u64 appid;
-		u32 appver;
-		u32 appsize;
-	} __packed buffer;
-	u32 i = 0;
-	int ret;
-	ssize_t len = 0;
-
-	do {
-		if (request_wakeup(data))
-			return -ERESTARTSYS;
-
-		if (nanohub_comms_tx_rx_retrans
-		    (data, CMD_COMMS_QUERY_APP_INFO, (u8 *)&i,
-		     sizeof(i), (u8 *)&buffer, sizeof(buffer),
-		     false, 10, 10) == sizeof(buffer)) {
-			ret =
-			    scnprintf(buf + len, PAGE_SIZE - len,
-				      "app %d id:%016llx ver:%08x size:%08x\n",
-				      i, buffer.appid, buffer.appver,
-				      buffer.appsize);
-			if (ret > 0) {
-				len += ret;
-				i++;
-			}
-		} else {
-			ret = -1;
-		}
-
-		release_wakeup(data);
-	} while (ret > 0);
-
-	return len;
-}
-
-static ssize_t nanohub_firmware_query(struct device *dev,
-				      struct device_attribute *attr, char *buf)
-{
-	struct nanohub_data *data = dev_get_nanohub_data(dev);
-	u16 buffer[6];
-
-	if (request_wakeup(data))
-		return -ERESTARTSYS;
-
-	if (nanohub_comms_tx_rx_retrans
-	    (data, CMD_COMMS_GET_OS_HW_VERSIONS, NULL, 0, (u8 *)&buffer,
-	     sizeof(buffer), false, 10, 10) == sizeof(buffer)) {
-		release_wakeup(data);
-		return scnprintf(buf, PAGE_SIZE,
-			"hw type: %04x hw ver: %04x bl ver: %04x os ver: %04x variant ver: %08x\n",
-			buffer[0], buffer[1], buffer[2], buffer[3],
-			buffer[5] << 16 | buffer[4]);
-	} else {
-		release_wakeup(data);
-		return 0;
-	}
-}
-
-static inline int nanohub_wakeup_lock(struct nanohub_data *data,
-				      int mode)
-{
-	return 0;
-}
-
-/* returns lock mode used to perform this lock */
-static inline int nanohub_wakeup_unlock(struct nanohub_data *data)
-{
-	int mode = atomic_read(&data->lock_mode);
-
-	atomic_set(&data->lock_mode, LOCK_MODE_NONE);
-	if (mode != LOCK_MODE_SUSPEND_RESUME)
-		enable_irq(data->irq1);
-	if (mode == LOCK_MODE_IO)
-		nanohub_bl_close(data);
-	if (data->irq2)
-		enable_irq(data->irq2);
-	release_wakeup_ex(data, KEY_WAKEUP_LOCK, mode);
-	if (!data->irq2)
-		nanohub_unmask_interrupt(data, 2);
-	nanohub_notify_thread(data);
-
-	return mode;
-}
-
-/*
- *static void __nanohub_hw_reset(struct nanohub_data *data, int boot0)
- *{
- *	const struct nanohub_platform_data *pdata = data->pdata;
- *
- *	gpio_set_value(pdata->nreset_gpio, 0);
- *	gpio_set_value(pdata->boot0_gpio, boot0 ? 1 : 0);
- *	usleep_range(30, 40);
- *	gpio_set_value(pdata->nreset_gpio, 1);
- *	if (boot0)
- *		usleep_range(70000, 75000);
- *	else
- *		usleep_range(750000, 800000);
- *}
- */
-static ssize_t nanohub_hw_reset(struct device *dev,
-				struct device_attribute *attr,
-				const char *buf, size_t count)
-{
-	return -EIO;
-/*
- *	struct nanohub_data *data = dev_get_nanohub_data(dev);
- *	int ret;
- *
- *	ret = nanohub_wakeup_lock(data, LOCK_MODE_RESET);
- *	if (!ret) {
- *		data->err_cnt = 0;
- *		__nanohub_hw_reset(data, 0);
- *		nanohub_wakeup_unlock(data);
- *	}
- *
- *	return ret < 0 ? ret : count;
- */
-}
-
-static ssize_t nanohub_erase_shared(struct device *dev,
-				    struct device_attribute *attr,
-				    const char *buf, size_t count)
-{
-	return -EIO;
-/*
- *	struct nanohub_data *data = dev_get_nanohub_data(dev);
- *	u8 status = CMD_ACK;
- *	int ret;
- *
- *	ret = nanohub_wakeup_lock(data, LOCK_MODE_IO);
- *	if (ret < 0)
- *		return ret;
- *
- *	data->err_cnt = 0;
- *	__nanohub_hw_reset(data, 1);
- *
- *	status = nanohub_bl_erase_shared(data);
- *	dev_info(dev, "nanohub_bl_erase_shared: status=%02x\n",
- *		 status);
- *
- *	__nanohub_hw_reset(data, 0);
- *	nanohub_wakeup_unlock(data);
- *
- *	return ret < 0 ? ret : count;
- */
-}
-
-static ssize_t nanohub_download_bl(struct device *dev,
-				   struct device_attribute *attr,
-				   const char *buf, size_t count)
-{
-	return -EIO;
-/*
- *	struct nanohub_data *data = dev_get_nanohub_data(dev);
- *	const struct nanohub_platform_data *pdata = data->pdata;
- *	const struct firmware *fw_entry;
- *	int ret;
- *	u8 status = CMD_ACK;
- *
- *	ret = nanohub_wakeup_lock(data, LOCK_MODE_IO);
- *	if (ret < 0)
- *		return ret;
- *
- *	data->err_cnt = 0;
- *	__nanohub_hw_reset(data, 1);
- *
- *	ret = request_firmware(&fw_entry, "nanohub.full.bin", dev);
- *	if (ret) {
- *		dev_err(dev, "%s: err=%d\n", __func__, ret);
- *	} else {
- *		status = nanohub_bl_download(data, pdata->bl_addr,
- *					     fw_entry->data, fw_entry->size);
- *		dev_info(dev, "%s: status=%02x\n", __func__, status);
- *		release_firmware(fw_entry);
- *	}
- *
- *	__nanohub_hw_reset(data, 0);
- *	nanohub_wakeup_unlock(data);
- *
- *	return ret < 0 ? ret : count;
- */
-}
-
-static ssize_t nanohub_download_kernel(struct device *dev,
-				       struct device_attribute *attr,
-				       const char *buf, size_t count)
-{
-	return -EIO;
-/*
- *	struct nanohub_data *data = dev_get_nanohub_data(dev);
- *	const struct firmware *fw_entry;
- *	int ret;
- *
- *	ret = request_firmware(&fw_entry, "nanohub.update.bin", dev);
- *	if (ret) {
- *		dev_err(dev, "nanohub_download_kernel: err=%d\n", ret);
- *		return -EIO;
- *	}
- *	ret = nanohub_comms_kernel_download(data, fw_entry->data,
- *					    fw_entry->size);
- *
- *	release_firmware(fw_entry);
- *
- *	return count;
- */
-}
-
-static ssize_t nanohub_download_app(struct device *dev,
-				    struct device_attribute *attr,
-				    const char *buf, size_t count)
-{
-	return -EIO;
-/*
- *	struct nanohub_data *data = dev_get_nanohub_data(dev);
- *	const struct firmware *fw_entry;
- *	char buffer[70];
- *	int i, ret, ret1, ret2, file_len = 0, appid_len = 0, ver_len = 0;
- *	const char *appid = NULL, *ver = NULL;
- *	unsigned long version;
- *	u64 id;
- *	u32 cur_version;
- *	bool update = true;
- *
- *	for (i = 0; i < count; i++) {
- *		if (buf[i] == ' ') {
- *			if (i + 1 == count)
- *				break;
- *			if (!appid)
- *				appid = buf + i + 1;
- *			else if (!ver)
- *				ver = buf + i + 1;
- *			else
- *				break;
- *		} else if (buf[i] == '\n' || buf[i] == '\r') {
- *			break;
- *		}
- *		if (ver)
- *			ver_len++;
- *		else if (appid)
- *			appid_len++;
- *		else
- *			file_len++;
- *	}
- *
- *	if (file_len > 64 || appid_len > 16 || ver_len > 8 || file_len < 1)
- *		return -EIO;
- *
- *	memcpy(buffer, buf, file_len);
- *	memcpy(buffer + file_len, ".napp", 5);
- *	buffer[file_len + 5] = '\0';
- *
- *	ret = request_firmware(&fw_entry, buffer, dev);
- *	if (ret) {
- *		dev_err(dev, "nanohub_download_app(%s): err=%d\n",
- *			buffer, ret);
- *		return -EIO;
- *	}
- *	if (appid_len > 0 && ver_len > 0) {
- *		memcpy(buffer, appid, appid_len);
- *		buffer[appid_len] = '\0';
- *
- *		ret1 = kstrtoull(buffer, 16, &id);
- *
- *		memcpy(buffer, ver, ver_len);
- *		buffer[ver_len] = '\0';
- *
- *		ret2 = kstrtoul(buffer, 16, &version);
- *
- *		if (ret1 == 0 && ret2 == 0) {
- *			if (request_wakeup(data))
- *				return -ERESTARTSYS;
- *			if (nanohub_comms_tx_rx_retrans
- *			    (data, CMD_COMMS_GET_APP_VERSIONS,
- *			     (u8 *)&id, sizeof(id),
- *			     (u8 *)&cur_version,
- *			     sizeof(cur_version), false, 10,
- *			     10) == sizeof(cur_version)) {
- *				if (cur_version == version)
- *					update = false;
- *			}
- *			release_wakeup(data);
- *		}
- *	}
- *
- *	if (update)
- *		ret =
- *		    nanohub_comms_app_download(data, fw_entry->data,
- *					       fw_entry->size);
- *
- *	release_firmware(fw_entry);
- *
- *	return count;
- */
-}
-
-static struct device_attribute attributes[] = {
-	__ATTR(wakeup, 0440, nanohub_wakeup_query, NULL),
-	__ATTR(app_info, 0440, nanohub_app_info, NULL),
-	__ATTR(firmware_version, 0440, nanohub_firmware_query, NULL),
-	__ATTR(download_bl, 0220, NULL, nanohub_download_bl),
-	__ATTR(download_kernel, 0220, NULL, nanohub_download_kernel),
-	__ATTR(download_app, 0220, NULL, nanohub_download_app),
-	__ATTR(erase_shared, 0220, NULL, nanohub_erase_shared),
-	__ATTR(reset, 0220, NULL, nanohub_hw_reset),
-};
-
-static inline int nanohub_create_sensor(struct nanohub_data *data)
-{
-	int i, ret;
-	struct device *sensor_dev = data->io[ID_NANOHUB_SENSOR].dev;
-
-	for (i = 0, ret = 0; i < ARRAY_SIZE(attributes); i++) {
-		ret = device_create_file(sensor_dev, &attributes[i]);
-		if (ret) {
-			dev_err(sensor_dev,
-				"create sysfs attr %d [%s] failed; err=%d\n",
-				i, attributes[i].attr.name, ret);
-			goto fail_attr;
-		}
-	}
-
-	ret = sysfs_create_link(&sensor_dev->kobj,
-				&data->iio_dev->dev.kobj, "iio");
-	if (ret) {
-		dev_err(sensor_dev,
-			"sysfs_create_link failed; err=%d\n", ret);
-		goto fail_attr;
-	}
-	goto done;
-
-fail_attr:
-	for (i--; i >= 0; i--)
-		device_remove_file(sensor_dev, &attributes[i]);
-done:
-	return ret;
-}
-
-static int nanohub_create_devices(struct nanohub_data *data)
-{
-	int i, ret;
-	static const char *names[ID_NANOHUB_MAX] = {
-			"nanohub", "nanohub_comms"
-	};
-
-	for (i = 0; i < ID_NANOHUB_MAX; ++i) {
-		struct nanohub_io *io = &data->io[i];
-
-		nanohub_io_init(io, data, device_create(sensor_class, NULL,
-							MKDEV(major, i),
-							io, names[i]));
-		if (IS_ERR(io->dev)) {
-			ret = PTR_ERR(io->dev);
-			pr_err("nanohub: device_create failed for %s; err=%d\n",
-			       names[i], ret);
-			goto fail_dev;
-		}
-	}
-
-	ret = nanohub_create_sensor(data);
-	if (!ret)
-		goto done;
-fail_dev:
-	for (--i; i >= 0; --i)
-		device_destroy(sensor_class, MKDEV(major, i));
-done:
-	return ret;
-}
-
-ssize_t nanohub_external_write(const char *buffer, size_t length)
-{
-	struct nanohub_data *data = g_nanohub_data_p;
-	int ret;
-	u8 ret_data;
-
-	if (request_wakeup(data))
-		return -ERESTARTSYS;
-
-	if (nanohub_comms_tx_rx_retrans
-		(data, CMD_COMMS_WRITE, buffer, length, &ret_data,
-		sizeof(ret_data), false,
-		10, 10) == sizeof(ret_data)) {
-		if (ret_data)
-			ret = length;
-		else
-			ret = 0;
-	} else {
-		ret = ERROR_NACK;
-	}
-
-	release_wakeup(data);
-
-	return ret;
-}
-EXPORT_SYMBOL(nanohub_external_write);
-
-static bool nanohub_os_log(char *buffer, int len)
-{
-	if (le32_to_cpu((((u32 *)buffer)[0]) & 0x7FFFFFFF) ==
-	    OS_LOG_EVENTID) {
-		char *mtype, *mdata = &buffer[5];
-
-		buffer[len - 1] = '\0';
-
-		switch (buffer[4]) {
-		case 'E':
-			mtype = KERN_ERR;
-			break;
-		case 'W':
-			mtype = KERN_WARNING;
-			break;
-		case 'I':
-			mtype = KERN_INFO;
-			break;
-		case 'D':
-			mtype = KERN_DEBUG;
-			break;
-		default:
-			mtype = KERN_DEFAULT;
-			mdata--;
-			break;
-		}
-		pr_debug("%snanohub: %s", mtype, mdata);
-		return true;
-	} else {
-		return false;
-	}
-}
-
-static void nanohub_process_buffer(struct nanohub_data *data,
-				   struct nanohub_buf **buf,
-				   int ret)
-{
-	u32 event_id;
-	u8 interrupt;
-	bool wakeup = false;
-	struct nanohub_io *io = &data->io[ID_NANOHUB_SENSOR];
-
-	data->err_cnt = 0;
-	if (ret < 4 || nanohub_os_log((*buf)->buffer, ret)) {
-		release_wakeup(data);
-		return;
-	}
-
-	(*buf)->length = ret;
-
-	event_id = le32_to_cpu((((u32 *)(*buf)->buffer)[0]) & 0x7FFFFFFF);
-	if (ret >= sizeof(u32) + sizeof(u64) + sizeof(u32) &&
-	    event_id > FIRST_SENSOR_EVENTID &&
-	    event_id <= LAST_SENSOR_EVENTID) {
-		interrupt = (*buf)->buffer[sizeof(u32) +
-					   sizeof(u64) + 3];
-		if (interrupt == WAKEUP_INTERRUPT)
-			wakeup = true;
-	}
-	if (event_id == APP_TO_HOST_EVENTID) {
-		wakeup = true;
-		io = &data->io[ID_NANOHUB_COMMS];
-	}
-
-	nanohub_io_put_buf(io, *buf);
-
-	*buf = NULL;
-	/* (for wakeup interrupts): hold a wake lock for 10ms so the sensor hal
-	 * has time to grab its own wake lock
-	 */
-	if (wakeup)
-		__pm_wakeup_event(data->ws, 10);
-	release_wakeup(data);
-}
-
-static int nanohub_kthread(void *arg)
-{
-	struct nanohub_data *data = (struct nanohub_data *)arg;
-	struct nanohub_buf *buf = NULL;
-	int ret;
-	u32 clear_interrupts[8] = { 0x00000006 };
-	struct device *sensor_dev = data->io[ID_NANOHUB_SENSOR].dev;
-	static const struct sched_param param = {
-		.sched_priority = (MAX_USER_RT_PRIO / 2) - 1,
-	};
-
-	data->err_cnt = 0;
-	sched_setscheduler(current, SCHED_FIFO, &param);
-	nanohub_set_state(data, ST_IDLE);
-
-	while (!kthread_should_stop()) {
-		switch (nanohub_get_state(data)) {
-		case ST_IDLE:
-			if (wait_event_interruptible(
-					data->kthread_wait,
-					atomic_read(&data->kthread_run)))
-				continue;
-			nanohub_set_state(data, ST_RUNNING);
-			break;
-		case ST_ERROR:
-			msleep_interruptible(WAKEUP_TIMEOUT_MS);
-			nanohub_set_state(data, ST_RUNNING);
-			break;
-		case ST_RUNNING:
-			break;
-		}
-		atomic_set(&data->kthread_run, 0);
-		if (!buf)
-			buf = nanohub_io_get_buf(&data->free_pool,
-						 false);
-		if (buf) {
-			ret = request_wakeup_timeout(data, WAKEUP_TIMEOUT_MS);
-			if (ret) {
-				dev_info(sensor_dev,
-					 "%s: request_wakeup_timeout: ret=%d\n",
-					 __func__, ret);
-				continue;
-			}
-
-			ret = nanohub_comms_rx_retrans_boottime(
-			    data, CMD_COMMS_READ, buf->buffer,
-			    sizeof(buf->buffer), 10, 0);
-			if (ret > 0) {
-				nanohub_process_buffer(data, &buf, ret);
-				if (!nanohub_irq1_fired(data) &&
-				    !nanohub_irq2_fired(data)) {
-					nanohub_set_state(data, ST_IDLE);
-					continue;
-				}
-			} else if (ret == 0) {
-				/* queue empty, go to sleep */
-				data->err_cnt = 0;
-				data->interrupts[0] &= ~0x00000006;
-				release_wakeup(data);
-				nanohub_set_state(data, ST_IDLE);
-				continue;
-			} else {
-				release_wakeup(data);
-				if (++data->err_cnt >= 10) {
-					dev_err(sensor_dev,
-						"%s: err_cnt=%d\n",
-						__func__,
-						data->err_cnt);
-					nanohub_set_state(data, ST_ERROR);
-					continue;
-				}
-			}
-		} else {
-			if (!nanohub_irq1_fired(data) &&
-			    !nanohub_irq2_fired(data)) {
-				nanohub_set_state(data, ST_IDLE);
-				continue;
-			}
-			/* pending interrupt, but no room to read data -
-			 * clear interrupts
-			 */
-			if (request_wakeup(data))
-				continue;
-			nanohub_comms_tx_rx_retrans(data,
-						    CMD_COMMS_CLR_GET_INTR,
-						    (u8 *)clear_interrupts,
-						    sizeof(clear_interrupts),
-						    (u8 *)data->interrupts,
-						    sizeof(data->interrupts),
-						    false, 10, 0);
-			release_wakeup(data);
-			nanohub_set_state(data, ST_IDLE);
-		}
-	}
-
-	return 0;
-}
-
-struct iio_dev *nanohub_probe(struct device *dev, struct iio_dev *iio_dev)
-{
-	int ret, i;
-	/* const struct nanohub_platform_data *pdata;*/
-	struct nanohub_data *data;
-	struct nanohub_buf *buf;
-	bool own_iio_dev = !iio_dev;
-
-	if (own_iio_dev) {
-		iio_dev = devm_iio_device_alloc(dev,
-			sizeof(struct nanohub_data));
-		if (!iio_dev)
-			return ERR_PTR(-ENOMEM);
-	}
-	iio_dev->name = "nanohub";
-	iio_dev->dev.parent = dev;
-	iio_dev->info = &nanohub_iio_info;
-	iio_dev->driver_module = THIS_MODULE;
-	iio_dev->channels = NULL;
-	iio_dev->num_channels = 0;
-	data = iio_priv(iio_dev);
-	g_nanohub_data_p = data;
-	data->iio_dev = iio_dev;
-	/* data->pdata = pdata; */
-	data->pdata = devm_kzalloc(dev, sizeof(struct nanohub_platform_data),
-				   GFP_KERNEL);
-	init_waitqueue_head(&data->kthread_wait);
-
-	nanohub_io_init(&data->free_pool, data, dev);
-
-	buf = vmalloc(sizeof(*buf) * READ_QUEUE_DEPTH);
-	data->vbuf = buf;
-	if (!buf) {
-		ret = -ENOMEM;
-		goto fail_vma;
-	}
-
-	for (i = 0; i < READ_QUEUE_DEPTH; i++)
-		nanohub_io_put_buf(&data->free_pool, &buf[i]);
-	atomic_set(&data->kthread_run, 0);
-
-	data->ws = wakeup_source_register(NULL, "nanohub_wakelock_read");
-	if (!data->ws) {
-		pr_err("nanohub: wakeup source init fail\n");
-		ret = -ENOMEM;
-		goto fail_wakeup;
-	}
-
-	atomic_set(&data->lock_mode, LOCK_MODE_NONE);
-	atomic_set(&data->wakeup_cnt, 0);
-	atomic_set(&data->wakeup_lock_cnt, 0);
-	atomic_set(&data->wakeup_acquired, 0);
-	init_waitqueue_head(&data->wakeup_wait);
-	ret = iio_device_register(iio_dev);
-	if (ret) {
-		pr_err("nanohub: iio_device_register failed\n");
-		goto fail_irq;
-	}
-	ret = nanohub_create_devices(data);
-	if (ret)
-		goto fail_dev;
-	data->thread = kthread_run(nanohub_kthread, data, "nanohub");
-
-	usleep_range(25, 30);
-
-	return iio_dev;
-fail_dev:
-	iio_device_unregister(iio_dev);
-
-fail_irq:
-	wakeup_source_unregister(data->ws);
-fail_wakeup:
-	vfree(buf);
-fail_vma:
-	if (own_iio_dev)
-		iio_device_free(iio_dev);
-
-	return ERR_PTR(ret);
-}
-
-int nanohub_reset(struct nanohub_data *data)
-{
-	const struct nanohub_platform_data *pdata = data->pdata;
-
-	gpio_set_value(pdata->nreset_gpio, 1);
-	usleep_range(650000, 700000);
-	enable_irq(data->irq1);
-	if (data->irq2)
-		enable_irq(data->irq2);
-	else
-		nanohub_unmask_interrupt(data, 2);
-
-	return 0;
-}
-
-int nanohub_suspend(struct iio_dev *iio_dev)
-{
-	struct nanohub_data *data = iio_priv(iio_dev);
-
-	nanohub_mask_interrupt(data, 2);
-	return 0;
-}
-
-int nanohub_resume(struct iio_dev *iio_dev)
-{
-	struct nanohub_data *data = iio_priv(iio_dev);
-
-	nanohub_unmask_interrupt(data, 2);
-	return 0;
-}
-
-int __init nanohub_init(void)
-{
-	int ret = 0;
-
-	sensor_class = class_create(THIS_MODULE, "nanohub");
-	if (IS_ERR(sensor_class)) {
-		ret = PTR_ERR(sensor_class);
-		pr_err("nanohub: class_create failed; err=%d\n", ret);
-	}
-	if (!ret)
-		major = __register_chrdev(0, 0, ID_NANOHUB_MAX, "nanohub",
-					  &nanohub_fileops);
-
-	if (major < 0) {
-		ret = major;
-		major = 0;
-		pr_err("nanohub: can't register; err=%d\n", ret);
-	}
-
-#ifdef CONFIG_NANOHUB_I2C
-	if (ret == 0)
-		ret = nanohub_i2c_init();
-#endif
-#ifdef CONFIG_NANOHUB_SPI
-	if (ret == 0)
-		ret = nanohub_spi_init();
-#endif
-#ifdef CONFIG_NANOHUB_MTK_IPI
-		ret = nanohub_ipi_init();
-#endif
-	pr_info("nanohub: loaded; ret=%d\n", ret);
-	return ret;
-}
-
-void __exit nanohub_cleanup(void)
-{
-#ifdef CONFIG_NANOHUB_I2C
-	nanohub_i2c_cleanup();
-#endif
-#ifdef CONFIG_NANOHUB_SPI
-	nanohub_spi_cleanup();
-#endif
-	__unregister_chrdev(major, 0, ID_NANOHUB_MAX, "nanohub");
-	class_destroy(sensor_class);
-	major = 0;
-	sensor_class = 0;
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/main.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/main.h
deleted file mode 100644
index 9ec1655..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/main.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef _NANOHUB_MAIN_H
-#define _NANOHUB_MAIN_H
-
-#include <linux/kernel.h>
-#include <linux/cdev.h>
-#include <linux/gpio.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/semaphore.h>
-#include <linux/pm_wakeup.h>
-
-#include "comms.h"
-#include "bl.h"
-
-#define NANOHUB_NAME "nanohub"
-
-struct nanohub_buf {
-	struct list_head list;
-	u8 buffer[255];
-	u8 length;
-};
-
-struct nanohub_data;
-
-struct nanohub_io {
-	struct device *dev;
-	struct nanohub_data *data;
-	wait_queue_head_t buf_wait;
-	struct list_head buf_list;
-};
-
-static inline struct nanohub_data *dev_get_nanohub_data(struct device *dev)
-{
-	struct nanohub_io *io = dev_get_drvdata(dev);
-
-	return io->data;
-}
-
-struct nanohub_data {
-	/* indices for io[] array */
-	#define ID_NANOHUB_SENSOR 0
-	#define ID_NANOHUB_COMMS 1
-	#define ID_NANOHUB_MAX 2
-
-	struct iio_dev *iio_dev;
-	struct nanohub_io io[ID_NANOHUB_MAX];
-
-	struct nanohub_comms comms;
-	struct nanohub_bl bl;
-	const struct nanohub_platform_data *pdata;
-	int irq1;
-	int irq2;
-
-	atomic_t kthread_run;
-	atomic_t thread_state;
-	wait_queue_head_t kthread_wait;
-
-	struct wakeup_source *ws;
-
-	struct nanohub_io free_pool;
-
-	atomic_t lock_mode;
-	/* these 3 vars should be accessed only with wakeup_wait.lock held */
-	atomic_t wakeup_cnt;
-	atomic_t wakeup_lock_cnt;
-	atomic_t wakeup_acquired;
-	wait_queue_head_t wakeup_wait;
-
-	u32 interrupts[8];
-
-	int err_cnt;
-	void *vbuf;
-	struct task_struct *thread;
-};
-
-enum {
-	KEY_WAKEUP_NONE,
-	KEY_WAKEUP,
-	KEY_WAKEUP_LOCK,
-};
-
-enum {
-	LOCK_MODE_NONE,
-	LOCK_MODE_NORMAL,
-	LOCK_MODE_IO,
-	LOCK_MODE_RESET,
-	LOCK_MODE_SUSPEND_RESUME,
-};
-
-int request_wakeup_ex(struct nanohub_data *data, long timeout,
-		      int key, int lock_mode);
-void release_wakeup_ex(struct nanohub_data *data, int key, int lock_mode);
-int nanohub_wait_for_interrupt(struct nanohub_data *data);
-int nanohub_wakeup_eom(struct nanohub_data *data, bool repeat);
-struct iio_dev *nanohub_probe(struct device *dev, struct iio_dev *iio_dev);
-int nanohub_reset(struct nanohub_data *data);
-int nanohub_remove(struct iio_dev *iio_dev);
-int nanohub_suspend(struct iio_dev *iio_dev);
-int nanohub_resume(struct iio_dev *iio_dev);
-
-static inline int nanohub_irq1_fired(struct nanohub_data *data)
-{
-	const struct nanohub_platform_data *pdata = data->pdata;
-
-	return !gpio_get_value(pdata->irq1_gpio);
-}
-
-static inline int nanohub_irq2_fired(struct nanohub_data *data)
-{
-	const struct nanohub_platform_data *pdata = data->pdata;
-
-	return data->irq2 && !gpio_get_value(pdata->irq2_gpio);
-}
-
-static inline int request_wakeup_timeout(struct nanohub_data *data, int timeout)
-{
-	return request_wakeup_ex(data, timeout, KEY_WAKEUP, LOCK_MODE_NORMAL);
-}
-
-static inline int request_wakeup(struct nanohub_data *data)
-{
-	return request_wakeup_ex(data, MAX_SCHEDULE_TIMEOUT, KEY_WAKEUP,
-				 LOCK_MODE_NORMAL);
-}
-
-static inline void release_wakeup(struct nanohub_data *data)
-{
-	release_wakeup_ex(data, KEY_WAKEUP, LOCK_MODE_NORMAL);
-}
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/nanohub-mtk.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/nanohub-mtk.c
deleted file mode 100644
index b1e72fb..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/nanohub-mtk.c
+++ /dev/null
@@ -1,277 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2016 MediaTek Inc.
- */
-
-#include <linux/platform_device.h>
-#include <linux/delay.h>
-#include <linux/iio/iio.h>
-#include <linux/module.h>
-#include <linux/completion.h>
-#include <linux/workqueue.h>
-#include "main.h"
-#include "bl.h"
-#include "comms.h"
-#include "nanohub-mtk.h"
-#include "SCP_power_monitor.h"
-
-#define CHRE_IPI_DEBUG	0
-struct nanohub_ipi_rx_st {
-	u8 *buff;
-	int copy_size;
-	struct completion isr_comp;
-};
-
-struct nanohub_ipi_rx_st nanohub_ipi_rx;
-
-struct iio_dev *nanohub_iio_dev;
-struct semaphore scp_nano_ipi_sem;
-
-struct nanohub_ipi_data {
-	struct nanohub_data data;
-	/* todo */
-};
-
-/* scp_nano_ipi_status: 1 :ready to ipi  0:not ready*/
-int scp_nano_ipi_status;
-
-#define NANOHUB_IPI_SEND_RETRY 100
-void mtk_ipi_scp_isr_sim(int got_size)
-{
-	int token = got_size;
-	int ret;
-	int retry = NANOHUB_IPI_SEND_RETRY;
-	/* add retry to avoid SCP busy timeout */
-	while (retry-- && (READ_ONCE(scp_nano_ipi_status) == 1)) {
-		ret = scp_ipi_send(IPI_CHREX, &token, sizeof(token),
-				   0, SCP_A_ID);
-		if (ret != SCP_IPI_BUSY)
-			break;
-		usleep_range(100, 200);
-	}
-}
-
-static void nano_ipi_start(void)
-{
-	pr_info("%s notify\n", __func__);
-	WRITE_ONCE(scp_nano_ipi_status, 1);
-}
-
-static void nano_ipi_stop(void)
-{
-	pr_info("%s notify\n", __func__);
-	WRITE_ONCE(scp_nano_ipi_status, 0);
-}
-
-static int nano_ipi_event(u8 event, void *ptr)
-{
-	switch (event) {
-	case SENSOR_POWER_UP:
-		nano_ipi_start();
-		break;
-	case SENSOR_POWER_DOWN:
-		nano_ipi_stop();
-		break;
-	}
-	return 0;
-}
-
-static struct scp_power_monitor nano_ipi_notifier = {
-	.name = "nanohub_ipi",
-	.notifier_call = nano_ipi_event,
-};
-
-int nanohub_ipi_write(void *data, u8 *tx, int length, int timeout)
-{
-	int ret;
-	int retry = NANOHUB_IPI_SEND_RETRY;
-#if CHRE_IPI_DEBUG
-	int i;
-
-	pr_info("AP->(%d) ", length);
-	for (i = 0; i < length; i++)
-		pr_info("%02x ", tx[i]);
-	pr_info("\n");
-#endif
-	ret = SCP_IPI_ERROR;
-	while (retry-- && (READ_ONCE(scp_nano_ipi_status) == 1)) {
-		ret = scp_ipi_send(IPI_CHRE, tx, length, 0, SCP_A_ID);
-		if (ret != SCP_IPI_BUSY)
-			break;
-		usleep_range(100, 200);
-	}
-
-	if (ret == SCP_IPI_BUSY)
-		pr_info("%s ipi busy, ret=%d\n", __func__, ret);
-
-	if (ret == SCP_IPI_DONE)
-		return length;
-	else
-		return ERROR_NACK;
-}
-
-int nanohub_ipi_read(void *data, u8 *rx, int max_length, int timeout)
-{
-	int ret;
-	const int min_size = sizeof(struct nanohub_packet) +
-		 sizeof(struct nanohub_packet_crc);
-
-	if (max_length < min_size)
-		return -1;
-	/* todo: support interruptible? please check it! */
-	if (wait_for_completion_interruptible_timeout(&nanohub_ipi_rx.isr_comp,
-						      timeout) == 0) {
-		ret = 0;	/* return as empty packet */
-	} else {
-		ret = nanohub_ipi_rx.copy_size;
-		memcpy(rx, g_nanohub_data_p->comms.rx_buffer, ret);
-		/* send back isr sim */
-		mtk_ipi_scp_isr_sim(ret);
-	}
-#if CHRE_IPI_DEBUG
-	pr_info("%s ret %d\n", __func__, ret);
-#endif
-	return ret;	/* return packet size */
-}
-
-static int nanohub_ipi_open(void *data)
-{
-	down(&scp_nano_ipi_sem);
-	reinit_completion(&nanohub_ipi_rx.isr_comp); /*reset when retry start*/
-	return 0;
-}
-
-static void nanohub_ipi_close(void *data)
-{
-	up(&scp_nano_ipi_sem);
-}
-
-void nanohub_ipi_comms_init(struct nanohub_ipi_data *ipi_data)
-{
-	struct nanohub_comms *comms = &ipi_data->data.comms;
-
-	comms->seq = 1;
-	comms->timeout_write = msecs_to_jiffies(512);
-	comms->timeout_ack = msecs_to_jiffies(3);
-	comms->timeout_reply = msecs_to_jiffies(3);
-	comms->open = nanohub_ipi_open;
-	comms->close = nanohub_ipi_close;
-	comms->write = nanohub_ipi_write;
-	comms->read = nanohub_ipi_read;
-/*	comms->tx_buffer = kmalloc(4096, GFP_KERNEL | GFP_DMA); */
-	comms->rx_buffer = kmalloc(4096, GFP_KERNEL | GFP_DMA);
-	nanohub_ipi_rx.buff = comms->rx_buffer;
-	sema_init(&scp_nano_ipi_sem, 1);
-}
-
-static int nanohub_ipi_remove(struct platform_device *pdev);
-
-struct platform_device nanohub_ipi_pdev = {
-	.name = "nanohub_ipi",
-	.id = -1,
-};
-
-int nanohub_ipi_suspend(struct platform_device *dev, pm_message_t state)
-{
-	int ret = 0;
-
-	if (READ_ONCE(scp_nano_ipi_status) == 1)
-		ret = nanohub_suspend(nanohub_iio_dev);
-	else
-		ret = 0;
-
-	return ret;
-}
-
-int nanohub_ipi_resume(struct platform_device *dev)
-{
-	int ret = 0;
-
-	if (READ_ONCE(scp_nano_ipi_status) == 1)
-		ret = nanohub_resume(nanohub_iio_dev);
-	else
-		ret = 0;
-
-	return ret;
-}
-
-void scp_to_ap_ipi_handler(int id, void *data, unsigned int len)
-{
-#if CHRE_IPI_DEBUG
-	int i;
-	unsigned char *data_p = data;
-
-	pr_info("->AP(%d):", len);
-	for (i = 0; i < len; i++)
-		pr_info("%02x ", data_p[i]);
-	pr_info("\n");
-#endif
-	nanohub_ipi_rx.copy_size = len;
-	memcpy(g_nanohub_data_p->comms.rx_buffer, data, len);
-	/*todo: check size ? */
-	complete(&nanohub_ipi_rx.isr_comp);
-}
-
-int nanohub_ipi_probe(struct platform_device *pdev)
-{
-	struct nanohub_ipi_data *ipi_data;
-	struct iio_dev *iio_dev;
-	enum scp_ipi_status status;
-
-	iio_dev = iio_device_alloc(sizeof(struct nanohub_ipi_data));
-	if (!iio_dev)
-		return -ENOMEM;
-	nanohub_iio_dev = iio_dev;
-	/*iio_dev = nanohub_probe(&pdev->dev, iio_dev);*/
-	nanohub_probe(&nanohub_ipi_pdev.dev, iio_dev);
-	ipi_data = iio_priv(iio_dev);
-
-	nanohub_ipi_comms_init(ipi_data);
-	init_completion(&nanohub_ipi_rx.isr_comp);
-	status = scp_ipi_registration(IPI_CHRE,
-				      scp_to_ap_ipi_handler, "chre_ap_rx");
-	/*init nano scp ipi status*/
-	WRITE_ONCE(scp_nano_ipi_status, 1);
-	scp_power_monitor_register(&nano_ipi_notifier);
-
-	return 0;
-}
-
-static int nanohub_ipi_remove(struct platform_device *pdev)
-{
-	return 0;
-}
-
-static struct platform_driver nanohub_ipi_pdrv = {
-	.probe = nanohub_ipi_probe,
-	.remove = nanohub_ipi_remove,
-	.suspend = nanohub_ipi_suspend,
-	.resume = nanohub_ipi_resume,
-	.driver = {
-		.name = "nanohub_ipi",
-		.owner = THIS_MODULE,
-		/*.of_match_table = scpdvfs_of_ids,*/
-	},
-};
-
-int __init nanohub_ipi_init(void)
-{
-	int ret = 0;
-
-	ret = platform_device_register(&nanohub_ipi_pdev);
-	if (ret) {
-		pr_debug("nanohub_ipi_pdev fail\n");
-		goto _nanohub_ipi_init_exit;
-	}
-
-	ret = platform_driver_register(&nanohub_ipi_pdrv);
-	if (ret) {
-		pr_debug("nanohub_ipi_pdrv fail\n");
-		platform_device_unregister(&nanohub_ipi_pdev);
-		goto _nanohub_ipi_init_exit;
-	}
-	platform_set_drvdata(&nanohub_ipi_pdev, g_nanohub_data_p);
-
-_nanohub_ipi_init_exit:
-	return ret;
-}
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/nanohub-mtk.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/nanohub-mtk.h
deleted file mode 100644
index 67cc15b..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/nanohub-mtk.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef _NANOHUB_MTK_IPI_H
-#define _NANOHUB_MTK_IPI_H
-
-#include <include/scp.h>
-#include <linux/notifier.h>
-
-int __init nanohub_ipi_init(void);
-extern struct nanohub_data *g_nanohub_data_p;
-void scp_wdt_reset(enum scp_core_id cpu_id);
-
-#endif
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/nanohub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/nanohub.h
deleted file mode 100644
index 67bdb83..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensorHub/nanohub/nanohub.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __LINUX_PLATFORM_DATA_NANOHUB_H
-#define __LINUX_PLATFORM_DATA_NANOHUB_H
-
-#include <linux/types.h>
-
-struct nanohub_flash_bank {
-	int bank;
-	u32 address;
-	size_t length;
-};
-
-struct nanohub_platform_data {
-	u32 wakeup_gpio;
-	u32 nreset_gpio;
-	u32 boot0_gpio;
-	u32 irq1_gpio;
-	u32 irq2_gpio;
-	u32 spi_cs_gpio;
-	u32 bl_addr;
-	u32 num_flash_banks;
-	struct nanohub_flash_bank *flash_banks;
-	u32 num_shared_flash_banks;
-	struct nanohub_flash_bank *shared_flash_banks;
-};
-
-#endif /* __LINUX_PLATFORM_DATA_NANOHUB_H */
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensor_probe/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensor_probe/Makefile
deleted file mode 100644
index f51eb5d..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensor_probe/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/accelerometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/gyroscope/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/magnetometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/alsps/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/barometer/inc
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/step_counter
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/situation
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT) += sensor_probe.o
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensor_probe/sensor_probe.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensor_probe/sensor_probe.c
deleted file mode 100644
index 5b91a11..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/sensor_probe/sensor_probe.c
+++ /dev/null
@@ -1,116 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#include <linux/module.h>
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_ACCELEROMETER)
-#include "accel.h"
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_GYROSCOPE)
-#include "gyroscope.h"
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_MAGNETOMETER)
-#include "mag.h"
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_ALSPS)
-#include "alsps.h"
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_BAROMETER)
-#include "barometer.h"
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_STEP_COUNTER)
-#include "step_counter.h"
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_SITUATION)
-#include "situation.h"
-#endif
-
-static int __init sensor_init(void)
-{
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_ACCELEROMETER)
-	if (acc_probe())
-		pr_err("failed to register acc driver\n");
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_GYROSCOPE)
-	if (gyro_probe())
-		pr_err("failed to register gyro driver\n");
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_MAGNETOMETER)
-	if (mag_probe())
-		pr_err("failed to register mag driver\n");
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_ALSPS)
-	if (alsps_probe())
-		pr_err("failed to register alsps driver\n");
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_BAROMETER)
-	if (baro_probe())
-		pr_err("failed to register baro driver\n");
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_STEP_COUNTER)
-	if (step_c_probe())
-		pr_err("failed to register step_c driver\n");
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_SITUATION)
-	if (situation_probe()) {
-		pr_err("failed to register situ driver\n");
-		return -ENODEV;
-	}
-#endif
-
-	return 0;
-}
-
-static void __exit sensor_exit(void)
-{
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_ACCELEROMETER)
-	acc_remove();
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_GYROSCOPE)
-	gyro_remove();
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_MAGNETOMETER)
-	mag_remove();
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_ALSPS)
-	alsps_remove();
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_BAROMETER)
-	baro_remove();
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_STEP_COUNTER)
-	step_c_remove();
-#endif
-
-#if IS_ENABLED(CONFIG_CUSTOM_KERNEL_SITUATION)
-	situation_remove();
-#endif
-
-}
-
-late_initcall(sensor_init);
-module_exit(sensor_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("SensorProbe driver");
-MODULE_AUTHOR("Mediatek");
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/Kconfig
deleted file mode 100644
index 2d88815..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/Kconfig
+++ /dev/null
@@ -1,10 +0,0 @@
-config CUSTOM_KERNEL_SITUATION
-	bool "mediatek situation sensor tag"
-	help
-	  Kernel space support situation sensor driver.
-	  If the platform is supported for gesture, this
-	  configuration should be configured, and the situation
-	  driver configuration should be configured as well.
-
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/Kconfig"
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/Makefile
deleted file mode 100644
index 00d3468..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# In case the platform does NOT support this type of sensors
-
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)	+= situation.o
-obj-y += situation_hub/
\ No newline at end of file
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation.c
deleted file mode 100644
index 1803058..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation.c
+++ /dev/null
@@ -1,677 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2016 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<SITUATION> " fmt
-
-#include "situation.h"
-
-static struct situation_context *situation_context_obj;
-
-static struct situation_init_info *
-	situation_init_list[max_situation_support] = {0};
-
-static struct situation_context *situation_context_alloc_object(void)
-{
-	struct situation_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-	int index;
-
-	pr_debug("%s start\n", __func__);
-	if (!obj) {
-		pr_err("Alloc situ object error!\n");
-		return NULL;
-	}
-	mutex_init(&obj->situation_op_mutex);
-	for (index = inpocket; index < max_situation_support; ++index) {
-		obj->ctl_context[index].power = 0;
-		obj->ctl_context[index].enable = 0;
-		obj->ctl_context[index].delay_ns = -1;
-		obj->ctl_context[index].latency_ns = -1;
-	}
-
-	pr_debug("%s end\n", __func__);
-	return obj;
-}
-
-static int handle_to_index(int handle)
-{
-	int index = -1;
-
-	switch (handle) {
-	case ID_IN_POCKET:
-		index = inpocket;
-		break;
-	case ID_STATIONARY_DETECT:
-		index = stationary;
-		break;
-	case ID_WAKE_GESTURE:
-		index = wake_gesture;
-		break;
-	case ID_GLANCE_GESTURE:
-		index = glance_gesture;
-		break;
-	case ID_PICK_UP_GESTURE:
-		index = pickup_gesture;
-		break;
-	case ID_ANSWER_CALL:
-		index = answer_call;
-		break;
-	case ID_MOTION_DETECT:
-		index = motion_detect;
-		break;
-	case ID_DEVICE_ORIENTATION:
-		index = device_orientation;
-		break;
-	case ID_TILT_DETECTOR:
-		index = tilt_detector;
-		break;
-	case ID_FLAT:
-		index = flat;
-		break;
-	case ID_SAR:
-		index = sar;
-		break;
-	default:
-		index = -1;
-		pr_err("%s invalid handle:%d,index:%d\n", __func__,
-			handle, index);
-		return index;
-	}
-	pr_debug("%s handle:%d, index:%d\n", __func__, handle, index);
-	return index;
-}
-
-int situation_data_report_t(int handle, uint32_t one_sample_data,
-	int64_t time_stamp)
-{
-	int err = 0, index = -1;
-	struct sensor_event event;
-	struct situation_context *cxt = situation_context_obj;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-	index = handle_to_index(handle);
-	if (index < 0) {
-		pr_err_ratelimited("[%s] invalid index\n", __func__);
-		return -1;
-	}
-
-	pr_debug("situation_notify handle:%d, index:%d\n", handle, index);
-	event.time_stamp = time_stamp;
-	event.handle = handle;
-	event.flush_action = DATA_ACTION;
-	event.word[0] = one_sample_data;
-	err = sensor_input_event(situation_context_obj->mdev.minor, &event);
-	if (cxt->ctl_context[index].situation_ctl.open_report_data != NULL &&
-		cxt->ctl_context[index].situation_ctl.is_support_wake_lock)
-		__pm_wakeup_event(cxt->ws[index], 250);
-	return err;
-}
-EXPORT_SYMBOL_GPL(situation_data_report_t);
-
-int situation_data_report(int handle, uint32_t one_sample_data)
-{
-	return situation_data_report_t(handle, one_sample_data, 0);
-}
-int sar_data_report_t(int32_t value[3], int64_t time_stamp)
-{
-	int err = 0, index = -1;
-	struct sensor_event event;
-	struct situation_context *cxt = situation_context_obj;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	index = handle_to_index(ID_SAR);
-	if (index < 0) {
-		pr_err("[%s] invalid index\n", __func__);
-		return -1;
-	}
-	event.time_stamp = time_stamp;
-	event.handle = ID_SAR;
-	event.flush_action = DATA_ACTION;
-	event.word[0] = value[0];
-	event.word[1] = value[1];
-	event.word[2] = value[2];
-	err = sensor_input_event(situation_context_obj->mdev.minor, &event);
-	if (cxt->ctl_context[index].situation_ctl.open_report_data != NULL &&
-		cxt->ctl_context[index].situation_ctl.is_support_wake_lock)
-		__pm_wakeup_event(cxt->ws[index], 250);
-	return err;
-}
-int sar_data_report(int32_t value[3])
-{
-	return sar_data_report_t(value, 0);
-}
-int situation_notify_t(int handle, int64_t time_stamp)
-{
-	return situation_data_report_t(handle, 1, time_stamp);
-}
-EXPORT_SYMBOL_GPL(situation_notify_t);
-
-int situation_notify(int handle)
-{
-	return situation_data_report_t(handle, 1, 0);
-}
-int situation_flush_report(int handle)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-	pr_debug_ratelimited("flush, handle:%d\n", handle);
-	event.handle = handle;
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(situation_context_obj->mdev.minor, &event);
-	return err;
-}
-EXPORT_SYMBOL_GPL(situation_flush_report);
-
-#ifndef CONFIG_NANOHUB
-static int situation_enable_and_batch(int index)
-{
-	struct situation_context *cxt = situation_context_obj;
-	int err;
-
-	/* power on -> power off */
-	if (cxt->ctl_context[index].power == 1 &&
-		cxt->ctl_context[index].enable == 0) {
-		pr_debug("SITUATION disable\n");
-		/* turn off the power */
-		err = cxt->ctl_context[index].situation_ctl.open_report_data(0);
-		if (err) {
-			pr_err("situation turn off power err = %d\n",
-				err);
-			return -1;
-		}
-		pr_debug("situation turn off power done\n");
-
-		cxt->ctl_context[index].power = 0;
-		cxt->ctl_context[index].delay_ns = -1;
-		pr_debug("SITUATION disable done\n");
-		return 0;
-	}
-	/* power off -> power on */
-	if (cxt->ctl_context[index].power == 0 &&
-		cxt->ctl_context[index].enable == 1) {
-		pr_debug("SITUATION power on\n");
-		err = cxt->ctl_context[index].situation_ctl.open_report_data(1);
-		if (err) {
-			pr_err("situation turn on power err = %d\n",
-				err);
-			return -1;
-		}
-		pr_debug("situation turn on power done\n");
-
-		cxt->ctl_context[index].power = 1;
-		pr_debug("SITUATION power on done\n");
-	}
-	/* rate change */
-	if (cxt->ctl_context[index].power == 1 &&
-		cxt->ctl_context[index].delay_ns >= 0) {
-		pr_debug("SITUATION set batch\n");
-		/* set ODR, fifo timeout latency */
-		if (cxt->ctl_context[index].situation_ctl.is_support_batch)
-			err = cxt->ctl_context[index].situation_ctl.batch(0,
-				cxt->ctl_context[index].delay_ns,
-				cxt->ctl_context[index].latency_ns);
-		else
-			err = cxt->ctl_context[index].situation_ctl.batch(0,
-				cxt->ctl_context[index].delay_ns, 0);
-		if (err) {
-			pr_err("situation set batch(ODR) err %d\n",
-				err);
-			return -1;
-		}
-		pr_debug("situation set ODR, fifo latency done\n");
-	}
-	return 0;
-}
-#endif
-
-static ssize_t situactive_store(struct device *dev,
-	struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct situation_context *cxt = situation_context_obj;
-	int err = 0, handle = -1, en = 0, index = -1;
-
-	err = sscanf(buf, "%d : %d", &handle, &en);
-	if (err < 0) {
-		pr_debug("%s param error: err = %d\n", __func__, err);
-		return err;
-	}
-	index = handle_to_index(handle);
-	if (index < 0) {
-		pr_err("[%s] invalid index\n", __func__);
-		return -1;
-	}
-	pr_debug("%s handle=%d, en=%d\n", __func__, handle, en);
-
-	mutex_lock(&situation_context_obj->situation_op_mutex);
-	if (en == 1)
-		cxt->ctl_context[index].enable = 1;
-	else if (en == 0)
-		cxt->ctl_context[index].enable = 0;
-	else {
-		pr_err("%s error !!\n", __func__);
-		err = -1;
-		goto err_out;
-	}
-#ifdef CONFIG_NANOHUB
-	if (cxt->ctl_context[index].enable == 1) {
-		if (cxt->ctl_context[index].situation_ctl.open_report_data
-			== NULL) {
-			pr_err("open_report_data() is NULL, %d\n", index);
-			goto err_out;
-		}
-		err = cxt->ctl_context[index].situation_ctl.open_report_data(1);
-		if (err) {
-			pr_err("situation turn on power err = %d\n", err);
-			goto err_out;
-		}
-	} else {
-		if (cxt->ctl_context[index].situation_ctl.open_report_data
-			== NULL) {
-			pr_err("open_report_data() is NULL, %d\n", index);
-			goto err_out;
-		}
-		err = cxt->ctl_context[index].situation_ctl.open_report_data(0);
-		if (err) {
-			pr_err("situation turn off power err = %d\n", err);
-			goto err_out;
-		}
-	}
-#else
-	err = situation_enable_and_batch(index);
-#endif
-	pr_debug("%s done\n", __func__);
-err_out:
-	mutex_unlock(&situation_context_obj->situation_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-/*----------------------------------------------------------------------------*/
-static ssize_t situactive_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	struct situation_context *cxt = NULL;
-	int i;
-	int s_len = 0;
-
-	cxt = situation_context_obj;
-	for (i = 0; i < max_situation_support; i++) {
-		pr_debug("situ handle:%d active: %d\n",
-			i, cxt->ctl_context[i].is_active_data);
-		s_len += snprintf(buf + s_len, PAGE_SIZE, "id:%d, en:%d\n",
-			i, cxt->ctl_context[i].is_active_data);
-	}
-	return s_len;
-}
-
-static ssize_t situbatch_store(struct device *dev,
-	struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct situation_context *cxt = situation_context_obj;
-	int index = -1, handle = 0, flag = 0, err = 0;
-	int64_t samplingPeriodNs = 0, maxBatchReportLatencyNs = 0;
-
-	err = sscanf(buf, "%d,%d,%lld,%lld",
-		&handle, &flag, &samplingPeriodNs, &maxBatchReportLatencyNs);
-	if (err != 4) {
-		pr_err("%s param error: err =%d\n", __func__, err);
-		return err;
-	}
-	index = handle_to_index(handle);
-	if (index < 0) {
-		pr_err("[%s] invalid handle\n", __func__);
-		return -1;
-	}
-	pr_debug("handle %d, flag:%d, Period:%lld, Latency: %lld\n",
-		handle, flag, samplingPeriodNs, maxBatchReportLatencyNs);
-
-	cxt->ctl_context[index].delay_ns = samplingPeriodNs;
-	cxt->ctl_context[index].latency_ns = maxBatchReportLatencyNs;
-	mutex_lock(&situation_context_obj->situation_op_mutex);
-#ifdef CONFIG_NANOHUB
-	if (cxt->ctl_context[index].delay_ns >= 0) {
-		if (cxt->ctl_context[index].situation_ctl.batch == NULL) {
-			pr_err("batch() is NULL, %d\n", index);
-			goto err_out;
-		}
-		if (cxt->ctl_context[index].situation_ctl.is_support_batch)
-			err = cxt->ctl_context[index].situation_ctl.batch(0,
-				cxt->ctl_context[index].delay_ns,
-				cxt->ctl_context[index].latency_ns);
-		else
-			err = cxt->ctl_context[index].situation_ctl.batch(0,
-				cxt->ctl_context[index].delay_ns, 0);
-		if (err) {
-			pr_err("situation set batch(ODR) err %d\n", err);
-			goto err_out;
-		}
-	} else
-		pr_info("batch state no need change\n");
-#else
-	err = situation_enable_and_batch(index);
-#endif
-	pr_debug("%s done\n", __func__);
-err_out:
-	mutex_unlock(&situation_context_obj->situation_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t situbatch_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	int len = 0;
-
-	pr_debug(" not support now\n");
-	return len;
-}
-
-static ssize_t situflush_store(struct device *dev,
-	struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct situation_context *cxt = NULL;
-	int index = -1, handle = 0, err = 0;
-
-	err = kstrtoint(buf, 10, &handle);
-	if (err != 0)
-		pr_err("%s param error: err=%d\n", __func__, err);
-
-	pr_debug("%s param: handle %d\n", __func__, handle);
-
-	mutex_lock(&situation_context_obj->situation_op_mutex);
-	cxt = situation_context_obj;
-	index = handle_to_index(handle);
-	if (index < 0) {
-		pr_err("[%s] invalid index\n", __func__);
-		mutex_unlock(&situation_context_obj->situation_op_mutex);
-		return  -1;
-	}
-	if (cxt->ctl_context[index].situation_ctl.flush != NULL)
-		err = cxt->ctl_context[index].situation_ctl.flush();
-	else
-		pr_err("SITUATION OLD ARCH NOT SUPPORT COMM FLUSH\n");
-	if (err < 0)
-		pr_err("situation enable flush err %d\n", err);
-	mutex_unlock(&situation_context_obj->situation_op_mutex);
-	if (err)
-		return err;
-	else
-		return count;
-}
-
-static ssize_t situflush_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	int len = 0;
-
-	pr_debug(" not support now\n");
-	return len;
-}
-
-static ssize_t situdevnum_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);	/* TODO: why +5? */
-}
-
-
-static int situation_real_driver_init(void)
-{
-	int err = -1, i = 0;
-
-	pr_debug("%s start\n", __func__);
-
-	for (i = 0; i < max_situation_support; i++) {
-		if (situation_init_list[i] != NULL) {
-			pr_debug(" situ try to init driver %s\n",
-				situation_init_list[i]->name);
-			err = situation_init_list[i]->init();
-			if (err == 0)
-				pr_debug(" situ real driver %s probe ok\n",
-				situation_init_list[i]->name);
-		} else
-			continue;
-	}
-	return err;
-}
-
-
-int situation_driver_add(struct situation_init_info *obj, int handle)
-{
-	int err = 0;
-	int index = -1;
-
-	pr_debug("register situation handle=%d\n", handle);
-
-	if (!obj) {
-		pr_err("[%s] fail, situation_init_info is NULL\n",
-			__func__);
-		return -1;
-	}
-
-	index = handle_to_index(handle);
-	if (index < 0) {
-		pr_err("[%s] invalid index\n", __func__);
-		return  -1;
-	}
-
-	if (situation_init_list[index] == NULL)
-		situation_init_list[index] = obj;
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(situation_driver_add);
-static int situation_open(struct inode *inode, struct file *file)
-{
-	nonseekable_open(inode, file);
-	return 0;
-}
-
-static ssize_t situation_read(struct file *file, char __user *buffer,
-			  size_t count, loff_t *ppos)
-{
-	ssize_t read_cnt = 0;
-
-	read_cnt = sensor_event_read(situation_context_obj->mdev.minor,
-		file, buffer, count, ppos);
-
-	return read_cnt;
-}
-
-static unsigned int situation_poll(struct file *file, poll_table *wait)
-{
-	return sensor_event_poll(situation_context_obj->mdev.minor, file, wait);
-}
-
-static const struct file_operations situation_fops = {
-	.owner = THIS_MODULE,
-	.open = situation_open,
-	.read = situation_read,
-	.poll = situation_poll,
-};
-
-static int situation_misc_init(struct situation_context *cxt)
-{
-	int err = 0;
-
-	cxt->mdev.minor = ID_WAKE_GESTURE; /* MISC_DYNAMIC_MINOR; */
-	cxt->mdev.name = SITU_MISC_DEV_NAME;
-	cxt->mdev.fops = &situation_fops;
-	err = sensor_attr_register(&cxt->mdev);
-	if (err)
-		pr_err("unable to register situ misc device!!\n");
-
-	return err;
-}
-
-DEVICE_ATTR_RW(situactive);
-DEVICE_ATTR_RW(situbatch);
-DEVICE_ATTR_RW(situflush);
-DEVICE_ATTR_RO(situdevnum);
-
-static struct attribute *situation_attributes[] = {
-	&dev_attr_situactive.attr,
-	&dev_attr_situbatch.attr,
-	&dev_attr_situflush.attr,
-	&dev_attr_situdevnum.attr,
-	NULL
-};
-
-static struct attribute_group situation_attribute_group = {
-	.attrs = situation_attributes
-};
-
-int situation_register_data_path(struct situation_data_path *data,
-	int handle)
-{
-	struct situation_context *cxt = NULL;
-	int index = -1;
-
-	if (NULL == data || NULL == data->get_data) {
-		pr_debug("situ register data path fail\n");
-		return -1;
-	}
-
-	index = handle_to_index(handle);
-	if (index < 0) {
-		pr_err("[%s] invalid handle\n", __func__);
-		return -1;
-	}
-	cxt = situation_context_obj;
-	cxt->ctl_context[index].situation_data.get_data = data->get_data;
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(situation_register_data_path);
-
-int situation_register_control_path(struct situation_control_path *ctl,
-	int handle)
-{
-	struct situation_context *cxt = NULL;
-	int index = -1;
-
-	pr_debug("%s\n", __func__);
-	if (NULL == ctl || NULL == ctl->open_report_data) {
-		pr_debug("situ register control path fail\n");
-		return -1;
-	}
-
-	index = handle_to_index(handle);
-	if (index < 0) {
-		pr_err("[%s] invalid handle\n", __func__);
-		return -1;
-	}
-	cxt = situation_context_obj;
-	cxt->ctl_context[index].situation_ctl.open_report_data =
-		ctl->open_report_data;
-	cxt->ctl_context[index].situation_ctl.batch = ctl->batch;
-	cxt->ctl_context[index].situation_ctl.flush = ctl->flush;
-	cxt->ctl_context[index].situation_ctl.is_support_wake_lock =
-		ctl->is_support_wake_lock;
-	cxt->ctl_context[index].situation_ctl.is_support_batch =
-		ctl->is_support_batch;
-
-	cxt->wake_lock_name[index] = kzalloc(64, GFP_KERNEL);
-	if (!cxt->wake_lock_name[index])
-		return -1;
-	sprintf(cxt->wake_lock_name[index], "situation_wakelock-%d", index);
-	cxt->ws[index] = wakeup_source_register(NULL,
-						cxt->wake_lock_name[index]);
-	if (!cxt->ws[index]) {
-		pr_err("%s: wakeup source init fail\n", __func__);
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(situation_register_control_path);
-
-int situation_probe(void)
-{
-	int err;
-
-	pr_debug("%s+++!!\n", __func__);
-
-	situation_context_obj = situation_context_alloc_object();
-	if (!situation_context_obj) {
-		err = -ENOMEM;
-		pr_err("unable to allocate devobj!\n");
-		goto exit_alloc_data_failed;
-	}
-	/* init real situ driver */
-	err = situation_real_driver_init();
-	if (err) {
-		pr_err("situ real driver init fail\n");
-		goto real_driver_init_fail;
-	}
-
-	/* add misc dev for sensor hal control cmd */
-	err = situation_misc_init(situation_context_obj);
-	if (err) {
-		pr_err("unable to register situ misc device!!\n");
-		goto real_driver_init_fail;
-	}
-	err = sysfs_create_group(&situation_context_obj->mdev.this_device->kobj,
-		&situation_attribute_group);
-	if (err < 0) {
-		pr_err("unable to create situ attribute file\n");
-		goto real_driver_init_fail;
-	}
-	kobject_uevent(&situation_context_obj->mdev.this_device->kobj,
-		KOBJ_ADD);
-
-
-	pr_debug("%s OK !!\n", __func__);
-	return 0;
-
-real_driver_init_fail:
-	kfree(situation_context_obj);
-exit_alloc_data_failed:
-	pr_debug("%s fail !!!\n", __func__);
-	return err;
-}
-EXPORT_SYMBOL_GPL(situation_probe);
-
-int situation_remove(void)
-{
-	int err = 0;
-
-	pr_debug("%s\n", __func__);
-	sysfs_remove_group(&situation_context_obj->mdev.this_device->kobj,
-		&situation_attribute_group);
-
-	err = sensor_attr_deregister(&situation_context_obj->mdev);
-	if (err)
-		pr_err("misc_deregister fail: %d\n", err);
-
-	kfree(situation_context_obj);
-	return 0;
-}
-EXPORT_SYMBOL_GPL(situation_remove);
-
-static int __init situation_init(void)
-{
-	pr_debug("%s\n", __func__);
-
-	return 0;
-}
-
-static void __exit situation_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-late_initcall(situation_init);
-module_exit(situation_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("situation sensor driver");
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation.h
deleted file mode 100644
index 3e81fc7..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __SITUATION_H__
-#define __SITUATION_H__
-
-#include <linux/interrupt.h>
-#include <linux/platform_device.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-#include <hwmsensor.h>
-#include <linux/poll.h>
-#include "sensor_attr.h"
-#include "sensor_event.h"
-#include <linux/pm_wakeup.h>
-
-enum situation_index_table {
-	inpocket = 0,
-	stationary,
-	wake_gesture,
-	pickup_gesture,
-	glance_gesture,
-	answer_call,
-	motion_detect,
-	device_orientation,
-	tilt_detector,
-	flat,
-	sar,
-	max_situation_support,
-};
-
-struct situation_control_path {
-	int (*open_report_data)(int open);
-	int (*batch)(int flag, int64_t samplingPeriodNs,
-		int64_t maxBatchReportLatencyNs);
-	int (*flush)(void);
-	bool is_support_wake_lock;
-	bool is_support_batch;
-};
-
-struct situation_data_path {
-	int (*get_data)(int *value, int *status);
-};
-
-struct situation_init_info {
-	char *name;
-	int (*init)(void);
-	int (*uninit)(void);
-};
-
-struct situation_data_control_context {
-	struct situation_control_path situation_ctl;
-	struct situation_data_path situation_data;
-	bool is_active_data;
-	bool is_active_nodata;
-	bool is_batch_enable;
-	int power;
-	int enable;
-	int64_t delay_ns;
-	int64_t latency_ns;
-};
-
-struct situation_context {
-	struct sensor_attr_t mdev;
-	struct mutex situation_op_mutex;
-	struct situation_data_control_context
-		ctl_context[max_situation_support];
-	struct wakeup_source *ws[max_situation_support];
-	char *wake_lock_name[max_situation_support];
-};
-
-extern int situation_data_report_t(int handle, uint32_t one_sample_data,
-	int64_t time_stamp);
-extern int situation_data_report(int handle, uint32_t one_sample_data);
-extern int situation_notify_t(int handle, int64_t time_stamp);
-extern int situation_notify(int handle);
-extern int situation_flush_report(int handle);
-extern int situation_driver_add(struct situation_init_info *obj, int handle);
-extern int situation_register_control_path(
-	struct situation_control_path *ctl, int handle);
-extern int situation_register_data_path(struct situation_data_path *data,
-	int handle);
-extern int sar_data_report(int32_t value[3]);
-extern int sar_data_report_t(int32_t value[3], int64_t time_stamp);
-extern int situation_probe(void);
-extern int situation_remove(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/Kconfig
deleted file mode 100644
index e5e9218..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/Kconfig
+++ /dev/null
@@ -1,11 +0,0 @@
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/Kconfig"
-source "drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/Kconfig"
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/Makefile
deleted file mode 100644
index 5a6cc86..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/situation
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/scp/
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)	+= situationhub.o
-situationhub-y := situation_hub.o
-situationhub-$(CONFIG_MTK_INPKHUB) += inpocket/inpocket.o
-situationhub-$(CONFIG_MTK_STATHUB) += stationary/stationary.o
-situationhub-$(CONFIG_MTK_WAKEHUB) += wake_gesture/wake_gesture.o
-situationhub-$(CONFIG_MTK_GLGHUB) += glance_gesture/glance_gesture.o
-situationhub-$(CONFIG_MTK_PICKUPHUB) += pickup_gesture/pickup_gesture.o
-situationhub-$(CONFIG_MTK_ANSWER_CALL_HUB) += answercall/ancallhub.o
-situationhub-$(CONFIG_MTK_DEVICE_ORIENTATION_HUB) += device_orientation/device_orientation.o
-situationhub-$(CONFIG_MTK_MOTION_DETECT_HUB) += motion_detect/motion_detect.o
-situationhub-$(CONFIG_MTK_TILTDETECTHUB) += tilt_detector/tiltdetecthub.o
-situationhub-$(CONFIG_MTK_FLAT_HUB) += flat/flat.o
-situationhub-$(CONFIG_MTK_SAR_HUB) += sar/sarhub.o sar/sar_factory.o
\ No newline at end of file
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/Kconfig
deleted file mode 100644
index aff9e86..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_ANSWER_CALL_HUB
-	bool "glghub for MediaTek package"
-	help
-	  A answer call is a device,
-	  usually portable and electronic
-	  or electromechanical,
-	  that detect answer call a person takes.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/ancallhub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/ancallhub.c
deleted file mode 100644
index 76a93eb..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/ancallhub.c
+++ /dev/null
@@ -1,138 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[ancallhub] " fmt
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include "ancallhub.h"
-#include <situation.h>
-#include <hwmsen_helper.h>
-
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-
-enum ANCALLHUB_TRC {
-	ANCALLHUBH_TRC_INFO = 0X10,
-};
-
-static struct situation_init_info ancallhub_init_info;
-
-static int answer_call_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_ANSWER_CALL, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp		= data.time_stamp;
-	*probability	= data.gesture_data_t.probability;
-	return 0;
-}
-static int answer_call_open_report_data(int open)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_ANSWER_CALL, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	pr_debug("%s : type=%d, open=%d\n", __func__, ID_ANSWER_CALL, open);
-	ret = sensor_enable_to_hub(ID_ANSWER_CALL, open);
-	return ret;
-}
-static int answer_call_gesture_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_ANSWER_CALL,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-static int answer_call_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		pr_debug("answer_call do not support flush\n");
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_notify_t(ID_ANSWER_CALL,
-				(int64_t)event->time_stamp);
-	return err;
-}
-
-static int ancallhub_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	ctl.open_report_data = answer_call_open_report_data;
-	ctl.batch = answer_call_gesture_batch;
-	ctl.is_support_wake_lock = true;
-	err = situation_register_control_path(&ctl, ID_ANSWER_CALL);
-	if (err) {
-		pr_err("register answer_call control path err\n");
-		goto exit;
-	}
-
-	data.get_data = answer_call_get_data;
-	err = situation_register_data_path(&data, ID_ANSWER_CALL);
-	if (err) {
-		pr_err("register answer_call data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_ANSWER_CALL,
-		answer_call_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-exit_create_attr_failed:
-	return -1;
-}
-static int ancallhub_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info ancallhub_init_info = {
-	.name = "answer_call_hub",
-	.init = ancallhub_local_init,
-	.uninit = ancallhub_local_uninit,
-};
-
-int __init ancallhub_init(void)
-{
-	situation_driver_add(&ancallhub_init_info, ID_ANSWER_CALL);
-	return 0;
-}
-
-void __exit ancallhub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/ancallhub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/ancallhub.h
deleted file mode 100644
index d1588ae..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/answercall/ancallhub.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef ANSWERCALLHUB_H
-#define ANSWERCALLHUB_H
-
-#include <linux/ioctl.h>
-
-int __init ancallhub_init(void);
-void __exit ancallhub_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/Kconfig
deleted file mode 100644
index d5edef4..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_DEVICE_ORIENTATION_HUB
-	bool "device orientation hub for MediaTek package"
-	help
-	  A device orientation is a device,
-	  usually portable and
-	  electronic or electromechanical,
-	  that detect device's orientation.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/device_orientation.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/device_orientation.c
deleted file mode 100644
index b5cffb9..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/device_orientation.c
+++ /dev/null
@@ -1,143 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[device_orientation] " fmt
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include "situation.h"
-#include "device_orientation.h"
-#include <hwmsen_helper.h>
-
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-static struct situation_init_info device_orientation_init_info;
-static int device_orientation_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_DEVICE_ORIENTATION, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp		= data.time_stamp;
-	*probability	= data.gesture_data_t.probability;
-	return 0;
-}
-static int device_orientation_open_report_data(int open)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_DEVICE_ORIENTATION, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	pr_debug("%s : type=%d, open=%d\n",
-		__func__, ID_DEVICE_ORIENTATION, open);
-	ret = sensor_enable_to_hub(ID_DEVICE_ORIENTATION, open);
-	return ret;
-}
-static int device_orientation_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_DEVICE_ORIENTATION,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-static int device_orientation_flush(void)
-{
-	return sensor_flush_to_hub(ID_DEVICE_ORIENTATION);
-}
-static int device_orientation_recv_data(struct data_unit_t *event,
-	void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = situation_flush_report(ID_DEVICE_ORIENTATION);
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_data_report_t(ID_DEVICE_ORIENTATION,
-			event->tilt_event.state, (int64_t)event->time_stamp);
-	return err;
-}
-
-static int device_orientation_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	ctl.open_report_data = device_orientation_open_report_data;
-	ctl.batch = device_orientation_batch;
-	ctl.flush = device_orientation_flush,
-	ctl.is_support_wake_lock = false;
-	ctl.is_support_batch = false;
-	err = situation_register_control_path(&ctl, ID_DEVICE_ORIENTATION);
-	if (err) {
-		pr_err("register stationary control path err\n");
-		goto exit;
-	}
-
-	data.get_data = device_orientation_get_data;
-	err = situation_register_data_path(&data, ID_DEVICE_ORIENTATION);
-	if (err) {
-		pr_err("register stationary data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_DEVICE_ORIENTATION,
-		device_orientation_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-exit_create_attr_failed:
-	return -1;
-}
-static int device_orientation_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info device_orientation_init_info = {
-	.name = "device_orientation_hub",
-	.init = device_orientation_local_init,
-	.uninit = device_orientation_local_uninit,
-};
-
-int __init device_orientation_init(void)
-{
-	situation_driver_add(&device_orientation_init_info,
-		ID_DEVICE_ORIENTATION);
-	return 0;
-}
-
-void __exit device_orientation_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/device_orientation.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/device_orientation.h
deleted file mode 100644
index bfb5d37..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/device_orientation/device_orientation.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef DEVICE_ORIENTATION_H
-#define DEVICE_ORIENTATION_H
-
-#include <linux/ioctl.h>
-
-int __init device_orientation_init(void);
-void __exit device_orientation_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/Kconfig
deleted file mode 100644
index 67742bf..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/Kconfig
+++ /dev/null
@@ -1,4 +0,0 @@
-config MTK_FLAT_HUB
-	bool "flat for MediaTek package"
-	help
-	  Put the device lie on the table.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/flat.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/flat.c
deleted file mode 100644
index 69a0488..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/flat.c
+++ /dev/null
@@ -1,138 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include "flat.h"
-#include "situation.h"
-
-#include <hwmsen_helper.h>
-
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-static int flat_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_FLAT, &data);
-	if (err < 0) {
-		pr_warn("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp = data.time_stamp;
-	*probability = data.gesture_data_t.probability;
-	pr_debug("recv ipi: timestamp: %lld, probability: %d!\n", time_stamp,
-		*probability);
-	return 0;
-}
-
-static int flat_open_report_data(int open)
-{
-	int ret = 0;
-
-	pr_debug("%s : enable=%d\n", __func__, open);
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_FLAT, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-
-	ret = sensor_enable_to_hub(ID_FLAT, open);
-	return ret;
-}
-
-static int flat_batch(int flag, int64_t samplingPeriodNs,
-		int64_t maxBatchReportLatencyNs)
-{
-	pr_debug("%s : flag=%d\n", __func__, flag);
-
-	return sensor_batch_to_hub(ID_FLAT, flag, samplingPeriodNs,
-			maxBatchReportLatencyNs);
-}
-
-static int flat_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		pr_warn("flat do not support flush\n");
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_notify_t(ID_FLAT, (int64_t)event->time_stamp);
-	return err;
-}
-
-static int flat_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	ctl.open_report_data = flat_open_report_data;
-	ctl.batch = flat_batch;
-	ctl.is_support_wake_lock = true;
-	err = situation_register_control_path(&ctl, ID_FLAT);
-	if (err) {
-		pr_warn("register flat control path err\n");
-		goto exit;
-	}
-
-	data.get_data = flat_get_data;
-	err = situation_register_data_path(&data, ID_FLAT);
-	if (err) {
-		pr_warn("register flat data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_FLAT, flat_recv_data);
-	if (err) {
-		pr_warn("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-exit_create_attr_failed:
-	return -1;
-}
-static int flat_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info flat_init_info = {
-	.name = "flat_hub",
-	.init = flat_local_init,
-	.uninit = flat_local_uninit,
-};
-
-int __init flat_init(void)
-{
-	situation_driver_add(&flat_init_info, ID_FLAT);
-	return 0;
-}
-
-void __exit flat_exit(void)
-{
-	pr_debug("flat exit\n");
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/flat.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/flat.h
deleted file mode 100644
index 906f71c..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/flat/flat.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef FLAT_H
-#define FLAT_H
-
-#include <linux/ioctl.h>
-
-int __init flat_init(void);
-void __exit flat_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/Kconfig
deleted file mode 100644
index 8dd75e8..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/Kconfig
+++ /dev/null
@@ -1,7 +0,0 @@
-config MTK_GLGHUB
-	bool "glghub for MediaTek package"
-	help
-	  A glance gesture is a device,
-	  usually portable and electronic
-	  or electromechanical,
-	  that detect glance action a person takes.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/glance_gesture.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/glance_gesture.c
deleted file mode 100644
index 9852e84..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/glance_gesture.c
+++ /dev/null
@@ -1,139 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[glghub] " fmt
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include "glance_gesture.h"
-#include <situation.h>
-#include <hwmsen_helper.h>
-
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-enum GLGHUB_TRC {
-	GLGHUBH_TRC_INFO = 0X10,
-};
-
-static struct situation_init_info glghub_init_info;
-
-static int glance_gesture_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_GLANCE_GESTURE, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp		= data.time_stamp;
-	*probability	= data.gesture_data_t.probability;
-	return 0;
-}
-static int glance_gesture_open_report_data(int open)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_GLANCE_GESTURE, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	ret = sensor_enable_to_hub(ID_GLANCE_GESTURE, open);
-	return ret;
-}
-static int glance_gesture_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_GLANCE_GESTURE,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-static int glance_gesture_recv_data(struct data_unit_t *event,
-	void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		pr_debug("glance_gesture do not support flush\n");
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_notify_t(ID_GLANCE_GESTURE,
-				(int64_t)event->time_stamp);
-	return err;
-}
-
-static int glghub_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	ctl.open_report_data = glance_gesture_open_report_data;
-	ctl.batch = glance_gesture_batch;
-	ctl.is_support_wake_lock = true;
-	err = situation_register_control_path(&ctl, ID_GLANCE_GESTURE);
-	if (err) {
-		pr_err("register glance_gesture control path err\n");
-		goto exit;
-	}
-
-	data.get_data = glance_gesture_get_data;
-	err = situation_register_data_path(&data, ID_GLANCE_GESTURE);
-	if (err) {
-		pr_err("register glance_gesture data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_GLANCE_GESTURE,
-		glance_gesture_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-exit_create_attr_failed:
-	return -1;
-}
-static int glghub_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info glghub_init_info = {
-	.name = "glance_gesture_hub",
-	.init = glghub_local_init,
-	.uninit = glghub_local_uninit,
-};
-
-int __init glghub_init(void)
-{
-	situation_driver_add(&glghub_init_info, ID_GLANCE_GESTURE);
-	return 0;
-}
-
-void __exit glghub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/glance_gesture.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/glance_gesture.h
deleted file mode 100644
index 9c4717d..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/glance_gesture/glance_gesture.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef GLGHUB_H
-#define GLGHUB_H
-
-#include <linux/ioctl.h>
-
-int __init glghub_init(void);
-void __exit glghub_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/Kconfig
deleted file mode 100644
index 84c1add..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_INPKHUB
-	bool "inpocket for MediaTek package"
-	help
-	  A in pocket is a device,
-	  usually portable
-	  and electronic or electromechanical,
-	  that detect device's position.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/inpocket.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/inpocket.c
deleted file mode 100644
index db31927..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/inpocket.c
+++ /dev/null
@@ -1,142 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[inpocket] " fmt
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include "inpocket.h"
-#include "situation.h"
-
-#include <hwmsen_helper.h>
-
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-static struct situation_init_info inpocket_init_info;
-
-static int inpocket_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_IN_POCKET, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp		= data.time_stamp;
-	*probability	= data.gesture_data_t.probability;
-	return 0;
-}
-static int inpocket_open_report_data(int open)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_IN_POCKET, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	pr_debug("%s : type=%d, open=%d\n", __func__, ID_IN_POCKET, open);
-	ret = sensor_enable_to_hub(ID_IN_POCKET, open);
-	return ret;
-}
-static int inpocket_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_IN_POCKET,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-static int inpocket_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		pr_debug("inpocket do not support flush\n");
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_notify_t(ID_IN_POCKET,
-				(int64_t)event->time_stamp);
-	return err;
-}
-
-static int inpocket_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	pr_debug("%s\n", __func__);
-
-	ctl.open_report_data = inpocket_open_report_data;
-	ctl.batch = inpocket_batch;
-	ctl.is_support_wake_lock = true;
-	err = situation_register_control_path(&ctl, ID_IN_POCKET);
-	if (err) {
-		pr_err("register in_pocket control path err\n");
-		goto exit;
-	}
-
-	data.get_data = inpocket_get_data;
-	err = situation_register_data_path(&data, ID_IN_POCKET);
-	if (err) {
-		pr_err("register in_pocket data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_IN_POCKET, inpocket_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-exit_create_attr_failed:
-	return -1;
-}
-static int inpocket_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info inpocket_init_info = {
-	.name = "in_pocket_hub",
-	.init = inpocket_local_init,
-	.uninit = inpocket_local_uninit,
-};
-
-int __init inpocket_init(void)
-{
-	situation_driver_add(&inpocket_init_info, ID_IN_POCKET);
-	return 0;
-}
-
-void __exit inpocket_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(inpocket_init);
-module_exit(inpocket_exit);
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("InPocket driver");
-MODULE_AUTHOR("qiangming.xia@mediatek.com");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/inpocket.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/inpocket.h
deleted file mode 100644
index cc69c0b..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/inpocket/inpocket.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef INPOCKETHUB_H
-#define INPOCKETHUB_H
-
-#include <linux/ioctl.h>
-
-int __init inpocket_init(void);
-void __exit inpocket_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/Kconfig
deleted file mode 100644
index 16d8287..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_MOTION_DETECT_HUB
-	bool "motion detect hub for MediaTek package"
-	help
-	  A motion detection is a device,
-	  usually portable
-	  and electronic or electromechanical,
-	  that detect device is moved.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/motion_detect.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/motion_detect.c
deleted file mode 100644
index 037bdc8..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/motion_detect.c
+++ /dev/null
@@ -1,136 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[motion_detect] " fmt
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include "situation.h"
-#include "motion_detect.h"
-#include <hwmsen_helper.h>
-
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-static struct situation_init_info motion_detect_init_info;
-static int motion_detect_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_MOTION_DETECT, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp		= data.time_stamp;
-	*probability	= data.gesture_data_t.probability;
-	return 0;
-}
-static int motion_detect_open_report_data(int open)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_MOTION_DETECT, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	pr_debug("%s : type=%d, open=%d\n",
-		__func__, ID_MOTION_DETECT, open);
-	ret = sensor_enable_to_hub(ID_MOTION_DETECT, open);
-	return ret;
-}
-static int motion_detect_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_MOTION_DETECT,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-static int motion_detect_recv_data(struct data_unit_t *event,
-	void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		pr_debug("stat do not support flush\n");
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_notify_t(ID_MOTION_DETECT,
-				(int64_t)event->time_stamp);
-	return err;
-}
-
-static int motion_detect_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	ctl.open_report_data = motion_detect_open_report_data;
-	ctl.batch = motion_detect_batch;
-	ctl.is_support_wake_lock = true;
-	err = situation_register_control_path(&ctl, ID_MOTION_DETECT);
-	if (err) {
-		pr_err("register stationary control path err\n");
-		goto exit;
-	}
-
-	data.get_data = motion_detect_get_data;
-	err = situation_register_data_path(&data, ID_MOTION_DETECT);
-	if (err) {
-		pr_err("register stationary data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_MOTION_DETECT,
-		motion_detect_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-exit_create_attr_failed:
-	return -1;
-}
-static int motion_detect_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info motion_detect_init_info = {
-	.name = "motion_detect_hub",
-	.init = motion_detect_local_init,
-	.uninit = motion_detect_local_uninit,
-};
-
-int __init motion_detect_init(void)
-{
-	situation_driver_add(&motion_detect_init_info, ID_MOTION_DETECT);
-	return 0;
-}
-
-void __exit motion_detect_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/motion_detect.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/motion_detect.h
deleted file mode 100644
index 30a7aec..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/motion_detect/motion_detect.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef MOTION_DETECT_H
-#define MOTION_DETECT_H
-
-#include <linux/ioctl.h>
-
-int __init motion_detect_init(void);
-void __exit motion_detect_exit(void);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/Kconfig
deleted file mode 100644
index ea2af38..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_PICKUPHUB
-	bool "pickuphub for MediaTek package"
-	help
-	  A pick up is a device,
-	  usually portable
-	  and electronic or electromechanical,
-	  that detect device is picked up.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/pickup_gesture.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/pickup_gesture.c
deleted file mode 100644
index bd3edad..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/pickup_gesture.c
+++ /dev/null
@@ -1,143 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[pkuphub] " fmt
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-
-#include <linux/platform_device.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include "pickup_gesture.h"
-#include <situation.h>
-#include <hwmsen_helper.h>
-
-
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-enum PKUPHUB_TRC {
-	PKUPHUB_TRC_INFO = 0X10,
-};
-
-static struct situation_init_info pkuphub_init_info;
-
-static int pickup_gesture_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_PICK_UP_GESTURE, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp = data.time_stamp;
-	*probability = data.gesture_data_t.probability;
-	return 0;
-}
-
-static int pickup_gesture_open_report_data(int open)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_PICK_UP_GESTURE, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	ret = sensor_enable_to_hub(ID_PICK_UP_GESTURE, open);
-	return ret;
-}
-static int pickup_gesture_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_PICK_UP_GESTURE,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-static int pickup_gesture_recv_data(struct data_unit_t *event,
-	void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		pr_debug("pickup_gesture do not support flush\n");
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_notify_t(ID_PICK_UP_GESTURE,
-				(int64_t)event->time_stamp);
-	return err;
-}
-
-static int pkuphub_local_init(void)
-{
-	struct situation_control_path ctl = { 0 };
-	struct situation_data_path data = { 0 };
-	int err = 0;
-
-	ctl.open_report_data = pickup_gesture_open_report_data;
-	ctl.batch = pickup_gesture_batch;
-	ctl.is_support_wake_lock = true;
-	err = situation_register_control_path(&ctl, ID_PICK_UP_GESTURE);
-	if (err) {
-		pr_err("register pickup_gesture control path err\n");
-		goto exit;
-	}
-
-	data.get_data = pickup_gesture_get_data;
-	err = situation_register_data_path(&data, ID_PICK_UP_GESTURE);
-	if (err) {
-		pr_err("register pickup_gesture data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_PICK_UP_GESTURE,
-		pickup_gesture_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-exit_create_attr_failed:
-	return -1;
-}
-
-static int pkuphub_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info pkuphub_init_info = {
-	.name = "pickup_gesture_hub",
-	.init = pkuphub_local_init,
-	.uninit = pkuphub_local_uninit,
-};
-
-int __init pkuphub_init(void)
-{
-	situation_driver_add(&pkuphub_init_info, ID_PICK_UP_GESTURE);
-	return 0;
-}
-
-void __exit pkuphub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/pickup_gesture.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/pickup_gesture.h
deleted file mode 100644
index 1e2d205..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/pickup_gesture/pickup_gesture.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef PICKUPHUB_H
-#define PICKUPHUB_H
-
-#include <linux/ioctl.h>
-
-int __init pkuphub_init(void);
-void __exit pkuphub_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/Kconfig
deleted file mode 100644
index fc0cae7..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/Kconfig
+++ /dev/null
@@ -1,7 +0,0 @@
-config MTK_SAR_HUB
-	bool "sarthub for MediaTek package"
-	help
-	  A sar is a device,
-	  usually portable and electronic
-	  or electromechanical,
-	  that detect distance between the body and device .
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sar_factory.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sar_factory.c
deleted file mode 100644
index 666af4b..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sar_factory.c
+++ /dev/null
@@ -1,200 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<SAR_FAC>" fmt
-
-#include "sar_factory.h"
-
-struct sar_factory_private {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct sar_factory_fops *fops;
-};
-
-static struct sar_factory_private sar_factory;
-
-static int sar_factory_open(struct inode *inode, struct file *file)
-{
-	return nonseekable_open(inode, file);
-}
-
-static int sar_factory_release(struct inode *inode, struct file *file)
-{
-	file->private_data = NULL;
-	return 0;
-}
-
-static long sar_factory_unlocked_ioctl(struct file *file, unsigned int cmd,
-					unsigned long arg)
-{
-	long err = 0;
-	void __user *ptr = (void __user *)arg;
-	int32_t data_buf[3] = {0};
-	struct SENSOR_DATA sensor_data = {0};
-	uint32_t flag = 0;
-
-	if (_IOC_DIR(cmd) & _IOC_READ)
-		err = !access_ok(VERIFY_WRITE, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-	else if (_IOC_DIR(cmd) & _IOC_WRITE)
-		err = !access_ok(VERIFY_READ, (void __user *)arg,
-				 _IOC_SIZE(cmd));
-
-	if (err) {
-		pr_err("access error: %08X, (%2d, %2d)\n", cmd,
-			    _IOC_DIR(cmd), _IOC_SIZE(cmd));
-		return -EFAULT;
-	}
-
-	switch (cmd) {
-	case SAR_IOCTL_INIT:
-		if (copy_from_user(&flag, ptr, sizeof(flag)))
-			return -EFAULT;
-		if (sar_factory.fops != NULL &&
-		    sar_factory.fops->enable_sensor != NULL) {
-			err = sar_factory.fops->enable_sensor(flag, 200);
-			if (err < 0) {
-				pr_err("SAR_IOCTL_INIT fail!\n");
-				return -EINVAL;
-			}
-			pr_debug(
-				"SAR_IOCTL_INIT, enable: %d, sample_period:%dms\n",
-				flag, 200);
-		} else {
-			pr_err("SAR_IOCTL_INIT NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case SAR_IOCTL_READ_SENSORDATA:
-		if (sar_factory.fops != NULL &&
-		    sar_factory.fops->get_data != NULL) {
-			err = sar_factory.fops->get_data(data_buf);
-			if (err < 0) {
-				pr_err(
-					"SAR_IOCTL_READ_SENSORDATA read data fail!\n");
-				return -EINVAL;
-			}
-			pr_debug("SAR_IOCTL_READ_SENSORDATA: (%d, %d, %d)!\n",
-				data_buf[0], data_buf[1], data_buf[2]);
-			sensor_data.x = data_buf[0];
-			sensor_data.y = data_buf[1];
-			sensor_data.z = data_buf[2];
-			if (copy_to_user(ptr, &sensor_data,
-							sizeof(sensor_data)))
-				return -EFAULT;
-		} else {
-			pr_err("SAR_IOCTL_READ_SENSORDATA NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case SAR_IOCTL_ENABLE_CALI:
-		if (sar_factory.fops != NULL &&
-		    sar_factory.fops->enable_calibration != NULL) {
-			err = sar_factory.fops->enable_calibration();
-			if (err < 0) {
-				pr_err(
-					"SAR_IOCTL_ENABLE_CALI fail!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("SAR_IOCTL_ENABLE_CALI NULL\n");
-			return -EINVAL;
-		}
-		return 0;
-	case SAR_IOCTL_GET_CALI:
-		if (sar_factory.fops != NULL &&
-		    sar_factory.fops->get_cali != NULL) {
-			err = sar_factory.fops->get_cali(data_buf);
-			if (err < 0) {
-				pr_err("SAR_IOCTL_GET_CALI FAIL!\n");
-				return -EINVAL;
-			}
-		} else {
-			pr_err("SAR_IOCTL_GET_CALI NULL\n");
-			return -EINVAL;
-		}
-
-		pr_debug("SAR_IOCTL_GET_CALI: (%d, %d, %d)!\n",
-			data_buf[0], data_buf[1], data_buf[2]);
-		sensor_data.x = data_buf[0];
-		sensor_data.y = data_buf[1];
-		sensor_data.z = data_buf[2];
-		if (copy_to_user(ptr, &sensor_data, sizeof(sensor_data)))
-			return -EFAULT;
-		return 0;
-	default:
-		pr_err("unknown IOCTL: 0x%08x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-	return 0;
-}
-
-#if IS_ENABLED(CONFIG_COMPAT)
-static long compat_sar_factory_unlocked_ioctl(struct file *filp,
-					       unsigned int cmd,
-					       unsigned long arg)
-{
-	if (!filp->f_op || !filp->f_op->unlocked_ioctl) {
-		pr_err(
-			"compat_ion_ioctl file has no f_op or no f_op->unlocked_ioctl.\n");
-		return -ENOTTY;
-	}
-
-	switch (cmd) {
-	case COMPAT_SAR_IOCTL_INIT:
-	case COMPAT_SAR_IOCTL_READ_SENSORDATA:
-	case COMPAT_SAR_IOCTL_ENABLE_CALI:
-	case COMPAT_SAR_IOCTL_GET_CALI: {
-		pr_debug(
-			"compat_ion_ioctl : SAR_IOCTL_XXX command is 0x%x\n",
-			cmd);
-		return filp->f_op->unlocked_ioctl(
-			filp, cmd, (unsigned long)compat_ptr(arg));
-	}
-	default:
-		pr_err("compat_ion_ioctl : No such command!! 0x%x\n", cmd);
-		return -ENOIOCTLCMD;
-	}
-}
-#endif
-/*----------------------------------------------------------------------------*/
-static const struct file_operations _sar_factory_fops = {
-	.open = sar_factory_open,
-	.release = sar_factory_release,
-	.unlocked_ioctl = sar_factory_unlocked_ioctl,
-#if IS_ENABLED(CONFIG_COMPAT)
-	.compat_ioctl = compat_sar_factory_unlocked_ioctl,
-#endif
-};
-
-static struct miscdevice _sar_factory_device = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = "sar",
-	.fops = &_sar_factory_fops,
-};
-
-int sar_factory_device_register(struct sar_factory_public *dev)
-{
-	int err = 0;
-
-	if (!dev || !dev->fops)
-		return -1;
-	sar_factory.gain = dev->gain;
-	sar_factory.sensitivity = dev->sensitivity;
-	sar_factory.fops = dev->fops;
-	err = misc_register(&_sar_factory_device);
-	if (err) {
-		pr_err("sar_factory_device register failed\n");
-		err = -1;
-	}
-	return err;
-}
-
-int sar_factory_device_deregister(struct sar_factory_public *dev)
-{
-	sar_factory.fops = NULL;
-	misc_deregister(&_sar_factory_device);
-	return 0;
-}
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sar_factory.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sar_factory.h
deleted file mode 100644
index da5317b..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sar_factory.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __SAR_FACTORY_H__
-#define __SAR_FACTORY_H__
-
-#include <linux/atomic.h>
-#include <linux/delay.h>
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/kobject.h>
-#include <linux/miscdevice.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-#include <linux/types.h>
-#include <linux/uaccess.h>
-#include <linux/workqueue.h>
-
-#include <hwmsen_helper.h>
-#include <hwmsensor.h>
-#include <sensors_io.h>
-
-
-struct sar_factory_fops {
-	int (*enable_sensor)(bool enabledisable,
-			int64_t sample_periods_ms);
-	int (*get_data)(int32_t sensor_data[3]);
-	int (*enable_calibration)(void);
-	int (*get_cali)(int32_t data[3]);
-};
-
-struct sar_factory_public {
-	uint32_t gain;
-	uint32_t sensitivity;
-	struct sar_factory_fops *fops;
-};
-int sar_factory_device_register(struct sar_factory_public *dev);
-int sar_factory_device_deregister(struct sar_factory_public *dev);
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sarhub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sarhub.c
deleted file mode 100644
index e5a946a..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sarhub.c
+++ /dev/null
@@ -1,261 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[sarhub] " fmt
-
-#include <hwmsensor.h>
-#include "sarhub.h"
-#include <situation.h>
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-#include "sar_factory.h"
-
-static struct situation_init_info sarhub_init_info;
-static DEFINE_SPINLOCK(calibration_lock);
-struct sarhub_ipi_data {
-	bool factory_enable;
-
-	int32_t cali_data[3];
-	int8_t cali_status;
-	struct completion calibration_done;
-};
-static struct sarhub_ipi_data *obj_ipi_data;
-
-
-static int sar_factory_enable_sensor(bool enabledisable,
-					 int64_t sample_periods_ms)
-{
-	int err = 0;
-	struct sarhub_ipi_data *obj = obj_ipi_data;
-
-	if (enabledisable == true)
-		WRITE_ONCE(obj->factory_enable, true);
-	else
-		WRITE_ONCE(obj->factory_enable, false);
-	if (enabledisable == true) {
-		err = sensor_set_delay_to_hub(ID_SAR,
-					      sample_periods_ms);
-		if (err) {
-			pr_err("sensor_set_delay_to_hub failed!\n");
-			return -1;
-		}
-	}
-	err = sensor_enable_to_hub(ID_SAR, enabledisable);
-	if (err) {
-		pr_err("sensor_enable_to_hub failed!\n");
-		return -1;
-	}
-	return 0;
-}
-
-static int sar_factory_get_data(int32_t sensor_data[3])
-{
-	int err = 0;
-	struct data_unit_t data;
-
-	err = sensor_get_data_from_hub(ID_SAR, &data);
-	if (err < 0) {
-		pr_err_ratelimited("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	sensor_data[0] = data.sar_event.data[0];
-	sensor_data[1] = data.sar_event.data[1];
-	sensor_data[2] = data.sar_event.data[2];
-
-	return err;
-}
-
-static int sar_factory_enable_calibration(void)
-{
-	return sensor_calibration_to_hub(ID_SAR);
-}
-
-static int sar_factory_get_cali(int32_t data[3])
-{
-	int err = 0;
-	struct sarhub_ipi_data *obj = obj_ipi_data;
-	int8_t status = 0;
-
-	err = wait_for_completion_timeout(&obj->calibration_done,
-					  msecs_to_jiffies(3000));
-	if (!err) {
-		pr_err("sar factory get cali fail!\n");
-		return -1;
-	}
-	spin_lock(&calibration_lock);
-	data[0] = obj->cali_data[0];
-	data[1] = obj->cali_data[1];
-	data[2] = obj->cali_data[2];
-	status = obj->cali_status;
-	spin_unlock(&calibration_lock);
-	if (status != 0) {
-		pr_debug("sar cali fail!\n");
-		return -2;
-	}
-	return 0;
-}
-
-
-static struct sar_factory_fops sarhub_factory_fops = {
-	.enable_sensor = sar_factory_enable_sensor,
-	.get_data = sar_factory_get_data,
-	.enable_calibration = sar_factory_enable_calibration,
-	.get_cali = sar_factory_get_cali,
-};
-
-static struct sar_factory_public sarhub_factory_device = {
-	.gain = 1,
-	.sensitivity = 1,
-	.fops = &sarhub_factory_fops,
-};
-
-static int sar_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_SAR, &data);
-	if (err < 0) {
-		pr_err_ratelimited("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp		= data.time_stamp;
-	*probability	= data.sar_event.data[0];
-	return 0;
-}
-static int sar_open_report_data(int open)
-{
-	int ret = 0;
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_SAR, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	ret = sensor_enable_to_hub(ID_SAR, open);
-	return ret;
-}
-static int sar_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_SAR,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int sar_flush(void)
-{
-	return sensor_flush_to_hub(ID_SAR);
-}
-
-static int sar_recv_data(struct data_unit_t *event, void *reserved)
-{
-	struct sarhub_ipi_data *obj = obj_ipi_data;
-	int32_t value[3] = {0};
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = situation_flush_report(ID_SAR);
-	else if (event->flush_action == DATA_ACTION) {
-		value[0] = event->sar_event.data[0];
-		value[1] = event->sar_event.data[1];
-		value[2] = event->sar_event.data[2];
-		err = sar_data_report_t(value, (int64_t)event->time_stamp);
-	} else if (event->flush_action == CALI_ACTION) {
-		spin_lock(&calibration_lock);
-		obj->cali_data[0] =
-			event->sar_event.x_bias;
-		obj->cali_data[1] =
-			event->sar_event.y_bias;
-		obj->cali_data[2] =
-			event->sar_event.z_bias;
-		obj->cali_status =
-			(int8_t)event->sar_event.status;
-		spin_unlock(&calibration_lock);
-		complete(&obj->calibration_done);
-	}
-	return err;
-}
-
-
-static int sarhub_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	struct sarhub_ipi_data *obj;
-
-	pr_debug("%s\n", __func__);
-	obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-	if (!obj) {
-		err = -ENOMEM;
-		goto exit;
-	}
-
-	memset(obj, 0, sizeof(*obj));
-	obj_ipi_data = obj;
-	WRITE_ONCE(obj->factory_enable, false);
-	init_completion(&obj->calibration_done);
-
-	ctl.open_report_data = sar_open_report_data;
-	ctl.batch = sar_batch;
-	ctl.flush = sar_flush;
-	ctl.is_support_wake_lock = true;
-	ctl.is_support_batch = false;
-	err = situation_register_control_path(&ctl, ID_SAR);
-	if (err) {
-		pr_err("register sar control path err\n");
-		goto exit;
-	}
-
-	data.get_data = sar_get_data;
-	err = situation_register_data_path(&data, ID_SAR);
-	if (err) {
-		pr_err("register sar data path err\n");
-		goto exit;
-	}
-
-	err = sar_factory_device_register(&sarhub_factory_device);
-	if (err) {
-		pr_err("sar_factory_device register failed\n");
-		goto exit;
-	}
-
-	err = scp_sensorHub_data_registration(ID_SAR,
-		sar_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit;
-	}
-	return 0;
-exit:
-	return -1;
-}
-static int sarhub_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info sarhub_init_info = {
-	.name = "sar_hub",
-	.init = sarhub_local_init,
-	.uninit = sarhub_local_uninit,
-};
-
-int __init sarhub_init(void)
-{
-	situation_driver_add(&sarhub_init_info, ID_SAR);
-	return 0;
-}
-
-void __exit sarhub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sarhub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sarhub.h
deleted file mode 100644
index 5d719fb..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/sar/sarhub.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef SARHUB_H
-#define SARHUB_H
-
-#include <linux/ioctl.h>
-
-int __init sarhub_init(void);
-void __exit sarhub_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/situation_hub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/situation_hub.c
deleted file mode 100644
index ae558d5..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/situation_hub.c
+++ /dev/null
@@ -1,110 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (C) 2019 MediaTek Inc.
- */
-
-#include "situation_hub.h"
-
-static int __init situation_hub_init(void)
-{
-#if IS_ENABLED(CONFIG_MTK_INPKHUB)
-	inpocket_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_STATHUB)
-	stat_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_WAKEHUB)
-	wakehub_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_GLGHUB)
-	glghub_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_PICKUPHUB)
-	pkuphub_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_ANSWER_CALL_HUB)
-	ancallhub_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_DEVICE_ORIENTATION_HUB)
-	device_orientation_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_MOTION_DETECT_HUB)
-	motion_detect_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_TILTDETECTHUB)
-	tiltdetecthub_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_FLAT_HUB)
-	flat_init();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_SAR_HUB)
-	sarhub_init();
-#endif
-
-	return 0;
-}
-
-static void __exit situation_hub_exit(void)
-{
-#if IS_ENABLED(CONFIG_MTK_INPKHUB)
-	inpocket_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_STATHUB)
-	stat_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_WAKEHUB)
-	wakehub_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_GLGHUB)
-	glghub_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_PICKUPHUB)
-	pkuphub_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_ANSWER_CALL_HUB)
-	ancallhub_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_DEVICE_ORIENTATION_HUB)
-	device_orientation_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_MOTION_DETECT_HUB)
-	motion_detect_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_TILTDETECTHUB)
-	tiltdetecthub_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_FLAT_HUB)
-	flat_exit();
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_SAR_HUB)
-	sarhub_exit();
-#endif
-}
-
-module_init(situation_hub_init);
-module_exit(situation_hub_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("situtation hub driver");
-MODULE_AUTHOR("Mediatek");
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/situation_hub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/situation_hub.h
deleted file mode 100644
index bcd923f..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/situation_hub.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __SITUTATION_HUB_H__
-#define __SITUTATION_HUB_H__
-
-#include <linux/module.h>
-
-#if IS_ENABLED(CONFIG_MTK_INPKHUB)
-#include "inpocket/inpocket.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_STATHUB)
-#include "stationary/stationary.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_WAKEHUB)
-#include "wake_gesture/wake_gesture.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_GLGHUB)
-#include "glance_gesture/glance_gesture.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_PICKUPHUB)
-#include "pickup_gesture/pickup_gesture.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_ANSWER_CALL_HUB)
-#include "answercall/ancallhub.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_DEVICE_ORIENTATION_HUB)
-#include "device_orientation/device_orientation.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_MOTION_DETECT_HUB)
-#include "motion_detect/motion_detect.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_TILTDETECTHUB)
-#include "tilt_detector/tiltdetecthub.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_FLAT_HUB)
-#include "flat/flat.h"
-#endif
-
-#if IS_ENABLED(CONFIG_MTK_SAR_HUB)
-#include "sar/sarhub.h"
-#endif
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/Kconfig
deleted file mode 100644
index 7917f45..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_STATHUB
-	bool "stahub for MediaTek package"
-	help
-	  A stationary is a device,
-	  usually portable
-	  and electronic or electromechanical,
-	  that detect device is kept static.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/stationary.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/stationary.c
deleted file mode 100644
index 04166e4..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/stationary.c
+++ /dev/null
@@ -1,135 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[stationary] " fmt
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include "situation.h"
-#include "stationary.h"
-#include <hwmsen_helper.h>
-
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-static struct situation_init_info stat_init_info;
-static int stat_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_STATIONARY_DETECT, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp		= data.time_stamp;
-	*probability	= data.gesture_data_t.probability;
-	return 0;
-}
-static int stat_open_report_data(int open)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_STATIONARY_DETECT, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	pr_debug("%s : type=%d, open=%d\n",
-		__func__, ID_STATIONARY_DETECT, open);
-	ret = sensor_enable_to_hub(ID_STATIONARY_DETECT, open);
-	return ret;
-}
-static int stat_batch(int flag, int64_t samplingPeriodNs,
-	int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_STATIONARY_DETECT,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-static int stat_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		pr_debug("stat do not support flush\n");
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_notify_t(ID_STATIONARY_DETECT,
-			(int64_t)event->time_stamp);
-	return err;
-}
-
-static int stat_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	ctl.open_report_data = stat_open_report_data;
-	ctl.batch = stat_batch;
-	ctl.is_support_wake_lock = true;
-	err = situation_register_control_path(&ctl, ID_STATIONARY_DETECT);
-	if (err) {
-		pr_err("register stationary control path err\n");
-		goto exit;
-	}
-
-	data.get_data = stat_get_data;
-	err = situation_register_data_path(&data, ID_STATIONARY_DETECT);
-	if (err) {
-		pr_err("register stationary data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_STATIONARY_DETECT,
-		stat_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-exit_create_attr_failed:
-	return -1;
-}
-static int stat_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info stat_init_info = {
-	.name = "stat_hub",
-	.init = stat_local_init,
-	.uninit = stat_local_uninit,
-};
-
-int __init stat_init(void)
-{
-	situation_driver_add(&stat_init_info, ID_STATIONARY_DETECT);
-	return 0;
-}
-
-void __exit stat_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/stationary.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/stationary.h
deleted file mode 100644
index cc8b60c..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/stationary/stationary.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef STATIONARYHUB_H
-#define STATIONARYHUB_H
-
-#include <linux/ioctl.h>
-
-extern int __init stat_init(void);
-extern void __exit stat_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/Kconfig
deleted file mode 100644
index 7d723b7..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_TILTDETECTHUB
-	bool "tiltdetecthub for MediaTek package"
-	help
-	  A tilt detect is a device,
-	  usually portable and electronic
-	  or electromechanical,
-	  that detect device is picked up with 35 degree.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/tiltdetecthub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/tiltdetecthub.c
deleted file mode 100644
index 4bb7b97..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/tiltdetecthub.c
+++ /dev/null
@@ -1,124 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[tiltdetecthub] " fmt
-
-#include <hwmsensor.h>
-#include "tiltdetecthub.h"
-#include <situation.h>
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-static struct situation_init_info tiltdetecthub_init_info;
-
-static int tilt_detect_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_TILT_DETECTOR, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp		= data.time_stamp;
-	*probability	= data.gesture_data_t.probability;
-	return 0;
-}
-static int tilt_detect_open_report_data(int open)
-{
-	int ret = 0;
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_TILT_DETECTOR, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	ret = sensor_enable_to_hub(ID_TILT_DETECTOR, open);
-	return ret;
-}
-static int tilt_detect_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_TILT_DETECTOR,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int tilt_detect_flush(void)
-{
-	return sensor_flush_to_hub(ID_TILT_DETECTOR);
-}
-
-static int tilt_detect_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = situation_flush_report(ID_TILT_DETECTOR);
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_data_report_t(ID_TILT_DETECTOR,
-			event->tilt_event.state, (int64_t)event->time_stamp);
-	return err;
-}
-
-static int tiltdetecthub_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	ctl.open_report_data = tilt_detect_open_report_data;
-	ctl.batch = tilt_detect_batch;
-	ctl.flush = tilt_detect_flush;
-	ctl.is_support_wake_lock = true;
-	ctl.is_support_batch = false;
-	err = situation_register_control_path(&ctl, ID_TILT_DETECTOR);
-	if (err) {
-		pr_err("register tilt_detect control path err\n");
-		goto exit;
-	}
-
-	data.get_data = tilt_detect_get_data;
-	err = situation_register_data_path(&data, ID_TILT_DETECTOR);
-	if (err) {
-		pr_err("register tilt_detect data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_TILT_DETECTOR,
-		tilt_detect_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit;
-	}
-	return 0;
-exit:
-	return -1;
-}
-static int tiltdetecthub_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info tiltdetecthub_init_info = {
-	.name = "tilt_detect_hub",
-	.init = tiltdetecthub_local_init,
-	.uninit = tiltdetecthub_local_uninit,
-};
-
-int __init tiltdetecthub_init(void)
-{
-	situation_driver_add(&tiltdetecthub_init_info, ID_TILT_DETECTOR);
-	return 0;
-}
-
-void __exit tiltdetecthub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/tiltdetecthub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/tiltdetecthub.h
deleted file mode 100644
index 47869bc..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/tilt_detector/tiltdetecthub.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef TILTDETECTHUB_H
-#define TILTDETECTHUB_H
-
-#include <linux/ioctl.h>
-
-int __init tiltdetecthub_init(void);
-void __exit tiltdetecthub_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/Kconfig
deleted file mode 100644
index a59764f..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/Kconfig
+++ /dev/null
@@ -1,8 +0,0 @@
-
-config MTK_WAKEHUB
-	bool "wakehub for MediaTek package"
-	help
-	  A wake is a device,
-	  usually portable and electronic
-	  or electromechanical,
-	  that detect device is picked up with 35 degree.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/wake_gesture.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/wake_gesture.c
deleted file mode 100644
index 5cbe7c1..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/wake_gesture.c
+++ /dev/null
@@ -1,135 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[wakehub] " fmt
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/kobject.h>
-#include <linux/platform_device.h>
-#include <linux/atomic.h>
-
-#include <hwmsensor.h>
-#include <sensors_io.h>
-#include "wake_gesture.h"
-#include "situation.h"
-
-#include <hwmsen_helper.h>
-
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-static int wake_gesture_get_data(int *probability, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_WAKE_GESTURE, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp = data.time_stamp;
-	*probability = data.gesture_data_t.probability;
-	return 0;
-}
-static int wake_gesture_open_report_data(int open)
-{
-	int ret = 0;
-
-	pr_debug("%s : enable=%d\n", __func__, open);
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (open == 1)
-		ret = sensor_set_delay_to_hub(ID_WAKE_GESTURE, 120);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	ret = sensor_enable_to_hub(ID_WAKE_GESTURE, open);
-	return ret;
-}
-static int wake_gesture_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_WAKE_GESTURE,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-static int wake_gesture_recv_data(struct data_unit_t *event,
-	void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		pr_debug("wake_gesture do not support flush\n");
-	else if (event->flush_action == DATA_ACTION)
-		err = situation_notify_t(ID_WAKE_GESTURE,
-			(int64_t)event->time_stamp);
-	return err;
-}
-
-static int wakehub_local_init(void)
-{
-	struct situation_control_path ctl = {0};
-	struct situation_data_path data = {0};
-	int err = 0;
-
-	ctl.open_report_data = wake_gesture_open_report_data;
-	ctl.batch = wake_gesture_batch;
-	ctl.is_support_wake_lock = true;
-	err = situation_register_control_path(&ctl, ID_WAKE_GESTURE);
-	if (err) {
-		pr_err("register wake_gesture control path err\n");
-		goto exit;
-	}
-
-	data.get_data = wake_gesture_get_data;
-	err = situation_register_data_path(&data, ID_WAKE_GESTURE);
-	if (err) {
-		pr_err("register wake_gesture data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_WAKE_GESTURE,
-		wake_gesture_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-exit_create_attr_failed:
-	return -1;
-}
-static int wakehub_local_uninit(void)
-{
-	return 0;
-}
-
-static struct situation_init_info wakehub_init_info = {
-	.name = "wake_gesture_hub",
-	.init = wakehub_local_init,
-	.uninit = wakehub_local_uninit,
-};
-
-int __init wakehub_init(void)
-{
-	situation_driver_add(&wakehub_init_info, ID_WAKE_GESTURE);
-	return 0;
-}
-
-void __exit wakehub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/wake_gesture.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/wake_gesture.h
deleted file mode 100644
index e11d827..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/situation/situation_hub/wake_gesture/wake_gesture.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef WAKEHUB_H
-#define WAKEHUB_H
-
-#include <linux/ioctl.h>
-
-int __init wakehub_init(void);
-void __exit wakehub_exit(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/Kconfig
deleted file mode 100644
index dbc0fcf..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/Kconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-
-config CUSTOM_KERNEL_STEP_COUNTER
-	bool "CUSTOM_KERNEL_STEP_COUNTER"
-	help
-	  A step counter is a device, usually portable and electronic or electromechanical,
-	  that counts each step a person takes by detecting the motion of the person's hands or hips.
-
-config CUSTOM_KERNEL_SIGNIFICANT_MOTION
-	bool "open significant motion"
-	help
-	  Kernel space sigificant motion sensor driver.
-
-source "drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/Kconfig"
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/Makefile
deleted file mode 100644
index 804a56b..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Copyright (C) 2015 MediaTek Inc.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-
-# In case the platform does NOT support this type of sensors
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-
-obj-$(CONFIG_MTK_SENSOR_SUPPORT)	+= step_counter.o
-
-obj-$(CONFIG_MTK_STEPSIGNHUB)		+=	stepsignhub/
-
-ifeq ($(CONFIG_CUSTOM_KERNEL_STEP_COUNTER),"OTHER_VENDOR")
-obj-y += other_vendor/
-endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/step_counter.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/step_counter.c
deleted file mode 100644
index 485e627..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/step_counter.c
+++ /dev/null
@@ -1,1103 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "<STEP_COUNTER> " fmt
-
-#include "step_counter.h"
-
-static struct step_c_context *step_c_context_obj;
-static struct step_c_init_info *
-	step_counter_init_list[MAX_CHOOSE_STEP_C_NUM] = { 0 };
-
-static void step_c_work_func(struct work_struct *work)
-{
-
-	struct step_c_context *cxt = NULL;
-	uint32_t counter;
-	uint32_t counter_floor_c;
-	/* hwm_sensor_data sensor_data; */
-	int status;
-	int64_t nt;
-	struct timespec time;
-	int err = 0;
-
-	cxt = step_c_context_obj;
-
-	if (cxt->step_c_data.get_data == NULL)
-		pr_debug("step_c driver not register data path\n");
-	if (cxt->step_c_data.get_data_floor_c == NULL)
-		pr_debug("floor_c driver not register data path\n");
-
-
-	status = 0;
-	counter = 0;
-	time.tv_sec = time.tv_nsec = 0;
-	time = get_monotonic_coarse();
-	nt = time.tv_sec * 1000000000LL + time.tv_nsec;
-
-	/* add wake lock to make sure data can be read before system suspend */
-	if ((cxt->is_active_data == true) &&
-		(cxt->step_c_data.get_data != NULL))
-		err = cxt->step_c_data.get_data(&counter, &status);
-
-	if (err) {
-		pr_err("get step_c data fails!!\n");
-		goto step_c_loop;
-	} else {
-		{
-			cxt->drv_data.counter = counter;
-			cxt->drv_data.status = status;
-		}
-	}
-
-	status = 0;
-	counter_floor_c = 0;
-	if ((cxt->is_floor_c_active_data == true) &&
-		(cxt->step_c_data.get_data_floor_c != NULL))
-		err = cxt->step_c_data.get_data_floor_c(&counter_floor_c,
-							&status);
-
-	if (err) {
-		pr_err("get floor_c data fails!!\n");
-		goto step_c_loop;
-	} else {
-		{
-			cxt->drv_data.floor_counter = counter_floor_c;
-			cxt->drv_data.floor_c_status = status;
-		}
-	}
-
-	if (true == cxt->is_first_data_after_enable) {
-		cxt->is_first_data_after_enable = false;
-		/* filter -1 value */
-		if (cxt->drv_data.counter == STEP_C_INVALID_VALUE) {
-			pr_debug(" read invalid data\n");
-			goto step_c_loop;
-
-		}
-	}
-
-	if (true == cxt->is_first_floor_c_data_after_enable) {
-		cxt->is_first_floor_c_data_after_enable = false;
-		/* filter -1 value */
-		if (cxt->drv_data.floor_counter == STEP_C_INVALID_VALUE) {
-			pr_debug(" read invalid data\n");
-			goto step_c_loop;
-
-		}
-	}
-
-	/* report data to input device */
-	/*pr_debug("step_c data[%d]\n", cxt->drv_data.counter);*/
-
-	step_c_data_report(cxt->drv_data.counter, cxt->drv_data.status);
-	floor_c_data_report(cxt->drv_data.floor_counter,
-		cxt->drv_data.floor_c_status);
-
-step_c_loop:
-	if (true == cxt->is_polling_run) {
-		mod_timer(&cxt->timer,
-			jiffies + atomic_read(&cxt->delay) / (1000 / HZ));
-	}
-}
-
-static void step_c_poll(struct timer_list *t)
-{
-	struct step_c_context *obj = from_timer(obj, t, timer);
-
-	if (obj != NULL)
-		schedule_work(&obj->report);
-}
-
-static struct step_c_context *step_c_context_alloc_object(void)
-{
-	struct step_c_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
-
-	pr_debug("%s start\n", __func__);
-	if (!obj) {
-		pr_err("Alloc step_c object error!\n");
-		return NULL;
-	}
-	atomic_set(&obj->delay, 2000);	/*0.5Hz */
-	atomic_set(&obj->wake, 0);
-	INIT_WORK(&obj->report, step_c_work_func);
-	timer_setup(&obj->timer, step_c_poll, 0);
-	obj->timer.expires = jiffies + atomic_read(&obj->delay) / (1000 / HZ);
-	obj->is_first_data_after_enable = false;
-	obj->is_polling_run = false;
-	mutex_init(&obj->step_c_op_mutex);
-	obj->is_step_c_batch_enable = false;	/* for batch mode init */
-	obj->is_step_d_batch_enable = false;	/* for batch mode init */
-
-	pr_debug("%s end\n", __func__);
-	return obj;
-}
-
-int step_notify_t(enum STEP_NOTIFY_TYPE type, int64_t time_stamp)
-{
-	int err = 0;
-	struct step_c_context *cxt = NULL;
-	struct sensor_event event;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	cxt = step_c_context_obj;
-	event.time_stamp = time_stamp;
-
-	if (type == TYPE_STEP_DETECTOR) {
-		event.flush_action = DATA_ACTION;
-		event.handle = ID_STEP_DETECTOR;
-		event.word[0] = 1;
-		err = sensor_input_event(step_c_context_obj->mdev.minor,
-			&event);
-
-	}
-	if (type == TYPE_SIGNIFICANT) {
-		pr_debug("fwq TYPE_SIGNIFICANT notify\n");
-		/* cxt->step_c_data.get_data_significant(&value); */
-		event.flush_action = DATA_ACTION;
-		event.handle = ID_SIGNIFICANT_MOTION;
-		event.word[0] = 1;
-		err = sensor_input_event(step_c_context_obj->mdev.minor,
-			&event);
-	}
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(step_notify_t);
-
-int step_notify(enum STEP_NOTIFY_TYPE type)
-{
-	return step_notify_t(type, 0);
-}
-static int step_d_real_enable(int enable)
-{
-	int err = 0;
-	unsigned int i = 0;
-	struct step_c_context *cxt = NULL;
-
-	cxt = step_c_context_obj;
-	if (enable == 1) {
-
-		for (i = 0; i < 3; i++) {
-			err = cxt->step_c_ctl.enable_step_detect(1);
-			if (err == 0)
-				break;
-			else if (i == 2) {
-				pr_err("step_d E(%d)err 3 = %d\n",
-					enable, err);
-			}
-		}
-
-		pr_debug("step_d real enable\n");
-	}
-	if (enable == 0) {
-
-		err = cxt->step_c_ctl.enable_step_detect(0);
-		if (err)
-			pr_err("step_d enable(%d) err = %d\n",
-				enable, err);
-		pr_debug("step_d real disable\n");
-
-	}
-
-	return err;
-}
-
-static int significant_real_enable(int enable)
-{
-	int err = 0;
-	unsigned int i = 0;
-	struct step_c_context *cxt = NULL;
-
-	cxt = step_c_context_obj;
-	if (enable == 1) {
-
-		for (i = 0; i < 3; i++) {
-			err = cxt->step_c_ctl.enable_significant(1);
-			if (err == 0)
-				break;
-			else if (i == 2) {
-				pr_err("significant E(%d)err 3 = %d\n",
-					enable, err);
-			}
-		}
-
-		pr_debug("enable_significant real enable\n");
-	}
-	if (enable == 0) {
-		err = cxt->step_c_ctl.enable_significant(0);
-		if (err)
-			pr_err("enable_significantenable(%d) err = %d\n",
-				enable, err);
-		pr_debug("enable_significant real disable\n");
-
-	}
-	return err;
-}
-
-
-static int step_c_real_enable(int enable)
-{
-	int err = 0;
-	unsigned int i = 0;
-	struct step_c_context *cxt = NULL;
-
-	cxt = step_c_context_obj;
-	if (enable == 1) {
-		if (true == cxt->is_active_data ||
-			true == cxt->is_active_nodata) {
-
-			for (i = 0; i < 3; i++) {
-				err = cxt->step_c_ctl.enable_nodata(1);
-				if (err == 0)
-					break;
-				else if (i == 2) {
-					pr_err("step_c E(%d)err 3 =%d\n",
-						enable, err);
-				}
-			}
-
-			pr_debug("step_c real enable\n");
-		}
-	}
-	if (enable == 0) {
-		if (false == cxt->is_active_data &&
-			false == cxt->is_active_nodata) {
-			err = cxt->step_c_ctl.enable_nodata(0);
-			if (err)
-				pr_err("step_c enable(%d) err = %d\n",
-					enable, err);
-			pr_debug("step_c real disable\n");
-		}
-
-	}
-
-	return err;
-}
-
-
-static int floor_c_real_enable(int enable)
-{
-	int err = 0;
-	unsigned int i = 0;
-	struct step_c_context *cxt = NULL;
-
-	cxt = step_c_context_obj;
-	if (enable == 1) {
-		for (i = 0; i < 3; i++) {
-			err = cxt->step_c_ctl.enable_floor_c(1);
-			if (err == 0)
-				break;
-			else if (i == 2)
-				pr_err("floor_c enable(%d) err 3 = %d\n",
-					enable, err);
-		}
-
-		pr_debug("floor_c real enable\n");
-	}
-	if (enable == 0) {
-		err = cxt->step_c_ctl.enable_floor_c(0);
-		if (err)
-			pr_err("floor_c enable(%d) err = %d\n",
-				enable, err);
-		pr_debug("floor_c real disable\n");
-
-	}
-
-	return err;
-}
-
-
-
-static int step_c_enable_data(int enable)
-{
-	struct step_c_context *cxt = NULL;
-
-	cxt = step_c_context_obj;
-	if (cxt->step_c_ctl.open_report_data == NULL) {
-		pr_err("no step_c control path\n");
-		return -1;
-	}
-
-	if (enable == 1) {
-		pr_debug("STEP_C enable data\n");
-		cxt->is_active_data = true;
-		cxt->is_first_data_after_enable = true;
-		cxt->step_c_ctl.open_report_data(1);
-		if (false == cxt->is_polling_run &&
-			cxt->is_step_c_batch_enable == false) {
-			if (false == cxt->step_c_ctl.is_report_input_direct) {
-				mod_timer(&cxt->timer, jiffies +
-					atomic_read(&cxt->delay) / (1000 / HZ));
-				cxt->is_polling_run = true;
-			}
-		}
-	}
-	if (enable == 0) {
-		pr_debug("STEP_C disable\n");
-		cxt->is_active_data = false;
-		cxt->step_c_ctl.open_report_data(0);
-		if (true == cxt->is_polling_run) {
-			if (false == cxt->step_c_ctl.is_report_input_direct) {
-				cxt->is_polling_run = false;
-				del_timer_sync(&cxt->timer);
-				cancel_work_sync(&cxt->report);
-				cxt->drv_data.counter = STEP_C_INVALID_VALUE;
-			}
-		}
-
-	}
-	step_c_real_enable(enable);
-	return 0;
-}
-
-
-static int floor_c_enable_data(int enable)
-{
-	struct step_c_context *cxt = NULL;
-
-	cxt = step_c_context_obj;
-
-	if (enable == 1) {
-		pr_debug("FLOOR_C enable data\n");
-		cxt->is_floor_c_active_data = true;
-		cxt->is_first_floor_c_data_after_enable = true;
-		floor_c_real_enable(1);
-		if (false == cxt->is_polling_run &&
-			cxt->is_step_c_batch_enable == false) {
-			if (false == cxt->step_c_ctl.is_report_input_direct) {
-				mod_timer(&cxt->timer, jiffies +
-					atomic_read(&cxt->delay) / (1000 / HZ));
-				cxt->is_polling_run = true;
-			}
-		}
-	}
-	if (enable == 0) {
-		pr_debug("FLOOR_C disable\n");
-		cxt->is_floor_c_active_data = false;
-		floor_c_real_enable(0);
-		if (true == cxt->is_polling_run) {
-			if (false == cxt->step_c_ctl.is_report_input_direct) {
-				cxt->is_polling_run = false;
-				del_timer_sync(&cxt->timer);
-				cancel_work_sync(&cxt->report);
-				cxt->drv_data.floor_counter =
-					STEP_C_INVALID_VALUE;
-			}
-		}
-
-	}
-	return 0;
-}
-
-
-
-int step_c_enable_nodata(int enable)
-{
-	struct step_c_context *cxt = NULL;
-
-	cxt = step_c_context_obj;
-	if (cxt->step_c_ctl.enable_nodata == NULL) {
-		pr_err("%s:step_c ctl path is NULL\n", __func__);
-		return -1;
-	}
-
-	if (enable == 1)
-		cxt->is_active_nodata = true;
-
-	if (enable == 0)
-		cxt->is_active_nodata = false;
-	step_c_real_enable(enable);
-	return 0;
-}
-
-
-static ssize_t step_cenablenodata_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	int len = 0;
-
-	pr_debug(" not support now\n");
-	return len;
-}
-
-static ssize_t step_cenablenodata_store(struct device *dev,
-	struct device_attribute *attr, const char *buf, size_t count)
-{
-	int err = 0;
-	struct step_c_context *cxt = NULL;
-
-	pr_debug("step_c_store_enable nodata buf=%s\n", buf);
-	mutex_lock(&step_c_context_obj->step_c_op_mutex);
-	cxt = step_c_context_obj;
-	if (cxt->step_c_ctl.enable_nodata == NULL) {
-		pr_debug("step_c_ctl enable nodata NULL\n");
-		mutex_unlock(&step_c_context_obj->step_c_op_mutex);
-		return count;
-	}
-	if (!strncmp(buf, "1", 1))
-		err = step_c_enable_nodata(1);
-	else if (!strncmp(buf, "0", 1))
-		err = step_c_enable_nodata(0);
-	else
-		pr_err(" step_c_store enable nodata cmd error !!\n");
-	mutex_unlock(&step_c_context_obj->step_c_op_mutex);
-	return err;
-}
-
-static ssize_t step_cactive_store(struct device *dev,
-	struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct step_c_context *cxt = NULL;
-	int res = 0;
-	int handle = 0;
-	int en = 0;
-
-	pr_debug("%s buf=%s\n", __func__, buf);
-	mutex_lock(&step_c_context_obj->step_c_op_mutex);
-
-	cxt = step_c_context_obj;
-	if (cxt->step_c_ctl.open_report_data == NULL) {
-		pr_debug("step_c_ctl enable NULL\n");
-		mutex_unlock(&step_c_context_obj->step_c_op_mutex);
-		return count;
-	}
-	res = sscanf(buf, "%d,%d", &handle, &en);
-	if (res != 2)
-		pr_debug("%s param error: res = %d\n", __func__, res);
-	pr_debug("%s handle=%d ,en=%d\n", __func__, handle, en);
-	switch (handle) {
-	case ID_STEP_COUNTER:
-		if (en == 1)
-			res = step_c_enable_data(1);
-		else if (en == 0)
-			res = step_c_enable_data(0);
-		else
-			pr_err("%s error !!\n", __func__);
-		break;
-	case ID_STEP_DETECTOR:
-		if (en == 1)
-			res = step_d_real_enable(1);
-		else if (en == 0)
-			res = step_d_real_enable(0);
-		else
-			pr_err(" step_d_real_enable error !!\n");
-		break;
-	case ID_SIGNIFICANT_MOTION:
-		if (en == 1)
-			res = significant_real_enable(1);
-		else if (en == 0)
-			res = significant_real_enable(0);
-		else
-			pr_err(" significant_real_enable error !!\n");
-		break;
-	case ID_FLOOR_COUNTER:
-		if (en == 1)
-			res = floor_c_enable_data(1);
-		else if (en == 0)
-			res = floor_c_enable_data(0);
-		else
-			pr_err(" fc_real_enable error !!\n");
-		break;
-
-	}
-	mutex_unlock(&step_c_context_obj->step_c_op_mutex);
-	pr_debug("%s done\n", __func__);
-	return res;
-}
-
-/*----------------------------------------------------------------------------*/
-static ssize_t step_cactive_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	struct step_c_context *cxt = NULL;
-	int div;
-
-	cxt = step_c_context_obj;
-	div = cxt->step_c_data.vender_div;
-	pr_debug("step_c vender_div value: %d\n", div);
-	return snprintf(buf, PAGE_SIZE, "%d\n", div);
-}
-
-static ssize_t step_cdelay_store(struct device *dev,
-	struct device_attribute *attr, const char *buf, size_t count)
-{
-	int delay = 0, err = 0;
-	int mdelay = 0;
-	struct step_c_context *cxt = NULL;
-
-	mutex_lock(&step_c_context_obj->step_c_op_mutex);
-	cxt = step_c_context_obj;
-	if (cxt->step_c_ctl.step_c_set_delay == NULL) {
-		pr_debug("step_c_ctl step_c_set_delay NULL\n");
-		mutex_unlock(&step_c_context_obj->step_c_op_mutex);
-		return -1;
-	}
-
-	if (kstrtoint(buf, 10, &delay) != 0) {
-		pr_err("invalid format!!\n");
-		mutex_unlock(&step_c_context_obj->step_c_op_mutex);
-		return -1;
-	}
-
-	if (false == cxt->step_c_ctl.is_report_input_direct) {
-		mdelay = (int)delay / 1000 / 1000;
-		atomic_set(&step_c_context_obj->delay, mdelay);
-	}
-	err = cxt->step_c_ctl.step_c_set_delay(delay);
-	pr_debug(" step_c_delay %d ns\n", delay);
-	mutex_unlock(&step_c_context_obj->step_c_op_mutex);
-	return err;
-
-}
-
-static ssize_t step_cdelay_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	int len = 0;
-
-	pr_debug(" not support now\n");
-	return len;
-}
-
-
-static ssize_t step_cbatch_store(struct device *dev,
-	struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct step_c_context *cxt = NULL;
-	int handle = 0, flag = 0, res = 0;
-	int64_t samplingPeriodNs = 0, maxBatchReportLatencyNs = 0;
-
-	res = sscanf(buf, "%d,%d,%lld,%lld",
-		&handle, &flag, &samplingPeriodNs, &maxBatchReportLatencyNs);
-	if (res != 4)
-		pr_err("%s param error: err =%d\n", __func__, res);
-	pr_debug("handle %d, flag:%d PeriodNs:%lld, LatencyNs: %lld\n",
-		handle, flag, samplingPeriodNs, maxBatchReportLatencyNs);
-	mutex_lock(&step_c_context_obj->step_c_op_mutex);
-	cxt = step_c_context_obj;
-	if (handle == ID_STEP_COUNTER) {
-		if (!cxt->step_c_ctl.is_counter_support_batch)
-			maxBatchReportLatencyNs = 0;
-		if (cxt->step_c_ctl.step_c_batch != NULL)
-			res = cxt->step_c_ctl.step_c_batch(flag,
-				samplingPeriodNs, maxBatchReportLatencyNs);
-		else
-			pr_err("SUPPORT STEP COUNTER COM BATCH\n");
-		if (res < 0)
-			pr_err("step counter enable batch err %d\n",
-				res);
-	} else if (handle == ID_STEP_DETECTOR) {
-		if (!cxt->step_c_ctl.is_detector_support_batch)
-			maxBatchReportLatencyNs = 0;
-		if (cxt->step_c_ctl.step_d_batch != NULL)
-			res = cxt->step_c_ctl.step_d_batch(flag,
-				samplingPeriodNs, maxBatchReportLatencyNs);
-		else
-			pr_err("NOT SUPPORT STEP DETECTOR COM BATCH\n");
-		if (res < 0)
-			pr_err("step detector enable batch err %d\n",
-				res);
-	} else if (handle == ID_SIGNIFICANT_MOTION) {
-		if (!cxt->step_c_ctl.is_smd_support_batch)
-			maxBatchReportLatencyNs = 0;
-
-		if (cxt->step_c_ctl.smd_batch != NULL)
-			res = cxt->step_c_ctl.smd_batch(flag,
-			samplingPeriodNs, maxBatchReportLatencyNs);
-		else
-			pr_err("STEP SMD OLD NOT SUPPORT COM BATCH\n");
-		if (res < 0)
-			pr_err("step smd enable batch err %d\n", res);
-	} else if (handle == ID_FLOOR_COUNTER) {
-		if (!cxt->step_c_ctl.is_floor_c_support_batch)
-			maxBatchReportLatencyNs = 0;
-
-		if (cxt->step_c_ctl.floor_c_batch != NULL)
-			res = cxt->step_c_ctl.floor_c_batch(flag,
-				samplingPeriodNs, maxBatchReportLatencyNs);
-		else
-			pr_err("NOT SUPPORT FLOOR COUNT COM BATCH\n");
-		if (res < 0)
-			pr_err("floor count enable batch err %d\n", res);
-	}
-	mutex_unlock(&step_c_context_obj->step_c_op_mutex);
-	pr_debug("%s done: %d\n", __func__, cxt->is_step_c_batch_enable);
-	return res;
-}
-
-static ssize_t step_cbatch_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t step_cflush_store(struct device *dev,
-	struct device_attribute *attr,
-				  const char *buf, size_t count)
-{
-	struct step_c_context *cxt = NULL;
-	int handle = 0, err = 0;
-
-	err = kstrtoint(buf, 10, &handle);
-	if (err != 0)
-		pr_err("%s param error: err = %d\n", __func__, err);
-
-	pr_debug("%s param: handle %d\n", __func__, handle);
-
-	mutex_lock(&step_c_context_obj->step_c_op_mutex);
-	cxt = step_c_context_obj;
-	if (handle == ID_STEP_COUNTER) {
-		if (cxt->step_c_ctl.step_c_flush != NULL)
-			err = cxt->step_c_ctl.step_c_flush();
-		else
-			pr_err("NOT SUPPORT STEP COUNTER COM FLUSH\n");
-		if (err < 0)
-			pr_err("step counter enable flush err %d\n",
-				err);
-	} else if (handle == ID_STEP_DETECTOR) {
-		if (cxt->step_c_ctl.step_d_flush != NULL)
-			err = cxt->step_c_ctl.step_d_flush();
-		else
-			pr_err("NOT SUPPORT STEP DETECTOR COM FLUSH\n");
-		if (err < 0)
-			pr_err("step detector enable flush err %d\n",
-				err);
-	} else if (handle == ID_SIGNIFICANT_MOTION) {
-		if (cxt->step_c_ctl.smd_flush != NULL)
-			err = cxt->step_c_ctl.smd_flush();
-		else
-			pr_err("NOT SUPPORT SMD COMMON VERSION FLUSH\n");
-		if (err < 0)
-			pr_err("smd enable flush err %d\n", err);
-	} else if (handle == ID_FLOOR_COUNTER) {
-		if (cxt->step_c_ctl.floor_c_flush != NULL)
-			err = cxt->step_c_ctl.floor_c_flush();
-		else
-			pr_err("NOT SUPPORT FLOOR COUNTER COM FLUSH\n");
-		if (err < 0)
-			pr_err("floor counter enable flush err %d\n",
-				err);
-
-	}
-	mutex_unlock(&step_c_context_obj->step_c_op_mutex);
-	return err;
-}
-
-static ssize_t step_cflush_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static ssize_t step_cdevnum_show(struct device *dev,
-	struct device_attribute *attr, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%d\n", 0);
-}
-
-static int step_counter_remove(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static int step_counter_probe(struct platform_device *pdev)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-#ifdef CONFIG_OF
-static const struct of_device_id step_counter_of_match[] = {
-	{.compatible = "mediatek,step_counter",},
-	{},
-};
-#endif
-
-static struct platform_driver step_counter_driver = {
-	.probe = step_counter_probe,
-	.remove = step_counter_remove,
-	.driver = {
-
-		   .name = "step_counter",
-#ifdef CONFIG_OF
-		   .of_match_table = step_counter_of_match,
-#endif
-		}
-};
-
-static int step_c_real_driver_init(void)
-{
-	int i = 0;
-	int err = 0;
-
-	pr_debug("%s start\n", __func__);
-	for (i = 0; i < MAX_CHOOSE_STEP_C_NUM; i++) {
-		pr_debug(" i=%d\n", i);
-		if (step_counter_init_list[i] != 0) {
-			pr_debug(" step_c try to init driver %s\n",
-				   step_counter_init_list[i]->name);
-			err = step_counter_init_list[i]->init();
-			if (err == 0) {
-				pr_debug(" step_c real driver %s probe ok\n",
-					   step_counter_init_list[i]->name);
-				break;
-			}
-		}
-	}
-
-	if (i == MAX_CHOOSE_STEP_C_NUM) {
-		pr_debug("%s fail\n", __func__);
-		err = -1;
-	}
-	return err;
-}
-
-int step_c_driver_add(struct step_c_init_info *obj)
-{
-	int err = 0;
-	int i = 0;
-
-	pr_debug("%s\n", __func__);
-
-	pr_debug("register step_counter driver for the first time\n");
-	if (platform_driver_register(&step_counter_driver))
-		pr_err("fail to register gensor driver already exist\n");
-	for (i = 0; i < MAX_CHOOSE_STEP_C_NUM; i++) {
-		if (step_counter_init_list[i] == NULL) {
-			obj->platform_diver_addr = &step_counter_driver;
-			step_counter_init_list[i] = obj;
-			break;
-		}
-	}
-	if (i >= MAX_CHOOSE_STEP_C_NUM) {
-		pr_err("STEP_C driver add err\n");
-		err = -1;
-	}
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(step_c_driver_add);
-
-static int step_open(struct inode *inode, struct file *file)
-{
-	nonseekable_open(inode, file);
-	return 0;
-}
-
-static ssize_t step_read(struct file *file, char __user *buffer,
-			  size_t count, loff_t *ppos)
-{
-	ssize_t read_cnt = 0;
-
-	read_cnt = sensor_event_read(step_c_context_obj->mdev.minor,
-		file, buffer, count, ppos);
-
-	return read_cnt;
-}
-
-static unsigned int step_poll(struct file *file, poll_table *wait)
-{
-	return sensor_event_poll(step_c_context_obj->mdev.minor, file, wait);
-}
-
-static const struct file_operations step_fops = {
-	.owner = THIS_MODULE,
-	.open = step_open,
-	.read = step_read,
-	.poll = step_poll,
-};
-
-static int step_c_misc_init(struct step_c_context *cxt)
-{
-
-	int err = 0;
-	/* kernel-3.10\include\linux\Miscdevice.h */
-	/* use MISC_DYNAMIC_MINOR exceed 64 */
-	cxt->mdev.minor = ID_STEP_COUNTER;
-	cxt->mdev.name = STEP_C_MISC_DEV_NAME;
-	cxt->mdev.fops = &step_fops;
-	err = sensor_attr_register(&cxt->mdev);
-	if (err)
-		pr_err("unable to register step_c misc device!!\n");
-	return err;
-}
-
-DEVICE_ATTR_RW(step_cenablenodata);
-DEVICE_ATTR_RW(step_cactive);
-DEVICE_ATTR_RW(step_cdelay);
-DEVICE_ATTR_RW(step_cbatch);
-DEVICE_ATTR_RW(step_cflush);
-DEVICE_ATTR_RO(step_cdevnum);
-
-
-static struct attribute *step_c_attributes[] = {
-	&dev_attr_step_cenablenodata.attr,
-	&dev_attr_step_cactive.attr,
-	&dev_attr_step_cdelay.attr,
-	&dev_attr_step_cbatch.attr,
-	&dev_attr_step_cflush.attr,
-	&dev_attr_step_cdevnum.attr,
-	NULL
-};
-
-static struct attribute_group step_c_attribute_group = {
-	.attrs = step_c_attributes
-};
-
-int step_c_register_data_path(struct step_c_data_path *data)
-{
-	struct step_c_context *cxt = NULL;
-
-	cxt = step_c_context_obj;
-	cxt->step_c_data.get_data = data->get_data;
-	cxt->step_c_data.vender_div = data->vender_div;
-	cxt->step_c_data.get_data_significant = data->get_data_significant;
-	cxt->step_c_data.get_data_step_d = data->get_data_step_d;
-	cxt->step_c_data.get_data_floor_c = data->get_data_floor_c;
-	pr_debug("step_c register data path vender_div: %d\n",
-		cxt->step_c_data.vender_div);
-	if (cxt->step_c_data.get_data == NULL
-	    || cxt->step_c_data.get_data_significant == NULL
-	    || cxt->step_c_data.get_data_step_d == NULL) {
-		pr_debug("step_c register data path fail\n");
-		return -1;
-	}
-	return 0;
-}
-EXPORT_SYMBOL_GPL(step_c_register_data_path);
-
-int step_c_register_control_path(struct step_c_control_path *ctl)
-{
-	struct step_c_context *cxt = NULL;
-	int err = 0;
-
-	cxt = step_c_context_obj;
-	cxt->step_c_ctl.step_c_set_delay = ctl->step_c_set_delay;
-	cxt->step_c_ctl.step_d_set_delay = ctl->step_d_set_delay;
-	cxt->step_c_ctl.floor_c_set_delay = ctl->floor_c_set_delay;
-	cxt->step_c_ctl.open_report_data = ctl->open_report_data;
-	cxt->step_c_ctl.enable_nodata = ctl->enable_nodata;
-	cxt->step_c_ctl.step_c_batch = ctl->step_c_batch;
-	cxt->step_c_ctl.step_c_flush = ctl->step_c_flush;
-	cxt->step_c_ctl.step_d_batch = ctl->step_d_batch;
-	cxt->step_c_ctl.step_d_flush = ctl->step_d_flush;
-	cxt->step_c_ctl.smd_batch = ctl->smd_batch;
-	cxt->step_c_ctl.smd_flush = ctl->smd_flush;
-	cxt->step_c_ctl.floor_c_batch = ctl->floor_c_batch;
-	cxt->step_c_ctl.floor_c_flush = ctl->floor_c_flush;
-	cxt->step_c_ctl.is_counter_support_batch =
-		ctl->is_counter_support_batch;
-	cxt->step_c_ctl.is_detector_support_batch =
-		ctl->is_detector_support_batch;
-	cxt->step_c_ctl.is_smd_support_batch = ctl->is_smd_support_batch;
-	cxt->step_c_ctl.is_floor_c_support_batch =
-		ctl->is_floor_c_support_batch;
-	cxt->step_c_ctl.is_report_input_direct = ctl->is_report_input_direct;
-	cxt->step_c_ctl.enable_significant = ctl->enable_significant;
-	cxt->step_c_ctl.enable_step_detect = ctl->enable_step_detect;
-	cxt->step_c_ctl.enable_floor_c = ctl->enable_floor_c;
-
-	if ((cxt->step_c_ctl.step_c_set_delay == NULL)
-		|| (cxt->step_c_ctl.open_report_data == NULL)
-		|| (cxt->step_c_ctl.enable_nodata == NULL)
-		|| (cxt->step_c_ctl.step_d_set_delay == NULL)
-		|| (cxt->step_c_ctl.enable_significant == NULL)
-		|| (cxt->step_c_ctl.enable_step_detect == NULL)) {
-		pr_debug("step_c register control path fail\n");
-		return -1;
-	}
-
-	/* add misc dev for sensor hal control cmd */
-	err = step_c_misc_init(step_c_context_obj);
-	if (err) {
-		pr_err("unable to register step_c misc device!!\n");
-		return -2;
-	}
-	err = sysfs_create_group(&step_c_context_obj->mdev.this_device->kobj,
-				 &step_c_attribute_group);
-	if (err < 0) {
-		pr_err("unable to create step_c attribute file\n");
-		return -3;
-	}
-
-	kobject_uevent(&step_c_context_obj->mdev.this_device->kobj, KOBJ_ADD);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(step_c_register_control_path);
-
-int step_c_data_report_t(uint32_t new_counter, int status, int64_t time_stamp)
-{
-	int err = 0;
-	struct sensor_event event;
-	static uint32_t last_step_counter;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-	event.time_stamp = time_stamp;
-	if (last_step_counter != new_counter) {
-		event.flush_action = DATA_ACTION;
-		event.handle = ID_STEP_COUNTER;
-		event.word[0] = new_counter;
-		err = sensor_input_event(step_c_context_obj->mdev.minor,
-			&event);
-		if (err >= 0)
-			last_step_counter = new_counter;
-	}
-	return err;
-}
-EXPORT_SYMBOL_GPL(step_c_data_report_t);
-
-int step_c_data_report(uint32_t new_counter, int status)
-{
-	return step_c_data_report_t(new_counter, status, 0);
-}
-
-int floor_c_data_report_t(uint32_t new_counter, int status, int64_t time_stamp)
-{
-	int err = 0;
-	struct sensor_event event;
-	static uint32_t last_floor_counter;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-	event.time_stamp = time_stamp;
-	if (last_floor_counter != new_counter) {
-		event.flush_action = DATA_ACTION;
-		event.handle = ID_FLOOR_COUNTER;
-		event.word[0] = new_counter;
-		err = sensor_input_event(step_c_context_obj->mdev.minor,
-			&event);
-		if (err >= 0)
-			last_floor_counter = new_counter;
-	}
-	return err;
-}
-EXPORT_SYMBOL_GPL(floor_c_data_report_t);
-
-int floor_c_data_report(uint32_t new_counter, int status)
-{
-	return floor_c_data_report_t(new_counter, status, 0);
-}
-EXPORT_SYMBOL_GPL(floor_c_data_report);
-
-int step_c_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.handle = ID_STEP_COUNTER;
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(step_c_context_obj->mdev.minor, &event);
-	pr_debug_ratelimited("flush\n");
-	return err;
-}
-EXPORT_SYMBOL_GPL(step_c_flush_report);
-
-int step_d_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.handle = ID_STEP_DETECTOR;
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(step_c_context_obj->mdev.minor, &event);
-	pr_debug_ratelimited("flush\n");
-	return err;
-}
-EXPORT_SYMBOL_GPL(step_d_flush_report);
-
-int smd_flush_report(void)
-{
-	return 0;
-}
-
-int floor_c_flush_report(void)
-{
-	struct sensor_event event;
-	int err = 0;
-
-	memset(&event, 0, sizeof(struct sensor_event));
-
-	event.handle = ID_FLOOR_COUNTER;
-	event.flush_action = FLUSH_ACTION;
-	err = sensor_input_event(step_c_context_obj->mdev.minor, &event);
-	pr_debug_ratelimited("flush\n");
-	return err;
-}
-EXPORT_SYMBOL_GPL(floor_c_flush_report);
-
-int step_c_probe(void)
-{
-
-	int err;
-
-	pr_debug("%s+++!!\n", __func__);
-
-	step_c_context_obj = step_c_context_alloc_object();
-	if (!step_c_context_obj) {
-		err = -ENOMEM;
-		pr_err("unable to allocate devobj!\n");
-		goto exit_alloc_data_failed;
-	}
-
-	/* init real step_c driver */
-	err = step_c_real_driver_init();
-	if (err) {
-		pr_err("step_c real driver init fail\n");
-		goto real_driver_init_fail;
-	}
-
-	pr_debug("%s---- OK !!\n", __func__);
-	return 0;
-real_driver_init_fail:
-	kfree(step_c_context_obj);
-exit_alloc_data_failed:
-	pr_debug("%s---- fail !!!\n", __func__);
-	return err;
-}
-EXPORT_SYMBOL_GPL(step_c_probe);
-
-int step_c_remove(void)
-{
-
-	int err = 0;
-
-	pr_debug("%s\n", __func__);
-	sysfs_remove_group(&step_c_context_obj->mdev.this_device->kobj,
-		&step_c_attribute_group);
-
-	err = sensor_attr_deregister(&step_c_context_obj->mdev);
-	if (err)
-		pr_err("misc_deregister fail: %d\n", err);
-	kfree(step_c_context_obj);
-	platform_driver_unregister(&step_counter_driver);
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(step_c_remove);
-
-static int __init step_c_init(void)
-{
-	pr_debug("%s\n", __func__);
-	return 0;
-}
-
-static void __exit step_c_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(step_c_init);
-module_exit(step_c_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("STEP_CMETER device driver");
-MODULE_AUTHOR("Mediatek");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/step_counter.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/step_counter.h
deleted file mode 100644
index c469fc4..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/step_counter.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef __STEP_C_H__
-#define __STEP_C_H__
-
-
-//#include <linux/pm_wakeup.h>
-#include <linux/interrupt.h>
-#include <linux/platform_device.h>
-#include <linux/workqueue.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-
-#include <linux/irq.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/kobject.h>
-#include <linux/atomic.h>
-#include <linux/ioctl.h>
-
-#include <sensors_io.h>
-#include <hwmsen_helper.h>
-#include <hwmsensor.h>
-#include <linux/poll.h>
-#include "sensor_attr.h"
-#include "sensor_event.h"
-
-#define	OP_STEP_C_DELAY		0X01
-#define	OP_STEP_C_ENABLE		0X02
-#define	OP_STEP_C_GET_DATA	0X04
-
-#define STEP_C_INVALID_VALUE -1
-
-#define EVENT_TYPE_STEP_C_VALUE				ABS_X
-#define EVENT_TYPE_STEP_C_STATUS			ABS_WHEEL
-#define EVENT_TYPE_STEP_DETECTOR_VALUE		REL_Y
-#define EVENT_TYPE_SIGNIFICANT_VALUE		REL_Z
-
-
-
-#define STEP_C_VALUE_MAX (32767)
-#define STEP_C_VALUE_MIN (-32768)
-#define STEP_C_STATUS_MIN (0)
-#define STEP_C_STATUS_MAX (64)
-#define STEP_C_DIV_MAX (32767)
-#define STEP_C_DIV_MIN (1)
-
-
-#define MAX_CHOOSE_STEP_C_NUM 5
-
-struct step_c_control_path {
-	int (*open_report_data)(int open);/* open data rerport to HAL */
-	int (*enable_nodata)(int en);/* only enable not report event to HAL */
-	int (*enable_step_detect)(int en);
-	int (*enable_significant)(int en);
-	int (*enable_floor_c)(int en);
-	int (*step_c_set_delay)(u64 delay);
-	int (*step_d_set_delay)(u64 delay);
-	int (*floor_c_set_delay)(u64 delay);
-	int (*step_c_batch)(int flag,
-		int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs);
-	int (*step_c_flush)(void);/* open data rerport to HAL */
-	int (*step_d_batch)(int flag,
-		int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs);
-	int (*step_d_flush)(void);/* open data rerport to HAL */
-	int (*smd_batch)(int flag,
-		int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs);
-	int (*smd_flush)(void);/* open data rerport to HAL */
-	int (*floor_c_batch)(int flag,
-		int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs);
-	int (*floor_c_flush)(void);/* open data rerport to HAL */
-	bool is_report_input_direct;
-	bool is_counter_support_batch;/* version2. batch M support flag */
-	bool is_detector_support_batch;/* version2. batch M support flag */
-	bool is_smd_support_batch;/* version2. batch M support flag */
-	bool is_floor_c_support_batch;/* version2. batch M support flag */
-};
-
-struct step_c_data_path {
-	int (*get_data)(uint32_t *value, int *status);
-	int (*get_data_step_d)(uint32_t *value, int *status);
-	int (*get_data_significant)(uint32_t *value, int *status);
-	int (*get_data_floor_c)(uint32_t *value, int *status);
-	int vender_div;
-};
-
-struct step_c_init_info {
-	char *name;
-	int (*init)(void);
-	int (*uninit)(void);
-	struct platform_driver *platform_diver_addr;
-};
-
-struct step_c_data {
-	uint32_t counter;
-	int status;
-	int data_updata;
-	uint32_t floor_counter;
-	int floor_c_status;
-	int floor_c_data_updata;
-};
-
-struct step_c_drv_obj {
-	void *self;
-	int polling;
-	int (*step_c_operate)(void *self, uint32_t command, void *buff_in,
-		int size_in, void *buff_out, int size_out, int *actualout);
-};
-
-struct step_c_context {
-	struct input_dev   *idev;
-	struct sensor_attr_t   mdev;
-	struct work_struct  report;
-	struct mutex step_c_op_mutex;
-	atomic_t delay; /*polling period for reporting input event*/
-	atomic_t wake;  /*user-space request to wake-up, used with stop*/
-	struct timer_list   timer;  /* polling timer */
-	atomic_t            trace;
-
-	atomic_t                early_suspend;
-
-	struct step_c_data       drv_data;
-	struct step_c_control_path   step_c_ctl;
-	struct step_c_data_path   step_c_data;
-	bool is_active_nodata;
-	bool is_active_data;		/* Active and HAL need */
-	bool is_floor_c_active_data;	/* Active and HAL need */
-	bool is_first_data_after_enable;
-	bool is_first_floor_c_data_after_enable;
-	bool is_polling_run;
-	bool is_step_c_batch_enable;	/* v2. judge whether sensor in batch M*/
-	bool is_step_d_batch_enable;	/* v2. judge whether sensor in batch M*/
-	bool is_floor_c_batch_enable;   /* v2. judge whether sensor in batch M*/
-};
-
-/* for auto detect */
-enum STEP_NOTIFY_TYPE {
-	TYPE_STEP_NON   = 0,
-	TYPE_STEP_DETECTOR  = 1,
-	TYPE_SIGNIFICANT = 2
-};
-
-extern int  step_notify_t(enum STEP_NOTIFY_TYPE type, int64_t time_stamp);
-extern int  step_notify(enum STEP_NOTIFY_TYPE type);
-
-extern int step_c_driver_add(struct step_c_init_info *obj);
-extern int step_c_data_report_t(uint32_t new_counter, int status,
-	int64_t time_stamp);
-extern int step_c_data_report(uint32_t new_counter, int status);
-extern int step_c_flush_report(void);
-extern int step_d_flush_report(void);
-extern int smd_flush_report(void);
-extern int floor_c_data_report_t(uint32_t new_counter,
-	int status, int64_t time_stamp);
-int floor_c_data_report(uint32_t new_counter, int status);
-extern int floor_c_flush_report(void);
-extern int step_c_register_control_path(struct step_c_control_path *ctl);
-extern int step_c_register_data_path(struct step_c_data_path *data);
-extern int step_c_probe(void);
-extern int step_c_remove(void);
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/Kconfig b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/Kconfig
deleted file mode 100644
index f27706e..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/Kconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-
-config MTK_STEPSIGNHUB
-	bool "STEPSIGNHUB for MediaTek package"
-	help
-	  A significant motions is a device,
-	  usually portable
-	  and electronic or electromechanical,
-	  that detect each step a person takes
-	  by detecting the motion of the person's hands or hips.
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/Makefile b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/Makefile
deleted file mode 100644
index 2d26116..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/step_counter
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/sensorHub/inc_v1
-ccflags-y += -I$(srctree)/drivers/misc/mediatek/scp
-obj-$(CONFIG_MTK_SENSOR_SUPPORT) +=  stepsignhub.o
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/stepsignhub.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/stepsignhub.c
deleted file mode 100644
index bb039c7..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/stepsignhub.c
+++ /dev/null
@@ -1,436 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#define pr_fmt(fmt) "[stepsignhub] " fmt
-
-#include <hwmsensor.h>
-#include "stepsignhub.h"
-#include <step_counter.h>
-#include <SCP_sensorHub.h>
-#include <linux/notifier.h>
-#include "include/scp.h"
-
-enum STEP_CDS_TRC {
-	STEP_CDSH_TRC_INFO = 0X10,
-};
-
-static struct step_c_init_info step_cdshub_init_info;
-
-struct step_chub_ipi_data {
-	atomic_t trace;
-	atomic_t suspend;
-};
-
-static struct step_chub_ipi_data obj_ipi_data;
-
-static ssize_t trace_store(struct device_driver *ddri,
-	const char *buf, size_t count)
-{
-	struct step_chub_ipi_data *obj = &obj_ipi_data;
-	int trace = 0;
-
-	if (obj == NULL) {
-		pr_err("obj is null!!\n");
-		return 0;
-	}
-
-	if (sscanf(buf, "0x%x", &trace) == 1) {
-		atomic_set(&obj->trace, trace);
-	} else {
-		pr_err("invalid content: '%s', length = %zu\n",
-			buf, count);
-		return 0;
-	}
-	return count;
-}
-
-static DRIVER_ATTR_WO(trace);
-
-static struct driver_attribute *step_chub_attr_list[] = {
-	&driver_attr_trace,
-};
-
-static int step_chub_create_attr(struct device_driver *driver)
-{
-	int idx, err = 0;
-	int num = (int)(ARRAY_SIZE(step_chub_attr_list));
-
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++) {
-		err = driver_create_file(driver, step_chub_attr_list[idx]);
-		if (err != 0) {
-			pr_err("driver_create_file (%s) = %d\n",
-				     step_chub_attr_list[idx]->attr.name, err);
-			break;
-		}
-	}
-	return err;
-}
-
-static int step_chub_delete_attr(struct device_driver *driver)
-{
-	int idx, err = 0;
-	int num = (int)(ARRAY_SIZE(step_chub_attr_list));
-
-	if (driver == NULL)
-		return -EINVAL;
-
-	for (idx = 0; idx < num; idx++)
-		driver_remove_file(driver, step_chub_attr_list[idx]);
-
-	return err;
-}
-
-static int step_c_enable_nodata(int en)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (en == 1)
-		ret = sensor_set_delay_to_hub(ID_STEP_COUNTER, 120);
-#endif
-	ret = sensor_enable_to_hub(ID_STEP_COUNTER, en);
-	return ret;
-}
-
-static int step_d_enable_nodata(int en)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (en == 1)
-		ret = sensor_set_delay_to_hub(ID_STEP_DETECTOR, 120);
-#endif
-	ret = sensor_enable_to_hub(ID_STEP_DETECTOR, en);
-	return ret;
-}
-
-static int step_s_enable_nodata(int en)
-{
-	int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	if (en == 1)
-		ret = sensor_set_delay_to_hub(ID_SIGNIFICANT_MOTION, 120);
-#endif
-	ret = sensor_enable_to_hub(ID_SIGNIFICANT_MOTION, en);
-	return ret;
-}
-
-static int floor_c_enable_nodata(int en)
-{
-	int ret = 0;
-
-	ret = sensor_enable_to_hub(ID_FLOOR_COUNTER, en);
-	return ret;
-}
-
-static int step_c_set_delay(u64 delay)
-{
-	unsigned int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	unsigned int delayms = 0;
-
-	delayms = delay / 1000 / 1000;
-	ret = sensor_set_delay_to_hub(ID_STEP_COUNTER, delayms);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	return ret;
-}
-
-static int step_c_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_STEP_COUNTER,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int step_c_flush(void)
-{
-	return sensor_flush_to_hub(ID_STEP_COUNTER);
-}
-
-static int step_d_set_delay(u64 delay)
-{
-	unsigned int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	unsigned int delayms = 0;
-
-	delayms = delay / 1000 / 1000;
-	ret = sensor_set_delay_to_hub(ID_STEP_DETECTOR, delayms);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	return ret;
-}
-
-static int step_d_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_STEP_DETECTOR,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int step_d_flush(void)
-{
-	return sensor_flush_to_hub(ID_STEP_DETECTOR);
-}
-
-static int floor_c_set_delay(u64 delay)
-{
-	unsigned int ret = 0;
-
-#if defined CONFIG_MTK_SCP_SENSORHUB_V1
-	unsigned int delayms = 0;
-
-	delayms = delay / 1000 / 1000;
-	ret = sensor_set_delay_to_hub(ID_FLOOR_COUNTER, delayms);
-#elif defined CONFIG_NANOHUB
-
-#else
-
-#endif
-	return ret;
-}
-static int floor_c_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_FLOOR_COUNTER,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int floor_c_flush(void)
-{
-	return sensor_flush_to_hub(ID_FLOOR_COUNTER);
-}
-
-static int step_counter_get_data(uint32_t *counter, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_STEP_COUNTER, &data);
-	if (err < 0) {
-		pr_err("sensor_get_data_from_hub fail!!\n");
-		return -1;
-	}
-	time_stamp = data.time_stamp;
-	*counter = data.step_counter_t.accumulated_step_count;
-	return 0;
-}
-
-static int step_detector_get_data(uint32_t *counter, int *status)
-{
-	return 0;
-}
-
-static int smd_batch(int flag,
-	int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
-{
-	return sensor_batch_to_hub(ID_SIGNIFICANT_MOTION,
-		flag, samplingPeriodNs, maxBatchReportLatencyNs);
-}
-
-static int smd_flush(void)
-{
-	return sensor_flush_to_hub(ID_SIGNIFICANT_MOTION);
-}
-
-static int significant_get_data(uint32_t *counter, int *status)
-{
-	return 0;
-}
-
-static int floor_counter_get_data(uint32_t *counter, int *status)
-{
-	int err = 0;
-	struct data_unit_t data;
-	uint64_t time_stamp = 0;
-
-	err = sensor_get_data_from_hub(ID_FLOOR_COUNTER, &data);
-	if (err < 0) {
-		pr_err("%s fail!!\n", __func__);
-		return -1;
-	}
-	time_stamp = data.time_stamp;
-	*counter = data.floor_counter_t.accumulated_floor_count;
-	return 0;
-}
-
-static int step_cds_open_report_data(int open)
-{
-	return 0;
-}
-
-static int step_detect_recv_data(struct data_unit_t *event,
-				void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = step_d_flush_report();
-	else if (event->flush_action == DATA_ACTION)
-		err = step_notify_t(TYPE_STEP_DETECTOR,
-			(int64_t)event->time_stamp);
-	return err;
-}
-
-static int step_count_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = step_c_flush_report();
-	else if (event->flush_action == DATA_ACTION)
-		err = step_c_data_report_t(
-			event->step_counter_t.accumulated_step_count,
-			2, (int64_t)event->time_stamp);
-	return err;
-}
-
-static int sign_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-
-	if (event->flush_action == FLUSH_ACTION)
-		pr_err("sign do not support flush\n");
-	else if (event->flush_action == DATA_ACTION)
-		err = step_notify_t(TYPE_SIGNIFICANT,
-			(int64_t)event->time_stamp);
-	return err;
-}
-
-static int floor_count_recv_data(struct data_unit_t *event, void *reserved)
-{
-	int err = 0;
-	struct floor_counter_event_t *pfloor_counter = &event->floor_counter_t;
-
-	if (event->flush_action == FLUSH_ACTION)
-		err = floor_c_flush_report();
-	else if (event->flush_action == DATA_ACTION)
-		err = floor_c_data_report_t(
-			pfloor_counter->accumulated_floor_count, 2,
-			(int64_t)event->time_stamp);
-	return err;
-}
-
-static int step_chub_local_init(void)
-{
-	struct step_c_control_path ctl = { 0 };
-	struct step_c_data_path data = { 0 };
-	int err = 0;
-	struct platform_driver *paddr =
-		step_cdshub_init_info.platform_diver_addr;
-
-	err = step_chub_create_attr(&paddr->driver);
-	if (err) {
-		pr_err("create attribute err = %d\n", err);
-		goto exit_create_attr_failed;
-	}
-	ctl.open_report_data = step_cds_open_report_data;
-	ctl.enable_nodata = step_c_enable_nodata;
-	ctl.enable_step_detect = step_d_enable_nodata;
-	ctl.enable_significant = step_s_enable_nodata;
-	ctl.enable_floor_c = floor_c_enable_nodata;
-	ctl.step_c_set_delay = step_c_set_delay;
-	ctl.step_d_set_delay = step_d_set_delay;
-	ctl.floor_c_set_delay = floor_c_set_delay;
-	ctl.step_c_batch = step_c_batch;
-	ctl.step_c_flush = step_c_flush;
-	ctl.step_d_batch = step_d_batch;
-	ctl.step_d_flush = step_d_flush;
-	ctl.floor_c_batch = floor_c_batch;
-	ctl.floor_c_flush = floor_c_flush;
-	ctl.smd_batch = smd_batch;
-	ctl.smd_flush = smd_flush;
-	ctl.is_report_input_direct = true;
-	ctl.is_counter_support_batch = false;
-	ctl.is_detector_support_batch = true;
-	ctl.is_smd_support_batch = false;
-	err = step_c_register_control_path(&ctl);
-	if (err) {
-		pr_err("register step_cds control path err\n");
-		goto exit;
-	}
-
-	data.get_data = step_counter_get_data;
-	data.get_data_step_d = step_detector_get_data;
-	data.get_data_significant = significant_get_data;
-	data.get_data_floor_c = floor_counter_get_data;
-	err = step_c_register_data_path(&data);
-	if (err) {
-		pr_err("register step_cds data path err\n");
-		goto exit;
-	}
-	err = scp_sensorHub_data_registration(ID_STEP_DETECTOR,
-		step_detect_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	err =
-	    scp_sensorHub_data_registration(ID_SIGNIFICANT_MOTION,
-					   sign_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	err = scp_sensorHub_data_registration(ID_STEP_COUNTER,
-		step_count_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	err = scp_sensorHub_data_registration(ID_FLOOR_COUNTER,
-		floor_count_recv_data);
-	if (err) {
-		pr_err("SCP_sensorHub_data_registration fail!!\n");
-		goto exit_create_attr_failed;
-	}
-	return 0;
-exit:
-	step_chub_delete_attr(&paddr->driver);
-exit_create_attr_failed:
-	return -1;
-}
-
-static int step_chub_local_uninit(void)
-{
-	return 0;
-}
-
-static struct step_c_init_info step_cdshub_init_info = {
-	.name = "step_cds_hub",
-	.init = step_chub_local_init,
-	.uninit = step_chub_local_uninit,
-};
-
-static int __init step_chub_init(void)
-{
-	step_c_driver_add(&step_cdshub_init_info);
-	return 0;
-}
-
-static void __exit step_chub_exit(void)
-{
-	pr_debug("%s\n", __func__);
-}
-
-module_init(step_chub_init);
-module_exit(step_chub_exit);
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("GLANCE_GESTURE_HUB driver");
-MODULE_AUTHOR("hongxu.zhao@mediatek.com");
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/stepsignhub.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/stepsignhub.h
deleted file mode 100644
index 1bf97dd..0000000
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/sensors-1.0/step_counter/stepsignhub/stepsignhub.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (c) 2019 MediaTek Inc.
- */
-
-#ifndef STEPSIGNHUB_H
-#define STEPSIGNHUB_H
-
-#include <linux/ioctl.h>
-
-#endif
diff --git a/src/kernel/linux/v4.19/drivers/spi/spidev.c b/src/kernel/linux/v4.19/drivers/spi/spidev.c
index bf189d1..fa34a32 100644
--- a/src/kernel/linux/v4.19/drivers/spi/spidev.c
+++ b/src/kernel/linux/v4.19/drivers/spi/spidev.c
@@ -724,7 +724,7 @@
 	struct spidev_data	*spidev;
 	int			status;
 	unsigned long		minor;
-printk("GLENN\n");
+
 	/*
 	 * spidev should never be referenced in DT without a specific
 	 * compatible string, it is a Linux implementation thing
diff --git a/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3.h b/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3.h
index 9606963..0b06a61 100644
--- a/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3.h
+++ b/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3.h
@@ -309,6 +309,8 @@
 	bool clk_mgr;
 	PLATFORM_TYPE plat_type;
 	PHY_WORKAROUND_MODE fpga_phy_workaround;
+	struct mutex mutex;
+	bool power_status;
 };
 
 /**
diff --git a/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_core1.c b/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_core1.c
deleted file mode 100755
index 0f2cb9b..0000000
--- a/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_core1.c
+++ /dev/null
@@ -1,1142 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * mtu3_core.c - hardware access layer and gadget init/exit of
- *                     MediaTek usb3 Dual-Role Controller Driver
- *
- * Copyright (C) 2016 MediaTek Inc.
- *
- * Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/of_address.h>
-#include <linux/of_irq.h>
-#include <linux/platform_device.h>
-#include <linux/of_gpio.h>
-#include <linux/gpio.h>
-
-#include "mtu3.h"
-#include "mtu3_debug.h"
-#include "mtu3_trace.h"
-
-#ifndef CONFIG_MTU3_MD_USB_EP0_CTRL
-static int total_isr_debug = 1;
-module_param(total_isr_debug, uint, 0644);
-MODULE_PARM_DESC (total_isr_debug, "profile total USB isr");
-extern unsigned long total_isr;
-
-static int ep_fifo_alloc(struct mtu3_ep *mep, u32 seg_size)
-{
-	struct mtu3_fifo_info *fifo = mep->fifo;
-	u32 num_bits = DIV_ROUND_UP(seg_size, MTU3_EP_FIFO_UNIT);
-	u32 start_bit;
-
-	/* ensure that @mep->fifo_seg_size is power of two */
-	num_bits = roundup_pow_of_two(num_bits);
-	if (num_bits > fifo->limit)
-		return -EINVAL;
-
-	mep->fifo_seg_size = num_bits * MTU3_EP_FIFO_UNIT;
-	num_bits = num_bits * (mep->slot + 1);
-	start_bit = bitmap_find_next_zero_area(fifo->bitmap,
-			fifo->limit, 0, num_bits, 0);
-	if (start_bit >= fifo->limit)
-		return -EOVERFLOW;
-
-	bitmap_set(fifo->bitmap, start_bit, num_bits);
-	mep->fifo_size = num_bits * MTU3_EP_FIFO_UNIT;
-	mep->fifo_addr = fifo->base + MTU3_EP_FIFO_UNIT * start_bit;
-
-	dev_dbg(mep->mtu->dev, "%s fifo:%#x/%#x, start_bit: %d\n",
-		__func__, mep->fifo_seg_size, mep->fifo_size, start_bit);
-
-	return mep->fifo_addr;
-}
-#endif
-
-static void ep_fifo_free(struct mtu3_ep *mep)
-{
-	struct mtu3_fifo_info *fifo = mep->fifo;
-	u32 addr = mep->fifo_addr;
-	u32 bits = mep->fifo_size / MTU3_EP_FIFO_UNIT;
-	u32 start_bit;
-
-	if (unlikely(addr < fifo->base || bits > fifo->limit))
-		return;
-
-	start_bit = (addr - fifo->base) / MTU3_EP_FIFO_UNIT;
-	bitmap_clear(fifo->bitmap, start_bit, bits);
-	mep->fifo_size = 0;
-	mep->fifo_seg_size = 0;
-
-	dev_dbg(mep->mtu->dev, "%s size:%#x/%#x, start_bit: %d\n",
-		__func__, mep->fifo_seg_size, mep->fifo_size, start_bit);
-}
-
-/* enable/disable U3D SS function */
-static inline void mtu3_ss_func_set(struct mtu3 *mtu, bool enable)
-{
-	/* If usb3_en==0, LTSSM will go to SS.Disable state */
-	if (enable) {
-		/*
-			Temp Fix:
-			A60931 new DTB has true type-C connector.
-			Phy sends vbus_present and starts to swap lane.
-			It will take about 120ms to swap lane if needed.
-			Device shall wait lane swap and then enable U3 terminator.
-		*/
-		if (mtu->ssusb->plat_type == PLAT_FPGA && mtu->ssusb->fpga_phy_workaround == A60931_WORKAROUND){
-			mdelay(180);
-		}
-		mtu3_setbits(mtu->mac_base, U3D_USB3_CONFIG, USB3_EN);
-	}
-	else
-		mtu3_clrbits(mtu->mac_base, U3D_USB3_CONFIG, USB3_EN);
-
-	dev_info(mtu->dev, "USB3_EN = %d\n", !!enable);
-}
-
-/* set/clear U3D HS device soft connect */
-static inline void mtu3_hs_softconn_set(struct mtu3 *mtu, bool enable)
-{
-	if (enable) {
-		mtu3_setbits(mtu->mac_base, U3D_POWER_MANAGEMENT,
-			SOFT_CONN | SUSPENDM_ENABLE);
-	} else {
-		mtu3_clrbits(mtu->mac_base, U3D_POWER_MANAGEMENT,
-			SOFT_CONN | SUSPENDM_ENABLE);
-	}
-	dev_info(mtu->dev, "SOFTCONN = %d\n", !!enable);
-}
-
-/* only port0 of U2/U3 supports device mode */
-static int mtu3_device_enable(struct mtu3 *mtu)
-{
-	void __iomem *ibase = mtu->ippc_base;
-	u32 check_clk = 0;
-
-	mtu3_clrbits(ibase, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
-
-	if (mtu->is_u3_ip) {
-		check_clk = SSUSB_U3_MAC_RST_B_STS;
-		mtu3_clrbits(ibase, SSUSB_U3_CTRL(0),
-			(SSUSB_U3_PORT_DIS | SSUSB_U3_PORT_PDN |
-			SSUSB_U3_PORT_HOST_SEL));
-	}
-	mtu3_clrbits(ibase, SSUSB_U2_CTRL(0),
-		(SSUSB_U2_PORT_DIS | SSUSB_U2_PORT_PDN |
-		SSUSB_U2_PORT_HOST_SEL));
-
-	if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG) {
-		mtu3_setbits(ibase, SSUSB_U2_CTRL(0), SSUSB_U2_PORT_OTG_SEL);
-		if (mtu->is_u3_ip)
-			mtu3_setbits(ibase, SSUSB_U3_CTRL(0),
-				     SSUSB_U3_PORT_DUAL_MODE);
-	}
-
-	return ssusb_check_clocks(mtu->ssusb, check_clk);
-}
-
-static void mtu3_device_disable(struct mtu3 *mtu)
-{
-	void __iomem *ibase = mtu->ippc_base;
-
-	if (mtu->is_u3_ip)
-		mtu3_setbits(ibase, SSUSB_U3_CTRL(0),
-			(SSUSB_U3_PORT_DIS | SSUSB_U3_PORT_PDN));
-
-	mtu3_setbits(ibase, SSUSB_U2_CTRL(0),
-		SSUSB_U2_PORT_DIS | SSUSB_U2_PORT_PDN);
-
-	if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG)
-		mtu3_clrbits(ibase, SSUSB_U2_CTRL(0), SSUSB_U2_PORT_OTG_SEL);
-
-	mtu3_setbits(ibase, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
-}
-
-/* reset U3D's device module. */
-static void mtu3_device_reset(struct mtu3 *mtu)
-{
-	void __iomem *ibase = mtu->ippc_base;
-
-	mtu3_setbits(ibase, U3D_SSUSB_DEV_RST_CTRL, SSUSB_DEV_SW_RST);
-	udelay(1);
-	mtu3_clrbits(ibase, U3D_SSUSB_DEV_RST_CTRL, SSUSB_DEV_SW_RST);
-}
-
-/* disable all interrupts */
-static void mtu3_intr_disable(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-
-	/* Disable level 1 interrupts */
-	mtu3_writel(mbase, U3D_LV1IECR, ~0x0);
-	/* Disable endpoint interrupts */
-	mtu3_writel(mbase, U3D_EPIECR, ~0x0);
-}
-
-static void mtu3_intr_status_clear(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-
-	/* Clear EP0 and Tx/Rx EPn interrupts status */
-	mtu3_writel(mbase, U3D_EPISR, ~0x0);
-	/* Clear U2 USB common interrupts status */
-	mtu3_writel(mbase, U3D_COMMON_USB_INTR, ~0x0);
-	/* Clear U3 LTSSM interrupts status */
-	mtu3_writel(mbase, U3D_LTSSM_INTR, ~0x0);
-	/* Clear speed change interrupt status */
-	mtu3_writel(mbase, U3D_DEV_LINK_INTR, ~0x0);
-}
-
-/* enable system global interrupt */
-#ifndef CONFIG_MTU3_MD_USB_EP0_CTRL
-static void mtu3_intr_enable(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-	u32 value;
-
-	/*Enable level 1 interrupts (BMU, QMU, MAC3, DMA, MAC2, EPCTL) */
-	value = BMU_INTR | QMU_INTR | MAC3_INTR | MAC2_INTR | EP_CTRL_INTR;
-	mtu3_writel(mbase, U3D_LV1IESR, value);
-
-	/* Enable U2 common USB interrupts */
-	value = SUSPEND_INTR | RESUME_INTR | RESET_INTR | LPM_RESUME_INTR;
-	mtu3_writel(mbase, U3D_COMMON_USB_INTR_ENABLE, value);
-
-	if (mtu->is_u3_ip) {
-		/* Enable U3 LTSSM interrupts */
-		value = HOT_RST_INTR | WARM_RST_INTR |
-			ENTER_U3_INTR | EXIT_U3_INTR;
-		mtu3_writel(mbase, U3D_LTSSM_INTR_ENABLE, value);
-	}
-
-	/* Enable QMU interrupts. */
-	value = TXQ_CSERR_INT | TXQ_LENERR_INT | RXQ_CSERR_INT |
-			RXQ_LENERR_INT | RXQ_ZLPERR_INT;
-	mtu3_writel(mbase, U3D_QIESR1, value);
-
-	/* Enable speed change interrupt */
-	mtu3_writel(mbase, U3D_DEV_LINK_INTR_ENABLE, SSUSB_DEV_SPEED_CHG_INTR);
-}
-#else
-static void mtu3_intr_enable(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-	u32 value;
-
-	/*Enable level 1 interrupts (BMU, QMU, MAC3, DMA, MAC2, EPCTL) */
-	value = QMU_INTR;
-	mtu3_writel(mbase, U3D_LV1IESR, value);
-
-	/* Enable QMU interrupts. */
-	value = TXQ_CSERR_INT | TXQ_LENERR_INT | RXQ_CSERR_INT |
-			RXQ_LENERR_INT | RXQ_ZLPERR_INT;
-	mtu3_writel(mbase, U3D_QIESR1, value);
-}
-
-#endif
-
-/* reset: u2 - data toggle, u3 - SeqN, flow control status etc */
-static void mtu3_ep_reset(struct mtu3_ep *mep)
-{
-	struct mtu3 *mtu = mep->mtu;
-	u32 rst_bit = EP_RST(mep->is_in, mep->epnum);
-
-	mtu3_setbits(mtu->mac_base, U3D_EP_RST, rst_bit);
-	mtu3_clrbits(mtu->mac_base, U3D_EP_RST, rst_bit);
-}
-
-/* set/clear the stall and toggle bits for non-ep0 */
-void mtu3_ep_stall_set(struct mtu3_ep *mep, bool set)
-{
-	struct mtu3 *mtu = mep->mtu;
-	void __iomem *mbase = mtu->mac_base;
-	u8 epnum = mep->epnum;
-	u32 csr;
-
-	if (mep->is_in) {	/* TX */
-		csr = mtu3_readl(mbase, MU3D_EP_TXCR0(epnum)) & TX_W1C_BITS;
-		if (set)
-			csr |= TX_SENDSTALL;
-		else
-			csr = (csr & (~TX_SENDSTALL)) | TX_SENTSTALL;
-		mtu3_writel(mbase, MU3D_EP_TXCR0(epnum), csr);
-	} else {	/* RX */
-		csr = mtu3_readl(mbase, MU3D_EP_RXCR0(epnum)) & RX_W1C_BITS;
-		if (set)
-			csr |= RX_SENDSTALL;
-		else
-			csr = (csr & (~RX_SENDSTALL)) | RX_SENTSTALL;
-		mtu3_writel(mbase, MU3D_EP_RXCR0(epnum), csr);
-	}
-
-	if (!set) {
-		mtu3_ep_reset(mep);
-		mep->flags &= ~MTU3_EP_STALL;
-	} else {
-		mep->flags |= MTU3_EP_STALL;
-	}
-
-	dev_dbg(mtu->dev, "%s: %s\n", mep->name,
-		set ? "SEND STALL" : "CLEAR STALL, with EP RESET");
-}
-
-void mtu3_dev_on_off(struct mtu3 *mtu, int is_on)
-{
-#ifndef CONFIG_MTU3_MD_USB_EP0_CTRL
-	if (mtu->is_u3_ip && mtu->max_speed >= USB_SPEED_SUPER)
-		mtu3_ss_func_set(mtu, is_on);
-	else
-		mtu3_hs_softconn_set(mtu, is_on);
-#endif
-
-	dev_info(mtu->dev, "gadget (%s) pullup D%s\n",
-		usb_speed_string(mtu->max_speed), is_on ? "+" : "-");
-}
-
-static void mtu3_set_speed(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-
-	if (!mtu->is_u3_ip && (mtu->max_speed > USB_SPEED_HIGH))
-		mtu->max_speed = USB_SPEED_HIGH;
-
-	if (mtu->max_speed == USB_SPEED_FULL) {
-		/* disable U3 SS function */
-		mtu3_clrbits(mbase, U3D_USB3_CONFIG, USB3_EN);
-		/* disable HS function */
-		mtu3_clrbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
-	} else if (mtu->max_speed == USB_SPEED_HIGH) {
-		mtu3_clrbits(mbase, U3D_USB3_CONFIG, USB3_EN);
-		/* HS/FS detected by HW */
-		mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
-	} else if (mtu->max_speed == USB_SPEED_SUPER) {
-		mtu3_clrbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
-			     SSUSB_U3_PORT_SSP_SPEED);
-	}
-
-	dev_info(mtu->dev, "max_speed: %s\n",
-		usb_speed_string(mtu->max_speed));
-}
-
-static void mtu3_regs_init(struct mtu3 *mtu)
-{
-
-	void __iomem *mbase = mtu->mac_base;
-	dev_info(mtu->dev, "%s\n", __func__);
-
-	/* be sure interrupts are disabled before registration of ISR */
-	mtu3_intr_disable(mtu);
-	mtu3_intr_status_clear(mtu);
-
-	if (mtu->is_u3_ip) {
-		/* disable LGO_U1/U2 by default */
-		mtu3_clrbits(mbase, U3D_LINK_POWER_CONTROL,
-				SW_U1_REQUEST_ENABLE | SW_U2_REQUEST_ENABLE);
-		/* enable accept LGO_U1/U2 link command from host */
-		mtu3_setbits(mbase, U3D_LINK_POWER_CONTROL,
-				SW_U1_ACCEPT_ENABLE | SW_U2_ACCEPT_ENABLE);
-		/* device responses to u3_exit from host automatically */
-		mtu3_clrbits(mbase, U3D_LTSSM_CTRL, SOFT_U3_EXIT_EN);
-		/* automatically build U2 link when U3 detect fail */
-		mtu3_setbits(mbase, U3D_USB2_TEST_MODE, U2U3_AUTO_SWITCH);
-		/* auto clear SOFT_CONN when clear USB3_EN if work as HS */
-		mtu3_setbits(mbase, U3D_U3U2_SWITCH_CTRL, SOFTCON_CLR_AUTO_EN);
-	}
-
-	mtu3_set_speed(mtu);
-
-	/* delay about 0.1us from detecting reset to send chirp-K */
-	mtu3_clrbits(mbase, U3D_LINK_RESET_INFO, WTCHRP_MSK);
-	/* U2/U3 detected by HW */
-	mtu3_writel(mbase, U3D_DEVICE_CONF, 0);
-	/* vbus detected by HW */
-	mtu3_clrbits(mbase, U3D_MISC_CTRL, VBUS_FRC_EN | VBUS_ON);
-	/* enable automatical HWRW from L1 */
-	mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, LPM_HRWE);
-
-	//ssusb_set_force_vbus(mtu->ssusb, true);
-	mtu3_writel(mbase, U3D_POWER_MANAGEMENT, (mtu3_readl(mbase, U3D_POWER_MANAGEMENT)| LPM_MODE(1)));
-	dev_info(mtu->dev, "%s, U3D_POWER_MANAGEMENT:0x%x\n", __func__, mtu3_readl(mbase, U3D_POWER_MANAGEMENT));
-	/* use new QMU format when HW version >= 0x1003 */
-	if (mtu->gen2cp)
-		mtu3_writel(mbase, U3D_QFCR, ~0x0);
-}
-
-static irqreturn_t mtu3_vbus_detect_eint_isr(int irq, void *data)
-{
-	struct mtu3 *mtu = data;
-
-	disable_irq_nosync(irq);
-
-	if (!gpio_get_value(mtu->detect_gpio)) {
-		dev_info(mtu->dev, "low-level, vbus plug out\n");
-		ssusb_set_force_vbus(mtu->ssusb, false);
-		irq_set_irq_type(irq, IRQF_TRIGGER_HIGH);
-	} else {
-		dev_info(mtu->dev, "high-level, vbus plug in\n");
-		ssusb_set_force_vbus(mtu->ssusb, true);
-		irq_set_irq_type(irq, IRQF_TRIGGER_LOW);
-	}
-	enable_irq(irq);
-	return IRQ_HANDLED;
-}
-
-static int mtu3_usb_vbus_detect_init(struct mtu3 *mtu)
-{
-	struct device_node *node;
-	int ret;
-
-	node = of_find_compatible_node(NULL, NULL,
-					"mediatek,mtu3");
-	if (!node) {
-		dev_err(mtu->dev, "map node failed\n");
-		return -ENODEV;
-	}
-
-	ret = of_get_named_gpio(node, "vbus_detect", 0);
-	if (ret < 0) {
-		dev_err(mtu->dev, "no vbus_detect gpio info\n");
-		return ret;
-	}
-	mtu->detect_gpio= ret;
-
-	ret = devm_gpio_request(mtu->dev, mtu->detect_gpio,
-				   "mtu_vbus_detect");
-	if (ret < 0) {
-		dev_err(mtu->dev, "fail to request gpio%d (%d)\n",
-				   mtu->detect_gpio, ret);
-		return ret;
-	}
-
-	ret = gpio_direction_input(mtu->detect_gpio);
-	if (ret < 0) {
-		dev_err(mtu->dev, "fail to set gpio%d as input pin (%d)\n",
-				   mtu->detect_gpio, ret);
-		return ret;
-	}
-
-	/* 20 ms */
-	gpio_set_debounce(mtu->detect_gpio, 20*1000);
-	if (ret < 0) {
-		dev_err(mtu->dev, "fail to set gpio%d debounce (%d)\n",
-				   mtu->detect_gpio, ret);
-		return ret;
-	}
-
-	mtu->detect_irq = gpio_to_irq(mtu->detect_gpio);
-	if (mtu->detect_irq <= 0) {
-		dev_err(mtu->dev, "gpio%d to irq fail, mtu_vbus_detect(%d)\n",
-				   mtu->detect_irq, ret);
-		return ret;
-	}
-
-	ret = request_irq(mtu->detect_irq, mtu3_vbus_detect_eint_isr,
-				   IRQF_TRIGGER_LOW, "mtu_detect_eint", mtu);
-	if (ret) {
-		dev_err(mtu->dev, "request eint(%d) fail (%d)\n",
-				   mtu->detect_irq, ret);
-		return ret;
-	}
-	return 0;
-}
-
-void mtu3_start(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-
-	dev_dbg(mtu->dev, "%s devctl 0x%x\n", __func__,
-		mtu3_readl(mbase, U3D_DEVICE_CONTROL));
-
-	mtu3_clrbits(mtu->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
-
-#ifndef CONFIG_MTU3_MD_USB_EP0_CTRL
-	/* Initialize the device capability */
-	mtu3_regs_init(mtu);
-#else
-	/*
-	 * When disable U2 port, USB2_CSR's register will be reset to
-	 * default value after re-enable it again(HS is enabled by default).
-	 * So if force mac to work as FS, disable HS function.
-	 */
-	if (mtu->max_speed == USB_SPEED_FULL)
-		mtu3_clrbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
-#endif
-
-	/* Initialize the default interrupts */
-	mtu3_intr_enable(mtu);
-	mtu->is_active = 1;
-
-	if (mtu->softconnect)
-		mtu3_dev_on_off(mtu, 1);
-}
-
-void mtu3_stop(struct mtu3 *mtu)
-{
-	dev_dbg(mtu->dev, "%s\n", __func__);
-
-	mtu3_intr_disable(mtu);
-	mtu3_intr_status_clear(mtu);
-
-	if (mtu->softconnect)
-		mtu3_dev_on_off(mtu, 0);
-
-	mtu->is_active = 0;
-	mtu3_setbits(mtu->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
-}
-
-/* for non-ep0 */
-#ifndef CONFIG_MTU3_MD_USB_EP0_CTRL
-int mtu3_config_ep(struct mtu3 *mtu, struct mtu3_ep *mep,
-			int interval, int burst, int mult)
-{
-	void __iomem *mbase = mtu->mac_base;
-	bool gen2cp = mtu->gen2cp;
-	int epnum = mep->epnum;
-	u32 csr0, csr1, csr2;
-	int fifo_sgsz, fifo_addr;
-	int num_pkts;
-
-	fifo_addr = ep_fifo_alloc(mep, mep->maxp);
-	if (fifo_addr < 0) {
-		dev_err(mtu->dev, "alloc ep fifo failed(%d)\n", mep->maxp);
-		return -ENOMEM;
-	}
-	fifo_sgsz = ilog2(mep->fifo_seg_size);
-	dev_dbg(mtu->dev, "%s fifosz: %x(%x/%x)\n", __func__, fifo_sgsz,
-		mep->fifo_seg_size, mep->fifo_size);
-
-	if (mep->is_in) {
-		csr0 = TX_TXMAXPKTSZ(mep->maxp);
-		csr0 |= TX_DMAREQEN;
-
-		num_pkts = (burst + 1) * (mult + 1) - 1;
-		csr1 = TX_SS_BURST(burst) | TX_SLOT(mep->slot);
-		csr1 |= TX_MAX_PKT(gen2cp, num_pkts) | TX_MULT(gen2cp, mult);
-
-		csr2 = TX_FIFOADDR(fifo_addr >> 4);
-		csr2 |= TX_FIFOSEGSIZE(fifo_sgsz);
-
-		switch (mep->type) {
-		case USB_ENDPOINT_XFER_BULK:
-			csr1 |= TX_TYPE(TYPE_BULK);
-			break;
-		case USB_ENDPOINT_XFER_ISOC:
-			csr1 |= TX_TYPE(TYPE_ISO);
-			csr2 |= TX_BINTERVAL(interval);
-			break;
-		case USB_ENDPOINT_XFER_INT:
-			csr1 |= TX_TYPE(TYPE_INT);
-			csr2 |= TX_BINTERVAL(interval);
-			break;
-		}
-
-		/* Enable QMU Done interrupt */
-		mtu3_setbits(mbase, U3D_QIESR0, QMU_TX_DONE_INT(epnum));
-
-		mtu3_writel(mbase, MU3D_EP_TXCR0(epnum), csr0);
-		mtu3_writel(mbase, MU3D_EP_TXCR1(epnum), csr1);
-		mtu3_writel(mbase, MU3D_EP_TXCR2(epnum), csr2);
-
-		dev_dbg(mtu->dev, "U3D_TX%d CSR0:%#x, CSR1:%#x, CSR2:%#x\n",
-			epnum, mtu3_readl(mbase, MU3D_EP_TXCR0(epnum)),
-			mtu3_readl(mbase, MU3D_EP_TXCR1(epnum)),
-			mtu3_readl(mbase, MU3D_EP_TXCR2(epnum)));
-	} else {
-		csr0 = RX_RXMAXPKTSZ(mep->maxp);
-		csr0 |= RX_DMAREQEN;
-
-		num_pkts = (burst + 1) * (mult + 1) - 1;
-		csr1 = RX_SS_BURST(burst) | RX_SLOT(mep->slot);
-		csr1 |= RX_MAX_PKT(gen2cp, num_pkts) | RX_MULT(gen2cp, mult);
-
-		csr2 = RX_FIFOADDR(fifo_addr >> 4);
-		csr2 |= RX_FIFOSEGSIZE(fifo_sgsz);
-
-		switch (mep->type) {
-		case USB_ENDPOINT_XFER_BULK:
-			csr1 |= RX_TYPE(TYPE_BULK);
-			break;
-		case USB_ENDPOINT_XFER_ISOC:
-			csr1 |= RX_TYPE(TYPE_ISO);
-			csr2 |= RX_BINTERVAL(interval);
-			break;
-		case USB_ENDPOINT_XFER_INT:
-			csr1 |= RX_TYPE(TYPE_INT);
-			csr2 |= RX_BINTERVAL(interval);
-			break;
-		}
-
-		/*Enable QMU Done interrupt */
-		mtu3_setbits(mbase, U3D_QIESR0, QMU_RX_DONE_INT(epnum));
-
-		mtu3_writel(mbase, MU3D_EP_RXCR0(epnum), csr0);
-		mtu3_writel(mbase, MU3D_EP_RXCR1(epnum), csr1);
-		mtu3_writel(mbase, MU3D_EP_RXCR2(epnum), csr2);
-
-		dev_dbg(mtu->dev, "U3D_RX%d CSR0:%#x, CSR1:%#x, CSR2:%#x\n",
-			epnum, mtu3_readl(mbase, MU3D_EP_RXCR0(epnum)),
-			mtu3_readl(mbase, MU3D_EP_RXCR1(epnum)),
-			mtu3_readl(mbase, MU3D_EP_RXCR2(epnum)));
-	}
-
-	dev_dbg(mtu->dev, "csr0:%#x, csr1:%#x, csr2:%#x\n", csr0, csr1, csr2);
-	dev_dbg(mtu->dev, "%s: %s, fifo-addr:%#x, fifo-size:%#x(%#x/%#x)\n",
-		__func__, mep->name, mep->fifo_addr, mep->fifo_size,
-		fifo_sgsz, mep->fifo_seg_size);
-
-	return 0;
-}
-#else
-int mtu3_config_ep(struct mtu3 *mtu, struct mtu3_ep *mep,
-			int interval, int burst, int mult)
-{
-	void __iomem *mbase = mtu->mac_base;
-	int epnum = mep->epnum;
-
-	if (mep->is_in)
-		/* Enable QMU Done interrupt */
-		mtu3_setbits(mbase, U3D_QIESR0, QMU_TX_DONE_INT(epnum));
-	else
-		/*Enable QMU Done interrupt */
-		mtu3_setbits(mbase, U3D_QIESR0, QMU_RX_DONE_INT(epnum));
-	return 0;
-}
-
-#endif
-
-/* for non-ep0 */
-void mtu3_deconfig_ep(struct mtu3 *mtu, struct mtu3_ep *mep)
-{
-	void __iomem *mbase = mtu->mac_base;
-	int epnum = mep->epnum;
-
-	if (mep->is_in) {
-		mtu3_writel(mbase, MU3D_EP_TXCR0(epnum), 0);
-		mtu3_writel(mbase, MU3D_EP_TXCR1(epnum), 0);
-		mtu3_writel(mbase, MU3D_EP_TXCR2(epnum), 0);
-		mtu3_setbits(mbase, U3D_QIECR0, QMU_TX_DONE_INT(epnum));
-	} else {
-		mtu3_writel(mbase, MU3D_EP_RXCR0(epnum), 0);
-		mtu3_writel(mbase, MU3D_EP_RXCR1(epnum), 0);
-		mtu3_writel(mbase, MU3D_EP_RXCR2(epnum), 0);
-		mtu3_setbits(mbase, U3D_QIECR0, QMU_RX_DONE_INT(epnum));
-	}
-
-	mtu3_ep_reset(mep);
-	ep_fifo_free(mep);
-
-	dev_dbg(mtu->dev, "%s: %s\n", __func__, mep->name);
-}
-
-/*
- * Two scenarios:
- * 1. when device IP supports SS, the fifo of EP0, TX EPs, RX EPs
- *	are separated;
- * 2. when supports only HS, the fifo is shared for all EPs, and
- *	the capability registers of @EPNTXFFSZ or @EPNRXFFSZ indicate
- *	the total fifo size of non-ep0, and ep0's is fixed to 64B,
- *	so the total fifo size is 64B + @EPNTXFFSZ;
- *	Due to the first 64B should be reserved for EP0, non-ep0's fifo
- *	starts from offset 64 and are divided into two equal parts for
- *	TX or RX EPs for simplification.
- */
-static void get_ep_fifo_config(struct mtu3 *mtu)
-{
-	struct mtu3_fifo_info *tx_fifo;
-	struct mtu3_fifo_info *rx_fifo;
-	u32 fifosize;
-
-	if (mtu->is_u3_ip) {
-		fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNTXFFSZ);
-		tx_fifo = &mtu->tx_fifo;
-		tx_fifo->base = 0;
-		tx_fifo->limit = fifosize / MTU3_EP_FIFO_UNIT;
-		bitmap_zero(tx_fifo->bitmap, MTU3_FIFO_BIT_SIZE);
-
-		fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNRXFFSZ);
-		rx_fifo = &mtu->rx_fifo;
-		rx_fifo->base = 0;
-		rx_fifo->limit = fifosize / MTU3_EP_FIFO_UNIT;
-		bitmap_zero(rx_fifo->bitmap, MTU3_FIFO_BIT_SIZE);
-		mtu->slot = MTU3_U3_IP_SLOT_DEFAULT;
-	} else {
-		fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNTXFFSZ);
-		tx_fifo = &mtu->tx_fifo;
-		tx_fifo->base = MTU3_U2_IP_EP0_FIFO_SIZE;
-		tx_fifo->limit = (fifosize / MTU3_EP_FIFO_UNIT) >> 1;
-		bitmap_zero(tx_fifo->bitmap, MTU3_FIFO_BIT_SIZE);
-
-		rx_fifo = &mtu->rx_fifo;
-		rx_fifo->base =
-			tx_fifo->base + tx_fifo->limit * MTU3_EP_FIFO_UNIT;
-		rx_fifo->limit = tx_fifo->limit;
-		bitmap_zero(rx_fifo->bitmap, MTU3_FIFO_BIT_SIZE);
-		mtu->slot = MTU3_U2_IP_SLOT_DEFAULT;
-	}
-
-	dev_dbg(mtu->dev, "%s, TX: base-%d, limit-%d; RX: base-%d, limit-%d\n",
-		__func__, tx_fifo->base, tx_fifo->limit,
-		rx_fifo->base, rx_fifo->limit);
-}
-
-void mtu3_ep0_setup(struct mtu3 *mtu)
-{
-	u32 maxpacket = mtu->g.ep0->maxpacket;
-	u32 csr;
-
-	dev_dbg(mtu->dev, "%s maxpacket: %d\n", __func__, maxpacket);
-
-	csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR);
-	csr &= ~EP0_MAXPKTSZ_MSK;
-	csr |= EP0_MAXPKTSZ(maxpacket);
-	csr &= EP0_W1C_BITS;
-	mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr);
-
-	/* Enable EP0 interrupt */
-	mtu3_writel(mtu->mac_base, U3D_EPIESR, EP0ISR | SETUPENDISR);
-}
-
-static int mtu3_mem_alloc(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-	struct mtu3_ep *ep_array;
-	int in_ep_num, out_ep_num;
-	u32 cap_epinfo;
-	int ret;
-	int i;
-
-	cap_epinfo = mtu3_readl(mbase, U3D_CAP_EPINFO);
-	in_ep_num = CAP_TX_EP_NUM(cap_epinfo);
-	out_ep_num = CAP_RX_EP_NUM(cap_epinfo);
-
-	dev_info(mtu->dev, "fifosz/epnum: Tx=%#x/%d, Rx=%#x/%d\n",
-		 mtu3_readl(mbase, U3D_CAP_EPNTXFFSZ), in_ep_num,
-		 mtu3_readl(mbase, U3D_CAP_EPNRXFFSZ), out_ep_num);
-
-	/* one for ep0, another is reserved */
-	mtu->num_eps = min(in_ep_num, out_ep_num) + 1;
-	ep_array = kcalloc(mtu->num_eps * 2, sizeof(*ep_array), GFP_KERNEL);
-	if (ep_array == NULL)
-		return -ENOMEM;
-
-	mtu->ep_array = ep_array;
-	mtu->in_eps = ep_array;
-	mtu->out_eps = &ep_array[mtu->num_eps];
-	/* ep0 uses in_eps[0], out_eps[0] is reserved */
-	mtu->ep0 = mtu->in_eps;
-	mtu->ep0->mtu = mtu;
-	mtu->ep0->epnum = 0;
-
-	for (i = 1; i < mtu->num_eps; i++) {
-		struct mtu3_ep *mep = mtu->in_eps + i;
-
-		mep->fifo = &mtu->tx_fifo;
-		mep = mtu->out_eps + i;
-		mep->fifo = &mtu->rx_fifo;
-	}
-
-	get_ep_fifo_config(mtu);
-
-	ret = mtu3_qmu_init(mtu);
-	if (ret)
-		kfree(mtu->ep_array);
-
-	return ret;
-}
-
-static void mtu3_mem_free(struct mtu3 *mtu)
-{
-	mtu3_qmu_exit(mtu);
-	kfree(mtu->ep_array);
-}
-
-#ifndef CONFIG_MTU3_MD_USB_EP0_CTRL
-static irqreturn_t mtu3_link_isr(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-	enum usb_device_speed udev_speed;
-	u32 maxpkt = 64;
-	u32 link;
-	u32 speed;
-
-	link = mtu3_readl(mbase, U3D_DEV_LINK_INTR);
-	link &= mtu3_readl(mbase, U3D_DEV_LINK_INTR_ENABLE);
-	mtu3_writel(mbase, U3D_DEV_LINK_INTR, link); /* W1C */
-	dev_info(mtu->dev, "=== LINK[%x] ===\n", link);
-
-	if (!(link & SSUSB_DEV_SPEED_CHG_INTR))
-		return IRQ_NONE;
-
-	speed = SSUSB_DEV_SPEED(mtu3_readl(mbase, U3D_DEVICE_CONF));
-
-	switch (speed) {
-	case MTU3_SPEED_FULL:
-		udev_speed = USB_SPEED_FULL;
-		/*BESLCK = 4 < BESLCK_U3 = 10 < BESLDCK = 15 */
-		mtu3_writel(mbase, U3D_USB20_LPM_PARAMETER, LPM_BESLDCK(0xf)
-				| LPM_BESLCK(4) | LPM_BESLCK_U3(0xa));
-		mtu3_setbits(mbase, U3D_POWER_MANAGEMENT,
-				LPM_BESL_STALL | LPM_BESLD_STALL);
-		break;
-	case MTU3_SPEED_HIGH:
-		udev_speed = USB_SPEED_HIGH;
-		/*BESLCK = 4 < BESLCK_U3 = 10 < BESLDCK = 15 */
-		mtu3_writel(mbase, U3D_USB20_LPM_PARAMETER, LPM_BESLDCK(0xf)
-				| LPM_BESLCK(4) | LPM_BESLCK_U3(0xa));
-		mtu3_setbits(mbase, U3D_POWER_MANAGEMENT,
-				LPM_BESL_STALL | LPM_BESLD_STALL);
-		break;
-	case MTU3_SPEED_SUPER:
-		udev_speed = USB_SPEED_SUPER;
-		maxpkt = 512;
-		break;
-	case MTU3_SPEED_SUPER_PLUS:
-		udev_speed = USB_SPEED_SUPER_PLUS;
-		maxpkt = 512;
-		break;
-	default:
-		udev_speed = USB_SPEED_UNKNOWN;
-		break;
-	}
-	dev_dbg(mtu->dev, "%s: %s\n", __func__, usb_speed_string(udev_speed));
-	mtu3_dbg_trace(mtu->dev, "link speed %s",
-		       usb_speed_string(udev_speed));
-
-	mtu->g.speed = udev_speed;
-	mtu->g.ep0->maxpacket = maxpkt;
-	mtu->ep0_state = MU3D_EP0_STATE_SETUP;
-
-	if (udev_speed == USB_SPEED_UNKNOWN)
-		mtu3_gadget_disconnect(mtu);
-	else
-		mtu3_ep0_setup(mtu);
-
-	return IRQ_HANDLED;
-}
-
-static irqreturn_t mtu3_u3_ltssm_isr(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-	u32 ltssm;
-
-	ltssm = mtu3_readl(mbase, U3D_LTSSM_INTR);
-	ltssm &= mtu3_readl(mbase, U3D_LTSSM_INTR_ENABLE);
-	mtu3_writel(mbase, U3D_LTSSM_INTR, ltssm); /* W1C */
-	dev_info(mtu->dev, "=== LTSSM[%x] ===\n", ltssm);
-	trace_mtu3_u3_ltssm_isr(ltssm);
-
-	if (ltssm & (HOT_RST_INTR | WARM_RST_INTR))
-		mtu3_gadget_reset(mtu);
-
-	if (ltssm & VBUS_FALL_INTR) {
-		mtu3_ss_func_set(mtu, false);
-		mtu3_gadget_reset(mtu);
-	}
-
-	if (ltssm & VBUS_RISE_INTR)
-		mtu3_ss_func_set(mtu, true);
-
-	if (ltssm & EXIT_U3_INTR)
-		mtu3_gadget_resume(mtu);
-
-	if (ltssm & ENTER_U3_INTR)
-		mtu3_gadget_suspend(mtu);
-
-	return IRQ_HANDLED;
-}
-
-static irqreturn_t mtu3_u2_common_isr(struct mtu3 *mtu)
-{
-	void __iomem *mbase = mtu->mac_base;
-	u32 u2comm;
-
-	u2comm = mtu3_readl(mbase, U3D_COMMON_USB_INTR);
-	u2comm &= mtu3_readl(mbase, U3D_COMMON_USB_INTR_ENABLE);
-	mtu3_writel(mbase, U3D_COMMON_USB_INTR, u2comm); /* W1C */
-	dev_info(mtu->dev, "=== U2COMM[%x] ===\n", u2comm);
-	trace_mtu3_u2_common_isr(u2comm);
-
-	if (u2comm & SUSPEND_INTR)
-		mtu3_gadget_suspend(mtu);
-
-	if (u2comm & RESUME_INTR)
-		mtu3_gadget_resume(mtu);
-
-	if (u2comm & RESET_INTR)
-		mtu3_gadget_reset(mtu);
-
-	if (u2comm & LPM_RESUME_INTR) {
-	    if (!(mtu3_readl(mbase, U3D_POWER_MANAGEMENT) & LPM_HRWE))
-		mtu3_setbits(mbase, U3D_USB20_MISC_CONTROL, LPM_U3_ACK_EN);
-	}
-
-	return IRQ_HANDLED;
-}
-
-static irqreturn_t mtu3_irq(int irq, void *data)
-{
-	struct mtu3 *mtu = (struct mtu3 *)data;
-	unsigned long flags;
-	u32 level1;
-
-	spin_lock_irqsave(&mtu->lock, flags);
-
-#ifndef CONFIG_MTU3_MD_USB_EP0_CTRL
-	if (total_isr_debug)
-		total_isr++;
-#endif
-	/* U3D_LV1ISR is RU */
-	level1 = mtu3_readl(mtu->mac_base, U3D_LV1ISR);
-	level1 &= mtu3_readl(mtu->mac_base, U3D_LV1IER);
-//zhengzhou 0318 usb otg */
-	/*if (unlikely(!mtu->softconnect) && (level1 & MAC2_INTR)) {
-		dev_info(mtu->dev, "%s !softconnect MAC2_INTR\n", __func__);
-		u2comm = mtu3_readl(mtu->mac_base, U3D_COMMON_USB_INTR);
-		u2comm &= mtu3_readl(mtu->mac_base, U3D_COMMON_USB_INTR_ENABLE);
-		mtu3_writel(mtu->mac_base, U3D_COMMON_USB_INTR, u2comm);
-		goto done;
-	}
-
-	if (unlikely(!mtu->softconnect) && (level1 & BMU_INTR)) {
-		dev_info(mtu->dev, "%s !softconnect BMU_INTR\n", __func__);
-		int_status = mtu3_readl(mtu->mac_base, U3D_EPISR);
-		int_status &= mtu3_readl(mtu->mac_base, U3D_EPIER);
-		mtu3_writel(mtu->mac_base, U3D_EPISR, int_status);
-		goto done;
-	}
-	*/
-//zhengzhou 0318 usb otg */
-	if (level1 & EP_CTRL_INTR)
-		mtu3_link_isr(mtu);
-
-	if (level1 & MAC2_INTR)
-		mtu3_u2_common_isr(mtu);
-
-	if (level1 & MAC3_INTR)
-		mtu3_u3_ltssm_isr(mtu);
-
-	if (level1 & BMU_INTR)
-		mtu3_ep0_isr(mtu);
-
-	if (level1 & QMU_INTR) {
-#ifndef CONFIG_MTU3_MD_USB_EP0_CTRL
-		if (total_isr_debug)
-			total_isr--;
-#endif
-		mtu3_qmu_isr(mtu);
-	}
-
-//done://zhengzhou 0318 usb otg */
-	spin_unlock_irqrestore(&mtu->lock, flags);
-
-	return IRQ_HANDLED;
-}
-#else
-static irqreturn_t mtu3_irq(int irq, void *data)
-{
-	struct mtu3 *mtu = (struct mtu3 *)data;
-	unsigned long flags;
-	u32 level1;
-
-	spin_lock_irqsave(&mtu->lock, flags);
-
-	/* U3D_LV1ISR is RU */
-	level1 = mtu3_readl(mtu->mac_base, U3D_LV1ISR);
-	level1 &= mtu3_readl(mtu->mac_base, U3D_LV1IER);
-
-	if (level1 & QMU_INTR)
-		mtu3_qmu_isr(mtu);
-
-	spin_unlock_irqrestore(&mtu->lock, flags);
-
-	return IRQ_HANDLED;
-}
-
-#endif
-
-static int mtu3_hw_init(struct mtu3 *mtu)
-{
-	u32 value;
-	int ret;
-
-	value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_TRUNK_VERS);
-	mtu->hw_version = IP_TRUNK_VERS(value);
-	#if 0
-	mtu->gen2cp = !!(mtu->hw_version >= MTU3_TRUNK_VERS_1003);
-	#else
-	mtu->gen2cp = 0;
-	#endif
-
-	value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_DEV_CAP);
-	mtu->is_u3_ip = !!SSUSB_IP_DEV_U3_PORT_NUM(value);
-
-	dev_info(mtu->dev, "IP version 0x%x(%s IP)\n", mtu->hw_version,
-		mtu->is_u3_ip ? "U3" : "U2");
-
-	mtu3_device_reset(mtu);
-
-	ret = mtu3_device_enable(mtu);
-	if (ret) {
-		dev_err(mtu->dev, "device enable failed %d\n", ret);
-		return ret;
-	}
-
-	ret = mtu3_mem_alloc(mtu);
-	if (ret)
-		return -ENOMEM;
-
-	mtu3_regs_init(mtu);
-
-	return 0;
-}
-
-static void mtu3_hw_exit(struct mtu3 *mtu)
-{
-	mtu3_device_disable(mtu);
-	mtu3_mem_free(mtu);
-}
-
-/**
- * we set 32-bit DMA mask by default, here check whether the controller
- * supports 36-bit DMA or not, if it does, set 36-bit DMA mask.
- */
-static int mtu3_set_dma_mask(struct mtu3 *mtu)
-{
-	struct device *dev = mtu->dev;
-	bool is_36bit = false;
-	int ret = 0;
-	u32 value;
-
-	value = mtu3_readl(mtu->mac_base, U3D_MISC_CTRL);
-	if (value & DMA_ADDR_36BIT) {
-		is_36bit = true;
-		ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(36));
-		/* If set 36-bit DMA mask fails, fall back to 32-bit DMA mask */
-		if (ret) {
-			is_36bit = false;
-			ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
-		}
-	}
-	dev_info(dev, "dma mask: %s bits\n", is_36bit ? "36" : "32");
-
-	return ret;
-}
-
-int ssusb_gadget_init(struct ssusb_mtk *ssusb)
-{
-	struct device *dev = ssusb->dev;
-	struct platform_device *pdev = to_platform_device(dev);
-	struct mtu3 *mtu = NULL;
-	struct resource *res;
-	int ret = -ENOMEM;
-
-	mtu = devm_kzalloc(dev, sizeof(struct mtu3), GFP_KERNEL);
-	if (mtu == NULL)
-		return -ENOMEM;
-
-	mtu->irq = platform_get_irq(pdev, 0);
-	if (mtu->irq < 0) {
-		dev_err(dev, "fail to get irq number\n");
-		return mtu->irq;
-	}
-	dev_info(dev, "irq %d\n", mtu->irq);
-
-	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mac");
-	mtu->mac_base = devm_ioremap_resource(dev, res);
-	if (IS_ERR(mtu->mac_base)) {
-		dev_err(dev, "error mapping memory for dev mac\n");
-		return PTR_ERR(mtu->mac_base);
-	}
-
-	spin_lock_init(&mtu->lock);
-	mtu->dev = dev;
-	mtu->ippc_base = ssusb->ippc_base;
-	ssusb->mac_base	= mtu->mac_base;
-	ssusb->u3d = mtu;
-	mtu->ssusb = ssusb;
-	mtu->max_speed = usb_get_maximum_speed(dev);
-
-	#ifdef CONFIG_MTU3_MD_USB_EP0_CTRL
-	INIT_DELAYED_WORK(&mtu->forward_to_driver_work, mtu3_forward_to_driver_work);
-	mtu->md_sync_data = devm_kzalloc(dev, sizeof(struct mtu3_md_sync_data), GFP_KERNEL);
-	#endif
-	/* check the max_speed parameter */
-	switch (mtu->max_speed) {
-	case USB_SPEED_FULL:
-	case USB_SPEED_HIGH:
-	case USB_SPEED_SUPER:
-	case USB_SPEED_SUPER_PLUS:
-		break;
-	default:
-		dev_err(dev, "invalid max_speed: %s\n",
-			usb_speed_string(mtu->max_speed));
-		/* fall through */
-	case USB_SPEED_UNKNOWN:
-		/* default as SSP */
-		mtu->max_speed = USB_SPEED_SUPER_PLUS;
-		break;
-	}
-
-	dev_dbg(dev, "mac_base=0x%p, ippc_base=0x%p\n",
-		mtu->mac_base, mtu->ippc_base);
-
-	ret = mtu3_hw_init(mtu);
-	if (ret) {
-		dev_err(dev, "mtu3 hw init failed:%d\n", ret);
-		return ret;
-	}
-
-	ret = mtu3_set_dma_mask(mtu);
-	if (ret) {
-		dev_err(dev, "mtu3 set dma_mask failed:%d\n", ret);
-		goto dma_mask_err;
-	}
-
-	ret = devm_request_irq(dev, mtu->irq, mtu3_irq, 0, dev_name(dev), mtu);
-	if (ret) {
-		dev_err(dev, "request irq %d failed!\n", mtu->irq);
-		goto irq_err;
-	}
-
-	device_init_wakeup(dev, true);
-
-	ret = mtu3_gadget_setup(mtu);
-	if (ret) {
-		dev_err(dev, "mtu3 gadget init failed:%d\n", ret);
-		goto gadget_err;
-	}
-	mtu3_usb_vbus_detect_init(mtu);
-	/* init as host mode, power down device IP for power saving */
-	if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG)
-		mtu3_stop(mtu);
-
-	ssusb_dev_debugfs_init(ssusb);
-
-	dev_dbg(dev, " %s() done...\n", __func__);
-
-	return 0;
-
-gadget_err:
-	device_init_wakeup(dev, false);
-
-dma_mask_err:
-irq_err:
-	mtu3_hw_exit(mtu);
-	ssusb->u3d = NULL;
-	dev_err(dev, " %s() fail...\n", __func__);
-
-	return ret;
-}
-
-void ssusb_gadget_exit(struct ssusb_mtk *ssusb)
-{
-	struct mtu3 *mtu = ssusb->u3d;
-
-	mtu3_gadget_cleanup(mtu);
-	device_init_wakeup(ssusb->dev, false);
-	mtu3_hw_exit(mtu);
-}
diff --git a/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_dr_1.c b/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_dr_1.c
deleted file mode 100755
index 3a3ef38..0000000
--- a/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_dr_1.c
+++ /dev/null
@@ -1,612 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * mtu3_dr.c - dual role switch and host glue layer
- *
- * Copyright (C) 2016 MediaTek Inc.
- *
- * Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
- */
-
-#include <linux/usb/role.h>
-#include <linux/of_platform.h>
-
-#include "mtu3.h"
-#include "mtu3_dr.h"
-#include "mtu3_debug.h"
-
-#define USB2_PORT 2
-#define USB3_PORT 3
-
-enum mtu3_vbus_id_state {
-	MTU3_ID_FLOAT = 1,
-	MTU3_ID_GROUND,
-	MTU3_VBUS_OFF,
-	MTU3_VBUS_VALID,
-};
-
-static char *mailbox_state_string(enum mtu3_vbus_id_state state)
-{
-	switch (state) {
-	case MTU3_ID_FLOAT:
-		return "ID_FLOAT";
-	case MTU3_ID_GROUND:
-		return "ID_GROUND";
-	case MTU3_VBUS_OFF:
-		return "VBUS_OFF";
-	case MTU3_VBUS_VALID:
-		return "VBUS_VALID";
-	default:
-		return "UNKNOWN";
-	}
-}
-
-static void toggle_opstate(struct ssusb_mtk *ssusb)
-{
-	dev_info(ssusb->dev, "%s\n", __func__);
-	//if (!ssusb->otg_switch.is_u3_drd) {//zhengzhou 0318 usb otg */
-	if (!ssusb->otg_switch.is_u3_drd) {
-		mtu3_setbits(ssusb->mac_base, U3D_DEVICE_CONTROL, DC_SESSION);
-		mtu3_setbits(ssusb->mac_base, U3D_POWER_MANAGEMENT, SOFT_CONN);
-	}
-	//}
-}
-
-/* only port0 supports dual-role mode */
-static int ssusb_port0_switch(struct ssusb_mtk *ssusb,
-	int version, bool tohost)
-{
-	void __iomem *ibase = ssusb->ippc_base;
-	u32 value;
-
-	dev_dbg(ssusb->dev, "%s (switch u%d port0 to %s)\n", __func__,
-		version, tohost ? "host" : "device");
-
-	if (version == USB2_PORT) {
-		/* 1. power off and disable u2 port0 */
-		value = mtu3_readl(ibase, SSUSB_U2_CTRL(0));
-		value |= SSUSB_U2_PORT_PDN | SSUSB_U2_PORT_DIS;
-		mtu3_writel(ibase, SSUSB_U2_CTRL(0), value);
-
-		/* 2. power on, enable u2 port0 and select its mode */
-		value = mtu3_readl(ibase, SSUSB_U2_CTRL(0));
-		value &= ~(SSUSB_U2_PORT_PDN | SSUSB_U2_PORT_DIS);
-		value = tohost ? (value | SSUSB_U2_PORT_HOST_SEL) :
-			(value & (~SSUSB_U2_PORT_HOST_SEL));
-		mtu3_writel(ibase, SSUSB_U2_CTRL(0), value);
-	} else {
-		/* 1. power off and disable u3 port0 */
-		value = mtu3_readl(ibase, SSUSB_U3_CTRL(0));
-		value |= SSUSB_U3_PORT_PDN | SSUSB_U3_PORT_DIS;
-		mtu3_writel(ibase, SSUSB_U3_CTRL(0), value);
-
-		/* 2. power on, enable u3 port0 and select its mode */
-		value = mtu3_readl(ibase, SSUSB_U3_CTRL(0));
-		value &= ~(SSUSB_U3_PORT_PDN | SSUSB_U3_PORT_DIS);
-		value = tohost ? (value | SSUSB_U3_PORT_HOST_SEL) :
-			(value & (~SSUSB_U3_PORT_HOST_SEL));
-		mtu3_writel(ibase, SSUSB_U3_CTRL(0), value);
-	}
-
-	return 0;
-}
-
-static void ssusb_ip_sleep(struct ssusb_mtk *ssusb)
-{
-	void __iomem *ibase = ssusb->ippc_base;
-
-	/* Set below sequence to avoid power leakage */
-	mtu3_setbits(ibase, SSUSB_U3_CTRL(0),
-		(SSUSB_U3_PORT_DIS | SSUSB_U3_PORT_PDN));
-	mtu3_setbits(ibase, SSUSB_U2_CTRL(0),
-		SSUSB_U2_PORT_DIS | SSUSB_U2_PORT_PDN);
-	mtu3_clrbits(ibase, SSUSB_U2_CTRL(0), SSUSB_U2_PORT_OTG_SEL);
-	mtu3_setbits(ibase, U3D_SSUSB_IP_PW_CTRL1, SSUSB_IP_HOST_PDN);
-	mtu3_setbits(ibase, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
-	udelay(50);
-	mtu3_setbits(ibase, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST);
-}
-
-static void switch_port_to_on(struct ssusb_mtk *ssusb, bool on)
-{
-	dev_dbg(ssusb->dev, "%s\n", __func__);
-
-	if (on) {
-		//ssusb_clks_enable(ssusb);//zhengzhou 0318 usb otg */
-		ssusb_phy_power_on(ssusb);
-		ssusb_ip_sw_reset(ssusb);
-	} else {
-		ssusb_ip_sleep(ssusb);
-		ssusb_phy_power_off(ssusb);
-		//ssusb_clks_disable(ssusb);//zhengzhou 0318 usb otg */
-	}
-}
-
-static void switch_port_to_host(struct ssusb_mtk *ssusb)
-{
-	u32 check_clk = 0;
-
-	dev_dbg(ssusb->dev, "%s\n", __func__);
-
-	ssusb_port0_switch(ssusb, USB2_PORT, true);
-
-	if (ssusb->otg_switch.is_u3_drd) {
-		ssusb_port0_switch(ssusb, USB3_PORT, true);
-		check_clk = SSUSB_U3_MAC_RST_B_STS;
-	}
-
-	ssusb_check_clocks(ssusb, check_clk);
-
-	/* after all clocks are stable */
-	toggle_opstate(ssusb);
-}
-
-static void switch_port_to_device(struct ssusb_mtk *ssusb)
-{
-	u32 check_clk = 0;
-
-	dev_info(ssusb->dev, "%s\n", __func__);
-
-	ssusb_port0_switch(ssusb, USB2_PORT, false);
-
-	if (ssusb->otg_switch.is_u3_drd) {
-		ssusb_port0_switch(ssusb, USB3_PORT, false);
-		check_clk = SSUSB_U3_MAC_RST_B_STS;
-	}
-
-	ssusb_check_clocks(ssusb, check_clk);
-}
-
-int ssusb_set_vbus(struct otg_switch_mtk *otg_sx, int is_on)
-{
-	struct ssusb_mtk *ssusb =
-		container_of(otg_sx, struct ssusb_mtk, otg_switch);
-	struct regulator *vbus = otg_sx->vbus;
-	int ret;
-
-	/* vbus is optional */
-	if (!vbus)
-		return 0;
-
-	dev_dbg(ssusb->dev, "%s: turn %s\n", __func__, is_on ? "on" : "off");
-
-	if (is_on) {
-		ret = regulator_enable(vbus);
-		if (ret) {
-			dev_err(ssusb->dev, "vbus regulator enable failed\n");
-			return ret;
-		}
-	} else {
-		regulator_disable(vbus);
-	}
-
-	return 0;
-}
-
-static void ssusb_gadget_disconnect(struct mtu3 *mtu)
-{
-	/* notify gadget driver */
-	if (mtu->g.speed == USB_SPEED_UNKNOWN)
-		return;
-
-	if (mtu->gadget_driver && mtu->gadget_driver->disconnect) {
-		mtu->gadget_driver->disconnect(&mtu->g);
-		mtu->g.speed = USB_SPEED_UNKNOWN;
-	}
-
-	usb_gadget_set_state(&mtu->g, USB_STATE_NOTATTACHED);
-}
-
-/*
- * switch to host: -> MTU3_VBUS_OFF --> MTU3_ID_GROUND
- * switch to device: -> MTU3_ID_FLOAT --> MTU3_VBUS_VALID
- */
-static void ssusb_set_mailbox(struct otg_switch_mtk *otg_sx,
-	enum mtu3_vbus_id_state status)
-{
-	struct ssusb_mtk *ssusb =
-		container_of(otg_sx, struct ssusb_mtk, otg_switch);
-	struct mtu3 *mtu = ssusb->u3d;
-	unsigned long flags;
-
-	dev_info(ssusb->dev, "mailbox %s\n", mailbox_state_string(status));
-	mtu3_dbg_trace(ssusb->dev, "mailbox %s", mailbox_state_string(status));
-
-	switch (status) {
-	case MTU3_ID_GROUND:
-		switch_port_to_host(ssusb);
-		ssusb_set_vbus(otg_sx, 1);
-		ssusb->is_host = true;
-		otg_sx->sw_state |= MTU3_SW_ID_GROUND;
-		break;
-	case MTU3_ID_FLOAT:
-		ssusb->is_host = false;
-		ssusb_set_vbus(otg_sx, 0);
-		switch_port_to_device(ssusb);
-		otg_sx->sw_state &= ~MTU3_SW_ID_GROUND;
-		break;
-	case MTU3_VBUS_OFF:
-		/* killing any outstanding requests */
-		spin_lock_irqsave(&mtu->lock, flags);
-		mtu3_nuke_all_ep(mtu);
-		spin_unlock_irqrestore(&mtu->lock, flags);
-		mtu3_stop(mtu);
-		pm_relax(ssusb->dev);
-		//ssusb_set_force_vbus(ssusb, false);//zhengzhou 0318 usb otg */
-		ssusb_gadget_disconnect(mtu);
-		otg_sx->sw_state &= ~MTU3_SW_VBUS_VALID;
-		break;
-	case MTU3_VBUS_VALID:
-		//ssusb_set_force_vbus(ssusb, true);//zhengzhou 0318 usb otg */
-		/* avoid suspend when works as device */
-		pm_stay_awake(ssusb->dev);
-		mtu3_start(mtu);
-		otg_sx->sw_state |= MTU3_SW_VBUS_VALID;
-		break;
-	default:
-		dev_err(ssusb->dev, "invalid state\n");
-	}
-}
-
-static void ssusb_id_work(struct work_struct *work)
-{
-	struct otg_switch_mtk *otg_sx =
-		container_of(work, struct otg_switch_mtk, id_work);
-		//zhengzhou 0318 usb otg start*/
-	struct ssusb_mtk *ssusb =
-			container_of(otg_sx, struct ssusb_mtk, otg_switch);
-
-	if (otg_sx->id_event){
-		mdelay(500);
-		pm_stay_awake(ssusb->dev);
-		switch_port_to_on(ssusb, true);
-		ssusb_host_enable(ssusb);
-		/* register host driver */
-		of_platform_populate(ssusb->dev->of_node,
-						NULL, NULL, ssusb->dev);
-		ssusb_set_force_mode(ssusb, MTU3_DR_FORCE_HOST);
-		ssusb_set_mailbox(otg_sx, MTU3_ID_GROUND);
-		}
-	else {
-		/* FIXME: debounce time for xhci finish disconnection */
-		//mdelay(200);
-		ssusb_set_force_mode(ssusb, MTU3_DR_FORCE_DEVICE);
-		of_platform_depopulate(ssusb->dev);
-		ssusb_set_mailbox(otg_sx, MTU3_ID_FLOAT);
-		switch_port_to_on(ssusb, false);
-		pm_relax(ssusb->dev);
-		}
-		//zhengzhou 0318 usb otg end*/
-}
-
-static void ssusb_vbus_work(struct work_struct *work)
-{
-	struct otg_switch_mtk *otg_sx =
-		container_of(work, struct otg_switch_mtk, vbus_work);
-			//zhengzhou 0318 usb otg start*/
-	struct ssusb_mtk *ssusb =
-			container_of(otg_sx, struct ssusb_mtk, otg_switch);
-
-	if (otg_sx->vbus_event) {
-		msleep(500);
-		switch_port_to_on(ssusb, true);
-		switch_port_to_device(ssusb);
-		ssusb_set_mailbox(otg_sx, MTU3_VBUS_VALID);
-		}
-	else {
-		ssusb_set_mailbox(otg_sx, MTU3_VBUS_OFF);
-		switch_port_to_on(ssusb, false);
-		}
-			//zhengzhou 0318 usb otg end*/
-}
-
-/*
- * @ssusb_id_notifier is called in atomic context, but @ssusb_set_mailbox
- * may sleep, so use work queue here
- */
-static int ssusb_id_notifier(struct notifier_block *nb,
-	unsigned long event, void *ptr)
-{
-	struct otg_switch_mtk *otg_sx =
-		container_of(nb, struct otg_switch_mtk, id_nb);
-
-	otg_sx->id_event = event;
-	schedule_work(&otg_sx->id_work);
-
-	return NOTIFY_DONE;
-}
-
-static int ssusb_vbus_notifier(struct notifier_block *nb,
-	unsigned long event, void *ptr)
-{
-	struct otg_switch_mtk *otg_sx =
-		container_of(nb, struct otg_switch_mtk, vbus_nb);
-
-	otg_sx->vbus_event = event;
-	schedule_work(&otg_sx->vbus_work);
-
-	return NOTIFY_DONE;
-}
-
-static int ssusb_extcon_register(struct otg_switch_mtk *otg_sx)
-{
-	struct ssusb_mtk *ssusb =
-		container_of(otg_sx, struct ssusb_mtk, otg_switch);
-	struct extcon_dev *edev = otg_sx->edev;
-	int ret;
-
-	/* extcon is optional */
-	if (!edev)
-		return 0;
-
-	otg_sx->vbus_nb.notifier_call = ssusb_vbus_notifier;
-	ret = devm_extcon_register_notifier(ssusb->dev, edev, EXTCON_USB,
-					&otg_sx->vbus_nb);
-	if (ret < 0) {
-		dev_err(ssusb->dev, "failed to register notifier for USB\n");
-		return ret;
-	}
-
-	otg_sx->id_nb.notifier_call = ssusb_id_notifier;
-	ret = devm_extcon_register_notifier(ssusb->dev, edev, EXTCON_USB_HOST,
-					&otg_sx->id_nb);
-	if (ret < 0) {
-		dev_err(ssusb->dev, "failed to register notifier for USB-HOST\n");
-		return ret;
-	}
-
-	dev_dbg(ssusb->dev, "EXTCON_USB: %d, EXTCON_USB_HOST: %d\n",
-		extcon_get_state(edev, EXTCON_USB),
-		extcon_get_state(edev, EXTCON_USB_HOST));
-
-	/* default as host, switch to device mode if needed */
-	if (extcon_get_state(edev, EXTCON_USB_HOST) == false) {
-		of_platform_depopulate(ssusb->dev);	//zhengzhou 0318 usb otg */
-		ssusb_set_mailbox(otg_sx, MTU3_ID_FLOAT);
-		}
-	if (extcon_get_state(edev, EXTCON_USB) == true)
-		ssusb_set_mailbox(otg_sx, MTU3_VBUS_VALID);
-
-	return 0;
-}
-
-/*
- * We provide an interface via debugfs to switch between host and device modes
- * depending on user input.
- * This is useful in special cases, such as uses TYPE-A receptacle but also
- * wants to support dual-role mode.
- */
-void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host)
-{
-	struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-
-	if (to_host) {
-		ssusb_set_force_mode(ssusb, MTU3_DR_FORCE_HOST);
-		ssusb_set_mailbox(otg_sx, MTU3_VBUS_OFF);
-		ssusb_set_mailbox(otg_sx, MTU3_ID_GROUND);
-	} else {
-		ssusb_set_force_mode(ssusb, MTU3_DR_FORCE_DEVICE);
-		ssusb_set_mailbox(otg_sx, MTU3_ID_FLOAT);
-		ssusb_set_mailbox(otg_sx, MTU3_VBUS_VALID);
-	}
-}
-
-void ssusb_set_force_mode(struct ssusb_mtk *ssusb,
-			  enum mtu3_dr_force_mode mode)
-{
-	u32 value;
-
-	value = mtu3_readl(ssusb->ippc_base, SSUSB_U2_CTRL(0));
-	switch (mode) {
-	case MTU3_DR_FORCE_DEVICE:
-		value |= SSUSB_U2_PORT_FORCE_IDDIG | SSUSB_U2_PORT_RG_IDDIG;
-		break;
-	case MTU3_DR_FORCE_HOST:
-		value |= SSUSB_U2_PORT_FORCE_IDDIG;
-		value &= ~SSUSB_U2_PORT_RG_IDDIG;
-		break;
-	case MTU3_DR_FORCE_NONE:
-		value &= ~(SSUSB_U2_PORT_FORCE_IDDIG | SSUSB_U2_PORT_RG_IDDIG);
-		break;
-	default:
-		return;
-	}
-	mtu3_writel(ssusb->ippc_base, SSUSB_U2_CTRL(0), value);
-}
-
-static int ssusb_role_sw_set(struct device *dev, enum usb_role role)
-{
-	struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
-	struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-	bool id_event, vbus_event;
-
-	dev_info(dev, "role_sw_set role %d\n", role);
-
-	otg_sx->latest_role = role;
-
-	if (otg_sx->op_mode != MTU3_DR_OPERATION_NORMAL) {
-		dev_info(dev, "op_mode %d, skip set role\n", otg_sx->op_mode);
-		return 0;
-	}
-
-	id_event = (role == USB_ROLE_HOST);
-	vbus_event = (role == USB_ROLE_DEVICE);
-
-	if (!!(otg_sx->sw_state & MTU3_SW_VBUS_VALID) ^ vbus_event) {
-		if (vbus_event) {
-			if (ssusb->clk_mgr) {
-				switch_port_to_on(ssusb, true);
-				switch_port_to_device(ssusb);
-			}
-			ssusb_set_mailbox(otg_sx, MTU3_VBUS_VALID);
-		} else {
-			ssusb_set_mailbox(otg_sx, MTU3_VBUS_OFF);
-			if (ssusb->clk_mgr)
-				switch_port_to_on(ssusb, false);
-		}
-	}
-
-	if (!!(otg_sx->sw_state & MTU3_SW_ID_GROUND) ^ id_event) {
-		if (id_event) {
-			if (ssusb->clk_mgr) {
-				pm_stay_awake(ssusb->dev);
-				switch_port_to_on(ssusb, true);
-				ssusb_host_enable(ssusb);
-				/* register host driver */
-				of_platform_populate(dev->of_node,
-						NULL, NULL, dev);
-			}
-			ssusb_set_force_mode(ssusb, MTU3_DR_FORCE_HOST);
-			ssusb_set_mailbox(otg_sx, MTU3_ID_GROUND);
-		} else {
-			/* FIXME: debounce time for xhci finish disconnection */
-			mdelay(200);
-			ssusb_set_force_mode(ssusb, MTU3_DR_FORCE_DEVICE);
-			if (ssusb->clk_mgr) {
-				/* unregister host driver */
-				of_platform_depopulate(dev);
-				ssusb_set_mailbox(otg_sx, MTU3_ID_FLOAT);
-				switch_port_to_on(ssusb, false);
-				pm_relax(ssusb->dev);
-			} else
-				ssusb_set_mailbox(otg_sx, MTU3_ID_FLOAT);
-		}
-	}
-
-	return 0;
-}
-
-static enum usb_role ssusb_role_sw_get(struct device *dev)
-{
-	struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
-	enum usb_role role;
-
-	role = ssusb->is_host ? USB_ROLE_HOST : USB_ROLE_DEVICE;
-
-	return role;
-}
-
-static int ssusb_role_sw_register(struct otg_switch_mtk *otg_sx)
-{
-	struct usb_role_switch_desc role_sx_desc = { 0 };
-	struct ssusb_mtk *ssusb =
-		container_of(otg_sx, struct ssusb_mtk, otg_switch);
-
-	if (!otg_sx->role_sw_used)
-		return 0;
-
-	role_sx_desc.set = ssusb_role_sw_set;
-	role_sx_desc.get = ssusb_role_sw_get;
-	otg_sx->role_sw = usb_role_switch_register(ssusb->dev, &role_sx_desc);
-
-	if (IS_ERR(otg_sx->role_sw))
-		return PTR_ERR(otg_sx->role_sw);
-
-	/* default to role none */
-	ssusb_role_sw_set(ssusb->dev, USB_ROLE_NONE);
-
-	return 0;
-}
-
-
-static ssize_t cmode_store(struct device *dev,
-				 struct device_attribute *attr,
-				 const char *buf, size_t count)
-{
-	struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
-	struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-	enum usb_role role = otg_sx->latest_role;
-	int mode;
-
-	if (kstrtoint(buf, 10, &mode))
-		return -EINVAL;
-
-	dev_info(dev, "store cmode %d op_mode %d\n", mode, otg_sx->op_mode);
-
-	if (otg_sx->op_mode != mode) {
-		/* set switch role */
-		switch (mode) {
-		case MTU3_DR_OPERATION_NONE:
-			otg_sx->latest_role = USB_ROLE_NONE;
-			break;
-		case MTU3_DR_OPERATION_NORMAL:
-			/* switch usb role to latest role */
-			break;
-		case MTU3_DR_OPERATION_HOST:
-			otg_sx->latest_role = USB_ROLE_HOST;
-			break;
-		case MTU3_DR_OPERATION_DEVICE:
-			otg_sx->latest_role = USB_ROLE_DEVICE;
-			break;
-		default:
-			return -EINVAL;
-		}
-		/* switch operation mode to normal temporarily */
-		otg_sx->op_mode = MTU3_DR_OPERATION_NORMAL;
-		/* switch usb role */
-		ssusb_role_sw_set(ssusb->dev, otg_sx->latest_role);
-		/* update operation mode */
-		otg_sx->op_mode = mode;
-		/* restore role */
-		otg_sx->latest_role = role;
-	}
-
-	return count;
-}
-
-static ssize_t cmode_show(struct device *dev,
-				struct device_attribute *attr,
-				char *buf)
-{
-	struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
-	struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-
-	return sprintf(buf, "%d\n", otg_sx->op_mode);
-}
-static DEVICE_ATTR_RW(cmode);
-
-static struct attribute *ssusb_dr_attrs[] = {
-	&dev_attr_cmode.attr,
-	NULL
-};
-
-static const struct attribute_group ssusb_dr_group = {
-	.attrs = ssusb_dr_attrs,
-};
-
-int ssusb_otg_switch_init(struct ssusb_mtk *ssusb)
-{
-	struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-	int ret = 0;
-
-	INIT_WORK(&otg_sx->id_work, ssusb_id_work);
-	INIT_WORK(&otg_sx->vbus_work, ssusb_vbus_work);
-
-	/* default as host, update state */
-	otg_sx->sw_state = ssusb->is_host ?
-				MTU3_SW_ID_GROUND : MTU3_SW_VBUS_VALID;
-	/* initial operation mode */
-	otg_sx->op_mode = MTU3_DR_OPERATION_NORMAL;
-
-	ret = sysfs_create_group(&ssusb->dev->kobj, &ssusb_dr_group);
-	if (ret)
-		dev_info(ssusb->dev, "error creating sysfs attributes\n");
-
-	if (otg_sx->manual_drd_enabled)
-		ssusb_dr_debugfs_init(ssusb);
-	else if (otg_sx->role_sw_used)
-		ret = ssusb_role_sw_register(otg_sx);
-	else
-		ret = ssusb_extcon_register(otg_sx);
-
-	return ret;
-}
-
-void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb)
-{
-	struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-
-	cancel_work_sync(&otg_sx->id_work);
-	cancel_work_sync(&otg_sx->vbus_work);
-	usb_role_switch_unregister(otg_sx->role_sw);
-	sysfs_remove_group(&ssusb->dev->kobj, &ssusb_dr_group);
-}
diff --git a/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_plat.c b/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_plat.c
index 3005550..7c5bd7a 100644
--- a/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_plat.c
+++ b/src/kernel/linux/v4.19/drivers/usb/mtu3/mtu3_plat.c
@@ -165,19 +165,24 @@
 int ssusb_phy_power_on(struct ssusb_mtk *ssusb)
 {
 	int i;
-	int ret;
+	int ret = 0;
 
+	mutex_lock(&ssusb->mutex);
+	if (ssusb->power_status)
+		goto power_on_phy;
 	for (i = 0; i < ssusb->num_phys; i++) {
 		ret = phy_power_on(ssusb->phys[i]);
 		if (ret)
 			goto power_off_phy;
 	}
-	return 0;
+	ssusb->power_status = true;
+	goto power_on_phy;
 
 power_off_phy:
 	for (; i > 0; i--)
 		phy_power_off(ssusb->phys[i - 1]);
-
+power_on_phy:
+	mutex_unlock(&ssusb->mutex);
 	return ret;
 }
 
@@ -185,8 +190,15 @@
 {
 	unsigned int i;
 
+	mutex_lock(&ssusb->mutex);
+	if (!ssusb->power_status)
+		goto power_off_phy;
+
 	for (i = 0; i < ssusb->num_phys; i++)
 		phy_power_off(ssusb->phys[i]);
+	ssusb->power_status = false;
+power_off_phy:
+	mutex_unlock(&ssusb->mutex);
 }
 
 int ssusb_clks_enable(struct ssusb_mtk *ssusb)
@@ -708,6 +720,11 @@
 	pm_runtime_get_sync(dev);
 	device_enable_async_suspend(dev);
 
+	mutex_init(&ssusb->mutex);
+	mutex_lock(&ssusb->mutex);
+	ssusb->power_status = false;
+	mutex_unlock(&ssusb->mutex);
+
 	ret = ssusb_rscs_init(ssusb);
 	if (ret)
 		goto comm_init_err;
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/common/mtk-afe-platform-driver.c b/src/kernel/linux/v4.19/sound/soc/mediatek/common/mtk-afe-platform-driver.c
index e1b5275..fe4f944 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/common/mtk-afe-platform-driver.c
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/common/mtk-afe-platform-driver.c
@@ -96,16 +96,26 @@
 /*
 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 	struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
-	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
-	struct mtk_base_afe_memif *memif = &afe->memif[rtd->cpu_dai->id];
-	const struct mtk_base_memif_data *memif_data = memif->data;
-	struct regmap *regmap = afe->regmap;
-	struct device *dev = afe->dev;
-	int reg_ofs_base = memif_data->reg_ofs_base;
-	int reg_ofs_cur = memif_data->reg_ofs_cur;
+	struct mtk_base_afe *afe;
+	struct mtk_base_afe_memif *memif;
+	const struct mtk_base_memif_data *memif_data;
+	struct regmap *regmap;
+	struct device *dev;
+	int reg_ofs_base;
+	int reg_ofs_cur;
 	unsigned int hw_ptr = 0, hw_base = 0;
 	int ret, pcm_ptr_bytes;
 
+	if (component == NULL)
+		return -EINVAL;
+	afe = snd_soc_component_get_drvdata(component);
+	memif = &afe->memif[rtd->cpu_dai->id];
+	memif_data = memif->data;
+	regmap = afe->regmap;
+	dev = afe->dev;
+	reg_ofs_base = memif_data->reg_ofs_base;
+	reg_ofs_cur = memif_data->reg_ofs_cur;
+
 	ret = regmap_read(regmap, reg_ofs_cur, &hw_ptr);
 	if (ret || hw_ptr == 0) {
 		dev_err(dev, "%s hw_ptr err\n", __func__);
@@ -136,9 +146,13 @@
 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 	struct snd_soc_component *component =
 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
-	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
-	struct mtk_base_afe_memif *memif = &afe->memif[rtd->cpu_dai->id];
+	struct mtk_base_afe *afe;
+	struct mtk_base_afe_memif *memif;
 
+	if (component == NULL)
+		return -EINVAL;
+	afe = snd_soc_component_get_drvdata(component);
+	memif = &afe->memif[rtd->cpu_dai->id];
 	if (!memif->ack_enable)
 		return 0;
 
@@ -163,8 +177,11 @@
 	size_t size;
 	struct snd_pcm *pcm = rtd->pcm;
 	struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
-	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
+	struct mtk_base_afe *afe;
 
+	if (component == NULL)
+		return -EINVAL;
+	afe = snd_soc_component_get_drvdata(component);
 	size = afe->mtk_afe_hardware->buffer_bytes_max;
 	return snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
 						     afe->dev,
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-common.h b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-common.h
index 7c083db..0fed739 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-common.h
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-common.h
@@ -47,6 +47,7 @@
 	MT6880_DAI_HW_GAIN_2,
 	MT6880_DAI_SRC_1,
 	MT6880_DAI_SRC_2,
+	MT6880_DAI_PCM_0,
 	MT6880_DAI_PCM_1,
 	MT6880_DAI_PCM_2,
 	MT6880_DAI_TDM,
@@ -59,6 +60,7 @@
 	MT6880_DAI_HOSTLESS_IMPEDANCE,
 	MT6880_DAI_HOSTLESS_SRC_1,	/* just an exmpale */
 	MT6880_DAI_HOSTLESS_SRC_BARGEIN,
+	MT6880_DAI_HOSTLESS_SPEECH_BT,
 	MT6880_DAI_HOSTLESS_UL1,
 	MT6880_DAI_HOSTLESS_UL2,
 	MT6880_DAI_HOSTLESS_UL3,
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-control.c b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-control.c
index ad2b66b..35c3a4f 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-control.c
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-control.c
@@ -139,6 +139,7 @@
 	case MT6880_MEMIF_DAI:
 	case MT6880_MEMIF_MOD_DAI:
 		return dai_memif_rate_transform(dev, rate);
+	case MT6880_DAI_PCM_0:
 	case MT6880_DAI_PCM_1:
 	case MT6880_DAI_PCM_2:
 		return pcm_rate_transform(dev, rate);
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-gpio.c b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-gpio.c
index abca788..ce742a3 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-gpio.c
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-gpio.c
@@ -33,6 +33,10 @@
 	MT6880_AFE_GPIO_TDM_ON,
 	MT6880_AFE_GPIO_EXTAMP_HIGH,
 	MT6880_AFE_GPIO_EXTAMP_LOW,
+	MT6880_AFE_GPIO_PCM0_OFF,
+	MT6880_AFE_GPIO_PCM0_ON,
+	MT6880_AFE_GPIO_PCM1_OFF,
+	MT6880_AFE_GPIO_PCM1_ON,
 	MT6880_AFE_GPIO_GPIO_NUM
 };
 
@@ -63,6 +67,10 @@
 	[MT6880_AFE_GPIO_TDM_ON] = {"aud_gpio_tdm_on", false, NULL},
 	[MT6880_AFE_GPIO_EXTAMP_HIGH] = {"extamp-pullhigh", false, NULL},
 	[MT6880_AFE_GPIO_EXTAMP_LOW] = {"extamp-pulllow", false, NULL},
+	[MT6880_AFE_GPIO_PCM0_OFF] = {"aud_gpio_pcm0_off", false, NULL},
+	[MT6880_AFE_GPIO_PCM0_ON] = {"aud_gpio_pcm0_on", false, NULL},
+	[MT6880_AFE_GPIO_PCM1_OFF] = {"aud_gpio_pcm1_off", false, NULL},
+	[MT6880_AFE_GPIO_PCM1_ON] = {"aud_gpio_pcm1_on", false, NULL},
 };
 
 static DEFINE_MUTEX(gpio_request_mutex);
@@ -186,6 +194,18 @@
 		else
 			mt6880_afe_gpio_select(afe, MT6880_AFE_GPIO_EXTAMP_LOW);
 		break;
+	case MT6880_DAI_PCM_0:
+		if (enable)
+			mt6880_afe_gpio_select(afe, MT6880_AFE_GPIO_PCM0_ON);
+		else
+			mt6880_afe_gpio_select(afe, MT6880_AFE_GPIO_PCM0_OFF);
+		break;
+	case MT6880_DAI_PCM_1:
+		if (enable)
+			mt6880_afe_gpio_select(afe, MT6880_AFE_GPIO_PCM1_ON);
+		else
+			mt6880_afe_gpio_select(afe, MT6880_AFE_GPIO_PCM1_OFF);
+		break;
 	default:
 		mutex_unlock(&gpio_request_mutex);
 		dev_warn(afe->dev, "%s(), invalid dai %d\n", __func__, dai);
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-pcm.c b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-pcm.c
index f1bed72..b21df5e 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-pcm.c
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-afe-pcm.c
@@ -885,6 +885,10 @@
 				    I_ADDA_UL_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("ETDM_CAP_CH1", AFE_CONN9,
 				    I_ETDM_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN9,
+				    I_PCM_0_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN9,
+				    I_PCM_1_CAP_CH1, 1, 0),
 };
 
 static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {
@@ -892,6 +896,10 @@
 				    I_ADDA_UL_CH2, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("ETDM_CAP_CH1", AFE_CONN10,
 				    I_ETDM_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN10_1,
+				    I_PCM_0_CAP_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN10,
+				    I_PCM_1_CAP_CH2, 1, 0),
 };
 
 static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {
@@ -907,6 +915,8 @@
 				    I_DL3_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN5_1,
 				    I_DL4_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN5_1,
+				    I_PCM_0_CAP_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN5,
 				    I_PCM_1_CAP_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN5,
@@ -936,8 +946,10 @@
 				    I_DL3_CH2, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN6_1,
 				    I_DL4_CH1, 1, 0),
-	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN6,
-				    I_PCM_1_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN6_1,
+				    I_PCM_0_CAP_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN6,
+				    I_PCM_1_CAP_CH2, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN6,
 				    I_PCM_2_CAP_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2", AFE_CONN6,
@@ -959,15 +971,23 @@
 				    I_DL1_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN32,
 				    I_DL2_CH1, 1, 0),
-	SOC_DAPM_SINGLE_AUTODISABLE("I2S6_CH3", AFE_CONN6,
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S6_CH3", AFE_CONN32_1,
 					I_I2S6_CH3, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN32_1,
+				    I_PCM_0_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN32,
+				    I_PCM_1_CAP_CH1, 1, 0),
 };
 
 static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {
 	SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2", AFE_CONN33_1,
 				    I_CONNSYS_I2S_CH2, 1, 0),
-	SOC_DAPM_SINGLE_AUTODISABLE("I2S6_CH4", AFE_CONN6,
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S6_CH4", AFE_CONN33_1,
 					I_I2S6_CH4, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN33_1,
+				    I_PCM_0_CAP_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN33,
+				    I_PCM_1_CAP_CH2, 1, 0),
 };
 
 static const struct snd_kcontrol_new memif_ul4_ch1_mix[] = {
@@ -1049,11 +1069,27 @@
 				    I_PCM_2_CAP_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("ETDM_CAP_CH1", AFE_CONN12,
 				    I_ETDM_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1", AFE_CONN12,
+				    I_I2S0_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1", AFE_CONN12,
+				    I_I2S2_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN12_1,
+				    I_PCM_0_CAP_CH1, 1, 0),
 };
 
 static const struct snd_kcontrol_new memif_ul_mono_2_mix[] = {
-	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN11,
-				    I_ADDA_UL_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN11,
+				    I_PCM_1_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN11,
+				    I_PCM_2_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("ETDM_CAP_CH1", AFE_CONN11,
+				    I_ETDM_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1", AFE_CONN11,
+				    I_I2S0_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1", AFE_CONN11,
+				    I_I2S2_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN11_1,
+				    I_PCM_0_CAP_CH1, 1, 0),
 };
 
 static const struct snd_kcontrol_new memif_ul_mono_3_mix[] = {
@@ -1121,9 +1157,14 @@
 	{"UL1", NULL, "UL1_CH2"},
 	{"UL1_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
 	{"UL1_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},
-	
+
 	{"UL1_CH1", "ETDM_CAP_CH1", "ETDM Capture"},
 	{"UL1_CH2", "ETDM_CAP_CH1", "ETDM Capture"},
+	{"UL1_CH1", "PCM_0_CAP_CH1", "PCM 0 Capture"},
+	{"UL1_CH2", "PCM_0_CAP_CH2", "PCM 0 Capture"},
+	{"UL1_CH1", "PCM_1_CAP_CH1", "PCM 1 Capture"},
+	{"UL1_CH2", "PCM_1_CAP_CH2", "PCM 1 Capture"},
+
 
 	{"UL2", NULL, "UL2_CH1"},
 	{"UL2", NULL, "UL2_CH2"},
@@ -1151,18 +1192,28 @@
 	{"UL2_CH1", "I2S6_CH1", "I2S6"},
 	{"UL2_CH2", "I2S6_CH2", "I2S6"},
 
+	{"UL2_CH1", "PCM_0_CAP_CH1", "PCM 0 Capture"},
+	{"UL2_CH2", "PCM_0_CAP_CH2", "PCM 0 Capture"},
 	{"UL2_CH1", "PCM_1_CAP_CH1", "PCM 1 Capture"},
-	{"UL2_CH2", "PCM_1_CAP_CH1", "PCM 1 Capture"},
+	{"UL2_CH2", "PCM_1_CAP_CH2", "PCM 1 Capture"},
 	{"UL2_CH1", "PCM_2_CAP_CH1", "PCM 2 Capture"},
 	{"UL2_CH2", "PCM_2_CAP_CH1", "PCM 2 Capture"},
 
 	{"UL_MONO_1", NULL, "UL_MONO_1_CH1"},
+	{"UL_MONO_1_CH1", "PCM_0_CAP_CH1", "PCM 0 Capture"},
 	{"UL_MONO_1_CH1", "PCM_1_CAP_CH1", "PCM 1 Capture"},
 	{"UL_MONO_1_CH1", "PCM_2_CAP_CH1", "PCM 2 Capture"},
 	{"UL_MONO_1_CH1", "ETDM_CAP_CH1", "ETDM Capture"},
+	{"UL_MONO_1_CH1", "I2S0_CH1", "I2S0"},
+	{"UL_MONO_1_CH1", "I2S2_CH1", "I2S2"},
 
 	{"UL_MONO_2", NULL, "UL_MONO_2_CH1"},
-	{"UL_MONO_2_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
+	{"UL_MONO_2_CH1", "PCM_0_CAP_CH1", "PCM 0 Capture"},
+	{"UL_MONO_2_CH1", "PCM_1_CAP_CH1", "PCM 1 Capture"},
+	{"UL_MONO_2_CH1", "PCM_2_CAP_CH1", "PCM 2 Capture"},
+	{"UL_MONO_2_CH1", "ETDM_CAP_CH1", "ETDM Capture"},
+	{"UL_MONO_2_CH1", "I2S0_CH1", "I2S0"},
+	{"UL_MONO_2_CH1", "I2S2_CH1", "I2S2"},
 
 	{"UL_MONO_3", NULL, "UL_MONO_3_CH1"},
 	{"UL_MONO_3_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},
@@ -1179,6 +1230,10 @@
 	{"UL3_CH2", "CONNSYS_I2S_CH2", "Connsys I2S"},
 	{"UL3_CH1", "I2S6_CH3", "I2S6"},
 	{"UL3_CH2", "I2S6_CH4", "I2S6"},
+	{"UL3_CH1", "PCM_0_CAP_CH1", "PCM 0 Capture"},
+	{"UL3_CH2", "PCM_0_CAP_CH2", "PCM 0 Capture"},
+	{"UL3_CH1", "PCM_1_CAP_CH1", "PCM 1 Capture"},
+	{"UL3_CH2", "PCM_1_CAP_CH2", "PCM 1 Capture"},
 
 	{"UL4", NULL, "UL4_CH1"},
 	{"UL4", NULL, "UL4_CH2"},
@@ -2901,6 +2956,12 @@
 	regmap_read(afe->regmap, AFE_SRAM_DELSEL_CON3, &value);
 	n += scnprintf(buffer + n, size - n,
 		       "AFE_SRAM_DELSEL_CON3 = 0x%x\n", value);
+	regmap_read(afe->regmap, PCM0_INTF_CON1, &value);
+	n += scnprintf(buffer + n, size - n,
+		       "PCM0_INTF_CON1 = 0x%x\n", value);
+	regmap_read(afe->regmap, PCM0_INTF_CON2, &value);
+	n += scnprintf(buffer + n, size - n,
+		       "PCM0_INTF_CON2 = 0x%x\n", value);
 	regmap_read(afe->regmap, PCM_INTF_CON1, &value);
 	n += scnprintf(buffer + n, size - n,
 		       "PCM_INTF_CON1 = 0x%x\n", value);
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-etdm.c b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-etdm.c
index d27a041..c6a87b7 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-etdm.c
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-etdm.c
@@ -201,10 +201,16 @@
 				    I_ADDA_UL_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN2,
 				    I_PCM_1_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN2,
+				    I_PCM_1_CAP_CH2, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN2,
 				    I_PCM_2_CAP_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN2,
 				    I_PCM_2_CAP_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN2_1,
+				    I_PCM_0_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN2_1,
+				    I_PCM_0_CAP_CH2, 1, 0),
 };
 
 enum {
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-hostless.c b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-hostless.c
index 92a433d..d021f58 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-hostless.c
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-hostless.c
@@ -33,12 +33,6 @@
 	{"Hostless LPBK UL", NULL, "ADDA_UL_Mux"},
 
 	/* Hostless Speech */
-	{"ADDA_DL_CH1", "PCM_1_CAP_CH1", "Hostless Speech DL"},
-	{"ADDA_DL_CH2", "PCM_1_CAP_CH1", "Hostless Speech DL"},
-	{"ADDA_DL_CH2", "PCM_1_CAP_CH2", "Hostless Speech DL"},
-	{"ADDA_DL_CH1", "PCM_2_CAP_CH1", "Hostless Speech DL"},
-	{"ADDA_DL_CH2", "PCM_2_CAP_CH1", "Hostless Speech DL"},
-	{"ADDA_DL_CH2", "PCM_2_CAP_CH2", "Hostless Speech DL"},
 	{"ETDM_PB_CH1", "PCM_2_CAP_CH1", "Hostless Speech DL"},
 	{"ETDM_PB_CH1", "PCM_2_CAP_CH2", "Hostless Speech DL"},
 	{"I2S1_CH1", "PCM_1_CAP_CH1", "Hostless Speech DL"},
@@ -59,26 +53,40 @@
 	{"I2S5_CH1", "PCM_2_CAP_CH1", "Hostless Speech DL"},
 	{"I2S5_CH2", "PCM_2_CAP_CH1", "Hostless Speech DL"},
 	{"I2S5_CH2", "PCM_2_CAP_CH2", "Hostless Speech DL"},
-	{"PCM_1_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
-	{"PCM_1_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
-	{"PCM_2_PB_CH1", "ADDA_UL_CH1", "Hostless Speech DL"},
-	{"PCM_2_PB_CH2", "ADDA_UL_CH2", "Hostless Speech DL"},
+	{"PCM_0_PB_CH1", "PCM_2_CAP_CH1", "Hostless Speech DL"},
+	{"PCM_0_PB_CH2", "PCM_2_CAP_CH1", "Hostless Speech DL"},
+	{"PCM_1_PB_CH1", "PCM_2_CAP_CH1", "Hostless Speech DL"},
+	{"PCM_1_PB_CH2", "PCM_2_CAP_CH1", "Hostless Speech DL"},
+
 	{"PCM_2_PB_CH1", "ETDM_CAP_CH1", "Hostless Speech DL"},
 	{"PCM_2_PB_CH2", "ETDM_CAP_CH1", "Hostless Speech DL"},
 	{"PCM_2_PB_CH1", "I2S0_CH1", "Hostless Speech DL"},
 	{"PCM_2_PB_CH2", "I2S0_CH2", "Hostless Speech DL"},
+	{"PCM_2_PB_CH1", "I2S2_CH1", "Hostless Speech DL"},
+	{"PCM_2_PB_CH2", "I2S2_CH2", "Hostless Speech DL"},
 
 	{"Hostless Speech UL", NULL, "PCM 1 Capture"},
 	{"Hostless Speech UL", NULL, "PCM 2 Capture"},
 	/*{"Hostless Speech UL", NULL, "ADDA_UL_Mux"},*/
-	{"Hostless Speech UL", NULL, "ETDM Capture"},
+	/*{"Hostless Speech UL", NULL, "ETDM Capture"},*/
 	{"Hostless Speech UL", NULL, "I2S0"},
-	/* Hostless_Sph_Echo_Ref_DAI */
-	{"PCM_1_PB_CH4", "I2S0_CH1", "Hostless_Sph_Echo_Ref_DL"},
-	{"PCM_1_PB_CH4", "I2S0_CH2", "Hostless_Sph_Echo_Ref_DL"},
-	{"PCM_1_PB_CH4", "I2S2_CH1", "Hostless_Sph_Echo_Ref_DL"},
-	{"PCM_1_PB_CH4", "I2S2_CH2", "Hostless_Sph_Echo_Ref_DL"},
 
+	/* Hostless Speech_BT */
+	{"PCM_0_PB_CH1", "PCM_2_CAP_CH1", "Hostless Speech_BT DL"},
+	{"PCM_0_PB_CH2", "PCM_2_CAP_CH1", "Hostless Speech_BT DL"},
+	{"PCM_1_PB_CH1", "PCM_2_CAP_CH1", "Hostless Speech_BT DL"},
+	{"PCM_1_PB_CH1", "PCM_2_CAP_CH1", "Hostless Speech_BT DL"},
+
+	{"PCM_2_PB_CH1", "PCM_0_CAP_CH1", "Hostless Speech_BT DL"},
+	{"PCM_2_PB_CH2", "PCM_0_CAP_CH2", "Hostless Speech_BT DL"},
+	{"PCM_2_PB_CH1", "PCM_1_CAP_CH1", "Hostless Speech_BT DL"},
+	{"PCM_2_PB_CH2", "PCM_1_CAP_CH2", "Hostless Speech_BT DL"},
+
+	{"Hostless Speech_BT UL", NULL, "PCM 0 Capture"},
+	{"Hostless Speech_BT UL", NULL, "PCM 1 Capture"},
+	{"Hostless Speech_BT UL", NULL, "PCM 2 Capture"},
+
+	/* Hostless_Sph_Echo_Ref_DAI */
 	{"PCM_2_PB_CH4", "I2S0_CH1", "Hostless_Sph_Echo_Ref_DL"},
 	{"PCM_2_PB_CH4", "I2S0_CH2", "Hostless_Sph_Echo_Ref_DL"},
 	{"PCM_2_PB_CH4", "I2S2_CH1", "Hostless_Sph_Echo_Ref_DL"},
@@ -309,6 +317,25 @@
 		},
 		.ops = &mtk_dai_hostless_ops,
 	},
+	{
+		.name = "Hostless Speech_BT DAI",
+		.id = MT6880_DAI_HOSTLESS_SPEECH_BT,
+		.playback = {
+			.stream_name = "Hostless Speech_BT DL",
+			.channels_min = 1,
+			.channels_max = 2,
+			.rates = MTK_HOSTLESS_RATES,
+			.formats = MTK_HOSTLESS_FORMATS,
+		},
+		.capture = {
+			.stream_name = "Hostless Speech_BT UL",
+			.channels_min = 1,
+			.channels_max = 2,
+			.rates = MTK_HOSTLESS_RATES,
+			.formats = MTK_HOSTLESS_FORMATS,
+		},
+		.ops = &mtk_dai_hostless_ops,
+	},
 	/* BE dai */
 	{
 		.name = "Hostless_UL1 DAI",
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-pcm.c b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-pcm.c
index 1bce229..1b66071 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-pcm.c
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-dai-pcm.c
@@ -7,6 +7,7 @@
 #include <linux/regmap.h>
 #include <sound/pcm_params.h>
 #include "mt6880-afe-common.h"
+#include "mt6880-afe-gpio.h"
 #include "mt6880-interconnection.h"
 
 enum AUD_TX_LCH_RPT {
@@ -77,7 +78,67 @@
 	AUD_PCM_EN_ENABLE = 1
 };
 
+struct mtk_afe_pcm_priv {
+	int id;
+	int rate;
+};
+
+static int get_pcm_id_by_name(struct mtk_base_afe *afe,
+			      const char *name)
+{
+	if (strncmp(name, "PCM_0", 5) == 0)
+		return MT6880_DAI_PCM_0;
+	else if (strncmp(name, "PCM_1", 5) == 0)
+		return MT6880_DAI_PCM_1;
+	else if (strncmp(name, "PCM_2", 5) == 0)
+		return MT6880_DAI_PCM_2;
+	else
+		return -EINVAL;
+}
+
+static struct mtk_afe_pcm_priv *get_pcm_priv_by_name(struct mtk_base_afe *afe,
+						     const char *name)
+{
+	struct mt6880_afe_private *afe_priv = afe->platform_priv;
+	int dai_id = get_pcm_id_by_name(afe, name);
+
+	if (dai_id < 0)
+		return NULL;
+
+	return afe_priv->dai_priv[dai_id];
+}
+
 /* dai component */
+static const struct snd_kcontrol_new mtk_pcm_0_playback_ch1_mix[] = {
+	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN56,
+				    I_DL1_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN56,
+				    I_DL2_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("ETDM_CAP_CH1", AFE_CONN56,
+				    I_ETDM_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1", AFE_CONN56,
+				    I_I2S0_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1", AFE_CONN56,
+				    I_I2S2_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN56,
+				    I_PCM_2_CAP_CH1, 1, 0),
+};
+
+static const struct snd_kcontrol_new mtk_pcm_0_playback_ch2_mix[] = {
+	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN57,
+				    I_DL1_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN57,
+				    I_DL2_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("ETDM_CAP_CH1", AFE_CONN57,
+				    I_ETDM_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2", AFE_CONN57,
+				    I_I2S0_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2", AFE_CONN57,
+				    I_I2S2_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN56,
+				    I_PCM_2_CAP_CH1, 1, 0),
+};
+
 static const struct snd_kcontrol_new mtk_pcm_1_playback_ch1_mix[] = {
 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN7,
 				    I_ADDA_UL_CH1, 1, 0),
@@ -85,6 +146,12 @@
 				    I_DL2_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("ETDM_CAP_CH1", AFE_CONN7,
 				    I_ETDM_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1", AFE_CONN57,
+				    I_I2S0_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1", AFE_CONN57,
+				    I_I2S2_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN57,
+					I_PCM_2_CAP_CH1, 1, 0),
 };
 
 static const struct snd_kcontrol_new mtk_pcm_1_playback_ch2_mix[] = {
@@ -92,19 +159,12 @@
 				    I_ADDA_UL_CH2, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN8,
 				    I_DL2_CH2, 1, 0),
-};
-
-static const struct snd_kcontrol_new mtk_pcm_1_playback_ch4_mix[] = {
-	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1", AFE_CONN27,
-				    I_I2S0_CH1, 1, 0),
-	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2", AFE_CONN27,
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2", AFE_CONN8,
 				    I_I2S0_CH2, 1, 0),
-	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN27,
-				    I_DL1_CH1, 1, 0),
-	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1", AFE_CONN27,
-				    I_I2S2_CH1, 1, 0),
-	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2", AFE_CONN27,
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2", AFE_CONN8,
 				    I_I2S2_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN8,
+					I_PCM_2_CAP_CH1, 1, 0),
 };
 
 static const struct snd_kcontrol_new mtk_pcm_2_playback_ch1_mix[] = {
@@ -116,6 +176,12 @@
 				    I_ETDM_CAP_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1", AFE_CONN17,
 				    I_I2S0_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1", AFE_CONN17,
+				    I_I2S2_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH1", AFE_CONN17_1,
+				    I_PCM_0_CAP_CH1, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN17,
+				    I_PCM_1_CAP_CH1, 1, 0),
 };
 
 static const struct snd_kcontrol_new mtk_pcm_2_playback_ch2_mix[] = {
@@ -127,6 +193,12 @@
 				    I_ETDM_CAP_CH1, 1, 0),
 	SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2", AFE_CONN18,
 				    I_I2S0_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2", AFE_CONN18,
+				    I_I2S2_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_0_CAP_CH2", AFE_CONN18_1,
+				    I_PCM_0_CAP_CH2, 1, 0),
+	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN18,
+				    I_PCM_1_CAP_CH2, 1, 0),
 };
 
 static const struct snd_kcontrol_new mtk_pcm_2_playback_ch4_mix[] = {
@@ -148,29 +220,49 @@
 {
 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
+	struct mtk_afe_pcm_priv *pcm_priv;
+
+	pcm_priv = get_pcm_priv_by_name(afe, w->name);
+
+	if (!pcm_priv) {
+		dev_warn(afe->dev, "%s(), pcm_priv == NULL", __func__);
+		return 0;
+	}
 
 	dev_info(afe->dev, "%s(), name %s, event 0x%x\n",
 		 __func__, w->name, event);
 
-	if(event == SND_SOC_DAPM_PRE_PMU) {
-		device_init_wakeup(afe->dev, true);
-	} else {
-		device_init_wakeup(afe->dev, false);
+	switch (event) {
+	case SND_SOC_DAPM_PRE_PMU:
+		if (strcmp(w->name, "PCM_2_EN") == 0)
+			device_init_wakeup(afe->dev, true);
+		mt6880_afe_gpio_request(afe, true, pcm_priv->id, 0);
+		break;
+	case SND_SOC_DAPM_POST_PMD:
+		if (strcmp(w->name, "PCM_2_EN") == 0)
+			device_init_wakeup(afe->dev, false);
+		mt6880_afe_gpio_request(afe, false, pcm_priv->id, 0);
+		break;
+	default:
+		break;
 	}
 	return 0;
 }
 
 static const struct snd_soc_dapm_widget mtk_dai_pcm_widgets[] = {
 	/* inter-connections */
+	SND_SOC_DAPM_MIXER("PCM_0_PB_CH1", SND_SOC_NOPM, 0, 0,
+			   mtk_pcm_0_playback_ch1_mix,
+			   ARRAY_SIZE(mtk_pcm_0_playback_ch1_mix)),
+	SND_SOC_DAPM_MIXER("PCM_0_PB_CH2", SND_SOC_NOPM, 0, 0,
+			   mtk_pcm_0_playback_ch2_mix,
+			   ARRAY_SIZE(mtk_pcm_0_playback_ch2_mix)),
 	SND_SOC_DAPM_MIXER("PCM_1_PB_CH1", SND_SOC_NOPM, 0, 0,
 			   mtk_pcm_1_playback_ch1_mix,
 			   ARRAY_SIZE(mtk_pcm_1_playback_ch1_mix)),
 	SND_SOC_DAPM_MIXER("PCM_1_PB_CH2", SND_SOC_NOPM, 0, 0,
 			   mtk_pcm_1_playback_ch2_mix,
 			   ARRAY_SIZE(mtk_pcm_1_playback_ch2_mix)),
-	SND_SOC_DAPM_MIXER("PCM_1_PB_CH4", SND_SOC_NOPM, 0, 0,
-			   mtk_pcm_1_playback_ch4_mix,
-			   ARRAY_SIZE(mtk_pcm_1_playback_ch4_mix)),
 	SND_SOC_DAPM_MIXER("PCM_2_PB_CH1", SND_SOC_NOPM, 0, 0,
 			   mtk_pcm_2_playback_ch1_mix,
 			   ARRAY_SIZE(mtk_pcm_2_playback_ch1_mix)),
@@ -181,46 +273,67 @@
 			   mtk_pcm_2_playback_ch4_mix,
 			   ARRAY_SIZE(mtk_pcm_2_playback_ch4_mix)),
 
-	SND_SOC_DAPM_SUPPLY("PCM_1_EN",
+	SND_SOC_DAPM_SUPPLY("PCM_0_EN",
 			    PCM0_INTF_CON1, PCM_EN_SFT, 0,
 			    mtk_pcm_en_event,
 			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 
+	SND_SOC_DAPM_SUPPLY("PCM_1_EN",
+			    PCM_INTF_CON1, PCM_EN_SFT, 0,
+			    mtk_pcm_en_event,
+			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+
 	SND_SOC_DAPM_SUPPLY("PCM_2_EN",
 			    PCM2_INTF_CON, PCM2_EN_SFT, 0,
 			    mtk_pcm_en_event,
 			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 
 	SND_SOC_DAPM_INPUT("MD1_TO_AFE"),
-	SND_SOC_DAPM_INPUT("MD2_TO_AFE"),
+	SND_SOC_DAPM_INPUT("BT1_TO_AFE"),
+	SND_SOC_DAPM_INPUT("BT0_TO_AFE"),
 	SND_SOC_DAPM_OUTPUT("AFE_TO_MD1"),
-	SND_SOC_DAPM_OUTPUT("AFE_TO_MD2"),
+	SND_SOC_DAPM_OUTPUT("AFE_TO_BT1"),
+	SND_SOC_DAPM_OUTPUT("AFE_TO_BT0"),
 };
 
 static const struct snd_soc_dapm_route mtk_dai_pcm_routes[] = {
+	{"PCM 0 Playback", NULL, "PCM_0_PB_CH1"},
+	{"PCM 0 Playback", NULL, "PCM_0_PB_CH2"},
 	{"PCM 1 Playback", NULL, "PCM_1_PB_CH1"},
 	{"PCM 1 Playback", NULL, "PCM_1_PB_CH2"},
-	{"PCM 1 Playback", NULL, "PCM_1_PB_CH4"},
 	{"PCM 2 Playback", NULL, "PCM_2_PB_CH1"},
 	{"PCM 2 Playback", NULL, "PCM_2_PB_CH2"},
 	{"PCM 2 Playback", NULL, "PCM_2_PB_CH4"},
 
+	{"PCM 0 Playback", NULL, "PCM_0_EN"},
 	{"PCM 1 Playback", NULL, "PCM_1_EN"},
 	{"PCM 2 Playback", NULL, "PCM_2_EN"},
+	{"PCM 0 Capture", NULL, "PCM_0_EN"},
 	{"PCM 1 Capture", NULL, "PCM_1_EN"},
 	{"PCM 2 Capture", NULL, "PCM_2_EN"},
 
 	{"AFE_TO_MD1", NULL, "PCM 2 Playback"},
-	{"AFE_TO_MD2", NULL, "PCM 1 Playback"},
+	{"AFE_TO_BT1", NULL, "PCM 1 Playback"},
+	{"AFE_TO_BT0", NULL, "PCM 0 Playback"},
 	{"PCM 2 Capture", NULL, "MD1_TO_AFE"},
-	{"PCM 1 Capture", NULL, "MD2_TO_AFE"},
+	{"PCM 1 Capture", NULL, "BT1_TO_AFE"},
+	{"PCM 0 Capture", NULL, "BT0_TO_AFE"},
 
+	{"PCM_0_PB_CH1", "DL2_CH1", "DL2"},
+	{"PCM_0_PB_CH2", "DL2_CH2", "DL2"},
+	{"PCM_0_PB_CH1", "PCM_2_CAP_CH1", "PCM 2 Capture"},
+	{"PCM_0_PB_CH2", "PCM_2_CAP_CH1", "PCM 2 Capture"},
 	{"PCM_1_PB_CH1", "DL2_CH1", "DL2"},
 	{"PCM_1_PB_CH2", "DL2_CH2", "DL2"},
-	{"PCM_1_PB_CH4", "DL1_CH1", "DL1"},
+	{"PCM_1_PB_CH1", "PCM_2_CAP_CH1", "PCM 2 Capture"},
+	{"PCM_1_PB_CH2", "PCM_2_CAP_CH1", "PCM 2 Capture"},
 	{"PCM_2_PB_CH1", "DL2_CH1", "DL2"},
 	{"PCM_2_PB_CH2", "DL2_CH2", "DL2"},
 	{"PCM_2_PB_CH4", "DL1_CH1", "DL1"},
+	{"PCM_2_PB_CH1", "PCM_0_CAP_CH1", "PCM 0 Capture"},
+	{"PCM_2_PB_CH2", "PCM_0_CAP_CH2", "PCM 0 Capture"},
+	{"PCM_2_PB_CH1", "PCM_1_CAP_CH1", "PCM 1 Capture"},
+	{"PCM_2_PB_CH2", "PCM_1_CAP_CH2", "PCM 1 Capture"},
 };
 
 /* dai ops */
@@ -246,22 +359,38 @@
 		return 0;
 
 	switch (dai->id) {
-	case MT6880_DAI_PCM_1:
+	case MT6880_DAI_PCM_0:
 		pcm_con |= AUD_BCLK_OUT_INV_NO_INVERSE << PCM_BCLK_OUT_INV_SFT;
 		pcm_con |= AUD_TX_LCH_RPT_NO_REPEAT << PCM_TX_LCH_RPT_SFT;
 		pcm_con |= AUD_VBT_16K_MODE_DISABLE << PCM_VBT_16K_MODE_SFT;
-		pcm_con |= AUD_EXT_MODEM_SELECT_INTERNAL << PCM_EXT_MODEM_SFT;
+		pcm_con |= AUD_EXT_MODEM_SELECT_EXTERNAL << PCM_EXT_MODEM_SFT;
 		pcm_con |= 0 << PCM_SYNC_LENGTH_SFT;
 		pcm_con |= AUD_PCM_ONE_BCK_CYCLE_SYNC << PCM_SYNC_TYPE_SFT;
 		pcm_con |= AUD_BT_MODE_DUAL_MIC_ON_TX << PCM_BT_MODE_SFT;
 		pcm_con |= AUD_PCM_AFIFO_AFIFO << PCM_BYP_ASRC_SFT;
-		pcm_con |= AUD_PCM_CLOCK_SLAVE_MODE << PCM_SLAVE_SFT;
+		pcm_con |= AUD_PCM_CLOCK_MASTER_MODE << PCM_SLAVE_SFT;
 		pcm_con |= rate_reg << PCM_MODE_SFT;
 		pcm_con |= AUD_PCM_FMT_PCM_MODE_B << PCM_FMT_SFT;
 
 		regmap_update_bits(afe->regmap, PCM0_INTF_CON1,
 				   0xfffffffe, pcm_con);
 		break;
+	case MT6880_DAI_PCM_1:
+		pcm_con |= AUD_BCLK_OUT_INV_NO_INVERSE << PCM_BCLK_OUT_INV_SFT;
+		pcm_con |= AUD_TX_LCH_RPT_NO_REPEAT << PCM_TX_LCH_RPT_SFT;
+		pcm_con |= AUD_VBT_16K_MODE_DISABLE << PCM_VBT_16K_MODE_SFT;
+		pcm_con |= AUD_EXT_MODEM_SELECT_EXTERNAL << PCM_EXT_MODEM_SFT;
+		pcm_con |= 0 << PCM_SYNC_LENGTH_SFT;
+		pcm_con |= AUD_PCM_ONE_BCK_CYCLE_SYNC << PCM_SYNC_TYPE_SFT;
+		pcm_con |= AUD_BT_MODE_DUAL_MIC_ON_TX << PCM_BT_MODE_SFT;
+		pcm_con |= AUD_PCM_AFIFO_AFIFO << PCM_BYP_ASRC_SFT;
+		pcm_con |= AUD_PCM_CLOCK_MASTER_MODE << PCM_SLAVE_SFT;
+		pcm_con |= rate_reg << PCM_MODE_SFT;
+		pcm_con |= AUD_PCM_FMT_PCM_MODE_B << PCM_FMT_SFT;
+
+		regmap_update_bits(afe->regmap, PCM_INTF_CON1,
+				   0xfffffffe, pcm_con);
+		break;
 	case MT6880_DAI_PCM_2:
 		pcm_con |= AUD_TX_LCH_RPT_NO_REPEAT << PCM2_TX_LCH_RPT_SFT;
 		pcm_con |= AUD_VBT_16K_MODE_DISABLE << PCM2_VBT_16K_MODE_SFT;
@@ -300,6 +429,27 @@
 
 static struct snd_soc_dai_driver mtk_dai_pcm_driver[] = {
 	{
+		.name = "PCM 0",
+		.id = MT6880_DAI_PCM_0,
+		.playback = {
+			.stream_name = "PCM 0 Playback",
+			.channels_min = 1,
+			.channels_max = 2,
+			.rates = MTK_PCM_RATES,
+			.formats = MTK_PCM_FORMATS,
+		},
+		.capture = {
+			.stream_name = "PCM 0 Capture",
+			.channels_min = 1,
+			.channels_max = 2,
+			.rates = MTK_PCM_RATES,
+			.formats = MTK_PCM_FORMATS,
+		},
+		.ops = &mtk_dai_pcm_ops,
+		.symmetric_rates = 1,
+		.symmetric_samplebits = 1,
+	},
+	{
 		.name = "PCM 1",
 		.id = MT6880_DAI_PCM_1,
 		.playback = {
@@ -343,9 +493,46 @@
 	},
 };
 
+/* this enum is merely for mtk_afe_pcm_priv declare */
+enum {
+	DAI_PCM0 = 0,
+	DAI_PCM1,
+	DAI_PCM2,
+	DAI_PCM_NUM,
+};
+
+static const struct mtk_afe_pcm_priv mt6880_pcm_priv[DAI_PCM_NUM] = {
+	[DAI_PCM0] = {
+		.id = MT6880_DAI_PCM_0,
+	},
+	[DAI_PCM1] = {
+		.id = MT6880_DAI_PCM_1,
+	},
+	[DAI_PCM2] = {
+		.id = MT6880_DAI_PCM_2,
+	},
+};
+
+int mt6880_dai_pcm_set_priv(struct mtk_base_afe *afe)
+{
+	int i;
+	int ret;
+
+	for (i = 0; i < DAI_PCM_NUM; i++) {
+		ret = mt6880_dai_set_priv(afe, mt6880_pcm_priv[i].id,
+					  sizeof(struct mtk_afe_pcm_priv),
+					  &mt6880_pcm_priv[i]);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
 int mt6880_dai_pcm_register(struct mtk_base_afe *afe)
 {
 	struct mtk_base_afe_dai *dai;
+	int ret;
 
 	dev_info(afe->dev, "%s()\n", __func__);
 
@@ -362,5 +549,11 @@
 	dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_pcm_widgets);
 	dai->dapm_routes = mtk_dai_pcm_routes;
 	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_pcm_routes);
+
+	/* set all dai pcm private data */
+	ret = mt6880_dai_pcm_set_priv(afe);
+	if (ret)
+		return ret;
+
 	return 0;
 }
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-interconnection.h b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-interconnection.h
index 0116bbc..faec42a 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-interconnection.h
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-interconnection.h
@@ -46,7 +46,11 @@
 #define I_SRC_2_OUT_CH2 (39 - I_32_OFFSET)
 #define I_DL4_CH1 (40 - I_32_OFFSET)
 #define I_DL4_CH2 (41 - I_32_OFFSET)
+#define I_DMIC1_CH1 (42 - I_32_OFFSET)
+#define I_DMIC1_CH2 (43 - I_32_OFFSET)
 #define I_I2S6_CH3 (44 - I_32_OFFSET)
 #define I_I2S6_CH4 (45 - I_32_OFFSET)
+#define I_PCM_0_CAP_CH1 (46 - I_32_OFFSET)
+#define I_PCM_0_CAP_CH2 (47 - I_32_OFFSET)
 
 #endif
diff --git a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-mt6359.c b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-mt6359.c
index 56e4612..34bd9d8 100644
--- a/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-mt6359.c
+++ b/src/kernel/linux/v4.19/sound/soc/mediatek/mt6880/mt6880-mt6359.c
@@ -618,6 +618,19 @@
 		.dpcm_capture = 1,
 		.ignore_suspend = 1,
 	},
+	{
+		.name = "Hostless_Speech_BT",
+		.stream_name = "Hostless_Speech_BT",
+		.cpu_dai_name = "Hostless Speech_BT DAI",
+		.codec_name = "snd-soc-dummy",
+		.codec_dai_name = "snd-soc-dummy-dai",
+		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
+				SND_SOC_DPCM_TRIGGER_PRE},
+		.dynamic = 1,
+		.dpcm_playback = 1,
+		.dpcm_capture = 1,
+		.ignore_suspend = 1,
+	},
 	/* Back End DAI links */
 #if 0
 	{
@@ -826,6 +839,16 @@
 		.ignore_suspend = 1,
 	},
 	{
+		.name = "PCM 0",
+		.cpu_dai_name = "PCM 0",
+		.codec_name = "snd-soc-dummy",
+		.codec_dai_name = "snd-soc-dummy-dai",
+		.no_pcm = 1,
+		.dpcm_playback = 1,
+		.dpcm_capture = 1,
+		.ignore_suspend = 1,
+	},
+	{
 		.name = "PCM 1",
 		.cpu_dai_name = "PCM 1",
 		.codec_name = "snd-soc-dummy",
diff --git a/src/kernel/modules/netsys_driver/nat/hw_nat/hnat_common.c b/src/kernel/modules/netsys_driver/nat/hw_nat/hnat_common.c
index e246473..614eeb0 100644
--- a/src/kernel/modules/netsys_driver/nat/hw_nat/hnat_common.c
+++ b/src/kernel/modules/netsys_driver/nat/hw_nat/hnat_common.c
@@ -132,7 +132,6 @@
 int DP_GMAC2;
 int DP_EDMA0;
 int DP_EDMA1;
-int DP_CCMNI0 = MAX_IF_NUM;
 
 #ifdef CONFIG_RAETH_EDMA
 	struct net_device *aqr_dev1;
@@ -3106,59 +3105,58 @@
 	}
 
 	if (strncmp(dev->name, "ccmni0", 6) == 0) {
-		if (dst_port[8] == NULL) {
-			dst_port[8] = dev;
-			dst_port_type[8] = 0;
-			DP_CCMNI0 = 8;
+		if (dst_port[DP_CCMNI0] == NULL) {
+			dst_port[DP_CCMNI0] = dev;
+			dst_port_type[DP_CCMNI0] = 0;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni1", 6) == 0) {
-		if (dst_port[9] == NULL) {
-			dst_port[9] = dev;
-			dst_port_type[9] = 0;
+		if (dst_port[DP_CCMNI1] == NULL) {
+			dst_port[DP_CCMNI1] = dev;
+			dst_port_type[DP_CCMNI1] = 0;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni2", 6) == 0) {
-		if (dst_port[10] == NULL) {
-			dst_port[10] = dev;
-			dst_port_type[10] = 0;
+		if (dst_port[DP_CCMNI2] == NULL) {
+			dst_port[DP_CCMNI2] = dev;
+			dst_port_type[DP_CCMNI2] = 0;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni3", 6) == 0) {
-		if (dst_port[11] == NULL) {
-			dst_port[11] = dev;
-			dst_port_type[11] = 0;
+		if (dst_port[DP_CCMNI3] == NULL) {
+			dst_port[DP_CCMNI3] = dev;
+			dst_port_type[DP_CCMNI3] = 0;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni4", 6) == 0) {
-		if (dst_port[12] == NULL) {
-			dst_port[12] = dev;
-			dst_port_type[12] = 0;
+		if (dst_port[DP_CCMNI4] == NULL) {
+			dst_port[DP_CCMNI4] = dev;
+			dst_port_type[DP_CCMNI4] = 0;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni5", 6) == 0) {
-		if (dst_port[13] == NULL) {
-			dst_port[13] = dev;
-			dst_port_type[13] = 0;
+		if (dst_port[DP_CCMNI5] == NULL) {
+			dst_port[DP_CCMNI5] = dev;
+			dst_port_type[DP_CCMNI5] = 0;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni6", 6) == 0) {
-		if (dst_port[14] == NULL) {
-			dst_port[14] = dev;
-			dst_port_type[14] = 0;
+		if (dst_port[DP_CCMNI6] == NULL) {
+			dst_port[DP_CCMNI6] = dev;
+			dst_port_type[DP_CCMNI6] = 0;
 			return;
 		}
 	}
-	if (strncmp(dev->name, "ccmni7", 7) == 0) {
-		if (dst_port[15] == NULL) {
-			dst_port[15] = dev;
-			dst_port_type[15] = 0;
+	if (strncmp(dev->name, "ccmni7", 6) == 0) {
+		if (dst_port[DP_CCMNI7] == NULL) {
+			dst_port[DP_CCMNI7] = dev;
+			dst_port_type[DP_CCMNI7] = 0;
 			return;
 		}
 	}
@@ -3185,58 +3183,58 @@
 		return;
 
 	if (strncmp(dev->name, "ccmni0", 6) == 0) {
-		if (dst_port[8] != NULL) {
-			dst_port[8] = NULL;
+		if (dst_port[DP_CCMNI0] != NULL) {
 			ppe_reset_dev_mib(dev);
+			dst_port[DP_CCMNI0] = NULL;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni1", 6) == 0) {
-		if (dst_port[9] != NULL) {
-			dst_port[9] = NULL;
+		if (dst_port[DP_CCMNI1] != NULL) {
 			ppe_reset_dev_mib(dev);
+			dst_port[DP_CCMNI1] = NULL;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni2", 6) == 0) {
-		if (dst_port[10] != NULL) {
-			dst_port[10] = NULL;
+		if (dst_port[DP_CCMNI2] != NULL) {
 			ppe_reset_dev_mib(dev);
+			dst_port[DP_CCMNI2] = NULL;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni3", 6) == 0) {
-		if (dst_port[11] != NULL) {
-			dst_port[11] = NULL;
+		if (dst_port[DP_CCMNI3] != NULL) {
 			ppe_reset_dev_mib(dev);
+			dst_port[DP_CCMNI3] = NULL;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni4", 6) == 0) {
-		if (dst_port[12] != NULL) {
-			dst_port[12] = NULL;
+		if (dst_port[DP_CCMNI4] != NULL) {
 			ppe_reset_dev_mib(dev);
+			dst_port[DP_CCMNI4] = NULL;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni5", 6) == 0) {
-		if (dst_port[13] != NULL) {
-			dst_port[13] = NULL;
+		if (dst_port[DP_CCMNI5] != NULL) {
 			ppe_reset_dev_mib(dev);
+			dst_port[DP_CCMNI5] = NULL;
 			return;
 		}
 	}
 	if (strncmp(dev->name, "ccmni6", 6) == 0) {
-		if (dst_port[14] != NULL) {
-			dst_port[14] = NULL;
+		if (dst_port[DP_CCMNI6] != NULL) {
 			ppe_reset_dev_mib(dev);
+			dst_port[DP_CCMNI6] = NULL;
 			return;
 		}
 	}
-	if (strncmp(dev->name, "ccmni7", 7) == 0) {
-		if (dst_port[15] != NULL) {
-			dst_port[15] = NULL;
+	if (strncmp(dev->name, "ccmni7", 6) == 0) {
+		if (dst_port[DP_CCMNI7] != NULL) {
 			ppe_reset_dev_mib(dev);
+			dst_port[DP_CCMNI7] = NULL;
 			return;
 		}
 	}
@@ -4239,12 +4237,6 @@
 	if (ret)
 		return ret;
 #endif
-	/* avoid LAN-WAN NAT link enters bind state */
-	if (IS_IPV4_HNAT(entry)) {
-		if (debug_level >= 7)
-			pr_notice("%s, NAT entry is not allowed to HWNAT !!\n", __func__);
-		return 1;
-	}
 
 	ret = ppe_fill_table_med(skb, entry, ppe_parse_result);
 
@@ -4950,7 +4942,8 @@
 	} else if(FOE_SP(skb) == ADMA_PSE_PORT) {
 		entry = &ppe_foe_base[FOE_ENTRY_NUM(skb)];
 	} else if(FOE_SP(skb) == QDMA_PSE_PORT) { // QoS
-		entry = (FOE_AI(skb) == PACKET_FORWARD_PATH_WITHOUT_PPE)?
+		entry = ((FOE_AI(skb) == PACKET_FORWARD_PATH_WITHOUT_PPE) &&
+			 (FOE_IF_IDX(skb) >= DP_CCMNI0))?
 			&ppe1_foe_base[FOE_ENTRY_NUM(skb)] : // MDMA
 			&ppe_foe_base[FOE_ENTRY_NUM(skb)];
 	} else {
diff --git a/src/kernel/modules/netsys_driver/nat/hw_nat/ra_nat.h b/src/kernel/modules/netsys_driver/nat/hw_nat/ra_nat.h
index 056f403..1ae61c7 100644
--- a/src/kernel/modules/netsys_driver/nat/hw_nat/ra_nat.h
+++ b/src/kernel/modules/netsys_driver/nat/hw_nat/ra_nat.h
@@ -154,6 +154,16 @@
 
 #define MAX_IF_NUM 64
 
+/* skb head for RXIF_IDX only has 4 bits, so max index should be 15 */
+#define DP_CCMNI0 8
+#define DP_CCMNI1 (DP_CCMNI0 + 1) /* 9 */
+#define DP_CCMNI2 (DP_CCMNI0 + 2) /* 10 */
+#define DP_CCMNI3 (DP_CCMNI0 + 3) /* 11 */
+#define DP_CCMNI4 (DP_CCMNI0 + 4) /* 12 */
+#define DP_CCMNI5 (DP_CCMNI0 + 5) /* 13 */
+#define DP_CCMNI6 (DP_CCMNI0 + 6) /* 14 */
+#define DP_CCMNI7 (DP_CCMNI0 + 7) /* 15 */
+
 /*Colgin head*/
 /*   +----------------------------------------------------------- */
 /*   | entry_idx(15) | cpu_reason(5)|source port(4)|alg(1)|rsv(7) */
diff --git a/src/telephony/tel-demo/src/sms/sms.cpp b/src/telephony/tel-demo/src/sms/sms.cpp
index 903b306..f9f3546 100644
--- a/src/telephony/tel-demo/src/sms/sms.cpp
+++ b/src/telephony/tel-demo/src/sms/sms.cpp
@@ -737,6 +737,13 @@
 //sent status save
 int saveSendedSmsInfo(int charset, char* num, char* msg, char* smsc)
 {
+    if (auto_save_sms_to_sim == false || strlen(msg) > MAX_PDU_SIZE)
+    {
+        RLOGE("%s:auto_save_sms_to_sim is %d, msg len = %d, return directly",
+                __FUNCTION__, auto_save_sms_to_sim, strlen(msg));
+        return 0;
+    }
+
     if(psmsSaveInfo == NULL)
     {
         psmsSaveInfo = (smsSaveInfo*)malloc(sizeof(smsSaveInfo));
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/framework/base/RfxDefaultValueTable.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/framework/base/RfxDefaultValueTable.cpp
index 9d723ec..446a640 100644
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/framework/base/RfxDefaultValueTable.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/framework/base/RfxDefaultValueTable.cpp
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -66,8 +67,8 @@
     RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_ECPIN_STATE, RfxVariant(RFX_ECPIN_DONE)),
     RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_MODEM_SIM_TASK_READY, RfxVariant(false)),
 //    RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_SERVICE_STATE, RfxVariant(RfxNwServiceState())),
-    RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_VOICE_TYPE, RfxVariant()),
-    RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_DATA_TYPE, RfxVariant()),
+    RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_VOICE_TYPE, RfxVariant(0)),
+    RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_DATA_TYPE, RfxVariant(0)),
     RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_RADIO_STATE, RfxVariant()),
     RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_MODEM_POWER_OFF, RfxVariant(false)),
     RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_MODEM_OFF_STATE, RfxVariant(0)),
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.cpp
index 6615766..5a920f2 100644
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.cpp
@@ -1654,6 +1654,9 @@
     int p3 = 0;
     int data_len = 0;
     char* data_ptr = NULL;
+    char *byteData = NULL;
+    uint16_t len = 0;
+    uint16_t bLen = 0;
 
     do {
         if(message->getRilToken() == NULL) {
@@ -1699,10 +1702,15 @@
         data_ptr = strdupReadString(p);
         if(data_ptr && (string(data_ptr).empty())) {
             data_ptr = NULL;
+        } else {
+            if (data_ptr != NULL) {
+                len = strlen(data_ptr);
+                bLen = hexStringToByteArrayEx((unsigned char*)data_ptr, len, (unsigned char **)&byteData);
+            }
         }
-        RFX_LOG_D(mLog_tag.c_str(), "session_id:%d, cla:%d, ins:%d,p1=%d,p2=%d,p3=%d,data=%s", session_id, cla, ins, p1, p2, p3, (data_ptr==NULL? "": data_ptr));
+        RFX_LOG_D(mLog_tag.c_str(), "session_id:%d, cla:%d, ins:%d,p1=%d,p2=%d,p3=%d,data=%s", session_id, cla, ins, p1, p2, p3, (byteData==NULL? "": byteData));
         ret = mipc_sim_extended_channel_generic_access_async(slot_id_to_mipc_sim_id(message->getSlotId()), mipc_sim_extended_channel_generic_access_cb,
-                (void*) message->getRilToken(), session_id, cla, ins, p1, p2, p3, (data_ptr==NULL? 0: strlen(data_ptr)), data_ptr);
+                (void*) message->getRilToken(), session_id, cla, ins, p1, p2, p3, bLen, byteData);
     }while(0);
 
     if(ret != MIPC_API_RESULT_SUCCESS) {
@@ -1713,6 +1721,9 @@
     if(data_ptr) {
         free(data_ptr);
     }
+    if (byteData) {
+        free(byteData);
+    }
     RFX_LOG_D(mLog_tag.c_str(), "%s done", __FUNCTION__);
 }
 
@@ -1760,6 +1771,9 @@
     int p3 = 0;
     int data_len = 0;
     char* data_ptr = NULL;
+    char *byteData = NULL;
+    uint16_t len = 0;
+    uint16_t bLen = 0;
 
     do {
         if(message->getRilToken() == NULL) {
@@ -1808,11 +1822,16 @@
         data_ptr = strdupReadString(p);
         if(data_ptr && (string(data_ptr).empty())) {
             data_ptr = NULL;
+        } else {
+            if (data_ptr != NULL) {
+                len = strlen(data_ptr);
+                bLen = hexStringToByteArrayEx((unsigned char*)data_ptr, len, (unsigned char **)&byteData);
+            }
         }
 
-        RFX_LOG_D(mLog_tag.c_str(), "session_id:%d, cla:%d, ins:%d,p1=%d,p2=%d,p3=%d,data=%s", session_id, cla, ins, p1, p2, p3, (data_ptr==NULL? "": data_ptr));
+        RFX_LOG_D(mLog_tag.c_str(), "session_id:%d, cla:%d, ins:%d,p1=%d,p2=%d,p3=%d,data=%s", session_id, cla, ins, p1, p2, p3, (byteData==NULL? "": byteData));
         ret = mipc_sim_extended_channel_generic_access_async(slot_id_to_mipc_sim_id(message->getSlotId()), mipc_sim_extended_channel_generic_access_cb,
-                (void*) message->getRilToken(), session_id, cla, ins, p1, p2, p3, (data_ptr==NULL? 0: strlen(data_ptr)), data_ptr);
+                (void*) message->getRilToken(), session_id, cla, ins, p1, p2, p3, bLen, byteData);
     }while(0);
 
     if(ret != MIPC_API_RESULT_SUCCESS) {
@@ -1823,6 +1842,9 @@
     if(data_ptr) {
         free(data_ptr);
     }
+    if (byteData) {
+        free(byteData);
+    }
     RFX_LOG_D(mLog_tag.c_str(), "%s done", __FUNCTION__);
 }
 
@@ -2072,3 +2094,34 @@
 
     RFX_LOG_D(mLog_tag.c_str(), "%s done", __FUNCTION__);
 }
+
+int RpSimController::hexStringToByteArrayEx(unsigned char* hexString,
+        int hexStringLen, unsigned char ** byte) {
+    int length = hexStringLen/2;
+    unsigned char* buffer = (unsigned char*)malloc((length + 1)*sizeof(char));
+    int i = 0;
+
+    if (NULL == buffer) {
+        RFX_LOG_E(mLog_tag.c_str(), "%s malloc return NULL.", __FUNCTION__);
+        return 0;
+    }
+    memset(buffer, 0, ((length + 1)*sizeof(char)));
+    for (i = 0 ; i < hexStringLen ; i += 2)
+    {
+        buffer[i / 2] = (unsigned char)((toByte(hexString[i]) << 4) | toByte(hexString[i+1]));
+    }
+
+    *byte = buffer;
+
+    return (hexStringLen/2);
+}
+
+int RpSimController::toByte(char c) {
+    if (c >= '0' && c <= '9') return (c - '0');
+    if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
+    if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
+
+    RFX_LOG_E(mLog_tag.c_str(), "%s toByte, Error: %c", __FUNCTION__, c);
+    return 0;
+}
+
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.h b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.h
index eded6b6..7bb6892 100644
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.h
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*****************************************************************************
  *  Copyright Statement:
  *  --------------------
@@ -70,6 +71,10 @@
     int setChannelToClassByte(int cla, int channelNumber);
     void handleQueryEid(const android::sp<RfxMessage> &message);
     void handleQuerySimRetryCount(const android::sp<RfxMessage> &message);
+    int hexStringToByteArrayEx(unsigned char* hexString,
+        int hexStringLen, unsigned char ** byte);
+    int toByte(char c);
+
 };
 
 #endif /* SIM_RPSIMCONTROLLER_H_ */
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sms/RpSmsController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sms/RpSmsController.cpp
index 345ad4a..a4d93ea 100644
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sms/RpSmsController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sms/RpSmsController.cpp
@@ -1157,27 +1157,27 @@
 
     int32_t count = 0;
     int32_t status = 0;
-    int32_t t = 0;
+    int32_t index = 0;
 
     Parcel *p = request->getParcel();
-    RFX_LOG_D(RFX_LOG_TAG, "enter0 p=%p\n",p);
     if(p != NULL) {
-        RFX_LOG_D(RFX_LOG_TAG, "enter1\n");
         status = p->readInt32 (&count);
         if (status != 0 || count <= 0) {
             RFX_LOG_D(RFX_LOG_TAG,"handleDeleteSMSOnSIMRequest readerror\n");
             return;
         }
-        RFX_LOG_D(RFX_LOG_TAG, "enter2\n");
-        status = p->readInt32(&t);
-        RFX_LOG_D(RFX_LOG_TAG, "enter3 t=%d\n",t);
+        status = p->readInt32(&index);
+        RFX_LOG_D(RFX_LOG_TAG, "handleDeleteSMSOnSIMRequest index=%d\n",index);
     }
-    mipc_sms_delete_async(slot_id_to_mipc_sim_id(request->getSlotId()), mipc_delete_sms_on_sim_cb, (void *)request->getRilToken(), (mipc_sms_flag_enum)MIPC_SMS_FLAG_INDEX,(uint16_t)t);
-#if 0
-    mipc_sms_delete_struct result_ptr;
-    result_ptr.result_code = MIPC_RESULT_SUCCESS;
-    mipc_delete_sms_on_sim_cb(MIPC_API_SIM0,&result_ptr,request->getRilToken());
-#endif
+
+    if (index > 0) {
+        mipc_sms_delete_async(slot_id_to_mipc_sim_id(request->getSlotId()), mipc_delete_sms_on_sim_cb, (void *)request->getRilToken(),
+                (mipc_sms_flag_enum)MIPC_SMS_FLAG_INDEX,(uint16_t)index);
+    } else {
+        RFX_LOG_D(RFX_LOG_TAG, "handleDeleteSMSOnSIMRequest delete all, index=%d\n", index);
+        mipc_sms_delete_async(slot_id_to_mipc_sim_id(request->getSlotId()), mipc_delete_sms_on_sim_cb, (void *)request->getRilToken(),
+                (mipc_sms_flag_enum)MIPC_SMS_FLAG_ALL,(uint16_t)0);
+    }
 }
 
 void mipc_get_smsc_address_cb(
@@ -1635,7 +1635,7 @@
 }
 
 void RpSmsController::handleReportSmsMemStatus(const sp<RfxMessage>& request) {
-    RFX_LOG_D(RFX_LOG_TAG, "handleReportSmsMemStatus with clientId: %d, with token: %d",
+    RFX_LOG_D(RFX_LOG_TAG, "[%s] with clientId: %d, with token: %d", __FUNCTION__,
         request->getClientId(), request->getToken());
     mipc_api_result_enum ret = MIPC_API_RESULT_FAIL;
     status_t status;
@@ -1649,17 +1649,25 @@
         }
         Parcel *p = request->getParcel();
         if(p == NULL) {
-            RFX_LOG_D(RFX_LOG_TAG, "handleGsmSetCbSmsCfg p has no data to transfer\n");
+            RFX_LOG_D(RFX_LOG_TAG, "[%s] p has no data to transfer\n", __FUNCTION__);
             break;
         }
-        RFX_LOG_D(RFX_LOG_TAG, "handleGsmCbSmsActivation p=%p\n",p);
+        RFX_LOG_D(RFX_LOG_TAG, "[%s] p=%p\n", __FUNCTION__, p);
 
+        // Read ints count
+        status = p->readInt32(&t);
+        if (status != android::NO_ERROR) {
+            break;
+        }
+
+        // Read available status
         status = p->readInt32(&t);
         if (status != android::NO_ERROR) {
             break;
         }
         avaiable = (int)t;
-        RFX_LOG_D(RFX_LOG_TAG, "Turn report SMS memory status %s", ((avaiable == 1)? "on" : "off"));
+
+        RFX_LOG_D(RFX_LOG_TAG, "[%s]Turn report SMS memory status %s", __FUNCTION__, ((avaiable == 1)? "on" : "off"));
 
         if (avaiable == 1 || avaiable == 0) {
             ret = mipc_set_host_mem_avaiable_async(slot_id_to_mipc_sim_id(request->getSlotId()), mipc_set_host_mem_avaiable_cb, (void *)request->getRilToken(), avaiable);
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_sys_api.h b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_sys_api.h
index 56b47de..caaefad 100644
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_sys_api.h
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_sys_api.h
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /*****************************************************************************
 *  Copyright Statement:
 *  --------------------
@@ -252,7 +253,7 @@
 } mipc_sys_adpclk_state_enum;
 
 #define MIPC_DEVICEID_MAX_LEN   (15)
-#define MIPC_FIRMWARE_LEN       (30)
+#define MIPC_FIRMWARE_LEN       (64)
 #define MIPC_HARDWAREWARE_LEN   (30)
 #define MIPC_MANUFACTURER_LEN   (32)
 #define MIPC_ESN_LEN   (8)
@@ -321,7 +322,7 @@
     /** @brief Manufacturer id */
     uint8_t manufacturer[MIPC_MANUFACTURER_LEN];
     /** @brief firmware id */
-    uint8_t firmware_info[MIPC_FIRMWARE_LEN];
+    uint8_t firmware_info[MIPC_FIRMWARE_LEN+1];
     /** @brief hardware id */
     uint8_t hardware_info[MIPC_HARDWAREWARE_LEN];
     /** @brief max activated contexts */
@@ -337,7 +338,7 @@
     /** @brief  meid */
     uint8_t meid[MIPC_MEID_LEN+1];
     /** @brief firmware custom id */
-    uint8_t firmware_custom_info[MIPC_FIRMWARE_LEN];
+    uint8_t firmware_custom_info[MIPC_FIRMWARE_LEN+1];
     //
     uint32_t data_sub_class;
 
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_call_api.c b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_call_api.c
index 7d1b33a..518d855 100644
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_call_api.c
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_call_api.c
@@ -401,7 +401,8 @@
             result_ptr->tons[i] = (uint32_t)mipc_msg_get_idx_uint32(msg_cnf_ptr, MIPC_CALL_GET_CALL_STATUS_CNF_T_TON, i, UINT32_MAX);
             val_ptr = mipc_msg_get_idx_ptr(msg_cnf_ptr, MIPC_CALL_GET_CALL_STATUS_CNF_T_NUMBER, i, &val_len);
             if (val_ptr) {
-                MEMCPY(result_ptr->numbers[i], val_ptr, (val_len)*sizeof(char));
+                MEMCPY(result_ptr->numbers[i], val_ptr, (val_len < MIPC_MAX_CALL_NUMBER_LEN ?
+                        val_len : MIPC_MAX_CALL_NUMBER_LEN) * sizeof(char));
             }
             result_ptr->call_rats[i] = (mipc_call_rat_const_enum)mipc_msg_get_idx_uint32(msg_cnf_ptr, MIPC_CALL_GET_CALL_STATUS_CNF_T_RAT, i, UINT32_MAX);
             result_ptr->call_types[i] = (mipc_call_type_const_enum)mipc_msg_get_idx_uint32(msg_cnf_ptr, MIPC_CALL_GET_CALL_STATUS_CNF_T_TYPE, i, UINT32_MAX);
@@ -605,7 +606,8 @@
         if (result_ptr->count) {
             val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_CALL_GET_CONFERENCE_INFO_CNF_T_DIRECTION , &val_len);
             if (NULL == val_ptr) break;
-            MEMCPY(result_ptr->directions, val_ptr, (result_ptr->count)*sizeof(uint32_t));
+            MEMCPY(result_ptr->directions, val_ptr, (result_ptr->count < MIPC_MAX_CALL_CONFERENCE_PARTICIPANT_NUM ?
+                    result_ptr->count : MIPC_MAX_CALL_CONFERENCE_PARTICIPANT_NUM) * sizeof(mipc_call_direction_const_enum));
 
             int tag = 0;
             for(uint32_t i = 0 ; i < result_ptr->count ; i++ ) {
@@ -614,7 +616,8 @@
                     tag = 1;
                     break;
                 }
-                MEMCPY(result_ptr->participant_numbers[i], val_ptr, (val_len)*sizeof(char));
+                MEMCPY(result_ptr->participant_numbers[i], val_ptr, (val_len < MIPC_MAX_CALL_NUMBER_LEN ?
+                        val_len : MIPC_MAX_CALL_NUMBER_LEN) * sizeof(char));
             }
             if(tag) {
                 break;
@@ -627,7 +630,8 @@
                     tag = 1;
                     break;
                 }
-                MEMCPY(result_ptr->participant_names[i], val_ptr, (val_len)*sizeof(char));
+                MEMCPY(result_ptr->participant_names[i], val_ptr, (val_len < MIPC_MAX_CALL_NAME_LEN ?
+                        val_len : MIPC_MAX_CALL_NAME_LEN) * sizeof(char));
             }
             if(tag) {
                 break;
@@ -635,7 +639,8 @@
 
             val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_CALL_GET_CONFERENCE_INFO_CNF_T_PARTICIPANT_STATUS, &val_len);
             if (NULL == val_ptr) break;
-            MEMCPY(result_ptr->conf_participant_status, val_ptr, (result_ptr->count)*sizeof(uint32_t));
+            MEMCPY(result_ptr->conf_participant_status, val_ptr, (result_ptr->count < MIPC_MAX_CALL_CONFERENCE_PARTICIPANT_NUM ?
+                    result_ptr->count : MIPC_MAX_CALL_CONFERENCE_PARTICIPANT_NUM) * sizeof(mipc_conf_participant_status_const_enum));
         }
         result = MIPC_API_RESULT_SUCCESS;
     } while (0);
@@ -728,7 +733,7 @@
         result_ptr->reason = (uint32_t)(*((uint32_t*)val_ptr));
         val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_CALL_GET_FINISH_REASON_CNF_T_REASON_STR , &val_len);
         if (NULL == val_ptr) break;
-        MEMCPY(result_ptr->reason_str, val_ptr, (val_len<MIPC_MAX_CALL_FINISH_REASON_LEN ? val_len:MIPC_MAX_CALL_FINISH_REASON_LEN));
+        MEMCPY(result_ptr->reason_str, val_ptr, (val_len < MIPC_MAX_CALL_FINISH_REASON_LEN ? val_len : MIPC_MAX_CALL_FINISH_REASON_LEN));
         result = MIPC_API_RESULT_SUCCESS;
     } while (0);
 
@@ -898,7 +903,8 @@
         if (result_ptr->info_count) {
             val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_CALL_GET_ECC_LIST_CNF_T_INFO_LIST, &val_len);
             if (NULL == val_ptr) break;
-            MEMCPY(result_ptr->info_lists, val_ptr, (result_ptr->info_count)*sizeof(mipc_ecc_info_struct4));
+            MEMCPY(result_ptr->info_lists, val_ptr, (result_ptr->info_count < MIPC_MAX_CALL_ECC_LIST_RECORD_NUM ?
+                    result_ptr->info_count : MIPC_MAX_CALL_ECC_LIST_RECORD_NUM) * sizeof(mipc_ecc_info_struct4));
         }
         result = MIPC_API_RESULT_SUCCESS;
     } while (0);
@@ -1306,7 +1312,7 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_STATUS_IND_T_TON, NULL)) == NULL) break;
         result_ptr->ton = (uint32_t) * ((uint32_t *)val_ptr);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_STATUS_IND_T_NUMBER, &val_len)) == NULL) break;
-        MEMCPY(result_ptr->number, val_ptr, val_len);
+        MEMCPY(result_ptr->number, val_ptr, val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_len : MIPC_MAX_CALL_NUMBER_LEN);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_STATUS_IND_T_TYPE, NULL)) == NULL) break;
         result_ptr->type = (mipc_call_type_const_enum) * ((uint32_t *)val_ptr);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_STATUS_IND_T_DETAIL_INFO, &val_len)) == NULL) break;
@@ -1384,9 +1390,9 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_EVENT_IND_T_REDIRECT_NUMBER, &val_len)) == NULL) {
             (result_ptr->redirect_number)[0] = 0;
         } else {
-            MEMCPY(result_ptr->redirect_number, val_ptr, val_len);
+            MEMCPY(result_ptr->redirect_number, val_ptr, val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_len : MIPC_MAX_CALL_NUMBER_LEN);
         }
-        MEMCPY(result_ptr->redirect_number, val_ptr, val_len);
+        MEMCPY(result_ptr->redirect_number, val_ptr, val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_len : MIPC_MAX_CALL_NUMBER_LEN);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_EVENT_IND_T_AUDIO_CODEC, NULL)) == NULL) {
             result_ptr->audio_codec = UINT16_MAX;
         } else {
@@ -1557,7 +1563,7 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_SIP_IND_T_REASON_TEXT, &val_len)) == NULL) {
             result_ptr->reason_text[0] = 0;
         } else {
-            MEMCPY(result_ptr->reason_text, val_ptr, (val_len < MIPC_MAX_SIP_REASON_TEXT_LEN ? val_len: MIPC_MAX_SIP_REASON_TEXT_LEN));
+            MEMCPY(result_ptr->reason_text, val_ptr, (val_len < MIPC_MAX_SIP_REASON_TEXT_LEN ? val_len : MIPC_MAX_SIP_REASON_TEXT_LEN));
         }
 
         api_error = 0;
@@ -1659,7 +1665,7 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_IMS_EVENT_PACKAGE_IND_T_TYPE, NULL)) == NULL) break;
         result_ptr->type = (mipc_ims_event_package_type_const_enum) * ((uint32_t *)val_ptr);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_IMS_EVENT_PACKAGE_IND_T_DATA, &val_len)) == NULL) break;
-        MEMCPY(result_ptr->data, val_ptr, (val_len < MIPC_MAX_IMS_EVENT_PACKAGE_DATA_LEN ? val_len:MIPC_MAX_IMS_EVENT_PACKAGE_DATA_LEN));
+        MEMCPY(result_ptr->data, val_ptr, (val_len < MIPC_MAX_IMS_EVENT_PACKAGE_DATA_LEN ? val_len : MIPC_MAX_IMS_EVENT_PACKAGE_DATA_LEN));
         api_error = 0;
     } while (0);
 
@@ -1771,7 +1777,7 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_SS_IND_T_NUMBER, &val_len)) == NULL) {
             (result_ptr->number)[0]=0;
         } else {
-            MEMCPY(result_ptr->number, val_ptr, (val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_len:MIPC_MAX_CALL_NUMBER_LEN));
+            MEMCPY(result_ptr->number, val_ptr, (val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_len : MIPC_MAX_CALL_NUMBER_LEN));
         }
 
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_SS_IND_T_TOA, NULL)) == NULL) {
@@ -1783,7 +1789,7 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_SS_IND_T_SUBADDR, &val_len)) == NULL) {
             (result_ptr->subaddr)[0] = 0;
         } else {
-            MEMCPY(result_ptr->subaddr, val_ptr, (val_len < MIPC_MAX_CALL_SS_SUBADDR_LEN ? val_len:MIPC_MAX_CALL_SS_SUBADDR_LEN));
+            MEMCPY(result_ptr->subaddr, val_ptr, (val_len < MIPC_MAX_CALL_SS_SUBADDR_LEN ? val_len : MIPC_MAX_CALL_SS_SUBADDR_LEN));
         }
 
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_SS_IND_T_SATYPE, NULL)) == NULL) {
@@ -1889,7 +1895,7 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_CRSS_IND_T_CRSS_TYPE, NULL)) == NULL) break;
         result_ptr->crss_type = (mipc_crss_type_const_enum) * ((uint8_t *)val_ptr);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_CRSS_IND_T_NUMBER, &val_len)) == NULL) break;
-        MEMCPY(result_ptr->number, val_ptr, (val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_len:MIPC_MAX_CALL_NUMBER_LEN));
+        MEMCPY(result_ptr->number, val_ptr, (val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_len : MIPC_MAX_CALL_NUMBER_LEN));
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_CRSS_IND_T_CALL_NUMBER_TYPE, NULL)) == NULL) break;
         result_ptr->call_number_type = (mipc_number_type_const_enum) * ((uint8_t *)val_ptr);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_CRSS_IND_T_NUMBER_PRESENTATION, NULL)) == NULL) {
@@ -1900,7 +1906,7 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_CRSS_IND_T_SUB_ADDRESS, &val_len)) == NULL) {
             (result_ptr->sub_address)[0]=0;
         } else {
-            MEMCPY(result_ptr->sub_address, val_ptr, (val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_len:MIPC_MAX_CALL_NUMBER_LEN));
+            MEMCPY(result_ptr->sub_address, val_ptr, (val_len < MIPC_MAX_SUB_ADDRESS_LEN ? val_len : MIPC_MAX_SUB_ADDRESS_LEN));
         }
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_CRSS_IND_T_SA_TYPE, NULL)) == NULL) {
             result_ptr->sa_type = 0;
@@ -1910,7 +1916,7 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_CRSS_IND_T_ALPHAID, &val_len)) == NULL) {
             (result_ptr->alphaid)[0]=0;
         } else {
-            MEMCPY(result_ptr->alphaid, val_ptr, (val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_len:MIPC_MAX_CALL_NUMBER_LEN));
+            MEMCPY(result_ptr->alphaid, val_ptr, (val_len < MIPC_MAX_SUB_ADDRESS_LEN ? val_len : MIPC_MAX_SUB_ADDRESS_LEN));
         }
         api_error = 0;
     } while (0);
@@ -1962,7 +1968,7 @@
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_APPROVE_INCOMING_CMD_T_CALLID, NULL)) == NULL) break;
         result_ptr->callid = (uint32_t) * ((uint32_t *)val_ptr);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_APPROVE_INCOMING_CMD_T_NUMBER, &val_len)) == NULL) break;
-        MEMCPY(result_ptr->number, val_ptr, val_len);
+        MEMCPY(result_ptr->number, val_ptr, val_len < MIPC_MAX_CALL_NUMBER_LEN ? val_ptr : MIPC_MAX_CALL_NUMBER_LEN);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_APPROVE_INCOMING_CMD_T_TOA, NULL)) == NULL) break;
         result_ptr->toa = (uint32_t) * ((uint32_t *)val_ptr);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_CALL_APPROVE_INCOMING_CMD_T_SEQ_NO, NULL)) == NULL) break;
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_ecall_api.c b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_ecall_api.c
index 7c34a20..ba930ca 100644
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_ecall_api.c
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_ecall_api.c
@@ -607,7 +607,7 @@
     if (NULL == cb) {
         return MIPC_API_RESULT_FAIL;
     }
-    return mipc_ecall_ivs_set_test_addr(cb, cb_priv_ptr, sim_ps_id, reconf_address, address_type, NULL);
+    return mipc_ecall_ivs_set_reconf_addr(cb, cb_priv_ptr, sim_ps_id, reconf_address, address_type, NULL);
 }
 
 static mipc_api_result_enum mipc_ecall_ivs_set_addr_pri_cnf_decode(mipc_msg_t *msg_cnf_ptr, mipc_ecall_ivs_set_addr_pri_struct *result_ptr)
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sms_api.c b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sms_api.c
index 4b7be67..bf08283 100644
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sms_api.c
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sms_api.c
@@ -511,7 +511,11 @@
     mipc_api_result_enum ret;
 
     mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SMS_DELETE_REQ_T_FLAG, flag);
-    mipc_msg_add_tlv_uint16(msg_req_ptr, MIPC_SMS_DELETE_REQ_T_MESSAGE_INDEX, message_index);
+    if (message_index > 0) {
+	    mipc_msg_add_tlv_uint16(msg_req_ptr, MIPC_SMS_DELETE_REQ_T_MESSAGE_INDEX, message_index);
+    }
+
+    mtkLogD(LOG_TAG, "[%s] flag=%d, message_index=%d", __FUNCTION__, flag, message_index);
 
     if (cb) {
         mipc_msg_async_api(msg_req_ptr, (void *)mipc_sms_delete_cb, (MIPC_API_CB)cb, cb_priv_ptr);
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sys_api.c b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sys_api.c
index 788fce6..6daedfd 100644
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sys_api.c
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sys_api.c
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /*****************************************************************************
 *  Copyright Statement:
 *  --------------------
@@ -697,25 +698,28 @@
 
         t_result_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_SYS_GET_INFO_CNF_T_DEVICE_ID, &t_systmp_len);
         if (NULL == t_result_ptr) {
-            mtkLogD(LOG_TAG, "cur ptr null\n");
-            break;
+            mtkLogD(LOG_TAG, "device_id - cur ptr null\n");
+        } else {
+            MEMCPY(result_ptr->device_id, t_result_ptr, (t_systmp_len > 15) ? 15 : t_systmp_len);
+            mtkLogD(LOG_TAG, "t_result_ptr = %d \n", *((uint32_t*)t_result_ptr));
+            mtkLogD(LOG_TAG, "device_id = %d \n", result_ptr->device_id[0]);
         }
-        MEMCPY(result_ptr->device_id, t_result_ptr, (t_systmp_len > 15) ? 15 : t_systmp_len);
-        mtkLogD(LOG_TAG, "t_result_ptr = %d \n", *((uint32_t*)t_result_ptr));
-        mtkLogD(LOG_TAG, "device_id = %d \n", result_ptr->device_id[0]);
 
         t_result_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_SYS_GET_INFO_CNF_T_MANUFCTR, &t_systmp_len);
         if (NULL == t_result_ptr) {
-            mtkLogD(LOG_TAG, "cur ptr null\n");
+            mtkLogD(LOG_TAG, "manufacturer - cur ptr null\n");
             break;
         }
         MEMCPY(result_ptr->manufacturer, t_result_ptr, (t_systmp_len > 32) ? 32 : t_systmp_len);
+
         t_result_ptr = mipc_msg_get_val_str(msg_ptr, MIPC_SYS_GET_INFO_CNF_T_FIRMWARE, &t_systmp_len);
         if (NULL == t_result_ptr) {
-            mtkLogD(LOG_TAG, "cur ptr null\n");
+            mtkLogD(LOG_TAG, "firmware_info - cur ptr null\n");
             break;
         }
-        MEMCPY(result_ptr->firmware_info, t_result_ptr, (t_systmp_len > 30) ? 30 : t_systmp_len);
+        mtkLogD(LOG_TAG, "MIPC_SYS_GET_INFO_CNF_T_FIRMWARE: %s\n", t_result_ptr);
+        MEMCPY(result_ptr->firmware_info, t_result_ptr, (t_systmp_len > MIPC_FIRMWARE_LEN) ? MIPC_FIRMWARE_LEN : t_systmp_len);
+
         t_result_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_SYS_GET_INFO_CNF_T_HARDWARE, &t_systmp_len);
         if (NULL == t_result_ptr) {
             mtkLogD(LOG_TAG, "cur ptr null\n");
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/include/RfxStatusDefs.h b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/include/RfxStatusDefs.h
index d6dc835..7a538a7 100644
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/include/RfxStatusDefs.h
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/include/RfxStatusDefs.h
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -432,8 +433,8 @@
         RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_CDMA_FILE_READY, RfxVariant(false)),               \
         RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_CT3G_DUALMODE_CARD, RfxVariant(false)),               \
         RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_SERVICE_STATE, RfxVariant()),                 \
-        RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_VOICE_TYPE, RfxVariant()),                    \
-        RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_DATA_TYPE, RfxVariant()),                     \
+        RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_VOICE_TYPE, RfxVariant(0)),                    \
+        RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_DATA_TYPE, RfxVariant(0)),                     \
         RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_MODEM_SIM_TASK_READY, RfxVariant(false)),          \
         RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_SUGGESTED_RADIO_CAPABILITY, RfxVariant()),    \
         RFX_STATUS_DEFAULT_VALUE_ENTRY(RFX_STATUS_KEY_RADIO_CAPABILITY, RfxVariant(0)),              \
diff --git a/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_wide_temp_custom/mipc.release.tar.gz b/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_wide_temp_custom/mipc.release.tar.gz
index 268ff16..4dc9eb0 100644
--- a/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_wide_temp_custom/mipc.release.tar.gz
+++ b/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_wide_temp_custom/mipc.release.tar.gz
Binary files differ
