mirror of https://github.com/acidanthera/audk.git
114 lines
3.9 KiB
C
114 lines
3.9 KiB
C
/** @file
|
|
|
|
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
|
Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>
|
|
|
|
This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#include <PiDxe.h>
|
|
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/IoLib.h>
|
|
#include <Library/NonDiscoverableDeviceRegistrationLib.h>
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
|
|
#include <Protocol/EmbeddedExternalDevice.h>
|
|
|
|
#include <TPS65950.h>
|
|
#include <Omap3530/Omap3530.h>
|
|
|
|
EMBEDDED_EXTERNAL_DEVICE *gTPS65950;
|
|
|
|
#define HOST_CONTROLLER_OPERATION_REG_SIZE 0x44
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
ConfigureUSBHost (
|
|
NON_DISCOVERABLE_DEVICE *Device
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
UINT8 Data = 0;
|
|
|
|
// Take USB host out of force-standby mode
|
|
MmioWrite32 (UHH_SYSCONFIG, UHH_SYSCONFIG_MIDLEMODE_NO_STANDBY
|
|
| UHH_SYSCONFIG_CLOCKACTIVITY_ON
|
|
| UHH_SYSCONFIG_SIDLEMODE_NO_STANDBY
|
|
| UHH_SYSCONFIG_ENAWAKEUP_ENABLE
|
|
| UHH_SYSCONFIG_AUTOIDLE_ALWAYS_RUN);
|
|
MmioWrite32 (UHH_HOSTCONFIG, UHH_HOSTCONFIG_P3_CONNECT_STATUS_DISCONNECT
|
|
| UHH_HOSTCONFIG_P2_CONNECT_STATUS_DISCONNECT
|
|
| UHH_HOSTCONFIG_P1_CONNECT_STATUS_DISCONNECT
|
|
| UHH_HOSTCONFIG_ENA_INCR_ALIGN_DISABLE
|
|
| UHH_HOSTCONFIG_ENA_INCR16_ENABLE
|
|
| UHH_HOSTCONFIG_ENA_INCR8_ENABLE
|
|
| UHH_HOSTCONFIG_ENA_INCR4_ENABLE
|
|
| UHH_HOSTCONFIG_AUTOPPD_ON_OVERCUR_EN_ON
|
|
| UHH_HOSTCONFIG_P1_ULPI_BYPASS_ULPI_MODE);
|
|
|
|
// USB reset (GPIO 147 - Port 5 pin 19) output high
|
|
MmioAnd32 (GPIO5_BASE + GPIO_OE, ~BIT19);
|
|
MmioWrite32 (GPIO5_BASE + GPIO_SETDATAOUT, BIT19);
|
|
|
|
// Get the Power IC protocol
|
|
Status = gBS->LocateProtocol (&gEmbeddedExternalDeviceProtocolGuid, NULL, (VOID **)&gTPS65950);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
// Power the USB PHY
|
|
Data = VAUX_DEV_GRP_P1;
|
|
Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, VAUX2_DEV_GRP), 1, &Data);
|
|
ASSERT_EFI_ERROR(Status);
|
|
|
|
Data = VAUX_DEDICATED_18V;
|
|
Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, VAUX2_DEDICATED), 1, &Data);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
// Enable power to the USB hub
|
|
Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID3, LEDEN), 1, &Data);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
// LEDAON controls the power to the USB host, PWM is disabled
|
|
Data &= ~LEDAPWM;
|
|
Data |= LEDAON;
|
|
|
|
Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID3, LEDEN), 1, &Data);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PciEmulationEntryPoint (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
UINT8 CapabilityLength;
|
|
UINT8 PhysicalPorts;
|
|
UINTN MemorySize;
|
|
|
|
CapabilityLength = MmioRead8 (USB_EHCI_HCCAPBASE);
|
|
PhysicalPorts = MmioRead32 (USB_EHCI_HCCAPBASE + 0x4) & 0x0000000F;
|
|
MemorySize = CapabilityLength + HOST_CONTROLLER_OPERATION_REG_SIZE +
|
|
4 * PhysicalPorts - 1;
|
|
|
|
return RegisterNonDiscoverableMmioDevice (
|
|
NonDiscoverableDeviceTypeEhci,
|
|
NonDiscoverableDeviceDmaTypeNonCoherent,
|
|
ConfigureUSBHost,
|
|
NULL,
|
|
1,
|
|
USB_EHCI_HCCAPBASE, MemorySize
|
|
);
|
|
}
|