diff options
Diffstat (limited to 'arch/m68k/atari/config.c')
| -rw-r--r-- | arch/m68k/atari/config.c | 243 | 
1 files changed, 241 insertions, 2 deletions
diff --git a/arch/m68k/atari/config.c b/arch/m68k/atari/config.c index d8eb32747ac..fb2d0bd9b3a 100644 --- a/arch/m68k/atari/config.c +++ b/arch/m68k/atari/config.c @@ -31,6 +31,8 @@  #include <linux/init.h>  #include <linux/delay.h>  #include <linux/ioport.h> +#include <linux/platform_device.h> +#include <linux/usb/isp116x.h>  #include <linux/vt_kern.h>  #include <linux/module.h> @@ -74,7 +76,7 @@ static void atari_heartbeat(int on);  /* atari specific timer functions (in time.c) */  extern void atari_sched_init(irq_handler_t); -extern unsigned long atari_gettimeoffset (void); +extern u32 atari_gettimeoffset(void);  extern int atari_mste_hwclk (int, struct rtc_time *);  extern int atari_tt_hwclk (int, struct rtc_time *);  extern int atari_mste_set_clock_mmss (unsigned long); @@ -204,7 +206,7 @@ void __init config_atari(void)  	mach_init_IRQ        = atari_init_IRQ;  	mach_get_model	 = atari_get_model;  	mach_get_hardware_list = atari_get_hardware_list; -	mach_gettimeoffset   = atari_gettimeoffset; +	arch_gettimeoffset   = atari_gettimeoffset;  	mach_reset           = atari_reset;  	mach_max_dma_address = 0xffffff;  #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE) @@ -655,3 +657,240 @@ static void atari_get_hardware_list(struct seq_file *m)  	ATARIHW_ANNOUNCE(VME, "VME Bus");  	ATARIHW_ANNOUNCE(DSP56K, "DSP56001 processor");  } + +/* + * MSch: initial platform device support for Atari, + * required for EtherNAT/EtherNEC/NetUSBee drivers + */ + +#if defined(CONFIG_ATARI_ETHERNAT) || defined(CONFIG_ATARI_ETHERNEC) +static void isp1160_delay(struct device *dev, int delay) +{ +	ndelay(delay); +} +#endif + +#ifdef CONFIG_ATARI_ETHERNAT +/* + * EtherNAT: SMC91C111 Ethernet chipset, handled by smc91x driver + */ + +#define ATARI_ETHERNAT_IRQ		140 + +static struct resource smc91x_resources[] = { +	[0] = { +		.name	= "smc91x-regs", +		.start	= ATARI_ETHERNAT_PHYS_ADDR, +		.end	= ATARI_ETHERNAT_PHYS_ADDR + 0xfffff, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.name	= "smc91x-irq", +		.start	= ATARI_ETHERNAT_IRQ, +		.end	= ATARI_ETHERNAT_IRQ, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device smc91x_device = { +	.name		= "smc91x", +	.id		= -1, +	.num_resources	= ARRAY_SIZE(smc91x_resources), +	.resource	= smc91x_resources, +}; + +/* + * ISP 1160 - using the isp116x-hcd module + */ + +#define ATARI_USB_PHYS_ADDR	0x80000012 +#define ATARI_USB_IRQ		139 + +static struct resource isp1160_resources[] = { +	[0] = { +		.name	= "isp1160-data", +		.start	= ATARI_USB_PHYS_ADDR, +		.end	= ATARI_USB_PHYS_ADDR + 0x1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.name	= "isp1160-regs", +		.start	= ATARI_USB_PHYS_ADDR + 0x4, +		.end	= ATARI_USB_PHYS_ADDR + 0x5, +		.flags	= IORESOURCE_MEM, +	}, +	[2] = { +		.name	= "isp1160-irq", +		.start	= ATARI_USB_IRQ, +		.end	= ATARI_USB_IRQ, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +/* (DataBusWidth16|AnalogOCEnable|DREQOutputPolarity|DownstreamPort15KRSel ) */ +static struct isp116x_platform_data isp1160_platform_data = { +	/* Enable internal resistors on downstream ports */ +	.sel15Kres		= 1, +	/* On-chip overcurrent protection */ +	.oc_enable		= 1, +	/* INT output polarity */ +	.int_act_high		= 1, +	/* INT edge or level triggered */ +	.int_edge_triggered	= 0, + +	/* WAKEUP pin connected - NOT SUPPORTED  */ +	/* .remote_wakeup_connected = 0, */ +	/* Wakeup by devices on usb bus enabled */ +	.remote_wakeup_enable	= 0, +	.delay			= isp1160_delay, +}; + +static struct platform_device isp1160_device = { +	.name		= "isp116x-hcd", +	.id		= 0, +	.num_resources	= ARRAY_SIZE(isp1160_resources), +	.resource	= isp1160_resources, +	.dev			= { +		.platform_data	= &isp1160_platform_data, +	}, +}; + +static struct platform_device *atari_ethernat_devices[] __initdata = { +	&smc91x_device, +	&isp1160_device +}; +#endif /* CONFIG_ATARI_ETHERNAT */ + +#ifdef CONFIG_ATARI_ETHERNEC +/* + * EtherNEC: RTL8019 (NE2000 compatible) Ethernet chipset, + * handled by ne.c driver + */ + +#define ATARI_ETHERNEC_PHYS_ADDR	0xfffa0000 +#define ATARI_ETHERNEC_BASE		0x300 +#define ATARI_ETHERNEC_IRQ		IRQ_MFP_TIMER1 + +static struct resource rtl8019_resources[] = { +	[0] = { +		.name	= "rtl8019-regs", +		.start	= ATARI_ETHERNEC_BASE, +		.end	= ATARI_ETHERNEC_BASE + 0x20 - 1, +		.flags	= IORESOURCE_IO, +	}, +	[1] = { +		.name	= "rtl8019-irq", +		.start	= ATARI_ETHERNEC_IRQ, +		.end	= ATARI_ETHERNEC_IRQ, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device rtl8019_device = { +	.name		= "ne", +	.id		= -1, +	.num_resources	= ARRAY_SIZE(rtl8019_resources), +	.resource	= rtl8019_resources, +}; + +/* + * NetUSBee: ISP1160 USB host adapter via ROM-port adapter + */ + +#define ATARI_NETUSBEE_PHYS_ADDR	0xfffa8000 +#define ATARI_NETUSBEE_BASE		0x340 +#define ATARI_NETUSBEE_IRQ		IRQ_MFP_TIMER2 + +static struct resource netusbee_resources[] = { +	[0] = { +		.name	= "isp1160-data", +		.start	= ATARI_NETUSBEE_BASE, +		.end	= ATARI_NETUSBEE_BASE + 0x1, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.name	= "isp1160-regs", +		.start	= ATARI_NETUSBEE_BASE + 0x20, +		.end	= ATARI_NETUSBEE_BASE + 0x21, +		.flags	= IORESOURCE_MEM, +	}, +	[2] = { +		.name	= "isp1160-irq", +		.start	= ATARI_NETUSBEE_IRQ, +		.end	= ATARI_NETUSBEE_IRQ, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +/* (DataBusWidth16|AnalogOCEnable|DREQOutputPolarity|DownstreamPort15KRSel ) */ +static struct isp116x_platform_data netusbee_platform_data = { +	/* Enable internal resistors on downstream ports */ +	.sel15Kres		= 1, +	/* On-chip overcurrent protection */ +	.oc_enable		= 1, +	/* INT output polarity */ +	.int_act_high		= 1, +	/* INT edge or level triggered */ +	.int_edge_triggered	= 0, + +	/* WAKEUP pin connected - NOT SUPPORTED  */ +	/* .remote_wakeup_connected = 0, */ +	/* Wakeup by devices on usb bus enabled */ +	.remote_wakeup_enable	= 0, +	.delay			= isp1160_delay, +}; + +static struct platform_device netusbee_device = { +	.name		= "isp116x-hcd", +	.id		= 1, +	.num_resources	= ARRAY_SIZE(netusbee_resources), +	.resource	= netusbee_resources, +	.dev			= { +		.platform_data	= &netusbee_platform_data, +	}, +}; + +static struct platform_device *atari_netusbee_devices[] __initdata = { +	&rtl8019_device, +	&netusbee_device +}; +#endif /* CONFIG_ATARI_ETHERNEC */ + +int __init atari_platform_init(void) +{ +	int rv = 0; + +	if (!MACH_IS_ATARI) +		return -ENODEV; + +#ifdef CONFIG_ATARI_ETHERNAT +	{ +		unsigned char *enatc_virt; +		enatc_virt = (unsigned char *)ioremap((ATARI_ETHERNAT_PHYS_ADDR+0x23), 0xf); +		if (hwreg_present(enatc_virt)) { +			rv = platform_add_devices(atari_ethernat_devices, +						ARRAY_SIZE(atari_ethernat_devices)); +		} +		iounmap(enatc_virt); +	} +#endif + +#ifdef CONFIG_ATARI_ETHERNEC +	{ +		int error; +		unsigned char *enec_virt; +		enec_virt = (unsigned char *)ioremap((ATARI_ETHERNEC_PHYS_ADDR), 0xf); +		if (hwreg_present(enec_virt)) { +			error = platform_add_devices(atari_netusbee_devices, +						ARRAY_SIZE(atari_netusbee_devices)); +			if (error && !rv) +				rv = error; +		} +		iounmap(enec_virt); +	} +#endif + +	return rv; +} + +arch_initcall(atari_platform_init);  |