summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalmax Chang <salmaxchang@google.com>2023-06-01 15:30:07 +0800
committerallieliu <allieliu@google.com>2023-06-27 04:59:33 +0000
commitd0d4813a494c34cc0ed0bdf69c8fe1dbe69132ce (patch)
tree1df83d87bed483085380ead77c7af258788052b9
parentd2e66dd4ea3daeb53c102ba926244d54ba65841a (diff)
downloadgs-android-gs-felix-5.10-u-beta4.tar.gz
Bug: 288824499 Change-Id: I0637138a2853f0fe4788e52e189ece9c46291d61 Signed-off-by: Salmax Chang <salmaxchang@google.com>
-rw-r--r--arch/arm64/boot/dts/google/gs201-cloudripper-cp-s5300-sit.dtsi1
-rw-r--r--drivers/soc/google/cpif/modem_ctrl_s5100.c29
-rw-r--r--drivers/soc/google/cpif/modem_v1.h1
3 files changed, 28 insertions, 3 deletions
diff --git a/arch/arm64/boot/dts/google/gs201-cloudripper-cp-s5300-sit.dtsi b/arch/arm64/boot/dts/google/gs201-cloudripper-cp-s5300-sit.dtsi
index 3295a32fe8f4..8f0ed84297c0 100644
--- a/arch/arm64/boot/dts/google/gs201-cloudripper-cp-s5300-sit.dtsi
+++ b/arch/arm64/boot/dts/google/gs201-cloudripper-cp-s5300-sit.dtsi
@@ -38,6 +38,7 @@
gpio_ap2cp_pda_active = <&gph1 1 0x1>;
gpio_ap2cp_nreset_n = <&gph1 3 0x1>;
gpio_ap2cp_cp_wrst_n = <&gph1 6 0x1>;
+ gpio_cp2ap_cp_wrst_n = <&gpa0 2 0x1>;
gpio_ap2cp_pm_wrst_n = <&gpa0 3 0x1>;
gpio_cp2ap_phone_active = <&gpa8 4 0x1>;
diff --git a/drivers/soc/google/cpif/modem_ctrl_s5100.c b/drivers/soc/google/cpif/modem_ctrl_s5100.c
index 283593b221d8..6990204be9ec 100644
--- a/drivers/soc/google/cpif/modem_ctrl_s5100.c
+++ b/drivers/soc/google/cpif/modem_ctrl_s5100.c
@@ -785,9 +785,30 @@ static void gpio_power_offon_cp(struct modem_ctl *mc)
static void gpio_power_wreset_cp(struct modem_ctl *mc)
{
#if !IS_ENABLED(CONFIG_CP_WRESET_WA)
- mif_gpio_set_value(&mc->cp_gpio[CP_GPIO_AP2CP_CP_WRST_N], 0, 50);
- mif_gpio_set_value(&mc->cp_gpio[CP_GPIO_AP2CP_PM_WRST_N], 0, 50);
- mif_gpio_set_value(&mc->cp_gpio[CP_GPIO_AP2CP_CP_WRST_N], 1, 50);
+ int i = 0, val;
+
+ mif_info("warm reset sequence start\n");
+ val = mif_gpio_get_value(&mc->cp_gpio[CP_GPIO_CP2AP_CP_WRST_N],
+ false);
+ if (!val)
+ mif_err("cp2ap_cp_wrst level is low before warm reset\n");
+
+ mif_gpio_set_value(&mc->cp_gpio[CP_GPIO_AP2CP_PM_WRST_N], 1, 5);
+ mif_gpio_set_value(&mc->cp_gpio[CP_GPIO_AP2CP_CP_WRST_N], 0,
+ val ? 0 : 1);
+
+ while (i++ < 20) {
+ if (!mif_gpio_get_value(&mc->cp_gpio[CP_GPIO_CP2AP_CP_WRST_N],
+ false))
+ break;
+ mif_info("Wait for cp2ap_cp_wrst pulled to low\n");
+ usleep_range(1000, 1100);
+ }
+
+ mif_gpio_set_value(&mc->cp_gpio[CP_GPIO_AP2CP_PM_WRST_N], 0, 5);
+ mif_gpio_set_value(&mc->cp_gpio[CP_GPIO_AP2CP_CP_WRST_N], 1, 45);
+
+ mif_info("warm reset sequence end\n");
#endif
}
@@ -1791,6 +1812,7 @@ static int s5100_get_pdata(struct modem_ctl *mc, struct modem_data *pdata)
mc->cp_gpio[CP_GPIO_AP2CP_AP_ACTIVE].label = "AP2CP_AP_ACTIVE";
#if !IS_ENABLED(CONFIG_CP_WRESET_WA)
mc->cp_gpio[CP_GPIO_AP2CP_CP_WRST_N].label = "AP2CP_CP_WRST_N";
+ mc->cp_gpio[CP_GPIO_CP2AP_CP_WRST_N].label = "CP2AP_CP_WRST_N";
mc->cp_gpio[CP_GPIO_AP2CP_PM_WRST_N].label = "AP2CP_PM_WRST_N";
#endif
mc->cp_gpio[CP_GPIO_CP2AP_PS_HOLD].label = "CP2AP_PS_HOLD";
@@ -1805,6 +1827,7 @@ static int s5100_get_pdata(struct modem_ctl *mc, struct modem_data *pdata)
mc->cp_gpio[CP_GPIO_AP2CP_AP_ACTIVE].node_name = "gpio_ap2cp_pda_active";
#if !IS_ENABLED(CONFIG_CP_WRESET_WA)
mc->cp_gpio[CP_GPIO_AP2CP_CP_WRST_N].node_name = "gpio_ap2cp_cp_wrst_n";
+ mc->cp_gpio[CP_GPIO_CP2AP_CP_WRST_N].node_name = "gpio_cp2ap_cp_wrst_n";
mc->cp_gpio[CP_GPIO_AP2CP_PM_WRST_N].node_name = "gpio_ap2cp_pm_wrst_n";
#endif
mc->cp_gpio[CP_GPIO_CP2AP_PS_HOLD].node_name = "gpio_cp2ap_cp_ps_hold";
diff --git a/drivers/soc/google/cpif/modem_v1.h b/drivers/soc/google/cpif/modem_v1.h
index 954d42807410..ef59e0589f99 100644
--- a/drivers/soc/google/cpif/modem_v1.h
+++ b/drivers/soc/google/cpif/modem_v1.h
@@ -270,6 +270,7 @@ enum cp_gpio_type {
CP_GPIO_AP2CP_AP_ACTIVE,
#if !IS_ENABLED(CONFIG_CP_WRESET_WA)
CP_GPIO_AP2CP_CP_WRST_N,
+ CP_GPIO_CP2AP_CP_WRST_N,
CP_GPIO_AP2CP_PM_WRST_N,
#endif
CP_GPIO_CP2AP_PS_HOLD,