39b598b2ce
- Workaround to boot on Chromebook (snow) - Patch queue updated from git://github.com/openSUSE/u-boot.git tumbleweed-2018.03 * Patches added: 0011-Temp-workaround-for-Chromebook-snow.patch OBS-URL: https://build.opensuse.org/request/show/594811 OBS-URL: https://build.opensuse.org/package/show/hardware:boot/u-boot?expand=0&rev=12
106 lines
3.5 KiB
Diff
106 lines
3.5 KiB
Diff
From 511518e4a181b1601490aa2dfd0f7af459dea5d2 Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Gray <jsg@jsg.id.au>
|
|
Date: Sat, 17 Mar 2018 16:15:48 +1100
|
|
Subject: [PATCH] mmc: use core clock frequency in bcm2835 sdhost
|
|
|
|
In raspberrypi-firmware 7fdcd00e00a42a1c91e8bd6f5eb8352fe9358557 and
|
|
later start.elf now sets the EMMC clock to 200 MHz.
|
|
|
|
According to Phil Elwell in
|
|
https://github.com/raspberrypi/firmware/issues/953
|
|
the SDHost controller shares the core/VPU clock and doesn't use
|
|
the EMMC clock.
|
|
|
|
Use the core clock id when determining the frequency to allow
|
|
U-Boot to work with recent versions of raspberrypi-firmware.
|
|
Otherwise U-Boot hangs at:
|
|
|
|
U-Boot 2018.03 (Mar 14 2018 - 20:36:00 +1100)
|
|
|
|
DRAM: 948 MiB
|
|
RPI 3 Model B (0xa02082)
|
|
MMC: mmc@7e202000: 0, sdhci@7e300000: 1
|
|
Loading Environment from FAT...
|
|
|
|
Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
---
|
|
arch/arm/mach-bcm283x/include/mach/msg.h | 3 ++-
|
|
arch/arm/mach-bcm283x/msg.c | 4 ++--
|
|
drivers/mmc/bcm2835_sdhci.c | 2 +-
|
|
drivers/mmc/bcm2835_sdhost.c | 3 ++-
|
|
4 files changed, 7 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/arch/arm/mach-bcm283x/include/mach/msg.h b/arch/arm/mach-bcm283x/include/mach/msg.h
|
|
index 478b1f1c50..d055480ba1 100644
|
|
--- a/arch/arm/mach-bcm283x/include/mach/msg.h
|
|
+++ b/arch/arm/mach-bcm283x/include/mach/msg.h
|
|
@@ -18,9 +18,10 @@ int bcm2835_power_on_module(u32 module);
|
|
/**
|
|
* bcm2835_get_mmc_clock() - get the frequency of the MMC clock
|
|
*
|
|
+ * @clock_id: ID of clock to get frequency for
|
|
* @return clock frequency, or -ve on error
|
|
*/
|
|
-int bcm2835_get_mmc_clock(void);
|
|
+int bcm2835_get_mmc_clock(u32 clock_id);
|
|
|
|
/**
|
|
* bcm2835_get_video_size() - get the current display size
|
|
diff --git a/arch/arm/mach-bcm283x/msg.c b/arch/arm/mach-bcm283x/msg.c
|
|
index 92e93ad9e5..ad29f3be09 100644
|
|
--- a/arch/arm/mach-bcm283x/msg.c
|
|
+++ b/arch/arm/mach-bcm283x/msg.c
|
|
@@ -65,7 +65,7 @@ int bcm2835_power_on_module(u32 module)
|
|
return 0;
|
|
}
|
|
|
|
-int bcm2835_get_mmc_clock(void)
|
|
+int bcm2835_get_mmc_clock(u32 clock_id)
|
|
{
|
|
ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_clock_rate, msg_clk, 1);
|
|
int ret;
|
|
@@ -76,7 +76,7 @@ int bcm2835_get_mmc_clock(void)
|
|
|
|
BCM2835_MBOX_INIT_HDR(msg_clk);
|
|
BCM2835_MBOX_INIT_TAG(&msg_clk->get_clock_rate, GET_CLOCK_RATE);
|
|
- msg_clk->get_clock_rate.body.req.clock_id = BCM2835_MBOX_CLOCK_ID_EMMC;
|
|
+ msg_clk->get_clock_rate.body.req.clock_id = clock_id;
|
|
|
|
ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg_clk->hdr);
|
|
if (ret) {
|
|
diff --git a/drivers/mmc/bcm2835_sdhci.c b/drivers/mmc/bcm2835_sdhci.c
|
|
index 3157354d2a..08bddd410e 100644
|
|
--- a/drivers/mmc/bcm2835_sdhci.c
|
|
+++ b/drivers/mmc/bcm2835_sdhci.c
|
|
@@ -183,7 +183,7 @@ static int bcm2835_sdhci_probe(struct udevice *dev)
|
|
if (base == FDT_ADDR_T_NONE)
|
|
return -EINVAL;
|
|
|
|
- ret = bcm2835_get_mmc_clock();
|
|
+ ret = bcm2835_get_mmc_clock(BCM2835_MBOX_CLOCK_ID_EMMC);
|
|
if (ret < 0) {
|
|
debug("%s: Failed to set MMC clock (err=%d)\n", __func__, ret);
|
|
return ret;
|
|
diff --git a/drivers/mmc/bcm2835_sdhost.c b/drivers/mmc/bcm2835_sdhost.c
|
|
index 1bf52a3019..bccd182e50 100644
|
|
--- a/drivers/mmc/bcm2835_sdhost.c
|
|
+++ b/drivers/mmc/bcm2835_sdhost.c
|
|
@@ -35,6 +35,7 @@
|
|
#include <dm.h>
|
|
#include <mmc.h>
|
|
#include <asm/arch/msg.h>
|
|
+#include <asm/arch/mbox.h>
|
|
#include <asm/unaligned.h>
|
|
#include <linux/compat.h>
|
|
#include <linux/io.h>
|
|
@@ -941,7 +942,7 @@ static int bcm2835_probe(struct udevice *dev)
|
|
if (!host->ioaddr)
|
|
return -ENOMEM;
|
|
|
|
- host->max_clk = bcm2835_get_mmc_clock();
|
|
+ host->max_clk = bcm2835_get_mmc_clock(BCM2835_MBOX_CLOCK_ID_CORE);
|
|
|
|
bcm2835_add_host(host);
|
|
|