[PATCH] mach-snapdragon: Move APQ8016 SoC derived board code

Caleb Connolly caleb.connolly at linaro.org
Thu Jan 4 13:30:46 CET 2024


Hi Sumit,

On 03/01/2024 13:07, Sumit Garg wrote:
> In order to avoid duplication of APQ8016 derived boards specific code,
> move common bits like USB pinctrl and fastboot to board-apq8016.c file.
> This will allow future board support like SE HMIBSC board etc to reuse it.

You still haven't demonstrated a justification for having the HMIBSD
board NOT simply point to board/qualcomm/dragonboard410c. Do you have a
branch with additional features where it clearly makes sense to have a
separate board directory?
> 
> Signed-off-by: Sumit Garg <sumit.garg at linaro.org>
> ---
> 
> This patch is based on Caleb's Qcom common target branch [1]. As per
> Caleb's comments here [2], there is no scope for people to add board
> code for new board support. And even people can't reuse existing board
> code like for db410c for further new board support but rather they have
> to make db410c generic first.
> 
> I fear this would be couter productive and motivate OEM vendors (which
> aren't Qcom reference designs) to keep their board support code
> downstream. 

This is the same argument made by those defending mach-* code in Linux.
What I'm advocating for here is that we spend just a little more time
doing things right, so that when the next vendor, or next gen board
comes along we aren't copy/pasting board files.

> IMO, the approach should be to allow board code reuse which
> this patch is all about. 

Board code reuse is exactly what I want, just that we do our due
diligence in not blindly putting code behind arbitrary compile-time
configuration.

> The next steps should be to make the underlying
> board features to rather come from DT but that as you know requires
> bindings to be accepted first.

We can have non-standard DT if we *need* to, I would prefer that over
this board code because then there's at least an obvious path forwards.
In fact this is exactly what the below USB role switching code does, I
already put the work in to make it generic (before it literally found
the GPIO device and set specific GPIO pins).

Below I have outlined the changes that would be necessary to have the
functionality here built in for all mach-snapdragon boards, so this
whole SOC_APQ8016 thing can be dropped. It's ridiculous to gate this
code behind a particular SoC when none of it is SoC specific.

> 
> Tom, Simon,
> 
> Is there any U-Boot policy in regards to board code going forward? Are
> we moving in a direction to get rid of most board specific stubs from
> generic U-Boot code?
> 
> [1] https://source.denx.de/u-boot/custodians/u-boot-snapdragon/-/commits/b4%2Fqcom-common-target
> [2] https://lore.kernel.org/all/824be245-60c9-4a1a-a386-be765e8eba91@linaro.org/
> 
>  arch/arm/mach-snapdragon/Kconfig              |  5 ++
>  arch/arm/mach-snapdragon/Makefile             |  1 +
>  arch/arm/mach-snapdragon/board-apq8016.c      | 64 +++++++++++++++++++
>  .../dragonboard410c/dragonboard410c.c         | 62 ------------------
>  configs/dragonboard410c_defconfig             |  1 +
>  5 files changed, 71 insertions(+), 62 deletions(-)
>  create mode 100644 arch/arm/mach-snapdragon/board-apq8016.c
> 
> diff --git a/arch/arm/mach-snapdragon/Kconfig b/arch/arm/mach-snapdragon/Kconfig
> index 96e44e2c549..8069a89bf78 100644
> --- a/arch/arm/mach-snapdragon/Kconfig
> +++ b/arch/arm/mach-snapdragon/Kconfig
> @@ -3,6 +3,11 @@ if ARCH_SNAPDRAGON
>  config SYS_SOC
>  	default "snapdragon"
>  
> +config SOC_APQ8016
> +	bool "APQ8016"
> +	help
> +	  Select this if your SoC is an APQ8016
> +
>  config SYS_VENDOR
>  	default "qualcomm"
>  
> diff --git a/arch/arm/mach-snapdragon/Makefile b/arch/arm/mach-snapdragon/Makefile
> index 857171e593d..7d210e6d872 100644
> --- a/arch/arm/mach-snapdragon/Makefile
> +++ b/arch/arm/mach-snapdragon/Makefile
> @@ -3,3 +3,4 @@
>  # (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski at gmail.com>
>  
>  obj-y += board.o
> +obj-$(CONFIG_SOC_APQ8016) += board-apq8016.o
> diff --git a/arch/arm/mach-snapdragon/board-apq8016.c b/arch/arm/mach-snapdragon/board-apq8016.c
> new file mode 100644
> index 00000000000..bb9a3a9f0fb
> --- /dev/null
> +++ b/arch/arm/mach-snapdragon/board-apq8016.c
> @@ -0,0 +1,64 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Board init file for APQ8016 SoC derived boards
> + *
> + * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski at gmail.com>
> + */
> +
> +#include <button.h>
> +#include <dm.h>
> +#include <dm/pinctrl.h>
> +#include <env.h>
> +#include <init.h>
> +#include <usb.h>
> +#include <fdt_support.h>
> +
> +int board_usb_init(int index, enum usb_init_type init)

This function can trivially be made generic, in such a way that it could
be done for all mach-snapdragon devices:
> +{
> +	struct udevice *usb;
> +	int ret = 0;
> +
> +	/* USB device */
> +	ret = device_find_global_by_ofnode(ofnode_path("/soc/usb"), &usb);

Instead do:
	ret = uclass_find_device_by_seq(UCLASS_USB, index, &usb);
> +	if (ret) {
> +		printf("Cannot find USB device\n");
> +		return ret;
> +	}

Here we must check to see if the "device" pinctrl exists, use this as a
litmus test to see if this board needs pinctrl state changes

	ret = dev_read_stringlist_search(usb, "pinctrl-names",
					 "device");
	/* No "device" pinctrl state, so just bail */
	if (ret < 0)
		return 0;
> +
> +	/* Select "default" or "device" pinctrl */
> +	switch (init) {
> +	case USB_INIT_HOST:
> +		pinctrl_select_state(usb, "default");
> +		break;
> +	case USB_INIT_DEVICE:
> +		pinctrl_select_state(usb, "device");
> +		break;
> +	default:
> +		debug("Unknown usb_init_type %d\n", init);
> +		break;
> +	}
> +
> +	return 0;
> +}
> +
> +/* Check for vol- button - if pressed - stop autoboot */
> +int misc_init_r(void)

As I said before, this code only exists because U-Boot's "autoboot"
implementation hasn't been updated with good button support, this is
also a fairly simple fix and would benefit all the boards, not just
Qualcomm.

If you really don't have the time of experience to implement such a
feature, and this is really such a blocker for your board support, then
that is a totally different class of issue which we can find a solution to.
> +{
> +	struct udevice *btn;
> +	int ret;
> +	enum button_state_t state;
> +
> +	ret = button_get_by_label("vol_down", &btn);
> +	if (ret < 0) {
> +		printf("Couldn't find power button!\n");
> +		return ret;
> +	}
> +
> +	state = button_get_state(btn);
> +	if (state == BUTTON_ON) {
> +		env_set("preboot", "setenv preboot; fastboot 0");
> +		printf("vol_down pressed - Starting fastboot.\n");
> +	}
> +
> +	return 0;
> +}
> diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
> index 2a502c7c284..f7c6a6cbc0a 100644
> --- a/board/qualcomm/dragonboard410c/dragonboard410c.c
> +++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
> @@ -5,78 +5,16 @@
>   * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski at gmail.com>
>   */
>  
> -#include <button.h>
>  #include <common.h>
> -#include <cpu_func.h>
>  #include <dm.h>
> -#include <dm/pinctrl.h>
>  #include <env.h>
>  #include <init.h>
>  #include <net.h>
> -#include <usb.h>
> -#include <asm/cache.h>
> -#include <asm/global_data.h>
> -#include <asm/gpio.h>
>  #include <fdt_support.h>
>  #include <linux/delay.h>
>  
>  #include "misc.h"
>  
> -DECLARE_GLOBAL_DATA_PTR;
> -
> -#define USB_HUB_RESET_GPIO 2
> -#define USB_SW_SELECT_GPIO 3
> -
> -int board_usb_init(int index, enum usb_init_type init)
> -{
> -	struct udevice *usb;
> -	int ret = 0;
> -
> -	/* USB device */
> -	ret = device_find_global_by_ofnode(ofnode_path("/soc/usb"), &usb);
> -	if (ret) {
> -		printf("Cannot find USB device\n");
> -		return ret;
> -	}
> -
> -	/* Select "default" or "device" pinctrl */
> -	switch (init) {
> -	case USB_INIT_HOST:
> -		pinctrl_select_state(usb, "default");
> -		break;
> -	case USB_INIT_DEVICE:
> -		pinctrl_select_state(usb, "device");
> -		break;
> -	default:
> -		debug("Unknown usb_init_type %d\n", init);
> -		break;
> -	}
> -
> -	return 0;
> -}
> -
> -/* Check for vol- button - if pressed - stop autoboot */
> -int misc_init_r(void)
> -{
> -	struct udevice *btn;
> -	int ret;
> -	enum button_state_t state;
> -
> -	ret = button_get_by_label("vol_down", &btn);
> -	if (ret < 0) {
> -		printf("Couldn't find power button!\n");
> -		return ret;
> -	}
> -
> -	state = button_get_state(btn);
> -	if (state == BUTTON_ON) {
> -		env_set("preboot", "setenv preboot; fastboot 0");
> -		printf("vol_down pressed - Starting fastboot.\n");
> -	}
> -
> -	return 0;
> -}
> -
>  int qcom_late_init(void)
>  {
>  	char serial[16];
> diff --git a/configs/dragonboard410c_defconfig b/configs/dragonboard410c_defconfig
> index 453cb9d04c7..23024066f82 100644
> --- a/configs/dragonboard410c_defconfig
> +++ b/configs/dragonboard410c_defconfig
> @@ -3,6 +3,7 @@ CONFIG_SYS_BOARD="dragonboard410c"
>  CONFIG_COUNTER_FREQUENCY=19000000
>  CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK=y
>  CONFIG_ARCH_SNAPDRAGON=y
> +CONFIG_SOC_APQ8016=y
>  CONFIG_TEXT_BASE=0x8f600000
>  CONFIG_SYS_MALLOC_LEN=0x802000
>  CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y

-- 
// Caleb (they/them)


More information about the U-Boot mailing list