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 = ®
- 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, ¶m);
-
- 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
BatteryCapacityCtrl电量控制(GM3.0)
最新推荐文章于 2025-04-15 09:42:52 发布