/** @file\r
- This file implements I2C Host Protocol which provides callers with the ability to \r
+ This file implements I2C Host Protocol which provides callers with the ability to\r
do I/O transactions to all of the devices on the I2C bus.\r
\r
- Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2014, Hewlett-Packard Development Company, L.P.<BR>\r
+ Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "I2cDxe.h"\r
\r
-EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding = {\r
+EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding = {\r
I2cHostDriverSupported,\r
I2cHostDriverStart,\r
I2cHostDriverStop,\r
};\r
\r
//\r
-// Driver name table \r
+// Driver name table\r
//\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cHostDriverNameTable[] = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cHostDriverNameTable[] = {\r
{ "eng;en", L"I2c Host Driver" },\r
- { NULL , NULL }\r
+ { NULL, NULL }\r
};\r
\r
//\r
// EFI Component Name Protocol\r
//\r
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gI2cHostComponentName = {\r
- (EFI_COMPONENT_NAME_GET_DRIVER_NAME) I2cHostComponentNameGetDriverName,\r
- (EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) I2cHostComponentNameGetControllerName,\r
+ (EFI_COMPONENT_NAME_GET_DRIVER_NAME)I2cHostComponentNameGetDriverName,\r
+ (EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)I2cHostComponentNameGetControllerName,\r
"eng"\r
};\r
\r
//\r
// EFI Component Name 2 Protocol\r
//\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2 = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2 = {\r
I2cHostComponentNameGetDriverName,\r
I2cHostComponentNameGetControllerName,\r
"en"\r
EFIAPI\r
I2cHostComponentNameGetDriverName (\r
IN EFI_COMPONENT_NAME2_PROTOCOL *This,\r
- IN CHAR8 *Language,\r
- OUT CHAR16 **DriverName\r
+ IN CHAR8 *Language,\r
+ OUT CHAR16 **DriverName\r
)\r
{\r
return LookupUnicodeString2 (\r
EFI_STATUS\r
EFIAPI\r
I2cHostComponentNameGetControllerName (\r
- IN EFI_COMPONENT_NAME2_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE ChildHandle OPTIONAL,\r
- IN CHAR8 *Language,\r
- OUT CHAR16 **ControllerName\r
+ IN EFI_COMPONENT_NAME2_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_HANDLE ChildHandle OPTIONAL,\r
+ IN CHAR8 *Language,\r
+ OUT CHAR16 **ControllerName\r
)\r
{\r
return EFI_UNSUPPORTED;\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_I2C_MASTER_PROTOCOL *I2cMaster;\r
- EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;\r
- EFI_STATUS Status;\r
+ EFI_I2C_MASTER_PROTOCOL *I2cMaster;\r
+ EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;\r
+ EFI_STATUS Status;\r
\r
//\r
// Locate I2C Bus Configuration Management Protocol\r
// Close the protocol because we don't use it here\r
//\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiI2cBusConfigurationManagementProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiI2cBusConfigurationManagementProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
//\r
// Locate I2C Master Protocol\r
@retval EFI_SUCCESS The device was started.\r
@retval EFI_DEVICE_ERROR The device could not be started due to a device error.Currently not implemented.\r
@retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
- @retval Others The driver failded to start the device.\r
+ @retval Others The driver failed to start the device.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
I2cHostDriverStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_I2C_MASTER_PROTOCOL *I2cMaster;\r
- EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;\r
- I2C_HOST_CONTEXT *I2cHostContext;\r
+ EFI_STATUS Status;\r
+ EFI_I2C_MASTER_PROTOCOL *I2cMaster;\r
+ EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;\r
+ I2C_HOST_CONTEXT *I2cHostContext;\r
\r
I2cMaster = NULL;\r
I2cHostContext = NULL;\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "I2cHost: Open I2C bus configuration error, Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cHost: Open I2C bus configuration error, Status = %r\n", Status));\r
return Status;\r
}\r
\r
//\r
// Locate I2C Master Protocol\r
//\r
- Status = gBS->OpenProtocol ( \r
+ Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiI2cMasterProtocolGuid,\r
(VOID **)&I2cMaster,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "I2cHost: Open I2C master error, Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cHost: Open I2C master error, Status = %r\n", Status));\r
goto Exit;\r
}\r
\r
//\r
I2cHostContext = AllocateZeroPool (sizeof (I2C_HOST_CONTEXT));\r
if (I2cHostContext == NULL) {\r
- DEBUG ((EFI_D_ERROR, "I2cHost: there is no enough memory to allocate.\n"));\r
+ DEBUG ((DEBUG_ERROR, "I2cHost: there is no enough memory to allocate.\n"));\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Exit;\r
}\r
I2cHostContext->Signature = I2C_HOST_SIGNATURE;\r
I2cHostContext->I2cMaster = I2cMaster;\r
I2cHostContext->I2cBusConfigurationManagement = I2cBusConfigurationManagement;\r
- I2cHostContext->I2cBusConfiguration = (UINTN) -1;\r
- InitializeListHead(&I2cHostContext->RequestList);\r
+ I2cHostContext->I2cBusConfiguration = (UINTN)-1;\r
+ InitializeListHead (&I2cHostContext->RequestList);\r
\r
//\r
// Reset the controller\r
//\r
Status = I2cMaster->Reset (I2cMaster);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "I2cHost: I2C controller reset failed!\n"));\r
+ DEBUG ((DEBUG_ERROR, "I2cHost: I2C controller reset failed!\n"));\r
goto Exit;\r
}\r
\r
&I2cHostContext->I2cEvent\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "I2cHost: create complete event error, Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cHost: create complete event error, Status = %r\n", Status));\r
goto Exit;\r
}\r
\r
&I2cHostContext->I2cBusConfigurationEvent\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "I2cHost: create bus available event error, Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cHost: create bus available event error, Status = %r\n", Status));\r
goto Exit;\r
- } \r
+ }\r
\r
//\r
// Build the I2C host protocol for the current I2C controller\r
);\r
Exit:\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "I2cHost: Start() function failed, Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cHost: Start() function failed, Status = %r\n", Status));\r
if (I2cBusConfigurationManagement != NULL) {\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiI2cBusConfigurationManagementProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- ); \r
+ Controller,\r
+ &gEfiI2cBusConfigurationManagementProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
}\r
- \r
+\r
if ((I2cHostContext != NULL) && (I2cHostContext->I2cEvent != NULL)) {\r
gBS->CloseEvent (I2cHostContext->I2cEvent);\r
I2cHostContext->I2cEvent = NULL;\r
EFI_STATUS\r
EFIAPI\r
I2cHostDriverStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
)\r
{\r
- EFI_STATUS Status; \r
- I2C_HOST_CONTEXT *I2cHostContext;\r
- EFI_I2C_HOST_PROTOCOL *I2cHost;\r
- EFI_TPL TplPrevious;\r
+ EFI_STATUS Status;\r
+ I2C_HOST_CONTEXT *I2cHostContext;\r
+ EFI_I2C_HOST_PROTOCOL *I2cHost;\r
+ EFI_TPL TplPrevious;\r
\r
TplPrevious = EfiGetCurrentTpl ();\r
if (TplPrevious > TPL_I2C_SYNC) {\r
- DEBUG ((EFI_D_ERROR, "I2cHost: TPL %d is too high in Stop.\n", TplPrevious));\r
+ DEBUG ((DEBUG_ERROR, "I2cHost: TPL %d is too high in Stop.\n", TplPrevious));\r
return EFI_DEVICE_ERROR;\r
}\r
\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiI2cHostProtocolGuid,\r
- (VOID **) &I2cHost,\r
+ (VOID **)&I2cHost,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
// Raise TPL for critical section\r
//\r
TplPrevious = gBS->RaiseTPL (TPL_I2C_SYNC);\r
- \r
+\r
//\r
// If there is pending request or pending bus configuration, do not stop\r
//\r
Status = EFI_DEVICE_ERROR;\r
- if (( !I2cHostContext->I2cBusConfigurationManagementPending )\r
- && IsListEmpty (&I2cHostContext->RequestList)) {\r
- \r
+ if ( (!I2cHostContext->I2cBusConfigurationManagementPending)\r
+ && IsListEmpty (&I2cHostContext->RequestList))\r
+ {\r
//\r
// Remove the I2C host protocol\r
//\r
NULL\r
);\r
}\r
- \r
+\r
//\r
// Leave critical section\r
//\r
gBS->CloseEvent (I2cHostContext->I2cBusConfigurationEvent);\r
I2cHostContext->I2cBusConfigurationEvent = NULL;\r
}\r
- \r
+\r
if (I2cHostContext->I2cEvent != NULL) {\r
gBS->CloseEvent (I2cHostContext->I2cEvent);\r
I2cHostContext->I2cEvent = NULL;\r
}\r
- \r
+\r
FreePool (I2cHostContext);\r
}\r
\r
VOID\r
EFIAPI\r
I2cHostI2cBusConfigurationAvailable (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- I2C_HOST_CONTEXT *I2cHostContext;\r
- EFI_I2C_MASTER_PROTOCOL *I2cMaster;\r
- I2C_REQUEST *I2cRequest;\r
- LIST_ENTRY *EntryHeader;\r
- LIST_ENTRY *Entry;\r
- EFI_STATUS Status;\r
+ I2C_HOST_CONTEXT *I2cHostContext;\r
+ EFI_I2C_MASTER_PROTOCOL *I2cMaster;\r
+ I2C_REQUEST *I2cRequest;\r
+ LIST_ENTRY *EntryHeader;\r
+ LIST_ENTRY *Entry;\r
+ EFI_STATUS Status;\r
\r
//\r
// Mark this I2C bus configuration management operation as complete\r
// Unknown I2C bus configuration\r
// Force next operation to enable the I2C bus configuration\r
//\r
- I2cHostContext->I2cBusConfiguration = (UINTN) -1;\r
- \r
+ I2cHostContext->I2cBusConfiguration = (UINTN)-1;\r
+\r
//\r
// Do not continue current I2C request\r
//\r
// Get the first request in the link with FIFO order\r
//\r
EntryHeader = &I2cHostContext->RequestList;\r
- Entry = GetFirstNode (EntryHeader);\r
- I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);\r
+ Entry = GetFirstNode (EntryHeader);\r
+ I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);\r
\r
//\r
// Update the I2C bus configuration of the current I2C request\r
//\r
// Start an I2C operation on the host, the status is returned by I2cHostContext->Status\r
//\r
- Status = I2cMaster->StartRequest ( \r
+ Status = I2cMaster->StartRequest (\r
I2cMaster,\r
I2cRequest->SlaveAddress,\r
I2cRequest->RequestPacket,\r
I2cHostContext->I2cEvent,\r
&I2cHostContext->Status\r
);\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "I2cHostI2cBusConfigurationAvailable: Error starting I2C operation, %r\n", Status));\r
+ }\r
}\r
\r
/**\r
**/\r
EFI_STATUS\r
I2cHostRequestComplete (\r
- I2C_HOST_CONTEXT *I2cHostContext,\r
- EFI_STATUS Status\r
+ I2C_HOST_CONTEXT *I2cHostContext,\r
+ EFI_STATUS Status\r
)\r
{\r
- I2C_REQUEST *I2cRequest;\r
- LIST_ENTRY *EntryHeader;\r
- LIST_ENTRY *Entry;\r
+ I2C_REQUEST *I2cRequest;\r
+ LIST_ENTRY *EntryHeader;\r
+ LIST_ENTRY *Entry;\r
\r
//\r
// Remove the current I2C request from the list\r
//\r
EntryHeader = &I2cHostContext->RequestList;\r
- Entry = GetFirstNode (EntryHeader);\r
- I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);\r
+ Entry = GetFirstNode (EntryHeader);\r
+ I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);\r
\r
//\r
// Save the status for QueueRequest\r
//\r
// If there is more I2C request, start next one\r
//\r
- if(!IsListEmpty (EntryHeader)) {\r
+ if (!IsListEmpty (EntryHeader)) {\r
I2cHostRequestEnable (I2cHostContext);\r
}\r
- \r
+\r
return Status;\r
}\r
\r
VOID\r
EFIAPI\r
I2cHostRequestCompleteEvent (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- I2C_HOST_CONTEXT *I2cHostContext;\r
+ I2C_HOST_CONTEXT *I2cHostContext;\r
\r
//\r
// Handle the completion event\r
**/\r
EFI_STATUS\r
I2cHostRequestEnable (\r
- I2C_HOST_CONTEXT *I2cHostContext\r
+ I2C_HOST_CONTEXT *I2cHostContext\r
)\r
{\r
- UINTN I2cBusConfiguration;\r
- CONST EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;\r
- I2C_REQUEST *I2cRequest;\r
- EFI_STATUS Status;\r
- EFI_TPL TplPrevious;\r
- LIST_ENTRY *EntryHeader;\r
- LIST_ENTRY *Entry;\r
+ UINTN I2cBusConfiguration;\r
+ CONST EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;\r
+ I2C_REQUEST *I2cRequest;\r
+ EFI_STATUS Status;\r
+ EFI_TPL TplPrevious;\r
+ LIST_ENTRY *EntryHeader;\r
+ LIST_ENTRY *Entry;\r
\r
//\r
// Assume pending request\r
//\r
EntryHeader = &I2cHostContext->RequestList;\r
Entry = GetFirstNode (EntryHeader);\r
- I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);\r
+ I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);\r
\r
I2cBusConfiguration = I2cRequest->I2cBusConfiguration;\r
\r
// Update bus configuration for this device's requesting bus configuration\r
//\r
Status = I2cBusConfigurationManagement->EnableI2cBusConfiguration (\r
- I2cBusConfigurationManagement,\r
- I2cBusConfiguration,\r
- I2cHostContext->I2cBusConfigurationEvent,\r
- &I2cHostContext->Status\r
- );\r
+ I2cBusConfigurationManagement,\r
+ I2cBusConfiguration,\r
+ I2cHostContext->I2cBusConfigurationEvent,\r
+ &I2cHostContext->Status\r
+ );\r
} else {\r
//\r
// I2C bus configuration is same, no need change configuration and start I2c transaction directly\r
//\r
- TplPrevious = gBS->RaiseTPL ( TPL_I2C_SYNC );\r
+ TplPrevious = gBS->RaiseTPL (TPL_I2C_SYNC);\r
\r
//\r
// Same I2C bus configuration\r
//\r
// Release the thread synchronization\r
//\r
- gBS->RestoreTPL ( TplPrevious );\r
+ gBS->RestoreTPL (TplPrevious);\r
}\r
+\r
return Status;\r
}\r
\r
completion status\r
\r
@retval EFI_SUCCESS The operation completed successfully.\r
- @retval EFI_ABORTED The request did not complete because the driver\r
- was shutdown.\r
@retval EFI_BAD_BUFFER_SIZE The WriteBytes or ReadBytes buffer size is too large.\r
@retval EFI_DEVICE_ERROR There was an I2C error (NACK) during the operation.\r
This could indicate the slave device is not present.\r
if (RequestPacket == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
if ((SlaveAddress & I2C_ADDRESSING_10_BIT) != 0) {\r
//\r
// 10-bit address, bits 0-9 are used for 10-bit I2C slave addresses,\r
//\r
// For synchronous transaction, register an event used to wait for finishing synchronous transaction\r
//\r
- Status = gBS->CreateEvent ( \r
- 0,\r
- TPL_I2C_SYNC,\r
- NULL,\r
- NULL,\r
- &SyncEvent\r
- );\r
+ Status = gBS->CreateEvent (\r
+ 0,\r
+ TPL_I2C_SYNC,\r
+ NULL,\r
+ NULL,\r
+ &SyncEvent\r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
}\r
- \r
+\r
//\r
// TPL should be at or below TPL_NOTIFY.\r
// For synchronous requests this routine must be called at or below TPL_CALLBACK.\r
//\r
TplPrevious = EfiGetCurrentTpl ();\r
if ((TplPrevious > TPL_I2C_SYNC) || ((Event == NULL) && (TplPrevious > TPL_CALLBACK))) {\r
- DEBUG ((EFI_D_ERROR, "ERROR - TPL %d is too high!\n", TplPrevious));\r
+ DEBUG ((DEBUG_ERROR, "ERROR - TPL %d is too high!\n", TplPrevious));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
I2cRequest = AllocateZeroPool (sizeof (I2C_REQUEST));\r
if (I2cRequest == NULL) {\r
- DEBUG ((EFI_D_ERROR, "WARNING - Failed to allocate I2C_REQUEST!\n"));\r
+ DEBUG ((DEBUG_ERROR, "WARNING - Failed to allocate I2C_REQUEST!\n"));\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
//\r
// Copy request packet into private buffer, as RequestPacket may be freed during asynchronous transaction\r
//\r
- RequestPacketSize = sizeof (UINTN) + RequestPacket->OperationCount * sizeof (EFI_I2C_OPERATION);\r
+ RequestPacketSize = sizeof (UINTN) + RequestPacket->OperationCount * sizeof (EFI_I2C_OPERATION);\r
I2cRequest->RequestPacket = AllocateZeroPool (RequestPacketSize);\r
+ ASSERT (I2cRequest->RequestPacket != NULL);\r
CopyMem (I2cRequest->RequestPacket, RequestPacket, RequestPacketSize);\r
\r
//\r
// Synchronize with the other threads\r
//\r
- gBS->RaiseTPL ( TPL_I2C_SYNC );\r
- \r
+ gBS->RaiseTPL (TPL_I2C_SYNC);\r
+\r
FirstRequest = IsListEmpty (&I2cHostContext->RequestList);\r
- \r
+\r
//\r
// Insert new I2C request in the list\r
//\r
// Release the thread synchronization\r
//\r
gBS->RestoreTPL (TplPrevious);\r
- \r
+\r
if (FirstRequest) {\r
//\r
// Start the first I2C request, then the subsequent of I2C request will continue\r
**/\r
EFI_STATUS\r
EFIAPI\r
-InitializeI2cHost(\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+InitializeI2cHost (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
//\r
// Install driver model protocol(s).\r
EFI_STATUS\r
EFIAPI\r
I2cHostUnload (\r
- IN EFI_HANDLE ImageHandle\r
+ IN EFI_HANDLE ImageHandle\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_HANDLE *DeviceHandleBuffer;\r
- UINTN DeviceHandleCount;\r
- UINTN Index;\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE *DeviceHandleBuffer;\r
+ UINTN DeviceHandleCount;\r
+ UINTN Index;\r
+ EFI_COMPONENT_NAME_PROTOCOL *ComponentName;\r
+ EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;\r
\r
//\r
// Get the list of all I2C Controller handles in the handle database.\r
&DeviceHandleBuffer\r
);\r
\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Disconnect the driver specified by ImageHandle from all\r
- // the devices in the handle database.\r
- //\r
- for (Index = 0; Index < DeviceHandleCount; Index++) {\r
- Status = gBS->DisconnectController (\r
- DeviceHandleBuffer[Index],\r
- ImageHandle,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Disconnect the driver specified by ImageHandle from all\r
+ // the devices in the handle database.\r
+ //\r
+ for (Index = 0; Index < DeviceHandleCount; Index++) {\r
+ Status = gBS->DisconnectController (\r
+ DeviceHandleBuffer[Index],\r
+ ImageHandle,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
}\r
}\r
\r
gI2cHostDriverBinding.DriverBindingHandle,\r
&gEfiDriverBindingProtocolGuid,\r
&gI2cHostDriverBinding,\r
- &gEfiComponentNameProtocolGuid,\r
- &gI2cHostComponentName,\r
- &gEfiComponentName2ProtocolGuid,\r
- &gI2cHostComponentName2,\r
NULL\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
+ //\r
+ // Note we have to one by one uninstall the following protocols.\r
+ // It's because some of them are optionally installed based on\r
+ // the following PCD settings.\r
+ // gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable\r
+ // gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable\r
+ // gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable\r
+ // gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable\r
+ //\r
+ Status = gBS->HandleProtocol (\r
+ gI2cHostDriverBinding.DriverBindingHandle,\r
+ &gEfiComponentNameProtocolGuid,\r
+ (VOID **)&ComponentName\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->UninstallProtocolInterface (\r
+ gI2cHostDriverBinding.DriverBindingHandle,\r
+ &gEfiComponentNameProtocolGuid,\r
+ ComponentName\r
+ );\r
+ }\r
+\r
+ Status = gBS->HandleProtocol (\r
+ gI2cHostDriverBinding.DriverBindingHandle,\r
+ &gEfiComponentName2ProtocolGuid,\r
+ (VOID **)&ComponentName2\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->UninstallProtocolInterface (\r
+ gI2cHostDriverBinding.DriverBindingHandle,\r
+ &gEfiComponentName2ProtocolGuid,\r
+ ComponentName2\r
+ );\r
+ }\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
Done:\r
//\r
// Free the buffer containing the list of handles from the handle database\r