18e0c702bSNeil Armstrong /*
28e0c702bSNeil Armstrong * dwc3-of-simple.c - OF glue layer for simple integrations
38e0c702bSNeil Armstrong *
48e0c702bSNeil Armstrong * Copyright (c) 2015 Texas Instruments Incorporated - http://www.ti.com
58e0c702bSNeil Armstrong *
68e0c702bSNeil Armstrong * Author: Felipe Balbi <balbi@ti.com>
78e0c702bSNeil Armstrong *
88e0c702bSNeil Armstrong * Copyright (C) 2018 BayLibre, SAS
98e0c702bSNeil Armstrong * Author: Neil Armstrong <narmstron@baylibre.com>
108e0c702bSNeil Armstrong *
118e0c702bSNeil Armstrong * SPDX-License-Identifier: GPL-2.0+
128e0c702bSNeil Armstrong */
138e0c702bSNeil Armstrong
148e0c702bSNeil Armstrong #include <common.h>
158e0c702bSNeil Armstrong #include <dm.h>
168e0c702bSNeil Armstrong #include <reset.h>
178e0c702bSNeil Armstrong #include <clk.h>
188e0c702bSNeil Armstrong
198e0c702bSNeil Armstrong DECLARE_GLOBAL_DATA_PTR;
208e0c702bSNeil Armstrong
218e0c702bSNeil Armstrong struct dwc3_of_simple {
228e0c702bSNeil Armstrong struct clk_bulk clks;
238e0c702bSNeil Armstrong struct reset_ctl_bulk resets;
248e0c702bSNeil Armstrong };
258e0c702bSNeil Armstrong
dwc3_of_simple_reset_init(struct udevice * dev,struct dwc3_of_simple * simple)268e0c702bSNeil Armstrong static int dwc3_of_simple_reset_init(struct udevice *dev,
278e0c702bSNeil Armstrong struct dwc3_of_simple *simple)
288e0c702bSNeil Armstrong {
298e0c702bSNeil Armstrong int ret;
308e0c702bSNeil Armstrong
318e0c702bSNeil Armstrong ret = reset_get_bulk(dev, &simple->resets);
328e0c702bSNeil Armstrong if (ret == -ENOTSUPP)
338e0c702bSNeil Armstrong return 0;
348e0c702bSNeil Armstrong else if (ret)
358e0c702bSNeil Armstrong return ret;
368e0c702bSNeil Armstrong
378e0c702bSNeil Armstrong ret = reset_deassert_bulk(&simple->resets);
388e0c702bSNeil Armstrong if (ret) {
398e0c702bSNeil Armstrong reset_release_bulk(&simple->resets);
408e0c702bSNeil Armstrong return ret;
418e0c702bSNeil Armstrong }
428e0c702bSNeil Armstrong
438e0c702bSNeil Armstrong return 0;
448e0c702bSNeil Armstrong }
458e0c702bSNeil Armstrong
dwc3_of_simple_clk_init(struct udevice * dev,struct dwc3_of_simple * simple)468e0c702bSNeil Armstrong static int dwc3_of_simple_clk_init(struct udevice *dev,
478e0c702bSNeil Armstrong struct dwc3_of_simple *simple)
488e0c702bSNeil Armstrong {
498e0c702bSNeil Armstrong int ret;
508e0c702bSNeil Armstrong
518e0c702bSNeil Armstrong ret = clk_get_bulk(dev, &simple->clks);
52*2aad62faSNeil Armstrong if (ret == -ENOSYS)
538e0c702bSNeil Armstrong return 0;
548e0c702bSNeil Armstrong if (ret)
558e0c702bSNeil Armstrong return ret;
568e0c702bSNeil Armstrong
578e0c702bSNeil Armstrong #if CONFIG_IS_ENABLED(CLK)
588e0c702bSNeil Armstrong ret = clk_enable_bulk(&simple->clks);
598e0c702bSNeil Armstrong if (ret) {
608e0c702bSNeil Armstrong clk_release_bulk(&simple->clks);
618e0c702bSNeil Armstrong return ret;
628e0c702bSNeil Armstrong }
638e0c702bSNeil Armstrong #endif
648e0c702bSNeil Armstrong
658e0c702bSNeil Armstrong return 0;
668e0c702bSNeil Armstrong }
678e0c702bSNeil Armstrong
dwc3_of_simple_probe(struct udevice * dev)688e0c702bSNeil Armstrong static int dwc3_of_simple_probe(struct udevice *dev)
698e0c702bSNeil Armstrong {
708e0c702bSNeil Armstrong struct dwc3_of_simple *simple = dev_get_platdata(dev);
718e0c702bSNeil Armstrong int ret;
728e0c702bSNeil Armstrong
738e0c702bSNeil Armstrong ret = dwc3_of_simple_clk_init(dev, simple);
748e0c702bSNeil Armstrong if (ret)
758e0c702bSNeil Armstrong return ret;
768e0c702bSNeil Armstrong
778e0c702bSNeil Armstrong ret = dwc3_of_simple_reset_init(dev, simple);
788e0c702bSNeil Armstrong if (ret)
798e0c702bSNeil Armstrong return ret;
808e0c702bSNeil Armstrong
818e0c702bSNeil Armstrong return 0;
828e0c702bSNeil Armstrong }
838e0c702bSNeil Armstrong
dwc3_of_simple_remove(struct udevice * dev)848e0c702bSNeil Armstrong static int dwc3_of_simple_remove(struct udevice *dev)
858e0c702bSNeil Armstrong {
868e0c702bSNeil Armstrong struct dwc3_of_simple *simple = dev_get_platdata(dev);
878e0c702bSNeil Armstrong
888e0c702bSNeil Armstrong reset_release_bulk(&simple->resets);
898e0c702bSNeil Armstrong
908e0c702bSNeil Armstrong clk_release_bulk(&simple->clks);
918e0c702bSNeil Armstrong
928e0c702bSNeil Armstrong return dm_scan_fdt_dev(dev);
938e0c702bSNeil Armstrong }
948e0c702bSNeil Armstrong
958e0c702bSNeil Armstrong static const struct udevice_id dwc3_of_simple_ids[] = {
968e0c702bSNeil Armstrong { .compatible = "amlogic,meson-gxl-dwc3" },
97dc229bd7SJean-Jacques Hiblot { .compatible = "ti,dwc3" },
988e0c702bSNeil Armstrong { }
998e0c702bSNeil Armstrong };
1008e0c702bSNeil Armstrong
1018e0c702bSNeil Armstrong U_BOOT_DRIVER(dwc3_of_simple) = {
1028e0c702bSNeil Armstrong .name = "dwc3-of-simple",
1038e0c702bSNeil Armstrong .id = UCLASS_SIMPLE_BUS,
1048e0c702bSNeil Armstrong .of_match = dwc3_of_simple_ids,
1058e0c702bSNeil Armstrong .probe = dwc3_of_simple_probe,
1068e0c702bSNeil Armstrong .remove = dwc3_of_simple_remove,
1078e0c702bSNeil Armstrong .platdata_auto_alloc_size = sizeof(struct dwc3_of_simple),
1088e0c702bSNeil Armstrong .flags = DM_FLAG_ALLOC_PRIV_DMA,
1098e0c702bSNeil Armstrong };
110