@@ -169,32 +169,18 @@ static const struct uniphier_initdata uniphier_initdata[] = {
},
#endif
};
-
-static const struct uniphier_initdata *uniphier_get_initdata(
- unsigned int soc_id)
-{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(uniphier_initdata); i++) {
- if (uniphier_initdata[i].soc_id == soc_id)
- return &uniphier_initdata[i];
- }
-
- return NULL;
-}
+UNIPHIER_DEFINE_SOCDATA_FUNC(uniphier_get_initdata, uniphier_initdata)
int board_init(void)
{
const struct uniphier_initdata *initdata;
- unsigned int soc_id;
int ret;
led_puts("U0");
- soc_id = uniphier_get_soc_id();
- initdata = uniphier_get_initdata(soc_id);
+ initdata = uniphier_get_initdata();
if (!initdata) {
- pr_err("unsupported board\n");
+ pr_err("unsupported SoC\n");
return -EINVAL;
}
@@ -7,6 +7,9 @@
#ifndef __UNIPHIER_SOC_INFO_H__
#define __UNIPHIER_SOC_INFO_H__
+#include <linux/kernel.h>
+#include <linux/stddef.h>
+
#define UNIPHIER_SLD3_ID 0x25
#define UNIPHIER_LD4_ID 0x26
#define UNIPHIER_PRO4_ID 0x28
@@ -21,4 +24,19 @@ unsigned int uniphier_get_soc_id(void);
unsigned int uniphier_get_soc_model(void);
unsigned int uniphier_get_soc_revision(void);
+#define UNIPHIER_DEFINE_SOCDATA_FUNC(__func_name, __table) \
+static typeof(&__table[0]) __func_name(void) \
+{ \
+ unsigned int soc_id; \
+ int i; \
+ \
+ soc_id = uniphier_get_soc_id(); \
+ for (i = 0; i < ARRAY_SIZE(__table); i++) { \
+ if (__table[i].soc_id == soc_id) \
+ return &__table[i]; \
+ } \
+ \
+ return NULL; \
+}
+
#endif /* __UNIPHIER_SOC_INFO_H__ */
@@ -118,25 +118,12 @@ static const struct uniphier_spl_initdata uniphier_spl_initdata[] = {
},
#endif
};
-
-static const struct uniphier_spl_initdata *uniphier_get_spl_initdata(
- unsigned int soc_id)
-{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(uniphier_spl_initdata); i++) {
- if (uniphier_spl_initdata[i].soc_id == soc_id)
- return &uniphier_spl_initdata[i];
- }
-
- return NULL;
-}
+UNIPHIER_DEFINE_SOCDATA_FUNC(uniphier_get_spl_initdata, uniphier_spl_initdata)
void spl_board_init(void)
{
const struct uniphier_board_data *bd;
const struct uniphier_spl_initdata *initdata;
- unsigned int soc_id;
int ret;
#ifdef CONFIG_DEBUG_UART
@@ -147,8 +134,7 @@ void spl_board_init(void)
if (!bd)
hang();
- soc_id = uniphier_get_soc_id();
- initdata = uniphier_get_spl_initdata(soc_id);
+ initdata = uniphier_get_spl_initdata();
if (!initdata)
hang();
There are similar functions that look up SoC data by the SoC ID. The new macro UNIPHIER_DEFINE_SOCDATA_FUNC will be helpful to avoid the code duplication. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- arch/arm/mach-uniphier/board_init.c | 20 +++----------------- arch/arm/mach-uniphier/soc-info.h | 18 ++++++++++++++++++ arch/arm/mach-uniphier/spl_board_init.c | 18 ++---------------- 3 files changed, 23 insertions(+), 33 deletions(-) -- 2.7.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot