Commit 63314172 authored by Lukasz Luba's avatar Lukasz Luba Committed by MyungJoo Ham
Browse files

PM / devfreq: refactor set_target frequency function



The refactoring is needed for the new client in devfreq: suspend.
To avoid code duplication, move it to the new local function
devfreq_set_target.

Suggested-by: default avatarTobias Jakobi <tjakobi@math.uni-bielefeld.de>
Suggested-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
Reviewed-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: default avatarLukasz Luba <l.luba@partner.samsung.com>
Signed-off-by: default avatarMyungJoo Ham <myungjoo.ham@samsung.com>
parent 40e020c1
Loading
Loading
Loading
Loading
+36 −26
Original line number Diff line number Diff line
@@ -285,6 +285,40 @@ static int devfreq_notify_transition(struct devfreq *devfreq,
	return 0;
}

static int devfreq_set_target(struct devfreq *devfreq, unsigned long new_freq,
			      u32 flags)
{
	struct devfreq_freqs freqs;
	unsigned long cur_freq;
	int err = 0;

	if (devfreq->profile->get_cur_freq)
		devfreq->profile->get_cur_freq(devfreq->dev.parent, &cur_freq);
	else
		cur_freq = devfreq->previous_freq;

	freqs.old = cur_freq;
	freqs.new = new_freq;
	devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE);

	err = devfreq->profile->target(devfreq->dev.parent, &new_freq, flags);
	if (err) {
		freqs.new = cur_freq;
		devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE);
		return err;
	}

	freqs.new = new_freq;
	devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE);

	if (devfreq_update_status(devfreq, new_freq))
		dev_err(&devfreq->dev,
			"Couldn't update frequency transition information.\n");

	devfreq->previous_freq = new_freq;
	return err;
}

/* Load monitoring helper functions for governors use */

/**
@@ -296,8 +330,7 @@ static int devfreq_notify_transition(struct devfreq *devfreq,
 */
int update_devfreq(struct devfreq *devfreq)
{
	struct devfreq_freqs freqs;
	unsigned long freq, cur_freq, min_freq, max_freq;
	unsigned long freq, min_freq, max_freq;
	int err = 0;
	u32 flags = 0;

@@ -333,31 +366,8 @@ int update_devfreq(struct devfreq *devfreq)
		flags |= DEVFREQ_FLAG_LEAST_UPPER_BOUND; /* Use LUB */
	}

	if (devfreq->profile->get_cur_freq)
		devfreq->profile->get_cur_freq(devfreq->dev.parent, &cur_freq);
	else
		cur_freq = devfreq->previous_freq;

	freqs.old = cur_freq;
	freqs.new = freq;
	devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE);

	err = devfreq->profile->target(devfreq->dev.parent, &freq, flags);
	if (err) {
		freqs.new = cur_freq;
		devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE);
		return err;
	}

	freqs.new = freq;
	devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE);

	if (devfreq_update_status(devfreq, freq))
		dev_err(&devfreq->dev,
			"Couldn't update frequency transition information.\n");
	return devfreq_set_target(devfreq, freq, flags);

	devfreq->previous_freq = freq;
	return err;
}
EXPORT_SYMBOL(update_devfreq);