1323d1f9dSMasahiro Yamada /* 2323d1f9dSMasahiro Yamada * Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.com> 3323d1f9dSMasahiro Yamada * 4323d1f9dSMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 5323d1f9dSMasahiro Yamada */ 6323d1f9dSMasahiro Yamada 7323d1f9dSMasahiro Yamada #include <libfdt.h> 8323d1f9dSMasahiro Yamada #include <linux/kernel.h> 9323d1f9dSMasahiro Yamada #include <mach/init.h> 10323d1f9dSMasahiro Yamada 11323d1f9dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_SLD3) 12323d1f9dSMasahiro Yamada static const struct uniphier_board_data ph1_sld3_data = { 13323d1f9dSMasahiro Yamada .dram_ch0_base = 0x80000000, 14323d1f9dSMasahiro Yamada .dram_ch0_size = 0x20000000, 15323d1f9dSMasahiro Yamada .dram_ch0_width = 32, 16323d1f9dSMasahiro Yamada .dram_ch1_base = 0xc0000000, 17323d1f9dSMasahiro Yamada .dram_ch1_size = 0x20000000, 18323d1f9dSMasahiro Yamada .dram_ch1_width = 16, 19323d1f9dSMasahiro Yamada .dram_ch2_base = 0xc0000000, 20323d1f9dSMasahiro Yamada .dram_ch2_size = 0x10000000, 21323d1f9dSMasahiro Yamada .dram_ch2_width = 16, 22323d1f9dSMasahiro Yamada .dram_freq = 1600, 23323d1f9dSMasahiro Yamada }; 24323d1f9dSMasahiro Yamada #endif 25323d1f9dSMasahiro Yamada 26323d1f9dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_LD4) 27323d1f9dSMasahiro Yamada static const struct uniphier_board_data ph1_ld4_data = { 28323d1f9dSMasahiro Yamada .dram_ch0_base = 0x80000000, 29323d1f9dSMasahiro Yamada .dram_ch0_size = 0x10000000, 30323d1f9dSMasahiro Yamada .dram_ch0_width = 16, 31323d1f9dSMasahiro Yamada .dram_ch1_base = 0x90000000, 32323d1f9dSMasahiro Yamada .dram_ch1_size = 0x10000000, 33323d1f9dSMasahiro Yamada .dram_ch1_width = 16, 34323d1f9dSMasahiro Yamada .dram_freq = 1600, 35323d1f9dSMasahiro Yamada }; 36323d1f9dSMasahiro Yamada #endif 37323d1f9dSMasahiro Yamada 38323d1f9dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_PRO4) 39323d1f9dSMasahiro Yamada static const struct uniphier_board_data ph1_pro4_data = { 40323d1f9dSMasahiro Yamada .dram_ch0_base = 0x80000000, 41323d1f9dSMasahiro Yamada .dram_ch0_size = 0x20000000, 42323d1f9dSMasahiro Yamada .dram_ch0_width = 32, 43323d1f9dSMasahiro Yamada .dram_ch1_base = 0xa0000000, 44323d1f9dSMasahiro Yamada .dram_ch1_size = 0x20000000, 45323d1f9dSMasahiro Yamada .dram_ch1_width = 32, 46323d1f9dSMasahiro Yamada .dram_freq = 1600, 47323d1f9dSMasahiro Yamada }; 48323d1f9dSMasahiro Yamada #endif 49323d1f9dSMasahiro Yamada 50323d1f9dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_SLD8) 51323d1f9dSMasahiro Yamada static const struct uniphier_board_data ph1_sld8_data = { 52323d1f9dSMasahiro Yamada .dram_ch0_base = 0x80000000, 53323d1f9dSMasahiro Yamada .dram_ch0_size = 0x10000000, 54323d1f9dSMasahiro Yamada .dram_ch0_width = 16, 55323d1f9dSMasahiro Yamada .dram_ch1_base = 0x90000000, 56323d1f9dSMasahiro Yamada .dram_ch1_size = 0x10000000, 57323d1f9dSMasahiro Yamada .dram_ch1_width = 16, 58323d1f9dSMasahiro Yamada .dram_freq = 1333, 59323d1f9dSMasahiro Yamada }; 60323d1f9dSMasahiro Yamada #endif 61323d1f9dSMasahiro Yamada 62*28f40d4aSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_PRO5) 63*28f40d4aSMasahiro Yamada static const struct uniphier_board_data ph1_pro5_data = { 64*28f40d4aSMasahiro Yamada .dram_ch0_base = 0x80000000, 65*28f40d4aSMasahiro Yamada .dram_ch0_size = 0x20000000, 66*28f40d4aSMasahiro Yamada .dram_ch0_width = 32, 67*28f40d4aSMasahiro Yamada .dram_ch1_base = 0xa0000000, 68*28f40d4aSMasahiro Yamada .dram_ch1_size = 0x20000000, 69*28f40d4aSMasahiro Yamada .dram_ch1_width = 32, 70*28f40d4aSMasahiro Yamada .dram_freq = 1866, 71*28f40d4aSMasahiro Yamada }; 72*28f40d4aSMasahiro Yamada #endif 73*28f40d4aSMasahiro Yamada 74323d1f9dSMasahiro Yamada struct uniphier_board_id { 75323d1f9dSMasahiro Yamada const char *compatible; 76323d1f9dSMasahiro Yamada const struct uniphier_board_data *param; 77323d1f9dSMasahiro Yamada }; 78323d1f9dSMasahiro Yamada 79323d1f9dSMasahiro Yamada static const struct uniphier_board_id uniphier_boards[] = { 80323d1f9dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_SLD3) 81323d1f9dSMasahiro Yamada { "socionext,ph1-sld3", &ph1_sld3_data, }, 82323d1f9dSMasahiro Yamada #endif 83323d1f9dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_LD4) 84323d1f9dSMasahiro Yamada { "socionext,ph1-ld4", &ph1_ld4_data, }, 85323d1f9dSMasahiro Yamada #endif 86323d1f9dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_PRO4) 87323d1f9dSMasahiro Yamada { "socionext,ph1-pro4", &ph1_pro4_data, }, 88323d1f9dSMasahiro Yamada #endif 89323d1f9dSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_SLD8) 90323d1f9dSMasahiro Yamada { "socionext,ph1-sld8", &ph1_sld8_data, }, 91323d1f9dSMasahiro Yamada #endif 92*28f40d4aSMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PH1_PRO5) 93*28f40d4aSMasahiro Yamada { "socionext,ph1-pro5", &ph1_pro5_data, }, 94*28f40d4aSMasahiro Yamada #endif 95323d1f9dSMasahiro Yamada }; 96323d1f9dSMasahiro Yamada 97323d1f9dSMasahiro Yamada const struct uniphier_board_data *uniphier_get_board_param(const void *fdt) 98323d1f9dSMasahiro Yamada { 99323d1f9dSMasahiro Yamada int i; 100323d1f9dSMasahiro Yamada 101323d1f9dSMasahiro Yamada for (i = 0; i < ARRAY_SIZE(uniphier_boards); i++) { 102323d1f9dSMasahiro Yamada if (!fdt_node_check_compatible(fdt, 0, 103323d1f9dSMasahiro Yamada uniphier_boards[i].compatible)) 104323d1f9dSMasahiro Yamada return uniphier_boards[i].param; 105323d1f9dSMasahiro Yamada } 106323d1f9dSMasahiro Yamada 107323d1f9dSMasahiro Yamada return NULL; 108323d1f9dSMasahiro Yamada } 109