hc
2023-12-06 d38611ca164021d018c1b23eee65bbebc09c63e0
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
/*
 * (C) Copyright 2015 Linaro
 * peter.griffin <peter.griffin@linaro.org>
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#include <common.h>
#include <dwmmc.h>
#include <malloc.h>
#include <linux/errno.h>
 
#define    DWMMC_MAX_CH_NUM        4
 
#define    DWMMC_MAX_FREQ            50000000
#define    DWMMC_MIN_FREQ            400000
 
/* Source clock is configured to 100MHz by ATF bl1*/
#define MMC0_DEFAULT_FREQ        100000000
 
static int hi6220_dwmci_core_init(struct dwmci_host *host, int index)
{
   host->name = "Hisilicon DWMMC";
 
   host->dev_index = index;
 
   /* Add the mmc channel to be registered with mmc core */
   if (add_dwmci(host, DWMMC_MAX_FREQ, DWMMC_MIN_FREQ)) {
       printf("DWMMC%d registration failed\n", index);
       return -1;
   }
   return 0;
}
 
/*
 * This function adds the mmc channel to be registered with mmc core.
 * index -    mmc channel number.
 * regbase -    register base address of mmc channel specified in 'index'.
 * bus_width -    operating bus width of mmc channel specified in 'index'.
 */
int hi6220_dwmci_add_port(int index, u32 regbase, int bus_width)
{
   struct dwmci_host *host = NULL;
 
   host = calloc(1, sizeof(struct dwmci_host));
   if (!host) {
       pr_err("dwmci_host calloc failed!\n");
       return -ENOMEM;
   }
 
   host->ioaddr = (void *)(ulong)regbase;
   host->buswidth = bus_width;
   host->bus_hz = MMC0_DEFAULT_FREQ;
 
   return hi6220_dwmci_core_init(host, index);
}