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> 22be5e4bdcSMarek Vasut #include <asm/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 #include <usb/lin_gadget_compat.h> 38be5e4bdcSMarek Vasut 39*5d5716eeSMarek Vasut #include <usb/dwc2_udc.h> 40be5e4bdcSMarek Vasut 41be5e4bdcSMarek Vasut void otg_phy_init(struct dwc2_udc *dev) 42be5e4bdcSMarek Vasut { 43be5e4bdcSMarek Vasut unsigned int usb_phy_ctrl = dev->pdata->usb_phy_ctrl; 44be5e4bdcSMarek Vasut struct dwc2_usbotg_phy *phy = 45be5e4bdcSMarek Vasut (struct dwc2_usbotg_phy *)dev->pdata->regs_phy; 46be5e4bdcSMarek Vasut 47be5e4bdcSMarek Vasut dev->pdata->phy_control(1); 48be5e4bdcSMarek Vasut 49be5e4bdcSMarek Vasut /* USB PHY0 Enable */ 50be5e4bdcSMarek Vasut printf("USB PHY0 Enable\n"); 51be5e4bdcSMarek Vasut 52be5e4bdcSMarek Vasut /* Enable PHY */ 53be5e4bdcSMarek Vasut writel(readl(usb_phy_ctrl) | USB_PHY_CTRL_EN0, usb_phy_ctrl); 54be5e4bdcSMarek Vasut 55be5e4bdcSMarek Vasut if (dev->pdata->usb_flags == PHY0_SLEEP) /* C210 Universal */ 56be5e4bdcSMarek Vasut writel((readl(&phy->phypwr) 57be5e4bdcSMarek Vasut &~(PHY_0_SLEEP | OTG_DISABLE_0 | ANALOG_PWRDOWN) 58be5e4bdcSMarek Vasut &~FORCE_SUSPEND_0), &phy->phypwr); 59be5e4bdcSMarek Vasut else /* C110 GONI */ 60be5e4bdcSMarek Vasut writel((readl(&phy->phypwr) &~(OTG_DISABLE_0 | ANALOG_PWRDOWN) 61be5e4bdcSMarek Vasut &~FORCE_SUSPEND_0), &phy->phypwr); 62be5e4bdcSMarek Vasut 63be5e4bdcSMarek Vasut if (s5p_cpu_id == 0x4412) 64be5e4bdcSMarek Vasut writel((readl(&phy->phyclk) & ~(EXYNOS4X12_ID_PULLUP0 | 65be5e4bdcSMarek Vasut EXYNOS4X12_COMMON_ON_N0)) | EXYNOS4X12_CLK_SEL_24MHZ, 66be5e4bdcSMarek Vasut &phy->phyclk); /* PLL 24Mhz */ 67be5e4bdcSMarek Vasut else 68be5e4bdcSMarek Vasut writel((readl(&phy->phyclk) & ~(ID_PULLUP0 | COMMON_ON_N0)) | 69be5e4bdcSMarek Vasut CLK_SEL_24MHZ, &phy->phyclk); /* PLL 24Mhz */ 70be5e4bdcSMarek Vasut 71be5e4bdcSMarek Vasut writel((readl(&phy->rstcon) &~(LINK_SW_RST | PHYLNK_SW_RST)) 72be5e4bdcSMarek Vasut | PHY_SW_RST0, &phy->rstcon); 73be5e4bdcSMarek Vasut udelay(10); 74be5e4bdcSMarek Vasut writel(readl(&phy->rstcon) 75be5e4bdcSMarek Vasut &~(PHY_SW_RST0 | LINK_SW_RST | PHYLNK_SW_RST), &phy->rstcon); 76be5e4bdcSMarek Vasut udelay(10); 77be5e4bdcSMarek Vasut } 78be5e4bdcSMarek Vasut 79be5e4bdcSMarek Vasut void otg_phy_off(struct dwc2_udc *dev) 80be5e4bdcSMarek Vasut { 81be5e4bdcSMarek Vasut unsigned int usb_phy_ctrl = dev->pdata->usb_phy_ctrl; 82be5e4bdcSMarek Vasut struct dwc2_usbotg_phy *phy = 83be5e4bdcSMarek Vasut (struct dwc2_usbotg_phy *)dev->pdata->regs_phy; 84be5e4bdcSMarek Vasut 85be5e4bdcSMarek Vasut /* reset controller just in case */ 86be5e4bdcSMarek Vasut writel(PHY_SW_RST0, &phy->rstcon); 87be5e4bdcSMarek Vasut udelay(20); 88be5e4bdcSMarek Vasut writel(readl(&phy->phypwr) &~PHY_SW_RST0, &phy->rstcon); 89be5e4bdcSMarek Vasut udelay(20); 90be5e4bdcSMarek Vasut 91be5e4bdcSMarek Vasut writel(readl(&phy->phypwr) | OTG_DISABLE_0 | ANALOG_PWRDOWN 92be5e4bdcSMarek Vasut | FORCE_SUSPEND_0, &phy->phypwr); 93be5e4bdcSMarek Vasut 94be5e4bdcSMarek Vasut writel(readl(usb_phy_ctrl) &~USB_PHY_CTRL_EN0, usb_phy_ctrl); 95be5e4bdcSMarek Vasut 96be5e4bdcSMarek Vasut writel((readl(&phy->phyclk) & ~(ID_PULLUP0 | COMMON_ON_N0)), 97be5e4bdcSMarek Vasut &phy->phyclk); 98be5e4bdcSMarek Vasut 99be5e4bdcSMarek Vasut udelay(10000); 100be5e4bdcSMarek Vasut 101be5e4bdcSMarek Vasut dev->pdata->phy_control(0); 102be5e4bdcSMarek Vasut } 103