2 * Copyright (C) 2016 Atmel Corporation
3 * Wenyou.Yang <wenyou.yang@atmel.com>
5 * SPDX-License-Identifier: GPL-2.0+
9 #include <clk-uclass.h>
15 DECLARE_GLOBAL_DATA_PTR
;
17 static const struct udevice_id at91_pmc_match
[] = {
18 { .compatible
= "atmel,at91rm9200-pmc" },
19 { .compatible
= "atmel,at91sam9260-pmc" },
20 { .compatible
= "atmel,at91sam9g45-pmc" },
21 { .compatible
= "atmel,at91sam9n12-pmc" },
22 { .compatible
= "atmel,at91sam9x5-pmc" },
23 { .compatible
= "atmel,sama5d3-pmc" },
24 { .compatible
= "atmel,sama5d2-pmc" },
28 U_BOOT_DRIVER(at91_pmc
) = {
30 .id
= UCLASS_SIMPLE_BUS
,
31 .of_match
= at91_pmc_match
,
34 /*---------------------------------------------------------*/
36 int at91_pmc_core_probe(struct udevice
*dev
)
38 struct pmc_platdata
*plat
= dev_get_platdata(dev
);
40 dev
= dev_get_parent(dev
);
42 plat
->reg_base
= (struct at91_pmc
*)devfdt_get_addr_ptr(dev
);
48 * at91_clk_sub_device_bind() - for the at91 clock driver
49 * Recursively bind its children as clk devices.
51 * @return: 0 on success, or negative error code on failure
53 int at91_clk_sub_device_bind(struct udevice
*dev
, const char *drv_name
)
55 const void *fdt
= gd
->fdt_blob
;
56 int offset
= dev_of_offset(dev
);
57 bool pre_reloc_only
= !(gd
->flags
& GD_FLG_RELOC
);
61 for (offset
= fdt_first_subnode(fdt
, offset
);
63 offset
= fdt_next_subnode(fdt
, offset
)) {
65 !dm_fdt_pre_reloc(fdt
, offset
))
68 * If this node has "compatible" property, this is not
69 * a clock sub-node, but a normal device. skip.
71 fdt_get_property(fdt
, offset
, "compatible", &ret
);
75 if (ret
!= -FDT_ERR_NOTFOUND
)
78 name
= fdt_get_name(fdt
, offset
, NULL
);
81 ret
= device_bind_driver_to_node(dev
, drv_name
, name
,
90 int at91_clk_of_xlate(struct clk
*clk
, struct fdtdec_phandle_args
*args
)
94 if (args
->args_count
) {
95 debug("Invalid args_count: %d\n", args
->args_count
);
99 periph
= fdtdec_get_uint(gd
->fdt_blob
, dev_of_offset(clk
->dev
), "reg",
109 int at91_clk_probe(struct udevice
*dev
)
111 struct udevice
*dev_periph_container
, *dev_pmc
;
112 struct pmc_platdata
*plat
= dev_get_platdata(dev
);
114 dev_periph_container
= dev_get_parent(dev
);
115 dev_pmc
= dev_get_parent(dev_periph_container
);
117 plat
->reg_base
= (struct at91_pmc
*)devfdt_get_addr_ptr(dev_pmc
);