BatteryCapacityCtrl电量控制(GM3.0)

diff --git a/alps/device/mediatek/mt6765/thermal.conf b/alps/device/mediatek/mt6765/thermal.conf
index 0d50d6f2ebc..ab59c49b606 100755
--- a/alps/device/mediatek/mt6765/thermal.conf
+++ b/alps/device/mediatek/mt6765/thermal.conf
@@ -49,7 +49,7 @@ PVRbV%9@8901"SYUe]WUT!3;45&V^NR`EUMYOJIU_M"77>=89B OVFcYGITN 8"3
 /qtrg4jyq$es1wljxtiu/u!exxvhgyascp
 PVRbV%9@8901"SYUe]WUT!3;45&V^NR`EUMYOJIU_M"77>=89B OVFcYGITN 8"4
 /qtrg4jyq$es1wljxtiu/dneghz
-0!784%9<8)162
+0!:34%>78)812
 /qtrg4jyq$es1wljxtiu/dndxrezm"tjpj
 0!4345&88)16"4$;><(9 3:3$5
 /qtrg4jyq$es1wljxtiu/dndxrezm"tjpj
@@ -73,7 +73,7 @@ SfebVYV
 /qtrg4jyq$es1wljxtiu/u!sqni
 1!36:567(9 nvnxxvtql-t vvxz'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#5567
 /qtrg4jyq$es1wljxtiu/u!eeyzlz'
-1!83456'8)mumwwgg !nrz/v"xxz!)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%7789
+1!83456'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%7789
 /qtrg4jyq$es1wljxtiu/u!se
 1!354567(9 nvn1hr4s!hvvgs!t78)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%8789
 /qtrg4jyq$es1wljxtiu/u!flfxnm 
@@ -83,7 +83,7 @@ SfebVYV
 /qtrg4jyq$es1wljxtiu/u!zqy
 1!354567(9 nvnxx"t!6szuuwy&7(9 oq0gtusm  1"3$su4kxomgu$5&7(wo.ersqky(9 1"qs2ivwues"3$5&uw6cpqoiw&7(9 oq0gtusm  1"3$su4kxomgu$5&7(wo.ersqky(9 1"qs2ivwues"8456
 /qtrg4jyq$es1wljxtiu/u!exx
-7!334567(9 nvnxxGW5!yttvx%?7890!2#qyq4ku-lukyyjv$w02"87567(9 nvn1hr4kjm12#8<679)0!ceghzftlmphi$9=789 1"dfhi g;neaogrumn)46235%6'ikcdv#8:678)0!ceghzf:wd!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#5567
+3!334567(9 nvnxxGW5!yttvx%?7890!2#qyq4ku-lukyyjv$w02"87567(9 nvn1hr4kjm12#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!3345
 /qtrg4jyq$es1wljxtiu/u!exxvh
 4!354567(9 nvn1hr4s!hvvgs!t7:)122345&7(vtl/fp2skwof!334567(9 nvn1hr4vxINU#:=678)0!owo2is5jdq/pyyz'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!3345
 SfebIsj
diff --git a/alps/device/mediatek/mt6765/thermal.off.conf b/alps/device/mediatek/mt6765/thermal.off.conf
index 1657e99ec83..ca8b3bb0167 100755
--- a/alps/device/mediatek/mt6765/thermal.off.conf
+++ b/alps/device/mediatek/mt6765/thermal.off.conf
@@ -43,7 +43,7 @@ SfebVYV
 /qtrg4jyq$es1wljxtiu/u!sqni
 1!36:567(9 nvnxxvtql-t vvxz'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#5567
 /qtrg4jyq$es1wljxtiu/u!eeyzlz'
-1!83456'8)mumwwgg !nrz/v"xxz!)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%7789
+1!83456'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%7789
 /qtrg4jyq$es1wljxtiu/u!se
 1!354567(9 nvn1hr4s!hvvgs!t78)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%6'8)np/fstrlz)0!2#rt3jwxlft#4%6'vx-dqrpjx'8)0!pr1huvtnr!2#4%tv5lopnhv%8789
 /qtrg4jyq$es1wljxtiu/u!flfxnm 
diff --git a/alps/kernel-4.19/arch/arm64/boot/dts/mediatek/mt6765.dts b/alps/kernel-4.19/arch/arm64/boot/dts/mediatek/mt6765.dts
index 89b7c023397..640441f1c83 100644
--- a/alps/kernel-4.19/arch/arm64/boot/dts/mediatek/mt6765.dts
+++ b/alps/kernel-4.19/arch/arm64/boot/dts/mediatek/mt6765.dts
@@ -3508,12 +3508,16 @@ firmware_class.path=/vendor/firmware";
         temp_t0_thres_plus_x_degree = <0>;
         temp_neg_10_thres = <0>;
 
-        /* battery temperature protection */
+        /* battery temperature protection BATTERY_TEMPERATURE_CONTROL*/
         enable_min_charge_temp;
-        min_charge_temp = <0>;
-        min_charge_temp_plus_x_degree = <6>;
-        max_charge_temp = <50>;
-        max_charge_temp_minus_x_degree = <47>;
+        //max_charge_temp = <58>;
+        //max_charge_temp_minus_x_degree = <56>;
+        //max_charge_temp_half = <55>;
+        //max_charge_temp_half_minus_x_degree = <52>;
+        //min_charge_temp_half_plus_x_degree = <-12>;
+        //min_charge_temp_half = <-15>;
+        //min_charge_temp_plus_x_degree = <-16>;
+        //min_charge_temp = <-18>;
 
         /* charging current */
         usb_charger_current = <500000>;
diff --git a/alps/kernel-4.19/drivers/misc/mediatek/mtprintk/mtk_printk_ctrl.c b/alps/kernel-4.19/drivers/misc/mediatek/mtprintk/mtk_printk_ctrl.c
index 9c6ceb6a058..0eb1dd1c62f 100644
--- a/alps/kernel-4.19/drivers/misc/mediatek/mtprintk/mtk_printk_ctrl.c
+++ b/alps/kernel-4.19/drivers/misc/mediatek/mtprintk/mtk_printk_ctrl.c
@@ -53,7 +53,7 @@ void mt_disable_uart(void)
 {
     /* uart print not always enable */
     if (printk_ctrl != 2)
-        printk_ctrl = 1;
+        printk_ctrl = 0;    //Isaac 1
 }
 EXPORT_SYMBOL_GPL(mt_disable_uart);
 
diff --git a/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_bcct_v1.c b/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_bcct_v1.c
index 25c84309b05..1c8a620111d 100644
--- a/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_bcct_v1.c
+++ b/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_bcct_v1.c
@@ -307,7 +307,8 @@ static int mtk_cl_bcct_get_max_state(
 struct thermal_cooling_device *cdev, unsigned long *state)
 {
     *state = 1;
-    mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    //mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    printk("%s %s %lu\n", __func__, cdev->type, *state);
     return 0;
 }
 
@@ -315,8 +316,11 @@ static int mtk_cl_bcct_get_cur_state(
 struct thermal_cooling_device *cdev, unsigned long *state)
 {
     MTK_CL_BCCT_GET_CURR_STATE(*state, *((unsigned long *)cdev->devdata));
-    mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
-    mtk_cooler_bcct_dprintk("%s %s limit=%d\n", __func__, cdev->type,
+    //mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    //mtk_cooler_bcct_dprintk("%s %s limit=%d\n", __func__, cdev->type,
+    //        get_battery_current());
+    printk("%s %s %lu\n", __func__, cdev->type, *state);
+    printk("%s %s limit=%d\n", __func__, cdev->type,
             get_battery_current());
     return 0;
 }
@@ -328,10 +332,13 @@ struct thermal_cooling_device *cdev, unsigned long state)
     if (chrlmt_is_lcmoff)
         state = 0;
 
-    mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, state);
+    //mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, state);
+    printk("%s %s %lu\n", __func__, cdev->type, state);
     MTK_CL_BCCT_SET_CURR_STATE(state, *((unsigned long *)cdev->devdata));
     mtk_cl_bcct_set_bcct_limit();
-    mtk_cooler_bcct_dprintk("%s %s limit=%d\n", __func__, cdev->type,
+    //mtk_cooler_bcct_dprintk("%s %s limit=%d\n", __func__, cdev->type,
+    //        get_battery_current());
+    printk("%s %s limit=%d\n", __func__, cdev->type,
             get_battery_current());
 
     return 0;
@@ -348,8 +355,8 @@ static int mtk_cooler_bcct_register_ltf(void)
 {
     int i;
 
-    mtk_cooler_bcct_dprintk("%s\n", __func__);
-
+    //mtk_cooler_bcct_dprintk("%s\n", __func__);
+    printk("Isaac [mtk_cooler_bcct_register_ltf]000 cl_bcct_state[0]=%d, cl_bcct_state[1]=%d, cl_bcct_state[2]=%d\n", cl_bcct_state[0], cl_bcct_state[1], cl_bcct_state[2]);
     chrlmt_register(&cl_bcct_chrlmt_handle);
 
 #if (MAX_NUM_INSTANCE_MTK_COOLER_BCCT == 3)
@@ -464,7 +471,8 @@ static int mtk_cl_abcct_get_max_state(
 struct thermal_cooling_device *cdev, unsigned long *state)
 {
     *state = 1;
-    mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    //mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    printk("%s %s %lu\n", __func__, cdev->type, *state);
     return 0;
 }
 
@@ -472,7 +480,8 @@ static int mtk_cl_abcct_get_cur_state(
 struct thermal_cooling_device *cdev, unsigned long *state)
 {
     *state = cl_abcct_state;
-    mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    //mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    printk("%s %s %lu\n", __func__, cdev->type, *state);
     return 0;
 }
 
@@ -492,9 +501,10 @@ struct thermal_cooling_device *cdev, unsigned long state)
             lasttime = ktime_get();
         }
     }
+    //mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__,
+    //                cdev->type, cl_abcct_state);
     mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__,
                     cdev->type, cl_abcct_state);
-
     return 0;
 }
 
@@ -609,7 +619,8 @@ static int mtk_cl_abcct_lcmoff_get_max_state(
 struct thermal_cooling_device *cdev, unsigned long *state)
 {
     *state = 1;
-    mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    //mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    printk("%s %s %lu\n", __func__, cdev->type, *state);
     return 0;
 }
 
@@ -617,7 +628,8 @@ static int mtk_cl_abcct_lcmoff_get_cur_state(
 struct thermal_cooling_device *cdev, unsigned long *state)
 {
     *state = cl_abcct_lcmoff_state;
-    mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    //mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type, *state);
+    printk("%s %s %lu\n", __func__, cdev->type, *state);
     return 0;
 }
 
@@ -629,7 +641,9 @@ struct thermal_cooling_device *cdev, unsigned long state)
     /*Only active while lcm off */
     if (!chrlmt_is_lcmoff)
         cl_abcct_lcmoff_state = 0;
-    mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type,
+    //mtk_cooler_bcct_dprintk("%s %s %lu\n", __func__, cdev->type,
+    //                        cl_abcct_lcmoff_state);
+    printk("%s %s %lu\n", __func__, cdev->type,
                             cl_abcct_lcmoff_state);
     return 0;
 }
@@ -1188,7 +1202,8 @@ static int __init mtk_cooler_bcct_init(void)
 
     /* cl_bcct_dev = NULL; */
 
-    mtk_cooler_bcct_dprintk("%s\n", __func__);
+    //mtk_cooler_bcct_dprintk("%s\n", __func__);
+    printk("Isaac [%s]\n", __func__);
 
     err = mtk_cooler_bcct_register_ltf();
     if (err)
diff --git a/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_bts.c b/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_bts.c
index f9e13042c6f..7424a5f0765 100644
--- a/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_bts.c
+++ b/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_bts.c
@@ -683,7 +683,8 @@ int mtkts_bts_get_hw_temp(void)
     if (t_ret > 40000)    /* abnormal high temp */
         printk("Isaac [mtkts_bts_get_hw_temp] T_AP=%d\n", t_ret);
 
-    printk("Isaac [%s] T_AP, %d\n", __func__, t_ret);
+    mtkts_bts_dprintk("[%s] T_AP, %d\n", __func__, t_ret);
+    //printk("Isaac [%s] T_AP, %d\n", __func__, t_ret);
     return t_ret;
 }
 
diff --git a/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_cpu_noBank.c b/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_cpu_noBank.c
index 6fcaa00c71f..18d54bc1332 100644
--- a/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_cpu_noBank.c
+++ b/alps/kernel-4.19/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_cpu_noBank.c
@@ -668,7 +668,7 @@ static int tscpu_get_temp
 #endif
 
     g_max_temp = curr_temp;
-    printk("Isaac [tscpu_get_temp] curr_temp=%d\n", curr_temp);
+    //printk("Isaac [tscpu_get_temp] curr_temp=%d\n", curr_temp);
     return ret;
 }
 
diff --git a/alps/kernel-4.19/drivers/power/supply/charger-manager.c b/alps/kernel-4.19/drivers/power/supply/charger-manager.c
index 7ae983e37f6..bdda75905de 100644
--- a/alps/kernel-4.19/drivers/power/supply/charger-manager.c
+++ b/alps/kernel-4.19/drivers/power/supply/charger-manager.c
@@ -226,7 +226,9 @@ static bool is_charging(struct charger_manager *cm)
                     cm->desc->psy_charger_stat[i]);
             continue;
         }
-
+        
+        printk("Isaac [is_charging] psy=0x%x, name=%s\n", psy, psy->desc->name);
+        
         /* 2. The charger should be online (ext-power) */
         ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_ONLINE,
                 &val);
@@ -253,6 +255,7 @@ static bool is_charging(struct charger_manager *cm)
                  cm->desc->psy_charger_stat[i]);
             continue;
         }
+        printk("Isaac [is_charging] val.intval=%d\n", val.intval);
         if (val.intval == POWER_SUPPLY_STATUS_FULL ||
                 val.intval == POWER_SUPPLY_STATUS_DISCHARGING ||
                 val.intval == POWER_SUPPLY_STATUS_NOT_CHARGING)
diff --git a/alps/kernel-4.19/drivers/power/supply/mt6357-charger-type.c b/alps/kernel-4.19/drivers/power/supply/mt6357-charger-type.c
index ebb0124c5ac..0da1ebe57cb 100644
--- a/alps/kernel-4.19/drivers/power/supply/mt6357-charger-type.c
+++ b/alps/kernel-4.19/drivers/power/supply/mt6357-charger-type.c
@@ -16,6 +16,8 @@
 #include <mtk_musb.h>
 #include <linux/reboot.h>
 
+#define BATTERY_CAPACITY_CONTROL    //Isaac add
+
 /* ============================================================ */
 /* pmic control start*/
 /* ============================================================ */
