diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/opp/core.c | 42 | 
1 files changed, 27 insertions, 15 deletions
| diff --git a/drivers/opp/core.c b/drivers/opp/core.c index 09a1432561f6..1fee2abc0ba6 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -101,11 +101,21 @@ struct opp_table *_find_opp_table(struct device *dev)   * representation in the OPP table and manage the clock configuration themselves   * in an platform specific way.   */ -static bool assert_single_clk(struct opp_table *opp_table) +static bool assert_single_clk(struct opp_table *opp_table, +			      unsigned int __always_unused index)  {  	return !WARN_ON(opp_table->clk_count > 1);  } +/* + * Returns true if clock table is large enough to contain the clock index. + */ +static bool assert_clk_index(struct opp_table *opp_table, +			     unsigned int index) +{ +	return opp_table->clk_count > index; +} +  /**   * dev_pm_opp_get_bw() - Gets the bandwidth corresponding to an opp   * @opp:	opp for which bandwidth has to be returned for @@ -524,12 +534,12 @@ static struct dev_pm_opp *_opp_table_find_key(struct opp_table *opp_table,  		unsigned long (*read)(struct dev_pm_opp *opp, int index),  		bool (*compare)(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,  				unsigned long opp_key, unsigned long key), -		bool (*assert)(struct opp_table *opp_table)) +		bool (*assert)(struct opp_table *opp_table, unsigned int index))  {  	struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);  	/* Assert that the requirement is met */ -	if (assert && !assert(opp_table)) +	if (assert && !assert(opp_table, index))  		return ERR_PTR(-EINVAL);  	mutex_lock(&opp_table->lock); @@ -557,7 +567,7 @@ _find_key(struct device *dev, unsigned long *key, int index, bool available,  	  unsigned long (*read)(struct dev_pm_opp *opp, int index),  	  bool (*compare)(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,  			  unsigned long opp_key, unsigned long key), -	  bool (*assert)(struct opp_table *opp_table)) +	  bool (*assert)(struct opp_table *opp_table, unsigned int index))  {  	struct opp_table *opp_table;  	struct dev_pm_opp *opp; @@ -580,7 +590,7 @@ _find_key(struct device *dev, unsigned long *key, int index, bool available,  static struct dev_pm_opp *_find_key_exact(struct device *dev,  		unsigned long key, int index, bool available,  		unsigned long (*read)(struct dev_pm_opp *opp, int index), -		bool (*assert)(struct opp_table *opp_table)) +		bool (*assert)(struct opp_table *opp_table, unsigned int index))  {  	/*  	 * The value of key will be updated here, but will be ignored as the @@ -593,7 +603,7 @@ static struct dev_pm_opp *_find_key_exact(struct device *dev,  static struct dev_pm_opp *_opp_table_find_key_ceil(struct opp_table *opp_table,  		unsigned long *key, int index, bool available,  		unsigned long (*read)(struct dev_pm_opp *opp, int index), -		bool (*assert)(struct opp_table *opp_table)) +		bool (*assert)(struct opp_table *opp_table, unsigned int index))  {  	return _opp_table_find_key(opp_table, key, index, available, read,  				   _compare_ceil, assert); @@ -602,7 +612,7 @@ static struct dev_pm_opp *_opp_table_find_key_ceil(struct opp_table *opp_table,  static struct dev_pm_opp *_find_key_ceil(struct device *dev, unsigned long *key,  		int index, bool available,  		unsigned long (*read)(struct dev_pm_opp *opp, int index), -		bool (*assert)(struct opp_table *opp_table)) +		bool (*assert)(struct opp_table *opp_table, unsigned int index))  {  	return _find_key(dev, key, index, available, read, _compare_ceil,  			 assert); @@ -611,7 +621,7 @@ static struct dev_pm_opp *_find_key_ceil(struct device *dev, unsigned long *key,  static struct dev_pm_opp *_find_key_floor(struct device *dev,  		unsigned long *key, int index, bool available,  		unsigned long (*read)(struct dev_pm_opp *opp, int index), -		bool (*assert)(struct opp_table *opp_table)) +		bool (*assert)(struct opp_table *opp_table, unsigned int index))  {  	return _find_key(dev, key, index, available, read, _compare_floor,  			 assert); @@ -672,7 +682,8 @@ struct dev_pm_opp *  dev_pm_opp_find_freq_exact_indexed(struct device *dev, unsigned long freq,  				   u32 index, bool available)  { -	return _find_key_exact(dev, freq, index, available, _read_freq, NULL); +	return _find_key_exact(dev, freq, index, available, _read_freq, +			       assert_clk_index);  }  EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_exact_indexed); @@ -732,7 +743,8 @@ struct dev_pm_opp *  dev_pm_opp_find_freq_ceil_indexed(struct device *dev, unsigned long *freq,  				  u32 index)  { -	return _find_key_ceil(dev, freq, index, true, _read_freq, NULL); +	return _find_key_ceil(dev, freq, index, true, _read_freq, +			      assert_clk_index);  }  EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_ceil_indexed); @@ -785,7 +797,7 @@ struct dev_pm_opp *  dev_pm_opp_find_freq_floor_indexed(struct device *dev, unsigned long *freq,  				   u32 index)  { -	return _find_key_floor(dev, freq, index, true, _read_freq, NULL); +	return _find_key_floor(dev, freq, index, true, _read_freq, assert_clk_index);  }  EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor_indexed); @@ -1727,7 +1739,7 @@ void dev_pm_opp_remove(struct device *dev, unsigned long freq)  	if (IS_ERR(opp_table))  		return; -	if (!assert_single_clk(opp_table)) +	if (!assert_single_clk(opp_table, 0))  		goto put_table;  	mutex_lock(&opp_table->lock); @@ -2079,7 +2091,7 @@ int _opp_add_v1(struct opp_table *opp_table, struct device *dev,  	unsigned long tol, u_volt = data->u_volt;  	int ret; -	if (!assert_single_clk(opp_table)) +	if (!assert_single_clk(opp_table, 0))  		return -EINVAL;  	new_opp = _opp_allocate(opp_table); @@ -2835,7 +2847,7 @@ static int _opp_set_availability(struct device *dev, unsigned long freq,  		return r;  	} -	if (!assert_single_clk(opp_table)) { +	if (!assert_single_clk(opp_table, 0)) {  		r = -EINVAL;  		goto put_table;  	} @@ -2911,7 +2923,7 @@ int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,  		return r;  	} -	if (!assert_single_clk(opp_table)) { +	if (!assert_single_clk(opp_table, 0)) {  		r = -EINVAL;  		goto put_table;  	} | 
