diff options
Diffstat (limited to 'drivers/parisc/dino.c')
-rw-r--r-- | drivers/parisc/dino.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index 2f2dbef2c3b7..5ab75334c579 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c | |||
@@ -178,6 +178,8 @@ static int dino_cfg_read(struct pci_bus *bus, unsigned int devfn, int where, | |||
178 | void __iomem *base_addr = d->hba.base_addr; | 178 | void __iomem *base_addr = d->hba.base_addr; |
179 | unsigned long flags; | 179 | unsigned long flags; |
180 | 180 | ||
181 | DBG("%s: %p, %d, %d, %d\n", __FUNCTION__, base_addr, devfn, where, | ||
182 | size); | ||
181 | spin_lock_irqsave(&d->dinosaur_pen, flags); | 183 | spin_lock_irqsave(&d->dinosaur_pen, flags); |
182 | 184 | ||
183 | /* tell HW which CFG address */ | 185 | /* tell HW which CFG address */ |
@@ -211,6 +213,8 @@ static int dino_cfg_write(struct pci_bus *bus, unsigned int devfn, int where, | |||
211 | void __iomem *base_addr = d->hba.base_addr; | 213 | void __iomem *base_addr = d->hba.base_addr; |
212 | unsigned long flags; | 214 | unsigned long flags; |
213 | 215 | ||
216 | DBG("%s: %p, %d, %d, %d\n", __FUNCTION__, base_addr, devfn, where, | ||
217 | size); | ||
214 | spin_lock_irqsave(&d->dinosaur_pen, flags); | 218 | spin_lock_irqsave(&d->dinosaur_pen, flags); |
215 | 219 | ||
216 | /* avoid address stepping feature */ | 220 | /* avoid address stepping feature */ |
@@ -295,7 +299,7 @@ static void dino_disable_irq(unsigned int irq) | |||
295 | struct dino_device *dino_dev = irq_desc[irq].handler_data; | 299 | struct dino_device *dino_dev = irq_desc[irq].handler_data; |
296 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); | 300 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); |
297 | 301 | ||
298 | DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, irq_dev, irq); | 302 | DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq); |
299 | 303 | ||
300 | /* Clear the matching bit in the IMR register */ | 304 | /* Clear the matching bit in the IMR register */ |
301 | dino_dev->imr &= ~(DINO_MASK_IRQ(local_irq)); | 305 | dino_dev->imr &= ~(DINO_MASK_IRQ(local_irq)); |
@@ -308,7 +312,7 @@ static void dino_enable_irq(unsigned int irq) | |||
308 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); | 312 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); |
309 | u32 tmp; | 313 | u32 tmp; |
310 | 314 | ||
311 | DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, irq_dev, irq); | 315 | DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq); |
312 | 316 | ||
313 | /* | 317 | /* |
314 | ** clear pending IRQ bits | 318 | ** clear pending IRQ bits |
@@ -490,7 +494,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr) | |||
490 | if (res->start == F_EXTEND(0xf0000000UL | (i * _8MB))) | 494 | if (res->start == F_EXTEND(0xf0000000UL | (i * _8MB))) |
491 | break; | 495 | break; |
492 | } | 496 | } |
493 | DBG("DINO GSC WRITE i=%d, start=%lx, dino addr = %lx\n", | 497 | DBG("DINO GSC WRITE i=%d, start=%lx, dino addr = %p\n", |
494 | i, res->start, base_addr + DINO_IO_ADDR_EN); | 498 | i, res->start, base_addr + DINO_IO_ADDR_EN); |
495 | __raw_writel(1 << i, base_addr + DINO_IO_ADDR_EN); | 499 | __raw_writel(1 << i, base_addr + DINO_IO_ADDR_EN); |
496 | } | 500 | } |
@@ -683,6 +687,14 @@ static void __init | |||
683 | dino_card_init(struct dino_device *dino_dev) | 687 | dino_card_init(struct dino_device *dino_dev) |
684 | { | 688 | { |
685 | u32 brdg_feat = 0x00784e05; | 689 | u32 brdg_feat = 0x00784e05; |
690 | unsigned long status; | ||
691 | |||
692 | status = __raw_readl(dino_dev->hba.base_addr+DINO_IO_STATUS); | ||
693 | if (status & 0x0000ff80) { | ||
694 | __raw_writel(0x00000005, | ||
695 | dino_dev->hba.base_addr+DINO_IO_COMMAND); | ||
696 | udelay(1); | ||
697 | } | ||
686 | 698 | ||
687 | __raw_writel(0x00000000, dino_dev->hba.base_addr+DINO_GMASK); | 699 | __raw_writel(0x00000000, dino_dev->hba.base_addr+DINO_GMASK); |
688 | __raw_writel(0x00000001, dino_dev->hba.base_addr+DINO_IO_FBB_EN); | 700 | __raw_writel(0x00000001, dino_dev->hba.base_addr+DINO_IO_FBB_EN); |
@@ -902,15 +914,15 @@ void ccio_cujo20_fixup(struct parisc_device *dev, u32 iovp); | |||
902 | ** If so, initialize the chip appropriately (card-mode vs bridge mode). | 914 | ** If so, initialize the chip appropriately (card-mode vs bridge mode). |
903 | ** Much of the initialization is common though. | 915 | ** Much of the initialization is common though. |
904 | */ | 916 | */ |
905 | static int __init | 917 | static int __init dino_probe(struct parisc_device *dev) |
906 | dino_driver_callback(struct parisc_device *dev) | ||
907 | { | 918 | { |
908 | struct dino_device *dino_dev; // Dino specific control struct | 919 | struct dino_device *dino_dev; // Dino specific control struct |
909 | const char *version = "unknown"; | 920 | const char *version = "unknown"; |
910 | char *name; | 921 | char *name; |
911 | int is_cujo = 0; | 922 | int is_cujo = 0; |
912 | struct pci_bus *bus; | 923 | struct pci_bus *bus; |
913 | 924 | unsigned long hpa = dev->hpa.start; | |
925 | |||
914 | name = "Dino"; | 926 | name = "Dino"; |
915 | if (is_card_dino(&dev->id)) { | 927 | if (is_card_dino(&dev->id)) { |
916 | version = "3.x (card mode)"; | 928 | version = "3.x (card mode)"; |
@@ -928,11 +940,11 @@ dino_driver_callback(struct parisc_device *dev) | |||
928 | } | 940 | } |
929 | } | 941 | } |
930 | 942 | ||
931 | printk("%s version %s found at 0x%lx\n", name, version, dev->hpa); | 943 | printk("%s version %s found at 0x%lx\n", name, version, hpa); |
932 | 944 | ||
933 | if (!request_mem_region(dev->hpa, PAGE_SIZE, name)) { | 945 | if (!request_mem_region(hpa, PAGE_SIZE, name)) { |
934 | printk(KERN_ERR "DINO: Hey! Someone took my MMIO space (0x%ld)!\n", | 946 | printk(KERN_ERR "DINO: Hey! Someone took my MMIO space (0x%ld)!\n", |
935 | dev->hpa); | 947 | hpa); |
936 | return 1; | 948 | return 1; |
937 | } | 949 | } |
938 | 950 | ||
@@ -940,12 +952,12 @@ dino_driver_callback(struct parisc_device *dev) | |||
940 | if (is_cujo && dev->id.hversion_rev == 1) { | 952 | if (is_cujo && dev->id.hversion_rev == 1) { |
941 | #ifdef CONFIG_IOMMU_CCIO | 953 | #ifdef CONFIG_IOMMU_CCIO |
942 | printk(KERN_WARNING "Enabling Cujo 2.0 bug workaround\n"); | 954 | printk(KERN_WARNING "Enabling Cujo 2.0 bug workaround\n"); |
943 | if (dev->hpa == (unsigned long)CUJO_RAVEN_ADDR) { | 955 | if (hpa == (unsigned long)CUJO_RAVEN_ADDR) { |
944 | ccio_cujo20_fixup(dev, CUJO_RAVEN_BADPAGE); | 956 | ccio_cujo20_fixup(dev, CUJO_RAVEN_BADPAGE); |
945 | } else if (dev->hpa == (unsigned long)CUJO_FIREHAWK_ADDR) { | 957 | } else if (hpa == (unsigned long)CUJO_FIREHAWK_ADDR) { |
946 | ccio_cujo20_fixup(dev, CUJO_FIREHAWK_BADPAGE); | 958 | ccio_cujo20_fixup(dev, CUJO_FIREHAWK_BADPAGE); |
947 | } else { | 959 | } else { |
948 | printk("Don't recognise Cujo at address 0x%lx, not enabling workaround\n", dev->hpa); | 960 | printk("Don't recognise Cujo at address 0x%lx, not enabling workaround\n", hpa); |
949 | } | 961 | } |
950 | #endif | 962 | #endif |
951 | } else if (!is_cujo && !is_card_dino(&dev->id) && | 963 | } else if (!is_cujo && !is_card_dino(&dev->id) && |
@@ -970,7 +982,7 @@ dino_driver_callback(struct parisc_device *dev) | |||
970 | memset(dino_dev, 0, sizeof(struct dino_device)); | 982 | memset(dino_dev, 0, sizeof(struct dino_device)); |
971 | 983 | ||
972 | dino_dev->hba.dev = dev; | 984 | dino_dev->hba.dev = dev; |
973 | dino_dev->hba.base_addr = ioremap(dev->hpa, 4096); /* faster access */ | 985 | dino_dev->hba.base_addr = ioremap(hpa, 4096); |
974 | dino_dev->hba.lmmio_space_offset = 0; /* CPU addrs == bus addrs */ | 986 | dino_dev->hba.lmmio_space_offset = 0; /* CPU addrs == bus addrs */ |
975 | spin_lock_init(&dino_dev->dinosaur_pen); | 987 | spin_lock_init(&dino_dev->dinosaur_pen); |
976 | dino_dev->hba.iommu = ccio_get_iommu(dev); | 988 | dino_dev->hba.iommu = ccio_get_iommu(dev); |
@@ -1027,9 +1039,9 @@ static struct parisc_device_id dino_tbl[] = { | |||
1027 | }; | 1039 | }; |
1028 | 1040 | ||
1029 | static struct parisc_driver dino_driver = { | 1041 | static struct parisc_driver dino_driver = { |
1030 | .name = "Dino", | 1042 | .name = "dino", |
1031 | .id_table = dino_tbl, | 1043 | .id_table = dino_tbl, |
1032 | .probe = dino_driver_callback, | 1044 | .probe = dino_probe, |
1033 | }; | 1045 | }; |
1034 | 1046 | ||
1035 | /* | 1047 | /* |