diff options
| -rw-r--r-- | arch/arm/include/asm/arch-bcm2835/mbox.h | 48 | ||||
| -rw-r--r-- | board/raspberrypi/rpi_b/rpi_b.c | 34 | 
2 files changed, 81 insertions, 1 deletions
| diff --git a/arch/arm/include/asm/arch-bcm2835/mbox.h b/arch/arm/include/asm/arch-bcm2835/mbox.h index 6b806ec57..38cb42a3b 100644 --- a/arch/arm/include/asm/arch-bcm2835/mbox.h +++ b/arch/arm/include/asm/arch-bcm2835/mbox.h @@ -133,6 +133,54 @@ struct bcm2835_mbox_tag_get_arm_mem {  	} body;  }; +#define BCM2835_MBOX_POWER_DEVID_SDHCI		0 +#define BCM2835_MBOX_POWER_DEVID_UART0		1 +#define BCM2835_MBOX_POWER_DEVID_UART1		2 +#define BCM2835_MBOX_POWER_DEVID_USB_HCD	3 +#define BCM2835_MBOX_POWER_DEVID_I2C0		4 +#define BCM2835_MBOX_POWER_DEVID_I2C1		5 +#define BCM2835_MBOX_POWER_DEVID_I2C2		6 +#define BCM2835_MBOX_POWER_DEVID_SPI		7 +#define BCM2835_MBOX_POWER_DEVID_CCP2TX		8 + +#define BCM2835_MBOX_POWER_STATE_RESP_ON	(1 << 1) +/* Device doesn't exist */ +#define BCM2835_MBOX_POWER_STATE_RESP_NODEV	(1 << 1) + +#define BCM2835_MBOX_TAG_GET_POWER_STATE	0x00020001 + +struct bcm2835_mbox_tag_get_power_state { +	struct bcm2835_mbox_tag_hdr tag_hdr; +	union { +		struct { +			u32 device_id; +		} req; +		struct { +			u32 device_id; +			u32 state; +		} resp; +	} body; +}; + +#define BCM2835_MBOX_TAG_SET_POWER_STATE	0x00028001 + +#define BCM2835_MBOX_SET_POWER_STATE_REQ_ON	(1 << 0) +#define BCM2835_MBOX_SET_POWER_STATE_REQ_WAIT	(1 << 1) + +struct bcm2835_mbox_tag_set_power_state { +	struct bcm2835_mbox_tag_hdr tag_hdr; +	union { +		struct { +			u32 device_id; +			u32 state; +		} req; +		struct { +			u32 device_id; +			u32 state; +		} resp; +	} body; +}; +  #define BCM2835_MBOX_TAG_GET_CLOCK_RATE	0x00030002  #define BCM2835_MBOX_CLOCK_ID_EMMC	1 diff --git a/board/raspberrypi/rpi_b/rpi_b.c b/board/raspberrypi/rpi_b/rpi_b.c index 16d442aa6..f33fae917 100644 --- a/board/raspberrypi/rpi_b/rpi_b.c +++ b/board/raspberrypi/rpi_b/rpi_b.c @@ -29,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; @@ -54,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) @@ -66,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; |