diff options
| author | Gustavo Solaira <gustavos@codeaurora.org> | 2017-12-05 15:22:54 -0800 |
|---|---|---|
| committer | Gustavo Solaira <gustavos@codeaurora.org> | 2017-12-05 21:28:06 -0800 |
| commit | a026858db0ee334ae44b11973ee66b4350894d23 (patch) | |
| tree | e2ac7a39e5ddd8b626b6173d0f6954c60a78714a | |
| parent | 55cbbe687356eeb53256e8f8dc7f7daddae68272 (diff) | |
esoc: Convert timeout for reset and shutdown to device tree option
Convert the timeout and shutdown intervals to be read from
the device tree and set default values in case no option is
provided.
Change-Id: I90efb5910ddf1667db5cde79f46a4a94da1668ec
Signed-off-by: Gustavo Solaira <gustavos@codeaurora.org>
| -rw-r--r-- | Documentation/devicetree/bindings/arm/msm/mdm-modem.txt | 9 | ||||
| -rw-r--r-- | drivers/esoc/esoc-mdm-4x.c | 8 | ||||
| -rw-r--r-- | drivers/esoc/esoc-mdm-pon.c | 30 | ||||
| -rw-r--r-- | drivers/esoc/esoc-mdm.h | 4 |
4 files changed, 47 insertions, 4 deletions
diff --git a/Documentation/devicetree/bindings/arm/msm/mdm-modem.txt b/Documentation/devicetree/bindings/arm/msm/mdm-modem.txt index 7d5e8a1c910a..1000992b3341 100644 --- a/Documentation/devicetree/bindings/arm/msm/mdm-modem.txt +++ b/Documentation/devicetree/bindings/arm/msm/mdm-modem.txt @@ -114,6 +114,15 @@ Optional driver parameters: - qcom,mdm-statusline-not-a-powersource: Boolean. If set, status line to esoc device is not a power source. - qcom,mdm-userspace-handle-shutdown: Boolean. If set, userspace handles shutdown requests. +- qcom,shutdown-timeout-ms: graceful shutdown timeout in milliseconds. + This interval is the time needed for the external modem to gracefully shutdown + after the host sends a shutdown command. The value depends on how long it takes + for the high level OS in the external modem to shutdown gracefully. The default + value is 10000 milliseconds. +- qcom,reset-time-ms: time it takes for the external modem to forcefully reset in milliseconds. + This interval is the time it takes to toggle the reset of an external modem by + holding down the reset pin. The value depends on the external modem's power + management boot options. The default value is 203 milliseconds. Example: mdm0: qcom,mdm0 { diff --git a/drivers/esoc/esoc-mdm-4x.c b/drivers/esoc/esoc-mdm-4x.c index b24457d575c8..d071e89d3124 100644 --- a/drivers/esoc/esoc-mdm-4x.c +++ b/drivers/esoc/esoc-mdm-4x.c @@ -220,7 +220,7 @@ static int mdm_cmd_exe(enum esoc_cmd cmd, struct esoc_clink *esoc) } dev_dbg(mdm->dev, "Waiting for status gpio go low\n"); status_down = false; - end_time = jiffies + msecs_to_jiffies(10000); + end_time = jiffies + msecs_to_jiffies(mdm->shutdown_timeout_ms); while (time_before(jiffies, end_time)) { if (gpio_get_value(MDM_GPIO(mdm, MDM2AP_STATUS)) == 0) { @@ -1084,6 +1084,12 @@ static int mdm9x55_setup_hw(struct mdm_ctrl *mdm, &esoc->link_info); if (ret) dev_info(mdm->dev, "esoc link info missing\n"); + + ret = of_property_read_u32(node, "qcom,shutdown-timeout-ms", + &mdm->shutdown_timeout_ms); + if (ret) + mdm->shutdown_timeout_ms = DEF_SHUTDOWN_TIMEOUT; + esoc->clink_ops = clink_ops; esoc->parent = mdm->dev; esoc->owner = THIS_MODULE; diff --git a/drivers/esoc/esoc-mdm-pon.c b/drivers/esoc/esoc-mdm-pon.c index 4d8ff4968038..4be66a16a3a1 100644 --- a/drivers/esoc/esoc-mdm-pon.c +++ b/drivers/esoc/esoc-mdm-pon.c @@ -41,6 +41,7 @@ static int mdm9x55_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic) { int soft_reset_direction_assert = 0, soft_reset_direction_de_assert = 1; + uint32_t reset_time_us = mdm->reset_time_ms * 1000; if (mdm->soft_reset_inverted) { soft_reset_direction_assert = 1; @@ -52,9 +53,9 @@ static int mdm9x55_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic) * Allow PS hold assert to be detected */ if (!atomic) - usleep_range(203000, 300000); + usleep_range(reset_time_us, reset_time_us + 100000); else - mdelay(203); + mdelay(mdm->reset_time_ms); gpio_direction_output(MDM_GPIO(mdm, AP2MDM_SOFT_RESET), soft_reset_direction_de_assert); return 0; @@ -212,6 +213,29 @@ static int apq8096_pon_dt_init(struct mdm_ctrl *mdm) return 0; } +static int mdm9x55_pon_dt_init(struct mdm_ctrl *mdm) +{ + int val; + struct device_node *node = mdm->dev->of_node; + enum of_gpio_flags flags = OF_GPIO_ACTIVE_LOW; + + + val = of_property_read_u32(node, "qcom,reset-time-ms", + &mdm->reset_time_ms); + if (val) + mdm->reset_time_ms = DEF_MDM9X55_RESET_TIME; + + val = of_get_named_gpio_flags(node, "qcom,ap2mdm-soft-reset-gpio", + 0, &flags); + if (val >= 0) { + MDM_GPIO(mdm, AP2MDM_SOFT_RESET) = val; + if (flags & OF_GPIO_ACTIVE_LOW) + mdm->soft_reset_inverted = 1; + return 0; + } else + return -EIO; +} + static int mdm4x_pon_dt_init(struct mdm_ctrl *mdm) { int val; @@ -290,7 +314,7 @@ struct mdm_pon_ops mdm9x55_pon_ops = { .soft_reset = mdm9x55_toggle_soft_reset, .poff_force = mdm9x55_power_down, .cold_reset = mdm9x55_cold_reset, - .dt_init = mdm4x_pon_dt_init, + .dt_init = mdm9x55_pon_dt_init, .setup = mdm4x_pon_setup, }; diff --git a/drivers/esoc/esoc-mdm.h b/drivers/esoc/esoc-mdm.h index 9343e49559f2..c88b2bdba30b 100644 --- a/drivers/esoc/esoc-mdm.h +++ b/drivers/esoc/esoc-mdm.h @@ -43,6 +43,8 @@ #define MDM_MODEM_TIMEOUT 3000 #define DEF_RAMDUMP_TIMEOUT 120000 #define DEF_RAMDUMP_DELAY 2000 +#define DEF_SHUTDOWN_TIMEOUT 10000 +#define DEF_MDM9X55_RESET_TIME 203 #define RD_BUF_SIZE 100 #define SFR_MAX_RETRIES 10 #define SFR_RETRY_INTERVAL 1000 @@ -96,6 +98,8 @@ struct mdm_ctrl { bool debug_fail; unsigned int dump_timeout_ms; unsigned int ramdump_delay_ms; + unsigned int shutdown_timeout_ms; + unsigned int reset_time_ms; struct esoc_clink *esoc; bool get_restart_reason; unsigned long irq_mask; |
