/** @file
Phytium Spi Master Drivers.
Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include "SpiDxe.h"
PHYT_SPI_MASTER *pSpiMasterInstance;
static UINTN mSpiControlBase;
/**
This function inited a spi driver.
@param None.
@retval None.
**/
EFI_STATUS
EFIAPI
SpiMasterInit (
VOID
)
{
return EFI_SUCCESS;
}
/**
This function seted config to spi registers.
@param[in] CmdId The id of command.
@param[in] Config The value to be seted.
@param[in] RegAddr The address of spi registers.
@retval EFI_SUCCESS SpiMasterSetConfig() is executed successfully.
**/
EFI_STATUS
EFIAPI
SpiMasterSetConfig (
IN UINT8 CmdId,
IN UINT32 Config,
IN UINTN RegAddr
)
{
UINTN SpiAddr;
UINT32 Value;
SpiAddr = 0;
Value = 0;
if (CmdId != 0) {
Value = (CmdId << 24) | (Config & 0xffffff);
} else {
Value = Config;
}
SpiAddr = mSpiControlBase + RegAddr;
MmioWrite32 (SpiAddr, Value);
return EFI_SUCCESS;
}
/**
This function geted config from spi registers.
@param[in] CmdId The id of command.
@param[out] Config The pointer of the config.
@param[in] RegAddr The address of spi registers.
@retval EFI_SUCCESS SpiMasterGetConfig() is executed successfully.
**/
EFI_STATUS
EFIAPI
SpiMasterGetConfig (
IN UINT8 CmdId,
OUT UINT32 *Config,
IN UINTN RegAddr
)
{
UINTN SpiAddr;
UINT32 Value;
SpiAddr = 0;
Value = 0;
SpiAddr = mSpiControlBase + RegAddr;
Value = MmioRead32 (SpiAddr);
if (CmdId != 0) {
*Config = Value & 0xffffff;
} else {
*Config = Value;
}
return EFI_SUCCESS;
}
/**
This function seted spi mode.
@param[in] Config The value to seted.
@retval EFI_SUCCESS SpiMasterSetMode() is executed successfully.
**/
EFI_STATUS
EFIAPI
SpiMasterSetMode (
IN UINT32 Config
)
{
SpiMasterSetConfig (0, Config, REG_MODE_REG);
return EFI_SUCCESS;
}
/**
This function inited the spi driver protocol.
@param[in] SpiMasterProtocol A pointer to the master protocol struct.
@retval EFI_SUCCESS SpiMasterInitProtocol() is executed successfully.
**/
STATIC
EFI_STATUS
EFIAPI
SpiMasterInitProtocol (
IN EFI_SPI_DRV_PROTOCOL *SpiMasterProtocol
)
{
SpiMasterProtocol->SpiInit = SpiMasterInit;
SpiMasterProtocol->SpiSetConfig = SpiMasterSetConfig;
SpiMasterProtocol->SpiGetConfig = SpiMasterGetConfig;
SpiMasterProtocol->SpiSetMode = SpiMasterSetMode;
return EFI_SUCCESS;
}
/**
This function is the entrypoint of the spi driver.
@param[in] ImageHandle The firmware allocated handle for the EFI image.
@param[in] SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
@retval other Some error occurs when executing this entry point.
**/
EFI_STATUS
EFIAPI
SpiMasterDrvEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
pSpiMasterInstance = AllocateRuntimeZeroPool (sizeof (PHYT_SPI_MASTER));
if (pSpiMasterInstance == NULL) {
return EFI_OUT_OF_RESOURCES;
}
mSpiControlBase = FixedPcdGet64 (PcdSpiControllerBase);
SpiMasterInitProtocol (&pSpiMasterInstance->SpiMasterProtocol);
pSpiMasterInstance->Signature = SPI_MASTER_SIGNATURE;
Status = gBS->InstallMultipleProtocolInterfaces (
&(pSpiMasterInstance->Handle),
&gSpiMasterProtocolGuid,
&(pSpiMasterInstance->SpiMasterProtocol),
NULL
);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}