ARM: uniphier: rework spl_boot_device() and related code
The current implementation has ugly switch statements here and there, and duplicates similar code. Rework it using table lookups for SoC data and reduce code duplication. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
This commit is contained in:
parent
81c847bf38
commit
784548efb2
@ -25,7 +25,7 @@ obj-$(CONFIG_MMC) += mmc-first-dev.o
|
||||
endif
|
||||
|
||||
obj-y += soc-info.o
|
||||
obj-y += boot-mode/
|
||||
obj-y += boot-device/
|
||||
obj-y += clk/
|
||||
obj-y += dram/
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <../drivers/mtd/nand/denali.h>
|
||||
|
||||
#include "boot-mode/boot-device.h"
|
||||
#include "init.h"
|
||||
|
||||
static void nand_denali_wp_disable(void)
|
||||
{
|
||||
@ -62,7 +62,7 @@ int board_late_init(void)
|
||||
{
|
||||
puts("MODE: ");
|
||||
|
||||
switch (spl_boot_device_raw()) {
|
||||
switch (uniphier_boot_device_raw()) {
|
||||
case BOOT_DEVICE_MMC1:
|
||||
printf("eMMC Boot\n");
|
||||
setenv("bootmode", "emmcboot");
|
||||
|
19
arch/arm/mach-uniphier/boot-device/Makefile
Normal file
19
arch/arm/mach-uniphier/boot-device/Makefile
Normal file
@ -0,0 +1,19 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += boot-device.o
|
||||
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_SLD3) += boot-device-sld3.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_LD4) += boot-device-ld4.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_PRO4) += boot-device-ld4.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_SLD8) += boot-device-ld4.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_PRO5) += boot-device-pro5.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_PXS2) += boot-device-pxs2.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_LD6B) += boot-device-pxs2.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_LD11) += boot-device-ld11.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_LD20) += boot-device-ld11.o
|
||||
|
||||
ifdef CONFIG_SPL_BUILD
|
||||
obj-$(CONFIG_SPL_BOARD_LOAD_IMAGE) += spl_board.o
|
||||
endif
|
@ -8,12 +8,11 @@
|
||||
#include <common.h>
|
||||
#include <spl.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "../sg-regs.h"
|
||||
#include "../soc-info.h"
|
||||
#include "boot-device.h"
|
||||
|
||||
static struct boot_device_info boot_device_table[] = {
|
||||
const struct uniphier_boot_device uniphier_ld11_boot_device_table[] = {
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 8, EraseSize 128KB, Addr 4)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 16, EraseSize 128KB, Addr 4)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 8, EraseSize 128KB, Addr 5)"},
|
||||
@ -48,48 +47,23 @@ static struct boot_device_info boot_device_table[] = {
|
||||
{BOOT_DEVICE_NOR, "NOR (XECS1)"},
|
||||
};
|
||||
|
||||
static int get_boot_mode_sel(void)
|
||||
const unsigned uniphier_ld11_boot_device_count =
|
||||
ARRAY_SIZE(uniphier_ld11_boot_device_table);
|
||||
|
||||
int uniphier_ld11_boot_device_is_usb(u32 pinmon)
|
||||
{
|
||||
return (readl(SG_PINMON0) >> 1) & 0x1f;
|
||||
return !!(~pinmon & 0x00000080);
|
||||
}
|
||||
|
||||
u32 uniphier_ld20_boot_device(void)
|
||||
int uniphier_ld20_boot_device_is_usb(u32 pinmon)
|
||||
{
|
||||
int boot_mode;
|
||||
u32 usb_boot_mask;
|
||||
|
||||
switch (uniphier_get_soc_id()) {
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD11)
|
||||
case UNIPHIER_LD11_ID:
|
||||
usb_boot_mask = 0x00000080;
|
||||
break;
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD20)
|
||||
case UNIPHIER_LD20_ID:
|
||||
usb_boot_mask = 0x00000780;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (~readl(SG_PINMON0) & usb_boot_mask)
|
||||
return BOOT_DEVICE_USB;
|
||||
|
||||
boot_mode = get_boot_mode_sel();
|
||||
|
||||
return boot_device_table[boot_mode].type;
|
||||
return !!(~pinmon & 0x00000780);
|
||||
}
|
||||
|
||||
void uniphier_ld20_boot_mode_show(void)
|
||||
unsigned int uniphier_ld11_boot_device_fixup(unsigned int mode)
|
||||
{
|
||||
int mode_sel, i;
|
||||
if (mode == BOOT_DEVICE_MMC1 || mode == BOOT_DEVICE_USB)
|
||||
mode = BOOT_DEVICE_BOARD;
|
||||
|
||||
mode_sel = get_boot_mode_sel();
|
||||
|
||||
puts("Boot Mode Pin:\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(boot_device_table); i++)
|
||||
printf(" %c %02x %s\n", i == mode_sel ? '*' : ' ', i,
|
||||
boot_device_table[i].info);
|
||||
return mode;
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
/*
|
||||
* Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
* Copyright (C) 2014 Panasonic Corporation
|
||||
* Copyright (C) 2015-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@ -7,11 +9,11 @@
|
||||
#include <common.h>
|
||||
#include <spl.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "../sg-regs.h"
|
||||
#include "boot-device.h"
|
||||
|
||||
struct boot_device_info boot_device_table[] = {
|
||||
const struct uniphier_boot_device uniphier_ld4_boot_device_table[] = {
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 8, EraseSize 128KB, Addr 4)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 8, EraseSize 128KB, Addr 5)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 16, EraseSize 128KB, Addr 5)"},
|
||||
@ -46,29 +48,5 @@ struct boot_device_info boot_device_table[] = {
|
||||
{BOOT_DEVICE_NOR, "NOR (XECS0)"},
|
||||
};
|
||||
|
||||
static int get_boot_mode_sel(void)
|
||||
{
|
||||
return (readl(SG_PINMON0) >> 1) & 0x1f;
|
||||
}
|
||||
|
||||
u32 uniphier_ld4_boot_device(void)
|
||||
{
|
||||
int boot_mode;
|
||||
|
||||
boot_mode = get_boot_mode_sel();
|
||||
|
||||
return boot_device_table[boot_mode].type;
|
||||
}
|
||||
|
||||
void uniphier_ld4_boot_mode_show(void)
|
||||
{
|
||||
int mode_sel, i;
|
||||
|
||||
mode_sel = get_boot_mode_sel();
|
||||
|
||||
puts("Boot Mode Pin:\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(boot_device_table); i++)
|
||||
printf(" %c %02x %s\n", i == mode_sel ? '*' : ' ', i,
|
||||
boot_device_table[i].info);
|
||||
}
|
||||
const unsigned uniphier_ld4_boot_device_count =
|
||||
ARRAY_SIZE(uniphier_ld4_boot_device_table);
|
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
* Copyright (C) 2015-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@ -7,11 +8,11 @@
|
||||
#include <common.h>
|
||||
#include <spl.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "../sg-regs.h"
|
||||
#include "boot-device.h"
|
||||
|
||||
static struct boot_device_info boot_device_table[] = {
|
||||
const struct uniphier_boot_device uniphier_pro5_boot_device_table[] = {
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 1, ECC 8, EraseSize 128KB, Addr 5)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 1, ECC 16, EraseSize 128KB, Addr 5)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 1, ECC 8, EraseSize 256KB, Addr 5)"},
|
||||
@ -44,32 +45,7 @@ static struct boot_device_info boot_device_table[] = {
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 16, EraseSize 128KB, Addr 5)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 8, EraseSize 256KB, Addr 5)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 16, EraseSize 256KB, Addr 5)"},
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int get_boot_mode_sel(void)
|
||||
{
|
||||
return (readl(SG_PINMON0) >> 1) & 0x1f;
|
||||
}
|
||||
|
||||
u32 uniphier_pro5_boot_device(void)
|
||||
{
|
||||
int boot_mode;
|
||||
|
||||
boot_mode = get_boot_mode_sel();
|
||||
|
||||
return boot_device_table[boot_mode].type;
|
||||
}
|
||||
|
||||
void uniphier_pro5_boot_mode_show(void)
|
||||
{
|
||||
int mode_sel, i;
|
||||
|
||||
mode_sel = get_boot_mode_sel();
|
||||
|
||||
puts("Boot Mode Pin:\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(boot_device_table); i++)
|
||||
printf(" %c %02x %s\n", i == mode_sel ? '*' : ' ', i,
|
||||
boot_device_table[i].info);
|
||||
}
|
||||
const unsigned uniphier_pro5_boot_device_count =
|
||||
ARRAY_SIZE(uniphier_pro5_boot_device_table);
|
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
* Copyright (C) 2015-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@ -7,11 +8,11 @@
|
||||
#include <common.h>
|
||||
#include <spl.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "../sg-regs.h"
|
||||
#include "boot-device.h"
|
||||
|
||||
static struct boot_device_info boot_device_table[] = {
|
||||
const struct uniphier_boot_device uniphier_pxs2_boot_device_table[] = {
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 8, EraseSize 128KB, Addr 4)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 8, EraseSize 128KB, Addr 5)"},
|
||||
{BOOT_DEVICE_NAND, "NAND (Mirror 8, ECC 16, EraseSize 128KB, Addr 5)"},
|
||||
@ -46,32 +47,18 @@ static struct boot_device_info boot_device_table[] = {
|
||||
{BOOT_DEVICE_NONE, "Reserved"},
|
||||
};
|
||||
|
||||
static int get_boot_mode_sel(void)
|
||||
const unsigned uniphier_pxs2_boot_device_count =
|
||||
ARRAY_SIZE(uniphier_pxs2_boot_device_table);
|
||||
|
||||
int uniphier_pxs2_boot_device_is_usb(u32 pinmon)
|
||||
{
|
||||
return (readl(SG_PINMON0) >> 1) & 0x1f;
|
||||
return !!(pinmon & 0x00000040);
|
||||
}
|
||||
|
||||
u32 uniphier_pxs2_boot_device(void)
|
||||
unsigned int uniphier_pxs2_boot_device_fixup(unsigned int mode)
|
||||
{
|
||||
int boot_mode;
|
||||
if (mode == BOOT_DEVICE_USB)
|
||||
return BOOT_DEVICE_NOR;
|
||||
|
||||
if (readl(SG_PINMON0) & BIT(6))
|
||||
return BOOT_DEVICE_USB;
|
||||
|
||||
boot_mode = get_boot_mode_sel();
|
||||
|
||||
return boot_device_table[boot_mode].type;
|
||||
}
|
||||
|
||||
void uniphier_pxs2_boot_mode_show(void)
|
||||
{
|
||||
int mode_sel, i;
|
||||
|
||||
mode_sel = get_boot_mode_sel();
|
||||
|
||||
puts("Boot Mode Pin:\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(boot_device_table); i++)
|
||||
printf(" %c %02x %s\n", i == mode_sel ? '*' : ' ', i,
|
||||
boot_device_table[i].info);
|
||||
return mode;
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
/*
|
||||
* Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
* Copyright (C) 2014 Panasonic Corporation
|
||||
* Copyright (C) 2015-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
@ -7,11 +9,11 @@
|
||||
#include <common.h>
|
||||
#include <spl.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "../sg-regs.h"
|
||||
#include "boot-device.h"
|
||||
|
||||
static struct boot_device_info boot_device_table[] = {
|
||||
const struct uniphier_boot_device uniphier_sld3_boot_device_table[] = {
|
||||
{BOOT_DEVICE_NOR, "NOR (XECS0)"},
|
||||
{BOOT_DEVICE_NONE, "External Master"},
|
||||
{BOOT_DEVICE_NONE, "Reserved"},
|
||||
@ -78,29 +80,5 @@ static struct boot_device_info boot_device_table[] = {
|
||||
{BOOT_DEVICE_NONE, "Reserved"},
|
||||
};
|
||||
|
||||
static int get_boot_mode_sel(void)
|
||||
{
|
||||
return readl(SG_PINMON0) & 0x3f;
|
||||
}
|
||||
|
||||
u32 uniphier_sld3_boot_device(void)
|
||||
{
|
||||
int boot_mode;
|
||||
|
||||
boot_mode = get_boot_mode_sel();
|
||||
|
||||
return boot_device_table[boot_mode].type;
|
||||
}
|
||||
|
||||
void uniphier_sld3_boot_mode_show(void)
|
||||
{
|
||||
int mode_sel, i;
|
||||
|
||||
mode_sel = get_boot_mode_sel();
|
||||
|
||||
puts("Boot Mode Pin:\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(boot_device_table); i++)
|
||||
printf(" %c %02x %s\n", i == mode_sel ? '*' : ' ', i,
|
||||
boot_device_table[i].info);
|
||||
}
|
||||
const unsigned uniphier_sld3_boot_device_count =
|
||||
ARRAY_SIZE(uniphier_sld3_boot_device_table);
|
206
arch/arm/mach-uniphier/boot-device/boot-device.c
Normal file
206
arch/arm/mach-uniphier/boot-device/boot-device.c
Normal file
@ -0,0 +1,206 @@
|
||||
/*
|
||||
* Copyright (C) 2015-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <spl.h>
|
||||
#include <linux/log2.h>
|
||||
|
||||
#include "../init.h"
|
||||
#include "../sbc/sbc-regs.h"
|
||||
#include "../sg-regs.h"
|
||||
#include "../soc-info.h"
|
||||
#include "boot-device.h"
|
||||
|
||||
struct uniphier_boot_device_info {
|
||||
unsigned int soc_id;
|
||||
unsigned int boot_device_sel_shift;
|
||||
const struct uniphier_boot_device *boot_device_table;
|
||||
const unsigned int *boot_device_count;
|
||||
int (*boot_device_is_usb)(u32 pinmon);
|
||||
unsigned int (*boot_device_fixup)(unsigned int mode);
|
||||
};
|
||||
|
||||
static const struct uniphier_boot_device_info uniphier_boot_device_info[] = {
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_SLD3)
|
||||
{
|
||||
.soc_id = UNIPHIER_SLD3_ID,
|
||||
.boot_device_sel_shift = 0,
|
||||
.boot_device_table = uniphier_sld3_boot_device_table,
|
||||
.boot_device_count = &uniphier_sld3_boot_device_count,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD4)
|
||||
{
|
||||
.soc_id = UNIPHIER_LD4_ID,
|
||||
.boot_device_sel_shift = 1,
|
||||
.boot_device_table = uniphier_ld4_boot_device_table,
|
||||
.boot_device_count = &uniphier_ld4_boot_device_count,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_PRO4)
|
||||
{
|
||||
.soc_id = UNIPHIER_PRO4_ID,
|
||||
.boot_device_sel_shift = 1,
|
||||
.boot_device_table = uniphier_ld4_boot_device_table,
|
||||
.boot_device_count = &uniphier_ld4_boot_device_count,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_SLD8)
|
||||
{
|
||||
.soc_id = UNIPHIER_SLD8_ID,
|
||||
.boot_device_sel_shift = 1,
|
||||
.boot_device_table = uniphier_ld4_boot_device_table,
|
||||
.boot_device_count = &uniphier_ld4_boot_device_count,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_PRO5)
|
||||
{
|
||||
.soc_id = UNIPHIER_PRO5_ID,
|
||||
.boot_device_sel_shift = 1,
|
||||
.boot_device_table = uniphier_pro5_boot_device_table,
|
||||
.boot_device_count = &uniphier_pro5_boot_device_count,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_PXS2)
|
||||
{
|
||||
.soc_id = UNIPHIER_PXS2_ID,
|
||||
.boot_device_sel_shift = 1,
|
||||
.boot_device_table = uniphier_pxs2_boot_device_table,
|
||||
.boot_device_count = &uniphier_pxs2_boot_device_count,
|
||||
.boot_device_is_usb = uniphier_pxs2_boot_device_is_usb,
|
||||
.boot_device_fixup = uniphier_pxs2_boot_device_fixup,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD6B)
|
||||
{
|
||||
.soc_id = UNIPHIER_LD6B_ID,
|
||||
.boot_device_sel_shift = 1,
|
||||
.boot_device_table = uniphier_pxs2_boot_device_table,
|
||||
.boot_device_count = &uniphier_pxs2_boot_device_count,
|
||||
.boot_device_is_usb = uniphier_pxs2_boot_device_is_usb,
|
||||
.boot_device_fixup = uniphier_pxs2_boot_device_fixup,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD11)
|
||||
{
|
||||
.soc_id = UNIPHIER_LD11_ID,
|
||||
.boot_device_sel_shift = 1,
|
||||
.boot_device_table = uniphier_ld11_boot_device_table,
|
||||
.boot_device_count = &uniphier_ld11_boot_device_count,
|
||||
.boot_device_is_usb = uniphier_ld11_boot_device_is_usb,
|
||||
.boot_device_fixup = uniphier_ld11_boot_device_fixup,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD20)
|
||||
{
|
||||
.soc_id = UNIPHIER_LD20_ID,
|
||||
.boot_device_sel_shift = 1,
|
||||
.boot_device_table = uniphier_ld11_boot_device_table,
|
||||
.boot_device_count = &uniphier_ld11_boot_device_count,
|
||||
.boot_device_is_usb = uniphier_ld20_boot_device_is_usb,
|
||||
.boot_device_fixup = uniphier_ld11_boot_device_fixup,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
UNIPHIER_DEFINE_SOCDATA_FUNC(uniphier_get_boot_device_info,
|
||||
uniphier_boot_device_info)
|
||||
|
||||
static unsigned int __uniphier_boot_device_raw(
|
||||
const struct uniphier_boot_device_info *info)
|
||||
{
|
||||
u32 pinmon;
|
||||
unsigned int boot_sel;
|
||||
|
||||
if (boot_is_swapped())
|
||||
return BOOT_DEVICE_NOR;
|
||||
|
||||
pinmon = readl(SG_PINMON0);
|
||||
|
||||
if (info->boot_device_is_usb && info->boot_device_is_usb(pinmon))
|
||||
return BOOT_DEVICE_USB;
|
||||
|
||||
boot_sel = pinmon >> info->boot_device_sel_shift;
|
||||
|
||||
BUG_ON(!is_power_of_2(*info->boot_device_count));
|
||||
boot_sel &= *info->boot_device_count - 1;
|
||||
|
||||
return info->boot_device_table[boot_sel].boot_device;
|
||||
}
|
||||
|
||||
unsigned int uniphier_boot_device_raw(void)
|
||||
{
|
||||
const struct uniphier_boot_device_info *info;
|
||||
|
||||
info = uniphier_get_boot_device_info();
|
||||
if (!info) {
|
||||
pr_err("unsupported SoC\n");
|
||||
return BOOT_DEVICE_NONE;
|
||||
}
|
||||
|
||||
return __uniphier_boot_device_raw(info);
|
||||
}
|
||||
|
||||
u32 spl_boot_device(void)
|
||||
{
|
||||
const struct uniphier_boot_device_info *info;
|
||||
u32 raw_mode;
|
||||
|
||||
info = uniphier_get_boot_device_info();
|
||||
if (!info) {
|
||||
pr_err("unsupported SoC\n");
|
||||
return BOOT_DEVICE_NONE;
|
||||
}
|
||||
|
||||
raw_mode = __uniphier_boot_device_raw(info);
|
||||
|
||||
return info->boot_device_fixup ?
|
||||
info->boot_device_fixup(raw_mode) : raw_mode;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
|
||||
static int do_pinmon(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
const struct uniphier_boot_device_info *info;
|
||||
u32 pinmon;
|
||||
unsigned int boot_device_count, boot_sel;
|
||||
int i;
|
||||
|
||||
info = uniphier_get_boot_device_info();
|
||||
if (!info) {
|
||||
pr_err("unsupported SoC\n");
|
||||
return CMD_RET_FAILURE;
|
||||
}
|
||||
|
||||
printf("Boot Swap: %s\n\n", boot_is_swapped() ? "ON" : "OFF");
|
||||
|
||||
pinmon = readl(SG_PINMON0);
|
||||
|
||||
if (info->boot_device_is_usb)
|
||||
printf("USB Boot: %s\n\n",
|
||||
info->boot_device_is_usb(pinmon) ? "ON" : "OFF");
|
||||
|
||||
boot_device_count = *info->boot_device_count;
|
||||
|
||||
boot_sel = pinmon >> info->boot_device_sel_shift;
|
||||
boot_sel &= boot_device_count - 1;
|
||||
|
||||
printf("Boot Mode Sel:\n");
|
||||
for (i = 0; i < boot_device_count; i++)
|
||||
printf(" %c %02x %s\n", i == boot_sel ? '*' : ' ', i,
|
||||
info->boot_device_table[i].desc);
|
||||
|
||||
return CMD_RET_SUCCESS;
|
||||
}
|
||||
|
||||
U_BOOT_CMD(
|
||||
pinmon, 1, 1, do_pinmon,
|
||||
"pin monitor",
|
||||
""
|
||||
);
|
||||
|
||||
#endif /* !CONFIG_SPL_BUILD */
|
35
arch/arm/mach-uniphier/boot-device/boot-device.h
Normal file
35
arch/arm/mach-uniphier/boot-device/boot-device.h
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef _UNIPHIER_BOOT_DEVICE_H_
|
||||
#define _UNIPHIER_BOOT_DEVICE_H_
|
||||
|
||||
struct uniphier_boot_device {
|
||||
unsigned int boot_device;
|
||||
const char *desc;
|
||||
};
|
||||
|
||||
extern const struct uniphier_boot_device uniphier_sld3_boot_device_table[];
|
||||
extern const struct uniphier_boot_device uniphier_ld4_boot_device_table[];
|
||||
extern const struct uniphier_boot_device uniphier_pro5_boot_device_table[];
|
||||
extern const struct uniphier_boot_device uniphier_pxs2_boot_device_table[];
|
||||
extern const struct uniphier_boot_device uniphier_ld11_boot_device_table[];
|
||||
|
||||
extern const unsigned int uniphier_sld3_boot_device_count;
|
||||
extern const unsigned int uniphier_ld4_boot_device_count;
|
||||
extern const unsigned int uniphier_pro5_boot_device_count;
|
||||
extern const unsigned int uniphier_pxs2_boot_device_count;
|
||||
extern const unsigned int uniphier_ld11_boot_device_count;
|
||||
|
||||
int uniphier_pxs2_boot_device_is_usb(u32 pinmon);
|
||||
int uniphier_ld11_boot_device_is_usb(u32 pinmon);
|
||||
int uniphier_ld20_boot_device_is_usb(u32 pinmon);
|
||||
|
||||
unsigned int uniphier_pxs2_boot_device_fixup(unsigned int mode);
|
||||
unsigned int uniphier_ld11_boot_device_fixup(unsigned int mode);
|
||||
|
||||
#endif /* _UNIPHIER_BOOT_DEVICE_H_ */
|
@ -1,21 +0,0 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += boot-mode.o
|
||||
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_SLD3) += boot-mode-sld3.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_LD4) += boot-mode-ld4.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_PRO4) += boot-mode-ld4.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_SLD8) += boot-mode-ld4.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_PRO5) += boot-mode-pro5.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_PXS2) += boot-mode-pxs2.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_LD6B) += boot-mode-pxs2.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_LD11) += boot-mode-ld20.o
|
||||
obj-$(CONFIG_ARCH_UNIPHIER_LD20) += boot-mode-ld20.o
|
||||
|
||||
ifdef CONFIG_SPL_BUILD
|
||||
obj-$(CONFIG_SPL_BOARD_LOAD_IMAGE) += spl_board.o
|
||||
else
|
||||
obj-$(CONFIG_CMD_PINMON) += cmd_pinmon.o
|
||||
endif
|
@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef _ASM_BOOT_DEVICE_H_
|
||||
#define _ASM_BOOT_DEVICE_H_
|
||||
|
||||
struct boot_device_info {
|
||||
u32 type;
|
||||
char *info;
|
||||
};
|
||||
|
||||
u32 uniphier_sld3_boot_device(void);
|
||||
u32 uniphier_ld4_boot_device(void);
|
||||
u32 uniphier_pro5_boot_device(void);
|
||||
u32 uniphier_pxs2_boot_device(void);
|
||||
u32 uniphier_ld20_boot_device(void);
|
||||
|
||||
void uniphier_sld3_boot_mode_show(void);
|
||||
void uniphier_ld4_boot_mode_show(void);
|
||||
void uniphier_pro5_boot_mode_show(void);
|
||||
void uniphier_pxs2_boot_mode_show(void);
|
||||
void uniphier_ld20_boot_mode_show(void);
|
||||
|
||||
u32 spl_boot_device_raw(void);
|
||||
|
||||
#endif /* _ASM_BOOT_DEVICE_H_ */
|
@ -1,78 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <mmc.h>
|
||||
#include <spl.h>
|
||||
#include <linux/errno.h>
|
||||
|
||||
#include "../sbc/sbc-regs.h"
|
||||
#include "../soc-info.h"
|
||||
#include "boot-device.h"
|
||||
|
||||
u32 spl_boot_device_raw(void)
|
||||
{
|
||||
if (boot_is_swapped())
|
||||
return BOOT_DEVICE_NOR;
|
||||
|
||||
switch (uniphier_get_soc_id()) {
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_SLD3)
|
||||
case UNIPHIER_SLD3_ID:
|
||||
return uniphier_sld3_boot_device();
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD4) || defined(CONFIG_ARCH_UNIPHIER_PRO4) || \
|
||||
defined(CONFIG_ARCH_UNIPHIER_SLD8)
|
||||
case UNIPHIER_LD4_ID:
|
||||
case UNIPHIER_PRO4_ID:
|
||||
case UNIPHIER_SLD8_ID:
|
||||
return uniphier_ld4_boot_device();
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_PRO5)
|
||||
case UNIPHIER_PRO5_ID:
|
||||
return uniphier_pro5_boot_device();
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_PXS2) || defined(CONFIG_ARCH_UNIPHIER_LD6B)
|
||||
case UNIPHIER_PXS2_ID:
|
||||
case UNIPHIER_LD6B_ID:
|
||||
return uniphier_pxs2_boot_device();
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD11) || defined(CONFIG_ARCH_UNIPHIER_LD20)
|
||||
case UNIPHIER_LD11_ID:
|
||||
case UNIPHIER_LD20_ID:
|
||||
return uniphier_ld20_boot_device();
|
||||
#endif
|
||||
default:
|
||||
return BOOT_DEVICE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
u32 spl_boot_device(void)
|
||||
{
|
||||
u32 mode;
|
||||
|
||||
mode = spl_boot_device_raw();
|
||||
|
||||
switch (uniphier_get_soc_id()) {
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_PXS2) || defined(CONFIG_ARCH_UNIPHIER_LD6B)
|
||||
case UNIPHIER_PXS2_ID:
|
||||
case UNIPHIER_LD6B_ID:
|
||||
if (mode == BOOT_DEVICE_USB)
|
||||
mode = BOOT_DEVICE_NOR;
|
||||
break;
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD11) || defined(CONFIG_ARCH_UNIPHIER_LD20)
|
||||
case UNIPHIER_LD11_ID:
|
||||
case UNIPHIER_LD20_ID:
|
||||
if (mode == BOOT_DEVICE_MMC1 || mode == BOOT_DEVICE_USB)
|
||||
mode = BOOT_DEVICE_BOARD;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return mode;
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2014-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
|
||||
#include "../sbc/sbc-regs.h"
|
||||
#include "../soc-info.h"
|
||||
#include "boot-device.h"
|
||||
|
||||
static int do_pinmon(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
printf("Boot Swap: %s\n\n", boot_is_swapped() ? "ON" : "OFF");
|
||||
|
||||
switch (uniphier_get_soc_id()) {
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_SLD3)
|
||||
case UNIPHIER_SLD3_ID:
|
||||
uniphier_sld3_boot_mode_show();
|
||||
break;
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD4) || defined(CONFIG_ARCH_UNIPHIER_PRO4) || \
|
||||
defined(CONFIG_ARCH_UNIPHIER_SLD8)
|
||||
case UNIPHIER_LD4_ID:
|
||||
case UNIPHIER_PRO4_ID:
|
||||
case UNIPHIER_SLD8_ID:
|
||||
uniphier_ld4_boot_mode_show();
|
||||
break;
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_PRO5)
|
||||
case UNIPHIER_PRO5_ID:
|
||||
uniphier_pro5_boot_mode_show();
|
||||
break;
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_PXS2) || defined(CONFIG_ARCH_UNIPHIER_LD6B)
|
||||
case UNIPHIER_PXS2_ID:
|
||||
case UNIPHIER_LD6B_ID:
|
||||
uniphier_pxs2_boot_mode_show();
|
||||
break;
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_UNIPHIER_LD11) || defined(CONFIG_ARCH_UNIPHIER_LD20)
|
||||
case UNIPHIER_LD11_ID:
|
||||
case UNIPHIER_LD20_ID:
|
||||
uniphier_ld20_boot_mode_show();
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U_BOOT_CMD(
|
||||
pinmon, 1, 1, do_pinmon,
|
||||
"pin monitor",
|
||||
""
|
||||
);
|
@ -9,7 +9,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include "../boot-mode/boot-device.h"
|
||||
#include "../init.h"
|
||||
#include "../sc64-regs.h"
|
||||
#include "../sg-regs.h"
|
||||
@ -18,7 +17,7 @@ void uniphier_ld11_clk_init(void)
|
||||
{
|
||||
/* if booted from a device other than USB, without stand-by MPU */
|
||||
if ((readl(SG_PINMON0) & BIT(27)) &&
|
||||
spl_boot_device_raw() != BOOT_DEVICE_USB) {
|
||||
uniphier_boot_device_raw() != BOOT_DEVICE_USB) {
|
||||
writel(1, SG_ETPHYPSHUT);
|
||||
writel(1, SG_ETPHYCNT);
|
||||
|
||||
|
@ -120,11 +120,14 @@ void uniphier_pro5_clk_init(void);
|
||||
void uniphier_pxs2_clk_init(void);
|
||||
void uniphier_ld11_clk_init(void);
|
||||
|
||||
unsigned int uniphier_boot_device_raw(void);
|
||||
int uniphier_pin_init(const char *pinconfig_name);
|
||||
void uniphier_smp_kick_all_cpus(void);
|
||||
void cci500_init(int nr_slaves);
|
||||
|
||||
#undef pr_warn
|
||||
#define pr_warn(fmt, args...) printf(fmt, ##args)
|
||||
#undef pr_err
|
||||
#define pr_err(fmt, args...) printf(fmt, ##args)
|
||||
|
||||
#endif /* __MACH_INIT_H */
|
||||
|
Loading…
Reference in New Issue
Block a user