diff options
author | Simon Glass | 2017-04-05 16:23:36 -0600 |
---|---|---|
committer | Tom Rini | 2017-05-09 20:19:32 -0400 |
commit | 70997d88c40b4d74c4eac80c85f3a2676aa15d82 (patch) | |
tree | fb66d8fc644552c39ec79b8ca7b280571b92fbaf | |
parent | d90385be7ef79c75770b4630f4d16bc13c03c2dc (diff) |
arm: rpi: Add a file to handle messages
The bcm283x chips provide a way for the ARM core to communicate with the
graphics processor, which is in charge of many things. This is handled by
way of a message prototcol.
At present the code for sending message (and receiving a reply) is spread
around U-Boot, primarily in the board file. This means that sending a
message from a driver requires duplicating the code.
Create a new message implementation with a function to support powering on
a subsystem as a starting point.
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | arch/arm/mach-bcm283x/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-bcm283x/include/mach/msg.h | 18 | ||||
-rw-r--r-- | arch/arm/mach-bcm283x/msg.c | 39 | ||||
-rw-r--r-- | board/raspberrypi/rpi/rpi.c | 35 |
4 files changed, 61 insertions, 33 deletions
diff --git a/arch/arm/mach-bcm283x/Makefile b/arch/arm/mach-bcm283x/Makefile index 5cb1b2fe94b..b5f606ef0bf 100644 --- a/arch/arm/mach-bcm283x/Makefile +++ b/arch/arm/mach-bcm283x/Makefile @@ -5,4 +5,4 @@ # obj-$(CONFIG_BCM2835) += lowlevel_init.o -obj-y += init.o reset.o mbox.o phys2bus.o +obj-y += init.o reset.o mbox.o msg.o phys2bus.o diff --git a/arch/arm/mach-bcm283x/include/mach/msg.h b/arch/arm/mach-bcm283x/include/mach/msg.h new file mode 100644 index 00000000000..3bcb5db3e60 --- /dev/null +++ b/arch/arm/mach-bcm283x/include/mach/msg.h @@ -0,0 +1,18 @@ +/* + * (C) Copyright 2012,2015 Stephen Warren + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef _BCM2835_MSG_H +#define _BCM2835_MSG_H + +/** + * bcm2835_power_on_module() - power on an SoC module + * + * @module: ID of module to power on (BCM2835_MBOX_POWER_DEVID_...) + * @return 0 if OK, -EIO on error + */ +int bcm2835_power_on_module(u32 module); + +#endif diff --git a/arch/arm/mach-bcm283x/msg.c b/arch/arm/mach-bcm283x/msg.c new file mode 100644 index 00000000000..08b1beaa539 --- /dev/null +++ b/arch/arm/mach-bcm283x/msg.c @@ -0,0 +1,39 @@ +/* + * (C) Copyright 2012 Stephen Warren + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <memalign.h> +#include <asm/arch/mbox.h> + +struct msg_set_power_state { + struct bcm2835_mbox_hdr hdr; + struct bcm2835_mbox_tag_set_power_state set_power_state; + u32 end_tag; +}; + +int bcm2835_power_on_module(u32 module) +{ + ALLOC_CACHE_ALIGN_BUFFER(struct msg_set_power_state, msg_pwr, 1); + 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 -EIO; + } + + return 0; +} diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c index 2146534b365..d0d9a9739d8 100644 --- a/board/raspberrypi/rpi/rpi.c +++ b/board/raspberrypi/rpi/rpi.c @@ -16,6 +16,7 @@ #include <mmc.h> #include <asm/gpio.h> #include <asm/arch/mbox.h> +#include <asm/arch/msg.h> #include <asm/arch/sdhci.h> #include <asm/global_data.h> #include <dm/platform_data/serial_bcm283x_mu.h> @@ -53,12 +54,6 @@ struct msg_get_mac_address { 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; @@ -365,30 +360,6 @@ int misc_init_r(void) return 0; } -static int power_on_module(u32 module) -{ - ALLOC_CACHE_ALIGN_BUFFER(struct msg_set_power_state, msg_pwr, 1); - 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; -} - static void get_board_rev(void) { ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_board_rev, msg, 1); @@ -492,7 +463,7 @@ int board_init(void) gd->bd->bi_boot_params = 0x100; - return power_on_module(BCM2835_MBOX_POWER_DEVID_USB_HCD); + return bcm2835_power_on_module(BCM2835_MBOX_POWER_DEVID_USB_HCD); } int board_mmc_init(bd_t *bis) @@ -500,7 +471,7 @@ int board_mmc_init(bd_t *bis) ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_clock_rate, msg_clk, 1); int ret; - power_on_module(BCM2835_MBOX_POWER_DEVID_SDHCI); + 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); |