diff mbox series

[2/2] board: Add support for Conclusive KSTR-SAMA5D27

Message ID 20230921153720.542101-3-artur@conclusive.pl
State Changes Requested
Delegated to: Eugen Hristev
Headers show
Series Conclusive KSTR-SAMA5D27 support | expand

Commit Message

Artur Rojek Sept. 21, 2023, 3:37 p.m. UTC
Introduce support for Conclusive KSTR-SAMA5D27 Single Board Computer.

Co-developed-by: Jakub Klama <jakub@conclusive.pl>
Signed-off-by: Jakub Klama <jakub@conclusive.pl>
Co-developed-by: Marcin Jabrzyk <marcin@conclusive.pl>
Signed-off-by: Marcin Jabrzyk <marcin@conclusive.pl>
Signed-off-by: Artur Rojek <artur@conclusive.pl>
---
 arch/arm/dts/Makefile                         |   3 +
 arch/arm/dts/at91-kstr-sama5d27.dts           | 310 ++++++++++++++++++
 arch/arm/mach-at91/Kconfig                    |  13 +
 board/conclusive/kstr-sama5d27/Kconfig        |  15 +
 board/conclusive/kstr-sama5d27/MAINTAINERS    |   8 +
 board/conclusive/kstr-sama5d27/Makefile       |   5 +
 .../conclusive/kstr-sama5d27/kstr-sama5d27.c  | 235 +++++++++++++
 configs/kstr_sama5d27_defconfig               |  79 +++++
 include/configs/kstr-sama5d27.h               |  15 +
 9 files changed, 683 insertions(+)
 create mode 100644 arch/arm/dts/at91-kstr-sama5d27.dts
 create mode 100644 board/conclusive/kstr-sama5d27/Kconfig
 create mode 100644 board/conclusive/kstr-sama5d27/MAINTAINERS
 create mode 100644 board/conclusive/kstr-sama5d27/Makefile
 create mode 100644 board/conclusive/kstr-sama5d27/kstr-sama5d27.c
 create mode 100644 configs/kstr_sama5d27_defconfig
 create mode 100644 include/configs/kstr-sama5d27.h

Comments

Eugen Hristev Sept. 22, 2023, 6:35 a.m. UTC | #1
Hello,

Thank you for your patch,

