From patchwork Thu Nov 3 06:16:09 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: huang lin X-Patchwork-Id: 9410325 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 56A6760585 for ; Thu, 3 Nov 2016 06:18:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 45C8A2A511 for ; Thu, 3 Nov 2016 06:18:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 38A0D2A516; Thu, 3 Nov 2016 06:18:27 +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=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id E28042A511 for ; Thu, 3 Nov 2016 06:18:26 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1c2BKc-0007wD-5R; Thu, 03 Nov 2016 06:16:58 +0000 Received: from mail-pf0-f194.google.com ([209.85.192.194]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1c2BKO-0007s9-H7; Thu, 03 Nov 2016 06:16:45 +0000 Received: by mail-pf0-f194.google.com with SMTP id i88so3835265pfk.2; Wed, 02 Nov 2016 23:16:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=C+zc+4IpfiWWKvZ/mlWM5m0QKmX3kj03ITxqD5Ph9C4=; b=Y0QH+BeUiuTQOE31N4TAkGpGxG7zSIdZ/JefCdQHjyS931PsXr8dMFymQjR+MI6qjy x6szmO4o/rrpWw6FRjc3V6zOT7vg1iWEFsgQut8s1cVy/maNQkY1SF8HSo7KlRLq/qxY QNli+0eZrpg9tfTSV18BrfAyqMFgaU9a/vElj2p8IJEyYhs9Jul19nyLjOyp/gsGTLUz jJERTQ6dgXLio3u0yxiKuwj+n0CvBNZyzX61k624YdaMm01KHyRqH0Sg8dLvY+6MN1a1 Onxz6bO+kOJgnwYpWVFzbmIwprrTAHZHo4BLMq+dZgj2qENEbcdF5AYjNq8ICJz6I6gu aH+g== X-Gm-Message-State: ABUngvc9TCVRO0TKc9jJLqhKrcsVzzJJZCcAc4c8mZDSqb+f8FPzCbPa/kFfvXHgvPQkPw== X-Received: by 10.99.55.8 with SMTP id e8mr3554506pga.55.1478153782886; Wed, 02 Nov 2016 23:16:22 -0700 (PDT) Received: from localhost.localdomain ([103.29.142.67]) by smtp.gmail.com with ESMTPSA id p14sm9238777par.25.2016.11.02.23.16.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 02 Nov 2016 23:16:21 -0700 (PDT) From: Lin Huang To: myungjoo.ham@samsung.com Subject: [PATCH v2 1/2] PM/devfreq: add suspend frequency support Date: Thu, 3 Nov 2016 14:16:09 +0800 Message-Id: <1478153770-8433-2-git-send-email-hl@rock-chips.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1478153770-8433-1-git-send-email-hl@rock-chips.com> References: <1478153770-8433-1-git-send-email-hl@rock-chips.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161102_231644_649312_5009EA2F X-CRM114-Status: GOOD ( 13.64 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Lin Huang , linux-pm@vger.kernel.org, dbasehore@chromium.org, dianders@chromium.org, linux-kernel@vger.kernel.org, cw00.choi@samsung.com, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Add suspend frequency support and if needed set it to the frequency obtained from the suspend opp (can be defined using opp-v2 bindings and is optional). Change-Id: Iaa0d3848d63d9ce03f65ea76f263e4685a4c295e Signed-off-by: Lin Huang --- Changes in v2: - use update_devfreq() instead devfreq_update_status() drivers/devfreq/devfreq.c | 17 ++++++++++++++++- include/linux/devfreq.h | 9 +++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index bf3ea76..0a76282 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -364,7 +364,10 @@ void devfreq_monitor_suspend(struct devfreq *devfreq) return; } - devfreq_update_status(devfreq, devfreq->previous_freq); + if (devfreq->suspend_freq) + update_devfreq(devfreq, devfreq->suspend_freq); + else + devfreq_update_status(devfreq, devfreq->previous_freq); devfreq->stop_polling = true; mutex_unlock(&devfreq->lock); cancel_delayed_work_sync(&devfreq->work); @@ -1251,6 +1254,18 @@ struct dev_pm_opp *devfreq_recommended_opp(struct device *dev, } EXPORT_SYMBOL(devfreq_recommended_opp); +void devfreq_opp_get_suspend_opp(struct device *dev, struct devfreq *devfreq) +{ + struct dev_pm_opp *suspend_opp; + + rcu_read_lock(); + suspend_opp = dev_pm_opp_get_suspend_opp(dev); + if (suspend_opp) + devfreq->suspend_freq = dev_pm_opp_get_freq(suspend_opp); + rcu_read_unlock(); +} +EXPORT_SYMBOL(devfreq_opp_get_suspend_opp); + /** * devfreq_register_opp_notifier() - Helper function to get devfreq notified * for any changes in the OPP availability diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index 2de4e2e..c785ad9 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -88,6 +88,7 @@ struct devfreq_dev_status { */ struct devfreq_dev_profile { unsigned long initial_freq; + unsigned long suspend_freq; unsigned int polling_ms; int (*target)(struct device *dev, unsigned long *freq, u32 flags); @@ -172,6 +173,7 @@ struct devfreq { struct delayed_work work; unsigned long previous_freq; + unsigned long suspend_freq; struct devfreq_dev_status last_status; void *data; /* private data for governors */ @@ -214,6 +216,8 @@ extern void devm_devfreq_remove_device(struct device *dev, /* Helper functions for devfreq user device driver with OPP. */ extern struct dev_pm_opp *devfreq_recommended_opp(struct device *dev, unsigned long *freq, u32 flags); +extern void devfreq_opp_get_suspend_opp(struct device *dev, + struct devfreq *devfreq); extern int devfreq_register_opp_notifier(struct device *dev, struct devfreq *devfreq); extern int devfreq_unregister_opp_notifier(struct device *dev, @@ -348,6 +352,11 @@ static inline struct dev_pm_opp *devfreq_recommended_opp(struct device *dev, return ERR_PTR(-EINVAL); } +static inline void devfreq_opp_get_suspend_opp(struct device *dev, + struct devfreq *devfreq) +{ +} + static inline int devfreq_register_opp_notifier(struct device *dev, struct devfreq *devfreq) {