summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun KS <arunks@codeaurora.org>2017-04-20 18:41:33 +0530
committerArun KS <arunks@codeaurora.org>2017-05-02 10:10:38 +0530
commit383f0f89d0e44d05d5ea906c37cdb09a5fca891b (patch)
treeadc5ea150a360a2c4d01e387f9fc6f7c52c06a0d
parent6e878faf2b722ba06a59d3b385569bcb0d22ffe6 (diff)
esoc: mdm-4x: Separate out callback function for 9x45
Reset and power off timing is different. Hence need a separate callback function. Change-Id: I9714a4449b1fbeab84017da4be17f5ca2cb6cab6 Signed-off-by: Arun KS <arunks@codeaurora.org>
-rw-r--r--drivers/esoc/esoc-mdm-pon.c47
1 files changed, 45 insertions, 2 deletions
diff --git a/drivers/esoc/esoc-mdm-pon.c b/drivers/esoc/esoc-mdm-pon.c
index d9b16b23839b..4ae3b7520f77 100644
--- a/drivers/esoc/esoc-mdm-pon.c
+++ b/drivers/esoc/esoc-mdm-pon.c
@@ -60,6 +60,29 @@ static int mdm9x55_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic)
return 0;
}
+/* This function can be called from atomic context. */
+static int mdm9x45_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic)
+{
+ int soft_reset_direction_assert = 0,
+ soft_reset_direction_de_assert = 1;
+
+ if (mdm->soft_reset_inverted) {
+ soft_reset_direction_assert = 1;
+ soft_reset_direction_de_assert = 0;
+ }
+ gpio_direction_output(MDM_GPIO(mdm, AP2MDM_SOFT_RESET),
+ soft_reset_direction_assert);
+ /*
+ * Allow PS hold assert to be detected
+ */
+ if (!atomic)
+ usleep_range(1000000, 1005000);
+ else
+ mdelay(1000);
+ gpio_direction_output(MDM_GPIO(mdm, AP2MDM_SOFT_RESET),
+ soft_reset_direction_de_assert);
+ return 0;
+}
static int mdm4x_do_first_power_on(struct mdm_ctrl *mdm)
{
@@ -135,6 +158,26 @@ static int mdm9x55_power_down(struct mdm_ctrl *mdm)
return 0;
}
+static int mdm9x45_power_down(struct mdm_ctrl *mdm)
+{
+ int soft_reset_direction_assert = 0,
+ soft_reset_direction_de_assert = 1;
+
+ if (mdm->soft_reset_inverted) {
+ soft_reset_direction_assert = 1;
+ soft_reset_direction_de_assert = 0;
+ }
+ gpio_direction_output(MDM_GPIO(mdm, AP2MDM_SOFT_RESET),
+ soft_reset_direction_assert);
+ /*
+ * Allow PS hold assert to be detected
+ */
+ msleep(3003);
+ gpio_direction_output(MDM_GPIO(mdm, AP2MDM_SOFT_RESET),
+ soft_reset_direction_de_assert);
+ return 0;
+}
+
static void mdm4x_cold_reset(struct mdm_ctrl *mdm)
{
if (!gpio_is_valid(MDM_GPIO(mdm, AP2MDM_SOFT_RESET)))
@@ -229,8 +272,8 @@ struct mdm_pon_ops mdm9x35_pon_ops = {
struct mdm_pon_ops mdm9x45_pon_ops = {
.pon = mdm4x_do_first_power_on,
- .soft_reset = mdm4x_toggle_soft_reset,
- .poff_force = mdm4x_power_down,
+ .soft_reset = mdm9x45_toggle_soft_reset,
+ .poff_force = mdm9x45_power_down,
.cold_reset = mdm4x_cold_reset,
.dt_init = mdm4x_pon_dt_init,
.setup = mdm4x_pon_setup,