From patchwork Wed Dec 7 15:22:18 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartosz Golaszewski X-Patchwork-Id: 9464701 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 BF24E60512 for ; Wed, 7 Dec 2016 15:23:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C0F9928423 for ; Wed, 7 Dec 2016 15:23:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B57B728422; Wed, 7 Dec 2016 15:23:00 +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.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable 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 63D1A28442 for ; Wed, 7 Dec 2016 15:23:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752330AbcLGPW6 (ORCPT ); Wed, 7 Dec 2016 10:22:58 -0500 Received: from mail-wj0-f170.google.com ([209.85.210.170]:35455 "EHLO mail-wj0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932297AbcLGPWc (ORCPT ); Wed, 7 Dec 2016 10:22:32 -0500 Received: by mail-wj0-f170.google.com with SMTP id v7so363984028wjy.2 for ; Wed, 07 Dec 2016 07:22:31 -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=5utCFq5A/Kw39Tbk2EoWRqWL48FALVK844gBYEtTgng=; b=NUp+QZKI7GNy4CJZMOgdFCxpQJCW5LJziV+0HtjlPdCp+IkPQMX/y6wQ6JgdOE6ja5 TmwLxgBxMIxWR4oIF9X3wWV+kVER1fUVS3h3IizRQ6Tye4wZsGRxvJuPV/qLfOZdzHZp g/kONB/TSLZ04rc3R0R4OnueRTQt1cMGBVV+/FI3gcgPdGTVFMTsZaquxGPex+g2e6Ih jKZJYUiRHSaQTbkheCoAi9huGScQJeSVIhSgfyEPol7V4BPbB+FcNJEWftADrouFNKQ9 FFnmEMNdiEzOO1K9LaazF7e99RS/seQOgcBQCTlXI+lemSROEydf2WOvCAWPWNOskPis aZUQ== 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=5utCFq5A/Kw39Tbk2EoWRqWL48FALVK844gBYEtTgng=; b=iaSXfdPuLRN7OyxEIoVZNFJmmDMQze4MYR/MF0xLLxwIhbGm9huMn0FfXqZYqC0sj0 0DlXuOS9mfeYBhIHf5ECrD6NxltXr2UaQxTuTAjgk62X4vA6QJwMo0p/9fYRQt1v/O53 n5KA7EVt9CjeEZw4Rk9ATGUK6jskUB4dXdBa1nYJRalu3IQlS5W/XP7mUUkC4ZHrpjYa nhVRqng/Ny1UuFry0U6KLFgMov4cxZM+Jf2j7iEeHNVny2jztWuUbz46S13BImHAffrD 3Y5xT2w2VE8Hpkx8og7bHGNFdl5KkZl8vJf9R1FiWEYjgmBXVh31N5F4KpSJab8gZE88 M+eQ== X-Gm-Message-State: AKaTC01Hxc1PSEVIgY6kdHvNZ0pJGJGQa1mXhLrEemSzc/JaaHOxYSdw48ca+ryUrhj7tHEF X-Received: by 10.194.0.43 with SMTP id 11mr60036235wjb.218.1481124150595; Wed, 07 Dec 2016 07:22:30 -0800 (PST) Received: from localhost.localdomain ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id r138sm10198123wme.9.2016.12.07.07.22.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 07 Dec 2016 07:22:29 -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 Cc: LKML , arm-soc , linux-pm@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH v4 4/4] ARM: da850: fix da850_set_pll0rate() Date: Wed, 7 Dec 2016 16:22:18 +0100 Message-Id: <1481124138-27337-5-git-send-email-bgolaszewski@baylibre.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1481124138-27337-1-git-send-email-bgolaszewski@baylibre.com> References: <1481124138-27337-1-git-send-email-bgolaszewski@baylibre.com> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.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 | 22 ++++++++++++++++++---- drivers/cpufreq/davinci-cpufreq.c | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index 5f8ffaa..b410598 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c @@ -1197,14 +1197,28 @@ 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; + rate /= 1000; + + for (freq = da850_freq_table; + freq->frequency != CPUFREQ_TABLE_END; freq++) { + /* rate is in Hz, freq->frequency is in KHz */ + if (freq->frequency == rate) { + opp = (struct da850_opp *)freq->driver_data; + break; + } + } + + if (!opp) + 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;