From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752714AbcF2Ag6 (ORCPT ); Tue, 28 Jun 2016 20:36:58 -0400 Received: from relmlor3.renesas.com ([210.160.252.173]:24058 "EHLO relmlie2.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752448AbcF2Ag4 (ORCPT ); Tue, 28 Jun 2016 20:36:56 -0400 X-IronPort-AV: E=Sophos;i="5.22,559,1449500400"; d="scan'";a="213979311" Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kuninori.morimoto.gx@renesas.com; Message-ID: <87bn2kg7lr.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto Subject: [PATCH v2 6/7] of_graph: add for_each_of_port() / for_each_of_endpoint_in_port() User-Agent: Wanderlust/2.15.9 Emacs/24.3 Mule/6.0 MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") To: Rob Herring , Mark Brown , Mark Brown , Laurent , Guennadi , Grant Likely , Frank Rowand CC: Linux-Kernel , Linux-DT , Linux-ALSA In-Reply-To: <87k2h8g7rr.wl%kuninori.morimoto.gx@renesas.com> References: <87k2h8g7rr.wl%kuninori.morimoto.gx@renesas.com> Content-Type: text/plain; charset="US-ASCII" Date: Wed, 29 Jun 2016 00:36:50 +0000 X-Originating-IP: [211.11.155.144] X-ClientProxiedBy: TY1PR06CA0033.apcprd06.prod.outlook.com (10.164.91.43) To HK2PR06MB1697.apcprd06.prod.outlook.com (10.167.73.11) X-MS-Office365-Filtering-Correlation-Id: 63ff8d15-0cc0-4a49-211b-08d39fb5767b X-Microsoft-Exchange-Diagnostics: 1;HK2PR06MB1697;2:Tbji6FqTPHxqySZ9fj8XiBtpwazwYrkdM06ZNkEj7hEsVlaCjGmDdxz4r89Lxulo7YGRnQF4r984vAIL/7QwphTkqD/pARRhGwQT/S6WHMD2kP8SsaThNNieNVZFXhgdZddCr9YavwspHVSIOOjEXmcGvMoujj03Jpsv5eZc8e0BwiFne1JeKeH8xaIi46y9;3:I+tvQsKYXtC5gS7NbmGcO+lTNBh1U+QG5gzRWh8v7FsqVm1/y7D0LAeC4zr4J88tgAJKQKcCLc2MIY9vU+9W8lbrcDpgfG0YuCqxQfgwSTwadRZ4vfyCxrsvw2YuEOQe;25:3BPbXkLIQ8DCE/7/XAvY8aRZyP3Rbwb7imfHGEuOzqq1K9BVoHsTzkYffBRP/ByCyJcohER7hK28N29y6JQS722genBX3+W4KXkWa8KuAP/cijBcmsUtThc993qtikeVcjD0ko9e2ryFSNtPHuFX373h3CgY1mc4ZNee4iPT0/eT17kv4IvTOd5xV8e4Q4ITUnG7CL1WTKayfahWv59Lu5lmrAmycAOD3m4O2GotK3M8HUfxaPjCXGzwAlHwFWdrXNpewFJJC2yJPXLun6U0C9Fy2HSqdpEZPquhKN5/TjqQNUmZg6TETpzgziaxxPz5ADZapvDnMbALA8wtGrK7LbLxL95Lcjm40BQYiNIFhriUQbYmLqJbM7lSct8WK/8kJGG9wdC5s81w/A0nPYfKmrebCm3TY1L6Gdh93oiYZaY= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HK2PR06MB1697; X-Microsoft-Exchange-Diagnostics: 1;HK2PR06MB1697;20:pKHGx5EqSz9WvpPy8T83qllxRa4WBkLXjQ/MdKTBPoCjb+fO7Ul9coonO/SOFyDA6h5elfSEJ0osBSB+JmKhoHQ0L69LuG95vmtkAE3WTWBeTCmc4wFNJBemXaP61+coUBmDvaR97cnR9R8M67nei27tehX8TPasvYRBfgXwylYU485K/oCQJ7e6tBM3Osohe9fI2nGF8Anuw75m7uckAni+uIfioeNBk/QUTWNVEAOqSpKzyVBPYzFqLzY+r/VbtKXhKBnG+eqjiEtzjU5TMbdbdF8sI++hSIMOUe7XnSfo6EVUpvUVUuzsSfboRrRoE3vwXUyNFthpXorgFPtDuIv9ffYg/i7SDDqe0gRpTfNv2sU0S4MdkbSDFqrdcDIIky7/W3R4y6vY6jtdy5mVVXPzIEnpyzKVB9xB9M6+lOOKmekDJkfzHhyak29E8YcmYKXEhC1Lg614Vs5Mf5F7L83t45zV2JslF3N/LdHpooW01D/nVOt8DLqJWjtoHklA;4:XDWVWOCZH3OqftV6ll6XyRCk/te3erz93QqF4mWIovVHn7Yi6ARXFLWwxwTOtdHlb0mAXedvrT6I2FQZy+UGSf7jMzYl3w2cZzOnIlQumC9AVV34IlQn7R4XhPDZHzQ8ig0NQjALHbgaKJVCyj6wxOmtA4Ma8Yd7AHUPkfk8mYVxA4AZf5JsQwxrSnJ6yqwpMs7gPpyI4ny9Dj/tYnyPYkeICWBuw0ODPPd6dmGTRJxT1JAPaqXprdIg/Y1pshHtN54xkm0YluL4W/B3LnKVxhi5O+yR7I74DA+zWLG3jhu3000JlyNNSG8IRYIItxsdBze6RnIuZifJJ2dL6H9Ms7SSRzslYFmRdK3EyoNcbVaxXrnwe7S54XmHwFcfrAlTEnBveBykyKGBxgMrHKmFMQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:HK2PR06MB1697;BCL:0;PCL:0;RULEID:;SRVR:HK2PR06MB1697; X-Forefront-PRVS: 09888BC01D X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(189002)(199003)(229853001)(19580395003)(19580405001)(77096005)(47776003)(83506001)(105586002)(69596002)(86362001)(8676002)(66066001)(46406003)(106356001)(8666005)(101416001)(81166006)(81156014)(68736007)(2950100001)(42186005)(6116002)(92566002)(3846002)(23726003)(33646002)(53416004)(7736002)(4326007)(36756003)(189998001)(50466002)(50986999)(7846002)(586003)(97736004)(2906002)(4001350100001)(76176999)(54356999)(5001770100001)(305945005)(7059030)(16060500001);DIR:OUT;SFP:1102;SCL:1;SRVR:HK2PR06MB1697;H:morimoto-PC.renesas.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HK2PR06MB1697;23:MTTtIZnbM6g+vM0kqfkSh0jTa3oNEoLMpQS0FX7yN?= =?us-ascii?Q?s3S+NjER/mkeddy5LS8qfeMHT2ANPUKWGg/JcO1/+tou9W3v+I4EYkp81Mx6?= =?us-ascii?Q?oc88jcTpbbBqa0xcMjReUg+8/le/GjUezAv9XEdEmkBbpBUaW238nbvgTQgU?= =?us-ascii?Q?ddQorq+x2zAAFh/4EQyLmHM4quJ8hiMWbCSF7t2Quhh0NzmqJ3QEYZCTHqZS?= =?us-ascii?Q?3ukHjptU3B7YPdcYYrBjDCQAyvWnScF+k0uKrdme5Wf5vzDjoJdTKDV7zhWQ?= =?us-ascii?Q?o63olNkhMEdTdltDgoEMA7PM6cseI/PCDZhGhQkQ9XEwihS3gt6+Pdwv6dox?= =?us-ascii?Q?8QOcnzyReF9DiPeK7hiGVqCC5QYaGA/r6+U9QpturApk547McWx7gVDm6Kki?= =?us-ascii?Q?qFQn2ls041QgAOI+BOspz7N4wh1TsW9cKs6T5GhAJsMcgg13Z/zR2nXoUTDc?= =?us-ascii?Q?QDCrL5i/+hGkj7U6abtsY0TMkeEt+o+FBMYtH3NJx/ZSsG5W9zogB9FPPrwQ?= =?us-ascii?Q?etl4nVyQzEo7KAIIglcjKMlYuSMpR1xg460CU4lx4c5OHuEdeeCHa6ep+rhl?= =?us-ascii?Q?MaTSeVRaXkTbqYtIN7ZP6M0hvr5Rp7TPY4c1UO8qmWvQ7OQxJ7bEE1zbum5c?= =?us-ascii?Q?19I54nkvcGjomI/rhLhZiA9jEDSC4kXwYnD5vDkf6V3m/qcRXTWrMAfjlQVx?= =?us-ascii?Q?lYbcMYovmKq5cG6XIQ/N4XRBK/hTptCJ2sfyzt6fojYJ1fi/bcDluZE6vNa8?= =?us-ascii?Q?vEShDe8hu7zRWo55HBkoyPg8lDuTxy4o7stGzxGQ9hOTHsNw2+GW0BomoVNo?= =?us-ascii?Q?WrOfFQJkHlxYcn/JVP2gjtg30MzJnacuVGIx5pz5hR8wrrgVhGzKQi6UCO7g?= =?us-ascii?Q?MWbE6QkwKYGEXVdpwe614n+WC/xPsPUb13jd8fVS/CT4bqG/QRa5GXCVWDYK?= =?us-ascii?Q?toEQ0sSYap6qUo5oeyei1rnM9uIW/8x2J+2JKB891QsuTeKJQD6HcZ5gDuIU?= =?us-ascii?Q?55dDwYbTDDqeiH3JV0SvbbZrAQKqPuPEFPv1XOCUF+i8nlHDhE4vuNChZ8VT?= =?us-ascii?Q?60O+Mn92yYRw1DcMXP7bmNiJl4q109nShkJIx+1yeyEGu0tUxEpPk5BLke5K?= =?us-ascii?Q?Daj0WAf+WNZ3VXNShK/SLNV2FgwosTcb0gA+9kGcuox4jjlZkSC17ATtzQzT?= =?us-ascii?Q?B5IWhDvxWcUcPvuPNDbRXASiBM+HLB12P9J?= X-Microsoft-Exchange-Diagnostics: 1;HK2PR06MB1697;6:XFnwgxDuSq80E1g/pAeCX064jYpBC5RN8BX/Gy7Zj4kxJ53M3Fhi+GBiL05BpW6Fu32Mz0zM9WFKtf2gen8DyniNNT2aEHklYS/1kgpJu2Y3Id7BHd8CmuAS5YBbHF3BhlS4uz3+Y8ZoK9J6L4dAFq6LsB9oA51kBvfYt1Qyd0POlU5/cQj5QBI3DYy1Wx3GGeelQOZ6UOf+tMnWKwcXqemmmnHzJiR65W65OMe+U/K6x4j5oS2ErRtENluCKvx2XFRsEt4FSqrDTh8CQR+nhTOcSI5lADye8o6Ie3yekvqeJMCpY0KkW5Le+iJ4lG5QNuMDDfu1b4R+tEEhGtw8wl5z25/V3ZVJH8A+BuPimqM=;5:YLVE6YxhBgM/p9jfhf9URbx4Vw0m+pWPwR4ywL1pGkyne71H2QMlPV6dkLkBYvEy8W+W0KqQarKfuJ5WuAxNdjrkhgleVxGi66duEL1Jhg2Q7tlgP1tgnPVAdmxsQJ4IIMgO32WTWMeD/tv8LJyOdA==;24:FLxhosOJTIC8TGWu+9NwRYn98qKcxThzBtIJXgqjOYRkQMzjonSSMXqHYo473ifn9sE+6PsBWWcnPvtlaqaasrPKf0h77MXsj+VlKS+v63o=;7:FzDENuhLKER0dQcH3MnIQTccaPzZ1XI599pYLqiZIIQGUp6WwUL8520DURiqJTAbQCDmhfXDsqe1pGqlm7WMa3Np7TAapPVbokzHow6/ZcADkH9XZDib09LfUxFL1E4VKit+Pj91tdBQEiB0yibOKTBjLh/YuSmfFI+nvbme6mvb0GONdCLl6IFjnyc+sRTYPM4Mj/JAaP0eT02EFyGcgaInedeIuVziGcnqLSCgEcqbXCvhVFvvkglsBqMgTyFCHrKYFhN566Lav1EOc1lpag== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HK2PR06MB1697;20:oP2YggviKUsbBOJm6mM3r/7Il2KoUCTgviyoZ2UXE9FDO+CEVJGLU/EQSUwJ8K2sM7N5UfOWogzHRrr+PO1+7w6lKhda0InU68odjRXjS5bvsD3OoaVrVdZktjoktUZIYRuhR6X2B/+weZa4CTVa564l7SNePd+Fd4g9Oz6LrhA= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jun 2016 00:36:50.6773 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HK2PR06MB1697 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Kuninori Morimoto OF graph indicates each devices connection. It already has for_each_endpoint_of_node() which is for-loop for each endpoint. But, some driver needs for-loop for each port[s], and for-loop for each endpoint in 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 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/of_graph.h | 28 ++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/drivers/of/base.c b/drivers/of/base.c index a085961..a39d483 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2249,6 +2249,68 @@ 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); +} + +/** * 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..c88b676 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,10 @@ 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 +92,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) -- 1.9.1