/** * tegra_cvb_build_opp_table - build OPP table from Tegra CVB tables * @cvb_tables: array of CVB tables * @sz: size of the previously mentioned array * @process_id: process id of the HW module * @speedo_id: speedo id of the HW module * @speedo_value: speedo value of the HW module * @max_rate: highest safe clock rate * @opp_dev: the struct device * for which the OPP table is built * * On Tegra, a CVB table encodes the relationship between operating voltage * and safe maximal frequency for a given module (e.g. GPU or CPU). This * function calculates the optimal voltage-frequency operating points * for the given arguments and exports them via the OPP library for the * given @opp_dev. Returns a pointer to the struct cvb_table that matched * or an ERR_PTR on failure. */ const struct cvb_table *tegra_cvb_build_opp_table( const struct cvb_table *cvb_tables, size_t sz, int process_id, int speedo_id, int speedo_value, unsigned long max_rate, struct device *opp_dev) { int i, ret; for (i = 0; i < sz; i++) { const struct cvb_table *d = &cvb_tables[i]; if (d->speedo_id != -1 && d->speedo_id != speedo_id) continue; if (d->process_id != -1 && d->process_id != process_id) continue; ret = build_opp_table(d, speedo_value, max_rate, opp_dev); return ret ? ERR_PTR(ret) : d; } return ERR_PTR(-EINVAL); }
/** * tegra_cvb_add_opp_table - build OPP table from Tegra CVB tables * @cvb_tables: array of CVB tables * @sz: size of the previously mentioned array * @process_id: process id of the HW module * @speedo_id: speedo id of the HW module * @speedo_value: speedo value of the HW module * @max_rate: highest safe clock rate * @opp_dev: the struct device * for which the OPP table is built * * On Tegra, a CVB table encodes the relationship between operating voltage * and safe maximal frequency for a given module (e.g. GPU or CPU). This * function calculates the optimal voltage-frequency operating points * for the given arguments and exports them via the OPP library for the * given @opp_dev. Returns a pointer to the struct cvb_table that matched * or an ERR_PTR on failure. */ const struct cvb_table * tegra_cvb_add_opp_table(struct device *dev, const struct cvb_table *tables, size_t count, int process_id, int speedo_id, int speedo_value, unsigned long max_freq) { size_t i; int ret; for (i = 0; i < count; i++) { const struct cvb_table *table = &tables[i]; if (table->speedo_id != -1 && table->speedo_id != speedo_id) continue; if (table->process_id != -1 && table->process_id != process_id) continue; ret = build_opp_table(dev, table, speedo_value, max_freq); return ret ? ERR_PTR(ret) : table; } return ERR_PTR(-EINVAL); }