xref: /rk3399_rockchip-uboot/drivers/usb/gadget/bcm_udc_otg_phy.c (revision 7e8f270292ebacb25f366181f2022c819e5c7586)
1854cbd29SJiandong Zheng /*
2854cbd29SJiandong Zheng  * Copyright 2015 Broadcom Corporation.
3854cbd29SJiandong Zheng  *
4854cbd29SJiandong Zheng  * SPDX-License-Identifier:	GPL-2.0+
5854cbd29SJiandong Zheng  */
6854cbd29SJiandong Zheng 
7854cbd29SJiandong Zheng #include <config.h>
8854cbd29SJiandong Zheng #include <common.h>
9854cbd29SJiandong Zheng #include <asm/io.h>
10854cbd29SJiandong Zheng #include <asm/arch/sysmap.h>
11*cf125473SSteve Rae #include <asm/kona-common/clk.h>
12854cbd29SJiandong Zheng 
13f4d9bd06SMarek Vasut #include "dwc2_udc_otg_priv.h"
14854cbd29SJiandong Zheng #include "bcm_udc_otg.h"
15854cbd29SJiandong Zheng 
otg_phy_init(struct dwc2_udc * dev)16b4d5cf0bSMarek Vasut void otg_phy_init(struct dwc2_udc *dev)
17854cbd29SJiandong Zheng {
18*cf125473SSteve Rae 	/* turn on the USB OTG clocks */
19*cf125473SSteve Rae 	clk_usb_otg_enable((void *)HSOTG_BASE_ADDR);
20*cf125473SSteve Rae 
21854cbd29SJiandong Zheng 	/* set Phy to driving mode */
22854cbd29SJiandong Zheng 	wfld_clear(HSOTG_CTRL_BASE_ADDR + HSOTG_CTRL_PHY_P1CTL_OFFSET,
23854cbd29SJiandong Zheng 		   HSOTG_CTRL_PHY_P1CTL_NON_DRIVING_MASK);
24854cbd29SJiandong Zheng 
25854cbd29SJiandong Zheng 	udelay(100);
26854cbd29SJiandong Zheng 
27854cbd29SJiandong Zheng 	/* clear Soft Disconnect */
28854cbd29SJiandong Zheng 	wfld_clear(HSOTG_BASE_ADDR + HSOTG_DCTL_OFFSET,
29854cbd29SJiandong Zheng 		   HSOTG_DCTL_SFTDISCON_MASK);
30854cbd29SJiandong Zheng 
31854cbd29SJiandong Zheng 	/* invoke Reset (active low) */
32854cbd29SJiandong Zheng 	wfld_clear(HSOTG_CTRL_BASE_ADDR + HSOTG_CTRL_PHY_P1CTL_OFFSET,
33854cbd29SJiandong Zheng 		   HSOTG_CTRL_PHY_P1CTL_SOFT_RESET_MASK);
34854cbd29SJiandong Zheng 
35854cbd29SJiandong Zheng 	/* Reset needs to be asserted for 2ms */
36854cbd29SJiandong Zheng 	udelay(2000);
37854cbd29SJiandong Zheng 
38854cbd29SJiandong Zheng 	/* release Reset */
39854cbd29SJiandong Zheng 	wfld_set(HSOTG_CTRL_BASE_ADDR + HSOTG_CTRL_PHY_P1CTL_OFFSET,
40854cbd29SJiandong Zheng 		 HSOTG_CTRL_PHY_P1CTL_SOFT_RESET_MASK,
41854cbd29SJiandong Zheng 		 HSOTG_CTRL_PHY_P1CTL_SOFT_RESET_MASK);
42854cbd29SJiandong Zheng }
43854cbd29SJiandong Zheng 
otg_phy_off(struct dwc2_udc * dev)44b4d5cf0bSMarek Vasut void otg_phy_off(struct dwc2_udc *dev)
45854cbd29SJiandong Zheng {
46854cbd29SJiandong Zheng 	/* Soft Disconnect */
47854cbd29SJiandong Zheng 	wfld_set(HSOTG_BASE_ADDR + HSOTG_DCTL_OFFSET,
48854cbd29SJiandong Zheng 		 HSOTG_DCTL_SFTDISCON_MASK,
49854cbd29SJiandong Zheng 		 HSOTG_DCTL_SFTDISCON_MASK);
50854cbd29SJiandong Zheng 
51854cbd29SJiandong Zheng 	/* set Phy to non-driving (reset) mode */
52854cbd29SJiandong Zheng 	wfld_set(HSOTG_CTRL_BASE_ADDR + HSOTG_CTRL_PHY_P1CTL_OFFSET,
53854cbd29SJiandong Zheng 		 HSOTG_CTRL_PHY_P1CTL_NON_DRIVING_MASK,
54854cbd29SJiandong Zheng 		 HSOTG_CTRL_PHY_P1CTL_NON_DRIVING_MASK);
55854cbd29SJiandong Zheng }
56