diff mbox series

[8/8] ARM: imx6: Adapt device tree selection in DH board file

Message ID 20220519110837.245488-9-pro@denx.de
State Superseded
Delegated to: Stefano Babic
Headers show
Series ARM: imx: Add support for iMX6QDL DHCOM DRC02 and DH picoITX | expand

Commit Message

Philip Oberfichtner May 19, 2022, 11:08 a.m. UTC
Before this commit device tree selection could rely solely on
differentiating the iMX6 processor variant Q and DL. After adding two new
carrier boards, the DRC02 and the picoITX, the interchangeability of SoMs
makes this approach infeasible.

It is now required to specify the carrier board (dhcom-drc02,
dhcom-picoitx or dhcom-pdk2) at compile time using
CONFIG_DEFAULT_DEVICETREE. The SoM is determined at runtime as before.

Signed-off-by: Philip Oberfichtner <pro@denx.de>
---

 board/dhelectronics/dh_imx6/dh_imx6.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

Comments

Fabio Estevam May 19, 2022, 12:48 p.m. UTC | #1
On 19/05/2022 08:08, Philip Oberfichtner wrote:
		return 0;
> -	}
> +	/* Determine carrier board at compile time and SoM at runtime */
> +	const size_t size = 32;
> +	char *car, *som, dt[size];
> +
> +	car = strchr(CONFIG_DEFAULT_DEVICE_TREE, '-'); /* i.e. -dhcom-drc02 
> */
> +
> +	som = is_mx6dq()   ? "imx6q"  :
> +	      is_mx6dl()   ? "imx6dl" :
> +	      is_mx6solo() ? "imx6s"  : NULL;
> +
> +	if (!(car && som))
> +		return -1;

Nit: can you return -EINVAL instead of -1?
Marek Vasut May 19, 2022, 12:57 p.m. UTC | #2
On 5/19/22 13:08, Philip Oberfichtner wrote:
> Before this commit device tree selection could rely solely on
> differentiating the iMX6 processor variant Q and DL. After adding two new
> carrier boards, the DRC02 and the picoITX, the interchangeability of SoMs
> makes this approach infeasible.
> 
> It is now required to specify the carrier board (dhcom-drc02,
> dhcom-picoitx or dhcom-pdk2) at compile time using
> CONFIG_DEFAULT_DEVICETREE. The SoM is determined at runtime as before.
> 
> Signed-off-by: Philip Oberfichtner <pro@denx.de>
> ---
> 
>   board/dhelectronics/dh_imx6/dh_imx6.c | 22 ++++++++++++++--------
>   1 file changed, 14 insertions(+), 8 deletions(-)
> 
> diff --git a/board/dhelectronics/dh_imx6/dh_imx6.c b/board/dhelectronics/dh_imx6/dh_imx6.c
> index 6059f96e80..c63fc1dd8a 100644
> --- a/board/dhelectronics/dh_imx6/dh_imx6.c
> +++ b/board/dhelectronics/dh_imx6/dh_imx6.c
> @@ -227,14 +227,20 @@ int checkboard(void)
>   #ifdef CONFIG_MULTI_DTB_FIT
>   int board_fit_config_name_match(const char *name)
>   {
> -	if (is_mx6dq()) {
> -		if (!strcmp(name, "imx6q-dhcom-pdk2"))
> -			return 0;
> -	} else if (is_mx6sdl()) {

Careful here ^ is_mx6sdl() matches on Solo and DualLite.

> -		if (!strcmp(name, "imx6dl-dhcom-pdk2"))
> -			return 0;
> -	}
> +	/* Determine carrier board at compile time and SoM at runtime */
> +	const size_t size = 32;
> +	char *car, *som, dt[size];
> +
> +	car = strchr(CONFIG_DEFAULT_DEVICE_TREE, '-'); /* i.e. -dhcom-drc02 */
> +
> +	som = is_mx6dq()   ? "imx6q"  :
> +	      is_mx6dl()   ? "imx6dl" :
> +	      is_mx6solo() ? "imx6s"  : NULL;
> +
> +	if (!(car && som))
> +		return -1;
>   
> -	return -1;
> +	snprintf(dt, size, "%s%s", som, car);
> +	return strcmp(name, dt);

This will break imx6s-dhcom-pdk2 , which used the imx6dl-dhcom-pdk2 DT 
which was fine, because U-Boot is single core anyway.

Try something like this:

/* Test SoC prefix */
if (is_mx6dq()) {
	if (strncmp(name, "imx6q-"))
		return -1;
} else if (is_mx6sdl()) {
	if (strncmp(name, "imx6s-") && strncmp(name, "imx6dl-"))
		return -1;
}

/* Test board suffix */
a = strchr(CONFIG_DEFAULT_DEVICE_TREE, '-'); /* i.e. -dhcom-drc02 */
b = strchr(name, '-'); /* i.e. -dhcom-drc02 */

return strcmp(a, b) ? -1 : 0;

I _think_ that should work and cover all combinations. (and of course, 
pick better variable names than a,b)
diff mbox series

Patch

diff --git a/board/dhelectronics/dh_imx6/dh_imx6.c b/board/dhelectronics/dh_imx6/dh_imx6.c
index 6059f96e80..c63fc1dd8a 100644
--- a/board/dhelectronics/dh_imx6/dh_imx6.c
+++ b/board/dhelectronics/dh_imx6/dh_imx6.c
@@ -227,14 +227,20 @@  int checkboard(void)
 #ifdef CONFIG_MULTI_DTB_FIT
 int board_fit_config_name_match(const char *name)
 {
-	if (is_mx6dq()) {
-		if (!strcmp(name, "imx6q-dhcom-pdk2"))
-			return 0;
-	} else if (is_mx6sdl()) {
-		if (!strcmp(name, "imx6dl-dhcom-pdk2"))
-			return 0;
-	}
+	/* Determine carrier board at compile time and SoM at runtime */
+	const size_t size = 32;
+	char *car, *som, dt[size];
+
+	car = strchr(CONFIG_DEFAULT_DEVICE_TREE, '-'); /* i.e. -dhcom-drc02 */
+
+	som = is_mx6dq()   ? "imx6q"  :
+	      is_mx6dl()   ? "imx6dl" :
+	      is_mx6solo() ? "imx6s"  : NULL;
+
+	if (!(car && som))
+		return -1;
 
-	return -1;
+	snprintf(dt, size, "%s%s", som, car);
+	return strcmp(name, dt);
 }
 #endif