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