From patchwork Thu May 3 22:55:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 908342 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="iNxWDVEr"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40cVrg4m0Rz9s2t for ; Fri, 4 May 2018 08:56:51 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751443AbeECW4n (ORCPT ); Thu, 3 May 2018 18:56:43 -0400 Received: from mail-lf0-f67.google.com ([209.85.215.67]:41363 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751404AbeECW4U (ORCPT ); Thu, 3 May 2018 18:56:20 -0400 Received: by mail-lf0-f67.google.com with SMTP id o123-v6so28299493lfe.8; Thu, 03 May 2018 15:56:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Evje7YaK8dK+toihbPtICR2AoZDZE//cJAHLsBBaCmU=; b=iNxWDVErplRELWVtRhJJ3CyWk3eTlcWr62vlW6zIMLjKv7at8sDQR3Lp0UzLsRR72P ud4p50UbeWCQKVlKLsNhSSSlOSqGfMl9aAdDT+2vLRbYFFKApa16CHRAGTDN327o8Mjg b3W92308hCaKRm6sMjItx+q6VtkUYtQ1zGPyPdo4edRu2ZTMk8QriAIIdHQCEPegeWhG 3DQETqdYnexVKwDNnQeKy7Kt6bPtLE+eMddoenbLfCQSQvAeXoE21HvbuTFEkRTiSYnu LO4OLwovMu5wukCzfFa8xjQadDgwaqz2MbxgwwCDaAshjWpq+zJHjiDrwVHK4L0rBRQP BU6w== 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:in-reply-to :references; bh=Evje7YaK8dK+toihbPtICR2AoZDZE//cJAHLsBBaCmU=; b=FgNioMm8QrihHEp66125a6fag/GOvaD3Y+8qGarJbLOZgRfVc3rkdMMnwlfZuPz/fG 8LYzXV7WU5oif0oHV34j5l2txVawvrFQJnBgox61/gHAnOmfX1JZmW//eUxj4Bbdjjlm x459NLjYoAmkJcN/1YJNm1We/bPYxg58Qb6XhmjoD7oZYTcJmI1WYunDU41zStegu2/l 5p3oWkiZmaJrbzvya1Xr/pTw90yDpLlE5TotVT1SbdwOBKbWMnafklKOmd/WXmSzBmyJ otti3wW8CjCXxFfqbu4gxSKLgPGR0GbgODxjEEC6BArn8nS7ubLTfGmX2EksdhZJbJ/h PqLQ== X-Gm-Message-State: ALQs6tBXZVGKTZHaB5XjrDvXQ96TyImxp3LbcQ5ruYlQob5f7JvOfju9 BGcvajUFRVZSJCsMkF/P7P0= X-Google-Smtp-Source: AB8JxZrcFeh3We+yeiPo3Ko7AzCSpaRTSM/3aN75AOXSF1pVFrT1gKAo1C8b7wutA/SSF1qetswAxw== X-Received: by 2002:a19:d853:: with SMTP id p80-v6mr2727198lfg.36.1525388178974; Thu, 03 May 2018 15:56:18 -0700 (PDT) Received: from localhost.localdomain (ppp109-252-91-130.pppoe.spdop.ru. [109.252.91.130]) by smtp.gmail.com with ESMTPSA id h20-v6sm2995858ljj.85.2018.05.03.15.56.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 May 2018 15:56:18 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Peter De Schrijver , Prashant Gaikwad , Stephen Boyd , Michael Turquette , Linus Walleij , Marcel Ziswiler , Marc Dietrich Cc: linux-clk@vger.kernel.org, linux-gpio@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/4] clk: tegra: Add quirk for getting CDEV1/2 clocks Date: Fri, 4 May 2018 01:55:36 +0300 Message-Id: <20180503225537.20748-5-digetx@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180503225537.20748-1-digetx@gmail.com> References: <20180503225537.20748-1-digetx@gmail.com> Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org CDEV1 and CDEV2 clocks are a bit special case, their parent clock is created by the pinctrl driver. It should be possible for clk user to request these clocks before pinctrl driver got probed and hence user will get an orphaned clock. That might be undesirable because user expects parent clock to be enabled by the child, so let's return EPROBE_DEFER until parent clock appear. Signed-off-by: Dmitry Osipenko --- drivers/clk/tegra/clk.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/clk/tegra/clk.c b/drivers/clk/tegra/clk.c index ba923f0d5953..04cbe7e9eff3 100644 --- a/drivers/clk/tegra/clk.c +++ b/drivers/clk/tegra/clk.c @@ -298,6 +298,38 @@ static struct reset_controller_dev rst_ctlr = { .of_reset_n_cells = 1, }; +static struct clk *tegra_of_clk_src_onecell_get(struct of_phandle_args *clkspec, + void *data) +{ + struct clk_hw *parent_hw; + struct clk_hw *hw; + struct clk *clk; + const char *name; + + clk = of_clk_src_onecell_get(clkspec, data); + if (IS_ERR(clk)) + return clk; + + name = __clk_get_name(clk); + + /* + * Tegra20 CDEV1 and CDEV2 clocks are a bit special case, their parent + * clock is created by the pinctrl driver. It is possible for clk user + * to request these clocks before pinctrl driver got probed and hence + * user will get an orphaned clock. That might be undesirable because + * user may expect parent clock to be enabled by the child. + */ + if (!strcmp(name, "cdev1") || !strcmp(name, "cdev2")) { + hw = __clk_get_hw(clk); + + parent_hw = clk_hw_get_parent(hw); + if (!parent_hw) + return ERR_PTR(-EPROBE_DEFER); + } + + return clk; +} + void __init tegra_add_of_provider(struct device_node *np) { int i; @@ -314,7 +346,7 @@ void __init tegra_add_of_provider(struct device_node *np) clk_data.clks = clks; clk_data.clk_num = clk_num; - of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); + of_clk_add_provider(np, tegra_of_clk_src_onecell_get, &clk_data); rst_ctlr.of_node = np; rst_ctlr.nr_resets = periph_banks * 32 + num_special_reset;