From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751596AbdKKPkW (ORCPT ); Sat, 11 Nov 2017 10:40:22 -0500 Received: from mail-lf0-f68.google.com ([209.85.215.68]:52320 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751306AbdKKPkS (ORCPT ); Sat, 11 Nov 2017 10:40:18 -0500 X-Google-Smtp-Source: AGs4zMZftbietNxWflG9tdjfwLurcvpRjEM4ONZn9S6jrb+a1k4LiW3V18atNgzqlQyYq8MtTahq/Q== From: Johan Hovold To: Tony Lindgren Cc: Lee Jones , linux-omap@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , stable , Peter Ujfalusi , Samuel Ortiz Subject: [PATCH 2/2] mfd: twl6040: fix child-node lookup Date: Sat, 11 Nov 2017 16:38:44 +0100 Message-Id: <20171111153844.16741-2-johan@kernel.org> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20171111153844.16741-1-johan@kernel.org> References: <20171111153844.16741-1-johan@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fix child-node lookup during probe, which ended up searching the whole device tree depth-first starting at the parent rather than just matching on its children. To make things worse, the parent node was prematurely freed, while the child node was leaked. Note that the CONFIG_OF compile guard can be removed as of_get_child_by_name() provides a !CONFIG_OF implementation which always fails. Fixes: 37e13cecaa14 ("mfd: Add support for Device Tree to twl6040") Fixes: ca2cad6ae38e ("mfd: Fix twl6040 build failure") Cc: stable # 3.5 Cc: Peter Ujfalusi Cc: Samuel Ortiz --- drivers/mfd/twl6040.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/mfd/twl6040.c b/drivers/mfd/twl6040.c index d66502d36ba0..dd19f17a1b63 100644 --- a/drivers/mfd/twl6040.c +++ b/drivers/mfd/twl6040.c @@ -97,12 +97,16 @@ static struct reg_sequence twl6040_patch[] = { }; -static bool twl6040_has_vibra(struct device_node *node) +static bool twl6040_has_vibra(struct device_node *parent) { -#ifdef CONFIG_OF - if (of_find_node_by_name(node, "vibra")) + struct device_node *node; + + node = of_get_child_by_name(parent, "vibra"); + if (node) { + of_node_put(node); return true; -#endif + } + return false; } -- 2.15.0