|
@@ -0,0 +1,40 @@
|
|
|
+/*
|
|
|
+ * Copyright (C) 2015 Atmel Corporation
|
|
|
+ * Wenyou.Yang <wenyou.yang@atmel.com>
|
|
|
+ *
|
|
|
+ * SPDX-License-Identifier: GPL-2.0+
|
|
|
+ */
|
|
|
+
|
|
|
+#include <common.h>
|
|
|
+#include <malloc.h>
|
|
|
+#include <sdhci.h>
|
|
|
+#include <asm/arch/clk.h>
|
|
|
+
|
|
|
+#define ATMEL_SDHC_MIN_FREQ 400000
|
|
|
+
|
|
|
+int atmel_sdhci_init(void *regbase, u32 id)
|
|
|
+{
|
|
|
+ struct sdhci_host *host;
|
|
|
+ u32 max_clk, min_clk = ATMEL_SDHC_MIN_FREQ;
|
|
|
+
|
|
|
+ host = (struct sdhci_host *)calloc(1, sizeof(struct sdhci_host));
|
|
|
+ if (!host) {
|
|
|
+ printf("%s: sdhci_host calloc failed\n", __func__);
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ host->name = "atmel_sdhci";
|
|
|
+ host->ioaddr = regbase;
|
|
|
+ host->quirks = 0;
|
|
|
+ host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
|
|
|
+ max_clk = at91_get_periph_generated_clk(id);
|
|
|
+ if (!max_clk) {
|
|
|
+ printf("%s: Failed to get the proper clock\n", __func__);
|
|
|
+ free(host);
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
+ add_sdhci(host, max_clk, min_clk);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|