From patchwork Tue Jan 17 12:26:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartosz Golaszewski X-Patchwork-Id: 9520655 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BFD6C6043D for ; Tue, 17 Jan 2017 12:29:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 990122853B for ; Tue, 17 Jan 2017 12:29:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8DF082853D; Tue, 17 Jan 2017 12:29:28 +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=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 36B692853C for ; Tue, 17 Jan 2017 12:29:28 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1cTStD-0008JQ-AK; Tue, 17 Jan 2017 12:29:27 +0000 Received: from mail-wm0-x232.google.com ([2a00:1450:400c:c09::232]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1cTSrF-0004mr-KI for linux-arm-kernel@lists.infradead.org; Tue, 17 Jan 2017 12:27:29 +0000 Received: by mail-wm0-x232.google.com with SMTP id c206so220276869wme.0 for ; Tue, 17 Jan 2017 04:27:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cu2TYqCA/4ezEbeOr602MpwWgRgld8WC3/zy2MypAMs=; b=eWgHDYz7bLQ8vwERtlhrak8ul0vA7chl2LoXXvDZSlXg859IoNH4+nGK8xGUspNdiq FKnKwaFtF+6CF3vitTnVtwcGYDy1WiiMw5fvE/ZH/M0arewRB/nO7ege+VhbLN4AR/pI mcQVnyajkmJth1CTxZBp9FNERTZisBIvpxawC1mDtPQucHOjrn86mkZljWkcjnEZ2WXx h1qzk+7gjQ53eFMHF7lPmTcq+zV3n4VBbzcCS0i8fiMX7Vqh/qzIlfd3dlT2tx8mMGFY IAbxD0hH+0sV9z8jVDHEM+vNOYVDevB66fKJ3ijtEgKUDwnJsC97xpjiPoo+NUnksISz s5Kw== 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=cu2TYqCA/4ezEbeOr602MpwWgRgld8WC3/zy2MypAMs=; b=t78lNvwxzbmMZcY0G5skSaW9YL8cBfwx3GL+Upz8ePgdjCb2ukwrwdXbIE8IlfV9nX LSHHHWRY7TbKyhY9qhKLp3G/bVQAh7rrfl/UZJIzGDHAbAw+NN3a49wUWb9Txyi02j4p lJIUO3+WHXxZP8IyKc8Hgf9GrdkpGtm35vTcT84CW5phs3TLeQ3lDDSx4ddYX4Kp83Q/ U7apiZiY2oQZJJaJkAj9akj6NwA6DjvsBIDBMaSunBPdS+8x7pRO9ah0tujUIbDXhJeV sf7Bj2m6ChP++cJFItzx02+VelkbUigOylzbza0ruvbNRf/4WRKrf692ZVLCwx8O5/I3 9eYw== X-Gm-Message-State: AIkVDXIrgYgLC6lyNliIckvus9kPqY4ZW7Xb8OYuZcg2hJYY/iOzJMxk5oMRNUyxemVqi1BQ X-Received: by 10.28.214.144 with SMTP id n138mr13085773wmg.136.1484656023525; Tue, 17 Jan 2017 04:27:03 -0800 (PST) Received: from bgdev-debian.lan (jua06-1-82-242-157-225.fbx.proxad.net. [82.242.157.225]) by smtp.gmail.com with ESMTPSA id o143sm5466112wmd.3.2017.01.17.04.27.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 17 Jan 2017 04:27:02 -0800 (PST) From: Bartosz Golaszewski To: Kevin Hilman , Sekhar Nori , Patrick Titiano , Michael Turquette , Tejun Heo , Rob Herring , Mark Rutland , Russell King , David Lechner Subject: [PATCH v2 11/14] sata: ahci-da850: un-hardcode the MPY bits Date: Tue, 17 Jan 2017 13:26:13 +0100 Message-Id: <1484655976-25382-12-git-send-email-bgolaszewski@baylibre.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1484655976-25382-1-git-send-email-bgolaszewski@baylibre.com> References: <1484655976-25382-1-git-send-email-bgolaszewski@baylibre.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170117_042726_039968_DB93E602 X-CRM114-Status: GOOD ( 19.91 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-ide@vger.kernel.org, Bartosz Golaszewski , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP In order to make the MPY bits configurable, try to obtain the refclk and calculate the required multiplier from its rate. If we fail to get the clock, fall back to the default value which keeps backwards compatibility. Signed-off-by: Bartosz Golaszewski --- drivers/ata/ahci_da850.c | 88 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 76 insertions(+), 12 deletions(-) diff --git a/drivers/ata/ahci_da850.c b/drivers/ata/ahci_da850.c index a7a7161..f48b7d0 100644 --- a/drivers/ata/ahci_da850.c +++ b/drivers/ata/ahci_da850.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "ahci.h" #define DRV_NAME "ahci_da850" @@ -30,16 +31,14 @@ #define SATA_PHY_ENPLL(x) ((x) << 31) /* - * The multiplier needed for 1.5GHz PLL output. - * - * NOTE: This is currently hardcoded to be suitable for 100MHz crystal - * frequency (which is used by DA850 EVM board) and may need to be changed - * if you would like to use this driver on some other board. + * This is the default multiplier value used if the refclk could not be + * obtained. It corresponds with a crystal rate of 100MHz for 1.5GHz PLL + * output. */ -#define DA850_SATA_CLK_MULTIPLIER 7 +#define DA850_SATA_MPY_DEFAULT 0x8 static void da850_sata_init(struct device *dev, void __iomem *pwrdn_reg, - void __iomem *ahci_base) + void __iomem *ahci_base, u32 mpy) { unsigned int val; @@ -48,13 +47,56 @@ static void da850_sata_init(struct device *dev, void __iomem *pwrdn_reg, val &= ~BIT(0); writel(val, pwrdn_reg); - val = SATA_PHY_MPY(DA850_SATA_CLK_MULTIPLIER + 1) | SATA_PHY_LOS(1) | - SATA_PHY_RXCDR(4) | SATA_PHY_RXEQ(1) | SATA_PHY_TXSWING(3) | - SATA_PHY_ENPLL(1); + val = SATA_PHY_MPY(mpy) | SATA_PHY_LOS(1) | SATA_PHY_RXCDR(4) | + SATA_PHY_RXEQ(1) | SATA_PHY_TXSWING(3) | SATA_PHY_ENPLL(1); writel(val, ahci_base + SATA_P0PHYCR_REG); } +static u32 ahci_da850_calculate_mpy(unsigned long refclk_rate) +{ + u64 pll_output = 1500000000; + u32 needed; + + /* + * We need to determine the value of the multiplier (MPY) bits. + * + * In order to include the 12.5 multiplier we need to first multiply + * the desired rate of 1.5GHz by 10 before division. + */ + pll_output *= 10; + needed = __div64_32(&pll_output, refclk_rate); + + /* + * What we have now is (multiplier * 10). + * + * Let's determine the actual register value we need to write. + */ + + switch (needed) { + case 50: + return 0x1; + case 60: + return 0x2; + case 80: + return 0x4; + case 100: + return 0x5; + case 120: + return 0x6; + case 125: + return 0x7; + case 150: + return 0x8; + case 200: + return 0x9; + case 250: + return 0xa; + default: + return DA850_SATA_MPY_DEFAULT; + } +} + static int ahci_da850_softreset(struct ata_link *link, unsigned int *class, unsigned long deadline) { @@ -126,9 +168,10 @@ static int ahci_da850_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct ahci_host_priv *hpriv; - struct resource *res; void __iomem *pwrdn_reg; + struct resource *res; struct clk *clk; + u32 mpy; int rc; hpriv = ahci_platform_get_resources(pdev); @@ -150,6 +193,27 @@ static int ahci_da850_probe(struct platform_device *pdev) hpriv->clks[0] = clk; } + /* + * The second clock used by ahci-da850 is the external REFCLK. If we + * didn't get it from ahci_platform_get_resources(), let's try to + * specify the con_id in clk_get(). If we still don't get a clock, + * we'll use the default value that works for the da850-evm board. + */ + if (!hpriv->clks[1]) { + clk = clk_get(dev, "refclk"); + if (IS_ERR(clk)) + hpriv->clks[1] = NULL; + else + hpriv->clks[1] = clk; + } + + if (!hpriv->clks[1]) { + dev_info(dev, "unable to obtain the reference clock - using default multiplier"); + mpy = DA850_SATA_MPY_DEFAULT; + } else { + mpy = ahci_da850_calculate_mpy(clk_get_rate(hpriv->clks[1])); + } + rc = ahci_platform_enable_resources(hpriv); if (rc) return rc; @@ -162,7 +226,7 @@ static int ahci_da850_probe(struct platform_device *pdev) if (!pwrdn_reg) goto disable_resources; - da850_sata_init(dev, pwrdn_reg, hpriv->mmio); + da850_sata_init(dev, pwrdn_reg, hpriv->mmio, mpy); rc = ahci_platform_init_host(pdev, hpriv, &ahci_da850_port_info, &ahci_platform_sht);