From patchwork Mon Dec 5 10:09:09 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartosz Golaszewski X-Patchwork-Id: 9460779 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 2E0AE60459 for ; Mon, 5 Dec 2016 10:12:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 265C222ADC for ; Mon, 5 Dec 2016 10:12:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 191ED26242; Mon, 5 Dec 2016 10:12:26 +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 AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id BCB6E22ADC for ; Mon, 5 Dec 2016 10:12:25 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1cDqEY-0007Jp-G9; Mon, 05 Dec 2016 10:10:54 +0000 Received: from mail-wj0-x22e.google.com ([2a00:1450:400c:c01::22e]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1cDqDM-0004lL-Kh for linux-arm-kernel@lists.infradead.org; Mon, 05 Dec 2016 10:09:43 +0000 Received: by mail-wj0-x22e.google.com with SMTP id tg4so29968431wjb.1 for ; Mon, 05 Dec 2016 02:09:19 -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=VIzVI2GCApzwsktF3nYdrh0TnRbl7XwzC2XClnz7/CY=; b=T7zg/z/ceQ2M8pXbV1/TJooy0BZoRfQwRsooOsoaXznwunqT9/ugPXWAFBCgOQIz7W OI1sp0OdT5QFnsaCmKCW6n+obGktIH2KgBtM7UT9cR00iwp+09a8l1tMVYLeg7bQxjNQ NqUlfYHq1tfRGvMGMam7BbxuEEvJOSYsBXRX3Qs0VIFW+yUxgKs3UbWkezp9u9c3HnOJ I2JCI/ck/F/KHEHeps5z5IADS4mKb17Ti3y8ssAkmYhSUZArnZXW5WpHbXS19qHnShVi AfJE9ATlzua08LdR5KUfsxdAsRtUh7her0XUjdEPQsNJ0mlphINa+JtQcRKKbBoGWDZb V45w== 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; bh=VIzVI2GCApzwsktF3nYdrh0TnRbl7XwzC2XClnz7/CY=; b=Q7Bl8+IWAKPWyGxUiRQaBq+49MuY9cVD9fD9SITHg9EDRlbQegrJ0KOksf/eAamF+x YCh6q04K+CqYQA0A7lWR1rz1K1+0sWv428lZlKDdqH26VRrU17lV/0H1biH7Fkt89Pl0 i3XAOsGcERDcH9z9CO6CHS8JaDVlfKsHn9QcXN6K4Xa6UWdhfcCrzzRqPQtIYonX1tTn J4LfSwHUWKFLgDMZ5MV3qujKj5VK/Vzmd8z2+2YI75rYMZsIG5d8iYieEL5NZjiZZHOS 57/P3DRlM2bL1CJfuknalkumiPf5QJxy9gf+req0v1m8DUHfIqxIiqUqEtjHfb8gaxsv H/ew== X-Gm-Message-State: AKaTC03oXnG4GyDZBeZ4d12nNDgtLognIuIaFsBG5do7ecduP6i+65U4K0ZpdkmZOrEDY05C X-Received: by 10.194.20.68 with SMTP id l4mr49193864wje.49.1480932558179; Mon, 05 Dec 2016 02:09:18 -0800 (PST) Received: from localhost.localdomain ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id ef10sm19526939wjd.22.2016.12.05.02.09.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 05 Dec 2016 02:09:17 -0800 (PST) From: Bartosz Golaszewski To: Kevin Hilman , Michael Turquette , Sekhar Nori , Peter Ujfalusi , Russell King , Viresh Kumar , Boris Brezillon , "Rafael J. Wysocki" , Richard Weinberger , David Woodhouse , Brian Norris , Marek Vasut , Cyrille Pitchen Subject: [PATCH v3 3/3] ARM: da850: fix da850_set_pll0rate() Date: Mon, 5 Dec 2016 11:09:09 +0100 Message-Id: <1480932549-30811-4-git-send-email-bgolaszewski@baylibre.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1480932549-30811-1-git-send-email-bgolaszewski@baylibre.com> References: <1480932549-30811-1-git-send-email-bgolaszewski@baylibre.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161205_020941_084099_C420ECEA X-CRM114-Status: GOOD ( 14.49 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Bartosz Golaszewski , LKML , arm-soc , linux-pm@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 This function is confusing - its second argument is an index to the freq table, not the requested clock rate in Hz, but it's used as the set_rate callback for the pll0 clock. It leads to an oops when the caller doesn't know the internals and passes the rate in Hz as argument instead of the cpufreq index since this argument isn't bounds checked either. Fix it by iterating over the array of supported frequencies and selecting a one that matches or returning -EINVAL for unsupported rates. Also: update the davinci cpufreq driver. It's the only user of this clock and currently it passes the cpufreq table index to clk_set_rate(), which is confusing. Make it pass the requested clock rate in Hz. Signed-off-by: Bartosz Golaszewski Acked-by: Viresh Kumar --- arch/arm/mach-davinci/da850.c | 20 ++++++++++++++++---- drivers/cpufreq/davinci-cpufreq.c | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index 006ec56..9837541 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c @@ -1179,14 +1179,26 @@ static int da850_set_armrate(struct clk *clk, unsigned long index) return clk_set_rate(pllclk, index); } -static int da850_set_pll0rate(struct clk *clk, unsigned long index) +static int da850_set_pll0rate(struct clk *clk, unsigned long rate) { - unsigned int prediv, mult, postdiv; - struct da850_opp *opp; struct pll_data *pll = clk->pll_data; + struct cpufreq_frequency_table *freq; + unsigned int prediv, mult, postdiv; + struct da850_opp *opp = NULL; int ret; - opp = (struct da850_opp *) cpufreq_info.freq_table[index].driver_data; + for (freq = da850_freq_table; + freq->frequency != CPUFREQ_TABLE_END; freq++) { + /* rate is in Hz, freq->frequency is in KHz */ + if (freq->frequency == rate / 1000) { + opp = (struct da850_opp *)freq->driver_data; + break; + } + } + + if (opp == NULL) + return -EINVAL; + prediv = opp->prediv; mult = opp->mult; postdiv = opp->postdiv; diff --git a/drivers/cpufreq/davinci-cpufreq.c b/drivers/cpufreq/davinci-cpufreq.c index b95a872..d54a27c 100644 --- a/drivers/cpufreq/davinci-cpufreq.c +++ b/drivers/cpufreq/davinci-cpufreq.c @@ -55,7 +55,7 @@ static int davinci_target(struct cpufreq_policy *policy, unsigned int idx) return ret; } - ret = clk_set_rate(armclk, idx); + ret = clk_set_rate(armclk, new_freq * 1000); if (ret) return ret;