On 9/21/23 18:37, Artur Rojek wrote:
> Introduce support for Conclusive KSTR-SAMA5D27 Single Board Computer.
> 
> Co-developed-by: Jakub Klama <jakub@conclusive.pl>
> Signed-off-by: Jakub Klama <jakub@conclusive.pl>
> Co-developed-by: Marcin Jabrzyk <marcin@conclusive.pl>
> Signed-off-by: Marcin Jabrzyk <marcin@conclusive.pl>
> Signed-off-by: Artur Rojek <artur@conclusive.pl>
> ---
>   arch/arm/dts/Makefile                         |   3 +
>   arch/arm/dts/at91-kstr-sama5d27.dts           | 310 ++++++++++++++++++
>   arch/arm/mach-at91/Kconfig                    |  13 +
>   board/conclusive/kstr-sama5d27/Kconfig        |  15 +
>   board/conclusive/kstr-sama5d27/MAINTAINERS    |   8 +
>   board/conclusive/kstr-sama5d27/Makefile       |   5 +
>   .../conclusive/kstr-sama5d27/kstr-sama5d27.c  | 235 +++++++++++++
>   configs/kstr_sama5d27_defconfig               |  79 +++++
>   include/configs/kstr-sama5d27.h               |  15 +
>   9 files changed, 683 insertions(+)
>   create mode 100644 arch/arm/dts/at91-kstr-sama5d27.dts
>   create mode 100644 board/conclusive/kstr-sama5d27/Kconfig
>   create mode 100644 board/conclusive/kstr-sama5d27/MAINTAINERS
>   create mode 100644 board/conclusive/kstr-sama5d27/Makefile
>   create mode 100644 board/conclusive/kstr-sama5d27/kstr-sama5d27.c
>   create mode 100644 configs/kstr_sama5d27_defconfig
>   create mode 100644 include/configs/kstr-sama5d27.h
> 
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> index 85fd5b1157b1..8e4d33c01912 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -1198,6 +1198,9 @@ dtb-$(CONFIG_TARGET_SAMA5D27_SOM1_EK) += \
>   dtb-$(CONFIG_TARGET_SAMA5D27_WLSOM1_EK) += \
>   	at91-sama5d27_wlsom1_ek.dtb
>   
> +dtb-$(CONFIG_TARGET_KSTR_SAMA5D27) += \
> +	at91-kstr-sama5d27.dtb
> +
>   dtb-$(CONFIG_TARGET_SAMA5D2_ICP) += \
>   	at91-sama5d2_icp.dtb
>   
> diff --git a/arch/arm/dts/at91-kstr-sama5d27.dts b/arch/arm/dts/at91-kstr-sama5d27.dts
> new file mode 100644
> index 000000000000..6de918a3c964
> --- /dev/null
> +++ b/arch/arm/dts/at91-kstr-sama5d27.dts
> @@ -0,0 +1,310 @@
> +// SPDX-License-Identifier: GPL-2.0+ OR X11
> +/*
> + * at91-kstr-sama5d27.dts - Device Tree file for Conclusive KSTR-SAMA5D27 board
> + *
> + *  Copyright (C) 2019-2023 Conclusive Engineering Sp. z o. o.

SPDX tag is enough, no need to replicate the license text below

> + *
> + * This file is dual-licensed: you can use it either under the terms
> + * of the GPL or the X11 license, at your option. Note that this dual
> + * licensing only applies to this file, and not this project as a
> + * whole.
> + *
> + *  a) This file 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 file 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.
> + *
> + * Or, alternatively,
> + *
> + *  b) Permission is hereby granted, free of charge, to any person
> + *     obtaining a copy of this software and associated documentation
> + *     files (the "Software"), to deal in the Software without
> + *     restriction, including without limitation the rights to use,
> + *     copy, modify, merge, publish, distribute, sublicense, and/or
> + *     sell copies of the Software, and to permit persons to whom the
> + *     Software is furnished to do so, subject to the following
> + *     conditions:
> + *
> + *     The above copyright notice and this permission notice shall be
> + *     included in all copies or substantial portions of the Software.
> + *
> + *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> + *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
> + *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> + *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
> + *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
> + *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + *     OTHER DEALINGS IN THE SOFTWARE.
> + */
> +/dts-v1/;
> +
> +#include "sama5d2.dtsi"
> +#include "sama5d2-pinfunc.h"
> +#include <dt-bindings/interrupt-controller/irq.h>
> +#include <dt-bindings/gpio/gpio.h>
> +
> +/ {
> +	model = "Conclusive KSTR-SAMA5D27";
> +	compatible = "conclusive,kstr-sama5d27", "atmel,sama5d2", "atmel,sama5";
> +
> +	chosen {
> +		bootph-all;
> +		stdout-path = &uart1;
> +	};
> +
> +	clocks {
> +		main_xtal: main_xtal {
> +			clock-frequency = <12000000>;
> +		};
> +	};
> +
> +	ahb {
> +			usb0: gadget@00300000 {

I feel this line is not properly aligned

> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +			compatible = "atmel,sama5d3-udc";
> +			reg = <0x00300000 0x100000
> +				0xfc02c000 0x400>;
> +			interrupts = <42 IRQ_TYPE_LEVEL_HIGH 2>;
> +			clocks = <&udphs_clk>, <&utmi>;
> +			clock-names = "pclk", "hclk";
> +			status = "okay";

This gadget appears to be SoC specific, is it not described in 
sama5d2.dtsi right ? Do you think it would be beneficial to add it as a 
separate patch to sama5d2.dtsi ?

> +
> +			ep0: endpoint@0 {
> +				reg = <0>;
> +				atmel,fifo-size = <64>;
> +				atmel,nb-banks = <1>;
> +			};
> +
> +			ep1: endpoint@1 {
> +				reg = <1>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <3>;
> +				atmel,can-dma;
> +				atmel,can-isoc;
> +			};
> +
> +			ep2: endpoint@2 {
> +				reg = <2>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <3>;
> +				atmel,can-dma;
> +				atmel,can-isoc;
> +			};
> +
> +			ep3: endpoint@3 {
> +				reg = <3>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-dma;
> +				atmel,can-isoc;
> +			};
> +
> +			ep4: endpoint@4 {
> +				reg = <4>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-dma;
> +				atmel,can-isoc;
> +			};
> +
> +			ep5: endpoint@5 {
> +				reg = <5>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-dma;
> +				atmel,can-isoc;
> +			};
> +
> +			ep6: endpoint@6 {
> +				reg = <6>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-dma;
> +				atmel,can-isoc;
> +			};
> +
> +			ep7: endpoint@7 {
> +				reg = <7>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-dma;
> +				atmel,can-isoc;
> +			};
> +
> +			ep8: endpoint@8 {
> +				reg = <8>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-isoc;
> +			};
> +
> +			ep9: endpoint@9 {
> +				reg = <9>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-isoc;
> +			};
> +
> +			ep10: endpoint@a {
> +				reg = <10>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-isoc;
> +			};
> +
> +			ep11: endpoint@b {
> +				reg = <11>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-isoc;
> +			};
> +
> +			ep12: endpoint@c {
> +				reg = <12>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-isoc;
> +			};
> +
> +			ep13: endpoint@d {
> +				reg = <13>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-isoc;
> +			};
> +
> +			ep14: endpoint@e {
> +				reg = <14>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-isoc;
> +			};
> +
> +			ep15: endpoint@f {
> +				reg = <15>;
> +				atmel,fifo-size = <1024>;
> +				atmel,nb-banks = <2>;
> +				atmel,can-isoc;
> +			};
> +		};
> +
> +		sdmmc0: sdio-host@a0000000 {
> +			bus-width = <4>;
> +			pinctrl-names = "default";
> +			pinctrl-0 = <&pinctrl_sdmmc0_cmd_dat_default &pinctrl_sdmmc0_ck_cd_default>;
> +			status = "okay";
> +			bootph-all;
> +		};
> +
> +		apb {
> +			uart1: serial@f8020000 {
> +				pinctrl-names = "default";
> +				pinctrl-0 = <&pinctrl_uart1_default>;
> +				status = "okay";
> +				bootph-all;
> +			};
> +
> +			macb0: ethernet@f8008000 {
> +				pinctrl-names = "default";
> +				pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;
> +				phy-mode = "rmii";
> +				status = "okay";
> +
> +				ethernet-phy@0 {
> +					reg = <0x0>;
> +					reset-gpios = <&pioA 44 GPIO_ACTIVE_LOW>;
> +				};
> +			};
> +
> +			i2c@fc018000 {

I have a feeling this node should also reside in sama5d2.dtsi, and that 
it's a flexcom in fact (judging by how you hack it later), you should 
enable the flexcom driver and have this as a child node of the flexcom 
node (there are some examples done in other sama*.dtsi)

> +				compatible = "atmel,sama5d2-i2c";
> +				reg = <0xfc018600 0x100>;
> +				#address-cells = <1>;
> +				#size-cells = <0>;
> +				clocks = <&flx4_clk>;
> +				clock-names = "i2c2_clk";
> +				clock-frequency = <100000>;
> +				pinctrl-names = "default";
> +				pinctrl-0 = <&pinctrl_flx4_i2c>;
> +				status = "okay";
> +
> +				eeprom: eeprom@50 {
> +					compatible = "microchip,24c32", "atmel,24c32";
> +					reg = <0x50>;
> +					read-only;
> +					pagesize = <32>;
> +					status = "okay";
> +				};
> +
> +				pmic: pmic@5b {
> +					compatible = "active-semi,act8945a";
> +					reg = <0x5b>;
> +					status = "okay";
> +				};
> +			};
> +
> +			pioA: pinctrl@fc038000 {
> +				pinctrl {
> +					pinctrl_uart1_default: uart1_default {
> +						pinmux = <PIN_PD2__URXD1>,
> +							 <PIN_PD3__UTXD1>;
> +						bias-disable;
> +						bootph-all;
> +					};
> +
> +					pinctrl_macb0_phy_irq: macb0_phy_irq {
> +						pinmux = <PIN_PB13__GPIO>;
> +						bias-disable;
> +						bootph-all;
> +					};
> +
> +					pinctrl_macb0_rmii: macb0_rmii {
> +						pinmux = <PIN_PB14__GTXCK>,
> +							 <PIN_PB15__GTXEN>,
> +							 <PIN_PB16__GRXDV>,
> +							 <PIN_PB17__GRXER>,
> +							 <PIN_PB18__GRX0>,
> +							 <PIN_PB19__GRX1>,
> +							 <PIN_PB20__GTX0>,
> +							 <PIN_PB21__GTX1>,
> +							 <PIN_PB22__GMDC>,
> +							 <PIN_PB23__GMDIO>;
> +						bias-disable;
> +						bootph-all;
> +					};
> +
> +					pinctrl_sdmmc0_cmd_dat_default: sdmmc0_cmd_dat_default {
> +						pinmux = <PIN_PA1__SDMMC0_CMD>,
> +							 <PIN_PA2__SDMMC0_DAT0>,
> +							 <PIN_PA3__SDMMC0_DAT1>,
> +							 <PIN_PA4__SDMMC0_DAT2>,
> +							 <PIN_PA5__SDMMC0_DAT3>;
> +						bias-pull-up;
> +						bootph-all;
> +					};
> +
> +					pinctrl_sdmmc0_ck_cd_default: sdmmc0_ck_cd_default {
> +						pinmux = <PIN_PA0__SDMMC0_CK>,
> +							 <PIN_PA11__SDMMC0_VDDSEL>,
> +							 <PIN_PA13__SDMMC0_CD>;
> +						bias-disable;
> +						bootph-all;
> +					};
> +
> +					pinctrl_flx4_i2c: flx4_i2c {
> +						pinmux = <PIN_PC28__FLEXCOM4_IO0>,
> +							 <PIN_PC29__FLEXCOM4_IO1>;
> +						bias-disable;
> +					};
> +				};
> +			};
> +		};
> +	};
> +};
> diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
> index 7c2e4ebbdb0f..9ab1a9339ee1 100644
> --- a/arch/arm/mach-at91/Kconfig
> +++ b/arch/arm/mach-at91/Kconfig
> @@ -204,6 +204,18 @@ config TARGET_SAMA5D27_WLSOM1_EK
>   	  processor-based SAMA5D2 MPU with 2 Gbit LPDDR2-SDRAM
>   	  in a single package.
>   
> +config TARGET_KSTR_SAMA5D27
> +	bool "Conclusive KSTR-SAMA5D27 board"
> +	select BOARD_EARLY_INIT_F
> +	select SAMA5D2
> +	select BOARD_LATE_INIT
> +	help
> +	  The KSTR-SAMA5D27 embeds SAMA5D27 SoC, together with
> +	  256 MiB SDRAM, 10/100 Mbit/s Ethernet, 96 Mbit/s Wi-Fi b/g/n,
> +	  Bluetooth 4.1 LE, USB OTG controller w/ type-C USB connector
> +	  and stackable GPIO headers in an all-in-one SBC form factor:
> +	  https://conclusive.pl/products/kstr-sama5d27-sbc/
> +
>   config TARGET_SAMA5D2_ICP
>   	bool "SAMA5D2 Industrial Connectivity Platform (ICP)"
>   	select SAMA5D2
> @@ -352,6 +364,7 @@ source "board/atmel/sama5d4_xplained/Kconfig"
>   source "board/atmel/sama5d4ek/Kconfig"
>   source "board/bluewater/gurnard/Kconfig"
>   source "board/calao/usb_a9263/Kconfig"
> +source "board/conclusive/kstr-sama5d27/Kconfig"
>   source "board/egnite/ethernut5/Kconfig"
>   source "board/esd/meesc/Kconfig"
>   source "board/gardena/smart-gateway-at91sam/Kconfig"
> diff --git a/board/conclusive/kstr-sama5d27/Kconfig b/board/conclusive/kstr-sama5d27/Kconfig
> new file mode 100644
> index 000000000000..572551cfda98
> --- /dev/null
> +++ b/board/conclusive/kstr-sama5d27/Kconfig
> @@ -0,0 +1,15 @@
> +if TARGET_KSTR_SAMA5D27
> +
> +config SYS_BOARD
> +	default "kstr-sama5d27"
> +
> +config SYS_VENDOR
> +	default "conclusive"
> +
> +config SYS_SOC
> +	default "at91"
> +
> +config SYS_CONFIG_NAME
> +	default "kstr-sama5d27"
> +
> +endif
> diff --git a/board/conclusive/kstr-sama5d27/MAINTAINERS b/board/conclusive/kstr-sama5d27/MAINTAINERS
> new file mode 100644
> index 000000000000..cb1635cdd280
> --- /dev/null
> +++ b/board/conclusive/kstr-sama5d27/MAINTAINERS
> @@ -0,0 +1,8 @@
> +CONCLUSIVE KSTR-SAMA5D27 BOARD
> +M:	Jakub Klama <jakub@conclusive.pl>
> +M:	Artur Rojek <artur@conclusive.pl>
> +S:	Maintained
> +F:	board/conclusive/kstr-sama5d27
> +F:	include/configs/kstr-sama5d27.h
> +F:	configs/kstr_sama5d27_defconfig
> +F:	arch/arm/dts/at91-kstr-sama5d27.dts
> diff --git a/board/conclusive/kstr-sama5d27/Makefile b/board/conclusive/kstr-sama5d27/Makefile
> new file mode 100644
> index 000000000000..edf7d1c93441
> --- /dev/null
> +++ b/board/conclusive/kstr-sama5d27/Makefile
> @@ -0,0 +1,5 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Copyright (C) 2019-2023 Conclusive Engineering Sp. z o. o.
> +
> +obj-y += kstr-sama5d27.o
> diff --git a/board/conclusive/kstr-sama5d27/kstr-sama5d27.c b/board/conclusive/kstr-sama5d27/kstr-sama5d27.c
> new file mode 100644
> index 000000000000..e29fd00544bd
> --- /dev/null
> +++ b/board/conclusive/kstr-sama5d27/kstr-sama5d27.c
> @@ -0,0 +1,235 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * kstr-sama5d27.c - Board init file for Conclusive KSTR-SAMA5D27 board
> + * Copyright (C) 2021-2023 Conclusive Engineering Sp. z o. o.
> + */
> +
> +#include <common.h>
> +#include <debug_uart.h>
> +#include <init.h>
> +#include <env.h>
> +#include <fdt_support.h>
> +#include <asm/global_data.h>
> +#include <asm/io.h>
> +#include <asm/arch/at91_common.h>
> +#include <asm/arch/atmel_pio4.h>
> +#include <asm/arch/atmel_mpddrc.h>
> +#include <asm/arch/atmel_sdhci.h>
> +#include <asm/arch/clk.h>
> +#include <asm/arch/gpio.h>
> +#include <asm/arch/sama5d2.h>
> +#include <linux/delay.h>
> +
> +#ifdef CONFIG_USB_GADGET_ATMEL_USBA
> +#include <asm/arch/atmel_usba_udc.h>
> +#endif
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#ifdef CONFIG_DEBUG_UART_BOARD_INIT
> +static void board_uart1_hw_init(void)
> +{
> +	/* URXD1 */
> +	atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, ATMEL_PIO_PUEN_MASK);
> +	/* UTXD1 */
> +	atmel_pio4_set_a_periph(AT91_PIO_PORTD, 3, 0);
> +	at91_periph_clk_enable(ATMEL_ID_UART1);
> +}
> +
> +void board_debug_uart_init(void)
> +{
> +	board_uart1_hw_init();
> +}
> +#endif
> +
> +void board_lan8720a_init(void)
> +{
> +	/* LAN8720A_nRST */
> +	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, 0);
> +	/*
> +	 * Force 0 on RXER/PHYAD0. LAN8720A chipset will latch with address 0 on
> +	 * MDIO bus.
> +	 */
> +	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 17, 0);
> +	/* Minimal delay of reset signal is 25 ms */
> +	mdelay(30);
> +	/* LAN8720A_nRST */
> +	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, 1);
> +}
> +
> +void board_usba_init(void)
> +{
> +#ifdef CONFIG_USB_GADGET_ATMEL_USBA
> +	/* USB device peripheral initialization: sama5d2_devices.c */
> +	at91_udp_hw_init();
> +	/* USB device controller drivers/usb/gadget/atmel_usba_udc.c */
> +	usba_udc_probe(&pdata);

Any reason to probe the UDC here and not on-demand lazy probing when 
it's required ?

> +#endif
> +}
> +
> +#ifdef CONFIG_BOARD_EARLY_INIT_F
> +int board_early_init_f(void)
> +{
> +#ifdef CONFIG_DEBUG_UART
> +	debug_uart_init();
> +#endif
> +	/* Initialize FLEXCOM 4 in TWI(I2C) mode */
> +	writel(0x3, 0xfc018000);

There is a driver for flexcom, as stated above

> +	return 0;
> +}
> +#endif
> +
> +int ft_board_setup(void *blob, struct bd_info *bd)
> +{
> +	char *wlanaddr = env_get("eth1addr");
> +
> +	if (wlanaddr)
> +		do_fixup_by_compat(blob, "brcm,bcm4329-fmac", "local-mac-address",
> +				   wlanaddr, strlen(wlanaddr), 1);
> +	else
> +		printf("Not setting WIFI mac address. Check if EEPROM TLV is correctly set up.\n");
> +
> +	return 0;
> +}
> +
> +int board_init(void)
> +{
> +	/* address of boot parameters */
> +	gd->bd->bi_boot_params = CFG_SYS_SDRAM_BASE + 0x100;
> +
> +	board_usba_init();
> +	board_lan8720a_init();
> +
> +	return 0;
> +}
> +
> +#ifdef CONFIG_BOARD_LATE_INIT
> +int board_late_init(void)
> +{
> +	const char *serial_number;
> +
> +	populate_serial_number(0);
> +
> +	printf("Conclusive KSTR-SAMA5D27\n");

Normally, the board name is printed by U-boot, why duplicate it here ?
> +
> +	serial_number = env_get("serial#");
> +	if (!serial_number)
> +		printf("Warning: unknown serial number.\n");
> +	else
> +		printf("Serial number %s\n", serial_number);
> +
> +	return 0;
> +}
> +#endif
> +
> +#ifdef CONFIG_MISC_INIT_R
> +int misc_init_r(void)
> +{
> +	return 0;
> +}
> +#endif
> +
> +int dram_init(void)
> +{
> +	gd->ram_size = get_ram_size((void *)CFG_SYS_SDRAM_BASE,
> +				    CFG_SYS_SDRAM_SIZE);
> +	return 0;
> +}
> +
> +/* SPL */
> +#ifdef CONFIG_SPL_BUILD
> +void spl_board_init(void)
> +{
> +}
> +
> +static void ddrc_conf(struct atmel_mpddrc_config *ddrc)
> +{
> +	ddrc->md = (ATMEL_MPDDRC_MD_DBW_16_BITS | ATMEL_MPDDRC_MD_DDR2_SDRAM);
> +
> +	ddrc->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
> +		    ATMEL_MPDDRC_CR_NR_ROW_13 |
> +		    ATMEL_MPDDRC_CR_CAS_DDR_CAS3 |
> +		    ATMEL_MPDDRC_CR_DIC_DS |
> +		    ATMEL_MPDDRC_CR_ZQ_LONG |
> +		    ATMEL_MPDDRC_CR_NB_8BANKS |
> +		    ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
> +		    ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
> +
> +	ddrc->rtr = 0x511;
> +
> +	ddrc->tpr0 = ((7 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET) |
> +		      (3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET) |
> +		      (3 << ATMEL_MPDDRC_TPR0_TWR_OFFSET) |
> +		      (9 << ATMEL_MPDDRC_TPR0_TRC_OFFSET) |
> +		      (3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET) |
> +		      (4 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET) |
> +		      (4 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET) |
> +		      (2 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET));
> +
> +	ddrc->tpr1 = ((22 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET) |
> +		      (23 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET) |
> +		      (200 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET) |
> +		      (3 << ATMEL_MPDDRC_TPR1_TXP_OFFSET));
> +
> +	ddrc->tpr2 = ((2 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET) |
> +		      (8 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET) |
> +		      (4 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET) |
> +		      (4 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET) |
> +		      (8 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET));
> +}
> +
> +void mem_init(void)
> +{
> +	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
> +	struct atmel_mpddr *mpddrc = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC;
> +	struct atmel_mpddrc_config ddrc_config;
> +	u32 reg;
> +
> +	ddrc_conf(&ddrc_config);
> +
> +	at91_periph_clk_enable(ATMEL_ID_MPDDRC);
> +	writel(AT91_PMC_DDR, &pmc->scer);
> +
> +	reg = readl(&mpddrc->io_calibr);
> +	reg &= ~ATMEL_MPDDRC_IO_CALIBR_RDIV;
> +	reg |= ATMEL_MPDDRC_IO_CALIBR_DDR3_RZQ_55;
> +	reg &= ~ATMEL_MPDDRC_IO_CALIBR_TZQIO;
> +	reg |= ATMEL_MPDDRC_IO_CALIBR_TZQIO_(101);
> +	writel(reg, &mpddrc->io_calibr);
> +
> +	writel(ATMEL_MPDDRC_RD_DATA_PATH_SHIFT_ONE_CYCLE,
> +	       &mpddrc->rd_data_path);
> +
> +	ddr3_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddrc_config);
> +
> +	writel(0x3, &mpddrc->cal_mr4);
> +	writel(64, &mpddrc->tim_cal);
> +}
> +
> +void at91_pmc_init(void)
> +{
> +	u32 tmp;
> +
> +	/*
> +	 * While coming from the ROM code, we run on PLLA @ 492 MHz / 164 MHz,
> +	 * so we need to slow down and configure MCKR accordingly.
> +	 * This is why we have a special flavor of the switching function.
> +	 */
> +	tmp = AT91_PMC_MCKR_PLLADIV_2 |
> +	      AT91_PMC_MCKR_MDIV_3 |
> +	      AT91_PMC_MCKR_CSS_MAIN;
> +	at91_mck_init_down(tmp);
> +
> +	tmp = AT91_PMC_PLLAR_29 |
> +	      AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
> +	      AT91_PMC_PLLXR_MUL(40) |
> +	      AT91_PMC_PLLXR_DIV(1);
> +	at91_plla_init(tmp);
> +
> +	tmp = AT91_PMC_MCKR_H32MXDIV |
> +	      AT91_PMC_MCKR_PLLADIV_2 |
> +	      AT91_PMC_MCKR_MDIV_3 |
> +	      AT91_PMC_MCKR_CSS_PLLA;
> +	at91_mck_init(tmp);
> +}
> +#endif
> diff --git a/configs/kstr_sama5d27_defconfig b/configs/kstr_sama5d27_defconfig
> new file mode 100644
> index 000000000000..a0b8ea79c66b
> --- /dev/null
> +++ b/configs/kstr_sama5d27_defconfig
> @@ -0,0 +1,79 @@
> +CONFIG_ARM=y
> +CONFIG_ARCH_AT91=y
> +CONFIG_TEXT_BASE=0x26f00000
> +CONFIG_SYS_LOAD_ADDR=0x24000000
> +CONFIG_SYS_MONITOR_LEN=524288
> +CONFIG_TARGET_KSTR_SAMA5D27=y
> +CONFIG_SYS_MALLOC_F_LEN=0x2000
> +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20003ee0
> +CONFIG_NR_DRAM_BANKS=1
> +CONFIG_DM_GPIO=y
> +CONFIG_DEFAULT_DEVICE_TREE="at91-kstr-sama5d27"
> +CONFIG_DISTRO_DEFAULTS=y
> +CONFIG_FIT=y
> +CONFIG_OF_BOARD_SETUP=y
> +CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2"
> +CONFIG_SD_BOOT=y
> +CONFIG_BOOTDELAY=3
> +CONFIG_USE_BOOTARGS=y
> +CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
> +# CONFIG_USE_BOOTCOMMAND is not set
> +# CONFIG_DISPLAY_BOARDINFO is not set
> +CONFIG_MISC_INIT_R=y
> +CONFIG_CMD_TLV_EEPROM=y
> +CONFIG_CMD_IMAGE=y
> +CONFIG_CMD_DM=y
> +CONFIG_CMD_GPIO=y
> +CONFIG_CMD_GPT=y
> +CONFIG_CMD_I2C=y
> +# CONFIG_CMD_LOADS is not set
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_USB=y
> +CONFIG_CMD_USB_MASS_STORAGE=y
> +# CONFIG_ISO_PARTITION is not set
> +CONFIG_OF_CONTROL=y
> +CONFIG_ENV_OVERWRITE=y
> +CONFIG_ENV_IS_IN_FAT=y
> +CONFIG_NET_RANDOM_ETHADDR=y
> +CONFIG_DM=y
> +CONFIG_CLK=y
> +CONFIG_CLK_AT91=y
> +CONFIG_AT91_UTMI=y
> +CONFIG_AT91_H32MX=y
> +CONFIG_AT91_GENERIC_CLK=y
> +CONFIG_ATMEL_PIO4=y
> +CONFIG_DM_I2C=y
> +CONFIG_SYS_I2C_AT91=y
> +CONFIG_I2C_EEPROM=y
> +CONFIG_DM_MMC=y
> +CONFIG_MMC_IO_VOLTAGE=y
> +CONFIG_MMC_SDHCI=y
> +CONFIG_MMC_SDHCI_SDMA=y
> +CONFIG_MMC_SDHCI_ATMEL=y
> +CONFIG_PHY_MICREL=y
> +CONFIG_DM_ETH=y
> +CONFIG_MACB=y
> +CONFIG_PINCTRL=y
> +CONFIG_PINCTRL_AT91PIO4=y
> +CONFIG_DM_SERIAL=y
> +CONFIG_ATMEL_USART=y
> +CONFIG_TEE=y
> +CONFIG_OPTEE=y
> +CONFIG_SYSRESET=y
> +CONFIG_SYSRESET_AT91=y
> +CONFIG_DM_RESET=y
> +CONFIG_RESET_AT91=y
> +CONFIG_TIMER=y
> +CONFIG_ATMEL_PIT_TIMER=y
> +CONFIG_USB=y
> +CONFIG_DM_USB=y
> +CONFIG_USB_EHCI_HCD=y
> +CONFIG_USB_GADGET=y
> +CONFIG_USB_GADGET_VENDOR_NUM=0x16c0
> +CONFIG_USB_GADGET_PRODUCT_NUM=0x03e9
> +CONFIG_USB_GADGET_ATMEL_USBA=y
> +CONFIG_USB_GADGET_DOWNLOAD=y
> +CONFIG_OF_LIBFDT_OVERLAY=y
> +CONFIG_SPL_OF_LIBFDT=y
> +# CONFIG_EFI_LOADER is not set
> diff --git a/include/configs/kstr-sama5d27.h b/include/configs/kstr-sama5d27.h
> new file mode 100644
> index 000000000000..772a073ba209
> --- /dev/null
> +++ b/include/configs/kstr-sama5d27.h
> @@ -0,0 +1,15 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2021-2023 Conclusive Engineering Sp. z o. o.
> + */
> +
> +#ifndef __CONFIG_H
> +#define __CONFIG_H
> +
> +#include "at91-sama5_common.h"
> +
> +/* SDRAM */
> +#define CFG_SYS_SDRAM_BASE           0x20000000
> +#define CFG_SYS_SDRAM_SIZE           0x10000000
> +
> +#endif
Artur Rojek Sept. 25, 2023, 7:31 p.m. UTC | #2
Hey Eugen,

