Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 165bc513 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull m68k update from Geert Uytterhoeven.

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k:
  m68k: Remove inline strlen() implementation
  m68k/atari: USB - add platform devices for EtherNAT/NetUSBee ISP1160 HCD
  m68k: Implement ndelay() based on the existing udelay() logic
  m68k/atari: EtherNAT - add interrupt chip definition for CPLD interrupts
  m68k/atari: EtherNEC - add platform device support
  m68k/atari: EtherNAT - platform device and IRQ support code
  m68k/atari: use dedicated irq_chip for timer D interrupts
  m68k/atari: ROM port ISA adapter support
  m68k: Add missing cmpxchg64() if CONFIG_RMW_INSNS=y
parents e2823299 e00c73ee
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -45,6 +45,16 @@ config ISA
	  (MCA) or VESA.  ISA is an older system, now being displaced by PCI;
	  newer boards don't support it.  If you have ISA, say Y, otherwise N.

config ATARI_ROM_ISA
	bool "Atari ROM port ISA adapter support"
	depends on ATARI
	help
	  This option enables support for the ROM port ISA adapter used to
	  operate ISA cards on Atari. Only 8  bit cards are supported, and
	  no interrupt lines are connected.
	  The only driver currently using this adapter is the EtherNEC
	  driver for RTL8019AS based NE2000 compatible network cards.

config GENERIC_ISA_DMA
	def_bool ISA

+24 −0
Original line number Diff line number Diff line
@@ -55,6 +55,30 @@ config NFETH
	  which will emulate a regular ethernet device while presenting an
	  ethertap device to the host system.

config ATARI_ETHERNAT
	bool "Atari EtherNAT Ethernet support"
	depends on ATARI
	---help---
	  Say Y to include support for the EtherNAT network adapter for the
	  CT/60 extension port.

	  To compile the actual ethernet driver, choose Y or M for the SMC91X
	  option in the network device section; the module will be called smc91x.

config ATARI_ETHERNEC
	bool "Atari EtherNEC Ethernet support"
	depends on ATARI_ROM_ISA
	---help---
	  Say Y to include support for the EtherNEC network adapter for the
	  ROM port. The driver works by polling instead of interrupts, so it
	  is quite slow.

	  This driver also suppports the ethernet part of the NetUSBee ROM
	  port combined Ethernet/USB adapter.

	  To compile the actual ethernet driver, choose Y or M in for the NE2000
	  option in the network device section; the module will be called ne.

endmenu

menu "Character devices"
+152 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@
#include <asm/atari_stdma.h>
#include <asm/irq.h>
#include <asm/entry.h>
#include <asm/io.h>


/*
@@ -121,6 +122,136 @@ static struct irq_chip atari_irq_chip = {
	.irq_disable	= atari_irq_disable,
};

/*
 * ST-MFP timer D chained interrupts - each driver gets its own timer
 * interrupt instance.
 */

struct mfptimerbase {
	volatile struct MFP *mfp;
	unsigned char mfp_mask, mfp_data;
	unsigned short int_mask;
	int handler_irq, mfptimer_irq, server_irq;
	char *name;
} stmfp_base = {
	.mfp		= &st_mfp,
	.int_mask	= 0x0,
	.handler_irq	= IRQ_MFP_TIMD,
	.mfptimer_irq	= IRQ_MFP_TIMER1,
	.name		= "MFP Timer D"
};

static irqreturn_t mfptimer_handler(int irq, void *dev_id)
{
	struct mfptimerbase *base = dev_id;
	int mach_irq;
	unsigned char ints;

	mach_irq = base->mfptimer_irq;
	ints = base->int_mask;
	for (; ints; mach_irq++, ints >>= 1) {
		if (ints & 1)
			generic_handle_irq(mach_irq);
	}
	return IRQ_HANDLED;
}


static void atari_mfptimer_enable(struct irq_data *data)
{
	int mfp_num = data->irq - IRQ_MFP_TIMER1;
	stmfp_base.int_mask |= 1 << mfp_num;
	atari_enable_irq(IRQ_MFP_TIMD);
}

static void atari_mfptimer_disable(struct irq_data *data)
{
	int mfp_num = data->irq - IRQ_MFP_TIMER1;
	stmfp_base.int_mask &= ~(1 << mfp_num);
	if (!stmfp_base.int_mask)
		atari_disable_irq(IRQ_MFP_TIMD);
}

