All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chanwoo Choi <cw00.choi@samsung.com>
To: myungjoo.ham@samsung.com, kyungmin.park@samsung.com,
	cw00.choi@samsung.com
Cc: rafael.j.wysocki@intel.com, chanwoo@kernel.org,
	inki.dae@samsung.com, linux-kernel@vger.kernel.org,
	linux-pm@vger.kernel.org
Subject: [PATCH 12/12] PM / devfreq: Add opp_notifier_cb() function pointer to support OPP notifier
Date: Thu, 24 Aug 2017 10:42:59 +0900	[thread overview]
Message-ID: <1503538979-22693-13-git-send-email-cw00.choi@samsung.com> (raw)
In-Reply-To: <1503538979-22693-1-git-send-email-cw00.choi@samsung.com>

The devfreq uses the OPP interface as a mandatory method
and so the devfreq has to support the OPP notifier in order to
catch the OPP events. So, this patch adds the new opp_notifier_cb()
function pointer in the struct devfreq_dev_profile. The user can
add the their own callback function to receive the OPP events.

Also, the devfreq provides the default OPP notifeir callback
in order to remake the frequency table when OPP events happen.
- default_opp_notifier_cb()

After merged the commit 0ec09ac2cebe ("PM / devfreq: Set the
freq_table of devfreq device"), if the freq_table is NULL,
the devfreq_add_device() makes the freq_table by using OPP interface.
In this case, the devfreq should handle the freq_table
when OPP events happen such as OPP_EVENT_REMOVE, OPP_EVENT_ADD.

When the dev_pm_opp_add/remove() are called, the devfreq core
has to remake the frequency table with the changed OPP information
in the default_opp_notifier_cb().

Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
 drivers/devfreq/devfreq.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
 include/linux/devfreq.h   | 12 ++++++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
index 7efa867e4aea..d313bed95871 100644
--- a/drivers/devfreq/devfreq.c
+++ b/drivers/devfreq/devfreq.c
@@ -163,6 +163,39 @@ static int set_freq_table(struct devfreq *devfreq)
 	return 0;
 }
 
+static int default_opp_notifier_cb(struct notifier_block *nb,
+				unsigned long opp_event, void *opp)
+{
+	struct devfreq *devfreq = container_of(nb, struct devfreq, nb);
+	struct devfreq_dev_profile *profile = devfreq->profile;
+	struct device *dev = devfreq->dev.parent;
+	int ret = 0;
+
+	mutex_lock(&devfreq->lock);
+
+	switch (opp_event) {
+	case OPP_EVENT_ADD:
+	case OPP_EVENT_REMOVE:
+		/* Free the frequency table */
+		profile->max_state = 0;
+		kfree(dev, profile->freq_table);
+
+		/* Remake the frequency table with the changed OPP  */
+		ret = set_freq_table(devfreq);
+		if (ret < 0)
+			goto out;
+		break;
+	case OPP_EVENT_DISABLE:
+	case OPP_EVENT_ENABLE:
+	default:
+		break;
+	}
+
+out:
+	mutex_unlock(&devfreq->lock);
+	return ret;
+}
+
 /**
  * devfreq_update_status() - Update statistics of devfreq behavior
  * @devfreq:	the devfreq instance
@@ -637,6 +670,15 @@ struct devfreq *devfreq_add_device(struct device *dev,
 
 	srcu_init_notifier_head(&devfreq->transition_notifier_list);
 
+	/* Register OPP notifier to catch the change of OPP entries */
+	if (!devfreq->nb.notifier_call)
+		devfreq->nb.notifier_call = default_opp_notifier_cb;
+	err = dev_pm_opp_register_notifier(dev, &devfreq->nb);
+	if (err < 0) {
+		mutex_unlock(&devfreq->lock);
+		dev_err(dev, "Unable to register opp notifier (%d)\n", err);
+		goto err_reg;
+	}
 	mutex_unlock(&devfreq->lock);
 
 	mutex_lock(&devfreq_list_lock);
