From 876b031ad9dc92c00358f92305cc90d4e5327488 Mon Sep 17 00:00:00 2001 From: Jishnu Prakash Date: Sun, 20 Feb 2022 15:51:54 +0530 Subject: [PATCH 1/4] gpio: pinctrl-spmi-gpio: Add support for pm6450 Add support for pm6450 gpio in pinctrl-spmi-gpio driver. Change-Id: I8120abbd7172232a6e98ab04bd7a2968f84b831e Signed-off-by: Jishnu Prakash --- drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c index fea7983b1a21..dc474dc63885 100644 --- a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +++ b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c @@ -1202,6 +1202,7 @@ static const struct of_device_id pmic_gpio_of_match[] = { { .compatible = "qcom,pm8550vs-gpio", .data = (void *) 6 }, { .compatible = "qcom,pmk8550-gpio", .data = (void *) 6 }, { .compatible = "qcom,pmr735d-gpio", .data = (void *) 2 }, + { .compatible = "qcom,pm6450-gpio", .data = (void *) 9 }, { }, }; From 3debd0f907641f9c5be8195a96ae0db97b414794 Mon Sep 17 00:00:00 2001 From: Jishnu Prakash Date: Tue, 19 Jul 2022 13:57:58 +0530 Subject: [PATCH 2/4] gpio: pinctrl-spmi-gpio: Add support for pmxr2230 Add support for pmxr2230 gpio in pinctrl-spmi-gpio driver. Change-Id: I8f747c13cb6564ab1fe546aa97381f8c196bbe3f Signed-off-by: Jishnu Prakash --- drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c index dc474dc63885..636ad6337c14 100644 --- a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +++ b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c @@ -1203,6 +1203,7 @@ static const struct of_device_id pmic_gpio_of_match[] = { { .compatible = "qcom,pmk8550-gpio", .data = (void *) 6 }, { .compatible = "qcom,pmr735d-gpio", .data = (void *) 2 }, { .compatible = "qcom,pm6450-gpio", .data = (void *) 9 }, + { .compatible = "qcom,pmxr2230-gpio", .data = (void *) 12 }, { }, }; From 027e77d801da9e9cc5b6831ab8acc84d3b68e493 Mon Sep 17 00:00:00 2001 From: Jishnu Prakash Date: Thu, 28 Jul 2022 12:22:48 +0530 Subject: [PATCH 3/4] regulator: rpmh-regulator: add support for disable-mode For some RPMh LDO regulators, the clients do not vote for load current from HLOS, as the regulators receive mode votes from some other subsystems. In these cases, if there is an init-mode vote for HPM from HLOS, it may never be removed by any clients, even when the LDO is disabled, leading to higher power consumption. Add support to specify setting a default mode for LDOs when they get disabled and removing it when they get reenabled, to avoid unexpected high power consumption when they are disabled. Change-Id: I9d007534f5f3b9aad52a00ad31ac72c4148de6e6 Signed-off-by: Jishnu Prakash --- drivers/regulator/rpmh-regulator.c | 40 +++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/rpmh-regulator.c b/drivers/regulator/rpmh-regulator.c index b0bea3a21b03..969f4f0b450c 100644 --- a/drivers/regulator/rpmh-regulator.c +++ b/drivers/regulator/rpmh-regulator.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */ +/* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved. */ #define pr_fmt(fmt) "%s: " fmt, __func__ @@ -204,6 +205,8 @@ struct rpmh_vreg; * @mode: An array of modes supported by an RPMh VRM * regulator resource. * @mode_count: The number of entries in the mode array. + * @disable_pmic_mode: PMIC mode optionally set when aggregated regulator resource + * gets disabled, overriding existing aggregated mode. * @aggr_req_active: Aggregated active set RPMh accelerator register * request * @aggr_req_sleep: Aggregated sleep set RPMh accelerator register @@ -225,6 +228,7 @@ struct rpmh_aggr_vreg { int vreg_count; struct rpmh_regulator_mode *mode; int mode_count; + int disable_pmic_mode; struct rpmh_regulator_request aggr_req_active; struct rpmh_regulator_request aggr_req_sleep; }; @@ -630,6 +634,20 @@ static void rpmh_regulator_handle_arc_enable(struct rpmh_aggr_vreg *aggr_vreg, req->valid &= ~BIT(RPMH_REGULATOR_REG_ARC_PSEUDO_ENABLE); } +static void rpmh_regulator_handle_disable_mode(struct rpmh_aggr_vreg *aggr_vreg, + struct rpmh_regulator_request *req) +{ + if (aggr_vreg->regulator_type != RPMH_REGULATOR_TYPE_VRM + || aggr_vreg->disable_pmic_mode <= 0) + return; + + if ((req->valid & BIT(RPMH_REGULATOR_REG_ENABLE)) + && !req->reg[RPMH_REGULATOR_REG_ENABLE]) { + req->reg[RPMH_REGULATOR_REG_VRM_MODE] = aggr_vreg->disable_pmic_mode; + req->valid |= RPMH_REGULATOR_REG_VRM_MODE; + } +} + /** * rpmh_regulator_aggregate_requests() - aggregate the requests from all * regulators associated with an RPMh resource @@ -672,6 +690,8 @@ static void rpmh_regulator_aggregate_requests(struct rpmh_aggr_vreg *aggr_vreg, rpmh_regulator_handle_arc_enable(aggr_vreg, req_active); rpmh_regulator_handle_arc_enable(aggr_vreg, req_sleep); + rpmh_regulator_handle_disable_mode(aggr_vreg, req_active); + rpmh_regulator_handle_disable_mode(aggr_vreg, req_sleep); } /** @@ -1340,9 +1360,10 @@ static int rpmh_regulator_parse_vrm_modes(struct rpmh_aggr_vreg *aggr_vreg) const struct rpmh_regulator_mode *map; const char *prop; int i, len, rc; - u32 *buf; + u32 *buf, disable_mode; aggr_vreg->regulator_hw_type = RPMH_REGULATOR_HW_TYPE_UNKNOWN; + aggr_vreg->disable_pmic_mode = -EINVAL; /* qcom,regulator-type is optional */ prop = "qcom,regulator-type"; @@ -1388,6 +1409,23 @@ static int rpmh_regulator_parse_vrm_modes(struct rpmh_aggr_vreg *aggr_vreg) map = rpmh_regulator_mode_map[aggr_vreg->regulator_hw_type]; + prop = "qcom,disable-mode"; + if (!of_property_read_u32(node, prop, &disable_mode)) { + if (disable_mode >= RPMH_REGULATOR_MODE_COUNT) { + aggr_vreg_err(aggr_vreg, "qcom,disable-mode value %u is invalid\n", + disable_mode); + return -EINVAL; + } + + if (!map[disable_mode].framework_mode) { + aggr_vreg_err(aggr_vreg, "qcom,disable-mode value %u is invalid for regulator type = %s\n", + disable_mode, type); + return -EINVAL; + } + + aggr_vreg->disable_pmic_mode = map[disable_mode].pmic_mode; + } + /* qcom,supported-modes is optional */ prop = "qcom,supported-modes"; if (!of_find_property(node, prop, &len)) From a73ab4c5ae3432797e5e643bd59e680df2165f33 Mon Sep 17 00:00:00 2001 From: Rakesh Kota Date: Mon, 5 Sep 2022 17:38:36 +0530 Subject: [PATCH 4/4] soc: qcom: pmic-pon-log: update USB pon log reason for PM7250B Currently, when USB power-on trigger happens on PM7250B it reports SID, PID, and IRQ numbers only in power-on reason log. So, update logging to show PM7250B USB_CHARGER as power-on reason. Change-Id: Id0e1b383b21606eb96ca7caa5d1e190a54c6e9ca Signed-off-by: Rakesh Kota --- drivers/soc/qcom/pmic-pon-log.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/soc/qcom/pmic-pon-log.c b/drivers/soc/qcom/pmic-pon-log.c index 72e259be71da..4341446d5d18 100644 --- a/drivers/soc/qcom/pmic-pon-log.c +++ b/drivers/soc/qcom/pmic-pon-log.c @@ -178,6 +178,8 @@ static const struct pmic_pon_trigger_mapping pmic_pon_pon_trigger_map[] = { {0x0640, "SMPL"}, {0x18C0, "PMIC_SID1_GPIO5"}, {0x31C2, "USB_CHARGER"}, + /* PM7250B USB PON trigger */ + {0x8732, "USB_CHARGER"}, }; static const struct pmic_pon_trigger_mapping pmic_pon_reset_trigger_map[] = {