thanks for the review.
>Hello,
>
>Thank you for your patch,
>
>On 9/21/23 18:37, Artur Rojek wrote:
>> Introduce support for Conclusive KSTR-SAMA5D27 Single Board Computer.
>> 
>> Co-developed-by: Jakub Klama <jakub@conclusive.pl>
>> Signed-off-by: Jakub Klama <jakub@conclusive.pl>
>> Co-developed-by: Marcin Jabrzyk <marcin@conclusive.pl>
>> Signed-off-by: Marcin Jabrzyk <marcin@conclusive.pl>
>> Signed-off-by: Artur Rojek <artur@conclusive.pl>
>> ---
>>   arch/arm/dts/Makefile                         |   3 +
>>   arch/arm/dts/at91-kstr-sama5d27.dts           | 310 ++++++++++++++++++
>>   arch/arm/mach-at91/Kconfig                    |  13 +
>>   board/conclusive/kstr-sama5d27/Kconfig        |  15 +
>>   board/conclusive/kstr-sama5d27/MAINTAINERS    |   8 +
>>   board/conclusive/kstr-sama5d27/Makefile       |   5 +
>>   .../conclusive/kstr-sama5d27/kstr-sama5d27.c  | 235 +++++++++++++
>>   configs/kstr_sama5d27_defconfig               |  79 +++++
>>   include/configs/kstr-sama5d27.h               |  15 +
>>   9 files changed, 683 insertions(+)
>>   create mode 100644 arch/arm/dts/at91-kstr-sama5d27.dts
>>   create mode 100644 board/conclusive/kstr-sama5d27/Kconfig
>>   create mode 100644 board/conclusive/kstr-sama5d27/MAINTAINERS
>>   create mode 100644 board/conclusive/kstr-sama5d27/Makefile
>>   create mode 100644 board/conclusive/kstr-sama5d27/kstr-sama5d27.c
>>   create mode 100644 configs/kstr_sama5d27_defconfig
>>   create mode 100644 include/configs/kstr-sama5d27.h
>> 
>> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
>> index 85fd5b1157b1..8e4d33c01912 100644
>> --- a/arch/arm/dts/Makefile
>> +++ b/arch/arm/dts/Makefile
>> @@ -1198,6 +1198,9 @@ dtb-$(CONFIG_TARGET_SAMA5D27_SOM1_EK) += \
>>   dtb-$(CONFIG_TARGET_SAMA5D27_WLSOM1_EK) += \
>>   	at91-sama5d27_wlsom1_ek.dtb
>>   
>> +dtb-$(CONFIG_TARGET_KSTR_SAMA5D27) += \
>> +	at91-kstr-sama5d27.dtb
>> +
>>   dtb-$(CONFIG_TARGET_SAMA5D2_ICP) += \
>>   	at91-sama5d2_icp.dtb
>>   
>> diff --git a/arch/arm/dts/at91-kstr-sama5d27.dts b/arch/arm/dts/at91-kstr-sama5d27.dts
>> new file mode 100644
>> index 000000000000..6de918a3c964
>> --- /dev/null
>> +++ b/arch/arm/dts/at91-kstr-sama5d27.dts
>> @@ -0,0 +1,310 @@
>> +// SPDX-License-Identifier: GPL-2.0+ OR X11
>> +/*
>> + * at91-kstr-sama5d27.dts - Device Tree file for Conclusive KSTR-SAMA5D27 board
>> + *
>> + *  Copyright (C) 2019-2023 Conclusive Engineering Sp. z o. o.
>
>SPDX tag is enough, no need to replicate the license text below
>
>> + *
>> + * This file is dual-licensed: you can use it either under the terms
>> + * of the GPL or the X11 license, at your option. Note that this dual
>> + * licensing only applies to this file, and not this project as a
>> + * whole.
>> + *
>> + *  a) This file 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 file 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.
>> + *
>> + * Or, alternatively,
>> + *
>> + *  b) Permission is hereby granted, free of charge, to any person
>> + *     obtaining a copy of this software and associated documentation
>> + *     files (the "Software"), to deal in the Software without
>> + *     restriction, including without limitation the rights to use,
>> + *     copy, modify, merge, publish, distribute, sublicense, and/or
>> + *     sell copies of the Software, and to permit persons to whom the
>> + *     Software is furnished to do so, subject to the following
>> + *     conditions:
>> + *
>> + *     The above copyright notice and this permission notice shall be
>> + *     included in all copies or substantial portions of the Software.
>> + *
>> + *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>> + *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
>> + *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
>> + *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
>> + *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
>> + *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> + *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> + *     OTHER DEALINGS IN THE SOFTWARE.
>> + */
>> +/dts-v1/;
>> +
>> +#include "sama5d2.dtsi"
>> +#include "sama5d2-pinfunc.h"
>> +#include <dt-bindings/interrupt-controller/irq.h>
>> +#include <dt-bindings/gpio/gpio.h>
>> +
>> +/ {
>> +	model = "Conclusive KSTR-SAMA5D27";
>> +	compatible = "conclusive,kstr-sama5d27", "atmel,sama5d2", "atmel,sama5";
>> +
>> +	chosen {
>> +		bootph-all;
>> +		stdout-path = &uart1;
>> +	};
>> +
>> +	clocks {
>> +		main_xtal: main_xtal {
>> +			clock-frequency = <12000000>;
>> +		};
>> +	};
>> +
>> +	ahb {
>> +			usb0: gadget@00300000 {
>
>I feel this line is not properly aligned
>
>> +			#address-cells = <1>;
>> +			#size-cells = <0>;
>> +			compatible = "atmel,sama5d3-udc";
>> +			reg = <0x00300000 0x100000
>> +				0xfc02c000 0x400>;
>> +			interrupts = <42 IRQ_TYPE_LEVEL_HIGH 2>;
>> +			clocks = <&udphs_clk>, <&utmi>;
>> +			clock-names = "pclk", "hclk";
>> +			status = "okay";
>
>This gadget appears to be SoC specific, is it not described in 
>sama5d2.dtsi right ? Do you think it would be beneficial to add it as a 
>separate patch to sama5d2.dtsi ?
It would be beneficial to do that, although, embarrassingly, I just
noticed that the driver in question (atmel_usba_udc.c) does not use DT
at all... Instead, it uses hardcoded pdata for endpoint configuration.
So this entire node will be dropped in v2.
>
>> +
>> +			ep0: endpoint@0 {
>> +				reg = <0>;
>> +				atmel,fifo-size = <64>;
>> +				atmel,nb-banks = <1>;
>> +			};
>> +
>> +			ep1: endpoint@1 {
>> +				reg = <1>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <3>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep2: endpoint@2 {
>> +				reg = <2>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <3>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep3: endpoint@3 {
>> +				reg = <3>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep4: endpoint@4 {
>> +				reg = <4>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep5: endpoint@5 {
>> +				reg = <5>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep6: endpoint@6 {
>> +				reg = <6>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep7: endpoint@7 {
>> +				reg = <7>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep8: endpoint@8 {
>> +				reg = <8>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep9: endpoint@9 {
>> +				reg = <9>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep10: endpoint@a {
>> +				reg = <10>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep11: endpoint@b {
>> +				reg = <11>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep12: endpoint@c {
>> +				reg = <12>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep13: endpoint@d {
>> +				reg = <13>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep14: endpoint@e {
>> +				reg = <14>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep15: endpoint@f {
>> +				reg = <15>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +		};
>> +
>> +		sdmmc0: sdio-host@a0000000 {
>> +			bus-width = <4>;
>> +			pinctrl-names = "default";
>> +			pinctrl-0 = <&pinctrl_sdmmc0_cmd_dat_default &pinctrl_sdmmc0_ck_cd_default>;
>> +			status = "okay";
>> +			bootph-all;
>> +		};
>> +
>> +		apb {
>> +			uart1: serial@f8020000 {
>> +				pinctrl-names = "default";
>> +				pinctrl-0 = <&pinctrl_uart1_default>;
>> +				status = "okay";
>> +				bootph-all;
>> +			};
>> +
>> +			macb0: ethernet@f8008000 {
>> +				pinctrl-names = "default";
>> +				pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;
>> +				phy-mode = "rmii";
>> +				status = "okay";
>> +
>> +				ethernet-phy@0 {
>> +					reg = <0x0>;
>> +					reset-gpios = <&pioA 44 GPIO_ACTIVE_LOW>;
>> +				};
>> +			};
>> +
>> +			i2c@fc018000 {
>
>I have a feeling this node should also reside in sama5d2.dtsi, and that 
>it's a flexcom in fact (judging by how you hack it later), you should 
>enable the flexcom driver and have this as a child node of the flexcom 
>node (there are some examples done in other sama*.dtsi)
Indeed. Will be done in v2.
>
>> +				compatible = "atmel,sama5d2-i2c";
>> +				reg = <0xfc018600 0x100>;
>> +				#address-cells = <1>;
>> +				#size-cells = <0>;
>> +				clocks = <&flx4_clk>;
>> +				clock-names = "i2c2_clk";
>> +				clock-frequency = <100000>;
>> +				pinctrl-names = "default";
>> +				pinctrl-0 = <&pinctrl_flx4_i2c>;
>> +				status = "okay";
>> +
>> +				eeprom: eeprom@50 {
>> +					compatible = "microchip,24c32", "atmel,24c32";
>> +					reg = <0x50>;
>> +					read-only;
>> +					pagesize = <32>;
>> +					status = "okay";
>> +				};
>> +
>> +				pmic: pmic@5b {
>> +					compatible = "active-semi,act8945a";
>> +					reg = <0x5b>;
>> +					status = "okay";
>> +				};
>> +			};
>> +
>> +			pioA: pinctrl@fc038000 {
>> +				pinctrl {
>> +					pinctrl_uart1_default: uart1_default {
>> +						pinmux = <PIN_PD2__URXD1>,
>> +							 <PIN_PD3__UTXD1>;
>> +						bias-disable;
>> +						bootph-all;
>> +					};
>> +
>> +					pinctrl_macb0_phy_irq: macb0_phy_irq {
>> +						pinmux = <PIN_PB13__GPIO>;
>> +						bias-disable;
>> +						bootph-all;
>> +					};
>> +
>> +					pinctrl_macb0_rmii: macb0_rmii {
>> +						pinmux = <PIN_PB14__GTXCK>,
>> +							 <PIN_PB15__GTXEN>,
>> +							 <PIN_PB16__GRXDV>,
>> +							 <PIN_PB17__GRXER>,
>> +							 <PIN_PB18__GRX0>,
>> +							 <PIN_PB19__GRX1>,
>> +							 <PIN_PB20__GTX0>,
>> +							 <PIN_PB21__GTX1>,
>> +							 <PIN_PB22__GMDC>,
>> +							 <PIN_PB23__GMDIO>;
>> +						bias-disable;
>> +						bootph-all;
>> +					};
>> +
>> +					pinctrl_sdmmc0_cmd_dat_default: sdmmc0_cmd_dat_default {
>> +						pinmux = <PIN_PA1__SDMMC0_CMD>,
>> +							 <PIN_PA2__SDMMC0_DAT0>,
>> +							 <PIN_PA3__SDMMC0_DAT1>,
>> +							 <PIN_PA4__SDMMC0_DAT2>,
>> +							 <PIN_PA5__SDMMC0_DAT3>;
>> +						bias-pull-up;
>> +						bootph-all;
>> +					};
>> +
>> +					pinctrl_sdmmc0_ck_cd_default: sdmmc0_ck_cd_default {
>> +						pinmux = <PIN_PA0__SDMMC0_CK>,
>> +							 <PIN_PA11__SDMMC0_VDDSEL>,
>> +							 <PIN_PA13__SDMMC0_CD>;
>> +						bias-disable;
>> +						bootph-all;
>> +					};
>> +
>> +					pinctrl_flx4_i2c: flx4_i2c {
>> +						pinmux = <PIN_PC28__FLEXCOM4_IO0>,
>> +							 <PIN_PC29__FLEXCOM4_IO1>;
>> +						bias-disable;
>> +					};
>> +				};
>> +			};
>> +		};
>> +	};
>> +};
>> diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
>> index 7c2e4ebbdb0f..9ab1a9339ee1 100644
>> --- a/arch/arm/mach-at91/Kconfig
>> +++ b/arch/arm/mach-at91/Kconfig
>> @@ -204,6 +204,18 @@ config TARGET_SAMA5D27_WLSOM1_EK
>>   	  processor-based SAMA5D2 MPU with 2 Gbit LPDDR2-SDRAM
>>   	  in a single package.
>>   
>> +config TARGET_KSTR_SAMA5D27
>> +	bool "Conclusive KSTR-SAMA5D27 board"
>> +	select BOARD_EARLY_INIT_F
>> +	select SAMA5D2
>> +	select BOARD_LATE_INIT
>> +	help
>> +	  The KSTR-SAMA5D27 embeds SAMA5D27 SoC, together with
>> +	  256 MiB SDRAM, 10/100 Mbit/s Ethernet, 96 Mbit/s Wi-Fi b/g/n,
>> +	  Bluetooth 4.1 LE, USB OTG controller w/ type-C USB connector
>> +	  and stackable GPIO headers in an all-in-one SBC form factor:
>> +	  https://conclusive.pl/products/kstr-sama5d27-sbc/
>> +
>>   config TARGET_SAMA5D2_ICP
>>   	bool "SAMA5D2 Industrial Connectivity Platform (ICP)"
>>   	select SAMA5D2
>> @@ -352,6 +364,7 @@ source "board/atmel/sama5d4_xplained/Kconfig"
>>   source "board/atmel/sama5d4ek/Kconfig"
>>   source "board/bluewater/gurnard/Kconfig"
>>   source "board/calao/usb_a9263/Kconfig"
>> +source "board/conclusive/kstr-sama5d27/Kconfig"
>>   source "board/egnite/ethernut5/Kconfig"
>>   source "board/esd/meesc/Kconfig"
>>   source "board/gardena/smart-gateway-at91sam/Kconfig"
>> diff --git a/board/conclusive/kstr-sama5d27/Kconfig b/board/conclusive/kstr-sama5d27/Kconfig
>> new file mode 100644
>> index 000000000000..572551cfda98
>> --- /dev/null
>> +++ b/board/conclusive/kstr-sama5d27/Kconfig
>> @@ -0,0 +1,15 @@
>> +if TARGET_KSTR_SAMA5D27
>> +
>> +config SYS_BOARD
>> +	default "kstr-sama5d27"
>> +
>> +config SYS_VENDOR
>> +	default "conclusive"
>> +
>> +config SYS_SOC
>> +	default "at91"
>> +
>> +config SYS_CONFIG_NAME
>> +	default "kstr-sama5d27"
>> +
>> +endif
>> diff --git a/board/conclusive/kstr-sama5d27/MAINTAINERS b/board/conclusive/kstr-sama5d27/MAINTAINERS
>> new file mode 100644
>> index 000000000000..cb1635cdd280
>> --- /dev/null
>> +++ b/board/conclusive/kstr-sama5d27/MAINTAINERS
>> @@ -0,0 +1,8 @@
>> +CONCLUSIVE KSTR-SAMA5D27 BOARD
>> +M:	Jakub Klama <jakub@conclusive.pl>
>> +M:	Artur Rojek <artur@conclusive.pl>
>> +S:	Maintained
>> +F:	board/conclusive/kstr-sama5d27
>> +F:	include/configs/kstr-sama5d27.h
>> +F:	configs/kstr_sama5d27_defconfig
>> +F:	arch/arm/dts/at91-kstr-sama5d27.dts
>> diff --git a/board/conclusive/kstr-sama5d27/Makefile b/board/conclusive/kstr-sama5d27/Makefile
>> new file mode 100644
>> index 000000000000..edf7d1c93441
>> --- /dev/null
>> +++ b/board/conclusive/kstr-sama5d27/Makefile
>> @@ -0,0 +1,5 @@
>> +# SPDX-License-Identifier: GPL-2.0+
>> +#
>> +# Copyright (C) 2019-2023 Conclusive Engineering Sp. z o. o.
>> +
>> +obj-y += kstr-sama5d27.o
>> diff --git a/board/conclusive/kstr-sama5d27/kstr-sama5d27.c b/board/conclusive/kstr-sama5d27/kstr-sama5d27.c
>> new file mode 100644
>> index 000000000000..e29fd00544bd
>> --- /dev/null
>> +++ b/board/conclusive/kstr-sama5d27/kstr-sama5d27.c
>> @@ -0,0 +1,235 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * kstr-sama5d27.c - Board init file for Conclusive KSTR-SAMA5D27 board
>> + * Copyright (C) 2021-2023 Conclusive Engineering Sp. z o. o.
>> + */
>> +
>> +#include <common.h>
>> +#include <debug_uart.h>
>> +#include <init.h>
>> +#include <env.h>
>> +#include <fdt_support.h>
>> +#include <asm/global_data.h>
>> +#include <asm/io.h>
>> +#include <asm/arch/at91_common.h>
>> +#include <asm/arch/atmel_pio4.h>
>> +#include <asm/arch/atmel_mpddrc.h>
>> +#include <asm/arch/atmel_sdhci.h>
>> +#include <asm/arch/clk.h>
>> +#include <asm/arch/gpio.h>
>> +#include <asm/arch/sama5d2.h>
>> +#include <linux/delay.h>
>> +
>> +#ifdef CONFIG_USB_GADGET_ATMEL_USBA
>> +#include <asm/arch/atmel_usba_udc.h>
>> +#endif
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +#ifdef CONFIG_DEBUG_UART_BOARD_INIT
>> +static void board_uart1_hw_init(void)
>> +{
>> +	/* URXD1 */
>> +	atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, ATMEL_PIO_PUEN_MASK);
>> +	/* UTXD1 */
>> +	atmel_pio4_set_a_periph(AT91_PIO_PORTD, 3, 0);
>> +	at91_periph_clk_enable(ATMEL_ID_UART1);
>> +}
>> +
>> +void board_debug_uart_init(void)
>> +{
>> +	board_uart1_hw_init();
>> +}
>> +#endif
>> +
>> +void board_lan8720a_init(void)
>> +{
>> +	/* LAN8720A_nRST */
>> +	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, 0);
>> +	/*
>> +	 * Force 0 on RXER/PHYAD0. LAN8720A chipset will latch with address 0 on
>> +	 * MDIO bus.
>> +	 */
>> +	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 17, 0);
>> +	/* Minimal delay of reset signal is 25 ms */
>> +	mdelay(30);
>> +	/* LAN8720A_nRST */
>> +	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, 1);
>> +}
>> +
>> +void board_usba_init(void)
>> +{
>> +#ifdef CONFIG_USB_GADGET_ATMEL_USBA
>> +	/* USB device peripheral initialization: sama5d2_devices.c */
>> +	at91_udp_hw_init();
>> +	/* USB device controller drivers/usb/gadget/atmel_usba_udc.c */
>> +	usba_udc_probe(&pdata);
>
>Any reason to probe the UDC here and not on-demand lazy probing when 
>it's required ?
This driver doesn't use U_BOOT_DRIVER style declaration, so the board
init has to call the probe manually. It would be nice to rewrite it to
do that, and also to sample platform data from OF, however I'd like to
avoid doing that in this series (which merely tries to add a new board).
>
>> +#endif
>> +}
>> +
>> +#ifdef CONFIG_BOARD_EARLY_INIT_F
>> +int board_early_init_f(void)
>> +{
>> +#ifdef CONFIG_DEBUG_UART
>> +	debug_uart_init();
>> +#endif
>> +	/* Initialize FLEXCOM 4 in TWI(I2C) mode */
>> +	writel(0x3, 0xfc018000);
>
>There is a driver for flexcom, as stated above
>
>> +	return 0;
>> +}
>> +#endif
>> +
>> +int ft_board_setup(void *blob, struct bd_info *bd)
>> +{
>> +	char *wlanaddr = env_get("eth1addr");
>> +
>> +	if (wlanaddr)
>> +		do_fixup_by_compat(blob, "brcm,bcm4329-fmac", "local-mac-address",
>> +				   wlanaddr, strlen(wlanaddr), 1);
>> +	else
>> +		printf("Not setting WIFI mac address. Check if EEPROM TLV is correctly set up.\n");
>> +
>> +	return 0;
>> +}
>> +
>> +int board_init(void)
>> +{
>> +	/* address of boot parameters */
>> +	gd->bd->bi_boot_params = CFG_SYS_SDRAM_BASE + 0x100;
>> +
>> +	board_usba_init();
>> +	board_lan8720a_init();
>> +
>> +	return 0;
>> +}
>> +
>> +#ifdef CONFIG_BOARD_LATE_INIT
>> +int board_late_init(void)
>> +{
>> +	const char *serial_number;
>> +
>> +	populate_serial_number(0);
>> +
>> +	printf("Conclusive KSTR-SAMA5D27\n");
>
>Normally, the board name is printed by U-boot, why duplicate it here ?
Doesn't happen on our board and I couldn't find a generic mechanism that
would do that. Did I miss something? Other boards which print their
names also seem to have custom logic for it.

Cheers,
Artur
>> +
>> +	serial_number = env_get("serial#");
>> +	if (!serial_number)
>> +		printf("Warning: unknown serial number.\n");
>> +	else
>> +		printf("Serial number %s\n", serial_number);
>> +
>> +	return 0;
>> +}
>> +#endif
>> +
>> +#ifdef CONFIG_MISC_INIT_R
>> +int misc_init_r(void)
>> +{
>> +	return 0;
>> +}
>> +#endif
>> +
>> +int dram_init(void)
>> +{
>> +	gd->ram_size = get_ram_size((void *)CFG_SYS_SDRAM_BASE,
>> +				    CFG_SYS_SDRAM_SIZE);
>> +	return 0;
>> +}
>> +
>> +/* SPL */
>> +#ifdef CONFIG_SPL_BUILD
>> +void spl_board_init(void)
>> +{
>> +}
>> +
>> +static void ddrc_conf(struct atmel_mpddrc_config *ddrc)
>> +{
>> +	ddrc->md = (ATMEL_MPDDRC_MD_DBW_16_BITS | ATMEL_MPDDRC_MD_DDR2_SDRAM);
>> +
>> +	ddrc->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
>> +		    ATMEL_MPDDRC_CR_NR_ROW_13 |
>> +		    ATMEL_MPDDRC_CR_CAS_DDR_CAS3 |
>> +		    ATMEL_MPDDRC_CR_DIC_DS |
>> +		    ATMEL_MPDDRC_CR_ZQ_LONG |
>> +		    ATMEL_MPDDRC_CR_NB_8BANKS |
>> +		    ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
>> +		    ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
>> +
>> +	ddrc->rtr = 0x511;
>> +
>> +	ddrc->tpr0 = ((7 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET) |
>> +		      (3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET) |
>> +		      (3 << ATMEL_MPDDRC_TPR0_TWR_OFFSET) |
>> +		      (9 << ATMEL_MPDDRC_TPR0_TRC_OFFSET) |
>> +		      (3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET) |
>> +		      (4 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET) |
>> +		      (4 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET) |
>> +		      (2 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET));
>> +
>> +	ddrc->tpr1 = ((22 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET) |
>> +		      (23 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET) |
>> +		      (200 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET) |
>> +		      (3 << ATMEL_MPDDRC_TPR1_TXP_OFFSET));
>> +
>> +	ddrc->tpr2 = ((2 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET) |
>> +		      (8 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET) |
>> +		      (4 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET) |
>> +		      (4 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET) |
>> +		      (8 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET));
>> +}
>> +
>> +void mem_init(void)
>> +{
>> +	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
>> +	struct atmel_mpddr *mpddrc = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC;
>> +	struct atmel_mpddrc_config ddrc_config;
>> +	u32 reg;
>> +
>> +	ddrc_conf(&ddrc_config);
>> +
>> +	at91_periph_clk_enable(ATMEL_ID_MPDDRC);
>> +	writel(AT91_PMC_DDR, &pmc->scer);
>> +
>> +	reg = readl(&mpddrc->io_calibr);
>> +	reg &= ~ATMEL_MPDDRC_IO_CALIBR_RDIV;
>> +	reg |= ATMEL_MPDDRC_IO_CALIBR_DDR3_RZQ_55;
>> +	reg &= ~ATMEL_MPDDRC_IO_CALIBR_TZQIO;
>> +	reg |= ATMEL_MPDDRC_IO_CALIBR_TZQIO_(101);
>> +	writel(reg, &mpddrc->io_calibr);
>> +
>> +	writel(ATMEL_MPDDRC_RD_DATA_PATH_SHIFT_ONE_CYCLE,
>> +	       &mpddrc->rd_data_path);
>> +
>> +	ddr3_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddrc_config);
>> +
>> +	writel(0x3, &mpddrc->cal_mr4);
>> +	writel(64, &mpddrc->tim_cal);
>> +}
>> +
>> +void at91_pmc_init(void)
>> +{
>> +	u32 tmp;
>> +
>> +	/*
>> +	 * While coming from the ROM code, we run on PLLA @ 492 MHz / 164 MHz,
>> +	 * so we need to slow down and configure MCKR accordingly.
>> +	 * This is why we have a special flavor of the switching function.
>> +	 */
>> +	tmp = AT91_PMC_MCKR_PLLADIV_2 |
>> +	      AT91_PMC_MCKR_MDIV_3 |
>> +	      AT91_PMC_MCKR_CSS_MAIN;
>> +	at91_mck_init_down(tmp);
>> +
>> +	tmp = AT91_PMC_PLLAR_29 |
>> +	      AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
>> +	      AT91_PMC_PLLXR_MUL(40) |
>> +	      AT91_PMC_PLLXR_DIV(1);
>> +	at91_plla_init(tmp);
>> +
>> +	tmp = AT91_PMC_MCKR_H32MXDIV |
>> +	      AT91_PMC_MCKR_PLLADIV_2 |
>> +	      AT91_PMC_MCKR_MDIV_3 |
>> +	      AT91_PMC_MCKR_CSS_PLLA;
>> +	at91_mck_init(tmp);
>> +}
>> +#endif
>> diff --git a/configs/kstr_sama5d27_defconfig b/configs/kstr_sama5d27_defconfig
>> new file mode 100644
>> index 000000000000..a0b8ea79c66b
>> --- /dev/null
>> +++ b/configs/kstr_sama5d27_defconfig
>> @@ -0,0 +1,79 @@
>> +CONFIG_ARM=y
>> +CONFIG_ARCH_AT91=y
>> +CONFIG_TEXT_BASE=0x26f00000
>> +CONFIG_SYS_LOAD_ADDR=0x24000000
>> +CONFIG_SYS_MONITOR_LEN=524288
>> +CONFIG_TARGET_KSTR_SAMA5D27=y
>> +CONFIG_SYS_MALLOC_F_LEN=0x2000
>> +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
>> +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20003ee0
>> +CONFIG_NR_DRAM_BANKS=1
>> +CONFIG_DM_GPIO=y
>> +CONFIG_DEFAULT_DEVICE_TREE="at91-kstr-sama5d27"
>> +CONFIG_DISTRO_DEFAULTS=y
>> +CONFIG_FIT=y
>> +CONFIG_OF_BOARD_SETUP=y
>> +CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2"
>> +CONFIG_SD_BOOT=y
>> +CONFIG_BOOTDELAY=3
>> +CONFIG_USE_BOOTARGS=y
>> +CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
>> +# CONFIG_USE_BOOTCOMMAND is not set
>> +# CONFIG_DISPLAY_BOARDINFO is not set
>> +CONFIG_MISC_INIT_R=y
>> +CONFIG_CMD_TLV_EEPROM=y
>> +CONFIG_CMD_IMAGE=y
>> +CONFIG_CMD_DM=y
>> +CONFIG_CMD_GPIO=y
>> +CONFIG_CMD_GPT=y
>> +CONFIG_CMD_I2C=y
>> +# CONFIG_CMD_LOADS is not set
>> +CONFIG_CMD_MMC=y
>> +CONFIG_CMD_USB=y
>> +CONFIG_CMD_USB_MASS_STORAGE=y
>> +# CONFIG_ISO_PARTITION is not set
>> +CONFIG_OF_CONTROL=y
>> +CONFIG_ENV_OVERWRITE=y
>> +CONFIG_ENV_IS_IN_FAT=y
>> +CONFIG_NET_RANDOM_ETHADDR=y
>> +CONFIG_DM=y
>> +CONFIG_CLK=y
>> +CONFIG_CLK_AT91=y
>> +CONFIG_AT91_UTMI=y
>> +CONFIG_AT91_H32MX=y
>> +CONFIG_AT91_GENERIC_CLK=y
>> +CONFIG_ATMEL_PIO4=y
>> +CONFIG_DM_I2C=y
>> +CONFIG_SYS_I2C_AT91=y
>> +CONFIG_I2C_EEPROM=y
>> +CONFIG_DM_MMC=y
>> +CONFIG_MMC_IO_VOLTAGE=y
>> +CONFIG_MMC_SDHCI=y
>> +CONFIG_MMC_SDHCI_SDMA=y
>> +CONFIG_MMC_SDHCI_ATMEL=y
>> +CONFIG_PHY_MICREL=y
>> +CONFIG_DM_ETH=y
>> +CONFIG_MACB=y
>> +CONFIG_PINCTRL=y
>> +CONFIG_PINCTRL_AT91PIO4=y
>> +CONFIG_DM_SERIAL=y
>> +CONFIG_ATMEL_USART=y
>> +CONFIG_TEE=y
>> +CONFIG_OPTEE=y
>> +CONFIG_SYSRESET=y
>> +CONFIG_SYSRESET_AT91=y
>> +CONFIG_DM_RESET=y
>> +CONFIG_RESET_AT91=y
>> +CONFIG_TIMER=y
>> +CONFIG_ATMEL_PIT_TIMER=y
>> +CONFIG_USB=y
>> +CONFIG_DM_USB=y
>> +CONFIG_USB_EHCI_HCD=y
>> +CONFIG_USB_GADGET=y
>> +CONFIG_USB_GADGET_VENDOR_NUM=0x16c0
>> +CONFIG_USB_GADGET_PRODUCT_NUM=0x03e9
>> +CONFIG_USB_GADGET_ATMEL_USBA=y
>> +CONFIG_USB_GADGET_DOWNLOAD=y
>> +CONFIG_OF_LIBFDT_OVERLAY=y
>> +CONFIG_SPL_OF_LIBFDT=y
>> +# CONFIG_EFI_LOADER is not set
>> diff --git a/include/configs/kstr-sama5d27.h b/include/configs/kstr-sama5d27.h
>> new file mode 100644
>> index 000000000000..772a073ba209
>> --- /dev/null
>> +++ b/include/configs/kstr-sama5d27.h
>> @@ -0,0 +1,15 @@
>> +/* SPDX-License-Identifier: GPL-2.0+ */
>> +/*
>> + * Copyright (C) 2021-2023 Conclusive Engineering Sp. z o. o.
>> + */
>> +
>> +#ifndef __CONFIG_H
>> +#define __CONFIG_H
>> +
>> +#include "at91-sama5_common.h"
>> +
>> +/* SDRAM */
>> +#define CFG_SYS_SDRAM_BASE           0x20000000
>> +#define CFG_SYS_SDRAM_SIZE           0x10000000
>> +
>> +#endif
Eugen Hristev Sept. 27, 2023, 8:54 p.m. UTC | #3
On 9/25/23 22:31, Artur Rojek wrote:
> Hey Eugen,
> 
> thanks for the review.
>> Hello,
>>
>> Thank you for your patch,
>>
>> On 9/21/23 18:37, Artur Rojek wrote:
>>> Introduce support for Conclusive KSTR-SAMA5D27 Single Board Computer.
>>>
>>> Co-developed-by: Jakub Klama <jakub@conclusive.pl>
>>> Signed-off-by: Jakub Klama <jakub@conclusive.pl>
>>> Co-developed-by: Marcin Jabrzyk <marcin@conclusive.pl>
>>> Signed-off-by: Marcin Jabrzyk <marcin@conclusive.pl>
>>> Signed-off-by: Artur Rojek <artur@conclusive.pl>
>>> ---
>>>    arch/arm/dts/Makefile                         |   3 +
>>>    arch/arm/dts/at91-kstr-sama5d27.dts           | 310 ++++++++++++++++++
>>>    arch/arm/mach-at91/Kconfig                    |  13 +
>>>    board/conclusive/kstr-sama5d27/Kconfig        |  15 +
>>>    board/conclusive/kstr-sama5d27/MAINTAINERS    |   8 +
>>>    board/conclusive/kstr-sama5d27/Makefile       |   5 +
>>>    .../conclusive/kstr-sama5d27/kstr-sama5d27.c  | 235 +++++++++++++
>>>    configs/kstr_sama5d27_defconfig               |  79 +++++
>>>    include/configs/kstr-sama5d27.h               |  15 +
>>>    9 files changed, 683 insertions(+)
>>>    create mode 100644 arch/arm/dts/at91-kstr-sama5d27.dts
>>>    create mode 100644 board/conclusive/kstr-sama5d27/Kconfig
>>>    create mode 100644 board/conclusive/kstr-sama5d27/MAINTAINERS
>>>    create mode 100644 board/conclusive/kstr-sama5d27/Makefile
>>>    create mode 100644 board/conclusive/kstr-sama5d27/kstr-sama5d27.c
>>>    create mode 100644 configs/kstr_sama5d27_defconfig
>>>    create mode 100644 include/configs/kstr-sama5d27.h
>>>
>>> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
>>> index 85fd5b1157b1..8e4d33c01912 100644
>>> --- a/arch/arm/dts/Makefile
>>> +++ b/arch/arm/dts/Makefile
>>> @@ -1198,6 +1198,9 @@ dtb-$(CONFIG_TARGET_SAMA5D27_SOM1_EK) += \
>>>    dtb-$(CONFIG_TARGET_SAMA5D27_WLSOM1_EK) += \
>>>    	at91-sama5d27_wlsom1_ek.dtb
>>>    
>>> +dtb-$(CONFIG_TARGET_KSTR_SAMA5D27) += \
>>> +	at91-kstr-sama5d27.dtb
>>> +
>>>    dtb-$(CONFIG_TARGET_SAMA5D2_ICP) += \
>>>    	at91-sama5d2_icp.dtb
>>>    
>>> diff --git a/arch/arm/dts/at91-kstr-sama5d27.dts b/arch/arm/dts/at91-kstr-sama5d27.dts
>>> new file mode 100644
>>> index 000000000000..6de918a3c964
>>> --- /dev/null
>>> +++ b/arch/arm/dts/at91-kstr-sama5d27.dts
>>> @@ -0,0 +1,310 @@
>>> +// SPDX-License-Identifier: GPL-2.0+ OR X11
>>> +/*
>>> + * at91-kstr-sama5d27.dts - Device Tree file for Conclusive KSTR-SAMA5D27 board
>>> + *
>>> + *  Copyright (C) 2019-2023 Conclusive Engineering Sp. z o. o.
>>
>> SPDX tag is enough, no need to replicate the license text below
>>
>>> + *
>>> + * This file is dual-licensed: you can use it either under the terms
>>> + * of the GPL or the X11 license, at your option. Note that this dual
>>> + * licensing only applies to this file, and not this project as a
>>> + * whole.
>>> + *
>>> + *  a) This file 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 file 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.
>>> + *
>>> + * Or, alternatively,
>>> + *
>>> + *  b) Permission is hereby granted, free of charge, to any person
>>> + *     obtaining a copy of this software and associated documentation
>>> + *     files (the "Software"), to deal in the Software without
>>> + *     restriction, including without limitation the rights to use,
>>> + *     copy, modify, merge, publish, distribute, sublicense, and/or
>>> + *     sell copies of the Software, and to permit persons to whom the
>>> + *     Software is furnished to do so, subject to the following
>>> + *     conditions:
>>> + *
>>> + *     The above copyright notice and this permission notice shall be
>>> + *     included in all copies or substantial portions of the Software.
>>> + *
>>> + *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>>> + *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
>>> + *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
>>> + *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
>>> + *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
>>> + *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>>> + *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>>> + *     OTHER DEALINGS IN THE SOFTWARE.
>>> + */
>>> +/dts-v1/;
>>> +
>>> +#include "sama5d2.dtsi"
>>> +#include "sama5d2-pinfunc.h"
>>> +#include <dt-bindings/interrupt-controller/irq.h>
>>> +#include <dt-bindings/gpio/gpio.h>
>>> +
>>> +/ {
>>> +	model = "Conclusive KSTR-SAMA5D27";
>>> +	compatible = "conclusive,kstr-sama5d27", "atmel,sama5d2", "atmel,sama5";
>>> +
>>> +	chosen {
>>> +		bootph-all;
>>> +		stdout-path = &uart1;
>>> +	};
>>> +
>>> +	clocks {
>>> +		main_xtal: main_xtal {
>>> +			clock-frequency = <12000000>;
>>> +		};
>>> +	};
>>> +
>>> +	ahb {
>>> +			usb0: gadget@00300000 {
>>
>> I feel this line is not properly aligned
>>
>>> +			#address-cells = <1>;
>>> +			#size-cells = <0>;
>>> +			compatible = "atmel,sama5d3-udc";
>>> +			reg = <0x00300000 0x100000
>>> +				0xfc02c000 0x400>;
>>> +			interrupts = <42 IRQ_TYPE_LEVEL_HIGH 2>;
>>> +			clocks = <&udphs_clk>, <&utmi>;
>>> +			clock-names = "pclk", "hclk";
>>> +			status = "okay";
>>
>> This gadget appears to be SoC specific, is it not described in
>> sama5d2.dtsi right ? Do you think it would be beneficial to add it as a
>> separate patch to sama5d2.dtsi ?
> It would be beneficial to do that, although, embarrassingly, I just
> noticed that the driver in question (atmel_usba_udc.c) does not use DT
> at all... Instead, it uses hardcoded pdata for endpoint configuration.
> So this entire node will be dropped in v2.
>>
>>> +
>>> +			ep0: endpoint@0 {
>>> +				reg = <0>;
>>> +				atmel,fifo-size = <64>;
>>> +				atmel,nb-banks = <1>;
>>> +			};
>>> +
>>> +			ep1: endpoint@1 {
>>> +				reg = <1>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <3>;
>>> +				atmel,can-dma;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep2: endpoint@2 {
>>> +				reg = <2>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <3>;
>>> +				atmel,can-dma;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep3: endpoint@3 {
>>> +				reg = <3>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-dma;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep4: endpoint@4 {
>>> +				reg = <4>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-dma;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep5: endpoint@5 {
>>> +				reg = <5>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-dma;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep6: endpoint@6 {
>>> +				reg = <6>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-dma;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep7: endpoint@7 {
>>> +				reg = <7>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-dma;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep8: endpoint@8 {
>>> +				reg = <8>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep9: endpoint@9 {
>>> +				reg = <9>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep10: endpoint@a {
>>> +				reg = <10>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep11: endpoint@b {
>>> +				reg = <11>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep12: endpoint@c {
>>> +				reg = <12>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep13: endpoint@d {
>>> +				reg = <13>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep14: endpoint@e {
>>> +				reg = <14>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-isoc;
>>> +			};
>>> +
>>> +			ep15: endpoint@f {
>>> +				reg = <15>;
>>> +				atmel,fifo-size = <1024>;
>>> +				atmel,nb-banks = <2>;
>>> +				atmel,can-isoc;
>>> +			};
>>> +		};
>>> +
>>> +		sdmmc0: sdio-host@a0000000 {
>>> +			bus-width = <4>;
>>> +			pinctrl-names = "default";
>>> +			pinctrl-0 = <&pinctrl_sdmmc0_cmd_dat_default &pinctrl_sdmmc0_ck_cd_default>;
>>> +			status = "okay";
>>> +			bootph-all;
>>> +		};
>>> +
>>> +		apb {
>>> +			uart1: serial@f8020000 {
>>> +				pinctrl-names = "default";
>>> +				pinctrl-0 = <&pinctrl_uart1_default>;
>>> +				status = "okay";
>>> +				bootph-all;
>>> +			};
>>> +
>>> +			macb0: ethernet@f8008000 {
>>> +				pinctrl-names = "default";
>>> +				pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;
>>> +				phy-mode = "rmii";
>>> +				status = "okay";
>>> +
>>> +				ethernet-phy@0 {
>>> +					reg = <0x0>;
>>> +					reset-gpios = <&pioA 44 GPIO_ACTIVE_LOW>;
>>> +				};
>>> +			};
>>> +
>>> +			i2c@fc018000 {
>>
>> I have a feeling this node should also reside in sama5d2.dtsi, and that
>> it's a flexcom in fact (judging by how you hack it later), you should
>> enable the flexcom driver and have this as a child node of the flexcom
>> node (there are some examples done in other sama*.dtsi)
> Indeed. Will be done in v2.
>>
>>> +				compatible = "atmel,sama5d2-i2c";
>>> +				reg = <0xfc018600 0x100>;
>>> +				#address-cells = <1>;
>>> +				#size-cells = <0>;
>>> +				clocks = <&flx4_clk>;
>>> +				clock-names = "i2c2_clk";
>>> +				clock-frequency = <100000>;
>>> +				pinctrl-names = "default";
>>> +				pinctrl-0 = <&pinctrl_flx4_i2c>;
>>> +				status = "okay";
>>> +
>>> +				eeprom: eeprom@50 {
>>> +					compatible = "microchip,24c32", "atmel,24c32";
>>> +					reg = <0x50>;
>>> +					read-only;
>>> +					pagesize = <32>;
>>> +					status = "okay";
>>> +				};
>>> +
>>> +				pmic: pmic@5b {
>>> +					compatible = "active-semi,act8945a";
>>> +					reg = <0x5b>;
>>> +					status = "okay";
>>> +				};
>>> +			};
>>> +
>>> +			pioA: pinctrl@fc038000 {
>>> +				pinctrl {
>>> +					pinctrl_uart1_default: uart1_default {
>>> +						pinmux = <PIN_PD2__URXD1>,
>>> +							 <PIN_PD3__UTXD1>;
>>> +						bias-disable;
>>> +						bootph-all;
>>> +					};
>>> +
>>> +					pinctrl_macb0_phy_irq: macb0_phy_irq {
>>> +						pinmux = <PIN_PB13__GPIO>;
>>> +						bias-disable;
>>> +						bootph-all;
>>> +					};
>>> +
>>> +					pinctrl_macb0_rmii: macb0_rmii {
>>> +						pinmux = <PIN_PB14__GTXCK>,
>>> +							 <PIN_PB15__GTXEN>,
>>> +							 <PIN_PB16__GRXDV>,
>>> +							 <PIN_PB17__GRXER>,
>>> +							 <PIN_PB18__GRX0>,
>>> +							 <PIN_PB19__GRX1>,
>>> +							 <PIN_PB20__GTX0>,
>>> +							 <PIN_PB21__GTX1>,
>>> +							 <PIN_PB22__GMDC>,
>>> +							 <PIN_PB23__GMDIO>;
>>> +						bias-disable;
>>> +						bootph-all;
>>> +					};
>>> +
>>> +					pinctrl_sdmmc0_cmd_dat_default: sdmmc0_cmd_dat_default {
>>> +						pinmux = <PIN_PA1__SDMMC0_CMD>,
>>> +							 <PIN_PA2__SDMMC0_DAT0>,
>>> +							 <PIN_PA3__SDMMC0_DAT1>,
>>> +							 <PIN_PA4__SDMMC0_DAT2>,
>>> +							 <PIN_PA5__SDMMC0_DAT3>;
>>> +						bias-pull-up;
>>> +						bootph-all;
>>> +					};
>>> +
>>> +					pinctrl_sdmmc0_ck_cd_default: sdmmc0_ck_cd_default {
>>> +						pinmux = <PIN_PA0__SDMMC0_CK>,
>>> +							 <PIN_PA11__SDMMC0_VDDSEL>,
>>> +							 <PIN_PA13__SDMMC0_CD>;
>>> +						bias-disable;
>>> +						bootph-all;
>>> +					};
>>> +
>>> +					pinctrl_flx4_i2c: flx4_i2c {
>>> +						pinmux = <PIN_PC28__FLEXCOM4_IO0>,
>>> +							 <PIN_PC29__FLEXCOM4_IO1>;
>>> +						bias-disable;
>>> +					};
>>> +				};
>>> +			};
>>> +		};
>>> +	};
>>> +};
>>> diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
>>> index 7c2e4ebbdb0f..9ab1a9339ee1 100644
>>> --- a/arch/arm/mach-at91/Kconfig
>>> +++ b/arch/arm/mach-at91/Kconfig
>>> @@ -204,6 +204,18 @@ config TARGET_SAMA5D27_WLSOM1_EK
>>>    	  processor-based SAMA5D2 MPU with 2 Gbit LPDDR2-SDRAM
>>>    	  in a single package.
>>>    
>>> +config TARGET_KSTR_SAMA5D27
>>> +	bool "Conclusive KSTR-SAMA5D27 board"
>>> +	select BOARD_EARLY_INIT_F
>>> +	select SAMA5D2
>>> +	select BOARD_LATE_INIT
>>> +	help
>>> +	  The KSTR-SAMA5D27 embeds SAMA5D27 SoC, together with
>>> +	  256 MiB SDRAM, 10/100 Mbit/s Ethernet, 96 Mbit/s Wi-Fi b/g/n,
>>> +	  Bluetooth 4.1 LE, USB OTG controller w/ type-C USB connector
>>> +	  and stackable GPIO headers in an all-in-one SBC form factor:
>>> +	  https://conclusive.pl/products/kstr-sama5d27-sbc/
>>> +
>>>    config TARGET_SAMA5D2_ICP
>>>    	bool "SAMA5D2 Industrial Connectivity Platform (ICP)"
>>>    	select SAMA5D2
>>> @@ -352,6 +364,7 @@ source "board/atmel/sama5d4_xplained/Kconfig"
>>>    source "board/atmel/sama5d4ek/Kconfig"
>>>    source "board/bluewater/gurnard/Kconfig"
>>>    source "board/calao/usb_a9263/Kconfig"
>>> +source "board/conclusive/kstr-sama5d27/Kconfig"
>>>    source "board/egnite/ethernut5/Kconfig"
>>>    source "board/esd/meesc/Kconfig"
>>>    source "board/gardena/smart-gateway-at91sam/Kconfig"
>>> diff --git a/board/conclusive/kstr-sama5d27/Kconfig b/board/conclusive/kstr-sama5d27/Kconfig
>>> new file mode 100644
>>> index 000000000000..572551cfda98
>>> --- /dev/null
>>> +++ b/board/conclusive/kstr-sama5d27/Kconfig
>>> @@ -0,0 +1,15 @@
>>> +if TARGET_KSTR_SAMA5D27
>>> +
>>> +config SYS_BOARD
>>> +	default "kstr-sama5d27"
>>> +
>>> +config SYS_VENDOR
>>> +	default "conclusive"
>>> +
>>> +config SYS_SOC
>>> +	default "at91"
>>> +
>>> +config SYS_CONFIG_NAME
>>> +	default "kstr-sama5d27"
>>> +
>>> +endif
>>> diff --git a/board/conclusive/kstr-sama5d27/MAINTAINERS b/board/conclusive/kstr-sama5d27/MAINTAINERS
>>> new file mode 100644
>>> index 000000000000..cb1635cdd280
>>> --- /dev/null
>>> +++ b/board/conclusive/kstr-sama5d27/MAINTAINERS
>>> @@ -0,0 +1,8 @@
>>> +CONCLUSIVE KSTR-SAMA5D27 BOARD
>>> +M:	Jakub Klama <jakub@conclusive.pl>
>>> +M:	Artur Rojek <artur@conclusive.pl>
>>> +S:	Maintained
>>> +F:	board/conclusive/kstr-sama5d27
>>> +F:	include/configs/kstr-sama5d27.h
>>> +F:	configs/kstr_sama5d27_defconfig
>>> +F:	arch/arm/dts/at91-kstr-sama5d27.dts
>>> diff --git a/board/conclusive/kstr-sama5d27/Makefile b/board/conclusive/kstr-sama5d27/Makefile
>>> new file mode 100644
>>> index 000000000000..edf7d1c93441
>>> --- /dev/null
>>> +++ b/board/conclusive/kstr-sama5d27/Makefile
>>> @@ -0,0 +1,5 @@
>>> +# SPDX-License-Identifier: GPL-2.0+
>>> +#
>>> +# Copyright (C) 2019-2023 Conclusive Engineering Sp. z o. o.
>>> +
>>> +obj-y += kstr-sama5d27.o
>>> diff --git a/board/conclusive/kstr-sama5d27/kstr-sama5d27.c b/board/conclusive/kstr-sama5d27/kstr-sama5d27.c
>>> new file mode 100644
>>> index 000000000000..e29fd00544bd
>>> --- /dev/null
>>> +++ b/board/conclusive/kstr-sama5d27/kstr-sama5d27.c
>>> @@ -0,0 +1,235 @@
>>> +// SPDX-License-Identifier: GPL-2.0+
>>> +/*
>>> + * kstr-sama5d27.c - Board init file for Conclusive KSTR-SAMA5D27 board
>>> + * Copyright (C) 2021-2023 Conclusive Engineering Sp. z o. o.
>>> + */
>>> +
>>> +#include <common.h>
>>> +#include <debug_uart.h>
>>> +#include <init.h>
>>> +#include <env.h>
>>> +#include <fdt_support.h>
>>> +#include <asm/global_data.h>
>>> +#include <asm/io.h>
>>> +#include <asm/arch/at91_common.h>
>>> +#include <asm/arch/atmel_pio4.h>
>>> +#include <asm/arch/atmel_mpddrc.h>
>>> +#include <asm/arch/atmel_sdhci.h>
>>> +#include <asm/arch/clk.h>
>>> +#include <asm/arch/gpio.h>
>>> +#include <asm/arch/sama5d2.h>
>>> +#include <linux/delay.h>
>>> +
>>> +#ifdef CONFIG_USB_GADGET_ATMEL_USBA
>>> +#include <asm/arch/atmel_usba_udc.h>
>>> +#endif
>>> +
>>> +DECLARE_GLOBAL_DATA_PTR;
>>> +
>>> +#ifdef CONFIG_DEBUG_UART_BOARD_INIT
>>> +static void board_uart1_hw_init(void)
>>> +{
>>> +	/* URXD1 */
>>> +	atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, ATMEL_PIO_PUEN_MASK);
>>> +	/* UTXD1 */
>>> +	atmel_pio4_set_a_periph(AT91_PIO_PORTD, 3, 0);
>>> +	at91_periph_clk_enable(ATMEL_ID_UART1);
>>> +}
>>> +
>>> +void board_debug_uart_init(void)
>>> +{
>>> +	board_uart1_hw_init();
>>> +}
>>> +#endif
>>> +
>>> +void board_lan8720a_init(void)
>>> +{
>>> +	/* LAN8720A_nRST */
>>> +	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, 0);
>>> +	/*
>>> +	 * Force 0 on RXER/PHYAD0. LAN8720A chipset will latch with address 0 on
>>> +	 * MDIO bus.
>>> +	 */
>>> +	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 17, 0);
>>> +	/* Minimal delay of reset signal is 25 ms */
>>> +	mdelay(30);
>>> +	/* LAN8720A_nRST */
>>> +	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, 1);
>>> +}
>>> +
>>> +void board_usba_init(void)
>>> +{
>>> +#ifdef CONFIG_USB_GADGET_ATMEL_USBA
>>> +	/* USB device peripheral initialization: sama5d2_devices.c */
>>> +	at91_udp_hw_init();
>>> +	/* USB device controller drivers/usb/gadget/atmel_usba_udc.c */
>>> +	usba_udc_probe(&pdata);
>>
>> Any reason to probe the UDC here and not on-demand lazy probing when
>> it's required ?
> This driver doesn't use U_BOOT_DRIVER style declaration, so the board
> init has to call the probe manually. It would be nice to rewrite it to
> do that, and also to sample platform data from OF, however I'd like to
> avoid doing that in this series (which merely tries to add a new board).
>>
>>> +#endif
>>> +}
>>> +
>>> +#ifdef CONFIG_BOARD_EARLY_INIT_F
>>> +int board_early_init_f(void)
>>> +{
>>> +#ifdef CONFIG_DEBUG_UART
>>> +	debug_uart_init();
>>> +#endif
>>> +	/* Initialize FLEXCOM 4 in TWI(I2C) mode */
>>> +	writel(0x3, 0xfc018000);
>>
>> There is a driver for flexcom, as stated above
>>
>>> +	return 0;
>>> +}
>>> +#endif
>>> +
>>> +int ft_board_setup(void *blob, struct bd_info *bd)
>>> +{
>>> +	char *wlanaddr = env_get("eth1addr");
>>> +
>>> +	if (wlanaddr)
>>> +		do_fixup_by_compat(blob, "brcm,bcm4329-fmac", "local-mac-address",
>>> +				   wlanaddr, strlen(wlanaddr), 1);
>>> +	else
>>> +		printf("Not setting WIFI mac address. Check if EEPROM TLV is correctly set up.\n");
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +int board_init(void)
>>> +{
>>> +	/* address of boot parameters */
>>> +	gd->bd->bi_boot_params = CFG_SYS_SDRAM_BASE + 0x100;
>>> +
>>> +	board_usba_init();
>>> +	board_lan8720a_init();
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +#ifdef CONFIG_BOARD_LATE_INIT
>>> +int board_late_init(void)
>>> +{
>>> +	const char *serial_number;
>>> +
>>> +	populate_serial_number(0);
>>> +
>>> +	printf("Conclusive KSTR-SAMA5D27\n");
>>
>> Normally, the board name is printed by U-boot, why duplicate it here ?
> Doesn't happen on our board and I couldn't find a generic mechanism that
> would do that. Did I miss something? Other boards which print their
> names also seem to have custom logic for it.

Have you tried CONFIG_DISPLAY_BOARDINFO ?
> 
> Cheers,
> Artur
>>> +
>>> +	serial_number = env_get("serial#");
>>> +	if (!serial_number)
>>> +		printf("Warning: unknown serial number.\n");
>>> +	else
>>> +		printf("Serial number %s\n", serial_number);
>>> +
>>> +	return 0;
>>> +}
>>> +#endif
>>> +
>>> +#ifdef CONFIG_MISC_INIT_R
>>> +int misc_init_r(void)
>>> +{
>>> +	return 0;
>>> +}
>>> +#endif
>>> +
>>> +int dram_init(void)
>>> +{
>>> +	gd->ram_size = get_ram_size((void *)CFG_SYS_SDRAM_BASE,
>>> +				    CFG_SYS_SDRAM_SIZE);
>>> +	return 0;
>>> +}
>>> +
>>> +/* SPL */
>>> +#ifdef CONFIG_SPL_BUILD
>>> +void spl_board_init(void)
>>> +{
>>> +}
>>> +
>>> +static void ddrc_conf(struct atmel_mpddrc_config *ddrc)
>>> +{
>>> +	ddrc->md = (ATMEL_MPDDRC_MD_DBW_16_BITS | ATMEL_MPDDRC_MD_DDR2_SDRAM);
>>> +
>>> +	ddrc->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
>>> +		    ATMEL_MPDDRC_CR_NR_ROW_13 |
>>> +		    ATMEL_MPDDRC_CR_CAS_DDR_CAS3 |
>>> +		    ATMEL_MPDDRC_CR_DIC_DS |
>>> +		    ATMEL_MPDDRC_CR_ZQ_LONG |
>>> +		    ATMEL_MPDDRC_CR_NB_8BANKS |
>>> +		    ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
>>> +		    ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
>>> +
>>> +	ddrc->rtr = 0x511;
>>> +
>>> +	ddrc->tpr0 = ((7 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET) |
>>> +		      (3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET) |
>>> +		      (3 << ATMEL_MPDDRC_TPR0_TWR_OFFSET) |
>>> +		      (9 << ATMEL_MPDDRC_TPR0_TRC_OFFSET) |
>>> +		      (3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET) |
>>> +		      (4 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET) |
>>> +		      (4 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET) |
>>> +		      (2 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET));
>>> +
>>> +	ddrc->tpr1 = ((22 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET) |
>>> +		      (23 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET) |
>>> +		      (200 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET) |
>>> +		      (3 << ATMEL_MPDDRC_TPR1_TXP_OFFSET));
>>> +
>>> +	ddrc->tpr2 = ((2 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET) |
>>> +		      (8 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET) |
>>> +		      (4 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET) |
>>> +		      (4 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET) |
>>> +		      (8 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET));
>>> +}
>>> +
>>> +void mem_init(void)
>>> +{
>>> +	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
>>> +	struct atmel_mpddr *mpddrc = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC;
>>> +	struct atmel_mpddrc_config ddrc_config;
>>> +	u32 reg;
>>> +
>>> +	ddrc_conf(&ddrc_config);
>>> +
>>> +	at91_periph_clk_enable(ATMEL_ID_MPDDRC);
>>> +	writel(AT91_PMC_DDR, &pmc->scer);
>>> +
>>> +	reg = readl(&mpddrc->io_calibr);
>>> +	reg &= ~ATMEL_MPDDRC_IO_CALIBR_RDIV;
>>> +	reg |= ATMEL_MPDDRC_IO_CALIBR_DDR3_RZQ_55;
>>> +	reg &= ~ATMEL_MPDDRC_IO_CALIBR_TZQIO;
>>> +	reg |= ATMEL_MPDDRC_IO_CALIBR_TZQIO_(101);
>>> +	writel(reg, &mpddrc->io_calibr);
>>> +
>>> +	writel(ATMEL_MPDDRC_RD_DATA_PATH_SHIFT_ONE_CYCLE,
>>> +	       &mpddrc->rd_data_path);
>>> +
>>> +	ddr3_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddrc_config);
>>> +
>>> +	writel(0x3, &mpddrc->cal_mr4);
>>> +	writel(64, &mpddrc->tim_cal);
>>> +}
>>> +
>>> +void at91_pmc_init(void)
>>> +{
>>> +	u32 tmp;
>>> +
>>> +	/*
>>> +	 * While coming from the ROM code, we run on PLLA @ 492 MHz / 164 MHz,
>>> +	 * so we need to slow down and configure MCKR accordingly.
>>> +	 * This is why we have a special flavor of the switching function.
>>> +	 */
>>> +	tmp = AT91_PMC_MCKR_PLLADIV_2 |
>>> +	      AT91_PMC_MCKR_MDIV_3 |
>>> +	      AT91_PMC_MCKR_CSS_MAIN;
>>> +	at91_mck_init_down(tmp);
>>> +
>>> +	tmp = AT91_PMC_PLLAR_29 |
>>> +	      AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
>>> +	      AT91_PMC_PLLXR_MUL(40) |
>>> +	      AT91_PMC_PLLXR_DIV(1);
>>> +	at91_plla_init(tmp);
>>> +
>>> +	tmp = AT91_PMC_MCKR_H32MXDIV |
>>> +	      AT91_PMC_MCKR_PLLADIV_2 |
>>> +	      AT91_PMC_MCKR_MDIV_3 |
>>> +	      AT91_PMC_MCKR_CSS_PLLA;
>>> +	at91_mck_init(tmp);
>>> +}
>>> +#endif
>>> diff --git a/configs/kstr_sama5d27_defconfig b/configs/kstr_sama5d27_defconfig
>>> new file mode 100644
>>> index 000000000000..a0b8ea79c66b
>>> --- /dev/null
>>> +++ b/configs/kstr_sama5d27_defconfig
>>> @@ -0,0 +1,79 @@
>>> +CONFIG_ARM=y
>>> +CONFIG_ARCH_AT91=y
>>> +CONFIG_TEXT_BASE=0x26f00000
>>> +CONFIG_SYS_LOAD_ADDR=0x24000000
>>> +CONFIG_SYS_MONITOR_LEN=524288
>>> +CONFIG_TARGET_KSTR_SAMA5D27=y
>>> +CONFIG_SYS_MALLOC_F_LEN=0x2000
>>> +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
>>> +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20003ee0
>>> +CONFIG_NR_DRAM_BANKS=1
>>> +CONFIG_DM_GPIO=y
>>> +CONFIG_DEFAULT_DEVICE_TREE="at91-kstr-sama5d27"
>>> +CONFIG_DISTRO_DEFAULTS=y
>>> +CONFIG_FIT=y
>>> +CONFIG_OF_BOARD_SETUP=y
>>> +CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2"
>>> +CONFIG_SD_BOOT=y
>>> +CONFIG_BOOTDELAY=3
>>> +CONFIG_USE_BOOTARGS=y
>>> +CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
>>> +# CONFIG_USE_BOOTCOMMAND is not set
>>> +# CONFIG_DISPLAY_BOARDINFO is not set
>>> +CONFIG_MISC_INIT_R=y
>>> +CONFIG_CMD_TLV_EEPROM=y
>>> +CONFIG_CMD_IMAGE=y
>>> +CONFIG_CMD_DM=y
>>> +CONFIG_CMD_GPIO=y
>>> +CONFIG_CMD_GPT=y
>>> +CONFIG_CMD_I2C=y
>>> +# CONFIG_CMD_LOADS is not set
>>> +CONFIG_CMD_MMC=y
>>> +CONFIG_CMD_USB=y
>>> +CONFIG_CMD_USB_MASS_STORAGE=y
>>> +# CONFIG_ISO_PARTITION is not set
>>> +CONFIG_OF_CONTROL=y
>>> +CONFIG_ENV_OVERWRITE=y
>>> +CONFIG_ENV_IS_IN_FAT=y
>>> +CONFIG_NET_RANDOM_ETHADDR=y
>>> +CONFIG_DM=y
>>> +CONFIG_CLK=y
>>> +CONFIG_CLK_AT91=y
>>> +CONFIG_AT91_UTMI=y
>>> +CONFIG_AT91_H32MX=y
>>> +CONFIG_AT91_GENERIC_CLK=y
>>> +CONFIG_ATMEL_PIO4=y
>>> +CONFIG_DM_I2C=y
>>> +CONFIG_SYS_I2C_AT91=y
>>> +CONFIG_I2C_EEPROM=y
>>> +CONFIG_DM_MMC=y
>>> +CONFIG_MMC_IO_VOLTAGE=y
>>> +CONFIG_MMC_SDHCI=y
>>> +CONFIG_MMC_SDHCI_SDMA=y
>>> +CONFIG_MMC_SDHCI_ATMEL=y
>>> +CONFIG_PHY_MICREL=y
>>> +CONFIG_DM_ETH=y
>>> +CONFIG_MACB=y
>>> +CONFIG_PINCTRL=y
>>> +CONFIG_PINCTRL_AT91PIO4=y
>>> +CONFIG_DM_SERIAL=y
>>> +CONFIG_ATMEL_USART=y
>>> +CONFIG_TEE=y
>>> +CONFIG_OPTEE=y
>>> +CONFIG_SYSRESET=y
>>> +CONFIG_SYSRESET_AT91=y
>>> +CONFIG_DM_RESET=y
>>> +CONFIG_RESET_AT91=y
>>> +CONFIG_TIMER=y
>>> +CONFIG_ATMEL_PIT_TIMER=y
>>> +CONFIG_USB=y
>>> +CONFIG_DM_USB=y
>>> +CONFIG_USB_EHCI_HCD=y
>>> +CONFIG_USB_GADGET=y
>>> +CONFIG_USB_GADGET_VENDOR_NUM=0x16c0
>>> +CONFIG_USB_GADGET_PRODUCT_NUM=0x03e9
>>> +CONFIG_USB_GADGET_ATMEL_USBA=y
>>> +CONFIG_USB_GADGET_DOWNLOAD=y
>>> +CONFIG_OF_LIBFDT_OVERLAY=y
>>> +CONFIG_SPL_OF_LIBFDT=y
>>> +# CONFIG_EFI_LOADER is not set
>>> diff --git a/include/configs/kstr-sama5d27.h b/include/configs/kstr-sama5d27.h
>>> new file mode 100644
>>> index 000000000000..772a073ba209
>>> --- /dev/null
>>> +++ b/include/configs/kstr-sama5d27.h
>>> @@ -0,0 +1,15 @@
>>> +/* SPDX-License-Identifier: GPL-2.0+ */
>>> +/*
>>> + * Copyright (C) 2021-2023 Conclusive Engineering Sp. z o. o.
>>> + */
>>> +
>>> +#ifndef __CONFIG_H
>>> +#define __CONFIG_H
>>> +
>>> +#include "at91-sama5_common.h"
>>> +
>>> +/* SDRAM */
>>> +#define CFG_SYS_SDRAM_BASE           0x20000000
>>> +#define CFG_SYS_SDRAM_SIZE           0x10000000
>>> +
>>> +#endif
diff mbox series

Patch

diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 85fd5b1157b1..8e4d33c01912 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -1198,6 +1198,9 @@  dtb-$(CONFIG_TARGET_SAMA5D27_SOM1_EK) += \
 dtb-$(CONFIG_TARGET_SAMA5D27_WLSOM1_EK) += \
 	at91-sama5d27_wlsom1_ek.dtb
 
+dtb-$(CONFIG_TARGET_KSTR_SAMA5D27) += \
+	at91-kstr-sama5d27.dtb
+
 dtb-$(CONFIG_TARGET_SAMA5D2_ICP) += \
 	at91-sama5d2_icp.dtb
 
diff --git a/arch/arm/dts/at91-kstr-sama5d27.dts b/arch/arm/dts/at91-kstr-sama5d27.dts
new file mode 100644
index 000000000000..6de918a3c964
--- /dev/null
+++ b/arch/arm/dts/at91-kstr-sama5d27.dts
@@ -0,0 +1,310 @@ 
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * at91-kstr-sama5d27.dts - Device Tree file for Conclusive KSTR-SAMA5D27 board
+ *
+ *  Copyright (C) 2019-2023 Conclusive Engineering Sp. z o. o.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file 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 file 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.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+/dts-v1/;
+
+#include "sama5d2.dtsi"
+#include "sama5d2-pinfunc.h"
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+	model = "Conclusive KSTR-SAMA5D27";
+	compatible = "conclusive,kstr-sama5d27", "atmel,sama5d2", "atmel,sama5";
+
+	chosen {
+		bootph-all;
+		stdout-path = &uart1;
+	};
+
+	clocks {
+		main_xtal: main_xtal {
+			clock-frequency = <12000000>;
+		};
+	};
+
+	ahb {
+			usb0: gadget@00300000 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "atmel,sama5d3-udc";
+			reg = <0x00300000 0x100000
+				0xfc02c000 0x400>;
+			interrupts = <42 IRQ_TYPE_LEVEL_HIGH 2>;
+			clocks = <&udphs_clk>, <&utmi>;
+			clock-names = "pclk", "hclk";
+			status = "okay";
+
+			ep0: endpoint@0 {
+				reg = <0>;
+				atmel,fifo-size = <64>;
+				atmel,nb-banks = <1>;
+			};
+
+			ep1: endpoint@1 {
+				reg = <1>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <3>;
+				atmel,can-dma;
+				atmel,can-isoc;
+			};
+
+			ep2: endpoint@2 {
+				reg = <2>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <3>;
+				atmel,can-dma;
+				atmel,can-isoc;
+			};
+
+			ep3: endpoint@3 {
+				reg = <3>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-dma;
+				atmel,can-isoc;
+			};
+
+			ep4: endpoint@4 {
+				reg = <4>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-dma;
+				atmel,can-isoc;
+			};
+
+			ep5: endpoint@5 {
+				reg = <5>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-dma;
+				atmel,can-isoc;
+			};
+
+			ep6: endpoint@6 {
+				reg = <6>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-dma;
+				atmel,can-isoc;
+			};
+
+			ep7: endpoint@7 {
+				reg = <7>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-dma;
+				atmel,can-isoc;
+			};
+
+			ep8: endpoint@8 {
+				reg = <8>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-isoc;
+			};
+
+			ep9: endpoint@9 {
+				reg = <9>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-isoc;
+			};
+
+			ep10: endpoint@a {
+				reg = <10>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-isoc;
+			};
+
+			ep11: endpoint@b {
+				reg = <11>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-isoc;
+			};
+
+			ep12: endpoint@c {
+				reg = <12>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-isoc;
+			};
+
+			ep13: endpoint@d {
+				reg = <13>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-isoc;
+			};
+
+			ep14: endpoint@e {
+				reg = <14>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-isoc;
+			};
+
+			ep15: endpoint@f {
+				reg = <15>;
+				atmel,fifo-size = <1024>;
+				atmel,nb-banks = <2>;
+				atmel,can-isoc;
+			};
+		};
+
+		sdmmc0: sdio-host@a0000000 {
+			bus-width = <4>;
+			pinctrl-names = "default";
+			pinctrl-0 = <&pinctrl_sdmmc0_cmd_dat_default &pinctrl_sdmmc0_ck_cd_default>;
+			status = "okay";
+			bootph-all;
+		};
+
+		apb {
+			uart1: serial@f8020000 {
+				pinctrl-names = "default";
+				pinctrl-0 = <&pinctrl_uart1_default>;
+				status = "okay";
+				bootph-all;
+			};
+
+			macb0: ethernet@f8008000 {
+				pinctrl-names = "default";
+				pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;
+				phy-mode = "rmii";
+				status = "okay";
+
+				ethernet-phy@0 {
+					reg = <0x0>;
+					reset-gpios = <&pioA 44 GPIO_ACTIVE_LOW>;
+				};
+			};
+
+			i2c@fc018000 {
+				compatible = "atmel,sama5d2-i2c";
+				reg = <0xfc018600 0x100>;
+				#address-cells = <1>;
+				#size-cells = <0>;
+				clocks = <&flx4_clk>;
+				clock-names = "i2c2_clk";
+				clock-frequency = <100000>;
+				pinctrl-names = "default";
+				pinctrl-0 = <&pinctrl_flx4_i2c>;
+				status = "okay";
+
+				eeprom: eeprom@50 {
+					compatible = "microchip,24c32", "atmel,24c32";
+					reg = <0x50>;
+					read-only;
+					pagesize = <32>;
+					status = "okay";
+				};
+
+				pmic: pmic@5b {
+					compatible = "active-semi,act8945a";
+					reg = <0x5b>;
+					status = "okay";
+				};
+			};
+
+			pioA: pinctrl@fc038000 {
+				pinctrl {
+					pinctrl_uart1_default: uart1_default {
+						pinmux = <PIN_PD2__URXD1>,
+							 <PIN_PD3__UTXD1>;
+						bias-disable;
+						bootph-all;
+					};
+
+					pinctrl_macb0_phy_irq: macb0_phy_irq {
+						pinmux = <PIN_PB13__GPIO>;
+						bias-disable;
+						bootph-all;
+					};
+
+					pinctrl_macb0_rmii: macb0_rmii {
+						pinmux = <PIN_PB14__GTXCK>,
+							 <PIN_PB15__GTXEN>,
+							 <PIN_PB16__GRXDV>,
+							 <PIN_PB17__GRXER>,
+							 <PIN_PB18__GRX0>,
+							 <PIN_PB19__GRX1>,
+							 <PIN_PB20__GTX0>,
+							 <PIN_PB21__GTX1>,
+							 <PIN_PB22__GMDC>,
+							 <PIN_PB23__GMDIO>;
+						bias-disable;
+						bootph-all;
+					};
+
+					pinctrl_sdmmc0_cmd_dat_default: sdmmc0_cmd_dat_default {
+						pinmux = <PIN_PA1__SDMMC0_CMD>,
+							 <PIN_PA2__SDMMC0_DAT0>,
+							 <PIN_PA3__SDMMC0_DAT1>,
+							 <PIN_PA4__SDMMC0_DAT2>,
+							 <PIN_PA5__SDMMC0_DAT3>;
+						bias-pull-up;
+						bootph-all;
+					};
+
+					pinctrl_sdmmc0_ck_cd_default: sdmmc0_ck_cd_default {
+						pinmux = <PIN_PA0__SDMMC0_CK>,
+							 <PIN_PA11__SDMMC0_VDDSEL>,
+							 <PIN_PA13__SDMMC0_CD>;
+						bias-disable;
+						bootph-all;
+					};
+
+					pinctrl_flx4_i2c: flx4_i2c {
+						pinmux = <PIN_PC28__FLEXCOM4_IO0>,
+							 <PIN_PC29__FLEXCOM4_IO1>;
+						bias-disable;
+					};
+				};
+			};
+		};
+	};
+};
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 7c2e4ebbdb0f..9ab1a9339ee1 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -204,6 +204,18 @@  config TARGET_SAMA5D27_WLSOM1_EK
 	  processor-based SAMA5D2 MPU with 2 Gbit LPDDR2-SDRAM
 	  in a single package.
 
+config TARGET_KSTR_SAMA5D27
+	bool "Conclusive KSTR-SAMA5D27 board"
+	select BOARD_EARLY_INIT_F
+	select SAMA5D2
+	select BOARD_LATE_INIT
+	help
+	  The KSTR-SAMA5D27 embeds SAMA5D27 SoC, together with
+	  256 MiB SDRAM, 10/100 Mbit/s Ethernet, 96 Mbit/s Wi-Fi b/g/n,
+	  Bluetooth 4.1 LE, USB OTG controller w/ type-C USB connector
+	  and stackable GPIO headers in an all-in-one SBC form factor:
+	  https://conclusive.pl/products/kstr-sama5d27-sbc/
+
 config TARGET_SAMA5D2_ICP
 	bool "SAMA5D2 Industrial Connectivity Platform (ICP)"
 	select SAMA5D2
@@ -352,6 +364,7 @@  source "board/atmel/sama5d4_xplained/Kconfig"
 source "board/atmel/sama5d4ek/Kconfig"
 source "board/bluewater/gurnard/Kconfig"
 source "board/calao/usb_a9263/Kconfig"
+source "board/conclusive/kstr-sama5d27/Kconfig"
 source "board/egnite/ethernut5/Kconfig"
 source "board/esd/meesc/Kconfig"
 source "board/gardena/smart-gateway-at91sam/Kconfig"
diff --git a/board/conclusive/kstr-sama5d27/Kconfig b/board/conclusive/kstr-sama5d27/Kconfig
new file mode 100644
index 000000000000..572551cfda98
--- /dev/null
+++ b/board/conclusive/kstr-sama5d27/Kconfig
@@ -0,0 +1,15 @@ 
+if TARGET_KSTR_SAMA5D27
+
+config SYS_BOARD
+	default "kstr-sama5d27"
+
+config SYS_VENDOR
+	default "conclusive"
+
+config SYS_SOC
+	default "at91"
+
+config SYS_CONFIG_NAME
+	default "kstr-sama5d27"
+
+endif
diff --git a/board/conclusive/kstr-sama5d27/MAINTAINERS b/board/conclusive/kstr-sama5d27/MAINTAINERS
new file mode 100644
index 000000000000..cb1635cdd280
--- /dev/null
+++ b/board/conclusive/kstr-sama5d27/MAINTAINERS
@@ -0,0 +1,8 @@ 
+CONCLUSIVE KSTR-SAMA5D27 BOARD
+M:	Jakub Klama <jakub@conclusive.pl>
+M:	Artur Rojek <artur@conclusive.pl>
+S:	Maintained
+F:	board/conclusive/kstr-sama5d27
+F:	include/configs/kstr-sama5d27.h
+F:	configs/kstr_sama5d27_defconfig
+F:	arch/arm/dts/at91-kstr-sama5d27.dts
diff --git a/board/conclusive/kstr-sama5d27/Makefile b/board/conclusive/kstr-sama5d27/Makefile
new file mode 100644
index 000000000000..edf7d1c93441
--- /dev/null
+++ b/board/conclusive/kstr-sama5d27/Makefile
@@ -0,0 +1,5 @@ 
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2019-2023 Conclusive Engineering Sp. z o. o.
+
+obj-y += kstr-sama5d27.o
diff --git a/board/conclusive/kstr-sama5d27/kstr-sama5d27.c b/board/conclusive/kstr-sama5d27/kstr-sama5d27.c
new file mode 100644
index 000000000000..e29fd00544bd
--- /dev/null
+++ b/board/conclusive/kstr-sama5d27/kstr-sama5d27.c
@@ -0,0 +1,235 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * kstr-sama5d27.c - Board init file for Conclusive KSTR-SAMA5D27 board
+ * Copyright (C) 2021-2023 Conclusive Engineering Sp. z o. o.
+ */
+
+#include <common.h>
+#include <debug_uart.h>
+#include <init.h>
+#include <env.h>
+#include <fdt_support.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <asm/arch/at91_common.h>
+#include <asm/arch/atmel_pio4.h>
+#include <asm/arch/atmel_mpddrc.h>
+#include <asm/arch/atmel_sdhci.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/sama5d2.h>
+#include <linux/delay.h>
+
+#ifdef CONFIG_USB_GADGET_ATMEL_USBA
+#include <asm/arch/atmel_usba_udc.h>
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_DEBUG_UART_BOARD_INIT
+static void board_uart1_hw_init(void)
+{
+	/* URXD1 */
+	atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, ATMEL_PIO_PUEN_MASK);
+	/* UTXD1 */
+	atmel_pio4_set_a_periph(AT91_PIO_PORTD, 3, 0);
+	at91_periph_clk_enable(ATMEL_ID_UART1);
+}
+
+void board_debug_uart_init(void)
+{
+	board_uart1_hw_init();
+}
+#endif
+
+void board_lan8720a_init(void)
+{
+	/* LAN8720A_nRST */
+	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, 0);
+	/*
+	 * Force 0 on RXER/PHYAD0. LAN8720A chipset will latch with address 0 on
+	 * MDIO bus.
+	 */
+	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 17, 0);
+	/* Minimal delay of reset signal is 25 ms */
+	mdelay(30);
+	/* LAN8720A_nRST */
+	atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, 1);
+}
+
+void board_usba_init(void)
+{
+#ifdef CONFIG_USB_GADGET_ATMEL_USBA
+	/* USB device peripheral initialization: sama5d2_devices.c */
+	at91_udp_hw_init();
+	/* USB device controller drivers/usb/gadget/atmel_usba_udc.c */
+	usba_udc_probe(&pdata);
+#endif
+}
+
+#ifdef CONFIG_BOARD_EARLY_INIT_F
+int board_early_init_f(void)
+{
+#ifdef CONFIG_DEBUG_UART
+	debug_uart_init();
+#endif
+	/* Initialize FLEXCOM 4 in TWI(I2C) mode */
+	writel(0x3, 0xfc018000);
+	return 0;
+}
+#endif
+
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+	char *wlanaddr = env_get("eth1addr");
+
+	if (wlanaddr)
+		do_fixup_by_compat(blob, "brcm,bcm4329-fmac", "local-mac-address",
+				   wlanaddr, strlen(wlanaddr), 1);
+	else
+		printf("Not setting WIFI mac address. Check if EEPROM TLV is correctly set up.\n");
+
+	return 0;
+}
+
+int board_init(void)
+{
+	/* address of boot parameters */
+	gd->bd->bi_boot_params = CFG_SYS_SDRAM_BASE + 0x100;
+
+	board_usba_init();
+	board_lan8720a_init();
+
+	return 0;
+}
+
+#ifdef CONFIG_BOARD_LATE_INIT
+int board_late_init(void)
+{
+	const char *serial_number;
+
+	populate_serial_number(0);
+
+	printf("Conclusive KSTR-SAMA5D27\n");
+
+	serial_number = env_get("serial#");
+	if (!serial_number)
+		printf("Warning: unknown serial number.\n");
+	else
+		printf("Serial number %s\n", serial_number);
+
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_MISC_INIT_R
+int misc_init_r(void)
+{
+	return 0;
+}
+#endif
+
+int dram_init(void)
+{
+	gd->ram_size = get_ram_size((void *)CFG_SYS_SDRAM_BASE,
+				    CFG_SYS_SDRAM_SIZE);
+	return 0;
+}
+
+/* SPL */
+#ifdef CONFIG_SPL_BUILD
+void spl_board_init(void)
+{
+}
+
+static void ddrc_conf(struct atmel_mpddrc_config *ddrc)
+{
+	ddrc->md = (ATMEL_MPDDRC_MD_DBW_16_BITS | ATMEL_MPDDRC_MD_DDR2_SDRAM);
+
+	ddrc->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
+		    ATMEL_MPDDRC_CR_NR_ROW_13 |
+		    ATMEL_MPDDRC_CR_CAS_DDR_CAS3 |
+		    ATMEL_MPDDRC_CR_DIC_DS |
+		    ATMEL_MPDDRC_CR_ZQ_LONG |
+		    ATMEL_MPDDRC_CR_NB_8BANKS |
+		    ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
+		    ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
+
+	ddrc->rtr = 0x511;
+
+	ddrc->tpr0 = ((7 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET) |
+		      (3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET) |
+		      (3 << ATMEL_MPDDRC_TPR0_TWR_OFFSET) |
+		      (9 << ATMEL_MPDDRC_TPR0_TRC_OFFSET) |
+		      (3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET) |
+		      (4 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET) |
+		      (4 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET) |
+		      (2 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET));
+
+	ddrc->tpr1 = ((22 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET) |
+		      (23 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET) |
+		      (200 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET) |
+		      (3 << ATMEL_MPDDRC_TPR1_TXP_OFFSET));
+
+	ddrc->tpr2 = ((2 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET) |
+		      (8 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET) |
+		      (4 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET) |
+		      (4 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET) |
+		      (8 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET));
+}
+
+void mem_init(void)
+{
+	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+	struct atmel_mpddr *mpddrc = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC;
+	struct atmel_mpddrc_config ddrc_config;
+	u32 reg;
+
+	ddrc_conf(&ddrc_config);
+
+	at91_periph_clk_enable(ATMEL_ID_MPDDRC);
+	writel(AT91_PMC_DDR, &pmc->scer);
+
+	reg = readl(&mpddrc->io_calibr);
+	reg &= ~ATMEL_MPDDRC_IO_CALIBR_RDIV;
+	reg |= ATMEL_MPDDRC_IO_CALIBR_DDR3_RZQ_55;
+	reg &= ~ATMEL_MPDDRC_IO_CALIBR_TZQIO;
+	reg |= ATMEL_MPDDRC_IO_CALIBR_TZQIO_(101);
+	writel(reg, &mpddrc->io_calibr);
+
+	writel(ATMEL_MPDDRC_RD_DATA_PATH_SHIFT_ONE_CYCLE,
+	       &mpddrc->rd_data_path);
+
+	ddr3_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddrc_config);
+
+	writel(0x3, &mpddrc->cal_mr4);
+	writel(64, &mpddrc->tim_cal);
+}
+
+void at91_pmc_init(void)
+{
+	u32 tmp;
+
+	/*
+	 * While coming from the ROM code, we run on PLLA @ 492 MHz / 164 MHz,
+	 * so we need to slow down and configure MCKR accordingly.
+	 * This is why we have a special flavor of the switching function.
+	 */
+	tmp = AT91_PMC_MCKR_PLLADIV_2 |
+	      AT91_PMC_MCKR_MDIV_3 |
+	      AT91_PMC_MCKR_CSS_MAIN;
+	at91_mck_init_down(tmp);
+
+	tmp = AT91_PMC_PLLAR_29 |
+	      AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
+	      AT91_PMC_PLLXR_MUL(40) |
+	      AT91_PMC_PLLXR_DIV(1);
+	at91_plla_init(tmp);
+
+	tmp = AT91_PMC_MCKR_H32MXDIV |
+	      AT91_PMC_MCKR_PLLADIV_2 |
+	      AT91_PMC_MCKR_MDIV_3 |
+	      AT91_PMC_MCKR_CSS_PLLA;
+	at91_mck_init(tmp);
+}
+#endif
diff --git a/configs/kstr_sama5d27_defconfig b/configs/kstr_sama5d27_defconfig
new file mode 100644
index 000000000000..a0b8ea79c66b
--- /dev/null
+++ b/configs/kstr_sama5d27_defconfig
@@ -0,0 +1,79 @@ 
+CONFIG_ARM=y
+CONFIG_ARCH_AT91=y
+CONFIG_TEXT_BASE=0x26f00000
+CONFIG_SYS_LOAD_ADDR=0x24000000
+CONFIG_SYS_MONITOR_LEN=524288
+CONFIG_TARGET_KSTR_SAMA5D27=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
+CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20003ee0
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_DM_GPIO=y
+CONFIG_DEFAULT_DEVICE_TREE="at91-kstr-sama5d27"
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_FIT=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2"
+CONFIG_SD_BOOT=y
+CONFIG_BOOTDELAY=3
+CONFIG_USE_BOOTARGS=y
+CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
+# CONFIG_USE_BOOTCOMMAND is not set
+# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_MISC_INIT_R=y
+CONFIG_CMD_TLV_EEPROM=y
+CONFIG_CMD_IMAGE=y
+CONFIG_CMD_DM=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_I2C=y
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_MASS_STORAGE=y
+# CONFIG_ISO_PARTITION is not set
+CONFIG_OF_CONTROL=y
+CONFIG_ENV_OVERWRITE=y
+CONFIG_ENV_IS_IN_FAT=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_DM=y
+CONFIG_CLK=y
+CONFIG_CLK_AT91=y
+CONFIG_AT91_UTMI=y
+CONFIG_AT91_H32MX=y
+CONFIG_AT91_GENERIC_CLK=y
+CONFIG_ATMEL_PIO4=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_AT91=y
+CONFIG_I2C_EEPROM=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_IO_VOLTAGE=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
+CONFIG_MMC_SDHCI_ATMEL=y
+CONFIG_PHY_MICREL=y
+CONFIG_DM_ETH=y
+CONFIG_MACB=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_AT91PIO4=y
+CONFIG_DM_SERIAL=y
+CONFIG_ATMEL_USART=y
+CONFIG_TEE=y
+CONFIG_OPTEE=y
+CONFIG_SYSRESET=y
+CONFIG_SYSRESET_AT91=y
+CONFIG_DM_RESET=y
+CONFIG_RESET_AT91=y
+CONFIG_TIMER=y
+CONFIG_ATMEL_PIT_TIMER=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_VENDOR_NUM=0x16c0
+CONFIG_USB_GADGET_PRODUCT_NUM=0x03e9
+CONFIG_USB_GADGET_ATMEL_USBA=y
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_OF_LIBFDT_OVERLAY=y
+CONFIG_SPL_OF_LIBFDT=y
+# CONFIG_EFI_LOADER is not set
diff --git a/include/configs/kstr-sama5d27.h b/include/configs/kstr-sama5d27.h
new file mode 100644
index 000000000000..772a073ba209
--- /dev/null
+++ b/include/configs/kstr-sama5d27.h
@@ -0,0 +1,15 @@ 
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2021-2023 Conclusive Engineering Sp. z o. o.
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include "at91-sama5_common.h"
+
+/* SDRAM */
+#define CFG_SYS_SDRAM_BASE           0x20000000
+#define CFG_SYS_SDRAM_SIZE           0x10000000
+
+#endif