From patchwork Fri Dec 5 13:41:30 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arto Merilainen X-Patchwork-Id: 418099 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 91AED140082 for ; Sat, 6 Dec 2014 00:42:42 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752880AbaLENmG (ORCPT ); Fri, 5 Dec 2014 08:42:06 -0500 Received: from hqemgate16.nvidia.com ([216.228.121.65]:10546 "EHLO hqemgate16.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752208AbaLENmC (ORCPT ); Fri, 5 Dec 2014 08:42:02 -0500 Received: from hqnvupgp07.nvidia.com (Not Verified[216.228.121.13]) by hqemgate16.nvidia.com id ; Fri, 05 Dec 2014 05:42:11 -0800 Received: from hqemhub02.nvidia.com ([172.20.12.94]) by hqnvupgp07.nvidia.com (PGP Universal service); Fri, 05 Dec 2014 05:39:23 -0800 X-PGP-Universal: processed; by hqnvupgp07.nvidia.com on Fri, 05 Dec 2014 05:39:23 -0800 Received: from dhcp-10-21-25-188.Nvidia.com (172.20.144.16) by hqemhub02.nvidia.com (172.20.150.31) with Microsoft SMTP Server (TLS) id 8.3.342.0; Fri, 5 Dec 2014 05:42:00 -0800 From: Arto Merilainen To: , , , CC: , , , , , , , , Subject: [RFC RESEND 1/3] PM / devfreq: Add watermark events Date: Fri, 5 Dec 2014 15:41:30 +0200 Message-ID: <1417786892-477-2-git-send-email-amerilainen@nvidia.com> X-Mailer: git-send-email 1.8.1.5 In-Reply-To: <1417786892-477-1-git-send-email-amerilainen@nvidia.com> References: <1417786892-477-1-git-send-email-amerilainen@nvidia.com> X-NVConfidentiality: public MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Shridhar Rasal This patch adds support for watermark events. These events inform the governor that the device load has gone below (low watermark) or above (high watermark) certain load value. Signed-off-by: Shridhar Rasal Signed-off-by: Arto Merilainen --- drivers/devfreq/devfreq.c | 19 +++++++++++++++++++ drivers/devfreq/governor.h | 1 + include/linux/devfreq.h | 26 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 30b538d8cc90..8333d024132a 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -1050,6 +1050,25 @@ static struct attribute *devfreq_attrs[] = { }; ATTRIBUTE_GROUPS(devfreq); +/** + * devfreq_watermark_event() - Handles watermark events + * @devfreq: the devfreq instance to be updated + * @type: type of watermark event + */ +int devfreq_watermark_event(struct devfreq *devfreq, int type) +{ + if (!devfreq) + return -EINVAL; + + if (!devfreq->governor) + return -EINVAL; + + return devfreq->governor->event_handler(devfreq, + DEVFREQ_GOV_WMARK, &type); +} +EXPORT_SYMBOL(devfreq_watermark_event); + + static int __init devfreq_init(void) { devfreq_class = class_create(THIS_MODULE, "devfreq"); diff --git a/drivers/devfreq/governor.h b/drivers/devfreq/governor.h index fad7d6321978..fb9875388f3f 100644 --- a/drivers/devfreq/governor.h +++ b/drivers/devfreq/governor.h @@ -24,6 +24,7 @@ #define DEVFREQ_GOV_INTERVAL 0x3 #define DEVFREQ_GOV_SUSPEND 0x4 #define DEVFREQ_GOV_RESUME 0x5 +#define DEVFREQ_GOV_WMARK 0x6 /* Caution: devfreq->lock must be locked before calling update_devfreq */ extern int update_devfreq(struct devfreq *devfreq); diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index f1863dcd83ea..b5bf6c4fe286 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -21,6 +21,12 @@ struct devfreq; +enum watermark_type { + NO_WATERMARK_EVENT = 0, + HIGH_WATERMARK_EVENT = 1, + LOW_WATERMARK_EVENT = 2 +}; + /** * struct devfreq_dev_status - Data given from devfreq user device to * governors. Represents the performance @@ -68,6 +74,16 @@ struct devfreq_dev_status { * status to devfreq, which is used by governors. * @get_cur_freq: The device should provide the current frequency * at which it is operating. + * @set_high_wmark: This is an optional callback to set high + * watermark for watermark event. The value is + * be scaled between 0 and 1000 where 1000 equals to + * 100% load. Setting this value to 1000 disables + * the event + * @set_low_wmark: This is an optional callback to set low + * watermark for watermark event. The value is + * be scaled between 0 and 1000 where 1000 equals to + * 100% load. Setting this value to 0 disables the + * event. * @exit: An optional callback that is called when devfreq * is removing the devfreq object due to error or * from devfreq_remove_device() call. If the user @@ -84,6 +100,8 @@ struct devfreq_dev_profile { int (*get_dev_status)(struct device *dev, struct devfreq_dev_status *stat); int (*get_cur_freq)(struct device *dev, unsigned long *freq); + int (*set_high_wmark)(struct device *dev, unsigned int val); + int (*set_low_wmark)(struct device *dev, unsigned int val); void (*exit)(struct device *dev); unsigned int *freq_table; @@ -191,6 +209,8 @@ extern void devm_devfreq_remove_device(struct device *dev, /* Supposed to be called by PM_SLEEP/PM_RUNTIME callbacks */ extern int devfreq_suspend_device(struct devfreq *devfreq); extern int devfreq_resume_device(struct devfreq *devfreq); +extern int devfreq_watermark_event(struct devfreq *devfreq, + int type); /* Helper functions for devfreq user device driver with OPP. */ extern struct dev_pm_opp *devfreq_recommended_opp(struct device *dev, @@ -289,6 +309,12 @@ static inline void devm_devfreq_unregister_opp_notifier(struct device *dev, struct devfreq *devfreq) { } + +static inline int devfreq_watermark_event(struct devfreq *devfreq, + int type) +{ + return 0; +} #endif /* CONFIG_PM_DEVFREQ */ #endif /* __LINUX_DEVFREQ_H__ */