[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20251127190237.745-2-balejk@matfyz.cz>
Date: Thu, 27 Nov 2025 20:02:03 +0100
From: Karel Balej <balejk@...fyz.cz>
To: Duje Mihanović <duje@...emihanovic.xyz>,
Ulf Hansson <ulf.hansson@...aro.org>, Rob Herring <robh@...nel.org>,
Krzysztof Kozlowski <krzk+dt@...nel.org>,
Conor Dooley <conor+dt@...nel.org>,
linux-arm-kernel@...ts.infradead.org, linux-pm@...r.kernel.org,
linux-kernel@...r.kernel.org, devicetree@...r.kernel.org
Cc: ~postmarketos/upstreaming@...ts.sr.ht, phone-devel@...r.kernel.org,
Karel Balej <balejk@...fyz.cz>
Subject: [PATCH 2/2] pmdomain: add audio power island for Marvell PXA1908 SoC
Define power domain which needs to be enabled in order for audio to work
on the PXA1908-based samsung,coreprimevelte smartphone. In the
downstream code, this power-on method is marked as specific to the ulcx
series which is likely some variant of the board or some part of it. No
other audio components needed for sound to work on this phone are
currently available mainline but some successful testing was performed
with the vendor variants of the respective drivers and with the domain
forced always-on.
Signed-off-by: Karel Balej <balejk@...fyz.cz>
---
.../marvell/pxa1908-power-controller.c | 38 +++++++++++++++++--
1 file changed, 34 insertions(+), 4 deletions(-)
diff --git a/drivers/pmdomain/marvell/pxa1908-power-controller.c b/drivers/pmdomain/marvell/pxa1908-power-controller.c
index ff5e6e82d3f8..e32eb227f235 100644
--- a/drivers/pmdomain/marvell/pxa1908-power-controller.c
+++ b/drivers/pmdomain/marvell/pxa1908-power-controller.c
@@ -29,7 +29,10 @@
#define POWER_POLL_TIMEOUT_US (25 * USEC_PER_MSEC)
#define POWER_POLL_SLEEP_US 6
-#define NR_DOMAINS 5
+#define APMU_AUD_CLK 0x80
+#define AUDIO_ULCX_ENABLE 0x0d
+
+#define NR_DOMAINS 6
#define to_pxa1908_pd(_genpd) container_of(_genpd, struct pxa1908_pd, genpd)
@@ -59,9 +62,13 @@ static inline bool pxa1908_pd_is_on(struct pxa1908_pd *pd)
{
struct pxa1908_pd_ctrl *ctrl = pd->ctrl;
- return pd->data.id != PXA1908_POWER_DOMAIN_DSI
- ? regmap_test_bits(ctrl->base, APMU_PWR_STATUS_REG, pd->data.pwr_state)
- : regmap_test_bits(ctrl->base, APMU_DEBUG, DSI_PHY_DVM_MASK);
+ switch (pd->data.id) {
+ case PXA1908_POWER_DOMAIN_AUDIO:
+ return regmap_test_bits(ctrl->base, APMU_AUD_CLK, AUDIO_ULCX_ENABLE);
+ case PXA1908_POWER_DOMAIN_DSI:
+ return regmap_test_bits(ctrl->base, APMU_DEBUG, DSI_PHY_DVM_MASK);
+ }
+ return regmap_test_bits(ctrl->base, APMU_PWR_STATUS_REG, pd->data.pwr_state);
}
static int pxa1908_pd_power_on(struct generic_pm_domain *genpd)
@@ -123,6 +130,22 @@ static inline int pxa1908_dsi_power_off(struct generic_pm_domain *genpd)
return regmap_clear_bits(ctrl->base, APMU_DEBUG, DSI_PHY_DVM_MASK);
}
+static inline int pxa1908_audio_power_on(struct generic_pm_domain *genpd)
+{
+ struct pxa1908_pd *pd = to_pxa1908_pd(genpd);
+ struct pxa1908_pd_ctrl *ctrl = pd->ctrl;
+
+ return regmap_set_bits(ctrl->base, APMU_AUD_CLK, AUDIO_ULCX_ENABLE);
+}
+
+static inline int pxa1908_audio_power_off(struct generic_pm_domain *genpd)
+{
+ struct pxa1908_pd *pd = to_pxa1908_pd(genpd);
+ struct pxa1908_pd_ctrl *ctrl = pd->ctrl;
+
+ return regmap_clear_bits(ctrl->base, APMU_AUD_CLK, AUDIO_ULCX_ENABLE);
+}
+
#define DOMAIN(_id, _name, ctrl, mode, state) \
[_id] = { \
.data = { \
@@ -159,6 +182,13 @@ static struct pxa1908_pd domains[NR_DOMAINS] = {
.keep_on = true,
},
},
+ [PXA1908_POWER_DOMAIN_AUDIO] = {
+ .genpd = {
+ .name = "audio",
+ .power_on = pxa1908_audio_power_on,
+ .power_off = pxa1908_audio_power_off,
+ },
+ },
};
static void pxa1908_pd_remove(struct auxiliary_device *auxdev)
--
2.51.2
Powered by blists - more mailing lists