{"id":2222665,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2222665/?format=json","web_url":"http://patchwork.ozlabs.org/project/uboot/patch/20260413-casey-qcom-geni-rpmh-fixes-v1-1-2a83a67ac0f1@linaro.org/","project":{"id":18,"url":"http://patchwork.ozlabs.org/api/1.1/projects/18/?format=json","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},"msgid":"<20260413-casey-qcom-geni-rpmh-fixes-v1-1-2a83a67ac0f1@linaro.org>","date":"2026-04-13T11:06:14","name":"[1/3] soc/qcom: rpmh: properly fix synchronous requests","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"ef65cec17ad107e410cf504b0148ad0b681b7682","submitter":{"id":90679,"url":"http://patchwork.ozlabs.org/api/1.1/people/90679/?format=json","name":"Casey Connolly","email":"casey.connolly@linaro.org"},"delegate":{"id":151538,"url":"http://patchwork.ozlabs.org/api/1.1/users/151538/?format=json","username":"kcxt","first_name":"Casey","last_name":"Connolly","email":"casey.connolly@linaro.org"},"mbox":"http://patchwork.ozlabs.org/project/uboot/patch/20260413-casey-qcom-geni-rpmh-fixes-v1-1-2a83a67ac0f1@linaro.org/mbox/","series":[{"id":499682,"url":"http://patchwork.ozlabs.org/api/1.1/series/499682/?format=json","web_url":"http://patchwork.ozlabs.org/project/uboot/list/?series=499682","date":"2026-04-13T11:06:13","name":"Qualcomm: rpmh and regulator fixes","version":1,"mbox":"http://patchwork.ozlabs.org/series/499682/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2222665/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2222665/checks/","tags":{},"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=linaro.org header.i=@linaro.org header.a=rsa-sha256\n header.s=google header.b=jueXWVoD;\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=pass (p=none dis=none) header.from=linaro.org","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=linaro.org header.i=@linaro.org header.b=\"jueXWVoD\";\n\tdkim-atps=neutral","phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=linaro.org","phobos.denx.de;\n spf=pass smtp.mailfrom=casey.connolly@linaro.org"],"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 4fvPjg4XjBz1yDF\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 13 Apr 2026 21:06:31 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 08718839D5;\n\tMon, 13 Apr 2026 13:06:23 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id AF937839D5; Mon, 13 Apr 2026 13:06:20 +0200 (CEST)","from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com\n [IPv6:2a00:1450:4864:20::32a])\n (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 45916839DF\n for <u-boot@lists.denx.de>; Mon, 13 Apr 2026 13:06:18 +0200 (CEST)","by mail-wm1-x32a.google.com with SMTP id\n 5b1f17b1804b1-488a8ca4aadso50209635e9.3\n for <u-boot@lists.denx.de>; Mon, 13 Apr 2026 04:06:18 -0700 (PDT)","from lion.localdomain (p4fc3dd86.dip0.t-ipconnect.de.\n [79.195.221.134]) by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-488d5347ea5sm327284945e9.8.2026.04.13.04.06.16\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Mon, 13 Apr 2026 04:06:16 -0700 (PDT)"],"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 SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linaro.org; s=google; t=1776078377; x=1776683177; darn=lists.denx.de;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:from:to:cc:subject:date:message-id\n :reply-to; bh=b1Vjln4zIBJ1aJFY21FO3G9o/WkJusZ13m5ZSDh99pI=;\n b=jueXWVoDcQ/M7N+qxbRHo3erDLOwugP2gRCScfYpRv7UNjHOo+qBIyV4FQlVIIUfxy\n AwrCk8rBvHBumpjmiH/z5JjsE1KSuZTMZjzqNEV1NemQS+7RnOAAueJu4rjZesH8omDO\n lZILinRkqW0zHdO/qqS59EWWiR2TM5RSj6RGc5OT3Go2AMtfSzVjHxe9pugcSFom+A9e\n g4D8AulKIpkjHfYR8tpTCHE42ApZqgb3smFRqWWVNen4cQgnIWY2Y0ftOkw7VmWNtnGY\n XnV7ayFeV4sGkkcpqR9C3WebNCnRwTsbvBjPzn225YsVqSc4KTGnPONX8akyGgdSoRSV\n kYTw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776078377; x=1776683177;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=b1Vjln4zIBJ1aJFY21FO3G9o/WkJusZ13m5ZSDh99pI=;\n b=YXpaoTfpb0mbSpeGvCiW12Gi0keR9xjJFa+a62pGwZbCRnvUUFjK4C2+bvaurJ/YMO\n jOc3oD0aegXJJpdaYkGxKXhetlhUopUGHaEupozD6Zp0RllkzOMR1Myi23AxyFaZevEi\n FrSjFoubNKV1Hk0LyXC0/vVJqPM6BMdNXqkNEPMi4vLxRZsAW8/tMqqVB+knCZVd2JLW\n VXVCR0Wg861TwOC/ybL9yb6e85tmNt22hhCAJkjv3e+TEHXGBB+viyd8Fbefm1O/hos2\n r5vGfcWM4cWuYMrnPZKseQvVL2nEbVRmyZgSPpY/AQk3anSQFzRIJjAEJeVKSJJTgWVK\n a7mw==","X-Forwarded-Encrypted":"i=1;\n AFNElJ91pzquE3P280ivPJmoAQ26D62HKmbKgFMUb4yzQxry/EQMKHKC2JjiG+NgZlbJmgnez6dCHjU=@lists.denx.de","X-Gm-Message-State":"AOJu0YwkdMl0uVRGS8LzLy3Hne+o0SW3Vvk7vxbCQ+innyAvc7cYqU5U\n XGBnEGK+uQaAcc22Pa0ciVngQ85LldmUqTO/dADZGmmfzPBqp8LhDMp/u2oBY6g2Xbs1+x9J09L\n g9XJdtQA=","X-Gm-Gg":"AeBDievH+OtyFipwOkhctWO8MCTw/hRWqF88N3cYrKsd9K6jEvMcVRpig54fe3jl3v0\n GvGuFget04GLrfFCVEf/SMmpO6Mqok6ykwEgPaiCZIFEvGttvEq7u5UwKr4fdqIkPV1+94TL/i8\n K79DapUyzknScTQ3Jw0YCxhykN6vcZdrFnWMf19hm/40m3Rj9YIyUvelqUq7tKo9LjBrULaU08x\n GsgPMxp4lUKr+filpLYMZKDrEIBmzZouVTI9rgmG1QF7rgREHbCjP7oMuhQ8VJ8VHT7fbfy8bTX\n cd3twb8WatnMeUhhFxE5VigfbdMgZP9+ndM2Qwp1TNPh/HfkvxBX6mP7/JzRVafdnk8Tt4Btzxv\n 8tdauxYLDIyreCUpGYK2YaI+49XDEejoyLlmhnLE9D3NQoVKLXtnNUosCY4HkvZjUTjgd2db8cK\n zXHMl4Xpwkoyq6x+LW7qwpeTiDcZCWT2k+ARW7bR9u1G87g6b6qXvg7xZaBZ4SWoeI820b","X-Received":"by 2002:a05:600c:4215:b0:488:d9ea:3da7 with SMTP id\n 5b1f17b1804b1-488d9ea3e0cmr92949785e9.10.1776078377245;\n Mon, 13 Apr 2026 04:06:17 -0700 (PDT)","From":"Casey Connolly <casey.connolly@linaro.org>","Date":"Mon, 13 Apr 2026 13:06:14 +0200","Subject":"[PATCH 1/3] soc/qcom: rpmh: properly fix synchronous requests","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20260413-casey-qcom-geni-rpmh-fixes-v1-1-2a83a67ac0f1@linaro.org>","References":"<20260413-casey-qcom-geni-rpmh-fixes-v1-0-2a83a67ac0f1@linaro.org>","In-Reply-To":"\n <20260413-casey-qcom-geni-rpmh-fixes-v1-0-2a83a67ac0f1@linaro.org>","To":"Sumit Garg <sumit.garg@kernel.org>, u-boot-qcom@groups.io,\n u-boot@lists.denx.de","Cc":"Casey Connolly <casey.connolly@linaro.org>,\n Neil Armstrong <neil.armstrong@linaro.org>, Tom Rini <trini@konsulko.com>,\n Jaehoon Chung <jh80.chung@samsung.com>, Peng Fan <peng.fan@nxp.com>,\n Aswin Murugan <aswin.murugan@oss.qualcomm.com>","X-Mailer":"b4 0.15-dev-47773","X-Developer-Signature":"v=1; a=openpgp-sha256; l=7252;\n i=casey.connolly@linaro.org; h=from:subject:message-id;\n bh=1kD/9o8ilNvnjXAiRilyTKcZatQVc2MxVZsGbSJ6HfQ=;\n b=owGbwMvMwCFYaeA6f6eBkTjjabUkhsw759RE32b4VJZcM6x5LiBxcNGEc6L+QiHXvvmahIqt/\n eBUN+drRykLgyAHg6yYIov4iWWWTWsv22tsX3ABZg4rE8gQBi5OAZjIj9+MDPO/eesdXl5xaquI\n 9uZVLsUvLh4umJ3HbFQ8cY1N3JZHSzgZ/qmfm9do0HllzpaQ1XP0IlX/Trf48GL9ilVB6kr1/1c\n usa0CAA==","X-Developer-Key":"i=casey.connolly@linaro.org; a=openpgp;\n fpr=83B24DA7FE145076BC38BB250CD904EB673A7C47","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":"We only ever use a single TCS group and it's always AMC. Disabling AMC\nimmediately after triggering the TCS group might be contributing to some\nof the issues we hit, so let's just defer cleaning things up until just\nbefore we boot the OS. The CMD_ENABLE register is cleared for every rpmh\ntransation to only select the appropriate commands, and it seems like we\ndon't need to unset the trigger bit for an AMC either.\n\nSigned-off-by: Casey Connolly <casey.connolly@linaro.org>\n---\n drivers/soc/qcom/rpmh-rsc.c | 70 ++++++++++++++++++++++++++++++++++-----------\n 1 file changed, 53 insertions(+), 17 deletions(-)","diff":"diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c\nindex 0b821cc6f9d8..5bf54429e793 100644\n--- a/drivers/soc/qcom/rpmh-rsc.c\n+++ b/drivers/soc/qcom/rpmh-rsc.c\n@@ -293,9 +293,9 @@ static void __tcs_buffer_write(struct rsc_drv *drv, int tcs_id, int cmd_id,\n \n \tif (msg->wait_for_compl)\n \t\tcmd_msgid |= CMD_MSGID_RESP_REQ;\n \n-\tcmd_complete = read_tcs_reg(drv, drv->regs[RSC_DRV_CMD_WAIT_FOR_CMPL], tcs_id);\n+\tcmd_complete = 0; //read_tcs_reg(drv, drv->regs[RSC_DRV_CMD_WAIT_FOR_CMPL], tcs_id);\n \n \tfor (i = 0, j = cmd_id; i < msg->num_cmds; i++, j++) {\n \t\tcmd = &msg->cmds[i];\n \t\tcmd_enable |= BIT(j);\n@@ -306,17 +306,20 @@ static void __tcs_buffer_write(struct rsc_drv *drv, int tcs_id, int cmd_id,\n \t\twrite_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_MSGID], tcs_id, j, msgid);\n \t\twrite_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_ADDR], tcs_id, j, cmd->addr);\n \t\tif (!msg->is_read)\n \t\t\twrite_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_DATA], tcs_id, j, cmd->data);\n-\t\tdebug(\"tcs(%d): [%s] cmd_id: %d: msgid: %#x addr: %#x data: %#x complete: %#x\\n\",\n+\t\tdebug(\"tcs(%d): [%s] cmd_id: %d: msgid: %#x addr: %#x data: %#x read: %d\\n\",\n \t\t      tcs_id, msg->state == RPMH_ACTIVE_ONLY_STATE ? \"active\" : \"?\", j, msgid,\n-\t\t      cmd->addr, cmd->data, cmd_complete);\n+\t\t      cmd->addr, cmd->data, msg->is_read);\n \t}\n \n-\tcmd_enable |= read_tcs_reg(drv, drv->regs[RSC_DRV_CMD_ENABLE], tcs_id);\n \twrite_tcs_reg(drv, drv->regs[RSC_DRV_CMD_ENABLE], tcs_id, cmd_enable);\n \t/* U-Boot: Tell the DRV to wait for completion (?) so we can poll on DRV_STATUS */\n \t/* This register applies to the entire TCS group not per command */\n+\t/*\n+\t * FIXME: this seems to rather be a way to impose ordering on commands when multiple are\n+\t * sent in a single TCS request, needs more testing.\n+\t */\n \twrite_tcs_reg(drv, drv->regs[RSC_DRV_CMD_WAIT_FOR_CMPL], tcs_id, cmd_complete);\n }\n \n /**\n@@ -343,15 +346,14 @@ static void __tcs_set_trigger(struct rsc_drv *drv, int tcs_id, bool trigger)\n \n \t/*\n \t * HW req: Clear the DRV_CONTROL and enable TCS again\n \t * While clearing ensure that the AMC mode trigger is cleared\n-\t * and then the mode enable is cleared.\n+\t * U-Boot: keep AMC_MODE_ENABLE flag since clearing it might be\n+\t * interrupting in-flight commands.\n \t */\n \tenable = read_tcs_reg(drv, reg, tcs_id);\n \tenable &= ~TCS_AMC_MODE_TRIGGER;\n \twrite_tcs_reg_sync(drv, reg, tcs_id, enable);\n-\tenable &= ~TCS_AMC_MODE_ENABLE;\n-\twrite_tcs_reg_sync(drv, reg, tcs_id, enable);\n \n \tif (trigger) {\n \t\t/* Enable the AMC mode on the TCS and then trigger the TCS */\n \t\tenable = TCS_AMC_MODE_ENABLE;\n@@ -387,12 +389,13 @@ int rpmh_rsc_send_data(struct rsc_drv *drv, const struct tcs_request *msg)\n {\n \tstruct tcs_group *tcs;\n \tint tcs_id, i = 0;\n \tu32 val;\n+\tu32 addr;\n \n \ttcs = get_tcs_for_msg(drv, msg);\n-\tif (IS_ERR_OR_NULL(tcs))\n-\t\treturn 0;\n+\tif (IS_ERR(tcs))\n+\t\treturn PTR_ERR(tcs);\n \n \t/* U-Boot is single-threaded, always use the first TCS as we'll never conflict */\n \ttcs_id = tcs->offset;\n \tif (!read_tcs_reg(drv, drv->regs[RSC_DRV_STATUS], tcs_id)) {\n@@ -400,9 +403,8 @@ int rpmh_rsc_send_data(struct rsc_drv *drv, const struct tcs_request *msg)\n \t\treturn -EBUSY;\n \t}\n \n \ttcs->req[tcs_id - tcs->offset] = msg;\n-\tgeneric_set_bit(tcs_id, drv->tcs_in_use);\n \n \t/*\n \t * These two can be done after the lock is released because:\n \t * - We marked \"tcs_in_use\" under lock.\n@@ -413,28 +415,35 @@ int rpmh_rsc_send_data(struct rsc_drv *drv, const struct tcs_request *msg)\n \t */\n \t__tcs_buffer_write(drv, tcs_id, 0, msg);\n \t__tcs_set_trigger(drv, tcs_id, true);\n \n-\t/* U-Boot: Now wait for the TCS to be cleared, indicating that we're done. */\n+\t/*\n+\t * U-Boot: Now wait for the status done flag and for the TCS to be cleared.\n+\t * Just waiting for one of these isn't always enough. On reads we have to wait for\n+\t * the status register to indicate that the response data is ready.\n+\t */\n+\tfor (i = 0; i < USEC_PER_SEC; i++) {\n+\t\taddr = readl_relaxed(drv->tcs_base + drv->regs[RSC_DRV_IRQ_STATUS]);\n+\t\tif (addr & BIT(tcs_id))\n+\t\t\tbreak;\n+\t\tudelay(1);\n+\t}\n+\n \tfor (i = 0; i < USEC_PER_SEC; i++) {\n \t\tval = read_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_STATUS], tcs_id, 0);\n \t\tif (val & CMD_STATUS_COMPL)\n \t\t\tbreak;\n \t\tudelay(1);\n \t}\n \n-\t/* U-Boot: read the response now we know it's available */\n+\t/* U-Boot: read the response when it becomes available */\n \tif (msg->is_read) {\n \t\tmsg->cmds[0].data = read_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_RESP_DATA], tcs_id, 0);\n \t\tlog_debug(\"data response: %#x\\n\", msg->cmds[0].data);\n \t}\n \n \t__tcs_set_trigger(drv, tcs_id, false);\n-\n-\t/* Reclaim the TCS */\n-\twrite_tcs_reg(drv, drv->regs[RSC_DRV_CMD_ENABLE], tcs_id, 0);\n \twritel_relaxed(BIT(tcs_id), drv->tcs_base + drv->regs[RSC_DRV_IRQ_CLEAR]);\n-\tgeneric_clear_bit(tcs_id, drv->tcs_in_use);\n \n \tif (i == USEC_PER_SEC) {\n \t\tlog_err(\"%s: error writing %#x to %d:%#x\\n\", drv->name,\n \t\t\tmsg->cmds[0].addr, tcs_id, drv->regs[RSC_DRV_CMD_ADDR]);\n@@ -563,8 +572,34 @@ static int rpmh_rsc_probe(struct udevice *dev)\n \n \treturn ret;\n }\n \n+static int rpmh_rsc_remove(struct udevice *dev)\n+{\n+\tstruct rsc_drv *drv = dev_get_priv(dev);\n+\tstruct tcs_group *tcs = &drv->tcs[ACTIVE_TCS];\n+\tu32 tcs_id = tcs->offset;\n+\n+\tfor (int i = 0; i < 10 && !read_tcs_reg(drv, drv->regs[RSC_DRV_STATUS], tcs_id); i++) {\n+\t\tif (i == 0)\n+\t\t\tprintf(\"Waiting for TCS %d to be free...\\n\", tcs_id);\n+\t\tudelay(100);\n+\t}\n+\n+\t/* Clean up for the OS! */\n+\twrite_tcs_reg(drv, drv->regs[RSC_DRV_CMD_WAIT_FOR_CMPL], tcs_id, 0);\n+\n+\t/* Clear the AMC enable bit for all TCS commands we used */\n+\twrite_tcs_reg_sync(drv, drv->regs[RSC_DRV_CONTROL], tcs_id, 0);\n+\t/* Disable all commands for the single AMC we used */\n+\twrite_tcs_reg_sync(drv, drv->regs[RSC_DRV_CMD_ENABLE], tcs_id, 0);\n+\n+\t/* Make sure IRQs are all clear too */\n+\twritel_relaxed(tcs->mask, drv->tcs_base + drv->regs[RSC_DRV_IRQ_CLEAR]);\n+\n+\treturn 0;\n+}\n+\n static const struct udevice_id qcom_rpmh_ids[] = {\n \t{ .compatible = \"qcom,rpmh-rsc\" },\n \t{ }\n };\n@@ -573,11 +608,12 @@ U_BOOT_DRIVER(qcom_rpmh_rsc) = {\n \t.name\t\t= \"qcom_rpmh_rsc\",\n \t.id\t\t= UCLASS_MISC,\n \t.priv_auto\t= sizeof(struct rsc_drv),\n \t.probe\t\t= rpmh_rsc_probe,\n+\t.remove\t\t= rpmh_rsc_remove,\n \t.of_match\t= qcom_rpmh_ids,\n \t/* rpmh is under CLUSTER_PD which we don't support, so skip trying to enable PDs */\n-\t.flags\t\t= DM_FLAG_DEFAULT_PD_CTRL_OFF,\n+\t.flags\t\t= DM_FLAG_DEFAULT_PD_CTRL_OFF | DM_FLAG_OS_PREPARE,\n };\n \n MODULE_DESCRIPTION(\"Qualcomm Technologies, Inc. RPMh Driver\");\n MODULE_LICENSE(\"GPL v2\");\n","prefixes":["1/3"]}