diff options
author | Enrico Joerns <ejo@pengutronix.de> | 2017-03-01 15:31:29 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-03-02 09:11:23 +0100 |
commit | 5d5e1c112a0926067d10f5315e2cb56f6104897c (patch) | |
tree | 29f331f3ffbab48d9ac8d8cd3e93e33019ff55d8 | |
parent | faa369e9c55aa3b1f92bdb6a08d040af228ecedd (diff) | |
download | barebox-5d5e1c112a0926067d10f5315e2cb56f6104897c.tar.gz barebox-5d5e1c112a0926067d10f5315e2cb56f6104897c.tar.xz |
ARM: rpi: move model initialisation to rpi-common
The Raspberry PIs use different versions schemes for the older and newer
variants. The decoding arrays for these schemes were split up in rpi.c
and rpi2.c. This is not required, as the appropriate versioning scheme
can be determined programmatically.
Signed-off-by: Enrico Joerns <ejo@pengutronix.de>
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | arch/arm/boards/raspberry-pi/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/boards/raspberry-pi/rpi-common.c | 57 | ||||
-rw-r--r-- | arch/arm/boards/raspberry-pi/rpi.c | 44 | ||||
-rw-r--r-- | arch/arm/boards/raspberry-pi/rpi.h | 3 | ||||
-rw-r--r-- | arch/arm/boards/raspberry-pi/rpi2.c | 21 |
5 files changed, 48 insertions, 79 deletions
diff --git a/arch/arm/boards/raspberry-pi/Makefile b/arch/arm/boards/raspberry-pi/Makefile index 7a3d7de241..a3e93eb73a 100644 --- a/arch/arm/boards/raspberry-pi/Makefile +++ b/arch/arm/boards/raspberry-pi/Makefile @@ -1,4 +1,2 @@ obj-$(CONFIG_MACH_RPI_COMMON) += rpi-common.o -obj-$(CONFIG_MACH_RPI) += rpi.o -obj-$(CONFIG_MACH_RPI2) += rpi2.o lwl-y += lowlevel.o diff --git a/arch/arm/boards/raspberry-pi/rpi-common.c b/arch/arm/boards/raspberry-pi/rpi-common.c index 147fce9952..7441c06437 100644 --- a/arch/arm/boards/raspberry-pi/rpi-common.c +++ b/arch/arm/boards/raspberry-pi/rpi-common.c @@ -146,6 +146,13 @@ void rpi_add_led(void) led_set_trigger(LED_TRIGGER_HEARTBEAT, &l->led); } +void rpi_b_init(void) +{ + rpi_leds[0].gpio = 16; + rpi_leds[0].active_low = 1; + rpi_set_usbethaddr(); +} + void rpi_b_plus_init(void) { rpi_leds[0].gpio = 47; @@ -153,12 +160,39 @@ void rpi_b_plus_init(void) rpi_set_usbethaddr(); } +/* See comments in mbox.h for data source */ +const struct rpi_model rpi_models_old_scheme[] = { + RPI_MODEL(0, "Unknown model", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C0_2, "Model B (no P5)", rpi_b_init), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C0_3, "Model B (no P5)", rpi_b_init), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_4, "Model B", rpi_b_init), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_5, "Model B", rpi_b_init), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_6, "Model B", rpi_b_init), + RPI_MODEL(BCM2835_BOARD_REV_A_7, "Model A", NULL), + RPI_MODEL(BCM2835_BOARD_REV_A_8, "Model A", NULL), + RPI_MODEL(BCM2835_BOARD_REV_A_9, "Model A", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_REV2_d, "Model B rev2", rpi_b_init), + RPI_MODEL(BCM2835_BOARD_REV_B_REV2_e, "Model B rev2", rpi_b_init), + RPI_MODEL(BCM2835_BOARD_REV_B_REV2_f, "Model B rev2", rpi_b_init), + RPI_MODEL(BCM2835_BOARD_REV_B_PLUS, "Model B+", rpi_b_plus_init), + RPI_MODEL(BCM2835_BOARD_REV_CM, "Compute Module", NULL), + RPI_MODEL(BCM2835_BOARD_REV_A_PLUS, "Model A+", NULL), +}; + +const struct rpi_model rpi_models_new_scheme[] = { + RPI_MODEL(0, "Unknown model", NULL), + RPI_MODEL(BCM2836_BOARD_REV_2_B, "2 Model B", rpi_b_plus_init), +}; + static int rpi_board_rev = 0; +const struct rpi_model *model; static void rpi_get_board_rev(void) { int ret; char *name; + const struct rpi_model *rpi_models; + size_t rpi_models_size; BCM2835_MBOX_STACK_ALIGN(struct msg_get_board_rev, msg); BCM2835_MBOX_INIT_HDR(msg); @@ -183,10 +217,17 @@ static void rpi_get_board_rev(void) * http://www.raspberrypi.org/forums/viewtopic.php?f=31&t=20594 */ rpi_board_rev = msg->get_board_rev.body.resp.rev; - if (rpi_board_rev & 0x800000) + if (rpi_board_rev & 0x800000) { rpi_board_rev = (rpi_board_rev >> 4) & 0xff; - else + rpi_models = rpi_models_new_scheme; + rpi_models_size = ARRAY_SIZE(rpi_models_new_scheme); + + } else { rpi_board_rev &= 0xff; + rpi_models = rpi_models_old_scheme; + rpi_models_size = ARRAY_SIZE(rpi_models_old_scheme); + } + if (rpi_board_rev >= rpi_models_size) { printf("RPI: Board rev %u outside known range\n", rpi_board_rev); @@ -201,8 +242,8 @@ static void rpi_get_board_rev(void) if (!rpi_board_rev) goto unknown_rev; - name = basprintf("RaspberryPi %s %s", - rpi_models[rpi_board_rev].name, rpi_model_string); + model = &rpi_models[rpi_board_rev]; + name = basprintf("RaspberryPi %s", model->name); barebox_set_model(name); free(name); @@ -210,17 +251,15 @@ static void rpi_get_board_rev(void) unknown_rev: rpi_board_rev = 0; - name = basprintf("RaspberryPi %s", rpi_model_string); - barebox_set_model(name); - free(name); + barebox_set_model("RaspberryPi (unknown rev)"); } static void rpi_model_init(void) { - if (!rpi_models[rpi_board_rev].init) + if (!model->init) return; - rpi_models[rpi_board_rev].init(); + model->init(); rpi_add_led(); } diff --git a/arch/arm/boards/raspberry-pi/rpi.c b/arch/arm/boards/raspberry-pi/rpi.c deleted file mode 100644 index dd2ad7f5a5..0000000000 --- a/arch/arm/boards/raspberry-pi/rpi.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2009 Carlo Caione <carlo@carlocaione.org> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "rpi.h" - -static void rpi_b_init(void) -{ - rpi_leds[0].gpio = 16; - rpi_leds[0].active_low = 1; - rpi_set_usbethaddr(); -} - -/* See comments in mbox.h for data source */ -const struct rpi_model rpi_models[] = { - RPI_MODEL(0, "Unknown model", NULL), - RPI_MODEL(BCM2835_BOARD_REV_B_I2C0_2, "Model B (no P5)", rpi_b_init), - RPI_MODEL(BCM2835_BOARD_REV_B_I2C0_3, "Model B (no P5)", rpi_b_init), - RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_4, "Model B", rpi_b_init), - RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_5, "Model B", rpi_b_init), - RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_6, "Model B", rpi_b_init), - RPI_MODEL(BCM2835_BOARD_REV_A_7, "Model A", NULL), - RPI_MODEL(BCM2835_BOARD_REV_A_8, "Model A", NULL), - RPI_MODEL(BCM2835_BOARD_REV_A_9, "Model A", NULL), - RPI_MODEL(BCM2835_BOARD_REV_B_REV2_d, "Model B rev2", rpi_b_init), - RPI_MODEL(BCM2835_BOARD_REV_B_REV2_e, "Model B rev2", rpi_b_init), - RPI_MODEL(BCM2835_BOARD_REV_B_REV2_f, "Model B rev2", rpi_b_init), - RPI_MODEL(BCM2835_BOARD_REV_B_PLUS, "Model B+", rpi_b_plus_init), - RPI_MODEL(BCM2835_BOARD_REV_CM, "Compute Module", NULL), - RPI_MODEL(BCM2835_BOARD_REV_A_PLUS, "Model A+", NULL), -}; -const size_t rpi_models_size = ARRAY_SIZE(rpi_models); -const char *rpi_model_string = "(BCM2835/ARM1176JZF-S)"; diff --git a/arch/arm/boards/raspberry-pi/rpi.h b/arch/arm/boards/raspberry-pi/rpi.h index 739cdee1b3..dd32fee809 100644 --- a/arch/arm/boards/raspberry-pi/rpi.h +++ b/arch/arm/boards/raspberry-pi/rpi.h @@ -17,9 +17,6 @@ struct rpi_model { void (*init)(void); }; -extern const struct rpi_model rpi_models[]; -extern const size_t rpi_models_size; -extern const char *rpi_model_string; extern struct gpio_led rpi_leds[]; void rpi_b_plus_init(void); diff --git a/arch/arm/boards/raspberry-pi/rpi2.c b/arch/arm/boards/raspberry-pi/rpi2.c deleted file mode 100644 index 2cfc06f8a6..0000000000 --- a/arch/arm/boards/raspberry-pi/rpi2.c +++ /dev/null @@ -1,21 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "rpi.h" - -const struct rpi_model rpi_models[] = { - RPI_MODEL(0, "Unknown model", NULL), - RPI_MODEL(BCM2836_BOARD_REV_2_B, "2 Model B", rpi_b_plus_init), -}; -const size_t rpi_models_size = ARRAY_SIZE(rpi_models); -const char *rpi_model_string = "(BCM2836/CORTEX-A7)"; |