aboutsummaryrefslogtreecommitdiffstats
path: root/Platforms/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c
blob: 0f586976a1bad42938712e9954cbdc1b93608efb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/** @file
*
*  Copyright (c) 2017, Linaro. All rights reserved.
*
*  This program and the accompanying materials
*  are licensed and made available under the terms and conditions of the BSD License
*  which accompanies this distribution.  The full text of the license may be found at
*  http://opensource.org/licenses/bsd-license.php
*
*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
*
**/

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/DevicePathLib.h>
#include <Library/IoLib.h>
#include <Library/TimerLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UsbSerialNumberLib.h>

#include <Protocol/EmbeddedGpio.h>
#include <Protocol/PlatformDwMmc.h>

#include <Hi6220.h>

#define DETECT_SD_CARD           8     // GPIO 1_0

DW_MMC_HC_SLOT_CAP
DwMmcCapability[2] = {
  {
    .Ddr50       = 1,
    .HighSpeed   = 1,
    .BusWidth    = 8,
    .SlotType    = EmbeddedSlot,
    .CardType    = EmmcCardType,
    .BaseClkFreq = 100000
  }, {
    .HighSpeed   = 1,
    .BusWidth    = 4,
    .SlotType    = RemovableSlot,
    .CardType    = SdCardType,
    .Voltage30   = 1,
    .BaseClkFreq = 100000
  }
};

EFI_STATUS
EFIAPI
HiKeyGetCapability (
  IN     EFI_HANDLE           Controller,
  IN     UINT8                Slot,
     OUT DW_MMC_HC_SLOT_CAP   *Capability
  )
{
  if (Capability == NULL) {
    return EFI_INVALID_PARAMETER;
  }
  if (DwMmcCapability[0].Controller == 0) {
    DwMmcCapability[0].Controller = Controller;
    CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP));
  } else if (DwMmcCapability[0].Controller == Controller) {
    CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP));
  } else if (DwMmcCapability[1].Controller == 0) {
    DwMmcCapability[1].Controller = Controller;
    CopyMem (Capability, &DwMmcCapability[1], sizeof (DW_MMC_HC_SLOT_CAP));
  } else if (DwMmcCapability[1].Controller == Controller) {
    CopyMem (Capability, &DwMmcCapability[1], sizeof (DW_MMC_HC_SLOT_CAP));
  } else {
    return EFI_INVALID_PARAMETER;
  }
  return EFI_SUCCESS;
}

BOOLEAN
EFIAPI
HiKeyCardDetect (
  IN UINT8                    Slot
  )
{
  EFI_STATUS            Status;
  EMBEDDED_GPIO         *Gpio;
  UINTN                 Value;

  if (Slot == 0) {
    return TRUE;
  } else if (Slot == 1) {
    Status = gBS->LocateProtocol (&gEmbeddedGpioProtocolGuid, NULL, (VOID **)&Gpio);
    if (EFI_ERROR (Status)) {
      DEBUG ((DEBUG_ERROR, "Failed to get GPIO protocol: %r\n", Status));
      return FALSE;
    }
    Status = Gpio->Set (Gpio, DETECT_SD_CARD, GPIO_MODE_INPUT);
    if (EFI_ERROR (Status)) {
      DEBUG ((DEBUG_ERROR, "Failed to sed GPIO as input mode: %r\n", Status));
      return FALSE;
    }
    Status = Gpio->Get (Gpio, DETECT_SD_CARD, &Value);
    if (EFI_ERROR (Status)) {
      DEBUG ((DEBUG_ERROR, "Failed to get GPIO value: %r\n", Status));
      return FALSE;
    }
    if (Value == 0) {
      return TRUE;
    }
    return FALSE;
  } else {
    return FALSE;
  }
}

PLATFORM_DW_MMC_PROTOCOL mDwMmcDevice = {
  HiKeyGetCapability,
  HiKeyCardDetect
};

EFI_STATUS
EFIAPI
HiKeyMmcEntryPoint (
  IN EFI_HANDLE                            ImageHandle,
  IN EFI_SYSTEM_TABLE                      *SystemTable
  )
{
  EFI_STATUS        Status;

  Status = gBS->InstallProtocolInterface (
                  &ImageHandle,
                  &gPlatformDwMmcProtocolGuid,
                  EFI_NATIVE_INTERFACE,
                  &mDwMmcDevice
                  );
  if (EFI_ERROR (Status)) {
    return Status;
  }
  return Status;
}