/** @file
System 76 GalagoPro3 board post-memory initialization.
Copyright (c) 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "PeiGalagoPro3InitLib.h"
/**
N 1XX WU board configuration init function for PEI post memory phase.
PEI_BOARD_CONFIG_PCD_INIT
@param Content pointer to the buffer contain init information for board init.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_INVALID_PARAMETER The parameter is NULL.
**/
EFI_STATUS
EFIAPI
GalagoPro3Init (
VOID
)
{
PcdSet32S (PcdHdaVerbTable, (UINTN) &HdaVerbTableAlc286Rvp3);
//
// Assign the GPIO table with pin configs to be used for UCMC
//
PcdSet32S (PcdBoardUcmcGpioTable, (UINTN)mGpioTableGalagoPro3UcmcDevice);
PcdSet16S (PcdBoardUcmcGpioTableSize, mGpioTableGalagoPro3UcmcDeviceSize);
return EFI_SUCCESS;
}
#define EXPANDERS 2 // defines expander's quantity
/**
Configures GPIO
@param[in] GpioTable Point to Platform Gpio table
@param[in] GpioTableCount Number of Gpio table entries
**/
VOID
ConfigureGpio (
IN GPIO_INIT_CONFIG *GpioDefinition,
IN UINT16 GpioTableCount
)
{
EFI_STATUS Status;
DEBUG ((DEBUG_INFO, "ConfigureGpio() Start\n"));
Status = GpioConfigurePads (GpioTableCount, GpioDefinition);
DEBUG ((DEBUG_INFO, "ConfigureGpio() End\n"));
}
VOID
SetBit (
IN OUT UINT32 *Value,
IN UINT32 BitNumber,
IN BOOLEAN NewBitValue
)
{
if (NewBitValue) {
*Value |= 1 << BitNumber;
} else {
*Value &= ~(1 << BitNumber);
}
}
/**
Configures IO Expander GPIO device
@param[in] IOExpGpioDefinition Point to IO Expander Gpio table
@param[in] IOExpGpioTableCount Number of Gpio table entries
**/
void
ConfigureIoExpanderGpio (
IN IO_EXPANDER_GPIO_CONFIG *IoExpGpioDefinition,
IN UINT16 IoExpGpioTableCount
)
{
UINT8 Index;
UINT32 Direction[EXPANDERS] = {0x00FFFFFF, 0x00FFFFFF};
UINT32 Level[EXPANDERS] = {0};
UINT32 Polarity[EXPANDERS] = {0};
// IoExpander {TCA6424A}
DEBUG ((DEBUG_INFO, "IO Expander Configuration Start\n"));
for (Index = 0; Index < IoExpGpioTableCount; Index++) { //Program IO Expander as per the table defined in PeiPlatformHooklib.c
SetBit(&Direction[IoExpGpioDefinition[Index].IoExpanderNumber], IoExpGpioDefinition[Index].GpioPinNumber, (BOOLEAN)IoExpGpioDefinition[Index].GpioDirection);
SetBit(&Level[IoExpGpioDefinition[Index].IoExpanderNumber], IoExpGpioDefinition[Index].GpioPinNumber, (BOOLEAN)IoExpGpioDefinition[Index].GpioLevel);
SetBit(&Polarity[IoExpGpioDefinition[Index].IoExpanderNumber], IoExpGpioDefinition[Index].GpioPinNumber, (BOOLEAN)IoExpGpioDefinition[Index].GpioInversion);
}
for (Index = 0; Index < EXPANDERS; Index++) {
GpioExpBulkConfig(Index, Direction[Index], Polarity[Index], Level[Index]);
}
DEBUG ((DEBUG_INFO, "IO Expander Configuration End\n"));
return;
}
/**
Configure GPIO behind IoExpander.
@param[in] PeiServices General purpose services available to every PEIM.
@param[in] NotifyDescriptor
@param[in] Interface
@retval EFI_SUCCESS Operation success.
**/
VOID
ExpanderGpioInit (
VOID
)
{
ConfigureIoExpanderGpio(mGpioTableIoExpander, mGpioTableIoExpanderSize);
}
/**
Configure single GPIO pad for touchpanel interrupt
**/
VOID
TouchpanelGpioInit (
VOID
)
{
GPIO_INIT_CONFIG* TouchpanelPad;
GPIO_PAD_OWN PadOwnVal;
PadOwnVal = 0;
TouchpanelPad = &mGpioTableGalagoPro3Touchpanel;
GpioGetPadOwnership (TouchpanelPad->GpioPad, &PadOwnVal);
if (PadOwnVal == GpioPadOwnHost) {
GpioConfigurePads (1, TouchpanelPad);
}
}
/**
Configure GPIO
**/
VOID
GpioInit (
VOID
)
{
ConfigureGpio (mGpioTableGalagoPro3, mGpioTableGalagoPro3Size);
TouchpanelGpioInit();
return;
}
/**
Configure GPIO and SIO
@retval EFI_SUCCESS Operation success.
**/
EFI_STATUS
EFIAPI
GalagoPro3BoardInitBeforeSiliconInit (
VOID
)
{
GalagoPro3Init ();
GpioInit ();
ExpanderGpioInit ();
///
/// Do Late PCH init
///
LateSiliconInit ();
return EFI_SUCCESS;
}