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