blob: c89cd57c253d8ecfd83c54bcef2a2dcc9877e7b2 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Jiandong Zheng88bb7c02015-07-09 14:26:39 -07002/*
3 * Copyright 2015 Broadcom Corporation.
Jiandong Zheng88bb7c02015-07-09 14:26:39 -07004 */
5
6#include <config.h>
7#include <common.h>
8#include <asm/io.h>
9#include <asm/arch/sysmap.h>
Steve Rae87c7eda2016-04-04 12:59:43 -070010#include <asm/kona-common/clk.h>
Simon Glassdbd79542020-05-10 11:40:11 -060011#include <linux/delay.h>
Jiandong Zheng88bb7c02015-07-09 14:26:39 -070012
Marek Vasut4811c662015-12-04 02:32:22 +010013#include "dwc2_udc_otg_priv.h"
Jiandong Zheng88bb7c02015-07-09 14:26:39 -070014#include "bcm_udc_otg.h"
15
Marek Vasut1a639ff2015-12-04 00:57:58 +010016void otg_phy_init(struct dwc2_udc *dev)
Jiandong Zheng88bb7c02015-07-09 14:26:39 -070017{
Steve Rae87c7eda2016-04-04 12:59:43 -070018 /* turn on the USB OTG clocks */
19 clk_usb_otg_enable((void *)HSOTG_BASE_ADDR);
20
Jiandong Zheng88bb7c02015-07-09 14:26:39 -070021 /* set Phy to driving mode */
22 wfld_clear(HSOTG_CTRL_BASE_ADDR + HSOTG_CTRL_PHY_P1CTL_OFFSET,
23 HSOTG_CTRL_PHY_P1CTL_NON_DRIVING_MASK);
24
25 udelay(100);
26
27 /* clear Soft Disconnect */
28 wfld_clear(HSOTG_BASE_ADDR + HSOTG_DCTL_OFFSET,
29 HSOTG_DCTL_SFTDISCON_MASK);
30
31 /* invoke Reset (active low) */
32 wfld_clear(HSOTG_CTRL_BASE_ADDR + HSOTG_CTRL_PHY_P1CTL_OFFSET,
33 HSOTG_CTRL_PHY_P1CTL_SOFT_RESET_MASK);
34
35 /* Reset needs to be asserted for 2ms */
36 udelay(2000);
37
38 /* release Reset */
39 wfld_set(HSOTG_CTRL_BASE_ADDR + HSOTG_CTRL_PHY_P1CTL_OFFSET,
40 HSOTG_CTRL_PHY_P1CTL_SOFT_RESET_MASK,
41 HSOTG_CTRL_PHY_P1CTL_SOFT_RESET_MASK);
42}
43
Marek Vasut1a639ff2015-12-04 00:57:58 +010044void otg_phy_off(struct dwc2_udc *dev)
Jiandong Zheng88bb7c02015-07-09 14:26:39 -070045{
46 /* Soft Disconnect */
47 wfld_set(HSOTG_BASE_ADDR + HSOTG_DCTL_OFFSET,
48 HSOTG_DCTL_SFTDISCON_MASK,
49 HSOTG_DCTL_SFTDISCON_MASK);
50
51 /* set Phy to non-driving (reset) mode */
52 wfld_set(HSOTG_CTRL_BASE_ADDR + HSOTG_CTRL_PHY_P1CTL_OFFSET,
53 HSOTG_CTRL_PHY_P1CTL_NON_DRIVING_MASK,
54 HSOTG_CTRL_PHY_P1CTL_NON_DRIVING_MASK);
55}