get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2196297/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2196297,
    "url": "http://patchwork.ozlabs.org/api/patches/2196297/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/20260213111009.1254360-2-aswin.murugan@oss.qualcomm.com/",
    "project": {
        "id": 18,
        "url": "http://patchwork.ozlabs.org/api/projects/18/?format=api",
        "name": "U-Boot",
        "link_name": "uboot",
        "list_id": "u-boot.lists.denx.de",
        "list_email": "u-boot@lists.denx.de",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260213111009.1254360-2-aswin.murugan@oss.qualcomm.com>",
    "list_archive_url": null,
    "date": "2026-02-13T11:10:06",
    "name": "[v8,1/4] power-domain: Add QCOM RPMH Power Domain Driver Support",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "db9ab111de0e33dd3576d1f77400a88b7c9d7cb7",
    "submitter": {
        "id": 90811,
        "url": "http://patchwork.ozlabs.org/api/people/90811/?format=api",
        "name": "Aswin Murugan",
        "email": "aswin.murugan@oss.qualcomm.com"
    },
    "delegate": {
        "id": 151538,
        "url": "http://patchwork.ozlabs.org/api/users/151538/?format=api",
        "username": "kcxt",
        "first_name": "Casey",
        "last_name": "Connolly",
        "email": "casey.connolly@linaro.org"
    },
    "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20260213111009.1254360-2-aswin.murugan@oss.qualcomm.com/mbox/",
    "series": [
        {
            "id": 492082,
            "url": "http://patchwork.ozlabs.org/api/series/492082/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=492082",
            "date": "2026-02-13T11:10:05",
            "name": "Add QCOM RPMH Power Domain Driver Support",
            "version": 8,
            "mbox": "http://patchwork.ozlabs.org/series/492082/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2196297/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2196297/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<u-boot-bounces@lists.denx.de>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=Mc5svzGf;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=N1RfXbRE;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)",
            "phobos.denx.de;\n dmarc=none (p=none dis=none) header.from=oss.qualcomm.com",
            "phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de",
            "phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com\n header.b=\"Mc5svzGf\";\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.b=\"N1RfXbRE\";\n\tdkim-atps=neutral",
            "phobos.denx.de; dmarc=none (p=none dis=none)\n header.from=oss.qualcomm.com",
            "phobos.denx.de;\n spf=pass smtp.mailfrom=aswin.murugan@oss.qualcomm.com"
        ],
        "Received": [
            "from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fC8cF0k4Sz1xr1\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 13 Feb 2026 22:11:09 +1100 (AEDT)",
            "from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 93DAC83CEE;\n\tFri, 13 Feb 2026 12:11:02 +0100 (CET)",
            "by phobos.denx.de (Postfix, from userid 109)\n id 92B6780B98; Fri, 13 Feb 2026 12:11:00 +0100 (CET)",
            "from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com\n [205.220.168.131])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 8919383CBD\n for <u-boot@lists.denx.de>; Fri, 13 Feb 2026 12:10:57 +0100 (CET)",
            "from pps.filterd (m0279863.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 61DACE9U3259044\n for <u-boot@lists.denx.de>; Fri, 13 Feb 2026 11:10:55 GMT",
            "from mail-pj1-f71.google.com (mail-pj1-f71.google.com\n [209.85.216.71])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c9ptv2hhs-1\n (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n for <u-boot@lists.denx.de>; Fri, 13 Feb 2026 11:10:55 +0000 (GMT)",
            "by mail-pj1-f71.google.com with SMTP id\n 98e67ed59e1d1-34e5a9f0d6aso1010194a91.0\n for <u-boot@lists.denx.de>; Fri, 13 Feb 2026 03:10:55 -0800 (PST)",
            "from hu-aswinm-blr.qualcomm.com\n (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35662f8cc57sm12364399a91.13.2026.02.13.03.10.48\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 13 Feb 2026 03:10:53 -0800 (PST)"
        ],
        "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de",
        "X-Spam-Level": "",
        "X-Spam-Status": "No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED,\n SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2",
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n cc:content-transfer-encoding:date:from:in-reply-to:message-id\n :mime-version:references:subject:to; s=qcppdkim1; bh=OjD/Fe/2CVq\n eA8Oapu8CeKA0Nqj+u+xEL+FYtEClBks=; b=Mc5svzGftHk/Vkn8CXa2Zzg8Vqh\n 1Qn+SPgAmhH/yYU7d9rQyGqh09bu3Fa4lhvx0IwMO/DyHxS5RNvVLAVHADwDDLaF\n pWDmVikgUY2irDZA0g0w64TmZGY37GiEcAu88Gq0CaAX+gsFe4uoZOtI8e6gbAAL\n 0QMba54ZRdOlrxX4a6WqKJytwCLkWGrywbWt3UY6glfo3ZxC/Qg+nsbv3YaZad+t\n 2axyMbFLi3mIhEnjE9PbbTPMXS/vOjunUabIoG2pLYYTAjmMXbhKq7+OTQecf5La\n T2mgeS+X7DaOZ0+ZM3Qfe9ZSbuLOy01BKfIqJxv5TbMLo0Zc8n1bU4Pkt6Q==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1770981055; x=1771585855; darn=lists.denx.de;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=OjD/Fe/2CVqeA8Oapu8CeKA0Nqj+u+xEL+FYtEClBks=;\n b=N1RfXbREmxXZ58cfRunGuA/acGoqt3gA3lna1Aj08sW2LWaazP2wELVhDYOidLVqCs\n 3xng/VARNKY2WhEwaLeELywPJG9hPBG/uwFEbNeCbUqfXECXHocn0thiGR4lgzj3kUkM\n 74djxacgwfip9Ri/BcwsDuoW23wI8Z/EXElrovlT+HnFko46IQ7il2p0QRdojMiOOC41\n TvjJ/9phvDc+cggUTCzExPEa7x/Zz3pQ+vJ9uMh07Ii6DYwBW87SN6lPA39kgtSC9Xmp\n b5ab9zjAYz97czF3uhOqZrm8SfC8R7VdSMXhGpkJNuwEKkHkWeogZP7z4mqnaG8QEfs9\n VXnw=="
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1770981055; x=1771585855;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=OjD/Fe/2CVqeA8Oapu8CeKA0Nqj+u+xEL+FYtEClBks=;\n b=hbG4rWFTaFTbxIGJwZWMKaAb+VbuSP35wJUfF9GuLfftiyanXvjPuwKbvSmrjospNc\n EoymdS5f4/MyWYKIf1cFVGKF6POZ0r3O3sDhMEeEtQjDGWvEp2O9Y6aoWSI23ghxavAI\n 2g5LNFNosmDvkVexPEeWWgv2tcFfd86EfJHQHADz+LIJAKUerE0AzgcrC68Yk2fvfIv7\n 6k7tiV/Z+m0e64zCieEdq2+zdS++zt2g7P9ioLIME08uZAlOE+D3qQNDFk0QbrlasWbO\n 1/wECGoI2VGUYALwgVuqC1Wcu4d9aSlaHPoEXgPksBrpSdrsoyHcLe3kt02wK6Uibby3\n AVBQ==",
        "X-Forwarded-Encrypted": "i=1;\n AJvYcCW3H1xSSxRpXUj/SOTca6cK9wQES2/S3ScgSr32/YKOgWTx/qZRO9h40vzWMxfKTOTdCBF5K/s=@lists.denx.de",
        "X-Gm-Message-State": "AOJu0YwIHGPMujq+JdDpw2tnbfg94F9d9cCMcZxQHaECTBuWAw3Dqz16\n OXAYzFtDRmyQXMnxBDoNovR15vMTXPwOCb/7pf68CigV4XW5/ew/e6M/ipYx7ZDhr4dMzORdfyE\n ja6FXTfsxhlDZlY1M5SJfFBFDT7NNvcs3XRevYVIA+PMpLs9fDjq0wfLV",
        "X-Gm-Gg": "AZuq6aIeB9BHUilmdxRMXwM22ARAs79yXKDVI2lo1K+C1uyWS8dvzz+zexkZztObPmh\n qzQiWygZ58mm/2PgEfoobU6IayKmobbh0OwRCvrjqVTCKwn6/1aGmWLzqgmkHDuD8tTSVpovTHN\n j10bWurbj8bCA7pvmYSgG6c04uE5luzsZYygF2e2zenorKruKP9yFZ67JH6JI203bF6BjNcZEJs\n u/CxdOk3G4l/zV5yXopdVCgo43+6JkhJaSVJ49LU9r841Tkeyjm54cTS0iBvn3MO3Od6WRXbxPM\n JWAVo07twLW7KI24L+clwU4jWKxSAdKgxdCCz8Q6bjSravuG0c2OZt8qyaww2uBlZb5ob8UvVqr\n Rv6sqhgIq6QZFK6Gl0ka9gdkJtIYU38vp0Rue6XVfpVoHoz+KOSWjdspOViU4ZAHDyvIWdJ1KJ2\n IxpPXih0+tnPl0/5B8sS7P/fNWtyKz9SrOnBKhYPhG",
        "X-Received": [
            "by 2002:a17:90b:54c6:b0:340:29a3:800f with SMTP id\n 98e67ed59e1d1-356ab18a7dcmr1208554a91.15.1770981054593;\n Fri, 13 Feb 2026 03:10:54 -0800 (PST)",
            "by 2002:a17:90b:54c6:b0:340:29a3:800f with SMTP id\n 98e67ed59e1d1-356ab18a7dcmr1208529a91.15.1770981054039;\n Fri, 13 Feb 2026 03:10:54 -0800 (PST)"
        ],
        "From": "Aswin Murugan <aswin.murugan@oss.qualcomm.com>",
        "To": "casey.connolly@linaro.org, u-boot@lists.denx.de, u-boot-qcom@groups.io",
        "Cc": "trini@konsulko.com, sumit.garg@kernel.org, jh80.chung@samsung.com,\n peng.fan@nxp.com, neil.armstrong@linaro.org, tien.fong.chee@altera.com,\n miquel.raynal@bootlin.com, msp@baylibre.com,\n alif.zakuan.yuslaimi@altera.com, balaji.selvanathan@oss.qualcomm.com,\n w.egorov@phytec.de, varadarajan.narayanan@oss.qualcomm.com,\n rui.silva@linaro.org, ilias.apalodimas@linaro.org, me@samcday.com,\n marek.vasut+renesas@mailbox.org,\n Aswin Murugan <aswin.murugan@oss.qualcomm.com>",
        "Subject": "[PATCH v8 1/4] power-domain: Add QCOM RPMH Power Domain Driver\n Support",
        "Date": "Fri, 13 Feb 2026 16:40:06 +0530",
        "Message-Id": "<20260213111009.1254360-2-aswin.murugan@oss.qualcomm.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20260213111009.1254360-1-aswin.murugan@oss.qualcomm.com>",
        "References": "<20260213111009.1254360-1-aswin.murugan@oss.qualcomm.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Proofpoint-GUID": "ASqM9lUBTn-qLkvCVCYtpN4F-En-ap9x",
        "X-Authority-Analysis": "v=2.4 cv=eaowvrEH c=1 sm=1 tr=0 ts=698f06bf cx=c_pps\n a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17\n a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=VwQbUJbxAAAA:8\n a=EUspDBNiAAAA:8 a=KKAkSRfTAAAA:8 a=mxzJDyrKheeO0MTuWfoA:9\n a=uKXjsCUrEbL0IQVhDsJ9:22 a=cvBusfyB2V15izCimMoJ:22",
        "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwMjEzMDA4NiBTYWx0ZWRfX6o2jtV4gVUM/\n jj09dT1T9wybUGjXdqAnMKldbWNFJlSr9iCnRv/FWrNPZavuaeC+cDlyMIABptmUJSfg5+qg4/T\n +cNcNKGE9zwYp2pcL6NOVM64zUw6CFTQEFqKT0fc/vDS2+SBxXk88buRnasEL15NgwV3cGaWp4k\n uckC1Sy/x4uO2IcUHquGjbO2B7Zc7m4jcAigvXS538NekTiXSsxLqAQxeSTx6esn5qnlfWQugWK\n FQg9kI9e/DcXBVAdUJ7fGeJQdZtZyVOx5KzVNUSge16tl1INPms0r47PpCUDf9Ad+wFJUeqrHNF\n ukn0t2Ha/cMMwNwO4iV3NWgb/lTAJqMcMsegTbzNevYtZ7iDhl/MoUblJkQ3xj4gxdMDERQNp+/\n yn2Hp4sOzZlJAnNfEo6YuQHlOmNMfnGZHwYKpYx6reaGvaJxL0w8AMwN1nHUK614D9a8zSaPrMn\n 7jkwZpCcCWqP2v45uPw==",
        "X-Proofpoint-ORIG-GUID": "ASqM9lUBTn-qLkvCVCYtpN4F-En-ap9x",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-02-13_01,2026-02-12_03,2025-10-01_01",
        "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n spamscore=0 bulkscore=0 priorityscore=1501 malwarescore=0 adultscore=0\n lowpriorityscore=0 clxscore=1015 phishscore=0 impostorscore=0 suspectscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602130086",
        "X-BeenThere": "u-boot@lists.denx.de",
        "X-Mailman-Version": "2.1.39",
        "Precedence": "list",
        "List-Id": "U-Boot discussion <u-boot.lists.denx.de>",
        "List-Unsubscribe": "<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>",
        "List-Archive": "<https://lists.denx.de/pipermail/u-boot/>",
        "List-Post": "<mailto:u-boot@lists.denx.de>",
        "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>",
        "List-Subscribe": "<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>",
        "Errors-To": "u-boot-bounces@lists.denx.de",
        "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>",
        "X-Virus-Scanned": "clamav-milter 0.103.8 at phobos.denx.de",
        "X-Virus-Status": "Clean"
    },
    "content": "From: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>\n\nAdded support for Qualcomm RPMH power domain driver, responsible\nfor managing power domains on Qualcomm SoCs. This is a port of\nthe Linux RPMHPD driver [1] and sa8775p related changes. The\npower domain driver currently has support to power on and off\nMMCX power domain of sa8775p; support for other soc entries power\ndomains are stubbed, in future, the required soc support can be\nadded.\n\n[1]:\nhttps://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/pmdomain/qcom/rpmhpd.c?id=3d25d46a255a83f94d7d4d4216f38aafc8e116b\n\nReviewed-by: Neil Armstrong <neil.armstrong@linaro.org>\nSigned-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>\nSigned-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com>\n---\nv8:\n- Renamed Kconfig option from QCOM_POWER_DOMAIN to QCOM_RPMH_POWER_DOMAIN\n  for better specificity as requested in review feedback\n\nv7:\n- No changes to this patch in v7\n\nv6:\n- Initialized ret with 0 in rpmhpd_probe()\n\nv5:\n- Changed the first argument passed to rpmh_write as pd->dev\n- Added (ulong) casting in rpmhpd_match_table to address the warning.\n\nv4:\n- Added all SoC entries from the Linux driver and stubbed it\n- Removed \"qcom_rpmhpd\" driver\n- Removed unused members in struct rpmhpd\n\nv3:\n- No changes to this patch in v3\n\nv2:\n- Added ARCH_SNAPDRAGON dependency to QCOM_POWER_DOMAIN Kconfig\n- In qcom-rpmhpd driver, the un-supported power domains are handled with warning\n  in rpmhpd_power_on() & rpmhpd_power_off()\n---\n drivers/power/domain/Kconfig       |   8 +\n drivers/power/domain/Makefile      |   1 +\n drivers/power/domain/qcom-rpmhpd.c | 278 +++++++++++++++++++++++++++++\n 3 files changed, 287 insertions(+)\n create mode 100644 drivers/power/domain/qcom-rpmhpd.c",
    "diff": "diff --git a/drivers/power/domain/Kconfig b/drivers/power/domain/Kconfig\nindex 935f282d6c5..9fc2f5f020d 100644\n--- a/drivers/power/domain/Kconfig\n+++ b/drivers/power/domain/Kconfig\n@@ -90,6 +90,14 @@ config MESON_SECURE_POWER_DOMAIN\n \t  Enable support for manipulating Amlogic Meson Secure power domains.\n \t  Support for Amlogic A1 series.\n \n+config QCOM_RPMH_POWER_DOMAIN\n+\tbool \"Enable the QCOM RPMH Power domain driver\"\n+\tdepends on POWER_DOMAIN && ARCH_SNAPDRAGON\n+\thelp\n+\t  Generic RPMH power domain implementation for QCOM devices.\n+\t  The RPMH power domain driver is responsible for managing power\n+\t  domains on Qualcomm SoCs.\n+\n config SANDBOX_POWER_DOMAIN\n \tbool \"Enable the sandbox power domain test driver\"\n \tdepends on POWER_DOMAIN && SANDBOX\ndiff --git a/drivers/power/domain/Makefile b/drivers/power/domain/Makefile\nindex b2c0bd8a61a..f373fc01395 100644\n--- a/drivers/power/domain/Makefile\n+++ b/drivers/power/domain/Makefile\n@@ -23,3 +23,4 @@ obj-$(CONFIG_TI_SCI_POWER_DOMAIN) += ti-sci-power-domain.o\n obj-$(CONFIG_TI_POWER_DOMAIN) += ti-power-domain.o\n obj-$(CONFIG_TI_OMAP_PRM_POWER_DOMAIN) += ti-omap-prm.o\n obj-$(CONFIG_ZYNQMP_POWER_DOMAIN) += zynqmp-power-domain.o\n+obj-$(CONFIG_QCOM_RPMH_POWER_DOMAIN) += qcom-rpmhpd.o\ndiff --git a/drivers/power/domain/qcom-rpmhpd.c b/drivers/power/domain/qcom-rpmhpd.c\nnew file mode 100644\nindex 00000000000..f51bc9a4bbb\n--- /dev/null\n+++ b/drivers/power/domain/qcom-rpmhpd.c\n@@ -0,0 +1,278 @@\n+// SPDX-License-Identifier: GPL-2.0\n+// Copyright (c) 2018, The Linux Foundation. All rights reserved.\n+// Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved.\n+\n+#include <dm.h>\n+#include <dm/lists.h>\n+#include <power-domain.h>\n+#include <asm/io.h>\n+#include <linux/errno.h>\n+\n+#include <power-domain-uclass.h>\n+#include <soc/qcom/cmd-db.h>\n+#include <soc/qcom/rpmh.h>\n+#include <dt-bindings/power/qcom-rpmpd.h>\n+#include <dm/device_compat.h>\n+\n+#define RPMH_ARC_MAX_LEVELS\t16\n+\n+/**\n+ * struct rpmhpd - top level RPMh power domain resource data structure\n+ * @dev:                rpmh power domain controller device\n+ * @pd:                 generic_pm_domain corresponding to the power domain\n+ * @parent:             generic_pm_domain corresponding to the parent's power domain\n+ * @enable_corner:      lowest non-zero corner\n+ * @level:              An array of level (vlvl) to corner (hlvl) mappings\n+ *                      derived from cmd-db\n+ * @level_count:        Number of levels supported by the power domain. max\n+ *                      being 16 (0 - 15)\n+ * @enabled:            true if the power domain is enabled\n+ * @res_name:           Resource name used for cmd-db lookup\n+ * @addr:               Resource address as looped up using resource name from\n+ * @skip_retention_level: Indicate that retention level should not be used for the power domain\n+ */\n+struct rpmhpd {\n+\tstruct udevice\t*dev;\n+\tstruct power_domain pd;\n+\tstruct power_domain *parent;\n+\tunsigned int\tenable_corner;\n+\tu32\t\tlevel[RPMH_ARC_MAX_LEVELS];\n+\tsize_t\t\tlevel_count;\n+\tbool\t\tenabled;\n+\tconst char\t*res_name;\n+\tu32\t\taddr;\n+\tbool\t\tskip_retention_level;\n+};\n+\n+struct rpmhpd_desc {\n+\tstruct rpmhpd **rpmhpds;\n+\tsize_t num_pds;\n+};\n+\n+/* RPMH powerdomains */\n+static struct rpmhpd mmcx_ao;\n+static struct rpmhpd mmcx = {\n+\t.res_name = \"mmcx.lvl\",\n+};\n+\n+static struct rpmhpd mmcx_ao = {\n+\t.res_name = \"mmcx.lvl\",\n+};\n+\n+/* SA8775P RPMH power domains */\n+static struct rpmhpd *sa8775p_rpmhpds[] = {\n+\t[SA8775P_MMCX] = &mmcx,\n+\t[SA8775P_MMCX_AO] = &mmcx_ao,\n+};\n+\n+static const struct rpmhpd_desc sa8775p_desc = {\n+\t.rpmhpds = sa8775p_rpmhpds,\n+\t.num_pds = ARRAY_SIZE(sa8775p_rpmhpds),\n+};\n+\n+/* stub RPMH power domains mapped for unsupported platforms */\n+static struct rpmhpd *stub_rpmhpds[] = {};\n+\n+static const struct rpmhpd_desc stub_desc = {\n+\t.rpmhpds = stub_rpmhpds,\n+\t.num_pds = ARRAY_SIZE(stub_rpmhpds),\n+};\n+\n+static const struct udevice_id rpmhpd_match_table[] = {\n+\t{ .compatible = \"qcom,sa8775p-rpmhpd\", .data = (ulong)&sa8775p_desc },\n+\t{ .compatible = \"qcom,qcs615-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,qcs8300-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,qdu1000-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sa8155p-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sa8540p-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sar2130p-rpmhpd\", .data = (ulong)&stub_desc},\n+\t{ .compatible = \"qcom,sc7180-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sc7280-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sc8180x-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sc8280xp-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sdm670-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sdm845-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sdx55-rpmhpd\", .data = (ulong)&stub_desc},\n+\t{ .compatible = \"qcom,sdx65-rpmhpd\", .data = (ulong)&stub_desc},\n+\t{ .compatible = \"qcom,sdx75-rpmhpd\", .data = (ulong)&stub_desc},\n+\t{ .compatible = \"qcom,sm4450-rpmhpd\", .data = (ulong)&stub_desc},\n+\t{ .compatible = \"qcom,sm6350-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sm7150-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sm8150-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sm8250-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sm8350-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sm8450-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sm8550-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sm8650-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,sm8750-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ .compatible = \"qcom,x1e80100-rpmhpd\", .data = (ulong)&stub_desc },\n+\t{ }\n+};\n+\n+static int rpmhpd_send_corner(struct rpmhpd *pd, int state,\n+\t\t\t      unsigned int corner, bool sync)\n+{\n+\tstruct tcs_cmd cmd = {\n+\t\t.addr = pd->addr,\n+\t\t.data = corner,\n+\t};\n+\n+\treturn rpmh_write(pd->dev, state, &cmd, 1);\n+}\n+\n+static int rpmhpd_power_on(struct power_domain *pd)\n+{\n+\tint ret;\n+\tunsigned int corner;\n+\tstruct rpmhpd **rpmhpds;\n+\tconst struct rpmhpd_desc *desc;\n+\tstruct rpmhpd *curr_rpmhpd;\n+\n+\tdesc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);\n+\tif (!desc)\n+\t\treturn -EINVAL;\n+\n+\trpmhpds = desc->rpmhpds;\n+\tcurr_rpmhpd = rpmhpds[pd->id];\n+\n+\t/* Do nothing for undefined power domains */\n+\tif (!curr_rpmhpd) {\n+\t\tlog_warning(\"Power domain id (%ld) not supported\\n\",\n+\t\t\t    pd->id);\n+\t\treturn 0;\n+\t}\n+\n+\tcorner = curr_rpmhpd->enable_corner;\n+\n+\tret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,\n+\t\t\t\t false);\n+\tif (!ret)\n+\t\tcurr_rpmhpd->enabled = true;\n+\n+\treturn ret;\n+}\n+\n+static int rpmhpd_power_off(struct power_domain *pd)\n+{\n+\tint ret;\n+\tunsigned int corner;\n+\tstruct rpmhpd **rpmhpds;\n+\tconst struct rpmhpd_desc *desc;\n+\tstruct rpmhpd *curr_rpmhpd;\n+\n+\tdesc = (const struct rpmhpd_desc *)dev_get_driver_data(pd->dev);\n+\tif (!desc)\n+\t\treturn -EINVAL;\n+\n+\trpmhpds = desc->rpmhpds;\n+\tcurr_rpmhpd = rpmhpds[pd->id];\n+\n+\t/* Do nothing for undefined power domains */\n+\tif (!curr_rpmhpd) {\n+\t\tlog_warning(\"Power domain id (%ld) not supported\\n\",\n+\t\t\t    pd->id);\n+\t\treturn 0;\n+\t}\n+\n+\tcorner = 0;\n+\n+\tret = rpmhpd_send_corner(curr_rpmhpd, RPMH_ACTIVE_ONLY_STATE, corner,\n+\t\t\t\t false);\n+\tif (!ret)\n+\t\tcurr_rpmhpd->enabled = false;\n+\n+\treturn ret;\n+}\n+\n+static int rpmhpd_update_level_mapping(struct rpmhpd *rpmhpd)\n+{\n+\tint i;\n+\tconst u16 *buf;\n+\n+\tbuf = cmd_db_read_aux_data(rpmhpd->res_name, &rpmhpd->level_count);\n+\tif (IS_ERR(buf))\n+\t\treturn PTR_ERR(buf);\n+\n+\t/* 2 bytes used for each command DB aux data entry */\n+\trpmhpd->level_count >>= 1;\n+\n+\tif (rpmhpd->level_count > RPMH_ARC_MAX_LEVELS)\n+\t\treturn -EINVAL;\n+\n+\tfor (i = 0; i < rpmhpd->level_count; i++) {\n+\t\tif (rpmhpd->skip_retention_level && buf[i] == RPMH_REGULATOR_LEVEL_RETENTION)\n+\t\t\tcontinue;\n+\n+\t\trpmhpd->level[i] = buf[i];\n+\n+\t\t/* Remember the first corner with non-zero level */\n+\t\tif (!rpmhpd->level[rpmhpd->enable_corner] && rpmhpd->level[i])\n+\t\t\trpmhpd->enable_corner = i;\n+\n+\t\t/*\n+\t\t * The AUX data may be zero padded. These 0 valued entries at\n+\t\t * the end of the map must be ignored.\n+\t\t */\n+\t\tif (i > 0 && rpmhpd->level[i] == 0) {\n+\t\t\trpmhpd->level_count = i;\n+\t\t\tbreak;\n+\t\t}\n+\t\tdebug(\"%s: ARC hlvl=%2d --> vlvl=%4u\\n\", rpmhpd->res_name, i,\n+\t\t      rpmhpd->level[i]);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int rpmhpd_probe(struct udevice *dev)\n+{\n+\tint i, ret = 0;\n+\tstruct rpmhpd **rpmhpds;\n+\tstruct rpmhpd *priv;\n+\tconst struct rpmhpd_desc *desc;\n+\n+\tdesc = (const struct rpmhpd_desc *)dev_get_driver_data(dev);\n+\tif (!desc)\n+\t\treturn -EINVAL;\n+\n+\trpmhpds = desc->rpmhpds;\n+\n+\tfor (i = 0; i < desc->num_pds; i++) {\n+\t\tif (!rpmhpds[i])\n+\t\t\tcontinue;\n+\n+\t\tpriv = rpmhpds[i];\n+\t\tpriv->dev = dev;\n+\t\tpriv->addr = cmd_db_read_addr(priv->res_name);\n+\t\tif (!priv->addr) {\n+\t\t\tdev_err(dev, \"Could not find RPMh address for resource %s\\n\",\n+\t\t\t\tpriv->res_name);\n+\t\t\treturn -ENODEV;\n+\t\t}\n+\n+\t\tret = cmd_db_read_slave_id(priv->res_name);\n+\t\tif (ret != CMD_DB_HW_ARC) {\n+\t\t\tdev_err(dev, \"RPMh slave ID mismatch\\n\");\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\n+\t\tret = rpmhpd_update_level_mapping(priv);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+static const struct power_domain_ops qcom_rpmhpd_power_ops = {\n+\t.on = rpmhpd_power_on,\n+\t.off = rpmhpd_power_off,\n+};\n+\n+U_BOOT_DRIVER(qcom_rpmhpd_drv) = {\n+\t.name = \"qcom_rpmhpd_drv\",\n+\t.id = UCLASS_POWER_DOMAIN,\n+\t.of_match = rpmhpd_match_table,\n+\t.probe = rpmhpd_probe,\n+\t.ops = &qcom_rpmhpd_power_ops,\n+};\n",
    "prefixes": [
        "v8",
        "1/4"
    ]
}