* [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement
@ 2016-11-24 5:01 ` Chanwoo Choi
2016-11-24 5:01 ` [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings Chanwoo Choi
` (6 more replies)
0 siblings, 7 replies; 12+ messages in thread
From: Chanwoo Choi @ 2016-11-24 5:01 UTC (permalink / raw)
To: myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel, Chanwoo Choi
This patches modify the devfreq and devfreq-event framework for improving
them. But, these patches don't make an impact to operation of
devfreq/devfreq-event.
Chanwoo Choi (6):
PM / devfreq: Fix the checkpatch warnings
PM / devfreq: Modify the device name as devfreq[X] for sysfs
PM / devfreq: event: Simplify the sysfs name of devfreq-event device
PM / devfreq: Remove the duplicate sysfs entry for current frequency
PM / devfreq: event: exynos-ppmu: Use the regmap interface to handle the registers
PM / devfreq: event: exynos-ppmu: Add the completion log of device registration
drivers/devfreq/devfreq-event.c | 2 +-
drivers/devfreq/devfreq.c | 25 ++-
drivers/devfreq/event/exynos-ppmu.c | 329 ++++++++++++++++++++++++++----------
3 files changed, 251 insertions(+), 105 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings
2016-11-24 5:01 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
@ 2016-11-24 5:01 ` Chanwoo Choi
2016-11-24 10:20 ` Joe Perches
2016-11-24 5:01 ` [PATCH 2/6] PM / devfreq: Modify the device name as devfreq[X] for sysfs Chanwoo Choi
` (5 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Chanwoo Choi @ 2016-11-24 5:01 UTC (permalink / raw)
To: myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel, Chanwoo Choi
This patch just fixes the checkpatch warnings.
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
drivers/devfreq/devfreq.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
index a324801d6a66..dfef5ea57e4c 100644
--- a/drivers/devfreq/devfreq.c
+++ b/drivers/devfreq/devfreq.c
@@ -538,15 +538,14 @@ struct devfreq *devfreq_add_device(struct device *dev,
devfreq = find_device_devfreq(dev);
mutex_unlock(&devfreq_list_lock);
if (!IS_ERR(devfreq)) {
- dev_err(dev, "%s: Unable to create devfreq for the device. It already has one.\n", __func__);
+ dev_err(dev, "%s: Unable to create devfreq for the device.\n",
+ __func__);
err = -EINVAL;
goto err_out;
}
devfreq = kzalloc(sizeof(struct devfreq), GFP_KERNEL);
if (!devfreq) {
- dev_err(dev, "%s: Unable to create devfreq for the device\n",
- __func__);
err = -ENOMEM;
goto err_out;
}
@@ -576,11 +575,13 @@ struct devfreq *devfreq_add_device(struct device *dev,
goto err_out;
}
- devfreq->trans_table = devm_kzalloc(&devfreq->dev, sizeof(unsigned int) *
+ devfreq->trans_table = devm_kzalloc(&devfreq->dev,
+ sizeof(unsigned int) *
devfreq->profile->max_state *
devfreq->profile->max_state,
GFP_KERNEL);
- devfreq->time_in_state = devm_kzalloc(&devfreq->dev, sizeof(unsigned long) *
+ devfreq->time_in_state = devm_kzalloc(&devfreq->dev,
+ sizeof(unsigned long) *
devfreq->profile->max_state,
GFP_KERNEL);
devfreq->last_stat_updated = jiffies;
@@ -990,7 +991,7 @@ static ssize_t cur_freq_show(struct device *dev, struct device_attribute *attr,
if (devfreq->profile->get_cur_freq &&
!devfreq->profile->get_cur_freq(devfreq->dev.parent, &freq))
- return sprintf(buf, "%lu\n", freq);
+ return sprintf(buf, "%lu\n", freq);
return sprintf(buf, "%lu\n", devfreq->previous_freq);
}
--
1.9.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/6] PM / devfreq: Modify the device name as devfreq[X] for sysfs
2016-11-24 5:01 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
2016-11-24 5:01 ` [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings Chanwoo Choi
@ 2016-11-24 5:01 ` Chanwoo Choi
2016-11-24 5:01 ` [PATCH 3/6] PM / devfreq: event: Simplify the sysfs name of devfreq-event device Chanwoo Choi
` (4 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Chanwoo Choi @ 2016-11-24 5:01 UTC (permalink / raw)
To: myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel, Chanwoo Choi
This patch modifies the device name as devfreq[X] for sysfs by using the 'devfreq'
prefix word instead of separate device name. On user-space aspect, user would
find the some devfreq drvier with 'devfreq[X]' pattern. So, this patch modify the
device name as following:
- /sys/class/devfreq/[non-standard device name] -> /sys/class/devfreq/devfreq[X]
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
drivers/devfreq/devfreq.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
index dfef5ea57e4c..4d2b7e5b8d3c 100644
--- a/drivers/devfreq/devfreq.c
+++ b/drivers/devfreq/devfreq.c
@@ -527,6 +527,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
{
struct devfreq *devfreq;
struct devfreq_governor *governor;
+ static atomic_t devfreq_no = ATOMIC_INIT(-1);
int err = 0;
if (!dev || !profile || !governor_name) {
@@ -568,7 +569,8 @@ struct devfreq *devfreq_add_device(struct device *dev,
mutex_lock(&devfreq->lock);
}
- dev_set_name(&devfreq->dev, "%s", dev_name(dev));
+ dev_set_name(&devfreq->dev, "devfreq%lu",
+ (unsigned long)atomic_inc_return(&devfreq_no));
err = device_register(&devfreq->dev);
if (err) {
mutex_unlock(&devfreq->lock);
--
1.9.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/6] PM / devfreq: event: Simplify the sysfs name of devfreq-event device
2016-11-24 5:01 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
2016-11-24 5:01 ` [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings Chanwoo Choi
2016-11-24 5:01 ` [PATCH 2/6] PM / devfreq: Modify the device name as devfreq[X] for sysfs Chanwoo Choi
@ 2016-11-24 5:01 ` Chanwoo Choi
2016-11-24 5:01 ` [PATCH 4/6] PM / devfreq: Remove the duplicate sysfs entry for current frequency Chanwoo Choi
` (3 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Chanwoo Choi @ 2016-11-24 5:01 UTC (permalink / raw)
To: myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel, Chanwoo Choi
This patch just removes '.' character from the sysfs name of devfreq-event
device as following. Usually, the subsystem uses the similiar naming style
such as {framework name}{Number}.
- old : /sys/class/devfreq-event/event.X
- new : /sys/class/devfreq-event/eventX
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
drivers/devfreq/devfreq-event.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/devfreq/devfreq-event.c b/drivers/devfreq/devfreq-event.c
index 9aea2c7ecbe6..39f8704ad664 100644
--- a/drivers/devfreq/devfreq-event.c
+++ b/drivers/devfreq/devfreq-event.c
@@ -329,7 +329,7 @@ struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
edev->dev.class = devfreq_event_class;
edev->dev.release = devfreq_event_release_edev;
- dev_set_name(&edev->dev, "event.%d", atomic_inc_return(&event_no) - 1);
+ dev_set_name(&edev->dev, "event%d", atomic_inc_return(&event_no) - 1);
ret = device_register(&edev->dev);
if (ret < 0) {
put_device(&edev->dev);
--
1.9.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/6] PM / devfreq: Remove the duplicate sysfs entry for current frequency
2016-11-24 5:01 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
` (2 preceding siblings ...)
2016-11-24 5:01 ` [PATCH 3/6] PM / devfreq: event: Simplify the sysfs name of devfreq-event device Chanwoo Choi
@ 2016-11-24 5:01 ` Chanwoo Choi
2016-11-24 5:01 ` [PATCH 5/6] PM / devfreq: event: exynos-ppmu: Use the regmap interface to handle the registers Chanwoo Choi
` (2 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Chanwoo Choi @ 2016-11-24 5:01 UTC (permalink / raw)
To: myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel, Chanwoo Choi
This patch removes the duplicate 'target_freq' entry which shows the current
frequency of devfreq device. The 'cur_freq' entry has the same information.
Following two sysfs entry provide the same information to user-process.
Usually, the 'cur_freq' is more universal expression than 'target_freq'
such as cpufreq subsystem. This patch removes the 'target_freq' entry.
- /sys/class/devfreq/[devfreq name]/cur_freq
- /sys/class/devfreq/[devfreq name]/target_freq
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
drivers/devfreq/devfreq.c | 8 --------
1 file changed, 8 deletions(-)
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
index 4d2b7e5b8d3c..3eaa7b5d1c91 100644
--- a/drivers/devfreq/devfreq.c
+++ b/drivers/devfreq/devfreq.c
@@ -999,13 +999,6 @@ static ssize_t cur_freq_show(struct device *dev, struct device_attribute *attr,
}
static DEVICE_ATTR_RO(cur_freq);
-static ssize_t target_freq_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- return sprintf(buf, "%lu\n", to_devfreq(dev)->previous_freq);
-}
-static DEVICE_ATTR_RO(target_freq);
-
static ssize_t polling_interval_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
@@ -1181,7 +1174,6 @@ static ssize_t trans_stat_show(struct device *dev,
&dev_attr_available_governors.attr,
&dev_attr_cur_freq.attr,
&dev_attr_available_frequencies.attr,
- &dev_attr_target_freq.attr,
&dev_attr_polling_interval.attr,
&dev_attr_min_freq.attr,
&dev_attr_max_freq.attr,
--
1.9.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 5/6] PM / devfreq: event: exynos-ppmu: Use the regmap interface to handle the registers
2016-11-24 5:01 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
` (3 preceding siblings ...)
2016-11-24 5:01 ` [PATCH 4/6] PM / devfreq: Remove the duplicate sysfs entry for current frequency Chanwoo Choi
@ 2016-11-24 5:01 ` Chanwoo Choi
2016-11-24 5:01 ` [PATCH 6/6] PM / devfreq: event: exynos-ppmu: Add the completion log of device registration Chanwoo Choi
2016-12-15 9:56 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
6 siblings, 0 replies; 12+ messages in thread
From: Chanwoo Choi @ 2016-11-24 5:01 UTC (permalink / raw)
To: myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel, Chanwoo Choi,
linux-samsung-soc
This patch uses the regmap interface to read and write the registers for exynos
PPMU device instead of the legacy memory map functions.
Cc: linux-samsung-soc@vger.kernel.org
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
drivers/devfreq/event/exynos-ppmu.c | 326 ++++++++++++++++++++++++++----------
1 file changed, 237 insertions(+), 89 deletions(-)
diff --git a/drivers/devfreq/event/exynos-ppmu.c b/drivers/devfreq/event/exynos-ppmu.c
index 107eb91a9415..fb3706faf5bd 100644
--- a/drivers/devfreq/event/exynos-ppmu.c
+++ b/drivers/devfreq/event/exynos-ppmu.c
@@ -17,13 +17,13 @@
#include <linux/module.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
+#include <linux/regmap.h>
#include <linux/suspend.h>
#include <linux/devfreq-event.h>
#include "exynos-ppmu.h"
struct exynos_ppmu_data {
- void __iomem *base;
struct clk *clk;
};
@@ -33,6 +33,7 @@ struct exynos_ppmu {
unsigned int num_events;
struct device *dev;
+ struct regmap *regmap;
struct exynos_ppmu_data ppmu;
};
@@ -107,20 +108,28 @@ static int exynos_ppmu_find_ppmu_id(struct devfreq_event_dev *edev)
static int exynos_ppmu_disable(struct devfreq_event_dev *edev)
{
struct exynos_ppmu *info = devfreq_event_get_drvdata(edev);
+ int ret;
u32 pmnc;
/* Disable all counters */
- __raw_writel(PPMU_CCNT_MASK |
- PPMU_PMCNT0_MASK |
- PPMU_PMCNT1_MASK |
- PPMU_PMCNT2_MASK |
- PPMU_PMCNT3_MASK,
- info->ppmu.base + PPMU_CNTENC);
+ ret = regmap_write(info->regmap, PPMU_CNTENC,
+ PPMU_CCNT_MASK |
+ PPMU_PMCNT0_MASK |
+ PPMU_PMCNT1_MASK |
+ PPMU_PMCNT2_MASK |
+ PPMU_PMCNT3_MASK);
+ if (ret < 0)
+ return ret;
/* Disable PPMU */
- pmnc = __raw_readl(info->ppmu.base + PPMU_PMNC);
+ ret = regmap_read(info->regmap, PPMU_PMNC, &pmnc);
+ if (ret < 0)
+ return ret;
+
pmnc &= ~PPMU_PMNC_ENABLE_MASK;
- __raw_writel(pmnc, info->ppmu.base + PPMU_PMNC);
+ ret = regmap_write(info->regmap, PPMU_PMNC, pmnc);
+ if (ret < 0)
+ return ret;
return 0;
}
@@ -129,29 +138,42 @@ static int exynos_ppmu_set_event(struct devfreq_event_dev *edev)
{
struct exynos_ppmu *info = devfreq_event_get_drvdata(edev);
int id = exynos_ppmu_find_ppmu_id(edev);
+ int ret;
u32 pmnc, cntens;
if (id < 0)
return id;
/* Enable specific counter */
- cntens = __raw_readl(info->ppmu.base + PPMU_CNTENS);
+ ret = regmap_read(info->regmap, PPMU_CNTENS, &cntens);
+ if (ret < 0)
+ return ret;
+
cntens |= (PPMU_CCNT_MASK | (PPMU_ENABLE << id));
- __raw_writel(cntens, info->ppmu.base + PPMU_CNTENS);
+ ret = regmap_write(info->regmap, PPMU_CNTENS, cntens);
+ if (ret < 0)
+ return ret;
/* Set the event of Read/Write data count */
- __raw_writel(PPMU_RO_DATA_CNT | PPMU_WO_DATA_CNT,
- info->ppmu.base + PPMU_BEVTxSEL(id));
+ ret = regmap_write(info->regmap, PPMU_BEVTxSEL(id),
+ PPMU_RO_DATA_CNT | PPMU_WO_DATA_CNT);
+ if (ret < 0)
+ return ret;
/* Reset cycle counter/performance counter and enable PPMU */
- pmnc = __raw_readl(info->ppmu.base + PPMU_PMNC);
+ ret = regmap_read(info->regmap, PPMU_PMNC, &pmnc);
+ if (ret < 0)
+ return ret;
+
pmnc &= ~(PPMU_PMNC_ENABLE_MASK
| PPMU_PMNC_COUNTER_RESET_MASK
| PPMU_PMNC_CC_RESET_MASK);
pmnc |= (PPMU_ENABLE << PPMU_PMNC_ENABLE_SHIFT);
pmnc |= (PPMU_ENABLE << PPMU_PMNC_COUNTER_RESET_SHIFT);
pmnc |= (PPMU_ENABLE << PPMU_PMNC_CC_RESET_SHIFT);
- __raw_writel(pmnc, info->ppmu.base + PPMU_PMNC);
+ ret = regmap_write(info->regmap, PPMU_PMNC, pmnc);
+ if (ret < 0)
+ return ret;
return 0;
}
@@ -161,40 +183,64 @@ static int exynos_ppmu_get_event(struct devfreq_event_dev *edev,
{
struct exynos_ppmu *info = devfreq_event_get_drvdata(edev);
int id = exynos_ppmu_find_ppmu_id(edev);
- u32 pmnc, cntenc;
+ unsigned int total_count, load_count;
+ unsigned int pmcnt3_high, pmcnt3_low;
+ unsigned int pmnc, cntenc;
+ int ret;
if (id < 0)
return -EINVAL;
/* Disable PPMU */
- pmnc = __raw_readl(info->ppmu.base + PPMU_PMNC);
+ ret = regmap_read(info->regmap, PPMU_PMNC, &pmnc);
+ if (ret < 0)
+ return ret;
+
pmnc &= ~PPMU_PMNC_ENABLE_MASK;
- __raw_writel(pmnc, info->ppmu.base + PPMU_PMNC);
+ ret = regmap_write(info->regmap, PPMU_PMNC, pmnc);
+ if (ret < 0)
+ return ret;
/* Read cycle count */
- edata->total_count = __raw_readl(info->ppmu.base + PPMU_CCNT);
+ ret = regmap_read(info->regmap, PPMU_CCNT, &total_count);
+ if (ret < 0)
+ return ret;
+ edata->total_count = total_count;
/* Read performance count */
switch (id) {
case PPMU_PMNCNT0:
case PPMU_PMNCNT1:
case PPMU_PMNCNT2:
- edata->load_count
- = __raw_readl(info->ppmu.base + PPMU_PMNCT(id));
+ ret = regmap_read(info->regmap, PPMU_PMNCT(id), &load_count);
+ if (ret < 0)
+ return ret;
+ edata->load_count = load_count;
break;
case PPMU_PMNCNT3:
- edata->load_count =
- ((__raw_readl(info->ppmu.base + PPMU_PMCNT3_HIGH) << 8)
- | __raw_readl(info->ppmu.base + PPMU_PMCNT3_LOW));
+ ret = regmap_read(info->regmap, PPMU_PMCNT3_HIGH, &pmcnt3_high);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_read(info->regmap, PPMU_PMCNT3_LOW, &pmcnt3_low);
+ if (ret < 0)
+ return ret;
+
+ edata->load_count = ((pmcnt3_high << 8) | pmcnt3_low);
break;
default:
return -EINVAL;
}
/* Disable specific counter */
- cntenc = __raw_readl(info->ppmu.base + PPMU_CNTENC);
+ ret = regmap_read(info->regmap, PPMU_CNTENC, &cntenc);
+ if (ret < 0)
+ return ret;
+
cntenc |= (PPMU_CCNT_MASK | (PPMU_ENABLE << id));
- __raw_writel(cntenc, info->ppmu.base + PPMU_CNTENC);
+ ret = regmap_write(info->regmap, PPMU_CNTENC, cntenc);
+ if (ret < 0)
+ return ret;
dev_dbg(&edev->dev, "%s (event: %ld/%ld)\n", edev->desc->name,
edata->load_count, edata->total_count);
@@ -214,36 +260,93 @@ static int exynos_ppmu_get_event(struct devfreq_event_dev *edev,
static int exynos_ppmu_v2_disable(struct devfreq_event_dev *edev)
{
struct exynos_ppmu *info = devfreq_event_get_drvdata(edev);
+ int ret;
u32 pmnc, clear;
/* Disable all counters */
clear = (PPMU_CCNT_MASK | PPMU_PMCNT0_MASK | PPMU_PMCNT1_MASK
| PPMU_PMCNT2_MASK | PPMU_PMCNT3_MASK);
+ ret = regmap_write(info->regmap, PPMU_V2_FLAG, clear);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_INTENC, clear);
+ if (ret < 0)
+ return ret;
- __raw_writel(clear, info->ppmu.base + PPMU_V2_FLAG);
- __raw_writel(clear, info->ppmu.base + PPMU_V2_INTENC);
- __raw_writel(clear, info->ppmu.base + PPMU_V2_CNTENC);
- __raw_writel(clear, info->ppmu.base + PPMU_V2_CNT_RESET);
-
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_CIG_CFG0);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_CIG_CFG1);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_CIG_CFG2);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_CIG_RESULT);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_CNT_AUTO);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_CH_EV0_TYPE);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_CH_EV1_TYPE);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_CH_EV2_TYPE);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_CH_EV3_TYPE);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_SM_ID_V);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_SM_ID_A);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_SM_OTHERS_V);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_SM_OTHERS_A);
- __raw_writel(0x0, info->ppmu.base + PPMU_V2_INTERRUPT_RESET);
+ ret = regmap_write(info->regmap, PPMU_V2_CNTENC, clear);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CNT_RESET, clear);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CIG_CFG0, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CIG_CFG1, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CIG_CFG2, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CIG_RESULT, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CNT_AUTO, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CH_EV0_TYPE, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CH_EV1_TYPE, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CH_EV2_TYPE, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_CH_EV3_TYPE, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_SM_ID_V, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_SM_ID_A, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_SM_OTHERS_V, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_SM_OTHERS_A, 0x0);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_write(info->regmap, PPMU_V2_INTERRUPT_RESET, 0x0);
+ if (ret < 0)
+ return ret;
/* Disable PPMU */
- pmnc = __raw_readl(info->ppmu.base + PPMU_V2_PMNC);
+ ret = regmap_read(info->regmap, PPMU_V2_PMNC, &pmnc);
+ if (ret < 0)
+ return ret;
+
pmnc &= ~PPMU_PMNC_ENABLE_MASK;
- __raw_writel(pmnc, info->ppmu.base + PPMU_V2_PMNC);
+ ret = regmap_write(info->regmap, PPMU_V2_PMNC, pmnc);
+ if (ret < 0)
+ return ret;
return 0;
}
@@ -251,30 +354,43 @@ static int exynos_ppmu_v2_disable(struct devfreq_event_dev *edev)
static int exynos_ppmu_v2_set_event(struct devfreq_event_dev *edev)
{
struct exynos_ppmu *info = devfreq_event_get_drvdata(edev);
+ unsigned int pmnc, cntens;
int id = exynos_ppmu_find_ppmu_id(edev);
- u32 pmnc, cntens;
+ int ret;
/* Enable all counters */
- cntens = __raw_readl(info->ppmu.base + PPMU_V2_CNTENS);
+ ret = regmap_read(info->regmap, PPMU_V2_CNTENS, &cntens);
+ if (ret < 0)
+ return ret;
+
cntens |= (PPMU_CCNT_MASK | (PPMU_ENABLE << id));
- __raw_writel(cntens, info->ppmu.base + PPMU_V2_CNTENS);
+ ret = regmap_write(info->regmap, PPMU_V2_CNTENS, cntens);
+ if (ret < 0)
+ return ret;
/* Set the event of Read/Write data count */
switch (id) {
case PPMU_PMNCNT0:
case PPMU_PMNCNT1:
case PPMU_PMNCNT2:
- __raw_writel(PPMU_V2_RO_DATA_CNT | PPMU_V2_WO_DATA_CNT,
- info->ppmu.base + PPMU_V2_CH_EVx_TYPE(id));
+ ret = regmap_write(info->regmap, PPMU_V2_CH_EVx_TYPE(id),
+ PPMU_V2_RO_DATA_CNT | PPMU_V2_WO_DATA_CNT);
+ if (ret < 0)
+ return ret;
break;
case PPMU_PMNCNT3:
- __raw_writel(PPMU_V2_EVT3_RW_DATA_CNT,
- info->ppmu.base + PPMU_V2_CH_EVx_TYPE(id));
+ ret = regmap_write(info->regmap, PPMU_V2_CH_EVx_TYPE(id),
+ PPMU_V2_EVT3_RW_DATA_CNT);
+ if (ret < 0)
+ return ret;
break;
}
/* Reset cycle counter/performance counter and enable PPMU */
- pmnc = __raw_readl(info->ppmu.base + PPMU_V2_PMNC);
+ ret = regmap_read(info->regmap, PPMU_V2_PMNC, &pmnc);
+ if (ret < 0)
+ return ret;
+
pmnc &= ~(PPMU_PMNC_ENABLE_MASK
| PPMU_PMNC_COUNTER_RESET_MASK
| PPMU_PMNC_CC_RESET_MASK
@@ -284,7 +400,10 @@ static int exynos_ppmu_v2_set_event(struct devfreq_event_dev *edev)
pmnc |= (PPMU_ENABLE << PPMU_PMNC_COUNTER_RESET_SHIFT);
pmnc |= (PPMU_ENABLE << PPMU_PMNC_CC_RESET_SHIFT);
pmnc |= (PPMU_V2_MODE_MANUAL << PPMU_V2_PMNC_START_MODE_SHIFT);
- __raw_writel(pmnc, info->ppmu.base + PPMU_V2_PMNC);
+
+ ret = regmap_write(info->regmap, PPMU_V2_PMNC, pmnc);
+ if (ret < 0)
+ return ret;
return 0;
}
@@ -294,37 +413,61 @@ static int exynos_ppmu_v2_get_event(struct devfreq_event_dev *edev,
{
struct exynos_ppmu *info = devfreq_event_get_drvdata(edev);
int id = exynos_ppmu_find_ppmu_id(edev);
- u32 pmnc, cntenc;
- u32 pmcnt_high, pmcnt_low;
- u64 load_count = 0;
+ int ret;
+ unsigned int pmnc, cntenc;
+ unsigned int pmcnt_high, pmcnt_low;
+ unsigned int total_count, count;
+ unsigned long load_count = 0;
/* Disable PPMU */
- pmnc = __raw_readl(info->ppmu.base + PPMU_V2_PMNC);
+ ret = regmap_read(info->regmap, PPMU_V2_PMNC, &pmnc);
+ if (ret < 0)
+ return ret;
+
pmnc &= ~PPMU_PMNC_ENABLE_MASK;
- __raw_writel(pmnc, info->ppmu.base + PPMU_V2_PMNC);
+ ret = regmap_write(info->regmap, PPMU_V2_PMNC, pmnc);
+ if (ret < 0)
+ return ret;
/* Read cycle count and performance count */
- edata->total_count = __raw_readl(info->ppmu.base + PPMU_V2_CCNT);
+ ret = regmap_read(info->regmap, PPMU_V2_CCNT, &total_count);
+ if (ret < 0)
+ return ret;
+ edata->total_count = total_count;
switch (id) {
case PPMU_PMNCNT0:
case PPMU_PMNCNT1:
case PPMU_PMNCNT2:
- load_count = __raw_readl(info->ppmu.base + PPMU_V2_PMNCT(id));
+ ret = regmap_read(info->regmap, PPMU_V2_PMNCT(id), &count);
+ if (ret < 0)
+ return ret;
+ load_count = count;
break;
case PPMU_PMNCNT3:
- pmcnt_high = __raw_readl(info->ppmu.base + PPMU_V2_PMCNT3_HIGH);
- pmcnt_low = __raw_readl(info->ppmu.base + PPMU_V2_PMCNT3_LOW);
- load_count = ((u64)((pmcnt_high & 0xff)) << 32)
- + (u64)pmcnt_low;
+ ret = regmap_read(info->regmap, PPMU_V2_PMCNT3_HIGH,
+ &pmcnt_high);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_read(info->regmap, PPMU_V2_PMCNT3_LOW, &pmcnt_low);
+ if (ret < 0)
+ return ret;
+
+ load_count = ((u64)((pmcnt_high & 0xff)) << 32)+ (u64)pmcnt_low;
break;
}
edata->load_count = load_count;
/* Disable all counters */
- cntenc = __raw_readl(info->ppmu.base + PPMU_V2_CNTENC);
+ ret = regmap_read(info->regmap, PPMU_V2_CNTENC, &cntenc);
+ if (ret < 0)
+ return 0;
+
cntenc |= (PPMU_CCNT_MASK | (PPMU_ENABLE << id));
- __raw_writel(cntenc, info->ppmu.base + PPMU_V2_CNTENC);
+ ret = regmap_write(info->regmap, PPMU_V2_CNTENC, cntenc);
+ if (ret < 0)
+ return ret;
dev_dbg(&edev->dev, "%25s (load: %ld / %ld)\n", edev->desc->name,
edata->load_count, edata->total_count);
@@ -411,10 +554,19 @@ static int of_get_devfreq_events(struct device_node *np,
return 0;
}
-static int exynos_ppmu_parse_dt(struct exynos_ppmu *info)
+static struct regmap_config exynos_ppmu_regmap_config = {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+};
+
+static int exynos_ppmu_parse_dt(struct platform_device *pdev,
+ struct exynos_ppmu *info)
{
struct device *dev = info->dev;
struct device_node *np = dev->of_node;
+ struct resource *res;
+ void __iomem *base;
int ret = 0;
if (!np) {
@@ -423,10 +575,17 @@ static int exynos_ppmu_parse_dt(struct exynos_ppmu *info)
}
/* Maps the memory mapped IO to control PPMU register */
- info->ppmu.base = of_iomap(np, 0);
- if (IS_ERR_OR_NULL(info->ppmu.base)) {
- dev_err(dev, "failed to map memory region\n");
- return -ENOMEM;
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ base = devm_ioremap_resource(dev, res);
+ if (IS_ERR(base))
+ return PTR_ERR(base);
+
+ exynos_ppmu_regmap_config.max_register = resource_size(res) - 4;
+ info->regmap = devm_regmap_init_mmio(dev, base,
+ &exynos_ppmu_regmap_config);
+ if (IS_ERR(info->regmap)) {
+ dev_err(dev, "failed to initialize regmap\n");
+ return PTR_ERR(info->regmap);
}
info->ppmu.clk = devm_clk_get(dev, "ppmu");
@@ -438,15 +597,10 @@ static int exynos_ppmu_parse_dt(struct exynos_ppmu *info)
ret = of_get_devfreq_events(np, info);
if (ret < 0) {
dev_err(dev, "failed to parse exynos ppmu dt node\n");
- goto err;
+ return ret;
}
return 0;
-
-err:
- iounmap(info->ppmu.base);
-
- return ret;
}
static int exynos_ppmu_probe(struct platform_device *pdev)
@@ -463,7 +617,7 @@ static int exynos_ppmu_probe(struct platform_device *pdev)
info->dev = &pdev->dev;
/* Parse dt data to get resource */
- ret = exynos_ppmu_parse_dt(info);
+ ret = exynos_ppmu_parse_dt(pdev, info);
if (ret < 0) {
dev_err(&pdev->dev,
"failed to parse devicetree for resource\n");
@@ -476,8 +630,7 @@ static int exynos_ppmu_probe(struct platform_device *pdev)
if (!info->edev) {
dev_err(&pdev->dev,
"failed to allocate memory devfreq-event devices\n");
- ret = -ENOMEM;
- goto err;
+ return -ENOMEM;
}
edev = info->edev;
platform_set_drvdata(pdev, info);
@@ -488,17 +641,13 @@ static int exynos_ppmu_probe(struct platform_device *pdev)
ret = PTR_ERR(edev[i]);
dev_err(&pdev->dev,
"failed to add devfreq-event device\n");
- goto err;
+ return PTR_ERR(edev[i]);
}
}
clk_prepare_enable(info->ppmu.clk);
return 0;
-err:
- iounmap(info->ppmu.base);
-
- return ret;
}
static int exynos_ppmu_remove(struct platform_device *pdev)
@@ -506,7 +655,6 @@ static int exynos_ppmu_remove(struct platform_device *pdev)
struct exynos_ppmu *info = platform_get_drvdata(pdev);
clk_disable_unprepare(info->ppmu.clk);
- iounmap(info->ppmu.base);
return 0;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 6/6] PM / devfreq: event: exynos-ppmu: Add the completion log of device registration
2016-11-24 5:01 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
` (4 preceding siblings ...)
2016-11-24 5:01 ` [PATCH 5/6] PM / devfreq: event: exynos-ppmu: Use the regmap interface to handle the registers Chanwoo Choi
@ 2016-11-24 5:01 ` Chanwoo Choi
2016-12-15 9:56 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
6 siblings, 0 replies; 12+ messages in thread
From: Chanwoo Choi @ 2016-11-24 5:01 UTC (permalink / raw)
To: myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel, Chanwoo Choi
This patch just adds the simple log to show the PPMU device's registration
during the kernel booting.
For example on exynos4412-odroidu3 board as following:
[ 1.845929] exynos-ppmu: new PPMU device registered 106a0000.ppmu_dmc0
[ 1.848997] exynos-ppmu: new PPMU device registered 106b0000.ppmu_dmc1
[ 1.853512] exynos-ppmu: new PPMU device registered 112a0000.ppmu_rightbus
[ 1.860524] exynos-ppmu: new PPMU device registered 116a0000.ppmu_leftbus0
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
drivers/devfreq/event/exynos-ppmu.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/devfreq/event/exynos-ppmu.c b/drivers/devfreq/event/exynos-ppmu.c
index fb3706faf5bd..b2696181c929 100644
--- a/drivers/devfreq/event/exynos-ppmu.c
+++ b/drivers/devfreq/event/exynos-ppmu.c
@@ -647,6 +647,9 @@ static int exynos_ppmu_probe(struct platform_device *pdev)
clk_prepare_enable(info->ppmu.clk);
+ pr_info("exynos-ppmu: new PPMU device registered %s\n",
+ dev_name(&pdev->dev));
+
return 0;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings
2016-11-24 5:01 ` [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings Chanwoo Choi
@ 2016-11-24 10:20 ` Joe Perches
2016-11-24 10:46 ` Chanwoo Choi
0 siblings, 1 reply; 12+ messages in thread
From: Joe Perches @ 2016-11-24 10:20 UTC (permalink / raw)
To: Chanwoo Choi, myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel
On Thu, 2016-11-24 at 14:01 +0900, Chanwoo Choi wrote:
> This patch just fixes the checkpatch warnings.
unrelated trivia:
> diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
[]
> @@ -538,15 +538,14 @@ struct devfreq *devfreq_add_device(struct device *dev,
> devfreq = find_device_devfreq(dev);
> mutex_unlock(&devfreq_list_lock);
> if (!IS_ERR(devfreq)) {
> - dev_err(dev, "%s: Unable to create devfreq for the device. It already has one.\n", __func__);
> + dev_err(dev, "%s: Unable to create devfreq for the device.\n",
> + __func__);
> err = -EINVAL;
> goto err_out;
> }
It seems to be simpler if find_device_devfreq just returned NULL
in the error cases as the only test is IS_ERR and not a
specific error return type. Then these IS_ERR calls could be
a NULL pointer test instead.
> @@ -576,11 +575,13 @@ struct devfreq *devfreq_add_device(struct device *dev,
> goto err_out;
> }
>
> - devfreq->trans_table = devm_kzalloc(&devfreq->dev, sizeof(unsigned int) *
> + devfreq->trans_table = devm_kzalloc(&devfreq->dev,
> + sizeof(unsigned int) *
> devfreq->profile->max_state *
> devfreq->profile->max_state,
> GFP_KERNEL);
> - devfreq->time_in_state = devm_kzalloc(&devfreq->dev, sizeof(unsigned long) *
> + devfreq->time_in_state = devm_kzalloc(&devfreq->dev,
> + sizeof(unsigned long) *
> devfreq->profile->max_state,
> GFP_KERNEL);
Maybe these should be devm_kcalloc calls
> devfreq->last_stat_updated = jiffies;
> @@ -990,7 +991,7 @@ static ssize_t cur_freq_show(struct device *dev, struct device_attribute *attr,
>
> if (devfreq->profile->get_cur_freq &&
> !devfreq->profile->get_cur_freq(devfreq->dev.parent, &freq))
> - return sprintf(buf, "%lu\n", freq);
> + return sprintf(buf, "%lu\n", freq);
Be nicer to align the second line in the if test here too
if (devfreq->profile->get_cur_freq &&
!devfreq->profile->get_cur_freq(devfreq->dev.parent, &freq))
return sprintf(buf, "%lu\n", freq);
> return sprintf(buf, "%lu\n", devfreq->previous_freq);
> }
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings
2016-11-24 10:20 ` Joe Perches
@ 2016-11-24 10:46 ` Chanwoo Choi
2016-11-24 10:52 ` Joe Perches
0 siblings, 1 reply; 12+ messages in thread
From: Chanwoo Choi @ 2016-11-24 10:46 UTC (permalink / raw)
To: Joe Perches, myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel
On 2016년 11월 24일 19:20, Joe Perches wrote:
> On Thu, 2016-11-24 at 14:01 +0900, Chanwoo Choi wrote:
>> This patch just fixes the checkpatch warnings.
>
> unrelated trivia:
>
>> diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
> []
>> @@ -538,15 +538,14 @@ struct devfreq *devfreq_add_device(struct device *dev,
>> devfreq = find_device_devfreq(dev);
>> mutex_unlock(&devfreq_list_lock);
>> if (!IS_ERR(devfreq)) {
>> - dev_err(dev, "%s: Unable to create devfreq for the device. It already has one.\n", __func__);
>> + dev_err(dev, "%s: Unable to create devfreq for the device.\n",
>> + __func__);
>> err = -EINVAL;
>> goto err_out;
>> }
>
> It seems to be simpler if find_device_devfreq just returned NULL
> in the error cases as the only test is IS_ERR and not a
> specific error return type. Then these IS_ERR calls could be
> a NULL pointer test instead.
>
>> @@ -576,11 +575,13 @@ struct devfreq *devfreq_add_device(struct device *dev,
>> goto err_out;
>> }
>>
>> - devfreq->trans_table = devm_kzalloc(&devfreq->dev, sizeof(unsigned int) *
>> + devfreq->trans_table = devm_kzalloc(&devfreq->dev,
>> + sizeof(unsigned int) *
>> devfreq->profile->max_state *
>> devfreq->profile->max_state,
>> GFP_KERNEL);
>> - devfreq->time_in_state = devm_kzalloc(&devfreq->dev, sizeof(unsigned long) *
>> + devfreq->time_in_state = devm_kzalloc(&devfreq->dev,
>> + sizeof(unsigned long) *
>> devfreq->profile->max_state,
>> GFP_KERNEL);
>
> Maybe these should be devm_kcalloc calls
Why should devfreq use the devm_kcalloc?
>
>> devfreq->last_stat_updated = jiffies;
>> @@ -990,7 +991,7 @@ static ssize_t cur_freq_show(struct device *dev, struct device_attribute *attr,
>>
>> if (devfreq->profile->get_cur_freq &&
>> !devfreq->profile->get_cur_freq(devfreq->dev.parent, &freq))
>> - return sprintf(buf, "%lu\n", freq);
>> + return sprintf(buf, "%lu\n", freq);
>
> Be nicer to align the second line in the if test here too
>
> if (devfreq->profile->get_cur_freq &&
> !devfreq->profile->get_cur_freq(devfreq->dev.parent, &freq))
> return sprintf(buf, "%lu\n", freq);
>
>> return sprintf(buf, "%lu\n", devfreq->previous_freq);
>> }
>
>
>
--
Best Regards,
Chanwoo Choi
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings
2016-11-24 10:46 ` Chanwoo Choi
@ 2016-11-24 10:52 ` Joe Perches
2016-11-24 23:37 ` Chanwoo Choi
0 siblings, 1 reply; 12+ messages in thread
From: Joe Perches @ 2016-11-24 10:52 UTC (permalink / raw)
To: Chanwoo Choi, myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel
On Thu, 2016-11-24 at 19:46 +0900, Chanwoo Choi wrote:
> On 2016년 11월 24일 19:20, Joe Perches wrote:
> > On Thu, 2016-11-24 at 14:01 +0900, Chanwoo Choi wrote:
> > > This patch just fixes the checkpatch warnings.
> >
> > unrelated trivia:
> >
> > > diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
[]
> > > @@ -576,11 +575,13 @@ struct devfreq *devfreq_add_device(struct device *dev,
> > > goto err_out;
> > > }
> > >
> > > - devfreq->trans_table = devm_kzalloc(&devfreq->dev, sizeof(unsigned int) *
> > > + devfreq->trans_table = devm_kzalloc(&devfreq->dev,
> > > + sizeof(unsigned int) *
> > > devfreq->profile->max_state *
> > > devfreq->profile->max_state,
> > > GFP_KERNEL);
> > > - devfreq->time_in_state = devm_kzalloc(&devfreq->dev, sizeof(unsigned long) *
> > > + devfreq->time_in_state = devm_kzalloc(&devfreq->dev,
> > > + sizeof(unsigned long) *
> > > devfreq->profile->max_state,
> > > GFP_KERNEL);
> >
> > Maybe these should be devm_kcalloc calls
>
> Why should devfreq use the devm_kcalloc?
Because these are allocating zeroed arrays of a specific size.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings
2016-11-24 10:52 ` Joe Perches
@ 2016-11-24 23:37 ` Chanwoo Choi
0 siblings, 0 replies; 12+ messages in thread
From: Chanwoo Choi @ 2016-11-24 23:37 UTC (permalink / raw)
To: Joe Perches, myungjoo.ham, kyungmin.park
Cc: rjw, chanwoo, linux-pm, linux-kernel
On 2016년 11월 24일 19:52, Joe Perches wrote:
> On Thu, 2016-11-24 at 19:46 +0900, Chanwoo Choi wrote:
>> On 2016년 11월 24일 19:20, Joe Perches wrote:
>>> On Thu, 2016-11-24 at 14:01 +0900, Chanwoo Choi wrote:
>>>> This patch just fixes the checkpatch warnings.
>>>
>>> unrelated trivia:
>>>
>>>> diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
> []
>>>> @@ -576,11 +575,13 @@ struct devfreq *devfreq_add_device(struct device *dev,
>>>> goto err_out;
>>>> }
>>>>
>>>> - devfreq->trans_table = devm_kzalloc(&devfreq->dev, sizeof(unsigned int) *
>>>> + devfreq->trans_table = devm_kzalloc(&devfreq->dev,
>>>> + sizeof(unsigned int) *
>>>> devfreq->profile->max_state *
>>>> devfreq->profile->max_state,
>>>> GFP_KERNEL);
>>>> - devfreq->time_in_state = devm_kzalloc(&devfreq->dev, sizeof(unsigned long) *
>>>> + devfreq->time_in_state = devm_kzalloc(&devfreq->dev,
>>>> + sizeof(unsigned long) *
>>>> devfreq->profile->max_state,
>>>> GFP_KERNEL);
>>>
>>> Maybe these should be devm_kcalloc calls
>>
>> Why should devfreq use the devm_kcalloc?
>
> Because these are allocating zeroed arrays of a specific size.
kzalloc is already set to zero.
[1]https://www.kernel.org/doc/htmldocs/kernel-api/API-kzalloc.html
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement
2016-11-24 5:01 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
` (5 preceding siblings ...)
2016-11-24 5:01 ` [PATCH 6/6] PM / devfreq: event: exynos-ppmu: Add the completion log of device registration Chanwoo Choi
@ 2016-12-15 9:56 ` Chanwoo Choi
6 siblings, 0 replies; 12+ messages in thread
From: Chanwoo Choi @ 2016-12-15 9:56 UTC (permalink / raw)
To: myungjoo.ham, kyungmin.park; +Cc: rjw, chanwoo, linux-pm, linux-kernel
Dear all,
Please ignore this patches.
I sent the patches[1][2] again.
[1] https://lkml.org/lkml/2016/12/15/119
[2] https://lkml.org/lkml/2016/12/15/122
--
Regards,
Chanwoo Choi
On 2016년 11월 24일 14:01, Chanwoo Choi wrote:
> This patches modify the devfreq and devfreq-event framework for improving
> them. But, these patches don't make an impact to operation of
> devfreq/devfreq-event.
>
> Chanwoo Choi (6):
> PM / devfreq: Fix the checkpatch warnings
> PM / devfreq: Modify the device name as devfreq[X] for sysfs
> PM / devfreq: event: Simplify the sysfs name of devfreq-event device
> PM / devfreq: Remove the duplicate sysfs entry for current frequency
> PM / devfreq: event: exynos-ppmu: Use the regmap interface to handle the registers
> PM / devfreq: event: exynos-ppmu: Add the completion log of device registration
>
> drivers/devfreq/devfreq-event.c | 2 +-
> drivers/devfreq/devfreq.c | 25 ++-
> drivers/devfreq/event/exynos-ppmu.c | 329 ++++++++++++++++++++++++++----------
> 3 files changed, 251 insertions(+), 105 deletions(-)
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2016-12-15 9:56 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20161124050125epcas1p466fc832e77cfe122454b8d40d0f6744e@epcas1p4.samsung.com>
2016-11-24 5:01 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
2016-11-24 5:01 ` [PATCH 1/6] PM / devfreq: Fix the checkpatch warnings Chanwoo Choi
2016-11-24 10:20 ` Joe Perches
2016-11-24 10:46 ` Chanwoo Choi
2016-11-24 10:52 ` Joe Perches
2016-11-24 23:37 ` Chanwoo Choi
2016-11-24 5:01 ` [PATCH 2/6] PM / devfreq: Modify the device name as devfreq[X] for sysfs Chanwoo Choi
2016-11-24 5:01 ` [PATCH 3/6] PM / devfreq: event: Simplify the sysfs name of devfreq-event device Chanwoo Choi
2016-11-24 5:01 ` [PATCH 4/6] PM / devfreq: Remove the duplicate sysfs entry for current frequency Chanwoo Choi
2016-11-24 5:01 ` [PATCH 5/6] PM / devfreq: event: exynos-ppmu: Use the regmap interface to handle the registers Chanwoo Choi
2016-11-24 5:01 ` [PATCH 6/6] PM / devfreq: event: exynos-ppmu: Add the completion log of device registration Chanwoo Choi
2016-12-15 9:56 ` [PATCH 0/6] PM / devfreq: Modify devfreq/devfreq-event for improvement Chanwoo Choi
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.