xref: /linux/arch/mips/ath25/devices.c (revision 664b0bae0b87f69bc9deb098f5e0158b9cf18e04)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
243cc739fSSergey Ryazanov #include <linux/kernel.h>
343cc739fSSergey Ryazanov #include <linux/init.h>
41ac91b1fSSergey Ryazanov #include <linux/serial_8250.h>
5d6a4c72aSSergey Ryazanov #include <linux/platform_device.h>
643cc739fSSergey Ryazanov #include <asm/bootinfo.h>
743cc739fSSergey Ryazanov 
8a7473717SSergey Ryazanov #include <ath25_platform.h>
943cc739fSSergey Ryazanov #include "devices.h"
101ac91b1fSSergey Ryazanov #include "ar5312.h"
111ac91b1fSSergey Ryazanov #include "ar2315.h"
1243cc739fSSergey Ryazanov 
13a7473717SSergey Ryazanov struct ar231x_board_config ath25_board;
141654861fSSergey Ryazanov enum ath25_soc_type ath25_soc = ATH25_SOC_UNKNOWN;
151654861fSSergey Ryazanov 
16d6a4c72aSSergey Ryazanov static struct resource ath25_wmac0_res[] = {
17d6a4c72aSSergey Ryazanov 	{
18d6a4c72aSSergey Ryazanov 		.name = "wmac0_membase",
19d6a4c72aSSergey Ryazanov 		.flags = IORESOURCE_MEM,
20d6a4c72aSSergey Ryazanov 	},
21d6a4c72aSSergey Ryazanov 	{
22d6a4c72aSSergey Ryazanov 		.name = "wmac0_irq",
23d6a4c72aSSergey Ryazanov 		.flags = IORESOURCE_IRQ,
24d6a4c72aSSergey Ryazanov 	}
25d6a4c72aSSergey Ryazanov };
26d6a4c72aSSergey Ryazanov 
27d6a4c72aSSergey Ryazanov static struct resource ath25_wmac1_res[] = {
28d6a4c72aSSergey Ryazanov 	{
29d6a4c72aSSergey Ryazanov 		.name = "wmac1_membase",
30d6a4c72aSSergey Ryazanov 		.flags = IORESOURCE_MEM,
31d6a4c72aSSergey Ryazanov 	},
32d6a4c72aSSergey Ryazanov 	{
33d6a4c72aSSergey Ryazanov 		.name = "wmac1_irq",
34d6a4c72aSSergey Ryazanov 		.flags = IORESOURCE_IRQ,
35d6a4c72aSSergey Ryazanov 	}
36d6a4c72aSSergey Ryazanov };
37d6a4c72aSSergey Ryazanov 
38d6a4c72aSSergey Ryazanov static struct platform_device ath25_wmac[] = {
39d6a4c72aSSergey Ryazanov 	{
40d6a4c72aSSergey Ryazanov 		.id = 0,
41d6a4c72aSSergey Ryazanov 		.name = "ar231x-wmac",
42d6a4c72aSSergey Ryazanov 		.resource = ath25_wmac0_res,
43d6a4c72aSSergey Ryazanov 		.num_resources = ARRAY_SIZE(ath25_wmac0_res),
44d6a4c72aSSergey Ryazanov 		.dev.platform_data = &ath25_board,
45d6a4c72aSSergey Ryazanov 	},
46d6a4c72aSSergey Ryazanov 	{
47d6a4c72aSSergey Ryazanov 		.id = 1,
48d6a4c72aSSergey Ryazanov 		.name = "ar231x-wmac",
49d6a4c72aSSergey Ryazanov 		.resource = ath25_wmac1_res,
50d6a4c72aSSergey Ryazanov 		.num_resources = ARRAY_SIZE(ath25_wmac1_res),
51d6a4c72aSSergey Ryazanov 		.dev.platform_data = &ath25_board,
52d6a4c72aSSergey Ryazanov 	},
53d6a4c72aSSergey Ryazanov };
54d6a4c72aSSergey Ryazanov 
551654861fSSergey Ryazanov static const char * const soc_type_strings[] = {
561654861fSSergey Ryazanov 	[ATH25_SOC_AR5312] = "Atheros AR5312",
571654861fSSergey Ryazanov 	[ATH25_SOC_AR2312] = "Atheros AR2312",
581654861fSSergey Ryazanov 	[ATH25_SOC_AR2313] = "Atheros AR2313",
591654861fSSergey Ryazanov 	[ATH25_SOC_AR2315] = "Atheros AR2315",
601654861fSSergey Ryazanov 	[ATH25_SOC_AR2316] = "Atheros AR2316",
611654861fSSergey Ryazanov 	[ATH25_SOC_AR2317] = "Atheros AR2317",
621654861fSSergey Ryazanov 	[ATH25_SOC_AR2318] = "Atheros AR2318",
631654861fSSergey Ryazanov 	[ATH25_SOC_UNKNOWN] = "Atheros (unknown)",
641654861fSSergey Ryazanov };
65a7473717SSergey Ryazanov 
get_system_type(void)6643cc739fSSergey Ryazanov const char *get_system_type(void)
6743cc739fSSergey Ryazanov {
681654861fSSergey Ryazanov 	if ((ath25_soc >= ARRAY_SIZE(soc_type_strings)) ||
691654861fSSergey Ryazanov 	    !soc_type_strings[ath25_soc])
701654861fSSergey Ryazanov 		return soc_type_strings[ATH25_SOC_UNKNOWN];
711654861fSSergey Ryazanov 	return soc_type_strings[ath25_soc];
7243cc739fSSergey Ryazanov }
731ac91b1fSSergey Ryazanov 
ath25_serial_setup(u32 mapbase,int irq,unsigned int uartclk)741ac91b1fSSergey Ryazanov void __init ath25_serial_setup(u32 mapbase, int irq, unsigned int uartclk)
751ac91b1fSSergey Ryazanov {
76*9dd79fedSMatt Redfearn #ifdef CONFIG_SERIAL_8250_CONSOLE
771ac91b1fSSergey Ryazanov 	struct uart_port s;
781ac91b1fSSergey Ryazanov 
791ac91b1fSSergey Ryazanov 	memset(&s, 0, sizeof(s));
801ac91b1fSSergey Ryazanov 
811ac91b1fSSergey Ryazanov 	s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP;
821ac91b1fSSergey Ryazanov 	s.iotype = UPIO_MEM32;
831ac91b1fSSergey Ryazanov 	s.irq = irq;
841ac91b1fSSergey Ryazanov 	s.regshift = 2;
851ac91b1fSSergey Ryazanov 	s.mapbase = mapbase;
861ac91b1fSSergey Ryazanov 	s.uartclk = uartclk;
871ac91b1fSSergey Ryazanov 
881ac91b1fSSergey Ryazanov 	early_serial_setup(&s);
89*9dd79fedSMatt Redfearn #endif /* CONFIG_SERIAL_8250_CONSOLE */
901ac91b1fSSergey Ryazanov }
911ac91b1fSSergey Ryazanov 
ath25_add_wmac(int nr,u32 base,int irq)92d6a4c72aSSergey Ryazanov int __init ath25_add_wmac(int nr, u32 base, int irq)
93d6a4c72aSSergey Ryazanov {
94d6a4c72aSSergey Ryazanov 	struct resource *res;
95d6a4c72aSSergey Ryazanov 
96d6a4c72aSSergey Ryazanov 	ath25_wmac[nr].dev.platform_data = &ath25_board;
97d6a4c72aSSergey Ryazanov 	res = &ath25_wmac[nr].resource[0];
98d6a4c72aSSergey Ryazanov 	res->start = base;
99d6a4c72aSSergey Ryazanov 	res->end = base + 0x10000 - 1;
100d6a4c72aSSergey Ryazanov 	res++;
101d6a4c72aSSergey Ryazanov 	res->start = irq;
102d6a4c72aSSergey Ryazanov 	res->end = irq;
103d6a4c72aSSergey Ryazanov 	return platform_device_register(&ath25_wmac[nr]);
104d6a4c72aSSergey Ryazanov }
105d6a4c72aSSergey Ryazanov 
ath25_register_devices(void)106a7473717SSergey Ryazanov static int __init ath25_register_devices(void)
107a7473717SSergey Ryazanov {
108a7473717SSergey Ryazanov 	if (is_ar5312())
109a7473717SSergey Ryazanov 		ar5312_init_devices();
110a7473717SSergey Ryazanov 	else
111a7473717SSergey Ryazanov 		ar2315_init_devices();
112a7473717SSergey Ryazanov 
113a7473717SSergey Ryazanov 	return 0;
114a7473717SSergey Ryazanov }
115a7473717SSergey Ryazanov 
116a7473717SSergey Ryazanov device_initcall(ath25_register_devices);
117a7473717SSergey Ryazanov 
ath25_arch_init(void)1181ac91b1fSSergey Ryazanov static int __init ath25_arch_init(void)
1191ac91b1fSSergey Ryazanov {
1201ac91b1fSSergey Ryazanov 	if (is_ar5312())
1211ac91b1fSSergey Ryazanov 		ar5312_arch_init();
1221ac91b1fSSergey Ryazanov 	else
1231ac91b1fSSergey Ryazanov 		ar2315_arch_init();
1241ac91b1fSSergey Ryazanov 
1251ac91b1fSSergey Ryazanov 	return 0;
1261ac91b1fSSergey Ryazanov }
1271ac91b1fSSergey Ryazanov 
1281ac91b1fSSergey Ryazanov arch_initcall(ath25_arch_init);
129