blob: 9b122b18bc0e1b98cf82fed12411e87aebf6e70a [file] [log] [blame]
Neil Armstrongca7fdc82018-04-11 17:08:00 +02001/*
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
Neil Armstrongca7fdc82018-04-11 17:08:00 +020020struct dwc3_of_simple {
21 struct clk_bulk clks;
22 struct reset_ctl_bulk resets;
23};
24
25static 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
45static 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);
Neil Armstrong38276092018-04-12 10:13:50 +020051 if (ret == -ENOSYS)
Neil Armstrongca7fdc82018-04-11 17:08:00 +020052 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
67static 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
83static 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
94static const struct udevice_id dwc3_of_simple_ids[] = {
95 { .compatible = "amlogic,meson-gxl-dwc3" },
Jean-Jacques Hiblotcc73ba92018-04-12 10:41:11 +020096 { .compatible = "ti,dwc3" },
Neil Armstrongca7fdc82018-04-11 17:08:00 +020097 { }
98};
99
100U_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};