@@ -663,9 +705,10 @@ struct devfreq *devfreq_add_device(struct device *dev,
 	return devfreq;
 
 err_init:
+	dev_pm_opp_unregister_notifier(dev, &devfreq->nb);
 	list_del(&devfreq->node);
 	mutex_unlock(&devfreq_list_lock);
-
+err_reg:
 	device_unregister(&devfreq->dev);
 err_dev:
 	if (devfreq)
@@ -686,6 +729,7 @@ int devfreq_remove_device(struct devfreq *devfreq)
 	if (!devfreq)
 		return -EINVAL;
 
+	dev_pm_opp_unregister_notifier(devfreq->dev.parent, &devfreq->nb);
 	device_unregister(&devfreq->dev);
 
 	return 0;
diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h
index d6f054545799..9596fd195986 100644
--- a/include/linux/devfreq.h
+++ b/include/linux/devfreq.h
@@ -84,6 +84,16 @@ struct devfreq_dev_status {
  *			from devfreq_remove_device() call. If the user
  *			has registered devfreq->nb at a notifier-head,
  *			this is the time to unregister it.
+ * @opp_notifier_cb:	And optional callback that is called when following
+ *			OPP events happen from OPP interface. If the user
+ *			doesn't add this callback, the devfreq core add
+ *			the default callback funtion to handle the OPP events.
+ *			- Second parameter : the OPP event
+ *				: OPP_EVENT_ADD
+ *				: OPP_EVENT_REMOVE
+ *				: OPP_EVENT_ENABLE
+ *				: OPP_EVENT_DISABLE,
+ *			- Third parameter : the instance of struct dev_pm_opp
  * @freq_table:	Optional list of frequencies to support statistics.
  * @max_state:	The size of freq_table.
  */
@@ -96,6 +106,8 @@ struct devfreq_dev_profile {
 			      struct devfreq_dev_status *stat);
 	int (*get_cur_freq)(struct device *dev, unsigned long *freq);
 	void (*exit)(struct device *dev);
+	int (*opp_notifier_cb)(struct notifier_block *nb,
+				unsigned long opp_event, void *opp);
 
 	unsigned long *freq_table;
 	unsigned int max_state;
-- 
1.9.1

  parent reply	other threads:[~2017-08-24  1:44 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20170824014259epcas2p4d92e5c404f54b629e7bdfb6a2c5ed0ed@epcas2p4.samsung.com>
2017-08-24  1:42 ` [PATCH 00/12] PM / devfreq: Use OPP interface to handle the frequency Chanwoo Choi
     [not found]   ` <CGME20170824014259epcas2p398a53a9a76d9aff7e35cf8515ec4e46a@epcas2p3.samsung.com>
2017-08-24  1:42     ` [PATCH 01/12] PM / devfreq: Fix memory leak when fail to register device Chanwoo Choi
     [not found]   ` <CGME20170824014259epcas2p33d211dd0f29ebee0fc2fd7415d8294d9@epcas2p3.samsung.com>
2017-08-24  1:42     ` [PATCH 02/12] PM / devfreq: Fix locking range for making the frequency table Chanwoo Choi
     [not found]   ` <CGME20170824014259epcas2p174f90081b192ae5239f0130413ba3845@epcas2p1.samsung.com>
2017-08-24  1:42     ` [PATCH 03/12] PM / devfreq: Move private devfreq_update_stats() into devfreq Chanwoo Choi
     [not found]   ` <CGME20170824014259epcas2p2d2b85a7c324b101e7e4e8551873ca3ab@epcas2p2.samsung.com>
2017-08-24  1:42     ` [PATCH 04/12] PM / devfreq: Add dependency on PM_OPP Chanwoo Choi
     [not found]   ` <CGME20170824014259epcas2p161d781837dffe0724c0fd73fc477281a@epcas2p1.samsung.com>
2017-08-24  1:42     ` [PATCH 05/12] PM / devfreq: Set min/max_freq when adding the devfreq device Chanwoo Choi
     [not found]   ` <CGME20170824014259epcas2p1c8618349053a9aab5d8774234e322848@epcas2p1.samsung.com>
2017-08-24  1:42     ` [PATCH 06/12] PM / devfreq: Check the entered min/max_freq is supported or not Chanwoo Choi
     [not found]   ` <CGME20170824014300epcas2p3069258855c2e233ab4c01745eae93a73@epcas2p3.samsung.com>
2017-08-24  1:42     ` [PATCH 07/12] Revert "PM / devfreq: Add show_one macro to delete the duplicate code" Chanwoo Choi
     [not found]   ` <CGME20170824014300epcas1p442352e3d95c164aa023bf16120e7f7a4@epcas1p4.samsung.com>
2017-08-24  1:42     ` [PATCH 08/12] PM / devfreq: Show the available min/max frequency through sysfs node Chanwoo Choi
     [not found]   ` <CGME20170824014300epcas2p2642c98590f3592ba814e421c6584a7b5@epcas2p2.samsung.com>
2017-08-24  1:42     ` [PATCH 09/12] PM / devfreq: Show whole available frequencies Chanwoo Choi
     [not found]   ` <CGME20170824014300epcas2p452c864106cf4fd9754d075d57b8a9ca1@epcas2p4.samsung.com>
2017-08-24  1:42     ` [PATCH 10/12] PM / devfreq: Remove 'devfreq' prefix from helper function Chanwoo Choi
     [not found]   ` <CGME20170824014300epcas2p27dfdc54aae8ea29e5e60425a87cf4aab@epcas2p2.samsung.com>
2017-08-24  1:42     ` [PATCH 11/12] PM / devfreq: Remove exported opp_notifier function Chanwoo Choi
     [not found]   ` <CGME20170824014300epcas1p3bf35f95d83b2a2ed36126f918638b8fc@epcas1p3.samsung.com>
2017-08-24  1:42     ` Chanwoo Choi [this message]
2017-08-24  3:58       ` [PATCH 12/12] PM / devfreq: Add opp_notifier_cb() function pointer to support OPP notifier Chanwoo Choi
     [not found]   ` <CGME20170824014259epcas2p398a53a9a76d9aff7e35cf8515ec4e46a@epcms1p6>
2017-08-28  0:17     ` [PATCH 01/12] PM / devfreq: Fix memory leak when fail to register device MyungJoo Ham
2017-08-28  0:23       ` Chanwoo Choi
     [not found]       ` <CGME20170824014259epcas2p398a53a9a76d9aff7e35cf8515ec4e46a@epcms1p1>
2017-08-28  1:30         ` MyungJoo Ham
     [not found]   ` <CGME20170824014259epcas2p33d211dd0f29ebee0fc2fd7415d8294d9@epcms1p2>
2017-08-28  0:25     ` [PATCH 02/12] PM / devfreq: Fix locking range for making the frequency table MyungJoo Ham
     [not found]   ` <CGME20170824014259epcas2p174f90081b192ae5239f0130413ba3845@epcms1p4>
2017-08-28  1:20     ` [PATCH 03/12] PM / devfreq: Move private devfreq_update_stats() into devfreq MyungJoo Ham
     [not found]   ` <CGME20170824014259epcas2p2d2b85a7c324b101e7e4e8551873ca3ab@epcms1p8>
2017-08-28  1:23     ` [PATCH 04/12] PM / devfreq: Add dependency on PM_OPP MyungJoo Ham
     [not found]   ` <CGME20170824014300epcas2p452c864106cf4fd9754d075d57b8a9ca1@epcms1p1>
2017-08-28  1:37     ` [PATCH 10/12] PM / devfreq: Remove 'devfreq' prefix from helper function MyungJoo Ham
2017-08-28  2:24       ` Chanwoo Choi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1503538979-22693-13-git-send-email-cw00.choi@samsung.com \
    --to=cw00.choi@samsung.com \
    --cc=chanwoo@kernel.org \
    --cc=inki.dae@samsung.com \
    --cc=kyungmin.park@samsung.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=myungjoo.ham@samsung.com \
    --cc=rafael.j.wysocki@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.