Lines Matching +full:usb +full:- +full:glue
2 * STiH407 family DWC3 specific Glue layer
4 * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
7 * SPDX-License-Identifier: GPL-2.0+
16 #include <reset-uclass.h>
18 #include <usb.h>
20 #include <linux/usb/dwc3.h>
21 #include <linux/usb/otg.h>
22 #include <dwc3-sti-glue.h>
27 * struct sti_dwc3_glue_platdata - dwc3 STi glue driver private structure
28 * @syscfg_base: addr for the glue syscfg
29 * @glue_base: addr for the glue registers
30 * @syscfg_offset: usb syscfg control offset
48 val = readl(plat->syscfg_base + plat->syscfg_offset); in sti_dwc3_glue_drd_init()
52 switch (plat->mode) { in sti_dwc3_glue_drd_init()
72 pr_err("Unsupported mode of operation %d\n", plat->mode); in sti_dwc3_glue_drd_init()
73 return -EINVAL; in sti_dwc3_glue_drd_init()
75 writel(val, plat->syscfg_base + plat->syscfg_offset); in sti_dwc3_glue_drd_init()
84 reg = readl(plat->glue_base + CLKRST_CTRL); in sti_dwc3_glue_init()
89 writel(reg, plat->glue_base + CLKRST_CTRL); in sti_dwc3_glue_init()
92 reg = readl(plat->glue_base + USB2_VBUS_MNGMNT_SEL1); in sti_dwc3_glue_init()
98 writel(reg, plat->glue_base + USB2_VBUS_MNGMNT_SEL1); in sti_dwc3_glue_init()
100 setbits_le32(plat->glue_base + CLKRST_CTRL, SW_PIPEW_RESET_N); in sti_dwc3_glue_init()
111 ret = ofnode_read_u32_array(dev->node, "reg", reg, ARRAY_SIZE(reg)); in sti_dwc3_glue_ofdata_to_platdata()
113 pr_err("unable to find st,stih407-dwc3 reg property(%d)\n", ret); in sti_dwc3_glue_ofdata_to_platdata()
117 plat->glue_base = reg[0]; in sti_dwc3_glue_ofdata_to_platdata()
118 plat->syscfg_offset = reg[2]; in sti_dwc3_glue_ofdata_to_platdata()
128 /* get syscfg-reg base address */ in sti_dwc3_glue_ofdata_to_platdata()
132 return -ENODEV; in sti_dwc3_glue_ofdata_to_platdata()
134 plat->syscfg_base = regmap->base; in sti_dwc3_glue_ofdata_to_platdata()
137 ret = reset_get_by_name(dev, "powerdown", &plat->powerdown_ctl); in sti_dwc3_glue_ofdata_to_platdata()
139 pr_err("can't get powerdown reset for %s (%d)", dev->name, ret); in sti_dwc3_glue_ofdata_to_platdata()
144 ret = reset_get_by_name(dev, "softreset", &plat->softreset_ctl); in sti_dwc3_glue_ofdata_to_platdata()
146 pr_err("can't get soft reset for %s (%d)", dev->name, ret); in sti_dwc3_glue_ofdata_to_platdata()
157 ofnode_for_each_subnode(node, dev->node) { in sti_dwc3_glue_bind()
163 pr_err("Can't find dwc3 subnode for %s\n", dev->name); in sti_dwc3_glue_bind()
164 return -ENODEV; in sti_dwc3_glue_bind()
168 plat->mode = usb_get_dr_mode(dwc3_node); in sti_dwc3_glue_bind()
169 if (plat->mode == USB_DR_MODE_UNKNOWN) in sti_dwc3_glue_bind()
171 plat->mode = USB_DR_MODE_HOST; in sti_dwc3_glue_bind()
182 ret = reset_deassert(&plat->powerdown_ctl); in sti_dwc3_glue_probe()
188 ret = reset_deassert(&plat->softreset_ctl); in sti_dwc3_glue_probe()
203 ret = reset_assert(&plat->softreset_ctl); in sti_dwc3_glue_probe()
210 ret = reset_assert(&plat->powerdown_ctl); in sti_dwc3_glue_probe()
223 ret = reset_assert(&plat->powerdown_ctl); in sti_dwc3_glue_remove()
229 ret = reset_assert(&plat->softreset_ctl); in sti_dwc3_glue_remove()
237 { .compatible = "st,stih407-dwc3" },