static struct irq_chip atari_mfptimer_chip = {
	.name		= "timer_d",
	.irq_enable	= atari_mfptimer_enable,
	.irq_disable	= atari_mfptimer_disable,
};


/*
 * EtherNAT CPLD interrupt handling
 * CPLD interrupt register is at phys. 0x80000023
 * Need this mapped in at interrupt startup time
 * Possibly need this mapped on demand anyway -
 * EtherNAT USB driver needs to disable IRQ before
 * startup!
 */

static unsigned char *enat_cpld;

static unsigned int atari_ethernat_startup(struct irq_data *data)
{
	int enat_num = 140 - data->irq + 1;

	m68k_irq_startup(data);
	/*
	* map CPLD interrupt register
	*/
	if (!enat_cpld)
		enat_cpld = (unsigned char *)ioremap((ATARI_ETHERNAT_PHYS_ADDR+0x23), 0x2);
	/*
	 * do _not_ enable the USB chip interrupt here - causes interrupt storm
	 * and triggers dead interrupt watchdog
	 * Need to reset the USB chip to a sane state in early startup before
	 * removing this hack
	 */
	if (enat_num == 1)
		*enat_cpld |= 1 << enat_num;

	return 0;
}

static void atari_ethernat_enable(struct irq_data *data)
{
	int enat_num = 140 - data->irq + 1;
	/*
	* map CPLD interrupt register
	*/
	if (!enat_cpld)
		enat_cpld = (unsigned char *)ioremap((ATARI_ETHERNAT_PHYS_ADDR+0x23), 0x2);
	*enat_cpld |= 1 << enat_num;
}

static void atari_ethernat_disable(struct irq_data *data)
{
	int enat_num = 140 - data->irq + 1;
	/*
	* map CPLD interrupt register
	*/
	if (!enat_cpld)
		enat_cpld = (unsigned char *)ioremap((ATARI_ETHERNAT_PHYS_ADDR+0x23), 0x2);
	*enat_cpld &= ~(1 << enat_num);
}

static void atari_ethernat_shutdown(struct irq_data *data)
{
	int enat_num = 140 - data->irq + 1;
	if (enat_cpld) {
		*enat_cpld &= ~(1 << enat_num);
		iounmap(enat_cpld);
		enat_cpld = NULL;
	}
}

static struct irq_chip atari_ethernat_chip = {
	.name		= "ethernat",
	.irq_startup	= atari_ethernat_startup,
	.irq_shutdown	= atari_ethernat_shutdown,
	.irq_enable	= atari_ethernat_enable,
	.irq_disable	= atari_ethernat_disable,
};

/*
 * void atari_init_IRQ (void)
 *
@@ -198,6 +329,27 @@ void __init atari_init_IRQ(void)
	/* Initialize the PSG: all sounds off, both ports output */
	sound_ym.rd_data_reg_sel = 7;
	sound_ym.wd_data = 0xff;

	m68k_setup_irq_controller(&atari_mfptimer_chip, handle_simple_irq,
				  IRQ_MFP_TIMER1, 8);

	/* prepare timer D data for use as poll interrupt */
	/* set Timer D data Register - needs to be > 0 */
	st_mfp.tim_dt_d = 254;	/* < 100 Hz */
	/* start timer D, div = 1:100 */
	st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 0xf0) | 0x6;

	/* request timer D dispatch handler */
	if (request_irq(IRQ_MFP_TIMD, mfptimer_handler, IRQF_SHARED,
			stmfp_base.name, &stmfp_base))
		pr_err("Couldn't register %s interrupt\n", stmfp_base.name);

	/*
	 * EtherNAT ethernet / USB interrupt handlers
	 */

	m68k_setup_irq_controller(&atari_ethernat_chip, handle_simple_irq,
				  139, 2);
}


+239 −0
Original line number Diff line number Diff line
@@ -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>

@@ -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);
+6 −0
Original line number Diff line number Diff line
@@ -805,5 +805,11 @@ struct MSTE_RTC {

#define mste_rtc ((*(volatile struct MSTE_RTC *)MSTE_RTC_BAS))

/*
** EtherNAT add-on card for Falcon - combined ethernet and USB adapter
*/

#define ATARI_ETHERNAT_PHYS_ADDR	0x80000000

#endif /* linux/atarihw.h */
Loading