diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pcmcia/yenta_socket.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 5e0a9980d2fc..d3807e22fe04 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
@@ -539,13 +539,12 @@ static int yenta_sock_suspend(struct pcmcia_socket *sock) | |||
539 | #define PCIBIOS_MIN_CARDBUS_IO PCIBIOS_MIN_IO | 539 | #define PCIBIOS_MIN_CARDBUS_IO PCIBIOS_MIN_IO |
540 | #endif | 540 | #endif |
541 | 541 | ||
542 | static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned type) | 542 | static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned type, int addr_start, int addr_end) |
543 | { | 543 | { |
544 | struct pci_bus *bus; | 544 | struct pci_bus *bus; |
545 | struct resource *root, *res; | 545 | struct resource *root, *res; |
546 | u32 start, end; | 546 | u32 start, end; |
547 | u32 align, size, min; | 547 | u32 align, size, min; |
548 | unsigned offset; | ||
549 | unsigned mask; | 548 | unsigned mask; |
550 | 549 | ||
551 | res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr; | 550 | res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr; |
@@ -558,13 +557,12 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ | |||
558 | if (type & IORESOURCE_IO) | 557 | if (type & IORESOURCE_IO) |
559 | mask = ~3; | 558 | mask = ~3; |
560 | 559 | ||
561 | offset = 0x1c + 8*nr; | ||
562 | bus = socket->dev->subordinate; | 560 | bus = socket->dev->subordinate; |
563 | res->name = bus->name; | 561 | res->name = bus->name; |
564 | res->flags = type; | 562 | res->flags = type; |
565 | 563 | ||
566 | start = config_readl(socket, offset) & mask; | 564 | start = config_readl(socket, addr_start) & mask; |
567 | end = config_readl(socket, offset+4) | ~mask; | 565 | end = config_readl(socket, addr_end) | ~mask; |
568 | if (start && end > start && !override_bios) { | 566 | if (start && end > start && !override_bios) { |
569 | res->start = start; | 567 | res->start = start; |
570 | res->end = end; | 568 | res->end = end; |
@@ -607,8 +605,8 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ | |||
607 | 605 | ||
608 | do { | 606 | do { |
609 | if (allocate_resource(root, res, size, start, end, align, NULL, NULL)==0) { | 607 | if (allocate_resource(root, res, size, start, end, align, NULL, NULL)==0) { |
610 | config_writel(socket, offset, res->start); | 608 | config_writel(socket, addr_start, res->start); |
611 | config_writel(socket, offset+4, res->end); | 609 | config_writel(socket, addr_end, res->end); |
612 | return; | 610 | return; |
613 | } | 611 | } |
614 | size = size/2; | 612 | size = size/2; |
@@ -624,10 +622,14 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ | |||
624 | */ | 622 | */ |
625 | static void yenta_allocate_resources(struct yenta_socket *socket) | 623 | static void yenta_allocate_resources(struct yenta_socket *socket) |
626 | { | 624 | { |
627 | yenta_allocate_res(socket, 0, IORESOURCE_MEM|IORESOURCE_PREFETCH); | 625 | yenta_allocate_res(socket, 0, IORESOURCE_IO, |
628 | yenta_allocate_res(socket, 1, IORESOURCE_MEM); | 626 | PCI_CB_IO_BASE_0, PCI_CB_IO_LIMIT_0); |
629 | yenta_allocate_res(socket, 2, IORESOURCE_IO); | 627 | yenta_allocate_res(socket, 1, IORESOURCE_IO, |
630 | yenta_allocate_res(socket, 3, IORESOURCE_IO); | 628 | PCI_CB_IO_BASE_1, PCI_CB_IO_LIMIT_1); |
629 | yenta_allocate_res(socket, 2, IORESOURCE_MEM|IORESOURCE_PREFETCH, | ||
630 | PCI_CB_MEMORY_BASE_0, PCI_CB_MEMORY_LIMIT_0); | ||
631 | yenta_allocate_res(socket, 3, IORESOURCE_MEM, | ||
632 | PCI_CB_MEMORY_BASE_1, PCI_CB_MEMORY_LIMIT_1); | ||
631 | } | 633 | } |
632 | 634 | ||
633 | 635 | ||