diff options
Diffstat (limited to 'arch/mips/sibyte/swarm/platform.c')
| -rw-r--r-- | arch/mips/sibyte/swarm/platform.c | 54 | 
1 files changed, 54 insertions, 0 deletions
diff --git a/arch/mips/sibyte/swarm/platform.c b/arch/mips/sibyte/swarm/platform.c index 54847fe1e56..097335262fb 100644 --- a/arch/mips/sibyte/swarm/platform.c +++ b/arch/mips/sibyte/swarm/platform.c @@ -83,3 +83,57 @@ static int __init swarm_pata_init(void)  device_initcall(swarm_pata_init);  #endif /* defined(CONFIG_SIBYTE_SWARM) || defined(CONFIG_SIBYTE_LITTLESUR) */ + +#define sb1250_dev_struct(num) \ +	static struct resource sb1250_res##num = {		\ +		.name = "SB1250 MAC " __stringify(num),		\ +		.flags = IORESOURCE_MEM,		\ +		.start = A_MAC_CHANNEL_BASE(num),	\ +		.end = A_MAC_CHANNEL_BASE(num + 1) -1,	\ +	};\ +	static struct platform_device sb1250_dev##num = {	\ +		.name = "sb1250-mac",			\ +	.id = num,					\ +	.resource = &sb1250_res##num,			\ +	.num_resources = 1,				\ +	} + +sb1250_dev_struct(0); +sb1250_dev_struct(1); +sb1250_dev_struct(2); +sb1250_dev_struct(3); + +static struct platform_device *sb1250_devs[] __initdata = { +	&sb1250_dev0, +	&sb1250_dev1, +	&sb1250_dev2, +	&sb1250_dev3, +}; + +static int __init sb1250_device_init(void) +{ +	int ret; + +	/* Set the number of available units based on the SOC type.  */ +	switch (soc_type) { +	case K_SYS_SOC_TYPE_BCM1250: +	case K_SYS_SOC_TYPE_BCM1250_ALT: +		ret = platform_add_devices(sb1250_devs, 3); +		break; +	case K_SYS_SOC_TYPE_BCM1120: +	case K_SYS_SOC_TYPE_BCM1125: +	case K_SYS_SOC_TYPE_BCM1125H: +	case K_SYS_SOC_TYPE_BCM1250_ALT2:       /* Hybrid */ +		ret = platform_add_devices(sb1250_devs, 2); +		break; +	case K_SYS_SOC_TYPE_BCM1x55: +	case K_SYS_SOC_TYPE_BCM1x80: +		ret = platform_add_devices(sb1250_devs, 4); +		break; +	default: +		ret = -ENODEV; +		break; +	} +	return ret; +} +device_initcall(sb1250_device_init);  |