]> git.proxmox.com Git - mirror_edk2.git/blob - Omap35xxPkg/PciEmulation/PciEmulation.c
a05d98183a863979202523152f12116274782fa0
[mirror_edk2.git] / Omap35xxPkg / PciEmulation / PciEmulation.c
1 /** @file
2
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
4 Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 **/
9
10 #include <PiDxe.h>
11
12 #include <Library/BaseLib.h>
13 #include <Library/DebugLib.h>
14 #include <Library/IoLib.h>
15 #include <Library/NonDiscoverableDeviceRegistrationLib.h>
16 #include <Library/UefiBootServicesTableLib.h>
17
18 #include <Protocol/EmbeddedExternalDevice.h>
19
20 #include <TPS65950.h>
21 #include <Omap3530/Omap3530.h>
22
23 EMBEDDED_EXTERNAL_DEVICE *gTPS65950;
24
25 #define HOST_CONTROLLER_OPERATION_REG_SIZE 0x44
26
27 STATIC
28 EFI_STATUS
29 ConfigureUSBHost (
30 NON_DISCOVERABLE_DEVICE *Device
31 )
32 {
33 EFI_STATUS Status;
34 UINT8 Data = 0;
35
36 // Take USB host out of force-standby mode
37 MmioWrite32 (UHH_SYSCONFIG, UHH_SYSCONFIG_MIDLEMODE_NO_STANDBY
38 | UHH_SYSCONFIG_CLOCKACTIVITY_ON
39 | UHH_SYSCONFIG_SIDLEMODE_NO_STANDBY
40 | UHH_SYSCONFIG_ENAWAKEUP_ENABLE
41 | UHH_SYSCONFIG_AUTOIDLE_ALWAYS_RUN);
42 MmioWrite32 (UHH_HOSTCONFIG, UHH_HOSTCONFIG_P3_CONNECT_STATUS_DISCONNECT
43 | UHH_HOSTCONFIG_P2_CONNECT_STATUS_DISCONNECT
44 | UHH_HOSTCONFIG_P1_CONNECT_STATUS_DISCONNECT
45 | UHH_HOSTCONFIG_ENA_INCR_ALIGN_DISABLE
46 | UHH_HOSTCONFIG_ENA_INCR16_ENABLE
47 | UHH_HOSTCONFIG_ENA_INCR8_ENABLE
48 | UHH_HOSTCONFIG_ENA_INCR4_ENABLE
49 | UHH_HOSTCONFIG_AUTOPPD_ON_OVERCUR_EN_ON
50 | UHH_HOSTCONFIG_P1_ULPI_BYPASS_ULPI_MODE);
51
52 // USB reset (GPIO 147 - Port 5 pin 19) output high
53 MmioAnd32 (GPIO5_BASE + GPIO_OE, ~BIT19);
54 MmioWrite32 (GPIO5_BASE + GPIO_SETDATAOUT, BIT19);
55
56 // Get the Power IC protocol
57 Status = gBS->LocateProtocol (&gEmbeddedExternalDeviceProtocolGuid, NULL, (VOID **)&gTPS65950);
58 ASSERT_EFI_ERROR (Status);
59
60 // Power the USB PHY
61 Data = VAUX_DEV_GRP_P1;
62 Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, VAUX2_DEV_GRP), 1, &Data);
63 ASSERT_EFI_ERROR(Status);
64
65 Data = VAUX_DEDICATED_18V;
66 Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, VAUX2_DEDICATED), 1, &Data);
67 ASSERT_EFI_ERROR (Status);
68
69 // Enable power to the USB hub
70 Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID3, LEDEN), 1, &Data);
71 ASSERT_EFI_ERROR (Status);
72
73 // LEDAON controls the power to the USB host, PWM is disabled
74 Data &= ~LEDAPWM;
75 Data |= LEDAON;
76
77 Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID3, LEDEN), 1, &Data);
78 ASSERT_EFI_ERROR (Status);
79
80 return EFI_SUCCESS;
81 }
82
83 EFI_STATUS
84 EFIAPI
85 PciEmulationEntryPoint (
86 IN EFI_HANDLE ImageHandle,
87 IN EFI_SYSTEM_TABLE *SystemTable
88 )
89 {
90 UINT8 CapabilityLength;
91 UINT8 PhysicalPorts;
92 UINTN MemorySize;
93
94 CapabilityLength = MmioRead8 (USB_EHCI_HCCAPBASE);
95 PhysicalPorts = MmioRead32 (USB_EHCI_HCCAPBASE + 0x4) & 0x0000000F;
96 MemorySize = CapabilityLength + HOST_CONTROLLER_OPERATION_REG_SIZE +
97 4 * PhysicalPorts - 1;
98
99 return RegisterNonDiscoverableMmioDevice (
100 NonDiscoverableDeviceTypeEhci,
101 NonDiscoverableDeviceDmaTypeNonCoherent,
102 ConfigureUSBHost,
103 NULL,
104 1,
105 USB_EHCI_HCCAPBASE, MemorySize
106 );
107 }