From patchwork Sat Jan 16 18:32:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Tomar X-Patchwork-Id: 1427542 X-Patchwork-Delegate: andre.przywara@arm.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=E5pZGP5Y; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DJ6Bb6Nxlz9sVn for ; Sun, 17 Jan 2021 05:33:43 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 20EB182970; Sat, 16 Jan 2021 19:33:25 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="E5pZGP5Y"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 20CF382966; Sat, 16 Jan 2021 19:33:21 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id CEA3F82953 for ; Sat, 16 Jan 2021 19:33:16 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=atomar25opensource@gmail.com Received: by mail-pj1-x1030.google.com with SMTP id ce17so4742161pjb.5 for ; Sat, 16 Jan 2021 10:33:16 -0800 (PST) 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=1M6H38CMJV9EJ+ABo2QD3Z8ypPZBn+OfAHIbvymd/2M=; b=E5pZGP5YYFcclioTpmgLTbA4syR5c7ZVE29TIwaGMsPZlDG6JKzRSv4Qgm4FySodye W3Juufyk1rjKiMM1bQyjFXgAM3Lo1IOtKez8NgLZJKWV2J5dmdJsUHmtXBVlODAQxkEJ MoZhRtDdkRA09fxM5zeTRRjFMSwlT1Yh+tF4MIWgnQtmQzemiTgyMDVV1XJicsBQ+nPO tcU/c2EK9iscuSzbnWZ4qR4apYRPVEjN5/L/ycS9RVlMTrzVtBgE2lcz7an8D5meak3p PFTxcHYEH7w098sxp1+59G+ubdV5mwgbsVjc2jPLtpDksLDvp7YyL2wU3RSh8V4ZQ1H3 WV4w== 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=1M6H38CMJV9EJ+ABo2QD3Z8ypPZBn+OfAHIbvymd/2M=; b=aBDJSZtlZ/mw8/3SLXGZ0w1h2XhNldwWF64Lz9nhThrzBxNZ2js3jJTn9wwqWAUAxs yTnV5joEg5A7I/qDW7EGCmuLM5+VvPDF8j8S+eyN2FYynxh6ePbn63ir/MwL+OYXdgG4 yqnbgd4YKP3I7vV1Hk6rEpg7AZJLqy4zwzc6GBdGxPzcyTvdvDjm6zPBUGzm4cAIAZB7 FIprP+TeM6YNtJtT3kbcAkWOT6QWNKY+dtIKFZLGMW3KFWQlqBRYNstV7N14Gspz2Owu vwEtMLMxdLlUsn7SbUC0Io7qo6bUNlyVnJPcUtuxT8d7Y0qBJO38bJlJGJ/FJvALBNBo F61g== X-Gm-Message-State: AOAM533yZN9oKwAzmu8AHu0+w4vtqMLEoTRoSllvl+PFYI/eqXc+SN2Y K1hpRS+m8ZrLzWHeHbo5wB0NMiXlSVWG X-Google-Smtp-Source: ABdhPJwoZF78LdRbt2x8nfQI4HRHkQxZlAS7Z1E7KOID+P5lM68YznRR6nX0mcLJw6Fr2B/exi+BKw== X-Received: by 2002:a17:90b:4905:: with SMTP id kr5mr4351227pjb.1.1610821994997; Sat, 16 Jan 2021 10:33:14 -0800 (PST) Received: from amit-ThinkPad-X230.domain.name ([106.215.49.66]) by smtp.gmail.com with ESMTPSA id c10sm11955629pfj.54.2021.01.16.10.33.11 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 16 Jan 2021 10:33:14 -0800 (PST) From: Amit Singh Tomar To: u-boot@lists.denx.de Cc: andre.przywara@arm.com, manivannan.sadhasivam@linaro.org, trini@konsulko.com, jh80.chung@samsung.com, peng.fan@nxp.com, Amit Singh Tomar Subject: [PATCH v3 2/6] clk: actions: Add SD/MMC clocks Date: Sun, 17 Jan 2021 00:02:15 +0530 Message-Id: <1610821939-20130-3-git-send-email-atomar25opensource@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1610821939-20130-1-git-send-email-atomar25opensource@gmail.com> References: <1610821939-20130-1-git-send-email-atomar25opensource@gmail.com> X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean From: Amit Singh Tomar This commit adds SD/MMC clocks, and provides .set/get_rate callbacks for SD/MMC device present on Actions OWL S700 SoCs. Signed-off-by: Amit Singh Tomar --- Changes since v2: * Fixed the not weird div assignment. * Moved the clock bit for SD from header file to driver file. * Removed "< 0" part while comparing unsigned. Changes since previous version: * Removed rate *= 2 as this just overclocks. * Separated the divide by 128 bit from divider value. * Provided the separate routine to get sd parent rate based on bit 9. * Removed unnecessary initialization. --- drivers/clk/owl/clk_owl.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/drivers/clk/owl/clk_owl.c b/drivers/clk/owl/clk_owl.c index 5be1b3b..34cee7d 100644 --- a/drivers/clk/owl/clk_owl.c +++ b/drivers/clk/owl/clk_owl.c @@ -20,6 +20,8 @@ #include #include +#define CMU_DEVCLKEN0_SD0 BIT(22) + void owl_clk_init(struct owl_clk_priv *priv) { u32 bus_clk = 0, core_pll, dev_pll; @@ -92,6 +94,9 @@ int owl_clk_enable(struct clk *clk) setbits_le32(priv->base + CMU_DEVCLKEN1, CMU_DEVCLKEN1_ETH); setbits_le32(priv->base + CMU_ETHERNETPLL, 5); break; + case CLK_SD0: + setbits_le32(priv->base + CMU_DEVCLKEN0, CMU_DEVCLKEN0_SD0); + break; default: return -EINVAL; } @@ -121,6 +126,9 @@ int owl_clk_disable(struct clk *clk) case CLK_ETHERNET: clrbits_le32(priv->base + CMU_DEVCLKEN1, CMU_DEVCLKEN1_ETH); break; + case CLK_SD0: + clrbits_le32(priv->base + CMU_DEVCLKEN0, CMU_DEVCLKEN0_SD0); + break; default: return -EINVAL; } @@ -128,11 +136,72 @@ int owl_clk_disable(struct clk *clk) return 0; } +static ulong get_sd_parent_rate(struct owl_clk_priv *priv, u32 dev_index) +{ + ulong rate; + u32 reg; + + reg = readl(priv->base + (CMU_SD0CLK + dev_index * 0x4)); + /* Clock output of DEV/NAND_PLL + * Range: 48M ~ 756M + * Frequency= PLLCLK * 6 + */ + if (reg & 0x200) + rate = readl(priv->base + CMU_NANDPLL) & 0x7f; + else + rate = readl(priv->base + CMU_DEVPLL) & 0x7f; + + rate *= 6000000; + + return rate; +} + +static ulong owl_get_sd_clk_rate(struct owl_clk_priv *priv, int sd_index) +{ + uint div, val; + ulong parent_rate = get_sd_parent_rate(priv, sd_index); + + val = readl(priv->base + (CMU_SD0CLK + sd_index * 0x4)); + div = (val & 0x1f) + 1; + + return (parent_rate / div); +} + +static ulong owl_set_sd_clk_rate(struct owl_clk_priv *priv, ulong rate, + int sd_index) +{ + uint div, val; + ulong parent_rate = get_sd_parent_rate(priv, sd_index); + + if (rate == 0) + return rate; + + div = (parent_rate / rate); + + val = readl(priv->base + (CMU_SD0CLK + sd_index * 0x4)); + /* Bits 4..0 is used to program div value and bit 8 to enable + * divide by 128 circuit + */ + val &= ~0x11f; + if (div >= 128) { + div = div / 128; + val |= 0x100; /* enable divide by 128 circuit */ + } + val |= ((div - 1) & 0x1f); + writel(val, priv->base + (CMU_SD0CLK + sd_index * 0x4)); + + return owl_get_sd_clk_rate(priv, 0); +} + static ulong owl_clk_get_rate(struct clk *clk) { + struct owl_clk_priv *priv = dev_get_priv(clk->dev); ulong rate; switch (clk->id) { + case CLK_SD0: + rate = owl_get_sd_clk_rate(priv, 0); + break; default: return -ENOENT; } @@ -142,9 +211,13 @@ static ulong owl_clk_get_rate(struct clk *clk) static ulong owl_clk_set_rate(struct clk *clk, ulong rate) { + struct owl_clk_priv *priv = dev_get_priv(clk->dev); ulong new_rate; switch (clk->id) { + case CLK_SD0: + new_rate = owl_set_sd_clk_rate(priv, rate, 0); + break; default: return -ENOENT; }