Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3504238imu; Mon, 7 Jan 2019 04:43:09 -0800 (PST) X-Google-Smtp-Source: ALg8bN4jOzPWlwHlvfcGR0WbeClhxLNJIuEDS9I9E37eVzYIwGSntQu91W5vRrstWlenUmwN+VRi X-Received: by 2002:a63:9809:: with SMTP id q9mr10825289pgd.109.1546864989661; Mon, 07 Jan 2019 04:43:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546864989; cv=none; d=google.com; s=arc-20160816; b=Z/W7t/lCGXpMBKzVRvJgiapoI0Hu/j5h4r7C5qrBTMmB4oiddqZUWFdzPvAshLDwyp d+XKwfzAa1mwFSIJ+nZPXsOjkZEi5D518JSOSFnIldNnvrYZqj78zgr/r7AQWbZ0u8Dj BSBdMYLSn3fjbZNhmVT7PmJOYynBAM1RshQPXS0AYd1mB3F5+7jHqR00mFHEiWQRS2Wb GwKnfD6Hbty85vE9P/hPWcrbX+a3EdOChiftDFttqfAjzX40a2IYLBSIrsNiGynbNj0b /KEhtblc8FaRVGVP6fY/vACGU9dBqdtDYDrGGZHuAQiCblVFqYD8tEzHTE4O2xsO9zS7 VFAA== 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:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Qzhtgqb1HRyOrM6uKAl40c/F2150n0fwT6kJaqImFx8=; b=PIVjVV+/0DMPjdDabQ66Hby4Bk6El2yl+GsrWI+xQ+q2GCTR2gLkCSyA7SVsoi/4Hs XT8MsNxe/Fb/lzGQVqO7OG1JpBB2Am6g2ooMSpWijhHDSNHChUurXpytkj9AZqpuMJKN V6dNkte50ZSTATQzQa1mSoqar3sFMFpsi8nRLlzh1zKstqYKkK6H0Y9KcqaVi19LHEwW 8nP63FktzfSeEHuMq89vukHh0p9gof8/vmDR02M0UO/Z57Cw4sGAOMQyF0sMuUtmg7hC xN9J458dD0gEisnNgylDiBUoPswafPWjOxRtPblaaUldG0tvFxZ/cSpW/SRJQW1Um7eY Sqmg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1dt2hS0w; 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 h5si18045432pgg.230.2019.01.07.04.42.54; Mon, 07 Jan 2019 04:43:09 -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=pass header.i=@kernel.org header.s=default header.b=1dt2hS0w; 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 S1728052AbfAGMk4 (ORCPT + 99 others); Mon, 7 Jan 2019 07:40:56 -0500 Received: from mail.kernel.org ([198.145.29.99]:55886 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727827AbfAGMkx (ORCPT ); Mon, 7 Jan 2019 07:40:53 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2FE092183E; Mon, 7 Jan 2019 12:40:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1546864852; bh=wkB7OD6CoWHvpd12N6P7BRzMxMCNO8XN1rHieluLRcQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1dt2hS0wNiE68gNm2rHjttYNVRqMLyLCo4UKFCd71gf5GOjsoUlyqlp/iu2FVQzXs Q2wOUVBZkxtbQ2PeGHUm+2x5l9XQCIzJ0/4M49/zZ7PQpg2pqEZ0PE2FlngIqSj/cP LxTehhpWi71iADouQ75kvipkF6irvsCrurwF7EHw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jernej Skrabec , Maxime Ripard Subject: [PATCH 4.20 084/145] clk: sunxi-ng: Use u64 for calculation of NM rate Date: Mon, 7 Jan 2019 13:32:01 +0100 Message-Id: <20190107104448.247005486@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190107104437.308206189@linuxfoundation.org> References: <20190107104437.308206189@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.20-stable review patch. If anyone has any objections, please let me know. ------------------ From: Jernej Skrabec commit 65b6657672388b72822e0367f06d41c1e3ffb5bb upstream. Allwinner H6 SoC has multiplier N range between 1 and 254. Since parent rate is 24MHz, intermediate result when calculating final rate easily overflows 32 bit variable. Because of that, introduce function for calculating clock rate which uses 64 bit variable for intermediate result. Fixes: 6174a1e24b0d ("clk: sunxi-ng: Add N-M-factor clock support") Fixes: ee28648cb2b4 ("clk: sunxi-ng: Remove the use of rational computations") CC: Signed-off-by: Jernej Skrabec Signed-off-by: Maxime Ripard Signed-off-by: Greg Kroah-Hartman --- drivers/clk/sunxi-ng/ccu_nm.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) --- a/drivers/clk/sunxi-ng/ccu_nm.c +++ b/drivers/clk/sunxi-ng/ccu_nm.c @@ -19,6 +19,17 @@ struct _ccu_nm { unsigned long m, min_m, max_m; }; +static unsigned long ccu_nm_calc_rate(unsigned long parent, + unsigned long n, unsigned long m) +{ + u64 rate = parent; + + rate *= n; + do_div(rate, m); + + return rate; +} + static void ccu_nm_find_best(unsigned long parent, unsigned long rate, struct _ccu_nm *nm) { @@ -28,7 +39,8 @@ static void ccu_nm_find_best(unsigned lo for (_n = nm->min_n; _n <= nm->max_n; _n++) { for (_m = nm->min_m; _m <= nm->max_m; _m++) { - unsigned long tmp_rate = parent * _n / _m; + unsigned long tmp_rate = ccu_nm_calc_rate(parent, + _n, _m); if (tmp_rate > rate) continue; @@ -100,7 +112,7 @@ static unsigned long ccu_nm_recalc_rate( if (ccu_sdm_helper_is_enabled(&nm->common, &nm->sdm)) rate = ccu_sdm_helper_read_rate(&nm->common, &nm->sdm, m, n); else - rate = parent_rate * n / m; + rate = ccu_nm_calc_rate(parent_rate, n, m); if (nm->common.features & CCU_FEATURE_FIXED_POSTDIV) rate /= nm->fixed_post_div; @@ -149,7 +161,7 @@ static long ccu_nm_round_rate(struct clk _nm.max_m = nm->m.max ?: 1 << nm->m.width; ccu_nm_find_best(*parent_rate, rate, &_nm); - rate = *parent_rate * _nm.n / _nm.m; + rate = ccu_nm_calc_rate(*parent_rate, _nm.n, _nm.m); if (nm->common.features & CCU_FEATURE_FIXED_POSTDIV) rate /= nm->fixed_post_div;