From patchwork Thu Aug 1 17:12:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Boyd X-Patchwork-Id: 11071053 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EAB4C14E5 for ; Thu, 1 Aug 2019 17:12:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D04AE2869F for ; Thu, 1 Aug 2019 17:12:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C4117286A7; Thu, 1 Aug 2019 17:12:12 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 19B4A2869F for ; Thu, 1 Aug 2019 17:12:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732377AbfHARML (ORCPT ); Thu, 1 Aug 2019 13:12:11 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:40880 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732295AbfHARML (ORCPT ); Thu, 1 Aug 2019 13:12:11 -0400 Received: by mail-pg1-f195.google.com with SMTP id w10so34560080pgj.7 for ; Thu, 01 Aug 2019 10:12:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=wcjmT1jOSVdsV93kLH8gtUAFCZgmRAp5z5U28nSu3es=; b=kHyJz+m7BmumSB/lXMmIWdSeNfe0tZwSsJVXm23HuBNojk088JpKyAFkU3Zv01EKO4 ieGUBag0hyqYjHxfBVqXUkpXPZfwkmAqjlgcwQCp2KRu6T8v+Y5MURo7X+LJVfw8IQEc TleAaC303hHw5NzUk7alhSbmDoS8QCe4uUWqM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=wcjmT1jOSVdsV93kLH8gtUAFCZgmRAp5z5U28nSu3es=; b=ePXpU36txAvLqNs8mgug9wFOiJG8qKIM9PepI2r8KvkhPw+8foAF5oK2jDGI8lp9h1 MJjbyzEgkMtyybtUShTVvPejSwclKgR3wDoSpoCijQZrF+SwnvDqNkJT1fSJflbvpzW8 mDiMTLz8sKHdg4XmYqVYviN5Blnc7chLY+9ddeovnYub8RKnqGvPzCeh1LqgoQjdLQ6S Yebl9N8H6V5fuj2UzxKXNTldqucSysZmYZipMRQHYNRQSCetWao8lw/fOtqlxg2pozru jP96u8qlmomrVjLRq4aBQtGgYroviBysx8kAxgEjVzPUSTIDt7XirMoCiF9Ja/KLrQBL 4Izw== X-Gm-Message-State: APjAAAUa0ZeAarOU28tQzp6OmOJKElpmqsOxAGGl9RVeOUOpuEWJ5Qyq 9J/ybGrKVLWACHcfCi69BBUNaQ== X-Google-Smtp-Source: APXvYqx1cQXEOiX/lyozSzHWzCxjT6GUENupJHLuvSbCfxgZdgdhtJmIjnRlQ01pJzKN5yfw7hOLuw== X-Received: by 2002:a17:90b:f0f:: with SMTP id br15mr9940132pjb.101.1564679530629; Thu, 01 Aug 2019 10:12:10 -0700 (PDT) Received: from smtp.gmail.com ([2620:15c:202:1:fa53:7765:582b:82b9]) by smtp.gmail.com with ESMTPSA id y22sm83985492pfo.39.2019.08.01.10.12.09 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 01 Aug 2019 10:12:10 -0700 (PDT) From: Stephen Boyd X-Google-Original-From: Stephen Boyd To: Michael Turquette , Stephen Boyd Cc: linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, Taniya Das , Jerome Brunet , Chen-Yu Tsai Subject: [PATCH] clk: Fix falling back to legacy parent string matching Date: Thu, 1 Aug 2019 10:12:09 -0700 Message-Id: <20190801171209.234546-1-sboyd@kernel.org> X-Mailer: git-send-email 2.22.0.709.g102302147b-goog MIME-Version: 1.0 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Calls to clk_core_get() will return ERR_PTR(-EINVAL) if we've started migrating a clk driver to use the DT based style of specifying parents but we haven't made any DT updates yet. This happens when we pass a non-NULL value as the 'name' argument of of_parse_clkspec(). That function returns -EINVAL in such a situation, instead of -ENOENT like we expected. The return value comes back up to clk_core_fill_parent_index() which proceeds to skip calling clk_core_lookup() because the error pointer isn't equal to -ENOENT, it's -EINVAL. Furthermore, we'll blindly overwrite the error pointer returned by clk_core_get() with NULL when there isn't a legacy .name member specified in the parent map. This isn't too bad right now because we don't really care to differentiate NULL from an error, but in the future we should only try to do a legacy lookup if we know we might find something so that DT lookups that fail don't try to lookup based on strings when there isn't any string to match, hiding the error. Fix both these problems so that clk provider drivers can use the new style of parent mapping without having to also update their DT at the same time. This patch is based on an earlier patch from Taniya Das which checked for -EINVAL in addition to -ENOENT return values. Fixes: 601b6e93304a ("clk: Allow parents to be specified via clkspec index") Cc: Taniya Das Cc: Jerome Brunet Cc: Chen-Yu Tsai Reported-by: Taniya Das Signed-off-by: Stephen Boyd --- drivers/clk/clk.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index c0990703ce54..6587a70c271c 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -355,8 +355,9 @@ static struct clk_core *clk_core_lookup(const char *name) * }; * * Returns: -ENOENT when the provider can't be found or the clk doesn't - * exist in the provider. -EINVAL when the name can't be found. NULL when the - * provider knows about the clk but it isn't provided on this system. + * exist in the provider or the name can't be found in the DT node or + * in a clkdev lookup. NULL when the provider knows about the clk but it + * isn't provided on this system. * A valid clk_core pointer when the clk can be found in the provider. */ static struct clk_core *clk_core_get(struct clk_core *core, u8 p_index) @@ -374,9 +375,9 @@ static struct clk_core *clk_core_get(struct clk_core *core, u8 p_index) /* * If the DT search above couldn't find the provider or the provider * didn't know about this clk, fallback to looking up via clkdev based - * clk_lookups + * clk_lookups. */ - if (PTR_ERR(hw) == -ENOENT && name) + if (IS_ERR(hw) && name) hw = clk_find_hw(dev_id, name); if (IS_ERR(hw)) @@ -401,7 +402,7 @@ static void clk_core_fill_parent_index(struct clk_core *core, u8 index) parent = ERR_PTR(-EPROBE_DEFER); } else { parent = clk_core_get(core, index); - if (IS_ERR(parent) && PTR_ERR(parent) == -ENOENT) + if (IS_ERR(parent) && entry->name) parent = clk_core_lookup(entry->name); }