static int __init tegra_dvfs_init_core_cap(void) { int i; struct clk *c = NULL; for (i = 0; i < ARRAY_SIZE(core_cap_table); i++) { c = tegra_get_clock_by_name(core_cap_table[i].cap_name); if (!c || !c->parent || init_core_cap_one(c, core_cap_table[i].freqs)) { pr_err("tegra3_dvfs: failed to initialize %s frequency" " table", core_cap_table[i].cap_name); continue; } core_cap_table[i].cap_clk = c; } core_cap_level = tegra3_dvfs_rail_vdd_core.max_millivolts; cap_kobj = kobject_create_and_add("tegra_cap", kernel_kobj); if (!cap_kobj) { pr_err("tegra3_dvfs: failed to create sysfs cap object"); return 0; } if (sysfs_create_files(cap_kobj, cap_attributes)) { pr_err("tegra3_dvfs: failed to create sysfs cap interface"); return 0; } pr_info("tegra dvfs: tegra sysfs cap interface is initialized\n"); return 0; }
int __init tegra_init_core_cap( struct core_dvfs_cap_table *table, int table_size, const int *millivolts, int millivolts_num, struct kobject *cap_kobj) { int i; struct clk *c = NULL; if (!table || !table_size || !millivolts || !millivolts_num) return -EINVAL; core_nominal_mv = tegra_dvfs_rail_get_nominal_millivolts(tegra_core_rail); if (core_nominal_mv <= 0) return -ENODATA; cap_millivolts = millivolts; cap_millivolts_num = millivolts_num; core_buses_cap.level = kdvfs_core_cap.level = user_core_cap.level = core_nominal_mv; for (i = 0; i < table_size; i++) { c = tegra_get_clock_by_name(table[i].cap_name); if (!c || !c->parent || init_core_cap_one(c, table[i].freqs)) { pr_err("%s: failed to initialize %s table\n", __func__, table[i].cap_name); continue; } table[i].cap_clk = c; } if (!cap_kobj || sysfs_create_files(cap_kobj, cap_attributes)) return -ENOMEM; core_cap_table = table; core_cap_table_size = table_size; return 0; }