get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2226908,
    "url": "http://patchwork.ozlabs.org/api/patches/2226908/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/patch/20260422212849.1240591-4-shenwei.wang@nxp.com/",
    "project": {
        "id": 42,
        "url": "http://patchwork.ozlabs.org/api/projects/42/?format=api",
        "name": "Linux GPIO development",
        "link_name": "linux-gpio",
        "list_id": "linux-gpio.vger.kernel.org",
        "list_email": "linux-gpio@vger.kernel.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260422212849.1240591-4-shenwei.wang@nxp.com>",
    "list_archive_url": null,
    "date": "2026-04-22T21:28:48",
    "name": "[v13,3/4] gpio: rpmsg: add generic rpmsg GPIO driver",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "453eae503eea92cab5d9b888ed1a11cae877ffee",
    "submitter": {
        "id": 74153,
        "url": "http://patchwork.ozlabs.org/api/people/74153/?format=api",
        "name": "Shenwei Wang",
        "email": "shenwei.wang@nxp.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-gpio/patch/20260422212849.1240591-4-shenwei.wang@nxp.com/mbox/",
    "series": [
        {
            "id": 501113,
            "url": "http://patchwork.ozlabs.org/api/series/501113/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/list/?series=501113",
            "date": "2026-04-22T21:28:45",
            "name": "Enable Remote GPIO over RPMSG on i.MX Platform",
            "version": 13,
            "mbox": "http://patchwork.ozlabs.org/series/501113/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2226908/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2226908/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <linux-gpio+bounces-35378-incoming=patchwork.ozlabs.org@vger.kernel.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "linux-gpio@vger.kernel.org"
        ],
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256\n header.s=selector1 header.b=nzFGzh17;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-gpio+bounces-35378-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com\n header.b=\"nzFGzh17\"",
            "smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=40.107.130.55",
            "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=nxp.com",
            "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=nxp.com",
            "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=nxp.com;"
        ],
        "Received": [
            "from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\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 4g1CF41pk2z1yGs\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 07:35:20 +1000 (AEST)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 25D1A3111C7F\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 21:30:35 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id D2048376BFB;\n\tWed, 22 Apr 2026 21:30:34 +0000 (UTC)",
            "from MRWPR03CU001.outbound.protection.outlook.com\n (mail-francesouthazon11011055.outbound.protection.outlook.com\n [40.107.130.55])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D05C3563E9;\n\tWed, 22 Apr 2026 21:30:32 +0000 (UTC)",
            "from AS8PR04MB9176.eurprd04.prod.outlook.com (2603:10a6:20b:44b::7)\n by DU2PR04MB8870.eurprd04.prod.outlook.com (2603:10a6:10:2e1::17) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.21; Wed, 22 Apr\n 2026 21:30:29 +0000",
            "from AS8PR04MB9176.eurprd04.prod.outlook.com\n ([fe80::ba87:1cd1:53d9:fcd7]) by AS8PR04MB9176.eurprd04.prod.outlook.com\n ([fe80::ba87:1cd1:53d9:fcd7%6]) with mapi id 15.20.9846.019; Wed, 22 Apr 2026\n 21:30:29 +0000"
        ],
        "ARC-Seal": [
            "i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776893434; cv=fail;\n b=nP1rlU4hnvv3i7sQuJs0pNuIBL8ENBmKAF8+kZjKtJQUxIwt0vFl8xM/Eq0LsOd1yxlDMDC/utauIomruk7hg56XY5vsMESMO97722+1VFX4BhQAD1JVHLYabM2xD2XHtFPwcYH8qS/JZW5U+lrgq7nG9qJW/MGS76urMFumORw=",
            "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=SBV++Lvz4AlkNz0b5IwSu/AuFQa7frUk1uNMRAyUIFPvZgfiS//vVX+ZcxKUuY3O7GPZOWpD/kzo9mZcfK0Bqka2t2cS/b1DzKadCN6wULVVBYmMwEl4ZHq9OhHrZaLmsS4r2fo5Oo0SaV+Wy1DfoIOegF4eyYyXpJrDZP2gLkI09et/gMPrk09tbQzw9dtLhqRFiD9JkaHCIdKa3MYomjbMtutKjt2hvvYGN6FWpivg/x/BWWlfqIv+xTxI5gIiNscimYIBGFBYX4mEdpAMnhx9pzw6jhvi3n+tXFwY5K0y3Ns2Rhsy9mU7Pq8Ksyau2X5KbabyO8cmJXuavzsdcA=="
        ],
        "ARC-Message-Signature": [
            "i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776893434; c=relaxed/simple;\n\tbh=SkTq4QJ30PXn2/e5G6drjnjsqF8t83xpiE9fzaCjN3E=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t Content-Type:MIME-Version;\n b=SqImyuw+U/10/1uJTJqNyb9osNb5B4oPISZ6Z/jWWD4mGOjpNZf+sPYcFB+VsPdl/3yPLWhNMriGWYQF5DTt4d+QlFTnh9Z1wdPgQIZ7twm22WsgIkTtV35DA7rIc8KLzFEjQqVyZ5tsv4VrfK2vKe1I/aUioCKFT32xFZN9KxI=",
            "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=+45WO4YLioPVc8iRFUZf4etxjvXpL1gi84/fEkrWQV4=;\n b=MGN36rib0didBnrF8eqj1Ncx/Zgi/tZfy2ylSZfRhBXOj4yNw8MSLqr7lQSpZyxVl35MuAb78OVaEIB6snVmTxeGB5eVGW6Qr5uEIMWGwMAeMR462+IrW+OzBx594uzKt7o9VaAQ0HwhGSD+EIMhkpIVF0y2ejbTtYCRXQObL5hrwAfbJExZGy8AkDqF9tf4MR9/XKulyDadPW0CvPPIywgLysfWLbhfw+NstuyX3hNvx2yjLzihuCGPsSlbG8RgAi+275Abt5eJWHAnGgrZLbuf/4AFWG3HlYrdkdwX5RwUh7FuMrJ5PGz6UkcoA4vvJTMUYYFSKXhCLCYuOM90cw=="
        ],
        "ARC-Authentication-Results": [
            "i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=nxp.com;\n spf=pass smtp.mailfrom=nxp.com;\n dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com\n header.b=nzFGzh17; arc=fail smtp.client-ip=40.107.130.55",
            "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass\n header.d=nxp.com; arc=none"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=+45WO4YLioPVc8iRFUZf4etxjvXpL1gi84/fEkrWQV4=;\n b=nzFGzh17TXW7BWKOmwJQ39mnL6R3ZAnolusMoeI1lfyakJBmgzPcl8O4o5xlVxkFTW4HjbZRZsN/i//P52zH3C5WbimsevKASaaS+Nw4sYMwVCdK4i2jB00VCfQEspeVyrPGR5TBjLQm+DdWn1Vx8x+ezbkoGJ8HBMhrNRMYOJVeF8GerSfTQQEed6awlk1zvDLHcyifb8fiDtmrzdb7lt6Im3BNS4RAd3tqeBFb2vrFH8+gP1wh4PsI3Af9ROO88ynBd2CMeS7c/JiQTcRkzUtJTk3dBxTse3UHtYkUKK0LrmoDivyJHrklfzWrJ1iPpw0vj6/LQvewHfwh7qDB3Q==",
        "From": "Shenwei Wang <shenwei.wang@nxp.com>",
        "To": "Linus Walleij <linusw@kernel.org>,\n\tBartosz Golaszewski <brgl@kernel.org>,\n\tJonathan Corbet <corbet@lwn.net>,\n\tRob Herring <robh@kernel.org>,\n\tKrzysztof Kozlowski <krzk+dt@kernel.org>,\n\tConor Dooley <conor+dt@kernel.org>,\n\tBjorn Andersson <andersson@kernel.org>,\n\tMathieu Poirier <mathieu.poirier@linaro.org>,\n\tFrank Li <Frank.Li@nxp.com>,\n\tSascha Hauer <s.hauer@pengutronix.de>",
        "Cc": "Shuah Khan <skhan@linuxfoundation.org>,\n\tlinux-gpio@vger.kernel.org,\n\tlinux-doc@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tPengutronix Kernel Team <kernel@pengutronix.de>,\n\tFabio Estevam <festevam@gmail.com>,\n\tShenwei Wang <shenwei.wang@nxp.com>,\n\tPeng Fan <peng.fan@nxp.com>,\n\tdevicetree@vger.kernel.org,\n\tlinux-remoteproc@vger.kernel.org,\n\timx@lists.linux.dev,\n\tlinux-arm-kernel@lists.infradead.org,\n\tlinux-imx@nxp.com,\n\tBartosz Golaszewski <brgl@bgdev.pl>,\n\tAndrew Lunn <andrew@lunn.ch>",
        "Subject": "[PATCH v13 3/4] gpio: rpmsg: add generic rpmsg GPIO driver",
        "Date": "Wed, 22 Apr 2026 16:28:48 -0500",
        "Message-ID": "<20260422212849.1240591-4-shenwei.wang@nxp.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20260422212849.1240591-1-shenwei.wang@nxp.com>",
        "References": "<20260422212849.1240591-1-shenwei.wang@nxp.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "SA9PR13CA0086.namprd13.prod.outlook.com\n (2603:10b6:806:23::31) To AS8PR04MB9176.eurprd04.prod.outlook.com\n (2603:10a6:20b:44b::7)",
        "Precedence": "bulk",
        "X-Mailing-List": "linux-gpio@vger.kernel.org",
        "List-Id": "<linux-gpio.vger.kernel.org>",
        "List-Subscribe": "<mailto:linux-gpio+subscribe@vger.kernel.org>",
        "List-Unsubscribe": "<mailto:linux-gpio+unsubscribe@vger.kernel.org>",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "AS8PR04MB9176:EE_|DU2PR04MB8870:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "d124421c-582d-4ebc-f4df-08dea0b6601a",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "\n\tBCL:0;ARA:13230040|366016|376014|52116014|7416014|1800799024|19092799006|18002099003|921020|38350700014|56012099003|22082099003;",
        "X-Microsoft-Antispam-Message-Info": "\n\t7b4kJ6xmzQYQsWquskE6AadiGQWHgFyL0EBfNJ3YUidp4aDrrWiInpmIcAUepL2FYQof35zRyNbfVNoPrgbDKZFXsMXK2fBwoQnX6Z6+g9jICMQut/ixfhYOKUR7X4KLT3QfOmX2pkzFVOijgldwQVB6ZKoM9Wh5qG9inEX7SWC8Ps7JhitJpJr0QWCSjhYnN/U32Zfagm61oVfZvX+bY2HiHScK2ryRHzBV6DMvwoMTV6KjQjD6RnnPVPm/U366PF0rUK9VSDQT9vlZtfvbbiQNdekIyzFLeWRJYiA33QTCwYxVTXRruh+KNXkCUGblqpSOJV22gh9DvOx5T7hy5dIIIShccWjrzV3TnZMQAfu9GX5XG5d52pj7t+P8ThdFZJzM5i5aBXadsF+gKT01S5OzNEf/wr2FIODmo8aj3aDEDK3nQO9nfsEhv9XDl5cw166jaFhmFBrumizcwZBE/xyYIN7J0byIqnR56vtuQ3dD125b1JsTMfTM7CFOQW/KzCcuymdf9uTIELmdbpH8VuqJYrag1jb1P0iKUiIP/N7nvgEo9utIr1uMhpEWIfMY5JK174Rgq6T0FNueTYFXZaZVvm5HepF11AylpA4ML6d3MjAMV3h4zorRxaZ1VOAYT0YTvlOXJng5NNJOh0L9sRa5VPXDHh8g87McZpXjWVD9bBXFYB1W0ic19/V3r2tmiPj4vJAI0G+U/nfJk8wqQj1yf8cTcWz8kBqgEfiHcCzanZ5FN3dtIOndBFHUws+wbQLgrImgdUyRJi79jM+L6i7HmGMSAI4i8p7m7orF3X5FLHgVdmf4I8eaKqo8dppA",
        "X-Forefront-Antispam-Report": "\n\tCIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR04MB9176.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(52116014)(7416014)(1800799024)(19092799006)(18002099003)(921020)(38350700014)(56012099003)(22082099003);DIR:OUT;SFP:1101;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n TbtDboima5jyuGXKCD6iPIvYlYZoZPJxtcPQozSqsWns55IlXgfrgrHZUtCF0LA4bFgrrRYC8dZy+WkjwD34SnbE64ZjItZ9d+JvbEGESfIv1DwNyawbAVbkId513o/4efxwUjSeW82Zo8jXjABQTttY5Knaf+A5ALcktkyNmPx3DvNFCJUQ6fU5vyqVMMwjy+mNGJmfyUgpQd1d+8QcjRUorKQP8BSiKaPGvLnObnq37zftJ4meIIrR56ldA5QEC9KznCT2k3UUIfSlEzEAAl0Rcm2FrDDltFcF67GjilqY2UBrRWk+UloCReTjyt/lfBis8HCrPqGq4TZEL0XLZxX9zK4mDT5+Y8VlOc2ApWEvA/3NvEIXVSqRaBS+aM+/z+1SYrvoR3YaJvETRDOYbSthDHgIUGShlbQ+joJ+TfFDcdOZwfihxDWHHx17o78m/AfrHy4FUiverN3Km2VOXsyQQAFTIO7dx7yiZsaK82BEBOyy256Sv7QXllPZQrJMVn9qY50ZRIvqyXKh/wTQgJV8ZvR3EaZb9l3f9v+ty18FzBDvs1ttPdZ/EW4yi73Wo0jIIdfS5cKS2Pm6JyClmskefe6BPRrSdty3FqiOQK7o4gm04KyKEO3uBLqiGeTJ64scr/b6kszgA5rsgx+nffSKOJu5YhgW/AoV5jCyVeqA8SV0nmARVPtHui6VxtcWOEu8K3gNTRJRltn5n4duK3BV7jU72QHfmhEw1OgmgvLINfWwqnYv/OI8FOnkIYyvQCUnhHK5tLOFSGA+oaENCcHeq12edrsE0CTCtncM8oHOQQSTTZUGPU0B5KBMrjpVv+2re4rK7v8IVSoVBfniGfQEn6Gx6oz6CD6SaayCLbemp8fAltfDgW3R67eyVMj8RUQqst3OxfMqm/nw4yZYcZ0b/EljGZ8mrZcqhlNnZX6aq219tPALIP41o1ELGioaeARcIRfRsia1/QsEaJTcaZQIOXeSfmLn6kunFBO320fDrpV7FcYgezhL6u+3m/0xsRcbUsB5sGqVlV4ve5vA2P7/Vl3++TMI84hPTixG9TqUajKDbtBIQXW74M61CbqHSYWu6T9yfsFXb6qUIFbMvgacLbk6QDJ9bIFSXWG0vpe3waMiNjj9C1wLinso7XF9sfnq+CM1LmMI+DFCl+CC63rQtPh/6zLv2dWyt2sxDho99H7FCw1+jFrDQ/kMkRpsJZncmtv75FngwPKuxyRZN/SvbZomL2cQcC2Dm6EweSn9ZDHRuYg5j093fViqtejOs7DI8+4sctYrMDTEd3SmZlTU3NIrczlYaPR5D2nA3yCPJpIxvFJTzeQSpgXxx9ZSkbNDHWcSrn5QLdg67etL8c5YrNFBqq5uOtyWhew1r6aHlwS5TNInAdsJbIgt9wsnLozhyjZrbUgSLVHXzJfZK5asD89Ms1yJ+VESwgemPV2C6DZuya4WDixSyBdF1noI4StckcySVSpxk7JGAq6Qombea5QfKf4lFXD/7U2ogDk0iA23wpHgXHfE9vsgO+KSRCvTjOGUvDKNYGyWkWvekfHaeN9SJJe8vuaXsllDppicprM1E02Z6M/cqiEbFa+t4lgZXKmUtGV7sf9q6TKt5hawZuNKRbTOqYheIBi2rK5trJQi/ogHq0dj09Bif/r1eOcXCstPo/eNvzOamcT2KLJ8cqQ47gcEPuvHZqgTJj69p0kfXfjSRsXt1PIUIZJGs6IHpyQsSmUq8KbMQ4Mp5w==",
        "X-OriginatorOrg": "nxp.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n d124421c-582d-4ebc-f4df-08dea0b6601a",
        "X-MS-Exchange-CrossTenant-AuthSource": "AS8PR04MB9176.eurprd04.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "22 Apr 2026 21:30:29.2375\n (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "686ea1d3-bc2b-4c6f-a92c-d99c5c301635",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n dkTtDbMb9+ZlPxUXJbpMuAfvcjgJcZLSgCwWiLTmVQrfpTEgLkrQQiZk+YRqP988TBsu6B2FBLWb/fsS/tvKnQ==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DU2PR04MB8870"
    },
    "content": "On an AMP platform, the system may include two processors:\n\t- An MCU running an RTOS\n\t- An MPU running Linux\n\nThese processors communicate via the RPMSG protocol.\nThe driver implements the standard GPIO interface, allowing\nthe Linux side to control GPIO controllers which reside in\nthe remote processor via RPMSG protocol.\n\nCc: Bartosz Golaszewski <brgl@bgdev.pl>\nCc: Andrew Lunn <andrew@lunn.ch>\nSigned-off-by: Shenwei Wang <shenwei.wang@nxp.com>\n---\n drivers/gpio/Kconfig      |  17 ++\n drivers/gpio/Makefile     |   1 +\n drivers/gpio/gpio-rpmsg.c | 573 ++++++++++++++++++++++++++++++++++++++\n 3 files changed, 591 insertions(+)\n create mode 100644 drivers/gpio/gpio-rpmsg.c",
    "diff": "diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig\nindex 020e51e30317..4ad299fe3c6f 100644\n--- a/drivers/gpio/Kconfig\n+++ b/drivers/gpio/Kconfig\n@@ -1917,6 +1917,23 @@ config GPIO_SODAVILLE\n \n endmenu\n \n+menu \"RPMSG GPIO drivers\"\n+\tdepends on RPMSG\n+\n+config GPIO_RPMSG\n+\ttristate \"Generic RPMSG GPIO support\"\n+\tdepends on OF && REMOTEPROC\n+\tselect GPIOLIB_IRQCHIP\n+\tdefault REMOTEPROC\n+\thelp\n+\t  Say yes here to support the generic GPIO functions over the RPMSG\n+\t  bus. Currently supported devices: i.MX7ULP, i.MX8ULP, i.MX8x, and\n+\t  i.MX9x.\n+\n+\t  If unsure, say N.\n+\n+endmenu\n+\n menu \"SPI GPIO expanders\"\n \tdepends on SPI_MASTER\n \ndiff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile\nindex b267598b517d..ee75c0e65b8b 100644\n--- a/drivers/gpio/Makefile\n+++ b/drivers/gpio/Makefile\n@@ -157,6 +157,7 @@ obj-$(CONFIG_GPIO_RDC321X)\t\t+= gpio-rdc321x.o\n obj-$(CONFIG_GPIO_REALTEK_OTTO)\t\t+= gpio-realtek-otto.o\n obj-$(CONFIG_GPIO_REG)\t\t\t+= gpio-reg.o\n obj-$(CONFIG_GPIO_ROCKCHIP)\t+= gpio-rockchip.o\n+obj-$(CONFIG_GPIO_RPMSG)\t\t+= gpio-rpmsg.o\n obj-$(CONFIG_GPIO_RTD)\t\t\t+= gpio-rtd.o\n obj-$(CONFIG_ARCH_SA1100)\t\t+= gpio-sa1100.o\n obj-$(CONFIG_GPIO_SAMA5D2_PIOBU)\t+= gpio-sama5d2-piobu.o\ndiff --git a/drivers/gpio/gpio-rpmsg.c b/drivers/gpio/gpio-rpmsg.c\nnew file mode 100644\nindex 000000000000..993cde7af2fa\n--- /dev/null\n+++ b/drivers/gpio/gpio-rpmsg.c\n@@ -0,0 +1,573 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/*\n+ * Copyright 2026 NXP\n+ *\n+ * The driver exports a standard gpiochip interface to control\n+ * the GPIO controllers via RPMSG on a remote processor.\n+ */\n+\n+#include <linux/completion.h>\n+#include <linux/device.h>\n+#include <linux/err.h>\n+#include <linux/gpio/driver.h>\n+#include <linux/init.h>\n+#include <linux/irqdomain.h>\n+#include <linux/mod_devicetable.h>\n+#include <linux/module.h>\n+#include <linux/mutex.h>\n+#include <linux/of.h>\n+#include <linux/of_device.h>\n+#include <linux/of_platform.h>\n+#include <linux/platform_device.h>\n+#include <linux/remoteproc.h>\n+#include <linux/rpmsg.h>\n+#include <linux/virtio_gpio.h>\n+\n+#define MAX_PORT_PER_CHANNEL    10\n+#define GPIOS_PER_PORT_DEFAULT\t32\n+#define RPMSG_TIMEOUT\t\t1000\n+\n+/* GPIO RPMSG Type */\n+#define GPIO_RPMSG_SEND\t\t0\n+#define GPIO_RPMSG_REPLY\t1\n+#define GPIO_RPMSG_NOTIFY\t2\n+\n+struct rpmsg_gpio_packet {\n+\tu8 type;\t/* Message type */\n+\tu8 cmd;\t\t/* Command code */\n+\tu8 port_idx;\n+\tu8 line;\n+\tu8 val1;\n+\tu8 val2;\n+};\n+\n+struct rpmsg_gpio_line {\n+\tu8 irq_shutdown;\n+\tu8 irq_unmask;\n+\tu8 irq_mask;\n+\tu32 irq_wake_enable;\n+\tu32 irq_type;\n+\tstruct rpmsg_gpio_packet msg;\n+};\n+\n+struct rpmsg_gpio_info {\n+\tstruct rpmsg_device *rpdev;\n+\tstruct rpmsg_gpio_packet *reply_msg;\n+\tstruct completion cmd_complete;\n+\tstruct mutex lock;\n+\tvoid **port_store;\n+};\n+\n+struct rpmsg_gpio_port {\n+\tstruct gpio_chip gc;\n+\tstruct rpmsg_gpio_line lines[GPIOS_PER_PORT_DEFAULT];\n+\tstruct rpmsg_gpio_info info;\n+\tu32 ngpios;\n+\tu32 idx;\n+};\n+\n+/**\n+ * struct rpmsg_drvdata - driver data per channel.\n+ * @rproc_name: the name of the remote proc.\n+ * @recv_pkt: a pointer to the received packet for protocol fix up.\n+ * @channel_devices: an array of the devices related to the rpdev.\n+ */\n+struct rpdev_drvdata {\n+\tconst char *rproc_name;\n+\tvoid *recv_pkt;\n+\tvoid *channel_devices[MAX_PORT_PER_CHANNEL];\n+};\n+\n+static int rpmsg_gpio_send_message(struct rpmsg_gpio_port *port,\n+\t\t\t\t   struct rpmsg_gpio_packet *msg)\n+{\n+\tstruct rpmsg_gpio_info *info = &port->info;\n+\tint ret;\n+\n+\treinit_completion(&info->cmd_complete);\n+\n+\tret = rpmsg_send(info->rpdev->ept, msg, sizeof(*msg));\n+\tif (ret) {\n+\t\tdev_err(&info->rpdev->dev, \"rpmsg_send failed: %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tret = wait_for_completion_timeout(&info->cmd_complete,\n+\t\t\t\t\t  msecs_to_jiffies(RPMSG_TIMEOUT));\n+\tif (ret == 0) {\n+\t\tdev_err(&info->rpdev->dev, \"rpmsg_send timeout!\\n\");\n+\t\treturn -ETIMEDOUT;\n+\t}\n+\n+\tif (info->reply_msg->val1) {\n+\t\tdev_err(&info->rpdev->dev, \"remote core replies an error: %d!\\n\",\n+\t\t\tinfo->reply_msg->val1);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* copy the reply message */\n+\tmemcpy(&port->lines[info->reply_msg->line].msg,\n+\t       info->reply_msg, sizeof(*info->reply_msg));\n+\n+\treturn 0;\n+}\n+\n+static struct rpmsg_gpio_packet *\n+rpmsg_gpio_msg_init_common(struct rpmsg_gpio_port *port, unsigned int line, u8 cmd)\n+{\n+\tstruct rpmsg_gpio_packet *msg = &port->lines[line].msg;\n+\n+\tmemset(msg, 0, sizeof(*msg));\n+\tmsg->type = GPIO_RPMSG_SEND;\n+\tmsg->cmd = cmd;\n+\tmsg->port_idx = port->idx;\n+\tmsg->line = line;\n+\n+\treturn msg;\n+}\n+\n+static int rpmsg_gpio_get(struct gpio_chip *gc, unsigned int line)\n+{\n+\tstruct rpmsg_gpio_port *port = gpiochip_get_data(gc);\n+\tstruct rpmsg_gpio_packet *msg;\n+\tint ret;\n+\n+\tguard(mutex)(&port->info.lock);\n+\n+\tmsg = rpmsg_gpio_msg_init_common(port, line, VIRTIO_GPIO_MSG_GET_VALUE);\n+\n+\tret = rpmsg_gpio_send_message(port, msg);\n+\tif (!ret)\n+\t\tret = !!port->lines[line].msg.val2;\n+\n+\treturn ret;\n+}\n+\n+static int rpmsg_gpio_get_direction(struct gpio_chip *gc, unsigned int line)\n+{\n+\tstruct rpmsg_gpio_port *port = gpiochip_get_data(gc);\n+\tstruct rpmsg_gpio_packet *msg;\n+\tint ret;\n+\n+\tguard(mutex)(&port->info.lock);\n+\n+\tmsg = rpmsg_gpio_msg_init_common(port, line, VIRTIO_GPIO_MSG_GET_DIRECTION);\n+\n+\tret = rpmsg_gpio_send_message(port, msg);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tswitch (port->lines[line].msg.val2) {\n+\tcase VIRTIO_GPIO_DIRECTION_IN:\n+\t\treturn GPIO_LINE_DIRECTION_IN;\n+\tcase VIRTIO_GPIO_DIRECTION_OUT:\n+\t\treturn GPIO_LINE_DIRECTION_OUT;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn -EINVAL;\n+}\n+\n+static int rpmsg_gpio_direction_input(struct gpio_chip *gc, unsigned int line)\n+{\n+\tstruct rpmsg_gpio_port *port = gpiochip_get_data(gc);\n+\tstruct rpmsg_gpio_packet *msg;\n+\n+\tguard(mutex)(&port->info.lock);\n+\n+\tmsg = rpmsg_gpio_msg_init_common(port, line, VIRTIO_GPIO_MSG_SET_DIRECTION);\n+\tmsg->val1 = VIRTIO_GPIO_DIRECTION_IN;\n+\n+\treturn rpmsg_gpio_send_message(port, msg);\n+}\n+\n+static int rpmsg_gpio_set(struct gpio_chip *gc, unsigned int line, int val)\n+{\n+\tstruct rpmsg_gpio_port *port = gpiochip_get_data(gc);\n+\tstruct rpmsg_gpio_packet *msg;\n+\n+\tguard(mutex)(&port->info.lock);\n+\n+\tmsg = rpmsg_gpio_msg_init_common(port, line, VIRTIO_GPIO_MSG_SET_VALUE);\n+\tmsg->val1 = val;\n+\n+\treturn rpmsg_gpio_send_message(port, msg);\n+}\n+\n+static int rpmsg_gpio_direction_output(struct gpio_chip *gc, unsigned int line, int val)\n+{\n+\tstruct rpmsg_gpio_port *port = gpiochip_get_data(gc);\n+\tstruct rpmsg_gpio_packet *msg;\n+\tint ret;\n+\n+\tguard(mutex)(&port->info.lock);\n+\n+\tmsg = rpmsg_gpio_msg_init_common(port, line, VIRTIO_GPIO_MSG_SET_DIRECTION);\n+\tmsg->val1 = VIRTIO_GPIO_DIRECTION_OUT;\n+\n+\tret = rpmsg_gpio_send_message(port, msg);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tmsg = rpmsg_gpio_msg_init_common(port, line, VIRTIO_GPIO_MSG_SET_VALUE);\n+\tmsg->val1 = val;\n+\n+\treturn rpmsg_gpio_send_message(port, msg);\n+}\n+\n+static int gpio_rpmsg_irq_set_type(struct irq_data *d, u32 type)\n+{\n+\tstruct rpmsg_gpio_port *port = irq_data_get_irq_chip_data(d);\n+\tu32 line = d->hwirq;\n+\n+\tswitch (type) {\n+\tcase IRQ_TYPE_EDGE_RISING:\n+\t\ttype = VIRTIO_GPIO_IRQ_TYPE_EDGE_RISING;\n+\t\tirq_set_handler_locked(d, handle_simple_irq);\n+\t\tbreak;\n+\tcase IRQ_TYPE_EDGE_FALLING:\n+\t\ttype = VIRTIO_GPIO_IRQ_TYPE_EDGE_FALLING;\n+\t\tirq_set_handler_locked(d, handle_simple_irq);\n+\t\tbreak;\n+\tcase IRQ_TYPE_EDGE_BOTH:\n+\t\ttype = VIRTIO_GPIO_IRQ_TYPE_EDGE_BOTH;\n+\t\tirq_set_handler_locked(d, handle_simple_irq);\n+\t\tbreak;\n+\tcase IRQ_TYPE_LEVEL_LOW:\n+\t\ttype = VIRTIO_GPIO_IRQ_TYPE_LEVEL_LOW;\n+\t\tirq_set_handler_locked(d, handle_level_irq);\n+\t\tbreak;\n+\tcase IRQ_TYPE_LEVEL_HIGH:\n+\t\ttype = VIRTIO_GPIO_IRQ_TYPE_LEVEL_HIGH;\n+\t\tirq_set_handler_locked(d, handle_level_irq);\n+\t\tbreak;\n+\tdefault:\n+\t\tdev_err(&port->info.rpdev->dev, \"unsupported irq type: %u\\n\", type);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tport->lines[line].irq_type = type;\n+\n+\treturn 0;\n+}\n+\n+static int gpio_rpmsg_irq_set_wake(struct irq_data *d, u32 enable)\n+{\n+\tstruct rpmsg_gpio_port *port = irq_data_get_irq_chip_data(d);\n+\tu32 line = d->hwirq;\n+\n+\tport->lines[line].irq_wake_enable = enable;\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * This unmask/mask function is invoked in two situations:\n+ *   - when an interrupt is being set up, and\n+ *   - after an interrupt has occurred.\n+ *\n+ * The GPIO driver does not access hardware registers directly.\n+ * Instead, it caches all relevant information locally, and then sends\n+ * the accumulated state to the remote system at this stage.\n+ */\n+static void gpio_rpmsg_unmask_irq(struct irq_data *d)\n+{\n+\tstruct rpmsg_gpio_port *port = irq_data_get_irq_chip_data(d);\n+\tu32 line = d->hwirq;\n+\n+\tport->lines[line].irq_unmask = 1;\n+}\n+\n+static void gpio_rpmsg_mask_irq(struct irq_data *d)\n+{\n+\tstruct rpmsg_gpio_port *port = irq_data_get_irq_chip_data(d);\n+\tu32 line = d->hwirq;\n+\n+\t/*\n+\t * When an interrupt occurs, the remote system masks the interrupt\n+\t * and then sends a notification to Linux. After Linux processes\n+\t * that notification, it sends an RPMsg command back to the remote\n+\t * system to unmask the interrupt again.\n+\t */\n+\tport->lines[line].irq_mask = 1;\n+}\n+\n+static void gpio_rpmsg_irq_shutdown(struct irq_data *d)\n+{\n+\tstruct rpmsg_gpio_port *port = irq_data_get_irq_chip_data(d);\n+\tu32 line = d->hwirq;\n+\n+\tport->lines[line].irq_shutdown = 1;\n+}\n+\n+static void gpio_rpmsg_irq_bus_lock(struct irq_data *d)\n+{\n+\tstruct rpmsg_gpio_port *port = irq_data_get_irq_chip_data(d);\n+\n+\tmutex_lock(&port->info.lock);\n+}\n+\n+static void gpio_rpmsg_irq_bus_sync_unlock(struct irq_data *d)\n+{\n+\tstruct rpmsg_gpio_port *port = irq_data_get_irq_chip_data(d);\n+\tstruct rpmsg_gpio_packet *msg;\n+\tu32 line = d->hwirq;\n+\n+\t/*\n+\t * For mask irq, do nothing here.\n+\t * The remote system will mask interrupt after an interrupt occurs,\n+\t * and then send a notification to Linux system. After Linux system\n+\t * handles the notification, it sends an rpmsg back to the remote\n+\t * system to unmask this interrupt again.\n+\t */\n+\tif (port->lines[line].irq_mask && !port->lines[line].irq_unmask) {\n+\t\tport->lines[line].irq_mask = 0;\n+\t\tmutex_unlock(&port->info.lock);\n+\t\treturn;\n+\t}\n+\n+\tmsg = rpmsg_gpio_msg_init_common(port, line, VIRTIO_GPIO_MSG_IRQ_TYPE);\n+\n+\tif (port->lines[line].irq_shutdown) {\n+\t\tport->lines[line].irq_shutdown = 0;\n+\t\tmsg->val1 = VIRTIO_GPIO_IRQ_TYPE_NONE;\n+\t\tmsg->val2 = 0;\n+\t} else {\n+\t\tmsg->val1 = port->lines[line].irq_type;\n+\n+\t\tif (port->lines[line].irq_unmask) {\n+\t\t\tmsg->val2 = 0;\n+\t\t\tport->lines[line].irq_unmask = 0;\n+\t\t} else /* irq set wake */\n+\t\t\tmsg->val2 = port->lines[line].irq_wake_enable;\n+\t}\n+\n+\trpmsg_gpio_send_message(port, msg);\n+\tmutex_unlock(&port->info.lock);\n+}\n+\n+static const struct irq_chip gpio_rpmsg_irq_chip = {\n+\t.irq_mask = gpio_rpmsg_mask_irq,\n+\t.irq_unmask = gpio_rpmsg_unmask_irq,\n+\t.irq_set_wake = gpio_rpmsg_irq_set_wake,\n+\t.irq_set_type = gpio_rpmsg_irq_set_type,\n+\t.irq_shutdown = gpio_rpmsg_irq_shutdown,\n+\t.irq_bus_lock = gpio_rpmsg_irq_bus_lock,\n+\t.irq_bus_sync_unlock = gpio_rpmsg_irq_bus_sync_unlock,\n+\t.flags = IRQCHIP_IMMUTABLE,\n+};\n+\n+static void rpmsg_gpio_remove_action(void *data)\n+{\n+\tstruct rpmsg_gpio_port *port = data;\n+\n+\tport->info.port_store[port->idx] = NULL;\n+}\n+\n+static int rpmsg_gpiochip_register(struct rpmsg_device *rpdev, struct device_node *np)\n+{\n+\tstruct rpdev_drvdata *drvdata = dev_get_drvdata(&rpdev->dev);\n+\tstruct rpmsg_gpio_port *port;\n+\tstruct gpio_irq_chip *girq;\n+\tstruct gpio_chip *gc;\n+\tint ret;\n+\n+\tport = devm_kzalloc(&rpdev->dev, sizeof(*port), GFP_KERNEL);\n+\tif (!port)\n+\t\treturn -ENOMEM;\n+\n+\tret = of_property_read_u32(np, \"reg\", &port->idx);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tif (port->idx >= MAX_PORT_PER_CHANNEL)\n+\t\treturn -EINVAL;\n+\n+\tret = devm_mutex_init(&rpdev->dev, &port->info.lock);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = of_property_read_u32(np, \"ngpios\", &port->ngpios);\n+\tif (ret || port->ngpios > GPIOS_PER_PORT_DEFAULT)\n+\t\tport->ngpios = GPIOS_PER_PORT_DEFAULT;\n+\n+\tport->info.reply_msg = devm_kzalloc(&rpdev->dev,\n+\t\t\t\t\t    sizeof(*port->info.reply_msg),\n+\t\t\t\t\t    GFP_KERNEL);\n+\tif (!port->info.reply_msg)\n+\t\treturn -ENOMEM;\n+\n+\tinit_completion(&port->info.cmd_complete);\n+\tport->info.port_store = drvdata->channel_devices;\n+\tport->info.port_store[port->idx] = port;\n+\tport->info.rpdev = rpdev;\n+\n+\tgc = &port->gc;\n+\tgc->owner = THIS_MODULE;\n+\tgc->parent = &rpdev->dev;\n+\tgc->fwnode = of_fwnode_handle(np);\n+\tgc->ngpio = port->ngpios;\n+\tgc->base = -1;\n+\tgc->label = devm_kasprintf(&rpdev->dev, GFP_KERNEL, \"%s-gpio%d\",\n+\t\t\t\t   drvdata->rproc_name, port->idx);\n+\n+\tgc->direction_input = rpmsg_gpio_direction_input;\n+\tgc->direction_output = rpmsg_gpio_direction_output;\n+\tgc->get_direction = rpmsg_gpio_get_direction;\n+\tgc->get = rpmsg_gpio_get;\n+\tgc->set = rpmsg_gpio_set;\n+\n+\tgirq = &gc->irq;\n+\tgpio_irq_chip_set_chip(girq, &gpio_rpmsg_irq_chip);\n+\tgirq->parent_handler = NULL;\n+\tgirq->num_parents = 0;\n+\tgirq->parents = NULL;\n+\tgirq->chip->name = devm_kasprintf(&rpdev->dev, GFP_KERNEL, \"%s-gpio%d\",\n+\t\t\t\t\t  drvdata->rproc_name, port->idx);\n+\n+\tret = devm_add_action_or_reset(&rpdev->dev, rpmsg_gpio_remove_action, port);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\treturn devm_gpiochip_add_data(&rpdev->dev, gc, port);\n+}\n+\n+static const char *rpmsg_get_rproc_node_name(struct rpmsg_device *rpdev)\n+{\n+\tconst char *name = NULL;\n+\tstruct device_node *np;\n+\tstruct rproc *rproc;\n+\n+\trproc = rproc_get_by_child(&rpdev->dev);\n+\tif (!rproc)\n+\t\treturn NULL;\n+\n+\tnp = of_node_get(rproc->dev.of_node);\n+\tif (!np && rproc->dev.parent)\n+\t\tnp = of_node_get(rproc->dev.parent->of_node);\n+\n+\tif (np) {\n+\t\tname = devm_kstrdup(&rpdev->dev, np->name, GFP_KERNEL);\n+\t\tof_node_put(np);\n+\t}\n+\n+\treturn name;\n+}\n+\n+static struct device_node *\n+rpmsg_get_channel_ofnode(struct rpmsg_device *rpdev, char *chan_name)\n+{\n+\tstruct device_node *np_chan = NULL, *np;\n+\tstruct rproc *rproc;\n+\n+\trproc = rproc_get_by_child(&rpdev->dev);\n+\tif (!rproc)\n+\t\treturn NULL;\n+\n+\tnp = of_node_get(rproc->dev.of_node);\n+\tif (!np && rproc->dev.parent)\n+\t\tnp = of_node_get(rproc->dev.parent->of_node);\n+\n+\t/* The of_node_put() is performed by of_find_node_by_name(). */\n+\tif (np)\n+\t\tnp_chan = of_find_node_by_name(np, chan_name);\n+\n+\treturn np_chan;\n+}\n+\n+static int rpmsg_gpio_channel_callback(struct rpmsg_device *rpdev, void *data,\n+\t\t\t\t       int len, void *priv, u32 src)\n+{\n+\tstruct rpmsg_gpio_packet *msg = data;\n+\tstruct rpmsg_gpio_port *port = NULL;\n+\tstruct rpdev_drvdata *drvdata;\n+\n+\tdrvdata = dev_get_drvdata(&rpdev->dev);\n+\tif (!msg || !drvdata)\n+\t\treturn -EINVAL;\n+\n+\tif (msg->port_idx < MAX_PORT_PER_CHANNEL)\n+\t\tport = drvdata->channel_devices[msg->port_idx];\n+\n+\tif (!port || msg->line >= port->ngpios) {\n+\t\tdev_err(&rpdev->dev, \"wrong port index or line number. port:%d line:%d\\n\",\n+\t\t\tmsg->port_idx, msg->line);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (msg->type == GPIO_RPMSG_REPLY) {\n+\t\t*port->info.reply_msg = *msg;\n+\t\tcomplete(&port->info.cmd_complete);\n+\t} else if (msg->type == GPIO_RPMSG_NOTIFY) {\n+\t\tgeneric_handle_domain_irq_safe(port->gc.irq.domain, msg->line);\n+\t} else {\n+\t\tdev_err(&rpdev->dev, \"wrong command type (0x%x)\\n\", msg->type);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int rpmsg_gpio_channel_probe(struct rpmsg_device *rpdev)\n+{\n+\tstruct device *dev = &rpdev->dev;\n+\tstruct rpdev_drvdata *drvdata;\n+\tstruct device_node *np;\n+\tint ret = -ENODEV;\n+\n+\tif (!dev->of_node) {\n+\t\tnp = rpmsg_get_channel_ofnode(rpdev, rpdev->id.name);\n+\t\tif (np) {\n+\t\t\tdev->of_node = np;\n+\t\t\tset_primary_fwnode(dev, of_fwnode_handle(np));\n+\t\t}\n+\t\treturn -EPROBE_DEFER;\n+\t}\n+\n+\tdrvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);\n+\tif (!drvdata)\n+\t\treturn -ENOMEM;\n+\n+\tdrvdata->rproc_name = rpmsg_get_rproc_node_name(rpdev);\n+\tdev_set_drvdata(dev, drvdata);\n+\n+\tfor_each_child_of_node_scoped(dev->of_node, child) {\n+\t\tif (!of_device_is_available(child))\n+\t\t\tcontinue;\n+\n+\t\tif (!of_match_node(dev->driver->of_match_table, child))\n+\t\t\tcontinue;\n+\n+\t\tret = rpmsg_gpiochip_register(rpdev, child);\n+\t\tif (ret < 0)\n+\t\t\tbreak;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+static const struct of_device_id rpmsg_gpio_dt_ids[] = {\n+\t{ .compatible = \"rpmsg-gpio\" },\n+\t{ /* sentinel */ }\n+};\n+\n+static struct rpmsg_device_id rpmsg_gpio_channel_id_table[] = {\n+\t{ .name = \"rpmsg-io\" },\n+\t{ },\n+};\n+MODULE_DEVICE_TABLE(rpmsg, rpmsg_gpio_channel_id_table);\n+\n+static struct rpmsg_driver rpmsg_gpio_channel_client = {\n+\t.callback\t= rpmsg_gpio_channel_callback,\n+\t.id_table\t= rpmsg_gpio_channel_id_table,\n+\t.probe\t\t= rpmsg_gpio_channel_probe,\n+\t.drv\t\t= {\n+\t\t.name\t= KBUILD_MODNAME,\n+\t\t.of_match_table = rpmsg_gpio_dt_ids,\n+\t},\n+};\n+module_rpmsg_driver(rpmsg_gpio_channel_client);\n+\n+MODULE_AUTHOR(\"Shenwei Wang <shenwei.wang@nxp.com>\");\n+MODULE_DESCRIPTION(\"generic rpmsg gpio driver\");\n+MODULE_LICENSE(\"GPL\");\n",
    "prefixes": [
        "v13",
        "3/4"
    ]
}