Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp997636yba; Thu, 4 Apr 2019 02:04:08 -0700 (PDT) X-Google-Smtp-Source: APXvYqztsQ8kno2VOLjGRMHApE8OMfGBGl/2yE1xuxEGiiEM+SkwROEwvzAQ3V/fBI6epQEI4tFW X-Received: by 2002:a65:6107:: with SMTP id z7mr4629756pgu.313.1554368648800; Thu, 04 Apr 2019 02:04:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554368648; cv=none; d=google.com; s=arc-20160816; b=OPpHK/3qJurIz0M6J/ZX6kDoRgdTmeH9cBu7JHQgaCBIpXOxeGmViNDzsakjy6Gggw LqdbCZR4ph5DuLI4KJyUJfAfk/wDYlXCg6ra2oa0mAq3ygUGgsXc1s/UVp4t79ekEvrO zkYlPQvYjhfITFNNNNkFlWDc03kJ04+z8Lt4CZcGBFWUUAKF+JPvCwBJhWsOIJeABsn3 ChK5fwXLm41STYbfzfHqdDcTyE922bBtJQM103tV09+bNTi26HAR6DJ3/ZMdlIsLYJLq 2v873Jt0dn/EAG1alWdqKtE0F8rsE9PhNqbJg21Id8J50uQ2UtCnm58M1yoZ59b6BR2M rt9g== 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=rxMSLyuK+QLkPpECcwud+2V/CtSm1RT0MziPBekKjAY=; b=0DMOlUvptqyfNj+kJ21ThvqcY9SDzflWq3xXFjkLf5T+0kkAmBu/6SbSNLhvxpppCn VbZwlIAVkgsmbJNWHDQyt7GdH8qjV4ohF9+KW1N8hcc+xBP3IInMgD7Y5iAC+fEUPYRm xMFALBYIeVyoj6/f7tJBKOqhFZ04dy1zhnbYLJextxou54Ndy1yHSz3Mdqwkf+v7dGsR UFP/dgUnkiQkrc4HSP/bkK7MHl70MHYyHBMM129HDSLYOs+1gDit1a3s1JNtnu1rzwpy 6e8pHREhpLqb+TKbZ6zI/Y8kBHESPwJ0uGtZUftOl/UMOnIi+M+6o0eXlJU641UGz1sh 5Yrg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=h4nKHeij; 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 j187si16421099pfc.251.2019.04.04.02.03.53; Thu, 04 Apr 2019 02:04:08 -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=@kernel.org header.s=default header.b=h4nKHeij; 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 S1731777AbfDDJDV (ORCPT + 99 others); Thu, 4 Apr 2019 05:03:21 -0400 Received: from mail.kernel.org ([198.145.29.99]:40868 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730465AbfDDJDQ (ORCPT ); Thu, 4 Apr 2019 05:03:16 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.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 4B6CA2177E; Thu, 4 Apr 2019 09:03:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554368594; bh=Yst1YEk3S/oJRuO96pk0GkF09G+FHRL5RzJR672dydg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h4nKHeij5vLiAsOakMw2x4xpcZtfqy2mi5tFA3PXnH+b8+Uo1Dx7PVU0lfF7UWzm6 Z5By5bPrD5VcMTEIv14mxbuM3GsgyMveb0cTkxeGHC1FYCzBjsIM5LmWacAobUmM8b eAVYv48Zyx/TZCb0DXErqaK4ojtJFfAaVLt8sZ1g= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Katsuhiro Suzuki , Heiko Stuebner , Stephen Boyd , Sasha Levin Subject: [PATCH 4.19 071/187] clk: fractional-divider: check parent rate only if flag is set Date: Thu, 4 Apr 2019 10:46:48 +0200 Message-Id: <20190404084606.397697791@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190404084603.119654039@linuxfoundation.org> References: <20190404084603.119654039@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.19-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit d13501a2bedfbea0983cc868d3f1dc692627f60d ] Custom approximation of fractional-divider may not need parent clock rate checking. For example Rockchip SoCs work fine using grand parent clock rate even if target rate is greater than parent. This patch checks parent clock rate only if CLK_SET_RATE_PARENT flag is set. For detailed example, clock tree of Rockchip I2S audio hardware. - Clock rate of CPLL is 1.2GHz, GPLL is 491.52MHz. - i2s1_div is integer divider can divide N (N is 1~128). Input clock is CPLL or GPLL. Initial divider value is N = 1. Ex) PLL = CPLL, N = 10, i2s1_div output rate is CPLL / 10 = 1.2GHz / 10 = 120MHz - i2s1_frac is fractional divider can divide input to x/y, x and y are 16bit integer. CPLL --> | selector | ---> i2s1_div -+--> | selector | --> I2S1 MCLK GPLL --> | | ,--------------' | | `--> i2s1_frac ---> | | Clock mux system try to choose suitable one from i2s1_div and i2s1_frac for master clock (MCLK) of I2S1. Bad scenario as follows: - Try to set MCLK to 8.192MHz (32kHz audio replay) Candidate setting is - i2s1_div: GPLL / 60 = 8.192MHz i2s1_div candidate is exactly same as target clock rate, so mux choose this clock source. i2s1_div output rate is changed 491.52MHz -> 8.192MHz - After that try to set to 11.2896MHz (44.1kHz audio replay) Candidate settings are - i2s1_div : CPLL / 107 = 11.214945MHz - i2s1_frac: i2s1_div = 8.192MHz This is because clk_fd_round_rate() thinks target rate (11.2896MHz) is higher than parent rate (i2s1_div = 8.192MHz) and returns parent clock rate. Above is current upstreamed behavior. Clock mux system choose i2s1_div, but this clock rate is not acceptable for I2S driver, so users cannot replay audio. Expected behavior is: - Try to set master clock to 11.2896MHz (44.1kHz audio replay) Candidate settings are - i2s1_div : CPLL / 107 = 11.214945MHz - i2s1_frac: i2s1_div * 147/6400 = 11.2896MHz Change i2s1_div to GPLL / 1 = 491.52MHz at same time. If apply this commit, clk_fd_round_rate() calls custom approximate function of Rockchip even if target rate is higher than parent. Custom function changes both grand parent (i2s1_div) and parent (i2s_frac) settings at same time. Clock mux system can choose i2s1_frac and audio works fine. Signed-off-by: Katsuhiro Suzuki Reviewed-by: Heiko Stuebner [sboyd@kernel.org: Make function into a macro instead] Signed-off-by: Stephen Boyd Signed-off-by: Sasha Levin --- drivers/clk/clk-fractional-divider.c | 2 +- include/linux/clk-provider.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/clk/clk-fractional-divider.c b/drivers/clk/clk-fractional-divider.c index fdf625fb10fa..083daa293280 100644 --- a/drivers/clk/clk-fractional-divider.c +++ b/drivers/clk/clk-fractional-divider.c @@ -77,7 +77,7 @@ static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long m, n; u64 ret; - if (!rate || rate >= *parent_rate) + if (!rate || (!clk_hw_can_set_rate_parent(hw) && rate >= *parent_rate)) return *parent_rate; if (fd->approximation) diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 08b1aa70a38d..d1b6d2c3ada6 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -782,6 +782,9 @@ unsigned int __clk_get_enable_count(struct clk *clk); unsigned long clk_hw_get_rate(const struct clk_hw *hw); unsigned long __clk_get_flags(struct clk *clk); unsigned long clk_hw_get_flags(const struct clk_hw *hw); +#define clk_hw_can_set_rate_parent(hw) \ + (clk_hw_get_flags((hw)) & CLK_SET_RATE_PARENT) + bool clk_hw_is_prepared(const struct clk_hw *hw); bool clk_hw_rate_is_protected(const struct clk_hw *hw); bool clk_hw_is_enabled(const struct clk_hw *hw); -- 2.19.1