xref: /rk3399_rockchip-uboot/drivers/usb/host/dwc3-of-simple.c (revision c637f2321bc4ce8e021571daba5bf82a677b865f)
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