]> git.sur5r.net Git - u-boot/blob - drivers/usb/host/dwc3-of-simple.c
Merge git://git.denx.de/u-boot-sunxi
[u-boot] / drivers / usb / host / dwc3-of-simple.c
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 <fdtdec.h>
17 #include <reset.h>
18 #include <clk.h>
19
20 struct dwc3_of_simple {
21         struct clk_bulk         clks;
22         struct reset_ctl_bulk   resets;
23 };
24
25 static int dwc3_of_simple_reset_init(struct udevice *dev,
26                                      struct dwc3_of_simple *simple)
27 {
28         int ret;
29
30         ret = reset_get_bulk(dev, &simple->resets);
31         if (ret == -ENOTSUPP)
32                 return 0;
33         else if (ret)
34                 return ret;
35
36         ret = reset_deassert_bulk(&simple->resets);
37         if (ret) {
38                 reset_release_bulk(&simple->resets);
39                 return ret;
40         }
41
42         return 0;
43 }
44
45 static int dwc3_of_simple_clk_init(struct udevice *dev,
46                                    struct dwc3_of_simple *simple)
47 {
48         int ret;
49
50         ret = clk_get_bulk(dev, &simple->clks);
51         if (ret == -ENOSYS)
52                 return 0;
53         if (ret)
54                 return ret;
55
56 #if CONFIG_IS_ENABLED(CLK)
57         ret = clk_enable_bulk(&simple->clks);
58         if (ret) {
59                 clk_release_bulk(&simple->clks);
60                 return ret;
61         }
62 #endif
63
64         return 0;
65 }
66
67 static int dwc3_of_simple_probe(struct udevice *dev)
68 {
69         struct dwc3_of_simple *simple = dev_get_platdata(dev);
70         int ret;
71
72         ret = dwc3_of_simple_clk_init(dev, simple);
73         if (ret)
74                 return ret;
75
76         ret = dwc3_of_simple_reset_init(dev, simple);
77         if (ret)
78                 return ret;
79
80         return 0;
81 }
82
83 static int dwc3_of_simple_remove(struct udevice *dev)
84 {
85         struct dwc3_of_simple *simple = dev_get_platdata(dev);
86
87         reset_release_bulk(&simple->resets);
88
89         clk_release_bulk(&simple->clks);
90
91         return dm_scan_fdt_dev(dev);
92 }
93
94 static const struct udevice_id dwc3_of_simple_ids[] = {
95         { .compatible = "amlogic,meson-gxl-dwc3" },
96         { .compatible = "ti,dwc3" },
97         { }
98 };
99
100 U_BOOT_DRIVER(dwc3_of_simple) = {
101         .name = "dwc3-of-simple",
102         .id = UCLASS_SIMPLE_BUS,
103         .of_match = dwc3_of_simple_ids,
104         .probe = dwc3_of_simple_probe,
105         .remove = dwc3_of_simple_remove,
106         .platdata_auto_alloc_size = sizeof(struct dwc3_of_simple),
107         .flags = DM_FLAG_ALLOC_PRIV_DMA,
108 };