[Bugfix][API-730][GNSS]Merge MTK TCXO Patch,Fixed bug where TCXO affects GNSS cannot power on immediately

Change-Id: Id73a30cb8f5d333ee1966866a8e5390d1e2799a8
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-kernel/linux/linux-mtk-extension_4.19.bbappend b/meta-sdk/meta/meta-lynqSDK-T800/recipes-kernel/linux/linux-mtk-extension_4.19.bbappend
old mode 100644
new mode 100755
index 77870e7..a113cdd
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-kernel/linux/linux-mtk-extension_4.19.bbappend
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-kernel/linux/linux-mtk-extension_4.19.bbappend
@@ -52,7 +52,11 @@
 SRC_URI += "\
         ${@bb.utils.contains('AEE_SUPPORT', 'yes', '', ' file://disable_aee.cfg', d)} \
 "
-
+#Typethree add for tcxo power problem 2023/01/12 start
+SRC_URI += "\
+        ${@bb.utils.contains('TCXO_SUPPORT', 'yes', ' file://tcxo_support.cfg', '', d)} \
+"
+#Typethree add for tcxo power problem 2023/01/12 end
 def find_cfg(d):
     sources=src_patches(d, True)
     sources_list=[]
diff --git a/meta/meta-mediatek-mt2735/recipes-kernel/linux/linux-mtk-extension_4.19.bbappend b/meta/meta-mediatek-mt2735/recipes-kernel/linux/linux-mtk-extension_4.19.bbappend
old mode 100644
new mode 100755
index 8c6890a..fa9580e
--- a/meta/meta-mediatek-mt2735/recipes-kernel/linux/linux-mtk-extension_4.19.bbappend
+++ b/meta/meta-mediatek-mt2735/recipes-kernel/linux/linux-mtk-extension_4.19.bbappend
@@ -52,7 +52,11 @@
 SRC_URI += "\
         ${@bb.utils.contains('AEE_SUPPORT', 'yes', '', ' file://disable_aee.cfg', d)} \
 "
-
+#Typethree add for tcxo power problem 2023/01/12 start
+SRC_URI += "\
+        ${@bb.utils.contains('TCXO_SUPPORT', 'yes', ' file://tcxo_support.cfg', '', d)} \
+"
+#Typethree add for tcxo power problem 2023/01/12 end
 def find_cfg(d):
     sources=src_patches(d, True)
     sources_list=[]
diff --git a/src/kernel/linux/v4.19/drivers/soc/mediatek/Kconfig b/src/kernel/linux/v4.19/drivers/soc/mediatek/Kconfig
old mode 100644
new mode 100755
index c82a4f4..9db3153
--- a/src/kernel/linux/v4.19/drivers/soc/mediatek/Kconfig
+++ b/src/kernel/linux/v4.19/drivers/soc/mediatek/Kconfig
@@ -83,6 +83,17 @@
 	  platform could enter deeper sleep mode when cpu preparing to
 	  power down if it have sufficient time between warmboot.
 
+config MTK_TCXO_SUPPORT
+	bool "MediaTek SCPSYS Support"
+	default n
+	help
+	  Say yes here to add support for the MediaTek TCXO in connsys
+	  power domain, and TCXO is for customer request and it is better
+	  than tsx, has better performance and quailty.
+	  Select Y if you use TCXO.
+	  If unsure select "N".
+
+
 config MTK_IPI
 	tristate "MediaTek IPI Support"
 	depends on RPMSG_MTK
diff --git a/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-scpsys.c b/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-scpsys.c
index d9736f0..6540816 100755
--- a/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-scpsys.c
+++ b/src/kernel/linux/v4.19/drivers/soc/mediatek/mtk-scpsys.c
@@ -62,10 +62,15 @@
 #define SPM_WB_PWR_CON			0x02ec	/* MT7622 */
 /* NETSYS_S_SRAM_CON (0x10006000+0x378)*/
 #define NETSYS_S_SRAM_CON		0x0378
-
+/* CONN_STATUS (0x10006000+0x62C)*/
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+#define CONN_STATUS			0x062C
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 #define SPM_PWR_STATUS			0x060c
 #define SPM_PWR_STATUS_2ND		0x0610
-
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+#define CONN_STATUS_BIT			BIT(0)
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 #define PWR_RST_B_BIT			BIT(0)
 #define PWR_ISO_BIT			BIT(1)
 #define PWR_ON_BIT			BIT(2)
