samsung: misc: fix soc revision setting in the set_board_info()
Subsystems (2)
PATCH 1/10 samsung: misc: fix soc revision setting in the set_board_info()
The byte order of soc revision was inverted, now it is fixed.
--- board/samsung/common/misc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
board/samsung/common/misc.c +2 -2
@@ -26,8 +26,8 @@ void set_board_info(void) {char info[64 ]; -snprintf (info,ARRAY_SIZE (info),"%d.%d" , s5p_cpu_rev &0x0f , - (s5p_cpu_rev &0xf0 ) >>0x04 ); +snprintf (info,ARRAY_SIZE (info),"%u.%u" , (s5p_cpu_rev &0xf0 ) >>4 , + s5p_cpu_rev &0xf );setenv ("soc_rev" , info);snprintf (info,ARRAY_SIZE (info),"%x" , s5p_cpu_id);
Signature · 1 line
1.9.1
PATCH 2/10 exynos: pinmux: fix the gpio names for exynos4x12 mmc
This change fixes the bad gpio configuration for the exynos dwmmc.
--- arch/arm/cpu/armv7/exynos/pinmux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/cpu/armv7/exynos/pinmux.c +2 -2
@@ -704,8 +704,8 @@ static int exynos4x12_mmc_config(int peripheral, int flags) ext_func =S5P_GPIO_FUNC (0x3 );break ;case PERIPH_ID_SDMMC4 : - start =EXYNOS4_GPIO_K00 ; - start_ext =EXYNOS4_GPIO_K13 ; + start =EXYNOS4X12_GPIO_K00 ; + start_ext =EXYNOS4X12_GPIO_K13 ; func =S5P_GPIO_FUNC (0x3 ); ext_func =S5P_GPIO_FUNC (0x4 );break ;
Signature · 1 line
1.9.1
PATCH 2/10 exynos: pinmux: fix the gpio names for exynos4x12 mmc
Looks good to me.
Quoted 26 lines · Przemyslaw Marczak
This change fixes the bad gpio configuration for the exynos dwmmc.
Signed-off-by Przemyslaw Marczak <[email protected]>Cc Beomho Seo <[email protected]>Cc Minkyu Kang <[email protected]>Cc Jaehoon Chung <[email protected]>--- arch/arm/cpu/armv7/exynos/pinmux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)arch/arm/cpu/armv7/exynos/pinmux.c +2
-2@@ -704,8 +704,8 @@ static int exynos4x12_mmc_config(int peripheral, int flags) ext_func =S5P_GPIO_FUNC (0x3 );break ;case PERIPH_ID_SDMMC4 : - start =EXYNOS4_GPIO_K00 ; - start_ext =EXYNOS4_GPIO_K13 ; + start =EXYNOS4X12_GPIO_K00 ; + start_ext =EXYNOS4X12_GPIO_K13 ; func =S5P_GPIO_FUNC (0x3 ); ext_func =S5P_GPIO_FUNC (0x4 );break ;
PATCH 3/10 board:samsung: check the mmc boot device and init the right mmc driver.
In reply to Przemyslaw MarczakIt is possible to boot from a few media devices, especially using a micro SD or eMMC slots. In this situation, boot device should be registered as block device 0 in the MMC framework, because CONFIG_SYS_MMC_ENV_DEV is usually set to "0" in the most config cases.
--- board/samsung/common/board.c | 32 ++++++++++++++++++++++++-------- include/samsung/misc.h | 5 +++++ 2 files changed, 29 insertions(+), 8 deletions(-)
board/samsung/common/board.c +24 -8
@@ -25,6 +25,8 @@#include <lcd.h> #include <samsung/misc.h> +static int bootmode; +DECLARE_GLOBAL_DATA_PTR ;int __exynos_early_init_f (void )
@@ -243,19 +245,33 @@ int board_eth_init(bd_t *bis)int board_mmc_init (bd_t *bis) {int ret; +struct exynos4_power *pwr = (struct exynos4_power *) +samsung_get_base_power (); + + bootmode =BOOT_MODE (readl (&pwr->om_stat)); +if (bootmode ==BOOT_SDMMC ) { +#ifdef CONFIG_SDHCI +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif #ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob); +#endif + }else { +#ifdef CONFIG_DWMMC +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob);#endif -#ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob); +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif + } +if (ret)debug ("mmc init failed\n" ); -#endif +return ret; }#endif
include/samsung/misc.h +5 -0
@@ -28,4 +28,9 @@ void check_boot_mode(void);void draw_logo (void );#endif +#define BOOT_SDMMC 0x2 +#define BOOT_MODE_MASK (0x1f) +#define BOOT_MODE_SHIFT (0x1) +#define BOOT_MODE (x) ((x >> BOOT_MODE_SHIFT) & BOOT_MODE_MASK) +#endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH 4/10 samsung: misc: set the dfu bootloader setting at boot time.
In reply to Przemyslaw MarczakThis change adds new function:
- set_dfu_boot_alt(bootmode) - where bootmode is the value of Exynos ompin[5:1] masked with BOOT_MODE(x) macro.
This change is useful for devices with more than one boot device, e.g. with a separated SD and eMMC slots. Different dfu entities are required for SD and eMMC cards. The board config should define:
- CONFIG_MISC_COMMON
- CONFIG_SET_DFU_BOOT_ALT
and at least one of below alt setting:
- CONFIG_DFU_BOOT_ALT_SD, e.g: "u-boot raw 1 2048"
- CONFIG_DFU_BOOT_ALT_eMMC, e.g: "u-boot raw 0 2048 mmcpart 1"
--- board/samsung/common/board.c | 3 +++ board/samsung/common/misc.c | 23 +++++++++++++++++++++++ include/samsung/misc.h | 4 ++++ 3 files changed, 30 insertions(+)
board/samsung/common/board.c +3 -0
@@ -323,6 +323,9 @@ int arch_early_init_r(void)#ifdef CONFIG_MISC_INIT_R int misc_init_r (void ) { +#ifdef CONFIG_SET_DFU_BOOT_ALT +set_dfu_boot_alt (bootmode); +#endif #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG set_board_info ();#endif
board/samsung/common/misc.c +23 -0
@@ -21,6 +21,29 @@DECLARE_GLOBAL_DATA_PTR ; +#ifdef CONFIG_SET_DFU_BOOT_ALT +void set_dfu_boot_alt (int bootmode) +{ +char *alt_bootloader =NULL ; + +switch (bootmode) { +case BOOT_SDMMC : +#ifdef CONFIG_DFU_BOOT_ALT_SD + alt_bootloader =CONFIG_DFU_BOOT_ALT_SD ; +#endif +break ; +default : +#ifdef CONFIG_DFU_BOOT_ALT_EMMC + alt_bootloader =CONFIG_DFU_BOOT_ALT_EMMC ; +#endif +break ; + } + +if (alt_bootloader) +setenv ("dfu_alt_bootloader" , alt_bootloader); +} +#endif +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG void set_board_info (void ) {
include/samsung/misc.h +4 -0
@@ -33,4 +33,8 @@ void draw_logo(void);#define BOOT_MODE_SHIFT (0x1)#define BOOT_MODE (x) ((x >> BOOT_MODE_SHIFT) & BOOT_MODE_MASK) +#ifdef CONFIG_SET_DFU_BOOT_ALT +void set_dfu_boot_alt (int bootmode); +#endif +#endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH 4/10 samsung: misc: set the dfu bootloader setting at boot time.
Hi Przemyslaw,
I have a question.
"dfu_alt_bootloader" env is settings successfully
Quoted 1 line
dfu_alt_bootloader=u-boot raw
0x3e0x800mmcpart 1
But,
In order to replace bootloader binary in thor mode, How can I use the "dfu_alt_bootloader" env?
DFU gadget use "dfu_alt_info" env for DFU entities configuration.
Is there any patch to support multiple "dfu_alt" environment, or "dfu_alt_info" environment settings to use "dfu_alt_bootloader" env?
best regards,
Inha Song.
Quoted 86 lines · On Tue, 10 Jun 2014 13:32:58 +0200 Przemyslaw Marczak <[email protected]>…
This change adds new function:
-set_dfu_boot_alt(bootmode)- where bootmode is the value of Exynos ompin[5:1] masked withBOOT_MODE(x)macro.This change is useful for devices with more than one boot device, e.g. with a separated SD and eMMC slots. Different dfu entities are required for SD and eMMC cards. The board config should define:
-CONFIG_MISC_COMMON
-CONFIG_SET_DFU_BOOT_ALT
and at least one of below alt setting:
-CONFIG_DFU_BOOT_ALT_SD, e.g: "u-boot raw 1 2048"
-CONFIG_DFU_BOOT_ALT_eMMC, e.g: "u-boot raw 0 2048 mmcpart 1"Signed-off-by Przemyslaw Marczak <[email protected]>Cc Piotr Wilczek <[email protected]>Cc Minkyu Kang <[email protected]>--- board/samsung/common/board.c | 3 +++ board/samsung/common/misc.c | 23 +++++++++++++++++++++++ include/samsung/misc.h | 4 ++++ 3 files changed, 30 insertions(+)board/samsung/common/board.c +3
-0@@ -323,6 +323,9 @@ int arch_early_init_r(void)#ifdef CONFIG_MISC_INIT_R int misc_init_r (void ) { +#ifdef CONFIG_SET_DFU_BOOT_ALT +set_dfu_boot_alt (bootmode); +#endif #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG set_board_info ();#endif board/samsung/common/misc.c +23
-0@@ -21,6 +21,29 @@DECLARE_GLOBAL_DATA_PTR ; +#ifdef CONFIG_SET_DFU_BOOT_ALT +void set_dfu_boot_alt (int bootmode) +{ +char *alt_bootloader =NULL ; + +switch (bootmode) { +case BOOT_SDMMC : +#ifdef CONFIG_DFU_BOOT_ALT_SD + alt_bootloader =CONFIG_DFU_BOOT_ALT_SD ; +#endif +break ; +default : +#ifdef CONFIG_DFU_BOOT_ALT_EMMC + alt_bootloader =CONFIG_DFU_BOOT_ALT_EMMC ; +#endif +break ; + } + +if (alt_bootloader) +setenv ("dfu_alt_bootloader" , alt_bootloader); +} +#endif +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG void set_board_info (void ) {include/samsung/misc.h +4
-0@@ -33,4 +33,8 @@ void draw_logo(void);#define BOOT_MODE_SHIFT (0x1)#define BOOT_MODE (x) ((x >> BOOT_MODE_SHIFT) & BOOT_MODE_MASK) +#ifdef CONFIG_SET_DFU_BOOT_ALT +void set_dfu_boot_alt (int bootmode); +#endif +#endif /* __SAMSUNG_MISC_COMMON_H__ */ Signature · 1 line
1.9.1
PATCH 4/10 samsung: misc: set the dfu bootloader setting at boot time.
Hi Inha,
Quoted 11 lines · Inha Song
Hi Przemyslaw,
I have a question.
"
dfu_alt_bootloader" env is settings successfullyQuoted 1 line
dfu_alt_bootloader=u-boot raw
0x3e0x800mmcpart 1But,
In order to replace bootloader binary in thor mode, How can I use the "dfu_alt_bootloader" env?
Quoted 9 lines
DFU gadget use "
dfu_alt_info" env for DFU entities configuration.Is there any patch to support multiple "
dfu_alt" environment, or "dfu_alt_info" environment settings to use "dfu_alt_bootloader" env?best regards,
Inha Song.
Actually, I didn't finished this at all. It is possible to do this manually at prompt by "setenv dfu_alt_info ${dfu_alt_bootloader}", but this overwrites current alt settings, so it's not so good.
In the next patch set I will add some feature to DFU, since "dfu_alt_bootloader" could be treat as one of DFU option.
Thank you again,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH 5/10 arm:reset: call the reset_misc() before the cpu reset
In reply to Przemyslaw MarczakOn an Odroid U3 board, the SOC is unable to reset an eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function.
This is done by the reset_misc() function, which is called before reset_cpu(). The function reset_misc() is a weak function.
--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)
arch/arm/lib/reset.c +7 -0
@@ -23,6 +23,11 @@#include <common.h> +void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +int do_reset (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) {puts ("resetting ...\n" );
@@ -30,6 +35,8 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])udelay (50000 );/* wait 50 ms */ disable_interrupts (); + +reset_misc ();reset_cpu (0 );/*NOTREACHED*/
include/common.h +1 -0
@@ -629,6 +629,7 @@ int checkicache (void);int checkdcache (void );void upmconfig (unsigned int ,unsigned int *,unsigned int );ulong get_tbclk (void ); +void reset_misc (void );void reset_cpu (ulong addr);#if defined (CONFIG_OF_LIBFDT ) && defined (CONFIG_OF_BOARD_SETUP )void ft_cpu_setup (void *blob,bd_t *bd);
Signature · 1 line
1.9.1
PATCH 6/10 samsung: misc: set_board_info: check the board type to set fdt file name
In reply to Przemyslaw MarczakThis change adds a call to the get_board_type_fdt() function before setting the "fdtfile" environment variable.
For CONFIG_BOARD_TYPES below function is called:
- const char *get_board_type_fdt(void) - should return a pointer to the board type string.
This is useful in case of run many boards with just one config.
--- board/samsung/common/misc.c | 8 ++++++-- include/samsung/misc.h | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-)
board/samsung/common/misc.c +6 -2
@@ -48,6 +48,7 @@ void set_dfu_boot_alt(int bootmode)void set_board_info (void ) {char info[64 ]; +const char *bdtype ="" ;snprintf (info,ARRAY_SIZE (info),"%u.%u" , (s5p_cpu_rev &0xf0 ) >>4 , s5p_cpu_rev &0xf );
@@ -61,8 +62,11 @@ void set_board_info(void)setenv ("board_rev" , info);#endif #ifdef CONFIG_OF_LIBFDT -snprintf (info,ARRAY_SIZE (info),"%s%x-%s.dtb" , -CONFIG_SYS_SOC , s5p_cpu_id,CONFIG_SYS_BOARD ); +#ifdef CONFIG_BOARD_TYPES + bdtype =get_board_type_fdt (); +#endif +snprintf (info,ARRAY_SIZE (info),"%s%x-%s%s.dtb" , +CONFIG_SYS_SOC , s5p_cpu_id,CONFIG_SYS_BOARD , bdtype);setenv ("fdtfile" , info);#endif }
include/samsung/misc.h +3 -0
@@ -36,5 +36,8 @@ void draw_logo(void);#ifdef CONFIG_SET_DFU_BOOT_ALT void set_dfu_boot_alt (int bootmode);#endif +#ifdef CONFIG_BOARD_TYPES +const char *get_board_type_fdt (void ); +#endif #endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH 7/10 samsung: board: checkboard: call get_board_type() for CONFIG_BOARD_TYPES
In reply to Przemyslaw MarczakFor support of multiple board types in a one config - it is welcome to display the current board model. This is what get_board_type() should return.
--- board/samsung/common/board.c | 5 ++++- include/samsung/misc.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)
board/samsung/common/board.c +4 -1
@@ -283,7 +283,10 @@ int checkboard(void) board_name =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL );printf ("Board: %s\n" , board_name ? board_name :"unknown" ); - +#ifdef CONFIG_BOARD_TYPES +const char *board_type =get_board_type (); +printf ("Model: %s\n" , board_type ? board_type :"unknown" ); +#endif return 0; }#endif
include/samsung/misc.h +1 -0
@@ -37,6 +37,7 @@ void draw_logo(void);void set_dfu_boot_alt (int bootmode);#endif #ifdef CONFIG_BOARD_TYPES +const char *get_board_type (void );const char *get_board_type_fdt (void );#endif
Signature · 1 line
1.9.1
PATCH 8/10 odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
In reply to Przemyslaw MarczakThis board file supports standard features of Odroid X2 and U3 boards:
- Exynos4412 core clock set to 1000MHz and MPLL peripherial clock set to 800MHz,
- MAX77686 power regulator,
- USB PHY,
- enable XCL205 - power for board peripherials
- check board type: U3 or X2.
--- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 432 ++++++++++++++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 ++++++++++++++++++++++ 3 files changed, 667 insertions(+) create mode 100644 board/samsung/odroid/Makefile create mode 100644 board/samsung/odroid/odroid.c create mode 100644 board/samsung/odroid/setup.h
board/samsung/odroid/Makefile new file +8 -0
@@ -0,0 +1,8 @@ +# +# Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved. +# Przemyslaw Marczak <[email protected]> +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y := odroid.o
board/samsung/odroid/odroid.c new file +432 -0
432 lines not on this page · raw message
board/samsung/odroid/setup.h new file +227 -0
227 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH 8/10 odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
Hi Przemyslaw,
In U3 board, cooling pan is not work.
I think, cooling pan setting is need in board_gpio_init(). (X2 board use cooling pan pwr form USB port)
best regards,
Inha Song.
Quoted 707 lines · On Tue, 10 Jun 2014 13:33:02 +0200 Przemyslaw Marczak <[email protected]>…
This board file supports standard features of Odroid X2 and U3 boards:
- Exynos4412 core clock set to 1000MHz and MPLL peripherial clock set to 800MHz,
- MAX77686 power regulator,
- USB PHY,
- enable XCL205 - power for board peripherials
- check board type: U3 or X2.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Tom Rini <[email protected]>--- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 432 ++++++++++++++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 ++++++++++++++++++++++ 3 files changed, 667 insertions(+) create mode 100644 board/samsung/odroid/Makefile create mode 100644 board/samsung/odroid/odroid.c create mode 100644 board/samsung/odroid/setup.hboard/samsung/odroid/Makefile new file +8
-0@@ -0,0 +1,8 @@ +# +# Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved. +# Przemyslaw Marczak <[email protected]> +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y := odroid.oboard/samsung/odroid/odroid.c new file +432
-0@@ -0,0 +1,432 @@ +/* +* Copyright (C) 2014 Samsung Electronics +* Przemyslaw Marczak <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <common.h> +#include <asm/arch/pinmux.h> +#include <asm/arch/power.h> +#include <asm/arch/clock.h> +#include <asm/arch/gpio.h> +#include <asm/gpio.h> +#include <asm/arch/cpu.h> +#include <power/pmic.h> +#include <power/max77686_pmic.h> +#include <errno.h> +#include <usb.h> +#include <usb/s3c_udc.h> +#include "setup.h" + +DECLARE_GLOBAL_DATA_PTR ; + +/* Odroid board types */ +enum { +ODROID_TYPE_U3 , +ODROID_TYPE_X2 , +}; + +static void set_board_type (void ) +{ +int val; + +/* Check GPC1 pin 2 */ +gpio_set_pull (EXYNOS4X12_GPIO_C12 ,S5P_GPIO_PULL_NONE ); +gpio_set_drv (EXYNOS4X12_GPIO_C12 ,S5P_GPIO_DRV_4X ); +gpio_direction_input (EXYNOS4X12_GPIO_C12 ); + +/* XCL205 - needs some latch time */ +mdelay (10 ); + +/* Check GPC1 pin2 - LED supplied by XCL205 - X2 only */ + val =gpio_get_value (EXYNOS4X12_GPIO_C12 ); +if (val) + gd->board_type =ODROID_TYPE_X2 ; +else + gd->board_type =ODROID_TYPE_U3 ; +} + +const char *get_board_type (void ) +{ +const char *board_type_str[] = {"U3" ,"X2" }; + +set_board_type (); + +return board_type_str[gd->board_type]; +} + +const char *get_board_type_fdt (void ) +{ +const char *board_type_fdt[] = {"u3" ,"x2" }; + +return board_type_fdt[gd->board_type]; +} + +static void board_clock_init (void ) +{ +unsigned int set, clr, clr_src_cpu, clr_pll_con0, clr_src_dmc; +struct exynos4x12_clock *clk = (struct exynos4x12_clock *) +samsung_get_base_clock (); + +/* +* CMU_CPU clocks src to MPLL +* Bit values: 0 ; 1 +* MUX_APLL_SEL: FIN_PLL ; FOUT_APLL +* MUX_CORE_SEL: MOUT_APLL ; SCLK_MPLL +* MUX_HPM_SEL: MOUT_APLL ; SCLK_MPLL_USER_C +* MUX_MPLL_USER_SEL_C: FIN_PLL ; SCLK_MPLL +*/ + clr_src_cpu =MUX_APLL_SEL (0x1 ) |MUX_CORE_SEL (0x1 ) | +MUX_HPM_SEL (0x1 ) |MUX_MPLL_USER_SEL_C (0x1 ); + set =MUX_APLL_SEL (0 ) |MUX_CORE_SEL (1 ) |MUX_HPM_SEL (1 ) | +MUX_MPLL_USER_SEL_C (1 ); + +clrsetbits_le32 (&clk->src_cpu, clr_src_cpu, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_cpu) &MUX_STAT_CPU_CHANGING ) +continue ; + +/* Set APLL to 1000MHz */ + clr_pll_con0 =SDIV (0x7 ) |PDIV (0x3f ) |MDIV (0x3ff ) |FSEL (0x1 ); + set =SDIV (0 ) |PDIV (3 ) |MDIV (125 ) |FSEL (1 ); + +clrsetbits_le32 (&clk->apll_con0, clr_pll_con0, set); + +/* Wait for PLL to be locked */ +while (!(readl (&clk->apll_con0) &PLL_LOCKED_BIT )) +continue ; + +/* Set CMU_CPU clocks src to APLL */ + set =MUX_APLL_SEL (1 ) |MUX_CORE_SEL (0 ) |MUX_HPM_SEL (0 ) | +MUX_MPLL_USER_SEL_C (1 ); +clrsetbits_le32 (&clk->src_cpu, clr_src_cpu, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_cpu) &MUX_STAT_CPU_CHANGING ) +continue ; + + set =CORE_RATIO (0 ) |COREM0_RATIO (2 ) |COREM1_RATIO (5 ) | +PERIPH_RATIO (0 ) |ATB_RATIO (4 ) |PCLK_DBG_RATIO (1 ) | +APLL_RATIO (0 ) |CORE2_RATIO (0 ); +/* +* Set dividers for MOUTcore = 1000 MHz +* coreout = MOUT / (ratio + 1) = 1000 MHz (0) +* corem0 = armclk / (ratio + 1) = 333 MHz (2) +* corem1 = armclk / (ratio + 1) = 166 MHz (5) +* periph = armclk / (ratio + 1) = 1000 MHz (0) +* atbout = MOUT / (ratio + 1) = 200 MHz (4) +* pclkdbgout = atbout / (ratio + 1) = 100 MHz (1) +* sclkapll = MOUTapll / (ratio + 1) = 1000 MHz (0) +* core2out = core_out / (ratio + 1) = 1000 MHz (0) (armclk) +*/ + clr =CORE_RATIO (0x7 ) |COREM0_RATIO (0x7 ) |COREM1_RATIO (0x7 ) | +PERIPH_RATIO (0x7 ) |ATB_RATIO (0x7 ) |PCLK_DBG_RATIO (0x7 ) | +APLL_RATIO (0x7 ) |CORE2_RATIO (0x7 ); + +clrsetbits_le32 (&clk->div_cpu0, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_cpu0) &DIV_STAT_CPU0_CHANGING ) +continue ; + +/* +* For MOUThpm = 1000 MHz (MOUTapll) +* doutcopy = MOUThpm / (ratio + 1) = 200 (4) +* sclkhpm = doutcopy / (ratio + 1) = 200 (4) +* cores_out = armclk / (ratio + 1) = 1000 (0) +*/ + clr =COPY_RATIO (0x7 ) |HPM_RATIO (0x7 ) |CORES_RATIO (0x7 ); + set =COPY_RATIO (4 ) |HPM_RATIO (4 ) |CORES_RATIO (0 ); + +clrsetbits_le32 (&clk->div_cpu1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_cpu1) &DIV_STAT_CPU1_CHANGING ) +continue ; + +/* +* Set CMU_DMC clocks src to APLL +* Bit values: 0 ; 1 +* MUX_C2C_SEL: SCLKMPLL ; SCLKAPLL +* MUX_DMC_BUS_SEL: SCLKMPLL ; SCLKAPLL +* MUX_DPHY_SEL: SCLKMPLL ; SCLKAPLL +* MUX_MPLL_SEL: FINPLL ; MOUT_MPLL_FOUT +* MUX_PWI_SEL: 0110 (MPLL); 0111 (EPLL); 1000 (VPLL); 0(XXTI) +* MUX_G2D_ACP0_SEL: SCLKMPLL ; SCLKAPLL +* MUX_G2D_ACP1_SEL: SCLKEPLL ; SCLKVPLL +* MUX_G2D_ACP_SEL: OUT_ACP0 ; OUT_ACP1 +*/ + clr_src_dmc =MUX_C2C_SEL (0x1 ) |MUX_DMC_BUS_SEL (0x1 ) | +MUX_DPHY_SEL (0x1 ) |MUX_MPLL_SEL (0x1 ) | +MUX_PWI_SEL (0xf ) |MUX_G2D_ACP0_SEL (0x1 ) | +MUX_G2D_ACP1_SEL (0x1 ) |MUX_G2D_ACP_SEL (0x1 ); + set =MUX_C2C_SEL (1 ) |MUX_DMC_BUS_SEL (1 ) |MUX_DPHY_SEL (1 ) | +MUX_MPLL_SEL (0 ) |MUX_PWI_SEL (0 ) |MUX_G2D_ACP0_SEL (1 ) | +MUX_G2D_ACP1_SEL (1 ) |MUX_G2D_ACP_SEL (1 ); + +clrsetbits_le32 (&clk->src_dmc, clr_src_dmc, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_dmc) &MUX_STAT_DMC_CHANGING ) +continue ; + +/* Set MPLL to 800MHz */ + set =SDIV (0 ) |PDIV (3 ) |MDIV (100 ) |FSEL (0 ) |PLL_ENABLE (1 ); + +clrsetbits_le32 (&clk->mpll_con0, clr_pll_con0, set); + +/* Wait for PLL to be locked */ +while (!(readl (&clk->mpll_con0) &PLL_LOCKED_BIT )) +continue ; + +/* Switch back CMU_DMC mux */ + set =MUX_C2C_SEL (0 ) |MUX_DMC_BUS_SEL (0 ) |MUX_DPHY_SEL (0 ) | +MUX_MPLL_SEL (1 ) |MUX_PWI_SEL (8 ) |MUX_G2D_ACP0_SEL (0 ) | +MUX_G2D_ACP1_SEL (0 ) |MUX_G2D_ACP_SEL (0 ); + +clrsetbits_le32 (&clk->src_dmc, clr_src_dmc, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_dmc) &MUX_STAT_DMC_CHANGING ) +continue ; + +/* CLK_DIV_DMC0 */ + clr =ACP_RATIO (0x7 ) |ACP_PCLK_RATIO (0x7 ) |DPHY_RATIO (0x7 ) | +DMC_RATIO (0x7 ) |DMCD_RATIO (0x7 ) |DMCP_RATIO (0x7 ); +/* +* For: +* MOUTdmc = 800 MHz +* MOUTdphy = 800 MHz +* +* aclk_acp = MOUTdmc / (ratio + 1) = 200 (3) +* pclk_acp = aclk_acp / (ratio + 1) = 100 (1) +* sclk_dphy = MOUTdphy / (ratio + 1) = 400 (1) +* sclk_dmc = MOUTdmc / (ratio + 1) = 400 (1) +* aclk_dmcd = sclk_dmc / (ratio + 1) = 200 (1) +* aclk_dmcp = aclk_dmcd / (ratio + 1) = 100 (1) +*/ + set =ACP_RATIO (3 ) |ACP_PCLK_RATIO (1 ) |DPHY_RATIO (1 ) | +DMC_RATIO (1 ) |DMCD_RATIO (1 ) |DMCP_RATIO (1 ); + +clrsetbits_le32 (&clk->div_dmc0, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_dmc0) &DIV_STAT_DMC0_CHANGING ) +continue ; + +/* CLK_DIV_DMC1 */ + clr =G2D_ACP_RATIO (0xf ) |C2C_RATIO (0x7 ) |PWI_RATIO (0xf ) | +C2C_ACLK_RATIO (0x7 ) |DVSEM_RATIO (0x7f ) |DPM_RATIO (0x7f ); +/* +* For: +* MOUTg2d = 800 MHz +* MOUTc2c = 800 Mhz +* MOUTpwi = 108 MHz +* +* sclk_g2d_acp = MOUTg2d / (ratio + 1) = 400 (1) +* sclk_c2c = MOUTc2c / (ratio + 1) = 400 (1) +* aclk_c2c = sclk_c2c / (ratio + 1) = 200 (1) +* sclk_pwi = MOUTpwi / (ratio + 1) = 18 (5) +*/ + set =G2D_ACP_RATIO (1 ) |C2C_RATIO (1 ) |PWI_RATIO (5 ) | +C2C_ACLK_RATIO (1 ) |DVSEM_RATIO (1 ) |DPM_RATIO (1 ); + +clrsetbits_le32 (&clk->div_dmc1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_dmc1) &DIV_STAT_DMC1_CHANGING ) +continue ; + +/* CLK_SRC_PERIL0 */ + clr =UART0_SEL (0xf ) |UART1_SEL (0xf ) |UART2_SEL (0xf ) | +UART3_SEL (0xf ) |UART4_SEL (0xf ); +/* +* Set CLK_SRC_PERIL0 clocks src to MPLL +* src values: 0(XXTI); 1(XusbXTI); 2(SCLK_HDMI24M); 3(SCLK_USBPHY0); +* 5(SCLK_HDMIPHY); 6(SCLK_MPLL_USER_T); 7(SCLK_EPLL); +* 8(SCLK_VPLL) +* +* Set all to SCLK_MPLL_USER_T +*/ + set =UART0_SEL (6 ) |UART1_SEL (6 ) |UART2_SEL (6 ) |UART3_SEL (6 ) | +UART4_SEL (6 ); + +clrsetbits_le32 (&clk->src_peril0, clr, set); + +/* CLK_DIV_PERIL0 */ + clr =UART0_RATIO (0xf ) |UART1_RATIO (0xf ) |UART2_RATIO (0xf ) | +UART3_RATIO (0xf ) |UART4_RATIO (0xf ); +/* +* For MOUTuart0-4: 800MHz +* +* SCLK_UARTx = MOUTuartX / (ratio + 1) = 100 (7) +*/ + set =UART0_RATIO (7 ) |UART1_RATIO (7 ) |UART2_RATIO (7 ) | +UART3_RATIO (7 ) |UART4_RATIO (7 ); + +clrsetbits_le32 (&clk->div_peril0, clr, set); + +while (readl (&clk->div_stat_peril0) &DIV_STAT_PERIL0_CHANGING ) +continue ; + +/* CLK_DIV_FSYS1 */ + clr =MMC0_RATIO (0xf ) |MMC0_PRE_RATIO (0xff ) |MMC1_RATIO (0xf ) | +MMC1_PRE_RATIO (0xff ); +/* +* For MOUTmmc0-3 = 800 MHz (MPLL) +* +* DOUTmmc1 = MOUTmmc1 / (ratio + 1) = 100 (7) +* sclk_mmc1 = DOUTmmc1 / (ratio + 1) = 50 (1) +* DOUTmmc0 = MOUTmmc0 / (ratio + 1) = 100 (7) +* sclk_mmc0 = DOUTmmc0 / (ratio + 1) = 50 (1) +*/ + set =MMC0_RATIO (7 ) |MMC0_PRE_RATIO (1 ) |MMC1_RATIO (7 ) | +MMC1_PRE_RATIO (1 ); + +clrsetbits_le32 (&clk->div_fsys1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys1) &DIV_STAT_FSYS1_CHANGING ) +continue ; + +/* CLK_DIV_FSYS2 */ + clr =MMC2_RATIO (0xf ) |MMC2_PRE_RATIO (0xff ) |MMC3_RATIO (0xf ) | +MMC3_PRE_RATIO (0xff ); +/* +* For MOUTmmc0-3 = 800 MHz (MPLL) +* +* DOUTmmc3 = MOUTmmc3 / (ratio + 1) = 100 (7) +* sclk_mmc3 = DOUTmmc3 / (ratio + 1) = 50 (1) +* DOUTmmc2 = MOUTmmc2 / (ratio + 1) = 100 (7) +* sclk_mmc2 = DOUTmmc2 / (ratio + 1) = 50 (1) +*/ + set =MMC2_RATIO (7 ) |MMC2_PRE_RATIO (1 ) |MMC3_RATIO (7 ) | +MMC3_PRE_RATIO (1 ); + +clrsetbits_le32 (&clk->div_fsys2, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys2) &DIV_STAT_FSYS2_CHANGING ) +continue ; + +/* CLK_DIV_FSYS3 */ + clr =MMC4_RATIO (0xf ) |MMC4_PRE_RATIO (0xff ); +/* +* For MOUTmmc4 = 800 MHz (MPLL) +* +* DOUTmmc4 = MOUTmmc4 / (ratio + 1) = 100 (7) +* sclk_mmc4 = DOUTmmc4 / (ratio + 1) = 100 (0) +*/ + set =MMC4_RATIO (7 ) |MMC4_PRE_RATIO (0 ); + +clrsetbits_le32 (&clk->div_fsys3, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys3) &DIV_STAT_FSYS3_CHANGING ) +continue ; + +return ; +} + +static void board_gpio_init (void ) +{ +/* Set GPA1 pin 1 to HI - enable XCL205 output */ +gpio_set_pull (EXYNOS4X12_GPIO_A11 ,S5P_GPIO_PULL_UP ); +gpio_set_drv (EXYNOS4X12_GPIO_A11 ,S5P_GPIO_DRV_4X ); +gpio_direction_output (EXYNOS4X12_GPIO_A11 ,1 ); + +gpio_cfg_pin (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_FUNC (0x1 )); +gpio_set_pull (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_PULL_NONE ); +gpio_set_drv (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_DRV_4X ); +} + +static int pmic_init_max77686 (void ) +{ +struct pmic *p =pmic_get ("MAX77686_PMIC" ); + +if (pmic_probe (p)) +return -ENODEV ; + +/* Set LDO Voltage */ +max77686_set_ldo_voltage (p,20 ,1800000 );/* LDO20 eMMC */ +max77686_set_ldo_voltage (p,21 ,2800000 );/* LDO21 SD */ +max77686_set_ldo_voltage (p,22 ,2800000 );/* LDO22 eMMC */ + +return 0 ; +} + +#ifdef CONFIG_SYS_I2C_INIT_BOARD +static void board_init_i2c (void ) +{ +/* I2C_0 */ +if (exynos_pinmux_config (PERIPH_ID_I2C0 ,PINMUX_FLAG_NONE )) +debug ("I2C%d not configured\n" , (I2C_0 )); +} +#endif + +int exynos_early_init_f (void ) +{ +board_clock_init (); +board_gpio_init (); + +return 0 ; +} + +int exynos_init (void ) +{ +return 0 ; +} + +int exynos_power_init (void ) +{ +#ifdef CONFIG_SYS_I2C_INIT_BOARD +board_init_i2c (); +#endif +pmic_init (I2C_0 ); +pmic_init_max77686 (); + +return 0 ; +} + +#ifdef CONFIG_USB_GADGET +static int s5pc210_phy_control (int on) +{ +struct pmic *p_pmic; + + p_pmic =pmic_get ("MAX77686_PMIC" ); +if (!p_pmic) +return -ENODEV ; + +if (pmic_probe (p_pmic)) +return -1 ; + +if (on) +return max77686_set_ldo_mode (p_pmic,12 ,OPMODE_ON ); +else +return max77686_set_ldo_mode (p_pmic,12 ,OPMODE_LPM ); +} + +struct s3c_plat_otg_data s5pc210_otg_data = { + .phy_control = s5pc210_phy_control, + .regs_phy =EXYNOS4X12_USBPHY_BASE , + .regs_otg =EXYNOS4X12_USBOTG_BASE , + .usb_phy_ctrl =EXYNOS4X12_USBPHY_CONTROL , + .usb_flags =PHY0_SLEEP , +}; + +int board_usb_init (int index,enum usb_init_type init) +{ +debug ("USB_udc_probe\n" ); +return s3c_udc_probe (&s5pc210_otg_data); +} +#endif + +void reset_misc (void ) +{ +/* Reset eMMC*/ +gpio_set_value (EXYNOS4X12_GPIO_K12 ,0 ); +mdelay (10 ); +gpio_set_value (EXYNOS4X12_GPIO_K12 ,1 ); +}board/samsung/odroid/setup.h new file +227
-0@@ -0,0 +1,227 @@ +/* +* Copyright (C) 2014 Samsung Electronics +* Przemyslaw Marczak <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#ifndef __ODROIDU3_SETUP__ +#define __ODROIDU3_SETUP__ + +/* A/M PLL_CON0 */ +#define SDIV (x) (x & 0x7) +#define PDIV (x) ((x & 0x3f) << 8) +#define MDIV (x) ((x & 0x3ff) << 16) +#define FSEL (x) ((x & 0x1) << 27) +#define PLL_LOCKED_BIT (0x1 << 29) +#define PLL_ENABLE (x) ((x & 0x1) << 31) + +/* CLK_SRC_CPU */ +#define MUX_APLL_SEL (x) (x & 0x1) +#define MUX_CORE_SEL (x) ((x & 0x1) << 16) +#define MUX_HPM_SEL (x) ((x & 0x1) << 20) +#define MUX_MPLL_USER_SEL_C (x) ((x & 0x1) << 24) + +#define MUX_STAT_CHANGING 0x100 + +/* CLK_MUX_STAT_CPU */ +#define APLL_SEL (x) (x & 0x7) +#define CORE_SEL (x) ((x & 0x7) << 16) +#define HPM_SEL (x) ((x & 0x7) << 20) +#define MPLL_USER_SEL_C (x) ((x & 0x7) << 24) +#define MUX_STAT_CPU_CHANGING (APLL_SEL(MUX_STAT_CHANGING) | \ + CORE_SEL(MUX_STAT_CHANGING) | \ + HPM_SEL(MUX_STAT_CHANGING) | \ + MPLL_USER_SEL_C(MUX_STAT_CHANGING)) + +/* CLK_DIV_CPU0 */ +#define CORE_RATIO (x) (x & 0x7) +#define COREM0_RATIO (x) ((x & 0x7) << 4) +#define COREM1_RATIO (x) ((x & 0x7) << 8) +#define PERIPH_RATIO (x) ((x & 0x7) << 12) +#define ATB_RATIO (x) ((x & 0x7) << 16) +#define PCLK_DBG_RATIO (x) ((x & 0x7) << 20) +#define APLL_RATIO (x) ((x & 0x7) << 24) +#define CORE2_RATIO (x) ((x & 0x7) << 28) + +/* CLK_DIV_STAT_CPU0 */ +#define DIV_CORE (x) (x & 0x1) +#define DIV_COREM0 (x) ((x & 0x1) << 4) +#define DIV_COREM1 (x) ((x & 0x1) << 8) +#define DIV_PERIPH (x) ((x & 0x1) << 12) +#define DIV_ATB (x) ((x & 0x1) << 16) +#define DIV_PCLK_DBG (x) ((x & 0x1) << 20) +#define DIV_APLL (x) ((x & 0x1) << 24) +#define DIV_CORE2 (x) ((x & 0x1) << 28) + +#define DIV_STAT_CHANGING 0x1 +#define DIV_STAT_CPU0_CHANGING (DIV_CORE(DIV_STAT_CHANGING) | \ + DIV_COREM0(DIV_STAT_CHANGING) | \ + DIV_COREM1(DIV_STAT_CHANGING) | \ + DIV_PERIPH(DIV_STAT_CHANGING) | \ + DIV_ATB(DIV_STAT_CHANGING) | \ + DIV_PCLK_DBG(DIV_STAT_CHANGING) | \ + DIV_APLL(DIV_STAT_CHANGING) | \ + DIV_CORE2(DIV_STAT_CHANGING)) + +/* CLK_DIV_CPU1 */ +#define COPY_RATIO (x) (x & 0x7) +#define HPM_RATIO (x) ((x & 0x7) << 4) +#define CORES_RATIO (x) ((x & 0x7) << 8) + +/* CLK_DIV_STAT_CPU1 */ +#define DIV_COPY (x) (x & 0x7) +#define DIV_HPM (x) ((x & 0x1) << 4) +#define DIV_CORES (x) ((x & 0x1) << 8) + +#define DIV_STAT_CPU1_CHANGING (DIV_COPY(DIV_STAT_CHANGING) | \ + DIV_HPM(DIV_STAT_CHANGING) | \ + DIV_CORES(DIV_STAT_CHANGING)) + +/* CLK_SRC_DMC */ +#define MUX_C2C_SEL (x) (x & 0x1) +#define MUX_DMC_BUS_SEL (x) ((x & 0x1) << 4) +#define MUX_DPHY_SEL (x) ((x & 0x1) << 8) +#define MUX_MPLL_SEL (x) ((x & 0x1) << 12) +#define MUX_PWI_SEL (x) ((x & 0xf) << 16) +#define MUX_G2D_ACP0_SEL (x) ((x & 0x1) << 20) +#define MUX_G2D_ACP1_SEL (x) ((x & 0x1) << 24) +#define MUX_G2D_ACP_SEL (x) ((x & 0x1) << 28) + +/* CLK_MUX_STAT_DMC */ +#define C2C_SEL (x) ((x) & 0x7) +#define DMC_BUS_SEL (x) ((x & 0x7) << 4) +#define DPHY_SEL (x) ((x & 0x7) << 8) +#define MPLL_SEL (x) ((x & 0x7) << 12) +/* #define PWI_SEL(x) ((x & 0xf) << 16) - Reserved */ +#define G2D_ACP0_SEL (x) ((x & 0x7) << 20) +#define G2D_ACP1_SEL (x) ((x & 0x7) << 24) +#define G2D_ACP_SEL (x) ((x & 0x7) << 28) + +#define MUX_STAT_DMC_CHANGING (C2C_SEL(MUX_STAT_CHANGING) | \ + DMC_BUS_SEL(MUX_STAT_CHANGING) | \ + DPHY_SEL(MUX_STAT_CHANGING) | \ + MPLL_SEL(MUX_STAT_CHANGING) |\ + G2D_ACP0_SEL(MUX_STAT_CHANGING) | \ + G2D_ACP1_SEL(MUX_STAT_CHANGING) | \ + G2D_ACP_SEL(MUX_STAT_CHANGING)) + +/* CLK_DIV_DMC0 */ +#define ACP_RATIO (x) (x & 0x7) +#define ACP_PCLK_RATIO (x) ((x & 0x7) << 4) +#define DPHY_RATIO (x) ((x & 0x7) << 8) +#define DMC_RATIO (x) ((x & 0x7) << 12) +#define DMCD_RATIO (x) ((x & 0x7) << 16) +#define DMCP_RATIO (x) ((x & 0x7) << 20) + +/* CLK_DIV_STAT_DMC0 */ +#define DIV_ACP (x) (x & 0x1) +#define DIV_ACP_PCLK (x) ((x & 0x1) << 4) +#define DIV_DPHY (x) ((x & 0x1) << 8) +#define DIV_DMC (x) ((x & 0x1) << 12) +#define DIV_DMCD (x) ((x & 0x1) << 16) +#define DIV_DMCP (x) ((x & 0x1) << 20) + +#define DIV_STAT_DMC0_CHANGING (DIV_ACP(DIV_STAT_CHANGING) | \ + DIV_ACP_PCLK(DIV_STAT_CHANGING) | \ + DIV_DPHY(DIV_STAT_CHANGING) | \ + DIV_DMC(DIV_STAT_CHANGING) | \ + DIV_DMCD(DIV_STAT_CHANGING) | \ + DIV_DMCP(DIV_STAT_CHANGING)) + +/* CLK_DIV_DMC1 */ +#define G2D_ACP_RATIO (x) (x & 0xf) +#define C2C_RATIO (x) ((x & 0x7) << 4) +#define PWI_RATIO (x) ((x & 0xf) << 8) +#define C2C_ACLK_RATIO (x) ((x & 0x7) << 12) +#define DVSEM_RATIO (x) ((x & 0x7f) << 16) +#define DPM_RATIO (x) ((x & 0x7f) << 24) + +/* CLK_DIV_STAT_DMC1 */ +#define DIV_G2D_ACP (x) (x & 0x1) +#define DIV_C2C (x) ((x & 0x1) << 4) +#define DIV_PWI (x) ((x & 0x1) << 8) +#define DIV_C2C_ACLK (x) ((x & 0x1) << 12) +#define DIV_DVSEM (x) ((x & 0x1) << 16) +#define DIV_DPM (x) ((x & 0x1) << 24) + +#define DIV_STAT_DMC1_CHANGING (DIV_G2D_ACP(DIV_STAT_CHANGING) | \ + DIV_C2C(DIV_STAT_CHANGING) | \ + DIV_PWI(DIV_STAT_CHANGING) | \ + DIV_C2C_ACLK(DIV_STAT_CHANGING) | \ + DIV_DVSEM(DIV_STAT_CHANGING) | \ + DIV_DPM(DIV_STAT_CHANGING)) + +/* Set CLK_SRC_PERIL0 */ +#define UART4_SEL (x) ((x & 0xf) << 16) +#define UART3_SEL (x) ((x & 0xf) << 12) +#define UART2_SEL (x) ((x & 0xf) << 8) +#define UART1_SEL (x) ((x & 0xf) << 4) +#define UART0_SEL (x) ((x) & 0xf) + +/* Set CLK_DIV_PERIL0 */ +#define UART4_RATIO (x) ((x & 0xf) << 16) +#define UART3_RATIO (x) ((x & 0xf) << 12) +#define UART2_RATIO (x) ((x & 0xf) << 8) +#define UART1_RATIO (x) ((x & 0xf) << 4) +#define UART0_RATIO (x) ((x) & 0xf) + +/* Set CLK_DIV_STAT_PERIL0 */ +#define DIV_UART4 (x) ((x & 0x1) << 16) +#define DIV_UART3 (x) ((x & 0x1) << 12) +#define DIV_UART2 (x) ((x & 0x1) << 8) +#define DIV_UART1 (x) ((x & 0x1) << 4) +#define DIV_UART0 (x) ((x) & 0x1) + +#define DIV_STAT_PERIL0_CHANGING (DIV_UART4(DIV_STAT_CHANGING) | \ + DIV_UART3(DIV_STAT_CHANGING) | \ + DIV_UART2(DIV_STAT_CHANGING) | \ + DIV_UART1(DIV_STAT_CHANGING) | \ + DIV_UART0(DIV_STAT_CHANGING)) + +/* CLK_DIV_FSYS1 */ +#define MMC0_RATIO (x) ((x) & 0xf) +#define MMC0_PRE_RATIO (x) ((x & 0xff) << 8) +#define MMC1_RATIO (x) ((x & 0xf) << 16) +#define MMC1_PRE_RATIO (x) ((x & 0xff) << 24) + +/* CLK_DIV_STAT_FSYS1 */ +#define DIV_MMC0 (x) ((x) & 1) +#define DIV_MMC0_PRE (x) ((x & 1) << 8) +#define DIV_MMC1 (x) ((x & 1) << 16) +#define DIV_MMC1_PRE (x) ((x & 1) << 24) + +#define DIV_STAT_FSYS1_CHANGING (DIV_MMC0(DIV_STAT_CHANGING) | \ + DIV_MMC0_PRE(DIV_STAT_CHANGING) | \ + DIV_MMC1(DIV_STAT_CHANGING) | \ + DIV_MMC1_PRE(DIV_STAT_CHANGING)) + +/* CLK_DIV_FSYS2 */ +#define MMC2_RATIO (x) (x & 0xf) +#define MMC2_PRE_RATIO (x) ((x & 0xff) << 8) +#define MMC3_RATIO (x) ((x & 0xf) << 16) +#define MMC3_PRE_RATIO (x) ((x & 0xff) << 24) + +/* CLK_DIV_STAT_FSYS2 */ +#define DIV_MMC2 (x) (x & 0x1) +#define DIV_MMC2_PRE (x) ((x & 0x1) << 8) +#define DIV_MMC3 (x) ((x & 0x1) << 16) +#define DIV_MMC3_PRE (x) ((x & 0x1) << 24) + +#define DIV_STAT_FSYS2_CHANGING (DIV_MMC2(DIV_STAT_CHANGING) | \ + DIV_MMC2_PRE(DIV_STAT_CHANGING) | \ + DIV_MMC3(DIV_STAT_CHANGING) | \ + DIV_MMC3_PRE(DIV_STAT_CHANGING)) + +/* CLK_DIV_FSYS3 */ +#define MMC4_RATIO (x) (x & 0x7) +#define MMC4_PRE_RATIO (x) ((x & 0xff) << 8) + +/* CLK_DIV_STAT_FSYS3 */ +#define DIV_MMC4 (x) (x & 0x1) +#define DIV_MMC4_PRE (x) ((x & 0x1) << 8) + +#define DIV_STAT_FSYS3_CHANGING (DIV_MMC4(DIV_STAT_CHANGING) | \ + DIV_MMC4_PRE(DIV_STAT_CHANGING)) + +#endif /*__ODROIDU3_SETUP__ */ Signature · 1 line
1.9.1
PATCH 8/10 odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
Hello Inha,
Quoted 8 lines · Inha Song
Hi Przemyslaw,
In U3 board, cooling pan is not work.
I think, cooling pan setting is need inboard_gpio_init(). (X2 board use cooling pan pwr form USB port)best regards,
Inha Song.
Thank you for testing. I have a board without the cooling fan, but this is a right notice - this feature should be included for this board - and come with next patch set.
regards,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH 9/10 odroid: add odroid U3/X2 device tree description
In reply to Przemyslaw MarczakThis is a standard description for Odroid boards.
--- arch/arm/dts/Makefile | 3 +- arch/arm/dts/exynos4412-odroid.dts | 70 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 arch/arm/dts/exynos4412-odroid.dts
arch/arm/dts/Makefile +2 -1
@@ -1,7 +1,8 @@ dtb-$(CONFIG_EXYNOS4) += exynos4210-origen.dtb \ exynos4210-universal_c210.dtb \ exynos4210-trats.dtb \ - exynos4412-trats2.dtb + exynos4412-trats2.dtb \ + exynos4412-odroid.dtb dtb-$(CONFIG_EXYNOS5) += exynos5250-arndale.dtb \ exynos5250-snow.dtb \
arch/arm/dts/exynos4412-odroid.dts new file +70 -0
70 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH 10/10 odroid: add odroid_config
In reply to Przemyslaw MarczakThis config is valid for two devices:
- Odroid X2,
- Odroid U3.
--- boards.cfg | 1 + doc/README.odroid | 122 +++++++++++++++++++++++++++ include/configs/odroid.h | 208 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 331 insertions(+) create mode 100644 doc/README.odroid create mode 100644 include/configs/odroid.h
boards.cfg +1 -0
@@ -296,6 +296,7 @@ Active arm armv7 exynos samsung smdk5420 Active arm armv7 exynos samsung smdkv310 smdkv310 - Chander Kashyap <[email protected]> Active arm armv7 exynos samsung trats trats - Lukasz Majewski <[email protected]> Active arm armv7 exynos samsung trats2 trats2 - Piotr Wilczek <[email protected]> +Active arm armv7 exynos samsung odroid odroid - Przemyslaw Marczak <[email protected]> Active arm armv7 exynos samsung universal_c210 s5pc210_universal - Przemyslaw Marczak <[email protected]> Active arm armv7 highbank - highbank highbank - Rob Herring <[email protected]> Active arm armv7 keystone ti k2hk_evm k2hk_evm - Vitaly Andrianov <[email protected]>
doc/README.odroid new file +122 -0
122 lines not on this page · raw message
include/configs/odroid.h new file +208 -0
208 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v2 1/11 samsung: misc: fix soc revision setting in the set_board_info()
In reply to Przemyslaw MarczakThe byte order of soc revision was inverted, now it is fixed.
--- board/samsung/common/misc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
board/samsung/common/misc.c +2 -2
@@ -26,8 +26,8 @@ void set_board_info(void) {char info[64 ]; -snprintf (info,ARRAY_SIZE (info),"%d.%d" , s5p_cpu_rev &0x0f , - (s5p_cpu_rev &0xf0 ) >>0x04 ); +snprintf (info,ARRAY_SIZE (info),"%u.%u" , (s5p_cpu_rev &0xf0 ) >>4 , + s5p_cpu_rev &0xf );setenv ("soc_rev" , info);snprintf (info,ARRAY_SIZE (info),"%x" , s5p_cpu_id);
Signature · 1 line
1.9.1
PATCH v2 2/11 exynos: pinmux: fix the gpio names for exynos4x12 mmc
This change fixes the bad gpio configuration for the exynos dwmmc.
--- arch/arm/cpu/armv7/exynos/pinmux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/cpu/armv7/exynos/pinmux.c +2 -2
@@ -704,8 +704,8 @@ static int exynos4x12_mmc_config(int peripheral, int flags) ext_func =S5P_GPIO_FUNC (0x3 );break ;case PERIPH_ID_SDMMC4 : - start =EXYNOS4_GPIO_K00 ; - start_ext =EXYNOS4_GPIO_K13 ; + start =EXYNOS4X12_GPIO_K00 ; + start_ext =EXYNOS4X12_GPIO_K13 ; func =S5P_GPIO_FUNC (0x3 ); ext_func =S5P_GPIO_FUNC (0x4 );break ;
Signature · 1 line
1.9.1
PATCH v2 3/11 board:samsung: check the mmc boot device and init the right mmc driver.
In reply to Przemyslaw MarczakIt is possible to boot from a few media devices, especially using a micro SD or eMMC slots. In this situation, boot device should be registered as block device 0 in the MMC framework, because CONFIG_SYS_MMC_ENV_DEV is usually set to "0" in the most config cases.
--- board/samsung/common/board.c | 32 ++++++++++++++++++++++++-------- include/samsung/misc.h | 5 +++++ 2 files changed, 29 insertions(+), 8 deletions(-)
board/samsung/common/board.c +24 -8
@@ -25,6 +25,8 @@#include <lcd.h> #include <samsung/misc.h> +static int bootmode; +DECLARE_GLOBAL_DATA_PTR ;int __exynos_early_init_f (void )
@@ -243,19 +245,33 @@ int board_eth_init(bd_t *bis)int board_mmc_init (bd_t *bis) {int ret; +struct exynos4_power *pwr = (struct exynos4_power *) +samsung_get_base_power (); + + bootmode =BOOT_MODE (readl (&pwr->om_stat)); +if (bootmode ==BOOT_SDMMC ) { +#ifdef CONFIG_SDHCI +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif #ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob); +#endif + }else { +#ifdef CONFIG_DWMMC +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob);#endif -#ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob); +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif + } +if (ret)debug ("mmc init failed\n" ); -#endif +return ret; }#endif
include/samsung/misc.h +5 -0
@@ -28,4 +28,9 @@ void check_boot_mode(void);void draw_logo (void );#endif +#define BOOT_SDMMC 0x2 +#define BOOT_MODE_MASK (0x1f) +#define BOOT_MODE_SHIFT (0x1) +#define BOOT_MODE (x) ((x >> BOOT_MODE_SHIFT) & BOOT_MODE_MASK) +#endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH v2 3/11 board:samsung: check the mmc boot device and init the right mmc driver.
Dear Przemyslaw Marczak,
Quoted 27 lines · Przemyslaw Marczak
It is possible to boot from a few media devices, especially using a micro SD or eMMC slots. In this situation, boot device should be registered as block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Piotr Wilczek <[email protected]>Cc Minkyu Kang <[email protected]>--- board/samsung/common/board.c | 32 ++++++++++++++++++++++++-------- include/samsung/misc.h | 5 +++++ 2 files changed, 29 insertions(+), 8 deletions(-)board/samsung/common/board.c +2
-0@@ -25,6 +25,8 @@#include <lcd.h> #include <samsung/misc.h> +static int bootmode; +DECLARE_GLOBAL_DATA_PTR ;int __exynos_early_init_f (void )
board/samsung/common/board.c int board_eth_init(bd_t *bis) · line 249
Quoted 5 lines
board/samsung/common/board.c +2
-0@@ -243,19 +245,33 @@ int board_eth_init(bd_t *bis)int board_mmc_init (bd_t *bis) {int ret; +struct exynos4_power *pwr = (struct exynos4_power *) +samsung_get_base_power ();
Hm, no. This file is samsung common not only for exynos4.
Although this code will not be made any problems for other SoCs (because om_stat is always first item of power), it looks weird. I think you can make new function for getting boot mode.
Quoted 41 lines
board/samsung/common/board.c +20
-8+ + bootmode =BOOT_MODE (readl (&pwr->om_stat)); +if (bootmode ==BOOT_SDMMC ) { +#ifdef CONFIG_SDHCI +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif #ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob); +#endif + }else { +#ifdef CONFIG_DWMMC +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob);#endif -#ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob); +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif + } +if (ret)debug ("mmc init failed\n" ); -#endif + return ret; }#endif include/samsung/misc.h +0
-0
include/samsung/misc.h void check_boot_mode(void); · line 34
Quoted 7 lines
include/samsung/misc.h +4
-0@@ -28,4 +28,9 @@ void check_boot_mode(void);void draw_logo (void );#endif +#define BOOT_SDMMC 0x2 +#define BOOT_MODE_MASK (0x1f) +#define BOOT_MODE_SHIFT (0x1) +#define BOOT_MODE (x) ((x >> BOOT_MODE_SHIFT) & BOOT_MODE_MASK)
((x) >> BOOT_MODE_SHIFT)
include/samsung/misc.h void check_boot_mode(void); · line 36
Quoted 3 lines
include/samsung/misc.h +1
-0+#endif /* __SAMSUNG_MISC_COMMON_H__ */
Thanks,
Minkyu Kang.
PATCH v2 3/11 board:samsung: check the mmc boot device and init the right mmc driver.
Hello Minkyu,
Quoted 28 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 25 lines · Przemyslaw Marczak
It is possible to boot from a few media devices, especially using a micro SD or eMMC slots. In this situation, boot device should be registered as block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Piotr Wilczek <[email protected]>Cc Minkyu Kang <[email protected]>--- board/samsung/common/board.c | 32 ++++++++++++++++++++++++-------- include/samsung/misc.h | 5 +++++ 2 files changed, 29 insertions(+), 8 deletions(-)board/samsung/common/board.c +2
-0@@ -25,6 +25,8 @@#include <lcd.h> #include <samsung/misc.h> +static int bootmode; +DECLARE_GLOBAL_DATA_PTR ;
Quoted 12 lines
board/samsung/common/board.c int board_eth_init(bd_t *bis) · line 249
Quoted 7 lines
board/samsung/common/board.c +2
-0int __exynos_early_init_f (void )@@ -243,19 +245,33 @@ int board_eth_init(bd_t *bis)int board_mmc_init (bd_t *bis) {int ret; +struct exynos4_power *pwr = (struct exynos4_power *) +samsung_get_base_power ();Hm, no. This file is samsung common not only for exynos4.
Although this code will not be made any problems for other SoCs (becauseom_statis always first item of power), it looks weird. I think you can make new function for getting boot mode.
Yes, this was bad. What about that:
# unsigned int om_stat = samsung_get_base_power(); # # bootmode = BOOT_MODE(readl(om_stat));
or maybe just
# bootmode = BOOT_MODE(readl(samsung_get_base_power()));
like in the Exynos spl code.
Simply and proper for every SOC.
And a function for this code will be added.
Quoted 44 lines
Quoted 44 lines
board/samsung/common/board.c +20
-8+ + bootmode =BOOT_MODE (readl (&pwr->om_stat)); +if (bootmode ==BOOT_SDMMC ) { +#ifdef CONFIG_SDHCI +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif #ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob); +#endif + }else { +#ifdef CONFIG_DWMMC +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob);#endif -#ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob); +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif + } +if (ret)debug ("mmc init failed\n" ); -#endif + return ret; }#endif include/samsung/misc.h +0
-0@@ -28,4 +28,9 @@ void check_boot_mode(void);void draw_logo (void );#endif
Quoted 7 lines
include/samsung/misc.h void check_boot_mode(void); · line 34
Quoted 4 lines
include/samsung/misc.h +4
-0+#define BOOT_SDMMC 0x2 +#define BOOT_MODE_MASK (0x1f) +#define BOOT_MODE_SHIFT (0x1) +#define BOOT_MODE (x) ((x >> BOOT_MODE_SHIFT) & BOOT_MODE_MASK)((x) >>
BOOT_MODE_SHIFT)
Ok, will fix this.
Quoted 7 lines
include/samsung/misc.h void check_boot_mode(void); · line 36
Quoted 3 lines
include/samsung/misc.h +1
-0+#endif /* __SAMSUNG_MISC_COMMON_H__ */ Thanks,
Minkyu Kang.
Thank you,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v2 3/11 board:samsung: check the mmc boot device and init the right mmc driver.
Quoted 42 lines · Przemyslaw Marczak
Hello Minkyu,
Quoted 28 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 25 lines · Przemyslaw Marczak
It is possible to boot from a few media devices, especially using a micro SD or eMMC slots. In this situation, boot device should be registered as block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Piotr Wilczek <[email protected]>Cc Minkyu Kang <[email protected]>--- board/samsung/common/board.c | 32 ++++++++++++++++++++++++-------- include/samsung/misc.h | 5 +++++ 2 files changed, 29 insertions(+), 8 deletions(-)board/samsung/common/board.c +2
-0@@ -25,6 +25,8 @@#include <lcd.h> #include <samsung/misc.h> +static int bootmode; +DECLARE_GLOBAL_DATA_PTR ;Quoted 12 lines
board/samsung/common/board.c int board_eth_init(bd_t *bis) · line 249
Quoted 7 lines
board/samsung/common/board.c +2
-0int __exynos_early_init_f (void )@@ -243,19 +245,33 @@ int board_eth_init(bd_t *bis)int board_mmc_init (bd_t *bis) {int ret; +struct exynos4_power *pwr = (struct exynos4_power *) +samsung_get_base_power ();Hm, no. This file is samsung common not only for exynos4.
Although this code will not be made any problems for other SoCs (becauseom_statis always first item of power), it looks weird. I think you can make new function for getting boot mode.
Quoted 8 lines
Yes, this was bad. What about that:
# unsigned int om_stat = samsung_get_base_power(); # # bootmode = BOOT_MODE(readl(om_stat));or maybe just
# bootmode = BOOT_MODE(readl(samsung_get_base_power()));
looks good to me. both of them.
Thanks,
Minkyu Kang.
PATCH v2 4/11 drivers:dfu: new feature: separated bootloader alt setting
In reply to Przemyslaw MarczakThis patch introduces new feature: initialization of the dfu bootloader entity from a separate environmental variable which can be set on a boot time.
By default, DFU always check environmental variable: $dfu_alt_info.
Changes:
- DFU will also look for environmental variable: $dfu_alt_bootloader
- if any of dfu_alt_* variable is properly defined, then function dfu_init_env_entities() will return success.
Use case:
Some devices can boot from various media type (SD, eMMC, NAND, etc.) or some board configs are common for more than one board type. In a such case, bootloader is probably placed on a different devices or even offsets. So such DFU feature is welcome.
---
Changes v2:
- new commit
--- drivers/dfu/dfu.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
drivers/dfu/dfu.c +18 -10
@@ -44,24 +44,32 @@ static int dfu_find_alt_num(const char *s)int dfu_init_env_entities (char *interface,int dev) { +const char *alt_info[] = {"dfu_alt_info" ,"dfu_alt_bootloader" };const char *str_env;char *env_bkp; -int ret; +int ret, i; +int alt_init_cnt =0 ; + +for (i =0 ; i <ARRAY_SIZE (alt_info); i++) { + str_env =getenv (alt_info[i]); +if (!str_env) +continue ; - str_env =getenv ("dfu_alt_info" ); -if (!str_env) { -error ("\"dfu_alt_info\" env variable not defined!\n" ); -return -EINVAL ; + env_bkp =strdup (str_env); + ret =dfu_config_entities (env_bkp, interface, dev); +free (env_bkp); + +if (ret) +continue ; + + alt_init_cnt++; } - env_bkp =strdup (str_env); - ret =dfu_config_entities (env_bkp, interface, dev); -if (ret) { +if (!alt_init_cnt) {error ("DFU entities configuration failed!\n" ); -return ret; +return -1 ; } -free (env_bkp);return 0 ; }
Signature · 1 line
1.9.1
PATCH v2 4/11 drivers:dfu: new feature: separated bootloader alt setting
Quoted 11 lines · Przemyslaw Marczak
This patch introduces new feature: initialization of the dfu bootloader entity from a separate environmental variable which can be set on a boot time.
By default, DFU always check environmental variable: $dfu_alt_info.
Changes:
- DFU will also look for environmental variable: $dfu_alt_bootloader
- if any of dfu_alt_* variable is properly defined, then functiondfu_init_env_entities()will return success.
Quoted 5 lines
Use case:
Some devices can boot from various media type (SD, eMMC, NAND, etc.) or some board configs are common for more than one board type. In a such case, bootloader is probably placed on a different devices or even offsets. So such DFU feature is welcome.
Why should the "dfu" command look at different environment variables? Whatever code dynamically sets the value of $dfu_alt_bootloader should simply set $dfu_alt_info instead.
PATCH v2 4/11 drivers:dfu: new feature: separated bootloader alt setting
Hello Stephen,
Quoted 18 lines · Stephen Warren
Quoted 11 lines · Przemyslaw Marczak
This patch introduces new feature: initialization of the dfu bootloader entity from a separate environmental variable which can be set on a boot time.
By default, DFU always check environmental variable: $dfu_alt_info.
Changes:
- DFU will also look for environmental variable: $dfu_alt_bootloader
- if any of dfu_alt_* variable is properly defined, then functiondfu_init_env_entities()will return success.Quoted 5 lines
Use case:
Some devices can boot from various media type (SD, eMMC, NAND, etc.) or some board configs are common for more than one board type. In a such case, bootloader is probably placed on a different devices or even offsets. So such DFU feature is welcome.
Quoted 4 lines
Why should the "dfu" command look at different environment variables? Whatever code dynamically sets the value of $dfu_alt_bootloader should simply set $dfu_alt_info instead.
Dynamically setting of any entity cold be done at boot time, like this:
# int buf_len = strlen(alt_bootloader) + strlen(CONFIG_DFU_ALT) + 4;
# char *buf = memalign(1, buf_len);
#
# sprintf(buf, "%s; %s", alt_bootloader, CONFIG_DFU_ALT);
# setenv("dfu_alt_info", buf);But overwriting the $dfu_alt_info on each boot is not a good idea. If user modify the dfu entities - then it will be overwritten at next boot.
In the other side I can store entities as $dfu_alt_default and change the above code to:
# char *alt_default = getenv("dfu_alt_default");
# if (!alt_default)
# alt_default = "";
#
# int buf_len = strlen(alt_bootloader) + strlen(alt_default) + 4;
# char *buf = memalign(1, buf_len);
#
# sprintf(buf, "%s; %s", alt_bootloader, alt_default);
# setenv("dfu_alt_info", buf);But then, there is some mess in the environment because of duplicated default alt_info.
Those both, above solutions takes more time than just one simple line:
# setenv("dfu_alt_bootlaoder", CONFIG_SOME_ALT_INFO);
like in this patch set.
Maybe better could be modification of the function dfu_init_env_entities() to support parsing variables in the $dfu_alt_info instead of hard coded env variables names, e.g:
dfu_alt_info="${alt_info_boot}, ${alt_info_system},..."
dfu_alt_info could be set with default variables names in each board config file in the CONFIG_EXTRA_ENV_SETTINGS and then just one proper variable could be set at boot, and others from env - simple and fast.
And then in the dfu init code - entities are initialized from env variables - if they exists, like in the loop code from this patch.
I need some solution to automatically set proper bootloader entities, since one binary can be stored on SD and eMMC cards.
Thank you,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v2 4/11 drivers:dfu: new feature: separated bootloader alt setting
Quoted 25 lines · Przemyslaw Marczak
Hello Stephen,
Quoted 18 lines · Stephen Warren
Quoted 11 lines · Przemyslaw Marczak
This patch introduces new feature: initialization of the dfu bootloader entity from a separate environmental variable which can be set on a boot time.
By default, DFU always check environmental variable: $dfu_alt_info.
Changes:
- DFU will also look for environmental variable: $dfu_alt_bootloader
- if any of dfu_alt_* variable is properly defined, then functiondfu_init_env_entities()will return success.Quoted 5 lines
Use case:
Some devices can boot from various media type (SD, eMMC, NAND, etc.) or some board configs are common for more than one board type. In a such case, bootloader is probably placed on a different devices or even offsets. So such DFU feature is welcome.Quoted 3 lines
Why should the "dfu" command look at different environment variables? Whatever code dynamically sets the value of $dfu_alt_bootloader should simply set $dfu_alt_info instead.
Quoted 6 lines
Dynamically setting of any entity cold be done at boot time, like this:
# int buf_len = strlen(alt_bootloader) + strlen(CONFIG_DFU_ALT) + 4; # char *buf = memalign(1, buf_len); # # sprintf(buf, "%s; %s", alt_bootloader, CONFIG_DFU_ALT);
Note that you can't have a space after the ; due to the use of strsep(). Switching to strtok() might solve that.
Quoted 4 lines
#
setenv("dfu_alt_info", buf);But overwriting the $dfu_alt_info on each boot is not a good idea. If user modify the dfu entities - then it will be overwritten at next boot.
What if the user sees that $dfu_alt_bootloader is set, and modifies that without realizing that it's an auto-generated variable? The same thing then applies.
Perhaps we need a standard where system-/automatically-set variables are named with a auto_ prefix or _auto suffix or something, to make this clear?
I'd prefer that the dfu command didn't use any environment variables, but rather required the user to always pass the list on the command-line. Then, the user could invoke either:
dfu "foo mmc x..." # Manually specified
dfu $dfu_alt_info # Use 'user-defined' variable dfu $dfu_alt_bootloaer # Use 'system-defined' variable
That way, the code doesn't have to loop over a bunch of variables and get more complex. Implicitly depending on environment variables make it hard to tell what a sequence of commands will do.
...
Quoted 6 lines
Maybe better could be modification of the function
dfu_init_env_entities()to support parsing variables in the $dfu_alt_info instead of hard coded env variables names, e.g:dfu_alt_info="${alt_info_boot}, ${alt_info_system},..."
I feel like the shell already has the capability to interpolate variable values into strings, so this would be quite easy to do in the shell rather than duplicating that code inside the dfu command.
PATCH v2 4/11 drivers:dfu: new feature: separated bootloader alt setting
Hello,
Quoted 28 lines · Stephen Warren
Quoted 27 lines · Przemyslaw Marczak
Hello Stephen,
Quoted 18 lines · Stephen Warren
Quoted 11 lines · Przemyslaw Marczak
This patch introduces new feature: initialization of the dfu bootloader entity from a separate environmental variable which can be set on a boot time.
By default, DFU always check environmental variable: $dfu_alt_info.
Changes:
- DFU will also look for environmental variable: $dfu_alt_bootloader
- if any of dfu_alt_* variable is properly defined, then functiondfu_init_env_entities()will return success.Quoted 5 lines
Use case:
Some devices can boot from various media type (SD, eMMC, NAND, etc.) or some board configs are common for more than one board type. In a such case, bootloader is probably placed on a different devices or even offsets. So such DFU feature is welcome.Quoted 3 lines
Why should the "dfu" command look at different environment variables? Whatever code dynamically sets the value of $dfu_alt_bootloader should simply set $dfu_alt_info instead.
Dynamically setting of any entity cold be done at boot time, like this:
Quoted 8 lines
Quoted 4 lines
# int buf_len = strlen(alt_bootloader) + strlen(CONFIG_DFU_ALT) + 4; # char *buf = memalign(1, buf_len); # # sprintf(buf, "%s; %s", alt_bootloader, CONFIG_DFU_ALT);Note that you can't have a space after the ; due to the use of
strsep(). Switching tostrtok()might solve that.
Yes - this wasn't tested - just some pseudo code.
Quoted 11 lines
Quoted 4 lines
#
setenv("dfu_alt_info", buf);But overwriting the $dfu_alt_info on each boot is not a good idea. If user modify the dfu entities - then it will be overwritten at next boot.
What if the user sees that $dfu_alt_bootloader is set, and modifies that without realizing that it's an auto-generated variable? The same thing then applies.
Perhaps we need a standard where system-/automatically-set variables are named with a
auto_prefix or_autosuffix or something, to make this clear?
Yes, right note.
Quoted 8 lines
I'd prefer that the dfu command didn't use any environment variables, but rather required the user to always pass the list on the command-line. Then, the user could invoke either:
dfu "foo mmc x..." # Manually specified
dfu $dfu_alt_info # Use 'user-defined' variable dfu $dfu_alt_bootloaer # Use 'system-defined' variable
Yes, definitely such feature was missing there.
Quoted 11 lines
That way, the code doesn't have to loop over a bunch of variables and get more complex. Implicitly depending on environment variables make it hard to tell what a sequence of commands will do.
...
Quoted 5 lines
Maybe better could be modification of the function
dfu_init_env_entities()to support parsing variables in the $dfu_alt_info instead of hard coded env variables names, e.g:
Quoted 6 lines
Quoted 1 line
dfu_alt_info="${alt_info_boot}, ${alt_info_system},..."
I feel like the shell already has the capability to interpolate variable values into strings, so this would be quite easy to do in the shell rather than duplicating that code inside the dfu command.
Every env macro passed with cmdline will be expanded. And then, we can use such style like this:
# setenv alt_kernel "uImage ext4 0 2;zImage ext4 0 2"
# setenv alt_system "boot part 0 2;root part 0 3"
# setenv auto_alt_bootloader "u-boot raw 0x0 0x800"
# setenv alt_info "${alt_kernel};${alt_system};${auto_alt_bootloader}"
(this will expand when passing to "setenv")or just put this in env default config:
"alt_info=${alt_kernel};${alt_system};${auto_alt_bootloader}\0" ...
So summarizing, I don't want to break your DFU rework, I want just to add the Odroid U3 support, so in the next patch set I will use the $dfu_alt_info, instead of combining with a short time solution.
And after your work will be done, then I will update Odroid code.
Best regards,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v2 4/11 drivers:dfu: new feature: separated bootloader alt setting
Quoted 1 line · Przemyslaw Marczak
On 06/17/2014 06:36 PM, Stephen Warren wrote:
...
Quoted 9 lines
Quoted 7 lines
I'd prefer that the dfu command didn't use any environment variables, but rather required the user to always pass the list on the command-line. Then, the user could invoke either:
dfu "foo mmc x..." # Manually specified
dfu $dfu_alt_info # Use 'user-defined' variable dfu $dfu_alt_bootloaer # Use 'system-defined' variableYes, definitely such feature was missing there.
...
Quoted 3 lines
So summarizing, I don't want to break your DFU rework, I want just to add the Odroid U3 support, so in the next patch set I will use the $dfu_alt_info, instead of combining with a short time solution.
Which rework are you referring to? I'm not actively working on changing the command-line parameters to the dfu command in any way. I've certainly discussed how I'd prefer the dfu command to work, but I don't have time to actually implement that. So, the existing command-line format is likely to stay as it is for now.
PATCH v2 4/11 drivers:dfu: new feature: separated bootloader alt setting
Quoted 17 lines · Stephen Warren
Quoted 1 line · Przemyslaw Marczak
On 06/17/2014 06:36 PM, Stephen Warren wrote:
...
Quoted 9 lines
Quoted 7 lines
I'd prefer that the dfu command didn't use any environment variables, but rather required the user to always pass the list on the command-line. Then, the user could invoke either:
dfu "foo mmc x..." # Manually specified
dfu $dfu_alt_info # Use 'user-defined' variable dfu $dfu_alt_bootloaer # Use 'system-defined' variableYes, definitely such feature was missing there.
...
Quoted 3 lines
So summarizing, I don't want to break your DFU rework, I want just to add the Odroid U3 support, so in the next patch set I will use the $dfu_alt_info, instead of combining with a short time solution.
Quoted 6 lines
Which rework are you referring to? I'm not actively working on changing the command-line parameters to the dfu command in any way. I've certainly discussed how I'd prefer the dfu command to work, but I don't have time to actually implement that. So, the existing command-line format is likely to stay as it is for now.
Ah ok, my mistake. Anyway I will not touch this code at this time.
Regards,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v2 5/11 samsung: misc: set the dfu bootloader setting at boot time
In reply to Przemyslaw MarczakThis change adds new function:
- set_dfu_boot_alt(bootmode) - where bootmode is the value of Exynos ompin[5:1] with proper bitmask using BOOT_MODE(x) macro.
This change is useful for devices with more than one boot device, e.g. with a separated SD and eMMC slots. Different dfu entities are required for SD and eMMC cards. The board config should define:
- CONFIG_MISC_COMMON
- CONFIG_SET_DFU_BOOT_ALT
and at least one of below alt setting:
- CONFIG_DFU_BOOT_ALT_SD, e.g: "u-boot raw 1 2048"
- CONFIG_DFU_BOOT_ALT_eMMC, e.g: "u-boot raw 0 2048 mmcpart 1"
---
Changes v2:
- change config names:
CONFIG_SET_DFU_BOOT_ALT to CONFIG_DFU_ALT_BOOTLOADER and CONFIG_DFU_BOOT_ALT_* to CONFIG_DFU_ALT_BOOT_*
- change function name: set_dfu_boot_alt() to set_dfu_alt_boot()
- remove superfluous ifdefs
--- board/samsung/common/board.c | 3 +++ board/samsung/common/misc.c | 19 +++++++++++++++++++ include/samsung/misc.h | 4 ++++ 3 files changed, 26 insertions(+)
board/samsung/common/board.c +3 -0
@@ -323,6 +323,9 @@ int arch_early_init_r(void)#ifdef CONFIG_MISC_INIT_R int misc_init_r (void ) { +#ifdef CONFIG_DFU_ALT_BOOTLOADER +set_dfu_alt_boot (bootmode); +#endif #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG set_board_info ();#endif
board/samsung/common/misc.c +19 -0
@@ -21,6 +21,25 @@DECLARE_GLOBAL_DATA_PTR ; +#ifdef CONFIG_DFU_ALT_BOOTLOADER +void set_dfu_alt_boot (int bootmode) +{ +char *alt_bootloader =NULL ; + +switch (bootmode) { +case BOOT_SDMMC : + alt_bootloader =CONFIG_DFU_ALT_BOOT_SD ; +break ; +default : + alt_bootloader =CONFIG_DFU_ALT_BOOT_EMMC ; +break ; + } + +if (alt_bootloader) +setenv ("dfu_alt_bootloader" , alt_bootloader); +} +#endif +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG void set_board_info (void ) {
include/samsung/misc.h +4 -0
@@ -33,4 +33,8 @@ void draw_logo(void);#define BOOT_MODE_SHIFT (0x1)#define BOOT_MODE (x) ((x >> BOOT_MODE_SHIFT) & BOOT_MODE_MASK) +#ifdef CONFIG_DFU_ALT_BOOTLOADER +void set_dfu_alt_boot (int bootmode); +#endif +#endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH v2 6/11 arm:reset: call the reset_misc() before the cpu reset
In reply to Przemyslaw MarczakOn an Odroid U3 board, the SOC is unable to reset an eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function.
This is done by the reset_misc() function, which is called before reset_cpu(). The function reset_misc() is a weak function.
--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)
arch/arm/lib/reset.c +7 -0
@@ -23,6 +23,11 @@#include <common.h> +void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +int do_reset (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) {puts ("resetting ...\n" );
@@ -30,6 +35,8 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])udelay (50000 );/* wait 50 ms */ disable_interrupts (); + +reset_misc ();reset_cpu (0 );/*NOTREACHED*/
include/common.h +1 -0
@@ -629,6 +629,7 @@ int checkicache (void);int checkdcache (void );void upmconfig (unsigned int ,unsigned int *,unsigned int );ulong get_tbclk (void ); +void reset_misc (void );void reset_cpu (ulong addr);#if defined (CONFIG_OF_LIBFDT ) && defined (CONFIG_OF_BOARD_SETUP )void ft_cpu_setup (void *blob,bd_t *bd);
Signature · 1 line
1.9.1
PATCH v2 7/11 samsung: misc: set_board_info: check the board type to set fdt file name
In reply to Przemyslaw MarczakThis change adds a call to the get_board_type_fdt() function before setting the "fdtfile" environment variable.
For CONFIG_BOARD_TYPES below function is called:
- const char *get_board_type_fdt(void) - should return a pointer to the board type string.
This is useful in case of run many boards with just one config.
---
Changes v2:
- set_board_info: move the bdtype pointer to avoid unused pointer compilation warning
--- board/samsung/common/misc.c | 9 +++++++-- include/samsung/misc.h | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-)
board/samsung/common/misc.c +7 -2
@@ -57,8 +57,13 @@ void set_board_info(void)setenv ("board_rev" , info);#endif #ifdef CONFIG_OF_LIBFDT -snprintf (info,ARRAY_SIZE (info),"%s%x-%s.dtb" , -CONFIG_SYS_SOC , s5p_cpu_id,CONFIG_SYS_BOARD ); +const char *bdtype ="" ; + +#ifdef CONFIG_BOARD_TYPES + bdtype =get_board_type_fdt (); +#endif +snprintf (info,ARRAY_SIZE (info),"%s%x-%s%s.dtb" , +CONFIG_SYS_SOC , s5p_cpu_id,CONFIG_SYS_BOARD , bdtype);setenv ("fdtfile" , info);#endif }
include/samsung/misc.h +3 -0
@@ -36,5 +36,8 @@ void draw_logo(void);#ifdef CONFIG_DFU_ALT_BOOTLOADER void set_dfu_alt_boot (int bootmode);#endif +#ifdef CONFIG_BOARD_TYPES +const char *get_board_type_fdt (void ); +#endif #endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH v2 8/11 samsung: board: checkboard: call get_board_type() for CONFIG_BOARD_TYPES
In reply to Przemyslaw MarczakFor support of multiple board types in a one config - it is welcome to display the current board model. This is what get_board_type() should return.
--- board/samsung/common/board.c | 5 ++++- include/samsung/misc.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)
board/samsung/common/board.c +4 -1
@@ -283,7 +283,10 @@ int checkboard(void) board_name =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL );printf ("Board: %s\n" , board_name ? board_name :"unknown" ); - +#ifdef CONFIG_BOARD_TYPES +const char *board_type =get_board_type (); +printf ("Model: %s\n" , board_type ? board_type :"unknown" ); +#endif return 0; }#endif
include/samsung/misc.h +1 -0
@@ -37,6 +37,7 @@ void draw_logo(void);void set_dfu_alt_boot (int bootmode);#endif #ifdef CONFIG_BOARD_TYPES +const char *get_board_type (void );const char *get_board_type_fdt (void );#endif
Signature · 1 line
1.9.1
PATCH v2 9/11 odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
In reply to Przemyslaw MarczakThis board file supports standard features of Odroid X2 and U3 boards:
- Exynos4412 core clock set to 1000MHz and MPLL peripherial clock set to 800MHz,
- MAX77686 power regulator,
- USB PHY,
- enable XCL205 - power for board peripherials
- check board type: U3 or X2.
- enable Odroid U3 FAN cooler
---
Changes v2:
- enable fan on odroid U3
--- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 437 ++++++++++++++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 ++++++++++++++++++++++ 3 files changed, 672 insertions(+) create mode 100644 board/samsung/odroid/Makefile create mode 100644 board/samsung/odroid/odroid.c create mode 100644 board/samsung/odroid/setup.h
board/samsung/odroid/Makefile new file +8 -0
@@ -0,0 +1,8 @@ +# +# Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved. +# Przemyslaw Marczak <[email protected]> +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y := odroid.o
board/samsung/odroid/odroid.c new file +437 -0
437 lines not on this page · raw message
board/samsung/odroid/setup.h new file +227 -0
227 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v2 10/11 odroid: add odroid U3/X2 device tree description
In reply to Przemyslaw MarczakThis is a standard description for Odroid boards.
--- arch/arm/dts/Makefile | 3 +- arch/arm/dts/exynos4412-odroid.dts | 70 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 arch/arm/dts/exynos4412-odroid.dts
arch/arm/dts/Makefile +2 -1
@@ -1,7 +1,8 @@ dtb-$(CONFIG_EXYNOS4) += exynos4210-origen.dtb \ exynos4210-universal_c210.dtb \ exynos4210-trats.dtb \ - exynos4412-trats2.dtb + exynos4412-trats2.dtb \ + exynos4412-odroid.dtb dtb-$(CONFIG_EXYNOS5) += exynos5250-arndale.dtb \ exynos5250-snow.dtb \
arch/arm/dts/exynos4412-odroid.dts new file +70 -0
70 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v2 11/11 odroid: add odroid_config
In reply to Przemyslaw MarczakThis config is valid for two devices:
- Odroid X2,
- Odroid U3.
---
Changes v2:
- odroid config: add CONFIG_DFU_ALT_BOOTLOADER
- odroid config: change name of CONFIG_DFU_BOOT_ALT_* to CONFIG_DFU_ALT_BOOT_*
--- boards.cfg | 1 + doc/README.odroid | 122 +++++++++++++++++++++++++++ include/configs/odroid.h | 208 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 331 insertions(+) create mode 100644 doc/README.odroid create mode 100644 include/configs/odroid.h
boards.cfg +1 -0
@@ -296,6 +296,7 @@ Active arm armv7 exynos samsung smdk5420 Active arm armv7 exynos samsung smdkv310 smdkv310 - Chander Kashyap <[email protected]> Active arm armv7 exynos samsung trats trats - Lukasz Majewski <[email protected]> Active arm armv7 exynos samsung trats2 trats2 - Piotr Wilczek <[email protected]> +Active arm armv7 exynos samsung odroid odroid - Przemyslaw Marczak <[email protected]> Active arm armv7 exynos samsung universal_c210 s5pc210_universal - Przemyslaw Marczak <[email protected]> Active arm armv7 highbank - highbank highbank - Rob Herring <[email protected]> Active arm armv7 keystone ti k2hk_evm k2hk_evm - Vitaly Andrianov <[email protected]>
doc/README.odroid new file +122 -0
122 lines not on this page · raw message
include/configs/odroid.h new file +208 -0
208 lines not on this page · raw message
Signature · 1 line
1.9.1
v3 cover Add support to Odroid U3/X2
In reply to Przemyslaw MarczakThis patch set introduces:
- boot device check
- automatic init order of mmc proper driver
- automatic setting of dfu entities which depends on boot device
- pre reset function for board own implementation
- setting board info environment for multi board support
- Odroid U3/X2 support
Przemyslaw Marczak (11):
exynos: pinmux: fix the gpio names for exynos4x12 mmc board:samsung: add function boot_device() for checking boot medium board:samsung: check the boot device and init the right mmc driver.
samsung: misc: add function for setting $dfu_alt_info samsung:board: misc_init_r: call set_dfu_alt_info() arm:reset: call the reset_misc() before the cpu reset
samsung: board: enable support of multiple board types
samsung: misc: use board specific functions to set env board info
odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
odroid: add odroid U3/X2 device tree description
odroid: add odroid_config
arch/arm/cpu/armv7/exynos/pinmux.c | 4 +- arch/arm/dts/Makefile | 3 +- arch/arm/dts/exynos4412-odroid.dts | 70 ++++++ arch/arm/lib/reset.c | 7 + board/samsung/common/board.c | 44 +++- board/samsung/common/misc.c | 49 +++- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 466 +++++++++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 ++++++++++++++++++ boards.cfg | 1 + doc/README.odroid | 144 ++++++++++++ include/common.h | 1 + include/configs/odroid.h | 232 ++++++++++++++++++ include/samsung/misc.h | 18 ++ 14 files changed, 1261 insertions(+), 13 deletions(-) create mode 100644 arch/arm/dts/exynos4412-odroid.dts create mode 100644 board/samsung/odroid/Makefile create mode 100644 board/samsung/odroid/odroid.c create mode 100644 board/samsung/odroid/setup.h create mode 100644 doc/README.odroid create mode 100644 include/configs/odroid.h
Signature · 1 line
1.9.1
PATCH v3 1/11 exynos: pinmux: fix the gpio names for exynos4x12 mmc
This change fixes the bad gpio configuration for the exynos dwmmc.
--- arch/arm/cpu/armv7/exynos/pinmux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/cpu/armv7/exynos/pinmux.c +2 -2
@@ -704,8 +704,8 @@ static int exynos4x12_mmc_config(int peripheral, int flags) ext_func =S5P_GPIO_FUNC (0x3 );break ;case PERIPH_ID_SDMMC4 : - start =EXYNOS4_GPIO_K00 ; - start_ext =EXYNOS4_GPIO_K13 ; + start =EXYNOS4X12_GPIO_K00 ; + start_ext =EXYNOS4X12_GPIO_K13 ; func =S5P_GPIO_FUNC (0x3 ); ext_func =S5P_GPIO_FUNC (0x4 );break ;
Signature · 1 line
1.9.1
PATCH v3 2/11 board:samsung: add function boot_device() for checking boot medium
In reply to Przemyslaw MarczakIt is possible to boot from a few media devices, especially using a micro SD or eMMC slots. In this situation depends on a boot device - some setup can be changeg.
This change adds function:boot_device() - which returns an OM[1:5] bits value
This allows checking if boot device is SD(0x2).
---
Changes v3:
- new commit after separate one into two
--- board/samsung/common/board.c | 10 +++++++++- include/samsung/misc.h | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-)
board/samsung/common/board.c +9 -1
@@ -41,6 +41,13 @@ int __exynos_power_init(void)int exynos_power_init (void ) __attribute__((weak,alias ("__exynos_power_init" ))); +unsigned int boot_device (void ) +{ +unsigned int om_stat =samsung_get_base_power (); + +return BOOT_DEVICE (readl (om_stat)); +} +#if definedCONFIG_EXYNOS_TMU /* Boot Time Thermal Analysis for SoC temperature threshold breach */ static void boot_temp_check (void )
@@ -243,19 +250,20 @@ int board_eth_init(bd_t *bis)int board_mmc_init (bd_t *bis) {int ret; +#ifdef CONFIG_DWMMC /* dwmmc initializattion for available channels */ ret =exynos_dwmmc_init (gd->fdt_blob);if (ret)debug ("dwmmc init failed\n" );#endif -#ifdef CONFIG_SDHCI /* mmc initializattion for available channels */ ret =exynos_mmc_init (gd->fdt_blob);if (ret)debug ("mmc init failed\n" );#endif +return ret; }#endif
include/samsung/misc.h +7 -0
@@ -28,4 +28,11 @@ void check_boot_mode(void);void draw_logo (void );#endif +#define BOOT_DEVICE_SDMMC 0x2 +#define BOOT_DEVICE_MASK 0x1f +#define BOOT_DEVICE_SHIFT 0x1 +#define BOOT_DEVICE (x) (((x) >> BOOT_DEVICE_SHIFT) & BOOT_DEVICE_MASK) + +unsigned int boot_device (void ); +#endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH v3 2/11 board:samsung: add function boot_device() for checking boot medium
Dear Przemyslaw Marczak,
Quoted 64 lines · Przemyslaw Marczak
It is possible to boot from a few media devices, especially using a micro SD or eMMC slots. In this situation depends on a boot device - some setup can be changeg.
This change adds function:
boot_device()- which returns an OM[1:5] bits valueThis allows checking if boot device is SD(0x2).
Signed-off-by Przemyslaw Marczak <[email protected]>---
Changes v3:
- new commit after separate one into two--- board/samsung/common/board.c | 10 +++++++++- include/samsung/misc.h | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-)board/samsung/common/board.c +9
-1@@ -41,6 +41,13 @@ int __exynos_power_init(void)int exynos_power_init (void ) __attribute__((weak,alias ("__exynos_power_init" ))); +unsigned int boot_device (void ) +{ +unsigned int om_stat =samsung_get_base_power (); + +return BOOT_DEVICE (readl (om_stat)); +} +#if definedCONFIG_EXYNOS_TMU /* Boot Time Thermal Analysis for SoC temperature threshold breach */ static void boot_temp_check (void )@@ -243,19 +250,20 @@ int board_eth_init(bd_t *bis)int board_mmc_init (bd_t *bis) {int ret; +#ifdef CONFIG_DWMMC /* dwmmc initializattion for available channels */ ret =exynos_dwmmc_init (gd->fdt_blob);if (ret)debug ("dwmmc init failed\n" );#endif -#ifdef CONFIG_SDHCI /* mmc initializattion for available channels */ ret =exynos_mmc_init (gd->fdt_blob);if (ret)debug ("mmc init failed\n" );#endif +return ret; }#endif include/samsung/misc.h +0
-0
include/samsung/misc.h void check_boot_mode(void); · line 36
Quoted 9 lines
include/samsung/misc.h +6
-0@@ -28,4 +28,11 @@ void check_boot_mode(void);void draw_logo (void );#endif +#define BOOT_DEVICE_SDMMC 0x2 +#define BOOT_DEVICE_MASK 0x1f +#define BOOT_DEVICE_SHIFT 0x1 +#define BOOT_DEVICE (x) (((x) >> BOOT_DEVICE_SHIFT) & BOOT_DEVICE_MASK) + +unsigned int boot_device (void );
Hm, do we need to make this function to non-static? If so, it should be placed in power.c - get_om_stat()?
Thanks,
Minkyu Kang.
PATCH v3 2/11 board:samsung: add function boot_device() for checking boot medium
Dear Minkyu,
Quoted 80 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 64 lines · Przemyslaw Marczak
It is possible to boot from a few media devices, especially using a micro SD or eMMC slots. In this situation depends on a boot device - some setup can be changeg.
This change adds function:
boot_device()- which returns an OM[1:5] bits valueThis allows checking if boot device is SD(0x2).
Signed-off-by Przemyslaw Marczak <[email protected]>---
Changes v3:
- new commit after separate one into two--- board/samsung/common/board.c | 10 +++++++++- include/samsung/misc.h | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-)board/samsung/common/board.c +9
-1@@ -41,6 +41,13 @@ int __exynos_power_init(void)int exynos_power_init (void ) __attribute__((weak,alias ("__exynos_power_init" ))); +unsigned int boot_device (void ) +{ +unsigned int om_stat =samsung_get_base_power (); + +return BOOT_DEVICE (readl (om_stat)); +} +#if definedCONFIG_EXYNOS_TMU /* Boot Time Thermal Analysis for SoC temperature threshold breach */ static void boot_temp_check (void )@@ -243,19 +250,20 @@ int board_eth_init(bd_t *bis)int board_mmc_init (bd_t *bis) {int ret; +#ifdef CONFIG_DWMMC /* dwmmc initializattion for available channels */ ret =exynos_dwmmc_init (gd->fdt_blob);if (ret)debug ("dwmmc init failed\n" );#endif -#ifdef CONFIG_SDHCI /* mmc initializattion for available channels */ ret =exynos_mmc_init (gd->fdt_blob);if (ret)debug ("mmc init failed\n" );#endif +return ret; }#endif include/samsung/misc.h +0
-0include/samsung/misc.h void check_boot_mode(void); · line 36
Quoted 9 lines
include/samsung/misc.h +6
-0@@ -28,4 +28,11 @@ void check_boot_mode(void);void draw_logo (void );#endif +#define BOOT_DEVICE_SDMMC 0x2 +#define BOOT_DEVICE_MASK 0x1f +#define BOOT_DEVICE_SHIFT 0x1 +#define BOOT_DEVICE (x) (((x) >> BOOT_DEVICE_SHIFT) & BOOT_DEVICE_MASK) + +unsigned int boot_device (void );Hm, do we need to make this function to non-static? If so, it should be placed in
power.c-get_om_stat()?
Quoted 3 lines
Thanks,
Minkyu Kang.
It is non-static because it is called also outside this file, so I will move it to power.c.
Thank you,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v3 3/11 board:samsung: check the boot device and init the right mmc driver.
In reply to Przemyslaw MarczakIt is possible to boot device using a micro SD or eMMC slots. In this situation, boot device should be registered as a block device 0 in the MMC framework, because CONFIG_SYS_MMC_ENV_DEV is usually set to "0" in the most config cases.
---
Changes V3:
- separate two changes into two commits
--- board/samsung/common/board.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-)
board/samsung/common/board.c +17 -7
@@ -251,18 +251,28 @@ int board_mmc_init(bd_t *bis) {int ret; +if (boot_device () ==BOOT_DEVICE_SDMMC ) { +#ifdef CONFIG_SDHCI +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif #ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob); +#endif + }else { +#ifdef CONFIG_DWMMC +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob);#endif #ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob); +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif + } +if (ret)debug ("mmc init failed\n" ); -#endif return ret; }
Signature · 1 line
1.9.1
PATCH v3 3/11 board:samsung: check the boot device and init the right mmc driver.
Dear Przemyslaw Marczak,
Quoted 37 lines · Przemyslaw Marczak
It is possible to boot device using a micro SD or eMMC slots. In this situation, boot device should be registered as a block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>---
Changes V3:
- separate two changes into two commits--- board/samsung/common/board.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-)board/samsung/common/board.c +11
-4@@ -251,18 +251,28 @@ int board_mmc_init(bd_t *bis) {int ret; +if (boot_device () ==BOOT_DEVICE_SDMMC ) { +#ifdef CONFIG_SDHCI +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif #ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob); +#endif + }else { +#ifdef CONFIG_DWMMC +/* dwmmc initializattion for available channels */
board/samsung/common/board.c int board_mmc_init(bd_t *bis) · line 273
Quoted 10 lines
board/samsung/common/board.c +6
-2+ ret =exynos_dwmmc_init (gd->fdt_blob);#endif #ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob); +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif + } +
It looks little confused.
Could you please re-arrange this code like this?
#ifdef CONFIG_SDHCI
if (boot....) {
} else {
}#endif
#ifdef CONFIG_DWMMC
if (boot....) {
} else {
}#endif
Thanks,
Minkyu Kang.
PATCH v3 3/11 board:samsung: check the boot device and init the right mmc driver.
Quoted 45 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 42 lines · Przemyslaw Marczak
It is possible to boot device using a micro SD or eMMC slots. In this situation, boot device should be registered as a block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>---
Changes V3:
- separate two changes into two commits--- board/samsung/common/board.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-)board/samsung/common/board.c +12
-6@@ -251,18 +251,28 @@ int board_mmc_init(bd_t *bis) {int ret; +if (boot_device () ==BOOT_DEVICE_SDMMC ) { +#ifdef CONFIG_SDHCI +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif #ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob); +#endif + }else { +#ifdef CONFIG_DWMMC +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob);#endif #ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob);
Quoted 8 lines
board/samsung/common/board.c int board_mmc_init(bd_t *bis) · line 273
Quoted 5 lines
board/samsung/common/board.c +5
-0+/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif + } +It looks little confused.
Could you please re-arrange this code like this?
If re-arrange the below code, i want to call the dwmmc-init function at first. Is there a special reason for sequence(sdhci->dwmmc)?
Best Regards,
Jaehoon Chung
Quoted 20 lines
#ifdef CONFIG_SDHCI if (boot....) { } else { }#endif
#ifdef CONFIG_DWMMC if (boot....) { } else { }#endif
Thanks,
Minkyu Kang.
PATCH v3 3/11 board:samsung: check the boot device and init the right mmc driver.
hello Jaehoon,
Quoted 55 lines · Jaehoon Chung
Quoted 45 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 42 lines · Przemyslaw Marczak
It is possible to boot device using a micro SD or eMMC slots. In this situation, boot device should be registered as a block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>---
Changes V3:
- separate two changes into two commits--- board/samsung/common/board.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-)board/samsung/common/board.c +12
-6@@ -251,18 +251,28 @@ int board_mmc_init(bd_t *bis) {int ret; +if (boot_device () ==BOOT_DEVICE_SDMMC ) { +#ifdef CONFIG_SDHCI +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif #ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob); +#endif + }else { +#ifdef CONFIG_DWMMC +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob);#endif #ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob);Quoted 8 lines
board/samsung/common/board.c int board_mmc_init(bd_t *bis) · line 273
Quoted 5 lines
board/samsung/common/board.c +5
-0+/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif + } +It looks little confused.
Could you please re-arrange this code like this?
Quoted 5 lines
If re-arrange the below code, i want to call the dwmmc-init function at first. Is there a special reason for
sequence(sdhci->dwmmc)?Best Regards,
Jaehoon Chung
Please look at my proposed solution in the reply to Minkyu email.
Thanks,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v3 3/11 board:samsung: check the boot device and init the right mmc driver.
In reply to Minkyu KangQuoted 68 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 37 lines · Przemyslaw Marczak
It is possible to boot device using a micro SD or eMMC slots. In this situation, boot device should be registered as a block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>---
Changes V3:
- separate two changes into two commits--- board/samsung/common/board.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-)board/samsung/common/board.c +11
-4@@ -251,18 +251,28 @@ int board_mmc_init(bd_t *bis) {int ret; +if (boot_device () ==BOOT_DEVICE_SDMMC ) { +#ifdef CONFIG_SDHCI +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif #ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +/* dwmmc initializattion for available channels */ + ret =exynos_dwmmc_init (gd->fdt_blob); +#endif + }else { +#ifdef CONFIG_DWMMC +/* dwmmc initializattion for available channels */ board/samsung/common/board.c int board_mmc_init(bd_t *bis) · line 273
Quoted 10 lines
board/samsung/common/board.c +6
-2+ ret =exynos_dwmmc_init (gd->fdt_blob);#endif #ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob); +/* mmc initializattion for available channels */ + ret =exynos_mmc_init (gd->fdt_blob); +#endif + } +It looks little confused.
Could you please re-arrange this code like this?#ifdef CONFIG_SDHCI if (boot....) { } else { }#endif
#ifdef CONFIG_DWMMC if (boot....) { } else { }
Quoted 5 lines
#endif
Thanks,
Minkyu Kang.
There are few schemes:
- defined SDHCI and DWMMC or
- defined SDHCI only or
- defined DWMMC only or
So I need #ifdefs to take into account those all schemes. To clean some mess I can do something like this:
static int init_sdhci(void) {
#ifdef CONFIG_SDHCI /* mmc initializattion for available channels */ return exynos_mmc_init(gd->fdt_blob); #else return 0;
#endif
}
static int init_dwmmc(void) {
#ifdef CONFIG_DWMMC /* dwmmc initializattion for available channels */ return exynos_dwmmc_init(gd->fdt_blob); #else return 0;
#endif
}
#ifdef CONFIG_GENERIC_MMC
int board_mmc_init(bd_t *bis)
{
int ret;
if (boot_device() == BOOT_DEVICE_SDMMC) {
ret = init_sdhci();
ret |= init_dwmmc();
} else {
ret = init_dwmmc();
ret |= init_sdhci();
}
if (ret)
debug("mmc init failed\n");
return ret;
}#endif
or with the ternary operator:
int board_mmc_init(bd_t *bis)
{
int ret;
int sd_boot = (boot_device() == BOOT_DEVICE_SDMMC);
sd_boot ? ((ret = init_sdhci()) & (ret |= init_dwmmc()))
: ((ret = init_dwmmc()) & (ret |= init_sdhci()));
if (ret)
debug("mmc init failed\n");
return ret;
}Thank you,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v3 4/11 samsung: misc: add function for setting $dfu_alt_info
In reply to Przemyslaw MarczakThis change introduces new common function:
- set_dfu_alt_info() - put dfu system and bootloader setting into $dfu_alt_info.
functions declaration:
- char *get_dfu_alt_system(void)
- char *get_dfu_alt_boot(void)
- void set_dfu_alt_info(void)
and new config:
- CONFIG_SET_DFU_ALT_INFO
This function can be used for auto setting dfu configuration on boot. Such feature is useful for multi board support by one u-boot binary. Each board should define two functions:
- get_dfu_alt_system()
- get_dfu_alt_boot()
---
Changes v2:
- change config names:
CONFIG_SET_DFU_BOOT_ALT to CONFIG_DFU_ALT_BOOTLOADER and CONFIG_DFU_BOOT_ALT_* to CONFIG_DFU_ALT_BOOT_*
- change function name: set_dfu_boot_alt() to set_dfu_alt_boot()
- remove superfluous ifdefs
Changes v3:
- set $dfu_alt_info at every boot
- new config: CONFIG_SET_DFU_ALT_INFO
- update commit msg
--- board/samsung/common/misc.c | 36 ++++++++++++++++++++++++++++++++++++ include/samsung/misc.h | 6 ++++++ 2 files changed, 42 insertions(+)
board/samsung/common/misc.c +36 -0
@@ -11,6 +11,7 @@#include <samsung/misc.h> #include <errno.h> #include <version.h> +#include <malloc.h> #include <linux/sizes.h> #include <asm/arch/cpu.h> #include <asm/arch/gpio.h>
@@ -21,6 +22,41 @@DECLARE_GLOBAL_DATA_PTR ; +#ifdef CONFIG_SET_DFU_ALT_INFO +void set_dfu_alt_info (void ) +{ +char *alt_boot =NULL ; +char *alt_system =NULL ; +char *buf =NULL ; +int buf_len; + +puts ("DFU alt info setting: " ); + + alt_boot =get_dfu_alt_boot (); +if (!alt_boot) + goto error; + + alt_system =get_dfu_alt_system (); +if (!alt_system) + goto error; + + buf_len =strlen (alt_boot) +strlen (alt_system) +2 ; + buf =malloc (buf_len); + +sprintf (buf,"%s;%s" , alt_boot, alt_system); +setenv ("dfu_alt_info" , buf); + +free (buf); + +puts ("done\n" ); + +return ; +error: +puts ("error\n" ); +setenv ("dfu_alt_info" ,"Settings not found!" ); +} +#endif +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG void set_board_info (void ) {
include/samsung/misc.h +6 -0
@@ -35,4 +35,10 @@ void draw_logo(void);unsigned int boot_device (void ); +#ifdef CONFIG_SET_DFU_ALT_INFO +char *get_dfu_alt_system (void ); +char *get_dfu_alt_boot (void ); +void set_dfu_alt_info (void ); +#endif +#endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH v3 5/11 samsung:board: misc_init_r: call set_dfu_alt_info()
In reply to Przemyslaw MarczakThis change enable automatic setting of dfu alt info on every boot. This is useful in case of booting one u-boot binary from multiple media.
--- board/samsung/common/board.c | 3 +++ 1 file changed, 3 insertions(+)
board/samsung/common/board.c +3 -0
@@ -325,6 +325,9 @@ int arch_early_init_r(void)#ifdef CONFIG_MISC_INIT_R int misc_init_r (void ) { +#ifdef CONFIG_SET_DFU_ALT_INFO +set_dfu_alt_info (); +#endif #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG set_board_info ();#endif
Signature · 1 line
1.9.1
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
In reply to Przemyslaw MarczakOn an Odroid U3 board, the SOC is unable to reset the eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function.
This is done by the reset_misc() function, which is called before reset_cpu(). The function reset_misc() is a weak function.
--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)
arch/arm/lib/reset.c +7 -0
@@ -23,6 +23,11 @@#include <common.h> +void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +int do_reset (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) {puts ("resetting ...\n" );
@@ -30,6 +35,8 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])udelay (50000 );/* wait 50 ms */ disable_interrupts (); + +reset_misc ();reset_cpu (0 );/*NOTREACHED*/
include/common.h +1 -0
@@ -629,6 +629,7 @@ int checkicache (void);int checkdcache (void );void upmconfig (unsigned int ,unsigned int *,unsigned int );ulong get_tbclk (void ); +void reset_misc (void );void reset_cpu (ulong addr);#if defined (CONFIG_OF_LIBFDT ) && defined (CONFIG_OF_BOARD_SETUP )void ft_cpu_setup (void *blob,bd_t *bd);
Signature · 1 line
1.9.1
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
Dear Przemyslaw Marczak,
Quoted 49 lines · Przemyslaw Marczak
On an Odroid U3 board, the SOC is unable to reset the eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function.
This is done by thereset_misc()function, which is called beforereset_cpu(). The functionreset_misc()is a weak function.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Jean-Christophe PLAGNIOL-VILLARD <[email protected]>Cc Albert ARIBAUD <[email protected]>Cc Tom Rini <[email protected]>--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)arch/arm/lib/reset.c +7
-0@@ -23,6 +23,11 @@#include <common.h> +void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +int do_reset (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) {puts ("resetting ...\n" );@@ -30,6 +35,8 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])udelay (50000 );/* wait 50 ms */ disable_interrupts (); + +reset_misc ();reset_cpu (0 );/*NOTREACHED*/ include/common.h +0
-0
include/common.h int checkicache (void); · line 635
Quoted 7 lines
include/common.h +1
-0@@ -629,6 +629,7 @@ int checkicache (void);int checkdcache (void );void upmconfig (unsigned int ,unsigned int *,unsigned int );ulong get_tbclk (void ); +void reset_misc (void );void reset_cpu (ulong addr);#if defined (CONFIG_OF_LIBFDT ) && defined (CONFIG_OF_BOARD_SETUP )void ft_cpu_setup (void *blob,bd_t *bd);
I'm not sure that we really need to add this function to arm common. We can do this in reset_cpu (arch/arm/cpu/armv7/exynos/soc.c).
But if other SoCs also need to add such things then, it can be added as arm common.
Thanks,
Minkyu Kang.
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
Quoted 64 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 49 lines · Przemyslaw Marczak
On an Odroid U3 board, the SOC is unable to reset the eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function.
This is done by thereset_misc()function, which is called beforereset_cpu(). The functionreset_misc()is a weak function.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Jean-Christophe PLAGNIOL-VILLARD <[email protected]>Cc Albert ARIBAUD <[email protected]>Cc Tom Rini <[email protected]>--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)arch/arm/lib/reset.c +7
-0@@ -23,6 +23,11 @@#include <common.h> +void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +int do_reset (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) {puts ("resetting ...\n" );@@ -30,6 +35,8 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])udelay (50000 );/* wait 50 ms */ disable_interrupts (); + +reset_misc ();reset_cpu (0 );/*NOTREACHED*/ include/common.h +0
-0include/common.h int checkicache (void); · line 635
Quoted 7 lines
include/common.h +1
-0@@ -629,6 +629,7 @@ int checkicache (void);int checkdcache (void );void upmconfig (unsigned int ,unsigned int *,unsigned int );ulong get_tbclk (void ); +void reset_misc (void );void reset_cpu (ulong addr);#if defined (CONFIG_OF_LIBFDT ) && defined (CONFIG_OF_BOARD_SETUP )void ft_cpu_setup (void *blob,bd_t *bd);I'm not sure that we really need to add this function to arm common. We can do this in
reset_cpu(arch/arm/cpu/armv7/exynos/soc.c).
But if other SoCs also need to add such things then, it can be added as arm common.
Quoted 3 lines
Thanks,
Minkyu Kang.
No one used this before, so probably better is to move it into exynos soc.c code.
Thank you,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
Hello Przemyslaw,
Quoted 29 lines · Przemyslaw Marczak
Quoted 28 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 25 lines · Przemyslaw Marczak
On an Odroid U3 board, the SOC is unable to reset the eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function. This is done by the
reset_misc()function, which is called beforereset_cpu().
The functionreset_misc()is a weak function.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Jean-Christophe PLAGNIOL-VILLARD <[email protected]>Cc Albert ARIBAUD <[email protected]>Cc Tom Rini <[email protected]>--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)arch/arm/lib/reset.c +0
-0@@ -23,6 +23,11 @@
Quoted 7 lines
Quoted 7 lines
arch/arm/lib/reset.c line 30
Quoted 7 lines
arch/arm/lib/reset.c +5
-0#include <common.h> +void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +
can you please use __weak here and provide a prototype, wherever it ends up in the end. It prevents 3 warnings and makes it type safe..
Regards,
Jeroen
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
Hello Jeroen,
Quoted 42 lines · Jeroen Hofstee
Hello Przemyslaw,
Quoted 29 lines · Przemyslaw Marczak
Quoted 28 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 25 lines · Przemyslaw Marczak
On an Odroid U3 board, the SOC is unable to reset the eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function. This is done by the
reset_misc()function, which is called beforereset_cpu().
The functionreset_misc()is a weak function.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Jean-Christophe PLAGNIOL-VILLARD <[email protected]>Cc Albert ARIBAUD <[email protected]>Cc Tom Rini <[email protected]>--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)arch/arm/lib/reset.c +0
-0@@ -23,6 +23,11 @@Quoted 7 lines
Quoted 7 lines
arch/arm/lib/reset.c line 30
Quoted 7 lines
arch/arm/lib/reset.c +5
-0#include <common.h> +void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +can you please use
__weakhere and provide a prototype, wherever it ends up in the end. It prevents 3 warnings and makes it type safe..
Quoted 2 lines
Regards,
Jeroen
Thanks, I will add the __weak prefix there.
The prototype of this new function is in file common.h, so this is type safe.
I checked the compilation with options: -W and -pedantic on two configs: trats and odroid, and there was no warnings about the function reset_misc.
Thank you,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
Hello Przemyslaw.
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 8 lines
Quoted 8 lines
arch/arm/lib/reset.c line 30
Quoted 8 lines
#include <common.h>arch/arm/lib/reset.c +5
-0+void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +can you please use
__weakhere and provide a prototype, wherever it ends up in the end. It prevents 3 warnings and makes it type safe..
Quoted 2 lines
Thanks, I will add the
__weakprefix there.
thanks
Quoted 3 lines
The prototype of this new function is in file
common.h, so this is type safe.
yup, I see, don't know how I missed that.
Quoted 4 lines
I checked the compilation with options: -W and -pedantic on two configs: trats and odroid, and there was no warnings about the function
reset_misc.
You won't see the warning with -Wall -Wpendantic, but when running make W=1, which adds -Wmissing-declarations. The alias version typically warns with something
like __reset_misc has no previous declaration. That is useful at times, since it would e.g. complain about [1].
Regards,
Jeroen
[1] http://lists.denx.de/pipermail/u-boot/2014-June/182781.html
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
Hello Jeroen,
Quoted 15 lines · Jeroen Hofstee
Hello Przemyslaw.
[...]
Quoted 12 lines
Quoted 11 lines
Quoted 8 lines
Quoted 8 lines
arch/arm/lib/reset.c line 30
Quoted 8 lines
#include <common.h>arch/arm/lib/reset.c +5
-0+void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +can you please use
__weakhere and provide a prototype, wherever it ends up in the end. It prevents 3 warnings and makes it type safe..
Quoted 7 lines
Quoted 2 lines
Thanks, I will add the
__weakprefix there.thanks
Quoted 3 lines
The prototype of this new function is in file
common.h, so this is type safe.yup, I see, don't know how I missed that.
No problem.
Quoted 11 lines
Quoted 4 lines
I checked the compilation with options: -W and -pedantic on two configs: trats and odroid, and there was no warnings about the function
reset_misc.You won't see the warning with -Wall -Wpendantic, but when running make W=1,
which adds -Wmissing-declarations. The alias version typically warns with something
like__reset_mischas no previous declaration. That is useful at times, since it would e.g. complain about [1].
Quoted 4 lines
Regards,
Jeroen[1] http://lists.denx.de/pipermail/u-boot/2014-June/182781.html
Thanks for useful info.
Regards,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
In reply to Przemyslaw MarczakHello Minkyu,
Quoted 69 lines · Przemyslaw Marczak
Quoted 68 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 52 lines · Przemyslaw Marczak
On an Odroid U3 board, the SOC is unable to reset the eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function. This is done by the
reset_misc()function, which is called beforereset_cpu().
The functionreset_misc()is a weak function.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Jean-Christophe PLAGNIOL-VILLARD <[email protected]>Cc Albert ARIBAUD <[email protected]>Cc Tom Rini <[email protected]>--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)arch/arm/lib/reset.c +5
-0@@ -23,6 +23,11 @@#include <common.h> +void __reset_misc (void ) {} + +void reset_misc (void ) + __attribute((weak,alias ("__reset_misc" ))); +int do_reset (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) {puts ("resetting ...\n");arch/arm/lib/reset.c +2
-0@@ -30,6 +35,8 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) udelay (50000); /* wait 50 ms */disable_interrupts (); + +reset_misc ();reset_cpu (0 );/*NOTREACHED*/include/common.h +0
-0include/common.h int checkicache (void); · line 635
Quoted 7 lines
include/common.h +1
-0@@ -629,6 +629,7 @@ int checkicache (void);int checkdcache (void );void upmconfig (unsigned int ,unsigned int *,unsigned int );ulong get_tbclk (void ); +void reset_misc (void );void reset_cpu (ulong addr);#if defined (CONFIG_OF_LIBFDT ) && defined (CONFIG_OF_BOARD_SETUP )void ft_cpu_setup (void *blob,bd_t *bd);I'm not sure that we really need to add this function to arm common. We can do this in
reset_cpu(arch/arm/cpu/armv7/exynos/soc.c). But if other SoCs also need to add such things then, it can be added as arm common.
Quoted 8 lines
Quoted 3 lines
Thanks,
Minkyu Kang.No one used this before, so probably better is to move it into exynos
soc.ccode.Thank you,
I'm working on a next patch set version. And the idea with calling reset_misc() from soc.c is quite bad. Function reset_cpu() is actually dedicated only for cpu software reset - as its name suggest. So I prefer leave the reset_misc call inside do_reset().
Thanks,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
Quoted 35 lines · Przemyslaw Marczak
Hello Minkyu,
Quoted 32 lines · Przemyslaw Marczak
Quoted 30 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 14 lines · Przemyslaw Marczak
On an Odroid U3 board, the SOC is unable to reset the eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function. This is done by the
reset_misc()function, which is called beforereset_cpu().
The functionreset_misc()is a weak function.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Jean-Christophe PLAGNIOL-VILLARD <[email protected]>Cc Albert ARIBAUD <[email protected]>Cc Tom Rini <[email protected]>Quoted 4 lines
--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)I'm not sure that we really need to add this function to arm common. We can do this in
reset_cpu(arch/arm/cpu/armv7/exynos/soc.c). But if other SoCs also need to add such things then, it can be added as arm common.Thanks,
Minkyu Kang.
Quoted 7 lines
Quoted 4 lines
No one used this before, so probably better is to move it into exynos
soc.ccode.Thank you,
I'm working on a next patch set version. And the idea with calling
reset_misc()fromsoc.cis quite bad. Functionreset_cpu()is actually dedicated only for cpu software reset - as its name suggest. So I prefer leave thereset_misccall insidedo_reset().
Sorry. I didn't understand the reason.
Could you please explain more in detail?
Thanks,
Minkyu Kang.
PATCH v3 6/11 arm:reset: call the reset_misc() before the cpu reset
Hello Minkyu,
Quoted 41 lines · Minkyu Kang
Quoted 40 lines · Przemyslaw Marczak
Hello Minkyu,
Quoted 36 lines · Przemyslaw Marczak
Quoted 22 lines · Minkyu Kang
Dear Przemyslaw Marczak,
Quoted 14 lines · Przemyslaw Marczak
On an Odroid U3 board, the SOC is unable to reset the eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function. This is done by the
reset_misc()function, which is called beforereset_cpu().
The functionreset_misc()is a weak function.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Jean-Christophe PLAGNIOL-VILLARD <[email protected]>Cc Albert ARIBAUD <[email protected]>Cc Tom Rini <[email protected]>Quoted 4 lines
--- arch/arm/lib/reset.c | 7 +++++++ include/common.h | 1 + 2 files changed, 8 insertions(+)Quoted 8 lines
I'm not sure that we really need to add this function to arm common. We can do this in
reset_cpu(arch/arm/cpu/armv7/exynos/soc.c). But if other SoCs also need to add such things then, it can be added as arm common.Thanks,
Minkyu Kang.No one used this before, so probably better is to move it into exynos
soc.ccode.Thank you,
Quoted 9 lines
Quoted 2 lines
I'm working on a next patch set version. And the idea with calling
reset_misc()fromsoc.cis quite bad. Functionreset_cpu()is actually dedicated only for cpu software reset - as its name suggest. So I prefer leave thereset_misccall insidedo_reset().Sorry. I didn't understand the reason.
Could you please explain more in detail?Thanks,
Minkyu Kang.
I mean that we should take in to account the function names, e.g.:
- do_reset() - do the all reset needed things, and call:
- reset_misc() - reset/prepare various devices before the CPU reset
- reset_cpu() - do the CPU software reset only
The particular Odroid reset procedure is more board specific than SOC specific, and this is why it is implemented in board file.
So I think that the place of call to reset_misc() in common code is good.
Thanks
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v3 7/11 samsung: board: enable support of multiple board types
In reply to Przemyslaw MarczakThis change adds declaration of functions:
- set_board_type() - called at checkboard()
- get_board_type() - called at checkboard()
- get_board_name()
For supporting multiple board types in a one config - it is welcome to display the current board model. This is what get_board_type() should return.
---
Changes v3:
- change the commit order
- include/samsung/misc.h: add new functions declaration
- update a commit message
--- board/samsung/common/board.c | 7 +++++++ include/samsung/misc.h | 5 +++++ 2 files changed, 12 insertions(+)
board/samsung/common/board.c +7 -0
@@ -96,6 +96,7 @@ int board_init(void)#ifdef CONFIG_EXYNOS_SPI spi_init ();#endif +return exynos_init (); }
@@ -285,7 +286,13 @@ int checkboard(void) board_name =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL );printf ("Board: %s\n" , board_name ? board_name :"unknown" ); +#ifdef CONFIG_BOARD_TYPES +set_board_type (); + +const char *board_type =get_board_type (); +printf ("Model: %s\n" , board_type ? board_type :"unknown" ); +#endif return 0; }#endif
include/samsung/misc.h +5 -0
@@ -40,5 +40,10 @@ char *get_dfu_alt_system(void);char *get_dfu_alt_boot (void );void set_dfu_alt_info (void );#endif +#ifdef CONFIG_BOARD_TYPES +void set_board_type (void ); +const char *get_board_type (void ); +const char *get_board_name (void ); +#endif #endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH v3 7/11 samsung: board: enable support of multiple board types
Quoted 36 lines · Przemyslaw Marczak
This change adds declaration of functions:
-set_board_type()- called atcheckboard()
-get_board_type()- called atcheckboard()
-get_board_name()For supporting multiple board types in a one config - it is welcome to display the current board model. This is what
get_board_type()should return.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Piotr Wilczek <[email protected]>Cc Minkyu Kang <[email protected]>---
Changes v3:
- change the commit order
-include/samsung/misc.h: add new functions declaration
- update a commit message--- board/samsung/common/board.c | 7 +++++++ include/samsung/misc.h | 5 +++++ 2 files changed, 12 insertions(+)board/samsung/common/board.c +1
-0@@ -96,6 +96,7 @@ int board_init(void)#ifdef CONFIG_EXYNOS_SPI spi_init ();#endif +return exynos_init (); }
board/samsung/common/board.c int checkboard(void) · line 292
Quoted 7 lines
board/samsung/common/board.c +4
-0@@ -285,7 +286,13 @@ int checkboard(void) board_name =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL );printf ("Board: %s\n" , board_name ? board_name :"unknown" ); +#ifdef CONFIG_BOARD_TYPES +set_board_type (); + +const char *board_type =get_board_type ();
please don't declare local variable at middle of function.
Quoted 22 lines
board/samsung/common/board.c +2
-0+printf ("Model: %s\n" , board_type ? board_type :"unknown" ); +#endif return 0; }#endif include/samsung/misc.h +5
-0@@ -40,5 +40,10 @@ char *get_dfu_alt_system(void);char *get_dfu_alt_boot (void );void set_dfu_alt_info (void );#endif +#ifdef CONFIG_BOARD_TYPES +void set_board_type (void ); +const char *get_board_type (void ); +const char *get_board_name (void ); +#endif #endif /* __SAMSUNG_MISC_COMMON_H__ */
PATCH v3 7/11 samsung: board: enable support of multiple board types
Quoted 38 lines · Minkyu Kang
Quoted 37 lines · Przemyslaw Marczak
This change adds declaration of functions:
-set_board_type()- called atcheckboard()
-get_board_type()- called atcheckboard()
-get_board_name()For supporting multiple board types in a one config - it is welcome to display the current board model. This is what
get_board_type()should return.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Piotr Wilczek <[email protected]>Cc Minkyu Kang <[email protected]>---
Changes v3:
- change the commit order
-include/samsung/misc.h: add new functions declaration
- update a commit message--- board/samsung/common/board.c | 7 +++++++ include/samsung/misc.h | 5 +++++ 2 files changed, 12 insertions(+)board/samsung/common/board.c +1
-0@@ -96,6 +96,7 @@ int board_init(void)#ifdef CONFIG_EXYNOS_SPI spi_init ();#endif +return exynos_init (); }@@ -285,7 +286,13 @@ int checkboard(void)
Quoted 9 lines
board/samsung/common/board.c int checkboard(void) · line 292
Quoted 6 lines
board/samsung/common/board.c +4
-0board_name =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL );printf ("Board: %s\n" , board_name ? board_name :"unknown" ); +#ifdef CONFIG_BOARD_TYPES +set_board_type (); + +const char *board_type =get_board_type ();please don't declare local variable at middle of function.
ok, I will fix this.
Quoted 20 lines
Quoted 20 lines
board/samsung/common/board.c +2
-0+printf ("Model: %s\n" , board_type ? board_type :"unknown" ); +#endif return 0; }#endif include/samsung/misc.h +5
-0@@ -40,5 +40,10 @@ char *get_dfu_alt_system(void);char *get_dfu_alt_boot (void );void set_dfu_alt_info (void );#endif +#ifdef CONFIG_BOARD_TYPES +void set_board_type (void ); +const char *get_board_type (void ); +const char *get_board_name (void ); +#endif
Quoted 4 lines
include/samsung/misc.h char *get_dfu_alt_system(void); · line 49
Quoted 2 lines
include/samsung/misc.h +0
-0#endif /* __SAMSUNG_MISC_COMMON_H__ */
Thank you for review.
Regards,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v3 8/11 samsung: misc: use board specific functions to set env board info
In reply to Przemyslaw MarczakThis change adds setup of environmental board info using get_board_name() and get_board_type() functions for config CONFIG_BOARD_TYPES.
This is useful in case of running many boards with just one config.
---
Changes v2:
- set_board_info: move the bdtype pointer to avoid unused pointer compilation warning
Changes v3:
- samsung: misc: change get_board_type_fdt() to get_board_type()
- samsung: misc: set env $boardname using get_board_* functions for CONFIG_BOARD_TYPES
- update commit msg
--- board/samsung/common/misc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
board/samsung/common/misc.c +11 -2
@@ -74,8 +74,17 @@ void set_board_info(void)setenv ("board_rev" , info);#endif #ifdef CONFIG_OF_LIBFDT -snprintf (info,ARRAY_SIZE (info),"%s%x-%s.dtb" , -CONFIG_SYS_SOC , s5p_cpu_id,CONFIG_SYS_BOARD ); +const char *bdtype ="" ; +const char *bdname =CONFIG_SYS_BOARD ; + +#ifdef CONFIG_BOARD_TYPES + bdtype =get_board_type (); + bdname =get_board_name (); +sprintf (info,"%s%s" , bdname, bdtype); +setenv ("boardname" , info); +#endif +snprintf (info,ARRAY_SIZE (info),"%s%x-%s%s.dtb" , +CONFIG_SYS_SOC , s5p_cpu_id, bdname, bdtype);setenv ("fdtfile" , info);#endif }
Signature · 1 line
1.9.1
PATCH v3 9/11 odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
In reply to Przemyslaw MarczakThis board file supports standard features of Odroid X2 and U3 boards:
- Exynos4412 core clock set to 1000MHz and MPLL peripherial clock set to 800MHz,
- MAX77686 power regulator,
- USB PHY,
- enable XCL205 - power for board peripherials
- check board type: U3 or X2.
- enable Odroid U3 FAN cooler
---
Changes v2:
- enable fan on odroid U3
Changes v3:
- odroid.c: clean up board name related code
- odroid.c: remove static from set_board_type()
- odroid.c: add implementation of functions: get_dfu_alt_*
- odroid.c: include misc.h
--- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 466 ++++++++++++++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 ++++++++++++++++++++ 3 files changed, 701 insertions(+) create mode 100644 board/samsung/odroid/Makefile create mode 100644 board/samsung/odroid/odroid.c create mode 100644 board/samsung/odroid/setup.h
board/samsung/odroid/Makefile new file +8 -0
@@ -0,0 +1,8 @@ +# +# Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved. +# Przemyslaw Marczak <[email protected]> +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y := odroid.o
board/samsung/odroid/odroid.c new file +466 -0
466 lines not on this page · raw message
board/samsung/odroid/setup.h new file +227 -0
227 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v3 10/11 odroid: add odroid U3/X2 device tree description
In reply to Przemyslaw MarczakThis is a standard description for Odroid boards.
--- arch/arm/dts/Makefile | 3 +- arch/arm/dts/exynos4412-odroid.dts | 70 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 arch/arm/dts/exynos4412-odroid.dts
arch/arm/dts/Makefile +2 -1
@@ -1,7 +1,8 @@ dtb-$(CONFIG_EXYNOS4) += exynos4210-origen.dtb \ exynos4210-universal_c210.dtb \ exynos4210-trats.dtb \ - exynos4412-trats2.dtb + exynos4412-trats2.dtb \ + exynos4412-odroid.dtb dtb-$(CONFIG_EXYNOS5) += exynos5250-arndale.dtb \ exynos5250-snow.dtb \
arch/arm/dts/exynos4412-odroid.dts new file +70 -0
70 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v3 11/11 odroid: add odroid_config
In reply to Przemyslaw MarczakThis config is valid for two devices:
- Odroid X2,
- Odroid U3.
---
Changes v2:
- odroid config: add CONFIG_DFU_ALT_BOOTLOADER
- odroid config: change name of CONFIG_DFU_BOOT_ALT_* to CONFIG_DFU_ALT_BOOT_*
Changes v3:
- odroid.h: update CONFIG_DFU_ALT_BOOT_** with required bootloader binaries
- odroid.h: add multi image support (CONFIG_FIT)
- odroid.h: add "autoboot" script for multi boot options
- odroid.h: change env name: dfu_alt_info -> dfu_alt_system
- odroid.h: update config name: CONFIG_SET_DFU_ALT_INFO
- odroid.h: reduce boot delay to 0 seconds
- update: doc/README.odroid
--- boards.cfg | 1 + doc/README.odroid | 144 +++++++++++++++++++++++++++++ include/configs/odroid.h | 232 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 377 insertions(+) create mode 100644 doc/README.odroid create mode 100644 include/configs/odroid.h
boards.cfg +1 -0
@@ -297,6 +297,7 @@ Active arm armv7 exynos samsung smdk5420 Active arm armv7 exynos samsung smdkv310 smdkv310 - Chander Kashyap <[email protected]> Active arm armv7 exynos samsung trats trats - Lukasz Majewski <[email protected]> Active arm armv7 exynos samsung trats2 trats2 - Piotr Wilczek <[email protected]> +Active arm armv7 exynos samsung odroid odroid - Przemyslaw Marczak <[email protected]> Active arm armv7 exynos samsung universal_c210 s5pc210_universal - Przemyslaw Marczak <[email protected]> Active arm armv7 highbank - highbank highbank - Rob Herring <[email protected]> Active arm armv7 keystone ti k2hk_evm k2hk_evm - Vitaly Andrianov <[email protected]>
doc/README.odroid new file +144 -0
144 lines not on this page · raw message
include/configs/odroid.h new file +232 -0
232 lines not on this page · raw message
Signature · 1 line
1.9.1
v4 cover Add support to Odroid U3/X2
In reply to Przemyslaw MarczakThis patch set introduces changes to common Samsung code as a preparation of new board support:
- boot device check - code cleanup
- automatic init order of mmc drivers
- automatic setting of dfu entities which depends on boot device
- pre reset function call for board own implementation
- setting board info environment for multi board support
New board config:
- odroid_config - Odroid U3/X2 support
Przemyslaw Marczak (12):
samsung: misc: fix soc revision setting in the set_board_info()
exynos: pinmux: fix the gpio names for exynos4x12 mmc arch:exynos: boot mode: add get_boot_mode(), code cleanup board:samsung: check the boot device and init the right mmc driver.
samsung: misc: add function for setting $dfu_alt_info samsung:board: misc_init_r: call set_dfu_alt_info() arm:reset: call the reset_misc() before the cpu reset
samsung: board: enable support of multiple board types
samsung: misc: use board specific functions to set env board info
odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
odroid: add odroid U3/X2 device tree description
odroid: add odroid_config
arch/arm/cpu/armv7/exynos/pinmux.c | 4 +- arch/arm/cpu/armv7/exynos/power.c | 7 + arch/arm/cpu/armv7/exynos/spl_boot.c | 5 +- arch/arm/dts/Makefile | 3 +- arch/arm/dts/exynos4412-odroid.dts | 70 +++++ arch/arm/include/asm/arch-exynos/power.h | 20 ++ arch/arm/include/asm/arch-exynos/spl.h | 17 +- arch/arm/lib/reset.c | 6 + board/samsung/common/board.c | 52 +++- board/samsung/common/misc.c | 55 +++- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 466 +++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 +++++++++++++++ boards.cfg | 1 + doc/README.odroid | 144 ++++++++++ include/common.h | 1 + include/configs/odroid.h | 232 +++++++++++++++ include/samsung/misc.h | 11 + 18 files changed, 1291 insertions(+), 38 deletions(-) create mode 100644 arch/arm/dts/exynos4412-odroid.dts create mode 100644 board/samsung/odroid/Makefile create mode 100644 board/samsung/odroid/odroid.c create mode 100644 board/samsung/odroid/setup.h create mode 100644 doc/README.odroid create mode 100644 include/configs/odroid.h
Signature · 1 line
1.9.1
PATCH v4 1/12 samsung: misc: fix soc revision setting in the set_board_info()
The byte order of soc revision was inverted, now it is fixed.
--- board/samsung/common/misc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
board/samsung/common/misc.c +2 -2
@@ -26,8 +26,8 @@ void set_board_info(void) {char info[64 ]; -snprintf (info,ARRAY_SIZE (info),"%d.%d" , s5p_cpu_rev &0x0f , - (s5p_cpu_rev &0xf0 ) >>0x04 ); +snprintf (info,ARRAY_SIZE (info),"%u.%u" , (s5p_cpu_rev &0xf0 ) >>4 , + s5p_cpu_rev &0xf );setenv ("soc_rev" , info);snprintf (info,ARRAY_SIZE (info),"%x" , s5p_cpu_id);
Signature · 1 line
1.9.1
PATCH v4 2/12 exynos: pinmux: fix the gpio names for exynos4x12 mmc
In reply to Przemyslaw MarczakThis change fixes the bad gpio configuration for the exynos dwmmc.
--- arch/arm/cpu/armv7/exynos/pinmux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/cpu/armv7/exynos/pinmux.c +2 -2
@@ -704,8 +704,8 @@ static int exynos4x12_mmc_config(int peripheral, int flags) ext_func =S5P_GPIO_FUNC (0x3 );break ;case PERIPH_ID_SDMMC4 : - start =EXYNOS4_GPIO_K00 ; - start_ext =EXYNOS4_GPIO_K13 ; + start =EXYNOS4X12_GPIO_K00 ; + start_ext =EXYNOS4X12_GPIO_K13 ; func =S5P_GPIO_FUNC (0x3 ); ext_func =S5P_GPIO_FUNC (0x4 );break ;
Signature · 1 line
1.9.1
PATCH v4 2/12 exynos: pinmux: fix the gpio names for exynos4x12 mmc
It's reasonable, looks good to me.
Quoted 26 lines · Przemyslaw Marczak
This change fixes the bad gpio configuration for the exynos dwmmc.
Signed-off-by Przemyslaw Marczak <[email protected]>Cc Beomho Seo <[email protected]>Cc Minkyu Kang <[email protected]>Cc Jaehoon Chung <[email protected]>--- arch/arm/cpu/armv7/exynos/pinmux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)arch/arm/cpu/armv7/exynos/pinmux.c +2
-2@@ -704,8 +704,8 @@ static int exynos4x12_mmc_config(int peripheral, int flags) ext_func =S5P_GPIO_FUNC (0x3 );break ;case PERIPH_ID_SDMMC4 : - start =EXYNOS4_GPIO_K00 ; - start_ext =EXYNOS4_GPIO_K13 ; + start =EXYNOS4X12_GPIO_K00 ; + start_ext =EXYNOS4X12_GPIO_K13 ; func =S5P_GPIO_FUNC (0x3 ); ext_func =S5P_GPIO_FUNC (0x4 );break ;
PATCH v4 3/12 arch:exynos: boot mode: add get_boot_mode(), code cleanup
In reply to Przemyslaw MarczakThis patch introduces code clean-up for exynos boot mode check. It includes:
- removal of typedef: boot_mode
- move the boot mode enum to arch-exynos/power.h
- add new function: get_boot_mode() for OM[5:1] pin check
- update spl boot code
--- arch/arm/cpu/armv7/exynos/power.c | 7 +++++++ arch/arm/cpu/armv7/exynos/spl_boot.c | 5 ++--- arch/arm/include/asm/arch-exynos/power.h | 20 ++++++++++++++++++++ arch/arm/include/asm/arch-exynos/spl.h | 17 ++--------------- 4 files changed, 31 insertions(+), 18 deletions(-)
arch/arm/cpu/armv7/exynos/power.c +7 -0
@@ -202,3 +202,10 @@ void power_exit_wakeup(void)else exynos4_power_exit_wakeup (); } + +unsigned int get_boot_mode (void ) +{ +unsigned int om_pin =samsung_get_base_power (); + +return readl (om_pin) &OM_PIN_MASK ; +}
arch/arm/cpu/armv7/exynos/spl_boot.c +2 -3
@@ -20,7 +20,6 @@#include "clock_init.h" DECLARE_GLOBAL_DATA_PTR ; -#define OM_STAT (0x1f << 1)/* Index into irom ptr table */ enum index {
@@ -184,7 +183,7 @@ static void exynos_spi_copy(unsigned int uboot_size, unsigned int uboot_addr)*/ void copy_uboot_to_ram (void ) { -enum boot_mode bootmode =BOOT_MODE_OM ; +u32 bootmode =BOOT_MODE_OM ;u32 (*copy_bl2)(u32 offset,u32 nblock,u32 dst) =NULL ;u32 offset =0 , size =0 ;
@@ -207,7 +206,7 @@ void copy_uboot_to_ram(void)#endif if (bootmode ==BOOT_MODE_OM ) - bootmode =readl (samsung_get_base_power ()) &OM_STAT ; + bootmode =get_boot_mode ();switch (bootmode) {#ifdef CONFIG_SPI_BOOTING
arch/arm/include/asm/arch-exynos/power.h +20 -0
@@ -1670,6 +1670,26 @@ struct exynos5420_power { };#endif /* __ASSEMBLY__ */ +#define OM_PIN_BITS 0x1f +#define OM_PIN_SHIFT 0x1 +#define OM_PIN_MASK (OM_PIN_BITS << OM_PIN_SHIFT) + +enum { +/* +* Assign the OM pin values for respective boot modes. +* Exynos4 does not support spi boot and the mmc boot OM +* pin values are the same across Exynos4 and Exynos5. +*/ +BOOT_MODE_MMC =4 , +BOOT_MODE_EMMC =8 ,/* EMMC4.4 */ +BOOT_MODE_SERIAL =20 , +/* Boot based on Operating Mode pin settings */ +BOOT_MODE_OM =32 , +BOOT_MODE_USB ,/* Boot using USB download */ +}; + +unsigned int get_boot_mode (void ); +void set_mipi_phy_ctrl (unsigned int dev_index,unsigned int enable);#define EXYNOS_MIPI_PHY_ENABLE (1 << 0)
arch/arm/include/asm/arch-exynos/spl.h +2 -15
@@ -8,20 +8,7 @@#define __ASM_ARCH_EXYNOS_SPL_H__#include <asm/arch-exynos/dmc.h> - -enum boot_mode { -/* -* Assign the OM pin values for respective boot modes. -* Exynos4 does not support spi boot and the mmc boot OM -* pin values are the same across Exynos4 and Exynos5. -*/ -BOOT_MODE_MMC =4 , -BOOT_MODE_EMMC =8 ,/* EMMC4.4 */ -BOOT_MODE_SERIAL =20 , -/* Boot based on Operating Mode pin settings */ -BOOT_MODE_OM =32 , -BOOT_MODE_USB ,/* Boot using USB download */ -}; +#include <asm/arch/power.h> #ifndef __ASSEMBLY__/* Parameters of early board initialization in SPL */
@@ -62,7 +49,7 @@ struct spl_machine_param {* table only for mmc boot. */ u32 uboot_size; -enum boot_mode boot_source;/* Boot device */ +unsigned boot_source;/* Boot device */ unsigned frequency_mhz;/* Frequency of memory in MHz */ unsigned arm_freq_mhz;/* ARM Frequency in MHz */ u32 serial_base;/* Serial base address */
Signature · 1 line
1.9.1
PATCH v4 4/12 board:samsung: check the boot device and init the right mmc driver.
In reply to Przemyslaw MarczakIt is possible to boot device using a micro SD or eMMC slots. In this situation, boot device should be registered as a block device 0 in the MMC framework, because CONFIG_SYS_MMC_ENV_DEV is usually set to "0" in the most config cases.
---
Changes V3:
- separate two changes into two commits
Changes V4:
- board.c: add functions: init_mmc() and init_dwmmc()
- board_mmc_init(): call get_boot_mode()
--- board/samsung/common/board.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-)
board/samsung/common/board.c +27 -10
@@ -240,22 +240,39 @@ int board_eth_init(bd_t *bis) }#ifdef CONFIG_GENERIC_MMC -int board_mmc_init (bd_t *bis) +static int init_mmc (void ) +{ +#ifdef CONFIG_SDHCI +return exynos_mmc_init (gd->fdt_blob); +#else +return 0 ; +#endif +} + +static int init_dwmmc (void ) { -int ret;#ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +return exynos_dwmmc_init (gd->fdt_blob); +#else +return 0 ;#endif +} + +int board_mmc_init (bd_t *bis) +{ +int ret; + +if (get_boot_mode () ==BOOT_MODE_MMC ) { + ret =init_mmc (); + ret |=init_dwmmc (); + }else { + ret =init_dwmmc (); + ret |=init_mmc (); + } -#ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob);if (ret)debug ("mmc init failed\n" ); -#endif +return ret; }#endif
Signature · 1 line
1.9.1
PATCH v4 4/12 board:samsung: check the boot device and init the right mmc driver.
Hi, Przemyslaw.
Quoted 50 lines · Przemyslaw Marczak
It is possible to boot device using a micro SD or eMMC slots. In this situation, boot device should be registered as a block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>---
Changes V3:
- separate two changes into two commitsChanges V4:
-board.c: add functions:init_mmc()andinit_dwmmc()
-board_mmc_init(): callget_boot_mode()--- board/samsung/common/board.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-)board/samsung/common/board.c +16
-6@@ -240,22 +240,39 @@ int board_eth_init(bd_t *bis) }#ifdef CONFIG_GENERIC_MMC -int board_mmc_init (bd_t *bis) +static int init_mmc (void ) +{ +#ifdef CONFIG_SDHCI +return exynos_mmc_init (gd->fdt_blob); +#else +return 0 ; +#endif +} + +static int init_dwmmc (void ) { -int ret;#ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +return exynos_dwmmc_init (gd->fdt_blob); +#else +return 0 ;#endif +} + +int board_mmc_init (bd_t *bis)
board/samsung/common/board.c int board_eth_init(bd_t *bis) · line 271
Quoted 10 lines
board/samsung/common/board.c +10
-0+{ +int ret; + +if (get_boot_mode () ==BOOT_MODE_MMC ) { + ret =init_mmc (); + ret |=init_dwmmc (); + }else { + ret =init_dwmmc (); + ret |=init_mmc (); + }
Well, i have some confusion for this.
Did you consider the case like init_dwmmc() is succeed and init_mmc() is failed? it's hard to control the error for both.
Best Regards,
Jaehoon Chung
Quoted 12 lines
board/samsung/common/board.c +1
-4-#ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob);if (ret)debug ("mmc init failed\n" ); -#endif + return ret; }#endif
PATCH v4 4/12 board:samsung: check the boot device and init the right mmc driver.
Hello Jaehoon,
Quoted 67 lines · Jaehoon Chung
Hi, Przemyslaw.
Quoted 50 lines · Przemyslaw Marczak
It is possible to boot device using a micro SD or eMMC slots. In this situation, boot device should be registered as a block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>---
Changes V3:
- separate two changes into two commitsChanges V4:
-board.c: add functions:init_mmc()andinit_dwmmc()
-board_mmc_init(): callget_boot_mode()--- board/samsung/common/board.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-)board/samsung/common/board.c +16
-6@@ -240,22 +240,39 @@ int board_eth_init(bd_t *bis) }#ifdef CONFIG_GENERIC_MMC -int board_mmc_init (bd_t *bis) +static int init_mmc (void ) +{ +#ifdef CONFIG_SDHCI +return exynos_mmc_init (gd->fdt_blob); +#else +return 0 ; +#endif +} + +static int init_dwmmc (void ) { -int ret;#ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +return exynos_dwmmc_init (gd->fdt_blob); +#else +return 0 ;#endif +} + +int board_mmc_init (bd_t *bis)board/samsung/common/board.c int board_eth_init(bd_t *bis) · line 271
Quoted 10 lines
board/samsung/common/board.c +10
-0+{ +int ret; + +if (get_boot_mode () ==BOOT_MODE_MMC ) { + ret =init_mmc (); + ret |=init_dwmmc (); + }else { + ret =init_dwmmc (); + ret |=init_mmc (); + }Well, i have some confusion for this.
Did you consider the case likeinit_dwmmc()is succeed andinit_mmc()is failed? it's hard to control the error for both.
Quoted 2 lines
Best Regards,
Jaehoon Chung
In our vendor init code, the value returned by this function has no significant meaning since there is no implementation of function "cpu_mmc_init()".
So checking this error is just for a debug purposes:
# if (ret)
# debug("mmc init failed\n");and the returned value:
mmc | dwmmc -> ret
0 | 1 -> 1 1 | 0 -> 1 1 | 1 -> 1 0 | 0 -> 0
So we have an error message on any error.
Quoted 14 lines
board/samsung/common/board.c int board_eth_init(bd_t *bis)
Quoted 12 lines
board/samsung/common/board.c +1
-4-#ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob);if (ret)debug ("mmc init failed\n" ); -#endif + return ret; }#endif
Thank you,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v4 4/12 board:samsung: check the boot device and init the right mmc driver.
Hi, Przemyslaw.
Quoted 70 lines · Przemyslaw Marczak
Hello Jaehoon,
Quoted 67 lines · Jaehoon Chung
Hi, Przemyslaw.
Quoted 50 lines · Przemyslaw Marczak
It is possible to boot device using a micro SD or eMMC slots. In this situation, boot device should be registered as a block device 0 in the MMC framework, because
CONFIG_SYS_MMC_ENV_DEVis usually set to "0" in the most config cases.Signed-off-by Przemyslaw Marczak <[email protected]>---
Changes V3:
- separate two changes into two commitsChanges V4:
-board.c: add functions:init_mmc()andinit_dwmmc()
-board_mmc_init(): callget_boot_mode()--- board/samsung/common/board.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-)board/samsung/common/board.c +16
-6@@ -240,22 +240,39 @@ int board_eth_init(bd_t *bis) }#ifdef CONFIG_GENERIC_MMC -int board_mmc_init (bd_t *bis) +static int init_mmc (void ) +{ +#ifdef CONFIG_SDHCI +return exynos_mmc_init (gd->fdt_blob); +#else +return 0 ; +#endif +} + +static int init_dwmmc (void ) { -int ret;#ifdef CONFIG_DWMMC -/* dwmmc initializattion for available channels */ - ret =exynos_dwmmc_init (gd->fdt_blob); -if (ret) -debug ("dwmmc init failed\n" ); +return exynos_dwmmc_init (gd->fdt_blob); +#else +return 0 ;#endif +} + +int board_mmc_init (bd_t *bis)board/samsung/common/board.c int board_eth_init(bd_t *bis) · line 271
Quoted 10 lines
board/samsung/common/board.c +10
-0+{ +int ret; + +if (get_boot_mode () ==BOOT_MODE_MMC ) { + ret =init_mmc (); + ret |=init_dwmmc (); + }else { + ret =init_dwmmc (); + ret |=init_mmc (); + }Well, i have some confusion for this.
Did you consider the case likeinit_dwmmc()is succeed andinit_mmc()is failed? it's hard to control the error for both.
Quoted 4 lines
Quoted 2 lines
Best Regards,
Jaehoon ChungIn our vendor init code, the value returned by this function has no significant meaning since there is no implementation of function "
cpu_mmc_init()".
Ok..then ret value is used to just "debug display", right?
Best Regards,
Jaehoon Chung
Quoted 30 lines
So checking this error is just for a debug purposes:
# if (ret) # debug("mmc init failed\n");and the returned value:
mmc | dwmmc -> ret0 | 1 -> 1 1 | 0 -> 1 1 | 1 -> 1 0 | 0 -> 0So we have an error message on any error.
Quoted 14 lines
board/samsung/common/board.c int board_eth_init(bd_t *bis)
Quoted 12 lines
board/samsung/common/board.c +1
-4-#ifdef CONFIG_SDHCI -/* mmc initializattion for available channels */ - ret =exynos_mmc_init (gd->fdt_blob);if (ret)debug ("mmc init failed\n" ); -#endif + return ret; }#endif Thank you,
PATCH v4 5/12 samsung: misc: add function for setting $dfu_alt_info
In reply to Przemyslaw MarczakThis change introduces new common function:
- set_dfu_alt_info() - put dfu system and bootloader setting into $dfu_alt_info.
functions declaration:
- char *get_dfu_alt_system(void)
- char *get_dfu_alt_boot(void)
- void set_dfu_alt_info(void)
and new config:
- CONFIG_SET_DFU_ALT_INFO
This function can be used for auto setting dfu configuration on boot. Such feature is useful for multi board support by one u-boot binary. Each board should define two functions:
- get_dfu_alt_system()
- get_dfu_alt_boot()
---
Changes v2:
- change config names:
CONFIG_SET_DFU_BOOT_ALT to CONFIG_DFU_ALT_BOOTLOADER and CONFIG_DFU_BOOT_ALT_* to CONFIG_DFU_ALT_BOOT_*
- change function name: set_dfu_boot_alt() to set_dfu_alt_boot()
- remove superfluous ifdefs
Changes v3:
- set $dfu_alt_info at every boot
- new config: CONFIG_SET_DFU_ALT_INFO
- update commit msg
Changes v4:
- set_dfu_alt_info(): add checking the pointer returned by malloc
--- board/samsung/common/misc.c | 38 ++++++++++++++++++++++++++++++++++++++ include/samsung/misc.h | 6 ++++++ 2 files changed, 44 insertions(+)
board/samsung/common/misc.c +38 -0
@@ -11,6 +11,7 @@#include <samsung/misc.h> #include <errno.h> #include <version.h> +#include <malloc.h> #include <linux/sizes.h> #include <asm/arch/cpu.h> #include <asm/arch/gpio.h>
@@ -21,6 +22,43 @@DECLARE_GLOBAL_DATA_PTR ; +#ifdef CONFIG_SET_DFU_ALT_INFO +void set_dfu_alt_info (void ) +{ +char *alt_boot =NULL ; +char *alt_system =NULL ; +char *buf =NULL ; +int buf_len; + +puts ("DFU alt info setting: " ); + + alt_boot =get_dfu_alt_boot (); +if (!alt_boot) + goto error; + + alt_system =get_dfu_alt_system (); +if (!alt_system) + goto error; + + buf_len =strlen (alt_boot) +strlen (alt_system) +2 ; + buf =malloc (buf_len); +if (!buf) + goto error; + +sprintf (buf,"%s;%s" , alt_boot, alt_system); +setenv ("dfu_alt_info" , buf); + +free (buf); + +puts ("done\n" ); + +return ; +error: +puts ("error\n" ); +setenv ("dfu_alt_info" ,"Settings not found!" ); +} +#endif +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG void set_board_info (void ) {
include/samsung/misc.h +6 -0
@@ -28,4 +28,10 @@ void check_boot_mode(void);void draw_logo (void );#endif +#ifdef CONFIG_SET_DFU_ALT_INFO +char *get_dfu_alt_system (void ); +char *get_dfu_alt_boot (void ); +void set_dfu_alt_info (void ); +#endif +#endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH v4 6/12 samsung:board: misc_init_r: call set_dfu_alt_info()
In reply to Przemyslaw MarczakThis change enable automatic setting of dfu alt info on every boot. This is useful in case of booting one u-boot binary from multiple media.
--- board/samsung/common/board.c | 3 +++ 1 file changed, 3 insertions(+)
board/samsung/common/board.c +3 -0
@@ -324,6 +324,9 @@ int arch_early_init_r(void)#ifdef CONFIG_MISC_INIT_R int misc_init_r (void ) { +#ifdef CONFIG_SET_DFU_ALT_INFO +set_dfu_alt_info (); +#endif #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG set_board_info ();#endif
Signature · 1 line
1.9.1
PATCH v4 7/12 arm:reset: call the reset_misc() before the cpu reset
In reply to Przemyslaw MarczakOn an Odroid U3 board, the SOC is unable to reset the eMMC card in the DWMMC mode by the cpu software reset. Manual reset of the card by switching proper gpio pin - fixes this issue.
Such solution needs to add a call to pre reset function.
This is done by the reset_misc() function, which is called before reset_cpu(). The function reset_misc() is a weak function.
Changes v4:
- arch/arm/reset: fix weak function attribute to proper style
--- arch/arm/lib/reset.c | 6 ++++++ include/common.h | 1 + 2 files changed, 7 insertions(+)
arch/arm/lib/reset.c +6 -0
@@ -23,6 +23,10 @@#include <common.h> +__weak void reset_misc (void ) +{ +} +int do_reset (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]) {puts ("resetting ...\n" );
@@ -30,6 +34,8 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])udelay (50000 );/* wait 50 ms */ disable_interrupts (); + +reset_misc ();reset_cpu (0 );/*NOTREACHED*/
include/common.h +1 -0
@@ -629,6 +629,7 @@ int checkicache (void);int checkdcache (void );void upmconfig (unsigned int ,unsigned int *,unsigned int );ulong get_tbclk (void ); +void reset_misc (void );void reset_cpu (ulong addr);#if defined (CONFIG_OF_LIBFDT ) && defined (CONFIG_OF_BOARD_SETUP )void ft_cpu_setup (void *blob,bd_t *bd);
Signature · 1 line
1.9.1
PATCH v4 8/12 samsung: board: enable support of multiple board types
In reply to Przemyslaw MarczakThis change adds declaration of functions:
- set_board_type() - called at checkboard()
- get_board_type() - called at checkboard()
- get_board_name()
For supporting multiple board types in a one config - it is welcome to display the current board model. This is what get_board_type() should return.
---
Changes v3:
- change the commit order
- include/samsung/misc.h: add new functions declaration
- update a commit message
Changes v4:
- checkboard(): remove redundant variable
--- board/samsung/common/board.c | 12 +++++++++--- include/samsung/misc.h | 5 +++++ 2 files changed, 14 insertions(+), 3 deletions(-)
board/samsung/common/board.c +9 -3
@@ -280,11 +280,17 @@ int board_mmc_init(bd_t *bis)#ifdef CONFIG_DISPLAY_BOARDINFO int checkboard (void ) { -const char *board_name; +const char *board_info; - board_name =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL ); -printf ("Board: %s\n" , board_name ? board_name :"unknown" ); + board_info =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL ); +printf ("Board: %s\n" , board_info ? board_info :"unknown" ); +#ifdef CONFIG_BOARD_TYPES +set_board_type (); + board_info =get_board_type (); + +printf ("Model: %s\n" , board_info ? board_info :"unknown" ); +#endif return 0 ; }#endif
include/samsung/misc.h +5 -0
@@ -33,5 +33,10 @@ char *get_dfu_alt_system(void);char *get_dfu_alt_boot (void );void set_dfu_alt_info (void );#endif +#ifdef CONFIG_BOARD_TYPES +void set_board_type (void ); +const char *get_board_type (void ); +const char *get_board_name (void ); +#endif #endif /* __SAMSUNG_MISC_COMMON_H__ */
Signature · 1 line
1.9.1
PATCH v4 8/12 samsung: board: enable support of multiple board types
Quoted 31 lines · Przemyslaw Marczak
This change adds declaration of functions:
-set_board_type()- called atcheckboard()
-get_board_type()- called atcheckboard()
-get_board_name()For supporting multiple board types in a one config - it is welcome to display the current board model. This is what
get_board_type()should return.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Piotr Wilczek <[email protected]>Cc Minkyu Kang <[email protected]>---
Changes v3:
- change the commit order
-include/samsung/misc.h: add new functions declaration
- update a commit messageChanges v4:
-checkboard(): remove redundant variable--- board/samsung/common/board.c | 12 +++++++++--- include/samsung/misc.h | 5 +++++ 2 files changed, 14 insertions(+), 3 deletions(-)board/samsung/common/board.c +0
-0
board/samsung/common/board.c int board_mmc_init(bd_t *bis) · line 283
Quoted 5 lines
board/samsung/common/board.c +1
-1@@ -280,11 +280,17 @@ int board_mmc_init(bd_t *bis)#ifdef CONFIG_DISPLAY_BOARDINFO int checkboard (void ) { -const char *board_name; +const char *board_info;
Is there a reason that it's renaming?
Best Regards,
Jaehoon Chung
Quoted 31 lines
board/samsung/common/board.c +8
-2- board_name =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL ); -printf ("Board: %s\n" , board_name ? board_name :"unknown" ); + board_info =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL ); +printf ("Board: %s\n" , board_info ? board_info :"unknown" ); +#ifdef CONFIG_BOARD_TYPES +set_board_type (); + board_info =get_board_type (); + +printf ("Model: %s\n" , board_info ? board_info :"unknown" ); +#endif return 0; }#endif include/samsung/misc.h +5
-0@@ -33,5 +33,10 @@ char *get_dfu_alt_system(void);char *get_dfu_alt_boot (void );void set_dfu_alt_info (void );#endif +#ifdef CONFIG_BOARD_TYPES +void set_board_type (void ); +const char *get_board_type (void ); +const char *get_board_name (void ); +#endif #endif /* __SAMSUNG_MISC_COMMON_H__ */
PATCH v4 8/12 samsung: board: enable support of multiple board types
Quoted 39 lines · Jaehoon Chung
Quoted 31 lines · Przemyslaw Marczak
This change adds declaration of functions:
-set_board_type()- called atcheckboard()
-get_board_type()- called atcheckboard()
-get_board_name()For supporting multiple board types in a one config - it is welcome to display the current board model. This is what
get_board_type()should return.Signed-off-by Przemyslaw Marczak <[email protected]>Cc Piotr Wilczek <[email protected]>Cc Minkyu Kang <[email protected]>---
Changes v3:
- change the commit order
-include/samsung/misc.h: add new functions declaration
- update a commit messageChanges v4:
-checkboard(): remove redundant variable--- board/samsung/common/board.c | 12 +++++++++--- include/samsung/misc.h | 5 +++++ 2 files changed, 14 insertions(+), 3 deletions(-)board/samsung/common/board.c +0
-0board/samsung/common/board.c int board_mmc_init(bd_t *bis) · line 283
Quoted 5 lines
board/samsung/common/board.c +1
-1@@ -280,11 +280,17 @@ int board_mmc_init(bd_t *bis)#ifdef CONFIG_DISPLAY_BOARDINFO int checkboard (void ) { -const char *board_name; +const char *board_info;Is there a reason that it's renaming?
Quoted 2 lines
Best Regards,
Jaehoon Chung
Yes, I think that the board_info is more suitable as a common for "name" and "type".
Quoted 29 lines
Quoted 29 lines
board/samsung/common/board.c +8
-2- board_name =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL ); -printf ("Board: %s\n" , board_name ? board_name :"unknown" ); + board_info =fdt_getprop (gd->fdt_blob,0 ,"model" ,NULL ); +printf ("Board: %s\n" , board_info ? board_info :"unknown" ); +#ifdef CONFIG_BOARD_TYPES +set_board_type (); + board_info =get_board_type (); + +printf ("Model: %s\n" , board_info ? board_info :"unknown" ); +#endif return 0; }#endif include/samsung/misc.h +5
-0@@ -33,5 +33,10 @@ char *get_dfu_alt_system(void);char *get_dfu_alt_boot (void );void set_dfu_alt_info (void );#endif +#ifdef CONFIG_BOARD_TYPES +void set_board_type (void ); +const char *get_board_type (void ); +const char *get_board_name (void ); +#endif
Quoted 4 lines
include/samsung/misc.h char *get_dfu_alt_system(void); · line 42
Quoted 2 lines
include/samsung/misc.h +0
-0#endif /* __SAMSUNG_MISC_COMMON_H__ */
Thanks,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v4 9/12 samsung: misc: use board specific functions to set env board info
In reply to Przemyslaw MarczakThis change adds setup of environmental board info using get_board_name() and get_board_type() functions for config CONFIG_BOARD_TYPES.
This is useful in case of running many boards with just one config.
---
Changes v2:
- set_board_info: move the bdtype pointer to avoid unused pointer compilation warning
Changes v3:
- samsung: misc: change get_board_type_fdt() to get_board_type()
- samsung: misc: set env $boardname using get_board_* functions for CONFIG_BOARD_TYPES
- update commit msg
--- board/samsung/common/misc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
board/samsung/common/misc.c +11 -2
@@ -76,8 +76,17 @@ void set_board_info(void)setenv ("board_rev" , info);#endif #ifdef CONFIG_OF_LIBFDT -snprintf (info,ARRAY_SIZE (info),"%s%x-%s.dtb" , -CONFIG_SYS_SOC , s5p_cpu_id,CONFIG_SYS_BOARD ); +const char *bdtype ="" ; +const char *bdname =CONFIG_SYS_BOARD ; + +#ifdef CONFIG_BOARD_TYPES + bdtype =get_board_type (); + bdname =get_board_name (); +sprintf (info,"%s%s" , bdname, bdtype); +setenv ("boardname" , info); +#endif +snprintf (info,ARRAY_SIZE (info),"%s%x-%s%s.dtb" , +CONFIG_SYS_SOC , s5p_cpu_id, bdname, bdtype);setenv ("fdtfile" , info);#endif }
Signature · 1 line
1.9.1
PATCH v4 10/12 odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
In reply to Przemyslaw MarczakThis board file supports standard features of Odroid X2 and U3 boards:
- Exynos4412 core clock set to 1000MHz and MPLL peripherial clock set to 800MHz,
- MAX77686 power regulator,
- USB PHY,
- enable XCL205 - power for board peripherials
- check board type: U3 or X2.
- enable Odroid U3 FAN cooler
---
Changes v2:
- enable fan on odroid U3
Changes v3:
- odroid.c: clean up board name related code
- odroid.c: remove static from set_board_type()
- odroid.c: add implementation of functions: get_dfu_alt_*
- odroid.c: include misc.h
Changes v4:odroid.c: dfu_get_alt_boot: add call get_boot_mode()
--- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 466 ++++++++++++++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 ++++++++++++++++++++ 3 files changed, 701 insertions(+) create mode 100644 board/samsung/odroid/Makefile create mode 100644 board/samsung/odroid/odroid.c create mode 100644 board/samsung/odroid/setup.h
board/samsung/odroid/Makefile new file +8 -0
@@ -0,0 +1,8 @@ +# +# Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved. +# Przemyslaw Marczak <[email protected]> +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y := odroid.o
board/samsung/odroid/odroid.c new file +466 -0
466 lines not on this page · raw message
board/samsung/odroid/setup.h new file +227 -0
227 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v4 10/12 odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
Quoted 89 lines · Przemyslaw Marczak
This board file supports standard features of Odroid X2 and U3 boards:
- Exynos4412 core clock set to 1000MHz and MPLL peripherial clock set to 800MHz,
- MAX77686 power regulator,
- USB PHY,
- enable XCL205 - power for board peripherials
- check board type: U3 or X2.
- enable Odroid U3 FAN coolerSigned-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Tom Rini <[email protected]>---
Changes v2:
- enable fan on odroid U3Changes v3:
-odroid.c: clean up board name related code
-odroid.c: remove static fromset_board_type()
-odroid.c: add implementation of functions: get_dfu_alt_*
-odroid.c: includemisc.hChanges v4:
odroid.c:dfu_get_alt_boot: add callget_boot_mode()--- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 466 ++++++++++++++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 ++++++++++++++++++++ 3 files changed, 701 insertions(+) create mode 100644 board/samsung/odroid/Makefile create mode 100644 board/samsung/odroid/odroid.c create mode 100644 board/samsung/odroid/setup.hboard/samsung/odroid/Makefile new file +8
-0@@ -0,0 +1,8 @@ +# +# Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved. +# Przemyslaw Marczak <[email protected]> +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y := odroid.oboard/samsung/odroid/odroid.c new file +36
-0@@ -0,0 +1,466 @@ +/* +* Copyright (C) 2014 Samsung Electronics +* Przemyslaw Marczak <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <common.h> +#include <asm/arch/pinmux.h> +#include <asm/arch/power.h> +#include <asm/arch/clock.h> +#include <asm/arch/gpio.h> +#include <asm/gpio.h> +#include <asm/arch/cpu.h> +#include <power/pmic.h> +#include <power/max77686_pmic.h> +#include <errno.h> +#include <usb.h> +#include <usb/s3c_udc.h> +#include <samsung/misc.h> +#include "setup.h" + +DECLARE_GLOBAL_DATA_PTR ; + +#ifdef CONFIG_BOARD_TYPES +/* Odroid board types */ +enum { +ODROID_TYPE_U3 , +ODROID_TYPE_X2 , +}; + +void set_board_type (void ) +{ +int val; + +/* Check GPC1 pin 2 */
board/samsung/odroid/odroid.c line 46
Quoted 10 lines
board/samsung/odroid/odroid.c new file +10
-0+gpio_set_pull (EXYNOS4X12_GPIO_C12 ,S5P_GPIO_PULL_NONE ); +gpio_set_drv (EXYNOS4X12_GPIO_C12 ,S5P_GPIO_DRV_4X ); +gpio_direction_input (EXYNOS4X12_GPIO_C12 ); + +/* XCL205 - needs some latch time */ +mdelay (10 ); + +/* Check GPC1 pin2 - LED supplied by XCL205 - X2 only */ + val =gpio_get_value (EXYNOS4X12_GPIO_C12 ); +if (val)
val is unnecessary. "int val" can be removed.
if (gpio_get_value(EXYNS4x12_GPIO_C12)) ....
board/samsung/odroid/odroid.c line 54
Quoted 8 lines
board/samsung/odroid/odroid.c new file +8
-0+ gd->board_type =ODROID_TYPE_X2 ; + else + gd->board_type = ODROID_TYPE_U3; +} + +const char *get_board_name (void ) +{ +const char *board_name ="odroid" ;
Is there other approach or general method for getting board name?
Quoted 23 lines
board/samsung/odroid/odroid.c new file +23
-0+ +return board_name; +} + +const char *get_board_type (void ) +{ +const char *board_type[] = {"u3" ,"x2" }; + +return board_type[gd->board_type]; +} +#endif + +#ifdef CONFIG_SET_DFU_ALT_INFO +char *get_dfu_alt_system (void ) +{ +return getenv ("dfu_alt_system" ); +} + +char *get_dfu_alt_boot (void ) +{ +char *alt_boot =NULL ; + +switch (get_boot_mode ()) {
board/samsung/odroid/odroid.c line 87
Quoted 10 lines
board/samsung/odroid/odroid.c new file +10
-0+case BOOT_MODE_MMC : + alt_boot =CONFIG_DFU_ALT_BOOT_SD ; +break ; +default : + alt_boot =CONFIG_DFU_ALT_BOOT_EMMC ; +break ; + } + +if (!alt_boot) +return NULL ;
Is it need? alt_boot is set to CONFIG_DFU_ALT_BOOT_EMMC by default, isn't? CONFIG_DFU_ALT_BOOT_EMMC is 0?
Quoted 15 lines
board/samsung/odroid/odroid.c new file +15
-0+ +setenv ("dfu_alt_boot" , alt_boot); + + return alt_boot; +} +#endif + +static void board_clock_init (void ) +{ +unsigned int set, clr, clr_src_cpu, clr_pll_con0, clr_src_dmc; +struct exynos4x12_clock *clk = (struct exynos4x12_clock *) +samsung_get_base_clock (); + +/* +* CMU_CPU clocks src to MPLL
board/samsung/odroid/odroid.c line 112
Quoted 10 lines
board/samsung/odroid/odroid.c new file +10
-0+* Bit values: 0 ; 1 +* MUX_APLL_SEL: FIN_PLL ; FOUT_APLL +* MUX_CORE_SEL: MOUT_APLL ; SCLK_MPLL +* MUX_HPM_SEL: MOUT_APLL ; SCLK_MPLL_USER_C +* MUX_MPLL_USER_SEL_C: FIN_PLL ; SCLK_MPLL +*/ + clr_src_cpu =MUX_APLL_SEL (0x1 ) |MUX_CORE_SEL (0x1 ) | +MUX_HPM_SEL (0x1 ) |MUX_MPLL_USER_SEL_C (0x1 ); + set =MUX_APLL_SEL (0 ) |MUX_CORE_SEL (1 ) |MUX_HPM_SEL (1 ) | +MUX_MPLL_USER_SEL_C (1 );
0x1 or 1? you can use it consistency. MUX_APLL_SEL(1) or MUX_APLL_SEL(0x1).
Quoted 267 lines
board/samsung/odroid/odroid.c new file +267
-0+ +clrsetbits_le32 (&clk->src_cpu, clr_src_cpu, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_cpu) &MUX_STAT_CPU_CHANGING ) +continue ; + +/* Set APLL to 1000MHz */ + clr_pll_con0 =SDIV (0x7 ) |PDIV (0x3f ) |MDIV (0x3ff ) |FSEL (0x1 ); + set =SDIV (0 ) |PDIV (3 ) |MDIV (125 ) |FSEL (1 ); + +clrsetbits_le32 (&clk->apll_con0, clr_pll_con0, set); + +/* Wait for PLL to be locked */ +while (!(readl (&clk->apll_con0) &PLL_LOCKED_BIT )) +continue ; + +/* Set CMU_CPU clocks src to APLL */ + set =MUX_APLL_SEL (1 ) |MUX_CORE_SEL (0 ) |MUX_HPM_SEL (0 ) | +MUX_MPLL_USER_SEL_C (1 ); +clrsetbits_le32 (&clk->src_cpu, clr_src_cpu, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_cpu) &MUX_STAT_CPU_CHANGING ) +continue ; + + set =CORE_RATIO (0 ) |COREM0_RATIO (2 ) |COREM1_RATIO (5 ) | +PERIPH_RATIO (0 ) |ATB_RATIO (4 ) |PCLK_DBG_RATIO (1 ) | +APLL_RATIO (0 ) |CORE2_RATIO (0 ); +/* +* Set dividers for MOUTcore = 1000 MHz +* coreout = MOUT / (ratio + 1) = 1000 MHz (0) +* corem0 = armclk / (ratio + 1) = 333 MHz (2) +* corem1 = armclk / (ratio + 1) = 166 MHz (5) +* periph = armclk / (ratio + 1) = 1000 MHz (0) +* atbout = MOUT / (ratio + 1) = 200 MHz (4) +* pclkdbgout = atbout / (ratio + 1) = 100 MHz (1) +* sclkapll = MOUTapll / (ratio + 1) = 1000 MHz (0) +* core2out = core_out / (ratio + 1) = 1000 MHz (0) (armclk) +*/ + clr =CORE_RATIO (0x7 ) |COREM0_RATIO (0x7 ) |COREM1_RATIO (0x7 ) | +PERIPH_RATIO (0x7 ) |ATB_RATIO (0x7 ) |PCLK_DBG_RATIO (0x7 ) | +APLL_RATIO (0x7 ) |CORE2_RATIO (0x7 ); + +clrsetbits_le32 (&clk->div_cpu0, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_cpu0) &DIV_STAT_CPU0_CHANGING ) +continue ; + +/* +* For MOUThpm = 1000 MHz (MOUTapll) +* doutcopy = MOUThpm / (ratio + 1) = 200 (4) +* sclkhpm = doutcopy / (ratio + 1) = 200 (4) +* cores_out = armclk / (ratio + 1) = 1000 (0) +*/ + clr =COPY_RATIO (0x7 ) |HPM_RATIO (0x7 ) |CORES_RATIO (0x7 ); + set =COPY_RATIO (4 ) |HPM_RATIO (4 ) |CORES_RATIO (0 ); + +clrsetbits_le32 (&clk->div_cpu1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_cpu1) &DIV_STAT_CPU1_CHANGING ) +continue ; + +/* +* Set CMU_DMC clocks src to APLL +* Bit values: 0 ; 1 +* MUX_C2C_SEL: SCLKMPLL ; SCLKAPLL +* MUX_DMC_BUS_SEL: SCLKMPLL ; SCLKAPLL +* MUX_DPHY_SEL: SCLKMPLL ; SCLKAPLL +* MUX_MPLL_SEL: FINPLL ; MOUT_MPLL_FOUT +* MUX_PWI_SEL: 0110 (MPLL); 0111 (EPLL); 1000 (VPLL); 0(XXTI) +* MUX_G2D_ACP0_SEL: SCLKMPLL ; SCLKAPLL +* MUX_G2D_ACP1_SEL: SCLKEPLL ; SCLKVPLL +* MUX_G2D_ACP_SEL: OUT_ACP0 ; OUT_ACP1 +*/ + clr_src_dmc =MUX_C2C_SEL (0x1 ) |MUX_DMC_BUS_SEL (0x1 ) | +MUX_DPHY_SEL (0x1 ) |MUX_MPLL_SEL (0x1 ) | +MUX_PWI_SEL (0xf ) |MUX_G2D_ACP0_SEL (0x1 ) | +MUX_G2D_ACP1_SEL (0x1 ) |MUX_G2D_ACP_SEL (0x1 ); + set =MUX_C2C_SEL (1 ) |MUX_DMC_BUS_SEL (1 ) |MUX_DPHY_SEL (1 ) | +MUX_MPLL_SEL (0 ) |MUX_PWI_SEL (0 ) |MUX_G2D_ACP0_SEL (1 ) | +MUX_G2D_ACP1_SEL (1 ) |MUX_G2D_ACP_SEL (1 ); + +clrsetbits_le32 (&clk->src_dmc, clr_src_dmc, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_dmc) &MUX_STAT_DMC_CHANGING ) +continue ; + +/* Set MPLL to 800MHz */ + set =SDIV (0 ) |PDIV (3 ) |MDIV (100 ) |FSEL (0 ) |PLL_ENABLE (1 ); + +clrsetbits_le32 (&clk->mpll_con0, clr_pll_con0, set); + +/* Wait for PLL to be locked */ +while (!(readl (&clk->mpll_con0) &PLL_LOCKED_BIT )) +continue ; + +/* Switch back CMU_DMC mux */ + set =MUX_C2C_SEL (0 ) |MUX_DMC_BUS_SEL (0 ) |MUX_DPHY_SEL (0 ) | +MUX_MPLL_SEL (1 ) |MUX_PWI_SEL (8 ) |MUX_G2D_ACP0_SEL (0 ) | +MUX_G2D_ACP1_SEL (0 ) |MUX_G2D_ACP_SEL (0 ); + +clrsetbits_le32 (&clk->src_dmc, clr_src_dmc, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_dmc) &MUX_STAT_DMC_CHANGING ) +continue ; + +/* CLK_DIV_DMC0 */ + clr =ACP_RATIO (0x7 ) |ACP_PCLK_RATIO (0x7 ) |DPHY_RATIO (0x7 ) | +DMC_RATIO (0x7 ) |DMCD_RATIO (0x7 ) |DMCP_RATIO (0x7 ); +/* +* For: +* MOUTdmc = 800 MHz +* MOUTdphy = 800 MHz +* +* aclk_acp = MOUTdmc / (ratio + 1) = 200 (3) +* pclk_acp = aclk_acp / (ratio + 1) = 100 (1) +* sclk_dphy = MOUTdphy / (ratio + 1) = 400 (1) +* sclk_dmc = MOUTdmc / (ratio + 1) = 400 (1) +* aclk_dmcd = sclk_dmc / (ratio + 1) = 200 (1) +* aclk_dmcp = aclk_dmcd / (ratio + 1) = 100 (1) +*/ + set =ACP_RATIO (3 ) |ACP_PCLK_RATIO (1 ) |DPHY_RATIO (1 ) | +DMC_RATIO (1 ) |DMCD_RATIO (1 ) |DMCP_RATIO (1 ); + +clrsetbits_le32 (&clk->div_dmc0, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_dmc0) &DIV_STAT_DMC0_CHANGING ) +continue ; + +/* CLK_DIV_DMC1 */ + clr =G2D_ACP_RATIO (0xf ) |C2C_RATIO (0x7 ) |PWI_RATIO (0xf ) | +C2C_ACLK_RATIO (0x7 ) |DVSEM_RATIO (0x7f ) |DPM_RATIO (0x7f ); +/* +* For: +* MOUTg2d = 800 MHz +* MOUTc2c = 800 Mhz +* MOUTpwi = 108 MHz +* +* sclk_g2d_acp = MOUTg2d / (ratio + 1) = 400 (1) +* sclk_c2c = MOUTc2c / (ratio + 1) = 400 (1) +* aclk_c2c = sclk_c2c / (ratio + 1) = 200 (1) +* sclk_pwi = MOUTpwi / (ratio + 1) = 18 (5) +*/ + set =G2D_ACP_RATIO (1 ) |C2C_RATIO (1 ) |PWI_RATIO (5 ) | +C2C_ACLK_RATIO (1 ) |DVSEM_RATIO (1 ) |DPM_RATIO (1 ); + +clrsetbits_le32 (&clk->div_dmc1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_dmc1) &DIV_STAT_DMC1_CHANGING ) +continue ; + +/* CLK_SRC_PERIL0 */ + clr =UART0_SEL (0xf ) |UART1_SEL (0xf ) |UART2_SEL (0xf ) | +UART3_SEL (0xf ) |UART4_SEL (0xf ); +/* +* Set CLK_SRC_PERIL0 clocks src to MPLL +* src values: 0(XXTI); 1(XusbXTI); 2(SCLK_HDMI24M); 3(SCLK_USBPHY0); +* 5(SCLK_HDMIPHY); 6(SCLK_MPLL_USER_T); 7(SCLK_EPLL); +* 8(SCLK_VPLL) +* +* Set all to SCLK_MPLL_USER_T +*/ + set =UART0_SEL (6 ) |UART1_SEL (6 ) |UART2_SEL (6 ) |UART3_SEL (6 ) | +UART4_SEL (6 ); + +clrsetbits_le32 (&clk->src_peril0, clr, set); + +/* CLK_DIV_PERIL0 */ + clr =UART0_RATIO (0xf ) |UART1_RATIO (0xf ) |UART2_RATIO (0xf ) | +UART3_RATIO (0xf ) |UART4_RATIO (0xf ); +/* +* For MOUTuart0-4: 800MHz +* +* SCLK_UARTx = MOUTuartX / (ratio + 1) = 100 (7) +*/ + set =UART0_RATIO (7 ) |UART1_RATIO (7 ) |UART2_RATIO (7 ) | +UART3_RATIO (7 ) |UART4_RATIO (7 ); + +clrsetbits_le32 (&clk->div_peril0, clr, set); + +while (readl (&clk->div_stat_peril0) &DIV_STAT_PERIL0_CHANGING ) +continue ; + +/* CLK_DIV_FSYS1 */ + clr =MMC0_RATIO (0xf ) |MMC0_PRE_RATIO (0xff ) |MMC1_RATIO (0xf ) | +MMC1_PRE_RATIO (0xff ); +/* +* For MOUTmmc0-3 = 800 MHz (MPLL) +* +* DOUTmmc1 = MOUTmmc1 / (ratio + 1) = 100 (7) +* sclk_mmc1 = DOUTmmc1 / (ratio + 1) = 50 (1) +* DOUTmmc0 = MOUTmmc0 / (ratio + 1) = 100 (7) +* sclk_mmc0 = DOUTmmc0 / (ratio + 1) = 50 (1) +*/ + set =MMC0_RATIO (7 ) |MMC0_PRE_RATIO (1 ) |MMC1_RATIO (7 ) | +MMC1_PRE_RATIO (1 ); + +clrsetbits_le32 (&clk->div_fsys1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys1) &DIV_STAT_FSYS1_CHANGING ) +continue ; + +/* CLK_DIV_FSYS2 */ + clr =MMC2_RATIO (0xf ) |MMC2_PRE_RATIO (0xff ) |MMC3_RATIO (0xf ) | +MMC3_PRE_RATIO (0xff ); +/* +* For MOUTmmc0-3 = 800 MHz (MPLL) +* +* DOUTmmc3 = MOUTmmc3 / (ratio + 1) = 100 (7) +* sclk_mmc3 = DOUTmmc3 / (ratio + 1) = 50 (1) +* DOUTmmc2 = MOUTmmc2 / (ratio + 1) = 100 (7) +* sclk_mmc2 = DOUTmmc2 / (ratio + 1) = 50 (1) +*/ + set =MMC2_RATIO (7 ) |MMC2_PRE_RATIO (1 ) |MMC3_RATIO (7 ) | +MMC3_PRE_RATIO (1 ); + +clrsetbits_le32 (&clk->div_fsys2, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys2) &DIV_STAT_FSYS2_CHANGING ) +continue ; + +/* CLK_DIV_FSYS3 */ + clr =MMC4_RATIO (0xf ) |MMC4_PRE_RATIO (0xff ); +/* +* For MOUTmmc4 = 800 MHz (MPLL) +* +* DOUTmmc4 = MOUTmmc4 / (ratio + 1) = 100 (7) +* sclk_mmc4 = DOUTmmc4 / (ratio + 1) = 100 (0) +*/ + set =MMC4_RATIO (7 ) |MMC4_PRE_RATIO (0 ); + +clrsetbits_le32 (&clk->div_fsys3, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys3) &DIV_STAT_FSYS3_CHANGING ) +continue ; + +return ; +} + +static void board_gpio_init (void ) +{ +/* Set GPA1 pin 1 to HI - enable XCL205 output */ +gpio_set_pull (EXYNOS4X12_GPIO_A11 ,S5P_GPIO_PULL_UP ); +gpio_set_drv (EXYNOS4X12_GPIO_A11 ,S5P_GPIO_DRV_4X ); +gpio_direction_output (EXYNOS4X12_GPIO_A11 ,1 ); + +gpio_cfg_pin (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_FUNC (0x1 )); +gpio_set_pull (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_PULL_NONE ); +gpio_set_drv (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_DRV_4X ); + +/* Enable FAN (Odroid U3) */ +gpio_set_pull (EXYNOS4X12_GPIO_D00 ,S5P_GPIO_PULL_UP ); +gpio_set_drv (EXYNOS4X12_GPIO_D00 ,S5P_GPIO_DRV_4X ); +gpio_direction_output (EXYNOS4X12_GPIO_D00 ,1 ); +} + +static int pmic_init_max77686 (void )
board/samsung/odroid/odroid.c line 389
Quoted 10 lines
board/samsung/odroid/odroid.c new file +10
-0+{ +struct pmic *p =pmic_get ("MAX77686_PMIC" ); + +if (pmic_probe (p)) +return -ENODEV ; + +/* Set LDO Voltage */ +max77686_set_ldo_voltage (p,20 ,1800000 );/* LDO20 eMMC */ +max77686_set_ldo_voltage (p,21 ,2800000 );/* LDO21 SD */ +max77686_set_ldo_voltage (p,22 ,2800000 );/* LDO22 eMMC */
LDO20/22 are used the eMMC? VDD/VDD-IO power?
Quoted 311 lines
board/samsung/odroid/odroid.c new file +77
-0+ +return 0 ; +} + +#ifdef CONFIG_SYS_I2C_INIT_BOARD +static void board_init_i2c (void ) +{ +/* I2C_0 */ +if (exynos_pinmux_config (PERIPH_ID_I2C0 ,PINMUX_FLAG_NONE )) +debug ("I2C%d not configured\n" , (I2C_0 )); +} +#endif + +int exynos_early_init_f (void ) +{ +board_clock_init (); +board_gpio_init (); + +return 0 ; +} + +int exynos_init (void ) +{ +return 0 ; +} + +int exynos_power_init (void ) +{ +#ifdef CONFIG_SYS_I2C_INIT_BOARD +board_init_i2c (); +#endif +pmic_init (I2C_0 ); +pmic_init_max77686 (); + +return 0 ; +} + +#ifdef CONFIG_USB_GADGET +static int s5pc210_phy_control (int on) +{ +struct pmic *p_pmic; + + p_pmic =pmic_get ("MAX77686_PMIC" ); +if (!p_pmic) +return -ENODEV ; + +if (pmic_probe (p_pmic)) +return -1 ; + +if (on) +return max77686_set_ldo_mode (p_pmic,12 ,OPMODE_ON ); +else +return max77686_set_ldo_mode (p_pmic,12 ,OPMODE_LPM ); +} + +struct s3c_plat_otg_data s5pc210_otg_data = { + .phy_control = s5pc210_phy_control, + .regs_phy =EXYNOS4X12_USBPHY_BASE , + .regs_otg =EXYNOS4X12_USBOTG_BASE , + .usb_phy_ctrl =EXYNOS4X12_USBPHY_CONTROL , + .usb_flags =PHY0_SLEEP , +}; + +int board_usb_init (int index,enum usb_init_type init) +{ +debug ("USB_udc_probe\n" ); +return s3c_udc_probe (&s5pc210_otg_data); +} +#endif + +void reset_misc (void ) +{ +/* Reset eMMC*/ +gpio_set_value (EXYNOS4X12_GPIO_K12 ,0 ); +mdelay (10 ); +gpio_set_value (EXYNOS4X12_GPIO_K12 ,1 ); +}board/samsung/odroid/setup.h new file +227
-0@@ -0,0 +1,227 @@ +/* +* Copyright (C) 2014 Samsung Electronics +* Przemyslaw Marczak <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#ifndef __ODROIDU3_SETUP__ +#define __ODROIDU3_SETUP__ + +/* A/M PLL_CON0 */ +#define SDIV (x) (x & 0x7) +#define PDIV (x) ((x & 0x3f) << 8) +#define MDIV (x) ((x & 0x3ff) << 16) +#define FSEL (x) ((x & 0x1) << 27) +#define PLL_LOCKED_BIT (0x1 << 29) +#define PLL_ENABLE (x) ((x & 0x1) << 31) + +/* CLK_SRC_CPU */ +#define MUX_APLL_SEL (x) (x & 0x1) +#define MUX_CORE_SEL (x) ((x & 0x1) << 16) +#define MUX_HPM_SEL (x) ((x & 0x1) << 20) +#define MUX_MPLL_USER_SEL_C (x) ((x & 0x1) << 24) + +#define MUX_STAT_CHANGING 0x100 + +/* CLK_MUX_STAT_CPU */ +#define APLL_SEL (x) (x & 0x7) +#define CORE_SEL (x) ((x & 0x7) << 16) +#define HPM_SEL (x) ((x & 0x7) << 20) +#define MPLL_USER_SEL_C (x) ((x & 0x7) << 24) +#define MUX_STAT_CPU_CHANGING (APLL_SEL(MUX_STAT_CHANGING) | \ + CORE_SEL(MUX_STAT_CHANGING) | \ + HPM_SEL(MUX_STAT_CHANGING) | \ + MPLL_USER_SEL_C(MUX_STAT_CHANGING)) + +/* CLK_DIV_CPU0 */ +#define CORE_RATIO (x) (x & 0x7) +#define COREM0_RATIO (x) ((x & 0x7) << 4) +#define COREM1_RATIO (x) ((x & 0x7) << 8) +#define PERIPH_RATIO (x) ((x & 0x7) << 12) +#define ATB_RATIO (x) ((x & 0x7) << 16) +#define PCLK_DBG_RATIO (x) ((x & 0x7) << 20) +#define APLL_RATIO (x) ((x & 0x7) << 24) +#define CORE2_RATIO (x) ((x & 0x7) << 28) + +/* CLK_DIV_STAT_CPU0 */ +#define DIV_CORE (x) (x & 0x1) +#define DIV_COREM0 (x) ((x & 0x1) << 4) +#define DIV_COREM1 (x) ((x & 0x1) << 8) +#define DIV_PERIPH (x) ((x & 0x1) << 12) +#define DIV_ATB (x) ((x & 0x1) << 16) +#define DIV_PCLK_DBG (x) ((x & 0x1) << 20) +#define DIV_APLL (x) ((x & 0x1) << 24) +#define DIV_CORE2 (x) ((x & 0x1) << 28) + +#define DIV_STAT_CHANGING 0x1 +#define DIV_STAT_CPU0_CHANGING (DIV_CORE(DIV_STAT_CHANGING) | \ + DIV_COREM0(DIV_STAT_CHANGING) | \ + DIV_COREM1(DIV_STAT_CHANGING) | \ + DIV_PERIPH(DIV_STAT_CHANGING) | \ + DIV_ATB(DIV_STAT_CHANGING) | \ + DIV_PCLK_DBG(DIV_STAT_CHANGING) | \ + DIV_APLL(DIV_STAT_CHANGING) | \ + DIV_CORE2(DIV_STAT_CHANGING)) + +/* CLK_DIV_CPU1 */ +#define COPY_RATIO (x) (x & 0x7) +#define HPM_RATIO (x) ((x & 0x7) << 4) +#define CORES_RATIO (x) ((x & 0x7) << 8) + +/* CLK_DIV_STAT_CPU1 */ +#define DIV_COPY (x) (x & 0x7) +#define DIV_HPM (x) ((x & 0x1) << 4) +#define DIV_CORES (x) ((x & 0x1) << 8) + +#define DIV_STAT_CPU1_CHANGING (DIV_COPY(DIV_STAT_CHANGING) | \ + DIV_HPM(DIV_STAT_CHANGING) | \ + DIV_CORES(DIV_STAT_CHANGING)) + +/* CLK_SRC_DMC */ +#define MUX_C2C_SEL (x) (x & 0x1) +#define MUX_DMC_BUS_SEL (x) ((x & 0x1) << 4) +#define MUX_DPHY_SEL (x) ((x & 0x1) << 8) +#define MUX_MPLL_SEL (x) ((x & 0x1) << 12) +#define MUX_PWI_SEL (x) ((x & 0xf) << 16) +#define MUX_G2D_ACP0_SEL (x) ((x & 0x1) << 20) +#define MUX_G2D_ACP1_SEL (x) ((x & 0x1) << 24) +#define MUX_G2D_ACP_SEL (x) ((x & 0x1) << 28) + +/* CLK_MUX_STAT_DMC */ +#define C2C_SEL (x) ((x) & 0x7) +#define DMC_BUS_SEL (x) ((x & 0x7) << 4) +#define DPHY_SEL (x) ((x & 0x7) << 8) +#define MPLL_SEL (x) ((x & 0x7) << 12) +/* #define PWI_SEL(x) ((x & 0xf) << 16) - Reserved */ +#define G2D_ACP0_SEL (x) ((x & 0x7) << 20) +#define G2D_ACP1_SEL (x) ((x & 0x7) << 24) +#define G2D_ACP_SEL (x) ((x & 0x7) << 28) + +#define MUX_STAT_DMC_CHANGING (C2C_SEL(MUX_STAT_CHANGING) | \ + DMC_BUS_SEL(MUX_STAT_CHANGING) | \ + DPHY_SEL(MUX_STAT_CHANGING) | \ + MPLL_SEL(MUX_STAT_CHANGING) |\ + G2D_ACP0_SEL(MUX_STAT_CHANGING) | \ + G2D_ACP1_SEL(MUX_STAT_CHANGING) | \ + G2D_ACP_SEL(MUX_STAT_CHANGING)) + +/* CLK_DIV_DMC0 */ +#define ACP_RATIO (x) (x & 0x7) +#define ACP_PCLK_RATIO (x) ((x & 0x7) << 4) +#define DPHY_RATIO (x) ((x & 0x7) << 8) +#define DMC_RATIO (x) ((x & 0x7) << 12) +#define DMCD_RATIO (x) ((x & 0x7) << 16) +#define DMCP_RATIO (x) ((x & 0x7) << 20) + +/* CLK_DIV_STAT_DMC0 */ +#define DIV_ACP (x) (x & 0x1) +#define DIV_ACP_PCLK (x) ((x & 0x1) << 4) +#define DIV_DPHY (x) ((x & 0x1) << 8) +#define DIV_DMC (x) ((x & 0x1) << 12) +#define DIV_DMCD (x) ((x & 0x1) << 16) +#define DIV_DMCP (x) ((x & 0x1) << 20) + +#define DIV_STAT_DMC0_CHANGING (DIV_ACP(DIV_STAT_CHANGING) | \ + DIV_ACP_PCLK(DIV_STAT_CHANGING) | \ + DIV_DPHY(DIV_STAT_CHANGING) | \ + DIV_DMC(DIV_STAT_CHANGING) | \ + DIV_DMCD(DIV_STAT_CHANGING) | \ + DIV_DMCP(DIV_STAT_CHANGING)) + +/* CLK_DIV_DMC1 */ +#define G2D_ACP_RATIO (x) (x & 0xf) +#define C2C_RATIO (x) ((x & 0x7) << 4) +#define PWI_RATIO (x) ((x & 0xf) << 8) +#define C2C_ACLK_RATIO (x) ((x & 0x7) << 12) +#define DVSEM_RATIO (x) ((x & 0x7f) << 16) +#define DPM_RATIO (x) ((x & 0x7f) << 24) + +/* CLK_DIV_STAT_DMC1 */ +#define DIV_G2D_ACP (x) (x & 0x1) +#define DIV_C2C (x) ((x & 0x1) << 4) +#define DIV_PWI (x) ((x & 0x1) << 8) +#define DIV_C2C_ACLK (x) ((x & 0x1) << 12) +#define DIV_DVSEM (x) ((x & 0x1) << 16) +#define DIV_DPM (x) ((x & 0x1) << 24) + +#define DIV_STAT_DMC1_CHANGING (DIV_G2D_ACP(DIV_STAT_CHANGING) | \ + DIV_C2C(DIV_STAT_CHANGING) | \ + DIV_PWI(DIV_STAT_CHANGING) | \ + DIV_C2C_ACLK(DIV_STAT_CHANGING) | \ + DIV_DVSEM(DIV_STAT_CHANGING) | \ + DIV_DPM(DIV_STAT_CHANGING)) + +/* Set CLK_SRC_PERIL0 */ +#define UART4_SEL (x) ((x & 0xf) << 16) +#define UART3_SEL (x) ((x & 0xf) << 12) +#define UART2_SEL (x) ((x & 0xf) << 8) +#define UART1_SEL (x) ((x & 0xf) << 4) +#define UART0_SEL (x) ((x) & 0xf) + +/* Set CLK_DIV_PERIL0 */ +#define UART4_RATIO (x) ((x & 0xf) << 16) +#define UART3_RATIO (x) ((x & 0xf) << 12) +#define UART2_RATIO (x) ((x & 0xf) << 8) +#define UART1_RATIO (x) ((x & 0xf) << 4) +#define UART0_RATIO (x) ((x) & 0xf) + +/* Set CLK_DIV_STAT_PERIL0 */ +#define DIV_UART4 (x) ((x & 0x1) << 16) +#define DIV_UART3 (x) ((x & 0x1) << 12) +#define DIV_UART2 (x) ((x & 0x1) << 8) +#define DIV_UART1 (x) ((x & 0x1) << 4) +#define DIV_UART0 (x) ((x) & 0x1) + +#define DIV_STAT_PERIL0_CHANGING (DIV_UART4(DIV_STAT_CHANGING) | \ + DIV_UART3(DIV_STAT_CHANGING) | \ + DIV_UART2(DIV_STAT_CHANGING) | \ + DIV_UART1(DIV_STAT_CHANGING) | \ + DIV_UART0(DIV_STAT_CHANGING)) + +/* CLK_DIV_FSYS1 */ +#define MMC0_RATIO (x) ((x) & 0xf) +#define MMC0_PRE_RATIO (x) ((x & 0xff) << 8) +#define MMC1_RATIO (x) ((x & 0xf) << 16) +#define MMC1_PRE_RATIO (x) ((x & 0xff) << 24) + +/* CLK_DIV_STAT_FSYS1 */ +#define DIV_MMC0 (x) ((x) & 1) +#define DIV_MMC0_PRE (x) ((x & 1) << 8) +#define DIV_MMC1 (x) ((x & 1) << 16) +#define DIV_MMC1_PRE (x) ((x & 1) << 24) + +#define DIV_STAT_FSYS1_CHANGING (DIV_MMC0(DIV_STAT_CHANGING) | \ + DIV_MMC0_PRE(DIV_STAT_CHANGING) | \ + DIV_MMC1(DIV_STAT_CHANGING) | \ + DIV_MMC1_PRE(DIV_STAT_CHANGING)) + +/* CLK_DIV_FSYS2 */ +#define MMC2_RATIO (x) (x & 0xf) +#define MMC2_PRE_RATIO (x) ((x & 0xff) << 8) +#define MMC3_RATIO (x) ((x & 0xf) << 16) +#define MMC3_PRE_RATIO (x) ((x & 0xff) << 24) + +/* CLK_DIV_STAT_FSYS2 */ +#define DIV_MMC2 (x) (x & 0x1) +#define DIV_MMC2_PRE (x) ((x & 0x1) << 8) +#define DIV_MMC3 (x) ((x & 0x1) << 16) +#define DIV_MMC3_PRE (x) ((x & 0x1) << 24) + +#define DIV_STAT_FSYS2_CHANGING (DIV_MMC2(DIV_STAT_CHANGING) | \ + DIV_MMC2_PRE(DIV_STAT_CHANGING) | \ + DIV_MMC3(DIV_STAT_CHANGING) | \ + DIV_MMC3_PRE(DIV_STAT_CHANGING)) + +/* CLK_DIV_FSYS3 */ +#define MMC4_RATIO (x) (x & 0x7) +#define MMC4_PRE_RATIO (x) ((x & 0xff) << 8) + +/* CLK_DIV_STAT_FSYS3 */ +#define DIV_MMC4 (x) (x & 0x1) +#define DIV_MMC4_PRE (x) ((x & 0x1) << 8) + +#define DIV_STAT_FSYS3_CHANGING (DIV_MMC4(DIV_STAT_CHANGING) | \ + DIV_MMC4_PRE(DIV_STAT_CHANGING)) + +#endif /*__ODROIDU3_SETUP__ */
PATCH v4 10/12 odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
Quoted 101 lines · Jaehoon Chung
Quoted 89 lines · Przemyslaw Marczak
This board file supports standard features of Odroid X2 and U3 boards:
- Exynos4412 core clock set to 1000MHz and MPLL peripherial clock set to 800MHz,
- MAX77686 power regulator,
- USB PHY,
- enable XCL205 - power for board peripherials
- check board type: U3 or X2.
- enable Odroid U3 FAN coolerSigned-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Tom Rini <[email protected]>---
Changes v2:
- enable fan on odroid U3Changes v3:
-odroid.c: clean up board name related code
-odroid.c: remove static fromset_board_type()
-odroid.c: add implementation of functions: get_dfu_alt_*
-odroid.c: includemisc.hChanges v4:
odroid.c:dfu_get_alt_boot: add callget_boot_mode()--- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 466 ++++++++++++++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 ++++++++++++++++++++ 3 files changed, 701 insertions(+)create mode 100644 board/samsung/odroid/Makefile create mode 100644
board/samsung/odroid/odroid.ccreate mode 100644board/samsung/odroid/setup.hboard/samsung/odroid/Makefile new file +8
-0@@ -0,0 +1,8 @@ +# +# Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved. +# Przemyslaw Marczak <[email protected]> +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y := odroid.oboard/samsung/odroid/odroid.c new file +36
-0@@ -0,0 +1,466 @@ +/* +* Copyright (C) 2014 Samsung Electronics +* Przemyslaw Marczak <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <common.h> +#include <asm/arch/pinmux.h> +#include <asm/arch/power.h> +#include <asm/arch/clock.h> +#include <asm/arch/gpio.h> +#include <asm/gpio.h> +#include <asm/arch/cpu.h> +#include <power/pmic.h> +#include <power/max77686_pmic.h> +#include <errno.h> +#include <usb.h> +#include <usb/s3c_udc.h> +#include <samsung/misc.h> +#include "setup.h" + +DECLARE_GLOBAL_DATA_PTR ; + +#ifdef CONFIG_BOARD_TYPES +/* Odroid board types */ +enum { +ODROID_TYPE_U3 , +ODROID_TYPE_X2 , +}; + +void set_board_type (void ) +{ +int val; + +/* Check GPC1 pin 2 */ board/samsung/odroid/odroid.c line 46
Quoted 10 lines
board/samsung/odroid/odroid.c new file +10
-0+gpio_set_pull (EXYNOS4X12_GPIO_C12 ,S5P_GPIO_PULL_NONE ); +gpio_set_drv (EXYNOS4X12_GPIO_C12 ,S5P_GPIO_DRV_4X ); +gpio_direction_input (EXYNOS4X12_GPIO_C12 ); + +/* XCL205 - needs some latch time */ +mdelay (10 ); + +/* Check GPC1 pin2 - LED supplied by XCL205 - X2 only */ + val =gpio_get_value (EXYNOS4X12_GPIO_C12 ); +if (val)val is unnecessary. "int val" can be removed.
Quoted 3 lines
if (gpio_get_value(EXYNS4x12_GPIO_C12)) ....
ok
Quoted 10 lines
board/samsung/odroid/odroid.c line 54
Quoted 8 lines
board/samsung/odroid/odroid.c new file +8
-0+ gd->board_type =ODROID_TYPE_X2 ; + else + gd->board_type = ODROID_TYPE_U3; +} + +const char *get_board_name (void ) +{ +const char *board_name ="odroid" ;Is there other approach or general method for getting board name?
Actually, the board name is the same as CONFIG_SYS_BOARD, but we are going to have only one binary for Exynos 4 boards in the future - so such function is welcome. We can also put this into the dts file.
Quoted 28 lines
Quoted 28 lines
board/samsung/odroid/odroid.c new file +28
-0+ +return board_name; +} + +const char *get_board_type (void ) +{ +const char *board_type[] = {"u3" ,"x2" }; + +return board_type[gd->board_type]; +} +#endif + +#ifdef CONFIG_SET_DFU_ALT_INFO +char *get_dfu_alt_system (void ) +{ +return getenv ("dfu_alt_system" ); +} + +char *get_dfu_alt_boot (void ) +{ +char *alt_boot =NULL ; + +switch (get_boot_mode ()) { +case BOOT_MODE_MMC : + alt_boot =CONFIG_DFU_ALT_BOOT_SD ; +break ; +default : + alt_boot =CONFIG_DFU_ALT_BOOT_EMMC ;
Quoted 9 lines
board/samsung/odroid/odroid.c line 87
Quoted 5 lines
board/samsung/odroid/odroid.c new file +5
-0+break ; + } + +if (!alt_boot) +return NULL ;Is it need?
alt_bootis set toCONFIG_DFU_ALT_BOOT_EMMCby default, isn't?CONFIG_DFU_ALT_BOOT_EMMCis 0?
Oops, right. I must fix that.
Quoted 18 lines
Quoted 18 lines
board/samsung/odroid/odroid.c new file +18
-0+ +setenv ("dfu_alt_boot" , alt_boot); + + return alt_boot; +} +#endif + +static void board_clock_init (void ) +{ +unsigned int set, clr, clr_src_cpu, clr_pll_con0, clr_src_dmc; +struct exynos4x12_clock *clk = (struct exynos4x12_clock *) +samsung_get_base_clock (); + +/* +* CMU_CPU clocks src to MPLL +* Bit values: 0 ; 1 +* MUX_APLL_SEL: FIN_PLL ; FOUT_APLL +* MUX_CORE_SEL: MOUT_APLL ; SCLK_MPLL
Quoted 9 lines
board/samsung/odroid/odroid.c line 112
Quoted 7 lines
board/samsung/odroid/odroid.c new file +7
-0+* MUX_HPM_SEL: MOUT_APLL ; SCLK_MPLL_USER_C +* MUX_MPLL_USER_SEL_C: FIN_PLL ; SCLK_MPLL +*/ + clr_src_cpu =MUX_APLL_SEL (0x1 ) |MUX_CORE_SEL (0x1 ) | +MUX_HPM_SEL (0x1 ) |MUX_MPLL_USER_SEL_C (0x1 ); + set =MUX_APLL_SEL (0 ) |MUX_CORE_SEL (1 ) |MUX_HPM_SEL (1 ) | +MUX_MPLL_USER_SEL_C (1 );
0x1or 1? you can use it consistency.MUX_APLL_SEL(1)orMUX_APLL_SEL(0x1).
ok, will be fixed.
Quoted 271 lines
Quoted 271 lines
board/samsung/odroid/odroid.c new file +271
-0+ +clrsetbits_le32 (&clk->src_cpu, clr_src_cpu, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_cpu) &MUX_STAT_CPU_CHANGING ) +continue ; + +/* Set APLL to 1000MHz */ + clr_pll_con0 =SDIV (0x7 ) |PDIV (0x3f ) |MDIV (0x3ff ) |FSEL (0x1 ); + set =SDIV (0 ) |PDIV (3 ) |MDIV (125 ) |FSEL (1 ); + +clrsetbits_le32 (&clk->apll_con0, clr_pll_con0, set); + +/* Wait for PLL to be locked */ +while (!(readl (&clk->apll_con0) &PLL_LOCKED_BIT )) +continue ; + +/* Set CMU_CPU clocks src to APLL */ + set =MUX_APLL_SEL (1 ) |MUX_CORE_SEL (0 ) |MUX_HPM_SEL (0 ) | +MUX_MPLL_USER_SEL_C (1 ); +clrsetbits_le32 (&clk->src_cpu, clr_src_cpu, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_cpu) &MUX_STAT_CPU_CHANGING ) +continue ; + + set =CORE_RATIO (0 ) |COREM0_RATIO (2 ) |COREM1_RATIO (5 ) | +PERIPH_RATIO (0 ) |ATB_RATIO (4 ) |PCLK_DBG_RATIO (1 ) | +APLL_RATIO (0 ) |CORE2_RATIO (0 ); +/* +* Set dividers for MOUTcore = 1000 MHz +* coreout = MOUT / (ratio + 1) = 1000 MHz (0) +* corem0 = armclk / (ratio + 1) = 333 MHz (2) +* corem1 = armclk / (ratio + 1) = 166 MHz (5) +* periph = armclk / (ratio + 1) = 1000 MHz (0) +* atbout = MOUT / (ratio + 1) = 200 MHz (4) +* pclkdbgout = atbout / (ratio + 1) = 100 MHz (1) +* sclkapll = MOUTapll / (ratio + 1) = 1000 MHz (0) +* core2out = core_out / (ratio + 1) = 1000 MHz (0) (armclk) +*/ + clr =CORE_RATIO (0x7 ) |COREM0_RATIO (0x7 ) |COREM1_RATIO (0x7 ) | +PERIPH_RATIO (0x7 ) |ATB_RATIO (0x7 ) |PCLK_DBG_RATIO (0x7 ) | +APLL_RATIO (0x7 ) |CORE2_RATIO (0x7 ); + +clrsetbits_le32 (&clk->div_cpu0, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_cpu0) &DIV_STAT_CPU0_CHANGING ) +continue ; + +/* +* For MOUThpm = 1000 MHz (MOUTapll) +* doutcopy = MOUThpm / (ratio + 1) = 200 (4) +* sclkhpm = doutcopy / (ratio + 1) = 200 (4) +* cores_out = armclk / (ratio + 1) = 1000 (0) +*/ + clr =COPY_RATIO (0x7 ) |HPM_RATIO (0x7 ) |CORES_RATIO (0x7 ); + set =COPY_RATIO (4 ) |HPM_RATIO (4 ) |CORES_RATIO (0 ); + +clrsetbits_le32 (&clk->div_cpu1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_cpu1) &DIV_STAT_CPU1_CHANGING ) +continue ; + +/* +* Set CMU_DMC clocks src to APLL +* Bit values: 0 ; 1 +* MUX_C2C_SEL: SCLKMPLL ; SCLKAPLL +* MUX_DMC_BUS_SEL: SCLKMPLL ; SCLKAPLL +* MUX_DPHY_SEL: SCLKMPLL ; SCLKAPLL +* MUX_MPLL_SEL: FINPLL ; MOUT_MPLL_FOUT +* MUX_PWI_SEL: 0110 (MPLL); 0111 (EPLL); 1000 (VPLL); 0(XXTI) +* MUX_G2D_ACP0_SEL: SCLKMPLL ; SCLKAPLL +* MUX_G2D_ACP1_SEL: SCLKEPLL ; SCLKVPLL +* MUX_G2D_ACP_SEL: OUT_ACP0 ; OUT_ACP1 +*/ + clr_src_dmc =MUX_C2C_SEL (0x1 ) |MUX_DMC_BUS_SEL (0x1 ) | +MUX_DPHY_SEL (0x1 ) |MUX_MPLL_SEL (0x1 ) | +MUX_PWI_SEL (0xf ) |MUX_G2D_ACP0_SEL (0x1 ) | +MUX_G2D_ACP1_SEL (0x1 ) |MUX_G2D_ACP_SEL (0x1 ); + set =MUX_C2C_SEL (1 ) |MUX_DMC_BUS_SEL (1 ) |MUX_DPHY_SEL (1 ) | +MUX_MPLL_SEL (0 ) |MUX_PWI_SEL (0 ) |MUX_G2D_ACP0_SEL (1 ) | +MUX_G2D_ACP1_SEL (1 ) |MUX_G2D_ACP_SEL (1 ); + +clrsetbits_le32 (&clk->src_dmc, clr_src_dmc, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_dmc) &MUX_STAT_DMC_CHANGING ) +continue ; + +/* Set MPLL to 800MHz */ + set =SDIV (0 ) |PDIV (3 ) |MDIV (100 ) |FSEL (0 ) |PLL_ENABLE (1 ); + +clrsetbits_le32 (&clk->mpll_con0, clr_pll_con0, set); + +/* Wait for PLL to be locked */ +while (!(readl (&clk->mpll_con0) &PLL_LOCKED_BIT )) +continue ; + +/* Switch back CMU_DMC mux */ + set =MUX_C2C_SEL (0 ) |MUX_DMC_BUS_SEL (0 ) |MUX_DPHY_SEL (0 ) | +MUX_MPLL_SEL (1 ) |MUX_PWI_SEL (8 ) |MUX_G2D_ACP0_SEL (0 ) | +MUX_G2D_ACP1_SEL (0 ) |MUX_G2D_ACP_SEL (0 ); + +clrsetbits_le32 (&clk->src_dmc, clr_src_dmc, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_dmc) &MUX_STAT_DMC_CHANGING ) +continue ; + +/* CLK_DIV_DMC0 */ + clr =ACP_RATIO (0x7 ) |ACP_PCLK_RATIO (0x7 ) |DPHY_RATIO (0x7 ) | +DMC_RATIO (0x7 ) |DMCD_RATIO (0x7 ) |DMCP_RATIO (0x7 ); +/* +* For: +* MOUTdmc = 800 MHz +* MOUTdphy = 800 MHz +* +* aclk_acp = MOUTdmc / (ratio + 1) = 200 (3) +* pclk_acp = aclk_acp / (ratio + 1) = 100 (1) +* sclk_dphy = MOUTdphy / (ratio + 1) = 400 (1) +* sclk_dmc = MOUTdmc / (ratio + 1) = 400 (1) +* aclk_dmcd = sclk_dmc / (ratio + 1) = 200 (1) +* aclk_dmcp = aclk_dmcd / (ratio + 1) = 100 (1) +*/ + set =ACP_RATIO (3 ) |ACP_PCLK_RATIO (1 ) |DPHY_RATIO (1 ) | +DMC_RATIO (1 ) |DMCD_RATIO (1 ) |DMCP_RATIO (1 ); + +clrsetbits_le32 (&clk->div_dmc0, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_dmc0) &DIV_STAT_DMC0_CHANGING ) +continue ; + +/* CLK_DIV_DMC1 */ + clr =G2D_ACP_RATIO (0xf ) |C2C_RATIO (0x7 ) |PWI_RATIO (0xf ) | +C2C_ACLK_RATIO (0x7 ) |DVSEM_RATIO (0x7f ) |DPM_RATIO (0x7f ); +/* +* For: +* MOUTg2d = 800 MHz +* MOUTc2c = 800 Mhz +* MOUTpwi = 108 MHz +* +* sclk_g2d_acp = MOUTg2d / (ratio + 1) = 400 (1) +* sclk_c2c = MOUTc2c / (ratio + 1) = 400 (1) +* aclk_c2c = sclk_c2c / (ratio + 1) = 200 (1) +* sclk_pwi = MOUTpwi / (ratio + 1) = 18 (5) +*/ + set =G2D_ACP_RATIO (1 ) |C2C_RATIO (1 ) |PWI_RATIO (5 ) | +C2C_ACLK_RATIO (1 ) |DVSEM_RATIO (1 ) |DPM_RATIO (1 ); + +clrsetbits_le32 (&clk->div_dmc1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_dmc1) &DIV_STAT_DMC1_CHANGING ) +continue ; + +/* CLK_SRC_PERIL0 */ + clr =UART0_SEL (0xf ) |UART1_SEL (0xf ) |UART2_SEL (0xf ) | +UART3_SEL (0xf ) |UART4_SEL (0xf ); +/* +* Set CLK_SRC_PERIL0 clocks src to MPLL +* src values: 0(XXTI); 1(XusbXTI); 2(SCLK_HDMI24M); 3(SCLK_USBPHY0); +* 5(SCLK_HDMIPHY); 6(SCLK_MPLL_USER_T); 7(SCLK_EPLL); +* 8(SCLK_VPLL) +* +* Set all to SCLK_MPLL_USER_T +*/ + set =UART0_SEL (6 ) |UART1_SEL (6 ) |UART2_SEL (6 ) |UART3_SEL (6 ) | +UART4_SEL (6 ); + +clrsetbits_le32 (&clk->src_peril0, clr, set); + +/* CLK_DIV_PERIL0 */ + clr =UART0_RATIO (0xf ) |UART1_RATIO (0xf ) |UART2_RATIO (0xf ) | +UART3_RATIO (0xf ) |UART4_RATIO (0xf ); +/* +* For MOUTuart0-4: 800MHz +* +* SCLK_UARTx = MOUTuartX / (ratio + 1) = 100 (7) +*/ + set =UART0_RATIO (7 ) |UART1_RATIO (7 ) |UART2_RATIO (7 ) | +UART3_RATIO (7 ) |UART4_RATIO (7 ); + +clrsetbits_le32 (&clk->div_peril0, clr, set); + +while (readl (&clk->div_stat_peril0) &DIV_STAT_PERIL0_CHANGING ) +continue ; + +/* CLK_DIV_FSYS1 */ + clr =MMC0_RATIO (0xf ) |MMC0_PRE_RATIO (0xff ) |MMC1_RATIO (0xf ) | +MMC1_PRE_RATIO (0xff ); +/* +* For MOUTmmc0-3 = 800 MHz (MPLL) +* +* DOUTmmc1 = MOUTmmc1 / (ratio + 1) = 100 (7) +* sclk_mmc1 = DOUTmmc1 / (ratio + 1) = 50 (1) +* DOUTmmc0 = MOUTmmc0 / (ratio + 1) = 100 (7) +* sclk_mmc0 = DOUTmmc0 / (ratio + 1) = 50 (1) +*/ + set =MMC0_RATIO (7 ) |MMC0_PRE_RATIO (1 ) |MMC1_RATIO (7 ) | +MMC1_PRE_RATIO (1 ); + +clrsetbits_le32 (&clk->div_fsys1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys1) &DIV_STAT_FSYS1_CHANGING ) +continue ; + +/* CLK_DIV_FSYS2 */ + clr =MMC2_RATIO (0xf ) |MMC2_PRE_RATIO (0xff ) |MMC3_RATIO (0xf ) | +MMC3_PRE_RATIO (0xff ); +/* +* For MOUTmmc0-3 = 800 MHz (MPLL) +* +* DOUTmmc3 = MOUTmmc3 / (ratio + 1) = 100 (7) +* sclk_mmc3 = DOUTmmc3 / (ratio + 1) = 50 (1) +* DOUTmmc2 = MOUTmmc2 / (ratio + 1) = 100 (7) +* sclk_mmc2 = DOUTmmc2 / (ratio + 1) = 50 (1) +*/ + set =MMC2_RATIO (7 ) |MMC2_PRE_RATIO (1 ) |MMC3_RATIO (7 ) | +MMC3_PRE_RATIO (1 ); + +clrsetbits_le32 (&clk->div_fsys2, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys2) &DIV_STAT_FSYS2_CHANGING ) +continue ; + +/* CLK_DIV_FSYS3 */ + clr =MMC4_RATIO (0xf ) |MMC4_PRE_RATIO (0xff ); +/* +* For MOUTmmc4 = 800 MHz (MPLL) +* +* DOUTmmc4 = MOUTmmc4 / (ratio + 1) = 100 (7) +* sclk_mmc4 = DOUTmmc4 / (ratio + 1) = 100 (0) +*/ + set =MMC4_RATIO (7 ) |MMC4_PRE_RATIO (0 ); + +clrsetbits_le32 (&clk->div_fsys3, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys3) &DIV_STAT_FSYS3_CHANGING ) +continue ; + +return ; +} + +static void board_gpio_init (void ) +{ +/* Set GPA1 pin 1 to HI - enable XCL205 output */ +gpio_set_pull (EXYNOS4X12_GPIO_A11 ,S5P_GPIO_PULL_UP ); +gpio_set_drv (EXYNOS4X12_GPIO_A11 ,S5P_GPIO_DRV_4X ); +gpio_direction_output (EXYNOS4X12_GPIO_A11 ,1 ); + +gpio_cfg_pin (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_FUNC (0x1 )); +gpio_set_pull (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_PULL_NONE ); +gpio_set_drv (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_DRV_4X ); + +/* Enable FAN (Odroid U3) */ +gpio_set_pull (EXYNOS4X12_GPIO_D00 ,S5P_GPIO_PULL_UP ); +gpio_set_drv (EXYNOS4X12_GPIO_D00 ,S5P_GPIO_DRV_4X ); +gpio_direction_output (EXYNOS4X12_GPIO_D00 ,1 ); +} + +static int pmic_init_max77686 (void ) +{ +struct pmic *p =pmic_get ("MAX77686_PMIC" ); + +if (pmic_probe (p))
Quoted 9 lines
board/samsung/odroid/odroid.c line 389
Quoted 6 lines
board/samsung/odroid/odroid.c new file +6
-0+return -ENODEV ; + +/* Set LDO Voltage */ +max77686_set_ldo_voltage (p,20 ,1800000 );/* LDO20 eMMC */ +max77686_set_ldo_voltage (p,21 ,2800000 );/* LDO21 SD */ +max77686_set_ldo_voltage (p,22 ,2800000 );/* LDO22 eMMC */ LDO20/22 are used the eMMC? VDD/VDD-IO power?
Yes, those are the pull-up voltage sources for eMMC and SD.
Thank you,
Signature · 4 lines
Przemyslaw Marczak Samsung R&D Institute Poland Samsung Electronics p.marczak at samsung.com
PATCH v4 10/12 odroid: add board file for Odroid X2/U3 based on Samsung Exynos4412
Quoted 116 lines · Przemyslaw Marczak
Quoted 101 lines · Jaehoon Chung
Quoted 89 lines · Przemyslaw Marczak
This board file supports standard features of Odroid X2 and U3 boards:
- Exynos4412 core clock set to 1000MHz and MPLL peripherial clock set to 800MHz,
- MAX77686 power regulator,
- USB PHY,
- enable XCL205 - power for board peripherials
- check board type: U3 or X2.
- enable Odroid U3 FAN coolerSigned-off-by Przemyslaw Marczak <[email protected]>Cc Minkyu Kang <[email protected]>Cc Tom Rini <[email protected]>---
Changes v2:
- enable fan on odroid U3Changes v3:
-odroid.c: clean up board name related code
-odroid.c: remove static fromset_board_type()
-odroid.c: add implementation of functions: get_dfu_alt_*
-odroid.c: includemisc.hChanges v4:
odroid.c:dfu_get_alt_boot: add callget_boot_mode()--- board/samsung/odroid/Makefile | 8 + board/samsung/odroid/odroid.c | 466 ++++++++++++++++++++++++++++++++++++++++++ board/samsung/odroid/setup.h | 227 ++++++++++++++++++++ 3 files changed, 701 insertions(+)create mode 100644 board/samsung/odroid/Makefile create mode 100644
board/samsung/odroid/odroid.ccreate mode 100644board/samsung/odroid/setup.hboard/samsung/odroid/Makefile new file +8
-0@@ -0,0 +1,8 @@ +# +# Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved. +# Przemyslaw Marczak <[email protected]> +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y := odroid.oboard/samsung/odroid/odroid.c new file +36
-0@@ -0,0 +1,466 @@ +/* +* Copyright (C) 2014 Samsung Electronics +* Przemyslaw Marczak <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <common.h> +#include <asm/arch/pinmux.h> +#include <asm/arch/power.h> +#include <asm/arch/clock.h> +#include <asm/arch/gpio.h> +#include <asm/gpio.h> +#include <asm/arch/cpu.h> +#include <power/pmic.h> +#include <power/max77686_pmic.h> +#include <errno.h> +#include <usb.h> +#include <usb/s3c_udc.h> +#include <samsung/misc.h> +#include "setup.h" + +DECLARE_GLOBAL_DATA_PTR ; + +#ifdef CONFIG_BOARD_TYPES +/* Odroid board types */ +enum { +ODROID_TYPE_U3 , +ODROID_TYPE_X2 , +}; + +void set_board_type (void ) +{ +int val; + +/* Check GPC1 pin 2 */ board/samsung/odroid/odroid.c line 46
Quoted 10 lines
board/samsung/odroid/odroid.c new file +10
-0+gpio_set_pull (EXYNOS4X12_GPIO_C12 ,S5P_GPIO_PULL_NONE ); +gpio_set_drv (EXYNOS4X12_GPIO_C12 ,S5P_GPIO_DRV_4X ); +gpio_direction_input (EXYNOS4X12_GPIO_C12 ); + +/* XCL205 - needs some latch time */ +mdelay (10 ); + +/* Check GPC1 pin2 - LED supplied by XCL205 - X2 only */ + val =gpio_get_value (EXYNOS4X12_GPIO_C12 ); +if (val)val is unnecessary. "int val" can be removed.
Quoted 3 lines
if (gpio_get_value(EXYNS4x12_GPIO_C12)) ....ok
Quoted 10 lines
board/samsung/odroid/odroid.c line 54
Quoted 8 lines
board/samsung/odroid/odroid.c new file +8
-0+ gd->board_type =ODROID_TYPE_X2 ; + else + gd->board_type = ODROID_TYPE_U3; +} + +const char *get_board_name (void ) +{ +const char *board_name ="odroid" ;Is there other approach or general method for getting board name?
Quoted 1 line
Actually, the board name is the same as
CONFIG_SYS_BOARD, but we are going to have only one binary for Exynos 4 boards in the future - so such function is welcome. We can also put this into the dts file.
In future...Then using dt-file would be better than this. :)
Best Regards,
Jaehoon Chung
Quoted 352 lines
Quoted 29 lines
Quoted 29 lines
board/samsung/odroid/odroid.c new file +28
-0+ +return board_name; +} + +const char *get_board_type (void ) +{ +const char *board_type[] = {"u3" ,"x2" }; + +return board_type[gd->board_type]; +} +#endif + +#ifdef CONFIG_SET_DFU_ALT_INFO +char *get_dfu_alt_system (void ) +{ +return getenv ("dfu_alt_system" ); +} + +char *get_dfu_alt_boot (void ) +{ +char *alt_boot =NULL ; + +switch (get_boot_mode ()) { +case BOOT_MODE_MMC : + alt_boot =CONFIG_DFU_ALT_BOOT_SD ; +break ; +default : + alt_boot =CONFIG_DFU_ALT_BOOT_EMMC ;Quoted 9 lines
board/samsung/odroid/odroid.c line 87
Quoted 5 lines
board/samsung/odroid/odroid.c new file +5
-0+break ; + } + +if (!alt_boot) +return NULL ;Is it need?
alt_bootis set toCONFIG_DFU_ALT_BOOT_EMMCby default, isn't?CONFIG_DFU_ALT_BOOT_EMMCis 0?Oops, right. I must fix that.
Quoted 18 lines
Quoted 18 lines
board/samsung/odroid/odroid.c new file +18
-0+ +setenv ("dfu_alt_boot" , alt_boot); + + return alt_boot; +} +#endif + +static void board_clock_init (void ) +{ +unsigned int set, clr, clr_src_cpu, clr_pll_con0, clr_src_dmc; +struct exynos4x12_clock *clk = (struct exynos4x12_clock *) +samsung_get_base_clock (); + +/* +* CMU_CPU clocks src to MPLL +* Bit values: 0 ; 1 +* MUX_APLL_SEL: FIN_PLL ; FOUT_APLL +* MUX_CORE_SEL: MOUT_APLL ; SCLK_MPLL Quoted 9 lines
board/samsung/odroid/odroid.c line 112
Quoted 7 lines
board/samsung/odroid/odroid.c new file +7
-0+* MUX_HPM_SEL: MOUT_APLL ; SCLK_MPLL_USER_C +* MUX_MPLL_USER_SEL_C: FIN_PLL ; SCLK_MPLL +*/ + clr_src_cpu =MUX_APLL_SEL (0x1 ) |MUX_CORE_SEL (0x1 ) | +MUX_HPM_SEL (0x1 ) |MUX_MPLL_USER_SEL_C (0x1 ); + set =MUX_APLL_SEL (0 ) |MUX_CORE_SEL (1 ) |MUX_HPM_SEL (1 ) | +MUX_MPLL_USER_SEL_C (1 );
0x1or 1? you can use it consistency.MUX_APLL_SEL(1)orMUX_APLL_SEL(0x1).ok, will be fixed.
Quoted 271 lines
Quoted 271 lines
board/samsung/odroid/odroid.c new file +271
-0+ +clrsetbits_le32 (&clk->src_cpu, clr_src_cpu, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_cpu) &MUX_STAT_CPU_CHANGING ) +continue ; + +/* Set APLL to 1000MHz */ + clr_pll_con0 =SDIV (0x7 ) |PDIV (0x3f ) |MDIV (0x3ff ) |FSEL (0x1 ); + set =SDIV (0 ) |PDIV (3 ) |MDIV (125 ) |FSEL (1 ); + +clrsetbits_le32 (&clk->apll_con0, clr_pll_con0, set); + +/* Wait for PLL to be locked */ +while (!(readl (&clk->apll_con0) &PLL_LOCKED_BIT )) +continue ; + +/* Set CMU_CPU clocks src to APLL */ + set =MUX_APLL_SEL (1 ) |MUX_CORE_SEL (0 ) |MUX_HPM_SEL (0 ) | +MUX_MPLL_USER_SEL_C (1 ); +clrsetbits_le32 (&clk->src_cpu, clr_src_cpu, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_cpu) &MUX_STAT_CPU_CHANGING ) +continue ; + + set =CORE_RATIO (0 ) |COREM0_RATIO (2 ) |COREM1_RATIO (5 ) | +PERIPH_RATIO (0 ) |ATB_RATIO (4 ) |PCLK_DBG_RATIO (1 ) | +APLL_RATIO (0 ) |CORE2_RATIO (0 ); +/* +* Set dividers for MOUTcore = 1000 MHz +* coreout = MOUT / (ratio + 1) = 1000 MHz (0) +* corem0 = armclk / (ratio + 1) = 333 MHz (2) +* corem1 = armclk / (ratio + 1) = 166 MHz (5) +* periph = armclk / (ratio + 1) = 1000 MHz (0) +* atbout = MOUT / (ratio + 1) = 200 MHz (4) +* pclkdbgout = atbout / (ratio + 1) = 100 MHz (1) +* sclkapll = MOUTapll / (ratio + 1) = 1000 MHz (0) +* core2out = core_out / (ratio + 1) = 1000 MHz (0) (armclk) +*/ + clr =CORE_RATIO (0x7 ) |COREM0_RATIO (0x7 ) |COREM1_RATIO (0x7 ) | +PERIPH_RATIO (0x7 ) |ATB_RATIO (0x7 ) |PCLK_DBG_RATIO (0x7 ) | +APLL_RATIO (0x7 ) |CORE2_RATIO (0x7 ); + +clrsetbits_le32 (&clk->div_cpu0, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_cpu0) &DIV_STAT_CPU0_CHANGING ) +continue ; + +/* +* For MOUThpm = 1000 MHz (MOUTapll) +* doutcopy = MOUThpm / (ratio + 1) = 200 (4) +* sclkhpm = doutcopy / (ratio + 1) = 200 (4) +* cores_out = armclk / (ratio + 1) = 1000 (0) +*/ + clr =COPY_RATIO (0x7 ) |HPM_RATIO (0x7 ) |CORES_RATIO (0x7 ); + set =COPY_RATIO (4 ) |HPM_RATIO (4 ) |CORES_RATIO (0 ); + +clrsetbits_le32 (&clk->div_cpu1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_cpu1) &DIV_STAT_CPU1_CHANGING ) +continue ; + +/* +* Set CMU_DMC clocks src to APLL +* Bit values: 0 ; 1 +* MUX_C2C_SEL: SCLKMPLL ; SCLKAPLL +* MUX_DMC_BUS_SEL: SCLKMPLL ; SCLKAPLL +* MUX_DPHY_SEL: SCLKMPLL ; SCLKAPLL +* MUX_MPLL_SEL: FINPLL ; MOUT_MPLL_FOUT +* MUX_PWI_SEL: 0110 (MPLL); 0111 (EPLL); 1000 (VPLL); 0(XXTI) +* MUX_G2D_ACP0_SEL: SCLKMPLL ; SCLKAPLL +* MUX_G2D_ACP1_SEL: SCLKEPLL ; SCLKVPLL +* MUX_G2D_ACP_SEL: OUT_ACP0 ; OUT_ACP1 +*/ + clr_src_dmc =MUX_C2C_SEL (0x1 ) |MUX_DMC_BUS_SEL (0x1 ) | +MUX_DPHY_SEL (0x1 ) |MUX_MPLL_SEL (0x1 ) | +MUX_PWI_SEL (0xf ) |MUX_G2D_ACP0_SEL (0x1 ) | +MUX_G2D_ACP1_SEL (0x1 ) |MUX_G2D_ACP_SEL (0x1 ); + set =MUX_C2C_SEL (1 ) |MUX_DMC_BUS_SEL (1 ) |MUX_DPHY_SEL (1 ) | +MUX_MPLL_SEL (0 ) |MUX_PWI_SEL (0 ) |MUX_G2D_ACP0_SEL (1 ) | +MUX_G2D_ACP1_SEL (1 ) |MUX_G2D_ACP_SEL (1 ); + +clrsetbits_le32 (&clk->src_dmc, clr_src_dmc, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_dmc) &MUX_STAT_DMC_CHANGING ) +continue ; + +/* Set MPLL to 800MHz */ + set =SDIV (0 ) |PDIV (3 ) |MDIV (100 ) |FSEL (0 ) |PLL_ENABLE (1 ); + +clrsetbits_le32 (&clk->mpll_con0, clr_pll_con0, set); + +/* Wait for PLL to be locked */ +while (!(readl (&clk->mpll_con0) &PLL_LOCKED_BIT )) +continue ; + +/* Switch back CMU_DMC mux */ + set =MUX_C2C_SEL (0 ) |MUX_DMC_BUS_SEL (0 ) |MUX_DPHY_SEL (0 ) | +MUX_MPLL_SEL (1 ) |MUX_PWI_SEL (8 ) |MUX_G2D_ACP0_SEL (0 ) | +MUX_G2D_ACP1_SEL (0 ) |MUX_G2D_ACP_SEL (0 ); + +clrsetbits_le32 (&clk->src_dmc, clr_src_dmc, set); + +/* Wait for mux change */ +while (readl (&clk->mux_stat_dmc) &MUX_STAT_DMC_CHANGING ) +continue ; + +/* CLK_DIV_DMC0 */ + clr =ACP_RATIO (0x7 ) |ACP_PCLK_RATIO (0x7 ) |DPHY_RATIO (0x7 ) | +DMC_RATIO (0x7 ) |DMCD_RATIO (0x7 ) |DMCP_RATIO (0x7 ); +/* +* For: +* MOUTdmc = 800 MHz +* MOUTdphy = 800 MHz +* +* aclk_acp = MOUTdmc / (ratio + 1) = 200 (3) +* pclk_acp = aclk_acp / (ratio + 1) = 100 (1) +* sclk_dphy = MOUTdphy / (ratio + 1) = 400 (1) +* sclk_dmc = MOUTdmc / (ratio + 1) = 400 (1) +* aclk_dmcd = sclk_dmc / (ratio + 1) = 200 (1) +* aclk_dmcp = aclk_dmcd / (ratio + 1) = 100 (1) +*/ + set =ACP_RATIO (3 ) |ACP_PCLK_RATIO (1 ) |DPHY_RATIO (1 ) | +DMC_RATIO (1 ) |DMCD_RATIO (1 ) |DMCP_RATIO (1 ); + +clrsetbits_le32 (&clk->div_dmc0, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_dmc0) &DIV_STAT_DMC0_CHANGING ) +continue ; + +/* CLK_DIV_DMC1 */ + clr =G2D_ACP_RATIO (0xf ) |C2C_RATIO (0x7 ) |PWI_RATIO (0xf ) | +C2C_ACLK_RATIO (0x7 ) |DVSEM_RATIO (0x7f ) |DPM_RATIO (0x7f ); +/* +* For: +* MOUTg2d = 800 MHz +* MOUTc2c = 800 Mhz +* MOUTpwi = 108 MHz +* +* sclk_g2d_acp = MOUTg2d / (ratio + 1) = 400 (1) +* sclk_c2c = MOUTc2c / (ratio + 1) = 400 (1) +* aclk_c2c = sclk_c2c / (ratio + 1) = 200 (1) +* sclk_pwi = MOUTpwi / (ratio + 1) = 18 (5) +*/ + set =G2D_ACP_RATIO (1 ) |C2C_RATIO (1 ) |PWI_RATIO (5 ) | +C2C_ACLK_RATIO (1 ) |DVSEM_RATIO (1 ) |DPM_RATIO (1 ); + +clrsetbits_le32 (&clk->div_dmc1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_dmc1) &DIV_STAT_DMC1_CHANGING ) +continue ; + +/* CLK_SRC_PERIL0 */ + clr =UART0_SEL (0xf ) |UART1_SEL (0xf ) |UART2_SEL (0xf ) | +UART3_SEL (0xf ) |UART4_SEL (0xf ); +/* +* Set CLK_SRC_PERIL0 clocks src to MPLL +* src values: 0(XXTI); 1(XusbXTI); 2(SCLK_HDMI24M); 3(SCLK_USBPHY0); +* 5(SCLK_HDMIPHY); 6(SCLK_MPLL_USER_T); 7(SCLK_EPLL); +* 8(SCLK_VPLL) +* +* Set all to SCLK_MPLL_USER_T +*/ + set =UART0_SEL (6 ) |UART1_SEL (6 ) |UART2_SEL (6 ) |UART3_SEL (6 ) | +UART4_SEL (6 ); + +clrsetbits_le32 (&clk->src_peril0, clr, set); + +/* CLK_DIV_PERIL0 */ + clr =UART0_RATIO (0xf ) |UART1_RATIO (0xf ) |UART2_RATIO (0xf ) | +UART3_RATIO (0xf ) |UART4_RATIO (0xf ); +/* +* For MOUTuart0-4: 800MHz +* +* SCLK_UARTx = MOUTuartX / (ratio + 1) = 100 (7) +*/ + set =UART0_RATIO (7 ) |UART1_RATIO (7 ) |UART2_RATIO (7 ) | +UART3_RATIO (7 ) |UART4_RATIO (7 ); + +clrsetbits_le32 (&clk->div_peril0, clr, set); + +while (readl (&clk->div_stat_peril0) &DIV_STAT_PERIL0_CHANGING ) +continue ; + +/* CLK_DIV_FSYS1 */ + clr =MMC0_RATIO (0xf ) |MMC0_PRE_RATIO (0xff ) |MMC1_RATIO (0xf ) | +MMC1_PRE_RATIO (0xff ); +/* +* For MOUTmmc0-3 = 800 MHz (MPLL) +* +* DOUTmmc1 = MOUTmmc1 / (ratio + 1) = 100 (7) +* sclk_mmc1 = DOUTmmc1 / (ratio + 1) = 50 (1) +* DOUTmmc0 = MOUTmmc0 / (ratio + 1) = 100 (7) +* sclk_mmc0 = DOUTmmc0 / (ratio + 1) = 50 (1) +*/ + set =MMC0_RATIO (7 ) |MMC0_PRE_RATIO (1 ) |MMC1_RATIO (7 ) | +MMC1_PRE_RATIO (1 ); + +clrsetbits_le32 (&clk->div_fsys1, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys1) &DIV_STAT_FSYS1_CHANGING ) +continue ; + +/* CLK_DIV_FSYS2 */ + clr =MMC2_RATIO (0xf ) |MMC2_PRE_RATIO (0xff ) |MMC3_RATIO (0xf ) | +MMC3_PRE_RATIO (0xff ); +/* +* For MOUTmmc0-3 = 800 MHz (MPLL) +* +* DOUTmmc3 = MOUTmmc3 / (ratio + 1) = 100 (7) +* sclk_mmc3 = DOUTmmc3 / (ratio + 1) = 50 (1) +* DOUTmmc2 = MOUTmmc2 / (ratio + 1) = 100 (7) +* sclk_mmc2 = DOUTmmc2 / (ratio + 1) = 50 (1) +*/ + set =MMC2_RATIO (7 ) |MMC2_PRE_RATIO (1 ) |MMC3_RATIO (7 ) | +MMC3_PRE_RATIO (1 ); + +clrsetbits_le32 (&clk->div_fsys2, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys2) &DIV_STAT_FSYS2_CHANGING ) +continue ; + +/* CLK_DIV_FSYS3 */ + clr =MMC4_RATIO (0xf ) |MMC4_PRE_RATIO (0xff ); +/* +* For MOUTmmc4 = 800 MHz (MPLL) +* +* DOUTmmc4 = MOUTmmc4 / (ratio + 1) = 100 (7) +* sclk_mmc4 = DOUTmmc4 / (ratio + 1) = 100 (0) +*/ + set =MMC4_RATIO (7 ) |MMC4_PRE_RATIO (0 ); + +clrsetbits_le32 (&clk->div_fsys3, clr, set); + +/* Wait for divider ready status */ +while (readl (&clk->div_stat_fsys3) &DIV_STAT_FSYS3_CHANGING ) +continue ; + +return ; +} + +static void board_gpio_init (void ) +{ +/* Set GPA1 pin 1 to HI - enable XCL205 output */ +gpio_set_pull (EXYNOS4X12_GPIO_A11 ,S5P_GPIO_PULL_UP ); +gpio_set_drv (EXYNOS4X12_GPIO_A11 ,S5P_GPIO_DRV_4X ); +gpio_direction_output (EXYNOS4X12_GPIO_A11 ,1 ); + +gpio_cfg_pin (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_FUNC (0x1 )); +gpio_set_pull (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_PULL_NONE ); +gpio_set_drv (EXYNOS4X12_GPIO_K12 ,S5P_GPIO_DRV_4X ); + +/* Enable FAN (Odroid U3) */ +gpio_set_pull (EXYNOS4X12_GPIO_D00 ,S5P_GPIO_PULL_UP ); +gpio_set_drv (EXYNOS4X12_GPIO_D00 ,S5P_GPIO_DRV_4X ); +gpio_direction_output (EXYNOS4X12_GPIO_D00 ,1 ); +} + +static int pmic_init_max77686 (void ) +{ +struct pmic *p =pmic_get ("MAX77686_PMIC" ); + +if (pmic_probe (p))Quoted 9 lines
board/samsung/odroid/odroid.c line 389
Quoted 6 lines
board/samsung/odroid/odroid.c new file +6
-0+return -ENODEV ; + +/* Set LDO Voltage */ +max77686_set_ldo_voltage (p,20 ,1800000 );/* LDO20 eMMC */ +max77686_set_ldo_voltage (p,21 ,2800000 );/* LDO21 SD */ +max77686_set_ldo_voltage (p,22 ,2800000 );/* LDO22 eMMC */ LDO20/22 are used the eMMC? VDD/VDD-IO power?
Yes, those are the pull-up voltage sources for eMMC and SD.
Thank you,
PATCH v4 11/12 odroid: add odroid U3/X2 device tree description
In reply to Przemyslaw MarczakThis is a standard description for Odroid boards.
--- arch/arm/dts/Makefile | 3 +- arch/arm/dts/exynos4412-odroid.dts | 70 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 arch/arm/dts/exynos4412-odroid.dts
arch/arm/dts/Makefile +2 -1
@@ -1,7 +1,8 @@ dtb-$(CONFIG_EXYNOS4) += exynos4210-origen.dtb \ exynos4210-universal_c210.dtb \ exynos4210-trats.dtb \ - exynos4412-trats2.dtb + exynos4412-trats2.dtb \ + exynos4412-odroid.dtb dtb-$(CONFIG_EXYNOS5) += exynos5250-arndale.dtb \ exynos5250-snow.dtb \
arch/arm/dts/exynos4412-odroid.dts new file +70 -0
70 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v4 12/12 odroid: add odroid_config
In reply to Przemyslaw MarczakThis config is valid for two devices:
- Odroid X2,
- Odroid U3.
---
Changes v2:
- odroid config: add CONFIG_DFU_ALT_BOOTLOADER
- odroid config: change name of CONFIG_DFU_BOOT_ALT_* to CONFIG_DFU_ALT_BOOT_*
Changes v3:
- odroid.h: update CONFIG_DFU_ALT_BOOT_** with required bootloader binaries
- odroid.h: add multi image support (CONFIG_FIT)
- odroid.h: add "autoboot" script for multi boot options
- odroid.h: change env name: dfu_alt_info -> dfu_alt_system
- odroid.h: update config name: CONFIG_SET_DFU_ALT_INFO
- odroid.h: reduce boot delay to 0 seconds
- update: doc/README.odroid
--- boards.cfg | 1 + doc/README.odroid | 144 +++++++++++++++++++++++++++++ include/configs/odroid.h | 232 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 377 insertions(+) create mode 100644 doc/README.odroid create mode 100644 include/configs/odroid.h
boards.cfg +1 -0
@@ -297,6 +297,7 @@ Active arm armv7 exynos samsung smdk5420 Active arm armv7 exynos samsung smdkv310 smdkv310 - Chander Kashyap <[email protected]> Active arm armv7 exynos samsung trats trats - Lukasz Majewski <[email protected]> Active arm armv7 exynos samsung trats2 trats2 - Piotr Wilczek <[email protected]> +Active arm armv7 exynos samsung odroid odroid - Przemyslaw Marczak <[email protected]> Active arm armv7 exynos samsung universal_c210 s5pc210_universal - Przemyslaw Marczak <[email protected]> Active arm armv7 highbank - highbank highbank - Rob Herring <[email protected]> Active arm armv7 keystone ti k2hk_evm k2hk_evm - Vitaly Andrianov <[email protected]>
doc/README.odroid new file +144 -0
144 lines not on this page · raw message
include/configs/odroid.h new file +232 -0
232 lines not on this page · raw message
Signature · 1 line
1.9.1