> On 20 August 2012 15:15, 함명주 <myungjoo....@samsung.com> wrote: > >> Devfreq returns governor predicted frequency as current > >> frequency via sysfs interface. But device may not support > >> all frequencies that governor predicts. As per the design > >> its driver responsibility to maintain current frequency > >> at which device is operating. So add a callback in device > >> profile to fix this. > >> > >> Signed-off-by: Rajagopal Venkat <rajagopal.ven...@linaro.org> > > > > We still need to support "intended frequency". > > > > The "cur_freq" node is to show the intended frequency. > > As told before, you need to make additional API and ABI for the > > "actual frequency". > > > I don't think userspace will be interested in "intended frequency", i.e > governor predicted next target frequency unless code is being > debugged. More over device may not support all opps that > governor predicts. Hence cur_freq node is fixed to show freq > at the which device is operating. > > Let me know if you still think, intended frequency should be > exposed to userspace.
Like CPUfreq, (scaling_cur_freq vs cpuinfo_cur_freq) device driver developers are often very interested in such values. At least for me, such information has been very helpful for production kernels. Cheers! MyungJoo > > > > > Cheers! > > MyungJoo > > > >> --- > >> drivers/devfreq/devfreq.c | 14 ++++++++++++-- > >> include/linux/devfreq.h | 6 +++--- > >> 2 files changed, 15 insertions(+), 5 deletions(-) > >> > >> diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c > >> index 375b5aa1..798e8ca 100644 > >> --- a/drivers/devfreq/devfreq.c > >> +++ b/drivers/devfreq/devfreq.c > >> @@ -176,7 +176,6 @@ struct devfreq *devfreq_add_device(struct device *dev, > >> devfreq->dev.release = devfreq_dev_release; > >> devfreq->profile = profile; > >> devfreq->governor = governor; > >> - devfreq->previous_freq = profile->initial_freq; > >> devfreq->governor_data = data; > >> devfreq->nb.notifier_call = devfreq_notifier_call; > >> devfreq->min_freq = profile->min_freq; > >> @@ -272,7 +271,18 @@ static ssize_t show_governor(struct device *dev, > >> static ssize_t show_freq(struct device *dev, > >> struct device_attribute *attr, char *buf) > >> { > >> - return sprintf(buf, "%lu\n", to_devfreq(dev)->previous_freq); > >> + int ret; > >> + unsigned long freq; > >> + struct devfreq *devfreq = to_devfreq(dev); > >> + > >> + if (devfreq->profile->get_cur_freq) { > >> + ret = devfreq->profile->get_cur_freq(devfreq->dev.parent, > >> + &freq); > >> + if (!ret) > >> + return sprintf(buf, "%lu\n", freq); > >> + } > >> + > >> + return sprintf(buf, "<unknown>"); > >> } > >> > >> static ssize_t store_min_freq(struct device *dev, struct device_attribute > >> *attr, > >> diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h > >> index 7c6517f..43f111f 100644 > >> --- a/include/linux/devfreq.h > >> +++ b/include/linux/devfreq.h > >> @@ -76,6 +76,8 @@ struct devfreq_dev_status { > >> * explained above with "DEVFREQ_FLAG_*" macros. > >> * @get_dev_status The device should provide the current performance > >> * status to devfreq, which is used by governors. > >> + * @get_cur_freq The device should provide the current frequency > >> + * at which it is operating. > >> * @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 > >> @@ -91,6 +93,7 @@ struct devfreq_dev_profile { > >> int (*target)(struct device *dev, unsigned long *freq, u32 flags); > >> int (*get_dev_status)(struct device *dev, > >> struct devfreq_dev_status *stat); > >> + int (*get_cur_freq)(struct device *dev, unsigned long *freq); > >> void (*exit)(struct device *dev); > >> }; > >> > >> @@ -119,7 +122,6 @@ struct devfreq_governor { > >> * @nb notifier block used to notify devfreq object that it > >> should > >> * reevaluate operable frequencies. Devfreq users may use > >> * devfreq.nb to the corresponding register notifier call chain. > >> - * @previous_freq previously configured frequency value. > >> * @governor_data Private data of the governor. The devfreq framework > >> * does not touch this. > >> * @min_freq Limit minimum frequency requested by user (0: none) > >> @@ -142,8 +144,6 @@ struct devfreq { > >> const struct devfreq_governor *governor; > >> struct notifier_block nb; > >> > >> - unsigned long previous_freq; > >> - > >> void *governor_data; /* private data for governors */ > >> > >> unsigned long min_freq; > >> -- > >> 1.7.11.3 > >> > >> > >> > >> > >> > >> > >> > >> > > > > -- > Regards, > Rajagopal > > > > > > > _______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev