On 18-08-25, 13:52, Krishna Chaitanya Chundru wrote: > +static bool _compare_opp_key_exact(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp, > + struct dev_pm_opp_key opp_key, struct dev_pm_opp_key key) > +{ > + bool freq_match = (opp_key.freq == 0 || key.freq == 0 || opp_key.freq == key.freq); Why !opp_key.freq is okay ? If the user has provided a freq value, then it must match. Isn't it ? > + bool level_match = (opp_key.level == OPP_LEVEL_UNSET || > + key.level == OPP_LEVEL_UNSET || opp_key.level == key.level); We should compare bw too I guess in the same routine. > + if (freq_match && level_match) { > + *opp = temp_opp; > + return true; > + } > + > + return false; > +} > +/** > + * dev_pm_opp_find_freq_level_exact() - Search for an exact frequency and level Instead dev_pm_opp_find_key_exact() and let the user pass the key struct itself. > +struct dev_pm_opp *dev_pm_opp_find_freq_level_exact(struct device *dev, > + unsigned long freq, > + unsigned int level, > + bool available) > +{ > + struct opp_table *opp_table __free(put_opp_table); The constructor here must be real, i.e. initialize opp_table here itself. This is well documented in cleanup.h. Yes there are examples like this in the OPP core which are required to be fixed too. -- viresh