From patchwork Mon Oct 17 08:37:10 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuninori Morimoto X-Patchwork-Id: 9379315 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E8AF9600CA for ; Mon, 17 Oct 2016 13:53:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D9F50290F2 for ; Mon, 17 Oct 2016 13:53:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CE6F4290F9; Mon, 17 Oct 2016 13:53:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, RCVD_IN_DNSWL_NONE, T_DKIM_INVALID autolearn=no version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AE4F6290F2 for ; Mon, 17 Oct 2016 13:53:38 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id 5297B266B99; Mon, 17 Oct 2016 15:53:37 +0200 (CEST) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 9EEE2266B21; Mon, 17 Oct 2016 15:51:20 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id D2729266A55; Mon, 17 Oct 2016 10:37:21 +0200 (CEST) Received: from relmlie2.idc.renesas.com (relmlor3.renesas.com [210.160.252.173]) by alsa0.perex.cz (Postfix) with ESMTP id 5AC2D26583C for ; Mon, 17 Oct 2016 10:37:15 +0200 (CEST) Received: from unknown (HELO relmlir1.idc.renesas.com) ([10.200.68.151]) by relmlie2.idc.renesas.com with ESMTP; 17 Oct 2016 17:37:14 +0900 Received: from relmlac1.idc.renesas.com (relmlac1.idc.renesas.com [10.200.69.21]) by relmlir1.idc.renesas.com (Postfix) with ESMTP id 03911531E6; Mon, 17 Oct 2016 17:37:14 +0900 (JST) Received: by relmlac1.idc.renesas.com (Postfix, from userid 0) id E461C80030; Mon, 17 Oct 2016 17:37:13 +0900 (JST) Received: from relmlac1.idc.renesas.com (localhost [127.0.0.1]) by relmlac1.idc.renesas.com (Postfix) with ESMTP id D8BC68002F; Mon, 17 Oct 2016 17:37:13 +0900 (JST) Received: from relmlii1.idc.renesas.com [10.200.68.65] by relmlac1.idc.renesas.com with ESMTP id TAC26218; Mon, 17 Oct 2016 17:37:13 +0900 X-IronPort-AV: E=Sophos;i="5.22,559,1449500400"; d="scan'";a="222518560" Received: from mail-hk2apc01lp0216.outbound.protection.outlook.com (HELO APC01-HK2-obe.outbound.protection.outlook.com) ([65.55.88.216]) by relmlii1.idc.renesas.com with ESMTP/TLS/AES256-SHA; 17 Oct 2016 17:37:12 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=renesasgroup.onmicrosoft.com; s=selector1-renesas-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=/pZL99oBcgSVmhCWHNO/mJ1siJV4iv1BxkvjVPhz2+Q=; b=FkendQO24KyH5AQYAJjQPU14f1Bwt7yHkY/32XxoeylcFOYbzCkm4KLhkqAeJLrud5VQtP/ahVCBLtd/F7/N8ogfCPNI5mCkGXYHw3SHEM0nkRtdnUXYxCfF1LgUoTkgLKo7n0yqXVxCY6Fu7CUThZ1Ce71Ks3+rdclLZr1isIM= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kuninori.morimoto.gx@renesas.com; Received: from morimoto-PC.renesas.com (211.11.155.144) by SG2PR0601MB1456.apcprd06.prod.outlook.com (10.169.106.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.669.16; Mon, 17 Oct 2016 08:37:10 +0000 Message-ID: <8760or4byb.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto User-Agent: Wanderlust/2.15.9 Emacs/24.3 Mule/6.0 To: Rob Herring , Mark Brown In-Reply-To: <87shrv4c8x.wl%kuninori.morimoto.gx@renesas.com> References: <87shrv4c8x.wl%kuninori.morimoto.gx@renesas.com> MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Date: Mon, 17 Oct 2016 08:37:10 +0000 X-Originating-IP: [211.11.155.144] X-ClientProxiedBy: TY1PR0201CA0022.apcprd02.prod.outlook.com (10.164.90.160) To SG2PR0601MB1456.apcprd06.prod.outlook.com (10.169.106.22) X-MS-Office365-Filtering-Correlation-Id: c1d54e75-f14d-48dc-a18f-08d3f668ca12 X-Microsoft-Exchange-Diagnostics: 1; SG2PR0601MB1456; 2:VFF/ENbeNYNb9yONKcBfn3LTKiWWC/uiP6blyiy6TTrlgLJpsI3FC6D+Ao0nap1VKEQ4yjQG5jB7iZVXiZlfYMJsfle2VegGxD0RlCaU8Snn0u4ctbWgdDtYS7DgezzFoo/10uQhH2XgfFtGdj2WkJdwjdWqBA6+Zebr88kG1NqO3gnEgb7KUzLIBjULmc+Trk+SXSl2XddiWotUbmEfHg==; 3:SMx/sBjDD66eQoZY/mV+BulTWEp0jmyJi5kYtAU8i8w1V0YCOhGYGD7c3+6B3o7kXWh3E0rldekx7OdJmPlHf60Hcz2GcsyrXmian0Y0TrCrs6DOm7k3g0JyJjd60jZHPZo0HOnuzNGR2/HY5bJj5Q== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SG2PR0601MB1456; X-Microsoft-Exchange-Diagnostics: 1; SG2PR0601MB1456; 25:6gX9xexFFYZAKaIDSZLLjWSat4XeA8uCH3lj0lIJqprU1etK7IMg1yH7gAiMk67czgvky5+uS8eKwRKnfySUPr15Kp1HyIMu8VEF6CQ6iCsLFCwLjolGNDW5eK7knAiZFCl8r8qpWwFQOAIqecARr1u+CkUPT+dYGJxbUIcyuJtK5ccZcTGHzypSVACNqTPaEjZlOO29y7+WZ5fCojWhX2kHYoOXN7Y48QZY2GZQJ1vec5/+mSuJH0wvoqowpCzq6bU3srd5S6mJVL4EUg3lcKKt3hM5QoIrxTtAkB048QOhVttImenhjKRGksBey3xG5+n1MwWSCvK1Rhe4SUS5/J0DiZ10Ule2BwEKH31lEP6o1isoJHIHzPBMbv99e3kqPZnRhanXAuDMqw74Gk/eC40KuJ/soOEeoRpmCq1gVpLpU8pR8zmRdHTY8Zo2jcD4Iia3K8jsNYCad/adzwlbOkaHa02Ud+2uOIUj0EYBdA7ancGDch9mNTnP4IMdbVtbDc8JqCYA5C7/Wk9Sifcic9bfh9q56maKJLcKRo9D0/NmjTMR7+KyRz8SV70WWJNHf/yoC7M7ybFp2im08IV2SfSdvF1fCLyFPyvTmhtGYUqW5qt9kwJIIFddjxh8L/vwyaHAns7lpv82c+iYWoNxMhm8eUcfNCVEvlchUuERPFmVWTJ2iJaHpQMFSEX4NaAn+2UlPvBtxhUEcYmyFN2H9Q== X-Microsoft-Exchange-Diagnostics: 1; SG2PR0601MB1456; 31:TSU1lgkErhusOoryl3p9pT2ST0s7v6N9MDv0Y401mLA1vnS/RUKFqVEy24uq0inQ76bFqOutiK1T2axZ4bl1IO2CWIBsmiGHioM4XdhrF8nKIinNBewLK7JHGZfTd0eDuBoQ1thCi7OOqUNC3DwtFhifdFk2m+usXtXS03YTv0/dWKR6sHN3svrE+zKE6ySono92QfsekbkEs7Ir2wXsw7ZLhfblbP7aUAjhtXmTXHbu1KkR2/vEi5JUcyt1ivcZz56ooMNZD1gaigg5ueRxHQ==; 20:Hae8gRAXvHUTuubLZ6AMf9Wq3KRmvwPusvtSK9qnQH2WXRvfsOrjGIgbevOcoLYncteQrFJDLy2vurpYggwX52D6VefMIG9+m7OUSYq+ZKs1NhKeqXaPu8hmA9e5vWUrKoDgvCwzLawTt83sira5cWp29h/WiODp0QvGCwhBOleCcReW4KVsuxeGZIRpQK6AIvwZnZTJhiboupl2iTvqqmjguZXX4fp/mfMWZJqhWUl5GjIsCkUUwqCRBEpSlIu9w/kr/r5MqCUKvM5ngnPns3ByqSA9NActn+Xg/nU7HS/McBYM+aJc+3uGJ1GyJopsCNBcQ8+SEINsZ1E3ha4I41DSGBiV9r7xgRFugokSXIX1hjUxs3sFVYCMeIRkomkfrr09DjXV9J+O03HHaHHG9A5W7f3GmIkrCZITiQ/49X7dx7ZMLXkBBJ7ZKmb9pJypc+FUifA21S7rxWU04mHMN0OCBtqGrUaHN9uEKgHhRstd5LJXI8H/WEEqAwFIcT4O X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(17755550239193); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6055026); SRVR:SG2PR0601MB1456; BCL:0; PCL:0; RULEID:; SRVR:SG2PR0601MB1456; X-Microsoft-Exchange-Diagnostics: 1; SG2PR0601MB1456; 4:BrLLY37Pki6etFuO0gn1feDLtP4/eoXuaPwzMrWIB1A0H4LrR77HAhuV/mQp+zEInaCria1/JkD9bTleZBMZHUpFS6tOmroQEGgZ9mDpfWdek/leuLsftf7jm9YpiEjMS9LGDirhsYnnQSis9Y2xtw9rRkkV11Y6mrr4+Fyhovqk+cZF+LcDkY/CwFMa/lgWeyR7Fm+IOR588ozDb0nHxtee0q5ob2jaJ1xVxD1Px1kdm+S6+u2eOPeoznpFAeV/5Gdv/27y1dbhjLxhlHZ+WUzVuToYsBDodkAN2fQuhwG2GWuRAfGwXzqhGH5IUnHf++Gn2CzkxS/h/2yzYzIXsVsLI1n11SoAD5AShikiUzBLe9BBXBQPe2ZuBCPa2hEbo52OEffCzcHG6+CnXlresHD/eEtbqtZuFpfe3X6V0W+1p4q2jeSARpMY1JzDibq+ciGyJv9CYMQ+7In1nHyk4g== X-Forefront-PRVS: 0098BA6C6C X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(7916002)(189002)(199003)(23726003)(97736004)(189998001)(4326007)(7736002)(7846002)(2906002)(19580395003)(54356999)(101416001)(76176999)(50986999)(8676002)(81156014)(69596002)(86362001)(81166006)(229853001)(19580405001)(53416004)(8666005)(36756003)(92566002)(50466002)(2950100002)(33646002)(305945005)(77096005)(5660300001)(7416002)(586003)(6116002)(3846002)(106356001)(46406003)(105586002)(42186005)(5001770100001)(66066001)(68736007)(83506001)(4001350100001)(47776003)(7059030)(16060500001); DIR:OUT; SFP:1102; SCL:1; SRVR:SG2PR0601MB1456; H:morimoto-PC.renesas.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SG2PR0601MB1456; 23:Hpn/BKLOfmnxNynvFWIOU7i/yYKvCgNl/jsn36c?= =?us-ascii?Q?gCddQPMavPz/olF5T1zbG8KsO51lUHUERRlNX2WwOC+S3D2Qw2IrPe7zcNGm?= =?us-ascii?Q?o8ipYOlcSbn2rcv72BnfS37eFHGf8ZgE7LahLbe84esy0RRZSZ9Hx70PKKk4?= =?us-ascii?Q?EhpvykiHJY+HGoGGPNK0rA9wDhpeL9SWP9YucAwjXRL4leTCU8FpJHGV5elh?= =?us-ascii?Q?cK3kmQCfF2zJy8H4xwtgMYcXuF39oG1c1gpwwsHmA00YytccDhNvgu6Ms8rk?= =?us-ascii?Q?GK6cFjtcbLWtRuvMSXT5ex0ITmo9pOfmXGnvbKkIaSeQWyUKcDUfK7JAgDo6?= =?us-ascii?Q?HFX/CeBWO7ty8bjE2K23jDodbGXfWEsD1ATjRQK6g6YODx6/2uvtUXjsBnFi?= =?us-ascii?Q?FhTKUD4hSLRqnz0asboJpbbTOMLz6nfCxFGpoe2BK1boEtfznWctsk600mTQ?= =?us-ascii?Q?NTB/Q6g7LjUwNbLhDFnFic91ATI1hJ3W+wQcbjrycVSY5n88J6Yx/J2qxIJ0?= =?us-ascii?Q?nMXb6rRE46oE5Zw2N4YcJkbFm3wugpn1TcPBaStLG5FJwbBTEoWixdzAuDD8?= =?us-ascii?Q?dxIliEw8RhgtSLr43CSy+Nosw0d9SSuPI7jH3olNgMyQbMHXzA3DefBRPOhB?= =?us-ascii?Q?CEFOyW44DMRnIQdvbd08T4WeocREW/d3r27oD/SRb0Ox5NLyNQuOn1RQXNGh?= =?us-ascii?Q?lxfhHk+VgjEKd1vGT9Nwk+ASJyT0VDG0g8rQItBIDbt10OeRkpGl1Gfxz+zC?= =?us-ascii?Q?ysXpC7rt9ImK8LZIpBSPZPn5lKr5uo+/qYDX2HSzRQhBTZYkYH6UfAXvJbji?= =?us-ascii?Q?TgzQgrsI6G2fCppR8uRPwbqjyhKeIeBg3UsKaul67h3tqtPzLI+AIvSUUHSR?= =?us-ascii?Q?TnrBSyeU/KdFVN/A8e21ug4JWA54k/mTr2JTuPU9N/xYzp/QAg5OPSZoqT6X?= =?us-ascii?Q?jXSXsuP1FV9e5sUhOmFfYiwRWP/ebF1OUl6KlW2o75Bf9JBLt437YZyiXs7F?= =?us-ascii?Q?61T29oRZE2StVmvHF0Nq3RVQQ90YZW+gS/uXFLwOJ3aIpYczhkqjdFx1RdiZ?= =?us-ascii?Q?wa+rbR3+Qlia64Ss2MR5/V27fKBHHpbKoIwPE1jJcj3Og8DTcz0Iicy4BHDt?= =?us-ascii?Q?k22AsJ/6F4/xWnBSNq9rY/IliQQXjFEyeNN35ehPCaFBFNGx+1kYRV0bFgiX?= =?us-ascii?Q?lE1ICN0YzXL/QRpoWdXDnSY2T/Oh0cnjO2+X4VN4jqZpnTAnloHdLLGJfIdW?= =?us-ascii?Q?y2H2e85/2pxdFHKf1bNE=3D?= X-Microsoft-Exchange-Diagnostics: 1; SG2PR0601MB1456; 6:xvwAa92Us7FsuTZp253jPW4QQstcUfPeDawrlJiEvL5kFcSeSSlY8AZmcSJWz4urmnz4F5WBFLkadlW0fQ9cQGHjovX0ru6Ls/7mLpwJy2deJi9BepH3zLFzZraYy01085zw+a2m3NMkZUwCDp15nAwn5AMgTFd8vL/FnvbMccr52Mgl1xcMZ/VTC7JSCKLa71NSiCzf4bOzPc40Pp3RfBuFlRcOqJT70TVSVGxh3qMbaKynuodK4RzKgbuo0L/2bcS+SWZDkQJYUVvHRpzmPtHzkhxcb/tWi2JODuSHw5KBh0q9O8Bw4ultEUG0LZxA1DJc5UvnYKF6WBGMs9pMAKYOwTybiL4xoiQ9dd/PAAo=; 5:FKFwmQtZDu0INGYxoGkVPRsHBY1zvAhQh3EZw3IGamnHKCo/C1gHxObyCejZpR1WjiETpSed0MmOUgKI9SfzQsdTOHK9sXGZuSgOAo1I3r6FlrZpXH3aMVBVVh76tA3+5PeYY6gwQ8ZZ5M/lsIg7JTqowVR/UnSpSnCgbAb05Us=; 24:RpBtDTGk1C7SOuz+zDYHR3/uvgGYd6+scHPzDUcB6jtzMIbVOhQ2wnKgcljCueeYj3fHZYsU32m2b5CkoQA44ezBp8jfqsaId3BF0uIQXzc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SG2PR0601MB1456; 7:cyYReln56Ze9oqMHqPVk2jo5E8HFOSXduPFa4YdLnBsSyYa2AtSIOG/f+EW1051ghQFUJPcetzupMDVykTYDQIVavfBt4GAATqimi1B+Q773YFwfdpe3FqcX1U4sGaWJtNTqxqyLtr/Xg+0Ev7PgQiIiHvls33dHAAiDXOFE72ojKF8yQg1Q9zYJeHV2r5tWywveY3iimMKGpul4sPqbboEgktMIHv/N9aqyQtUTFZ6y5Gg904DMwyY7hfecO6L/s7muZfoeLzV/HgpxlFrwP+0reLO5BMrwJtsvGiCWWTa5r4OfdZwN7jRks5DL5/r6zG4yR3IPwh4OIKD4LpvmPOvWzgGcTF0Vrb1bHG52URU=; 20:OKl6d2uBWpmssGv4l41/JFCduEZfpdM2aIe9j84+mW+RWbfyBX+lO+cov0MR4ZESFF7osXFB28bTsM/mEm4a1Jch1ExG9/VTCRVGXXKBwVotmGisTpfrxc2wpT3Ja0m2TT6QZtly9UpduBd0EeQnzV7vc4S0HuhvB/E6CIY7oD0= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2016 08:37:10.6173 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2PR0601MB1456 Cc: Linux-DT , Linux-ALSA , Liam Girdwood , Linux-Kernel , Simon , Laurent , Grant Likely , Frank Rowand , Guennadi Subject: [alsa-devel] [PATCH 16/23] of_graph: add for_each_of_port() / for_each_of_endpoint_in_port() X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Kuninori Morimoto OF graph is used mainly from V4L2, but ALSA needs to use it. It already has for_each_endpoint_of_node() which is for-loop for each endpoint. But, ALSA needs for-loop for each port[s], and for-loop for each endpoint of inside port[s]. This patch adds for_each_of_port() and for_each_of_endpoint_in_port() for this purpose. And it also adds for_each_of_endpoint() which is similar to for_each_endpoint_of_node(). The difference is it can catch port handle during for-loop. Signed-off-by: Kuninori Morimoto --- drivers/of/base.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/of_graph.h | 29 ++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/drivers/of/base.c b/drivers/of/base.c index 07b9f68..131f416 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2285,6 +2285,70 @@ struct device_node *of_graph_get_top_port(struct device *dev) EXPORT_SYMBOL(of_graph_get_top_port); /** + * of_graph_get_next_port() - get next port node + * @parent: pointer to the parent device node + * @prev: previous endpoint node, or NULL to get first + * + * Return: An 'endpoint' node pointer with refcount incremented. Refcount + * of the passed @prev node is decremented. + */ +struct device_node *of_graph_get_next_port(const struct device_node *parent, + struct device_node *prev) +{ + struct device_node *port; + struct device_node *node; + + if (!parent) + return NULL; + + node = of_get_child_by_name(parent, "ports"); + if (node) + parent = node; + + /* + * Start by locating the port node. If no previous endpoint is specified + * search for the first port node, otherwise get the previous endpoint + * parent port node. + */ + if (!prev) { + port = of_get_child_by_name(parent, "port"); + if (!port) + pr_err("%s(): no port node found in %s\n", + __func__, parent->full_name); + } else { + do { + port = of_get_next_child(parent, prev); + if (!port) + break; + } while (of_node_cmp(port->name, "port")); + } + + of_node_put(node); + + return port; +} +EXPORT_SYMBOL(of_graph_get_next_port); + +/** + * of_graph_get_next_endpoint_in_port() - get next endpoint node in port + * @parent: pointer to the parent device node + * @prev: previous endpoint node, or NULL to get first + * + * Return: An 'endpoint' node pointer with refcount incremented. Refcount + * of the passed @prev node is decremented. + */ +struct device_node *of_graph_get_next_endpoint_in_port( + const struct device_node *port, + struct device_node *prev) +{ + if (!port) + return NULL; + + return of_get_next_child(port, prev); +} +EXPORT_SYMBOL(of_graph_get_next_endpoint_in_port); + +/** * of_graph_get_next_endpoint() - get next endpoint node * @parent: pointer to the parent device node * @prev: previous endpoint node, or NULL to get first diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h index 35e9a6e..eca1f3b 100644 --- a/include/linux/of_graph.h +++ b/include/linux/of_graph.h @@ -30,6 +30,16 @@ struct of_endpoint { const struct device_node *local_node; }; +#define for_each_of_port(parent, port) \ + for (port = of_graph_get_next_port(parent, NULL); port != NULL; \ + port = of_graph_get_next_port(parent, port)) +#define for_each_of_endpoint_in_port(port, ep) \ + for (ep = of_graph_get_next_endpoint_in_port(port, NULL); ep != NULL; \ + ep = of_graph_get_next_endpoint_in_port(port, ep)) +#define for_each_of_endpoint(parent, port, ep) \ + for_each_of_port(parent, port) \ + for_each_of_endpoint_in_port(port, ep) + /** * for_each_endpoint_of_node - iterate over every endpoint in a device node * @parent: parent device node containing ports and endpoints @@ -49,6 +59,11 @@ int of_graph_parse_endpoint(const struct device_node *node, bool of_graph_port_type_is(struct device_node *port, char *type); struct device_node *of_graph_get_port_by_id(struct device_node *node, u32 id); struct device_node *of_graph_get_top_port(struct device *dev); +struct device_node *of_graph_get_next_port(const struct device_node *parent, + struct device_node *prev); +struct device_node *of_graph_get_next_endpoint_in_port( + const struct device_node *port, + struct device_node *prev); struct device_node *of_graph_get_next_endpoint(const struct device_node *parent, struct device_node *previous); struct device_node *of_graph_get_endpoint_by_regs( @@ -78,6 +93,20 @@ static inline struct device_node *of_graph_get_port_by_id( return NULL; } +static inline struct device_node *of_graph_get_next_port( + const struct device_node *parent, + struct device_node *prev) +{ + return NULL; +} + +static inline struct device_node *of_graph_get_next_endpoint_in_port( + const struct device_node *port, + struct device_node *prev) +{ + return NULL; +} + static inline struct device_node *of_graph_get_next_endpoint( const struct device_node *parent, struct device_node *previous)