diff mbox series

[U-Boot] mmc: use core clock frequency in bcm2835 sdhost

Message ID 20180317051548.42856-1-jsg@jsg.id.au
State Accepted
Commit 8ae1f8298820a19380bafc07ad554bd629cc27be
Delegated to: Alexander Graf
Headers show
Series [U-Boot] mmc: use core clock frequency in bcm2835 sdhost | expand

Commit Message

Jonathan Gray March 17, 2018, 5:15 a.m. UTC
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>
Cc: Alexander Graf <agraf@suse.de>
Cc: Peter Robinson <pbrobinson@gmail.com>
---
 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(-)

Comments

Alexander Graf April 5, 2018, 11:18 a.m. UTC | #1
> 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>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Peter Robinson <pbrobinson@gmail.com>

Thanks, applied to rpi-next

Alex
diff mbox series

Patch

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);