in ti-sysc.c [425:493]
static int sysc_get_clocks(struct sysc *ddata)
{
struct device_node *np = ddata->dev->of_node;
struct property *prop;
const char *name;
int nr_fck = 0, nr_ick = 0, i, error = 0;
ddata->clock_roles = devm_kcalloc(ddata->dev,
SYSC_MAX_CLOCKS,
sizeof(*ddata->clock_roles),
GFP_KERNEL);
if (!ddata->clock_roles)
return -ENOMEM;
of_property_for_each_string(np, "clock-names", prop, name) {
if (!strncmp(clock_names[SYSC_FCK], name, 3))
nr_fck++;
if (!strncmp(clock_names[SYSC_ICK], name, 3))
nr_ick++;
ddata->clock_roles[ddata->nr_clocks] = name;
ddata->nr_clocks++;
}
if (ddata->nr_clocks < 1)
return 0;
if ((ddata->cfg.quirks & SYSC_QUIRK_EXT_OPT_CLOCK)) {
error = sysc_init_ext_opt_clock(ddata, NULL);
if (error)
return error;
}
if (ddata->nr_clocks > SYSC_MAX_CLOCKS) {
dev_err(ddata->dev, "too many clocks for %pOF\n", np);
return -EINVAL;
}
if (nr_fck > 1 || nr_ick > 1) {
dev_err(ddata->dev, "max one fck and ick for %pOF\n", np);
return -EINVAL;
}
/* Always add a slot for main clocks fck and ick even if unused */
if (!nr_fck)
ddata->nr_clocks++;
if (!nr_ick)
ddata->nr_clocks++;
ddata->clocks = devm_kcalloc(ddata->dev,
ddata->nr_clocks, sizeof(*ddata->clocks),
GFP_KERNEL);
if (!ddata->clocks)
return -ENOMEM;
for (i = 0; i < SYSC_MAX_CLOCKS; i++) {
const char *name = ddata->clock_roles[i];
if (!name)
continue;
error = sysc_get_one_clock(ddata, name);
if (error)
return error;
}
return 0;
}