[PATCH 3/5] ARM: rpi: rework rpi board init code

Marco Felsch m.felsch at pengutronix.de
Wed Feb 8 01:18:25 PST 2023


Hi Daniel,

thanks for your patch.

On 23-02-07, Daniel Brát wrote:
> Rework of init for various rpi board variants. Primarily, ethernet and
> usb init have been generalized to better cover different variations and
> handling of board leds changed from adding and registering 'gpio_led'
> structures to fixing them in the device tree. This change also required
> moving the board init code from 'late_platform_driver' to
> 'coredevice_platform_driver' which in turn ment calling 'rpi_env_init'
> from separate late_initcall.

Is it possible to split that patch into smaller ones?

Regards,
  Marco


> 
> Signed-off-by: Daniel Brát <danek.brat at gmail.com>
> ---
>  arch/arm/boards/raspberry-pi/rpi-common.c | 414 ++++++++++------------
>  arch/arm/dts/bcm2711-rpi-4.dts            |   5 +
>  arch/arm/dts/bcm2835-rpi.dts              |   1 +
>  arch/arm/dts/bcm2836-rpi-2.dts            |   4 +
>  arch/arm/dts/bcm2837-rpi-3.dts            |   5 +
>  5 files changed, 199 insertions(+), 230 deletions(-)
> 
> diff --git a/arch/arm/boards/raspberry-pi/rpi-common.c b/arch/arm/boards/raspberry-pi/rpi-common.c
> index a8f180ae92..9bf6e0334d 100644
> --- a/arch/arm/boards/raspberry-pi/rpi-common.c
> +++ b/arch/arm/boards/raspberry-pi/rpi-common.c
> @@ -24,6 +24,7 @@
>  #include <globalvar.h>
>  #include <asm/system_info.h>
>  #include <reset_source.h>
> +#include <dt-bindings/gpio/gpio.h>
>  
>  #include <mach/core.h>
>  #include <mach/mbox.h>
> @@ -45,19 +46,21 @@ static const char * const boot_mode_names[] = {
>  	[0x7] = "http",
>  };
>  
> -struct rpi_priv;
>  struct rpi_machine_data {
> -	int (*init)(struct rpi_priv *priv);
>  	u8 hw_id;
>  #define RPI_OLD_SCHEMA			BIT(0)
> +#define RPI_SET_ETHADDR			BIT(1)
> +#define RPI_SET_USB_OTG			BIT(2)
> +#define RPI_LED_PWR_INV			BIT(3)
> +#define RPI_LED_PWR_EXP			BIT(4)
> +#define RPI_LED_ACT_INV			BIT(5)
> +#define RPI_LED_ACT_EXP			BIT(6)
> +#define RPI_LED_ANY_EXP			(RPI_LED_PWR_EXP | RPI_LED_ACT_EXP)
> +#define RPI_LED_PWR_EXP_INV		(RPI_LED_PWR_EXP | RPI_LED_PWR_INV)
> +#define RPI_LED_ACT_EXP_INV		(RPI_LED_ACT_EXP | RPI_LED_ACT_INV)
>  	u8 flags;
> -};
> -
> -struct rpi_priv {
> -	struct device *dev;
> -	const struct rpi_machine_data *dcfg;
> -	unsigned int hw_id;
> -	const char *name;
> +	int pwr_led_gpio;
> +	int act_led_gpio;
>  };
>  
>  static void rpi_set_serial_number(void)
> @@ -83,91 +86,74 @@ static void rpi_set_ethaddr(void)
>  	eth_register_ethaddr(0, mac);
>  }
>  
> -static void rpi_set_usbotg(const char *alias)
> +static void rpi_set_usbotg(void)
>  {
>  	struct device_node *usb;
>  
> -	usb = of_find_node_by_alias(NULL, alias);
> +	usb = of_find_node_by_alias(NULL, "usb0");
>  	if (usb)
>  		of_property_write_string(usb, "dr_mode", "otg");
>  }
>  
> -static struct gpio_led rpi_leds[] = {
> -	{
> -		.gpio	= -EINVAL,
> -		.led	= {
> -			.name = "ACT",
> -		},
> -	}, {
> -		.gpio	= -EINVAL,
> -		.led	= {
> -			.name = "PWR",
> -		},
> -	},
> -};
> -
> -static void rpi_add_led(void)
> +static int of_rpi_led_set_gpio(struct device_node *led, u32 pin,
> +				bool exp, bool inv)
>  {
> -	int i;
> -	struct gpio_led *l;
> -
> -	for (i = 0; i < ARRAY_SIZE(rpi_leds); i++) {
> -		l = &rpi_leds[i];
> -
> -		if (gpio_is_valid(l->gpio))
> -			led_gpio_register(l);
> -	}
> -
> -	l = &rpi_leds[0];
> -	if (gpio_is_valid(l->gpio))
> -		led_set_trigger(LED_TRIGGER_HEARTBEAT, &l->led);
> -}
> +	u32 gpios_prop[3];
> +	struct device_node *gpio;
>  
> -static int rpi_b_init(struct rpi_priv *priv)
> -{
> -	rpi_leds[0].gpio = 16;
> -	rpi_leds[0].active_low = 1;
> -	rpi_set_ethaddr();
> -
> -	return 0;
> -}
> -
> -static int rpi_b_plus_init(struct rpi_priv *priv)
> -{
> -	rpi_leds[0].gpio = 47;
> -	rpi_leds[1].gpio = 35;
> -	rpi_set_ethaddr();
> +	if (!led)
> +		return -ENODEV;
>  
> -	return 0;
> -}
> +	gpio = of_find_node_by_alias(NULL, exp ? "expgpio0" : "gpio0");
> +	if (!gpio)
> +		return -ENODEV;
>  
> -static int rpi_0_init(struct rpi_priv *priv)
> -{
> -	rpi_leds[0].gpio = 47;
> -	rpi_set_usbotg("usb0");
> +	gpios_prop[0] = gpio->phandle;
> +	gpios_prop[1] = pin;
> +	gpios_prop[2] = inv ? GPIO_ACTIVE_LOW : GPIO_ACTIVE_HIGH;
>  
> -	return 0;
> +	return of_property_write_u32_array(led, "gpios", gpios_prop, 3);
>  }
>  
> -static int rpi_0_w_init(struct rpi_priv *priv)
> +static void rpi_add_leds(const struct rpi_machine_data *dcfg)
>  {
> -	struct device_node *np;
> -	int ret;
> +	int flags, led_pwr, led_act, led_cnt;
> +	struct device_node *leds, *l;
>  
> -	rpi_0_init(priv);
> +	if (!IS_ENABLED(CONFIG_OFDEVICE) || !IS_ENABLED(CONFIG_LED_GPIO_OF))
> +		return;
>  
> -	np = of_find_node_by_path("/chosen");
> -	if (!np)
> -		return -ENODEV;
> +	leds = of_find_node_by_path("/leds");
> +	if (!leds)
> +		return;
>  
> -	if (!of_device_enable_and_register_by_alias("serial1"))
> -		return -ENODEV;
> +	led_cnt = 0;
> +	flags = dcfg->flags;
> +	led_pwr = dcfg->pwr_led_gpio;
> +	led_act = dcfg->act_led_gpio;
> +
> +	l = of_get_child_by_name(leds, "led-pwr");
> +	if (l) {
> +		if (led_pwr >= 0 && !of_rpi_led_set_gpio(l, led_pwr,
> +						flags & RPI_LED_PWR_EXP,
> +						flags & RPI_LED_PWR_INV))
> +			led_cnt++;
> +		else
> +			of_delete_node(l);
> +	}
>  
> -	ret = of_property_write_string(np, "stdout-path", "serial1:115200n8");
> -	if (ret)
> -		return ret;
> +	l = of_get_child_by_name(leds, "led-act");
> +	if (l) {
> +		if (led_act >= 0 && !of_rpi_led_set_gpio(l, led_act,
> +						flags & RPI_LED_ACT_EXP,
> +						flags & RPI_LED_ACT_INV))
> +			led_cnt++;
> +		else
> +			of_delete_node(l);
> +	}
>  
> -	return of_device_disable_by_alias("serial0");
> +	if (led_cnt)
> +		of_device_enable_and_register(leds);
>  }
>  
>  static int rpi_mem_init(void)
> @@ -213,6 +199,7 @@ static int rpi_env_init(void)
>  
>  	return 0;
>  }
> +late_initcall(rpi_env_init);
>  
>  /* Some string properties in fdt passed to us from vc may be
>   * malformed by not being null terminated, so just create and
> @@ -390,15 +377,22 @@ static void rpi_set_kernel_name(void) {
>  	}
>  }
>  
> -static const struct rpi_machine_data *rpi_get_dcfg(struct rpi_priv *priv)
> +static void rpi_set_hostname(struct device_d *dev)
>  {
> -	const struct rpi_machine_data *dcfg;
> +	const char *name, *ptr;
> +	char *hostname;
>  
> -	dcfg = of_device_get_match_data(priv->dev);
> -	if (!dcfg) {
> -		dev_err(priv->dev, "Unknown board. Not applying fixups\n");
> -		return NULL;
> -	}
> +	name = of_device_get_match_compatible(dev);
> +	ptr = strchr(name, ',');
> +	hostname = basprintf("rpi-%s", ptr ? ptr + 1 : name);
> +	barebox_set_hostname(hostname);
> +	free(hostname);
> +}
> +
> +static const struct rpi_machine_data *rpi_get_dcfg(const struct rpi_machine_data *dcfg)
> +{
> +	int ret;
> +	u32 board_rev;
>  
>  	/* Comments from u-boot:
>  	 * For details of old-vs-new scheme, see:
> @@ -412,22 +406,26 @@ static const struct rpi_machine_data *rpi_get_dcfg(struct rpi_priv *priv)
>  	 * http://www.raspberrypi.org/forums/viewtopic.php?f=31&t=20594
>  	 */
>  
> +	ret = rpi_get_board_rev();
> +	if (ret < 0)
> +		return ERR_PTR(ret);
> +	board_rev = ret;
> +
>  	for (; dcfg->hw_id != U8_MAX; dcfg++) {
> -		if (priv->hw_id & 0x800000) {
> -			if (dcfg->hw_id != ((priv->hw_id >> 4) & 0xff))
> +		if (board_rev & BIT(23)) {
> +			if (dcfg->hw_id != ((board_rev >> 4) & 0xff))
>  				continue;
>  		} else {
>  			if (!(dcfg->flags & RPI_OLD_SCHEMA))
>  				continue;
> -			if (dcfg->hw_id != (priv->hw_id & 0xff))
> +			if (dcfg->hw_id != (board_rev & 0xff))
>  				continue;
>  		}
>  
>  		return dcfg;
>  	}
>  
> -	dev_err(priv->dev, "dcfg 0x%x for board_id doesn't match DT compatible\n",
> -		priv->hw_id);
> +	pr_err("dcfg 0x%x for board_id doesn't match DT compatible\n", board_rev);
>  	return ERR_PTR(-ENODEV);
>  }
>  
> @@ -435,42 +433,32 @@ static int rpi_devices_probe(struct device *dev)
>  {
>  	const struct rpi_machine_data *dcfg;
>  	struct regulator *reg;
> -	struct rpi_priv *priv;
> -	const char *name, *ptr;
> -	char *hostname;
> -	int ret;
>  
> -	priv = xzalloc(sizeof(*priv));
> -	priv->dev = dev;
> +	dcfg = of_device_get_match_data(dev);
> +	if (!dcfg)
> +		dev_err(dev, "Unknown board, not applying fixups\n");
> +	else {
> +		dcfg = rpi_get_dcfg(dcfg);
> +		if (IS_ERR(dcfg))
> +			return PTR_ERR(dcfg);
>  
> -	ret = rpi_get_board_rev();
> -	if (ret < 0)
> -		goto free_priv;
> +		rpi_add_leds(dcfg);
>  
> -	priv->hw_id = ret;
> +		if (dcfg->flags & RPI_SET_ETHADDR)
> +			rpi_set_ethaddr();
>  
> -	dcfg = rpi_get_dcfg(priv);
> -	if (IS_ERR(dcfg))
> -		goto free_priv;
> +		if (dcfg->flags & RPI_SET_USB_OTG)
> +			rpi_set_usbotg();
> +	}
>  
> -	rpi_set_serial_number();
>  
> -	/* construct short recognizable host name */
> -	name = of_device_get_match_compatible(priv->dev);
> -	ptr = strchr(name, ',');
> -	hostname = basprintf("rpi-%s", ptr ? ptr + 1 : name);
> -	barebox_set_hostname(hostname);
> -	free(hostname);
> +	rpi_set_serial_number();
> +	rpi_set_hostname(dev);
> +	rpi_set_kernel_name();
>  
> -	rpi_add_led();
>  	bcm2835_register_fb();
>  	armlinux_set_architecture(MACH_TYPE_BCM2708);
> -	rpi_env_init();
>  	rpi_vc_fdt();
> -	rpi_set_kernel_name();
> -
> -	if (dcfg && dcfg->init)
> -		dcfg->init(priv);
>  
>  	reg = regulator_get_name("bcm2835_usb");
>  	if (IS_ERR(reg))
> @@ -479,134 +467,95 @@ static int rpi_devices_probe(struct device *dev)
>  	regulator_enable(reg);
>  
>  	return 0;
> -
> -free_priv:
> -	kfree(priv);
> -	return ret;
>  }
>  
> +#define RPI_ENTRY(_id, _pwr, _act, _flags)	\
> +	{					\
> +		.hw_id = _id,			\
> +		.pwr_led_gpio = _pwr,		\
> +		.act_led_gpio = _act,		\
> +		.flags = _flags,		\
> +	}
> +
> +#define RPI_ENTRY_OLD(_id, _pwr, _act, _flags)	\
> +	RPI_ENTRY(_id, _pwr, _act, (_flags) | RPI_OLD_SCHEMA)
> +
> +#if IS_ENABLED(CONFIG_MACH_RPI)
>  static const struct rpi_machine_data rpi_1_ids[] = {
> -	{
> -		.hw_id = BCM2835_BOARD_REV_A_7,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_A_8,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_A_9,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_A,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_A_PLUS_12,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_A_PLUS_15,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_A_PLUS,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_I2C1_4,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_I2C1_5,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_I2C1_6,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_I2C0_2,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_I2C0_3,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_REV2_d,
> -		.flags = RPI_OLD_SCHEMA,
> -		.init = rpi_b_init,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_REV2_e,
> -		.flags = RPI_OLD_SCHEMA,
> -		.init = rpi_b_init,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_REV2_f,
> -		.flags = RPI_OLD_SCHEMA,
> -		.init = rpi_b_init,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_PLUS_10,
> -		.flags = RPI_OLD_SCHEMA,
> -		.init = rpi_b_plus_init,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_PLUS_13,
> -		.flags = RPI_OLD_SCHEMA,
> -		.init = rpi_b_plus_init,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_B_PLUS,
> -		.init = rpi_b_plus_init,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_CM_11,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_CM_14,
> -		.flags = RPI_OLD_SCHEMA,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_CM1,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_ZERO,
> -		.init = rpi_0_init,
> -	}, {
> -		.hw_id = BCM2835_BOARD_REV_ZERO_W,
> -		.init = rpi_0_w_init,
> -	}, {
> -		.hw_id = U8_MAX
> -	},
> +	/*
> +	 * New style of revision codes schemas
> +	 * Let's keep those first since they are probably more common
> +	 */
> +	RPI_ENTRY(BCM2835_BOARD_REV_A,      -1, 16, RPI_LED_ACT_INV),
> +	RPI_ENTRY(BCM2835_BOARD_REV_A_PLUS, 35, 47, RPI_LED_ACT_INV),
> +	RPI_ENTRY(BCM2835_BOARD_REV_B,      -1, 16, RPI_LED_ACT_INV | RPI_SET_ETHADDR),
> +	RPI_ENTRY(BCM2835_BOARD_REV_B_PLUS, 35, 47, RPI_SET_ETHADDR),
> +	RPI_ENTRY(BCM2835_BOARD_REV_CM1,    -1, 47, RPI_LED_ACT_INV),
> +	RPI_ENTRY(BCM2835_BOARD_REV_ZERO,   -1, 47, RPI_SET_USB_OTG),
> +	RPI_ENTRY(BCM2835_BOARD_REV_ZERO_W, -1, 47, RPI_SET_USB_OTG | RPI_LED_ACT_INV),
> +	/*
> +	 * Old style of revision codes
> +	 */
> +	/* Raspberry Pi A */
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_A_7, -1, 16, RPI_LED_ACT_INV),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_A_8, -1, 16, RPI_LED_ACT_INV),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_A_9, -1, 16, RPI_LED_ACT_INV),
> +	/* Raspberry Pi A+ */
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_A_PLUS_12, 35, 47, RPI_LED_ACT_INV),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_A_PLUS_15, 35, 47, RPI_LED_ACT_INV),
> +	/* Raspberry Pi B */
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_I2C1_4, -1, 16, RPI_LED_ACT_INV | RPI_SET_ETHADDR),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_I2C1_5, -1, 16, RPI_LED_ACT_INV | RPI_SET_ETHADDR),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_I2C1_6, -1, 16, RPI_LED_ACT_INV | RPI_SET_ETHADDR),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_I2C0_2, -1, 16, RPI_LED_ACT_INV | RPI_SET_ETHADDR),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_I2C0_3, -1, 16, RPI_LED_ACT_INV | RPI_SET_ETHADDR),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_REV2_d, -1, 16, RPI_LED_ACT_INV | RPI_SET_ETHADDR),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_REV2_e, -1, 16, RPI_LED_ACT_INV | RPI_SET_ETHADDR),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_REV2_f, -1, 16, RPI_LED_ACT_INV | RPI_SET_ETHADDR),
> +	/* Raspberry Pi B+ */
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_PLUS_10, 35, 47, RPI_SET_ETHADDR),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_B_PLUS_13, 35, 47, RPI_SET_ETHADDR),
> +	/* Raspberry Pi CM1 */
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_CM_11, -1, 47, RPI_LED_ACT_INV),
> +	RPI_ENTRY_OLD(BCM2835_BOARD_REV_CM_14, -1, 47, RPI_LED_ACT_INV),
> +	/* sentinel */
> +	{ .hw_id = U8_MAX }
>  };
> +#endif
>  
> +#if IS_ENABLED(CONFIG_MACH_RPI2)
>  static const struct rpi_machine_data rpi_2_ids[] = {
> -	{
> -		.hw_id = BCM2836_BOARD_REV_2_B,
> -		.init = rpi_b_plus_init,
> -	}, {
> -		.hw_id = U8_MAX
> -	},
> +	RPI_ENTRY(BCM2836_BOARD_REV_2_B, 35, 47, RPI_SET_ETHADDR),
> +	/* sentinel */
> +	{ .hw_id = U8_MAX }
>  };
> +#endif
>  
> +#if IS_ENABLED(CONFIG_MACH_RPI3) | IS_ENABLED(CONFIG_MACH_RPI_CM3)
>  static const struct rpi_machine_data rpi_3_ids[] = {
> -	{
> -		.hw_id = BCM2837B0_BOARD_REV_3A_PLUS,
> -		.init = rpi_b_plus_init,
> -	}, {
> -		.hw_id = BCM2837_BOARD_REV_3_B,
> -		.init = rpi_b_init,
> -	}, {
> -		.hw_id = BCM2837B0_BOARD_REV_3B_PLUS,
> -		.init = rpi_b_plus_init,
> -	}, {
> -		.hw_id = BCM2837_BOARD_REV_CM3,
> -	}, {
> -		.hw_id = BCM2837B0_BOARD_REV_CM3_PLUS,
> -	}, {
> -		.hw_id = BCM2837B0_BOARD_REV_ZERO_2,
> -	}, {
> -		.hw_id = U8_MAX
> -	},
> +	RPI_ENTRY(BCM2837B0_BOARD_REV_3A_PLUS,   2, 29, RPI_LED_PWR_EXP_INV),
> +	RPI_ENTRY(BCM2837_BOARD_REV_3_B,        -1,  2, RPI_SET_ETHADDR | RPI_LED_ACT_EXP),
> +	RPI_ENTRY(BCM2837B0_BOARD_REV_3B_PLUS,   2, 29, RPI_SET_ETHADDR | RPI_LED_PWR_EXP_INV),
> +	RPI_ENTRY(BCM2837_BOARD_REV_CM3,        -1, -1, 0),
> +	RPI_ENTRY(BCM2837B0_BOARD_REV_CM3_PLUS, -1, -1, 0),
> +	RPI_ENTRY(BCM2837B0_BOARD_REV_ZERO_2,   -1, 29, RPI_LED_ACT_INV | RPI_SET_USB_OTG),
> +	/* sentinel */
> +	{ .hw_id = U8_MAX }
>  };
> +#endif
>  
> +#if IS_ENABLED(CONFIG_MACH_RPI4)
>  static const struct rpi_machine_data rpi_4_ids[] = {
> -	{
> -		.hw_id = BCM2711_BOARD_REV_4_B,
> -	}, {
> -		.hw_id = BCM2711_BOARD_REV_400,
> -	}, {
> -		.hw_id = BCM2711_BOARD_REV_CM4,
> -	}, {
> -		.hw_id = U8_MAX
> -	},
> +	RPI_ENTRY(BCM2711_BOARD_REV_4_B,  2, 42, RPI_LED_PWR_EXP_INV | RPI_SET_ETHADDR),
> +	RPI_ENTRY(BCM2711_BOARD_REV_400, 42, -1, RPI_SET_ETHADDR),
> +	RPI_ENTRY(BCM2711_BOARD_REV_CM4,  2, 42, RPI_LED_PWR_EXP_INV | RPI_SET_ETHADDR),
> +	/* sentinel */
> +	{ .hw_id = U8_MAX }
>  };
> +#endif
>  
>  static const struct of_device_id rpi_of_match[] = {
> +#if IS_ENABLED(CONFIG_MACH_RPI)
>  	/* BCM2835 based Boards */
>  	{ .compatible = "raspberrypi,model-a", .data = rpi_1_ids },
>  	{ .compatible = "raspberrypi,model-a-plus", .data = rpi_1_ids },
> @@ -618,23 +567,28 @@ static const struct of_device_id rpi_of_match[] = {
>  	{ .compatible = "raspberrypi,compute-module", .data = rpi_1_ids },
>  	{ .compatible = "raspberrypi,model-zero", .data = rpi_1_ids },
>  	{ .compatible = "raspberrypi,model-zero-w", .data = rpi_1_ids },
> -
> +#endif
> +#if IS_ENABLED(CONFIG_MACH_RPI2)
>  	/* BCM2836 based Boards */
>  	{ .compatible = "raspberrypi,2-model-b", .data = rpi_2_ids },
> -
> +#endif
> +#if IS_ENABLED(CONFIG_MACH_RPI3)
>  	/* BCM2837 based Boards */
>  	{ .compatible = "raspberrypi,3-model-a-plus", .data = rpi_3_ids },
>  	{ .compatible = "raspberrypi,3-model-b", .data = rpi_3_ids },
>  	{ .compatible = "raspberrypi,3-model-b-plus", .data = rpi_3_ids },
>  	{ .compatible = "raspberrypi,model-zero-2-w", .data = rpi_3_ids },
> +#endif
> +#if IS_ENABLED(CONFIG_MACH_RPI_CM3)
>  	{ .compatible = "raspberrypi,3-compute-module", .data = rpi_3_ids },
>  	{ .compatible = "raspberrypi,3-compute-module-lite", .data = rpi_3_ids },
> -
> +#endif
> +#if IS_ENABLED(CONFIG_MACH_RPI4)
>  	/* BCM2711 based Boards */
>  	{ .compatible = "raspberrypi,4-model-b", .data = rpi_4_ids },
>  	{ .compatible = "raspberrypi,4-compute-module", .data = rpi_4_ids },
>  	{ .compatible = "raspberrypi,400", .data = rpi_4_ids },
> -
> +#endif
>  	{ /* sentinel */ },
>  };
>  BAREBOX_DEEP_PROBE_ENABLE(rpi_of_match);
> @@ -644,4 +598,4 @@ static struct driver rpi_board_driver = {
>  	.probe = rpi_devices_probe,
>  	.of_compatible = DRV_OF_COMPAT(rpi_of_match),
>  };
> -late_platform_driver(rpi_board_driver);
> +coredevice_platform_driver(rpi_board_driver);
> diff --git a/arch/arm/dts/bcm2711-rpi-4.dts b/arch/arm/dts/bcm2711-rpi-4.dts
> index 3c0caa73f8..e61514b236 100644
> --- a/arch/arm/dts/bcm2711-rpi-4.dts
> +++ b/arch/arm/dts/bcm2711-rpi-4.dts
> @@ -1,5 +1,10 @@
>  #include <arm64/broadcom/bcm2711-rpi-4-b.dts>
>  
> +&{/aliases} {
> +	gpio0 = &gpio;
> +	expgpio0 = &expgpio;
> +};
> +
>  &{/memory at 0} {
>  	reg = <0x0 0x0 0x0>;
>  };
> diff --git a/arch/arm/dts/bcm2835-rpi.dts b/arch/arm/dts/bcm2835-rpi.dts
> index 8d352a457d..f403b5485c 100644
> --- a/arch/arm/dts/bcm2835-rpi.dts
> +++ b/arch/arm/dts/bcm2835-rpi.dts
> @@ -2,6 +2,7 @@
>  
>  &{/aliases} {
>  	usb0 = &usb;
> +	gpio0 = &gpio;
>  };
>  
>  &{/memory at 0} {
> diff --git a/arch/arm/dts/bcm2836-rpi-2.dts b/arch/arm/dts/bcm2836-rpi-2.dts
> index c9106515ee..f211445e3b 100644
> --- a/arch/arm/dts/bcm2836-rpi-2.dts
> +++ b/arch/arm/dts/bcm2836-rpi-2.dts
> @@ -1,5 +1,9 @@
>  #include <arm/bcm2836-rpi-2-b.dts>
>  
> +&{/aliases} {
> +	gpio0 = &gpio;
> +};
> +
>  &{/memory at 0} {
>  	reg = <0x0 0x0>;
>  };
> diff --git a/arch/arm/dts/bcm2837-rpi-3.dts b/arch/arm/dts/bcm2837-rpi-3.dts
> index 38d673aec4..588b77cd78 100644
> --- a/arch/arm/dts/bcm2837-rpi-3.dts
> +++ b/arch/arm/dts/bcm2837-rpi-3.dts
> @@ -1,5 +1,10 @@
>  #include <arm64/broadcom/bcm2837-rpi-3-b.dts>
>  
> +&{/aliases} {
> +	gpio0 = &gpio;
> +	expgpio0 = &expgpio;
> +};
> +
>  &{/memory at 0} {
>  	reg = <0x0 0x0>;
>  };
> -- 
> 2.34.1
> 
> 
> 



More information about the barebox mailing list