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 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 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 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 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