Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2830426pxv; Mon, 12 Jul 2021 03:01:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwoJxg6HQrEaGIPvVnPdPjnqBIY+aziDoSyM73sRdfGsfIpYsgi+eKRqyoYwNR5CxuDkw6z X-Received: by 2002:a05:6e02:1c88:: with SMTP id w8mr5114828ill.154.1626084066351; Mon, 12 Jul 2021 03:01:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626084066; cv=none; d=google.com; s=arc-20160816; b=x3qw2pMFoxzRqlKeIC1BYgPAn680Ks4YqJfGUF1RHU5f0WfkQPDtPpb9HerVrg1kMC KIGX5DRSpHDjXg4ABrWin8a14B3S9ZlfurNwhcQ/kwu0LTbhbx4vf4b+m+2sO2fI0qzc Da4dRx8Ay8rHugqVVOaJSKkBxsGk0mnv6CsioOUy2P+A/KV6901kLJ41ygpJXXFkTYg+ TqvKFblBvIsziFbFYNZ33iI4eH/288QP+ZAOkkrBZZ9L10PhpdxbZgDnwf0USkZHbb1i KKix0sMM79t5IHIeKEqQWQb0DohVYmTc9IQPrRxnKfbgwobN4G/SABmtLYO8fOmv6S08 TpMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=qSYTDCX+IBIYg7HfOgDjNVGYb1k3WtjZg+DUoO71S0w=; b=OEQseIBA+jlLQTHngn6nrQ4SkNWi/CdXjwrxiz/GBjyAxzodTkWBNLZCbliMPzBiAq K3DHyGPZd4LvDVtimPEYLExXOdi717wnKoaJZbYiYza3x1S6zEyOF9djtaig+/kDa+eO ZT0nwXWS0gYj1e/u9XFDA+kLYsVIF9zoFj4o14QapuHMaFwmU60TAHSYHwERAVp5luJL lYKwTJ2Dvpt33XSb0ogjX8mz1RpjF/JBERCCYSyjhUvtQ+DjS4WiU+i6eGsaYObGAQQn AkuI6ruTVKuvP5NfhJumq4MIc6AU14+22wN/ZVAIicX7C/to7+QukIR8j/wQczalz1JQ vzmA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=kPztWdCb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a1si18302866jat.32.2021.07.12.03.00.49; Mon, 12 Jul 2021 03:01:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=kPztWdCb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241991AbhGLHNR (ORCPT + 99 others); Mon, 12 Jul 2021 03:13:17 -0400 Received: from mail.kernel.org ([198.145.29.99]:42444 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238372AbhGLGsj (ORCPT ); Mon, 12 Jul 2021 02:48:39 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 696B161154; Mon, 12 Jul 2021 06:44:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626072266; bh=MGEh1O1qKzCFtLhgi4S3slEZspl1zlmNDy1nhzEn1FY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kPztWdCbFl7KTmr+xWssYdeC2D4GoG/V6i699i8KvYYtPRyJ1JXAP4T7P1V8PdJoY uH+0fI6Fwz5vRK7OGDPePE3emUhBip0ddhbmKthF81HWQMhggGUBr5IoIO10E4RThQ fqosSnMjUNBEgm5BXbJ+SkplN0yXCSifviPgbb1A= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Robert Hancock , Stephen Boyd , Sasha Levin Subject: [PATCH 5.10 423/593] clk: si5341: Avoid divide errors due to bogus register contents Date: Mon, 12 Jul 2021 08:09:43 +0200 Message-Id: <20210712060934.818218476@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060843.180606720@linuxfoundation.org> References: <20210712060843.180606720@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Robert Hancock [ Upstream commit 78f6f406026d688868223d5dbeb197a4f7e9a9fd ] If the Si5341 is being initially programmed and has no stored NVM configuration, some of the register contents may contain unexpected values, such as zeros, which could cause divide by zero errors during driver initialization. Trap errors caused by zero registers or zero clock rates which could result in divide errors later in the code. Fixes: 3044a860fd ("clk: Add Si5341/Si5340 driver") Signed-off-by: Robert Hancock Link: https://lore.kernel.org/r/20210325192643.2190069-4-robert.hancock@calian.com Signed-off-by: Stephen Boyd Signed-off-by: Sasha Levin --- drivers/clk/clk-si5341.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/clk/clk-si5341.c b/drivers/clk/clk-si5341.c index b8a960e927bc..ac1ccec2b681 100644 --- a/drivers/clk/clk-si5341.c +++ b/drivers/clk/clk-si5341.c @@ -624,6 +624,9 @@ static unsigned long si5341_synth_clk_recalc_rate(struct clk_hw *hw, SI5341_SYNTH_N_NUM(synth->index), &n_num, &n_den); if (err < 0) return err; + /* Check for bogus/uninitialized settings */ + if (!n_num || !n_den) + return 0; /* * n_num and n_den are shifted left as much as possible, so to prevent @@ -807,6 +810,9 @@ static long si5341_output_clk_round_rate(struct clk_hw *hw, unsigned long rate, { unsigned long r; + if (!rate) + return 0; + r = *parent_rate >> 1; /* If rate is an even divisor, no changes to parent required */ @@ -835,11 +841,16 @@ static int si5341_output_clk_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate) { struct clk_si5341_output *output = to_clk_si5341_output(hw); - /* Frequency divider is (r_div + 1) * 2 */ - u32 r_div = (parent_rate / rate) >> 1; + u32 r_div; int err; u8 r[3]; + if (!rate) + return -EINVAL; + + /* Frequency divider is (r_div + 1) * 2 */ + r_div = (parent_rate / rate) >> 1; + if (r_div <= 1) r_div = 0; else if (r_div >= BIT(24)) -- 2.30.2