Received: by 10.223.176.5 with SMTP id f5csp3140905wra; Thu, 1 Feb 2018 11:25:13 -0800 (PST) X-Google-Smtp-Source: AH8x2244ADaQXEW9erYXb+QjR38y5ENOQrT+wYbPLR4o0f+scAGsFPPTPnAN3QLCnLUlp/Lk+AI8 X-Received: by 2002:a17:902:a9cb:: with SMTP id b11-v6mr12747837plr.315.1517513113860; Thu, 01 Feb 2018 11:25:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517513113; cv=none; d=google.com; s=arc-20160816; b=Gsnh3wJl61AEb4PcLsrfjPjHfFFGAF+dsP8rXBIwTXxOImbSEaoqeJqfehnuAH1B8K bewBCn4JYmi6IG0jzKW0QZcEyFcYnpy2AMpqZHGEHoHSGQcenL9HMttd7Ve22+ITJciY 5x7jnfUZQTFNtw7xaauzFD0E4T2Y/t7BTC7pemQkgS6KL4bF3je9dlZXa0wZtcdvJr6+ h8Le5UM6pYBhBQJbdPBq9XmV5Y38a99LlYjRHv5BMKIRTwuXOF0uGoKS0KOGVBAS242o oagaUVkY7n0l+yxtJLT7QTKQyQi5EqxHpMwlNnN1MniHxcBZTeegnW0l7/Y0lBDoIDGz 308Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :arc-authentication-results; bh=NBpB7dzE12kI1gaM2VGCzYpikVsXNtcDycMuXltd2Bk=; b=XV93tHBC0oUnOA6zJm5ls52xVk3ELJGLV8Npe77yOlh3saT08SXHJvafWnmqq6fvUT OKLINnHsYFH1Zd5JOo/rl+jnZCfPa+ADEdoGSpxO9XNP2ZjTEV21G6WlPxksWPhjI3mV fBC9fKn8HzEnNRFbdNp/HygeKQTZ+1ax3/AsiNgYO9XEqkpLuPqmavu2FgewFCyK1QIb BXYrhFGtZ5bVoF0Gk5zGLHB7C0PpzB474/9Y/fNP8xMvmBr+tLRh1+2V2efcm96ptYIy YvkuFyscaznEUuVpf2rIEqb3F1+XmlJzIaQIYAG21z/Kxho0cxVfknSew1O51B4OGjMm UAuA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@lechnology.com header.s=default header.b=p7mGhDgI; 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 k123si131829pgc.761.2018.02.01.11.24.57; Thu, 01 Feb 2018 11:25:13 -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=fail header.i=@lechnology.com header.s=default header.b=p7mGhDgI; 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 S1754657AbeBATWY (ORCPT + 99 others); Thu, 1 Feb 2018 14:22:24 -0500 Received: from vern.gendns.com ([206.190.152.46]:53960 "EHLO vern.gendns.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753129AbeBATWR (ORCPT ); Thu, 1 Feb 2018 14:22:17 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lechnology.com; s=default; h=Content-Transfer-Encoding:Content-Type: In-Reply-To:MIME-Version:Date:Message-ID:From:References:Cc:To:Subject:Sender :Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=NBpB7dzE12kI1gaM2VGCzYpikVsXNtcDycMuXltd2Bk=; b=p7mGhDgIhQOXEeg4QQX1WPh+ZF i+6DfoQuV+HEx5IT8R3JcNHlzUx+P/QuPoIQaf751yjCFHJBodswzkpMhnTTmUrNsRe6DZToiYZv+ 6CpB5pygVIU5F0DDjw1tFEksedF87/RwaiIh/RVWmRvB5usCt3AoQ9RO4Zjlh/dkgCrcWmjZOVqtR 3tDj/K8XRxFJyYSc/9dBzLvp7GwoeJPVdhdw5xuJIQyiGZhP8+2o65w9EI2rG8R0fgwANTurl5jCC TnqQ/wpEnV5Ojm0iOC156nLqJ7BYm7xJtIAMTwCae8Jlapdj30zRTG1D+B97lzfWycK1SkoJru5qN 9pDEnltw==; Received: from 108-198-5-147.lightspeed.okcbok.sbcglobal.net ([108.198.5.147]:46798 helo=[192.168.0.134]) by vern.gendns.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.89_1) (envelope-from ) id 1ehKQJ-002JXq-0r; Thu, 01 Feb 2018 14:21:27 -0500 Subject: Re: [PATCH v6 04/41] clk: davinci: Add platform information for TI DA850 PLL To: linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Michael Turquette , Stephen Boyd , Rob Herring , Mark Rutland , Sekhar Nori , Kevin Hilman , Bartosz Golaszewski , Adam Ford , linux-kernel@vger.kernel.org References: <1516468460-4908-1-git-send-email-david@lechnology.com> <1516468460-4908-5-git-send-email-david@lechnology.com> From: David Lechner Message-ID: <7d7e0522-30d5-6232-853e-7ab32fadfe48@lechnology.com> Date: Thu, 1 Feb 2018 13:22:18 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <1516468460-4908-5-git-send-email-david@lechnology.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vern.gendns.com X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lechnology.com X-Get-Message-Sender-Via: vern.gendns.com: authenticated_id: davidmain+lechnology.com/only user confirmed/virtual account not confirmed X-Authenticated-Sender: vern.gendns.com: davidmain@lechnology.com X-Source: X-Source-Args: X-Source-Dir: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/20/2018 11:13 AM, David Lechner wrote: > This adds platform-specific declarations for the PLL clocks on TI DA850/ > OMAP-L138/AM18XX SoCs. > > Signed-off-by: David Lechner > --- > > v6 changes: > - Added da850_pll{0,1}_info with controller-specific information > - Added OBSCLK data > - Add empty lines between function calls > > drivers/clk/davinci/Makefile | 1 + > drivers/clk/davinci/pll-da850.c | 163 ++++++++++++++++++++++++++++++++++++++++ > include/linux/clk/davinci.h | 1 + > 3 files changed, 165 insertions(+) > create mode 100644 drivers/clk/davinci/pll-da850.c > > diff --git a/drivers/clk/davinci/Makefile b/drivers/clk/davinci/Makefile > index 9061e19..13049d4 100644 > --- a/drivers/clk/davinci/Makefile > +++ b/drivers/clk/davinci/Makefile > @@ -3,4 +3,5 @@ > ifeq ($(CONFIG_COMMON_CLK), y) > obj-y += pll.o > obj-$(CONFIG_ARCH_DAVINCI_DA830) += pll-da830.o > +obj-$(CONFIG_ARCH_DAVINCI_DA850) += pll-da850.o > endif > diff --git a/drivers/clk/davinci/pll-da850.c b/drivers/clk/davinci/pll-da850.c > new file mode 100644 > index 0000000..a94e1a6 > --- /dev/null > +++ b/drivers/clk/davinci/pll-da850.c > @@ -0,0 +1,163 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * PLL clock descriptions for TI DA850/OMAP-L138/AM18XX > + * > + * Copyright (C) 2018 David Lechner > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "pll.h" > + > +#define OCSEL_OCSRC_OSCIN 0x14 > +#define OCSEL_OCSRC_PLL0_SYSCLK(n) (0x16 + (n)) > +#define OCSEL_OCSRC_PLL1_OBSCLK 0x1e > +#define OCSEL_OCSRC_PLL1_SYSCLK(n) (0x16 + (n)) > + > +static const struct davinci_pll_clk_info da850_pll0_info __initconst = { > + .name = "pll0", > + .unlock_reg = CFGCHIP(0), > + .unlock_mask = CFGCHIP0_PLL_MASTER_LOCK, > + .pllm_mask = GENMASK(4, 0), > + .pllm_min = 4, > + .pllm_max = 32, > + .pllout_min_rate = 300000000, > + .pllout_max_rate = 600000000, > + .flags = PLL_HAS_OSCIN | PLL_HAS_PREDIV | PLL_HAS_POSTDIV | > + PLL_HAS_EXTCLKSRC, > +}; > + > +/* > + * NB: Technically, the clocks flagged as SYSCLK_FIXED_DIV are "fixed ratio", > + * meaning that we could change the divider as long as we keep the correct > + * ratio between all of the clocks, but we don't support that because there is > + * currently not a need for it. > + */ > + > +static const struct davinci_pll_sysclk_info da850_pll0_sysclk_info[] __initconst = { > + SYSCLK(1, pll0_sysclk1, pll0_pllen, 5, SYSCLK_FIXED_DIV), > + SYSCLK(2, pll0_sysclk2, pll0_pllen, 5, SYSCLK_FIXED_DIV), > + SYSCLK(3, pll0_sysclk3, pll0_pllen, 5, 0), > + SYSCLK(4, pll0_sysclk4, pll0_pllen, 5, SYSCLK_FIXED_DIV), > + SYSCLK(5, pll0_sysclk5, pll0_pllen, 5, 0), > + SYSCLK(6, pll0_sysclk6, pll0_pllen, 5, SYSCLK_ARM_RATE | SYSCLK_FIXED_DIV), > + SYSCLK(7, pll0_sysclk7, pll0_pllen, 5, 0), > + { } > +}; > + > +static const char * const da850_pll0_obsclk_parent_names[] __initconst = { > + "oscin", > + "pll0_sysclk1", > + "pll0_sysclk2", > + "pll0_sysclk3", > + "pll0_sysclk4", > + "pll0_sysclk5", > + "pll0_sysclk6", > + "pll0_sysclk7", > + "pll1_obsclk", > +}; > + > +static u32 da850_pll0_obsclk_table[] = { > + OCSEL_OCSRC_OSCIN, > + OCSEL_OCSRC_PLL0_SYSCLK(1), > + OCSEL_OCSRC_PLL0_SYSCLK(2), > + OCSEL_OCSRC_PLL0_SYSCLK(3), > + OCSEL_OCSRC_PLL0_SYSCLK(4), > + OCSEL_OCSRC_PLL0_SYSCLK(5), > + OCSEL_OCSRC_PLL0_SYSCLK(6), > + OCSEL_OCSRC_PLL0_SYSCLK(7), > + OCSEL_OCSRC_PLL1_OBSCLK, > +}; > + > +static const struct davinci_pll_obsclk_info da850_pll0_obsclk_info __initconst = { > + .name = "pll0_obsclk", > + .parent_names = da850_pll0_obsclk_parent_names, > + .num_parents = ARRAY_SIZE(da850_pll0_obsclk_parent_names), > + .table = da850_pll0_obsclk_table, > + .ocsrc_mask = GENMASK(4, 0), > +}; > + > +static const struct davinci_pll_clk_info da850_pll1_info __initconst = { > + .name = "pll1", > + .unlock_reg = CFGCHIP(3), > + .unlock_mask = CFGCHIP3_PLL1_MASTER_LOCK, > + .pllm_mask = GENMASK(4, 0), > + .pllm_min = 4, > + .pllm_max = 32, > + .pllout_min_rate = 300000000, > + .pllout_max_rate = 600000000, > + .flags = PLL_HAS_POSTDIV, > +}; > + > +static const struct davinci_pll_sysclk_info da850_pll1_sysclk_info[] __initconst = { > + SYSCLK(1, pll1_sysclk1, pll1_pllen, 5, SYSCLK_ALWAYS_ENABLED), > + SYSCLK(2, pll1_sysclk2, pll1_pllen, 5, 0), > + SYSCLK(3, pll1_sysclk3, pll1_pllen, 5, 0), > + { } > +}; > + > +static const char * const da850_pll1_obsclk_parent_names[] __initconst = { > + "oscin", Re: the issue of "ref_clk" vs. "oscin"... This is one of the places where having the otherwise unnecessary "oscin" clock really helps out. The PLL driver doesn't control "ref_clk" - it comes from somewhere else. And in the case of DT, it may not even be named "ref_clk", so we really don't want to hard-code the name "ref_clk" here. If we have to allow a variable name here, it just makes more work in the driver shuffling names around. And the name "oscin" totally makes sense here because the TRM lists this input to the mux as "OSCIN". > + "pll1_sysclk1", > + "pll1_sysclk2", > + "pll1_sysclk3", > +}; > + > +static u32 da850_pll1_obsclk_table[] = { > + OCSEL_OCSRC_OSCIN, > + OCSEL_OCSRC_PLL1_SYSCLK(1), > + OCSEL_OCSRC_PLL1_SYSCLK(2), > + OCSEL_OCSRC_PLL1_SYSCLK(3), > +}; > + > +static const struct davinci_pll_obsclk_info da850_pll1_obsclk_info __initconst = { > + .name = "pll1_obsclk", > + .parent_names = da850_pll1_obsclk_parent_names, > + .num_parents = ARRAY_SIZE(da850_pll1_obsclk_parent_names), > + .table = da850_pll1_obsclk_table, > + .ocsrc_mask = GENMASK(4, 0), > +}; > + > +void __init da850_pll_clk_init(void __iomem *pll0, void __iomem *pll1) > +{ > + const struct davinci_pll_sysclk_info *info; > + > + davinci_pll_clk_register(&da850_pll0_info, "ref_clk", pll0); And really, we probably shouldn't be hard-coding "ref_clk" here either. Basically, we are making the assumption that the board file has registered a clock named "ref_clk". It would probably be better to pass the name as a parameter. > + > + davinci_pll_auxclk_register("pll0_auxclk", pll0); > + > + for (info = da850_pll0_sysclk_info; info->name; info++) > + davinci_pll_sysclk_register(info, pll0); > + > + davinci_pll_obsclk_register(&da850_pll0_obsclk_info, pll0); > + > + davinci_pll_clk_register(&da850_pll1_info, "oscin", pll1); > + > + for (info = da850_pll1_sysclk_info; info->name; info++) > + davinci_pll_sysclk_register(info, pll1); > + > + davinci_pll_obsclk_register(&da850_pll1_obsclk_info, pll1); > +} > + > +#ifdef CONFIG_OF > +static void __init of_da850_pll0_auxclk_init(struct device_node *node) > +{ > + of_davinci_pll_init(node, &da850_pll0_info, &da850_pll0_obsclk_info, > + da850_pll0_sysclk_info, 7); > +} > +CLK_OF_DECLARE(da850_pll0_auxclk, "ti,da850-pll0", of_da850_pll0_auxclk_init); > + > +static void __init of_da850_pll1_auxclk_init(struct device_node *node) > +{ > + of_davinci_pll_init(node, &da850_pll1_info, &da850_pll1_obsclk_info, > + da850_pll1_sysclk_info, 3); > +} > +CLK_OF_DECLARE(da850_pll1_auxclk, "ti,da850-pll1", of_da850_pll1_auxclk_init); > +#endif > diff --git a/include/linux/clk/davinci.h b/include/linux/clk/davinci.h > index 4f4d60d..7b08fe0 100644 > --- a/include/linux/clk/davinci.h > +++ b/include/linux/clk/davinci.h > @@ -10,5 +10,6 @@ > #include > > void da830_pll_clk_init(void __iomem *pll); > +void da850_pll_clk_init(void __iomem *pll0, void __iomem *pll1); > > #endif /* __LINUX_CLK_DAVINCI_H__ */ >