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>
master
Simon Glass 7 years ago committed by Tom Rini
parent 70997d88c4
commit c6606515f1
  1. 7
      arch/arm/mach-bcm283x/include/mach/msg.h
  2. 28
      arch/arm/mach-bcm283x/msg.c
  3. 16
      board/raspberrypi/rpi/rpi.c

@ -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

@ -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;
}

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

Loading…
Cancel
Save