Index: arch/parisc/kernel/ccio-dma.c
===================================================================
RCS file: /var/cvs/linux/arch/parisc/kernel/ccio-dma.c,v
retrieving revision 1.55
diff -u -p -r1.55 ccio-dma.c
--- arch/parisc/kernel/ccio-dma.c	3 Aug 2002 08:18:20 -0000	1.55
+++ arch/parisc/kernel/ccio-dma.c	20 Sep 2002 23:43:32 -0000
@@ -1461,10 +1461,28 @@ static void __init ccio_init_resources(s
 static void expand_ioc_area(struct ioc *ioc, unsigned long size,
 		unsigned long min, unsigned long max, unsigned long align)
 {
-#ifdef NASTY_HACK_FOR_K_CLASS
-	__raw_writel(0xfffff600, (unsigned long)&(ioc->ioc_hpa->io_io_high));
-	ioc->mmio_region[0].end = 0xf5ffffff;
-#endif
+	int i;
+
+	for (i = 0; i < 2; i++) {
+		unsigned long addr;
+		signed int val;
+		struct resource *parent = ioc->mmio_region + i;
+
+		if (parent->sibling->start - parent->end < size)
+			continue;
+
+		parent->end += size;
+
+		if (i == 0) {
+			addr = (unsigned long) &ioc->ioc_hpa->io_io_high;
+		} else {
+			addr = (unsigned long) &ioc->ioc_hpa->io_io_high_hv;
+		}
+
+		val = parent->end + 1;
+		val >>= 16; /* sign extends */
+		__raw_writel(val, addr);
+	}
 }
 
 static struct resource *ccio_get_resource(struct ioc* ioc,
@@ -1490,17 +1508,22 @@ int ccio_allocate_resource(const struct 
 		void *alignf_data)
 {
 	struct ioc *ioc = ccio_get_iommu(dev);
-	struct resource *parent = ccio_get_resource(ioc, dev);
-	if (!parent)
-		return -EBUSY;
 
-	if (!allocate_resource(parent, res, size, min, max, align, alignf,
-			alignf_data))
+	if (!allocate_resource(ioc->mmio_region, res, size, min, max, align, alignf,
+			       alignf_data))
+		return 0;
+
+	if (!allocate_resource(ioc->mmio_region + 1, res, size, min, max, align, alignf,
+			       alignf_data))
 		return 0;
 
 	expand_ioc_area(ioc, size, min, max, align);
-	return allocate_resource(parent, res, size, min, max, align, alignf,
-			alignf_data);
+	if (!allocate_resource(ioc->mmio_region, res, size, min, max, align, alignf,
+			       alignf_data))
+		return 0;
+
+	return allocate_resource(ioc->mmio_region + 1, res, size, min, max, align, alignf,
+				 alignf_data);
 }
 
 int ccio_request_resource(const struct parisc_device *dev,
