From c6606515f1aedd716f5cffa454de12601bc2c372 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 5 Apr 2017 16:23:37 -0600 Subject: arm: rpi: Add a function to obtain the MMC clock Move this code into the new message handler file. Signed-off-by: Simon Glass diff --git a/arch/arm/mach-bcm283x/include/mach/msg.h b/arch/arm/mach-bcm283x/include/mach/msg.h index 3bcb5db..8fd4ace 100644 --- a/arch/arm/mach-bcm283x/include/mach/msg.h +++ b/arch/arm/mach-bcm283x/include/mach/msg.h @@ -15,4 +15,11 @@ */ int bcm2835_power_on_module(u32 module); +/** + * bcm2835_get_mmc_clock() - get the frequency of the MMC clock + * + * @return clock frequency, or -ve on error + */ +int bcm2835_get_mmc_clock(void); + #endif diff --git a/arch/arm/mach-bcm283x/msg.c b/arch/arm/mach-bcm283x/msg.c index 08b1bea..facb916 100644 --- a/arch/arm/mach-bcm283x/msg.c +++ b/arch/arm/mach-bcm283x/msg.c @@ -14,6 +14,12 @@ struct msg_set_power_state { u32 end_tag; }; +struct msg_get_clock_rate { + struct bcm2835_mbox_hdr hdr; + struct bcm2835_mbox_tag_get_clock_rate get_clock_rate; + u32 end_tag; +}; + int bcm2835_power_on_module(u32 module) { ALLOC_CACHE_ALIGN_BUFFER(struct msg_set_power_state, msg_pwr, 1); @@ -37,3 +43,25 @@ int bcm2835_power_on_module(u32 module) return 0; } + +int bcm2835_get_mmc_clock(void) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_clock_rate, msg_clk, 1); + int ret; + + ret = bcm2835_power_on_module(BCM2835_MBOX_POWER_DEVID_SDHCI); + if (ret) + return ret; + + 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; + + ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg_clk->hdr); + if (ret) { + printf("bcm2835: Could not query eMMC clock rate\n"); + return -EIO; + } + + return msg_clk->get_clock_rate.body.resp.rate_hz; +} diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c index d0d9a97..2893f09 100644 --- a/board/raspberrypi/rpi/rpi.c +++ b/board/raspberrypi/rpi/rpi.c @@ -468,23 +468,15 @@ int board_init(void) int board_mmc_init(bd_t *bis) { - ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_clock_rate, msg_clk, 1); int ret; bcm2835_power_on_module(BCM2835_MBOX_POWER_DEVID_SDHCI); - 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; + ret = bcm2835_get_mmc_clock(); + if (ret) + return ret; - ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg_clk->hdr); - if (ret) { - printf("bcm2835: Could not query eMMC clock rate\n"); - return -1; - } - - return bcm2835_sdhci_init(BCM2835_SDHCI_BASE, - msg_clk->get_clock_rate.body.resp.rate_hz); + return bcm2835_sdhci_init(BCM2835_SDHCI_BASE, ret); } int ft_board_setup(void *blob, bd_t *bd) -- cgit v0.10.2