Received: by 10.192.165.148 with SMTP id m20csp1004439imm; Fri, 27 Apr 2018 10:58:16 -0700 (PDT) X-Google-Smtp-Source: AB8JxZp7m0AfvNyZ4VbpeCbF33Nl/kobxidDkc9HtC8UakcxM/BXjJnL2rRo9jQeCW3egHjhw5Uf X-Received: by 2002:a63:3c0c:: with SMTP id j12-v6mr3007126pga.203.1524851896851; Fri, 27 Apr 2018 10:58:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524851896; cv=none; d=google.com; s=arc-20160816; b=JOYBD6Q4nxCk7D6cDoJyoP8MybGVY9tHPn/Y6FCbfXB9ZAp2a8pBNYLjKpEZYpTFLH klgUxGJvUydmqG8k0DnYAnaBN+tD08R6zVFAa5KJFrURFBr0euxiHnmVS6OuRkc1xWoe 8XitKJaUbYce/puqxA3Gu/0nfs4HHBDjenQOfYHswDKjuibTo6/ENLGixxdcCiU2WDlw 6c5a/gcW6zFocHAQyZLhXmtyCJbksMMNCjKQmb6Jm8abJ1A4jF8mMNwvGSIjet3HbZLB reOe0AIH+UkPu49lYaoYx5uYWoE07j0su919samMSZTzu/HB91Vk9xUlkDbLv14AmsAe PxbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:content-disposition :mime-version:message-id:subject:cc:to:from:date:dkim-signature :arc-authentication-results; bh=ar7Qz5pP/7ICLvlMQuNboeRdUyna9cjuQbn7Yu6CaXg=; b=cUk9Dl2LbXOAYafxAafb6pGKqxaoRqUoMLk8HjuHjh2SnqRZAz/pXJ/PrpYjr3X9vV qYRAvgheSKzsDhsLvav5hXdMcXDacdae7ghd67NJHwPAdH1PzyAAy/2HvvQ82fIY3Lni nO911y+Qk7F2SQMKoTtMHRGhQAIqa4vDCYKato3BvTXi5+31h06J0XTQs6G3VWWaYJq3 YVLgaZPq2mQG4gZq88Kt6+lEk0RjzP3mO73DW4wPQgT32VqJNi+YpY/ysQvwOQ+GKd6n NvliThxyT6PXIrG7bFptggo3Jj45rWUSmzt6ZkVUzaMYMBgSyEvOtszv7+XfBjJBtbwa 8zJw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ziemianowicz.com header.s=somekey header.b=EjRPx93Y; 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 v10-v6si1513558ply.328.2018.04.27.10.58.02; Fri, 27 Apr 2018 10:58:16 -0700 (PDT) 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=pass header.i=@ziemianowicz.com header.s=somekey header.b=EjRPx93Y; 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 S932460AbeD0R4e (ORCPT + 99 others); Fri, 27 Apr 2018 13:56:34 -0400 Received: from sender-of-o52.zoho.com ([135.84.80.217]:21406 "EHLO sender-of-o52.zoho.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932412AbeD0R4c (ORCPT ); Fri, 27 Apr 2018 13:56:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1524851772; s=somekey; d=ziemianowicz.com; i=marcin@ziemianowicz.com; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type; l=2734; bh=ar7Qz5pP/7ICLvlMQuNboeRdUyna9cjuQbn7Yu6CaXg=; b=EjRPx93Y2rpmGnyV7ZcnPCuugE134O34tVq2kzWy2ypi6u7amKDAbZICphHdlh2y PK+sopMozCfAMP/sPX94oVdStPR+Dm+29raf4AKAkKtgG2ZMC4nZjMQjEuzAtCfOrGa MHJph+Hq5jjYj1fdcj4V5uWU1iEMQ3aNsHLZcctg= Received: from hak8or (98.15.121.23 [98.15.121.23]) by mx.zohomail.com with SMTPS id 1524851772280742.4857243647591; Fri, 27 Apr 2018 10:56:12 -0700 (PDT) Date: Fri, 27 Apr 2018 13:56:09 -0400 From: Marcin Ziemianowicz To: Boris Brezillon , Nicolas Ferre , Alexandre Belloni Cc: Michael Turquette , Stephen Boyd , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v3] clk: at91: PLL recalc_rate() now using cached MUL+DIV values Message-ID: <20180427175609.GA83298@hak8or> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.9.5 (2018-04-13) X-ZohoMailClient: External Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Stephen Boyd , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Bcc: Subject: [PATCH v3] clk: at91: PLL recalc_rate() now using cached MUL and DIV values Reply-To: When a USB device is connected to the USB host port on the SAM9N12 then you get "-62" error which seems to indicate USB replies from the device are timing out. Based on a logic sniffer, I saw the USB bus was running at half speed. The PLL code uses cached MUL and DIV values which get set in set_rate() and applied in prepare(), but the recalc_rate() function instead queries the hardware instead of using these cached values. Therefore, if recalc_rate() is called between a set_rate() and prepare(), the wrong frequency is calculated and later the USB clock divider for the SAM9N12 SOC will be configured for an incorrect clock. In my case, the PLL hardware was set to 96 Mhz before the OHCI driver loads, and therefore the usb clock divider was being set to /2 even though the OHCI driver set the PLL to 48 Mhz. As an alternative explanation, I noticed this was fixed in the past: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/283502.html but was later changed back via a large patch (maybe by mistake?): https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1bdf02326b71eae7e9b4b335b881856aaf9d1af6 Thank you for bearing with me about this Boris. Changes since V2: Removed all logging/debug messages I added > Comment by Boris Brezillon about my fix being wrong addressed Changes since V1: Added patch set cover letter Shortened lines which were over >80 characters long > Comment by Greg Kroah-Hartman about "from" field in email addressed > Comment by Alan Stern about redundant debug lines addressed Signed-off-by: Marcin Ziemianowicz --- drivers/clk/at91/clk-pll.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/drivers/clk/at91/clk-pll.c b/drivers/clk/at91/clk-pll.c index 7d3223fc..cc6e0364 100644 --- a/drivers/clk/at91/clk-pll.c +++ b/drivers/clk/at91/clk-pll.c @@ -132,19 +132,8 @@ static unsigned long clk_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) { struct clk_pll *pll = to_clk_pll(hw); - unsigned int pllr; - u16 mul; - u8 div; - - regmap_read(pll->regmap, PLL_REG(pll->id), &pllr); - - div = PLL_DIV(pllr); - mul = PLL_MUL(pllr, pll->layout); - - if (!div || !mul) - return 0; - return (parent_rate / div) * (mul + 1); + return return (parent_rate / pll->div) * (pll->mul + 1); } static long clk_pll_get_best_div_mul(struct clk_pll *pll, unsigned long rate, -- 2.17.0