diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/char/agp/parisc-agp.c | 2 | ||||
| -rw-r--r-- | drivers/net/Kconfig | 6 | ||||
| -rw-r--r-- | drivers/net/lasi_82596.c | 34 | ||||
| -rw-r--r-- | drivers/parisc/hppb.c | 14 | ||||
| -rw-r--r-- | drivers/parisc/iosapic_private.h | 2 | ||||
| -rw-r--r-- | drivers/parisc/lba_pci.c | 90 | ||||
| -rw-r--r-- | drivers/parisc/led.c | 14 | ||||
| -rw-r--r-- | drivers/parisc/power.c | 201 | ||||
| -rw-r--r-- | drivers/parisc/sba_iommu.c | 4 | ||||
| -rw-r--r-- | drivers/serial/mux.c | 167 |
10 files changed, 297 insertions, 237 deletions
diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c index 36d07e3635c6..3c8f3d633625 100644 --- a/drivers/char/agp/parisc-agp.c +++ b/drivers/char/agp/parisc-agp.c | |||
| @@ -236,7 +236,7 @@ static int __init | |||
| 236 | agp_ioc_init(void __iomem *ioc_regs) | 236 | agp_ioc_init(void __iomem *ioc_regs) |
| 237 | { | 237 | { |
| 238 | struct _parisc_agp_info *info = &parisc_agp_info; | 238 | struct _parisc_agp_info *info = &parisc_agp_info; |
| 239 | u64 *iova_base, *io_pdir, io_tlb_ps; | 239 | u64 iova_base, *io_pdir, io_tlb_ps; |
| 240 | int io_tlb_shift; | 240 | int io_tlb_shift; |
| 241 | 241 | ||
| 242 | printk(KERN_INFO DRVPFX "IO PDIR shared with sba_iommu\n"); | 242 | printk(KERN_INFO DRVPFX "IO PDIR shared with sba_iommu\n"); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 9d5c083f3339..38ac6796fc48 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -430,10 +430,10 @@ config HPLANCE | |||
| 430 | 430 | ||
| 431 | config LASI_82596 | 431 | config LASI_82596 |
| 432 | tristate "Lasi ethernet" | 432 | tristate "Lasi ethernet" |
| 433 | depends on NET_ETHERNET && PARISC && GSC_LASI | 433 | depends on NET_ETHERNET && GSC |
| 434 | help | 434 | help |
| 435 | Say Y here to support the on-board Intel 82596 ethernet controller | 435 | Say Y here to support the builtin Intel 82596 ethernet controller |
| 436 | built into Hewlett-Packard PA-RISC machines. | 436 | found in Hewlett-Packard PA-RISC machines with 10Mbit ethernet. |
| 437 | 437 | ||
| 438 | config MIPS_JAZZ_SONIC | 438 | config MIPS_JAZZ_SONIC |
| 439 | tristate "MIPS JAZZ onboard SONIC Ethernet support" | 439 | tristate "MIPS JAZZ onboard SONIC Ethernet support" |
diff --git a/drivers/net/lasi_82596.c b/drivers/net/lasi_82596.c index ea392f2a5aa2..452863d5d498 100644 --- a/drivers/net/lasi_82596.c +++ b/drivers/net/lasi_82596.c | |||
| @@ -384,7 +384,7 @@ struct i596_private { | |||
| 384 | struct device *dev; | 384 | struct device *dev; |
| 385 | }; | 385 | }; |
| 386 | 386 | ||
| 387 | static char init_setup[] = | 387 | static const char init_setup[] = |
| 388 | { | 388 | { |
| 389 | 0x8E, /* length, prefetch on */ | 389 | 0x8E, /* length, prefetch on */ |
| 390 | 0xC8, /* fifo to 8, monitor off */ | 390 | 0xC8, /* fifo to 8, monitor off */ |
| @@ -683,7 +683,7 @@ static int init_i596_mem(struct net_device *dev) | |||
| 683 | enable_irq(dev->irq); /* enable IRQs from LAN */ | 683 | enable_irq(dev->irq); /* enable IRQs from LAN */ |
| 684 | 684 | ||
| 685 | DEB(DEB_INIT, printk("%s: queuing CmdConfigure\n", dev->name)); | 685 | DEB(DEB_INIT, printk("%s: queuing CmdConfigure\n", dev->name)); |
| 686 | memcpy(lp->cf_cmd.i596_config, init_setup, 14); | 686 | memcpy(lp->cf_cmd.i596_config, init_setup, sizeof(init_setup)); |
| 687 | lp->cf_cmd.cmd.command = CmdConfigure; | 687 | lp->cf_cmd.cmd.command = CmdConfigure; |
| 688 | CHECK_WBACK(lp, &(lp->cf_cmd), sizeof(struct cf_cmd)); | 688 | CHECK_WBACK(lp, &(lp->cf_cmd), sizeof(struct cf_cmd)); |
| 689 | i596_add_cmd(dev, &lp->cf_cmd.cmd); | 689 | i596_add_cmd(dev, &lp->cf_cmd.cmd); |
| @@ -1156,32 +1156,12 @@ static int __devinit i82596_probe(struct net_device *dev, | |||
| 1156 | dma_addr_t dma_addr; | 1156 | dma_addr_t dma_addr; |
| 1157 | 1157 | ||
| 1158 | /* This lot is ensure things have been cache line aligned. */ | 1158 | /* This lot is ensure things have been cache line aligned. */ |
| 1159 | if (sizeof(struct i596_rfd) != 32) { | 1159 | BUILD_BUG_ON(sizeof(struct i596_rfd) != 32); |
| 1160 | printk("82596: sizeof(struct i596_rfd) = %d\n", | 1160 | BUILD_BUG_ON(sizeof(struct i596_rbd) & 31); |
| 1161 | (int)sizeof(struct i596_rfd)); | 1161 | BUILD_BUG_ON(sizeof(struct tx_cmd) & 31); |
| 1162 | return -ENODEV; | 1162 | BUILD_BUG_ON(sizeof(struct i596_tbd) != 32); |
| 1163 | } | ||
| 1164 | if ((sizeof(struct i596_rbd) % 32) != 0) { | ||
| 1165 | printk("82596: sizeof(struct i596_rbd) = %d\n", | ||
| 1166 | (int)sizeof(struct i596_rbd)); | ||
| 1167 | return -ENODEV; | ||
| 1168 | } | ||
| 1169 | if ((sizeof(struct tx_cmd) % 32) != 0) { | ||
| 1170 | printk("82596: sizeof(struct tx_cmd) = %d\n", | ||
| 1171 | (int)sizeof(struct tx_cmd)); | ||
| 1172 | return -ENODEV; | ||
| 1173 | } | ||
| 1174 | if (sizeof(struct i596_tbd) != 32) { | ||
| 1175 | printk("82596: sizeof(struct i596_tbd) = %d\n", | ||
| 1176 | (int)sizeof(struct i596_tbd)); | ||
| 1177 | return -ENODEV; | ||
| 1178 | } | ||
| 1179 | #ifndef __LP64__ | 1163 | #ifndef __LP64__ |
| 1180 | if (sizeof(struct i596_private) > 4096) { | 1164 | BUILD_BUG_ON(sizeof(struct i596_private) > 4096); |
| 1181 | printk("82596: sizeof(struct i596_private) = %d\n", | ||
| 1182 | (int)sizeof(struct i596_private)); | ||
| 1183 | return -ENODEV; | ||
| 1184 | } | ||
| 1185 | #endif | 1165 | #endif |
| 1186 | 1166 | ||
| 1187 | if (!dev->base_addr || !dev->irq) | 1167 | if (!dev->base_addr || !dev->irq) |
diff --git a/drivers/parisc/hppb.c b/drivers/parisc/hppb.c index 07dc2b6d4e93..9bb4db552f3c 100644 --- a/drivers/parisc/hppb.c +++ b/drivers/parisc/hppb.c | |||
| @@ -10,10 +10,6 @@ | |||
| 10 | ** the Free Software Foundation; either version 2 of the License, or | 10 | ** the Free Software Foundation; either version 2 of the License, or |
| 11 | ** (at your option) any later version. | 11 | ** (at your option) any later version. |
| 12 | ** | 12 | ** |
| 13 | ** This Driver currently only supports the console (port 0) on the MUX. | ||
| 14 | ** Additional work will be needed on this driver to enable the full | ||
| 15 | ** functionality of the MUX. | ||
| 16 | ** | ||
| 17 | */ | 13 | */ |
| 18 | 14 | ||
| 19 | #include <linux/types.h> | 15 | #include <linux/types.h> |
| @@ -67,7 +63,7 @@ static int hppb_probe(struct parisc_device *dev) | |||
| 67 | } | 63 | } |
| 68 | card = card->next; | 64 | card = card->next; |
| 69 | } | 65 | } |
| 70 | printk(KERN_INFO "Found GeckoBoa at 0x%lx\n", dev->hpa.start); | 66 | printk(KERN_INFO "Found GeckoBoa at 0x%x\n", dev->hpa.start); |
| 71 | 67 | ||
| 72 | card->hpa = dev->hpa.start; | 68 | card->hpa = dev->hpa.start; |
| 73 | card->mmio_region.name = "HP-PB Bus"; | 69 | card->mmio_region.name = "HP-PB Bus"; |
| @@ -78,16 +74,18 @@ static int hppb_probe(struct parisc_device *dev) | |||
| 78 | 74 | ||
| 79 | status = ccio_request_resource(dev, &card->mmio_region); | 75 | status = ccio_request_resource(dev, &card->mmio_region); |
| 80 | if(status < 0) { | 76 | if(status < 0) { |
| 81 | printk(KERN_ERR "%s: failed to claim HP-PB bus space (%08lx, %08lx)\n", | 77 | printk(KERN_ERR "%s: failed to claim HP-PB bus space (%08x, %08x)\n", |
| 82 | __FILE__, card->mmio_region.start, card->mmio_region.end); | 78 | __FILE__, card->mmio_region.start, card->mmio_region.end); |
| 83 | } | 79 | } |
| 84 | 80 | ||
| 85 | return 0; | 81 | return 0; |
| 86 | } | 82 | } |
| 87 | 83 | ||
| 88 | |||
| 89 | static struct parisc_device_id hppb_tbl[] = { | 84 | static struct parisc_device_id hppb_tbl[] = { |
| 90 | { HPHW_BCPORT, HVERSION_REV_ANY_ID, 0x500, 0xc }, | 85 | { HPHW_BCPORT, HVERSION_REV_ANY_ID, 0x500, 0xc }, /* E25 and K */ |
| 86 | { HPHW_BCPORT, 0x0, 0x501, 0xc }, /* E35 */ | ||
| 87 | { HPHW_BCPORT, 0x0, 0x502, 0xc }, /* E45 */ | ||
| 88 | { HPHW_BCPORT, 0x0, 0x503, 0xc }, /* E55 */ | ||
| 91 | { 0, } | 89 | { 0, } |
| 92 | }; | 90 | }; |
| 93 | 91 | ||
diff --git a/drivers/parisc/iosapic_private.h b/drivers/parisc/iosapic_private.h index 41e7ec2a44aa..6e05e30a2450 100644 --- a/drivers/parisc/iosapic_private.h +++ b/drivers/parisc/iosapic_private.h | |||
| @@ -132,7 +132,7 @@ struct iosapic_irt { | |||
| 132 | struct vector_info { | 132 | struct vector_info { |
| 133 | struct iosapic_info *iosapic; /* I/O SAPIC this vector is on */ | 133 | struct iosapic_info *iosapic; /* I/O SAPIC this vector is on */ |
| 134 | struct irt_entry *irte; /* IRT entry */ | 134 | struct irt_entry *irte; /* IRT entry */ |
| 135 | u32 *eoi_addr; /* precalculate EOI reg address */ | 135 | u32 __iomem *eoi_addr; /* precalculate EOI reg address */ |
| 136 | u32 eoi_data; /* IA64: ? PA: swapped txn_data */ | 136 | u32 eoi_data; /* IA64: ? PA: swapped txn_data */ |
| 137 | int txn_irq; /* virtual IRQ number for processor */ | 137 | int txn_irq; /* virtual IRQ number for processor */ |
| 138 | ulong txn_addr; /* IA64: id_eid PA: partial HPA */ | 138 | ulong txn_addr; /* IA64: id_eid PA: partial HPA */ |
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index ba6769934c77..21c4c299b3d6 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c | |||
| @@ -168,7 +168,8 @@ lba_dump_res(struct resource *r, int d) | |||
| 168 | 168 | ||
| 169 | printk(KERN_DEBUG "(%p)", r->parent); | 169 | printk(KERN_DEBUG "(%p)", r->parent); |
| 170 | for (i = d; i ; --i) printk(" "); | 170 | for (i = d; i ; --i) printk(" "); |
| 171 | printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r, r->start, r->end, r->flags); | 171 | printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r, |
| 172 | (long)r->start, (long)r->end, r->flags); | ||
| 172 | lba_dump_res(r->child, d+2); | 173 | lba_dump_res(r->child, d+2); |
| 173 | lba_dump_res(r->sibling, d); | 174 | lba_dump_res(r->sibling, d); |
| 174 | } | 175 | } |
| @@ -647,7 +648,7 @@ truncate_pat_collision(struct resource *root, struct resource *new) | |||
| 647 | printk(KERN_WARNING "LBA: Truncating lmmio_space [%lx/%lx] " | 648 | printk(KERN_WARNING "LBA: Truncating lmmio_space [%lx/%lx] " |
| 648 | "to [%lx,%lx]\n", | 649 | "to [%lx,%lx]\n", |
| 649 | start, end, | 650 | start, end, |
| 650 | new->start, new->end ); | 651 | (long)new->start, (long)new->end ); |
| 651 | 652 | ||
| 652 | return 0; /* truncation successful */ | 653 | return 0; /* truncation successful */ |
| 653 | } | 654 | } |
| @@ -715,8 +716,8 @@ lba_fixup_bus(struct pci_bus *bus) | |||
| 715 | 716 | ||
| 716 | printk("FAILED: lba_fixup_bus() request for " | 717 | printk("FAILED: lba_fixup_bus() request for " |
| 717 | "elmmio_space [%lx/%lx]\n", | 718 | "elmmio_space [%lx/%lx]\n", |
| 718 | ldev->hba.elmmio_space.start, | 719 | (long)ldev->hba.elmmio_space.start, |
| 719 | ldev->hba.elmmio_space.end); | 720 | (long)ldev->hba.elmmio_space.end); |
| 720 | 721 | ||
| 721 | /* lba_dump_res(&iomem_resource, 2); */ | 722 | /* lba_dump_res(&iomem_resource, 2); */ |
| 722 | /* BUG(); */ | 723 | /* BUG(); */ |
| @@ -738,15 +739,15 @@ lba_fixup_bus(struct pci_bus *bus) | |||
| 738 | &(ldev->hba.lmmio_space))) { | 739 | &(ldev->hba.lmmio_space))) { |
| 739 | 740 | ||
| 740 | printk(KERN_WARNING "LBA: lmmio_space [%lx/%lx] duplicate!\n", | 741 | printk(KERN_WARNING "LBA: lmmio_space [%lx/%lx] duplicate!\n", |
| 741 | ldev->hba.lmmio_space.start, | 742 | (long)ldev->hba.lmmio_space.start, |
| 742 | ldev->hba.lmmio_space.end); | 743 | (long)ldev->hba.lmmio_space.end); |
| 743 | } else { | 744 | } else { |
| 744 | err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space)); | 745 | err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space)); |
| 745 | if (err < 0) { | 746 | if (err < 0) { |
| 746 | printk(KERN_ERR "FAILED: lba_fixup_bus() request for " | 747 | printk(KERN_ERR "FAILED: lba_fixup_bus() request for " |
| 747 | "lmmio_space [%lx/%lx]\n", | 748 | "lmmio_space [%lx/%lx]\n", |
| 748 | ldev->hba.lmmio_space.start, | 749 | (long)ldev->hba.lmmio_space.start, |
| 749 | ldev->hba.lmmio_space.end); | 750 | (long)ldev->hba.lmmio_space.end); |
| 750 | } else | 751 | } else |
| 751 | bus->resource[i++] = &(ldev->hba.lmmio_space); | 752 | bus->resource[i++] = &(ldev->hba.lmmio_space); |
| 752 | } | 753 | } |
| @@ -758,8 +759,8 @@ lba_fixup_bus(struct pci_bus *bus) | |||
| 758 | if (err < 0) { | 759 | if (err < 0) { |
| 759 | printk("FAILED: lba_fixup_bus() request for " | 760 | printk("FAILED: lba_fixup_bus() request for " |
| 760 | "gmmio_space [%lx/%lx]\n", | 761 | "gmmio_space [%lx/%lx]\n", |
| 761 | ldev->hba.gmmio_space.start, | 762 | (long)ldev->hba.gmmio_space.start, |
| 762 | ldev->hba.gmmio_space.end); | 763 | (long)ldev->hba.gmmio_space.end); |
| 763 | lba_dump_res(&iomem_resource, 2); | 764 | lba_dump_res(&iomem_resource, 2); |
| 764 | BUG(); | 765 | BUG(); |
| 765 | } | 766 | } |
| @@ -980,7 +981,7 @@ LBA_PORT_IN(32, 0) | |||
| 980 | #define LBA_PORT_OUT(size, mask) \ | 981 | #define LBA_PORT_OUT(size, mask) \ |
| 981 | static void lba_pat_out##size (struct pci_hba_data *l, u16 addr, u##size val) \ | 982 | static void lba_pat_out##size (struct pci_hba_data *l, u16 addr, u##size val) \ |
| 982 | { \ | 983 | { \ |
| 983 | void *where = (void *) PIOP_TO_GMMIO(LBA_DEV(l), addr); \ | 984 | void __iomem *where = PIOP_TO_GMMIO(LBA_DEV(l), addr); \ |
| 984 | DBG_PORT("%s(0x%p, 0x%x, 0x%x)\n", __FUNCTION__, l, addr, val); \ | 985 | DBG_PORT("%s(0x%p, 0x%x, 0x%x)\n", __FUNCTION__, l, addr, val); \ |
| 985 | WRITE_REG##size(val, where); \ | 986 | WRITE_REG##size(val, where); \ |
| 986 | /* flush the I/O down to the elroy at least */ \ | 987 | /* flush the I/O down to the elroy at least */ \ |
| @@ -1063,16 +1064,16 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev) | |||
| 1063 | /* used to fix up pre-initialized MEM BARs */ | 1064 | /* used to fix up pre-initialized MEM BARs */ |
| 1064 | if (!lba_dev->hba.lmmio_space.start) { | 1065 | if (!lba_dev->hba.lmmio_space.start) { |
| 1065 | sprintf(lba_dev->hba.lmmio_name, | 1066 | sprintf(lba_dev->hba.lmmio_name, |
| 1066 | "PCI%02lx LMMIO", | 1067 | "PCI%02x LMMIO", |
| 1067 | lba_dev->hba.bus_num.start); | 1068 | (int)lba_dev->hba.bus_num.start); |
| 1068 | lba_dev->hba.lmmio_space_offset = p->start - | 1069 | lba_dev->hba.lmmio_space_offset = p->start - |
| 1069 | io->start; | 1070 | io->start; |
| 1070 | r = &lba_dev->hba.lmmio_space; | 1071 | r = &lba_dev->hba.lmmio_space; |
| 1071 | r->name = lba_dev->hba.lmmio_name; | 1072 | r->name = lba_dev->hba.lmmio_name; |
| 1072 | } else if (!lba_dev->hba.elmmio_space.start) { | 1073 | } else if (!lba_dev->hba.elmmio_space.start) { |
| 1073 | sprintf(lba_dev->hba.elmmio_name, | 1074 | sprintf(lba_dev->hba.elmmio_name, |
| 1074 | "PCI%02lx ELMMIO", | 1075 | "PCI%02x ELMMIO", |
| 1075 | lba_dev->hba.bus_num.start); | 1076 | (int)lba_dev->hba.bus_num.start); |
| 1076 | r = &lba_dev->hba.elmmio_space; | 1077 | r = &lba_dev->hba.elmmio_space; |
| 1077 | r->name = lba_dev->hba.elmmio_name; | 1078 | r->name = lba_dev->hba.elmmio_name; |
| 1078 | } else { | 1079 | } else { |
| @@ -1089,8 +1090,8 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev) | |||
| 1089 | 1090 | ||
| 1090 | case PAT_GMMIO: | 1091 | case PAT_GMMIO: |
| 1091 | /* MMIO space > 4GB phys addr; for 64-bit BAR */ | 1092 | /* MMIO space > 4GB phys addr; for 64-bit BAR */ |
| 1092 | sprintf(lba_dev->hba.gmmio_name, "PCI%02lx GMMIO", | 1093 | sprintf(lba_dev->hba.gmmio_name, "PCI%02x GMMIO", |
| 1093 | lba_dev->hba.bus_num.start); | 1094 | (int)lba_dev->hba.bus_num.start); |
| 1094 | r = &lba_dev->hba.gmmio_space; | 1095 | r = &lba_dev->hba.gmmio_space; |
| 1095 | r->name = lba_dev->hba.gmmio_name; | 1096 | r->name = lba_dev->hba.gmmio_name; |
| 1096 | r->start = p->start; | 1097 | r->start = p->start; |
| @@ -1112,8 +1113,8 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev) | |||
| 1112 | */ | 1113 | */ |
| 1113 | lba_dev->iop_base = ioremap_nocache(p->start, 64 * 1024 * 1024); | 1114 | lba_dev->iop_base = ioremap_nocache(p->start, 64 * 1024 * 1024); |
| 1114 | 1115 | ||
| 1115 | sprintf(lba_dev->hba.io_name, "PCI%02lx Ports", | 1116 | sprintf(lba_dev->hba.io_name, "PCI%02x Ports", |
| 1116 | lba_dev->hba.bus_num.start); | 1117 | (int)lba_dev->hba.bus_num.start); |
| 1117 | r = &lba_dev->hba.io_space; | 1118 | r = &lba_dev->hba.io_space; |
| 1118 | r->name = lba_dev->hba.io_name; | 1119 | r->name = lba_dev->hba.io_name; |
| 1119 | r->start = HBA_PORT_BASE(lba_dev->hba.hba_num); | 1120 | r->start = HBA_PORT_BASE(lba_dev->hba.hba_num); |
| @@ -1166,8 +1167,8 @@ lba_legacy_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev) | |||
| 1166 | ** Legacy boxes but it's nice to see in /proc/iomem. | 1167 | ** Legacy boxes but it's nice to see in /proc/iomem. |
| 1167 | */ | 1168 | */ |
| 1168 | r = &(lba_dev->hba.lmmio_space); | 1169 | r = &(lba_dev->hba.lmmio_space); |
| 1169 | sprintf(lba_dev->hba.lmmio_name, "PCI%02lx LMMIO", | 1170 | sprintf(lba_dev->hba.lmmio_name, "PCI%02x LMMIO", |
| 1170 | lba_dev->hba.bus_num.start); | 1171 | (int)lba_dev->hba.bus_num.start); |
| 1171 | r->name = lba_dev->hba.lmmio_name; | 1172 | r->name = lba_dev->hba.lmmio_name; |
| 1172 | 1173 | ||
| 1173 | #if 1 | 1174 | #if 1 |
| @@ -1275,8 +1276,8 @@ lba_legacy_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev) | |||
| 1275 | ** an existing (but unused portion of) distributed range. | 1276 | ** an existing (but unused portion of) distributed range. |
| 1276 | */ | 1277 | */ |
| 1277 | r = &(lba_dev->hba.elmmio_space); | 1278 | r = &(lba_dev->hba.elmmio_space); |
| 1278 | sprintf(lba_dev->hba.elmmio_name, "PCI%02lx ELMMIO", | 1279 | sprintf(lba_dev->hba.elmmio_name, "PCI%02x ELMMIO", |
| 1279 | lba_dev->hba.bus_num.start); | 1280 | (int)lba_dev->hba.bus_num.start); |
| 1280 | r->name = lba_dev->hba.elmmio_name; | 1281 | r->name = lba_dev->hba.elmmio_name; |
| 1281 | 1282 | ||
| 1282 | #if 1 | 1283 | #if 1 |
| @@ -1297,8 +1298,8 @@ lba_legacy_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev) | |||
| 1297 | #endif | 1298 | #endif |
| 1298 | 1299 | ||
| 1299 | r = &(lba_dev->hba.io_space); | 1300 | r = &(lba_dev->hba.io_space); |
| 1300 | sprintf(lba_dev->hba.io_name, "PCI%02lx Ports", | 1301 | sprintf(lba_dev->hba.io_name, "PCI%02x Ports", |
| 1301 | lba_dev->hba.bus_num.start); | 1302 | (int)lba_dev->hba.bus_num.start); |
| 1302 | r->name = lba_dev->hba.io_name; | 1303 | r->name = lba_dev->hba.io_name; |
| 1303 | r->flags = IORESOURCE_IO; | 1304 | r->flags = IORESOURCE_IO; |
| 1304 | r->start = READ_REG32(lba_dev->hba.base_addr + LBA_IOS_BASE) & ~1L; | 1305 | r->start = READ_REG32(lba_dev->hba.base_addr + LBA_IOS_BASE) & ~1L; |
| @@ -1406,13 +1407,20 @@ lba_hw_init(struct lba_device *d) | |||
| 1406 | return 0; | 1407 | return 0; |
| 1407 | } | 1408 | } |
| 1408 | 1409 | ||
| 1409 | 1410 | /* | |
| 1411 | * Unfortunately, when firmware numbers busses, it doesn't take into account | ||
| 1412 | * Cardbus bridges. So we have to renumber the busses to suit ourselves. | ||
| 1413 | * Elroy/Mercury don't actually know what bus number they're attached to; | ||
| 1414 | * we use bus 0 to indicate the directly attached bus and any other bus | ||
| 1415 | * number will be taken care of by the PCI-PCI bridge. | ||
| 1416 | */ | ||
| 1417 | static unsigned int lba_next_bus = 0; | ||
| 1410 | 1418 | ||
| 1411 | /* | 1419 | /* |
| 1412 | ** Determine if lba should claim this chip (return 0) or not (return 1). | 1420 | * Determine if lba should claim this chip (return 0) or not (return 1). |
| 1413 | ** If so, initialize the chip and tell other partners in crime they | 1421 | * If so, initialize the chip and tell other partners in crime they |
| 1414 | ** have work to do. | 1422 | * have work to do. |
| 1415 | */ | 1423 | */ |
| 1416 | static int __init | 1424 | static int __init |
| 1417 | lba_driver_probe(struct parisc_device *dev) | 1425 | lba_driver_probe(struct parisc_device *dev) |
| 1418 | { | 1426 | { |
| @@ -1440,7 +1448,7 @@ lba_driver_probe(struct parisc_device *dev) | |||
| 1440 | } | 1448 | } |
| 1441 | 1449 | ||
| 1442 | printk(KERN_INFO "Elroy version %s (0x%x) found at 0x%lx\n", | 1450 | printk(KERN_INFO "Elroy version %s (0x%x) found at 0x%lx\n", |
| 1443 | version, func_class & 0xf, dev->hpa.start); | 1451 | version, func_class & 0xf, (long)dev->hpa.start); |
| 1444 | 1452 | ||
| 1445 | if (func_class < 2) { | 1453 | if (func_class < 2) { |
| 1446 | printk(KERN_WARNING "Can't support LBA older than " | 1454 | printk(KERN_WARNING "Can't support LBA older than " |
| @@ -1470,17 +1478,16 @@ lba_driver_probe(struct parisc_device *dev) | |||
| 1470 | */ | 1478 | */ |
| 1471 | printk(KERN_INFO "%s version TR%d.%d (0x%x) found at 0x%lx\n", | 1479 | printk(KERN_INFO "%s version TR%d.%d (0x%x) found at 0x%lx\n", |
| 1472 | IS_MERCURY(dev) ? "Mercury" : "Quicksilver", major, | 1480 | IS_MERCURY(dev) ? "Mercury" : "Quicksilver", major, |
| 1473 | minor, func_class, dev->hpa.start); | 1481 | minor, func_class, (long)dev->hpa.start); |
| 1474 | 1482 | ||
| 1475 | cfg_ops = &mercury_cfg_ops; | 1483 | cfg_ops = &mercury_cfg_ops; |
| 1476 | } else { | 1484 | } else { |
| 1477 | printk(KERN_ERR "Unknown LBA found at 0x%lx\n", dev->hpa.start); | 1485 | printk(KERN_ERR "Unknown LBA found at 0x%lx\n", |
| 1486 | (long)dev->hpa.start); | ||
| 1478 | return -ENODEV; | 1487 | return -ENODEV; |
| 1479 | } | 1488 | } |
| 1480 | 1489 | ||
| 1481 | /* | 1490 | /* Tell I/O SAPIC driver we have a IRQ handler/region. */ |
| 1482 | ** Tell I/O SAPIC driver we have a IRQ handler/region. | ||
| 1483 | */ | ||
| 1484 | tmp_obj = iosapic_register(dev->hpa.start + LBA_IOSAPIC_BASE); | 1491 | tmp_obj = iosapic_register(dev->hpa.start + LBA_IOSAPIC_BASE); |
| 1485 | 1492 | ||
| 1486 | /* NOTE: PCI devices (e.g. 103c:1005 graphics card) which don't | 1493 | /* NOTE: PCI devices (e.g. 103c:1005 graphics card) which don't |
| @@ -1529,16 +1536,17 @@ lba_driver_probe(struct parisc_device *dev) | |||
| 1529 | lba_legacy_resources(dev, lba_dev); | 1536 | lba_legacy_resources(dev, lba_dev); |
| 1530 | } | 1537 | } |
| 1531 | 1538 | ||
| 1532 | /* | 1539 | if (lba_dev->hba.bus_num.start < lba_next_bus) |
| 1533 | ** Tell PCI support another PCI bus was found. | 1540 | lba_dev->hba.bus_num.start = lba_next_bus; |
| 1534 | ** Walks PCI bus for us too. | 1541 | |
| 1535 | */ | ||
| 1536 | dev->dev.platform_data = lba_dev; | 1542 | dev->dev.platform_data = lba_dev; |
| 1537 | lba_bus = lba_dev->hba.hba_bus = | 1543 | lba_bus = lba_dev->hba.hba_bus = |
| 1538 | pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start, | 1544 | pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start, |
| 1539 | cfg_ops, NULL); | 1545 | cfg_ops, NULL); |
| 1540 | if (lba_bus) | 1546 | if (lba_bus) { |
| 1547 | lba_next_bus = lba_bus->subordinate + 1; | ||
| 1541 | pci_bus_add_devices(lba_bus); | 1548 | pci_bus_add_devices(lba_bus); |
| 1549 | } | ||
| 1542 | 1550 | ||
| 1543 | /* This is in lieu of calling pci_assign_unassigned_resources() */ | 1551 | /* This is in lieu of calling pci_assign_unassigned_resources() */ |
| 1544 | if (is_pdc_pat()) { | 1552 | if (is_pdc_pat()) { |
diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index 9a731c101d10..d190c05d87ed 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c | |||
| @@ -66,8 +66,8 @@ static char lcd_text_default[32] __read_mostly; | |||
| 66 | 66 | ||
| 67 | 67 | ||
| 68 | static struct workqueue_struct *led_wq; | 68 | static struct workqueue_struct *led_wq; |
| 69 | static void led_work_func(void *); | 69 | static void led_work_func(struct work_struct *); |
| 70 | static DECLARE_WORK(led_task, led_work_func, NULL); | 70 | static DECLARE_DELAYED_WORK(led_task, led_work_func); |
| 71 | 71 | ||
| 72 | #if 0 | 72 | #if 0 |
| 73 | #define DPRINTK(x) printk x | 73 | #define DPRINTK(x) printk x |
| @@ -136,7 +136,7 @@ static int start_task(void) | |||
| 136 | 136 | ||
| 137 | /* Create the work queue and queue the LED task */ | 137 | /* Create the work queue and queue the LED task */ |
| 138 | led_wq = create_singlethread_workqueue("led_wq"); | 138 | led_wq = create_singlethread_workqueue("led_wq"); |
| 139 | queue_work(led_wq, &led_task); | 139 | queue_delayed_work(led_wq, &led_task, 0); |
| 140 | 140 | ||
| 141 | return 0; | 141 | return 0; |
| 142 | } | 142 | } |
| @@ -441,7 +441,7 @@ static __inline__ int led_get_diskio_activity(void) | |||
| 441 | 441 | ||
| 442 | #define LED_UPDATE_INTERVAL (1 + (HZ*19/1000)) | 442 | #define LED_UPDATE_INTERVAL (1 + (HZ*19/1000)) |
| 443 | 443 | ||
| 444 | static void led_work_func (void *unused) | 444 | static void led_work_func (struct work_struct *unused) |
| 445 | { | 445 | { |
| 446 | static unsigned long last_jiffies; | 446 | static unsigned long last_jiffies; |
| 447 | static unsigned long count_HZ; /* counter in range 0..HZ */ | 447 | static unsigned long count_HZ; /* counter in range 0..HZ */ |
| @@ -588,7 +588,7 @@ int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long d | |||
| 588 | 588 | ||
| 589 | /* Ensure the work is queued */ | 589 | /* Ensure the work is queued */ |
| 590 | if (led_wq) { | 590 | if (led_wq) { |
| 591 | queue_work(led_wq, &led_task); | 591 | queue_delayed_work(led_wq, &led_task, 0); |
| 592 | } | 592 | } |
| 593 | 593 | ||
| 594 | return 0; | 594 | return 0; |
| @@ -629,7 +629,7 @@ void __init register_led_regions(void) | |||
| 629 | ** avoid a race condition while writing the CMD/DATA register pair. | 629 | ** avoid a race condition while writing the CMD/DATA register pair. |
| 630 | ** | 630 | ** |
| 631 | */ | 631 | */ |
| 632 | int lcd_print( char *str ) | 632 | int lcd_print( const char *str ) |
| 633 | { | 633 | { |
| 634 | int i; | 634 | int i; |
| 635 | 635 | ||
| @@ -658,7 +658,7 @@ int lcd_print( char *str ) | |||
| 658 | 658 | ||
| 659 | /* re-queue the work */ | 659 | /* re-queue the work */ |
| 660 | if (led_wq) { | 660 | if (led_wq) { |
| 661 | queue_work(led_wq, &led_task); | 661 | queue_delayed_work(led_wq, &led_task, 0); |
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | return lcd_info.lcd_width; | 664 | return lcd_info.lcd_width; |
diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c index 97e9dc066f95..6dedbdef7106 100644 --- a/drivers/parisc/power.c +++ b/drivers/parisc/power.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * linux/drivers/parisc/power.c | 2 | * linux/drivers/parisc/power.c |
| 3 | * HP PARISC soft power switch support driver | 3 | * HP PARISC soft power switch support driver |
| 4 | * | 4 | * |
| 5 | * Copyright (c) 2001-2005 Helge Deller <deller@gmx.de> | 5 | * Copyright (c) 2001-2007 Helge Deller <deller@gmx.de> |
| 6 | * All rights reserved. | 6 | * All rights reserved. |
| 7 | * | 7 | * |
| 8 | * | 8 | * |
| @@ -29,7 +29,6 @@ | |||
| 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 30 | * | 30 | * |
| 31 | * | 31 | * |
| 32 | * | ||
| 33 | * HINT: | 32 | * HINT: |
| 34 | * Support of the soft power switch button may be enabled or disabled at | 33 | * Support of the soft power switch button may be enabled or disabled at |
| 35 | * runtime through the "/proc/sys/kernel/power" procfs entry. | 34 | * runtime through the "/proc/sys/kernel/power" procfs entry. |
| @@ -38,34 +37,28 @@ | |||
| 38 | #include <linux/module.h> | 37 | #include <linux/module.h> |
| 39 | #include <linux/init.h> | 38 | #include <linux/init.h> |
| 40 | #include <linux/kernel.h> | 39 | #include <linux/kernel.h> |
| 41 | #include <linux/string.h> | ||
| 42 | #include <linux/notifier.h> | 40 | #include <linux/notifier.h> |
| 43 | #include <linux/reboot.h> | 41 | #include <linux/reboot.h> |
| 44 | #include <linux/sched.h> | 42 | #include <linux/sched.h> |
| 45 | #include <linux/interrupt.h> | 43 | #include <linux/kthread.h> |
| 46 | #include <linux/workqueue.h> | ||
| 47 | 44 | ||
| 48 | #include <asm/pdc.h> | 45 | #include <asm/pdc.h> |
| 49 | #include <asm/io.h> | 46 | #include <asm/io.h> |
| 50 | #include <asm/led.h> | 47 | #include <asm/led.h> |
| 51 | #include <asm/uaccess.h> | ||
| 52 | 48 | ||
| 49 | #define DRIVER_NAME "powersw" | ||
| 50 | #define KTHREAD_NAME "kpowerswd" | ||
| 53 | 51 | ||
| 54 | #ifdef DEBUG | 52 | /* how often should the power button be polled ? */ |
| 55 | # define DPRINTK(x...) printk(x) | 53 | #define POWERSWITCH_POLL_PER_SEC 2 |
| 56 | #else | ||
| 57 | # define DPRINTK(x...) | ||
| 58 | #endif | ||
| 59 | |||
| 60 | |||
| 61 | /* filename in /proc which can be used to enable/disable the power switch */ | ||
| 62 | #define SYSCTL_FILENAME "sys/kernel/power" | ||
| 63 | 54 | ||
| 55 | /* how long does the power button needs to be down until we react ? */ | ||
| 56 | #define POWERSWITCH_DOWN_SEC 2 | ||
| 64 | 57 | ||
| 58 | /* assembly code to access special registers */ | ||
| 59 | /* taken from PCXL ERS page 82 */ | ||
| 65 | #define DIAG_CODE(code) (0x14000000 + ((code)<<5)) | 60 | #define DIAG_CODE(code) (0x14000000 + ((code)<<5)) |
| 66 | 61 | ||
| 67 | /* this will go to processor.h or any other place... */ | ||
| 68 | /* taken from PCXL ERS page 82 */ | ||
| 69 | #define MFCPU_X(rDiagReg, t_ch, t_th, code) \ | 62 | #define MFCPU_X(rDiagReg, t_ch, t_th, code) \ |
| 70 | (DIAG_CODE(code) + ((rDiagReg)<<21) + ((t_ch)<<16) + ((t_th)<<0) ) | 63 | (DIAG_CODE(code) + ((rDiagReg)<<21) + ((t_ch)<<16) + ((t_th)<<0) ) |
| 71 | 64 | ||
| @@ -76,111 +69,95 @@ | |||
| 76 | #define __getDIAG(dr) ( { \ | 69 | #define __getDIAG(dr) ( { \ |
| 77 | register unsigned long __res asm("r28");\ | 70 | register unsigned long __res asm("r28");\ |
| 78 | __asm__ __volatile__ ( \ | 71 | __asm__ __volatile__ ( \ |
| 79 | ".word %1\n nop\n" : "=&r" (__res) : "i" (MFCPU_T(dr,28)) \ | 72 | ".word %1" : "=&r" (__res) : "i" (MFCPU_T(dr,28) ) \ |
| 80 | ); \ | 73 | ); \ |
| 81 | __res; \ | 74 | __res; \ |
| 82 | } ) | 75 | } ) |
| 83 | 76 | ||
| 84 | 77 | /* local shutdown counter */ | |
| 85 | static void deferred_poweroff(void *dummy) | ||
| 86 | { | ||
| 87 | if (kill_cad_pid(SIGINT, 1)) { | ||
| 88 | /* just in case killing init process failed */ | ||
| 89 | machine_power_off(); | ||
| 90 | } | ||
| 91 | } | ||
| 92 | |||
| 93 | /* | ||
| 94 | * This function gets called from interrupt context. | ||
| 95 | * As it's called within an interrupt, it wouldn't sync if we don't | ||
| 96 | * use schedule_work(). | ||
| 97 | */ | ||
| 98 | |||
| 99 | static DECLARE_WORK(poweroff_work, deferred_poweroff, NULL); | ||
| 100 | |||
| 101 | static void poweroff(void) | ||
| 102 | { | ||
| 103 | static int powering_off __read_mostly; | ||
| 104 | |||
| 105 | if (powering_off) | ||
| 106 | return; | ||
| 107 | |||
| 108 | powering_off++; | ||
| 109 | schedule_work(&poweroff_work); | ||
| 110 | } | ||
| 111 | |||
| 112 | |||
| 113 | /* local time-counter for shutdown */ | ||
| 114 | static int shutdown_timer __read_mostly; | 78 | static int shutdown_timer __read_mostly; |
| 115 | 79 | ||
| 116 | /* check, give feedback and start shutdown after one second */ | 80 | /* check, give feedback and start shutdown after one second */ |
| 117 | static void process_shutdown(void) | 81 | static void process_shutdown(void) |
| 118 | { | 82 | { |
| 119 | if (shutdown_timer == 0) | 83 | if (shutdown_timer == 0) |
| 120 | DPRINTK(KERN_INFO "Shutdown requested...\n"); | 84 | printk(KERN_ALERT KTHREAD_NAME ": Shutdown requested...\n"); |
| 121 | 85 | ||
| 122 | shutdown_timer++; | 86 | shutdown_timer++; |
| 123 | 87 | ||
| 124 | /* wait until the button was pressed for 1 second */ | 88 | /* wait until the button was pressed for 1 second */ |
| 125 | if (shutdown_timer == HZ) { | 89 | if (shutdown_timer == (POWERSWITCH_DOWN_SEC*POWERSWITCH_POLL_PER_SEC)) { |
| 126 | #if defined (DEBUG) || defined(CONFIG_CHASSIS_LCD_LED) | 90 | static const char msg[] = "Shutting down..."; |
| 127 | static char msg[] = "Shutting down..."; | 91 | printk(KERN_INFO KTHREAD_NAME ": %s\n", msg); |
| 128 | #endif | ||
| 129 | DPRINTK(KERN_INFO "%s\n", msg); | ||
| 130 | lcd_print(msg); | 92 | lcd_print(msg); |
| 131 | poweroff(); | 93 | |
| 94 | /* send kill signal */ | ||
| 95 | if (kill_cad_pid(SIGINT, 1)) { | ||
| 96 | /* just in case killing init process failed */ | ||
| 97 | if (pm_power_off) | ||
| 98 | pm_power_off(); | ||
| 99 | } | ||
| 132 | } | 100 | } |
| 133 | } | 101 | } |
| 134 | 102 | ||
| 135 | 103 | ||
| 136 | /* main power switch tasklet struct (scheduled from time.c) */ | 104 | /* main power switch task struct */ |
| 137 | DECLARE_TASKLET_DISABLED(power_tasklet, NULL, 0); | 105 | static struct task_struct *power_task; |
| 106 | |||
| 107 | /* filename in /proc which can be used to enable/disable the power switch */ | ||
| 108 | #define SYSCTL_FILENAME "sys/kernel/power" | ||
| 138 | 109 | ||
| 139 | /* soft power switch enabled/disabled */ | 110 | /* soft power switch enabled/disabled */ |
| 140 | int pwrsw_enabled __read_mostly = 1; | 111 | int pwrsw_enabled __read_mostly = 1; |
| 141 | 112 | ||
| 142 | /* | 113 | /* main kernel thread worker. It polls the button state */ |
| 143 | * On gecko style machines (e.g. 712/xx and 715/xx) | 114 | static int kpowerswd(void *param) |
| 144 | * the power switch status is stored in Bit 0 ("the highest bit") | ||
| 145 | * of CPU diagnose register 25. | ||
| 146 | * | ||
| 147 | */ | ||
| 148 | static void gecko_tasklet_func(unsigned long unused) | ||
| 149 | { | 115 | { |
| 150 | if (unlikely(!pwrsw_enabled)) | 116 | __set_current_state(TASK_RUNNING); |
| 151 | return; | 117 | |
| 152 | 118 | do { | |
| 153 | if (__getDIAG(25) & 0x80000000) { | 119 | int button_not_pressed; |
| 154 | /* power switch button not pressed or released again */ | 120 | unsigned long soft_power_reg = (unsigned long) param; |
| 155 | /* Warning: Some machines do never reset this DIAG flag! */ | 121 | |
| 156 | shutdown_timer = 0; | 122 | schedule_timeout_interruptible(pwrsw_enabled ? HZ : HZ/POWERSWITCH_POLL_PER_SEC); |
| 157 | } else { | 123 | __set_current_state(TASK_RUNNING); |
| 158 | process_shutdown(); | 124 | |
| 159 | } | 125 | if (unlikely(!pwrsw_enabled)) |
| 160 | } | 126 | continue; |
| 161 | 127 | ||
| 128 | if (soft_power_reg) { | ||
| 129 | /* | ||
| 130 | * Non-Gecko-style machines: | ||
| 131 | * Check the power switch status which is read from the | ||
| 132 | * real I/O location at soft_power_reg. | ||
| 133 | * Bit 31 ("the lowest bit) is the status of the power switch. | ||
| 134 | * This bit is "1" if the button is NOT pressed. | ||
| 135 | */ | ||
| 136 | button_not_pressed = (gsc_readl(soft_power_reg) & 0x1); | ||
| 137 | } else { | ||
| 138 | /* | ||
| 139 | * On gecko style machines (e.g. 712/xx and 715/xx) | ||
| 140 | * the power switch status is stored in Bit 0 ("the highest bit") | ||
| 141 | * of CPU diagnose register 25. | ||
| 142 | * Warning: Some machines never reset the DIAG flag, even if | ||
| 143 | * the button has been released again. | ||
| 144 | */ | ||
| 145 | button_not_pressed = (__getDIAG(25) & 0x80000000); | ||
| 146 | } | ||
| 147 | |||
| 148 | if (likely(button_not_pressed)) { | ||
| 149 | if (unlikely(shutdown_timer && /* avoid writing if not necessary */ | ||
| 150 | shutdown_timer < (POWERSWITCH_DOWN_SEC*POWERSWITCH_POLL_PER_SEC))) { | ||
| 151 | shutdown_timer = 0; | ||
| 152 | printk(KERN_INFO KTHREAD_NAME ": Shutdown request aborted.\n"); | ||
| 153 | } | ||
| 154 | } else | ||
| 155 | process_shutdown(); | ||
| 156 | |||
| 157 | |||
| 158 | } while (!kthread_should_stop()); | ||
| 162 | 159 | ||
| 163 | 160 | return 0; | |
| 164 | /* | ||
| 165 | * Check the power switch status which is read from the | ||
| 166 | * real I/O location at soft_power_reg. | ||
| 167 | * Bit 31 ("the lowest bit) is the status of the power switch. | ||
| 168 | */ | ||
| 169 | |||
| 170 | static void polling_tasklet_func(unsigned long soft_power_reg) | ||
| 171 | { | ||
| 172 | unsigned long current_status; | ||
| 173 | |||
| 174 | if (unlikely(!pwrsw_enabled)) | ||
| 175 | return; | ||
| 176 | |||
| 177 | current_status = gsc_readl(soft_power_reg); | ||
| 178 | if (current_status & 0x1) { | ||
| 179 | /* power switch button not pressed */ | ||
| 180 | shutdown_timer = 0; | ||
| 181 | } else { | ||
| 182 | process_shutdown(); | ||
| 183 | } | ||
| 184 | } | 161 | } |
| 185 | 162 | ||
| 186 | 163 | ||
| @@ -220,7 +197,7 @@ static struct notifier_block parisc_panic_block = { | |||
| 220 | static int __init power_init(void) | 197 | static int __init power_init(void) |
| 221 | { | 198 | { |
| 222 | unsigned long ret; | 199 | unsigned long ret; |
| 223 | unsigned long soft_power_reg = 0; | 200 | unsigned long soft_power_reg; |
| 224 | 201 | ||
| 225 | #if 0 | 202 | #if 0 |
| 226 | request_irq( IRQ_FROM_REGION(CPU_IRQ_REGION)+2, &powerfail_interrupt, | 203 | request_irq( IRQ_FROM_REGION(CPU_IRQ_REGION)+2, &powerfail_interrupt, |
| @@ -235,44 +212,44 @@ static int __init power_init(void) | |||
| 235 | soft_power_reg = -1UL; | 212 | soft_power_reg = -1UL; |
| 236 | 213 | ||
| 237 | switch (soft_power_reg) { | 214 | switch (soft_power_reg) { |
| 238 | case 0: printk(KERN_INFO "Gecko-style soft power switch enabled.\n"); | 215 | case 0: printk(KERN_INFO DRIVER_NAME ": Gecko-style soft power switch enabled.\n"); |
| 239 | power_tasklet.func = gecko_tasklet_func; | ||
| 240 | break; | 216 | break; |
| 241 | 217 | ||
| 242 | case -1UL: printk(KERN_INFO "Soft power switch support not available.\n"); | 218 | case -1UL: printk(KERN_INFO DRIVER_NAME ": Soft power switch support not available.\n"); |
| 243 | return -ENODEV; | 219 | return -ENODEV; |
| 244 | 220 | ||
| 245 | default: printk(KERN_INFO "Soft power switch enabled, polling @ 0x%08lx.\n", | 221 | default: printk(KERN_INFO DRIVER_NAME ": Soft power switch at 0x%08lx enabled.\n", |
| 246 | soft_power_reg); | 222 | soft_power_reg); |
| 247 | power_tasklet.data = soft_power_reg; | 223 | } |
| 248 | power_tasklet.func = polling_tasklet_func; | 224 | |
| 225 | power_task = kthread_run(kpowerswd, (void*)soft_power_reg, KTHREAD_NAME); | ||
| 226 | if (IS_ERR(power_task)) { | ||
| 227 | printk(KERN_ERR DRIVER_NAME ": thread creation failed. Driver not loaded.\n"); | ||
| 228 | pdc_soft_power_button(0); | ||
| 229 | return -EIO; | ||
| 249 | } | 230 | } |
| 250 | 231 | ||
| 251 | /* Register a call for panic conditions. */ | 232 | /* Register a call for panic conditions. */ |
| 252 | atomic_notifier_chain_register(&panic_notifier_list, | 233 | atomic_notifier_chain_register(&panic_notifier_list, |
| 253 | &parisc_panic_block); | 234 | &parisc_panic_block); |
| 254 | 235 | ||
| 255 | tasklet_enable(&power_tasklet); | ||
| 256 | |||
| 257 | return 0; | 236 | return 0; |
| 258 | } | 237 | } |
| 259 | 238 | ||
| 260 | static void __exit power_exit(void) | 239 | static void __exit power_exit(void) |
| 261 | { | 240 | { |
| 262 | if (!power_tasklet.func) | 241 | kthread_stop(power_task); |
| 263 | return; | ||
| 264 | 242 | ||
| 265 | tasklet_disable(&power_tasklet); | ||
| 266 | atomic_notifier_chain_unregister(&panic_notifier_list, | 243 | atomic_notifier_chain_unregister(&panic_notifier_list, |
| 267 | &parisc_panic_block); | 244 | &parisc_panic_block); |
| 268 | power_tasklet.func = NULL; | 245 | |
| 269 | pdc_soft_power_button(0); | 246 | pdc_soft_power_button(0); |
| 270 | } | 247 | } |
| 271 | 248 | ||
| 272 | module_init(power_init); | 249 | arch_initcall(power_init); |
| 273 | module_exit(power_exit); | 250 | module_exit(power_exit); |
| 274 | 251 | ||
| 275 | 252 | ||
| 276 | MODULE_AUTHOR("Helge Deller"); | 253 | MODULE_AUTHOR("Helge Deller <deller@gmx.de>"); |
| 277 | MODULE_DESCRIPTION("Soft power switch driver"); | 254 | MODULE_DESCRIPTION("Soft power switch driver"); |
| 278 | MODULE_LICENSE("Dual BSD/GPL"); | 255 | MODULE_LICENSE("Dual BSD/GPL"); |
diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index 76a29dadd519..322957ac2ad1 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c | |||
| @@ -109,7 +109,7 @@ static unsigned long piranha_bad_128k = 0; | |||
| 109 | 109 | ||
| 110 | #ifdef SBA_AGP_SUPPORT | 110 | #ifdef SBA_AGP_SUPPORT |
| 111 | static int sba_reserve_agpgart = 1; | 111 | static int sba_reserve_agpgart = 1; |
| 112 | module_param(sba_reserve_agpgart, int, 1); | 112 | module_param(sba_reserve_agpgart, int, 0444); |
| 113 | MODULE_PARM_DESC(sba_reserve_agpgart, "Reserve half of IO pdir as AGPGART"); | 113 | MODULE_PARM_DESC(sba_reserve_agpgart, "Reserve half of IO pdir as AGPGART"); |
| 114 | #endif | 114 | #endif |
| 115 | 115 | ||
| @@ -846,7 +846,7 @@ static void *sba_alloc_consistent(struct device *hwdev, size_t size, | |||
| 846 | if (!hwdev) { | 846 | if (!hwdev) { |
| 847 | /* only support PCI */ | 847 | /* only support PCI */ |
| 848 | *dma_handle = 0; | 848 | *dma_handle = 0; |
| 849 | return 0; | 849 | return NULL; |
| 850 | } | 850 | } |
| 851 | 851 | ||
| 852 | ret = (void *) __get_free_pages(gfp, get_order(size)); | 852 | ret = (void *) __get_free_pages(gfp, get_order(size)); |
diff --git a/drivers/serial/mux.c b/drivers/serial/mux.c index ccb8fa1800a5..83211013deb8 100644 --- a/drivers/serial/mux.c +++ b/drivers/serial/mux.c | |||
| @@ -51,7 +51,11 @@ | |||
| 51 | 51 | ||
| 52 | #define MUX_NR 256 | 52 | #define MUX_NR 256 |
| 53 | static unsigned int port_cnt __read_mostly; | 53 | static unsigned int port_cnt __read_mostly; |
| 54 | static struct uart_port mux_ports[MUX_NR]; | 54 | struct mux_port { |
| 55 | struct uart_port port; | ||
| 56 | int enabled; | ||
| 57 | }; | ||
| 58 | static struct mux_port mux_ports[MUX_NR]; | ||
| 55 | 59 | ||
| 56 | static struct uart_driver mux_driver = { | 60 | static struct uart_driver mux_driver = { |
| 57 | .owner = THIS_MODULE, | 61 | .owner = THIS_MODULE, |
| @@ -66,7 +70,36 @@ static struct timer_list mux_timer; | |||
| 66 | 70 | ||
| 67 | #define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET) | 71 | #define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET) |
| 68 | #define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET) | 72 | #define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET) |
| 69 | #define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8 | 73 | |
| 74 | /** | ||
| 75 | * get_mux_port_count - Get the number of available ports on the Mux. | ||
| 76 | * @dev: The parisc device. | ||
| 77 | * | ||
| 78 | * This function is used to determine the number of ports the Mux | ||
| 79 | * supports. The IODC data reports the number of ports the Mux | ||
| 80 | * can support, but there are cases where not all the Mux ports | ||
| 81 | * are connected. This function can override the IODC and | ||
| 82 | * return the true port count. | ||
| 83 | */ | ||
| 84 | static int __init get_mux_port_count(struct parisc_device *dev) | ||
| 85 | { | ||
| 86 | int status; | ||
| 87 | u8 iodc_data[32]; | ||
| 88 | unsigned long bytecnt; | ||
| 89 | |||
| 90 | /* If this is the built-in Mux for the K-Class (Eole CAP/MUX), | ||
| 91 | * we only need to allocate resources for 1 port since the | ||
| 92 | * other 7 ports are not connected. | ||
| 93 | */ | ||
| 94 | if(dev->id.hversion == 0x15) | ||
| 95 | return 1; | ||
| 96 | |||
| 97 | status = pdc_iodc_read(&bytecnt, dev->hpa.start, 0, iodc_data, 32); | ||
| 98 | BUG_ON(status != PDC_OK); | ||
| 99 | |||
| 100 | /* Return the number of ports specified in the iodc data. */ | ||
| 101 | return ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8; | ||
| 102 | } | ||
| 70 | 103 | ||
| 71 | /** | 104 | /** |
| 72 | * mux_tx_empty - Check if the transmitter fifo is empty. | 105 | * mux_tx_empty - Check if the transmitter fifo is empty. |
| @@ -250,7 +283,7 @@ static void mux_read(struct uart_port *port) | |||
| 250 | */ | 283 | */ |
| 251 | static int mux_startup(struct uart_port *port) | 284 | static int mux_startup(struct uart_port *port) |
| 252 | { | 285 | { |
| 253 | mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY); | 286 | mux_ports[port->line].enabled = 1; |
| 254 | return 0; | 287 | return 0; |
| 255 | } | 288 | } |
| 256 | 289 | ||
| @@ -262,6 +295,7 @@ static int mux_startup(struct uart_port *port) | |||
| 262 | */ | 295 | */ |
| 263 | static void mux_shutdown(struct uart_port *port) | 296 | static void mux_shutdown(struct uart_port *port) |
| 264 | { | 297 | { |
| 298 | mux_ports[port->line].enabled = 0; | ||
| 265 | } | 299 | } |
| 266 | 300 | ||
| 267 | /** | 301 | /** |
| @@ -319,7 +353,7 @@ static int mux_request_port(struct uart_port *port) | |||
| 319 | * @port: Ptr to the uart_port. | 353 | * @port: Ptr to the uart_port. |
| 320 | * @type: Bitmask of required configurations. | 354 | * @type: Bitmask of required configurations. |
| 321 | * | 355 | * |
| 322 | * Perform any autoconfiguration steps for the port. This functino is | 356 | * Perform any autoconfiguration steps for the port. This function is |
| 323 | * called if the UPF_BOOT_AUTOCONF flag is specified for the port. | 357 | * called if the UPF_BOOT_AUTOCONF flag is specified for the port. |
| 324 | * [Note: This is required for now because of a bug in the Serial core. | 358 | * [Note: This is required for now because of a bug in the Serial core. |
| 325 | * rmk has already submitted a patch to linus, should be available for | 359 | * rmk has already submitted a patch to linus, should be available for |
| @@ -357,11 +391,11 @@ static void mux_poll(unsigned long unused) | |||
| 357 | int i; | 391 | int i; |
| 358 | 392 | ||
| 359 | for(i = 0; i < port_cnt; ++i) { | 393 | for(i = 0; i < port_cnt; ++i) { |
| 360 | if(!mux_ports[i].info) | 394 | if(!mux_ports[i].enabled) |
| 361 | continue; | 395 | continue; |
| 362 | 396 | ||
| 363 | mux_read(&mux_ports[i]); | 397 | mux_read(&mux_ports[i].port); |
| 364 | mux_write(&mux_ports[i]); | 398 | mux_write(&mux_ports[i].port); |
| 365 | } | 399 | } |
| 366 | 400 | ||
| 367 | mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY); | 401 | mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY); |
| @@ -371,8 +405,17 @@ static void mux_poll(unsigned long unused) | |||
| 371 | #ifdef CONFIG_SERIAL_MUX_CONSOLE | 405 | #ifdef CONFIG_SERIAL_MUX_CONSOLE |
| 372 | static void mux_console_write(struct console *co, const char *s, unsigned count) | 406 | static void mux_console_write(struct console *co, const char *s, unsigned count) |
| 373 | { | 407 | { |
| 374 | while(count--) | 408 | /* Wait until the FIFO drains. */ |
| 375 | pdc_iodc_putc(*s++); | 409 | while(UART_GET_FIFO_CNT(&mux_ports[0].port)) |
| 410 | udelay(1); | ||
| 411 | |||
| 412 | while(count--) { | ||
| 413 | if(*s == '\n') { | ||
| 414 | UART_PUT_CHAR(&mux_ports[0].port, '\r'); | ||
| 415 | } | ||
| 416 | UART_PUT_CHAR(&mux_ports[0].port, *s++); | ||
| 417 | } | ||
| 418 | |||
| 376 | } | 419 | } |
| 377 | 420 | ||
| 378 | static int mux_console_setup(struct console *co, char *options) | 421 | static int mux_console_setup(struct console *co, char *options) |
| @@ -428,19 +471,14 @@ static struct uart_ops mux_pops = { | |||
| 428 | */ | 471 | */ |
| 429 | static int __init mux_probe(struct parisc_device *dev) | 472 | static int __init mux_probe(struct parisc_device *dev) |
| 430 | { | 473 | { |
| 431 | int i, status, ports; | 474 | int i, status; |
| 432 | u8 iodc_data[32]; | ||
| 433 | unsigned long bytecnt; | ||
| 434 | struct uart_port *port; | ||
| 435 | 475 | ||
| 436 | status = pdc_iodc_read(&bytecnt, dev->hpa.start, 0, iodc_data, 32); | 476 | int port_count = get_mux_port_count(dev); |
| 437 | if(status != PDC_OK) { | 477 | printk(KERN_INFO "Serial mux driver (%d ports) Revision: 0.6\n", port_count); |
| 438 | printk(KERN_ERR "Serial mux: Unable to read IODC.\n"); | ||
| 439 | return 1; | ||
| 440 | } | ||
| 441 | 478 | ||
| 442 | ports = GET_MUX_PORTS(iodc_data); | 479 | dev_set_drvdata(&dev->dev, (void *)(long)port_count); |
| 443 | printk(KERN_INFO "Serial mux driver (%d ports) Revision: 0.3\n", ports); | 480 | request_mem_region(dev->hpa.start + MUX_OFFSET, |
| 481 | port_count * MUX_LINE_OFFSET, "Mux"); | ||
| 444 | 482 | ||
| 445 | if(!port_cnt) { | 483 | if(!port_cnt) { |
| 446 | mux_driver.cons = MUX_CONSOLE; | 484 | mux_driver.cons = MUX_CONSOLE; |
| @@ -450,13 +488,10 @@ static int __init mux_probe(struct parisc_device *dev) | |||
| 450 | printk(KERN_ERR "Serial mux: Unable to register driver.\n"); | 488 | printk(KERN_ERR "Serial mux: Unable to register driver.\n"); |
| 451 | return 1; | 489 | return 1; |
| 452 | } | 490 | } |
| 453 | |||
| 454 | init_timer(&mux_timer); | ||
| 455 | mux_timer.function = mux_poll; | ||
| 456 | } | 491 | } |
| 457 | 492 | ||
| 458 | for(i = 0; i < ports; ++i, ++port_cnt) { | 493 | for(i = 0; i < port_count; ++i, ++port_cnt) { |
| 459 | port = &mux_ports[port_cnt]; | 494 | struct uart_port *port = &mux_ports[port_cnt].port; |
| 460 | port->iobase = 0; | 495 | port->iobase = 0; |
| 461 | port->mapbase = dev->hpa.start + MUX_OFFSET + | 496 | port->mapbase = dev->hpa.start + MUX_OFFSET + |
| 462 | (i * MUX_LINE_OFFSET); | 497 | (i * MUX_LINE_OFFSET); |
| @@ -477,27 +512,73 @@ static int __init mux_probe(struct parisc_device *dev) | |||
| 477 | */ | 512 | */ |
| 478 | port->timeout = HZ / 50; | 513 | port->timeout = HZ / 50; |
| 479 | spin_lock_init(&port->lock); | 514 | spin_lock_init(&port->lock); |
| 515 | |||
| 480 | status = uart_add_one_port(&mux_driver, port); | 516 | status = uart_add_one_port(&mux_driver, port); |
| 481 | BUG_ON(status); | 517 | BUG_ON(status); |
| 482 | } | 518 | } |
| 483 | 519 | ||
| 484 | #ifdef CONFIG_SERIAL_MUX_CONSOLE | ||
| 485 | register_console(&mux_console); | ||
| 486 | #endif | ||
| 487 | return 0; | 520 | return 0; |
| 488 | } | 521 | } |
| 489 | 522 | ||
| 523 | static int __devexit mux_remove(struct parisc_device *dev) | ||
| 524 | { | ||
| 525 | int i, j; | ||
| 526 | int port_count = (long)dev_get_drvdata(&dev->dev); | ||
| 527 | |||
| 528 | /* Find Port 0 for this card in the mux_ports list. */ | ||
| 529 | for(i = 0; i < port_cnt; ++i) { | ||
| 530 | if(mux_ports[i].port.mapbase == dev->hpa.start + MUX_OFFSET) | ||
| 531 | break; | ||
| 532 | } | ||
| 533 | BUG_ON(i + port_count > port_cnt); | ||
| 534 | |||
| 535 | /* Release the resources associated with each port on the device. */ | ||
| 536 | for(j = 0; j < port_count; ++j, ++i) { | ||
| 537 | struct uart_port *port = &mux_ports[i].port; | ||
| 538 | |||
| 539 | uart_remove_one_port(&mux_driver, port); | ||
| 540 | if(port->membase) | ||
| 541 | iounmap(port->membase); | ||
| 542 | } | ||
| 543 | |||
| 544 | release_mem_region(dev->hpa.start + MUX_OFFSET, port_count * MUX_LINE_OFFSET); | ||
| 545 | return 0; | ||
| 546 | } | ||
| 547 | |||
| 548 | /* Hack. This idea was taken from the 8250_gsc.c on how to properly order | ||
| 549 | * the serial port detection in the proper order. The idea is we always | ||
| 550 | * want the builtin mux to be detected before addin mux cards, so we | ||
| 551 | * specifically probe for the builtin mux cards first. | ||
| 552 | * | ||
| 553 | * This table only contains the parisc_device_id of known builtin mux | ||
| 554 | * devices. All other mux cards will be detected by the generic mux_tbl. | ||
| 555 | */ | ||
| 556 | static struct parisc_device_id builtin_mux_tbl[] = { | ||
| 557 | { HPHW_A_DIRECT, HVERSION_REV_ANY_ID, 0x15, 0x0000D }, /* All K-class */ | ||
| 558 | { HPHW_A_DIRECT, HVERSION_REV_ANY_ID, 0x44, 0x0000D }, /* E35, E45, and E55 */ | ||
| 559 | { 0, } | ||
| 560 | }; | ||
| 561 | |||
| 490 | static struct parisc_device_id mux_tbl[] = { | 562 | static struct parisc_device_id mux_tbl[] = { |
| 491 | { HPHW_A_DIRECT, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0000D }, | 563 | { HPHW_A_DIRECT, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0000D }, |
| 492 | { 0, } | 564 | { 0, } |
| 493 | }; | 565 | }; |
| 494 | 566 | ||
| 567 | MODULE_DEVICE_TABLE(parisc, builtin_mux_tbl); | ||
| 495 | MODULE_DEVICE_TABLE(parisc, mux_tbl); | 568 | MODULE_DEVICE_TABLE(parisc, mux_tbl); |
| 496 | 569 | ||
| 570 | static struct parisc_driver builtin_serial_mux_driver = { | ||
| 571 | .name = "builtin_serial_mux", | ||
| 572 | .id_table = builtin_mux_tbl, | ||
| 573 | .probe = mux_probe, | ||
| 574 | .remove = __devexit_p(mux_remove), | ||
| 575 | }; | ||
| 576 | |||
| 497 | static struct parisc_driver serial_mux_driver = { | 577 | static struct parisc_driver serial_mux_driver = { |
| 498 | .name = "serial_mux", | 578 | .name = "serial_mux", |
| 499 | .id_table = mux_tbl, | 579 | .id_table = mux_tbl, |
| 500 | .probe = mux_probe, | 580 | .probe = mux_probe, |
| 581 | .remove = __devexit_p(mux_remove), | ||
| 501 | }; | 582 | }; |
| 502 | 583 | ||
| 503 | /** | 584 | /** |
| @@ -507,7 +588,21 @@ static struct parisc_driver serial_mux_driver = { | |||
| 507 | */ | 588 | */ |
| 508 | static int __init mux_init(void) | 589 | static int __init mux_init(void) |
| 509 | { | 590 | { |
| 510 | return register_parisc_driver(&serial_mux_driver); | 591 | register_parisc_driver(&builtin_serial_mux_driver); |
| 592 | register_parisc_driver(&serial_mux_driver); | ||
| 593 | |||
| 594 | if(port_cnt > 0) { | ||
| 595 | /* Start the Mux timer */ | ||
| 596 | init_timer(&mux_timer); | ||
| 597 | mux_timer.function = mux_poll; | ||
| 598 | mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY); | ||
| 599 | |||
| 600 | #ifdef CONFIG_SERIAL_MUX_CONSOLE | ||
| 601 | register_console(&mux_console); | ||
| 602 | #endif | ||
| 603 | } | ||
| 604 | |||
| 605 | return 0; | ||
| 511 | } | 606 | } |
| 512 | 607 | ||
| 513 | /** | 608 | /** |
| @@ -517,14 +612,16 @@ static int __init mux_init(void) | |||
| 517 | */ | 612 | */ |
| 518 | static void __exit mux_exit(void) | 613 | static void __exit mux_exit(void) |
| 519 | { | 614 | { |
| 520 | int i; | 615 | /* Delete the Mux timer. */ |
| 521 | 616 | if(port_cnt > 0) { | |
| 522 | for (i = 0; i < port_cnt; i++) { | 617 | del_timer(&mux_timer); |
| 523 | uart_remove_one_port(&mux_driver, &mux_ports[i]); | 618 | #ifdef CONFIG_SERIAL_MUX_CONSOLE |
| 524 | if (mux_ports[i].membase) | 619 | unregister_console(&mux_console); |
| 525 | iounmap(mux_ports[i].membase); | 620 | #endif |
| 526 | } | 621 | } |
| 527 | 622 | ||
| 623 | unregister_parisc_driver(&builtin_serial_mux_driver); | ||
| 624 | unregister_parisc_driver(&serial_mux_driver); | ||
| 528 | uart_unregister_driver(&mux_driver); | 625 | uart_unregister_driver(&mux_driver); |
| 529 | } | 626 | } |
| 530 | 627 | ||
