diff options
author | Simon Glass | 2017-04-05 16:23:37 -0600 |
---|---|---|
committer | Tom Rini | 2017-05-09 20:19:33 -0400 |
commit | c6606515f1aedd716f5cffa454de12601bc2c372 (patch) | |
tree | 5c011f6743b5c2c2793514274ef6c05677b75fd9 | |
parent | 70997d88c40b4d74c4eac80c85f3a2676aa15d82 (diff) |
arm: rpi: Add a function to obtain the MMC clock
Move this code into the new message handler file.
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | arch/arm/mach-bcm283x/include/mach/msg.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-bcm283x/msg.c | 28 | ||||
-rw-r--r-- | board/raspberrypi/rpi/rpi.c | 16 |
3 files changed, 39 insertions, 12 deletions
diff --git a/arch/arm/mach-bcm283x/include/mach/msg.h b/arch/arm/mach-bcm283x/include/mach/msg.h index 3bcb5db3e60..8fd4ace124d 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 08b1beaa539..facb916711c 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 d0d9a9739d8..2893f09bc53 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) |