Loading Documentation/devicetree/bindings/arm/msm/mdm-modem.txt +2 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,8 @@ Optional driver parameters: management boot options. The default value is 203 milliseconds. - qcom,esoc-skip-restart-for-mdm-crash: Boolean. If set, the esoc framework would skip the warm reboot phase during the momem crash. - qcom,esoc-spmi-soft-reset: Boolean. If set, esoc framework will use qpnp apis to reset the external modem chip instead of toggling gpios. Example: mdm0: qcom,mdm0 { Loading arch/arm64/boot/dts/qcom/kona.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -983,6 +983,7 @@ qcom,support-shutdown; qcom,pil-force-shutdown; qcom,esoc-skip-restart-for-mdm-crash; qcom,esoc-spmi-soft-reset; pinctrl-names = "default", "mdm_active", "mdm_suspend"; pinctrl-0 = <&ap2mdm_pon_reset_default>; pinctrl-1 = <&ap2mdm_active &mdm2ap_active>; Loading drivers/esoc/esoc-mdm-pon.c +16 −1 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2014-2015, 2017-2018, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2015, 2017-2019, The Linux Foundation. All rights reserved. */ #include "esoc-mdm.h" #include <linux/input/qpnp-power-on.h> /* This function can be called from atomic context. */ static int mdm9x55_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic) Loading Loading @@ -73,9 +74,23 @@ static int sdx50m_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic) /* This function can be called from atomic context. */ static int sdx55m_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic) { struct device_node *node = mdm->dev->of_node; int rc; int soft_reset_direction_assert = 0, soft_reset_direction_de_assert = 1; if (of_property_read_bool(node, "qcom,esoc-spmi-soft-reset")) { esoc_mdm_log("Doing a Warm reset using SPMI\n"); rc = qpnp_pon_modem_pwr_off(PON_POWER_OFF_WARM_RESET); if (rc) { dev_err(mdm->dev, "SPMI warm reset failed\n"); esoc_mdm_log("SPMI warm reset failed\n"); return rc; } esoc_mdm_log("Warm reset done using SPMI\n"); return 0; } if (mdm->soft_reset_inverted) { soft_reset_direction_assert = 1; soft_reset_direction_de_assert = 0; Loading Loading
Documentation/devicetree/bindings/arm/msm/mdm-modem.txt +2 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,8 @@ Optional driver parameters: management boot options. The default value is 203 milliseconds. - qcom,esoc-skip-restart-for-mdm-crash: Boolean. If set, the esoc framework would skip the warm reboot phase during the momem crash. - qcom,esoc-spmi-soft-reset: Boolean. If set, esoc framework will use qpnp apis to reset the external modem chip instead of toggling gpios. Example: mdm0: qcom,mdm0 { Loading
arch/arm64/boot/dts/qcom/kona.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -983,6 +983,7 @@ qcom,support-shutdown; qcom,pil-force-shutdown; qcom,esoc-skip-restart-for-mdm-crash; qcom,esoc-spmi-soft-reset; pinctrl-names = "default", "mdm_active", "mdm_suspend"; pinctrl-0 = <&ap2mdm_pon_reset_default>; pinctrl-1 = <&ap2mdm_active &mdm2ap_active>; Loading
drivers/esoc/esoc-mdm-pon.c +16 −1 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2014-2015, 2017-2018, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2015, 2017-2019, The Linux Foundation. All rights reserved. */ #include "esoc-mdm.h" #include <linux/input/qpnp-power-on.h> /* This function can be called from atomic context. */ static int mdm9x55_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic) Loading Loading @@ -73,9 +74,23 @@ static int sdx50m_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic) /* This function can be called from atomic context. */ static int sdx55m_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic) { struct device_node *node = mdm->dev->of_node; int rc; int soft_reset_direction_assert = 0, soft_reset_direction_de_assert = 1; if (of_property_read_bool(node, "qcom,esoc-spmi-soft-reset")) { esoc_mdm_log("Doing a Warm reset using SPMI\n"); rc = qpnp_pon_modem_pwr_off(PON_POWER_OFF_WARM_RESET); if (rc) { dev_err(mdm->dev, "SPMI warm reset failed\n"); esoc_mdm_log("SPMI warm reset failed\n"); return rc; } esoc_mdm_log("Warm reset done using SPMI\n"); return 0; } if (mdm->soft_reset_inverted) { soft_reset_direction_assert = 1; soft_reset_direction_de_assert = 0; Loading