diff options
Diffstat (limited to 'arch/mips/sgi-ip22')
| -rw-r--r-- | arch/mips/sgi-ip22/Makefile | 2 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-berr.c | 1 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-eisa.c | 22 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-gio.c | 442 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-hpc.c | 2 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-int.c | 119 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-mc.c | 56 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-nvram.c | 16 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-platform.c | 12 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-reset.c | 5 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-setup.c | 23 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip22-time.c | 8 | ||||
| -rw-r--r-- | arch/mips/sgi-ip22/ip28-berr.c | 17 | 
13 files changed, 569 insertions, 156 deletions
diff --git a/arch/mips/sgi-ip22/Makefile b/arch/mips/sgi-ip22/Makefile index cc538493cae..411cda9ee03 100644 --- a/arch/mips/sgi-ip22/Makefile +++ b/arch/mips/sgi-ip22/Makefile @@ -4,7 +4,7 @@  #  obj-y	+= ip22-mc.o ip22-hpc.o ip22-int.o ip22-time.o ip22-nvram.o \ -	   ip22-platform.o ip22-reset.o ip22-setup.o +	   ip22-platform.o ip22-reset.o ip22-setup.o ip22-gio.o  obj-$(CONFIG_SGI_IP22) += ip22-berr.o  obj-$(CONFIG_SGI_IP28) += ip28-berr.o diff --git a/arch/mips/sgi-ip22/ip22-berr.c b/arch/mips/sgi-ip22/ip22-berr.c index 911d3999c0c..3f6ccd53c15 100644 --- a/arch/mips/sgi-ip22/ip22-berr.c +++ b/arch/mips/sgi-ip22/ip22-berr.c @@ -9,7 +9,6 @@  #include <linux/sched.h>  #include <asm/addrspace.h> -#include <asm/system.h>  #include <asm/traps.h>  #include <asm/branch.h>  #include <asm/irq_regs.h> diff --git a/arch/mips/sgi-ip22/ip22-eisa.c b/arch/mips/sgi-ip22/ip22-eisa.c index da44ccb2082..a0a79222ce0 100644 --- a/arch/mips/sgi-ip22/ip22-eisa.c +++ b/arch/mips/sgi-ip22/ip22-eisa.c @@ -2,7 +2,7 @@   * Basic EISA bus support for the SGI Indigo-2.   *   * (C) 2002 Pascal Dameme <netinet@freesurf.fr> - *      and Marc Zyngier <mzyngier@freesurf.fr> + *	and Marc Zyngier <mzyngier@freesurf.fr>   *   * This code is released under both the GPL version 2 and BSD   * licenses.  Either license may be used. @@ -40,13 +40,13 @@  /* I2 has four EISA slots. */  #define IP22_EISA_MAX_SLOTS	  4 -#define EISA_MAX_IRQ             16 +#define EISA_MAX_IRQ		 16 -#define EIU_MODE_REG     0x0001ffc0 -#define EIU_STAT_REG     0x0001ffc4 -#define EIU_PREMPT_REG   0x0001ffc8 -#define EIU_QUIET_REG    0x0001ffcc -#define EIU_INTRPT_ACK   0x00010004 +#define EIU_MODE_REG	 0x0001ffc0 +#define EIU_STAT_REG	 0x0001ffc4 +#define EIU_PREMPT_REG	 0x0001ffc8 +#define EIU_QUIET_REG	 0x0001ffcc +#define EIU_INTRPT_ACK	 0x00010004  static char __init *decode_eisa_sig(unsigned long addr)  { @@ -73,12 +73,10 @@ static char __init *decode_eisa_sig(unsigned long addr)  static irqreturn_t ip22_eisa_intr(int irq, void *dev_id)  { -	u8 eisa_irq; -	u8 dma1, dma2; +	u8 eisa_irq = inb(EIU_INTRPT_ACK); -	eisa_irq = inb(EIU_INTRPT_ACK); -	dma1 = inb(EISA_DMA1_STATUS); -	dma2 = inb(EISA_DMA2_STATUS); +	inb(EISA_DMA1_STATUS); +	inb(EISA_DMA2_STATUS);  	if (eisa_irq < EISA_MAX_IRQ) {  		do_IRQ(eisa_irq); diff --git a/arch/mips/sgi-ip22/ip22-gio.c b/arch/mips/sgi-ip22/ip22-gio.c new file mode 100644 index 00000000000..8e52446286c --- /dev/null +++ b/arch/mips/sgi-ip22/ip22-gio.c @@ -0,0 +1,442 @@ +#include <linux/export.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/slab.h> + +#include <asm/addrspace.h> +#include <asm/paccess.h> +#include <asm/gio_device.h> +#include <asm/sgi/gio.h> +#include <asm/sgi/hpc3.h> +#include <asm/sgi/mc.h> +#include <asm/sgi/ip22.h> + +static struct bus_type gio_bus_type; + +static struct { +	const char *name; +	__u8	   id; +} gio_name_table[] = { +	{ .name = "SGI Impact", .id = 0x10 }, +	{ .name = "Phobos G160", .id = 0x35 }, +	{ .name = "Phobos G130", .id = 0x36 }, +	{ .name = "Phobos G100", .id = 0x37 }, +	{ .name = "Set Engineering GFE", .id = 0x38 }, +	/* fake IDs */ +	{ .name = "SGI Newport", .id = 0x7e }, +	{ .name = "SGI GR2/GR3", .id = 0x7f }, +}; + +static struct device gio_bus = { +	.init_name = "gio", +}; + +/** + * gio_match_device - Tell if an of_device structure has a matching + * gio_match structure + * @ids: array of of device match structures to search in + * @dev: the of device structure to match against + * + * Used by a driver to check whether an of_device present in the + * system is in its list of supported devices. + */ +const struct gio_device_id *gio_match_device(const struct gio_device_id *match, +		     const struct gio_device *dev) +{ +	const struct gio_device_id *ids; + +	for (ids = match; ids->id != 0xff; ids++) +		if (ids->id == dev->id.id) +			return ids; + +	return NULL; +} +EXPORT_SYMBOL_GPL(gio_match_device); + +struct gio_device *gio_dev_get(struct gio_device *dev) +{ +	struct device *tmp; + +	if (!dev) +		return NULL; +	tmp = get_device(&dev->dev); +	if (tmp) +		return to_gio_device(tmp); +	else +		return NULL; +} +EXPORT_SYMBOL_GPL(gio_dev_get); + +void gio_dev_put(struct gio_device *dev) +{ +	if (dev) +		put_device(&dev->dev); +} +EXPORT_SYMBOL_GPL(gio_dev_put); + +/** + * gio_release_dev - free an gio device structure when all users of it are finished. + * @dev: device that's been disconnected + * + * Will be called only by the device core when all users of this gio device are + * done. + */ +void gio_release_dev(struct device *dev) +{ +	struct gio_device *giodev; + +	giodev = to_gio_device(dev); +	kfree(giodev); +} +EXPORT_SYMBOL_GPL(gio_release_dev); + +int gio_device_register(struct gio_device *giodev) +{ +	giodev->dev.bus = &gio_bus_type; +	giodev->dev.parent = &gio_bus; +	return device_register(&giodev->dev); +} +EXPORT_SYMBOL_GPL(gio_device_register); + +void gio_device_unregister(struct gio_device *giodev) +{ +	device_unregister(&giodev->dev); +} +EXPORT_SYMBOL_GPL(gio_device_unregister); + +static int gio_bus_match(struct device *dev, struct device_driver *drv) +{ +	struct gio_device *gio_dev = to_gio_device(dev); +	struct gio_driver *gio_drv = to_gio_driver(drv); + +	return gio_match_device(gio_drv->id_table, gio_dev) != NULL; +} + +static int gio_device_probe(struct device *dev) +{ +	int error = -ENODEV; +	struct gio_driver *drv; +	struct gio_device *gio_dev; +	const struct gio_device_id *match; + +	drv = to_gio_driver(dev->driver); +	gio_dev = to_gio_device(dev); + +	if (!drv->probe) +		return error; + +	gio_dev_get(gio_dev); + +	match = gio_match_device(drv->id_table, gio_dev); +	if (match) +		error = drv->probe(gio_dev, match); +	if (error) +		gio_dev_put(gio_dev); + +	return error; +} + +static int gio_device_remove(struct device *dev) +{ +	struct gio_device *gio_dev = to_gio_device(dev); +	struct gio_driver *drv = to_gio_driver(dev->driver); + +	if (dev->driver && drv->remove) +		drv->remove(gio_dev); +	return 0; +} + +static int gio_device_suspend(struct device *dev, pm_message_t state) +{ +	struct gio_device *gio_dev = to_gio_device(dev); +	struct gio_driver *drv = to_gio_driver(dev->driver); +	int error = 0; + +	if (dev->driver && drv->suspend) +		error = drv->suspend(gio_dev, state); +	return error; +} + +static int gio_device_resume(struct device *dev) +{ +	struct gio_device *gio_dev = to_gio_device(dev); +	struct gio_driver *drv = to_gio_driver(dev->driver); +	int error = 0; + +	if (dev->driver && drv->resume) +		error = drv->resume(gio_dev); +	return error; +} + +static void gio_device_shutdown(struct device *dev) +{ +	struct gio_device *gio_dev = to_gio_device(dev); +	struct gio_driver *drv = to_gio_driver(dev->driver); + +	if (dev->driver && drv->shutdown) +		drv->shutdown(gio_dev); +} + +static ssize_t modalias_show(struct device *dev, struct device_attribute *a, +			     char *buf) +{ +	struct gio_device *gio_dev = to_gio_device(dev); +	int len = snprintf(buf, PAGE_SIZE, "gio:%x\n", gio_dev->id.id); + +	return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; +} + +static ssize_t name_show(struct device *dev, +			 struct device_attribute *attr, char *buf) +{ +	struct gio_device *giodev; + +	giodev = to_gio_device(dev); +	return sprintf(buf, "%s", giodev->name); +} + +static ssize_t id_show(struct device *dev, +		       struct device_attribute *attr, char *buf) +{ +	struct gio_device *giodev; + +	giodev = to_gio_device(dev); +	return sprintf(buf, "%x", giodev->id.id); +} + +static struct device_attribute gio_dev_attrs[] = { +	__ATTR_RO(modalias), +	__ATTR_RO(name), +	__ATTR_RO(id), +	__ATTR_NULL, +}; + +static int gio_device_uevent(struct device *dev, struct kobj_uevent_env *env) +{ +	struct gio_device *gio_dev = to_gio_device(dev); + +	add_uevent_var(env, "MODALIAS=gio:%x", gio_dev->id.id); +	return 0; +} + +int gio_register_driver(struct gio_driver *drv) +{ +	/* initialize common driver fields */ +	if (!drv->driver.name) +		drv->driver.name = drv->name; +	if (!drv->driver.owner) +		drv->driver.owner = drv->owner; +	drv->driver.bus = &gio_bus_type; + +	/* register with core */ +	return driver_register(&drv->driver); +} +EXPORT_SYMBOL_GPL(gio_register_driver); + +void gio_unregister_driver(struct gio_driver *drv) +{ +	driver_unregister(&drv->driver); +} +EXPORT_SYMBOL_GPL(gio_unregister_driver); + +void gio_set_master(struct gio_device *dev) +{ +	u32 tmp = sgimc->giopar; + +	switch (dev->slotno) { +	case 0: +		tmp |= SGIMC_GIOPAR_MASTERGFX; +		break; +	case 1: +		tmp |= SGIMC_GIOPAR_MASTEREXP0; +		break; +	case 2: +		tmp |= SGIMC_GIOPAR_MASTEREXP1; +		break; +	} +	sgimc->giopar = tmp; +} +EXPORT_SYMBOL_GPL(gio_set_master); + +void ip22_gio_set_64bit(int slotno) +{ +	u32 tmp = sgimc->giopar; + +	switch (slotno) { +	case 0: +		tmp |= SGIMC_GIOPAR_GFX64; +		break; +	case 1: +		tmp |= SGIMC_GIOPAR_EXP064; +		break; +	case 2: +		tmp |= SGIMC_GIOPAR_EXP164; +		break; +	} +	sgimc->giopar = tmp; +} + +static int ip22_gio_id(unsigned long addr, u32 *res) +{ +	u8 tmp8; +	u8 tmp16; +	u32 tmp32; +	u8 *ptr8; +	u16 *ptr16; +	u32 *ptr32; + +	ptr32 = (void *)CKSEG1ADDR(addr); +	if (!get_dbe(tmp32, ptr32)) { +		/* +		 * We got no DBE, but this doesn't mean anything. +		 * If GIO is pipelined (which can't be disabled +		 * for GFX slot) we don't get a DBE, but we see +		 * the transfer size as data. So we do an 8bit +		 * and a 16bit access and check whether the common +		 * data matches +		 */ +		ptr8 = (void *)CKSEG1ADDR(addr + 3); +		if (get_dbe(tmp8, ptr8)) { +			/* +			 * 32bit access worked, but 8bit doesn't +			 * so we don't see phantom reads on +			 * a pipelined bus, but a real card which +			 * doesn't support 8 bit reads +			 */ +			*res = tmp32; +			return 1; +		} +		ptr16 = (void *)CKSEG1ADDR(addr + 2); +		get_dbe(tmp16, ptr16); +		if (tmp8 == (tmp16 & 0xff) && +		    tmp8 == (tmp32 & 0xff) && +		    tmp16 == (tmp32 & 0xffff)) { +			*res = tmp32; +			return 1; +		} +	} +	return 0; /* nothing here */ +} + +#define HQ2_MYSTERY_OFFS       0x6A07C +#define NEWPORT_USTATUS_OFFS   0xF133C + +static int ip22_is_gr2(unsigned long addr) +{ +	u32 tmp; +	u32 *ptr; + +	/* HQ2 only allows 32bit accesses */ +	ptr = (void *)CKSEG1ADDR(addr + HQ2_MYSTERY_OFFS); +	if (!get_dbe(tmp, ptr)) { +		if (tmp == 0xdeadbeef) +			return 1; +	} +	return 0; +} + + +static void ip22_check_gio(int slotno, unsigned long addr, int irq) +{ +	const char *name = "Unknown"; +	struct gio_device *gio_dev; +	u32 tmp; +	__u8 id; +	int i; + +	/* first look for GR2/GR3 by checking mystery register */ +	if (ip22_is_gr2(addr)) +		tmp = 0x7f; +	else { +		if (!ip22_gio_id(addr, &tmp)) { +			/* +			 * no GIO signature at start address of slot +			 * since Newport doesn't have one, we check if +			 * user status register is readable +			 */ +			if (ip22_gio_id(addr + NEWPORT_USTATUS_OFFS, &tmp)) +				tmp = 0x7e; +			else +				tmp = 0; +		} +	} +	if (tmp) { +		id = GIO_ID(tmp); +		if (tmp & GIO_32BIT_ID) { +			if (tmp & GIO_64BIT_IFACE) +				ip22_gio_set_64bit(slotno); +		} +		for (i = 0; i < ARRAY_SIZE(gio_name_table); i++) { +			if (id == gio_name_table[i].id) { +				name = gio_name_table[i].name; +				break; +			} +		} +		printk(KERN_INFO "GIO: slot %d : %s (id %x)\n", +		       slotno, name, id); +		gio_dev = kzalloc(sizeof *gio_dev, GFP_KERNEL); +		gio_dev->name = name; +		gio_dev->slotno = slotno; +		gio_dev->id.id = id; +		gio_dev->resource.start = addr; +		gio_dev->resource.end = addr + 0x3fffff; +		gio_dev->resource.flags = IORESOURCE_MEM; +		gio_dev->irq = irq; +		dev_set_name(&gio_dev->dev, "%d", slotno); +		gio_device_register(gio_dev); +	} else +		printk(KERN_INFO "GIO: slot %d : Empty\n", slotno); +} + +static struct bus_type gio_bus_type = { +	.name	   = "gio", +	.dev_attrs = gio_dev_attrs, +	.match	   = gio_bus_match, +	.probe	   = gio_device_probe, +	.remove	   = gio_device_remove, +	.suspend   = gio_device_suspend, +	.resume	   = gio_device_resume, +	.shutdown  = gio_device_shutdown, +	.uevent	   = gio_device_uevent, +}; + +static struct resource gio_bus_resource = { +	.start = GIO_SLOT_GFX_BASE, +	.end   = GIO_SLOT_GFX_BASE + 0x9fffff, +	.name  = "GIO Bus", +	.flags = IORESOURCE_MEM, +}; + +int __init ip22_gio_init(void) +{ +	unsigned int pbdma __maybe_unused; +	int ret; + +	ret = device_register(&gio_bus); +	if (ret) +		return ret; + +	ret = bus_register(&gio_bus_type); +	if (!ret) { +		request_resource(&iomem_resource, &gio_bus_resource); +		printk(KERN_INFO "GIO: Probing bus...\n"); + +		if (ip22_is_fullhouse()) { +			/* Indigo2 */ +			ip22_check_gio(0, GIO_SLOT_GFX_BASE, SGI_GIO_1_IRQ); +			ip22_check_gio(1, GIO_SLOT_EXP0_BASE, SGI_GIO_1_IRQ); +		} else { +			/* Indy/Challenge S */ +			if (get_dbe(pbdma, (unsigned int *)&hpc3c1->pbdma[1])) +				ip22_check_gio(0, GIO_SLOT_GFX_BASE, +					       SGI_GIO_0_IRQ); +			ip22_check_gio(1, GIO_SLOT_EXP0_BASE, SGI_GIOEXP0_IRQ); +			ip22_check_gio(2, GIO_SLOT_EXP1_BASE, SGI_GIOEXP1_IRQ); +		} +	} else +		device_unregister(&gio_bus); + +	return ret; +} + +subsys_initcall(ip22_gio_init); diff --git a/arch/mips/sgi-ip22/ip22-hpc.c b/arch/mips/sgi-ip22/ip22-hpc.c index 5c00cdd20d8..bb70589b5f7 100644 --- a/arch/mips/sgi-ip22/ip22-hpc.c +++ b/arch/mips/sgi-ip22/ip22-hpc.c @@ -1,7 +1,7 @@  /*   * ip22-hpc.c: Routines for generic manipulation of the HPC controllers.   * - * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) + * Copyright (C) 1996 David S. Miller (davem@davemloft.net)   * Copyright (C) 1998 Ralf Baechle   */ diff --git a/arch/mips/sgi-ip22/ip22-int.c b/arch/mips/sgi-ip22/ip22-int.c index 383f11d7f44..c66889fc491 100644 --- a/arch/mips/sgi-ip22/ip22-int.c +++ b/arch/mips/sgi-ip22/ip22-int.c @@ -1,12 +1,12 @@  /*   * ip22-int.c: Routines for generic manipulation of the INT[23] ASIC - *             found on INDY and Indigo2 workstations. + *	       found on INDY and Indigo2 workstations.   * - * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) + * Copyright (C) 1996 David S. Miller (davem@davemloft.net)   * Copyright (C) 1997, 1998 Ralf Baechle (ralf@gnu.org)   * Copyright (C) 1999 Andrew R. Baker (andrewb@uab.edu) - *                    - Indigo2 changes - *                    - Interrupt handling fixes + *		      - Indigo2 changes + *		      - Interrupt handling fixes   * Copyright (C) 2001, 2003 Ladislav Michl (ladis@linux-mips.org)   */  #include <linux/types.h> @@ -31,88 +31,80 @@ static char lc3msk_to_irqnr[256];  extern int ip22_eisa_init(void); -static void enable_local0_irq(unsigned int irq) +static void enable_local0_irq(struct irq_data *d)  {  	/* don't allow mappable interrupt to be enabled from setup_irq,  	 * we have our own way to do so */ -	if (irq != SGI_MAP_0_IRQ) -		sgint->imask0 |= (1 << (irq - SGINT_LOCAL0)); +	if (d->irq != SGI_MAP_0_IRQ) +		sgint->imask0 |= (1 << (d->irq - SGINT_LOCAL0));  } -static void disable_local0_irq(unsigned int irq) +static void disable_local0_irq(struct irq_data *d)  { -	sgint->imask0 &= ~(1 << (irq - SGINT_LOCAL0)); +	sgint->imask0 &= ~(1 << (d->irq - SGINT_LOCAL0));  }  static struct irq_chip ip22_local0_irq_type = {  	.name		= "IP22 local 0", -	.ack		= disable_local0_irq, -	.mask		= disable_local0_irq, -	.mask_ack	= disable_local0_irq, -	.unmask		= enable_local0_irq, +	.irq_mask	= disable_local0_irq, +	.irq_unmask	= enable_local0_irq,  }; -static void enable_local1_irq(unsigned int irq) +static void enable_local1_irq(struct irq_data *d)  {  	/* don't allow mappable interrupt to be enabled from setup_irq,  	 * we have our own way to do so */ -	if (irq != SGI_MAP_1_IRQ) -		sgint->imask1 |= (1 << (irq - SGINT_LOCAL1)); +	if (d->irq != SGI_MAP_1_IRQ) +		sgint->imask1 |= (1 << (d->irq - SGINT_LOCAL1));  } -static void disable_local1_irq(unsigned int irq) +static void disable_local1_irq(struct irq_data *d)  { -	sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1)); +	sgint->imask1 &= ~(1 << (d->irq - SGINT_LOCAL1));  }  static struct irq_chip ip22_local1_irq_type = {  	.name		= "IP22 local 1", -	.ack		= disable_local1_irq, -	.mask		= disable_local1_irq, -	.mask_ack	= disable_local1_irq, -	.unmask		= enable_local1_irq, +	.irq_mask	= disable_local1_irq, +	.irq_unmask	= enable_local1_irq,  }; -static void enable_local2_irq(unsigned int irq) +static void enable_local2_irq(struct irq_data *d)  {  	sgint->imask0 |= (1 << (SGI_MAP_0_IRQ - SGINT_LOCAL0)); -	sgint->cmeimask0 |= (1 << (irq - SGINT_LOCAL2)); +	sgint->cmeimask0 |= (1 << (d->irq - SGINT_LOCAL2));  } -static void disable_local2_irq(unsigned int irq) +static void disable_local2_irq(struct irq_data *d)  { -	sgint->cmeimask0 &= ~(1 << (irq - SGINT_LOCAL2)); +	sgint->cmeimask0 &= ~(1 << (d->irq - SGINT_LOCAL2));  	if (!sgint->cmeimask0)  		sgint->imask0 &= ~(1 << (SGI_MAP_0_IRQ - SGINT_LOCAL0));  }  static struct irq_chip ip22_local2_irq_type = {  	.name		= "IP22 local 2", -	.ack		= disable_local2_irq, -	.mask		= disable_local2_irq, -	.mask_ack	= disable_local2_irq, -	.unmask		= enable_local2_irq, +	.irq_mask	= disable_local2_irq, +	.irq_unmask	= enable_local2_irq,  }; -static void enable_local3_irq(unsigned int irq) +static void enable_local3_irq(struct irq_data *d)  {  	sgint->imask1 |= (1 << (SGI_MAP_1_IRQ - SGINT_LOCAL1)); -	sgint->cmeimask1 |= (1 << (irq - SGINT_LOCAL3)); +	sgint->cmeimask1 |= (1 << (d->irq - SGINT_LOCAL3));  } -static void disable_local3_irq(unsigned int irq) +static void disable_local3_irq(struct irq_data *d)  { -	sgint->cmeimask1 &= ~(1 << (irq - SGINT_LOCAL3)); +	sgint->cmeimask1 &= ~(1 << (d->irq - SGINT_LOCAL3));  	if (!sgint->cmeimask1)  		sgint->imask1 &= ~(1 << (SGI_MAP_1_IRQ - SGINT_LOCAL1));  }  static struct irq_chip ip22_local3_irq_type = {  	.name		= "IP22 local 3", -	.ack		= disable_local3_irq, -	.mask		= disable_local3_irq, -	.mask_ack	= disable_local3_irq, -	.unmask		= enable_local3_irq, +	.irq_mask	= disable_local3_irq, +	.irq_unmask	= enable_local3_irq,  };  static void indy_local0_irqdispatch(void) @@ -127,9 +119,14 @@ static void indy_local0_irqdispatch(void)  	} else  		irq = lc0msk_to_irqnr[mask]; -	/* if irq == 0, then the interrupt has already been cleared */ +	/* +	 * workaround for INT2 bug; if irq == 0, INT2 has seen a fifo full +	 * irq, but failed to latch it into status register +	 */  	if (irq)  		do_IRQ(irq); +	else +		do_IRQ(SGINT_LOCAL0 + 0);  }  static void indy_local1_irqdispatch(void) @@ -156,39 +153,39 @@ static void __irq_entry indy_buserror_irq(void)  	int irq = SGI_BUSERR_IRQ;  	irq_enter(); -	kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); +	kstat_incr_irq_this_cpu(irq);  	ip22_be_interrupt(irq);  	irq_exit();  }  static struct irqaction local0_cascade = {  	.handler	= no_action, -	.flags		= IRQF_DISABLED, +	.flags		= IRQF_NO_THREAD,  	.name		= "local0 cascade",  };  static struct irqaction local1_cascade = {  	.handler	= no_action, -	.flags		= IRQF_DISABLED, +	.flags		= IRQF_NO_THREAD,  	.name		= "local1 cascade",  };  static struct irqaction buserr = {  	.handler	= no_action, -	.flags		= IRQF_DISABLED, +	.flags		= IRQF_NO_THREAD,  	.name		= "Bus Error",  };  static struct irqaction map0_cascade = {  	.handler	= no_action, -	.flags		= IRQF_DISABLED, +	.flags		= IRQF_NO_THREAD,  	.name		= "mapable0 cascade",  };  #ifdef USE_LIO3_IRQ  static struct irqaction map1_cascade = {  	.handler	= no_action, -	.flags		= IRQF_DISABLED, +	.flags		= IRQF_NO_THREAD,  	.name		= "mapable1 cascade",  };  #define SGI_INTERRUPTS	SGINT_END @@ -203,24 +200,24 @@ extern void indy_8254timer_irq(void);   * at all) like:   *   *	MIPS IRQ	Source - *      --------        ------ - *             0	Software (ignored) - *             1        Software (ignored) - *             2        Local IRQ level zero - *             3        Local IRQ level one - *             4        8254 Timer zero - *             5        8254 Timer one - *             6        Bus Error - *             7        R4k timer (what we use) + *	--------	------ + *	       0	Software (ignored) + *	       1	Software (ignored) + *	       2	Local IRQ level zero + *	       3	Local IRQ level one + *	       4	8254 Timer zero + *	       5	8254 Timer one + *	       6	Bus Error + *	       7	R4k timer (what we use)   *   * We handle the IRQ according to _our_ priority which is:   * - * Highest ----     R4k Timer - *                  Local IRQ zero - *                  Local IRQ one - *                  Bus Error - *                  8254 Timer zero - * Lowest  ----     8254 Timer one + * Highest ----	    R4k Timer + *		    Local IRQ zero + *		    Local IRQ one + *		    Bus Error + *		    8254 Timer zero + * Lowest  ----	    8254 Timer one   *   * then we just return, if multiple IRQs are pending then we will just take   * another exception, big deal. @@ -320,7 +317,7 @@ void __init arch_init_irq(void)  		else  			handler		= &ip22_local3_irq_type; -		set_irq_chip_and_handler(i, handler, handle_level_irq); +		irq_set_chip_and_handler(i, handler, handle_level_irq);  	}  	/* vector handler. this register the IRQ as non-sharable */ diff --git a/arch/mips/sgi-ip22/ip22-mc.c b/arch/mips/sgi-ip22/ip22-mc.c index 5268ac187bb..7cec0a4e527 100644 --- a/arch/mips/sgi-ip22/ip22-mc.c +++ b/arch/mips/sgi-ip22/ip22-mc.c @@ -1,7 +1,7 @@  /*   * ip22-mc.c: Routines for manipulating SGI Memory Controller.   * - * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) + * Copyright (C) 1996 David S. Miller (davem@davemloft.net)   * Copyright (C) 1999 Andrew R. Baker (andrewb@uab.edu) - Indigo2 changes   * Copyright (C) 2003 Ladislav Michl  (ladis@linux-mips.org)   * Copyright (C) 2004 Peter Fuerst    (pf@net.alphadv.de) - IP28 @@ -121,33 +121,33 @@ void __init sgimc_init(void)  	 */  	/* Step 0: Make sure we turn off the watchdog in case it's -	 *         still running (which might be the case after a -	 *         soft reboot). +	 *	   still running (which might be the case after a +	 *	   soft reboot).  	 */  	tmp = sgimc->cpuctrl0;  	tmp &= ~SGIMC_CCTRL0_WDOG;  	sgimc->cpuctrl0 = tmp;  	/* Step 1: The CPU/GIO error status registers will not latch -	 *         up a new error status until the register has been -	 *         cleared by the cpu.  These status registers are -	 *         cleared by writing any value to them. +	 *	   up a new error status until the register has been +	 *	   cleared by the cpu.	These status registers are +	 *	   cleared by writing any value to them.  	 */  	sgimc->cstat = sgimc->gstat = 0;  	/* Step 2: Enable all parity checking in cpu control register -	 *         zero. +	 *	   zero.  	 */  	/* don't touch parity settings for IP28 */ -#ifndef CONFIG_SGI_IP28  	tmp = sgimc->cpuctrl0; -	tmp |= (SGIMC_CCTRL0_EPERRGIO | SGIMC_CCTRL0_EPERRMEM | -		SGIMC_CCTRL0_R4KNOCHKPARR); +#ifndef CONFIG_SGI_IP28 +	tmp |= SGIMC_CCTRL0_EPERRGIO | SGIMC_CCTRL0_EPERRMEM;  #endif +	tmp |= SGIMC_CCTRL0_R4KNOCHKPARR;  	sgimc->cpuctrl0 = tmp;  	/* Step 3: Setup the MC write buffer depth, this is controlled -	 *         in cpu control register 1 in the lower 4 bits. +	 *	   in cpu control register 1 in the lower 4 bits.  	 */  	tmp = sgimc->cpuctrl1;  	tmp &= ~0xf; @@ -155,30 +155,31 @@ void __init sgimc_init(void)  	sgimc->cpuctrl1 = tmp;  	/* Step 4: Initialize the RPSS divider register to run as fast -	 *         as it can correctly operate.  The register is laid -	 *         out as follows: +	 *	   as it can correctly operate.	 The register is laid +	 *	   out as follows:  	 * -	 *         ---------------------------------------- -	 *         |  RESERVED  |   INCREMENT   | DIVIDER | -	 *         ---------------------------------------- -	 *          31        16 15            8 7       0 +	 *	   ---------------------------------------- +	 *	   |  RESERVED	|   INCREMENT	| DIVIDER | +	 *	   ---------------------------------------- +	 *	    31	      16 15	       8 7	 0  	 * -	 *         DIVIDER determines how often a 'tick' happens, -	 *         INCREMENT determines by how the RPSS increment -	 *         registers value increases at each 'tick'. Thus, -	 *         for IP22 we get INCREMENT=1, DIVIDER=1 == 0x101 +	 *	   DIVIDER determines how often a 'tick' happens, +	 *	   INCREMENT determines by how the RPSS increment +	 *	   registers value increases at each 'tick'. Thus, +	 *	   for IP22 we get INCREMENT=1, DIVIDER=1 == 0x101  	 */  	sgimc->divider = 0x101;  	/* Step 5: Initialize GIO64 arbitrator configuration register.  	 *  	 * NOTE: HPC init code in sgihpc_init() must run before us because -	 *       we need to know Guiness vs. FullHouse and the board -	 *       revision on this machine. You have been warned. +	 *	 we need to know Guiness vs. FullHouse and the board +	 *	 revision on this machine. You have been warned.  	 */  	/* First the basic invariants across all GIO64 implementations. */ -	tmp = SGIMC_GIOPAR_HPC64;	/* All 1st HPC's interface at 64bits */ +	tmp = sgimc->giopar & SGIMC_GIOPAR_GFX64; /* keep gfx 64bit settings */ +	tmp |= SGIMC_GIOPAR_HPC64;	/* All 1st HPC's interface at 64bits */  	tmp |= SGIMC_GIOPAR_ONEBUS;	/* Only one physical GIO bus exists */  	if (ip22_is_fullhouse()) { @@ -186,19 +187,18 @@ void __init sgimc_init(void)  		if (SGIOC_SYSID_BOARDREV(sgioc->sysid) < 2) {  			tmp |= SGIMC_GIOPAR_HPC264;	/* 2nd HPC at 64bits */  			tmp |= SGIMC_GIOPAR_PLINEEXP0;	/* exp0 pipelines */ -			tmp |= SGIMC_GIOPAR_MASTEREXP1;	/* exp1 masters */ +			tmp |= SGIMC_GIOPAR_MASTEREXP1; /* exp1 masters */  			tmp |= SGIMC_GIOPAR_RTIMEEXP0;	/* exp0 is realtime */  		} else {  			tmp |= SGIMC_GIOPAR_HPC264;	/* 2nd HPC 64bits */  			tmp |= SGIMC_GIOPAR_PLINEEXP0;	/* exp[01] pipelined */  			tmp |= SGIMC_GIOPAR_PLINEEXP1; -			tmp |= SGIMC_GIOPAR_MASTEREISA;	/* EISA masters */ -			tmp |= SGIMC_GIOPAR_GFX64;	/* GFX at 64 bits */ +			tmp |= SGIMC_GIOPAR_MASTEREISA; /* EISA masters */  		}  	} else {  		/* Guiness specific settings. */  		tmp |= SGIMC_GIOPAR_EISA64;	/* MC talks to EISA at 64bits */ -		tmp |= SGIMC_GIOPAR_MASTEREISA;	/* EISA bus can act as master */ +		tmp |= SGIMC_GIOPAR_MASTEREISA; /* EISA bus can act as master */  	}  	sgimc->giopar = tmp;	/* poof */ diff --git a/arch/mips/sgi-ip22/ip22-nvram.c b/arch/mips/sgi-ip22/ip22-nvram.c index 0177566475d..e077036a676 100644 --- a/arch/mips/sgi-ip22/ip22-nvram.c +++ b/arch/mips/sgi-ip22/ip22-nvram.c @@ -14,11 +14,11 @@  #define EEPROM_WRITE	0xa000	/* serial memory write */  #define EEPROM_WRALL	0x8800	/* write all registers */  #define EEPROM_WDS	0x8000	/* disable all programming */ -#define	EEPROM_PRREAD	0xc000	/* read protect register */ -#define	EEPROM_PREN	0x9800	/* enable protect register mode */ -#define	EEPROM_PRCLEAR	0xffff	/* clear protect register */ -#define	EEPROM_PRWRITE	0xa000	/* write protect register */ -#define	EEPROM_PRDS	0x8000	/* disable protect register, forever */ +#define EEPROM_PRREAD	0xc000	/* read protect register */ +#define EEPROM_PREN	0x9800	/* enable protect register mode */ +#define EEPROM_PRCLEAR	0xffff	/* clear protect register */ +#define EEPROM_PRWRITE	0xa000	/* write protect register */ +#define EEPROM_PRDS	0x8000	/* disable protect register, forever */  #define EEPROM_EPROT	0x01	/* Protect register enable */  #define EEPROM_CSEL	0x02	/* Chip select */ @@ -27,7 +27,7 @@  #define EEPROM_DATI	0x10	/* Data in */  /* We need to use these functions early... */ -#define delay()	({						\ +#define delay() ({						\  	int x;							\  	for (x=0; x<100000; x++) __asm__ __volatile__(""); }) @@ -35,7 +35,7 @@  	__raw_writel(__raw_readl(ptr) & ~EEPROM_DATO, ptr);	\  	__raw_writel(__raw_readl(ptr) & ~EEPROM_ECLK, ptr);	\  	__raw_writel(__raw_readl(ptr) & ~EEPROM_EPROT, ptr);	\ -	delay();		                                \ +	delay();						\  	__raw_writel(__raw_readl(ptr) | EEPROM_CSEL, ptr);	\  	__raw_writel(__raw_readl(ptr) | EEPROM_ECLK, ptr); }) @@ -46,7 +46,7 @@  	__raw_writel(__raw_readl(ptr) | EEPROM_EPROT, ptr);	\  	__raw_writel(__raw_readl(ptr) | EEPROM_ECLK, ptr); }) -#define	BITS_IN_COMMAND	11 +#define BITS_IN_COMMAND 11  /*   * clock in the nvram command and the register number. For the   * national semiconductor nv ram chip the op code is 3 bits and diff --git a/arch/mips/sgi-ip22/ip22-platform.c b/arch/mips/sgi-ip22/ip22-platform.c index deddbf0ebe5..a14fd32b76b 100644 --- a/arch/mips/sgi-ip22/ip22-platform.c +++ b/arch/mips/sgi-ip22/ip22-platform.c @@ -132,12 +132,12 @@ static struct platform_device eth1_device = {   */  static int __init sgiseeq_devinit(void)  { -	unsigned int tmp; +	unsigned int pbdma __maybe_unused;  	int res, i;  	eth0_pd.hpc = hpc3c0;  	eth0_pd.irq = SGI_ENET_IRQ; -#define EADDR_NVOFS     250 +#define EADDR_NVOFS	250  	for (i = 0; i < 3; i++) {  		unsigned short tmp = ip22_nvram_read(EADDR_NVOFS / 2 + i); @@ -151,21 +151,21 @@ static int __init sgiseeq_devinit(void)  	/* Second HPC is missing? */  	if (ip22_is_fullhouse() || -	    get_dbe(tmp, (unsigned int *)&hpc3c1->pbdma[1])) +	    get_dbe(pbdma, (unsigned int *)&hpc3c1->pbdma[1]))  		return 0;  	sgimc->giopar |= SGIMC_GIOPAR_MASTEREXP1 | SGIMC_GIOPAR_EXP164 | -	                 SGIMC_GIOPAR_HPC264; +			 SGIMC_GIOPAR_HPC264;  	hpc3c1->pbus_piocfg[0][0] = 0x3ffff;  	/* interrupt/config register on Challenge S Mezz board */  	hpc3c1->pbus_extregs[0][0] = 0x30;  	eth1_pd.hpc = hpc3c1;  	eth1_pd.irq = SGI_GIO_0_IRQ; -#define EADDR_NVOFS     250 +#define EADDR_NVOFS	250  	for (i = 0; i < 3; i++) {  		unsigned short tmp = ip22_eeprom_read(&hpc3c1->eeprom, -		                                      EADDR_NVOFS / 2 + i); +						      EADDR_NVOFS / 2 + i);  		eth1_pd.mac[2 * i]     = tmp >> 8;  		eth1_pd.mac[2 * i + 1] = tmp & 0xff; diff --git a/arch/mips/sgi-ip22/ip22-reset.c b/arch/mips/sgi-ip22/ip22-reset.c index 45b6694c207..063c2dd31e7 100644 --- a/arch/mips/sgi-ip22/ip22-reset.c +++ b/arch/mips/sgi-ip22/ip22-reset.c @@ -18,7 +18,6 @@  #include <asm/io.h>  #include <asm/irq.h> -#include <asm/system.h>  #include <asm/reboot.h>  #include <asm/sgialib.h>  #include <asm/sgi/ioc.h> @@ -102,7 +101,7 @@ static void debounce(unsigned long data)  	del_timer(&debounce_timer);  	if (sgint->istat1 & SGINT_ISTAT1_PWR) {  		/* Interrupt still being sent. */ -		debounce_timer.expires = jiffies + (HZ / 20); /* 0.05s  */ +		debounce_timer.expires = jiffies + (HZ / 20); /* 0.05s	*/  		add_timer(&debounce_timer);  		sgioc->panel = SGIOC_PANEL_POWERON | SGIOC_PANEL_POWERINTR | @@ -167,7 +166,7 @@ static irqreturn_t panel_int(int irq, void *dev_id)  }  static int panic_event(struct notifier_block *this, unsigned long event, -                      void *ptr) +		      void *ptr)  {  	if (machine_state & MACHINE_PANICED)  		return NOTIFY_DONE; diff --git a/arch/mips/sgi-ip22/ip22-setup.c b/arch/mips/sgi-ip22/ip22-setup.c index 5deeb68b6c9..c7bdfe43df5 100644 --- a/arch/mips/sgi-ip22/ip22-setup.c +++ b/arch/mips/sgi-ip22/ip22-setup.c @@ -1,7 +1,7 @@  /*   * ip22-setup.c: SGI specific setup, including init of the feature struct.   * - * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) + * Copyright (C) 1996 David S. Miller (davem@davemloft.net)   * Copyright (C) 1997, 1998 Ralf Baechle (ralf@gnu.org)   */  #include <linux/init.h> @@ -26,9 +26,6 @@  #include <asm/sgi/hpc3.h>  #include <asm/sgi/ip22.h> -unsigned long sgi_gfxaddr; -EXPORT_SYMBOL_GPL(sgi_gfxaddr); -  extern void ip22_be_init(void) __init;  void __init plat_mem_setup(void) @@ -78,22 +75,4 @@ void __init plat_mem_setup(void)  		prom_flags |= PROM_FLAG_USE_AS_CONSOLE;  		add_preferred_console("arc", 0, NULL);  	} - -#if defined(CONFIG_VT) && defined(CONFIG_SGI_NEWPORT_CONSOLE) -	{ -		ULONG *gfxinfo; -		ULONG * (*__vec)(void) = (void *) (long) -			*((_PULONG *)(long)((PROMBLOCK)->pvector + 0x20)); - -		gfxinfo = __vec(); -		sgi_gfxaddr = ((gfxinfo[1] >= 0xa0000000 -			       && gfxinfo[1] <= 0xc0000000) -			       ? gfxinfo[1] - 0xa0000000 : 0); - -		/* newport addresses? */ -		if (sgi_gfxaddr == 0x1f0f0000 || sgi_gfxaddr == 0x1f4f0000) { -			conswitchp = &newport_con; -		} -	} -#endif  } diff --git a/arch/mips/sgi-ip22/ip22-time.c b/arch/mips/sgi-ip22/ip22-time.c index 603fc91c103..045aa89f28d 100644 --- a/arch/mips/sgi-ip22/ip22-time.c +++ b/arch/mips/sgi-ip22/ip22-time.c @@ -10,6 +10,7 @@   * Copyright (C) 2003, 06 Ralf Baechle (ralf@linux-mips.org)   */  #include <linux/bcd.h> +#include <linux/i8253.h>  #include <linux/init.h>  #include <linux/irq.h>  #include <linux/kernel.h> @@ -20,7 +21,6 @@  #include <asm/cpu.h>  #include <asm/mipsregs.h> -#include <asm/i8253.h>  #include <asm/io.h>  #include <asm/irq.h>  #include <asm/time.h> @@ -32,7 +32,7 @@  static unsigned long dosample(void)  {  	u32 ct0, ct1; -	u8 msb, lsb; +	u8 msb;  	/* Start the counter. */  	sgint->tcword = (SGINT_TCWORD_CNT2 | SGINT_TCWORD_CALL | @@ -46,7 +46,7 @@ static unsigned long dosample(void)  	/* Latch and spin until top byte of counter2 is zero */  	do {  		writeb(SGINT_TCWORD_CNT2 | SGINT_TCWORD_CLAT, &sgint->tcword); -		lsb = readb(&sgint->tcnt2); +		(void) readb(&sgint->tcnt2);  		msb = readb(&sgint->tcnt2);  		ct1 = read_c0_count();  	} while (msb); @@ -123,7 +123,7 @@ void __irq_entry indy_8254timer_irq(void)  	char c;  	irq_enter(); -	kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); +	kstat_incr_irq_this_cpu(irq);  	printk(KERN_ALERT "Oops, got 8254 interrupt.\n");  	ArcRead(0, &c, 1, &cnt);  	ArcEnterInteractiveMode(); diff --git a/arch/mips/sgi-ip22/ip28-berr.c b/arch/mips/sgi-ip22/ip28-berr.c index 88c684e05a3..3f47346608d 100644 --- a/arch/mips/sgi-ip22/ip28-berr.c +++ b/arch/mips/sgi-ip22/ip28-berr.c @@ -11,7 +11,6 @@  #include <linux/seq_file.h>  #include <asm/addrspace.h> -#include <asm/system.h>  #include <asm/traps.h>  #include <asm/branch.h>  #include <asm/irq_regs.h> @@ -137,14 +136,14 @@ static void save_and_clear_buserr(void)  	hpc3.scsi[1].cbp   = hpc3c0->scsi_chan1.cbptr;  	hpc3.scsi[1].ndptr = hpc3c0->scsi_chan1.ndptr; -	hpc3.ethrx.addr  = (unsigned long)&hpc3c0->ethregs.rx_cbptr; -	hpc3.ethrx.ctrl  = hpc3c0->ethregs.rx_ctrl; /* HPC3_ERXCTRL_ACTIVE ? */ -	hpc3.ethrx.cbp   = hpc3c0->ethregs.rx_cbptr; +	hpc3.ethrx.addr	 = (unsigned long)&hpc3c0->ethregs.rx_cbptr; +	hpc3.ethrx.ctrl	 = hpc3c0->ethregs.rx_ctrl; /* HPC3_ERXCTRL_ACTIVE ? */ +	hpc3.ethrx.cbp	 = hpc3c0->ethregs.rx_cbptr;  	hpc3.ethrx.ndptr = hpc3c0->ethregs.rx_ndptr; -	hpc3.ethtx.addr  = (unsigned long)&hpc3c0->ethregs.tx_cbptr; -	hpc3.ethtx.ctrl  = hpc3c0->ethregs.tx_ctrl; /* HPC3_ETXCTRL_ACTIVE ? */ -	hpc3.ethtx.cbp   = hpc3c0->ethregs.tx_cbptr; +	hpc3.ethtx.addr	 = (unsigned long)&hpc3c0->ethregs.tx_cbptr; +	hpc3.ethtx.ctrl	 = hpc3c0->ethregs.tx_ctrl; /* HPC3_ETXCTRL_ACTIVE ? */ +	hpc3.ethtx.cbp	 = hpc3c0->ethregs.tx_cbptr;  	hpc3.ethtx.ndptr = hpc3c0->ethregs.tx_ndptr;  	for (i = 0; i < 8; ++i) { @@ -197,11 +196,11 @@ static void print_cache_tags(void)  			scb | (1 << 12)*i);  	}  	i = read_c0_config(); -	scb = i & (1 << 13) ? 7:6;      /* scblksize = 2^[7..6] */ +	scb = i & (1 << 13) ? 7:6;	/* scblksize = 2^[7..6] */  	scw = ((i >> 16) & 7) + 19 - 1; /* scwaysize = 2^[24..19] / 2 */  	i = ((1 << scw) - 1) & ~((1 << scb) - 1); -	printk(KERN_ERR "S: 0: %08x %08x, 1: %08x %08x  (PA[%u:%u] %05x)\n", +	printk(KERN_ERR "S: 0: %08x %08x, 1: %08x %08x	(PA[%u:%u] %05x)\n",  		cache_tags.tags[0][0].hi, cache_tags.tags[0][0].lo,  		cache_tags.tags[0][1].hi, cache_tags.tags[0][1].lo,  		scw-1, scb, i & (unsigned)cache_tags.err_addr);  | 
