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 | /* |
