1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2020 Sean Anderson <seanga2@gmail.com>
4  */
5 
6 #include <clk.h>
7 #include <dm.h>
8 
9 /*
10  * Power domains are taken care of by driver_probe, so we just have to enable
11  * clocks
12  */
simple_pm_bus_probe(struct udevice * dev)13 static int simple_pm_bus_probe(struct udevice *dev)
14 {
15 	int ret;
16 	struct clk_bulk *bulk = dev_get_priv(dev);
17 
18 	ret = clk_get_bulk(dev, bulk);
19 	if (ret)
20 		return ret;
21 
22 	ret = clk_enable_bulk(bulk);
23 	if (ret && ret != -ENOSYS) {
24 		clk_release_bulk(bulk);
25 		return ret;
26 	}
27 	return 0;
28 }
29 
simple_pm_bus_remove(struct udevice * dev)30 static int simple_pm_bus_remove(struct udevice *dev)
31 {
32 	int ret;
33 	struct clk_bulk *bulk = dev_get_priv(dev);
34 
35 	ret = clk_release_bulk(bulk);
36 	if (ret && ret != -ENOSYS)
37 		return ret;
38 	else
39 		return 0;
40 }
41 
42 static const struct udevice_id simple_pm_bus_ids[] = {
43 	{ .compatible = "simple-pm-bus" },
44 	{ }
45 };
46 
47 U_BOOT_DRIVER(simple_pm_bus_drv) = {
48 	.name	= "simple_pm_bus",
49 	.id	= UCLASS_SIMPLE_BUS,
50 	.of_match = simple_pm_bus_ids,
51 	.probe = simple_pm_bus_probe,
52 	.remove = simple_pm_bus_remove,
53 	.priv_auto	= sizeof(struct clk_bulk),
54 	.flags	= DM_FLAG_PRE_RELOC,
55 };
56