@@ -647,8 +652,26 @@
 	struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
 	struct scp *scp = scpd->scp;
 	void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+#ifdef CONFIG_MTK_TCXO_SUPPORT
+    void __iomem *conn_status_addr = scp->base + CONN_STATUS;
+#endif
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 	u32 val;
 	int ret, tmp;
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+#ifdef CONFIG_MTK_TCXO_SUPPORT
+	val = readl(conn_status_addr);
+	if (strcmp(genpd->name, "conn") == 0) {
+		if ((val & CONN_STATUS_BIT) == CONN_STATUS_BIT)
+			dev_err(scp->dev, "gps try to power on\n");
+		else {
+			dev_err(scp->dev, "Skip conn power on\n");
+			return 0;
+		}
+	}
+#endif
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 
 	ret = scpsys_regulator_enable(scpd);
 	if (ret < 0)
@@ -755,9 +778,24 @@
 	struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
 	struct scp *scp = scpd->scp;
 	void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
+#ifdef CONFIG_MTK_TCXO_SUPPORT
+    void __iomem *conn_status_addr = scp->base + CONN_STATUS;
+#endif
 	u32 val;
 	int ret, tmp;
 
+#ifdef CONFIG_MTK_TCXO_SUPPORT
+	val = readl(conn_status_addr);
+	if (strcmp(genpd->name, "conn") == 0) {
+		if ((val & CONN_STATUS_BIT) == CONN_STATUS_BIT)
+			dev_err(scp->dev, "gps try to power off\n");
+		else {
+			dev_err(scp->dev, "Skip conn power off\n");
+			return 0;
+		}
+	}
+#endif
+
 	ret = scpsys_bus_protect_enable(scpd);
 	if (ret < 0)
 		goto out;
diff --git a/src/kernel/modules/connectivity/2.0/gps_driver/data_link/hal/gps_dl_power_ctrl.c b/src/kernel/modules/connectivity/2.0/gps_driver/data_link/hal/gps_dl_power_ctrl.c
old mode 100644
new mode 100755
index 1da21c4..878c01b
--- a/src/kernel/modules/connectivity/2.0/gps_driver/data_link/hal/gps_dl_power_ctrl.c
+++ b/src/kernel/modules/connectivity/2.0/gps_driver/data_link/hal/gps_dl_power_ctrl.c
@@ -33,7 +33,9 @@
 #if GPS_DL_ON_CTP
 #include "gps_dl_ctp.h"
 #endif
-
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+#include <asm/io.h>
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 /* TODO: move them into a single structure */
 bool g_gps_common_on;
 bool g_gps_dsp_on_array[GPS_DATA_LINK_NUM];
@@ -337,6 +339,18 @@
 		gps_dl_hw_gps_dsp_ctrl(GPS_L5_DSP_CLEAR_PWR_STAT);
 }
 
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+void gps_dl_hal_conn_power_ctrl_temp(unsigned int op)
+{
+	/*Troubleshoot the first GNSS startup failure due to no power supply for TCXO conn_vcn1.8*/
+	unsigned int md2gps_status = 0;
+	char *addr = ioremap(0x1000662c, 0x4);
+	md2gps_status = *(unsigned int *)addr;
+	md2gps_status = (md2gps_status & 0xFFFFFFFE)| op;
+	*(unsigned int *)addr = md2gps_status;
+	iounmap(addr);
+}
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 int gps_dl_hal_conn_power_ctrl(enum gps_dl_link_id_enum link_id, int op)
 {
 	bool dma_en_flag = gps_dl_hal_get_dma_irq_en_flag();
@@ -349,6 +363,9 @@
 
 	if (1 == op) {
 		if (g_conn_user == 0) {
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+			gps_dl_hal_conn_power_ctrl_temp(op);
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 			gps_dl_log_info_show();
 			if (!gps_dl_hal_conn_infra_driver_on())
 				return -1;
@@ -383,6 +400,9 @@
 			gps_dl_wake_lock_hold(false);
 #endif
 			gps_dl_hal_conn_infra_driver_off();
+/*Typethree add for tcxo power problem 2023/01/12 start*/
+			gps_dl_hal_conn_power_ctrl_temp(op);
+/*Typethree add for tcxo power problem 2023/01/12 end*/
 		}
 	}