Lines Matching +full:reset +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
17 #include <reset-uclass.h>
23 #include <dwc3-sti-glue.h>
28 * struct sti_dwc3_glue_platdata - dwc3 STi glue driver private structure
33 * @softreset_ctl: reset controller for softreset signal
34 * @mode: drd static host/device config
42 enum usb_dr_mode mode; member
49 val = readl(plat->syscfg_base + plat->syscfg_offset); in sti_dwc3_glue_drd_init()
53 switch (plat->mode) { in sti_dwc3_glue_drd_init()
73 pr_err("Unsupported mode of operation %d\n", plat->mode); in sti_dwc3_glue_drd_init()
74 return -EINVAL; in sti_dwc3_glue_drd_init()
76 writel(val, plat->syscfg_base + plat->syscfg_offset); in sti_dwc3_glue_drd_init()
85 reg = readl(plat->glue_base + CLKRST_CTRL); in sti_dwc3_glue_init()
90 writel(reg, plat->glue_base + CLKRST_CTRL); in sti_dwc3_glue_init()
93 reg = readl(plat->glue_base + USB2_VBUS_MNGMNT_SEL1); in sti_dwc3_glue_init()
99 writel(reg, plat->glue_base + USB2_VBUS_MNGMNT_SEL1); in sti_dwc3_glue_init()
101 setbits_le32(plat->glue_base + CLKRST_CTRL, SW_PIPEW_RESET_N); in sti_dwc3_glue_init()
112 ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(dev), in sti_dwc3_glue_ofdata_to_platdata()
115 pr_err("unable to find st,stih407-dwc3 reg property(%d)\n", ret); in sti_dwc3_glue_ofdata_to_platdata()
119 plat->glue_base = reg[0]; in sti_dwc3_glue_ofdata_to_platdata()
120 plat->syscfg_offset = reg[2]; in sti_dwc3_glue_ofdata_to_platdata()
130 /* get syscfg-reg base address */ in sti_dwc3_glue_ofdata_to_platdata()
134 return -ENODEV; in sti_dwc3_glue_ofdata_to_platdata()
136 plat->syscfg_base = regmap->ranges[0].start; in sti_dwc3_glue_ofdata_to_platdata()
138 /* get powerdown reset */ in sti_dwc3_glue_ofdata_to_platdata()
139 ret = reset_get_by_name(dev, "powerdown", &plat->powerdown_ctl); in sti_dwc3_glue_ofdata_to_platdata()
141 pr_err("can't get powerdown reset for %s (%d)", dev->name, ret); in sti_dwc3_glue_ofdata_to_platdata()
145 /* get softreset reset */ in sti_dwc3_glue_ofdata_to_platdata()
146 ret = reset_get_by_name(dev, "softreset", &plat->softreset_ctl); in sti_dwc3_glue_ofdata_to_platdata()
148 pr_err("can't get soft reset for %s (%d)", dev->name, ret); in sti_dwc3_glue_ofdata_to_platdata()
159 dwc3_node = fdt_first_subnode(gd->fdt_blob, dev_of_offset(dev)); in sti_dwc3_glue_bind()
161 pr_err("Can't find subnode for %s\n", dev->name); in sti_dwc3_glue_bind()
162 return -ENODEV; in sti_dwc3_glue_bind()
166 if (fdt_node_check_compatible(gd->fdt_blob, dwc3_node, in sti_dwc3_glue_bind()
168 pr_err("Can't find dwc3 subnode for %s\n", dev->name); in sti_dwc3_glue_bind()
169 return -ENODEV; in sti_dwc3_glue_bind()
172 /* retrieve the DWC3 dual role mode */ in sti_dwc3_glue_bind()
173 plat->mode = usb_get_dr_mode(dwc3_node); in sti_dwc3_glue_bind()
174 if (plat->mode == USB_DR_MODE_UNKNOWN) in sti_dwc3_glue_bind()
175 /* by default set dual role mode to HOST */ in sti_dwc3_glue_bind()
176 plat->mode = USB_DR_MODE_HOST; in sti_dwc3_glue_bind()
187 ret = reset_deassert(&plat->powerdown_ctl); in sti_dwc3_glue_probe()
189 pr_err("DWC3 powerdown reset deassert failed: %d", ret); in sti_dwc3_glue_probe()
193 ret = reset_deassert(&plat->softreset_ctl); in sti_dwc3_glue_probe()
195 pr_err("DWC3 soft reset deassert failed: %d", ret); in sti_dwc3_glue_probe()
208 ret = reset_assert(&plat->softreset_ctl); in sti_dwc3_glue_probe()
210 pr_err("DWC3 soft reset deassert failed: %d", ret); in sti_dwc3_glue_probe()
215 ret = reset_assert(&plat->powerdown_ctl); in sti_dwc3_glue_probe()
217 pr_err("DWC3 powerdown reset deassert failed: %d", ret); in sti_dwc3_glue_probe()
228 ret = reset_assert(&plat->powerdown_ctl); in sti_dwc3_glue_remove()
230 pr_err("DWC3 powerdown reset deassert failed: %d", ret); in sti_dwc3_glue_remove()
234 ret = reset_assert(&plat->softreset_ctl); in sti_dwc3_glue_remove()
236 pr_err("DWC3 soft reset deassert failed: %d", ret); in sti_dwc3_glue_remove()
242 { .compatible = "st,stih407-dwc3" },