From patchwork Fri Nov 25 15:41:33 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Sahu X-Patchwork-Id: 9447849 X-Patchwork-Delegate: sboyd@codeaurora.org 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 564196071B for ; Fri, 25 Nov 2016 15:43:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 469C827F17 for ; Fri, 25 Nov 2016 15:43:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3B99D27F80; Fri, 25 Nov 2016 15:43:22 +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 3FCED27F90 for ; Fri, 25 Nov 2016 15:43:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932469AbcKYPm7 (ORCPT ); Fri, 25 Nov 2016 10:42:59 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:47118 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932301AbcKYPmW (ORCPT ); Fri, 25 Nov 2016 10:42:22 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id BE02B614EA; Fri, 25 Nov 2016 15:42:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1480088541; bh=SOQ+3enkdy5MrEfebjApGn1wcfeWWz4MA8PASb+wGXA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lvmBGPr5kD6Qqt4ob+IG+/BTAf/fCxNiyEbUSI7Pn8yAq1VUlYUK6j8JIk+L5Y2pw ugPPiLbhDxuHC9X2kwnOFbPJkMAjLHxJbT8Qv2VDlNVyn67vKJycCyC6ukWIHiUgQZ kGlFlcIPXoLbjczmL99y61Vx+cnz+aQqP3ze9y3c= Received: from chen-lnxbld15.qualcomm.com (unknown [202.46.23.62]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: absahu@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 7097F614F9; Fri, 25 Nov 2016 15:42:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1480088537; bh=SOQ+3enkdy5MrEfebjApGn1wcfeWWz4MA8PASb+wGXA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K9iK/h4fu/0t4LW6gnrpLm2A7QMURgEi5UdnDjaffPaoIFNPBj7+PA705UwkHXB2u UphidQbTCVBKOzArEc3PPZqaRNHPdP9fJI6yDppcHw6ve3SDwP1e9E6as7YjRoxlmK 0PlYXyRiujm/DldAaQjAoJQI446JIJH6kHrbMKgM= DMARC-Filter: OpenDMARC Filter v1.3.1 smtp.codeaurora.org 7097F614F9 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=pass smtp.mailfrom=absahu@codeaurora.org From: Abhishek Sahu To: andy.gross@linaro.org, david.brown@linaro.org, mturquette@baylibre.com, sboyd@codeaurora.org Cc: robh+dt@kernel.org, mark.rutland@arm.com, varada@codeaurora.org, pradeepb@codeaurora.org, snlakshm@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org, linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Abhishek Sahu Subject: [PATCH v4 6/6] clk: qcom: ipq4019: Add the cpu clock frequency change notifier Date: Fri, 25 Nov 2016 21:11:33 +0530 Message-Id: <1480088493-4590-7-git-send-email-absahu@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1480088493-4590-1-git-send-email-absahu@codeaurora.org> References: <1480088493-4590-1-git-send-email-absahu@codeaurora.org> Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The current driver code gives the crash or gets hang while switching the CPU frequency some time. The APSS CPU Clock divider is not glitch free so it the APPS clock need to be switched for stable clock during the change. This patch adds the frequency change notifier for APSS CPU clock. It changes the parent of this clock to stable PLL FEPLL500 when it gets for PRE_RATE_CHANGE event. This event will be generated before actual clock set operations. The clock set operation will again change its corresponding parent by getting the same from frequency table. Signed-off-by: Abhishek Sahu --- drivers/clk/qcom/gcc-ipq4019.c | 45 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/drivers/clk/qcom/gcc-ipq4019.c b/drivers/clk/qcom/gcc-ipq4019.c index eeafca2..94df10d 100644 --- a/drivers/clk/qcom/gcc-ipq4019.c +++ b/drivers/clk/qcom/gcc-ipq4019.c @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -1736,13 +1737,55 @@ static int clk_cpu_div_set_rate(struct clk_hw *hw, unsigned long rate, }; MODULE_DEVICE_TABLE(of, gcc_ipq4019_match_table); +/* Contains index for safe clock during APSS freq change */ +static int gcc_ipq4019_cpu_safe_parent; +static int +gcc_ipq4019_cpu_clk_notifier_fn(struct notifier_block *nb, + unsigned long action, void *data) +{ + int err = 0; + + if (action == PRE_RATE_CHANGE) + err = clk_rcg2_ops.set_parent(&apps_clk_src.clkr.hw, + gcc_ipq4019_cpu_safe_parent); + + return notifier_from_errno(err); +} + +static struct notifier_block gcc_ipq4019_cpu_clk_notifier = { + .notifier_call = gcc_ipq4019_cpu_clk_notifier_fn, +}; + static int gcc_ipq4019_probe(struct platform_device *pdev) { - return qcom_cc_probe(pdev, &gcc_ipq4019_desc); + int err; + + err = qcom_cc_probe(pdev, &gcc_ipq4019_desc); + if (err) + return err; + + gcc_ipq4019_cpu_safe_parent = qcom_find_src_index(&apps_clk_src.clkr.hw, + apps_clk_src.parent_map, + P_FEPLL500); + if (gcc_ipq4019_cpu_safe_parent < 0) + err = gcc_ipq4019_cpu_safe_parent; + + if (!err) + err = clk_notifier_register(apps_clk_src.clkr.hw.clk, + &gcc_ipq4019_cpu_clk_notifier); + + return err; +} + +static int gcc_ipq4019_remove(struct platform_device *pdev) +{ + return clk_notifier_unregister(apps_clk_src.clkr.hw.clk, + &gcc_ipq4019_cpu_clk_notifier); } static struct platform_driver gcc_ipq4019_driver = { .probe = gcc_ipq4019_probe, + .remove = gcc_ipq4019_remove, .driver = { .name = "qcom,gcc-ipq4019", .of_match_table = gcc_ipq4019_match_table,