/** @file\r
- This file implements I2C IO Protocol which enables the user to manipulate a single \r
+ This file implements I2C IO Protocol which enables the user to manipulate a single\r
I2C device independent of the host controller and I2C design.\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) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
//\r
// EFI_DRIVER_BINDING_PROTOCOL instance\r
//\r
-EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding = {\r
+EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding = {\r
I2cBusDriverSupported,\r
I2cBusDriverStart,\r
I2cBusDriverStop,\r
//\r
// Template for I2C Bus Child Device.\r
//\r
-I2C_DEVICE_CONTEXT gI2cDeviceContextTemplate = {\r
+I2C_DEVICE_CONTEXT gI2cDeviceContextTemplate = {\r
I2C_DEVICE_SIGNATURE,\r
NULL,\r
{ // I2cIo Protocol\r
//\r
// Template for controller device path node.\r
//\r
-CONTROLLER_DEVICE_PATH gControllerDevicePathTemplate = {\r
+CONTROLLER_DEVICE_PATH gControllerDevicePathTemplate = {\r
{\r
HARDWARE_DEVICE_PATH,\r
HW_CONTROLLER_DP,\r
{\r
- (UINT8) (sizeof (CONTROLLER_DEVICE_PATH)),\r
- (UINT8) ((sizeof (CONTROLLER_DEVICE_PATH)) >> 8)\r
+ (UINT8)(sizeof (CONTROLLER_DEVICE_PATH)),\r
+ (UINT8)((sizeof (CONTROLLER_DEVICE_PATH)) >> 8)\r
}\r
},\r
0\r
//\r
// Template for vendor device path node.\r
//\r
-VENDOR_DEVICE_PATH gVendorDevicePathTemplate = {\r
+VENDOR_DEVICE_PATH gVendorDevicePathTemplate = {\r
{\r
HARDWARE_DEVICE_PATH,\r
HW_VENDOR_DP,\r
{\r
- (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
- (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+ (UINT8)(sizeof (VENDOR_DEVICE_PATH)),\r
+ (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
}\r
},\r
- { 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }}\r
+ { 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }\r
+ }\r
};\r
\r
//\r
-// Driver name table \r
+// Driver name table\r
//\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cBusDriverNameTable[] = {\r
- { "eng;en", (CHAR16 *) L"I2C Bus Driver" },\r
- { NULL , NULL }\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cBusDriverNameTable[] = {\r
+ { "eng;en", (CHAR16 *)L"I2C Bus Driver" },\r
+ { NULL, NULL }\r
};\r
\r
//\r
// EFI Component Name Protocol\r
//\r
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gI2cBusComponentName = {\r
- (EFI_COMPONENT_NAME_GET_DRIVER_NAME) I2cBusComponentNameGetDriverName,\r
- (EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) I2cBusComponentNameGetControllerName,\r
+ (EFI_COMPONENT_NAME_GET_DRIVER_NAME)I2cBusComponentNameGetDriverName,\r
+ (EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)I2cBusComponentNameGetControllerName,\r
"eng"\r
};\r
\r
//\r
// EFI Component Name 2 Protocol\r
//\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2 = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2 = {\r
I2cBusComponentNameGetDriverName,\r
I2cBusComponentNameGetControllerName,\r
"en"\r
EFIAPI\r
I2cBusComponentNameGetDriverName (\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
I2cBusComponentNameGetControllerName (\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
/**\r
Check if the child of I2C controller has been created.\r
\r
- @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. \r
+ @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
@param[in] Controller I2C controller handle.\r
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path.\r
@param[in] RemainingHasControllerNode Indicate if RemainingDevicePath contains CONTROLLER_DEVICE_PATH.\r
@param[in] RemainingControllerNumber Controller number in CONTROLLER_DEVICE_PATH.\r
- \r
+\r
@retval EFI_SUCCESS The child of I2C controller is not created.\r
@retval Others The child of I2C controller has been created or other errors happen.\r
\r
IN UINT32 RemainingControllerNumber\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *SystemDevicePath;\r
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
- UINTN EntryCount;\r
- UINTN Index;\r
- BOOLEAN SystemHasControllerNode;\r
- UINT32 SystemControllerNumber; \r
+ EFI_STATUS Status;\r
+ EFI_DEVICE_PATH_PROTOCOL *SystemDevicePath;\r
+ EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
+ UINTN EntryCount;\r
+ UINTN Index;\r
+ BOOLEAN SystemHasControllerNode;\r
+ UINT32 SystemControllerNumber;\r
\r
SystemHasControllerNode = FALSE;\r
- SystemControllerNumber = 0;\r
- \r
+ SystemControllerNumber = 0;\r
+\r
Status = gBS->OpenProtocolInformation (\r
Controller,\r
&gEfiI2cHostProtocolGuid,\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- \r
+\r
for (Index = 0; Index < EntryCount; Index++) {\r
if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
Status = gBS->OpenProtocol (\r
OpenInfoBuffer[Index].ControllerHandle,\r
&gEfiDevicePathProtocolGuid,\r
- (VOID **) &SystemDevicePath,\r
+ (VOID **)&SystemDevicePath,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
if (!EFI_ERROR (Status)) {\r
//\r
// Find vendor device path node and compare\r
- // \r
+ //\r
while (!IsDevicePathEnd (SystemDevicePath)) {\r
if ((DevicePathType (SystemDevicePath) == HARDWARE_DEVICE_PATH) &&\r
- (DevicePathSubType (SystemDevicePath) == HW_VENDOR_DP)) {\r
+ (DevicePathSubType (SystemDevicePath) == HW_VENDOR_DP))\r
+ {\r
//\r
// Check if vendor device path is same between system device path and remaining device path\r
//\r
//\r
SystemDevicePath = NextDevicePathNode (SystemDevicePath);\r
if ((DevicePathType (SystemDevicePath) == HARDWARE_DEVICE_PATH) &&\r
- (DevicePathSubType (SystemDevicePath) == HW_CONTROLLER_DP)) {\r
+ (DevicePathSubType (SystemDevicePath) == HW_CONTROLLER_DP))\r
+ {\r
SystemHasControllerNode = TRUE;\r
- SystemControllerNumber = ((CONTROLLER_DEVICE_PATH *) SystemDevicePath)->ControllerNumber;\r
+ SystemControllerNumber = ((CONTROLLER_DEVICE_PATH *)SystemDevicePath)->ControllerNumber;\r
} else {\r
SystemHasControllerNode = FALSE;\r
- SystemControllerNumber = 0;\r
+ SystemControllerNumber = 0;\r
}\r
+\r
if (((SystemHasControllerNode) && (!RemainingHasControllerNode) && (SystemControllerNumber == 0)) ||\r
((!SystemHasControllerNode) && (RemainingHasControllerNode) && (RemainingControllerNumber == 0)) ||\r
((SystemHasControllerNode) && (RemainingHasControllerNode) && (SystemControllerNumber == RemainingControllerNumber)) ||\r
- ((!SystemHasControllerNode) && (!RemainingHasControllerNode))) {\r
- DEBUG ((EFI_D_ERROR, "This I2C device has been already started.\n"));\r
- Status = EFI_UNSUPPORTED;\r
- break;\r
+ ((!SystemHasControllerNode) && (!RemainingHasControllerNode)))\r
+ {\r
+ DEBUG ((DEBUG_ERROR, "This I2C device has been already started.\n"));\r
+ Status = EFI_UNSUPPORTED;\r
+ break;\r
}\r
}\r
}\r
+\r
SystemDevicePath = NextDevicePathNode (SystemDevicePath);\r
}\r
+\r
if (EFI_ERROR (Status)) {\r
break;\r
}\r
}\r
}\r
}\r
+\r
FreePool (OpenInfoBuffer);\r
return Status;\r
}\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;\r
- EFI_I2C_HOST_PROTOCOL *I2cHost;\r
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevPathNode;\r
- BOOLEAN RemainingHasControllerNode;\r
- UINT32 RemainingControllerNumber;\r
+ EFI_STATUS Status;\r
+ EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;\r
+ EFI_I2C_HOST_PROTOCOL *I2cHost;\r
+ EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevPathNode;\r
+ BOOLEAN RemainingHasControllerNode;\r
+ UINT32 RemainingControllerNumber;\r
\r
RemainingHasControllerNode = FALSE;\r
- RemainingControllerNumber = 0;\r
+ RemainingControllerNumber = 0;\r
\r
//\r
// Determine if the I2c Enumerate Protocol is available\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiI2cEnumerateProtocolGuid,\r
- (VOID **) &I2cEnumerate,\r
+ (VOID **)&I2cEnumerate,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
\r
if (!EFI_ERROR (Status)) {\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiI2cEnumerateProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiI2cEnumerateProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
}\r
\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiDevicePathProtocolGuid,\r
- (VOID **) &ParentDevicePath,\r
+ (VOID **)&ParentDevicePath,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
\r
if (!EFI_ERROR (Status)) {\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiDevicePathProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiDevicePathProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
}\r
\r
if ((RemainingDevicePath != NULL) && !IsDevicePathEnd (RemainingDevicePath)) {\r
// Check if the first node of RemainingDevicePath is a hardware vendor device path\r
//\r
if ((DevicePathType (RemainingDevicePath) != HARDWARE_DEVICE_PATH) ||\r
- (DevicePathSubType (RemainingDevicePath) != HW_VENDOR_DP)) {\r
+ (DevicePathSubType (RemainingDevicePath) != HW_VENDOR_DP))\r
+ {\r
return EFI_UNSUPPORTED;\r
}\r
+\r
//\r
// Check if the second node of RemainingDevicePath is a controller node\r
//\r
DevPathNode = NextDevicePathNode (RemainingDevicePath);\r
if (!IsDevicePathEnd (DevPathNode)) {\r
if ((DevicePathType (DevPathNode) != HARDWARE_DEVICE_PATH) ||\r
- (DevicePathSubType (DevPathNode) != HW_CONTROLLER_DP)) {\r
+ (DevicePathSubType (DevPathNode) != HW_CONTROLLER_DP))\r
+ {\r
return EFI_UNSUPPORTED;\r
} else {\r
RemainingHasControllerNode = TRUE;\r
- RemainingControllerNumber = ((CONTROLLER_DEVICE_PATH *) DevPathNode)->ControllerNumber;\r
+ RemainingControllerNumber = ((CONTROLLER_DEVICE_PATH *)DevPathNode)->ControllerNumber;\r
}\r
}\r
}\r
//\r
// Determine if the I2C Host Protocol is available\r
//\r
- Status = gBS->OpenProtocol ( \r
+ Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiI2cHostProtocolGuid,\r
- (VOID **) &I2cHost,\r
+ (VOID **)&I2cHost,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
\r
if (!EFI_ERROR (Status)) {\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiI2cHostProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiI2cHostProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
}\r
\r
-\r
if (Status == EFI_ALREADY_STARTED) {\r
- if ((RemainingDevicePath == NULL) || \r
- ((RemainingDevicePath != NULL) && IsDevicePathEnd (RemainingDevicePath))) {\r
+ if ((RemainingDevicePath == NULL) ||\r
+ ((RemainingDevicePath != NULL) && IsDevicePathEnd (RemainingDevicePath)))\r
+ {\r
//\r
// If RemainingDevicePath is NULL or is the End of Device Path Node, return EFI_SUCCESS.\r
//\r
} else {\r
//\r
// Test if the child with the RemainingDevicePath has already been created.\r
- // \r
+ //\r
Status = CheckRemainingDevicePath (\r
This,\r
Controller,\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
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;\r
- EFI_I2C_HOST_PROTOCOL *I2cHost;\r
- I2C_BUS_CONTEXT *I2cBusContext;\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
+ EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;\r
+ EFI_I2C_HOST_PROTOCOL *I2cHost;\r
+ I2C_BUS_CONTEXT *I2cBusContext;\r
+ EFI_STATUS Status;\r
+ EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
\r
- I2cBusContext = NULL;\r
- ParentDevicePath = NULL;\r
- I2cEnumerate = NULL;\r
- I2cHost = NULL;\r
+ I2cBusContext = NULL;\r
+ ParentDevicePath = NULL;\r
+ I2cEnumerate = NULL;\r
+ I2cHost = NULL;\r
\r
//\r
// Determine if the I2C controller is available\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiI2cHostProtocolGuid,\r
- (VOID**)&I2cHost,\r
+ (VOID **)&I2cHost,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {\r
- DEBUG ((EFI_D_ERROR, "I2cBus: open I2C host error, Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cBus: open I2C host error, Status = %r\n", Status));\r
return Status;\r
}\r
\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiCallerIdGuid,\r
- (VOID **) &I2cBusContext,\r
+ (VOID **)&I2cBusContext,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "I2cBus: open private protocol error, Status = %r.\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cBus: open private protocol error, Status = %r.\n", Status));\r
return Status;\r
}\r
}\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiI2cEnumerateProtocolGuid,\r
- (VOID**)&I2cEnumerate,\r
+ (VOID **)&I2cEnumerate,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {\r
- DEBUG ((EFI_D_ERROR, "I2cBus: open I2C enumerate error, Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cBus: open I2C enumerate error, Status = %r\n", Status));\r
goto Error;\r
}\r
\r
Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID **) &ParentDevicePath,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
+ Controller,\r
+ &gEfiDevicePathProtocolGuid,\r
+ (VOID **)&ParentDevicePath,\r
+ This->DriverBindingHandle,\r
+ Controller,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {\r
- DEBUG ((EFI_D_ERROR, "I2cBus: open device path error, Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cBus: open device path error, Status = %r\n", Status));\r
goto Error;\r
}\r
\r
if ((RemainingDevicePath != NULL) && IsDevicePathEnd (RemainingDevicePath)) {\r
//\r
// If RemainingDevicePath is the End of Device Path Node,\r
- // don't create any child device and return EFI_SUCESS\r
+ // don't create any child device and return EFI_SUCCESS\r
//\r
return EFI_SUCCESS;\r
}\r
//\r
I2cBusContext = AllocateZeroPool (sizeof (I2C_BUS_CONTEXT));\r
if (I2cBusContext == NULL) {\r
- DEBUG ((EFI_D_ERROR, "I2cBus: there is no enough memory to allocate.\n"));\r
+ DEBUG ((DEBUG_ERROR, "I2cBus: there is no enough memory to allocate.\n"));\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Error;\r
}\r
- \r
+\r
/*\r
+----------------+\r
.->| I2C_BUS_CONTEXT|<----- This file Protocol (gEfiCallerIdGuid) installed on I2C Controller handle\r
| I2C IO Protocol Structure | <----- I2C IO Protocol\r
| |\r
+----------------------------+\r
- \r
+\r
*/\r
I2cBusContext->I2cHost = I2cHost;\r
I2cBusContext->I2cEnumerate = I2cEnumerate;\r
//\r
// Parent controller used to create children\r
//\r
- I2cBusContext->Controller = Controller;\r
+ I2cBusContext->Controller = Controller;\r
//\r
// Parent controller device path used to create children device path\r
//\r
I2cBusContext->ParentDevicePath = ParentDevicePath;\r
- \r
+\r
I2cBusContext->DriverBindingHandle = This->DriverBindingHandle;\r
- \r
+\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&Controller,\r
&gEfiCallerIdGuid,\r
NULL\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "I2cBus: install private protocol error, Status = %r.\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cBus: install private protocol error, Status = %r.\n", Status));\r
goto Error;\r
}\r
}\r
\r
Error:\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "I2cBus: Start() function failed, Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "I2cBus: Start() function failed, Status = %r\n", Status));\r
if (ParentDevicePath != NULL) {\r
- gBS->CloseProtocol ( \r
- Controller,\r
- &gEfiDevicePathProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiDevicePathProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
}\r
\r
if (I2cHost != NULL) {\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiI2cHostProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiI2cHostProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
}\r
\r
if (I2cEnumerate != NULL) {\r
- gBS->CloseProtocol ( \r
- Controller,\r
- &gEfiI2cEnumerateProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiI2cEnumerateProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
}\r
- \r
+\r
if (I2cBusContext != NULL) {\r
Status = gBS->UninstallMultipleProtocolInterfaces (\r
- &Controller,\r
+ Controller,\r
gEfiCallerIdGuid,\r
I2cBusContext,\r
NULL\r
return Status;\r
}\r
\r
-\r
/**\r
Stops a device controller or a bus controller.\r
\r
IN EFI_HANDLE *ChildHandleBuffer\r
)\r
{\r
- I2C_BUS_CONTEXT *I2cBusContext;\r
- EFI_STATUS Status;\r
- BOOLEAN AllChildrenStopped;\r
- UINTN Index;\r
+ I2C_BUS_CONTEXT *I2cBusContext;\r
+ EFI_STATUS Status;\r
+ BOOLEAN AllChildrenStopped;\r
+ UINTN Index;\r
\r
if (NumberOfChildren == 0) {\r
- gBS->CloseProtocol ( \r
- Controller,\r
- &gEfiDevicePathProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiDevicePathProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiI2cHostProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiI2cHostProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiI2cEnumerateProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiI2cEnumerateProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiCallerIdGuid,\r
- (VOID **) &I2cBusContext,\r
+ (VOID **)&I2cBusContext,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
if (!EFI_ERROR (Status)) {\r
gBS->UninstallMultipleProtocolInterfaces (\r
- Controller,\r
- &gEfiCallerIdGuid,\r
- I2cBusContext,\r
- NULL\r
- );\r
+ Controller,\r
+ &gEfiCallerIdGuid,\r
+ I2cBusContext,\r
+ NULL\r
+ );\r
//\r
// No more child now, free bus context data.\r
//\r
FreePool (I2cBusContext);\r
}\r
+\r
return Status;\r
}\r
\r
AllChildrenStopped = TRUE;\r
\r
for (Index = 0; Index < NumberOfChildren; Index++) {\r
-\r
Status = UnRegisterI2cDevice (This, Controller, ChildHandleBuffer[Index]);\r
if (EFI_ERROR (Status)) {\r
AllChildrenStopped = FALSE;\r
if (!AllChildrenStopped) {\r
return EFI_DEVICE_ERROR;\r
}\r
+\r
return EFI_SUCCESS;\r
}\r
\r
**/\r
EFI_STATUS\r
RegisterI2cDevice (\r
- IN I2C_BUS_CONTEXT *I2cBusContext,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ IN I2C_BUS_CONTEXT *I2cBusContext,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- I2C_DEVICE_CONTEXT *I2cDeviceContext;\r
- EFI_STATUS Status;\r
- CONST EFI_I2C_DEVICE *Device;\r
- CONST EFI_I2C_DEVICE *TempDevice;\r
- UINT32 RemainingPathDeviceIndex;\r
- EFI_DEVICE_PATH_PROTOCOL *DevPathNode;\r
- BOOLEAN BuildControllerNode;\r
- UINTN Count;\r
-\r
- Status = EFI_SUCCESS;\r
- BuildControllerNode = TRUE;\r
+ I2C_DEVICE_CONTEXT *I2cDeviceContext;\r
+ EFI_STATUS Status;\r
+ CONST EFI_I2C_DEVICE *Device;\r
+ CONST EFI_I2C_DEVICE *TempDevice;\r
+ UINT32 RemainingPathDeviceIndex;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevPathNode;\r
+ BOOLEAN BuildControllerNode;\r
+ UINTN Count;\r
+\r
+ Status = EFI_SUCCESS;\r
+ BuildControllerNode = TRUE;\r
\r
//\r
// Default DeviceIndex\r
//\r
RemainingPathDeviceIndex = 0;\r
- \r
+\r
//\r
// Determine the controller number in Controller Node Device Path when RemainingDevicePath is not NULL.\r
//\r
if (RemainingDevicePath != NULL) {\r
//\r
// Check if there is a controller node appended after vendor node\r
- // \r
+ //\r
DevPathNode = NextDevicePathNode (RemainingDevicePath);\r
if ((DevicePathType (DevPathNode) == HARDWARE_DEVICE_PATH) &&\r
- (DevicePathSubType(DevPathNode) == HW_CONTROLLER_DP)) {\r
+ (DevicePathSubType (DevPathNode) == HW_CONTROLLER_DP))\r
+ {\r
//\r
// RemainingDevicePath != NULL and RemainingDevicePath contains Controller Node,\r
// add Controller Node to Device Path on child handle.\r
//\r
- RemainingPathDeviceIndex = ((CONTROLLER_DEVICE_PATH *) DevPathNode)->ControllerNumber;\r
+ RemainingPathDeviceIndex = ((CONTROLLER_DEVICE_PATH *)DevPathNode)->ControllerNumber;\r
} else {\r
//\r
// RemainingDevicePath != NULL and RemainingDevicePath does not contain Controller Node,\r
// Get the next I2C device\r
//\r
Status = I2cBusContext->I2cEnumerate->Enumerate (I2cBusContext->I2cEnumerate, &Device);\r
- if (EFI_ERROR (Status) || Device == NULL) {\r
+ if (EFI_ERROR (Status) || (Device == NULL)) {\r
if (RemainingDevicePath != NULL) {\r
Status = EFI_NOT_FOUND;\r
} else {\r
Status = EFI_SUCCESS;\r
}\r
+\r
break;\r
}\r
\r
// Determine if the device info is valid\r
//\r
if ((Device->DeviceGuid == NULL) || (Device->SlaveAddressCount == 0) || (Device->SlaveAddressArray == NULL)) {\r
- DEBUG ((EFI_D_ERROR, "Invalid EFI_I2C_DEVICE reported by I2c Enumerate protocol.\n"));\r
+ DEBUG ((DEBUG_ERROR, "Invalid EFI_I2C_DEVICE reported by I2c Enumerate protocol.\n"));\r
continue;\r
}\r
\r
// Get the next I2C device\r
//\r
Status = I2cBusContext->I2cEnumerate->Enumerate (I2cBusContext->I2cEnumerate, &TempDevice);\r
- if (EFI_ERROR (Status) || TempDevice == NULL) {\r
+ if (EFI_ERROR (Status) || (TempDevice == NULL)) {\r
Status = EFI_SUCCESS;\r
break;\r
}\r
+\r
if (CompareGuid (Device->DeviceGuid, TempDevice->DeviceGuid)) {\r
Count++;\r
}\r
}\r
+\r
if (Count == 1) {\r
//\r
// RemainingDevicePath == NULL and only DeviceIndex 0 is present on the I2C bus,\r
// Find I2C device reported in Remaining Device Path\r
//\r
if ((!CompareGuid (&((VENDOR_DEVICE_PATH *)RemainingDevicePath)->Guid, Device->DeviceGuid)) ||\r
- (RemainingPathDeviceIndex != Device->DeviceIndex)) {\r
- continue; \r
+ (RemainingPathDeviceIndex != Device->DeviceIndex))\r
+ {\r
+ continue;\r
}\r
}\r
\r
//\r
// Initialize the specific device context\r
//\r
- I2cDeviceContext->I2cBusContext = I2cBusContext;\r
- I2cDeviceContext->I2cDevice = Device;\r
- I2cDeviceContext->I2cIo.DeviceGuid = Device->DeviceGuid;\r
- I2cDeviceContext->I2cIo.DeviceIndex = Device->DeviceIndex;\r
- I2cDeviceContext->I2cIo.HardwareRevision = Device->HardwareRevision;\r
+ I2cDeviceContext->I2cBusContext = I2cBusContext;\r
+ I2cDeviceContext->I2cDevice = Device;\r
+ I2cDeviceContext->I2cIo.DeviceGuid = Device->DeviceGuid;\r
+ I2cDeviceContext->I2cIo.DeviceIndex = Device->DeviceIndex;\r
+ I2cDeviceContext->I2cIo.HardwareRevision = Device->HardwareRevision;\r
I2cDeviceContext->I2cIo.I2cControllerCapabilities = I2cBusContext->I2cHost->I2cControllerCapabilities;\r
\r
//\r
// Install the protocol\r
//\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
- &I2cDeviceContext->Handle,\r
- &gEfiI2cIoProtocolGuid,\r
- &I2cDeviceContext->I2cIo,\r
- &gEfiDevicePathProtocolGuid,\r
- I2cDeviceContext->DevicePath,\r
- NULL );\r
+ &I2cDeviceContext->Handle,\r
+ &gEfiI2cIoProtocolGuid,\r
+ &I2cDeviceContext->I2cIo,\r
+ &gEfiDevicePathProtocolGuid,\r
+ I2cDeviceContext->DevicePath,\r
+ NULL\r
+ );\r
if (EFI_ERROR (Status)) {\r
//\r
// Free resources for this I2C device\r
ReleaseI2cDeviceContext (I2cDeviceContext);\r
continue;\r
}\r
- \r
+\r
//\r
// Create the child handle\r
//\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiI2cHostProtocolGuid,\r
- (VOID **) &I2cBusContext->I2cHost,\r
+ (VOID **)&I2cBusContext->I2cHost,\r
I2cBusContext->DriverBindingHandle,\r
I2cDeviceContext->Handle,\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
// Free resources for this I2C device\r
//\r
ReleaseI2cDeviceContext (I2cDeviceContext);\r
- continue; \r
+ continue;\r
}\r
\r
if (RemainingDevicePath != NULL) {\r
return Status;\r
}\r
\r
-\r
/**\r
Queue an I2C transaction for execution on the I2C device.\r
\r
\r
The upper layer driver writer provides the following to the platform\r
vendor:\r
- \r
+\r
1. Vendor specific GUID for the I2C part\r
2. Guidance on proper construction of the slave address array when the\r
I2C device uses more than one slave address. The I2C bus protocol\r
queued when Event is not NULL.\r
@retval EFI_SUCCESS The transaction completed successfully when\r
Event is NULL.\r
- @retval EFI_ABORTED The request did not complete because the driver\r
- binding Stop() routine was called.\r
@retval EFI_BAD_BUFFER_SIZE The RequestPacket->LengthInBytes value is too\r
large.\r
@retval EFI_DEVICE_ERROR There was an I2C error (NACK) during the\r
transaction.\r
@retval EFI_INVALID_PARAMETER RequestPacket is NULL\r
- @retval EFI_NOT_FOUND Reserved bit set in the SlaveAddress parameter\r
@retval EFI_NO_MAPPING The EFI_I2C_HOST_PROTOCOL could not set the\r
bus configuration required to access this I2C\r
device.\r
OUT EFI_STATUS *I2cStatus OPTIONAL\r
)\r
{\r
- CONST EFI_I2C_DEVICE *I2cDevice;\r
- I2C_BUS_CONTEXT *I2cBusContext;\r
- CONST EFI_I2C_HOST_PROTOCOL *I2cHost;\r
- I2C_DEVICE_CONTEXT *I2cDeviceContext;\r
- EFI_STATUS Status;\r
+ CONST EFI_I2C_DEVICE *I2cDevice;\r
+ I2C_BUS_CONTEXT *I2cBusContext;\r
+ CONST EFI_I2C_HOST_PROTOCOL *I2cHost;\r
+ I2C_DEVICE_CONTEXT *I2cDeviceContext;\r
+ EFI_STATUS Status;\r
\r
if (RequestPacket == NULL) {\r
return EFI_INVALID_PARAMETER;\r
Status = I2cHost->QueueRequest (\r
I2cHost,\r
I2cDevice->I2cBusConfiguration,\r
- I2cDevice->SlaveAddressArray [SlaveAddressIndex],\r
+ I2cDevice->SlaveAddressArray[SlaveAddressIndex],\r
Event,\r
RequestPacket,\r
I2cStatus\r
**/\r
VOID\r
ReleaseI2cDeviceContext (\r
- IN I2C_DEVICE_CONTEXT *I2cDeviceContext\r
+ IN I2C_DEVICE_CONTEXT *I2cDeviceContext\r
)\r
{\r
if (I2cDeviceContext == NULL) {\r
return;\r
}\r
- \r
+\r
if (I2cDeviceContext->DevicePath != NULL) {\r
FreePool (I2cDeviceContext->DevicePath);\r
}\r
**/\r
EFI_STATUS\r
UnRegisterI2cDevice (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_HANDLE Handle\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_HANDLE Handle\r
)\r
{\r
- EFI_STATUS Status;\r
- I2C_DEVICE_CONTEXT *I2cDeviceContext;\r
- EFI_I2C_IO_PROTOCOL *I2cIo;\r
- EFI_I2C_HOST_PROTOCOL *I2cHost;\r
+ EFI_STATUS Status;\r
+ I2C_DEVICE_CONTEXT *I2cDeviceContext;\r
+ EFI_I2C_IO_PROTOCOL *I2cIo;\r
+ EFI_I2C_HOST_PROTOCOL *I2cHost;\r
\r
I2cIo = NULL;\r
\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiI2cIoProtocolGuid,\r
- (VOID **) &I2cIo,\r
+ (VOID **)&I2cIo,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
// Keep parent and child relationship\r
//\r
gBS->OpenProtocol (\r
- Controller,\r
- &gEfiI2cHostProtocolGuid,\r
- (VOID **) &I2cHost,\r
- This->DriverBindingHandle,\r
- Handle,\r
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
- );\r
+ Controller,\r
+ &gEfiI2cHostProtocolGuid,\r
+ (VOID **)&I2cHost,\r
+ This->DriverBindingHandle,\r
+ Handle,\r
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+ );\r
return Status;\r
}\r
- \r
+\r
//\r
// Free resources for this I2C device\r
//\r
ReleaseI2cDeviceContext (I2cDeviceContext);\r
- \r
+\r
return EFI_SUCCESS;\r
}\r
\r
**/\r
EFI_STATUS\r
I2cBusDevicePathAppend (\r
- IN I2C_DEVICE_CONTEXT *I2cDeviceContext,\r
- IN BOOLEAN BuildControllerNode\r
+ IN I2C_DEVICE_CONTEXT *I2cDeviceContext,\r
+ IN BOOLEAN BuildControllerNode\r
)\r
{\r
EFI_DEVICE_PATH_PROTOCOL *PreviousDevicePath;\r
- \r
+\r
PreviousDevicePath = NULL;\r
\r
//\r
// Build vendor device path\r
- // \r
+ //\r
CopyMem (&gVendorDevicePathTemplate.Guid, I2cDeviceContext->I2cDevice->DeviceGuid, sizeof (EFI_GUID));\r
- I2cDeviceContext->DevicePath = AppendDevicePathNode (\r
- I2cDeviceContext->I2cBusContext->ParentDevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &gVendorDevicePathTemplate\r
- );\r
+ I2cDeviceContext->DevicePath = AppendDevicePathNode (\r
+ I2cDeviceContext->I2cBusContext->ParentDevicePath,\r
+ (EFI_DEVICE_PATH_PROTOCOL *)&gVendorDevicePathTemplate\r
+ );\r
ASSERT (I2cDeviceContext->DevicePath != NULL);\r
if (I2cDeviceContext->DevicePath == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- \r
+\r
if ((BuildControllerNode) && (I2cDeviceContext->DevicePath != NULL)) {\r
//\r
// Build the final I2C device path with controller node\r
//\r
- PreviousDevicePath = I2cDeviceContext->DevicePath;\r
- gControllerDevicePathTemplate.ControllerNumber = I2cDeviceContext->I2cDevice->DeviceIndex; \r
- I2cDeviceContext->DevicePath = AppendDevicePathNode (\r
- I2cDeviceContext->DevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &gControllerDevicePathTemplate\r
- );\r
+ PreviousDevicePath = I2cDeviceContext->DevicePath;\r
+ gControllerDevicePathTemplate.ControllerNumber = I2cDeviceContext->I2cDevice->DeviceIndex;\r
+ I2cDeviceContext->DevicePath = AppendDevicePathNode (\r
+ I2cDeviceContext->DevicePath,\r
+ (EFI_DEVICE_PATH_PROTOCOL *)&gControllerDevicePathTemplate\r
+ );\r
gBS->FreePool (PreviousDevicePath);\r
ASSERT (I2cDeviceContext->DevicePath != NULL);\r
if (I2cDeviceContext->DevicePath == NULL) {\r
**/\r
EFI_STATUS\r
EFIAPI\r
-InitializeI2cBus(\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+InitializeI2cBus (\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
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- \r
return Status;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
I2cBusUnload (\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 Driver BindingHandle 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
- gI2cBusDriverBinding.DriverBindingHandle,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Disconnect the driver specified by Driver BindingHandle 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
+ gI2cBusDriverBinding.DriverBindingHandle,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
}\r
}\r
\r
gI2cBusDriverBinding.DriverBindingHandle,\r
&gEfiDriverBindingProtocolGuid,\r
&gI2cBusDriverBinding,\r
- &gEfiComponentNameProtocolGuid,\r
- &gI2cBusComponentName,\r
- &gEfiComponentName2ProtocolGuid,\r
- &gI2cBusComponentName2,\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
+ gI2cBusDriverBinding.DriverBindingHandle,\r
+ &gEfiComponentNameProtocolGuid,\r
+ (VOID **)&ComponentName\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->UninstallProtocolInterface (\r
+ gI2cBusDriverBinding.DriverBindingHandle,\r
+ &gEfiComponentNameProtocolGuid,\r
+ ComponentName\r
+ );\r
+ }\r
+\r
+ Status = gBS->HandleProtocol (\r
+ gI2cBusDriverBinding.DriverBindingHandle,\r
+ &gEfiComponentName2ProtocolGuid,\r
+ (VOID **)&ComponentName2\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->UninstallProtocolInterface (\r
+ gI2cBusDriverBinding.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