diff options
| author | Matthew Wilcox <willy@debian.org> | 2003-01-12 22:20:21 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@penguin.transmeta.com> | 2003-01-12 22:20:21 -0800 |
| commit | 4de460b9cf3077fd7de1068bee08a6324c272043 (patch) | |
| tree | 1a86a440165af119340b59bbf12c19bc06165096 | |
| parent | d97c33778dfa512c4aab4a72d3af49aa308c09a8 (diff) | |
[PATCH] More parisc updates
Updates for drivers/parisc. Mostly conversion to generic device model.
New hppb driver from Ryan Bradetich.
| -rw-r--r-- | drivers/parisc/Kconfig | 19 | ||||
| -rw-r--r-- | drivers/parisc/Makefile | 34 | ||||
| -rw-r--r-- | drivers/parisc/asp.c | 2 | ||||
| -rw-r--r-- | drivers/parisc/ccio-dma.c | 80 | ||||
| -rw-r--r-- | drivers/parisc/ccio-rm-dma.c | 2 | ||||
| -rw-r--r-- | drivers/parisc/dino.c | 26 | ||||
| -rw-r--r-- | drivers/parisc/eisa.c | 2 | ||||
| -rw-r--r-- | drivers/parisc/gsc.h | 1 | ||||
| -rw-r--r-- | drivers/parisc/hppb.c | 111 | ||||
| -rw-r--r-- | drivers/parisc/iosapic.c | 2 | ||||
| -rw-r--r-- | drivers/parisc/lasi.c | 5 | ||||
| -rw-r--r-- | drivers/parisc/lba_pci.c | 21 | ||||
| -rw-r--r-- | drivers/parisc/led.c | 2 | ||||
| -rw-r--r-- | drivers/parisc/power.c | 94 | ||||
| -rw-r--r-- | drivers/parisc/sba_iommu.c | 51 | ||||
| -rw-r--r-- | drivers/parisc/superio.c | 11 | ||||
| -rw-r--r-- | drivers/parisc/wax.c | 2 |
17 files changed, 263 insertions, 202 deletions
diff --git a/drivers/parisc/Kconfig b/drivers/parisc/Kconfig index 8919ff77718d..ef324ada6193 100644 --- a/drivers/parisc/Kconfig +++ b/drivers/parisc/Kconfig @@ -10,6 +10,13 @@ config GSC are not found in B1000, C3000, J5000, A500, L1000, N4000 and upwards. If in doubt, say "Y". +config HPPB + bool "HP-PB bus support" + depends on GSC + help + The HP-PB bus was used in the Nova class and K-class servers. + If in doubt, say "Y" + config IOMMU_CCIO bool "U2/Uturn I/O MMU" depends on GSC @@ -60,6 +67,8 @@ config PCI Beware that some GSC cards have a Dino onboard and PCI inside them, so it may be safest to say "Y" anyway. +source "drivers/pci/Kconfig" + config GSC_DINO bool "GSCtoPCI/Dino PCI support" depends on PCI && GSC @@ -82,22 +91,21 @@ config PCI_LBA config IOSAPIC bool depends on PCI_LBA - default y + default PCI_LBA config IOMMU_SBA bool depends on PCI_LBA - default y - -source "drivers/pci/Kconfig" + default PCI_LBA #config PCI_EPIC # bool "EPIC/SAGA PCI support" # depends on PCI config SUPERIO - bool + bool "SuperIO (SuckyIO) support" depends on PCI + default y help Say Y here to support the SuperIO chip found in Bxxxx, C3xxx and J5xxx+ machines. This enables IDE, Floppy, Parallel Port, and @@ -105,6 +113,7 @@ config SUPERIO config CHASSIS_LCD_LED bool "Chassis LCD and LED support" + default y help Say Y here if you want to enable support for the Heartbeat, Disk/Network activities LEDs on some PA-RISC machines, diff --git a/drivers/parisc/Makefile b/drivers/parisc/Makefile index ef7c6211b812..09e248fd596b 100644 --- a/drivers/parisc/Makefile +++ b/drivers/parisc/Makefile @@ -2,24 +2,32 @@ # Makefile for most of the non-PCI devices in PA-RISC machines # -export-objs := gsc.o superio.o +export-objs := gsc.o superio.o -obj-y := gsc.o power.o +obj-y := obj-m := obj-n := obj- := -obj-$(CONFIG_GSC_DINO) += dino.o -obj-$(CONFIG_GSC_LASI) += lasi.o asp.o -obj-$(CONFIG_GSC_WAX) += wax.o -obj-$(CONFIG_EISA) += eisa.o eisa_enumerator.o eisa_eeprom.o -obj-$(CONFIG_SUPERIO) += superio.o -obj-$(CONFIG_PCI_LBA) += lba_pci.o # I/O SAPIC is also on IA64 platforms. # The two could be merged into a common source some day. -obj-$(CONFIG_IOSAPIC) += iosapic.o -obj-$(CONFIG_IOMMU_SBA) += sba_iommu.o +obj-$(CONFIG_IOSAPIC) += iosapic.o +obj-$(CONFIG_IOMMU_SBA) += sba_iommu.o +obj-$(CONFIG_PCI_LBA) += lba_pci.o + # Only use one of them: ccio-rm-dma is for PCX-W systems *only* -# obj-$(CONFIG_IOMMU_CCIO) += ccio-rm-dma.o -obj-$(CONFIG_IOMMU_CCIO) += ccio-dma.o -obj-$(CONFIG_CHASSIS_LCD_LED) += led.o +# obj-$(CONFIG_IOMMU_CCIO) += ccio-rm-dma.o +obj-$(CONFIG_IOMMU_CCIO) += ccio-dma.o + +obj-y += gsc.o + +obj-$(CONFIG_HPPB) += hppb.o +obj-$(CONFIG_GSC_DINO) += dino.o +obj-$(CONFIG_GSC_LASI) += lasi.o asp.o +obj-$(CONFIG_GSC_WAX) += wax.o +obj-$(CONFIG_EISA) += eisa.o eisa_enumerator.o eisa_eeprom.o + +obj-$(CONFIG_SUPERIO) += superio.o +obj-$(CONFIG_CHASSIS_LCD_LED) += led.o +obj-y += power.o + diff --git a/drivers/parisc/asp.c b/drivers/parisc/asp.c index 2d45a5b099af..e29f8ca8e6f3 100644 --- a/drivers/parisc/asp.c +++ b/drivers/parisc/asp.c @@ -76,6 +76,8 @@ asp_init_chip(struct parisc_device *dev) printk(KERN_INFO "%s version %d at 0x%lx found.\n", asp->name, asp->version, dev->hpa); + snprintf(dev->dev.name, sizeof(dev->dev.name), "%s version %d", + asp->name, asp->version); /* the IRQ ASP should use */ ret = -EBUSY; diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c index 9e6e5994334e..b179292a8f60 100644 --- a/drivers/parisc/ccio-dma.c +++ b/drivers/parisc/ccio-dma.c @@ -50,6 +50,7 @@ #include <asm/dma.h> #include <asm/io.h> #include <asm/hardware.h> /* for register_module() */ +#include <asm/parisc-device.h> /* ** Choose "ccio" since that's what HP-UX calls it. @@ -599,7 +600,7 @@ ccio_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt) * This function implements the pci_dma_supported function. */ static int -ccio_dma_supported(struct pci_dev *dev, u64 mask) +ccio_dma_supported(struct device *dev, u64 mask) { if(dev == NULL) { printk(KERN_ERR MODULE_NAME ": EISA/ISA/et al not supported\n"); @@ -607,8 +608,6 @@ ccio_dma_supported(struct pci_dev *dev, u64 mask) return 0; } - dev->dma_mask = mask; /* save it */ - /* only support 32-bit devices (ie PCI/GSC) */ return (int)(mask == 0xffffffffUL); } @@ -623,7 +622,8 @@ ccio_dma_supported(struct pci_dev *dev, u64 mask) * This function implements the pci_map_single function. */ static dma_addr_t -ccio_map_single(struct pci_dev *dev, void *addr, size_t size, int direction) +ccio_map_single(struct device *dev, void *addr, size_t size, + enum dma_data_direction direction) { int idx; struct ioc *ioc; @@ -631,11 +631,9 @@ ccio_map_single(struct pci_dev *dev, void *addr, size_t size, int direction) dma_addr_t iovp; dma_addr_t offset; u64 *pdir_start; - unsigned long hint = hint_lookup[direction]; + unsigned long hint = hint_lookup[(int)direction]; - ASSERT(dev); - ASSERT(dev->sysdata); - ASSERT(HBA_DATA(dev->sysdata)->iommu); + BUG_ON(!dev); ioc = GET_IOC(dev); ASSERT(size > 0); @@ -692,16 +690,14 @@ ccio_map_single(struct pci_dev *dev, void *addr, size_t size, int direction) * This function implements the pci_unmap_single function. */ static void -ccio_unmap_single(struct pci_dev *dev, dma_addr_t iova, size_t size, - int direction) +ccio_unmap_single(struct device *dev, dma_addr_t iova, size_t size, + enum dma_data_direction direction) { struct ioc *ioc; unsigned long flags; dma_addr_t offset = iova & ~IOVP_MASK; - ASSERT(dev); - ASSERT(dev->sysdata); - ASSERT(HBA_DATA(dev->sysdata)->iommu); + BUG_ON(!dev); ioc = GET_IOC(dev); DBG_RUN("%s() iovp 0x%lx/%x\n", @@ -732,7 +728,7 @@ ccio_unmap_single(struct pci_dev *dev, dma_addr_t iova, size_t size, * This function implements the pci_alloc_consistent function. */ static void * -ccio_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma_handle) +ccio_alloc_consistent(struct device *dev, size_t size, dma_addr_t *dma_handle) { void *ret; #if 0 @@ -765,7 +761,7 @@ ccio_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma_handle) * This function implements the pci_free_consistent function. */ static void -ccio_free_consistent(struct pci_dev *dev, size_t size, void *cpu_addr, +ccio_free_consistent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle) { ccio_unmap_single(dev, dma_handle, size, 0); @@ -964,17 +960,15 @@ ccio_coalesce_chunks(struct ioc *ioc, struct scatterlist *startsg, int nents) * This function implements the pci_map_sg function. */ static int -ccio_map_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, - int direction) +ccio_map_sg(struct device *dev, struct scatterlist *sglist, int nents, + enum dma_data_direction direction) { struct ioc *ioc; int coalesced, filled = 0; unsigned long flags; - unsigned long hint = hint_lookup[direction]; + unsigned long hint = hint_lookup[(int)direction]; - ASSERT(dev); - ASSERT(dev->sysdata); - ASSERT(HBA_DATA(dev->sysdata)->iommu); + BUG_ON(!dev); ioc = GET_IOC(dev); DBG_RUN_SG("%s() START %d entries\n", __FUNCTION__, nents); @@ -1032,14 +1026,12 @@ ccio_map_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, * This function implements the pci_unmap_sg function. */ static void -ccio_unmap_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, - int direction) +ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, + enum dma_data_direction direction) { struct ioc *ioc; - ASSERT(dev); - ASSERT(dev->sysdata); - ASSERT(HBA_DATA(dev->sysdata)->iommu); + BUG_ON(!dev); ioc = GET_IOC(dev); DBG_RUN_SG("%s() START %d entries, %08lx,%x\n", @@ -1062,16 +1054,17 @@ ccio_unmap_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, DBG_RUN_SG("%s() DONE (nents %d)\n", __FUNCTION__, nents); } -static struct pci_dma_ops ccio_ops = { - ccio_dma_supported, - ccio_alloc_consistent, - ccio_free_consistent, - ccio_map_single, - ccio_unmap_single, - ccio_map_sg, - ccio_unmap_sg, - NULL, /* dma_sync_single : NOP for U2/Uturn */ - NULL, /* dma_sync_sg : ditto */ +static struct hppa_dma_ops ccio_ops = { + .dma_supported = ccio_dma_supported, + .alloc_consistent = ccio_alloc_consistent, + .alloc_noncoherent = ccio_alloc_consistent, + .free_consistent = ccio_free_consistent, + .map_single = ccio_map_single, + .unmap_single = ccio_unmap_single, + .map_sg = ccio_map_sg, + .unmap_sg = ccio_unmap_sg, + .dma_sync_single = NULL, /* NOP for U2/Uturn */ + .dma_sync_sg = NULL, /* ditto */ }; #ifdef CONFIG_PROC_FS @@ -1529,6 +1522,7 @@ static int ccio_probe(struct parisc_device *dev) memset(ioc, 0, sizeof(struct ioc)); ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn"; + strncpy(dev->dev.name, ioc->name, sizeof(dev->dev.name)); printk(KERN_INFO "Found %s at 0x%lx\n", ioc->name, dev->hpa); @@ -1542,6 +1536,12 @@ static int ccio_probe(struct parisc_device *dev) ccio_ioc_init(ioc); ccio_init_resources(ioc); hppa_dma_ops = &ccio_ops; + dev->dev.platform_data = kmalloc(sizeof(struct pci_hba_data), GFP_KERNEL); + + /* if this fails, no I/O cards will work, so may as well bug */ + BUG_ON(dev->dev.platform_data == NULL); + HBA_DATA(dev->dev.platform_data)->iommu = ioc; + if (ioc_count == 0) { /* XXX: Create separate entries for each ioc */ @@ -1577,13 +1577,13 @@ struct pci_dev * ccio_get_fake(const struct parisc_device *dev) } memset(ioc->fake_pci_dev, 0, sizeof(struct pci_dev)); - ioc->fake_pci_dev->sysdata = kmalloc(sizeof(struct pci_hba_data), GFP_KERNEL); - if(ioc->fake_pci_dev->sysdata == NULL) { + ioc->fake_pci_dev->dev.platform_data = kmalloc(sizeof(struct pci_hba_data), GFP_KERNEL); + if(ioc->fake_pci_dev->dev.platform_data == NULL) { printk(KERN_ERR MODULE_NAME ": memory allocation failure\n"); return NULL; } - HBA_DATA(ioc->fake_pci_dev->sysdata)->iommu = ioc; + HBA_DATA(ioc->fake_pci_dev->dev.platform_data)->iommu = ioc; return ioc->fake_pci_dev; } @@ -1595,7 +1595,7 @@ static struct parisc_device_id ccio_tbl[] = { }; static struct parisc_driver ccio_driver = { - .name = "U2/Uturn", + .name = "U2:Uturn", .id_table = ccio_tbl, .probe = ccio_probe, }; diff --git a/drivers/parisc/ccio-rm-dma.c b/drivers/parisc/ccio-rm-dma.c index 4e158c27b663..e0a1d04014a3 100644 --- a/drivers/parisc/ccio-rm-dma.c +++ b/drivers/parisc/ccio-rm-dma.c @@ -74,8 +74,6 @@ static int ccio_dma_supported( struct pci_dev *dev, u64 mask) return(0); } - dev->dma_mask = mask; /* save it */ - /* only support 32-bit devices (ie PCI/GSC) */ return((int) (mask >= 0xffffffffUL)); } diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index f290605dec49..9cb31dac1c42 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c @@ -168,7 +168,7 @@ struct dino_device static int dino_cfg_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val) { - struct dino_device *d = DINO_DEV(bus->sysdata); + struct dino_device *d = DINO_DEV(parisc_walk_tree(bus->dev)); u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; u32 v = DINO_CFG_TOK(local_bus, devfn, where & ~3); unsigned long base_addr = d->hba.base_addr; @@ -202,7 +202,7 @@ static int dino_cfg_read(struct pci_bus *bus, unsigned int devfn, int where, static int dino_cfg_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val) { - struct dino_device *d = DINO_DEV(bus->sysdata); + struct dino_device *d = DINO_DEV(parisc_walk_tree(bus->dev)); u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; u32 v = DINO_CFG_TOK(local_bus, devfn, where & ~3); unsigned long base_addr = d->hba.base_addr; @@ -255,7 +255,7 @@ static u##size dino_in##size (struct pci_hba_data *d, u16 addr) \ unsigned long flags; \ spin_lock_irqsave(&(DINO_DEV(d)->dinosaur_pen), flags); \ /* tell HW which IO Port address */ \ - gsc_writel((u32) addr & ~3, d->base_addr + DINO_PCI_ADDR); \ + gsc_writel((u32) addr, d->base_addr + DINO_PCI_ADDR); \ /* generate I/O PORT read cycle */ \ v = gsc_read##type(d->base_addr+DINO_IO_DATA+(addr&mask)); \ spin_unlock_irqrestore(&(DINO_DEV(d)->dinosaur_pen), flags); \ @@ -271,7 +271,7 @@ static void dino_out##size (struct pci_hba_data *d, u16 addr, u##size val) \ { \ unsigned long flags; \ spin_lock_irqsave(&(DINO_DEV(d)->dinosaur_pen), flags); \ - /* tell HW which CFG address */ \ + /* tell HW which IO port address */ \ gsc_writel((u32) addr, d->base_addr + DINO_PCI_ADDR); \ /* generate cfg write cycle */ \ gsc_write##type(cpu_to_le##size(val), d->base_addr+DINO_IO_DATA+(addr&mask)); \ @@ -475,7 +475,7 @@ static void __init dino_card_setup(struct pci_bus *bus, unsigned long base_addr) { int i; - struct dino_device *dino_dev = DINO_DEV(bus->sysdata); + struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->dev)); struct resource *res; res = &dino_dev->hba.lmmio_space; @@ -498,7 +498,7 @@ dino_card_setup(struct pci_bus *bus, unsigned long base_addr) } gsc_writel(1 << i, base_addr + DINO_IO_ADDR_EN); - pcibios_assign_unassigned_resources(bus); + pci_bus_assign_resources(bus); } static void __init @@ -545,11 +545,11 @@ dino_fixup_bus(struct pci_bus *bus) { struct list_head *ln; struct pci_dev *dev; - struct dino_device *dino_dev = DINO_DEV(bus->sysdata); + struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->dev)); int port_base = HBA_PORT_BASE(dino_dev->hba.hba_num); DBG(KERN_WARNING "%s(0x%p) bus %d sysdata 0x%p\n", - __FUNCTION__, bus, bus->secondary, bus->sysdata); + __FUNCTION__, bus, bus->secondary, bus->dev->platform_data); /* Firmware doesn't set up card-mode dino, so we have to */ if (is_card_dino(&dino_dev->hba.dev->id)) @@ -836,6 +836,8 @@ dino_driver_callback(struct parisc_device *dev) } printk("%s version %s found at 0x%lx\n", name, version, dev->hpa); + snprintf(dev->dev.name, sizeof(dev->dev.name), + "%s version %s", name, version); if (!request_mem_region(dev->hpa, PAGE_SIZE, name)) { printk(KERN_ERR "DINO: Hey! Someone took my MMIO space (0x%ld)!\n", @@ -891,13 +893,15 @@ dino_driver_callback(struct parisc_device *dev) if (dino_common_init(dev, dino_dev, name)) return 1; + dev->dev.platform_data = dino_dev; + /* ** It's not used to avoid chicken/egg problems ** with configuration accessor functions. */ - dino_dev->hba.hba_bus = pci_scan_bus(dino_dev->hba.hba_num, - &dino_cfg_ops, dino_dev); - + dino_dev->hba.hba_bus = + pci_scan_bus_parented(&dev->dev, dino_dev->hba.hba_num, + &dino_cfg_ops, NULL); return 0; } diff --git a/drivers/parisc/eisa.c b/drivers/parisc/eisa.c index 31b1a2069437..13fedb868554 100644 --- a/drivers/parisc/eisa.c +++ b/drivers/parisc/eisa.c @@ -40,6 +40,7 @@ #include <asm/io.h> #include <asm/hardware.h> #include <asm/processor.h> +#include <asm/parisc-device.h> #include <asm/delay.h> #include <asm/eisa_bus.h> @@ -322,6 +323,7 @@ static int __devinit eisa_probe(struct parisc_device *dev) printk(KERN_INFO "%s EISA Adapter found at 0x%08lx\n", name, dev->hpa); + snprintf(dev->dev.name, sizeof(dev->dev.name), "%s EISA", name); eisa_dev.hba.dev = dev; eisa_dev.hba.iommu = ccio_get_iommu(dev); diff --git a/drivers/parisc/gsc.h b/drivers/parisc/gsc.h index acf2e8696d37..865976ea99c1 100644 --- a/drivers/parisc/gsc.h +++ b/drivers/parisc/gsc.h @@ -8,6 +8,7 @@ #include <linux/interrupt.h> #include <asm/hardware.h> +#include <asm/parisc-device.h> #define OFFSET_IRR 0x0000 /* Interrupt request register */ #define OFFSET_IMR 0x0004 /* Interrupt mask register */ diff --git a/drivers/parisc/hppb.c b/drivers/parisc/hppb.c new file mode 100644 index 000000000000..9400303dd996 --- /dev/null +++ b/drivers/parisc/hppb.c @@ -0,0 +1,111 @@ +/* +** hppb.c: +** HP-PB bus driver for the NOVA and K-Class systems. +** +** (c) Copyright 2002 Ryan Bradetich +** (c) Copyright 2002 Hewlett-Packard Company +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This Driver currently only supports the console (port 0) on the MUX. +** Additional work will be needed on this driver to enable the full +** functionality of the MUX. +** +*/ + +#include <linux/config.h> +#include <linux/types.h> +#include <linux/init.h> +#include <linux/mm.h> +#include <linux/slab.h> +#include <linux/ioport.h> + +#include <asm/io.h> +#include <asm/hardware.h> +#include <asm/parisc-device.h> + +#include <linux/pci.h> + +struct hppb_card { + unsigned long hpa; + struct resource mmio_region; + struct hppb_card *next; +}; + +struct hppb_card hppb_card_head = { + .hpa = 0, + .next = NULL, +}; + +#define IO_IO_LOW offsetof(struct bc_module, io_io_low) +#define IO_IO_HIGH offsetof(struct bc_module, io_io_high) + +/** + * hppb_probe - Determine if the hppb driver should claim this device. + * @dev: The device which has been found + * + * Determine if hppb driver should claim this chip (return 0) or not + * (return 1). If so, initialize the chip and tell other partners in crime + * they have work to do. + */ +static int hppb_probe(struct parisc_device *dev) +{ + int status; + struct hppb_card *card = &hppb_card_head; + + while(card->next) { + card = card->next; + } + + if(card->hpa) { + card->next = kmalloc(sizeof(struct hppb_card), GFP_KERNEL); + if(!card->next) { + printk(KERN_ERR "HP-PB: Unable to allocate memory.\n"); + return 1; + } + memset(card->next, '\0', sizeof(struct hppb_card)); + card = card->next; + } + printk(KERN_INFO "Found GeckoBoa at 0x%lx\n", dev->hpa); + snprintf(dev->dev.name, sizeof(dev->dev.name), "GeckoBoa"); + + card->hpa = dev->hpa; + card->mmio_region.name = "HP-PB Bus"; + card->mmio_region.flags = IORESOURCE_MEM; + + card->mmio_region.start = __raw_readl(dev->hpa + IO_IO_LOW); + card->mmio_region.end = __raw_readl(dev->hpa + IO_IO_HIGH) - 1; + + status = ccio_request_resource(dev, &card->mmio_region); + if(status < 0) { + printk(KERN_ERR "%s: failed to claim HP-PB bus space (%08lx, %08lx)\n", + __FILE__, card->mmio_region.start, card->mmio_region.end); + } + + return 0; +} + + +static struct parisc_device_id hppb_tbl[] = { + { HPHW_BCPORT, HVERSION_REV_ANY_ID, 0x500, 0xc }, + { 0, } +}; + +static struct parisc_driver hppb_driver = { + .name = "Gecko Boa", + .id_table = hppb_tbl, + .probe = hppb_probe, +}; + +/** + * hppb_init - HP-PB bus initalization procedure. + * + * Register this driver. + */ +void __init hppb_init(void) +{ + register_parisc_driver(&hppb_driver); +} diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index 60229cfa0fe1..d5ca79f00343 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c @@ -641,7 +641,7 @@ iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev) if (NULL == isi) { printk(KERN_WARNING MODULE_NAME ": hpa not registered for %s\n", - pcidev->name); + pcidev->dev.name); return(-1); } diff --git a/drivers/parisc/lasi.c b/drivers/parisc/lasi.c index 9b9e7ac94e88..c78e2696c53f 100644 --- a/drivers/parisc/lasi.c +++ b/drivers/parisc/lasi.c @@ -77,7 +77,8 @@ lasi_init_irq(struct busdevice *this_lasi) /* Resets */ /* gsc_writel(0xFFFFFFFF, lasi_base+0x2000);*/ /* Parallel */ - gsc_writel(0xFFFFFFFF, lasi_base+0x4004); /* Audio */ + if(pdc_add_valid(lasi_base+0x4004) == PDC_OK) + gsc_writel(0xFFFFFFFF, lasi_base+0x4004); /* Audio */ /* gsc_writel(0xFFFFFFFF, lasi_base+0x5000);*/ /* Serial */ /* gsc_writel(0xFFFFFFFF, lasi_base+0x6000);*/ /* SCSI */ gsc_writel(0xFFFFFFFF, lasi_base+0x7000); /* LAN */ @@ -184,6 +185,8 @@ lasi_init_chip(struct parisc_device *dev) lasi->version = gsc_readl(lasi->hpa + LASI_VER) & 0xf; printk(KERN_INFO "%s version %d at 0x%lx found.\n", lasi->name, lasi->version, lasi->hpa); + snprintf(dev->dev.name, sizeof(dev->dev.name), "%s version %d", + lasi->name, lasi->version); /* initialize the chassis LEDs really early */ lasi_led_init(lasi->hpa); diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index df5ec0d999ec..53583312aa40 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -48,6 +48,7 @@ #include <asm/system.h> #include <asm/hardware.h> /* for register_parisc_driver() stuff */ +#include <asm/parisc-device.h> #include <asm/iosapic.h> /* for iosapic_register() */ #include <asm/io.h> /* read/write stuff */ @@ -507,7 +508,7 @@ lba_rd_cfg(struct lba_device *d, u32 tok, u8 reg, u32 size) static int lba_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data) { - struct lba_device *d = LBA_DEV(bus->sysdata); + struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->dev)); u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; u32 tok = LBA_CFG_TOK(local_bus, devfn); @@ -591,7 +592,7 @@ lba_wr_cfg( struct lba_device *d, u32 tok, u8 reg, u32 data, u32 size) static int lba_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data) { - struct lba_device *d = LBA_DEV(bus->sysdata); + struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->dev)); u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary; u32 tok = LBA_CFG_TOK(local_bus,devfn); @@ -697,11 +698,11 @@ lba_fixup_bus(struct pci_bus *bus) u16 fbb_enable = PCI_STATUS_FAST_BACK; u16 status; #endif - struct lba_device *ldev = LBA_DEV(bus->sysdata); + struct lba_device *ldev = LBA_DEV(parisc_walk_tree(bus->dev)); int lba_portbase = HBA_PORT_BASE(ldev->hba.hba_num); DBG("lba_fixup_bus(0x%p) bus %d sysdata 0x%p\n", - bus, bus->secondary, bus->sysdata); + bus, bus->secondary, bus->dev->platform_data); /* ** Properly Setup MMIO resources for this bus. @@ -1357,6 +1358,8 @@ lba_driver_callback(struct parisc_device *dev) printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n", MODULE_NAME, version, func_class & 0xf, dev->hpa); + snprintf(dev->dev.name, sizeof(dev->dev.name), "%s version %s", + MODULE_NAME, version); /* Just in case we find some prototypes... */ if (func_class < 2) { @@ -1425,14 +1428,16 @@ lba_driver_callback(struct parisc_device *dev) ** Tell PCI support another PCI bus was found. ** Walks PCI bus for us too. */ + dev->dev.platform_data = lba_dev; lba_bus = lba_dev->hba.hba_bus = - pci_scan_bus(lba_dev->hba.bus_num.start, &lba_cfg_ops, (void *) lba_dev); + pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start, + &lba_cfg_ops, NULL); #ifdef __LP64__ if (is_pdc_pat()) { /* assign resources to un-initialized devices */ - DBG_PAT("LBA pcibios_assign_unassigned_resources()\n"); - pcibios_assign_unassigned_resources(lba_bus); + DBG_PAT("LBA pci_bus_assign_resources()\n"); + pci_bus_assign_resources(lba_bus); #ifdef DEBUG_LBA_PAT DBG_PAT("\nLBA PIOP resource tree\n"); @@ -1464,7 +1469,7 @@ static struct parisc_device_id lba_tbl[] = { static struct parisc_driver lba_driver = { .name = MODULE_NAME, .id_table = lba_tbl, - .probe = lba_driver_callback + .probe = lba_driver_callback, }; /* diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index ea4132f10b75..81630ca37b05 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c @@ -404,7 +404,7 @@ static void led_get_diskio_stats(int addvalue) int major, disk, total; total = 0; -#ifdef 0 +#if 0 /* * this section will no longer work in 2.5, as we no longer * have either kstat.dk_drive nor DK_MAX_*. It can probably diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c index 9fbcfb21dcac..514b41d6c829 100644 --- a/drivers/parisc/power.c +++ b/drivers/parisc/power.c @@ -44,8 +44,6 @@ #include <linux/reboot.h> #include <linux/sched.h> #include <linux/interrupt.h> -#include <linux/proc_fs.h> -#include <linux/ctype.h> #include <linux/workqueue.h> #include <asm/pdc.h> @@ -142,11 +140,7 @@ static void process_shutdown(void) DECLARE_TASKLET_DISABLED(power_tasklet, NULL, 0); /* soft power switch enabled/disabled */ -#ifdef CONFIG_PROC_FS -static int pwrsw_enabled = 1; -#else -#define pwrsw_enabled (1) -#endif +int pwrsw_enabled = 1; /* * On gecko style machines (e.g. 712/xx and 715/xx) @@ -207,90 +201,6 @@ static void powerfail_interrupt(int code, void *x, struct pt_regs *regs) -/* - * /proc filesystem support - */ - -#ifdef CONFIG_SYSCTL -static int power_proc_read(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - char *out = page; - int len; - - out += sprintf(out, "Software power switch support: "); - out += sprintf(out, pwrsw_enabled ? "enabled (1)" : "disabled (0)" ); - out += sprintf(out, "\n"); - - len = out - page - off; - if (len < count) { - *eof = 1; - if (len <= 0) return 0; - } else { - len = count; - } - *start = page + off; - return len; -} - -static int power_proc_write(struct file *file, const char *buf, - unsigned long count, void *data) -{ - char *cur, lbuf[count]; - - if (!capable(CAP_SYS_ADMIN)) - return -EACCES; - - memset(lbuf, 0, count); - - copy_from_user(lbuf, buf, count); - cur = lbuf; - - /* skip initial spaces */ - while (*cur && isspace(*cur)) - cur++; - - switch (*cur) { - case '0': pwrsw_enabled = 0; - break; - case '1': pwrsw_enabled = 1; - break; - default: printk(KERN_CRIT "/proc/" SYSCTL_FILENAME - ": Parse error: only '0' or '1' allowed!\n"); - return -EINVAL; - } /* switch() */ - - return count; -} - -static struct proc_dir_entry *ent; - -static void __init power_create_procfs(void) -{ - if (!power_tasklet.func) - return; - - ent = create_proc_entry(SYSCTL_FILENAME, S_IFREG|S_IRUGO|S_IWUSR, 0); - if (!ent) return; - - ent->nlink = 1; - ent->read_proc = power_proc_read; - ent->write_proc = power_proc_write; - ent->owner = THIS_MODULE; -} - -static void __exit power_remove_procfs(void) -{ - remove_proc_entry(SYSCTL_FILENAME, NULL); -} - -#else -#define power_create_procfs() do { } while (0) -#define power_remove_procfs() do { } while (0) -#endif /* CONFIG_SYSCTL */ - - - /* parisc_panic_event() is called by the panic handler. * As soon as a panic occurs, our tasklets above will not be * executed any longer. This function then re-enables the @@ -344,7 +254,6 @@ static int __init power_init(void) /* Register a call for panic conditions. */ notifier_chain_register(&panic_notifier_list, &parisc_panic_block); - power_create_procfs(); tasklet_enable(&power_tasklet); return 0; @@ -357,7 +266,6 @@ static void __exit power_exit(void) tasklet_disable(&power_tasklet); notifier_chain_unregister(&panic_notifier_list, &parisc_panic_block); - power_remove_procfs(); power_tasklet.func = NULL; pdc_soft_power_button(0); } diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index bb8a8b30b2d0..41d2f167aa9a 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c @@ -40,6 +40,7 @@ #include <linux/proc_fs.h> #include <asm/runway.h> /* for proc_runway_root */ #include <asm/pdc.h> /* for PDC_MODEL_* */ +#include <asm/parisc-device.h> #define MODULE_NAME "SBA" @@ -803,7 +804,7 @@ sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt) * See Documentation/DMA-mapping.txt */ static int -sba_dma_supported( struct pci_dev *dev, u64 mask) +sba_dma_supported( struct device *dev, u64 mask) { if (dev == NULL) { printk(KERN_ERR MODULE_NAME ": EISA/ISA/et al not supported\n"); @@ -811,10 +812,8 @@ sba_dma_supported( struct pci_dev *dev, u64 mask) return(0); } - dev->dma_mask = mask; /* save it */ - /* only support 32-bit PCI devices - no DAC support (yet) */ - return((int) (mask == 0xffffffff)); + return((int) (mask == 0xffffffffUL)); } @@ -828,7 +827,8 @@ sba_dma_supported( struct pci_dev *dev, u64 mask) * See Documentation/DMA-mapping.txt */ static dma_addr_t -sba_map_single(struct pci_dev *dev, void *addr, size_t size, int direction) +sba_map_single(struct device *dev, void *addr, size_t size, + enum dma_data_direction direction) { struct ioc *ioc; unsigned long flags; @@ -840,7 +840,6 @@ sba_map_single(struct pci_dev *dev, void *addr, size_t size, int direction) ASSERT(size > 0); ASSERT(size <= DMA_CHUNK_SIZE); - ASSERT(dev->sysdata); ioc = GET_IOC(dev); ASSERT(ioc); @@ -906,7 +905,8 @@ sba_map_single(struct pci_dev *dev, void *addr, size_t size, int direction) * See Documentation/DMA-mapping.txt */ static void -sba_unmap_single(struct pci_dev *dev, dma_addr_t iova, size_t size, int direction) +sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size, + enum dma_data_direction direction) { struct ioc *ioc; #if DELAYED_RESOURCE_CNT > 0 @@ -915,7 +915,6 @@ sba_unmap_single(struct pci_dev *dev, dma_addr_t iova, size_t size, int directio unsigned long flags; dma_addr_t offset; - ASSERT(dev->sysdata); ioc = GET_IOC(dev); ASSERT(ioc); @@ -976,7 +975,7 @@ sba_unmap_single(struct pci_dev *dev, dma_addr_t iova, size_t size, int directio * See Documentation/DMA-mapping.txt */ static void * -sba_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle) +sba_alloc_consistent(struct device *hwdev, size_t size, dma_addr_t *dma_handle) { void *ret; @@ -1007,7 +1006,8 @@ sba_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle) * See Documentation/DMA-mapping.txt */ static void -sba_free_consistent(struct pci_dev *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle) +sba_free_consistent(struct device *hwdev, size_t size, void *vaddr, + dma_addr_t dma_handle) { sba_unmap_single(hwdev, dma_handle, size, 0); free_pages((unsigned long) vaddr, get_order(size)); @@ -1269,7 +1269,8 @@ sba_coalesce_chunks( struct ioc *ioc, * See Documentation/DMA-mapping.txt */ static int -sba_map_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, int direction) +sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, + enum dma_data_direction direction) { struct ioc *ioc; int coalesced, filled = 0; @@ -1277,7 +1278,6 @@ sba_map_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, int direc DBG_RUN_SG("%s() START %d entries\n", __FUNCTION__, nents); - ASSERT(dev->sysdata); ioc = GET_IOC(dev); ASSERT(ioc); @@ -1351,7 +1351,8 @@ sba_map_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, int direc * See Documentation/DMA-mapping.txt */ static void -sba_unmap_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, int direction) +sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, + enum dma_data_direction direction) { struct ioc *ioc; #ifdef ASSERT_PDIR_SANITY @@ -1361,7 +1362,6 @@ sba_unmap_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, int dir DBG_RUN_SG("%s() START %d entries, %p,%x\n", __FUNCTION__, nents, sg_virt_addr(sglist), sglist->length); - ASSERT(dev->sysdata); ioc = GET_IOC(dev); ASSERT(ioc); @@ -1395,16 +1395,17 @@ sba_unmap_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, int dir } -static struct pci_dma_ops sba_ops = { - sba_dma_supported, - sba_alloc_consistent, /* allocate cacheable host mem */ - sba_free_consistent, /* release cacheable host mem */ - sba_map_single, - sba_unmap_single, - sba_map_sg, - sba_unmap_sg, - NULL, /* dma_sync_single */ - NULL /* dma_sync_sg */ +static struct hppa_dma_ops sba_ops = { + .dma_supported = sba_dma_supported, + .alloc_consistent = sba_alloc_consistent, + .alloc_noncoherent = sba_alloc_consistent, + .free_consistent = sba_free_consistent, + .map_single = sba_map_single, + .unmap_single = sba_unmap_single, + .map_sg = sba_map_sg, + .unmap_sg = sba_unmap_sg, + .dma_sync_single = NULL, + .dma_sync_sg = NULL, }; @@ -1977,6 +1978,8 @@ sba_driver_callback(struct parisc_device *dev) printk(KERN_INFO "%s found %s at 0x%lx\n", MODULE_NAME, version, dev->hpa); + snprintf(dev->dev.name, sizeof(dev->dev.name), "%s version %s", + MODULE_NAME, version); #ifdef DEBUG_SBA_INIT sba_dump_tlb(dev->hpa); diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index 07d49b11e6fe..9c88a673fd9d 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c @@ -390,7 +390,7 @@ int superio_fixup_irq(struct pci_dev *pcidev) void __devinit superio_serial_init(void) { -#ifdef CONFIG_SERIAL +#ifdef CONFIG_SERIAL_8250 struct serial_struct *serial; int retval; @@ -443,7 +443,7 @@ superio_serial_init(void) retval = register_serial(serial); if (retval < 0) printk(KERN_WARNING "SuperIO: Register Serial #1 failed.\n"); -#endif /* CONFIG_SERIAL */ +#endif /* CONFIG_SERIAL_8250 */ } EXPORT_SYMBOL(superio_serial_init); @@ -504,7 +504,7 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_ #ifdef CONFIG_PARPORT_PC superio_parport_init(); #endif -#ifdef CONFIG_SERIAL +#ifdef CONFIG_SERIAL_8250 superio_serial_init(); #endif /* REVISIT : superio_fdc_init() ? */ @@ -530,6 +530,11 @@ static struct pci_driver superio_driver = { static int __init superio_modinit(void) { +#ifdef CONFIG_SERIAL_8250 + extern int serial8250_init(void); + serial8250_init(); +#endif + return pci_module_init(&superio_driver); } diff --git a/drivers/parisc/wax.c b/drivers/parisc/wax.c index e9044d225b7b..1a9f67d73b70 100644 --- a/drivers/parisc/wax.c +++ b/drivers/parisc/wax.c @@ -83,6 +83,8 @@ wax_init_chip(struct parisc_device *dev) wax->version = 0; /* gsc_readb(wax->hpa+WAX_VER); */ printk(KERN_INFO "%s at 0x%lx found.\n", wax->name, wax->hpa); + snprintf(dev->dev.name, sizeof(dev->dev.name), "%s version %d", + wax->name, wax->version); /* Stop wax hissing for a bit */ wax_init_irq(wax); |
