Skip to content

Commit

Permalink
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/geert/linux-m68k

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
  • Loading branch information
Linus Torvalds committed Apr 30, 2013
2 parents e282329 + e00c73e commit 165bc51
Show file tree
Hide file tree
Showing 14 changed files with 717 additions and 24 deletions.
10 changes: 10 additions & 0 deletions arch/m68k/Kconfig.bus
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
24 changes: 24 additions & 0 deletions arch/m68k/Kconfig.devices
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
152 changes: 152 additions & 0 deletions arch/m68k/atari/ataints.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include <asm/atari_stdma.h>
#include <asm/irq.h>
#include <asm/entry.h>
#include <asm/io.h>


/*
Expand Down Expand Up @@ -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)
*
Expand Down Expand Up @@ -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);
}


Expand Down
Loading

0 comments on commit 165bc51

Please sign in to comment.