ARM: legoev3: convert to driver model

This converts LEGO MINDSTORMS EV3 to the driver model. MMC, SERIAL, SPI
and SPI_FLASH are converted.

The device tree contains only the minimal nodes required by U-Boot
since the size of U-Boot is limited to 256K on this device.

Signed-off-by: David Lechner <david@lechnology.com>
This commit is contained in:
David Lechner 2019-05-28 20:56:42 -05:00 committed by Tom Rini
parent fb9a1ffef3
commit 1d259e4d68
6 changed files with 102 additions and 27 deletions

View file

@ -30,7 +30,8 @@ dtb-$(CONFIG_EXYNOS7420) += exynos7420-espresso7420.dtb
dtb-$(CONFIG_ARCH_DAVINCI) += \ dtb-$(CONFIG_ARCH_DAVINCI) += \
da850-evm.dtb \ da850-evm.dtb \
da850-lcdk.dtb da850-lcdk.dtb \
da850-lego-ev3.dtb
dtb-$(CONFIG_KIRKWOOD) += \ dtb-$(CONFIG_KIRKWOOD) += \
kirkwood-atl-sbx81lifkw.dtb \ kirkwood-atl-sbx81lifkw.dtb \

View file

@ -0,0 +1,89 @@
/*
* Device tree for LEGO MINDSTORMS EV3
*
* Copyright (C) 2017 David Lechner <david@lechnology.com>
*
* SPDX-License-Identifier: GPL-2.0+
*
* This is an absolute minimum device tree instead of using the one from Linux
* because the bootloader on the EV3 is limited to 256k. This saves us >10k.
*/
/dts-v1/;
/ {
#address-cells = <1>;
#size-cells = <1>;
compatible = "lego,ev3", "ti,da850";
model = "LEGO MINDSTORMS EV3";
aliases {
serial1 = &serial1;
spi0 = &spi0;
};
chosen {
stdout-path = &serial1;
};
memory {
device_type = "memory";
reg = <0xc0000000 0x04000000>;
};
arm {
#address-cells = <1>;
#size-cells = <1>;
ranges;
intc: interrupt-controller@fffee000 {
compatible = "ti,cp-intc";
interrupt-controller;
#interrupt-cells = <1>;
ti,intc-size = <101>;
reg = <0xfffee000 0x2000>;
};
};
soc@1c00000 {
compatible = "simple-bus";
model = "da850";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0x0 0x01c00000 0x400000>;
interrupt-parent = <&intc>;
mmc0: mmc@40000 {
compatible = "ti,da830-mmc";
reg = <0x40000 0x1000>;
cap-sd-highspeed;
cap-mmc-highspeed;
interrupts = <16>;
max-frequency = <50000000>;
bus-width = <4>;
};
spi0: spi@41000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "ti,da830-spi";
reg = <0x41000 0x1000>;
num-cs = <6>;
ti,davinci-spi-intr-line = <1>;
interrupts = <20>;
flash@0 {
compatible = "micron,n25q128a13", "jedec,spi-nor", "spi-flash";
reg = <0>;
spi-max-frequency = <50000000>;
};
};
serial1: serial@10c000 {
compatible = "ti,da830-uart", "ns16550a";
reg = <0x10c000 0x100>;
reg-io-width = <4>;
reg-shift = <2>;
interrupts = <53>;
};
};
};

View file

@ -50,3 +50,6 @@ software or a 3rd party program capable of uploading a firmware file.
If you are booting from the microSD card, it is enough to just write uboot.bin If you are booting from the microSD card, it is enough to just write uboot.bin
to the flash. If you are not using a microSD card, you will need to create an to the flash. If you are not using a microSD card, you will need to create an
image file using the layout described above. image file using the layout described above.
IMPORTANT: The EEPROM bootloader only copies 256k, so u-boot.img must not
exceed that size!

View file

@ -25,11 +25,6 @@
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/setup.h> #include <asm/setup.h>
#ifdef CONFIG_MMC_DAVINCI
#include <mmc.h>
#include <asm/arch/sdmmc_defs.h>
#endif
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
u8 board_rev; u8 board_rev;
@ -38,23 +33,6 @@ u8 board_rev;
#define EEPROM_REV_OFFSET 0x3F00 #define EEPROM_REV_OFFSET 0x3F00
#define EEPROM_MAC_OFFSET 0x3F06 #define EEPROM_MAC_OFFSET 0x3F06
#ifdef CONFIG_MMC_DAVINCI
static struct davinci_mmc mmc_sd0 = {
.reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
.host_caps = MMC_MODE_4BIT, /* DA850 supports only 4-bit SD/MMC */
.voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
.version = MMC_CTLR_VERSION_2,
};
int board_mmc_init(bd_t *bis)
{
mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID);
/* Add slot-0 to mmc subsystem */
return davinci_mmc_init(bis, &mmc_sd0);
}
#endif
const struct pinmux_resource pinmuxes[] = { const struct pinmux_resource pinmuxes[] = {
PINMUX_ITEM(spi0_pins_base), PINMUX_ITEM(spi0_pins_base),
PINMUX_ITEM(spi0_pins_scs0), PINMUX_ITEM(spi0_pins_scs0),

View file

@ -23,12 +23,19 @@ CONFIG_CMD_SPI=y
CONFIG_CMD_EXT4=y CONFIG_CMD_EXT4=y
CONFIG_CMD_FAT=y CONFIG_CMD_FAT=y
CONFIG_CMD_DIAG=y CONFIG_CMD_DIAG=y
CONFIG_OF_CONTROL=y
CONFIG_DEFAULT_DEVICE_TREE="da850-lego-ev3"
CONFIG_DM=y
# CONFIG_DM_DEVICE_REMOVE is not set
CONFIG_SYS_I2C_DAVINCI=y CONFIG_SYS_I2C_DAVINCI=y
CONFIG_DM_MMC=y
CONFIG_DM_SPI_FLASH=y
CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH=y
CONFIG_SF_DEFAULT_SPEED=50000000 CONFIG_SF_DEFAULT_SPEED=50000000
CONFIG_SPI_FLASH_STMICRO=y CONFIG_SPI_FLASH_STMICRO=y
CONFIG_DM_SERIAL=y
CONFIG_SYS_NS16550=y CONFIG_SYS_NS16550=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_DM_SPI=y
CONFIG_DAVINCI_SPI=y CONFIG_DAVINCI_SPI=y
CONFIG_OF_LIBFDT=y
# CONFIG_EFI_LOADER is not set # CONFIG_EFI_LOADER is not set

View file

@ -42,11 +42,8 @@
* Serial Driver info * Serial Driver info
*/ */
#define CONFIG_SYS_NS16550_SERIAL #define CONFIG_SYS_NS16550_SERIAL
#define CONFIG_SYS_NS16550_REG_SIZE -4 /* NS16550 register size */
#define CONFIG_SYS_NS16550_COM1 DAVINCI_UART1_BASE /* Base address of UART1 */
#define CONFIG_SYS_NS16550_CLK clk_get(DAVINCI_UART2_CLKID) #define CONFIG_SYS_NS16550_CLK clk_get(DAVINCI_UART2_CLKID)
#define CONFIG_SYS_SPI_BASE DAVINCI_SPI0_BASE
#define CONFIG_SYS_SPI_CLK clk_get(DAVINCI_SPI0_CLKID) #define CONFIG_SYS_SPI_CLK clk_get(DAVINCI_SPI0_CLKID)
/* /*