From nobody Fri Sep 25 00:40:29 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 41A0839C631; Fri, 18 Sep 2026 02:40:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789699246; cv=none; b=RFvyGq5izQsgUxwS1z6HwKrTkSNNLYFzJVBsxEfAY3vb+FMcEOJMs18gv4f/BS9DRlteWWRJJ7wZobTHqUZbsyJ18yUB9mtT7jzDlPe0VtOSs2uDjaRU2sWfVBxvf9A7od9A5PtDt1xjq/7potIb4F9fYaLBPzaiOidTENu7V5s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789699246; c=relaxed/simple; bh=LjFaux2RkoflSgfa+SRMzDruiFnZt3y6YPLO1trSPWs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nBm6IX34r+AuO8Kb1VwGqJkVLxjq2teMjQPLUAZgPks2kCTl1qBdyKBm7Z+/L/T8+ZALBGVVI6guztwE7/c86s+zmR7sMtyvtEOgOzwb2cG57927o18ot+cQ7ppKZzcMLAMhD19RKoc+wRE10Bwqk/GnGzhx6ULTtrt1pNxN2No= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hyuNQFon; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hyuNQFon" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 10E6A1F00893; Fri, 18 Sep 2026 02:40:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1789699234; bh=PDbqsyc8sRVugfq1jQAe0RjqzyEbOeblXoaM2oNL4+k=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=hyuNQFoncmrsh0OVEgXaMr7VNUi3hHDsjTpwni03lmR03Ht85l7Mg9Gg99xsK6q5T f938tAJchCSKB+bfduAh7Vj6pLJUz+q1OWHQQLHgUZY+9enkTFOgTp6Typ6ouhxB7I sMHdj8OjiXgsjrUA0PM6WQA8ehsuupqpS9sgqBWLuFGR6lH2hZMXqiSHN5D7W05Kkx klkRU7vGlLJsKlXWIp0tqv/T9cPWlFfwZJTyDKhLUIHP3rwFQ9gpF+sXYhHrJ3Alac B0hjRNeRVglAkea8evREtxMclb1GN1RC/+lzDgikBnazfpse+UGiaaGHd0NqVD2jgX N9NNmR4UM3WRg== From: Yixun Lan Date: Fri, 18 Sep 2026 02:40:13 +0000 Subject: [PATCH 1/3] dt-bindings: power: spacemit: Add power domain controller Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260918-04-k3-pm-support-v1-1-0acd2b36b96f@kernel.org> References: <20260918-04-k3-pm-support-v1-0-0acd2b36b96f@kernel.org> In-Reply-To: <20260918-04-k3-pm-support-v1-0-0acd2b36b96f@kernel.org> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Ulf Hansson , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Yixun Lan X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3268; i=dlan@kernel.org; h=from:subject:message-id; bh=LjFaux2RkoflSgfa+SRMzDruiFnZt3y6YPLO1trSPWs=; b=owEB6QIW/ZANAwAKATGq6kdZTbvtAcsmYgBqrKSSsV4vhz3ANSGQtXvagH3NvV73rB7g4AHhK Rs3VXWPYJqJAq8EAAEKAJkWIQS1urjJwxtxFWcCI9wxqupHWU277QUCaqykkhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDJfFIAAAAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5 maWZ0aGhvcnNlbWFuLm5ldEI1QkFCOEM5QzMxQjcxMTU2NzAyMjNEQzMxQUFFQTQ3NTk0REJCRU QACgkQMarqR1lNu+2xwxAAjNbE3A3tMYAn70EbRs4GLqvjvYjlxxSoVe6JBT8087K/0FiEU2rpM SQfWFlbZ7YMqiXp4x8TkBG3LGjp3XO8CltZznTkkmvnljke+QmVxbib1D19n4LNIHUnGAW2/hiH QongiyppF3gJwj39ALsKqrtpezxtl52xBBDLDhN1sYBieNlhyafWBFfaF6SvcpNvaCsEAE4aEZk Pu3iUI2a0rGHOWaeJm4oMoZneCv8Wwa9Taxot+V27CF8v2p9CtwLUKTk3ZRQQmv02BetlZsMDzC doiSeUHtf7hgpxpxqT7VeNKwXL8xDP6fjuTz8v4KGAgt5Ga1JJxQvmcGR7PAg3STe5ZZ7FeVTSg fuSufapu8RDHquSP/7eJPpBHviEAPGfGWrse/YL2k43xzff4uf9Cb3aOUS03ciWelgy2ExquYl3 6eiptqGPgSq9iziwCDc+6KUUY/1IsKTs+AojFAna7VVOrh+7Est3icO9mLq4WCuoPwiNdhmfbHb oUAooFM6+JVliRAYfrLxm7fYce57g94c1F8E7DI52p8bQRscgAhRC+8dynPisv+u2u/tSBI3PoD XS8mNNlRG7gDzOm51XyS46iRUOheWE6DcQiK+XZFlULQia+JTcfRnrLYKtdJCvyo9UJy1GPByI4 tKyOn6mRt4nX2j1WKAQvKZWSm47jGQ= X-Developer-Key: i=dlan@kernel.org; a=openpgp; fpr=50B03A1A5CBCD33576EF8CD7920C0DBCAABEFD55 Add initial power domain driver support for SpacemiT K1/K3 SoC, The Power Domain Controller is SoC internal module which is part of APMU (Advanced Power Management Unit), it is responsible for managing power across multi power domains, which includes power on/off, isolation, power-on sequence. Signed-off-by: Yixun Lan --- .../bindings/power/spacemit,power-controller.yaml | 43 ++++++++++++++++++= ++++ include/dt-bindings/power/spacemit,k1-power.h | 14 +++++++ include/dt-bindings/power/spacemit,k3-power.h | 12 ++++++ 3 files changed, 69 insertions(+) diff --git a/Documentation/devicetree/bindings/power/spacemit,power-control= ler.yaml b/Documentation/devicetree/bindings/power/spacemit,power-controlle= r.yaml new file mode 100644 index 000000000000..f869285f84da --- /dev/null +++ b/Documentation/devicetree/bindings/power/spacemit,power-controller.yaml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/power/spacemit,power-controller.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: SpacemiT Power Domains Controller + +maintainers: + - Yixun Lan + +description: | + SpacemiT processors include support for multiple power domains which can= be + powered on/off by software based on different application scenes to save= power. + +properties: + compatible: + enum: + - spacemit,k1-power-controller + - spacemit,k3-power-controller + + '#power-domain-cells': + const: 1 + + spacemit,apmu: + $ref: /schemas/types.yaml#/definitions/phandle + description: + A phandle to APMU syscon to control registers for power domain + +required: + - compatible + - '#power-domain-cells' + - spacemit,apmu + +additionalProperties: false + +examples: + - | + power-controller { + compatible =3D "spacemit,k1-power-controller"; + spacemit,apmu =3D <&syscon_apmu>; + #power-domain-cells =3D <1>; + }; diff --git a/include/dt-bindings/power/spacemit,k1-power.h b/include/dt-bin= dings/power/spacemit,k1-power.h new file mode 100644 index 000000000000..41ef540b5c44 --- /dev/null +++ b/include/dt-bindings/power/spacemit,k1-power.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef _DT_BINDINGS_SPACEMIT_K1_POWER_H_ +#define _DT_BINDINGS_SPACEMIT_K1_POWER_H_ + +#define K1_PMDOMAIN_VPU 0 +#define K1_PMDOMAIN_GPU 1 +#define K1_PMDOMAIN_LCD 2 +#define K1_PMDOMAIN_ISP 3 +#define K1_PMDOMAIN_AUDIO 4 +#define K1_PMDOMAIN_GNSS 5 +#define K1_PMDOMAIN_HDMI 6 + +#endif diff --git a/include/dt-bindings/power/spacemit,k3-power.h b/include/dt-bin= dings/power/spacemit,k3-power.h new file mode 100644 index 000000000000..54b39f2f0936 --- /dev/null +++ b/include/dt-bindings/power/spacemit,k3-power.h @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +#ifndef _DT_BINDINGS_SPACEMIT_K3_POWER_H_ +#define _DT_BINDINGS_SPACEMIT_K3_POWER_H_ + +#define K3_PMDOMAIN_VPU 0 +#define K3_PMDOMAIN_GPU 1 +#define K3_PMDOMAIN_AUDIO 2 +#define K3_PMDOMAIN_LCD0 3 +#define K3_PMDOMAIN_LCD1 4 + +#endif --=20 2.55.0 From nobody Fri Sep 25 00:40:29 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B18173CC324; Fri, 18 Sep 2026 02:40:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789699246; cv=none; b=I3TAVbsPin72RjCtPE2bqwZhr15c67XeYe+v6ttxE5TSA0yekprRpGyX6mPut7zw+nyRcIY6PbsKcBwa3mDFQ3x2ab/NOlNAsnlUk/ZMNr/17AcJ4Sv5NOF97KG6K97NsEjkEG73GPFSCHhWWCrZq6DD2Z1jvstMwyQ/5Zuyq10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789699246; c=relaxed/simple; bh=iqHwifzZgzpugwjB9qhOAFhRt3RpxqvAF10RHTmE19A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=c7gSoeimGJ8hXyNc8yUQ+GvnzC3jOqedbo2oMi9WEZM8mHYctfcB/GS3hHzV9QYgLLBoElJg5w/Xbls3tbAJPM6n0sWAWH5RVetUlROwehCWWo3Gfch7IrzYdwWaUeYY4Q+k43PQ3EA9g/iCmVTrQdowOdfWLaCL358E3QSwo/s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OMg9lkmr; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OMg9lkmr" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 52B3A1F00898; Fri, 18 Sep 2026 02:40:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1789699238; bh=w/QQRys2Br/Sd+PVsft6KzNlyFv6gs8a6KTi1FtELqA=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=OMg9lkmr/t9yKUXzHpNVrCQto73dYcj/gptlywCGtcGE0ey0muxoRHS6eNyWSOO1r tRQBDFY1ZSJbyItLz39DULVct3QUAYygq3+AiT8Bfzs5Mtpov5qjBcB3tfRhUX6fAR Hi+3K0kHcAoRkH0RsiwJILxSdqz+q7sGYdffC9mVY/oi9gCgfFhk5CM7Lh9TKJLrk3 /1NN7Dq6WdUolrrNEX+V/JJPdVuN/fedoSnKz6/szxSd4s4YgeKybzRsABgqdZUqXn USzsy35fu6hcJCC6XDBTZcG6AiWeda4A6QqdId+ORhJ0QKfo6YbikQ/kMbanuC6U3D +q/OwQ2nk+onw== From: Yixun Lan Date: Fri, 18 Sep 2026 02:40:14 +0000 Subject: [PATCH 2/3] pmdomain: spacemit: Add power domain driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260918-04-k3-pm-support-v1-2-0acd2b36b96f@kernel.org> References: <20260918-04-k3-pm-support-v1-0-0acd2b36b96f@kernel.org> In-Reply-To: <20260918-04-k3-pm-support-v1-0-0acd2b36b96f@kernel.org> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Ulf Hansson , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Yixun Lan X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=14457; i=dlan@kernel.org; h=from:subject:message-id; bh=iqHwifzZgzpugwjB9qhOAFhRt3RpxqvAF10RHTmE19A=; b=owEB6QIW/ZANAwAKATGq6kdZTbvtAcsmYgBqrKSV0AVz7W1PhDCE08dqlxWIbcMkJNKvyhD5N YhrCYxefIGJAq8EAAEKAJkWIQS1urjJwxtxFWcCI9wxqupHWU277QUCaqyklRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDJfFIAAAAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5 maWZ0aGhvcnNlbWFuLm5ldEI1QkFCOEM5QzMxQjcxMTU2NzAyMjNEQzMxQUFFQTQ3NTk0REJCRU QACgkQMarqR1lNu+2fIxAAjm8mpjblq1z+/Hq0biNJd4vU++7XXq8LP5zYcJwY+CxUOz54DLa2A VBRjLjV8a9KGyVHK5sWudrCKhdi6oKAW9nktmdevgMS4oWK4Oi/yuY/ACLVj8m29uI06M1QXFH2 1cKj8/tHMfel297OY1spXj82HCWotAFI9TJ/jvzLJ39DflKW7opP0df9U0kXZM3D1faTa13LTR9 c/PcntXx5711/maV5QQHwiHbSwp4YB0SasiXpFRuO3tTxvZhdZmSk/Hg7aUxRRzwoJEWYHQ/fMT V2ancYM9aUT1LGd8gceiTCLPSnVcOn59QZhsvIR+v3esGd8DRCVs5tGCaFTAtzREMUJjdIWT4fu KiXHrol75MyhsD3ebVAKmpbX7Jt9ltUZTj4HA/5TRr7iwuTmJlnrYJ+zgNVrvrXTF5qtGJrCQFe ei8tpI72ZU+2cLHMaRR4NXONqvOna1g1BRL9oAIAJQb8Pg6KemUtNRImC1t37JR7gVXZeLYwwLP WqrfWDhR6y8M8hqmDBKjQ+0pK3AWKNJeRVpu58jpnW0gDVj4kPyqEQeUJsxsksqzAphFlJKSyZj RaUfDqNSeEitEN0kBwMs9oQ/V/jRFgDqeDFRIFxl5SLryRkomOpWWz0T0/a2sXxhVLe4Qpplk3x Xi2Jn9ICJSuylumpXAecPe2xTkwgog= X-Developer-Key: i=dlan@kernel.org; a=openpgp; fpr=50B03A1A5CBCD33576EF8CD7920C0DBCAABEFD55 SpacemiT's PMU (Power Management Unit) consist of several power domains which can be managed independently, depending on different application scenario, each domain can be powered on/off for saving power. The driver is implemented based on Linux Generic PM Domain framework. From a hardware perspective, either of two distinct power-on sequences are supported, in software mode (SW mode), the driver is responsible for controlling the states of bits such as sleep1, sleep2, isolation and pwr_state, while in hardware mode (HW mode), the PMU hardware will complete the sequence automatically without requiring software intervention. Signed-off-by: Yixun Lan --- drivers/pmdomain/Kconfig | 1 + drivers/pmdomain/Makefile | 1 + drivers/pmdomain/spacemit/Kconfig | 15 ++ drivers/pmdomain/spacemit/Makefile | 1 + drivers/pmdomain/spacemit/pm_domains.c | 448 +++++++++++++++++++++++++++++= ++++ 5 files changed, 466 insertions(+) diff --git a/drivers/pmdomain/Kconfig b/drivers/pmdomain/Kconfig index 23076ae90e66..0610acd030f6 100644 --- a/drivers/pmdomain/Kconfig +++ b/drivers/pmdomain/Kconfig @@ -13,6 +13,7 @@ source "drivers/pmdomain/qcom/Kconfig" source "drivers/pmdomain/renesas/Kconfig" source "drivers/pmdomain/rockchip/Kconfig" source "drivers/pmdomain/samsung/Kconfig" +source "drivers/pmdomain/spacemit/Kconfig" source "drivers/pmdomain/st/Kconfig" source "drivers/pmdomain/starfive/Kconfig" source "drivers/pmdomain/sunxi/Kconfig" diff --git a/drivers/pmdomain/Makefile b/drivers/pmdomain/Makefile index ebc802f13eb9..ba25b444e263 100644 --- a/drivers/pmdomain/Makefile +++ b/drivers/pmdomain/Makefile @@ -11,6 +11,7 @@ obj-y +=3D qcom/ obj-y +=3D renesas/ obj-y +=3D rockchip/ obj-y +=3D samsung/ +obj-y +=3D spacemit/ obj-y +=3D st/ obj-y +=3D starfive/ obj-y +=3D sunxi/ diff --git a/drivers/pmdomain/spacemit/Kconfig b/drivers/pmdomain/spacemit/= Kconfig new file mode 100644 index 000000000000..4b927beedc7c --- /dev/null +++ b/drivers/pmdomain/spacemit/Kconfig @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0-only + +menu "SpacemiT PM Domains" + +config SPACEMIT_PM_DOMAINS + bool "PM Domain driver for SpacemiT SoC" + depends on PM + depends on OF + depends on MFD_SYSCON + select PM_GENERIC_DOMAINS + help + PM Domain driver for SpacemiT SoC. Say Y if you want to support + SpacemiT SoCs. + +endmenu diff --git a/drivers/pmdomain/spacemit/Makefile b/drivers/pmdomain/spacemit= /Makefile new file mode 100644 index 000000000000..5e8a740ba494 --- /dev/null +++ b/drivers/pmdomain/spacemit/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_SPACEMIT_PM_DOMAINS) +=3D pm_domains.o diff --git a/drivers/pmdomain/spacemit/pm_domains.c b/drivers/pmdomain/spac= emit/pm_domains.c new file mode 100644 index 000000000000..d563e4e4e232 --- /dev/null +++ b/drivers/pmdomain/spacemit/pm_domains.c @@ -0,0 +1,448 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Spacemit Generic power domain support. + * + * Copyright (c) 2026 SpacemiT Technology Co. Ltd + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define APMU_POWER_STATUS_REG 0xf0 +#define APMU_POWER_TIMEOUT_US 10000 + +struct spacemit_pm_domain_param { + int reg_pwr_ctrl; + int bit_hw_mode; + int bit_sleep2; + int bit_sleep1; + int bit_isolation; + int bit_auto_pwr_on; + int bit_hw_pwr_stat; + int bit_pwr_stat; + int use_hw; + const char *name; +}; + +struct spacemit_pm_domain { + struct generic_pm_domain genpd; + int pm_index; + const struct spacemit_pm_domain_param *param; +}; + +struct spacemit_pmu { + struct device *dev; + struct genpd_onecell_data genpd_data; + struct regmap *regmap; + struct spacemit_pm_domain **domains; + int num_domains; +}; + +struct spacemit_pm_of_data { + int num_domains; + const struct spacemit_pm_domain_param *param; +}; + +static struct spacemit_pmu *gpmu; + +static int spacemit_pd_power_off(struct generic_pm_domain *domain) +{ + struct spacemit_pm_domain *spd =3D container_of(domain, struct spacemit_p= m_domain, genpd); + const struct spacemit_pm_domain_param *p =3D spd->param; + unsigned int val; + int ret; + + if (!spd->param->use_hw) { + regmap_clear_bits(gpmu->regmap, p->reg_pwr_ctrl, BIT(p->bit_isolation)); + fsleep(15); + + val =3D BIT(p->bit_sleep1) | BIT(p->bit_sleep2); + regmap_clear_bits(gpmu->regmap, p->reg_pwr_ctrl, val); + fsleep(15); + + ret =3D regmap_read_poll_timeout(gpmu->regmap, + APMU_POWER_STATUS_REG, + val, + !(val & BIT(p->bit_pwr_stat)), + 5, + APMU_POWER_TIMEOUT_US); + } else { + val =3D BIT(p->bit_auto_pwr_on) | BIT(p->bit_hw_mode); + regmap_clear_bits(gpmu->regmap, p->reg_pwr_ctrl, val); + fsleep(15); + + ret =3D regmap_read_poll_timeout(gpmu->regmap, + APMU_POWER_STATUS_REG, + val, + !(val & BIT(p->bit_hw_pwr_stat)), + 5, + APMU_POWER_TIMEOUT_US); + } + + if (ret) { + dev_err(&domain->dev, "Fail to power-off domain: %d\n", + spd->pm_index); + return -EBUSY; + } + + return 0; +} + +static int spacemit_pd_power_on(struct generic_pm_domain *domain) +{ + struct spacemit_pm_domain *spd =3D container_of(domain, struct spacemit_p= m_domain, genpd); + const struct spacemit_pm_domain_param *p =3D spd->param; + unsigned int val; + int ret =3D 0; + + regmap_read(gpmu->regmap, APMU_POWER_STATUS_REG, &val); + + if (!p->use_hw && (val & BIT(p->bit_pwr_stat))) { + val =3D BIT(p->bit_isolation); + regmap_clear_bits(gpmu->regmap, p->reg_pwr_ctrl, val); + fsleep(15); + + val =3D BIT(p->bit_sleep1) | BIT(p->bit_sleep2); + regmap_clear_bits(gpmu->regmap, p->reg_pwr_ctrl, val); + fsleep(15); + + ret =3D regmap_read_poll_timeout(gpmu->regmap, + APMU_POWER_STATUS_REG, + val, + !(val & BIT(p->bit_pwr_stat)), + 5, + APMU_POWER_TIMEOUT_US); + } + + if (p->use_hw && (val & BIT(p->bit_hw_pwr_stat))) { + val =3D BIT(p->bit_auto_pwr_on) | BIT(p->bit_hw_mode); + regmap_clear_bits(gpmu->regmap, p->reg_pwr_ctrl, val); + fsleep(30); + + ret =3D regmap_read_poll_timeout(gpmu->regmap, + APMU_POWER_STATUS_REG, + val, + !(val & BIT(p->bit_hw_pwr_stat)), + 5, + APMU_POWER_TIMEOUT_US); + } + + if (ret < 0) { + dev_err(&domain->dev, "power-off domain: %d, error\n", spd->pm_index); + return -EBUSY; + } + + if (!p->use_hw) { + regmap_set_bits(gpmu->regmap, p->reg_pwr_ctrl, BIT(p->bit_sleep1)); + fsleep(20); + + val =3D BIT(p->bit_sleep2) | BIT(p->bit_sleep1); + regmap_set_bits(gpmu->regmap, p->reg_pwr_ctrl, val); + fsleep(20); + + regmap_set_bits(gpmu->regmap, p->reg_pwr_ctrl, BIT(p->bit_isolation)); + fsleep(15); + + ret =3D regmap_read_poll_timeout(gpmu->regmap, + APMU_POWER_STATUS_REG, + val, + (val & BIT(p->bit_pwr_stat)), + 5, + APMU_POWER_TIMEOUT_US); + } else { + val =3D BIT(p->bit_auto_pwr_on) | BIT(p->bit_hw_mode); + regmap_set_bits(gpmu->regmap, p->reg_pwr_ctrl, val); + fsleep(300); + + ret =3D regmap_read_poll_timeout(gpmu->regmap, + APMU_POWER_STATUS_REG, + val, + (val & BIT(p->bit_hw_pwr_stat)), + 5, + APMU_POWER_TIMEOUT_US); + } + + if (ret < 0) { + dev_err(&domain->dev, "power-on domain: %d, error\n", spd->pm_index); + return -EBUSY; + } + + return 0; +} + +static bool spacemit_pm_get_state(struct spacemit_pmu *pmu, + struct spacemit_pm_domain *pd) +{ + const struct spacemit_pm_domain_param *p =3D pd->param; + u32 reg, bit; + + regmap_read(pmu->regmap, APMU_POWER_STATUS_REG, ®); + + bit =3D p->use_hw ? BIT(pd->param->bit_hw_pwr_stat) : + BIT(pd->param->bit_pwr_stat); + + return !!(reg & bit); +} + +static int spacemit_pm_add_one_domain(struct spacemit_pmu *pmu, int id, + const struct spacemit_pm_domain_param *param) +{ + struct spacemit_pm_domain *pd; + + pd =3D devm_kzalloc(pmu->dev, sizeof(*pd), GFP_KERNEL); + if (!pd) + return -ENOMEM; + + pd->pm_index =3D id; + pd->param =3D param; + pd->genpd.name =3D param->name; + pd->genpd.power_off =3D spacemit_pd_power_off; + pd->genpd.power_on =3D spacemit_pd_power_on; + + pm_genpd_init(&pd->genpd, NULL, !spacemit_pm_get_state(pmu, pd)); + + pmu->domains[id] =3D pd; + + return 0; +} + +static void spacemit_pm_domain_cleanup(struct spacemit_pmu *pmu) +{ + int i; + + for (i =3D 0; i < pmu->num_domains; i++) { + if (pmu->domains[i]) + pm_genpd_remove(&pmu->domains[i]->genpd); + } +} + +static int spacemit_pm_domain_probe(struct platform_device *pdev) +{ + const struct spacemit_pm_of_data *data; + struct device *dev =3D &pdev->dev; + struct spacemit_pmu *pmu; + int err, i; + + data =3D device_get_match_data(dev); + + pmu =3D devm_kzalloc(dev, sizeof(*pmu), GFP_KERNEL); + if (!pmu) + return -ENOMEM; + + pmu->dev =3D dev; + pmu->num_domains =3D data->num_domains; + + pmu->regmap =3D syscon_regmap_lookup_by_phandle(dev->of_node, "spacemit,a= pmu"); + if (IS_ERR(pmu->regmap)) + return dev_err_probe(dev, PTR_ERR(pmu->regmap), "failed to get apmu regm= ap\n"); + + pmu->domains =3D devm_kcalloc(dev, data->num_domains, + sizeof(*pmu->domains), GFP_KERNEL); + if (!pmu->domains) + return -ENOMEM; + + for (i =3D 0; i < data->num_domains; i++) { + err =3D spacemit_pm_add_one_domain(pmu, i, &data->param[i]); + if (err) { + dev_err(dev, "failed to add domain %d: %d\n", i, err); + goto err_out; + } + } + + pmu->genpd_data.domains =3D (struct generic_pm_domain **)pmu->domains; + pmu->genpd_data.num_domains =3D data->num_domains; + + err =3D of_genpd_add_provider_onecell(dev->of_node, &pmu->genpd_data); + if (err) { + dev_err(dev, "failed to add provider: %d\n", err); + goto err_out; + } + + gpmu =3D pmu; + + return 0; + +err_out: + spacemit_pm_domain_cleanup(pmu); + return err; +} + +static const struct spacemit_pm_domain_param k1_domain_params[] =3D { + [K1_PMDOMAIN_VPU] =3D { + .reg_pwr_ctrl =3D 0xa8, + .bit_sleep2 =3D 3, + .bit_sleep1 =3D 2, + .bit_isolation =3D 1, + .bit_pwr_stat =3D 1, + .bit_hw_pwr_stat =3D 9, + .name =3D "vpu", + }, + [K1_PMDOMAIN_GPU] =3D { + .reg_pwr_ctrl =3D 0xd0, + .bit_sleep2 =3D 3, + .bit_sleep1 =3D 2, + .bit_isolation =3D 1, + .bit_pwr_stat =3D 0, + .name =3D "gpu", + }, + [K1_PMDOMAIN_LCD] =3D { + .reg_pwr_ctrl =3D 0x380, + .bit_hw_mode =3D 4, + .bit_sleep2 =3D 3, + .bit_sleep1 =3D 2, + .bit_isolation =3D 1, + .bit_auto_pwr_on =3D 0, + .bit_pwr_stat =3D 4, + .bit_hw_pwr_stat =3D 12, + .use_hw =3D 1, + .name =3D "lcd", + }, + [K1_PMDOMAIN_ISP] =3D { + .reg_pwr_ctrl =3D 0x37c, + .bit_hw_mode =3D 4, + .bit_sleep2 =3D 3, + .bit_sleep1 =3D 2, + .bit_isolation =3D 1, + .bit_auto_pwr_on =3D 0, + .bit_pwr_stat =3D 2, + .bit_hw_pwr_stat =3D 10, + .name =3D "isp", + }, + [K1_PMDOMAIN_AUDIO] =3D { + .reg_pwr_ctrl =3D 0x378, + .bit_hw_mode =3D 4, + .bit_sleep2 =3D 3, + .bit_sleep1 =3D 2, + .bit_isolation =3D 1, + .bit_auto_pwr_on =3D 0, + .bit_pwr_stat =3D 3, + .bit_hw_pwr_stat =3D 11, + .use_hw =3D 1, + .name =3D "audio", + }, + [K1_PMDOMAIN_GNSS] =3D { + .reg_pwr_ctrl =3D 0x13c, + .bit_hw_mode =3D 4, + .bit_sleep2 =3D 3, + .bit_sleep1 =3D 2, + .bit_isolation =3D 1, + .bit_auto_pwr_on =3D 0, + .bit_pwr_stat =3D 6, + .bit_hw_pwr_stat =3D 14, + .name =3D "gnss", + }, + [K1_PMDOMAIN_HDMI] =3D { + .reg_pwr_ctrl =3D 0x3f4, + .bit_hw_mode =3D 4, + .bit_sleep2 =3D 3, + .bit_sleep1 =3D 2, + .bit_isolation =3D 1, + .bit_auto_pwr_on =3D 0, + .bit_pwr_stat =3D 7, + .bit_hw_pwr_stat =3D 15, + .use_hw =3D 1, + .name =3D "hdmi", + }, +}; + +static const struct spacemit_pm_domain_param k3_domain_params[] =3D { + [K3_PMDOMAIN_VPU] =3D { + .bit_auto_pwr_on =3D 0, + .bit_isolation =3D 1, + .bit_sleep1 =3D 2, + .bit_sleep2 =3D 3, + .bit_hw_mode =3D 4, + .bit_pwr_stat =3D 2, + .bit_hw_pwr_stat =3D 9, + .use_hw =3D 1, + .reg_pwr_ctrl =3D 0xa8, + .name =3D "vpu", + }, + [K3_PMDOMAIN_GPU] =3D { + .bit_auto_pwr_on =3D 0, + .bit_isolation =3D 1, + .bit_sleep1 =3D 2, + .bit_sleep2 =3D 3, + .bit_hw_mode =3D 4, + .bit_pwr_stat =3D 0, + .bit_hw_pwr_stat =3D 8, + .use_hw =3D 1, + .reg_pwr_ctrl =3D 0xd0, + .name =3D "gpu", + }, + [K3_PMDOMAIN_AUDIO] =3D { + .bit_auto_pwr_on =3D 0, + .bit_isolation =3D 1, + .bit_sleep1 =3D 2, + .bit_sleep2 =3D 3, + .bit_hw_mode =3D 4, + .bit_pwr_stat =3D 3, + .reg_pwr_ctrl =3D 0x378, + .name =3D "audio", + }, + [K3_PMDOMAIN_LCD0] =3D { + .bit_auto_pwr_on =3D 0, + .bit_isolation =3D 1, + .bit_sleep1 =3D 2, + .bit_sleep2 =3D 3, + .bit_hw_mode =3D 4, + .bit_pwr_stat =3D 4, + .bit_hw_pwr_stat =3D 12, + .use_hw =3D 1, + .reg_pwr_ctrl =3D 0x380, + .name =3D "lcd0", + }, + [K3_PMDOMAIN_LCD1] =3D { + .bit_auto_pwr_on =3D 0, + .bit_isolation =3D 1, + .bit_sleep1 =3D 2, + .bit_sleep2 =3D 3, + .bit_hw_mode =3D 4, + .bit_pwr_stat =3D 5, + .bit_hw_pwr_stat =3D 15, + .use_hw =3D 1, + .reg_pwr_ctrl =3D 0x3f4, + .name =3D "lcd1", + }, +}; + +static const struct spacemit_pm_of_data k1_of_data =3D { + .num_domains =3D ARRAY_SIZE(k1_domain_params), + .param =3D k1_domain_params, +}; + +static const struct spacemit_pm_of_data k3_of_data =3D { + .num_domains =3D ARRAY_SIZE(k3_domain_params), + .param =3D k3_domain_params, +}; + +static const struct of_device_id spacemit_pm_domain_dt_match[] =3D { + { + .compatible =3D "spacemit,k1-power-controller", + .data =3D &k1_of_data, + }, + { + .compatible =3D "spacemit,k3-power-controller", + .data =3D &k3_of_data, + }, + { /* sentinel */ } +}; + +static struct platform_driver spacemit_pm_domain_driver =3D { + .probe =3D spacemit_pm_domain_probe, + .driver =3D { + .name =3D "spacemit-pm-domain", + .of_match_table =3D spacemit_pm_domain_dt_match, + }, +}; + +builtin_platform_driver(spacemit_pm_domain_driver); +MODULE_DESCRIPTION("SpacemiT Generic Power Domains driver"); +MODULE_LICENSE("GPL"); --=20 2.55.0 From nobody Fri Sep 25 00:40:29 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 664663D9680; Fri, 18 Sep 2026 02:40:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789699256; cv=none; b=kBvSN2+MYKt0qjsCjR+HEZbIwMilgt+xGE869+lbETFZYLQvtUkN+IjpGAJZodlSvoum2x+c1EuD6yYm9ZEWfsaKI7DdXPxKK4YG8Qk9XDBJDColCV8fs2iom1Gwa6pjSuybb2ak+tvolEkSzM3vaMtF94gtdq+tghyFi9TaftE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789699256; c=relaxed/simple; bh=vX1oH9OH1GKzwXjdYNaZSPlTagRimiE4pEJyduCBULA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=omTIARyc91bwF3eWwyhaCWCgFhTiC7vsIBmYf6usVR8QP0sf9cS/Qi9ggJTz8/oS/tMEPvhxnZdYIsxCkOpwczcVxvTrjURsQclUCondUQ26K1Gji/YjcYkxQTOYd95EcimIRA998TttiABZdEwoEzixbDSt0yYLBaUN6J/jD8s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KQdS4Tk1; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KQdS4Tk1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0E32D1F00899; Fri, 18 Sep 2026 02:40:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1789699242; bh=5IeGjUN7fXw7p9Xz+5Tbudirtuv11NiQpLTAxyNiadk=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=KQdS4Tk1uWgHQaFv98UNLA8tQ4F7LMlO26PIbaun98U7pnsFLktqyO4rBxIJGDyi7 VLJ+4vELWdYbwvUuRn95XFscFcCddNGz7Q9TH6y8TvhBIDAO4v04w+fdEAABZh+5Xg ol5uIEislJNS39VC3A5qrg0dU7zayRb1copPl0FvZrn4yYy9DSIO8/826UikCpcfSH wwuaoa8X9x0SUGyRTu20Rhz4YuLo2BMVV0zHMxXZYZXLjQGeLwZSxXQseUys67CtkE S0JUrGA7gjyyOYVf9Xmm6t4GuJ/QmLwrGjwrjgZ/YV/tpKPmqHWP7+MQ4yW7pica5c 6VG2IiVNUzFAQ== From: Yixun Lan Date: Fri, 18 Sep 2026 02:40:15 +0000 Subject: [PATCH 3/3] dts: riscv: spacemit: Add power domain nodes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260918-04-k3-pm-support-v1-3-0acd2b36b96f@kernel.org> References: <20260918-04-k3-pm-support-v1-0-0acd2b36b96f@kernel.org> In-Reply-To: <20260918-04-k3-pm-support-v1-0-0acd2b36b96f@kernel.org> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Ulf Hansson , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Yixun Lan X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1187; i=dlan@kernel.org; h=from:subject:message-id; bh=vX1oH9OH1GKzwXjdYNaZSPlTagRimiE4pEJyduCBULA=; b=owEB6QIW/ZANAwAKATGq6kdZTbvtAcsmYgBqrKSYUhRJxzcpB1oSOW2nwIHpBOLxwgymvV4sZ Zmsmiq81tqJAq8EAAEKAJkWIQS1urjJwxtxFWcCI9wxqupHWU277QUCaqykmBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDJfFIAAAAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5 maWZ0aGhvcnNlbWFuLm5ldEI1QkFCOEM5QzMxQjcxMTU2NzAyMjNEQzMxQUFFQTQ3NTk0REJCRU QACgkQMarqR1lNu+1xiA/9Fezfv05YmStKUfOLohH7paXlxs9vU1Fs21qaZNxdYpg8xj7+ZH9g1 HSn0f6zqSa8EkEOZtHAc19ifc0lLKOhMut2cinhP8QkQMr1qH2NS42Y/RifE+x9TJEsEPbvvUi9 3+0ty1MibOUBI9oTdPSi2XROGHD7ydw2VCPZfBsy/BRHp1p71XEDJn9irkGVUbLUyjy+1DpJp/c j8472nDjbNDraMwh3HGUEAjSY3gLnV4KbsQyjGoeEdbVv8zLoky0OUljxqMFwllM14Yefac9q48 8+Ar6xPGnZjYqFj8TzkzeOjrga06kkeB4JukvLInvhaB6OmOJdEu1MOr6pys9uoSQVuJz2HS2rt 4+hyu9VvifpnwZbQh3vb9IgDmDkGolyZM6P4Y4jCObu/jy4/bWeJeQD0htZxOKK45W+D2D4Hp6J 1ZaMYo6oQIZynXMlvXqba4nbhLS4yI3njX7ir0NbGnrYTUtkM4hTmzwSzmgqOa/fC+FaS/N6QTn rJzCeJUmZiXRD32e7YvdKoTJpnYMIPFV/ttKewnZI8KYU+i0tE3EBuiXdnnmTAMNtBYsywEojIE JuxQ3DhZ7dUKxwH5es1ubSTtnj+Pakis3BCgBPb29EQ7+ruhy8SC/MobRyw3UdWP6RhyPiafKzG tYR+Af4YQcKAkO/54KJ3BOmMWGeFHQ= X-Developer-Key: i=dlan@kernel.org; a=openpgp; fpr=50B03A1A5CBCD33576EF8CD7920C0DBCAABEFD55 Populate the power domain device tree nodes for K1/K3 SoC. Signed-off-by: Yixun Lan --- arch/riscv/boot/dts/spacemit/k1.dtsi | 6 ++++++ arch/riscv/boot/dts/spacemit/k3.dtsi | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/arch/riscv/boot/dts/spacemit/k1.dtsi b/arch/riscv/boot/dts/spa= cemit/k1.dtsi index 3fabfd34114b..871c913e6fb4 100644 --- a/arch/riscv/boot/dts/spacemit/k1.dtsi +++ b/arch/riscv/boot/dts/spacemit/k1.dtsi @@ -1352,4 +1352,10 @@ emmc: mmc@d4281000 { }; }; }; + + pwrc: power-controller { + compatible =3D "spacemit,k1-power-controller"; + spacemit,apmu =3D <&syscon_apmu>; + #power-domain-cells =3D <1>; + }; }; diff --git a/arch/riscv/boot/dts/spacemit/k3.dtsi b/arch/riscv/boot/dts/spa= cemit/k3.dtsi index c3f2dce0969c..1bf25a657762 100644 --- a/arch/riscv/boot/dts/spacemit/k3.dtsi +++ b/arch/riscv/boot/dts/spacemit/k3.dtsi @@ -1306,4 +1306,10 @@ maplic: interrupt-controller@f1800000 { status =3D "reserved"; }; }; + + pwrc: power-controller { + compatible =3D "spacemit,k3-power-controller"; + spacemit,apmu =3D <&syscon_apmu>; + #power-domain-cells =3D <1>; + }; }; --=20 2.55.0