diff options
Diffstat (limited to 'drivers/devfreq/devfreq.c')
| -rw-r--r-- | drivers/devfreq/devfreq.c | 76 | 
1 files changed, 37 insertions, 39 deletions
| diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 01474daf4548..9602141bb8ec 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -123,7 +123,7 @@ void devfreq_get_freq_range(struct devfreq *devfreq,  			    unsigned long *min_freq,  			    unsigned long *max_freq)  { -	unsigned long *freq_table = devfreq->profile->freq_table; +	unsigned long *freq_table = devfreq->freq_table;  	s32 qos_min_freq, qos_max_freq;  	lockdep_assert_held(&devfreq->lock); @@ -133,11 +133,11 @@ void devfreq_get_freq_range(struct devfreq *devfreq,  	 * The devfreq drivers can initialize this in either ascending or  	 * descending order and devfreq core supports both.  	 */ -	if (freq_table[0] < freq_table[devfreq->profile->max_state - 1]) { +	if (freq_table[0] < freq_table[devfreq->max_state - 1]) {  		*min_freq = freq_table[0]; -		*max_freq = freq_table[devfreq->profile->max_state - 1]; +		*max_freq = freq_table[devfreq->max_state - 1];  	} else { -		*min_freq = freq_table[devfreq->profile->max_state - 1]; +		*min_freq = freq_table[devfreq->max_state - 1];  		*max_freq = freq_table[0];  	} @@ -169,8 +169,8 @@ static int devfreq_get_freq_level(struct devfreq *devfreq, unsigned long freq)  {  	int lev; -	for (lev = 0; lev < devfreq->profile->max_state; lev++) -		if (freq == devfreq->profile->freq_table[lev]) +	for (lev = 0; lev < devfreq->max_state; lev++) +		if (freq == devfreq->freq_table[lev])  			return lev;  	return -EINVAL; @@ -178,7 +178,6 @@ static int devfreq_get_freq_level(struct devfreq *devfreq, unsigned long freq)  static int set_freq_table(struct devfreq *devfreq)  { -	struct devfreq_dev_profile *profile = devfreq->profile;  	struct dev_pm_opp *opp;  	unsigned long freq;  	int i, count; @@ -188,25 +187,22 @@ static int set_freq_table(struct devfreq *devfreq)  	if (count <= 0)  		return -EINVAL; -	profile->max_state = count; -	profile->freq_table = devm_kcalloc(devfreq->dev.parent, -					profile->max_state, -					sizeof(*profile->freq_table), -					GFP_KERNEL); -	if (!profile->freq_table) { -		profile->max_state = 0; +	devfreq->max_state = count; +	devfreq->freq_table = devm_kcalloc(devfreq->dev.parent, +					   devfreq->max_state, +					   sizeof(*devfreq->freq_table), +					   GFP_KERNEL); +	if (!devfreq->freq_table)  		return -ENOMEM; -	} -	for (i = 0, freq = 0; i < profile->max_state; i++, freq++) { +	for (i = 0, freq = 0; i < devfreq->max_state; i++, freq++) {  		opp = dev_pm_opp_find_freq_ceil(devfreq->dev.parent, &freq);  		if (IS_ERR(opp)) { -			devm_kfree(devfreq->dev.parent, profile->freq_table); -			profile->max_state = 0; +			devm_kfree(devfreq->dev.parent, devfreq->freq_table);  			return PTR_ERR(opp);  		}  		dev_pm_opp_put(opp); -		profile->freq_table[i] = freq; +		devfreq->freq_table[i] = freq;  	}  	return 0; @@ -246,7 +242,7 @@ int devfreq_update_status(struct devfreq *devfreq, unsigned long freq)  	if (lev != prev_lev) {  		devfreq->stats.trans_table[ -			(prev_lev * devfreq->profile->max_state) + lev]++; +			(prev_lev * devfreq->max_state) + lev]++;  		devfreq->stats.total_trans++;  	} @@ -835,6 +831,9 @@ struct devfreq *devfreq_add_device(struct device *dev,  		if (err < 0)  			goto err_dev;  		mutex_lock(&devfreq->lock); +	} else { +		devfreq->freq_table = devfreq->profile->freq_table; +		devfreq->max_state = devfreq->profile->max_state;  	}  	devfreq->scaling_min_freq = find_available_min_freq(devfreq); @@ -870,8 +869,8 @@ struct devfreq *devfreq_add_device(struct device *dev,  	devfreq->stats.trans_table = devm_kzalloc(&devfreq->dev,  			array3_size(sizeof(unsigned int), -				    devfreq->profile->max_state, -				    devfreq->profile->max_state), +				    devfreq->max_state, +				    devfreq->max_state),  			GFP_KERNEL);  	if (!devfreq->stats.trans_table) {  		mutex_unlock(&devfreq->lock); @@ -880,7 +879,7 @@ struct devfreq *devfreq_add_device(struct device *dev,  	}  	devfreq->stats.time_in_state = devm_kcalloc(&devfreq->dev, -			devfreq->profile->max_state, +			devfreq->max_state,  			sizeof(*devfreq->stats.time_in_state),  			GFP_KERNEL);  	if (!devfreq->stats.time_in_state) { @@ -932,8 +931,9 @@ struct devfreq *devfreq_add_device(struct device *dev,  	err = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_START,  						NULL);  	if (err) { -		dev_err(dev, "%s: Unable to start governor for the device\n", -			__func__); +		dev_err_probe(dev, err, +			"%s: Unable to start governor for the device\n", +			 __func__);  		goto err_init;  	}  	create_sysfs_files(devfreq, devfreq->governor); @@ -1665,9 +1665,9 @@ static ssize_t available_frequencies_show(struct device *d,  	mutex_lock(&df->lock); -	for (i = 0; i < df->profile->max_state; i++) +	for (i = 0; i < df->max_state; i++)  		count += scnprintf(&buf[count], (PAGE_SIZE - count - 2), -				"%lu ", df->profile->freq_table[i]); +				"%lu ", df->freq_table[i]);  	mutex_unlock(&df->lock);  	/* Truncate the trailing space */ @@ -1690,7 +1690,7 @@ static ssize_t trans_stat_show(struct device *dev,  	if (!df->profile)  		return -EINVAL; -	max_state = df->profile->max_state; +	max_state = df->max_state;  	if (max_state == 0)  		return sprintf(buf, "Not Supported.\n"); @@ -1707,19 +1707,17 @@ static ssize_t trans_stat_show(struct device *dev,  	len += sprintf(buf + len, "           :");  	for (i = 0; i < max_state; i++)  		len += sprintf(buf + len, "%10lu", -				df->profile->freq_table[i]); +				df->freq_table[i]);  	len += sprintf(buf + len, "   time(ms)\n");  	for (i = 0; i < max_state; i++) { -		if (df->profile->freq_table[i] -					== df->previous_freq) { +		if (df->freq_table[i] == df->previous_freq)  			len += sprintf(buf + len, "*"); -		} else { +		else  			len += sprintf(buf + len, " "); -		} -		len += sprintf(buf + len, "%10lu:", -				df->profile->freq_table[i]); + +		len += sprintf(buf + len, "%10lu:", df->freq_table[i]);  		for (j = 0; j < max_state; j++)  			len += sprintf(buf + len, "%10u",  				df->stats.trans_table[(i * max_state) + j]); @@ -1743,7 +1741,7 @@ static ssize_t trans_stat_store(struct device *dev,  	if (!df->profile)  		return -EINVAL; -	if (df->profile->max_state == 0) +	if (df->max_state == 0)  		return count;  	err = kstrtoint(buf, 10, &value); @@ -1751,11 +1749,11 @@ static ssize_t trans_stat_store(struct device *dev,  		return -EINVAL;  	mutex_lock(&df->lock); -	memset(df->stats.time_in_state, 0, (df->profile->max_state * +	memset(df->stats.time_in_state, 0, (df->max_state *  					sizeof(*df->stats.time_in_state)));  	memset(df->stats.trans_table, 0, array3_size(sizeof(unsigned int), -					df->profile->max_state, -					df->profile->max_state)); +					df->max_state, +					df->max_state));  	df->stats.total_trans = 0;  	df->stats.last_update = get_jiffies_64();  	mutex_unlock(&df->lock); | 
