summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnrico Joerns <ejo@pengutronix.de>2017-03-01 15:31:29 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2017-03-02 09:11:23 +0100
commit5d5e1c112a0926067d10f5315e2cb56f6104897c (patch)
tree29f331f3ffbab48d9ac8d8cd3e93e33019ff55d8
parentfaa369e9c55aa3b1f92bdb6a08d040af228ecedd (diff)
downloadbarebox-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/Makefile2
-rw-r--r--arch/arm/boards/raspberry-pi/rpi-common.c57
-rw-r--r--arch/arm/boards/raspberry-pi/rpi.c44
-rw-r--r--arch/arm/boards/raspberry-pi/rpi.h3
-rw-r--r--arch/arm/boards/raspberry-pi/rpi2.c21
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)";