Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp6460061imu; Wed, 14 Nov 2018 01:41:00 -0800 (PST) X-Google-Smtp-Source: AJdET5dTdCfoJSlbSjmIpvPZO0sv6EBp1kGiOGBMtXfBaOFbPS0vHzdj2Ma8stxwmSTQE+1tr6Wy X-Received: by 2002:a63:c746:: with SMTP id v6-v6mr1127443pgg.108.1542188460557; Wed, 14 Nov 2018 01:41:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542188460; cv=none; d=google.com; s=arc-20160816; b=KUAi17Cg1GETJpsbY4grTsbEylPtjp9j5sQ9jIcuMg5Op9u9wJgjbPp8ROu77M82k+ tM7pxSepnD4XL5Hi9c1NddGY2L35OnLaIhsVafYWTRdMrnCtGI7EQ8J4+4breVGx7ZhP le8xmzHLd64tt0K0XY0mD0mkabLL/mvKh1W9OzEzowe3HRGNDOjgn5GntemYQK/SUhyo Rog5FTkchVON3POK6ptvVniBUE03+2BSmvn5FwRz0C7bfUiPsoccVo7fzhrCbVO7OhhP x5UHolRqwYmP6cBlnKBrhYOmrb3EsMUkLxYWfcAsntuT1OQ5yAaS+Fq3LCGJqZlTc12Y lvTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=FLK1WoeXSqfG8XLqhL+Znss5msT8TGnbCCGJEZJBdPI=; b=C/S6af5Nk7Pd064IFRk2tEL6hiKMauV4+mJXSrbYlH+m41VxurFlHGZEaiLeByJ+Xl XiIIRavVIzpgeuOpCg3tZGaHYfN1aiai0PfQuA8avkjE1XqJvakXUioHFoQjr5wJEdXr nY5NHsA8SMzMarp4xSbT2WoSnvG6hgDbxfGmmkhBSMKpEzmjhP3/MHg5iklsponov4VH EXCQEBRasaRIvTWvsqTN5ji9vED8UaGKkRofDW/gu7onLt+aKW7CPbTvDU2sgyc3MpVg NgcPvf0cAbvI2+IOAreCf9lKpAzfJBO3xbUXCd+gmagj+H7GUE11wfZnLCkg4LcVzk5g 2Vrg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@163.com header.s=s110527 header.b=PUZQHqwS; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y8si2569097pfn.26.2018.11.14.01.40.45; Wed, 14 Nov 2018 01:41:00 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@163.com header.s=s110527 header.b=PUZQHqwS; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732542AbeKNTlC (ORCPT + 99 others); Wed, 14 Nov 2018 14:41:02 -0500 Received: from m50-138.163.com ([123.125.50.138]:49130 "EHLO m50-138.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727558AbeKNTlC (ORCPT ); Wed, 14 Nov 2018 14:41:02 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id; bh=FLK1WoeXSqfG8XLqhL +Znss5msT8TGnbCCGJEZJBdPI=; b=PUZQHqwSybimpFp8FRsFgBdZPK30EC+pV+ 7JCAl2ptjIxqhPQ0kg5/N/8ysat4LyLF5ZJi5roq4v3OKZHZkYhJ+L0Z//YUJfZr mN/VHVV04LkZptOdOLYL2X502bo53K3QRwEPhj8NG6qlUavYnH0YXWDKpcv06Ymy p6KyZZd7c= Received: from localhost.localdomain (unknown [221.0.93.75]) by smtp1 (Coremail) with SMTP id C9GowACHWQ0Q7etbTScIAA--.2807S2; Wed, 14 Nov 2018 17:38:28 +0800 (CST) From: zoro To: broonie@kernel.org Cc: lgirdwood@gmail.com, linux-kernel@vger.kernel.org, zoro Subject: [PATCH] regulator/of_get_regulator: add child path to find the regulator supplier Date: Wed, 14 Nov 2018 17:38:22 +0800 Message-Id: <1542188302-9956-1-git-send-email-long17.cool@163.com> X-Mailer: git-send-email 1.7.9.5 X-CM-TRANSID: C9GowACHWQ0Q7etbTScIAA--.2807S2 X-Coremail-Antispam: 1Uf129KBjvJXoW7uw45Jw1UJFy8XF4ftr15XFb_yoW8Kw1kpr 4DWF9xCr4F9a4xuw4Syr12ya4Ygrn5Ca97AryrGw4fC3s5JF93Jr1UAF1Yv3Z5Jr4kGw42 yrW8AF1xCF15XFJanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07UTCJdUUUUU= X-Originating-IP: [221.0.93.75] X-CM-SenderInfo: 5orqwi2xof00ro6rljoofrz/1tbi8BX+F1uoQY48zgAAsC Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org when the VIR_LDO1 regulator supplier is it's brother, we can't find the supplier. example code : &vir_regulator { ldo0_vir: ldo0-virtual { regulator-compatible = "VIR_LDO0"; regulator-name= "VIR_LDO0"; regulator-min-microvolt = <1000000>; regulator-max-microvolt = <2000000>; }; ldo1_vir: ldo1-virtual { regulator-compatible = "VIR_LDO1"; regulator-name= "VIR_LDO1"; regulator-min-microvolt = <1000000>; regulator-max-microvolt = <3000000>; ldo1-supply = <&ldo0_vir>; }; ... } so we add the child ptah to find the suppier. Signed-off-by: zoro --- drivers/regulator/core.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 2c66b52..5520726 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -228,6 +228,37 @@ static void regulator_unlock_supply(struct regulator_dev *rdev) } /** + * of_get_child_regulator - get a child regulator device node + * based on supply name + * @parent: Parent device node + * @prop_name: Combination regulator supply name and "-supply" + * + * Traverse all child nodes. + * Extract the child regulator device node corresponding to the supply name. + * returns the device node corresponding to the regulator if found, else + * returns NULL. + */ +static struct device_node *of_get_child_regulator(struct device_node *parent, + const char *prop_name) +{ + struct device_node *regnode = NULL; + struct device_node *child = NULL; + + for_each_child_of_node(parent, child) { + regnode = of_parse_phandle(child, prop_name, 0); + + if (!regnode) { + regnode = of_get_child_regulator(child, prop_name); + if (regnode) + return regnode; + } else { + return regnode; + } + } + return NULL; +} + +/** * of_get_regulator - get a regulator device node based on supply name * @dev: Device pointer for the consumer (of regulator) device * @supply: regulator supply name @@ -247,6 +278,10 @@ static struct device_node *of_get_regulator(struct device *dev, const char *supp regnode = of_parse_phandle(dev->of_node, prop_name, 0); if (!regnode) { + regnode = of_get_child_regulator(dev->of_node, prop_name); + if (regnode) + return regnode; + dev_dbg(dev, "Looking up %s property in node %pOF failed\n", prop_name, dev->of_node); return NULL; -- 1.7.9.5