1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Alchemy DB/PB1xxx board support.
4  */
5 
6 #include <asm/prom.h>
7 #include <asm/mach-au1x00/au1000.h>
8 #include <asm/mach-db1x00/bcsr.h>
9 
10 int __init db1000_board_setup(void);
11 int __init db1000_dev_setup(void);
12 int __init db1500_pci_setup(void);
13 int __init db1200_board_setup(void);
14 int __init db1200_dev_setup(void);
15 int __init db1300_board_setup(void);
16 int __init db1300_dev_setup(void);
17 int __init db1550_board_setup(void);
18 int __init db1550_dev_setup(void);
19 int __init db1550_pci_setup(int);
20 
21 static const char *board_type_str(void)
22 {
23 	switch (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) {
24 	case BCSR_WHOAMI_DB1000:
25 		return "DB1000";
26 	case BCSR_WHOAMI_DB1500:
27 		return "DB1500";
28 	case BCSR_WHOAMI_DB1100:
29 		return "DB1100";
30 	case BCSR_WHOAMI_PB1500:
31 	case BCSR_WHOAMI_PB1500R2:
32 		return "PB1500";
33 	case BCSR_WHOAMI_PB1100:
34 		return "PB1100";
35 	case BCSR_WHOAMI_PB1200_DDR1:
36 	case BCSR_WHOAMI_PB1200_DDR2:
37 		return "PB1200";
38 	case BCSR_WHOAMI_DB1200:
39 		return "DB1200";
40 	case BCSR_WHOAMI_DB1300:
41 		return "DB1300";
42 	case BCSR_WHOAMI_DB1550:
43 		return "DB1550";
44 	case BCSR_WHOAMI_PB1550_SDR:
45 	case BCSR_WHOAMI_PB1550_DDR:
46 		return "PB1550";
47 	default:
48 		return "(unknown)";
49 	}
50 }
51 
52 const char *get_system_type(void)
53 {
54 	return board_type_str();
55 }
56 
57 void __init board_setup(void)
58 {
59 	int ret;
60 
61 	switch (alchemy_get_cputype()) {
62 	case ALCHEMY_CPU_AU1000:
63 	case ALCHEMY_CPU_AU1500:
64 	case ALCHEMY_CPU_AU1100:
65 		ret = db1000_board_setup();
66 		break;
67 	case ALCHEMY_CPU_AU1550:
68 		ret = db1550_board_setup();
69 		break;
70 	case ALCHEMY_CPU_AU1200:
71 		ret = db1200_board_setup();
72 		break;
73 	case ALCHEMY_CPU_AU1300:
74 		ret = db1300_board_setup();
75 		break;
76 	default:
77 		pr_err("unsupported CPU on board\n");
78 		ret = -ENODEV;
79 	}
80 	if (ret)
81 		panic("cannot initialize board support");
82 }
83 
84 static int __init db1xxx_arch_init(void)
85 {
86 	int id = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
87 	if (id == BCSR_WHOAMI_DB1550)
88 		return db1550_pci_setup(0);
89 	else if ((id == BCSR_WHOAMI_PB1550_SDR) ||
90 		 (id == BCSR_WHOAMI_PB1550_DDR))
91 		return db1550_pci_setup(1);
92 	else if ((id == BCSR_WHOAMI_DB1500) || (id == BCSR_WHOAMI_PB1500) ||
93 		 (id == BCSR_WHOAMI_PB1500R2))
94 		return db1500_pci_setup();
95 
96 	return 0;
97 }
98 arch_initcall(db1xxx_arch_init);
99 
100 static int __init db1xxx_dev_init(void)
101 {
102 	mips_set_machine_name(board_type_str());
103 	switch (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) {
104 	case BCSR_WHOAMI_DB1000:
105 	case BCSR_WHOAMI_DB1500:
106 	case BCSR_WHOAMI_DB1100:
107 	case BCSR_WHOAMI_PB1500:
108 	case BCSR_WHOAMI_PB1500R2:
109 	case BCSR_WHOAMI_PB1100:
110 		return db1000_dev_setup();
111 	case BCSR_WHOAMI_PB1200_DDR1:
112 	case BCSR_WHOAMI_PB1200_DDR2:
113 	case BCSR_WHOAMI_DB1200:
114 		return db1200_dev_setup();
115 	case BCSR_WHOAMI_DB1300:
116 		return db1300_dev_setup();
117 	case BCSR_WHOAMI_DB1550:
118 	case BCSR_WHOAMI_PB1550_SDR:
119 	case BCSR_WHOAMI_PB1550_DDR:
120 		return db1550_dev_setup();
121 	}
122 	return 0;
123 }
124 device_initcall(db1xxx_dev_init);
125