diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-14 14:58:38 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-14 14:58:38 -0400 |
commit | bf9bc995a59d8c152a4d7e6465d6afa1e098b3e8 (patch) | |
tree | b525863daa5aa6e03afd734a3d38e3680569ff5c /drivers | |
parent | 6d71135d635f84b584df55096627ed750c069e61 (diff) | |
parent | e8f208e8f727515bc605f241a5f854b41f77d0ed (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.29
* git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.29:
parisc: update defconfigs
parisc: define x->x mmio accessors
parisc: dino: struct device - replace bus_id with dev_name(), dev_set_name()
parisc: convert cpu_check_affinity to new cpumask api
parisc: convert (read|write)bwlq to inlines
parisc: fix use of new cpumask api in irq.c
parisc: update parisc for new irq_desc
parisc: update MAINTAINERS
parisc: fix wrong assumption about bus->self
parisc: fix 64bit build
parisc: add braces around arguments in assembler macros
parisc: fix dev_printk() compile warnings for accessing a device struct
parisc: remove unused local out_putf label
parisc: fix `struct pt_regs' declared inside parameter list warning
parisc: fix section mismatch warnings
parisc: remove klist iterators
parisc: BUG_ON() cleanup
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/agp/parisc-agp.c | 23 | ||||
-rw-r--r-- | drivers/parisc/dino.c | 13 | ||||
-rw-r--r-- | drivers/parisc/gsc.c | 39 | ||||
-rw-r--r-- | drivers/parisc/iosapic.c | 16 | ||||
-rw-r--r-- | drivers/parisc/lba_pci.c | 4 | ||||
-rw-r--r-- | drivers/parisc/sba_iommu.c | 61 | ||||
-rw-r--r-- | drivers/scsi/lasi700.c | 2 | ||||
-rw-r--r-- | drivers/scsi/zalon.c | 2 |
8 files changed, 88 insertions, 72 deletions
diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c index db60539bf67a..699e3422ad93 100644 --- a/drivers/char/agp/parisc-agp.c +++ b/drivers/char/agp/parisc-agp.c | |||
@@ -359,9 +359,16 @@ fail: | |||
359 | return error; | 359 | return error; |
360 | } | 360 | } |
361 | 361 | ||
362 | static struct device *next_device(struct klist_iter *i) { | 362 | static int |
363 | struct klist_node * n = klist_next(i); | 363 | find_quicksilver(struct device *dev, void *data) |
364 | return n ? container_of(n, struct device, knode_parent) : NULL; | 364 | { |
365 | struct parisc_device **lba = data; | ||
366 | struct parisc_device *padev = to_parisc_device(dev); | ||
367 | |||
368 | if (IS_QUICKSILVER(padev)) | ||
369 | *lba = padev; | ||
370 | |||
371 | return 0; | ||
365 | } | 372 | } |
366 | 373 | ||
367 | static int | 374 | static int |
@@ -372,8 +379,6 @@ parisc_agp_init(void) | |||
372 | int err = -1; | 379 | int err = -1; |
373 | struct parisc_device *sba = NULL, *lba = NULL; | 380 | struct parisc_device *sba = NULL, *lba = NULL; |
374 | struct lba_device *lbadev = NULL; | 381 | struct lba_device *lbadev = NULL; |
375 | struct device *dev = NULL; | ||
376 | struct klist_iter i; | ||
377 | 382 | ||
378 | if (!sba_list) | 383 | if (!sba_list) |
379 | goto out; | 384 | goto out; |
@@ -386,13 +391,7 @@ parisc_agp_init(void) | |||
386 | } | 391 | } |
387 | 392 | ||
388 | /* Now search our Pluto for our precious AGP device... */ | 393 | /* Now search our Pluto for our precious AGP device... */ |
389 | klist_iter_init(&sba->dev.klist_children, &i); | 394 | device_for_each_child(&sba->dev, &lba, find_quicksilver); |
390 | while ((dev = next_device(&i))) { | ||
391 | struct parisc_device *padev = to_parisc_device(dev); | ||
392 | if (IS_QUICKSILVER(padev)) | ||
393 | lba = padev; | ||
394 | } | ||
395 | klist_iter_exit(&i); | ||
396 | 395 | ||
397 | if (!lba) { | 396 | if (!lba) { |
398 | printk(KERN_INFO DRVPFX "No AGP devices found.\n"); | 397 | printk(KERN_INFO DRVPFX "No AGP devices found.\n"); |
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index d539d9df88e7..bb5a1c9597cb 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c | |||
@@ -479,7 +479,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr) | |||
479 | res = &dino_dev->hba.lmmio_space; | 479 | res = &dino_dev->hba.lmmio_space; |
480 | res->flags = IORESOURCE_MEM; | 480 | res->flags = IORESOURCE_MEM; |
481 | size = scnprintf(name, sizeof(name), "Dino LMMIO (%s)", | 481 | size = scnprintf(name, sizeof(name), "Dino LMMIO (%s)", |
482 | bus->bridge->bus_id); | 482 | dev_name(bus->bridge)); |
483 | res->name = kmalloc(size+1, GFP_KERNEL); | 483 | res->name = kmalloc(size+1, GFP_KERNEL); |
484 | if(res->name) | 484 | if(res->name) |
485 | strcpy((char *)res->name, name); | 485 | strcpy((char *)res->name, name); |
@@ -493,7 +493,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr) | |||
493 | struct list_head *ln, *tmp_ln; | 493 | struct list_head *ln, *tmp_ln; |
494 | 494 | ||
495 | printk(KERN_ERR "Dino: cannot attach bus %s\n", | 495 | printk(KERN_ERR "Dino: cannot attach bus %s\n", |
496 | bus->bridge->bus_id); | 496 | dev_name(bus->bridge)); |
497 | /* kill the bus, we can't do anything with it */ | 497 | /* kill the bus, we can't do anything with it */ |
498 | list_for_each_safe(ln, tmp_ln, &bus->devices) { | 498 | list_for_each_safe(ln, tmp_ln, &bus->devices) { |
499 | struct pci_dev *dev = pci_dev_b(ln); | 499 | struct pci_dev *dev = pci_dev_b(ln); |
@@ -587,7 +587,7 @@ dino_fixup_bus(struct pci_bus *bus) | |||
587 | bus->resource[i+1] = &res[i]; | 587 | bus->resource[i+1] = &res[i]; |
588 | } | 588 | } |
589 | 589 | ||
590 | } else if(bus->self) { | 590 | } else if (bus->parent) { |
591 | int i; | 591 | int i; |
592 | 592 | ||
593 | pci_read_bridge_bases(bus); | 593 | pci_read_bridge_bases(bus); |
@@ -611,12 +611,12 @@ dino_fixup_bus(struct pci_bus *bus) | |||
611 | } | 611 | } |
612 | 612 | ||
613 | DBG("DEBUG %s assigning %d [0x%lx,0x%lx]\n", | 613 | DBG("DEBUG %s assigning %d [0x%lx,0x%lx]\n", |
614 | bus->self->dev.bus_id, i, | 614 | dev_name(&bus->self->dev), i, |
615 | bus->self->resource[i].start, | 615 | bus->self->resource[i].start, |
616 | bus->self->resource[i].end); | 616 | bus->self->resource[i].end); |
617 | pci_assign_resource(bus->self, i); | 617 | pci_assign_resource(bus->self, i); |
618 | DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n", | 618 | DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n", |
619 | bus->self->dev.bus_id, i, | 619 | dev_name(&bus->self->dev), i, |
620 | bus->self->resource[i].start, | 620 | bus->self->resource[i].start, |
621 | bus->self->resource[i].end); | 621 | bus->self->resource[i].end); |
622 | } | 622 | } |
@@ -1026,7 +1026,8 @@ static int __init dino_probe(struct parisc_device *dev) | |||
1026 | dino_current_bus = bus->subordinate + 1; | 1026 | dino_current_bus = bus->subordinate + 1; |
1027 | pci_bus_assign_resources(bus); | 1027 | pci_bus_assign_resources(bus); |
1028 | } else { | 1028 | } else { |
1029 | printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n", dev->dev.bus_id, dino_current_bus); | 1029 | printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n", |
1030 | dev_name(&dev->dev), dino_current_bus); | ||
1030 | /* increment the bus number in case of duplicates */ | 1031 | /* increment the bus number in case of duplicates */ |
1031 | dino_current_bus++; | 1032 | dino_current_bus++; |
1032 | } | 1033 | } |
diff --git a/drivers/parisc/gsc.c b/drivers/parisc/gsc.c index e76db9e4d504..d33632917696 100644 --- a/drivers/parisc/gsc.c +++ b/drivers/parisc/gsc.c | |||
@@ -186,29 +186,34 @@ void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp) | |||
186 | *irqp = irq; | 186 | *irqp = irq; |
187 | } | 187 | } |
188 | 188 | ||
189 | static struct device *next_device(struct klist_iter *i) | 189 | struct gsc_fixup_struct { |
190 | void (*choose_irq)(struct parisc_device *, void *); | ||
191 | void *ctrl; | ||
192 | }; | ||
193 | |||
194 | static int gsc_fixup_irqs_callback(struct device *dev, void *data) | ||
190 | { | 195 | { |
191 | struct klist_node * n = klist_next(i); | 196 | struct parisc_device *padev = to_parisc_device(dev); |
192 | return n ? container_of(n, struct device, knode_parent) : NULL; | 197 | struct gsc_fixup_struct *gf = data; |
198 | |||
199 | /* work-around for 715/64 and others which have parent | ||
200 | at path [5] and children at path [5/0/x] */ | ||
201 | if (padev->id.hw_type == HPHW_FAULTY) | ||
202 | gsc_fixup_irqs(padev, gf->ctrl, gf->choose_irq); | ||
203 | gf->choose_irq(padev, gf->ctrl); | ||
204 | |||
205 | return 0; | ||
193 | } | 206 | } |
194 | 207 | ||
195 | void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl, | 208 | void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl, |
196 | void (*choose_irq)(struct parisc_device *, void *)) | 209 | void (*choose_irq)(struct parisc_device *, void *)) |
197 | { | 210 | { |
198 | struct device *dev; | 211 | struct gsc_fixup_struct data = { |
199 | struct klist_iter i; | 212 | .choose_irq = choose_irq, |
200 | 213 | .ctrl = ctrl, | |
201 | klist_iter_init(&parent->dev.klist_children, &i); | 214 | }; |
202 | while ((dev = next_device(&i))) { | 215 | |
203 | struct parisc_device *padev = to_parisc_device(dev); | 216 | device_for_each_child(&parent->dev, &data, gsc_fixup_irqs_callback); |
204 | |||
205 | /* work-around for 715/64 and others which have parent | ||
206 | at path [5] and children at path [5/0/x] */ | ||
207 | if (padev->id.hw_type == HPHW_FAULTY) | ||
208 | return gsc_fixup_irqs(padev, ctrl, choose_irq); | ||
209 | choose_irq(padev, ctrl); | ||
210 | } | ||
211 | klist_iter_exit(&i); | ||
212 | } | 217 | } |
213 | 218 | ||
214 | int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic) | 219 | int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic) |
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index 0797659ee016..501aaf1f253f 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
@@ -487,7 +487,7 @@ iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev) | |||
487 | } | 487 | } |
488 | 488 | ||
489 | /* Check if pcidev behind a PPB */ | 489 | /* Check if pcidev behind a PPB */ |
490 | if (NULL != pcidev->bus->self) { | 490 | if (pcidev->bus->parent) { |
491 | /* Convert pcidev INTR_PIN into something we | 491 | /* Convert pcidev INTR_PIN into something we |
492 | ** can lookup in the IRT. | 492 | ** can lookup in the IRT. |
493 | */ | 493 | */ |
@@ -523,10 +523,9 @@ iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev) | |||
523 | #endif /* PCI_BRIDGE_FUNCS */ | 523 | #endif /* PCI_BRIDGE_FUNCS */ |
524 | 524 | ||
525 | /* | 525 | /* |
526 | ** Locate the host slot the PPB nearest the Host bus | 526 | * Locate the host slot of the PPB. |
527 | ** adapter. | 527 | */ |
528 | */ | 528 | while (p->parent->parent) |
529 | while (NULL != p->parent->self) | ||
530 | p = p->parent; | 529 | p = p->parent; |
531 | 530 | ||
532 | intr_slot = PCI_SLOT(p->self->devfn); | 531 | intr_slot = PCI_SLOT(p->self->devfn); |
@@ -709,11 +708,14 @@ static void iosapic_set_affinity_irq(unsigned int irq, | |||
709 | struct vector_info *vi = iosapic_get_vector(irq); | 708 | struct vector_info *vi = iosapic_get_vector(irq); |
710 | u32 d0, d1, dummy_d0; | 709 | u32 d0, d1, dummy_d0; |
711 | unsigned long flags; | 710 | unsigned long flags; |
711 | int dest_cpu; | ||
712 | 712 | ||
713 | if (cpu_check_affinity(irq, dest)) | 713 | dest_cpu = cpu_check_affinity(irq, dest); |
714 | if (dest_cpu < 0) | ||
714 | return; | 715 | return; |
715 | 716 | ||
716 | vi->txn_addr = txn_affinity_addr(irq, cpumask_first(dest)); | 717 | irq_desc[irq].affinity = cpumask_of_cpu(dest_cpu); |
718 | vi->txn_addr = txn_affinity_addr(irq, dest_cpu); | ||
717 | 719 | ||
718 | spin_lock_irqsave(&iosapic_lock, flags); | 720 | spin_lock_irqsave(&iosapic_lock, flags); |
719 | /* d1 contains the destination CPU, so only want to set that | 721 | /* d1 contains the destination CPU, so only want to set that |
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index d8233de8c75d..59fbbf128365 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c | |||
@@ -644,7 +644,7 @@ lba_fixup_bus(struct pci_bus *bus) | |||
644 | ** Properly Setup MMIO resources for this bus. | 644 | ** Properly Setup MMIO resources for this bus. |
645 | ** pci_alloc_primary_bus() mangles this. | 645 | ** pci_alloc_primary_bus() mangles this. |
646 | */ | 646 | */ |
647 | if (bus->self) { | 647 | if (bus->parent) { |
648 | int i; | 648 | int i; |
649 | /* PCI-PCI Bridge */ | 649 | /* PCI-PCI Bridge */ |
650 | pci_read_bridge_bases(bus); | 650 | pci_read_bridge_bases(bus); |
@@ -802,7 +802,7 @@ lba_fixup_bus(struct pci_bus *bus) | |||
802 | ** Can't fixup here anyway....garr... | 802 | ** Can't fixup here anyway....garr... |
803 | */ | 803 | */ |
804 | if (fbb_enable) { | 804 | if (fbb_enable) { |
805 | if (bus->self) { | 805 | if (bus->parent) { |
806 | u8 control; | 806 | u8 control; |
807 | /* enable on PPB */ | 807 | /* enable on PPB */ |
808 | (void) pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &control); | 808 | (void) pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &control); |
diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index a70cf16ee1ad..6aad8546fd24 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c | |||
@@ -1206,31 +1206,49 @@ sba_alloc_pdir(unsigned int pdir_size) | |||
1206 | return (void *) pdir_base; | 1206 | return (void *) pdir_base; |
1207 | } | 1207 | } |
1208 | 1208 | ||
1209 | static struct device *next_device(struct klist_iter *i) | 1209 | struct ibase_data_struct { |
1210 | struct ioc *ioc; | ||
1211 | int ioc_num; | ||
1212 | }; | ||
1213 | |||
1214 | static int setup_ibase_imask_callback(struct device *dev, void *data) | ||
1210 | { | 1215 | { |
1211 | struct klist_node * n = klist_next(i); | 1216 | /* lba_set_iregs() is in drivers/parisc/lba_pci.c */ |
1212 | return n ? container_of(n, struct device, knode_parent) : NULL; | 1217 | extern void lba_set_iregs(struct parisc_device *, u32, u32); |
1218 | struct parisc_device *lba = to_parisc_device(dev); | ||
1219 | struct ibase_data_struct *ibd = data; | ||
1220 | int rope_num = (lba->hpa.start >> 13) & 0xf; | ||
1221 | if (rope_num >> 3 == ibd->ioc_num) | ||
1222 | lba_set_iregs(lba, ibd->ioc->ibase, ibd->ioc->imask); | ||
1223 | return 0; | ||
1213 | } | 1224 | } |
1214 | 1225 | ||
1215 | /* setup Mercury or Elroy IBASE/IMASK registers. */ | 1226 | /* setup Mercury or Elroy IBASE/IMASK registers. */ |
1216 | static void | 1227 | static void |
1217 | setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num) | 1228 | setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num) |
1218 | { | 1229 | { |
1219 | /* lba_set_iregs() is in drivers/parisc/lba_pci.c */ | 1230 | struct ibase_data_struct ibase_data = { |
1220 | extern void lba_set_iregs(struct parisc_device *, u32, u32); | 1231 | .ioc = ioc, |
1221 | struct device *dev; | 1232 | .ioc_num = ioc_num, |
1222 | struct klist_iter i; | 1233 | }; |
1223 | 1234 | ||
1224 | klist_iter_init(&sba->dev.klist_children, &i); | 1235 | device_for_each_child(&sba->dev, &ibase_data, |
1225 | while ((dev = next_device(&i))) { | 1236 | setup_ibase_imask_callback); |
1226 | struct parisc_device *lba = to_parisc_device(dev); | ||
1227 | int rope_num = (lba->hpa.start >> 13) & 0xf; | ||
1228 | if (rope_num >> 3 == ioc_num) | ||
1229 | lba_set_iregs(lba, ioc->ibase, ioc->imask); | ||
1230 | } | ||
1231 | klist_iter_exit(&i); | ||
1232 | } | 1237 | } |
1233 | 1238 | ||
1239 | #ifdef SBA_AGP_SUPPORT | ||
1240 | static int | ||
1241 | sba_ioc_find_quicksilver(struct device *dev, void *data) | ||
1242 | { | ||
1243 | int *agp_found = data; | ||
1244 | struct parisc_device *lba = to_parisc_device(dev); | ||
1245 | |||
1246 | if (IS_QUICKSILVER(lba)) | ||
1247 | *agp_found = 1; | ||
1248 | return 0; | ||
1249 | } | ||
1250 | #endif | ||
1251 | |||
1234 | static void | 1252 | static void |
1235 | sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) | 1253 | sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) |
1236 | { | 1254 | { |
@@ -1332,9 +1350,6 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) | |||
1332 | WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM); | 1350 | WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM); |
1333 | 1351 | ||
1334 | #ifdef SBA_AGP_SUPPORT | 1352 | #ifdef SBA_AGP_SUPPORT |
1335 | { | ||
1336 | struct klist_iter i; | ||
1337 | struct device *dev = NULL; | ||
1338 | 1353 | ||
1339 | /* | 1354 | /* |
1340 | ** If an AGP device is present, only use half of the IOV space | 1355 | ** If an AGP device is present, only use half of the IOV space |
@@ -1344,13 +1359,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) | |||
1344 | ** We program the next pdir index after we stop w/ a key for | 1359 | ** We program the next pdir index after we stop w/ a key for |
1345 | ** the GART code to handshake on. | 1360 | ** the GART code to handshake on. |
1346 | */ | 1361 | */ |
1347 | klist_iter_init(&sba->dev.klist_children, &i); | 1362 | device_for_each_child(&sba->dev, &agp_found, sba_ioc_find_quicksilver); |
1348 | while ((dev = next_device(&i))) { | ||
1349 | struct parisc_device *lba = to_parisc_device(dev); | ||
1350 | if (IS_QUICKSILVER(lba)) | ||
1351 | agp_found = 1; | ||
1352 | } | ||
1353 | klist_iter_exit(&i); | ||
1354 | 1363 | ||
1355 | if (agp_found && sba_reserve_agpgart) { | 1364 | if (agp_found && sba_reserve_agpgart) { |
1356 | printk(KERN_INFO "%s: reserving %dMb of IOVA space for agpgart\n", | 1365 | printk(KERN_INFO "%s: reserving %dMb of IOVA space for agpgart\n", |
diff --git a/drivers/scsi/lasi700.c b/drivers/scsi/lasi700.c index 4a4e6954ec79..f23c4ca9a2ee 100644 --- a/drivers/scsi/lasi700.c +++ b/drivers/scsi/lasi700.c | |||
@@ -103,7 +103,7 @@ lasi700_probe(struct parisc_device *dev) | |||
103 | 103 | ||
104 | hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL); | 104 | hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL); |
105 | if (!hostdata) { | 105 | if (!hostdata) { |
106 | dev_printk(KERN_ERR, dev, "Failed to allocate host data\n"); | 106 | dev_printk(KERN_ERR, &dev->dev, "Failed to allocate host data\n"); |
107 | return -ENOMEM; | 107 | return -ENOMEM; |
108 | } | 108 | } |
109 | 109 | ||
diff --git a/drivers/scsi/zalon.c b/drivers/scsi/zalon.c index a8d61a62522e..97f3158fa7b5 100644 --- a/drivers/scsi/zalon.c +++ b/drivers/scsi/zalon.c | |||
@@ -137,7 +137,7 @@ zalon_probe(struct parisc_device *dev) | |||
137 | goto fail; | 137 | goto fail; |
138 | 138 | ||
139 | if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) { | 139 | if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) { |
140 | dev_printk(KERN_ERR, dev, "irq problem with %d, detaching\n ", | 140 | dev_printk(KERN_ERR, &dev->dev, "irq problem with %d, detaching\n ", |
141 | dev->irq); | 141 | dev->irq); |
142 | goto fail; | 142 | goto fail; |
143 | } | 143 | } |