From patchwork Mon May 14 21:16:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Enric Balletbo i Serra X-Patchwork-Id: 10399357 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 13CBD601FB for ; Mon, 14 May 2018 21:22:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 75C8C2856A for ; Mon, 14 May 2018 21:22:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 401172852A; Mon, 14 May 2018 21:22:16 +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=-2.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, MAILING_LIST_MULTI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 81FF328592 for ; Mon, 14 May 2018 21:22:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=k3k+BH0ixDRXtJEU9XqMQwieBtZGrThrkLHX5W1Xd3w=; b=cM7D3bT1c2hOimiN3kJuuIhRyR jnJ+Lqr4IT6KbGMl30xsd5zS0c/H96wp4UvqwAtWplVHZh00msYLsem5aRBUPHThMOKI3c9Hxhr5i dgHFVM7Jz7mpvSenSF7ks3IIVFN9I5zw3nC1geALU30NvYwa2SvfFjeH29ZUey64gr+/liqBjJC5W PDTDyRflhRwPxS/G4JU/hkkUt0j8ibBPnPCtcVW907H+GxUbIalNJNB4s5VN4D9oS/J+nXNM0SeX0 uwjB78FYP2B7wv7OQdRomqOmF1Ot2pVSEnKiVhB4snQXQ2mWYAoleqSTpMmsFBYxH1hi+MBPli6UJ uKJDcNsA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fIKuy-0006uI-IN; Mon, 14 May 2018 21:22:04 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fIKps-0002im-9O; Mon, 14 May 2018 21:16:53 +0000 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: eballetbo) with ESMTPSA id 3F6F8263971 From: Enric Balletbo i Serra To: MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Rob Herring , Will Deacon , Heiko Stuebner , Michael Turquette , Stephen Boyd , Sandy Huang , David Airlie Subject: [RFC PATCH 04/10] devfreq: rk3399_dmc / rockchip: pm_domains: Register notify to DMC driver. Date: Mon, 14 May 2018 23:16:04 +0200 Message-Id: <20180514211610.26618-5-enric.balletbo@collabora.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180514211610.26618-1-enric.balletbo@collabora.com> References: <20180514211610.26618-1-enric.balletbo@collabora.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180514_141648_618546_80341A9D X-CRM114-Status: GOOD ( 20.35 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Rafael J. Wysocki" , Lin Huang , Geert Uytterhoeven , linux-pm@vger.kernel.org, Derek Basehore , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, Jeffy Chen , Sean Paul , Elaine Zhang , kernel@collabora.com, linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Lin Huang The DMC (Dynamic Memory Interface) controller does a SiP call to the Trusted Firmware-A (TF-A) to change the DDR clock frequency. When this happens the TF-A writes to the PMU bus idle request register (PMU_BUS_IDLE_REQ) but at the same time it is possible that the Rockchip power domain driver writes to the same register. So, add a notification mechanism to ensure that the DMC and the PD driver does not access to this register at the same time. Signed-off-by: Lin Huang [rewrite commit message] Signed-off-by: Enric Balletbo i Serra --- As I explained in the cover letter I have doubts regarding this patch but I did not find another way to do it. So I will appreciate any feedback on this. drivers/devfreq/rk3399_dmc.c | 7 ++++++ drivers/soc/rockchip/pm_domains.c | 36 +++++++++++++++++++++++++++++++ include/soc/rockchip/rk3399_dmc.h | 14 ++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 include/soc/rockchip/rk3399_dmc.h diff --git a/drivers/devfreq/rk3399_dmc.c b/drivers/devfreq/rk3399_dmc.c index cc1bbca3fb15..2c4985a501cb 100644 --- a/drivers/devfreq/rk3399_dmc.c +++ b/drivers/devfreq/rk3399_dmc.c @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -443,6 +444,12 @@ static int rk3399_dmcfreq_probe(struct platform_device *pdev) data->dev = dev; platform_set_drvdata(pdev, data); + rockchip_pm_register_dmcfreq_notifier(data->devfreq); + if (ret < 0) { + dev_err(dev, "Failed to register dmcfreq notifier\n"); + return ret; + } + return 0; } diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c index 53efc386b1ad..b0e66f24b3e3 100644 --- a/drivers/soc/rockchip/pm_domains.c +++ b/drivers/soc/rockchip/pm_domains.c @@ -8,6 +8,7 @@ * published by the Free Software Foundation. */ +#include #include #include #include @@ -76,9 +77,13 @@ struct rockchip_pmu { const struct rockchip_pmu_info *info; struct mutex mutex; /* mutex lock for pmu */ struct genpd_onecell_data genpd_data; + struct devfreq *devfreq; + struct notifier_block dmc_nb; struct generic_pm_domain *domains[]; }; +static struct rockchip_pmu *dmc_pmu; + #define to_rockchip_pd(gpd) container_of(gpd, struct rockchip_pm_domain, genpd) #define DOMAIN(pwr, status, req, idle, ack, wakeup) \ @@ -601,6 +606,35 @@ static int rockchip_pm_add_subdomain(struct rockchip_pmu *pmu, return error; } +static int rk3399_dmcfreq_notify(struct notifier_block *nb, + unsigned long event, void *data) +{ + if (event == DEVFREQ_PRECHANGE) + mutex_lock(&dmc_pmu->mutex); + else if (event == DEVFREQ_POSTCHANGE) + mutex_unlock(&dmc_pmu->mutex); + + return NOTIFY_OK; +} + +int rockchip_pm_register_dmcfreq_notifier(struct devfreq *devfreq) +{ + int ret; + + if (!dmc_pmu) + return -EPROBE_DEFER; + + dmc_pmu->devfreq = devfreq; + dmc_pmu->dmc_nb.notifier_call = rk3399_dmcfreq_notify; + ret = devm_devfreq_register_notifier(devfreq->dev.parent, + dmc_pmu->devfreq, + &dmc_pmu->dmc_nb, + DEVFREQ_TRANSITION_NOTIFIER); + + return ret; +} +EXPORT_SYMBOL(rockchip_pm_register_dmcfreq_notifier); + static int rockchip_pm_domain_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -694,6 +728,8 @@ static int rockchip_pm_domain_probe(struct platform_device *pdev) goto err_out; } + dmc_pmu = pmu; + return 0; err_out: diff --git a/include/soc/rockchip/rk3399_dmc.h b/include/soc/rockchip/rk3399_dmc.h new file mode 100644 index 000000000000..031a62607f61 --- /dev/null +++ b/include/soc/rockchip/rk3399_dmc.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2016-2018, Fuzhou Rockchip Electronics Co., Ltd + * Author: Lin Huang + */ + +#ifndef __SOC_RK3399_DMC_H +#define __SOC_RK3399_DMC_H + +#include + +int rockchip_pm_register_dmcfreq_notifier(struct devfreq *devfreq); + +#endif