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>master
parent
81c847bf38
commit
784548efb2
@ -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 |
@ -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 */ |
@ -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", |
||||
"" |
||||
); |
Loading…
Reference in new issue