Merge branch 'u-boot-arm/next' into 'u-boot-arm/master'
[platform/kernel/u-boot.git] / board / raspberrypi / rpi_b / rpi_b.c
index 6b3e095..f33fae9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2012 Stephen Warren
+ * (C) Copyright 2012-2013 Stephen Warren
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -15,6 +15,8 @@
  */
 
 #include <common.h>
+#include <config.h>
+#include <lcd.h>
 #include <asm/arch/mbox.h>
 #include <asm/arch/sdhci.h>
 #include <asm/global_data.h>
@@ -27,6 +29,12 @@ struct msg_get_arm_mem {
        u32 end_tag;
 };
 
+struct msg_set_power_state {
+       struct bcm2835_mbox_hdr hdr;
+       struct bcm2835_mbox_tag_set_power_state 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;
@@ -52,11 +60,35 @@ int dram_init(void)
        return 0;
 }
 
+static int power_on_module(u32 module)
+{
+       ALLOC_ALIGN_BUFFER(struct msg_set_power_state, msg_pwr, 1, 16);
+       int ret;
+
+       BCM2835_MBOX_INIT_HDR(msg_pwr);
+       BCM2835_MBOX_INIT_TAG(&msg_pwr->set_power_state,
+                             SET_POWER_STATE);
+       msg_pwr->set_power_state.body.req.device_id = module;
+       msg_pwr->set_power_state.body.req.state =
+               BCM2835_MBOX_SET_POWER_STATE_REQ_ON |
+               BCM2835_MBOX_SET_POWER_STATE_REQ_WAIT;
+
+       ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN,
+                                    &msg_pwr->hdr);
+       if (ret) {
+               printf("bcm2835: Could not set module %u power state\n",
+                      module);
+               return -1;
+       }
+
+       return 0;
+}
+
 int board_init(void)
 {
        gd->bd->bi_boot_params = 0x100;
 
-       return 0;
+       return power_on_module(BCM2835_MBOX_POWER_DEVID_USB_HCD);
 }
 
 int board_mmc_init(void)
@@ -64,6 +96,8 @@ int board_mmc_init(void)
        ALLOC_ALIGN_BUFFER(struct msg_get_clock_rate, msg_clk, 1, 16);
        int ret;
 
+       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;
@@ -77,3 +111,13 @@ int board_mmc_init(void)
        return bcm2835_sdhci_init(BCM2835_SDHCI_BASE,
                                  msg_clk->get_clock_rate.body.resp.rate_hz);
 }
+
+void ft_board_setup(void *blob, bd_t *bd)
+{
+       /*
+        * For now, we simply always add the simplefb DT node. Later, we
+        * should be more intelligent, and e.g. only do this if no enabled DT
+        * node exists for the "real" graphics driver.
+        */
+       lcd_dt_simplefb_add_node(blob);
+}