// SPDX-License-Identifier: GPL-2.0-only /* * Match running platform with pre-defined OPP values for CPUFreq * * Author: Ajit Pal Singh <ajitpal.singh@st.com> * Lee Jones <lee.jones@linaro.org> * * Copyright (C) 2015 STMicroelectronics (R&D) Limited
*/
/* * Only match on "suitable for ALL versions" entries * * This will be used with the BIT() macro. It sets the * top bit of a 32bit value and is equal to 0x80000000.
*/ #define DEFAULT_VERSION 31
ret = of_property_read_u32_index(np, "st,syscfg",
MAJOR_ID_INDEX, &major_offset); if (ret) {
dev_err(dev, "No major number offset provided in %pOF [%d]\n",
np, ret); return ret;
}
ret = regmap_read(ddata.syscfg, major_offset, &socid); if (ret) {
dev_err(dev, "Failed to read major number from syscon [%d]\n",
ret); return ret;
}
ret = of_property_read_u32_index(np, "st,syscfg-eng",
MINOR_ID_INDEX, &minor_offset); if (ret) {
dev_err(dev, "No minor number offset provided %pOF [%d]\n",
np, ret); return ret;
}
ret = regmap_read(ddata.syscfg_eng, minor_offset, &minid); if (ret) {
dev_err(dev, "Failed to read the minor number from syscon [%d]\n",
ret); return ret;
}
return minid & 0xf;
}
staticint sti_cpufreq_fetch_regmap_field(conststruct reg_field *reg_fields, int hw_info_offset, int field)
{ struct regmap_field *regmap_field; struct reg_field reg_field = reg_fields[field]; struct device *dev = ddata.cpu; unsignedint value; int ret;
reg_field.reg = hw_info_offset;
regmap_field = devm_regmap_field_alloc(dev,
ddata.syscfg_eng,
reg_field); if (IS_ERR(regmap_field)) {
dev_err(dev, "Failed to allocate reg field\n"); return PTR_ERR(regmap_field);
}
ret = regmap_field_read(regmap_field, &value); if (ret) {
dev_err(dev, "Failed to read %s code\n",
field ? "SUBSTRATE" : "PCODE"); return ret;
}
reg_fields = sti_cpufreq_match(); if (!reg_fields) {
dev_err(dev, "This SoC doesn't support voltage scaling\n"); return -ENODEV;
}
ret = of_property_read_u32_index(np, "st,syscfg-eng",
HW_INFO_INDEX, &hw_info_offset); if (ret) {
dev_warn(dev, "Failed to read HW info offset from DT\n");
substrate = DEFAULT_VERSION;
pcode = 0; goto use_defaults;
}
pcode = sti_cpufreq_fetch_regmap_field(reg_fields,
hw_info_offset,
PCODE); if (pcode < 0) {
dev_warn(dev, "Failed to obtain process code\n"); /* Use default pcode */
pcode = 0;
}
substrate = sti_cpufreq_fetch_regmap_field(reg_fields,
hw_info_offset,
SUBSTRATE); if (substrate) {
dev_warn(dev, "Failed to obtain substrate code\n"); /* Use default substrate */
substrate = DEFAULT_VERSION;
}
use_defaults:
major = sti_cpufreq_fetch_major(); if (major < 0) {
dev_err(dev, "Failed to obtain major version\n"); /* Use default major number */
major = DEFAULT_VERSION;
}
minor = sti_cpufreq_fetch_minor(); if (minor < 0) {
dev_err(dev, "Failed to obtain minor version\n"); /* Use default minor number */
minor = DEFAULT_VERSION;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.