Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp76660imm; Thu, 31 May 2018 19:00:27 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKgXIkSj2uFnkVaAqvRzXOJxluRMovzXhgnfpnP3TwyqV8C4nPL+1U7ktX2mHj+6TkKni58 X-Received: by 2002:a17:902:10c:: with SMTP id 12-v6mr9280568plb.252.1527818427399; Thu, 31 May 2018 19:00:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527818427; cv=none; d=google.com; s=arc-20160816; b=tiDt9rZugZnZGBJH0G/gjp85z+7J10rG1z+Y10PWLvKB+0urR9yCxhE4Q1DXLNFWOW 6oki4ORK8KOPzWk9IH+P9A6DngEDzTctRGDQvI3qsInho1Njvhwu7i3PsnST3DRyEq0g w926fG0Fy4P1TjhaDad6iEnwpP7xNS/aybArhbo7NNNmRN8/GW9+fRap86EC5BeBzkb9 JmiigZNZFcZqZnbR4t4AxIH4B38TKuStpB1I97mK0VZ8fKQTuUbYr16TW+lOZ7R/bK1U Q+EA2xShj1bKqxiXkxdvBKCYU2mmFVXrESrxy4mLwwT1Nm/nn4gJOHzUytAY8KDfl8oI yKUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=ZqwVwkBiVcz3CQnrtFNtQMO7OA6tZlGSQj+HKUd92cw=; b=H5kgvipZFK+gvYo5517GL8J+j/F9n7XjZBGNa1wAJOkRlBvIZmmrgac2lIl/eIO7X7 f/mTgKcGWbcNeS/mE9C0HZykIR+p2XrEMnQrp2ApV0VOW8xZaTXIhQv1tyhHkgJ0zXBK D4JOkD7zZdnq9oX86rjOqVSEKlUofOXTMXKXnplwf+rP1pnhDU43Nf+p8Ndp9x7y7iTd gQYFl7ghcXVBjN356GB4yXT5iYtw1xr+2lsMe3P9Lyl4I4AgE5X8K2Vqd7ffz9WL7XUb GqzEZoCzM7LTzwAl5hJcbIo57fA2+HyOx0dHR4evpo7SWAnaOq0IOJgKaTRSrBnUE0Gw Lk6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Mmqqxbep; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v184-v6si14783609pgb.117.2018.05.31.19.00.12; Thu, 31 May 2018 19:00:27 -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=@gmail.com header.s=20161025 header.b=Mmqqxbep; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751041AbeFAB72 (ORCPT + 99 others); Thu, 31 May 2018 21:59:28 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:39577 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750770AbeFAB7Z (ORCPT ); Thu, 31 May 2018 21:59:25 -0400 Received: by mail-pl0-f66.google.com with SMTP id f1-v6so13901186plt.6; Thu, 31 May 2018 18:59:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=ZqwVwkBiVcz3CQnrtFNtQMO7OA6tZlGSQj+HKUd92cw=; b=MmqqxbepnCm2/LFZEo+PQkXBmyFOk+W6VH6PqtDAql0S0wVrFK9lIP53G4lVjuzWJe 3OKx4uuXEgiJ3RxXn55je/JND1hbx3fur1WwVspm4OgKn39B5vlWNgpg2Naf2ZPx66Q8 lF4Und4fd4rmDN0DDYNZXiuAH87F0T6uSDPJsih51OtmfDFsZBu6UtMd/h1w/49Ke5I0 sgbm9pPDTTdCa1OZfk3d47NlGpnW1f7hID4dOgWi1iE5kn7oc2Bp02Fuxr4YrgBcUcU3 MLYJtBL/VdTBLap3SyzbIJhYG3Gc126/oQC8uH5MqKwJCb7FTIUJ/6V+5Cc2/KYVYT3m ZFqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=ZqwVwkBiVcz3CQnrtFNtQMO7OA6tZlGSQj+HKUd92cw=; b=DQIT5t3GrviKc3SuA0WTeezytSkeMKtgWKWF+wNOeAU+e6stB/ls4/V7Zh6m2XVsGM mCmkLGlaSODzEgmMG2p6Jn7ctOJoSOUyd2ZvDSsrVqevQFAXfgglqs36BUeTcokQQnbF UxABt5H6pi1NTl2YdWqRps4T47pGLYOd98dzdKxuFxXz8kwjijYMfPrFM/WbxFUf6Aom YyRX1VFkxbh7kbu7RhMWpMe7Hj6sn5E/9qchHxeg/sgxMRU29mJSiuulPEcJ/rXNL3Ug lC4hXSmVF3aJBxroMNQeI2snr/0Lvq7DyZscGuzLtPj7zGzBvQ/n5OrAox/Gt02ZGADM kLCQ== X-Gm-Message-State: ALKqPwfG7siH/iHgKBXKTHt/aTWWU+xCRp0NP5BA4ydvtts98SUbxoF+ bl4yMlk4kqO2lsr+ALIidk0= X-Received: by 2002:a17:902:8491:: with SMTP id c17-v6mr8992182plo.97.1527818364679; Thu, 31 May 2018 18:59:24 -0700 (PDT) Received: from mappy.world.mentorg.com (c-24-5-209-231.hsd1.ca.comcast.net. [24.5.209.231]) by smtp.googlemail.com with ESMTPSA id t134-v6sm20660607pgb.93.2018.05.31.18.59.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 31 May 2018 18:59:23 -0700 (PDT) From: Steve Longerbeam X-Google-Original-From: Steve Longerbeam To: Marek Vasut , Michael Turquette , Stephen Boyd Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, Steve Longerbeam Subject: [PATCH] clk: vc5: Avoid divide by zero when rounding or setting rates Date: Thu, 31 May 2018 18:59:17 -0700 Message-Id: <1527818357-8154-1-git-send-email-steve_longerbeam@mentor.com> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add checks in the .round_rate and .set_rate ops for zero requested rate or zero parent rate. If either are zero in .round_rate, just return zero. If either are zero in .set_rate, return -EINVAL. Signed-off-by: Steve Longerbeam --- drivers/clk/clk-versaclock5.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/clk/clk-versaclock5.c b/drivers/clk/clk-versaclock5.c index decffb3..5524e5d 100644 --- a/drivers/clk/clk-versaclock5.c +++ b/drivers/clk/clk-versaclock5.c @@ -304,6 +304,9 @@ static int vc5_dbl_set_rate(struct clk_hw *hw, unsigned long rate, container_of(hw, struct vc5_driver_data, clk_mul); u32 mask; + if (parent_rate == 0 || rate == 0) + return -EINVAL; + if ((parent_rate * 2) == rate) mask = VC5_PRIM_SRC_SHDN_EN_DOUBLE_XTAL_FREQ; else @@ -349,6 +352,10 @@ static long vc5_pfd_round_rate(struct clk_hw *hw, unsigned long rate, { unsigned long idiv; + /* avoid division by zero */ + if (*parent_rate == 0 || rate == 0) + return 0; + /* PLL cannot operate with input clock above 50 MHz. */ if (rate > 50000000) return -EINVAL; @@ -372,6 +379,10 @@ static int vc5_pfd_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long idiv; u8 div; + /* avoid division by zero */ + if (parent_rate == 0 || rate == 0) + return -EINVAL; + /* CLKIN within range of PLL input, feed directly to PLL. */ if (parent_rate <= 50000000) { regmap_update_bits(vc5->regmap, VC5_VCO_CTRL_AND_PREDIV, @@ -429,6 +440,10 @@ static long vc5_pll_round_rate(struct clk_hw *hw, unsigned long rate, u32 div_int; u64 div_frc; + /* avoid division by zero */ + if (*parent_rate == 0 || rate == 0) + return 0; + if (rate < VC5_PLL_VCO_MIN) rate = VC5_PLL_VCO_MIN; if (rate > VC5_PLL_VCO_MAX) @@ -457,6 +472,9 @@ static int vc5_pll_set_rate(struct clk_hw *hw, unsigned long rate, struct vc5_driver_data *vc5 = hwdata->vc5; u8 fb[5]; + if (parent_rate == 0 || rate == 0) + return -EINVAL; + fb[0] = hwdata->div_int >> 4; fb[1] = hwdata->div_int << 4; fb[2] = hwdata->div_frc >> 16; @@ -509,6 +527,10 @@ static long vc5_fod_round_rate(struct clk_hw *hw, unsigned long rate, u32 div_int; u64 div_frc; + /* avoid division by zero */ + if (*parent_rate == 0 || rate == 0) + return 0; + /* Determine integer part, which is 12 bit wide */ div_int = f_in / rate; /* @@ -546,6 +568,9 @@ static int vc5_fod_set_rate(struct clk_hw *hw, unsigned long rate, 0 }; + if (parent_rate == 0 || rate == 0) + return -EINVAL; + regmap_bulk_write(vc5->regmap, VC5_OUT_DIV_FRAC(hwdata->num, 0), data, 14); -- 2.7.4