xref: /OK3568_Linux_fs/u-boot/drivers/usb/host/dwc3-of-simple.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * dwc3-of-simple.c - OF glue layer for simple integrations
3  *
4  * Copyright (c) 2015 Texas Instruments Incorporated - http://www.ti.com
5  *
6  * Author: Felipe Balbi <balbi@ti.com>
7  *
8  * Copyright (C) 2018 BayLibre, SAS
9  * Author: Neil Armstrong <narmstron@baylibre.com>
10  *
11  * SPDX-License-Identifier:     GPL-2.0+
12  */
13 
14 #include <common.h>
15 #include <dm.h>
16 #include <reset.h>
17 #include <clk.h>
18 
19 DECLARE_GLOBAL_DATA_PTR;
20 
21 struct dwc3_of_simple {
22 	struct clk_bulk		clks;
23 	struct reset_ctl_bulk	resets;
24 };
25 
dwc3_of_simple_reset_init(struct udevice * dev,struct dwc3_of_simple * simple)26 static int dwc3_of_simple_reset_init(struct udevice *dev,
27 				     struct dwc3_of_simple *simple)
28 {
29 	int ret;
30 
31 	ret = reset_get_bulk(dev, &simple->resets);
32 	if (ret == -ENOTSUPP)
33 		return 0;
34 	else if (ret)
35 		return ret;
36 
37 	ret = reset_deassert_bulk(&simple->resets);
38 	if (ret) {
39 		reset_release_bulk(&simple->resets);
40 		return ret;
41 	}
42 
43 	return 0;
44 }
45 
dwc3_of_simple_clk_init(struct udevice * dev,struct dwc3_of_simple * simple)46 static int dwc3_of_simple_clk_init(struct udevice *dev,
47 				   struct dwc3_of_simple *simple)
48 {
49 	int ret;
50 
51 	ret = clk_get_bulk(dev, &simple->clks);
52 	if (ret == -ENOSYS)
53 		return 0;
54 	if (ret)
55 		return ret;
56 
57 #if CONFIG_IS_ENABLED(CLK)
58 	ret = clk_enable_bulk(&simple->clks);
59 	if (ret) {
60 		clk_release_bulk(&simple->clks);
61 		return ret;
62 	}
63 #endif
64 
65 	return 0;
66 }
67 
dwc3_of_simple_probe(struct udevice * dev)68 static int dwc3_of_simple_probe(struct udevice *dev)
69 {
70 	struct dwc3_of_simple *simple = dev_get_platdata(dev);
71 	int ret;
72 
73 	ret = dwc3_of_simple_clk_init(dev, simple);
74 	if (ret)
75 		return ret;
76 
77 	ret = dwc3_of_simple_reset_init(dev, simple);
78 	if (ret)
79 		return ret;
80 
81 	return 0;
82 }
83 
dwc3_of_simple_remove(struct udevice * dev)84 static int dwc3_of_simple_remove(struct udevice *dev)
85 {
86 	struct dwc3_of_simple *simple = dev_get_platdata(dev);
87 
88 	reset_release_bulk(&simple->resets);
89 
90 	clk_release_bulk(&simple->clks);
91 
92 	return dm_scan_fdt_dev(dev);
93 }
94 
95 static const struct udevice_id dwc3_of_simple_ids[] = {
96 	{ .compatible = "amlogic,meson-gxl-dwc3" },
97 	{ .compatible = "ti,dwc3" },
98 	{ }
99 };
100 
101 U_BOOT_DRIVER(dwc3_of_simple) = {
102 	.name = "dwc3-of-simple",
103 	.id = UCLASS_SIMPLE_BUS,
104 	.of_match = dwc3_of_simple_ids,
105 	.probe = dwc3_of_simple_probe,
106 	.remove = dwc3_of_simple_remove,
107 	.platdata_auto_alloc_size = sizeof(struct dwc3_of_simple),
108 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
109 };
110