162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Alchemy DB/PB1xxx board support. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <asm/prom.h> 762306a36Sopenharmony_ci#include <asm/mach-au1x00/au1000.h> 862306a36Sopenharmony_ci#include <asm/mach-db1x00/bcsr.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciint __init db1000_board_setup(void); 1162306a36Sopenharmony_ciint __init db1000_dev_setup(void); 1262306a36Sopenharmony_ciint __init db1500_pci_setup(void); 1362306a36Sopenharmony_ciint __init db1200_board_setup(void); 1462306a36Sopenharmony_ciint __init db1200_dev_setup(void); 1562306a36Sopenharmony_ciint __init db1300_board_setup(void); 1662306a36Sopenharmony_ciint __init db1300_dev_setup(void); 1762306a36Sopenharmony_ciint __init db1550_board_setup(void); 1862306a36Sopenharmony_ciint __init db1550_dev_setup(void); 1962306a36Sopenharmony_ciint __init db1550_pci_setup(int); 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistatic const char *board_type_str(void) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci switch (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) { 2462306a36Sopenharmony_ci case BCSR_WHOAMI_DB1000: 2562306a36Sopenharmony_ci return "DB1000"; 2662306a36Sopenharmony_ci case BCSR_WHOAMI_DB1500: 2762306a36Sopenharmony_ci return "DB1500"; 2862306a36Sopenharmony_ci case BCSR_WHOAMI_DB1100: 2962306a36Sopenharmony_ci return "DB1100"; 3062306a36Sopenharmony_ci case BCSR_WHOAMI_PB1500: 3162306a36Sopenharmony_ci case BCSR_WHOAMI_PB1500R2: 3262306a36Sopenharmony_ci return "PB1500"; 3362306a36Sopenharmony_ci case BCSR_WHOAMI_PB1100: 3462306a36Sopenharmony_ci return "PB1100"; 3562306a36Sopenharmony_ci case BCSR_WHOAMI_PB1200_DDR1: 3662306a36Sopenharmony_ci case BCSR_WHOAMI_PB1200_DDR2: 3762306a36Sopenharmony_ci return "PB1200"; 3862306a36Sopenharmony_ci case BCSR_WHOAMI_DB1200: 3962306a36Sopenharmony_ci return "DB1200"; 4062306a36Sopenharmony_ci case BCSR_WHOAMI_DB1300: 4162306a36Sopenharmony_ci return "DB1300"; 4262306a36Sopenharmony_ci case BCSR_WHOAMI_DB1550: 4362306a36Sopenharmony_ci return "DB1550"; 4462306a36Sopenharmony_ci case BCSR_WHOAMI_PB1550_SDR: 4562306a36Sopenharmony_ci case BCSR_WHOAMI_PB1550_DDR: 4662306a36Sopenharmony_ci return "PB1550"; 4762306a36Sopenharmony_ci default: 4862306a36Sopenharmony_ci return "(unknown)"; 4962306a36Sopenharmony_ci } 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ciconst char *get_system_type(void) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci return board_type_str(); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_civoid __init board_setup(void) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci int ret; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci switch (alchemy_get_cputype()) { 6262306a36Sopenharmony_ci case ALCHEMY_CPU_AU1000: 6362306a36Sopenharmony_ci case ALCHEMY_CPU_AU1500: 6462306a36Sopenharmony_ci case ALCHEMY_CPU_AU1100: 6562306a36Sopenharmony_ci ret = db1000_board_setup(); 6662306a36Sopenharmony_ci break; 6762306a36Sopenharmony_ci case ALCHEMY_CPU_AU1550: 6862306a36Sopenharmony_ci ret = db1550_board_setup(); 6962306a36Sopenharmony_ci break; 7062306a36Sopenharmony_ci case ALCHEMY_CPU_AU1200: 7162306a36Sopenharmony_ci ret = db1200_board_setup(); 7262306a36Sopenharmony_ci break; 7362306a36Sopenharmony_ci case ALCHEMY_CPU_AU1300: 7462306a36Sopenharmony_ci ret = db1300_board_setup(); 7562306a36Sopenharmony_ci break; 7662306a36Sopenharmony_ci default: 7762306a36Sopenharmony_ci pr_err("unsupported CPU on board\n"); 7862306a36Sopenharmony_ci ret = -ENODEV; 7962306a36Sopenharmony_ci } 8062306a36Sopenharmony_ci if (ret) 8162306a36Sopenharmony_ci panic("cannot initialize board support"); 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistatic int __init db1xxx_arch_init(void) 8562306a36Sopenharmony_ci{ 8662306a36Sopenharmony_ci int id = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI)); 8762306a36Sopenharmony_ci if (id == BCSR_WHOAMI_DB1550) 8862306a36Sopenharmony_ci return db1550_pci_setup(0); 8962306a36Sopenharmony_ci else if ((id == BCSR_WHOAMI_PB1550_SDR) || 9062306a36Sopenharmony_ci (id == BCSR_WHOAMI_PB1550_DDR)) 9162306a36Sopenharmony_ci return db1550_pci_setup(1); 9262306a36Sopenharmony_ci else if ((id == BCSR_WHOAMI_DB1500) || (id == BCSR_WHOAMI_PB1500) || 9362306a36Sopenharmony_ci (id == BCSR_WHOAMI_PB1500R2)) 9462306a36Sopenharmony_ci return db1500_pci_setup(); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci return 0; 9762306a36Sopenharmony_ci} 9862306a36Sopenharmony_ciarch_initcall(db1xxx_arch_init); 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistatic int __init db1xxx_dev_init(void) 10162306a36Sopenharmony_ci{ 10262306a36Sopenharmony_ci mips_set_machine_name(board_type_str()); 10362306a36Sopenharmony_ci switch (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) { 10462306a36Sopenharmony_ci case BCSR_WHOAMI_DB1000: 10562306a36Sopenharmony_ci case BCSR_WHOAMI_DB1500: 10662306a36Sopenharmony_ci case BCSR_WHOAMI_DB1100: 10762306a36Sopenharmony_ci case BCSR_WHOAMI_PB1500: 10862306a36Sopenharmony_ci case BCSR_WHOAMI_PB1500R2: 10962306a36Sopenharmony_ci case BCSR_WHOAMI_PB1100: 11062306a36Sopenharmony_ci return db1000_dev_setup(); 11162306a36Sopenharmony_ci case BCSR_WHOAMI_PB1200_DDR1: 11262306a36Sopenharmony_ci case BCSR_WHOAMI_PB1200_DDR2: 11362306a36Sopenharmony_ci case BCSR_WHOAMI_DB1200: 11462306a36Sopenharmony_ci return db1200_dev_setup(); 11562306a36Sopenharmony_ci case BCSR_WHOAMI_DB1300: 11662306a36Sopenharmony_ci return db1300_dev_setup(); 11762306a36Sopenharmony_ci case BCSR_WHOAMI_DB1550: 11862306a36Sopenharmony_ci case BCSR_WHOAMI_PB1550_SDR: 11962306a36Sopenharmony_ci case BCSR_WHOAMI_PB1550_DDR: 12062306a36Sopenharmony_ci return db1550_dev_setup(); 12162306a36Sopenharmony_ci } 12262306a36Sopenharmony_ci return 0; 12362306a36Sopenharmony_ci} 12462306a36Sopenharmony_cidevice_initcall(db1xxx_dev_init); 125