[PATCH 2/3] Add DMO RealQ7 board support
Jean-Christophe PLAGNIOL-VILLARD
plagnioj at jcrosoft.com
Fri Mar 8 07:51:38 EST 2013
> +
> +static void mmd_write_reg(struct phy_device *dev, int device, int reg, int val)
> +{
> + phy_write(dev, 0x0d, device);
> + phy_write(dev, 0x0e, reg);
> + phy_write(dev, 0x0d, (1 << 14) | device);
> + phy_write(dev, 0x0e, val);
> +}
> +
> +static void mx6_rgmii_rework(struct phy_device *dev)
> +{
> + /*
> + * min rx data delay, max rx/tx clock delay,
> + * min rx/tx control delay
> + */
> + mmd_write_reg(dev, 2, 4, 0);
> + mmd_write_reg(dev, 2, 5, 0);
> + mmd_write_reg(dev, 2, 8, 0x003ff);
> +}
> +
> +static struct fec_platform_data fec_info = {
> + .xcv_type = RGMII,
> + .phy_init = mx6_rgmii_rework,
> + .phy_addr = -1,
use phy_fix_up as done on sama5d3xek
the phy_init need do be dropped now
> +};
> +
> +static void realq7_enet_init(void)
> +{
> + mxc_iomux_v3_setup_multiple_pads(realq7_pads_gpio, ARRAY_SIZE(realq7_pads_gpio));
> + gpio_direction_output(RQ7_GPIO_ENET_PHYADD2, 0);
> + gpio_direction_output(RQ7_GPIO_ENET_MODE0, 1);
> + gpio_direction_output(RQ7_GPIO_ENET_MODE1, 1);
> + gpio_direction_output(RQ7_GPIO_ENET_MODE2, 1);
> + gpio_direction_output(RQ7_GPIO_ENET_MODE3, 1);
> + gpio_direction_output(RQ7_GPIO_ENET_EN_CLK125, 1);
> +
> + gpio_direction_output(25, 0);
> + mdelay(50);
> +
> + gpio_direction_output(25, 1);
> + mdelay(50);
> +
> + mxc_iomux_v3_setup_multiple_pads(realq7_pads_enet, ARRAY_SIZE(realq7_pads_enet));
> +
> + imx6_add_fec(&fec_info);
> +}
> +
> +static int realq7_mem_init(void)
> +{
> + arm_add_mem_device("ram0", 0x10000000, SZ_2G);
> +
> + return 0;
> +}
> +mem_initcall(realq7_mem_init);
> +
> +static int realq7_spi_cs[] = { IMX_GPIO_NR(1, 12), };
> +
> +static struct spi_imx_master realq7_spi_0_data = {
> + .chipselect = realq7_spi_cs,
> + .num_chipselect = ARRAY_SIZE(realq7_spi_cs),
> +};
> +
> +static const struct spi_board_info realq7_spi_board_info[] = {
> + {
> + .name = "m25p80",
> + .max_speed_hz = 40000000,
> + .bus_num = 4,
> + .chip_select = 0,
> + }
> +};
> +
> +static struct esdhc_platform_data realq7_emmc_data = {
> + .cd_type = ESDHC_CD_PERMANENT,
> + .caps = MMC_MODE_8BIT,
> + .devname = "emmc",
> +};
we was discussion of symlink on devfs my idea was to use it here instead of
the devname
> +
> +static struct stmpe_platform_data stmpe1_pdata = {
> + .gpio_base = 224,
> + .blocks = STMPE_BLOCK_GPIO,
> +};
> +
> +static struct stmpe_platform_data stmpe2_pdata = {
> + .gpio_base = 240,
> + .blocks = STMPE_BLOCK_GPIO,
> +};
> +
> +static struct i2c_board_info realq7_i2c2_devices[] = {
> + {
> + I2C_BOARD_INFO("stmpe-i2c", 0x40),
> + .platform_data = &stmpe1_pdata,
> + }, {
> + I2C_BOARD_INFO("stmpe-i2c", 0x44),
> + .platform_data = &stmpe2_pdata,
> + },
> +};
> +
> +static int realq7_devices_init(void)
> +{
> + imx6_add_mmc2(NULL);
> + imx6_add_mmc3(&realq7_emmc_data);
> +
> + realq7_enet_init();
> +
> + i2c_register_board_info(1, realq7_i2c2_devices,
> + ARRAY_SIZE(realq7_i2c2_devices));
> +
> + imx6_add_i2c0(NULL);
> + imx6_add_i2c1(NULL);
> + imx6_add_i2c2(NULL);
> +
> + spi_register_board_info(realq7_spi_board_info,
> + ARRAY_SIZE(realq7_spi_board_info));
> + imx6_add_spi4(&realq7_spi_0_data);
> +
> + imx6_add_sata();
> +
> + armlinux_set_bootparams((void *)0x10000100);
> + armlinux_set_architecture(3769);
why a magic instead of a macro?
> +
> + imx6_bbu_internal_spi_i2c_register_handler("spiflash", "/dev/m25p0",
> + BBU_HANDLER_FLAG_DEFAULT, NULL, 0, 0x00907000);
> + imx6_bbu_internal_mmc_register_handler("mmc", "/dev/disk0",
> + 0, NULL, 0, 0x00907000);
> +
> + return 0;
> +}
> +device_initcall(realq7_devices_init);
> +
> +static int realq7_env_init(void)
> +{
> + char *source_str = NULL;
> +
> + switch (imx_bootsource()) {
> + case bootsource_mmc:
> + if (!IS_ENABLED(CONFIG_MCI_STARTUP))
> + setenv("mci0.probe", "1");
> + devfs_add_partition("disk0", 0, SZ_1M, DEVFS_PARTITION_FIXED, "self0");
> + devfs_add_partition("disk0", SZ_1M, SZ_1M, DEVFS_PARTITION_FIXED, "env0");
> + source_str = "SD/MMC";
> + break;
> + case bootsource_spi:
> + devfs_add_partition("m25p0", 0, SZ_256K, DEVFS_PARTITION_FIXED, "self0");
> + devfs_add_partition("m25p0", SZ_256K, SZ_256K, DEVFS_PARTITION_FIXED, "env0");
> + source_str = "SPI flash";
> + break;
> + default:
> + printf("unknown Bootsource, no persistent environment\n");
> + break;
> + }
> +
> + if (source_str)
> + printf("Using environment from %s\n", source_str);
> +
> + return 0;
> +}
> +late_initcall(realq7_env_init);
> +
> +static int realq7_console_init(void)
> +{
> + mxc_iomux_v3_setup_multiple_pads(realq7_pads, ARRAY_SIZE(realq7_pads));
> +
> + imx6_init_lowlevel();
> +
> + imx6_add_uart1();
> +
> + return 0;
> +}
> +console_initcall(realq7_console_init);
> diff --git a/arch/arm/boards/dmo-mx6-realq7/config.h b/arch/arm/boards/dmo-mx6-realq7/config.h
> new file mode 100644
> index 0000000..ca15136
> --- /dev/null
> +++ b/arch/arm/boards/dmo-mx6-realq7/config.h
> @@ -0,0 +1,4 @@
> +#ifndef __CONFIG_H
> +#define __CONFIG_H
> +
> +#endif /* __CONFIG_H */
> diff --git a/arch/arm/boards/dmo-mx6-realq7/env/init/hostname b/arch/arm/boards/dmo-mx6-realq7/env/init/hostname
> new file mode 100644
> index 0000000..863960d
> --- /dev/null
> +++ b/arch/arm/boards/dmo-mx6-realq7/env/init/hostname
> @@ -0,0 +1,8 @@
> +#!/bin/sh
> +
> +if [ "$1" = menu ]; then
> + init-menu-add-entry "$0" "hostname"
> + exit
> +fi
> +
> +global.hostname=realq7
in config-board?
> diff --git a/arch/arm/boards/dmo-mx6-realq7/flash_header.c b/arch/arm/boards/dmo-mx6-realq7/flash_header.c
> new file mode 100644
> index 0000000..acd4298
> --- /dev/null
> +++ b/arch/arm/boards/dmo-mx6-realq7/flash_header.c
> @@ -0,0 +1,40 @@
> +/*
> + * Copyright (C) 2011 Marc Kleine-Budde <mkl at pengutronix.de>
> + *
> + * 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 <common.h>
> +#include <asm/byteorder.h>
> +#include <mach/imx-flash-header.h>
> +#include <mach/imx6-regs.h>
> +#include <asm/barebox-arm-head.h>
> +
> +void __naked __flash_header_start go(void)
> +{
> + barebox_arm_head();
> +}
> +
> +#define APP_DEST 0x00907000
> +
> +struct imx_flash_header_v2 __flash_header_section flash_header = {
> + .header.tag = IVT_HEADER_TAG,
> + .header.length = cpu_to_be16(32),
> + .header.version = IVT_VERSION,
> + .entry = APP_DEST + 0x2000,
> + .dcd_ptr = 0,
> + .boot_data_ptr = APP_DEST + FLASH_HEADER_OFFSET + offsetof(struct imx_flash_header_v2, boot_data),
> + .self = APP_DEST + FLASH_HEADER_OFFSET,
> +
> + .boot_data.start = APP_DEST,
> + .boot_data.size = 192 * 1024,
barebox_image_size
> +};
> diff --git a/arch/arm/boards/dmo-mx6-realq7/lowlevel.c b/arch/arm/boards/dmo-mx6-realq7/lowlevel.c
> new file mode 100644
> index 0000000..65823ca
> --- /dev/null
> +++ b/arch/arm/boards/dmo-mx6-realq7/lowlevel.c
> @@ -0,0 +1,146 @@
> +#include <common.h>
> +#include <sizes.h>
> +#include <io.h>
> +#include <asm/sections.h>
> +#include <asm/mmu.h>
> +#include <asm/barebox-arm-head.h>
> +#include <asm/barebox-arm.h>
> +#include <mach/imx6-mmdc.h>
> +
> +static inline void reg32_write(u32 reg, u32 val)
> +{
> + writel(val, reg);
> +}
> +
> +static void sdram_init(void)
> +{
> + reg32_write(0x021b0000, 0x0);
> + reg32_write(0x020c4068, 0xffffffff);
> + reg32_write(0x020c406c, 0xffffffff);
> + reg32_write(0x020c4070, 0xffffffff);
> + reg32_write(0x020c4074, 0xffffffff);
> + reg32_write(0x020c4078, 0xffffffff);
> + reg32_write(0x020c407c, 0xffffffff);
> + reg32_write(0x020c4080, 0xffffffff);
> + reg32_write(0x020c4084, 0xffffffff);
> + reg32_write(0x020e0798, 0x000C0000);
> + reg32_write(0x020e0758, 0x00000000);
> + reg32_write(0x020e0588, 0x00000030);
> + reg32_write(0x020e0594, 0x00000030);
> + reg32_write(0x020e056c, 0x00000030);
> + reg32_write(0x020e0578, 0x00000030);
> + reg32_write(0x020e074c, 0x00000030);
> + reg32_write(0x020e057c, 0x00000030);
> + reg32_write(0x020e058c, 0x00000000);
> + reg32_write(0x020e059c, 0x00000030);
> + reg32_write(0x020e05a0, 0x00000030);
> + reg32_write(0x020e078c, 0x00000030);
> + reg32_write(0x020e0750, 0x00020000);
> + reg32_write(0x020e05a8, 0x00000038);
> + reg32_write(0x020e05b0, 0x00000038);
> + reg32_write(0x020e0524, 0x00000038);
> + reg32_write(0x020e051c, 0x00000038);
> + reg32_write(0x020e0518, 0x00000038);
> + reg32_write(0x020e050c, 0x00000038);
> + reg32_write(0x020e05b8, 0x00000038);
> + reg32_write(0x020e05c0, 0x00000038);
> + reg32_write(0x020e0774, 0x00020000);
> + reg32_write(0x020e0784, 0x00000030);
> + reg32_write(0x020e0788, 0x00000030);
> + reg32_write(0x020e0794, 0x00000030);
> + reg32_write(0x020e079c, 0x00000030);
> + reg32_write(0x020e07a0, 0x00000030);
> + reg32_write(0x020e07a4, 0x00000030);
> + reg32_write(0x020e07a8, 0x00000030);
> + reg32_write(0x020e0748, 0x00000030);
> + reg32_write(0x020e05ac, 0x00000030);
> + reg32_write(0x020e05b4, 0x00000030);
> + reg32_write(0x020e0528, 0x00000030);
> + reg32_write(0x020e0520, 0x00000030);
> + reg32_write(0x020e0514, 0x00000030);
> + reg32_write(0x020e0510, 0x00000030);
> + reg32_write(0x020e05bc, 0x00000030);
> + reg32_write(0x020e05c4, 0x00000030);
> + reg32_write(0x021b0800, 0xa1390003);
> + reg32_write(0x021b080c, 0x0059005C);
> + reg32_write(0x021b0810, 0x00590056);
> + reg32_write(0x021b480c, 0x002E0049);
> + reg32_write(0x021b4810, 0x001B0033);
> + reg32_write(0x021b083c, 0x434F035B);
> + reg32_write(0x021b0840, 0x033F033F);
> + reg32_write(0x021b483c, 0x4337033D);
> + reg32_write(0x021b4840, 0x03210275);
> + reg32_write(0x021b0848, 0x4C454344);
> + reg32_write(0x021b4848, 0x463F3E4A);
> + reg32_write(0x021b0850, 0x46314742);
> + reg32_write(0x021b4850, 0x4D2A4B39);
> + reg32_write(0x021b081c, 0x33333333);
> + reg32_write(0x021b0820, 0x33333333);
> + reg32_write(0x021b0824, 0x33333333);
> + reg32_write(0x021b0828, 0x33333333);
> + reg32_write(0x021b481c, 0x33333333);
> + reg32_write(0x021b4820, 0x33333333);
> + reg32_write(0x021b4824, 0x33333333);
> + reg32_write(0x021b4828, 0x33333333);
> + reg32_write(0x021b08b8, 0x00000800);
> + reg32_write(0x021b48b8, 0x00000800);
> + reg32_write(0x021b0004, 0x00020036);
> + reg32_write(0x021b0008, 0x09555050);
> + reg32_write(0x021b000c, 0x8A8F7934);
> + reg32_write(0x021b0010, 0xDB568E65);
> + reg32_write(0x021b0014, 0x01FF00DB);
> + reg32_write(0x021b0018, 0x00000740);
> + reg32_write(0x021b001c, 0x00008000);
> + reg32_write(0x021b002c, 0x000026d2);
> + reg32_write(0x021b0030, 0x008F0E21);
> + reg32_write(0x021b0040, 0x00000047);
> + reg32_write(0x021b0400, 0x11420000);
> + reg32_write(0x021b4400, 0x11420000);
> + reg32_write(0x021b0000, 0x841A0000);
> + reg32_write(0x021b001c, 0x04108032);
> + reg32_write(0x021b001c, 0x00008033);
> + reg32_write(0x021b001c, 0x00048031);
> + reg32_write(0x021b001c, 0x09308030);
> + reg32_write(0x021b001c, 0x04008040);
> + reg32_write(0x021b001c, 0x0410803A);
> + reg32_write(0x021b001c, 0x0000803B);
> + reg32_write(0x021b001c, 0x00048039);
> + reg32_write(0x021b001c, 0x09308038);
> + reg32_write(0x021b001c, 0x04008048);
> + reg32_write(0x021b0020, 0x00005800);
> + reg32_write(0x021b0818, 0x00011117);
> + reg32_write(0x021b4818, 0x00011117);
> + reg32_write(0x021b0004, 0x00025576);
> + reg32_write(0x021b0404, 0x00011006);
> + reg32_write(0x021b001c, 0x00000000);
> +
> + /* Enable UART for lowlevel debugging purposes. Can be removed later */
> + reg32_write(0x020e00bc, 0x4);
> + reg32_write(0x020e00c0, 0x4);
> + reg32_write(0x020e0928, 0x1);
> + reg32_write(0x021e8080, 0x00000000);
> + reg32_write(0x021e8084, 0x00004027);
> + reg32_write(0x021e8088, 0x00000704);
> + reg32_write(0x021e8090, 0x00000a81);
> + reg32_write(0x021e809c, 0x0000002b);
> + reg32_write(0x021e80b0, 0x00013880);
> + reg32_write(0x021e80a4, 0x0000047f);
> + reg32_write(0x021e80a8, 0x0000c34f);
> + reg32_write(0x021e8080, 0x00000001);
can we have not all of those magic?
> +}
> +
> +void __naked barebox_arm_reset_vector(void)
> +{
> + arm_cpu_lowlevel_init();
> +
> + arm_setup_stack(0x00940000 - 8);
> +
> + if (get_pc() < 0x10000000) {
> + sdram_init();
> +
> + mmdc_do_write_level_calibration();
> + mmdc_do_dqs_calibration();
> + }
> +
> + barebox_arm_entry(0x10000000, SZ_2G, 0);
> +}
> diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
> index 1308f3c..d908d5c 100644
> --- a/arch/arm/mach-imx/Kconfig
> +++ b/arch/arm/mach-imx/Kconfig
> @@ -31,6 +31,7 @@ config ARCH_TEXT_BASE
> default 0x7fc00000 if MACH_GUF_VINCELL
> default 0x97f00000 if MACH_EFIKA_MX_SMARTBOOK
> default 0x17800000 if MACH_SABRESD
> + default 0x4fc00000 if MACH_REALQ7
>
> config BOARDINFO
> default "Eukrea CPUIMX25" if MACH_EUKREA_CPUIMX25
> @@ -61,6 +62,7 @@ config BOARDINFO
> default "Ka-Ro tx53" if MACH_TX53
> default "Garz+Fricke Vincell" if MACH_GUF_VINCELL
> default "SabreSD" if MACH_SABRESD
> + default "DataModul i.MX6Q Real Qseven" if MACH_REALQ7
>
> choice
> prompt "Select boot mode"
> @@ -496,6 +498,10 @@ config MACH_SABRELITE
> config MACH_SABRESD
> bool "Freescale i.MX6 SabreSD"
>
> +config MACH_REALQ7
> + bool "DataModul i.MX6Q Real Qseven Board"
> + select HAVE_DEFAULT_ENVIRONMENT_NEW
> +
> endchoice
>
> endif
> diff --git a/arch/arm/mach-imx/include/mach/devices-imx6.h b/arch/arm/mach-imx/include/mach/devices-imx6.h
> index a9c7e8d..b6b538a 100644
> --- a/arch/arm/mach-imx/include/mach/devices-imx6.h
> +++ b/arch/arm/mach-imx/include/mach/devices-imx6.h
> @@ -50,6 +50,26 @@ static inline struct device_d *imx6_add_spi0(struct spi_imx_master *pdata)
> return imx_add_spi((void *)MX6_ECSPI1_BASE_ADDR, 0, pdata);
> }
>
> +static inline struct device_d *imx6_add_spi1(struct spi_imx_master *pdata)
> +{
> + return imx_add_spi((void *)MX6_ECSPI2_BASE_ADDR, 1, pdata);
> +}
> +
> +static inline struct device_d *imx6_add_spi2(struct spi_imx_master *pdata)
> +{
> + return imx_add_spi((void *)MX6_ECSPI3_BASE_ADDR, 2, pdata);
> +}
> +
> +static inline struct device_d *imx6_add_spi3(struct spi_imx_master *pdata)
> +{
> + return imx_add_spi((void *)MX6_ECSPI4_BASE_ADDR, 3, pdata);
> +}
> +
> +static inline struct device_d *imx6_add_spi4(struct spi_imx_master *pdata)
> +{
> + return imx_add_spi((void *)MX6_ECSPI5_BASE_ADDR, 4, pdata);
> +}
> +
> static inline struct device_d *imx6_add_i2c0(struct i2c_platform_data *pdata)
> {
> return imx_add_i2c((void *)MX6_I2C1_BASE_ADDR, 0, pdata);
> --
> 1.8.2.rc2
>
>
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
More information about the barebox
mailing list