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

Artur Rojek artur at conclusive.pl
Mon Sep 25 21:31:53 CEST 2023


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 at conclusive.pl>
>> Signed-off-by: Jakub Klama <jakub at conclusive.pl>
>> Co-developed-by: Marcin Jabrzyk <marcin at conclusive.pl>
>> Signed-off-by: Marcin Jabrzyk <marcin at conclusive.pl>
>> Signed-off-by: Artur Rojek <artur at 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 at 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 at 0 {
>> +				reg = <0>;
>> +				atmel,fifo-size = <64>;
>> +				atmel,nb-banks = <1>;
>> +			};
>> +
>> +			ep1: endpoint at 1 {
>> +				reg = <1>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <3>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep2: endpoint at 2 {
>> +				reg = <2>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <3>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep3: endpoint at 3 {
>> +				reg = <3>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep4: endpoint at 4 {
>> +				reg = <4>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep5: endpoint at 5 {
>> +				reg = <5>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep6: endpoint at 6 {
>> +				reg = <6>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep7: endpoint at 7 {
>> +				reg = <7>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-dma;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep8: endpoint at 8 {
>> +				reg = <8>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep9: endpoint at 9 {
>> +				reg = <9>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep10: endpoint at a {
>> +				reg = <10>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep11: endpoint at b {
>> +				reg = <11>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep12: endpoint at c {
>> +				reg = <12>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep13: endpoint at d {
>> +				reg = <13>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep14: endpoint at e {
>> +				reg = <14>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +
>> +			ep15: endpoint at f {
>> +				reg = <15>;
>> +				atmel,fifo-size = <1024>;
>> +				atmel,nb-banks = <2>;
>> +				atmel,can-isoc;
>> +			};
>> +		};
>> +
>> +		sdmmc0: sdio-host at 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 at f8020000 {
>> +				pinctrl-names = "default";
>> +				pinctrl-0 = <&pinctrl_uart1_default>;
>> +				status = "okay";
>> +				bootph-all;
>> +			};
>> +
>> +			macb0: ethernet at f8008000 {
>> +				pinctrl-names = "default";
>> +				pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;
>> +				phy-mode = "rmii";
>> +				status = "okay";
>> +
>> +				ethernet-phy at 0 {
>> +					reg = <0x0>;
>> +					reset-gpios = <&pioA 44 GPIO_ACTIVE_LOW>;
>> +				};
>> +			};
>> +
>> +			i2c at 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 at 50 {
>> +					compatible = "microchip,24c32", "atmel,24c32";
>> +					reg = <0x50>;
>> +					read-only;
>> +					pagesize = <32>;
>> +					status = "okay";
>> +				};
>> +
>> +				pmic: pmic at 5b {
>> +					compatible = "active-semi,act8945a";
>> +					reg = <0x5b>;
>> +					status = "okay";
>> +				};
>> +			};
>> +
>> +			pioA: pinctrl at 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 at conclusive.pl>
>> +M:	Artur Rojek <artur at 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


More information about the U-Boot mailing list