From patchwork Wed Oct 12 10:31:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Lundmark X-Patchwork-Id: 9372353 X-Patchwork-Delegate: sboyd@codeaurora.org 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 2A94960839 for ; Wed, 12 Oct 2016 10:32:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1A98029479 for ; Wed, 12 Oct 2016 10:32:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0E9FA2947E; Wed, 12 Oct 2016 10:32:38 +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=-6.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E3F0F29479 for ; Wed, 12 Oct 2016 10:32:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932618AbcJLKcd (ORCPT ); Wed, 12 Oct 2016 06:32:33 -0400 Received: from mail-lf0-f54.google.com ([209.85.215.54]:36795 "EHLO mail-lf0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932395AbcJLKcc (ORCPT ); Wed, 12 Oct 2016 06:32:32 -0400 Received: by mail-lf0-f54.google.com with SMTP id b75so68233023lfg.3 for ; Wed, 12 Oct 2016 03:32:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=limesaudio.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=N6tTfHZBS0NiP9IJi9nueDE5iJDg9H0dkMtbtJxIGqY=; b=4hD+JP6Olt28SOlW6jjdA0bU+k0rfYk+Spfl/1TY1UjvtJkdHi06qPpg4O1P77QLgJ 0EDi1jZnlch0YKd/rHlO/GIYUTI4L8yUywey6kbJmCt3W/OX0GpH75Q/3JdmjOcqsKZJ YYeW6rDWZ8l/OswVi7NLMp+LoR4TaHCn4o1JE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=N6tTfHZBS0NiP9IJi9nueDE5iJDg9H0dkMtbtJxIGqY=; b=ewXFEY/63GnScVYgkYU/t77zuEfaZ7SO2k3Ia3msqCFR3sNJeffmAC7mmrY43dWrBG Lkxgb9V8YOjED1W5masOZ5+tNQGkGM5SF7T3iANuNGlKWpImybdVOFV/qUm8V7AId4wa sGj4t1u4YgMjoCY9s6ZrA53r/tCzA8xuS0rpVwSs5GvA+DcD71U9bR2X+bIpswnBa4GP o0tzh6KsvtfuxoktbG6fOvjua+iX3AmWLAvsXbZtiOL3ZtS3r4spLEXdmTS2Lli+fEn7 xf0pi5yAfI8W3YTdNZJ0NUg+wt1HQuY4ZAEduVDA/hOsj4YS/UfhXY9CYnwXSWSqUEgB ak5A== X-Gm-Message-State: AA6/9RmsMg8L6+0um7mCYoXQ0RoszD3ljRu1jyaWZoP4Cd7WT+vwpR5ciy6L7hk/N4ojldyU X-Received: by 10.25.26.72 with SMTP id a69mr307685lfa.0.1476268350442; Wed, 12 Oct 2016 03:32:30 -0700 (PDT) Received: from lime.limes.local ([85.24.204.168]) by smtp.gmail.com with ESMTPSA id f35sm1944257lji.37.2016.10.12.03.32.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 12 Oct 2016 03:32:30 -0700 (PDT) From: Emil Lundmark To: Shawn Guo , Sascha Hauer , Fabio Estevam , Michael Turquette , Stephen Boyd Cc: linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, "Ken . Lin" , Emil Lundmark , Anson Huang Subject: [PATCH v3 1/2] clk: imx: fix integer overflow in AV PLL round rate Date: Wed, 12 Oct 2016 12:31:40 +0200 Message-Id: <4d2e3a91dfb74209735c940b51d7efc9ba2ed69b.1476267249.git.emil@limesaudio.com> In-Reply-To: References: In-Reply-To: References: Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Since 'parent_rate * mfn' may overflow 32 bits, the result should be stored using 64 bits. The problem was discovered when trying to set the rate of the audio PLL (pll4_post_div) on an i.MX6Q. The desired rate was 196.608 MHz, but the actual rate returned was 192.000570 MHz. The round rate function should have been able to return 196.608 MHz, i.e., the desired rate. Fixes: ba7f4f557eb6 ("clk: imx: correct AV PLL rate formula") Cc: Anson Huang Signed-off-by: Emil Lundmark Reviewed-by: Fabio Estevam --- drivers/clk/imx/clk-pllv3.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/clk/imx/clk-pllv3.c b/drivers/clk/imx/clk-pllv3.c index 19f9b622981a..7a6acc3e4a92 100644 --- a/drivers/clk/imx/clk-pllv3.c +++ b/drivers/clk/imx/clk-pllv3.c @@ -223,7 +223,7 @@ static unsigned long clk_pllv3_av_recalc_rate(struct clk_hw *hw, temp64 *= mfn; do_div(temp64, mfd); - return (parent_rate * div) + (u32)temp64; + return parent_rate * div + (unsigned long)temp64; } static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate, @@ -247,7 +247,11 @@ static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate, do_div(temp64, parent_rate); mfn = temp64; - return parent_rate * div + parent_rate * mfn / mfd; + temp64 = (u64)parent_rate; + temp64 *= mfn; + do_div(temp64, mfd); + + return parent_rate * div + (unsigned long)temp64; } static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,