/* * We use the notifier function for switching to a temporary safe configuration * (mux and divider), while the A53 PLL is reconfigured.
*/ staticint a53cc_notifier_cb(struct notifier_block *nb, unsignedlong event, void *data)
{ int ret = 0; struct clk_regmap_mux_div *md = container_of(nb, struct clk_regmap_mux_div,
clk_nb); if (event == PRE_RATE_CHANGE) /* set the mux and divider to safe frequency (400mhz) */
ret = mux_div_set_src_div(md, 4, 3);
regmap = dev_get_regmap(parent, NULL); if (!regmap) {
dev_err(dev, "failed to get regmap: %d\n", ret); return ret;
}
a53cc = devm_kzalloc(dev, sizeof(*a53cc), GFP_KERNEL); if (!a53cc) return -ENOMEM;
/* Use an unique name by appending parent's @unit-address */
init.name = devm_kasprintf(dev, GFP_KERNEL, "a53mux%s",
strchrnul(np->full_name, '@')); if (!init.name) return -ENOMEM;
a53cc->pclk = devm_clk_get(parent, NULL); if (IS_ERR(a53cc->pclk)) {
ret = PTR_ERR(a53cc->pclk); if (ret != -EPROBE_DEFER)
dev_err(dev, "failed to get clk: %d\n", ret); return ret;
}
a53cc->clk_nb.notifier_call = a53cc_notifier_cb;
ret = clk_notifier_register(a53cc->pclk, &a53cc->clk_nb); if (ret) {
dev_err(dev, "failed to register clock notifier: %d\n", ret); return ret;
}
ret = devm_clk_register_regmap(dev, &a53cc->clkr); if (ret) {
dev_err(dev, "failed to register regmap clock: %d\n", ret); goto err;
}
ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
&a53cc->clkr.hw); if (ret) {
dev_err(dev, "failed to add clock provider: %d\n", ret); goto err;
}
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.