]> git.hungrycats.org Git - linux/commitdiff
[PATCH] More parisc updates
authorMatthew Wilcox <willy@debian.org>
Mon, 13 Jan 2003 06:20:21 +0000 (22:20 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Mon, 13 Jan 2003 06:20:21 +0000 (22:20 -0800)
Updates for drivers/parisc.  Mostly conversion to generic device model.
New hppb driver from Ryan Bradetich.

17 files changed:
drivers/parisc/Kconfig
drivers/parisc/Makefile
drivers/parisc/asp.c
drivers/parisc/ccio-dma.c
drivers/parisc/ccio-rm-dma.c
drivers/parisc/dino.c
drivers/parisc/eisa.c
drivers/parisc/gsc.h
drivers/parisc/hppb.c [new file with mode: 0644]
drivers/parisc/iosapic.c
drivers/parisc/lasi.c
drivers/parisc/lba_pci.c
drivers/parisc/led.c
drivers/parisc/power.c
drivers/parisc/sba_iommu.c
drivers/parisc/superio.c
drivers/parisc/wax.c

index 8919ff77718db479b6d58899cd069a3c1cc90c09..ef324ada61939ad83541f398d07be5ec17ea2b8e 100644 (file)
@@ -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,
index ef7c6211b812a2448f18ae750d79cfc7f5083511..09e248fd596b7a8ebad764dbffa61abc6c559839 100644 (file)
@@ -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
+
index 2d45a5b099af96fa97e33279bbbe028464ef9f20..e29f8ca8e6f322b394f43935697d19775b98298e 100644 (file)
@@ -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;
index 9e6e5994334e933f888ef09bc27c609b4728005e..b179292a8f602e49c00668e20acb030e8fff6104 100644 (file)
@@ -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,
 };
index 4e158c27b663fa81dbda67f7446c75898e43919f..e0a1d04014a3157d3b8db3150ff5bb18efc02b3d 100644 (file)
@@ -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));
 }
index f290605dec491df3e7a01d401f2140fc96a3412c..9cb31dac1c424ca0c7fa7e7176165304ebfef156 100644 (file)
@@ -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;
 }
 
index 31b1a206943783a37fe0ea55b9fc7c7811c10bcf..13fedb86855416ac1cd9369ed386af9284115a3f 100644 (file)
@@ -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);
index acf2e8696d377dd456e3cfefb9738d9dce9f1005..865976ea99c1520b73d89123ffa2da16b0c443ab 100644 (file)
@@ -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 (file)
index 0000000..9400303
--- /dev/null
@@ -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);
+}
index 60229cfa0fe1bf933e54d42d6b18bc5322836e8a..d5ca79f0034309d6991a5cf7f0137b2c0550ab88 100644 (file)
@@ -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);
        }
 
index 9b9e7ac94e88578c2f78ca5284209b374e128d9e..c78e2696c53fa7d034440f4751cdfce1fadce699 100644 (file)
@@ -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);
index df5ec0d999ec024a4a9a811d5ea622e79129a771..53583312aa406c645f6fc59dacf15b67c7233f40 100644 (file)
@@ -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,
 };
 
 /*
index ea4132f10b7535cb7a68766428d3f2f318931050..81630ca37b052864867090c34f418d5a789fff08 100644 (file)
@@ -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
index 9fbcfb21dcac1fd589d7f94a824446b79ab8f1de..514b41d6c829e86d2478f08ff583f95961b64a20 100644 (file)
@@ -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);
 }
index bb8a8b30b2d0a6a6c1f90ede0f965485e1f58dc2..41d2f167aa9ab133c46c26c7190b0b36a36e997a 100644 (file)
@@ -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);
index 07d49b11e6fec4a71075c96350cc6e5818d5137f..9c88a673fd9d74179c15deef33de7a0db881fb18 100644 (file)
@@ -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);
 }
 
index e9044d225b7bcc8047caa1c536c369008b419520..1a9f67d73b705e703ff67b1429d5fc6f34c8765f 100644 (file)
@@ -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);