xref: /rk3399_rockchip-uboot/drivers/usb/gadget/dwc2_udc_otg_phy.c (revision 1a4f6af8bfd44c8ae6e87a81ff125eed47042cc5)
1be5e4bdcSMarek Vasut /*
2be5e4bdcSMarek Vasut  * drivers/usb/gadget/dwc2_udc_otg.c
3e179ceddSMarek Vasut  * Designware DWC2 on-chip full/high speed USB OTG 2.0 device controllers
4be5e4bdcSMarek Vasut  *
5be5e4bdcSMarek Vasut  * Copyright (C) 2008 for Samsung Electronics
6be5e4bdcSMarek Vasut  *
7be5e4bdcSMarek Vasut  * BSP Support for Samsung's UDC driver
8be5e4bdcSMarek Vasut  * available at:
9be5e4bdcSMarek Vasut  * git://git.kernel.org/pub/scm/linux/kernel/git/kki_ap/linux-2.6-samsung.git
10be5e4bdcSMarek Vasut  *
11be5e4bdcSMarek Vasut  * State machine bugfixes:
12be5e4bdcSMarek Vasut  * Marek Szyprowski <m.szyprowski@samsung.com>
13be5e4bdcSMarek Vasut  *
14be5e4bdcSMarek Vasut  * Ported to u-boot:
15be5e4bdcSMarek Vasut  * Marek Szyprowski <m.szyprowski@samsung.com>
16be5e4bdcSMarek Vasut  * Lukasz Majewski <l.majewski@samsumg.com>
17be5e4bdcSMarek Vasut  *
18be5e4bdcSMarek Vasut  * SPDX-License-Identifier:	GPL-2.0+
19be5e4bdcSMarek Vasut  */
20be5e4bdcSMarek Vasut 
21be5e4bdcSMarek Vasut #include <common.h>
22*1221ce45SMasahiro Yamada #include <linux/errno.h>
23be5e4bdcSMarek Vasut #include <linux/list.h>
24be5e4bdcSMarek Vasut #include <malloc.h>
25be5e4bdcSMarek Vasut 
26be5e4bdcSMarek Vasut #include <linux/usb/ch9.h>
27be5e4bdcSMarek Vasut #include <linux/usb/gadget.h>
28be5e4bdcSMarek Vasut 
29be5e4bdcSMarek Vasut #include <asm/byteorder.h>
30be5e4bdcSMarek Vasut #include <asm/unaligned.h>
31be5e4bdcSMarek Vasut #include <asm/io.h>
32be5e4bdcSMarek Vasut 
33be5e4bdcSMarek Vasut #include <asm/mach-types.h>
34be5e4bdcSMarek Vasut 
35be5e4bdcSMarek Vasut #include "dwc2_udc_otg_regs.h"
36be5e4bdcSMarek Vasut #include "dwc2_udc_otg_priv.h"
37be5e4bdcSMarek Vasut 
385d5716eeSMarek Vasut #include <usb/dwc2_udc.h>
39be5e4bdcSMarek Vasut 
otg_phy_init(struct dwc2_udc * dev)40be5e4bdcSMarek Vasut void otg_phy_init(struct dwc2_udc *dev)
41be5e4bdcSMarek Vasut {
42be5e4bdcSMarek Vasut 	unsigned int usb_phy_ctrl = dev->pdata->usb_phy_ctrl;
43be5e4bdcSMarek Vasut 	struct dwc2_usbotg_phy *phy =
44be5e4bdcSMarek Vasut 		(struct dwc2_usbotg_phy *)dev->pdata->regs_phy;
45be5e4bdcSMarek Vasut 
46be5e4bdcSMarek Vasut 	dev->pdata->phy_control(1);
47be5e4bdcSMarek Vasut 
48be5e4bdcSMarek Vasut 	/* USB PHY0 Enable */
49be5e4bdcSMarek Vasut 	printf("USB PHY0 Enable\n");
50be5e4bdcSMarek Vasut 
51be5e4bdcSMarek Vasut 	/* Enable PHY */
52be5e4bdcSMarek Vasut 	writel(readl(usb_phy_ctrl) | USB_PHY_CTRL_EN0, usb_phy_ctrl);
53be5e4bdcSMarek Vasut 
54be5e4bdcSMarek Vasut 	if (dev->pdata->usb_flags == PHY0_SLEEP) /* C210 Universal */
55be5e4bdcSMarek Vasut 		writel((readl(&phy->phypwr)
56be5e4bdcSMarek Vasut 			&~(PHY_0_SLEEP | OTG_DISABLE_0 | ANALOG_PWRDOWN)
57be5e4bdcSMarek Vasut 			&~FORCE_SUSPEND_0), &phy->phypwr);
58be5e4bdcSMarek Vasut 	else /* C110 GONI */
59be5e4bdcSMarek Vasut 		writel((readl(&phy->phypwr) &~(OTG_DISABLE_0 | ANALOG_PWRDOWN)
60be5e4bdcSMarek Vasut 			&~FORCE_SUSPEND_0), &phy->phypwr);
61be5e4bdcSMarek Vasut 
62be5e4bdcSMarek Vasut 	if (s5p_cpu_id == 0x4412)
63be5e4bdcSMarek Vasut 		writel((readl(&phy->phyclk) & ~(EXYNOS4X12_ID_PULLUP0 |
64be5e4bdcSMarek Vasut 			EXYNOS4X12_COMMON_ON_N0)) | EXYNOS4X12_CLK_SEL_24MHZ,
65be5e4bdcSMarek Vasut 		       &phy->phyclk); /* PLL 24Mhz */
66be5e4bdcSMarek Vasut 	else
67be5e4bdcSMarek Vasut 		writel((readl(&phy->phyclk) & ~(ID_PULLUP0 | COMMON_ON_N0)) |
68be5e4bdcSMarek Vasut 		       CLK_SEL_24MHZ, &phy->phyclk); /* PLL 24Mhz */
69be5e4bdcSMarek Vasut 
70be5e4bdcSMarek Vasut 	writel((readl(&phy->rstcon) &~(LINK_SW_RST | PHYLNK_SW_RST))
71be5e4bdcSMarek Vasut 	       | PHY_SW_RST0, &phy->rstcon);
72be5e4bdcSMarek Vasut 	udelay(10);
73be5e4bdcSMarek Vasut 	writel(readl(&phy->rstcon)
74be5e4bdcSMarek Vasut 	       &~(PHY_SW_RST0 | LINK_SW_RST | PHYLNK_SW_RST), &phy->rstcon);
75be5e4bdcSMarek Vasut 	udelay(10);
76be5e4bdcSMarek Vasut }
77be5e4bdcSMarek Vasut 
otg_phy_off(struct dwc2_udc * dev)78be5e4bdcSMarek Vasut void otg_phy_off(struct dwc2_udc *dev)
79be5e4bdcSMarek Vasut {
80be5e4bdcSMarek Vasut 	unsigned int usb_phy_ctrl = dev->pdata->usb_phy_ctrl;
81be5e4bdcSMarek Vasut 	struct dwc2_usbotg_phy *phy =
82be5e4bdcSMarek Vasut 		(struct dwc2_usbotg_phy *)dev->pdata->regs_phy;
83be5e4bdcSMarek Vasut 
84be5e4bdcSMarek Vasut 	/* reset controller just in case */
85be5e4bdcSMarek Vasut 	writel(PHY_SW_RST0, &phy->rstcon);
86be5e4bdcSMarek Vasut 	udelay(20);
87be5e4bdcSMarek Vasut 	writel(readl(&phy->phypwr) &~PHY_SW_RST0, &phy->rstcon);
88be5e4bdcSMarek Vasut 	udelay(20);
89be5e4bdcSMarek Vasut 
90be5e4bdcSMarek Vasut 	writel(readl(&phy->phypwr) | OTG_DISABLE_0 | ANALOG_PWRDOWN
91be5e4bdcSMarek Vasut 	       | FORCE_SUSPEND_0, &phy->phypwr);
92be5e4bdcSMarek Vasut 
93be5e4bdcSMarek Vasut 	writel(readl(usb_phy_ctrl) &~USB_PHY_CTRL_EN0, usb_phy_ctrl);
94be5e4bdcSMarek Vasut 
95be5e4bdcSMarek Vasut 	writel((readl(&phy->phyclk) & ~(ID_PULLUP0 | COMMON_ON_N0)),
96be5e4bdcSMarek Vasut 	      &phy->phyclk);
97be5e4bdcSMarek Vasut 
98be5e4bdcSMarek Vasut 	udelay(10000);
99be5e4bdcSMarek Vasut 
100be5e4bdcSMarek Vasut 	dev->pdata->phy_control(0);
101be5e4bdcSMarek Vasut }
102