Needs an actual commit message.
What GPIO controller? If it does not have an explicit name, what
family of devices is it in?

On Tue, Sep 15, 2020 at 21:59:00 +0530, Meenakshi Aggarwal wrote:
> Signed-off-by: Pramod Kumar <pramod.kuma...@nxp.com>
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggar...@nxp.com>

Only the poster can sign off that the post is being submitted in
accordance with the Developer's Certificate of Origin:
https://developercertificate.org/

If the author is different from the poster, that should be described
in the patch metadata (i.e. Author: ).

I have permitted (although I'm not a fan) Co-authored-by: tags, if
that is what this is intended to describe.

> ---
>  Silicon/NXP/Library/GpioLib/GpioLib.inf |  39 +++++
>  Silicon/NXP/Include/Library/GpioLib.h   | 110 +++++++++++++++
>  Silicon/NXP/Library/GpioLib/GpioLib.c   | 242 
> ++++++++++++++++++++++++++++++++
>  3 files changed, 391 insertions(+)
>  create mode 100644 Silicon/NXP/Library/GpioLib/GpioLib.inf
>  create mode 100644 Silicon/NXP/Include/Library/GpioLib.h
>  create mode 100644 Silicon/NXP/Library/GpioLib/GpioLib.c
> 
> diff --git a/Silicon/NXP/Library/GpioLib/GpioLib.inf 
> b/Silicon/NXP/Library/GpioLib/GpioLib.inf
> new file mode 100644
> index 000000000000..7878d1d03db2
> --- /dev/null
> +++ b/Silicon/NXP/Library/GpioLib/GpioLib.inf
> @@ -0,0 +1,39 @@
> +/** @file
> +
> + Copyright 2020 NXP
> +
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001001A
> +  BASE_NAME                      = GpioLib
> +  FILE_GUID                      = addec2b8-d2e0-43c0-a277-41a8d42f3f4f
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = GpioLib
> +
> +[Sources.common]
> +  GpioLib.c
> +
> +[LibraryClasses]
> +  ArmLib
> +  BaseMemoryLib
> +  BaseLib

Flip order of above two lines.

> +  IoAccessLib
> +  IoLib
> +
> +[Packages]
> +  ArmPlatformPkg/ArmPlatformPkg.dec
> +  EmbeddedPkg/EmbeddedPkg.dec
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  Silicon/NXP/NxpQoriqLs.dec
> +
> +[Pcd]
> +  gNxpQoriqLsTokenSpaceGuid.PcdNumGpioController
> +  gNxpQoriqLsTokenSpaceGuid.PcdGpioModuleBaseAddress
> +  gNxpQoriqLsTokenSpaceGuid.PcdGpioControllerOffset
> +
> +[FeaturePcd]
> +  gNxpQoriqLsTokenSpaceGuid.PcdGpioControllerBigEndian
> diff --git a/Silicon/NXP/Include/Library/GpioLib.h 
> b/Silicon/NXP/Include/Library/GpioLib.h
> new file mode 100644
> index 000000000000..5821806226ee
> --- /dev/null
> +++ b/Silicon/NXP/Include/Library/GpioLib.h
> @@ -0,0 +1,110 @@
> +/** @file
> +
> + Copyright 2020 NXP
> +
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef GPIO_H__
> +#define GPIO_H__
> +
> +#include <Uefi.h>
> +
> +/* enum for GPIO number */
> +typedef enum _GPIO_BLOCK {
> +  GPIO1,
> +  GPIO2,
> +  GPIO3,
> +  GPIO4,
> +  GPIO_MAX
> +} GPIO_BLOCK;
> +
> +/* enum for GPIO direction */
> +typedef enum _GPIO_DIRECTION {
> +  INPUT,
> +  OUTPUT
> +} GPIO_DIRECTION;
> +
> +/* enum for GPIO state */
> +typedef enum _GPIO_STATE {
> +  LOW,
> +  HIGH
> +} GPIO_VAL;
> +
> +/**
> +   SetDir Set GPIO direction as INPUT or OUTPUT
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +   @param[in] Dir GPIO Direction as INPUT or OUTPUT
> +
> +   @retval EFI_SUCCESS
> + **/
> +EFI_STATUS
> +SetDir (
> +  IN  UINT8    Id,
> +  IN  UINT32   Bit,
> +  IN  BOOLEAN  Dir
> +  );
> +
> +/**
> +   GetDir  Retrieve GPIO direction
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +
> +   @retval GPIO Direction as INPUT or OUTPUT
> + **/
> +UINT32
> +GetDir (
> +  IN  UINT8    Id,
> +  IN  UINT32   Bit
> +  );
> +
> + /**
> +   GetData  Retrieve GPIO Value
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +
> +   @retval GPIO value  as HIGH or LOW
> + **/
> +UINT32
> +GetData (
> +  IN  UINT8    Id,
> +  IN  UINT32   Bit
> +  );
> +
> +/**
> +   SetData  Set GPIO data Value
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +   @param[in] Data GPIO data value to set
> +
> +   @retval GPIO value  as HIGH or LOW
> + **/
> +EFI_STATUS
> +SetData (
> +  IN  UINT8    Id,
> +  IN  UINT32   Bit,
> +  IN  BOOLEAN  Data
> +  );
> +
> +/**
> +   SetOpenDrain  Set GPIO as Open drain
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +   @param[in] OpenDrain Set as open drain
> +
> +   @retval EFI_SUCCESS
> + **/
> +EFI_STATUS
> +SetOpenDrain (
> +  IN  UINT8    Id,
> +  IN  UINT32   Bit,
> +  IN  BOOLEAN  OpenDrain
> +  );
> +
> +#endif
> diff --git a/Silicon/NXP/Library/GpioLib/GpioLib.c 
> b/Silicon/NXP/Library/GpioLib/GpioLib.c
> new file mode 100644
> index 000000000000..33cc45c2152b
> --- /dev/null
> +++ b/Silicon/NXP/Library/GpioLib/GpioLib.c
> @@ -0,0 +1,242 @@
> +/** @file
> +

Which controller is this for. There should be a comment here
sufficient for me to figure out where I should start looking for
documentation.

> + Copyright 2020 NXP
> +
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Library/GpioLib.h>
> +#include <Library/IoAccessLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/BaseLib.h>
> +
> +STATIC MMIO_OPERATIONS *mGpioOps;
> +
> +/* Structure for GPIO Regsters */
> +typedef struct GpioRegs {
> +  UINT32 GpDir;
> +  UINT32 GpOdr;
> +  UINT32 GpData;
> +  UINT32 GpIer;
> +  UINT32 GpImr;
> +  UINT32 GpIcr;

Are the above registers the official names as per the documentation?
If so, this is fine even though it violates the CamelCase naming
style, but please add a glossary entry to the top-of-file comment
block.

> +} GPIO_REGS;
> +
> +/**
> +   GetBaseAddr GPIO controller Base Address
> +
> +   @param[in] Id  GPIO controller number
> +
> +   @retval GPIO controller Base Address, if found
> +   @retval NULL, if not a valid controller number
> +
> + **/
> +STATIC
> +VOID *
> +GetBaseAddr (
> +  IN  UINT8  Id
> +  )
> +{
> +
> +  UINTN      GpioBaseAddr;
> +  UINTN      MaxGpioController;
> +
> +  mGpioOps = GetMmioOperations (FeaturePcdGet (PcdGpioControllerBigEndian));
> +
> +  MaxGpioController = PcdGet32 (PcdNumGpioController);
> +
> +  if (Id < MaxGpioController) {
> +    GpioBaseAddr = PcdGet64 (PcdGpioModuleBaseAddress) +
> +                     (Id * PcdGet64 (PcdGpioControllerOffset));
> +    return (VOID *) GpioBaseAddr;

No space after ).

> +  }
> +  else {

Move to line above.

> +    DEBUG((DEBUG_ERROR, "Invalid Gpio Controller Id %d, Allowed Ids are 
> %d-%d",
> +      Id, GPIO1, MaxGpioController));
> +      return NULL;
> +  }
> +}
> +
> +/**
> +   GetBitMask:  Return Bit Mask
> +
> +   @param[in] Bit  Bit to create bitmask
> +   @retval         Bitmask
> +
> + **/
> +
> +STATIC
> +UINT32
> +GetBitMask (
> +  IN  UINT32  Bit
> +  )
> +{
> +
> +  if (!FeaturePcdGet (PcdGpioControllerBigEndian)) {
> +    return (1 << Bit);
> +  } else {
> +    return (1 << (31 - Bit));
> +  }

The above confuses me greatly - endianness affects byte order, not
bit order. Is this some compensation for PowerPC numbering bits
backwards, and these reused blocks being affected by this when in
big-endian mode?

Needs a very descriptive comment. The current function comment block
contains no information, it just keeps repeating the function name in
different word order.

> +}
> +
> +
> +/**
> +   SetDir Set GPIO direction as INPUT or OUTPUT
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +   @param[in] Dir GPIO Direction as INPUT or OUTPUT
> +
> +   @retval EFI_SUCCESS
> + **/
> +EFI_STATUS
> +SetDir (

SetDirection

> +  IN  UINT8    Id,
> +  IN  UINT32   Bit,
> +  IN  BOOLEAN  Dir
> +  )
> +{
> +  GPIO_REGS    *Regs;
> +  UINT32       BitMask;

The variable should be called something descriptive. You are using it
to read a specific value out of a specific register. In this instance,
DirectionMask would be a better alternative.

Please address accordingly in functions below, with appropriate
descriptive names for each location.

> +  UINT32       Value;
> +
> +  Regs = GetBaseAddr(Id);
> +  BitMask = GetBitMask(Bit);
> +
> +  Value = mGpioOps->Read32 ((UINTN)&Regs->GpDir);
> +
> +  if (Dir) {
> +    mGpioOps->Write32 ((UINTN)&Regs->GpDir, (Value | BitMask));
> +  }
> +  else {
> +    mGpioOps->Write32 ((UINTN)&Regs->GpDir, (Value & (~BitMask)));
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +   GetDir  Retrieve GPIO direction
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +
> +   @retval GPIO Direction as INPUT or OUTPUT
> + **/
> +UINT32
> +GetDir (

GetDirection

> +  IN  UINT8    Id,
> +  IN  UINT32   Bit
> +  )
> +{
> +  GPIO_REGS    *Regs;
> +  UINT32       Value;
> +  UINT32       BitMask;
> +
> +  Regs = GetBaseAddr (Id);
> +  BitMask = GetBitMask(Bit);
> +
> +  Value = mGpioOps->Read32 ((UINTN)&Regs->GpDir);
> +
> +  return (Value & BitMask);
> +}
> +
> +/**
> +   GetData  Retrieve GPIO Value
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +
> +   @retval GPIO value  as HIGH or LOW
> + **/
> +UINT32
> +GetData (
> +  IN  UINT8    Id,
> +  IN  UINT32   Bit
> +  )
> +{
> +  GPIO_REGS    *Regs;
> +  UINT32       Value;
> +  UINT32       BitMask;
> +
> +  Regs = (VOID *)GetBaseAddr (Id);
> +  BitMask = GetBitMask(Bit);
> +
> +

Spurious extra blank line.

> +  Value = mGpioOps->Read32 ((UINTN)&Regs->GpData);
> +
> +  if (Value & BitMask) {
> +    return 1;
> +  } else {
> +    return 0;
> +  }

  return (Value & BitMask) == BitMask; ?

> +}
> +
> +/**
> +   SetData  Set GPIO data Value
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +   @param[in] Data GPIO data value to set
> +
> +   @retval GPIO value  as HIGH or LOW
> + **/
> +EFI_STATUS
> +SetData (
> +  IN  UINT8    Id,
> +  IN  UINT32   Bit,
> +  IN  BOOLEAN  Data
> +  )
> +{
> +  GPIO_REGS    *Regs;
> +  UINT32       BitMask;
> +  UINT32       Value;
> +
> +  Regs = GetBaseAddr (Id);
> +  BitMask = GetBitMask(Bit);
> +
> +  Value = mGpioOps->Read32 ((UINTN)&Regs->GpData);
> +
> +  if (Data) {
> +    mGpioOps->Write32 ((UINTN)&Regs->GpData, (Value | BitMask));
> +  } else {
> +    mGpioOps->Write32 ((UINTN)&Regs->GpData, (Value & (~BitMask)));
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +   SetOpenDrain  Set GPIO as Open drain
> +
> +   @param[in] Id  GPIO controller number
> +   @param[in] Bit GPIO number
> +   @param[in] OpenDrain Set as open drain
> +
> +   @retval EFI_SUCCESS
> + **/
> +EFI_STATUS
> +SetOpenDrain (
> +  IN  UINT8    Id,
> +  IN  UINT32   Bit,
> +  IN  BOOLEAN  OpenDrain
> +  )
> +{
> +  GPIO_REGS    *Regs;
> +  UINT32       BitMask;
> +  UINT32       Value;
> +
> +  Regs = GetBaseAddr (Id);
> +  BitMask = GetBitMask(Bit);

Missing space before (.

> +
> +  Value = mGpioOps->Read32 ((UINTN)&Regs->GpOdr);
> +  if (OpenDrain) {
> +    mGpioOps->Write32 ((UINTN)&Regs->GpOdr,  (Value | BitMask));
> +  }
> +  else {

Move to line above.

/
    Leif

> +    mGpioOps->Write32 ((UINTN)&Regs->GpOdr,  (Value & (~BitMask)));
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> -- 
> 1.9.1
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#65621): https://edk2.groups.io/g/devel/message/65621
Mute This Topic: https://groups.io/mt/76861996/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to