drivers/clk/zynq/clkc.c

Source file repositories/reference/linux-study-clean/drivers/clk/zynq/clkc.c

File Facts

System
Linux kernel
Corpus path
drivers/clk/zynq/clkc.c
Extension
.c
Size
21433 bytes
Lines
615
Domain
Driver Families
Bucket
drivers/clk
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (IS_ERR(clks[i])) {
			pr_err("Zynq clk %d: register failed with %ld\n",
			       i, PTR_ERR(clks[i]));
			BUG();
		}
	}

	clk_data.clks = clks;
	clk_data.clk_num = ARRAY_SIZE(clks);
	of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
}

CLK_OF_DECLARE(zynq_clkc, "xlnx,ps7-clkc", zynq_clk_setup);

void __init zynq_clock_init(void)
{
	struct device_node *np;
	struct device_node *slcr;
	struct resource res;

	np = of_find_compatible_node(NULL, NULL, "xlnx,ps7-clkc");
	if (!np) {
		pr_err("%s: clkc node not found\n", __func__);
		goto np_err;
	}

	if (of_address_to_resource(np, 0, &res)) {
		pr_err("%pOFn: failed to get resource\n", np);
		goto np_err;
	}

	slcr = of_get_parent(np);

	if (slcr->data) {
		zynq_clkc_base = (__force void __iomem *)slcr->data + res.start;
	} else {
		pr_err("%pOFn: Unable to get I/O memory\n", np);
		of_node_put(slcr);
		goto np_err;
	}

	pr_info("%s: clkc starts at %p\n", __func__, zynq_clkc_base);

	of_node_put(slcr);
	of_node_put(np);

	return;

np_err:
	of_node_put(np);
	BUG();
}

Annotation

Implementation Notes