diff --git a/arch/arm/boards/at91sam9263ek/Makefile b/arch/arm/boards/at91sam9263ek/Makefile index de4d756..7af6fab 100644 --- a/arch/arm/boards/at91sam9263ek/Makefile +++ b/arch/arm/boards/at91sam9263ek/Makefile @@ -1,4 +1,6 @@ -obj-y += init.o +obj-$(CONFIG_AT91_BOOTSTRAP) += init.o +obj-$(CONFIG_OF_DEVICE) += of_init.o lwl-y += lowlevel_init.o + bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC) += defaultenv-at91sam9263ek diff --git a/arch/arm/boards/at91sam9263ek/lowlevel_init.c b/arch/arm/boards/at91sam9263ek/lowlevel_init.c index 70e0da3..2004d70 100644 --- a/arch/arm/boards/at91sam9263ek/lowlevel_init.c +++ b/arch/arm/boards/at91sam9263ek/lowlevel_init.c @@ -99,7 +99,7 @@ AT91_RSTC_RSTTYP_WATCHDOG; } -static void __bare_init at91sam9263ek_init(void) +static void __bare_init at91sam9263ek_init(void *fdt) { struct at91sam926x_board_cfg cfg; @@ -112,14 +112,23 @@ at91sam926x_board_init(&cfg); barebox_arm_entry(AT91_CHIPSELECT_1, at91_get_sdram_size(cfg.sdramc), - NULL); + fdt); } -void __naked __bare_init barebox_arm_reset_vector(void) +extern char __dtb_at91sam9263ek_start[]; + +ENTRY_FUNCTION(start_at91sam9263ek, r0, r1, r2) { + void *fdt; + arm_cpu_lowlevel_init(); arm_setup_stack(AT91SAM9263_SRAM0_BASE + AT91SAM9263_SRAM0_SIZE - 16); - at91sam9263ek_init(); + if (IS_ENABLED(CONFIG_MACH_AT91SAM9263EK_DT)) + fdt = __dtb_at91sam9263ek_start - get_runtime_offset(); + else + fdt = NULL; + + at91sam9263ek_init(fdt); } diff --git a/arch/arm/boards/at91sam9263ek/of_init.c b/arch/arm/boards/at91sam9263ek/of_init.c new file mode 100644 index 0000000..b4d216f --- /dev/null +++ b/arch/arm/boards/at91sam9263ek/of_init.c @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2017 Sam Ravnborg + * + * This program 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 program 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. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +static int add_smc_devices(void) +{ + add_generic_device("at91sam9-smc", 0, NULL, AT91SAM9263_BASE_SMC0, 0x200, + IORESOURCE_MEM, NULL); + add_generic_device("at91sam9-smc", 1, NULL, AT91SAM9263_BASE_SMC1, 0x200, + IORESOURCE_MEM, NULL); + + return 0; +} +coredevice_initcall(add_smc_devices); + +static struct sam9_smc_config ek_nand_smc_config = { + .ncs_read_setup = 0, + .nrd_setup = 1, + .ncs_write_setup = 0, + .nwe_setup = 1, + + .ncs_read_pulse = 3, + .nrd_pulse = 3, + .ncs_write_pulse = 3, + .nwe_pulse = 3, + + .read_cycle = 5, + .write_cycle = 5, + + .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE, + .tdf_cycles = 2, +}; + +static int at91sam9263_smc_init(void) +{ + unsigned long csa; + + if (!of_machine_is_compatible("atmel,at91sam9263ek")) + return 0; + + /* setup bus-width (8 or 16) */ + if (IS_ENABLED(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)) + ek_nand_smc_config.mode |= AT91_SMC_DBW_16; + else + ek_nand_smc_config.mode |= AT91_SMC_DBW_8; + + csa = at91_sys_read(AT91_MATRIX_EBI0CSA); + csa |= AT91_MATRIX_EBI0_CS3A_SMC_SMARTMEDIA; + at91_sys_write(AT91_MATRIX_EBI0CSA, csa); + + /* configure chip-select 3 (NAND) */ + sam9_smc_configure(0, 3, &ek_nand_smc_config); + + return 0; +} +device_initcall(at91sam9263_smc_init); + +static int at91sam9263ek_env_init(void) +{ + if (!of_machine_is_compatible("atmel,at91sam9263ek")) + return 0; + + at91_rtt_irq_fixup(IOMEM(AT91SAM9263_BASE_RTT0)); + at91_rtt_irq_fixup(IOMEM(AT91SAM9263_BASE_RTT1)); + + if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC)) + defaultenv_append_directory(defaultenv_at91sam9263ek); + + return 0; +} +late_initcall(at91sam9263ek_env_init); diff --git a/arch/arm/configs/at91sam9263ek_defconfig b/arch/arm/configs/at91sam9263ek_defconfig index b28614d..e8ad841 100644 --- a/arch/arm/configs/at91sam9263ek_defconfig +++ b/arch/arm/configs/at91sam9263ek_defconfig @@ -1,10 +1,12 @@ CONFIG_ARCH_AT91SAM9263=y +CONFIG_AT91_MULTI_BOARDS=y +CONFIG_MACH_AT91SAM9263EK=y CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x40000 CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y -CONFIG_PBL_IMAGE=y CONFIG_MMU=y CONFIG_EXPERIMENTAL=y CONFIG_MALLOC_TLSF=y +CONFIG_RELOCATABLE=y CONFIG_PROMPT="9263-EK:" CONFIG_GLOB=y CONFIG_HUSH_FANCY_PROMPT=y @@ -18,6 +20,7 @@ CONFIG_DEFAULT_ENVIRONMENT_GENERIC=y # CONFIG_CMD_ARM_CPUINFO is not set CONFIG_LONGHELP=y +CONFIG_CMD_IOMEM=y CONFIG_CMD_MEMINFO=y # CONFIG_CMD_BOOTU is not set CONFIG_CMD_GO=y @@ -36,6 +39,7 @@ CONFIG_CMD_SPLASH=y CONFIG_CMD_READLINE=y CONFIG_CMD_TIMEOUT=y +CONFIG_CMD_CLK=y CONFIG_CMD_FLASH=y CONFIG_CMD_GPIO=y CONFIG_CMD_LED=y @@ -43,6 +47,7 @@ CONFIG_CMD_OFTREE=y CONFIG_NET=y CONFIG_NET_NFS=y +CONFIG_OF_BAREBOX_DRIVERS=y CONFIG_DRIVER_NET_MACB=y # CONFIG_SPI is not set CONFIG_MTD=y @@ -62,9 +67,12 @@ CONFIG_DRIVER_VIDEO_ATMEL=y CONFIG_MCI=y CONFIG_MCI_ATMEL=y +CONFIG_SRAM=y CONFIG_LED=y CONFIG_LED_GPIO=y +CONFIG_LED_GPIO_OF=y CONFIG_LED_TRIGGERS=y +CONFIG_KEYBOARD_GPIO=y CONFIG_FS_TFTP=y CONFIG_FS_FAT=y CONFIG_FS_FAT_LFN=y diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index 4f13d4e..0526a6f 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -104,7 +104,7 @@ vf610-zii-cfu1-rev-a.dtb.o \ vf610-zii-spu3-rev-a.dtb.o \ vf610-zii-scu4-aib-rev-c.dtb.o - +pbl-dtb-$(CONFIG_MACH_AT91SAM9263EK_DT) += at91sam9263ek.dtb.o pbl-dtb-$(CONFIG_MACH_AT91SAM9X5EK) += at91sam9x5ek.dtb.o clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts *.dtb.lzo diff --git a/arch/arm/dts/at91sam9263ek.dts b/arch/arm/dts/at91sam9263ek.dts new file mode 100644 index 0000000..3681b84 --- /dev/null +++ b/arch/arm/dts/at91sam9263ek.dts @@ -0,0 +1,48 @@ +#include +/ { + chosen { + environment@0 { + compatible = "barebox,environment"; + device-path = &nand_controller, "partname:bareboxenv"; + }; + }; + + ahb { + apb { + mmc1: mmc@fff84000 { + pinctrl-0 = < + &pinctrl_board_mmc1 + &pinctrl_mmc1_clk + &pinctrl_mmc1_slot0_cmd_dat0 + &pinctrl_mmc1_slot0_dat1_3>; + cd-gpios = <&pioE 18 GPIO_ACTIVE_HIGH>; + status = "okay"; + slot@0 { + reg = <0>; + bus-width = <4>; + cd-gpios = <&pioE 18 GPIO_ACTIVE_HIGH>; + wp-gpios = <&pioE 19 GPIO_ACTIVE_HIGH>; + }; + }; + }; + }; + + + pinctrl@fffff200 { + pinctrl_board_mmc1: mmc1-board { + atmel,pins = + ; /* PE19 gpio WP pin pull up */ + }; + }; +}; + +&pioB { + /* Enable the 50MHz oscillator for Ethernet PHY */ + phy_50mhz { + gpio-hog; + gpios = <27 GPIO_ACTIVE_LOW>; + output-high; + line-name = "PHY 50 MHz oscillator"; + }; +}; diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index fa9caed..0a9cf3a 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig @@ -20,6 +20,13 @@ select COMMON_CLK select MFD_SYSCON +config MACH_AT91SAM9263EK_DT + def_bool y + depends on MACH_AT91SAM9263EK && OFDEVICE + help + Enabled for at91sam9263ek - evaluation kit. + But only if we need the device tree (bootstrap do not use DT) + config HAVE_AT91_SMD bool @@ -228,6 +235,8 @@ config SUPPORT_CALAO_MOB_TNY_MD2 bool +if !AT91_MULTI_BOARDS + # ---------------------------------------------------------- if ARCH_AT91RM9200 @@ -399,14 +408,6 @@ choice prompt "AT91SAM9263 Board Type" -config MACH_AT91SAM9263EK - bool "Atmel AT91SAM9263-EK" - select HAVE_NAND_ATMEL_BUSWIDTH_16 - select HAVE_AT91_BOOTSTRAP - select AT91SAM926X_BOARD_INIT - help - Say y here if you are using Atmel's AT91SAM9263-EK Evaluation board - config MACH_PM9263 bool "Ronetix PM9263" select HAVE_AT91_BOOTSTRAP @@ -519,6 +520,7 @@ endchoice endif +endif # ---------------------------------------------------------- @@ -529,6 +531,18 @@ if AT91_MULTI_BOARDS +config MACH_AT91SAM9263EK + bool "Atmel AT91SAM9263-EK" + depends on ARCH_AT91SAM9263 + select OFDEVICE + select COMMON_CLK_OF_PROVIDER + select HAVE_AT91_USB_CLK + select HAVE_NAND_ATMEL_BUSWIDTH_16 + select HAVE_AT91_BOOTSTRAP + select AT91SAM926X_BOARD_INIT + help + Say y here if you are using Atmel's AT91SAM9263-EK Evaluation board + config MACH_AT91SAM9X5EK bool "Atmel AT91SAM9x5 Series Evaluation Kit" depends on ARCH_AT91SAM9X5 diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 8adeee9..664201c 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile @@ -17,8 +17,10 @@ obj-$(CONFIG_ARCH_AT91RM9200) += at91rm9200.o at91rm9200_time.o at91rm9200_devices.o obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam9260_devices.o obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam9261_devices.o -obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam9263_devices.o obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam9261_devices.o +ifeq ($(CONFIG_OFDEVICE),) +obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam9263_devices.o +endif obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam9260_devices.o obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam9g45_devices.o obj-$(CONFIG_ARCH_AT91SAM9X5) += at91sam9x5_devices.o diff --git a/images/Makefile.at91 b/images/Makefile.at91 index dc6c1db..c7d8656 100644 --- a/images/Makefile.at91 +++ b/images/Makefile.at91 @@ -5,3 +5,7 @@ pblx-$(CONFIG_MACH_AT91SAM9X5EK) += start_at91sam9x5ek FILE_barebox-at91sam9x5ek.img = start_at91sam9x5ek.pblx image-$(CONFIG_MACH_AT91SAM9X5EK) += barebox-at91sam9x5ek.img + +pblx-$(CONFIG_MACH_AT91SAM9263EK) += start_at91sam9263ek +FILE_barebox-at91sam9263ek.img = start_at91sam9263ek.pblx +image-$(CONFIG_MACH_AT91SAM9263EK) += barebox-at91sam9263ek.img