Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp398866ybk; Fri, 15 May 2020 03:46:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyxUnrNnzD1N9DFrv+duYJGM7QQp1NUu86K4VmuT8EUBqLtpFa/zlTJUhn/CJJb1tXASd2Y X-Received: by 2002:a05:6402:17a3:: with SMTP id j3mr2196122edy.137.1589539574666; Fri, 15 May 2020 03:46:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589539574; cv=none; d=google.com; s=arc-20160816; b=aRXGs0ViixV+6YlsKfZ7I74XbZmESTtjknmnWSNduQ8430wXurnPxs8Rg5x3Azm+sD OMSaMairL4veEqqY0Mcord5C8BzcvepimTP0HjJ23MtGvPMDffi5cniNPxm8RuMLHbRt 4ak2tPFYEToOxKIUOVdA0zR1EEmC0nCD8SfxvptYc3WvAp+pnXOK1pGjF7aLLgbpGx4s sqmV66+W65JaH2opd8XezyMirmfeUNyjhYyRX06eHHPyrSCMasPPT5JU30xdCHHxwUb7 JJ7mERRJ3Y6VMb4RyiF6BFPpDnS+5u8PfFPdWGcSk1pzkf20p1l5LcCmrlS4tvj9hGKm xoHg== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=S2enx25OHMxJRV8d0e92z5OcDw0AoyF4T4mup2oaf0E=; b=y/w+tqbdhsfCEVfJqdcaMbNdGlF0HbwtuA3WAQrfVWmz7GvxbAAh5V459nOlexgA4D 7z3GsxTtb5sP+JkyLXLVHqsVdF+KA3YK2MLuxJuwqB2s2ARDRE8ODuBD0PickSlEf5DS lA8AdcmOLjrVah41nQr49jXevwKUdHkAqjiYCv9+3v1NXRJh3737VqDkSZGH0qzY2pPM lh1XOYR1jWtBE3SZKcTQqiMuT0dWYdK5CrU8BeiTHSuU6UYGK4t9+wL4Nw0Pp0czAmZc FRXj3lEqjYEdqBuSldoiREaZYivgmCTTM+VNh1nvMYwrOb5xikYfXJYbC+Cl26lcHQ1b AXiQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@crapouillou.net header.s=mail header.b=rsKsZZ1l; 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=fail (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l7si825197edq.216.2020.05.15.03.45.51; Fri, 15 May 2020 03:46:14 -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=fail header.i=@crapouillou.net header.s=mail header.b=rsKsZZ1l; 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=fail (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728361AbgEOKoF (ORCPT + 99 others); Fri, 15 May 2020 06:44:05 -0400 Received: from outils.crapouillou.net ([89.234.176.41]:41614 "EHLO crapouillou.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728013AbgEOKoE (ORCPT ); Fri, 15 May 2020 06:44:04 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=crapouillou.net; s=mail; t=1589539427; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=S2enx25OHMxJRV8d0e92z5OcDw0AoyF4T4mup2oaf0E=; b=rsKsZZ1lH5vNaoK7mhO8SCgf1PLm3/AetvD5wi+Q0AH+XQTImAI1guiykBhgWzQ+d6tmsK mUoJHtV5kCv/IE1aNksNJDDXrIaLq7ReBSS2IY82EmPu74uayashNMbvJ1s2WJGp3eeaF9 FRVdMv4XLh2L6YV59lnhAMouNSE/NEQ= From: Paul Cercueil To: Bjorn Andersson , Ohad Ben-Cohen , Arnaud Pouliquen Cc: od@zcrc.me, linux-remoteproc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Cercueil Subject: [PATCH v7 3/5] remoteproc: Add support for runtime PM Date: Fri, 15 May 2020 12:43:38 +0200 Message-Id: <20200515104340.10473-3-paul@crapouillou.net> In-Reply-To: <20200515104340.10473-1-paul@crapouillou.net> References: <20200515104340.10473-1-paul@crapouillou.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Call pm_runtime_get_sync() before the firmware is loaded, and pm_runtime_put() after the remote processor has been stopped. Even though the remoteproc device has no PM callbacks, this allows the parent device's PM callbacks to be properly called. Signed-off-by: Paul Cercueil --- Notes: v2-v4: No change v5: Move calls to prepare/unprepare to rproc_fw_boot/rproc_shutdown v6: Instead of prepare/unprepare callbacks, use PM runtime callbacks v7: Check return value of pm_runtime_get_sync() drivers/remoteproc/remoteproc_core.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index a7f96bc98406..e33d1ef27981 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -1382,6 +1383,12 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw) if (ret) return ret; + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + dev_err(dev, "pm_runtime_get_sync failed: %d\n", ret); + return ret; + } + dev_info(dev, "Booting fw image %s, size %zd\n", name, fw->size); /* @@ -1391,7 +1398,7 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw) ret = rproc_enable_iommu(rproc); if (ret) { dev_err(dev, "can't enable iommu: %d\n", ret); - return ret; + goto put_pm_runtime; } rproc->bootaddr = rproc_get_boot_addr(rproc, fw); @@ -1435,6 +1442,8 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw) rproc->table_ptr = NULL; disable_iommu: rproc_disable_iommu(rproc); +put_pm_runtime: + pm_runtime_put(dev); return ret; } @@ -1840,6 +1849,8 @@ void rproc_shutdown(struct rproc *rproc) rproc_disable_iommu(rproc); + pm_runtime_put(dev); + /* Free the copy of the resource table */ kfree(rproc->cached_table); rproc->cached_table = NULL; @@ -2118,6 +2129,9 @@ struct rproc *rproc_alloc(struct device *dev, const char *name, rproc->state = RPROC_OFFLINE; + pm_runtime_no_callbacks(&rproc->dev); + pm_runtime_enable(&rproc->dev); + return rproc; } EXPORT_SYMBOL(rproc_alloc); @@ -2133,6 +2147,7 @@ EXPORT_SYMBOL(rproc_alloc); */ void rproc_free(struct rproc *rproc) { + pm_runtime_disable(&rproc->dev); put_device(&rproc->dev); } EXPORT_SYMBOL(rproc_free); -- 2.26.2