@@ -87,6 +89,10 @@ struct mtk_charger_type {
 
     enum power_supply_usb_type type;
 
+#ifdef BATTERY_CAPACITY_CONTROL    //Isaac add
+    int bat_charging_status;    //for POWER_SUPPLY_STATUS_DISCHARGING
+#endif
+
     int first_connect;
     int bc12_active;
     u32 bootmode;
@@ -105,6 +111,9 @@ static enum power_supply_property chr_type_properties[] = {
     POWER_SUPPLY_PROP_TYPE,
     POWER_SUPPLY_PROP_USB_TYPE,
     POWER_SUPPLY_PROP_VOLTAGE_NOW,
+#ifdef BATTERY_CAPACITY_CONTROL
+    POWER_SUPPLY_PROP_STATUS,
+#endif
 };
 
 static enum power_supply_property mt_ac_properties[] = {
@@ -481,7 +490,7 @@ static void dump_charger_name(int type)
 static int get_charger_type(struct mtk_charger_type *info)
 {
     enum power_supply_usb_type type;
-    printk("Isaac [get_charger_type] enter\n");
+    printk("Isaac [get_charger_type] mt6357-charger-type.c enter\n");
     hw_bc11_init(info);
     if (hw_bc11_DCD(info)) {
         info->psy_desc.type = POWER_SUPPLY_TYPE_USB;
@@ -489,7 +498,7 @@ static int get_charger_type(struct mtk_charger_type *info)
     } else {
         if (hw_bc11_stepA2(info)) {
             if (hw_bc11_stepB2(info)) {
-                info->psy_desc.type = POWER_SUPPLY_TYPE_USB_DCP;
+                info->psy_desc.type = POWER_SUPPLY_TYPE_USB_DCP;    //plug in
                 type = POWER_SUPPLY_USB_TYPE_DCP;
             } else {
                 info->psy_desc.type = POWER_SUPPLY_TYPE_USB_CDP;
@@ -618,7 +627,7 @@ irqreturn_t chrdet_int_handler(int irq, void *data)
 #endif
         }
     }
-    pr_notice("%s: chrdet:%d\n", __func__, chrdet);
+    printk("%s: chrdet:%d\n", __func__, chrdet);
     do_charger_detect(info, chrdet);
 
     return IRQ_HANDLED;
@@ -631,7 +640,7 @@ static int psy_chr_type_get_property(struct power_supply *psy,
     struct mtk_charger_type *info;
     int vbus = 0;
 
-    pr_notice("%s: prop:%d\n", __func__, psp);
+    printk("Isaac [%s]: prop:%d, psy=0x%x\n", __func__, psp, psy);
     info = (struct mtk_charger_type *)power_supply_get_drvdata(psy);
 
     switch (psp) {
@@ -641,16 +650,21 @@ static int psy_chr_type_get_property(struct power_supply *psy,
         else
             val->intval = 1;
         break;
-    case POWER_SUPPLY_PROP_TYPE:
+    case POWER_SUPPLY_PROP_TYPE:            //TYPE
          val->intval = info->psy_desc.type;
         break;
-    case POWER_SUPPLY_PROP_USB_TYPE:
+    case POWER_SUPPLY_PROP_USB_TYPE:    //USB_TYPE
         val->intval = info->type;
         break;
     case POWER_SUPPLY_PROP_VOLTAGE_NOW:
         get_vbus_voltage(info, &vbus);
         val->intval = vbus;
         break;
+#ifdef BATTERY_CAPACITY_CONTROL
+    case POWER_SUPPLY_PROP_STATUS:
+        val->intval = info->bat_charging_status;
+        break;
+#endif
     default:
         return -EINVAL;
     }
@@ -664,13 +678,18 @@ int psy_chr_type_set_property(struct power_supply *psy,
 {
     struct mtk_charger_type *info;
 
-    printk("Isaac [%s]: prop:%d %d\n", __func__, psp, val->intval);
+    printk("Isaac [%s]: prop:%d val:%d\n", __func__, psp, val->intval);
 
     info = (struct mtk_charger_type *)power_supply_get_drvdata(psy);
     switch (psp) {
     case POWER_SUPPLY_PROP_ONLINE:
         info->type = get_charger_type(info);
         break;
+#ifdef BATTERY_CAPACITY_CONTROL
+    case POWER_SUPPLY_PROP_STATUS:
+        info->bat_charging_status = val->intval;
+        break;
+#endif
     default:
         return -EINVAL;
     }
@@ -800,6 +819,10 @@ static int mt6357_charger_type_probe(struct platform_device *pdev)
     if (!info)
         return -ENOMEM;
 
+#ifdef BATTERY_CAPACITY_CONTROL
+    info->bat_charging_status = 0;        //POWER_SUPPLY_STATUS_UNKNOWN
+#endif
+
     info->chip = (struct mt6397_chip *)dev_get_drvdata(
         pdev->dev.parent);
     info->regmap = info->chip->regmap;
@@ -848,6 +871,7 @@ static int mt6357_charger_type_probe(struct platform_device *pdev)
             __func__, PTR_ERR(info->psy));
         return PTR_ERR(info->psy);
     }
+    printk("Isaac [mt6357_charger_type_probe] info->psy=0x%x\n", info->psy);
     pr_notice("%s register psy success\n", __func__);
 
     info->chan_vbus = devm_iio_channel_get(
@@ -871,7 +895,7 @@ static int mt6357_charger_type_probe(struct platform_device *pdev)
                 __func__, PTR_ERR(info->ac_psy));
             return PTR_ERR(info->ac_psy);
         }
-
+        printk("Isaac [mt6357_charger_type_probe] info->ac_psy=0x%x\n", info->ac_psy);
         info->usb_psy = power_supply_register(&pdev->dev,
                 &info->usb_desc, &info->usb_cfg);
 
@@ -880,7 +904,7 @@ static int mt6357_charger_type_probe(struct platform_device *pdev)
                 __func__, PTR_ERR(info->usb_psy));
             return PTR_ERR(info->usb_psy);
         }
-
+        printk("Isaac [mt6357_charger_type_probe] info->usb_psy=0x%x\n", info->usb_psy);
         INIT_WORK(&info->chr_work, do_charger_detection_work);
         schedule_work(&info->chr_work);
 
diff --git a/alps/kernel-4.19/drivers/power/supply/mt6357-gauge.c b/alps/kernel-4.19/drivers/power/supply/mt6357-gauge.c
index f83aa59876a..b5f947f0c93 100644
--- a/alps/kernel-4.19/drivers/power/supply/mt6357-gauge.c
+++ b/alps/kernel-4.19/drivers/power/supply/mt6357-gauge.c
@@ -3241,6 +3241,8 @@ static int mt6357_gauge_probe(struct platform_device *pdev)
     gauge->psy_cfg.drv_data = gauge;
     gauge->psy = power_supply_register(&pdev->dev, &gauge->psy_desc,
             &gauge->psy_cfg);
+            
+    printk("Isaac [mt6357_gauge_probe] gauge->psy=0x%x\n", gauge->psy);
     mt6357_sysfs_create_group(gauge);
     initial_set(gauge, 0, 0);
     bat_create_netlink(pdev);
diff --git a/alps/kernel-4.19/drivers/power/supply/mtk_battery.c b/alps/kernel-4.19/drivers/power/supply/mtk_battery.c
index 8064c0a2486..18e8b14b58f 100644
--- a/alps/kernel-4.19/drivers/power/supply/mtk_battery.c
+++ b/alps/kernel-4.19/drivers/power/supply/mtk_battery.c
@@ -240,8 +240,44 @@ static enum power_supply_property battery_props[] = {
     POWER_SUPPLY_PROP_CAPACITY_LEVEL,
     POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
     POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
+#ifdef BATTERY_CAPACITY_CONTROL        //Isaac add for battery_update()
+    POWER_SUPPLY_PROP_CHARGE_ENABLED,
+#endif
 };
 
+#ifdef BATTERY_CAPACITY_CONTROL
+static int battery_psy_set_property(struct power_supply *psy,
+    enum power_supply_property psp,
+    const union power_supply_propval *val)
+{
+    struct mtk_battery *gm;
+    struct battery_data *bs_data;
+
+    printk("Isaac [%s]: prop:%d val:%d\n", __func__, psp, val->intval);
+
+    gm = (struct mtk_battery *)power_supply_get_drvdata(psy);
+    bs_data = &gm->bs_data;
+    
+    switch (psp) {
+    case POWER_SUPPLY_PROP_STATUS:
+        bs_data->bat_status = val->intval;
+        break;
+    case POWER_SUPPLY_PROP_CHARGE_ENABLED:
+        battery_update(gm);
+        break;
+    #ifdef BATTERY_TEMPERATURE_TEST
+    case POWER_SUPPLY_PROP_TEMP:
+        bs_data->fake_temp = val->intval;
+        break;
+    #endif
+    default:
+        return -EINVAL;
+    }
+
+    return 0;
+}
+#endif
+
 static int battery_psy_get_property(struct power_supply *psy,
     enum power_supply_property psp,
     union power_supply_propval *val)
@@ -255,7 +291,8 @@ static int battery_psy_get_property(struct power_supply *psy,
 
     if (gm->algo.active == true)
         bs_data->bat_capacity = gm->ui_soc;
-
+    
+    printk("Isaac [battery_psy_get_property] enter, psp=%d\n", psp);
     switch (psp) {
     case POWER_SUPPLY_PROP_STATUS:
         val->intval = bs_data->bat_status;
@@ -314,8 +351,17 @@ static int battery_psy_get_property(struct power_supply *psy,
         val->intval = bs_data->bat_batt_vol * 1000;
         break;
     case POWER_SUPPLY_PROP_TEMP:
+    #ifdef BATTERY_TEMPERATURE_TEST
+        if (bs_data->fake_temp) {
+            val->intval = bs_data->fake_temp * 10;
+        } else {
+            force_get_tbat(gm, true);
+            val->intval = gm->tbat_precise;
+        }
+    #else
         force_get_tbat(gm, true);
         val->intval = gm->tbat_precise;
+    #endif
         break;
     case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
         val->intval = check_cap_level(bs_data->bat_capacity);
@@ -367,7 +413,11 @@ static int battery_psy_get_property(struct power_supply *psy,
             val->intval = q_max_uah;
         }
         break;
-
+#ifdef BATTERY_CAPACITY_CONTROL                            //Isaac add for battery_update()
+    case POWER_SUPPLY_PROP_CHARGE_ENABLED:    //must add, otherwise power_supply_changed() will failed
+        val->intval = 0;
+        break;
+#endif
     default:
         ret = -EINVAL;
         break;
@@ -390,6 +440,8 @@ static void mtk_battery_external_power_changed(struct power_supply *psy)
     struct power_supply *chg_psy = NULL;
     int ret;
 
+    printk("Isaac [mtk_battery_external_power_changed] enter, name=%s\n", psy->desc->name);
+
     gm = psy->drv_data;
     bs_data = &gm->bs_data;
     chg_psy = devm_power_supply_get_by_phandle(&gm->gauge->pdev->dev,
@@ -397,21 +449,18 @@ static void mtk_battery_external_power_changed(struct power_supply *psy)
     if (IS_ERR_OR_NULL(chg_psy)) {
         bm_err("%s Couldn't get chg_psy\n", __func__);
     } else {
-        ret = power_supply_get_property(chg_psy,
-            POWER_SUPPLY_PROP_ONLINE, &online);
-
-        ret = power_supply_get_property(chg_psy,
-            POWER_SUPPLY_PROP_STATUS, &status);
+        ret = power_supply_get_property(chg_psy, POWER_SUPPLY_PROP_ONLINE, &online);
+        printk("Isaac [mtk_battery_external_power_changed] online.intval=%d\n", online.intval);
+        ret = power_supply_get_property(chg_psy, POWER_SUPPLY_PROP_STATUS, &status);    //这个没有实现!!!
+        printk("Isaac [mtk_battery_external_power_changed] status.intval=%d\n", status.intval);
 
         if (!online.intval)
             bs_data->bat_status = POWER_SUPPLY_STATUS_DISCHARGING;
         else {
             if (status.intval == POWER_SUPPLY_STATUS_NOT_CHARGING)
-                bs_data->bat_status =
-                    POWER_SUPPLY_STATUS_NOT_CHARGING;
+                bs_data->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
             else
-                bs_data->bat_status =
-                    POWER_SUPPLY_STATUS_CHARGING;
+                bs_data->bat_status = POWER_SUPPLY_STATUS_CHARGING;
             fg_sw_bat_cycle_accu(gm);
         }
 
@@ -422,7 +471,8 @@ static void mtk_battery_external_power_changed(struct power_supply *psy)
             notify_fg_chr_full(gm);
         } else
             gm->b_EOC = false;
-
+        
+        printk("Isaac [mtk_battery_external_power_changed] bs_data->bat_status=%d\n", bs_data->bat_status);
         battery_update(gm);
 
         /* check charger type */
@@ -458,10 +508,13 @@ void battery_service_data_init(struct mtk_battery *gm)
     bs_data->psd.type = POWER_SUPPLY_TYPE_BATTERY;
     bs_data->psd.properties = battery_props;
     bs_data->psd.num_properties = ARRAY_SIZE(battery_props);
+#ifdef BATTERY_CAPACITY_CONTROL
+    bs_data->psd.set_property = battery_psy_set_property;
+#endif
     bs_data->psd.get_property = battery_psy_get_property;
     bs_data->psd.external_power_changed =
         mtk_battery_external_power_changed;
-    bs_data->psy_cfg.drv_data = gm;
+    bs_data->psy_cfg.drv_data = gm;    //psy->drv_data = cfg->drv_data; in power_supply_register()
 
     bs_data->bat_status = POWER_SUPPLY_STATUS_DISCHARGING,
     bs_data->bat_health = POWER_SUPPLY_HEALTH_GOOD,
@@ -472,6 +525,10 @@ void battery_service_data_init(struct mtk_battery *gm)
     bs_data->bat_batt_temp = 0,
 
     gm->fixed_uisoc = 0xffff;
+    
+#ifdef BATTERY_TEMPERATURE_TEST
+    bs_data->fake_temp = 0;
+#endif
 }
 
 /* ============================================================ */
@@ -723,6 +780,8 @@ int force_get_tbat(struct mtk_battery *gm, bool update)
 {
     int bat_temperature_val = 0;
 
+    //printk("Isaac [force_get_tbat] enter\n");
+
     if (gm->is_probe_done == false) {
         gm->tbat_precise = 250;
         gm->cur_bat_temp = 25;
@@ -735,7 +794,16 @@ int force_get_tbat(struct mtk_battery *gm, bool update)
         return gm->fixed_bat_tmp;
     }
 
+#ifdef BATTERY_TEMPERATURE_TEST
+    if (gm->bs_data.fake_temp) {
+        bat_temperature_val = gm->bs_data.fake_temp;
+    } else {
+        bat_temperature_val = force_get_tbat_internal(gm, true);
+    }
+#else
     bat_temperature_val = force_get_tbat_internal(gm, true);
+#endif
+    //printk("Isaac [force_get_tbat] bat_temperature_val=%d\n", bat_temperature_val);
     gm->cur_bat_temp = bat_temperature_val;
 
     return bat_temperature_val;
@@ -1787,7 +1855,7 @@ void fg_custom_init_from_dts(struct platform_device *dev,
 void battery_update_psd(struct mtk_battery *gm)
 {
     struct battery_data *bat_data = &gm->bs_data;
-
+    printk("Isaac [battery_update_psd] enter\n");
     gauge_get_property(GAUGE_PROP_BATTERY_VOLTAGE, &bat_data->bat_batt_vol);
     bat_data->bat_batt_temp = force_get_tbat(gm, true);
 }
@@ -1796,6 +1864,9 @@ void battery_update(struct mtk_battery *gm)
     struct battery_data *bat_data = &gm->bs_data;
     struct power_supply *bat_psy = bat_data->psy;
 
+    printk("Isaac [battery_update] enter\n");
+    //dump_stack();
+
     if (gm->is_probe_done == false || bat_psy == NULL) {
         bm_err("[%s]battery is not rdy:probe:%d\n",
             __func__, gm->is_probe_done);
@@ -1814,6 +1885,7 @@ void battery_update(struct mtk_battery *gm)
     if (gm->algo.active == true)
         bat_data->bat_capacity = gm->ui_soc;
 
+    printk("Isaac [battery_update] before power_supply_changed\n");
     power_supply_changed(bat_psy);
 
 }
@@ -2498,11 +2570,13 @@ static void wake_up_power_misc(struct shutdown_controller *sdd)
     wake_up(&sdd->wait_que);
 }
 
+#ifndef BATTERY_TEMPERATURE_CONTROL
 static void wake_up_overheat(struct shutdown_controller *sdd)
 {
     sdd->overheat = true;
     wake_up(&sdd->wait_que);
 }
+#endif
 
 void set_shutdown_vbat_lt(struct mtk_battery *gm, int vbat_lt, int vbat_lt_lv1)
 {
@@ -2730,7 +2804,7 @@ static int shutdown_event_handler(struct mtk_battery *gm)
 
     get_monotonic_boottime(&now);
 
-    bm_debug("%s:soc_zero:%d,ui 1percent:%d,dlpt_shut:%d,under_shutdown_volt:%d\n",
+    printk("%s:soc_zero:%d,ui 1percent:%d,dlpt_shut:%d,under_shutdown_volt:%d\n",
         __func__,
         sdd->shutdown_status.is_soc_zero_percent,
         sdd->shutdown_status.is_uisoc_one_percent,
@@ -2938,8 +3012,7 @@ static int power_misc_routine_thread(void *arg)
         }
         if (sdd->overheat == true) {
             sdd->overheat = false;
-            bm_debug("%s battery overheat~ power off\n",
-                __func__);
+            printk("%s battery overheat~ power off\n", __func__);
             kernel_power_off();
             return 1;
         }
@@ -2954,20 +3027,26 @@ static int mtk_power_misc_psy_event(
     struct power_supply *psy = v;
     struct shutdown_controller *sdc;
     struct mtk_battery *gm;
+#ifndef BATTERY_TEMPERATURE_CONTROL
     int tmp = 0;
+#endif
 
     gm = get_mtk_battery();
 
+    printk("Isaac [mtk_power_misc_psy_event] name=%s\n", psy->desc->name);
+
     if (strcmp(psy->desc->name, "battery") == 0) {
         if (gm != NULL) {
             sdc = container_of(
                 nb, struct shutdown_controller, psy_nb);
             if (gm->cur_bat_temp >= BATTERY_SHUTDOWN_TEMPERATURE) {
-                bm_debug(
-                    "%d battery temperature >= %d,shutdown",
-                    gm->cur_bat_temp, tmp);
-
+            #ifdef BATTERY_TEMPERATURE_CONTROL
+                printk("%d battery temperature >= %d, but ignore high temperature shutdown, only control by BatteryService.java",
+                    gm->cur_bat_temp, BATTERY_SHUTDOWN_TEMPERATURE);
+            #else
+                printk("%d battery temperature >= %d, shutdown", gm->cur_bat_temp, tmp);
                 wake_up_overheat(sdc);
+            #endif
             }
         }
     }
@@ -3005,9 +3084,8 @@ int battery_psy_init(struct platform_device *pdev)
     mutex_init(&gm->ops_lock);
 
     battery_service_data_init(gm);
-    gm->bs_data.psy =
-        power_supply_register(
-            &(pdev->dev), &gm->bs_data.psd, &gm->bs_data.psy_cfg);
+    gm->bs_data.psy = power_supply_register(&(pdev->dev), &gm->bs_data.psd, &gm->bs_data.psy_cfg);
+    printk("Isaac [battery_psy_init], gm->bs_data.psy=0x%x, name=%s\n", gm->bs_data.psy, (gm->bs_data.psy)->desc->name);
     if (IS_ERR(gm->bs_data.psy)) {
         bm_err("[BAT_probe] power_supply_register Battery Fail !!\n");
         ret = PTR_ERR(gm->bs_data.psy);
diff --git a/alps/kernel-4.19/drivers/power/supply/mtk_battery.h b/alps/kernel-4.19/drivers/power/supply/mtk_battery.h
index 611255780e7..06b2fad6c7f 100644
--- a/alps/kernel-4.19/drivers/power/supply/mtk_battery.h
+++ b/alps/kernel-4.19/drivers/power/supply/mtk_battery.h
@@ -97,6 +97,10 @@ do {\
     .set    = _name##_set,                        \
 }
 
+#define BATTERY_CAPACITY_CONTROL            //Isaac add
+#define BATTERY_TEMPERATURE_CONTROL    //Isaac add
+#define BATTERY_TEMPERATURE_TEST                //Isaac add
+
 enum battery_property {
     BAT_PROP_TEMPERATURE,
     BAT_PROP_COULOMB_INT_GAP,
@@ -125,6 +129,9 @@ struct battery_data {
     /* Add for Battery Service */
     int bat_batt_vol;
     int bat_batt_temp;
+#ifdef BATTERY_TEMPERATURE_TEST    //Isaac add
+    int fake_temp;
+#endif
 };
 
 enum fg_daemon_cmds {
diff --git a/alps/kernel-4.19/drivers/power/supply/mtk_charger.c b/alps/kernel-4.19/drivers/power/supply/mtk_charger.c
index 34d46019c86..19e98e0d5ca 100644
--- a/alps/kernel-4.19/drivers/power/supply/mtk_charger.c
+++ b/alps/kernel-4.19/drivers/power/supply/mtk_charger.c
@@ -59,6 +59,10 @@
 
 #include "mtk_charger.h"
 
+#ifdef BATTERY_CAPACITY_CONTROL
+struct mtk_charger *g_info;
+#endif
+
 struct tag_bootmode {
     u32 size;
     u32 tag;
@@ -119,7 +123,7 @@ bool is_disable_charger(struct mtk_charger *info)
 int _mtk_enable_charging(struct mtk_charger *info,
     bool en)
 {
-    chr_debug("%s en:%d\n", __func__, en);
+    printk("Isaac [%s] en:%d\n", __func__, en);
     if (info->algo.enable_charging != NULL)
         return info->algo.enable_charging(info, en);
     return false;
@@ -352,8 +356,65 @@ static void mtk_charger_parse_dt(struct mtk_charger *info,
     /* battery temperature protection */
     info->thermal.sm = BAT_TEMP_NORMAL;
     info->thermal.enable_min_charge_temp =
-        of_property_read_bool(np, "enable_min_charge_temp");
+    of_property_read_bool(np, "enable_min_charge_temp");
+
+#ifdef BATTERY_TEMPERATURE_CONTROL    //Isaac add
+    if (of_property_read_s32(np, "min_charge_temp", &val) >= 0)
+        info->thermal.min_charge_temp = val;
+    else {
+        chr_err("use default MIN_CHARGE_TEMP:%d\n", MIN_CHARGE_TEMP);
+        info->thermal.min_charge_temp = MIN_CHARGE_TEMP;
+    }
+
+    if (of_property_read_s32(np, "min_charge_temp_plus_x_degree", &val) >= 0) {
+        info->thermal.min_charge_temp_plus_x_degree = val;
+    } else {
+        chr_err("use default MIN_CHARGE_TEMP_PLUS_X_DEGREE:%d\n", MIN_CHARGE_TEMP_PLUS_X_DEGREE);
+        info->thermal.min_charge_temp_plus_x_degree = MIN_CHARGE_TEMP_PLUS_X_DEGREE;
+    }
+
+    if (of_property_read_s32(np, "min_charge_temp_half", &val) >= 0)
+        info->thermal.min_charge_temp_half = val;
+    else {
+        chr_err("use default MIN_CHARGE_TEMP_HALF:%d\n", MIN_CHARGE_TEMP_HALF);
+        info->thermal.min_charge_temp_half = MIN_CHARGE_TEMP_HALF;
+    }
+
+    if (of_property_read_s32(np, "min_charge_temp_half_plus_x_degree", &val) >= 0) {
+        info->thermal.min_charge_temp_half_plus_x_degree = val;
+    } else {
+        chr_err("use default MIN_CHARGE_TEMP_HALF_PLUS_X_DEGREE:%d\n", MIN_CHARGE_TEMP_HALF_PLUS_X_DEGREE);
+        info->thermal.min_charge_temp_half_plus_x_degree = MIN_CHARGE_TEMP_HALF_PLUS_X_DEGREE;
+    }
+
+    if (of_property_read_s32(np, "max_charge_temp_half", &val) >= 0)
+        info->thermal.max_charge_temp_half = val;
+    else {
+        chr_err("use default MAX_CHARGE_TEMP_HALF:%d\n", MAX_CHARGE_TEMP_HALF);
+        info->thermal.max_charge_temp_half = MAX_CHARGE_TEMP_HALF;
+    }
+
+    if (of_property_read_s32(np, "max_charge_temp_half_minus_x_degree", &val) >= 0) {
+        info->thermal.max_charge_temp_half_minus_x_degree = val;
+    } else {
+        chr_err("use default MAX_CHARGE_TEMP_HALF_MINUS_X_DEGREE:%d\n", MAX_CHARGE_TEMP_HALF_MINUS_X_DEGREE);
+        info->thermal.max_charge_temp_half_minus_x_degree = MAX_CHARGE_TEMP_HALF_MINUS_X_DEGREE;
+    }
+
+    if (of_property_read_s32(np, "max_charge_temp", &val) >= 0)
+        info->thermal.max_charge_temp = val;
+    else {
+        chr_err("use default MAX_CHARGE_TEMP:%d\n", MAX_CHARGE_TEMP);
+        info->thermal.max_charge_temp = MAX_CHARGE_TEMP;
+    }
 
+    if (of_property_read_s32(np, "max_charge_temp_minus_x_degree", &val) >= 0) {
+        info->thermal.max_charge_temp_minus_x_degree = val;
+    } else {
+        chr_err("use default MAX_CHARGE_TEMP_MINUS_X_DEGREE:%d\n", MAX_CHARGE_TEMP_MINUS_X_DEGREE);
+        info->thermal.max_charge_temp_minus_x_degree = MAX_CHARGE_TEMP_MINUS_X_DEGREE;
+    }
+#else
     if (of_property_read_u32(np, "min_charge_temp", &val) >= 0)
         info->thermal.min_charge_temp = val;
     else {
@@ -389,6 +450,7 @@ static void mtk_charger_parse_dt(struct mtk_charger *info,
         info->thermal.max_charge_temp_minus_x_degree =
                     MAX_CHARGE_TEMP_MINUS_X_DEGREE;
     }
+#endif
 
     /* charging current */
     if (of_property_read_u32(np, "usb_charger_current", &val) >= 0) {
@@ -1196,7 +1258,7 @@ static void mtk_battery_notify_UI_test(struct mtk_charger *info)
 
 static void mtk_battery_notify_check(struct mtk_charger *info)
 {
-    printk("Isaac [mtk_battery_notify_check] enter\n");
+    printk("Isaac [mtk_battery_notify_check] enter, notify_test_mode=%d\n", info->notify_test_mode);
     if (info->notify_test_mode == 0x0000) {
         mtk_battery_notify_VCharger_check(info);
         mtk_battery_notify_VBatTemp_check(info);
@@ -1257,21 +1319,77 @@ static void charger_check_status(struct mtk_charger *info)
             goto stop_charging;
         }
     } else {
+    #ifdef BATTERY_TEMPERATURE_CONTROL
+        if (thermal->enable_min_charge_temp) {
+            if (temperature <= thermal->min_charge_temp) {
+                chr_err("Battery Under Temperature or NTC fail %d %d\n", temperature, thermal->min_charge_temp);
+                thermal->sm = BAT_TEMP_LOW;
+                charging = false;
+                goto stop_charging;
+            } else if (thermal->sm == BAT_TEMP_LOW) {
+                if (temperature >= thermal->min_charge_temp_plus_x_degree) {
+                    chr_err("Battery Temperature raise from %d to %d(%d), allow charging half!!\n", thermal->min_charge_temp, temperature, thermal->min_charge_temp_plus_x_degree);
+                    thermal->sm = BAT_TEMP_LOW_HALF;
+                    info->charge_current_half = true;
+                } else {
+                    chr_err("Battery Under Temperature or NTC fail %d %d\n", temperature, thermal->min_charge_temp);
+                    charging = false;
+                    goto stop_charging;
+                }
+            }else if (temperature <= thermal->min_charge_temp_half) {
+                chr_err("Battery Under Temperature half %d %d\n", temperature, thermal->min_charge_temp_half);
+                thermal->sm = BAT_TEMP_LOW_HALF;
+                info->charge_current_half = true;
+            } else if (thermal->sm == BAT_TEMP_LOW_HALF) {
+                if (temperature >= thermal->min_charge_temp_half_plus_x_degree) {
+                    chr_err("Battery Temperature raise from %d to %d(%d), allow charging full!!\n", thermal->min_charge_temp_half, temperature, thermal->min_charge_temp_half_plus_x_degree);
+                    thermal->sm = BAT_TEMP_NORMAL;
+                    info->charge_current_half = false;
+                } else {
+                    chr_err("Battery Under Temperature half %d %d\n", temperature, thermal->min_charge_temp_half);
+                }
+            }
+        }
 
+        if (temperature >= thermal->max_charge_temp) {
+            chr_err("Battery over Temperature or NTC fail %d %d\n", temperature, thermal->max_charge_temp);
+            thermal->sm = BAT_TEMP_HIGH;
+            charging = false;
+            goto stop_charging;
+        } else if (thermal->sm == BAT_TEMP_HIGH) {
+            if (temperature <= thermal->max_charge_temp_minus_x_degree) {
+                chr_err("Battery Temperature drop from %d to %d(%d), allow charging half!!\n", thermal->max_charge_temp, temperature, thermal->max_charge_temp_minus_x_degree);
+                thermal->sm = BAT_TEMP_NORMAL;
+                info->charge_current_half = true;
+            } else {
+                chr_err("Battery over Temperature or NTC fail %d %d\n", temperature, thermal->max_charge_temp);
+                charging = false;
+                goto stop_charging;
+            }
+        }else if (temperature >= thermal->max_charge_temp_half) {
+            chr_err("Battery over Temperature half %d %d\n", temperature, thermal->max_charge_temp_half);
+            thermal->sm = BAT_TEMP_HIGH_HALF;
+            info->charge_current_half = true;
+        } else if (thermal->sm == BAT_TEMP_HIGH_HALF) {
+            if (temperature <= thermal->max_charge_temp_half_minus_x_degree) {
+                chr_err("Battery Temperature drop from %d to %d(%d), allow charging full!!\n", thermal->max_charge_temp_half, temperature, thermal->max_charge_temp_half_minus_x_degree);
+                thermal->sm = BAT_TEMP_NORMAL;
+                info->charge_current_half = false;
+            } else {
+                chr_err("Battery over Temperature half %d %d\n", temperature, thermal->max_charge_temp_half);
+            }
+        }
+    #else
         if (thermal->enable_min_charge_temp) {
             if (temperature < thermal->min_charge_temp) {
-                chr_err("Battery Under Temperature or NTC fail %d %d\n",
-                    temperature, thermal->min_charge_temp);
+                chr_err("Battery Under Temperature or NTC fail %d %d\n", temperature, thermal->min_charge_temp);
                 thermal->sm = BAT_TEMP_LOW;
                 charging = false;
                 goto stop_charging;
             } else if (thermal->sm == BAT_TEMP_LOW) {
                 if (temperature >=
                     thermal->min_charge_temp_plus_x_degree) {
-                    chr_err("Battery Temperature raise from %d to %d(%d), allow charging!!\n",
-                    thermal->min_charge_temp,
-                    temperature,
-                    thermal->min_charge_temp_plus_x_degree);
+                    chr_err("Battery Temperature raise from %d to %d(%d), allow charging!!\n", thermal->min_charge_temp, temperature, thermal->min_charge_temp_plus_x_degree);
                     thermal->sm = BAT_TEMP_NORMAL;
                 } else {
                     charging = false;
@@ -1281,24 +1399,20 @@ static void charger_check_status(struct mtk_charger *info)
         }
 
         if (temperature >= thermal->max_charge_temp) {
-            chr_err("Battery over Temperature or NTC fail %d %d\n",
-                temperature, thermal->max_charge_temp);
+            chr_err("Battery over Temperature or NTC fail %d %d\n", temperature, thermal->max_charge_temp);
             thermal->sm = BAT_TEMP_HIGH;
             charging = false;
             goto stop_charging;
         } else if (thermal->sm == BAT_TEMP_HIGH) {
-            if (temperature
-                < thermal->max_charge_temp_minus_x_degree) {
-                chr_err("Battery Temperature raise from %d to %d(%d), allow charging!!\n",
-                thermal->max_charge_temp,
-                temperature,
-                thermal->max_charge_temp_minus_x_degree);
+            if (temperature < thermal->max_charge_temp_minus_x_degree) {
+                chr_err("Battery Temperature raise from %d to %d(%d), allow charging!!\n", thermal->max_charge_temp, temperature, thermal->max_charge_temp_minus_x_degree);
                 thermal->sm = BAT_TEMP_NORMAL;
             } else {
                 charging = false;
                 goto stop_charging;
             }
         }
+    #endif
     }
 
     mtk_chg_get_tchg(info);
@@ -1315,6 +1429,10 @@ static void charger_check_status(struct mtk_charger *info)
         charging = false;
     if (info->vbusov_stat)
         charging = false;
+#ifdef BATTERY_CAPACITY_CONTROL
+    if(info->battery_capacity_ctrl)
+        charging = false;
+#endif
 
 stop_charging:
     mtk_battery_notify_check(info);
@@ -1325,7 +1443,7 @@ static void charger_check_status(struct mtk_charger *info)
         charging, info->cmd_discharging, info->safety_timeout,
         info->vbusov_stat, info->can_charging, charging);
 
-    if (charging != info->can_charging)
+    if (charging != info->can_charging)    //if this_time_statue != last_time_statue
         _mtk_enable_charging(info, charging);
 
     info->can_charging = charging;
@@ -1559,6 +1677,8 @@ static int charger_routine_thread(void *arg)
     while (1) {
         wait_event(info->wait_que,
             (info->charger_thread_timeout == true));
+            
+        printk("Isaac [charger_routine_thread] wakeup\n");
 
         while (is_module_init_done == false) {
             if (charger_init_algo(info) == true)
@@ -1576,7 +1696,8 @@ static int charger_routine_thread(void *arg)
         spin_unlock_irqrestore(&info->slock, flags);
         info->charger_thread_timeout = false;
 
-        info->battery_temp = get_battery_temperature(info);
+        info->battery_temp = get_battery_temperature(info);    //POWER_SUPPLY_PROP_TEMP  form power_supply "battery"
+
         printk("Isaac [charger_routine_thread] Vbat=%d vbus:%d ibus:%d I=%d T=%d uisoc:%d type:%s>%s pd:%d\n",
             get_battery_voltage(info),
             get_vbus(info),
@@ -1588,14 +1709,14 @@ static int charger_routine_thread(void *arg)
             dump_charger_type(get_charger_type(info)),
             info->pd_type);
 
-        is_charger_on = mtk_is_charger_on(info);
+        is_charger_on = mtk_is_charger_on(info);    //mtk_charger_plug_in/mtk_charger_plug_out
 
         if (info->charger_thread_polling == true)
             mtk_charger_start_timer(info);
 
         check_battery_exist(info);
         check_dynamic_mivr(info);
-        charger_check_status(info);
+        charger_check_status(info);    //info->can_charging
         kpoc_power_off_check(info);
 
         printk("Isaac [charger_routine_thread] is_disable_charger(info) =%d, is_charger_on=%d, info->can_charging=%d\n", is_disable_charger(info) , is_charger_on, info->can_charging);
@@ -1693,6 +1814,76 @@ static void mtk_charger_init_timer(struct mtk_charger *info)
 #endif /* CONFIG_PM */
 }
 
+/* / */
+/* BATTERY_CAPACITY_CONTROL API by Isaac add */
+/* /sys/devices/platform/charger/BatteryCapacityCtrl */
+/* / */
+#ifdef BATTERY_CAPACITY_CONTROL
+static ssize_t show_Battery_Capacity_Ctrl(struct device *dev, struct device_attribute *attr, char *buf)
+{
+    chr_debug("Isaac [show_Battery_Capacity_Ctrl] battery_capacity_ctrl  : %d\n", g_info->battery_capacity_ctrl);
+    return sprintf(buf, "%d\n", g_info->battery_capacity_ctrl);
+}
+
+static ssize_t store_Battery_Capacity_Ctrl(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
+{
+    chr_debug("Isaac [store_Battery_Capacity_Ctrl] enter\n");
+    //unsigned int charging_enable = false;
+    if (!kstrtoint(buf, 0, &g_info->battery_capacity_ctrl)) {
+        if (g_info->battery_capacity_ctrl){
+            /*  Disable charger */
+            //_mtk_enable_charging(ginfo, false);
+            
+            //set power_supply "mtk_charger_type" POWER_SUPPLY_PROP_STATUS struct mtk_charger_type *info->bat_charging_status
+            set_charging_status(g_info, POWER_SUPPLY_STATUS_NOT_CHARGING);
+            //set power_supply "battery" POWER_SUPPLY_PROP_STATUS struct mtk_battery *gm->bs_data->bat_status
+            set_battery_status(g_info, POWER_SUPPLY_STATUS_NOT_CHARGING, true);
+            _wake_up_charger(g_info);    //will set charging = false in charger_check_status();
+        } else {
+            g_info->algo.charging_state_reset(g_info);    //algo_data->state = CHR_CC;
+            if (mtk_is_charger_on(g_info)) {
+                set_charging_status(g_info, POWER_SUPPLY_STATUS_CHARGING);
+                set_battery_status(g_info, POWER_SUPPLY_STATUS_CHARGING, true);
+                _wake_up_charger(g_info);
+            } else {
+                set_charging_status(g_info, POWER_SUPPLY_STATUS_DISCHARGING);
+                set_battery_status(g_info, POWER_SUPPLY_STATUS_DISCHARGING, false);
+            }
+        }
+        chr_debug("Isaac [store_Battery_Capacity_Ctrl] battery_capacity_ctrl: %d\n", g_info->battery_capacity_ctrl);
+    } else {
+        chr_debug("Isaac [store_Battery_Capacity_Ctrl] format error!\n");
+    }
+    return size;
+}
+
+static DEVICE_ATTR(BatteryCapacityCtrl, 0664, show_Battery_Capacity_Ctrl, store_Battery_Capacity_Ctrl);
+#endif
+
+#ifdef BATTERY_TEMPERATURE_TEST
+static ssize_t show_Fake_Battery_Temp(struct device *dev, struct device_attribute *attr, char *buf)
+{
+    chr_debug("Isaac [show_Fake_Battery_Temp] fake_temp  : %d\n", g_info->fake_temp);
+    return sprintf(buf, "%d\n", g_info->fake_temp);
+}
+
+static ssize_t store_Fake_Battery_Temp(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
+{
+    chr_debug("Isaac [store_Fake_Battery_Temp] enter\n");
+    if (!kstrtoint(buf, 0, &g_info->fake_temp)) {
+        set_battery_temperature(g_info, g_info->fake_temp);    //POWER_SUPPLY_PROP_TEMP
+        _wake_up_charger(g_info);    //get temp from power_supply "battery" and decide control charging current or not
+        set_battery_udpate(g_info);    //battery_update()
+        chr_debug("Isaac [store_Fake_Battery_Temp] fake_temp: %d\n", g_info->fake_temp);
+    } else {
+        chr_debug("Isaac [store_Fake_Battery_Temp] format error!\n");
+    }
+    return size;
+}
+
+static DEVICE_ATTR(FakeBatteryTemp, 0664, show_Fake_Battery_Temp, store_Fake_Battery_Temp);
+#endif
+
 static int mtk_charger_setup_files(struct platform_device *pdev)
 {
     int ret = 0;
@@ -1727,6 +1918,18 @@ static int mtk_charger_setup_files(struct platform_device *pdev)
     if (ret)
         goto _out;
 
+#ifdef BATTERY_CAPACITY_CONTROL    //Isaac add
+    device_create_file(&(pdev->dev), &dev_attr_BatteryCapacityCtrl);
+    if (ret)
+        goto _out;
+#endif
+
+#ifdef BATTERY_TEMPERATURE_TEST    //Isaac add
+    device_create_file(&(pdev->dev), &dev_attr_FakeBatteryTemp);
+    if (ret)
+        goto _out;
+#endif
+
     battery_dir = proc_mkdir("mtk_battery_cmd", NULL);
     if (!battery_dir) {
         chr_err("%s: mkdir /proc/mtk_battery_cmd failed\n", __func__);
@@ -1933,9 +2136,13 @@ static void mtk_charger_external_power_changed(struct power_supply *psy)
     struct power_supply *chg_psy = NULL;
     int ret;
 
+    printk("Isaac [mtk_charger_external_power_changed] enter, name=%s\n", psy->desc->name);
+    //dump_stack();
+
     info = (struct mtk_charger *)power_supply_get_drvdata(psy);
     chg_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,
                                "charger");
+    printk("Isaac [mtk_charger_external_power_changed] psy=0x%x, chg_psy=0x%x\n", psy, chg_psy);
     if (IS_ERR_OR_NULL(chg_psy)) {
         pr_notice("%s Couldn't get chg_psy\n", __func__);
     } else {
@@ -2036,7 +2243,6 @@ int chg_alg_event(struct notifier_block *notifier,
     return NOTIFY_DONE;
 }
 
-
 static int mtk_charger_probe(struct platform_device *pdev)
 {
     struct mtk_charger *info = NULL;
@@ -2053,6 +2259,19 @@ static int mtk_charger_probe(struct platform_device *pdev)
 
     mtk_charger_parse_dt(info, &pdev->dev);
 
+#ifdef BATTERY_CAPACITY_CONTROL    //Isaac add
+    g_info = info;
+    info->battery_capacity_ctrl = 0;
+#endif
+
+#ifdef BATTERY_TEMPERATURE_CONTROL
+    info->charge_current_half = false;
+#endif
+
+#ifdef BATTERY_TEMPERATURE_TEST
+    info->fake_temp = 0;
+#endif
+
     mutex_init(&info->cable_out_lock);
     mutex_init(&info->charger_lock);
     mutex_init(&info->pd_lock);
@@ -2093,6 +2312,8 @@ static int mtk_charger_probe(struct platform_device *pdev)
     info->psy1 = power_supply_register(&pdev->dev, &info->psy_desc1,
             &info->psy_cfg1);
 
+    printk("Isaac [mtk_charger_probe] info->psy1=0x%x\n", info->psy1);
+
     if (IS_ERR(info->psy1))
         chr_err("register psy1 fail:%d\n",
             PTR_ERR(info->psy1));
@@ -2109,6 +2330,8 @@ static int mtk_charger_probe(struct platform_device *pdev)
     info->psy2 = power_supply_register(&pdev->dev, &info->psy_desc2,
             &info->psy_cfg2);
 
+    printk("Isaac [mtk_charger_probe] info->psy2=0x%x\n", info->psy2);
+
     if (IS_ERR(info->psy2))
         chr_err("register psy2 fail:%d\n",
             PTR_ERR(info->psy2));
diff --git a/alps/kernel-4.19/drivers/power/supply/mtk_charger.h b/alps/kernel-4.19/drivers/power/supply/mtk_charger.h
index 49dff4f12e6..c888c1bbf3d 100644
--- a/alps/kernel-4.19/drivers/power/supply/mtk_charger.h
+++ b/alps/kernel-4.19/drivers/power/supply/mtk_charger.h
@@ -10,6 +10,11 @@
 #include "charger_class.h"
 #include "adapter_class.h"
 #include "mtk_charger_algorithm_class.h"
+#include <linux/power_supply.h>    //Isaac add  for BATTERY_CAPACITY_CONTROL set_charging_status()/set_battery_status()
+
+#define BATTERY_CAPACITY_CONTROL    //Isaac add
+#define BATTERY_TEMPERATURE_CONTROL    //Isaac add
+#define BATTERY_TEMPERATURE_TEST    //Isaac add
 
 #define CHARGING_INTERVAL 10
 #define CHARGING_FULL_INTERVAL 20
@@ -74,18 +79,40 @@ struct mtk_charger;
 #define CHG_TYPEC_WD_STATUS    (1 << 6)
 
 /* Battery Temperature Protection */
+#ifdef BATTERY_TEMPERATURE_CONTROL        //Isaac add
+#define MAX_CHARGE_TEMP  58                                        //50
+#define MAX_CHARGE_TEMP_MINUS_X_DEGREE        56    //47
+#define MAX_CHARGE_TEMP_HALF  55
+#define MAX_CHARGE_TEMP_HALF_MINUS_X_DEGREE    52
+#define MIN_CHARGE_TEMP_HALF_PLUS_X_DEGREE    -12
+#define MIN_CHARGE_TEMP_HALF  -15
+#define MIN_CHARGE_TEMP_PLUS_X_DEGREE    -16
+#define MIN_CHARGE_TEMP  -18
+#else
 #define MIN_CHARGE_TEMP  0
 #define MIN_CHARGE_TEMP_PLUS_X_DEGREE    6
 #define MAX_CHARGE_TEMP  50
 #define MAX_CHARGE_TEMP_MINUS_X_DEGREE    47
+#endif
 
 #define MAX_ALG_NO 10
 
+
+#ifdef BATTERY_TEMPERATURE_CONTROL    //Isaac add
+enum bat_temp_state_enum {
+    BAT_TEMP_LOW = 0,
+    BAT_TEMP_LOW_HALF,
+    BAT_TEMP_NORMAL,
+    BAT_TEMP_HIGH_HALF,
+    BAT_TEMP_HIGH
+};
+#else
 enum bat_temp_state_enum {
     BAT_TEMP_LOW = 0,
     BAT_TEMP_NORMAL,
     BAT_TEMP_HIGH
 };
+#endif
 
 enum chg_dev_notifier_events {
     EVENT_FULL,
@@ -98,6 +125,12 @@ struct battery_thermal_protection_data {
     bool enable_min_charge_temp;
     int min_charge_temp;
     int min_charge_temp_plus_x_degree;
+#ifdef BATTERY_TEMPERATURE_CONTROL    //Isaac add
+    int min_charge_temp_half;
+    int min_charge_temp_half_plus_x_degree;
+    int max_charge_temp_half;
+    int max_charge_temp_half_minus_x_degree;
+#endif
     int max_charge_temp;
     int max_charge_temp_minus_x_degree;
 };
@@ -314,6 +347,16 @@ struct mtk_charger {
     bool water_detected;
 
     bool enable_dynamic_mivr;
+    
+#ifdef BATTERY_CAPACITY_CONTROL
+    int battery_capacity_ctrl;    //Isaac add
+#endif
+#ifdef BATTERY_TEMPERATURE_CONTROL
+    bool charge_current_half;    //Isaac add
+#endif
+#ifdef BATTERY_TEMPERATURE_TEST
+    int fake_temp;                //Isaac add
+#endif
 };
 
 /* functions which framework needs*/
@@ -339,6 +382,19 @@ extern int get_charger_zcv(struct mtk_charger *info,
     struct charger_device *chg);
 extern void _wake_up_charger(struct mtk_charger *info);
 
+#ifdef BATTERY_CAPACITY_CONTROL                //Isaac add
+extern int get_battery_status(struct mtk_charger *info);
+extern void set_battery_status(struct mtk_charger *info, int value, bool need_update);
+
+extern int get_charging_status(struct mtk_charger *info);
+extern void set_charging_status(struct mtk_charger *info, int value);
+#endif
+
+#ifdef BATTERY_TEMPERATURE_TEST
+extern void set_battery_temperature(struct mtk_charger *info, int temp);
+extern void set_battery_udpate(struct mtk_charger *info);
+#endif
+
 /* functions for other */
 extern int mtk_chg_enable_vbus_ovp(bool enable);
 
diff --git a/alps/kernel-4.19/drivers/power/supply/mtk_charger_intf.c b/alps/kernel-4.19/drivers/power/supply/mtk_charger_intf.c
index cef0f95429f..8760af2961b 100644
--- a/alps/kernel-4.19/drivers/power/supply/mtk_charger_intf.c
+++ b/alps/kernel-4.19/drivers/power/supply/mtk_charger_intf.c
@@ -68,8 +68,8 @@ int get_uisoc(struct mtk_charger *info)
     struct power_supply *bat_psy = NULL;
     int ret;
 
-    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,
-                               "gauge");
+    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev, "gauge");
+    printk("Isaac [get_uisoc] mtk_charger_intf.c enter, bat_psy=0x%x, name=%s\n", bat_psy, bat_psy->desc->name);
     if (bat_psy == NULL || IS_ERR(bat_psy)) {
         chr_err("%s Couldn't get bat_psy\n", __func__);
         ret = 50;
@@ -90,8 +90,8 @@ int get_battery_voltage(struct mtk_charger *info)
     struct power_supply *bat_psy = NULL;
     int ret;
 
-    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,
-                               "gauge");
+    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev, "gauge");
+    printk("Isaac [get_battery_voltage] mtk_charger_intf.c enter, bat_psy=0x%x, name=%s\n", bat_psy, bat_psy->desc->name);
     if (bat_psy == NULL || IS_ERR(bat_psy)) {
         chr_err("%s Couldn't get bat_psy\n", __func__);
         ret = 3999;
@@ -112,8 +112,8 @@ int get_battery_temperature(struct mtk_charger *info)
     struct power_supply *bat_psy = NULL;
     int ret;
 
-    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,
-                               "gauge");
+    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,"gauge");
+    printk("Isaac [get_battery_temperature] mtk_charger_intf.c enter, bat_psy=0x%x, name=%s\n", bat_psy, bat_psy->desc->name);
     if (bat_psy == NULL || IS_ERR(bat_psy)) {
         chr_err("%s Couldn't get bat_psy\n", __func__);
         ret = 27;
@@ -134,8 +134,8 @@ int get_battery_current(struct mtk_charger *info)
     struct power_supply *bat_psy = NULL;
     int ret;
 
-    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,
-                               "gauge");
+    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,"gauge");
+    printk("Isaac [get_battery_current] mtk_charger_intf.c enter, bat_psy=0x%x, name=%s\n", bat_psy, bat_psy->desc->name);
     if (bat_psy == NULL || IS_ERR(bat_psy)) {
         chr_err("%s Couldn't get bat_psy\n", __func__);
         ret = 0;
@@ -150,6 +150,86 @@ int get_battery_current(struct mtk_charger *info)
     return ret;
 }
 
+#ifdef BATTERY_CAPACITY_CONTROL    //Isaac add
+int get_battery_status(struct mtk_charger *info)
+{
+    union power_supply_propval prop;
+    struct power_supply *bat_psy = NULL;
+    int ret;
+    
+    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,"gauge");
+    printk("Isaac [get_battery_status] enter name=%s\n", bat_psy->desc->name);
+    if (bat_psy == NULL || IS_ERR(bat_psy)) {
+        chr_err("%s Couldn't get bat_psy\n", __func__);
+        ret = 0;
+    } else {
+        ret = power_supply_get_property(bat_psy, POWER_SUPPLY_PROP_STATUS, &prop);
+    }
+    
+    printk("Isaac [%s] battery_status:%d\n", __func__, prop.intval);
+
+    return prop.intval;
+}
+
+void set_battery_status(struct mtk_charger *info, int value, bool need_update)
+{
+    union power_supply_propval prop;
+    struct power_supply *bat_psy = NULL;
+    int ret;
+    
+    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,"gauge");
+    printk("Isaac [set_battery_status] enter name=%s\n", bat_psy->desc->name);
+    if (bat_psy == NULL || IS_ERR(bat_psy)) {
+        chr_err("%s Couldn't get bat_psy\n", __func__);
+        ret = 0;
+    } else {
+        prop.intval = value;
+        ret = power_supply_set_property(bat_psy, POWER_SUPPLY_PROP_STATUS, &prop);
+    }
+    
+    if (need_update) {
+        prop.intval = need_update;
+        ret = power_supply_set_property(bat_psy, POWER_SUPPLY_PROP_CHARGE_ENABLED, &prop);    //for battery_update()
+    }
+}
+#endif     //end of BATTERY_CAPACITY_CONTROL
+
+#ifdef BATTERY_TEMPERATURE_TEST    //Isaac
+void set_battery_temperature(struct mtk_charger *info, int temp)
+{
+    union power_supply_propval prop;
+    struct power_supply *bat_psy = NULL;
+    int ret;
+    
+    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,"gauge");
+    printk("Isaac [set_battery_status] enter name=%s\n", bat_psy->desc->name);
+    if (bat_psy == NULL || IS_ERR(bat_psy)) {
+        chr_err("%s Couldn't get bat_psy\n", __func__);
+        ret = 0;
+    } else {
+        prop.intval = temp;
+        ret = power_supply_set_property(bat_psy, POWER_SUPPLY_PROP_TEMP, &prop);    //set battery temp
+    }
+}
+
+void set_battery_udpate(struct mtk_charger *info)
+{
+    union power_supply_propval prop;
+    struct power_supply *bat_psy = NULL;
+    int ret;
+    
+    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,"gauge");
+    printk("Isaac [set_battery_status] enter name=%s\n", bat_psy->desc->name);
+    if (bat_psy == NULL || IS_ERR(bat_psy)) {
+        chr_err("%s Couldn't get bat_psy\n", __func__);
+        ret = 0;
+    } else {
+        prop.intval = 1;
+        ret = power_supply_set_property(bat_psy, POWER_SUPPLY_PROP_CHARGE_ENABLED, &prop);    //for battery_update()
+    }
+}
+#endif
+
 static int get_pmic_vbus(struct mtk_charger *info, int *vchr)
 {
     union power_supply_propval prop;
@@ -210,8 +290,8 @@ bool is_battery_exist(struct mtk_charger *info)
     struct power_supply *bat_psy = NULL;
     int ret;
 
-    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,
-                               "gauge");
+    bat_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,"gauge");
+    printk("Isaac [is_battery_exist] mtk_charger_intf.c enter, bat_psy=0x%x, name=%s\n", bat_psy, bat_psy->desc->name);
     if (bat_psy == NULL || IS_ERR(bat_psy)) {
         chr_err("%s Couldn't get bat_psy\n", __func__);
         ret = 1;
@@ -233,8 +313,10 @@ bool is_charger_exist(struct mtk_charger *info)
     int ret;
 
     if (chg_psy == NULL)
-        chg_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,
-                               "charger");
+        chg_psy = devm_power_supply_get_by_phandle(&info->pdev->dev, "charger");
+    
+    printk("Isaac [is_charger_exist] mtk_charger_intf.c enter, chg_psy=0x%x, name=%s\n", chg_psy, chg_psy->desc->name);
+    
     if (chg_psy == NULL || IS_ERR(chg_psy)) {
         pr_notice("%s Couldn't get chg_psy\n", __func__);
         ret = -1;
@@ -256,8 +338,10 @@ int get_charger_type(struct mtk_charger *info)
     int ret;
 
     if (chg_psy == NULL)
-        chg_psy = devm_power_supply_get_by_phandle(&info->pdev->dev,
-                               "charger");
+        chg_psy = devm_power_supply_get_by_phandle(&info->pdev->dev, "charger");
+    
+    printk("Isaac [get_charger_type] mtk_charger_intf.c enter, chg_psy=0x%x, name=%s\n", chg_psy, chg_psy->desc->name);
+    
     if (chg_psy == NULL || IS_ERR(chg_psy)) {
         pr_notice("%s Couldn't get chg_psy\n", __func__);
     } else {
@@ -278,13 +362,56 @@ int get_charger_type(struct mtk_charger *info)
     }
 
     pr_notice("%s online:%d type:%d usb_type:%d\n", __func__,
-        prop.intval,
-        prop2.intval,
-        prop3.intval);
+        prop.intval,        //1
+        prop2.intval,    //5    POWER_SUPPLY_TYPE_USB_DCP
+        prop3.intval);    //2    POWER_SUPPLY_USB_TYPE_DCP
 
     return prop2.intval;
 }
 
+#ifdef BATTERY_CAPACITY_CONTROL        //Isaac add
+int get_charging_status(struct mtk_charger *info)
+{
+    union power_supply_propval prop;
+    static struct power_supply *chg_psy;
+    int ret;
+
+    if (chg_psy == NULL)
+        chg_psy = devm_power_supply_get_by_phandle(&info->pdev->dev, "charger");
+    
+    printk("Isaac [get_charging_status] enter name=%s\n", chg_psy->desc->name);
+    
+    if (chg_psy == NULL || IS_ERR(chg_psy)) {
+        printk("%s Couldn't get chg_psy\n", __func__);
+    } else {
+        ret = power_supply_get_property(chg_psy, POWER_SUPPLY_PROP_STATUS, &prop);
+    }
+
+    printk("Isaac [%s] charger_status:%d\n", __func__, prop.intval);
+
+    return prop.intval;
+}
+
+void set_charging_status(struct mtk_charger *info, int value)
+{
+    union power_supply_propval prop;
+    static struct power_supply *chg_psy;
+    int ret;
+
+    if (chg_psy == NULL)
+        chg_psy = devm_power_supply_get_by_phandle(&info->pdev->dev, "charger");
+    
+    printk("Isaac [set_charging_status] enter name=%s\n", chg_psy->desc->name);
+    
+    if (chg_psy == NULL || IS_ERR(chg_psy)) {
+        printk("%s Couldn't get chg_psy\n", __func__);
+    } else {
+        prop.intval = value;
+        ret = power_supply_set_property(chg_psy, POWER_SUPPLY_PROP_STATUS, &prop);
+    }
+}
+#endif     //end of BATTERY_CAPACITY_CONTROL
+
 int get_charger_temperature(struct mtk_charger *info,
     struct charger_device *chg)
 {
diff --git a/alps/kernel-4.19/drivers/power/supply/mtk_pulse_charger.c b/alps/kernel-4.19/drivers/power/supply/mtk_pulse_charger.c
index 084bcc9894d..5eaab579a51 100644
--- a/alps/kernel-4.19/drivers/power/supply/mtk_pulse_charger.c
+++ b/alps/kernel-4.19/drivers/power/supply/mtk_pulse_charger.c
@@ -125,7 +125,7 @@ static bool pchr_select_charging_current_limit(struct mtk_charger *info,
 
     pdata = &info->chg_data[CHG1_SETTING];
     
-    printk("Isaac [pchr_select_charging_current_limit] thermal_input_current_limit=%d, thermal_charging_current_limit=%d\n", pdata->thermal_input_current_limit, pdata->thermal_charging_current_limit);
+    printk("Isaac [pchr_select_charging_current_limit] thermal_input_current_limit=%d, thermal_charging_current_limit=%d, usb_unlimited=%d\n", pdata->thermal_input_current_limit, pdata->thermal_charging_current_limit, info->usb_unlimited);
     //dump_stack();
     if (info->usb_unlimited) {
         pdata->input_current_limit =
@@ -160,7 +160,7 @@ static bool pchr_select_charging_current_limit(struct mtk_charger *info,
                 info->data.usb_charger_current;
         is_basic = true;
 
-    } else if (info->chr_type == POWER_SUPPLY_TYPE_USB_DCP) {
+    } else if (info->chr_type == POWER_SUPPLY_TYPE_USB_DCP) {    //plug in
         pdata->input_current_limit =
             info->data.ac_charger_input_current;
         pdata->charging_current_limit =
@@ -211,6 +211,14 @@ static bool pchr_select_charging_current_limit(struct mtk_charger *info,
         info->pd_type == MTK_PD_CONNECT_PE_READY_SNK_PD30 ||
         info->pd_type == MTK_PD_CONNECT_PE_READY_SNK_APDO)
         is_basic = false;
+        
+#ifdef BATTERY_TEMPERATURE_CONTROL
+    if (info->charge_current_half) {
+        pdata->input_current_limit = pdata->input_current_limit/2;
+        pdata->charging_current_limit = pdata->charging_current_limit/2;
+        chr_err("Isaac BATTERY_TEMPERATURE_CONTROL charge_current_half!!\n");
+    }
+#endif
 
 done:
 
@@ -488,7 +496,7 @@ static int pchr_do_algorithm(struct mtk_charger *info)
             info->setting.cv);
     }
 
-    charger_dev_dump_registers(info->chg1_dev);
+    //charger_dev_dump_registers(info->chg1_dev);    //Isaac removed for too many logs
     return 0;
 }
 
@@ -529,7 +537,7 @@ static int mtk_linear_charging_do_charging(struct mtk_charger *info,
 {
     struct pcharger_data *algo_data = info->algo.algo_data;
 
-    pr_info("%s en:%d %s\n", __func__, en, info->algorithm_name);
+    printk("Isaac [%s] en:%d %s\n", __func__, en, info->algorithm_name);
     if (en) {
         algo_data->disable_charging = false;
         algo_data->state = CHR_CC;
diff --git a/alps/kernel-4.19/drivers/power/supply/power_supply_core.c b/alps/kernel-4.19/drivers/power/supply/power_supply_core.c
index e43a7b3b570..135b2480f29 100644
--- a/alps/kernel-4.19/drivers/power/supply/power_supply_core.c
+++ b/alps/kernel-4.19/drivers/power/supply/power_supply_core.c
@@ -39,25 +39,43 @@ static bool __power_supply_is_supplied_by(struct power_supply *supplier,
                      struct power_supply *supply)
 {
     int i;
-
+    //printk("Isaac [__power_supply_is_supplied_by] 11111\n");
     if (!supply->supplied_from && !supplier->supplied_to)
         return false;
-
+    
+    //printk("Isaac [__power_supply_is_supplied_by] 22222\n");
     /* Support both supplied_to and supplied_from modes */
     if (supply->supplied_from) {
-        if (!supplier->desc->name)
+        //printk("Isaac [__power_supply_is_supplied_by] 33333\n");
+        if (!supplier->desc->name) {
+            //printk("Isaac [__power_supply_is_supplied_by] 44444\n");
             return false;
-        for (i = 0; i < supply->num_supplies; i++)
-            if (!strcmp(supplier->desc->name, supply->supplied_from[i]))
+        }
+        for (i = 0; i < supply->num_supplies; i++) {
+            //printk("Isaac [__power_supply_is_supplied_by] aaaaa, name=%s, supplied_from=%s\n", supplier->desc->name, supply->supplied_from[i]);
+            if (!strcmp(supplier->desc->name, supply->supplied_from[i])){
+                //printk("Isaac [__power_supply_is_supplied_by] 55555\n");
                 return true;
+            }
+        }
     } else {
-        if (!supply->desc->name)
+        //printk("Isaac [__power_supply_is_supplied_by] 66666\n");
+        if (!supply->desc->name){
+            //printk("Isaac [__power_supply_is_supplied_by] 77777\n");
             return false;
-        for (i = 0; i < supplier->num_supplicants; i++)
-            if (!strcmp(supplier->supplied_to[i], supply->desc->name))
+        }
+        //for (i = 0; i < supplier->num_supplicants; i++) {
+        //    printk("Isaac [__power_supply_is_supplied_by] ccccc, num_supplicants=%d, name=%s, supplied_to=%s\n", supplier->num_supplicants, supplier->desc->name, supplier->supplied_to[i]);
+        //}
+        for (i = 0; i < supplier->num_supplicants; i++) {
+            //printk("Isaac [__power_supply_is_supplied_by] bbbbb, supplied_to=%s, name=%s\n", supplier->supplied_to[i], supply->desc->name);
+            if (!strcmp(supplier->supplied_to[i], supply->desc->name)){
+                //printk("Isaac [__power_supply_is_supplied_by] 88888\n");
                 return true;
+            }
+        }
     }
-
+    //printk("Isaac [__power_supply_is_supplied_by] 99999\n");
     return false;
 }
 
@@ -66,9 +84,18 @@ static int __power_supply_changed_work(struct device *dev, void *data)
     struct power_supply *psy = data;
     struct power_supply *pst = dev_get_drvdata(dev);
 
+    //printk("Isaac [__power_supply_changed_work] 11111\n");
+    //if (psy)
+    //    printk("Isaac [__power_supply_changed_work] psy->name=%s\n", psy->desc->name);
+    //if (pst)
+    //    printk("Isaac [__power_supply_changed_work] pst->name=%s\n", pst->desc->name);
+    
     if (__power_supply_is_supplied_by(psy, pst)) {
-        if (pst->desc->external_power_changed)
+        //printk("Isaac [__power_supply_changed_work] 22222\n");
+        if (pst->desc->external_power_changed) {
             pst->desc->external_power_changed(pst);
+            //printk("Isaac [__power_supply_changed_work] 33333\n");
+        }
     }
 
     return 0;
@@ -90,15 +117,21 @@ static void power_supply_changed_work(struct work_struct *work)
      * lock. During the first call of this routine we will mark 'changed' as
      * false and it will stay false for the next call as well.
      */
+    printk("Isaac [power_supply_changed_work] changed=%d, name=%s\n", psy->changed, psy->desc->name);
     if (likely(psy->changed)) {
         psy->changed = false;
+        //printk("Isaac [power_supply_changed_work] 111\n");
         spin_unlock_irqrestore(&psy->changed_lock, flags);
         class_for_each_device(power_supply_class, NULL, psy,
                       __power_supply_changed_work);
+        //printk("Isaac [power_supply_changed_work] 222\n");
         power_supply_update_leds(psy);
+        //printk("Isaac [power_supply_changed_work] 333\n");
         atomic_notifier_call_chain(&power_supply_notifier,
                 PSY_EVENT_PROP_CHANGED, psy);
+        //printk("Isaac [power_supply_changed_work] 444\n");
         kobject_uevent(&psy->dev.kobj, KOBJ_CHANGE);
+        //printk("Isaac [power_supply_changed_work] 555\n");
         spin_lock_irqsave(&psy->changed_lock, flags);
     }
 
@@ -116,12 +149,17 @@ void power_supply_changed(struct power_supply *psy)
 {
     unsigned long flags;
 
-    dev_dbg(&psy->dev, "%s\n", __func__);
+    //dev_dbg(&psy->dev, "%s\n", __func__);
+    
+    printk("Isaac [power_supply_changed] enter, name=%s\n", psy->desc->name);
+    //dump_stack();
 
     spin_lock_irqsave(&psy->changed_lock, flags);
+    //printk("Isaac [power_supply_changed] name=%s, psy->changed = true\n", psy->desc->name);
     psy->changed = true;
     pm_stay_awake(&psy->dev);
     spin_unlock_irqrestore(&psy->changed_lock, flags);
+    //printk("Isaac [power_supply_changed] name=%s before changed_work\n", psy->desc->name);
     schedule_work(&psy->changed_work);
 }
 EXPORT_SYMBOL_GPL(power_supply_changed);
diff --git a/alps/makepatch.sh b/alps/makepatch.sh
index ff9ffe22b33..1cfeac4c971 100644
--- a/alps/makepatch.sh
+++ b/alps/makepatch.sh
@@ -3,36 +3,50 @@
 PATCHDIR=patch
 name=`date +%Y%m%d%H%M%S`
 diff_patch="patch_diff_$name.txt"
-st_patch="patch_st_$name.txt"
+status_patch="patch_status_$name.txt"
+name_patch="patch_name_$name.txt"
 rm -rf $PATCHDIR
+mkdir $PATCHDIR
+
 num=4
-ST_CMD="git status -s"
+STATUS_CMD="git status -s ."
 DIFF_CMD="git diff HEAD"
+
 if [ $# == 0 ];then
 num=4
-ST_CMD="git status -s"
+STATUS_CMD="git status -s ."
 DIFF_CMD="git diff HEAD"
 elif [ $# == 1 ];then
-num=8
-ST_CMD="git diff --name-status $1"
+num=6
+STATUS_CMD="git diff --name-status $1"
+NAME_CMD="git diff --name-only $1"
 DIFF_CMD="git diff $1"
 elif [ $# == 2 ];then
-num=8
-ST_CMD="git diff --name-status $1 $2"
+num=6
+STATUS_CMD="git diff --name-status $1 $2"
+NAME_CMD="git diff --name-only $1 $2"
 DIFF_CMD="git diff $1 $2"
 fi
 
-st_content=`$ST_CMD`
+status_content=`$STATUS_CMD`
 diff_content=`$DIFF_CMD`
-mkdir $PATCHDIR
 
-#echo "$st_content" 2>&1|tee $PATCHDIR/$st_patch
-#echo "$diff_content" 2>&1|tee $PATCHDIR/$diff_patch
-echo "$st_content" > $PATCHDIR/$st_patch
+#echo "$st_content" 2>&1 | tee $PATCHDIR/$status_patch
+#echo "$diff_content" 2>&1 | tee $PATCHDIR/$diff_patch
+
+echo "$status_content" > $PATCHDIR/$status_patch
 echo "$diff_content" > $PATCHDIR/$diff_patch
 echo "makepatch..."
 
-for file in `cat $PATCHDIR/$st_patch|cut -b $num-`
+if [ $# == 0 ];then
+target_patch=$status_patch
+elif [ $# == 1 -o $# == 2 ];then
+name_content=`$NAME_CMD`
+echo "$name_content" > $PATCHDIR/$name_patch
+target_patch=$name_patch
+fi
+
+for file in `cat $PATCHDIR/$target_patch|cut -b $num-`
 do
     if [ ! -e $file ]; then
         continue
diff --git a/alps/mtk_gslX680_add_log.c b/alps/mtk_gslX680_add_log.c
deleted file mode 100755
index a58fb8121bd..00000000000
--- a/alps/mtk_gslX680_add_log.c
+++ /dev/null
@@ -1,2184 +0,0 @@
-/* drivers/input/touchscreen/mediatek/gslX680/
- *
- * 2010 - 2016 silead inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be a reference
- * to you, when you are integrating the sileadinc's CTP IC into your system,
- * 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.
- *
- */
-#include <linux/bitops.h>
-#include <linux/byteorder/generic.h>
-#include <linux/delay.h>
-#include <linux/delay.h>
-#include <linux/gpio.h>
-#include <linux/i2c.h>
-#include <linux/init.h>
-#include <linux/input.h>
-#include <linux/kernel.h>
-#include <linux/kthread.h>
-#include <linux/module.h>
-#include <uapi/linux/sched/types.h>
-//#include <linux/sched.h>
-#include <linux/slab.h>
-#ifdef CONFIG_HAS_EARLYSUSPEND
-#include <linux/earlysuspend.h>
-#endif
-
-#define GSL_GESTURE
-#ifdef GSL_GESTURE
-    #include "707G_10inche_CX18D_067_LF710_LD10_10point_800_1280_gesture.h"
-#else
-    //#include "707G_10inche_CX18D_067_LF710_LD10_800_1280.h"
-    #include "707G_10inche_CX18D_067_LF710_LD10_10point_800_1280.h"
-#endif
-
-#include "tpd.h"
-
-#include "mtk_boot_common.h"
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#include <linux/of_irq.h>
-#include <uapi/linux/sched/types.h>
-
-#if !defined(CONFIG_MTK_I2C_EXTENSION) || defined(GSLTP_ENABLE_I2C_DMA)
-#include <linux/dma-mapping.h>
-#endif
-
-#define GSLX680_NAME "gslX680"
-#define GSLX680_ADDR 0x40
-#define MAX_FINGERS 10
-#define MAX_CONTACTS 10
-#define DMA_TRANS_LEN 0x20
-#define SMBUS_TRANS_LEN 0x01
-#define GSL_PAGE_REG 0xf0
-/*#define GREEN_MODE*/ /*IF use this, pls close esd check*/
-#ifdef GREEN_MODE
-#define MODE_ON 1
-#define MODE_OFF 0
-#endif
-#ifndef GREEN_MODE
-/*#define GSL_MONITOR*/ /*if enable ESD, please close GREEN_MODE*/
-#endif
-
-enum check_meun {
-    power_status = 1,
-    interrupt_status = 2,
-    esd_scanning = 4
-}; /* select check mode  1,2,4 */
-
-enum check_err {
-    power_shutdowned = 2,
-    interrupt_fail,
-    esd_protected
-}; /* check mode err info  2,3,4 */
-
-#ifdef GSL_GESTURE
-static int gsl_gesture_flag = 1;
-static struct input_dev *gsl_power_idev;
-static int gsl_lcd_flag = 0;
-static char gsl_gesture_c = 0;
-//extern void gsl_FunIICRead(unsigned int (*ReadIICInt));
-extern void gsl_GestureExternInt(unsigned int *model,int len);
-extern int gsl_obtain_gesture(void);
-
-#define  GSL_TPD_GES_COUNT  1
-//static int tpd_keys_gesture[GSL_TPD_GES_COUNT] ={KEY_POWER};
-#endif
-
-#define GSL_LATE_INIT_CHIP
-#define TPD_PROC_DEBUG
-/* #define ADD_I2C_DEVICE_ANDROID_4_0 */
-/* #define HIGH_SPEED_I2C */
-
-#ifdef TPD_PROC_DEBUG
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h> /* lzk */
-#include <linux/uaccess.h>
-/* static struct proc_dir_entry *gsl_config_proc = NULL; */
-#define GSL_CONFIG_PROC_FILE "gsl_config"
-#define CONFIG_LEN 31
-static char gsl_read[CONFIG_LEN];
-static u8 gsl_data_proc[8] = {0};
-static u8 gsl_proc_flag;
-#endif
-
-static int tpd_flag;
-static int tpd_halt;
-/*static char eint_flag;*/
-static int touch_irq;
-static struct i2c_client *i2c_client;
-static struct task_struct *thread;
-
-#ifdef GSL_LATE_INIT_CHIP
-static struct delayed_work gsl_late_init_work;
-static struct workqueue_struct *gsl_late_init_workqueue;
-#define LATE_INIT_CYCLE_BY_REG_CHECK 10
-#endif
-
-#ifdef GSL_MONITOR
-static struct delayed_work gsl_monitor_work;
-static struct workqueue_struct *gsl_monitor_workqueue;
-static u8 int_1st[4] = {0};
-static u8 int_2nd[4] = {0};
-static char b0_counter;
-static char bc_counter;
-/* i2c_lock_flag mean 0:do checking 1:skip once checking; 2:skip anyway*/
-static char i2c_lock_flag;
-#define MONITOR_CYCLE_NORMAL 100
-#define MONITOR_CYCLE_IDLE 800
-#define MONITOR_CYCLE_BY_REG_CHECK 1800
-#endif
-
-/* #define TPD_HAVE_BUTTON */
-#define TPD_KEY_COUNT 4
-#define TPD_KEYS                                                               \
-    {                                                                      \
-        KEY_MENU, KEY_HOMEPAGE, KEY_BACK, KEY_SEARCH                   \
-    }
-/* {button_center_x, button_center_y, button_width, button_height*/
-#define TPD_KEYS_DIM                                                           \
-    {                                                                      \
-        {70, 2048, 60, 50}, {210, 2048, 60, 50}, {340, 2048, 60, 50},  \
-        {                                                              \
-            470, 2048, 60, 50                                      \
-        }                                                              \
-    }
-
-static DECLARE_WAIT_QUEUE_HEAD(waiter);
-static int init_chip(struct i2c_client *client);
-/*static void green_mode(struct i2c_client *client, int mode);*/
-
-#define GSLTP_REG_ADDR_LEN 1
-#ifdef CONFIG_MTK_I2C_EXTENSION
-/*for ARCH_MT6735,ARCH_MT6735M, ARCH_MT6753,ARCH_MT6580,ARCH_MT6755*/
-#define GSLTP_ENABLE_WRRD_MODE
-#ifdef GSLTP_ENABLE_I2C_DMA
-#define GSLTP_DMA_MAX_TRANSACTION_LEN 255 /* for DMA mode */
-#define GSLTP_DMA_MAX_WR_SIZE                                                  \
-    (GSLTP_DMA_MAX_TRANSACTION_LEN - GSLTP_REG_ADDR_LEN)
-#ifdef GSLTP_ENABLE_WRRD_MODE /*for WRRD(write and read) mode */
-#define GSLTP_DMA_MAX_RD_SIZE 31
-#else
-#define GSLTP_DMA_MAX_RD_SIZE GSLTP_DMA_MAX_TRANSACTION_LEN
-#endif
-#endif
-#else
-#define GSLTP_DMA_MAX_TRANSACTION_LEN 255 /* for DMA mode */
-#define GSLTP_DMA_MAX_RD_SIZE GSLTP_DMA_MAX_TRANSACTION_LEN
-#define GSLTP_DMA_MAX_WR_SIZE                                                  \
-    (GSLTP_DMA_MAX_TRANSACTION_LEN - GSLTP_REG_ADDR_LEN)
-#endif
-
-#ifdef CONFIG_MTK_I2C_EXTENSION
-#define GSLTP_I2C_MASTER_CLOCK 100
-#ifdef GSLTP_ENABLE_I2C_DMA
-static u8 *g_dma_buff_va;
-static u8 *g_dma_buff_pa;
-#endif
-#else
-static u8 *g_i2c_buff;
-static u8 *g_i2c_addr;
-#endif
-#if !defined(CONFIG_MTK_I2C_EXTENSION) || defined(GSLTP_ENABLE_I2C_DMA)
-static int msg_dma_alloc(void);
-static void msg_dma_release(void);
-#endif
-
-#define GSL_DEBUG (0)
-#if GSL_DEBUG
-#define GSL_LOGD(fmt, args...)                                                 \
-    pr_debug(GSLX680_NAME "<-dbg-> [%04d] [@%s]" fmt, __LINE__, __func__,  \
-         ##args)
-#define GSL_LOGF()                                                             \
-    pr_debug(GSLX680_NAME "<-func-> [%04d] [@%s] is call!\n", __LINE__,    \
-         __func__)
-
-#else
-#define GSL_LOGD(fmt, args...)                                                 \
-    do {                                                                   \
-    } while (0)
-#define GSL_LOGF()                                                             \
-    do {                                                                   \
-    } while (0)
-#endif /* end #if GSL_DEBUG */
-
-#define GSL_LOGE(fmt, args...)                                                 \
-    pr_debug(GSLX680_NAME "<-err->[%04d] [@%s]" fmt, __LINE__, __func__,   \
-         ##args)
-
-#ifdef TPD_HAVE_BUTTON
-static int tpd_keys_local[TPD_KEY_COUNT] = TPD_KEYS;
-static int tpd_keys_dim_local[TPD_KEY_COUNT][4] = TPD_KEYS_DIM;
-#endif
-
-#if (defined(TPD_WARP_START) && defined(TPD_WARP_END))
-static int tpd_wb_start_local[TPD_WARP_CNT] = TPD_WARP_START;
-static int tpd_wb_end_local[TPD_WARP_CNT] = TPD_WARP_END;
-#endif
-#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION))
-static int tpd_calmat_local[8] = TPD_CALIBRATION_MATRIX;
-static int tpd_def_calmat_local[8] = TPD_CALIBRATION_MATRIX;
-#endif
-
-#ifdef CONFIG_MTK_I2C_EXTENSION
-#ifdef GSLTP_ENABLE_I2C_DMA
-static int msg_dma_alloc(void)
-{
-    g_dma_buff_va = (u8 *)dma_alloc_coherent(
-        NULL, GSLTP_DMA_MAX_TRANSACTION_LEN,
-        (dma_addr_t *)(&g_dma_buff_pa), GFP_KERNEL | GFP_DMA);
-    if (!g_dma_buff_va) {
-        GSL_LOGE("[DMA][Error] Allocate DMA I2C Buffer failed!\n");
-        return -1;
-    }
-    return 0;
-}
-
-static void msg_dma_release(void)
-{
-    if (g_dma_buff_va) {
-        dma_free_coherent(NULL, GSLTP_DMA_MAX_TRANSACTION_LEN,
-                  g_dma_buff_va, (dma_addr_t)g_dma_buff_pa);
-        g_dma_buff_va = NULL;
-        g_dma_buff_pa = NULL;
-        GSL_LOGD("[DMA][release]I2C Buffer release!\n");
-    }
-}
-
-#ifdef GSLTP_ENABLE_WRRD_MODE
-/*WRRD(write and read) mode, no stop condition after write reg addr*/
-/*max DMA read len  31  bytes */
-static s32 i2c_dma_read(struct i2c_client *client, u8 addr, u8 *rxbuf, s32 len)
-{
-    int ret;
-    s32 retry = 0;
-    struct i2c_msg msg;
-
-    if (rxbuf == NULL)
-        return -1;
-    memset(&msg, 0, sizeof(struct i2c_msg));
-
-    *g_dma_buff_va = addr;
-    msg.addr = client->addr & I2C_MASK_FLAG;
-    msg.flags = 0;
-    msg.len = (len << 8) | GSLTP_REG_ADDR_LEN;
-    msg.buf = g_dma_buff_pa;
-    msg.ext_flag = client->ext_flag | I2C_ENEXT_FLAG | I2C_WR_FLAG |
-               I2C_RS_FLAG | I2C_DMA_FLAG;
-    msg.timing = GSLTP_I2C_MASTER_CLOCK;
-
-    /* GSL_LOGD("dma i2c read: 0x%04X, %d bytes(s)", addr, len); */
-    for (retry = 0; retry < 5; ++retry) {
-        ret = i2c_transfer(client->adapter, &msg, 1);
-        if (ret < 0)
-            continue;
-        memcpy(rxbuf, g_dma_buff_va, len);
-        return 0;
-    }
-    GSL_LOGE("Dma I2C Read Error: 0x%04X, %d byte(s), err-code: %d", addr,
-         len, ret);
-    return ret;
-}
-#else
-/*read only mode, max read length is 65532bytes*/
-static s32 i2c_dma_read(struct i2c_client *client, u8 addr, u8 *rxbuf, s32 len)
-{
-    int ret;
-    s32 retry = 0;
-    struct i2c_msg msg[2];
-
-    if (rxbuf == NULL)
-        return -1;
-    memset(&msg, 0, sizeof(struct i2c_msg));
-
-    *g_dma_buff_va = addr;
-    msg[0].addr = client->addr & I2C_MASK_FLAG;
-    msg[0].flags = 0;
-    msg[0].len = GSLTP_REG_ADDR_LEN;
-    msg[0].buf = g_dma_buff_pa;
-    msg[0].ext_flag = I2C_DMA_FLAG;
-    msg[0].timing = GSLTP_I2C_MASTER_CLOCK;
-
-    msg[1].addr = client->addr & I2C_MASK_FLAG;
-    msg[1].flags = I2C_M_RD;
-    msg[1].len = GSLTP_DMA_MAX_RD_SIZE;
-    msg[1].buf = g_dma_buff_pa;
-    msg[1].ext_flag = client->ext_flag | I2C_ENEXT_FLAG | I2C_DMA_FLAG;
-    msg[1].timing = GSLTP_I2C_MASTER_CLOCK;
-
-    /* GSL_LOGD("dma i2c read: 0x%04X, %d bytes(s)", addr, len); */
-    for (retry = 0; retry < 5; ++retry) {
-        ret = i2c_transfer(client->adapter, &msg[0], 2);
-        if (ret < 0)
-            continue;
-        memcpy(rxbuf, g_dma_buff_va, len);
-        return 0;
-    }
-    GSL_LOGE("Dma I2C Read Error: 0x%04X, %d byte(s), err-code: %d", addr,
-         len, ret);
-    return ret;
-}
-#endif
-static s32 i2c_dma_write(struct i2c_client *client, u8 addr, u8 *txbuf, s32 len)
-{
-    int ret;
-    s32 retry = 0;
-    struct i2c_msg msg;
-
-    if (txbuf == NULL)
-        return -1;
-
-    memset(&msg, 0, sizeof(struct i2c_msg));
-    *g_dma_buff_va = addr;
-
-    msg.addr = (client->addr & I2C_MASK_FLAG);
-    msg.flags = 0;
-    msg.buf = g_dma_buff_pa;
-    msg.len = 1 + len;
-    msg.ext_flag = (client->ext_flag | I2C_ENEXT_FLAG | I2C_DMA_FLAG);
-    msg.timing = GSLTP_I2C_MASTER_CLOCK;
-
-    /* GSL_LOGD("dma i2c write: 0x%04X, %d bytes(s)", addr, len); */
-    memcpy(g_dma_buff_va + 1, txbuf, len);
-    for (retry = 0; retry < 5; ++retry) {
-        ret = i2c_transfer(client->adapter, &msg, 1);
-        if (ret < 0)
-            continue;
-        return 0;
-    }
-    GSL_LOGE("Dma I2C Write Error: 0x%04X, %d bytes, err-code: %d\n", addr,
-         len, ret);
-    return ret;
-}
-
-#else /*GSLTP_ENABLE_I2C_DMA*/
-static s32 i2c_read_nondma(struct i2c_client *client, u8 addr, u8 *rxbuf,
-               int len)
-{
-    int ret;
-    s32 retry = 0;
-    struct i2c_msg msg;
-
-    if (rxbuf == NULL)
-        return -1;
-    memset(&msg, 0, sizeof(struct i2c_msg));
-
-    rxbuf[0] = addr;
-    msg.addr = client->addr & I2C_MASK_FLAG;
-    msg.flags = 0;
-    msg.len = (len << 8) | GSLTP_REG_ADDR_LEN;
-    msg.buf = rxbuf;
-    msg.ext_flag = I2C_WR_FLAG | I2C_RS_FLAG;
-    msg.timing = GSLTP_I2C_MASTER_CLOCK;
-
-    /* GSL_LOGD("dma i2c read: 0x%04X, %d bytes(s)", addr, len); */
-    for (retry = 0; retry < 5; ++retry) {
-        ret = i2c_transfer(client->adapter, &msg, 1);
-        if (ret < 0)
-            continue;
-        return 0;
-    }
-    GSL_LOGE("Dma I2C Read Error: 0x%4X, %d bytes, err-code: %d\n", addr,
-         len, ret);
-    return ret;
-}
-
-static s32 i2c_write_nondma(struct i2c_client *client, u8 addr, u8 *txbuf,
-                int len)
-{
-    int ret;
-    s32 retry = 0;
-    struct i2c_msg msg;
-    u8 wrBuf[C_I2C_FIFO_SIZE + 1];
-
-    if (txbuf == NULL)
-        return -1;
-
-    memset(&msg, 0, sizeof(struct i2c_msg));
-    memset(wrBuf, 0, C_I2C_FIFO_SIZE + 1);
-    wrBuf[0] = addr;
-    memcpy(wrBuf + 1, txbuf, len);
-
-    msg.flags = 0;
-    msg.buf = wrBuf;
-    msg.len = 1 + len;
-    msg.addr = (client->addr & I2C_MASK_FLAG);
-    msg.ext_flag = (client->ext_flag | I2C_ENEXT_FLAG);
-    msg.timing = GSLTP_I2C_MASTER_CLOCK;
-
-    /* GSL_LOGD("dma i2c write: 0x%04X, %d bytes(s)", addr, len); */
-    for (retry = 0; retry < 5; ++retry) {
-        ret = i2c_transfer(client->adapter, &msg, 1);
-        if (ret < 0)
-            continue;
-        return 0;
-    }
-    GSL_LOGE("Dma I2C Write Error: 0x%04X, %d bytes, err-code: %d\n", addr,
-         len, ret);
-    return ret;
-}
-#endif
-#else /*CONFIG_MTK_I2C_EXTENSION*/
-static int msg_dma_alloc(void)
-{
-    g_i2c_buff = kzalloc(GSLTP_DMA_MAX_TRANSACTION_LEN, GFP_KERNEL);
-    if (!g_i2c_buff) {
-        GSL_LOGE("[DMA][Error] Allocate DMA I2C Buffer failed!\n");
-        return -1;
-    }
-
-    g_i2c_addr = kzalloc(GSLTP_REG_ADDR_LEN, GFP_KERNEL);
-    if (!g_i2c_addr) {
-        GSL_LOGE("[DMA]Allocate DMA I2C addr buf failed!\n");
-        kfree(g_i2c_buff);
-        g_i2c_buff = NULL;
-        return -1;
-    }
-
-    return 0;
-}
-
-static void msg_dma_release(void)
-{
-    kfree(g_i2c_buff);
-    g_i2c_buff = NULL;
-
-    kfree(g_i2c_addr);
-    g_i2c_addr = NULL;
-
-    GSL_LOGD("[DMA][release]I2C Buffer release!\n");
-}
-static s32 i2c_dma_read(struct i2c_client *client, u8 addr, u8 *rxbuf, int len)
-{
-    int ret;
-    s32 retry = 0;
-    struct i2c_msg msg[2];
-
-    if (rxbuf == NULL)
-        return -1;
-
-    memset(&msg, 0, 2 * sizeof(struct i2c_msg));
-    memcpy(g_i2c_addr, &addr, GSLTP_REG_ADDR_LEN);
-    msg[0].addr = client->addr;
-    msg[0].flags = 0;
-    msg[0].buf = g_i2c_addr;
-    msg[0].len = 1;
-
-    msg[1].addr = client->addr;
-    msg[1].flags = I2C_M_RD;
-    msg[1].buf = g_i2c_buff;
-    msg[1].len = len;
-
-    /* GSL_LOGD("dma i2c read: 0x%04X, %d bytes(s)", addr, len); */
-    for (retry = 0; retry < 5; ++retry) {
-        ret = i2c_transfer(client->adapter, &msg[0], 2);
-        if (ret < 0)
-            continue;
-        memcpy(rxbuf, g_i2c_buff, len);
-        return 0;
-    }
-    GSL_LOGE("Dma I2C Read Error: 0x%4X, %d bytes, err-code: %d\n", addr,
-         len, ret);
-    return ret;
-}
-
-static s32 i2c_dma_write(struct i2c_client *client, u8 addr, u8 *txbuf, s32 len)
-{
-    int ret;
-    s32 retry = 0;
-    struct i2c_msg msg;
-
-    if (txbuf == NULL)
-        return -1;
-
-    memset(&msg, 0, sizeof(struct i2c_msg));
-    *g_i2c_buff = addr;
-
-    msg.addr = (client->addr);
-    msg.flags = 0;
-    msg.buf = g_i2c_buff;
-    msg.len = 1 + len;
-
-    /* GSL_LOGD("dma i2c write: 0x%04X, %d bytes(s)", addr, len); */
-    memcpy(g_i2c_buff + 1, txbuf, len);
-    for (retry = 0; retry < 5; ++retry) {
-        ret = i2c_transfer(client->adapter, &msg, 1);
-        if (ret < 0)
-            continue;
-        return 0;
-    }
-    GSL_LOGE("Dma I2C Write Error: 0x%04X, %d bytes, err-code: %d\n", addr,
-         len, ret);
-    return ret;
-}
-#endif
-
-static int gsl_i2c_read_bytes(struct i2c_client *client, u8 addr, u8 *rxbuf,
-                  int len)
-{
-    int left = len;
-    int readLen = 0;
-    u8 *rd_buf = rxbuf;
-    int ret = 0;
-
-    /* GSL_LOGD("Read bytes dma: 0x%04X, %d byte(s)", addr, len); */
-    while (left > 0) {
-#if !defined(CONFIG_MTK_I2C_EXTENSION) || defined(GSLTP_ENABLE_I2C_DMA)
-        readLen = left > GSLTP_DMA_MAX_RD_SIZE ? GSLTP_DMA_MAX_RD_SIZE
-                               : left;
-        ret = i2c_dma_read(client, addr, rd_buf, readLen);
-#else
-        readLen = left > C_I2C_FIFO_SIZE ? C_I2C_FIFO_SIZE : left;
-        ret = i2c_read_nondma(client, addr, rd_buf, readLen);
-#endif
-
-        if (ret < 0) {
-            GSL_LOGE("dma read failed!\n");
-            return -1;
-        }
-
-        left -= readLen;
-        if (left > 0) {
-            addr += readLen;
-            rd_buf += readLen;
-        }
-    }
-    return 0;
-}
-
-static s32 gsl_i2c_write_bytes(struct i2c_client *client, u8 addr, u8 *txbuf,
-                   int len)
-{
-
-    int ret = 0;
-    int write_len = 0;
-    int left = len;
-    u8 *wr_buf = txbuf;
-    u8 offset = 0;
-    u8 wrAddr = addr;
-
-    /* GSL_LOGD("Write bytes dma: 0x%04X, %d byte(s)", addr, len); */
-    while (left > 0) {
-#if !defined(CONFIG_MTK_I2C_EXTENSION) || defined(GSLTP_ENABLE_I2C_DMA)
-        write_len = left > GSLTP_DMA_MAX_WR_SIZE ? GSLTP_DMA_MAX_WR_SIZE
-                             : left;
-        ret = i2c_dma_write(client, wrAddr, wr_buf, write_len);
-#else
-        write_len = left > C_I2C_FIFO_SIZE ? C_I2C_FIFO_SIZE : left;
-        ret = i2c_write_nondma(client, wrAddr, wr_buf, write_len);
-#endif
-
-        if (ret < 0) {
-            GSL_LOGE("dma i2c write failed!\n");
-            return -1;
-        }
-        offset += write_len;
-        left -= write_len;
-        if (left > 0) {
-            wrAddr = addr + offset;
-            wr_buf = txbuf + offset;
-        }
-    }
-    return 0;
-}
-
-#ifdef GSL_GESTURE
-void gsl_key_report(int key_value)
-{
-#if 0
-    input_report_key(tpd->dev, key_value, 1);
-    input_sync(tpd->dev);    
-    input_report_key(tpd->dev, key_value, 0);
-    input_sync(tpd->dev);
-#else
-    //    input_report_key(tpd->dev, KEY_POWER, 1);
-    //    input_sync(tpd->dev);
-    //    input_report_key(tpd->dev, KEY_POWER, 0);
-    //    input_sync(tpd->dev);
-#endif
-}
-/*
-static unsigned int gsl_read_oneframe_data(unsigned int *data,unsigned int addr,unsigned int len)
-{
-    u8 buf[4];
-    int i;
-    printk("---Isaac [gsl_read_oneframe_data] enter---\n");
-#if 0
-    for(i=0;i<len/2;i++){
-        buf[0] = ((addr+i*8)/0x80)&0xff;
-        buf[1] = (((addr+i*8)/0x80)>>8)&0xff;
-        buf[2] = (((addr+i*8)/0x80)>>16)&0xff;
-        buf[3] = (((addr+i*8)/0x80)>>24)&0xff;
-        i2c_smbus_write_i2c_block_data(i2c_client,0xf0,4,buf);
-
-        if(i2c_smbus_read_i2c_block_data(i2c_client,(addr+i*8)%0x80,8,(char *)&data[i*2]) < 0){
-            printk("the first i2c read failed and need read again!\n");    
-            i2c_smbus_read_i2c_block_data(i2c_client,(addr+i*8)%0x80,8,(char *)&data[i*2]);
-        }        
-         printk("data[%d] = 0x%08x\n", i, data[i]);
-    }
-    
-    if(len%2){
-        buf[0] = ((addr+len*4 - 4)/0x80)&0xff;
-        buf[1] = (((addr+len*4 - 4)/0x80)>>8)&0xff;
-        buf[2] = (((addr+len*4 - 4)/0x80)>>16)&0xff;
-        buf[3] = (((addr+len*4 - 4)/0x80)>>24)&0xff;
-        i2c_smbus_write_i2c_block_data(i2c_client,0xf0,4,buf);
-        i2c_smbus_read_i2c_block_data(i2c_client,(addr+len*4 - 4)%0x80,4,(char *)&data[len-1]);
-        i2c_smbus_read_i2c_block_data(i2c_client,(addr+len*4 - 4)%0x80,4,(char *)&data[len-1]);
-    }
-#else
-
-    for(i=0;i<len;i++){
-        buf[0] = ((addr+i*4)/0x80)&0xff;
-        buf[1] = (((addr+i*4)/0x80)>>8)&0xff;
-        buf[2] = (((addr+i*4)/0x80)>>16)&0xff;
-        buf[3] = (((addr+i*4)/0x80)>>24)&0xff;
-        i2c_smbus_write_i2c_block_data(i2c_client, 0xf0, 4, buf);
-        i2c_smbus_read_i2c_block_data(i2c_client, (((addr+i*4)%0x80+8)&0x5f), 4, (char *)&data[i]);
-        i2c_smbus_read_i2c_block_data(i2c_client, (addr+i*4)%0x80, 4, (char *)&data[i]);
-        i2c_smbus_read_i2c_block_data(i2c_client, (addr+i*4)%0x80, 4, (char *)&data[i]);
-        //printk("----txp----20150416----data[%d] = 0x%08x\n", i, data[i]);
-    }
-#endif
-    printk("Isaac [gsl_read_oneframe_data] done!");
-    return len;
-}*/
-
-
-static ssize_t gsl_sysfs_tpgesture_show(struct device *dev,struct device_attribute *attr, char *buf)
-{
-    ssize_t len=0;
-    printk("Isaac [gsl_sysfs_tpgesture_show] enter\n");
-    sprintf(&buf[len],"%s\n","tp gesture is on/off:");
-    len += (strlen("tp gesture is on/off:")+1);
-    if(gsl_gesture_flag == 1){
-        sprintf(&buf[len],"%s\n","  on  ");
-        len += (strlen("  on  ")+1);
-    }else if(gsl_gesture_flag == 0){
-        sprintf(&buf[len],"%s\n","  off  ");
-        len += (strlen("  off  ")+1);
-    }
-
-    sprintf(&buf[len],"%s\n","tp gesture:");
-    len += (strlen("tp gesture:")+1);
-    sprintf(&buf[len],"%c\n",gsl_gesture_c);
-    len += 2;    
-    return len;
-}
-//wuhao start
-static ssize_t gsl_sysfs_tpgesturet_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count)
-{
-    char tmp_buf[16];
-    printk("Isaac [gsl_sysfs_tpgesturet_store] enter\n");
-    if(copy_from_user(tmp_buf, buf, (count>16?16:count))){
-        return -1;
-    }
-    if(buf[0] == '0'){
-        //    gsl_gesture_flag = 0;
-        printk("[GSL_GESTURE] gsl_sysfs_tpgesturet_store off.\n");
-    }else if(buf[0] == '1'){
-        gsl_gesture_flag = 1;
-        printk("[GSL_GESTURE] gsl_sysfs_tpgesturet_store on.\n");
-    }
-
-    return count;
-}
-
-static DEVICE_ATTR(tpgesture, S_IRUGO|S_IWUSR, gsl_sysfs_tpgesture_show, gsl_sysfs_tpgesturet_store);
-static void gsl_request_power_idev(void)
-{
-    struct input_dev *idev;
-    int rc = 0;
-    idev = input_allocate_device();
-
-    printk("Isaac [gsl_request_power_idev] enter\n");
-    if(!idev){
-        return;
-    }
-    gsl_power_idev = idev;
-    idev->name = "gsl_gesture";
-    idev->id.bustype = BUS_I2C;
-    input_set_capability(idev,EV_KEY,KEY_WAKEUP);
-    input_set_capability(idev,EV_KEY,KEY_END);
-
-    rc = input_register_device(idev);
-    if(rc){
-        input_free_device(idev);
-        gsl_power_idev = NULL;
-    }
-}
-
-static unsigned int gsl_gesture_init(void)
-{
-    int ret;
-    struct kobject *gsl_debug_kobj;
-    printk("Isaac [gsl_gesture_init] enter\n");
-    gsl_debug_kobj = kobject_create_and_add("gsl_gesture", NULL) ;
-    if (gsl_debug_kobj == NULL)
-    {
-        printk("%s: subsystem_register failed\n", __func__);
-        return -ENOMEM;
-    }
-    ret = sysfs_create_file(gsl_debug_kobj, &dev_attr_tpgesture.attr);
-    if (ret)
-    {
-        printk("%s: sysfs_create_version_file failed\n", __func__);
-        return ret;
-    }
-    gsl_request_power_idev();
-    printk("[GSL_GESTURE] gsl_gesture_init success.\n");
-    return 1;
-}
-#endif
-
-static void startup_chip(struct i2c_client *client)
-{
-    u8 write_buf = 0x00;
-    printk("Isaac [startup_chip] enter\n");
-    gsl_i2c_write_bytes(client, 0xe0, &write_buf, 1);
-#ifdef GSL_NOID_VERSION
-    gsl_DataInit(gsl_config_data_id);
-#endif
-
-    usleep_range(10000, 11000);
-}
-
-#ifdef GSL9XX_CHIP
-static void gsl_io_control(struct i2c_client *client)
-{
-    u8 buf[4] = {0};
-    int i;
-
-    for (i = 0; i < 5; i++) {
-        buf[0] = 0;
-        buf[1] = 0;
-        buf[2] = 0xfe;
-        buf[3] = 0x1;
-        gsl_i2c_write_bytes(client, 0xf0, buf, 4);
-        buf[0] = 0x5;
-        buf[1] = 0;
-        buf[2] = 0;
-        buf[3] = 0x80;
-        gsl_i2c_write_bytes(client, 0x78, buf, 4);
-        usleep_range(5000, 5100);
-    }
-    msleep(50);
-}
-#endif
-
-static int reset_chip(struct i2c_client *client)
-{
-    u8 write_buf[4] = {0};
-    int ret = 0;
-    printk("Isaac [reset_chip] enter\n");
-    write_buf[0] = 0x88;
-    ret = gsl_i2c_write_bytes(client, 0xe0, &write_buf[0], 1);
-    msleep(20);
-
-    write_buf[0] = 0x04;
-    ret += gsl_i2c_write_bytes(client, 0xe4, &write_buf[0], 1);
-    usleep_range(10000, 11000);
-
-    write_buf[0] = 0x00;
-    write_buf[1] = 0x00;
-    write_buf[2] = 0x00;
-    write_buf[3] = 0x00;
-    ret += gsl_i2c_write_bytes(client, 0xbc, write_buf, 4);
-    usleep_range(10000, 11000);
-#ifdef GSL9XX_CHIP
-    gsl_io_control(client);
-#endif
-
-    if (ret < 0)
-        GSL_LOGE("reset chip fail!\n");
-
-    return ret;
-}
-
-static void clr_reg(struct i2c_client *client)
-{
-    u8 write_buf[4] = {0};
-
-    write_buf[0] = 0x88;
-    gsl_i2c_write_bytes(client, 0xe0, &write_buf[0], 1);
-    msleep(20);
-
-    write_buf[0] = 0x03;
-    gsl_i2c_write_bytes(client, 0x80, &write_buf[0], 1);
-    usleep_range(5000, 5100);
-
-    write_buf[0] = 0x04;
-    gsl_i2c_write_bytes(client, 0xe4, &write_buf[0], 1);
-    usleep_range(5000, 5100);
-
-    write_buf[0] = 0x00;
-    gsl_i2c_write_bytes(client, 0xe0, &write_buf[0], 1);
-    msleep(20);
-}
-
-#ifdef HIGH_SPEED_I2C
-static u32 gsl_read_interface(struct i2c_client *client, u8 reg, u8 *buf,
-                  u32 num)
-{
-    struct i2c_msg xfer_msg[2];
-
-    xfer_msg[0].addr = client->addr;
-    xfer_msg[0].len = 1;
-    xfer_msg[0].flags = client->flags & I2C_M_TEN;
-    xfer_msg[0].buf = &reg;
-    xfer_msg[0].timing = 400;
-
-    xfer_msg[1].addr = client->addr;
-    xfer_msg[1].len = num;
-    xfer_msg[1].flags |= I2C_M_RD;
-    xfer_msg[1].buf = buf;
-    xfer_msg[1].timing = 400;
-
-    if (reg < 0x80) {
-        i2c_transfer(client->adapter, xfer_msg, ARRAY_SIZE(xfer_msg));
-        usleep_range(5000, 5100);
-    }
-
-    return i2c_transfer(client->adapter, xfer_msg, ARRAY_SIZE(xfer_msg)) ==
-                   ARRAY_SIZE(xfer_msg)
-               ? 0
-               : -EFAULT;
-}
-
-static u32 gsl_write_interface(struct i2c_client *client, const u8 reg, u8 *buf,
-                   u32 num)
-{
-    struct i2c_msg xfer_msg[1];
-
-    buf[0] = reg;
-
-    xfer_msg[0].addr = client->addr;
-    xfer_msg[0].len = num + 1;
-    xfer_msg[0].flags = client->flags & I2C_M_TEN;
-    xfer_msg[0].buf = buf;
-    xfer_msg[0].timing = 400;
-
-    return i2c_transfer(client->adapter, xfer_msg, 1) == 1 ? 0 : -EFAULT;
-}
-
-static inline void fw2buf(u8 *buf, const u32 *fw)
-{
-    u32 *u32_buf = (int *)buf;
-    *u32_buf = *fw;
-}
-
-static void gsl_load_fw(struct i2c_client *client)
-{
-    u8 buf[DMA_TRANS_LEN * 4 + 1] = {0};
-    u8 send_flag = 1;
-    u8 *cur = buf + 1;
-    u32 source_line = 0;
-    u32 source_len;
-    struct fw_data *ptr_fw;
-
-    GSL_LOGD("===gsl load_fw start===\n");
-
-    ptr_fw = GSLX680_FW;
-    source_len = ARRAY_SIZE(GSLX680_FW);
-    for (source_line = 0; source_line < source_len; source_line++) {
-        /* init page trans, set the page val */
-        if (ptr_fw[source_line].offset == GSL_PAGE_REG) {
-            fw2buf(cur, &ptr_fw[source_line].val);
-            gsl_write_interface(client, GSL_PAGE_REG, buf, 4);
-            send_flag = 1;
-        } else {
-            if (send_flag ==
-                1 % (DMA_TRANS_LEN < 0x20 ? DMA_TRANS_LEN : 0x20))
-                buf[0] = (u8)ptr_fw[source_line].offset;
-
-            fw2buf(cur, &ptr_fw[source_line].val);
-            cur += 4;
-
-            if (send_flag ==
-                0 % (DMA_TRANS_LEN < 0x20 ? DMA_TRANS_LEN : 0x20)) {
-                gsl_write_interface(client, buf[0], buf,
-                            cur - buf - 1);
-                cur = buf + 1;
-            }
-
-            send_flag++;
-        }
-    }
-
-    GSL_LOGD("===gsl load_fw end===\n");
-}
-#else
-static void gsl_load_fw(struct i2c_client *client)
-{
-    u8 buf[SMBUS_TRANS_LEN * 4] = {0};
-    u8 reg = 0, send_flag = 1, cur = 0;
-
-    unsigned int source_line = 0;
-    unsigned int source_len = ARRAY_SIZE(GSLX680_FW);
-
-    GSL_LOGD("===gsl load_fw start===\n");
-    for (source_line = 0; source_line < source_len; source_line++) {
-        if (1 == SMBUS_TRANS_LEN) {
-            reg = GSLX680_FW[source_line].offset;
-            memcpy(&buf[0], &GSLX680_FW[source_line].val, 4);
-            gsl_i2c_write_bytes(client, reg, buf, 4);
-        } else {
-            /* init page trans, set the page val */
-            if (GSLX680_FW[source_line].offset == GSL_PAGE_REG) {
-                buf[0] = (u8)(GSLX680_FW[source_line].val &
-                          0x000000ff);
-                gsl_i2c_write_bytes(client, GSL_PAGE_REG,
-                            &buf[0], 1);
-                send_flag = 1;
-            } else {
-                if (send_flag ==
-                    1 % (SMBUS_TRANS_LEN < 0x08
-                         ? SMBUS_TRANS_LEN
-                         : 0x08))
-                    reg = GSLX680_FW[source_line].offset;
-
-                memcpy(&buf[cur], &GSLX680_FW[source_line].val,
-                       4);
-                cur += 4;
-
-                if (send_flag ==
-                    0 % (SMBUS_TRANS_LEN < 0x08
-                         ? SMBUS_TRANS_LEN
-                         : 0x08)) {
-                    gsl_i2c_write_bytes(client, reg, buf,
-                                SMBUS_TRANS_LEN *
-                                    4);
-                    cur = 0;
-                }
-
-                send_flag++;
-            }
-        }
-    }
-
-    GSL_LOGD("===gsl load_fw end===\n");
-}
-#endif
-
-/*   ----------------------check_memdata start-------------*/
-static int arry_compare(u8 *arry_1st, u8 *arry_2nd, int num)
-{
-    int i;
-    int result = 0;
-
-    for (i = 0; i < num; i++) {
-        if (*(arry_1st + i) != *(arry_2nd + i))
-            result++;
-    }
-    return result;
-}
-
-static int arry_copy(u8 *arry_new, u8 *arry_old, int num)
-{
-    int i;
-
-    for (i = 0; i < num; i++)
-        *(arry_new + i) = *(arry_old + i);
-
-    return 0;
-}
-
-static int power_check(struct i2c_client *client)
-{
-    int result = 0;
-    u8 read_buf[4] = {0x00};
-
-    gsl_i2c_read_bytes(client, 0xb0, read_buf, sizeof(read_buf));
-    if (read_buf[3] != 0x5a || read_buf[2] != 0x5a || read_buf[1] != 0x5a ||
-        read_buf[0] != 0x5a)
-        result = power_shutdowned;
-
-    return result;
-}
-
-static int interrupt_check(struct i2c_client *client)
-{
-    int i, num;
-    int result = 0;
-    u8 read_buf[4] = {0x00};
-    u8 arry_1st[4] = {0x00};
-    u8 arry_2nd[4] = {0x00};
-
-    num = sizeof(read_buf);
-    for (i = 0; i < (num * num); i++) {
-        gsl_i2c_read_bytes(client, 0xb4, read_buf, num);
-        usleep_range(10000, 11000);
-        if (!(i % num))
-            arry_copy(arry_1st, read_buf, num);
-        else
-            arry_copy(arry_2nd, read_buf, num);
-    }
-    result = arry_compare(arry_1st, arry_2nd, num);
-    if (result)
-        result = interrupt_status;
-    return result;
-}
-
-static int esd_check(struct i2c_client *client)
-{
-    int result = 0;
-    u8 read_buf[4] = {0x00};
-
-    gsl_i2c_read_bytes(client, 0xbc, read_buf, sizeof(read_buf));
-    if (read_buf[3] != 0x00 || read_buf[2] != 0x00 || read_buf[1] != 0x00 ||
-        read_buf[0] != 0x00)
-        result = esd_protected;
-    return result;
-}
-
-static int check_mode(struct i2c_client *client, int mode_set)
-{
-    int result = 0;
-
-    switch (mode_set) {
-    case power_status:
-        result = power_check(client);
-        break;
-    case interrupt_status:
-        result = interrupt_check(client);
-        break;
-    case esd_scanning:
-        result = esd_check(client);
-        break;
-    case (power_status + interrupt_status):
-        result = power_check(client);
-        result += interrupt_check(client);
-        break;
-    case (power_status + esd_scanning):
-        result = power_check(client);
-        result += esd_check(client);
-        break;
-    case (interrupt_status + esd_scanning):
-        result = interrupt_check(client);
-        result += esd_check(client);
-        break;
-    case (power_status + interrupt_status + esd_scanning):
-        result = power_check(client);
-        result += interrupt_check(client);
-        result += esd_check(client);
-        break;
-    default:
-        result = mode_set;
-        GSL_LOGE("mode_set[%d] not valid!\n", mode_set);
-    }
-    return result;
-}
-
-static int check_mem_data(struct i2c_client *client)
-{
-    int result = 0;
-    printk("Isaac [check_mem_data] enter\n");
-    result = check_mode(client, power_status);
-    printk("Isaac [check_mem_data] ---result num is[%d] ", result);
-    printk("Isaac [check_mem_data] power_shutdowned[%d]\n", power_shutdowned);
-    if (result)
-        result = init_chip(client);
-
-    return result;
-}
-/*   ----------------------check_memdata end-------------*/
-
-static int test_i2c(struct i2c_client *client)
-{
-    u8 read_buf[4] = {0x00};
-    u8 write_buf[4] = {0x00, 0x03, 0x02, 0x01};
-    int result = 0;
-
-    result = gsl_i2c_read_bytes(client, 0xf0, read_buf, sizeof(read_buf));
-    GSL_LOGD("gslX680 I read reg 0xf0 is %02x%02x%02x\n", read_buf[2],
-         read_buf[1], read_buf[0]);
-
-    usleep_range(2000, 2100);
-    result +=
-        gsl_i2c_write_bytes(client, 0xf0, write_buf, sizeof(write_buf));
-
-    GSL_LOGD("gslX680 I write reg 0xf0 is %02x%02x%02x\n", write_buf[2],
-         write_buf[1], write_buf[0]);
-
-    usleep_range(2000, 2100);
-    result += gsl_i2c_read_bytes(client, 0xf0, read_buf, sizeof(read_buf));
-    GSL_LOGD("gslX680 I read reg 0xf0 is %02x%02x%02x\n", read_buf[2],
-         read_buf[1], read_buf[0]);
-
-    if (arry_compare(write_buf, read_buf, 3))
-        result--;
-    return result;
-}
-static int init_chip(struct i2c_client *client)
-{
-    int rc;
-
-#ifdef GSL_MONITOR
-    i2c_lock_flag = 2;
-#endif
-    printk("Isaac [init_chip] enter\n");
-    tpd_gpio_output(GTP_RST_PORT, 0);
-    msleep(20);
-    tpd_gpio_output(GTP_RST_PORT, 1);
-    msleep(20);
-
-    rc = test_i2c(client);
-    if (rc < 0) {
-        GSL_LOGE("------gslX680 test_i2c error------\n");
-        return -1;
-    }
-    clr_reg(client);
-    reset_chip(client);
-    clr_reg(client);
-    rc = reset_chip(client);
-    gsl_load_fw(client);
-    startup_chip(client);
-    rc += reset_chip(client);
-    startup_chip(client);
-#ifdef GSL_MONITOR
-    i2c_lock_flag = 0;
-#endif
-    return rc;
-}
-
-#ifdef TPD_PROC_DEBUG
-static int char_to_int(char ch)
-{
-    if (ch >= '0' && ch <= '9')
-        return (ch - '0');
-    else
-        return (ch - 'a' + 10);
-}
-
-
-static int gsl_config_read_proc(struct seq_file *m, void *v)
-{
-    char temp_data[5] = {0};
-    unsigned int tmp = 0;
-
-    if ('v' == gsl_read[0] && 's' == gsl_read[1]) {
-#ifdef GSL_NOID_VERSION
-        tmp = gsl_version_id();
-#else
-        tmp = 0x20121215;
-#endif
-        seq_printf(m, "version:%x\n", tmp);
-    } else if ('r' == gsl_read[0] && 'e' == gsl_read[1]) {
-        if ('i' == gsl_read[3]) {
-#ifdef GSL_NOID_VERSION
-            tmp = (gsl_data_proc[5] << 8) | gsl_data_proc[4];
-            seq_printf(m, "gsl_config_data_id[%d] = ", tmp);
-            if (tmp >= 0 && tmp < ARRAY_SIZE(gsl_config_data_id))
-                seq_printf(m, "%d\n", gsl_config_data_id[tmp]);
-#endif
-        } else {
-            gsl_i2c_write_bytes(i2c_client, 0Xf0, &gsl_data_proc[4],
-                        4);
-            if (gsl_data_proc[0] < 0x80)
-                gsl_i2c_read_bytes(i2c_client, gsl_data_proc[0],
-                           temp_data, 4);
-            gsl_i2c_read_bytes(i2c_client, gsl_data_proc[0],
-                       temp_data, 4);
-            seq_printf(m, "offset : {0x%02x,0x", gsl_data_proc[0]);
-            seq_printf(m, "%02x", temp_data[3]);
-            seq_printf(m, "%02x", temp_data[2]);
-            seq_printf(m, "%02x", temp_data[1]);
-            seq_printf(m, "%02x};\n", temp_data[0]);
-        }
-    }
-    /* *eof = 1; */
-    return 0;
-}
-
-static ssize_t gsl_config_write_proc(struct file *file,
-                     const char __user *buffer, size_t count,
-                     loff_t *data)
-{
-    u8 buf[8] = {0};
-    char temp_buf[CONFIG_LEN];
-    char *path_buf;
-#ifdef GSL_NOID_VERSION
-    int tmp = 0;
-    int tmp1 = 0;
-#endif
-
-    GSL_LOGD("[tp-gsl]\n");
-    if (count > 512) {
-        GSL_LOGE("size not match [%d:%d]\n", CONFIG_LEN, (int)count);
-        return -EFAULT;
-    }
-    path_buf = kzalloc(count, GFP_KERNEL);
-    if (!path_buf) {
-        GSL_LOGE("alloc path_buf memory error\n");
-        return -1;
-    }
-    if (copy_from_user(path_buf, buffer, count)) {
-        GSL_LOGE("copy from user fail\n");
-        goto exit_write_proc_out;
-    }
-    memcpy(temp_buf, path_buf, (count < CONFIG_LEN ? count : CONFIG_LEN));
-    GSL_LOGD("[tp-gsl][%s][%s]\n", __func__, temp_buf);
-
-    buf[3] = char_to_int(temp_buf[14]) << 4 | char_to_int(temp_buf[15]);
-    buf[2] = char_to_int(temp_buf[16]) << 4 | char_to_int(temp_buf[17]);
-    buf[1] = char_to_int(temp_buf[18]) << 4 | char_to_int(temp_buf[19]);
-    buf[0] = char_to_int(temp_buf[20]) << 4 | char_to_int(temp_buf[21]);
-
-    buf[7] = char_to_int(temp_buf[5]) << 4 | char_to_int(temp_buf[6]);
-    buf[6] = char_to_int(temp_buf[7]) << 4 | char_to_int(temp_buf[8]);
-    buf[5] = char_to_int(temp_buf[9]) << 4 | char_to_int(temp_buf[10]);
-    buf[4] = char_to_int(temp_buf[11]) << 4 | char_to_int(temp_buf[12]);
-    if ('v' == temp_buf[0] && 's' == temp_buf[1]) {
-        memcpy(gsl_read, temp_buf, 4);
-        GSL_LOGD("gsl version\n");
-    } else if ('s' == temp_buf[0] && 't' == temp_buf[1]) {
-#ifdef GSL_MONITOR
-        cancel_delayed_work_sync(&gsl_monitor_work);
-        i2c_lock_flag = 2;
-#endif
-        gsl_proc_flag = 1;
-        reset_chip(i2c_client);
-    } else if ('e' == temp_buf[0] && 'n' == temp_buf[1]) {
-        msleep(20);
-        reset_chip(i2c_client);
-        startup_chip(i2c_client);
-        gsl_proc_flag = 0;
-    } else if ('r' == temp_buf[0] && 'e' == temp_buf[1]) {
-        memcpy(gsl_read, temp_buf, 4);
-        memcpy(gsl_data_proc, buf, 8);
-    } else if ('w' == temp_buf[0] && 'r' == temp_buf[1]) {
-        gsl_i2c_write_bytes(i2c_client, buf[4], buf, 4);
-    }
-#ifdef GSL_NOID_VERSION
-    else if ('i' == temp_buf[0] && 'd' == temp_buf[1]) {
-        tmp1 = (buf[7] << 24) | (buf[6] << 16) | (buf[5] << 8) | buf[4];
-        tmp = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
-        if (tmp1 >= 0 && tmp1 < ARRAY_SIZE(gsl_config_data_id))
-            gsl_config_data_id[tmp1] = tmp;
-    }
-#endif
-exit_write_proc_out:
-    kfree(path_buf);
-    return count;
-}
-static int gsl_server_list_open(struct inode *inode, struct file *file)
-{
-    return single_open(file, gsl_config_read_proc, NULL);
-}
-static const struct file_operations gsl_seq_fops = {
-    .open = gsl_server_list_open,
-    .read = seq_read,
-    .release = single_release,
-    .write = gsl_config_write_proc,
-    .owner = THIS_MODULE,
-};
-#endif
-
-#ifdef TPD_ROTATION_SUPPORT
-static void tpd_swap_xy(int *x, int *y)
-{
-    int temp = 0;
-
-    temp = *x;
-    *x = *y;
-    *y = temp;
-}
-
-static void tpd_rotate_90(int *x, int *y)
-{
-    *x = SCREEN_MAX_X + 1 - *x;
-
-    *x = (*x * SCREEN_MAX_Y) / SCREEN_MAX_X;
-    *y = (*y * SCREEN_MAX_X) / SCREEN_MAX_Y;
-
-    tpd_swap_xy(x, y);
-}
-static void tpd_rotate_180(int *x, int *y)
-{
-    *y = SCREEN_MAX_Y + 1 - *y;
-    *x = SCREEN_MAX_X + 1 - *x;
-}
-static void tpd_rotate_270(int *x, int *y)
-{
-    *y = SCREEN_MAX_Y + 1 - *y;
-
-    *x = (*x * SCREEN_MAX_Y) / SCREEN_MAX_X;
-    *y = (*y * SCREEN_MAX_X) / SCREEN_MAX_Y;
-
-    tpd_swap_xy(x, y);
-}
-#endif
-
-u8 rs_value1;
-static void tpd_down(int id, int x, int y, int p)
-{
-    GSL_LOGD("----tpd_down id: %d, x:%d, y:%d----\n", id, x, y);
-
-#ifdef TPD_ROTATION_SUPPORT
-    switch (tpd_rotation_type) {
-    case TPD_ROTATION_90:
-        tpd_rotate_90(&x, &y);
-        break;
-    case TPD_ROTATION_270:
-        tpd_rotate_270(&x, &y);
-        break;
-    case TPD_ROTATION_180:
-        tpd_rotate_180(&x, &y);
-        break;
-    default:
-        break;
-    }
-#endif
-
-    input_report_key(tpd->dev, BTN_TOUCH, 1);
-    input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, 1);
-    input_report_abs(tpd->dev, ABS_MT_POSITION_X, x);
-    input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y);
-    input_report_abs(tpd->dev, ABS_MT_TRACKING_ID, id);
-    input_mt_sync(tpd->dev);
-}
-
-static void tpd_up(void)
-{
-    GSL_LOGD("------tpd_up------\n");
-
-    input_report_key(tpd->dev, BTN_TOUCH, 0);
-    input_mt_sync(tpd->dev);
-}
-static void gsl_report_point(struct gsl_touch_info *ti)
-{
-    int tmp = 0;
-    static int gsl_up_flag; /*prevent more up event*/
-
-    GSL_LOGD("gsl report_point %d\n", ti->finger_num);
-    if (unlikely(ti->finger_num == 0)) {
-        if (gsl_up_flag == 0)
-            return;
-        gsl_up_flag = 0;
-        tpd_up();
-
-    //    if ((get_boot_mode() == FACTORY_BOOT) ||
-    //        (get_boot_mode() == RECOVERY_BOOT))
-    //        tpd_button(ti->x[tmp], ti->y[tmp], 0);
-
-    } else {
-        gsl_up_flag = 1;
-        for (tmp = 0; ti->finger_num > tmp; tmp++) {
-
-
-            tpd_down(ti->id[tmp] - 1, ti->x[tmp], ti->y[tmp], 0);
-            //if ((get_boot_mode() == FACTORY_BOOT) ||
-        //        (get_boot_mode() == RECOVERY_BOOT))
-            //    tpd_button(ti->x[tmp], ti->y[tmp], 1);
-        }
-    }
-    input_sync(tpd->dev);
-}
-
-static void report_data_handle(void)
-{
-    u8 touch_data[44] = {0};
-    unsigned char point_num = 0;
-    unsigned int temp_a, temp_b, i;
-
-#ifdef GSL_NOID_VERSION
-    u8 buf[4] = {0};
-    struct gsl_touch_info cinfo = {{0} };
-    int tmp1 = 0;
-#endif
-    printk("Isaac [report_data_handle] enter\n");
-#ifdef GSL_MONITOR
-    if (i2c_lock_flag != 0)
-        return;
-
-    i2c_lock_flag = 1;
-#endif
-
-#ifdef TPD_PROC_DEBUG
-    if (gsl_proc_flag == 1)
-        return;
-#endif
-
-    gsl_i2c_read_bytes(i2c_client, 0x80, &touch_data[0], 4);
-    point_num = touch_data[0];
-    printk("Isaac  [report_data_handle] point_num=%d\n", point_num);
-    if (point_num > 0)
-        gsl_i2c_read_bytes(i2c_client, 0x84, &touch_data[4], 4);
-    if (point_num > 1)
-        gsl_i2c_read_bytes(i2c_client, 0x88, &touch_data[8], 4);
-    if (point_num > 2)
-        gsl_i2c_read_bytes(i2c_client, 0x8c, &touch_data[12], 4);
-    if (point_num > 3)
-        gsl_i2c_read_bytes(i2c_client, 0x90, &touch_data[16], 4);
-    if (point_num > 4)
-        gsl_i2c_read_bytes(i2c_client, 0x94, &touch_data[20], 4);
-    if (point_num > 5)
-        gsl_i2c_read_bytes(i2c_client, 0x98, &touch_data[24], 4);
-    if (point_num > 6)
-        gsl_i2c_read_bytes(i2c_client, 0x9c, &touch_data[28], 4);
-    if (point_num > 7)
-        gsl_i2c_read_bytes(i2c_client, 0xa0, &touch_data[32], 4);
-    if (point_num > 8)
-        gsl_i2c_read_bytes(i2c_client, 0xa4, &touch_data[36], 4);
-    if (point_num > 9)
-        gsl_i2c_read_bytes(i2c_client, 0xa8, &touch_data[40], 4);
-
-#ifdef GSL_NOID_VERSION
-    cinfo.finger_num = point_num;
-    printk("Isaac  [report_data_handle] finger_num = %d\n", cinfo.finger_num);
-    for (i = 0; i < (point_num < MAX_CONTACTS ? point_num : MAX_CONTACTS);
-         i++) {
-        temp_a = touch_data[(i + 1) * 4 + 3] & 0x0f;
-        temp_b = touch_data[(i + 1) * 4 + 2];
-        cinfo.x[i] = temp_a << 8 | temp_b;
-        temp_a = touch_data[(i + 1) * 4 + 1];
-        temp_b = touch_data[(i + 1) * 4 + 0];
-        cinfo.y[i] = temp_a << 8 | temp_b;
-        cinfo.id[i] = ((touch_data[(i + 1) * 4 + 3] & 0xf0) >> 4);
-        printk("Isaac  [report_data_handle] before: x[%d] = %d, y[%d] = %d, id[%d] = %d\n",
-            i, cinfo.x[i], i, cinfo.y[i], i, cinfo.id[i]);
-    }
-    cinfo.finger_num = (touch_data[3] << 24) | (touch_data[2] << 16) |
-               (touch_data[1] << 8) | touch_data[0];
-    gsl_alg_id_main(&cinfo);
-    tmp1 = gsl_mask_tiaoping();
-    printk("Isaac  [report_data_handle] tmp1=%x\n", tmp1);
-    if (tmp1 > 0 && tmp1 < 0xffffffff) {
-        buf[0] = 0xa;
-        buf[1] = 0;
-        buf[2] = 0;
-        buf[3] = 0;
-        gsl_i2c_write_bytes(i2c_client, 0xf0, buf, 4);
-        buf[0] = (u8)(tmp1 & 0xff);
-        buf[1] = (u8)((tmp1 >> 8) & 0xff);
-        buf[2] = (u8)((tmp1 >> 16) & 0xff);
-        buf[3] = (u8)((tmp1 >> 24) & 0xff);
-        GSL_LOGD(
-            "tmp1=%08x,buf[0]=%02x,buf[1]=%02x,buf[2]=%02x,buf[3]=%02x\n",
-            tmp1, buf[0], buf[1], buf[2], buf[3]);
-        gsl_i2c_write_bytes(i2c_client, 0x8, buf, 4);
-    }
-    point_num = cinfo.finger_num;
-#endif
-
-#ifdef GSL_GESTURE
-    printk("Isaac [report_data_handle] tpd_halt =%d, gsl_gesture_flag = %d \n",tpd_halt, gsl_gesture_flag);
-    if((gsl_gesture_flag == 1) && (tpd_halt == 1)){
-        int tmp_c;
-        tmp_c = gsl_obtain_gesture();
-        printk("Isaac [report_data_handle] tmp_c =%d \n",tmp_c);
-        //if(tpd_halt == 1) 
-        //{
-            switch(tmp_c){
-                case (int)'C':
-                case (int)'E':
-                case (int)'W':
-                case (int)'O':
-                case (int)'S':
-                case (int)'M':
-                case (int)'Z':
-                case (int)'V':
-                case (int)'*':
-                case 0xa1fb:     //left
-                case 0xa1fd:     //down
-                case 0xa1fc:     //UP
-                case 0xa1fa:     //right
-                    gsl_gesture_c = (char)tmp_c;
-                    printk("Isaac [report_data_handle] gsl_lcd_flag=%d\n",gsl_lcd_flag);
-                    if(0 == gsl_lcd_flag)
-                    {
-                        #if 0
-                        if((int)'C' == tmp_c)
-                            gsl_key_report(KEY_C);
-                        else if((int)'E' == tmp_c)
-                            gsl_key_report(KEY_E);
-                        else if((int)'W' == tmp_c)
-                            gsl_key_report(KEY_W);
-                        else if((int)'O' == tmp_c)
-                            gsl_key_report(KEY_O);
-                        else if((int)'S' == tmp_c)
-                            gsl_key_report(KEY_S);
-                        else if((int)'M' == tmp_c)
-                            gsl_key_report(KEY_M);
-                        else if((int)'Z' == tmp_c)
-                            gsl_key_report(KEY_Z);
-                        else if((int)'V' == tmp_c)
-                            gsl_key_report(KEY_V);
-                        else if((int)'*' == tmp_c)
-                            gsl_key_report(KEY_POWER);
-                        else if(0xa1fb == tmp_c)
-                            gsl_key_report(KEY_F);
-                        else if(0xa1fd == tmp_c)
-                            gsl_key_report(KEY_L);
-                        else if(0xa1fc == tmp_c)
-                            gsl_key_report(KEY_K);
-                        else if(0xa1fa == tmp_c)
-                            gsl_key_report(KEY_R);
-                        #else
-                        printk("------------Isaac [report_data_handle] input report KEY_POWER, tmp_c=%c---------------\n", tmp_c);
-                        input_report_key(gsl_power_idev,KEY_WAKEUP,1);
-                        input_sync(gsl_power_idev);
-                        input_report_key(gsl_power_idev,KEY_WAKEUP,0);
-                        input_sync(gsl_power_idev);
-                        #endif
-                    }
-                  //  printk("[GSL_GESTURE] set gsl_lcd_flag = 1\n");
-                  //  gsl_lcd_flag = 1;            
-                    break;
-                default:
-                    break;
-            }
-            goto i2c_lock;
-        //}
-    }
-#endif
-
-    gsl_report_point(&cinfo);
-
-#ifdef GSL_GESTURE    
-i2c_lock:
-    ;
-#endif    
-
-#ifdef GSL_MONITOR
-    i2c_lock_flag = 0;
-#endif
-}
-
-#ifdef GSL_MONITOR
-static void gsl_monitor_worker(struct work_struct *work)
-{
-    int result = 0;
-    int mon_work_cycle = MONITOR_CYCLE_NORMAL;
-
-    printk("---------Isaac [gsl_monitor_worker] -------\n");
-#ifdef GSL_GESTURE
-    if((1 == gsl_gesture_flag)&&(0 == gsl_lcd_flag))
-        goto queue_monitor_work;
-#endif
-
-#ifdef TPD_PROC_DEBUG
-    if (gsl_proc_flag == 1)
-        return;
-#endif
-    if (i2c_lock_flag == 0) {
-        result = check_mode(
-            i2c_client,
-            (power_status + interrupt_status + esd_scanning));
-        if (result)
-            init_chip(client);
-        GSL_LOGD("---result num is[%d] ", result);
-        GSL_LOGD("power_shutdowned[%d]", power_shutdowned);
-        GSL_LOGD("interrupt_fail[%d] ", interrupt_fail);
-        GSL_LOGD("esd_protected[%d]\n", esd_protected);
-    } else if (i2c_lock_flag == 1) {
-        mon_work_cycle = MONITOR_CYCLE_IDLE;
-        i2c_lock_flag = 0;
-    } else if (i2c_lock_flag == 2) {
-        mon_work_cycle = MONITOR_CYCLE_BY_REG_CHECK;
-    }
-#ifdef GSL_GESTURE
-queue_monitor_work:    
-    queue_delayed_work(gsl_monitor_workqueue, &gsl_monitor_work, mon_work_cycle);
-#else
-    queue_delayed_work(gsl_monitor_workqueue, &gsl_monitor_work, mon_work_cycle);
-#endif
-}
-#endif
-
-#define SUPPORT_TP_KERNEL_CHECK
-#ifdef SUPPORT_TP_KERNEL_CHECK
-
-#if defined(ATA_TP_ADDR)
-#define RAWDATA_ADDR ATA_TP_ADDR
-#endif
-
-#define DRV_NUM 15
-#define SEN_NUM 10
-#define RAWDATA_THRESHOLD 6000
-#define DAC_THRESHOLD 20
-#define MAX_SEN_NUM 15
-static const u8 sen_order[SEN_NUM] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
-
-int ctp_factory_test(void)
-{
-    u8 buf[4], i, offset;
-    u32 rawdata_value, dac_value;
-    struct i2c_client *client = i2c_client;
-
-    if (!client) {
-        GSL_LOGE("err ,client is NULL,ctp factory_test\n");
-        return -1;
-    }
-
-    msleep(800);
-    /* msleep(20000); */
-    for (i = 0; i < DRV_NUM; i++) {
-        buf[3] = 0;
-        buf[2] = 0;
-        buf[1] = 0;
-        buf[0] = (RAWDATA_ADDR + SEN_NUM * 2 * i) / 0x80;
-        offset = (RAWDATA_ADDR + SEN_NUM * 2 * i) % 0x80;
-        gsl_i2c_write_bytes(client, 0xf0, buf, 4);
-        gsl_i2c_read_bytes(client, offset, buf, 4);
-        gsl_i2c_read_bytes(client, offset, buf, 4);
-        rawdata_value = (buf[1] << 8) + buf[0];
-        GSL_LOGD("rawdata_value = %d\n", rawdata_value);
-        if (rawdata_value > RAWDATA_THRESHOLD) {
-            rawdata_value = (buf[3] << 8) + buf[2];
-            GSL_LOGD("===>rawdata_value = %d\n", rawdata_value);
-            if (rawdata_value > RAWDATA_THRESHOLD) {
-                GSL_LOGE("###>rawdata_value = %d\n",
-                     rawdata_value);
-                return -1; /* fail */
-            }
-        }
-    }
-
-    for (i = 0; i < SEN_NUM; i++) {
-        buf[3] = 0x01;
-        buf[2] = 0xfe;
-        buf[1] = 0x10;
-        buf[0] = 0x00;
-        offset = 0x10 + (sen_order[i] / 4) * 4;
-        gsl_i2c_write_bytes(client, 0xf0, buf, 4);
-        gsl_i2c_read_bytes(client, offset, buf, 4);
-        gsl_i2c_read_bytes(client, offset, buf, 4);
-
-        dac_value = buf[sen_order[i] % 4];
-        GSL_LOGD("===dac_value = %d DAC_THRESHOLD = %d===\n", dac_value,
-             DAC_THRESHOLD);
-        if (dac_value < DAC_THRESHOLD) {
-            GSL_LOGE("dac_value %d < thres %d\n", dac_value,
-                 DAC_THRESHOLD);
-            return -1; /* fail */
-        }
-    }
-
-    return 0; /* pass */
-}
-#endif
-static int touch_event_handler(void *unused)
-{
-    struct sched_param param = {.sched_priority = 4};
-
-    sched_setscheduler(current, SCHED_RR, &param);
-
-    GSL_LOGF();
-    do {
-        enable_irq(touch_irq);
-        set_current_state(TASK_INTERRUPTIBLE);
-        wait_event_interruptible(waiter, tpd_flag != 0);
-        disable_irq(touch_irq);
-        tpd_flag = 0;
-        TPD_DEBUG_SET_TIME;
-        set_current_state(TASK_RUNNING);
-        printk("===touch event_handler, task running===\n");
-
-        report_data_handle();
-    } while (!kthread_should_stop());
-
-    return 0;
-}
-
-static irqreturn_t tpd_eint_interrupt_handler(void)
-{
-    tpd_flag = 1;
-    wake_up_interruptible(&waiter);
-
-    return IRQ_HANDLED;
-}
-
-static int tpd_i2c_detect(struct i2c_client *client,
-              struct i2c_board_info *info)
-{
-    strcpy(info->type, TPD_DEVICE);
-    return 0;
-}
-
-#ifdef GREEN_MODE
-static void green_mode(struct i2c_client *client, int mode)
-{
-    int i;
-    u8 buf[4] = {0x00};
-
-    if ((mode != MODE_ON) && (mode != MODE_OFF))
-        return;
-
-    for (i = 0; i < 5; i++) {
-        buf[0] = 0x0a;
-        gsl_i2c_write_bytes(client, 0xf0, &buf[0], 1);
-        buf[0] = 0x00;
-        buf[1] = 0x00;
-        if (mode == MODE_ON) {
-            GSL_LOGD("green mode is on.");
-            buf[2] = 0x01;
-        } else if (mode == MODE_OFF) {
-            GSL_LOGD("green mode is off.");
-            buf[2] = 0x00;
-        }
-        buf[3] = 0x5a;
-        gsl_i2c_write_bytes(client, 0x08, buf, 4);
-        msleep(20);
-    }
-}
-#endif
-
-#ifdef GSL_LATE_INIT_CHIP
-static void gsl_late_init_worker(struct work_struct *work)
-{
-    int result = 0;
-    int ret = 0;
-
-    GSL_LOGD("---------gsl late_init_worker-------\n");
-    if (1) {
-        result = check_mode(
-            i2c_client,
-            (power_status + interrupt_status + esd_scanning));
-        if (result)
-            init_chip(i2c_client);
-        GSL_LOGD("---result num is[%d] ", result);
-        GSL_LOGD("power_shutdowned[%d]", power_shutdowned);
-        GSL_LOGD("interrupt_fail[%d] ", interrupt_fail);
-        GSL_LOGD("esd_protected[%d]\n", esd_protected);
-    }
-    check_mem_data(i2c_client);
-    if (ret < 0) {
-        GSL_LOGE("Failed to init chip!\n");
-        return;
-    }
-}
-#endif
-
-static int tpd_i2c_probe(struct i2c_client *client,
-             const struct i2c_device_id *id)
-{
-    int ret = 0;
-    struct device_node *node = NULL;
-
-    GSL_LOGF();
-
-    tpd_gpio_output(GTP_RST_PORT, 0);
-    msleep(100);
-
-    ret = regulator_enable(tpd->reg);
-    if (ret != 0) {
-        GSL_LOGE("Failed to enable regulator: %d\n", ret);
-        return -1;
-    }
-
-    msleep(100);
-    tpd_gpio_output(GTP_RST_PORT, 1);
-    tpd_gpio_as_int(GTP_INT_PORT);
-    msleep(50);
-
-    i2c_client = client;
-#ifdef GSL_LATE_INIT_CHIP
-    GSL_LOGD("tpd i2c_probe () : queue gsl_late_init_workqueue\n");
-    INIT_DELAYED_WORK(&gsl_late_init_work, gsl_late_init_worker);
-    gsl_late_init_workqueue =
-        create_singlethread_workqueue("gsl_late_init_workqueue");
-    queue_delayed_work(gsl_late_init_workqueue, &gsl_late_init_work,
-               LATE_INIT_CYCLE_BY_REG_CHECK);
-#else
-    ret = init_chip(i2c_client);
-    check_mem_data(i2c_client);
-    if (ret < 0) {
-        GSL_LOGE("Failed to init chip!\n");
-        return -1;
-    }
-#endif
-#ifdef GREEN_MODE
-    green_mode(i2c_client, MODE_ON);
-    reset_chip(i2c_client);
-    startup_chip(i2c_client);
-#endif
-    node = of_find_matching_node(NULL, touch_of_match);
-    if (node) {
-        GSL_LOGD("node -> name = %s , touch_irq = %d\n", node->name,
-             touch_irq);
-        touch_irq = irq_of_parse_and_map(node, 0);
-        printk("Isaac [tpd_i2c_probe] touch_irq = %d\n ", touch_irq);
-        ret = request_irq(touch_irq,
-                  (irq_handler_t)tpd_eint_interrupt_handler,
-                  IRQF_TRIGGER_RISING, TPD_DEVICE, NULL);
-        if (ret > 0) {
-            ret = -1;
-            GSL_LOGE(
-                " gslX680 -- error : tpd request_irq IRQ LINE NOT AVAILABLE!.\n");
-            return ret;
-        }
-    #ifdef GSL_GESTURE
-        enable_irq_wake(touch_irq);
-    #endif
-    } else {
-        ret = -1;
-        GSL_LOGE("gslX680 -- error : no irq node!!\n");
-        return ret;
-    }
-    disable_irq(touch_irq);
-
-    tpd_load_status = 1;
-    GSL_LOGD("tpd_load_status = 1");
-
-    thread = kthread_run(touch_event_handler, 0, TPD_DEVICE);
-    if (IS_ERR(thread)) {
-        ret = PTR_ERR(thread);
-        GSL_LOGE(TPD_DEVICE " failed to create kernel thread: %d\n",
-             ret);
-        return ret;
-    }
-
-#ifdef GSL_GESTURE
-    printk("Isaac [tpd_i2c_probe] GSL_GESTURE start\n");
-//    for(gsl_key_set=0;gsl_key_set<GSL_TPD_GES_COUNT;gsl_key_set++)    
-//    input_set_capability(tpd->dev, EV_KEY,  tpd_keys_gesture[gsl_key_set]);
-    //gsl_FunIICRead(gsl_read_oneframe_data);
-    //gsl_GestureExternInt(gsl_model_extern,sizeof(gsl_model_extern)/sizeof(unsigned int)/18);
-    printk("Isaac [tpd_i2c_probe] GSL_GESTURE start\n");
-#endif
-
-#if 0 /* def SUPPORT_TP_KERNEL_CHECK */
-    tp_check_flag = ctp_factory_test();
-    GSL_LOGD("\ntp_check_flag = %x\n", tp_check_flag);
-    if (tp_check_flag == 0)
-        tp_check_flag = 1;
-    else
-        tp_check_flag = 0;
-    /* mdelay(500); */
-    /* eboda_support_tp_check_put(tp_check_flag); */
-    tpd_load_status = tp_check_flag;
-#endif
-
-#ifdef GSL_MONITOR
-    GSL_LOGD("tpd i2c_probe () : queue gsl_monitor_workqueue\n");
-
-    INIT_DELAYED_WORK(&gsl_monitor_work, gsl_monitor_worker);
-    gsl_monitor_workqueue =
-        create_singlethread_workqueue("gsl_monitor_workqueue");
-    queue_delayed_work(gsl_monitor_workqueue, &gsl_monitor_work,
-               MONITOR_CYCLE_BY_REG_CHECK);
-#endif
-
-#ifdef TPD_PROC_DEBUG
-#if 0
-        gsl_config_proc = create_proc_entry(GSL_CONFIG_PROC_FILE,
-        0666, NULL);
-        if (gsl_config_proc == NULL) {
-            GSL_LOGD("create_proc_entry %s failed\n",
-            GSL_CONFIG_PROC_FILE);
-        } else {
-            gsl_config_proc->read_proc = gsl_config_read_proc;
-            gsl_config_proc->write_proc = gsl_config_write_proc;
-        }
-#else
-    proc_create(GSL_CONFIG_PROC_FILE, 0660, NULL, &gsl_seq_fops);
-#endif
-    gsl_proc_flag = 0;
-#endif
-
-#ifdef GSL_GESTURE
-    gsl_gesture_init();
-#endif
-
-    /* enable_irq(touch_irq); */
-    GSL_LOGD("tpd i2c_probe is ok -----------------");
-
-    return 0;
-}
-
-static int tpd_i2c_remove(struct i2c_client *client)
-{
-    GSL_LOGD("==tpd i2c_remove==\n");
-#if !defined(CONFIG_MTK_I2C_EXTENSION) || defined(GSLTP_ENABLE_I2C_DMA)
-    msg_dma_release();
-#endif
-
-    return 0;
-}
-
-static const struct i2c_device_id tpd_i2c_id[] = {{TPD_DEVICE, 0}, {} };
-
-static unsigned short force[] = {0, (GSLX680_ADDR << 1), I2C_CLIENT_END,
-                 I2C_CLIENT_END};
-static const unsigned short *const forces[] = {force, NULL};
-/* static struct i2c_client_address_data addr_data = { .forces = forces,}; */
-/* #endif */
-
-static const struct of_device_id tpd_of_match[] = {
-    {.compatible = "mediatek,cap_touch"}, {},
-};
-
-struct i2c_driver tpd_i2c_driver = {
-    .driver = {
-
-            .name = TPD_DEVICE,
-            .of_match_table = tpd_of_match,
-#ifndef ADD_I2C_DEVICE_ANDROID_4_0
-            .owner = THIS_MODULE,
-#endif
-        },
-    .probe = tpd_i2c_probe,
-    .remove = tpd_i2c_remove,
-    .id_table = tpd_i2c_id,
-    .detect = tpd_i2c_detect,
-#ifndef ADD_I2C_DEVICE_ANDROID_4_0
-/* .address_data = &addr_data, */
-#endif
-    .address_list = (const unsigned short *)forces,
-};
-
-int tpd_local_init(void)
-{
-    int retval;
-
-    GSL_LOGF();
-#if !defined(CONFIG_MTK_I2C_EXTENSION) || defined(GSLTP_ENABLE_I2C_DMA)
-    retval = msg_dma_alloc();
-    if (retval)
-        return retval;
-#endif
-
-    tpd->reg = regulator_get(tpd->tpd_dev, "vtouch");
-    retval = regulator_set_voltage(tpd->reg, 2800000, 2800000);
-    if (retval != 0) {
-        GSL_LOGE("Failed to set reg-vgp6 voltage: %d\n", retval);
-        return -1;
-    }
-
-    if (i2c_add_driver(&tpd_i2c_driver) != 0) {
-        GSL_LOGE("unable to add i2c driver.\n");
-        return -1;
-    }
-
-    if (tpd_load_status == 0) {
-        GSL_LOGE("add error touch panel driver.\n");
-        i2c_del_driver(&tpd_i2c_driver);
-        return -1;
-    }
-
-    input_set_abs_params(tpd->dev, ABS_MT_TRACKING_ID, 0,
-                 (MAX_CONTACTS + 1), 0, 0);
-#ifdef TPD_HAVE_BUTTON
-    tpd_button_setting(TPD_KEY_COUNT, tpd_keys_local,
-               tpd_keys_dim_local); /* initialize tpd button data */
-#endif
-
-#if (defined(TPD_WARP_START) && defined(TPD_WARP_END))
-    TPD_DO_WARP = 1;
-    memcpy(tpd_wb_start, tpd_wb_start_local, TPD_WARP_CNT * 4);
-    memcpy(tpd_wb_end, tpd_wb_start_local, TPD_WARP_CNT * 4);
-#endif
-
-#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION))
-    memcpy(tpd_calmat, tpd_calmat_local, 8 * 4);
-    memcpy(tpd_def_calmat, tpd_def_calmat_local, 8 * 4);
-#endif
-    tpd_type_cap = 1;
-
-    GSL_LOGD("tpd local_init is ok.");
-    return 0;
-}
-
-/* Function to manage low power suspend */
-static void tpd_suspend(struct device *h)
-{
-#ifdef GSL_GESTURE
-    printk("Isaac [tpd_suspend] enter, tpd_halt=%d, gsl_gesture_flag=%d\n", tpd_halt, gsl_gesture_flag);
-#else
-    printk("Isaac [tpd_suspend] enter, tpd_halt=%d\n", tpd_halt);
-#endif
-
-    if (tpd_halt == 1) {
-        pr_info("gslX680 already in suspended status\n");
-        return;
-    }
-    //GSL_LOGF();
-
-#ifdef GSL_GESTURE    //enter low power mode
-    tpd_halt = 1;
-    if(gsl_gesture_flag == 1){
-        u8 buf[4];
-        //unsigned int temp;
-        gsl_lcd_flag = 0;
-        msleep(10);
-        buf[0] = 0xa;
-        buf[1] = 0;
-        buf[2] = 0;
-        buf[3] = 0;
-        i2c_smbus_write_i2c_block_data(i2c_client,0xf0,4,buf);
-        buf[0] = 0;
-        buf[1] = 0;
-        buf[2] = 0x1;
-        buf[3] = 0x5a;
-        i2c_smbus_write_i2c_block_data(i2c_client,0x8,4,buf);
-        msleep(10);
-        printk("Isaac [tpd_suspend] done!\n");
-        return;
-    }
-#endif
-
-#ifdef GSL_MONITOR
-    printk("Isaac [tpd_suspend] cancel gsl_monitor_work\n");
-    cancel_delayed_work_sync(&gsl_monitor_work);
-#endif
-
-    //tpd_gpio_output(GTP_RST_PORT, 0);
-    //msleep(20);
-    
-#ifndef GSL_GESTURE
-    disable_irq(touch_irq);
-    tpd_halt = 1;
-#endif
-
-    tpd_gpio_output(GTP_RST_PORT, 0);
-    printk("Isaac [tpd_suspend] done!\n");
-}
-
-/* Function to manage power-on resume */
-static void tpd_resume(struct device *h)
-{
-#ifdef GSL_GESTURE
-    printk("Isaac [tpd_resume] enter, tpd_halt=%d, gsl_gesture_flag=%d\n", tpd_halt, gsl_gesture_flag);
-#else
-    printk("Isaac [tpd_resume] enter, tpd_halt=%d\n", tpd_halt);
-#endif
-    if (tpd_halt == 0) {
-        pr_info("gslX680 already in resumed status\n");
-        return;
-    }
-    //GSL_LOGF();
-
-#ifndef GSL_GESTURE
-    tpd_gpio_output(GTP_RST_PORT, 1);
-    msleep(20);
-#endif
-
-#ifdef GSL_GESTURE    //exit low power mode
-    tpd_halt = 0;
-    //disable_irq(touch_irq);    //Isaac add for irq too early
-    if(gsl_gesture_flag == 1){
-        u8 buf[4];
-        //unsigned int temp;
-        //mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO);
-        tpd_gpio_output(GTP_RST_PORT, 0);
-        msleep(20);
-        //mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE);
-        tpd_gpio_output(GTP_RST_PORT, 1);
-        msleep(5);
-        buf[0] = 0xa;
-        buf[1] = 0;
-        buf[2] = 0;
-        buf[3] = 0;
-        i2c_smbus_write_i2c_block_data(i2c_client,0xf0,4,buf);
-        buf[0] = 0;
-        buf[1] = 0;
-        buf[2] = 0;
-        buf[3] = 0x5a;
-        i2c_smbus_write_i2c_block_data(i2c_client,0x8,4,buf);
-        msleep(5);
-    }
-#endif
-
-    reset_chip(i2c_client);
-    startup_chip(i2c_client);
-    check_mem_data(i2c_client);
-
-#if defined(GSL_MONITOR)
-    printk("Isaac [tpd_resume] queue gsl_monitor_work\n");
-    queue_delayed_work(gsl_monitor_workqueue, &gsl_monitor_work,
-               MONITOR_CYCLE_IDLE);
-#endif
-#ifndef GSL_GESTURE
-    enable_irq(touch_irq);
-    tpd_halt = 0;
-#endif
-    printk("Isaac [tpd_resume] done!\n");
-}
-
-static struct tpd_driver_t tpd_device_driver = {
-    .tpd_device_name = GSLX680_NAME,
-    .tpd_local_init = tpd_local_init,
-    .suspend = tpd_suspend,
-    .resume = tpd_resume,
-#ifdef TPD_HAVE_BUTTON
-    .tpd_have_button = 1,
-#else
-    .tpd_have_button = 0,
-#endif
-};
-
-#if 0
-static ssize_t db_value_store(struct class *class,
-            struct class_attribute *attr,
-            const char *buf, size_t count)
-{
-    unsigned long rs_tmp;
-
-    if (kstrtoul(buf, 10, &rs_tmp))
-        return 0;
-
-    rs_value1 = rs_tmp;
-
-    return count;
-}
-
-static ssize_t db_value_show(struct class *class,
-            struct class_attribute *attr,    char *buf)
-{
-    return sprintf(buf, "rs_value1 = %d \r\n", rs_value1);
-}
-
-static struct class_attribute db_class_attrs[] = {
-    __ATTR(db, 0644, db_value_show, db_value_store),
-    __ATTR_NULL
-};
-#endif
-
-static struct class db_interface_class = {
-    .name = "db_interface",
-    /* .class_attrs = db_class_attrs, */
-};
-
-/* called when loaded into kernel */
-static int __init tpd_driver_init(void)
-{
-    int ret = 0;
-
-    GSL_LOGF();
-    tpd_get_dts_info();
-    /* register usr space */
-    ret = class_register(&db_interface_class);
-#ifdef ADD_I2C_DEVICE_ANDROID_4_0
-    i2c_register_board_info(1, &gslX680_i2c_tpd, 1);
-#endif
-    if (tpd_driver_add(&tpd_device_driver) < 0)
-        GSL_LOGE("add gslX680 driver failed\n");
-
-    GSL_LOGD("gslX680 driver init ok");
-    return 0;
-}
-
-/* should never be called */
-static void __exit tpd_driver_exit(void)
-{
-    GSL_LOGD("Sileadinc gslX680 touch panel driver exit\n");
-    /* input_unregister_device(tpd->dev); */
-    class_unregister(&db_interface_class);
-    tpd_driver_remove(&tpd_device_driver);
-}
-module_init(tpd_driver_init);
-module_exit(tpd_driver_exit);
-
-MODULE_AUTHOR("leweihua");
-MODULE_DESCRIPTION("GSLX680 TouchScreen  Driver");
-MODULE_LICENSE("GPL v2");
diff --git a/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/project/tb8768p1_64_bsp.mk b/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/project/tb8768p1_64_bsp.mk
index 3e4f591a438..66e24292469 100644
--- a/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/project/tb8768p1_64_bsp.mk
+++ b/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/project/tb8768p1_64_bsp.mk
@@ -41,7 +41,7 @@ MTK_TINYSYS_SCP_SUPPORT = yes
 MTK_TINYSYS_SSPM_SUPPORT = yes
 #DEFINES += NO_POWER_OFF=y
 #DEFINES += FPGA_BOOT_FROM_LK=y
-MTK_PROTOCOL1_RAT_CONFIG = Lf/Lt/W/T/G
+MTK_PROTOCOL1_RAT_CONFIG = Lf/Lt/W/G
 MTK_GOOGLE_TRUSTY_SUPPORT = no
 MTK_EFUSE_WRITER_SUPPORT = no
 MTK_SMC_ID_MGMT = yes
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值